mirror of
https://github.com/lucide-icons/lucide.git
synced 2025-12-17 13:37:41 +01:00
Compare commits
5 Commits
fix/fixed-
...
lucide-vue
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d1d57d3c85 | ||
|
|
701c2fb6b2 | ||
|
|
294ec9c727 | ||
|
|
99c883e60a | ||
|
|
9e68779d22 |
@@ -1,17 +0,0 @@
|
|||||||
# Custom words
|
|
||||||
fullscreen
|
|
||||||
gamepad
|
|
||||||
gantt
|
|
||||||
kanban
|
|
||||||
pilcrow
|
|
||||||
squircle
|
|
||||||
strikethrough
|
|
||||||
touchpad
|
|
||||||
ungroup
|
|
||||||
pilcrow
|
|
||||||
toc
|
|
||||||
|
|
||||||
# Brands
|
|
||||||
codepen
|
|
||||||
codesandbox
|
|
||||||
dribbble
|
|
||||||
@@ -6,5 +6,6 @@ tests
|
|||||||
node_modules
|
node_modules
|
||||||
.eslintrc.js
|
.eslintrc.js
|
||||||
docs/images
|
docs/images
|
||||||
docs/**/examples/
|
docs/guide/basics/examples
|
||||||
|
docs/guide/advanced/examples
|
||||||
packages/lucide-react/dynamicIconImports.js
|
packages/lucide-react/dynamicIconImports.js
|
||||||
|
|||||||
19
.eslintrc.js
19
.eslintrc.js
@@ -1,4 +1,4 @@
|
|||||||
const DEFAULT_ATTRS = require('./tools/build-icons/render/default-attrs.json');
|
const DEFAULT_ATTRS = require('./scripts/render/default-attrs.json');
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
root: true,
|
root: true,
|
||||||
@@ -15,9 +15,7 @@ module.exports = {
|
|||||||
'no-use-before-define': 'off',
|
'no-use-before-define': 'off',
|
||||||
'import/no-extraneous-dependencies': [
|
'import/no-extraneous-dependencies': [
|
||||||
'error',
|
'error',
|
||||||
{
|
{ devDependencies: ['**/*.test.js', '**/*.spec.js', './scripts/**'] },
|
||||||
devDependencies: ['**/*.test.js', '**/*.spec.js', '**/scripts/**'],
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
'import/extensions': [
|
'import/extensions': [
|
||||||
'error',
|
'error',
|
||||||
@@ -44,15 +42,12 @@ module.exports = {
|
|||||||
'@html-eslint/no-duplicate-attrs': 'error',
|
'@html-eslint/no-duplicate-attrs': 'error',
|
||||||
'@html-eslint/no-inline-styles': 'error',
|
'@html-eslint/no-inline-styles': 'error',
|
||||||
'@html-eslint/require-attrs': [
|
'@html-eslint/require-attrs': [
|
||||||
'error',
|
'error',
|
||||||
...Object.entries(DEFAULT_ATTRS).map(([attr, value]) => ({
|
...Object.entries(DEFAULT_ATTRS)
|
||||||
tag: 'svg',
|
.map(([attr, value]) => ({ tag: 'svg', attr, value: String(value) }))
|
||||||
attr,
|
|
||||||
value: String(value),
|
|
||||||
})),
|
|
||||||
],
|
],
|
||||||
'@html-eslint/indent': ['error', 2],
|
'@html-eslint/indent': ['error', 2],
|
||||||
'@html-eslint/no-multiple-empty-lines': ['error', { max: 0 }],
|
"@html-eslint/no-multiple-empty-lines": ["error", { "max": 0 }],
|
||||||
'@html-eslint/no-extra-spacing-attrs': [
|
'@html-eslint/no-extra-spacing-attrs': [
|
||||||
'error',
|
'error',
|
||||||
{
|
{
|
||||||
@@ -69,7 +64,7 @@ module.exports = {
|
|||||||
'@html-eslint/element-newline': 'error',
|
'@html-eslint/element-newline': 'error',
|
||||||
'@html-eslint/no-trailing-spaces': 'error',
|
'@html-eslint/no-trailing-spaces': 'error',
|
||||||
'@html-eslint/quotes': 'error',
|
'@html-eslint/quotes': 'error',
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|||||||
13
.github/ISSUE_TEMPLATE/02_bug_report.yml
vendored
13
.github/ISSUE_TEMPLATE/02_bug_report.yml
vendored
@@ -35,16 +35,6 @@ body:
|
|||||||
placeholder: e.g. 0.289.1
|
placeholder: e.g. 0.289.1
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: checkboxes
|
|
||||||
id: can-reproduce-in-latest-version
|
|
||||||
attributes:
|
|
||||||
label: Can you reproduce this in the latest version?
|
|
||||||
description: i.e. after running `npm install lucide-react@latest`
|
|
||||||
options:
|
|
||||||
- label: 'Yes'
|
|
||||||
- label: 'No'
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
id: browsers
|
id: browsers
|
||||||
attributes:
|
attributes:
|
||||||
@@ -69,9 +59,6 @@ body:
|
|||||||
- label: Windows
|
- label: Windows
|
||||||
- label: Linux
|
- label: Linux
|
||||||
- label: macOS
|
- label: macOS
|
||||||
- label: ChromeOS
|
|
||||||
- label: iOS
|
|
||||||
- label: Android
|
|
||||||
- label: Other/not relevant
|
- label: Other/not relevant
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: description
|
id: description
|
||||||
|
|||||||
@@ -30,9 +30,6 @@ body:
|
|||||||
- label: Windows
|
- label: Windows
|
||||||
- label: Linux
|
- label: Linux
|
||||||
- label: macOS
|
- label: macOS
|
||||||
- label: ChromeOS
|
|
||||||
- label: iOS
|
|
||||||
- label: Android
|
|
||||||
- label: Other/not relevant
|
- label: Other/not relevant
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: description
|
id: description
|
||||||
|
|||||||
6
.github/actions/build-and-test.yml
vendored
6
.github/actions/build-and-test.yml
vendored
@@ -1,5 +1,5 @@
|
|||||||
name: 'Build and Test'
|
name: "Build and Test"
|
||||||
description: 'Builds and test a package'
|
description: "Builds and test a package"
|
||||||
|
|
||||||
inputs:
|
inputs:
|
||||||
name:
|
name:
|
||||||
@@ -7,7 +7,7 @@ inputs:
|
|||||||
required: true
|
required: true
|
||||||
|
|
||||||
runs:
|
runs:
|
||||||
using: 'composite'
|
using: "composite"
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
|
|||||||
6
.github/actions/check-icons.yml
vendored
6
.github/actions/check-icons.yml
vendored
@@ -1,5 +1,5 @@
|
|||||||
name: 'Check icons'
|
name: "Check icons"
|
||||||
description: 'Cross-checks icon and category references in JSON descriptors'
|
description: "Cross-checks icon and category references in JSON descriptors"
|
||||||
|
|
||||||
inputs:
|
inputs:
|
||||||
name:
|
name:
|
||||||
@@ -7,7 +7,7 @@ inputs:
|
|||||||
required: true
|
required: true
|
||||||
|
|
||||||
runs:
|
runs:
|
||||||
using: 'composite'
|
using: "composite"
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
|
|||||||
96
.github/labeler.yml
vendored
96
.github/labeler.yml
vendored
@@ -1,92 +1,92 @@
|
|||||||
# For changed dependencies
|
# For changed dependencies
|
||||||
📦 dependencies:
|
📦 dependencies:
|
||||||
- changed-files:
|
- changed-files:
|
||||||
- any-glob-to-any-file:
|
- any-glob-to-any-file:
|
||||||
- pnpm-lock.yaml
|
- pnpm-lock.yaml
|
||||||
|
|
||||||
# For changes in documentation
|
# For changes in documentation
|
||||||
📖 documentation:
|
📖 documentation:
|
||||||
- changed-files:
|
- changed-files:
|
||||||
- any-glob-to-any-file:
|
- any-glob-to-any-file:
|
||||||
- docs/*.md
|
- docs/*.md
|
||||||
- docs/**/*.md
|
- docs/**/*.md
|
||||||
|
|
||||||
# For changes in the site, but not markdown files
|
# For changes in the site, but not markdown files
|
||||||
🌍 site:
|
🌍 site:
|
||||||
- changed-files:
|
- changed-files:
|
||||||
- any-glob-to-any-file:
|
- any-glob-to-any-file:
|
||||||
- 'docs/**'
|
- 'docs/**'
|
||||||
|
|
||||||
# For changes in the metadata
|
# For changes in the metadata
|
||||||
🫧 metadata:
|
🫧 metadata:
|
||||||
- changed-files:
|
- changed-files:
|
||||||
- any-glob-to-any-file:
|
- any-glob-to-any-file:
|
||||||
- 'icons/*.json'
|
- 'icons/*.json'
|
||||||
- categories/*
|
- categories/*
|
||||||
|
|
||||||
# For changes or added icons
|
# For changes or added icons
|
||||||
🎨 icon:
|
🎨 icon:
|
||||||
- changed-files:
|
- changed-files:
|
||||||
- any-glob-to-any-file:
|
- any-glob-to-any-file:
|
||||||
- 'icons/*.svg'
|
- 'icons/*.svg'
|
||||||
|
|
||||||
# For changes in the lucide package
|
# For changes in the lucide package
|
||||||
🧳 lucide package:
|
🧳 lucide package:
|
||||||
- changed-files:
|
- changed-files:
|
||||||
- any-glob-to-any-file:
|
- any-glob-to-any-file:
|
||||||
- 'packages/lucide/*'
|
- 'packages/lucide/*'
|
||||||
|
|
||||||
# For changes in the lucide React package
|
# For changes in the lucide React package
|
||||||
⚛️ react package:
|
⚛️ react package:
|
||||||
- changed-files:
|
- changed-files:
|
||||||
- any-glob-to-any-file:
|
- any-glob-to-any-file:
|
||||||
- 'packages/lucide-react/*'
|
- 'packages/lucide-react/*'
|
||||||
|
|
||||||
# For changes in the lucide React Native package
|
# For changes in the lucide React Native package
|
||||||
⚛️ react native package:
|
⚛️ react native package:
|
||||||
- changed-files:
|
- changed-files:
|
||||||
- any-glob-to-any-file:
|
- any-glob-to-any-file:
|
||||||
- 'packages/lucide-react-native/*'
|
- 'packages/lucide-react-native/*'
|
||||||
|
|
||||||
# For changes in the lucide vue packages
|
# For changes in the lucide vue packages
|
||||||
💎 vue package:
|
💎 vue package:
|
||||||
- changed-files:
|
- changed-files:
|
||||||
- any-glob-to-any-file:
|
- any-glob-to-any-file:
|
||||||
- 'packages/lucide-vue/*'
|
- 'packages/lucide-vue/*'
|
||||||
- 'packages/lucide-vue-next/*'
|
- 'packages/lucide-vue-next/*'
|
||||||
|
|
||||||
# For changes in the lucide angular package
|
# For changes in the lucide angular package
|
||||||
🅰️ angular package:
|
🅰️ angular package:
|
||||||
- changed-files:
|
- changed-files:
|
||||||
- any-glob-to-any-file:
|
- any-glob-to-any-file:
|
||||||
- 'packages/lucide-angular/*'
|
- 'packages/lucide-angular/*'
|
||||||
|
|
||||||
# For changes in the lucide preact package
|
# For changes in the lucide preact package
|
||||||
⚛️ preact package:
|
⚛️ preact package:
|
||||||
- changed-files:
|
- changed-files:
|
||||||
- any-glob-to-any-file:
|
- any-glob-to-any-file:
|
||||||
- 'packages/lucide-preact/*'
|
- 'packages/lucide-preact/*'
|
||||||
|
|
||||||
# For changes in the lucide svelte package
|
# For changes in the lucide svelte package
|
||||||
🧣 svelte package:
|
🧣 svelte package:
|
||||||
- changed-files:
|
- changed-files:
|
||||||
- any-glob-to-any-file:
|
- any-glob-to-any-file:
|
||||||
- 'packages/lucide-svelte/*'
|
- 'packages/lucide-svelte/*'
|
||||||
|
|
||||||
# For changes in the lucide solid package
|
# For changes in the lucide solid package
|
||||||
🪝 solid package:
|
🪝 solid package:
|
||||||
- changed-files:
|
- changed-files:
|
||||||
- any-glob-to-any-file:
|
- any-glob-to-any-file:
|
||||||
- 'packages/lucide-solid/*'
|
- 'packages/lucide-solid/*'
|
||||||
|
|
||||||
# For changes in the lucide static package
|
# For changes in the lucide static package
|
||||||
🪨 static package:
|
🪨 static package:
|
||||||
- changed-files:
|
- changed-files:
|
||||||
- any-glob-to-any-file:
|
- any-glob-to-any-file:
|
||||||
- 'packages/lucide-static/*'
|
- 'packages/lucide-static/*'
|
||||||
|
|
||||||
# For changes in the lucide flutter package
|
# For changes in the lucide flutter package
|
||||||
🏹 flutter package:
|
🏹 flutter package:
|
||||||
- changed-files:
|
- changed-files:
|
||||||
- any-glob-to-any-file:
|
- any-glob-to-any-file:
|
||||||
- 'packages/lucide-flutter/*'
|
- 'packages/lucide-flutter/*'
|
||||||
|
|||||||
2
.github/pull_request_template.md
vendored
2
.github/pull_request_template.md
vendored
@@ -47,7 +47,7 @@
|
|||||||
- [ ] I've made sure that the icons look sharp on low DPI displays.
|
- [ ] I've made sure that the icons look sharp on low DPI displays.
|
||||||
- [ ] I've made sure that the icons look consistent with the icon set in size, optical volume and density.
|
- [ ] I've made sure that the icons look consistent with the icon set in size, optical volume and density.
|
||||||
- [ ] I've made sure that the icons are visually centered.
|
- [ ] I've made sure that the icons are visually centered.
|
||||||
- [ ] I've correctly optimized all icons to three points of precision.
|
- [ ] I've correctly optimized all icons to two points of precision.
|
||||||
|
|
||||||
## Before Submitting <!-- For every PR! -->
|
## Before Submitting <!-- For every PR! -->
|
||||||
<!-- All of these requirements must be fulfilled. -->
|
<!-- All of these requirements must be fulfilled. -->
|
||||||
|
|||||||
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@@ -17,6 +17,8 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v2
|
||||||
|
with:
|
||||||
|
version: 8
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
name: Close Issue with Banned Phrases
|
|
||||||
|
|
||||||
on:
|
|
||||||
issues:
|
|
||||||
types: [opened]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
block_phrases:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
issues: write
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Check for blocked phrases in issue title
|
|
||||||
run: |
|
|
||||||
ISSUE_TITLE=$(jq -r '.issue.title' "$GITHUB_EVENT_PATH")
|
|
||||||
BLOCKED_PHRASES=("twitter" "whatsapp" "logo" "google" "tiktok" "facebook" "slack" "discord" "bluesky")
|
|
||||||
|
|
||||||
# Check title and body for blocked phrases
|
|
||||||
for PHRASE in "${BLOCKED_PHRASES[@]}"
|
|
||||||
do
|
|
||||||
if echo "$ISSUE_TITLE" | grep -i "$PHRASE"; then
|
|
||||||
gh issue close ${{ github.event.issue.number }} --reason "not planned" --comment "This looks like a duplicate, use the [search](https://github.com/lucide-icons/lucide/issues?q=is%3Aissue+$PHRASE) to find similar issues.
|
|
||||||
|
|
||||||
Read more about brand guideline rules at [We're not accepting new Brand icons #670](https://github.com/lucide-icons/lucide/issues/670).
|
|
||||||
|
|
||||||
Always happy to help on [Discord](https://discord.gg/EH6nSts)."
|
|
||||||
gh issue lock ${{ github.event.issue.number }} --reason spam
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ github.token }}
|
|
||||||
5
.github/workflows/close-stale-prs.yml
vendored
5
.github/workflows/close-stale-prs.yml
vendored
@@ -1,13 +1,11 @@
|
|||||||
name: Close stale issues and PR
|
name: Close stale issues and PR
|
||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '45 1 * * *'
|
- cron: "45 1 * * *"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
stale:
|
stale:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
|
||||||
pull-requests: write
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@v9
|
- uses: actions/stale@v9
|
||||||
with:
|
with:
|
||||||
@@ -16,5 +14,4 @@ jobs:
|
|||||||
close-pr-message: This PR was closed because it has been stalled for 5 days with no activity.
|
close-pr-message: This PR was closed because it has been stalled for 5 days with no activity.
|
||||||
close-pr-label: 🧶 stale
|
close-pr-label: 🧶 stale
|
||||||
days-before-stale: 30
|
days-before-stale: 30
|
||||||
days-before-issue-stale: -1
|
|
||||||
days-before-close: -1
|
days-before-close: -1
|
||||||
|
|||||||
6
.github/workflows/labeler.yml
vendored
6
.github/workflows/labeler.yml
vendored
@@ -1,6 +1,6 @@
|
|||||||
name: 'Pull Request Labeler'
|
name: "Pull Request Labeler"
|
||||||
on:
|
on:
|
||||||
- pull_request_target
|
- pull_request_target
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
triage:
|
triage:
|
||||||
@@ -9,4 +9,4 @@ jobs:
|
|||||||
pull-requests: write
|
pull-requests: write
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/labeler@v5
|
- uses: actions/labeler@v5
|
||||||
|
|||||||
2
.github/workflows/linting.yml
vendored
2
.github/workflows/linting.yml
vendored
@@ -11,6 +11,8 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v2
|
||||||
|
with:
|
||||||
|
version: 8
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
|
|||||||
17
.github/workflows/lucide-angular.yml
vendored
17
.github/workflows/lucide-angular.yml
vendored
@@ -8,11 +8,13 @@ on:
|
|||||||
- pnpm-lock.yaml
|
- pnpm-lock.yaml
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
lucide-angular:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v2
|
||||||
|
with:
|
||||||
|
version: 8
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
@@ -24,18 +26,5 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: pnpm --filter lucide-angular build
|
run: pnpm --filter lucide-angular build
|
||||||
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: pnpm/action-setup@v2
|
|
||||||
- uses: actions/setup-node@v3.8.1
|
|
||||||
with:
|
|
||||||
node-version: 18
|
|
||||||
cache: 'pnpm'
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm install --frozen-lockfile
|
|
||||||
|
|
||||||
- name: Test
|
- name: Test
|
||||||
run: pnpm --filter lucide-angular test
|
run: pnpm --filter lucide-angular test
|
||||||
|
|||||||
4
.github/workflows/lucide-font.yml
vendored
4
.github/workflows/lucide-font.yml
vendored
@@ -13,6 +13,8 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v2
|
||||||
|
with:
|
||||||
|
version: 8
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
@@ -27,7 +29,7 @@ jobs:
|
|||||||
- name: Create font in ./lucide-font
|
- name: Create font in ./lucide-font
|
||||||
run: pnpm build:font
|
run: pnpm build:font
|
||||||
|
|
||||||
- name: 'Upload to Artifacts'
|
- name: "Upload to Artifacts"
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: lucide-font
|
name: lucide-font
|
||||||
|
|||||||
6
.github/workflows/lucide-preact.yml
vendored
6
.github/workflows/lucide-preact.yml
vendored
@@ -4,7 +4,6 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- packages/lucide-preact/**
|
- packages/lucide-preact/**
|
||||||
- packages/shared/**
|
|
||||||
- tools/build-icons/**
|
- tools/build-icons/**
|
||||||
- tools/rollup-plugins/**
|
- tools/rollup-plugins/**
|
||||||
- pnpm-lock.yaml
|
- pnpm-lock.yaml
|
||||||
@@ -15,6 +14,8 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v2
|
||||||
|
with:
|
||||||
|
version: 8
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
@@ -23,5 +24,8 @@ jobs:
|
|||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm install --frozen-lockfile
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: pnpm --filter lucide-preact build
|
||||||
|
|
||||||
- name: Test
|
- name: Test
|
||||||
run: pnpm --filter lucide-preact test
|
run: pnpm --filter lucide-preact test
|
||||||
|
|||||||
6
.github/workflows/lucide-react-native.yml
vendored
6
.github/workflows/lucide-react-native.yml
vendored
@@ -4,7 +4,6 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- packages/lucide-react-native/**
|
- packages/lucide-react-native/**
|
||||||
- packages/shared/**
|
|
||||||
- tools/build-icons/**
|
- tools/build-icons/**
|
||||||
- tools/rollup-plugins/**
|
- tools/rollup-plugins/**
|
||||||
- pnpm-lock.yaml
|
- pnpm-lock.yaml
|
||||||
@@ -15,6 +14,8 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v2
|
||||||
|
with:
|
||||||
|
version: 8
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
@@ -23,5 +24,8 @@ jobs:
|
|||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm install --frozen-lockfile
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: pnpm --filter lucide-react-native build
|
||||||
|
|
||||||
- name: Test
|
- name: Test
|
||||||
run: pnpm --filter lucide-react-native test
|
run: pnpm --filter lucide-react-native test
|
||||||
|
|||||||
18
.github/workflows/lucide-react.yml
vendored
18
.github/workflows/lucide-react.yml
vendored
@@ -4,18 +4,19 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- packages/lucide-react/**
|
- packages/lucide-react/**
|
||||||
- packages/shared/**
|
|
||||||
- tools/build-icons/**
|
- tools/build-icons/**
|
||||||
- tools/rollup-plugins/**
|
- tools/rollup-plugins/**
|
||||||
- scripts/generateNextJSAliases.mjs
|
- scripts/generateNextJSAliases.mjs
|
||||||
- pnpm-lock.yaml
|
- pnpm-lock.yaml
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
lucide-react:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v2
|
||||||
|
with:
|
||||||
|
version: 8
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
@@ -27,18 +28,5 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: pnpm --filter lucide-react build
|
run: pnpm --filter lucide-react build
|
||||||
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: pnpm/action-setup@v2
|
|
||||||
- uses: actions/setup-node@v3.8.1
|
|
||||||
with:
|
|
||||||
node-version: 18
|
|
||||||
cache: 'pnpm'
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm install --frozen-lockfile
|
|
||||||
|
|
||||||
- name: Test
|
- name: Test
|
||||||
run: pnpm --filter lucide-react test
|
run: pnpm --filter lucide-react test
|
||||||
|
|||||||
24
.github/workflows/lucide-shared.yml
vendored
24
.github/workflows/lucide-shared.yml
vendored
@@ -1,24 +0,0 @@
|
|||||||
name: Lucide Shared Checks
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- packages/shared/**
|
|
||||||
- pnpm-lock.yaml
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: pnpm/action-setup@v2
|
|
||||||
- uses: actions/setup-node@v3.8.1
|
|
||||||
with:
|
|
||||||
node-version: 18
|
|
||||||
cache: 'pnpm'
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm install --frozen-lockfile
|
|
||||||
|
|
||||||
- name: Test
|
|
||||||
run: pnpm --filter lucide-react test
|
|
||||||
18
.github/workflows/lucide-solid.yml
vendored
18
.github/workflows/lucide-solid.yml
vendored
@@ -4,17 +4,18 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- packages/lucide-solid/**
|
- packages/lucide-solid/**
|
||||||
- packages/shared/**
|
|
||||||
- tools/build-icons/**
|
- tools/build-icons/**
|
||||||
- tools/rollup-plugins/**
|
- tools/rollup-plugins/**
|
||||||
- pnpm-lock.yaml
|
- pnpm-lock.yaml
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
lucide-solid:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v2
|
||||||
|
with:
|
||||||
|
version: 8
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
@@ -26,18 +27,5 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: pnpm --filter lucide-solid build
|
run: pnpm --filter lucide-solid build
|
||||||
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: pnpm/action-setup@v2
|
|
||||||
- uses: actions/setup-node@v3.8.1
|
|
||||||
with:
|
|
||||||
node-version: 18
|
|
||||||
cache: 'pnpm'
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm install --frozen-lockfile
|
|
||||||
|
|
||||||
- name: Test
|
- name: Test
|
||||||
run: pnpm --filter lucide-solid test
|
run: pnpm --filter lucide-solid test
|
||||||
|
|||||||
2
.github/workflows/lucide-static.yml
vendored
2
.github/workflows/lucide-static.yml
vendored
@@ -13,6 +13,8 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v2
|
||||||
|
with:
|
||||||
|
version: 8
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
|
|||||||
18
.github/workflows/lucide-svelte.yml
vendored
18
.github/workflows/lucide-svelte.yml
vendored
@@ -4,17 +4,18 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- packages/lucide-svelte/**
|
- packages/lucide-svelte/**
|
||||||
- packages/shared/**
|
|
||||||
- tools/build-icons/**
|
- tools/build-icons/**
|
||||||
- tools/rollup-plugins/**
|
- tools/rollup-plugins/**
|
||||||
- pnpm-lock.yaml
|
- pnpm-lock.yaml
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
lucide-svelte:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v2
|
||||||
|
with:
|
||||||
|
version: 8
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
@@ -26,18 +27,5 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: pnpm --filter lucide-svelte build
|
run: pnpm --filter lucide-svelte build
|
||||||
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: pnpm/action-setup@v2
|
|
||||||
- uses: actions/setup-node@v3.8.1
|
|
||||||
with:
|
|
||||||
node-version: 18
|
|
||||||
cache: 'pnpm'
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm install --frozen-lockfile
|
|
||||||
|
|
||||||
- name: Test
|
- name: Test
|
||||||
run: pnpm --filter lucide-svelte test
|
run: pnpm --filter lucide-svelte test
|
||||||
|
|||||||
18
.github/workflows/lucide-vue-next.yml
vendored
18
.github/workflows/lucide-vue-next.yml
vendored
@@ -4,17 +4,18 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- packages/lucide-vue-next/**
|
- packages/lucide-vue-next/**
|
||||||
- packages/shared/**
|
|
||||||
- tools/build-icons/**
|
- tools/build-icons/**
|
||||||
- tools/rollup-plugins/**
|
- tools/rollup-plugins/**
|
||||||
- pnpm-lock.yaml
|
- pnpm-lock.yaml
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
lucide-vue-next:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v2
|
||||||
|
with:
|
||||||
|
version: 8
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
@@ -26,18 +27,5 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: pnpm --filter lucide-vue-next build
|
run: pnpm --filter lucide-vue-next build
|
||||||
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: pnpm/action-setup@v2
|
|
||||||
- uses: actions/setup-node@v3.8.1
|
|
||||||
with:
|
|
||||||
node-version: 18
|
|
||||||
cache: 'pnpm'
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm install --frozen-lockfile
|
|
||||||
|
|
||||||
- name: Test
|
- name: Test
|
||||||
run: pnpm --filter lucide-vue-next test
|
run: pnpm --filter lucide-vue-next test
|
||||||
|
|||||||
18
.github/workflows/lucide-vue.yml
vendored
18
.github/workflows/lucide-vue.yml
vendored
@@ -4,17 +4,18 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- packages/lucide-vue/**
|
- packages/lucide-vue/**
|
||||||
- packages/shared/**
|
|
||||||
- tools/build-icons/**
|
- tools/build-icons/**
|
||||||
- tools/rollup-plugins/**
|
- tools/rollup-plugins/**
|
||||||
- pnpm-lock.yaml
|
- pnpm-lock.yaml
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
lucide-vue:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v2
|
||||||
|
with:
|
||||||
|
version: 8
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
@@ -26,18 +27,5 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: pnpm --filter lucide-vue build
|
run: pnpm --filter lucide-vue build
|
||||||
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: pnpm/action-setup@v2
|
|
||||||
- uses: actions/setup-node@v3.8.1
|
|
||||||
with:
|
|
||||||
node-version: 18
|
|
||||||
cache: 'pnpm'
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm install --frozen-lockfile
|
|
||||||
|
|
||||||
- name: Test
|
- name: Test
|
||||||
run: pnpm --filter lucide-vue test
|
run: pnpm --filter lucide-vue test
|
||||||
|
|||||||
17
.github/workflows/lucide.yml
vendored
17
.github/workflows/lucide.yml
vendored
@@ -9,11 +9,13 @@ on:
|
|||||||
- pnpm-lock.yaml
|
- pnpm-lock.yaml
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
lucide:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v2
|
||||||
|
with:
|
||||||
|
version: 8
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
@@ -25,18 +27,5 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: pnpm --filter lucide build
|
run: pnpm --filter lucide build
|
||||||
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: pnpm/action-setup@v2
|
|
||||||
- uses: actions/setup-node@v3.8.1
|
|
||||||
with:
|
|
||||||
node-version: 18
|
|
||||||
cache: 'pnpm'
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm install --frozen-lockfile
|
|
||||||
|
|
||||||
- name: Test
|
- name: Test
|
||||||
run: pnpm --filter lucide test
|
run: pnpm --filter lucide test
|
||||||
|
|||||||
16
.github/workflows/pull-request.yml
vendored
16
.github/workflows/pull-request.yml
vendored
@@ -3,7 +3,7 @@ name: Add Changed Icons comment
|
|||||||
on:
|
on:
|
||||||
pull_request_target:
|
pull_request_target:
|
||||||
paths:
|
paths:
|
||||||
- 'icons/*'
|
- 'icons/*.svg'
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
- fix-icon-preview
|
- fix-icon-preview
|
||||||
@@ -68,16 +68,6 @@ jobs:
|
|||||||
# input: +++ b/icons/accessibility.json%0A@@ -2,0 +3 @@%0A+ "contributors": ["hi"],%0A@@ -13 +14 @@%0A+}%0A
|
# input: +++ b/icons/accessibility.json%0A@@ -2,0 +3 @@%0A+ "contributors": ["hi"],%0A@@ -13 +14 @@%0A+}%0A
|
||||||
# output: ::$ANNOTATION_SEVERITY file=icons/accessibility.json,line=2,endLine=3,title=$ANNOTATION_TITLE::$ANNOTATION_DESCRIPTION%0A%0A+ "contributors": ["hi"],%0A@@ -13 +14 @@%0A+}%0A
|
# output: ::$ANNOTATION_SEVERITY file=icons/accessibility.json,line=2,endLine=3,title=$ANNOTATION_TITLE::$ANNOTATION_DESCRIPTION%0A%0A+ "contributors": ["hi"],%0A@@ -13 +14 @@%0A+}%0A
|
||||||
|
|
||||||
lint-aliases:
|
|
||||||
name: Check Uniqueness of Aliases
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- name: Check Uniqueness of Aliases
|
|
||||||
run: "! cat <(printf \"%s\\n\" icons/*.json | while read -r name; do basename \"$name\" .json; done) <(jq -cr 'select(.aliases) | .aliases[] | if type==\"string\" then . else .name end' icons/*.json) | sort | uniq -c | grep -ve '^\\s*1 '"
|
|
||||||
|
|
||||||
generate-changed-icons-comment:
|
generate-changed-icons-comment:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
permissions:
|
||||||
@@ -104,10 +94,6 @@ jobs:
|
|||||||
comment-author: 'github-actions[bot]'
|
comment-author: 'github-actions[bot]'
|
||||||
body-includes: Added or changed icons
|
body-includes: Added or changed icons
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
|
||||||
- name: Install svgson for code preview (safer and faster than installing all deps)
|
|
||||||
run: npm install svgson
|
|
||||||
|
|
||||||
- name: Generate comment markup
|
- name: Generate comment markup
|
||||||
run: node ./scripts/generateChangedIconsCommentMarkup.mjs >> comment-markup.md
|
run: node ./scripts/generateChangedIconsCommentMarkup.mjs >> comment-markup.md
|
||||||
id: comment-markup
|
id: comment-markup
|
||||||
|
|||||||
36
.github/workflows/release.yml
vendored
36
.github/workflows/release.yml
vendored
@@ -41,21 +41,22 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
package:
|
package: [
|
||||||
[
|
'lucide',
|
||||||
'lucide',
|
'lucide-react',
|
||||||
'lucide-react',
|
'lucide-react-native',
|
||||||
'lucide-react-native',
|
'lucide-vue',
|
||||||
'lucide-vue',
|
'lucide-vue-next',
|
||||||
'lucide-vue-next',
|
'lucide-angular',
|
||||||
'lucide-angular',
|
'lucide-preact',
|
||||||
'lucide-preact',
|
'lucide-solid',
|
||||||
'lucide-solid',
|
'lucide-svelte',
|
||||||
'lucide-svelte',
|
]
|
||||||
]
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v2
|
||||||
|
with:
|
||||||
|
version: 8
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
@@ -87,6 +88,8 @@ jobs:
|
|||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/download-artifact@v3
|
- uses: actions/download-artifact@v3
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v2
|
||||||
|
with:
|
||||||
|
version: 8
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
@@ -117,6 +120,8 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v2
|
||||||
|
with:
|
||||||
|
version: 8
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
@@ -131,7 +136,7 @@ jobs:
|
|||||||
- name: Create font in ./lucide-font
|
- name: Create font in ./lucide-font
|
||||||
run: pnpm build:font
|
run: pnpm build:font
|
||||||
|
|
||||||
- name: 'Upload to Artifacts'
|
- name: "Upload to Artifacts"
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: lucide-font
|
name: lucide-font
|
||||||
@@ -140,7 +145,10 @@ jobs:
|
|||||||
post-release:
|
post-release:
|
||||||
if: github.repository == 'lucide-icons/lucide'
|
if: github.repository == 'lucide-icons/lucide'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [pre-release, lucide-font]
|
needs: [
|
||||||
|
pre-release,
|
||||||
|
lucide-font,
|
||||||
|
]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|||||||
9
.gitignore
vendored
9
.gitignore
vendored
@@ -16,17 +16,11 @@ outlined
|
|||||||
packages/**/src/icons/*.js
|
packages/**/src/icons/*.js
|
||||||
packages/**/src/icons/*.ts
|
packages/**/src/icons/*.ts
|
||||||
packages/**/src/icons/*.tsx
|
packages/**/src/icons/*.tsx
|
||||||
packages/**/src/aliases/*.ts
|
|
||||||
packages/**/src/aliases.ts
|
packages/**/src/aliases.ts
|
||||||
!packages/**/src/aliases/index.ts
|
|
||||||
packages/**/src/dynamicIconImports.ts
|
packages/**/src/dynamicIconImports.ts
|
||||||
packages/**/DynamicIcon.d.ts
|
|
||||||
packages/**/dynamicIconImports.js
|
packages/**/dynamicIconImports.js
|
||||||
packages/**/dynamicIconImports.d.ts
|
packages/**/dynamicIconImports.d.ts
|
||||||
packages/**/dynamicIconImports.js.map
|
packages/**/dynamicIconImports.js.map
|
||||||
packages/**/dynamic.d.ts
|
|
||||||
packages/**/dynamic.mjs.map
|
|
||||||
packages/**/dynamic.mjs
|
|
||||||
packages/**/LICENSE
|
packages/**/LICENSE
|
||||||
categories.json
|
categories.json
|
||||||
tags.json
|
tags.json
|
||||||
@@ -40,10 +34,7 @@ docs/.vitepress/data/iconNodes
|
|||||||
docs/.vitepress/data/iconMetaData.ts
|
docs/.vitepress/data/iconMetaData.ts
|
||||||
docs/.vitepress/data/releaseMetaData.json
|
docs/.vitepress/data/releaseMetaData.json
|
||||||
docs/.vitepress/data/releaseMetaData
|
docs/.vitepress/data/releaseMetaData
|
||||||
docs/.vitepress/data/categoriesData.json
|
|
||||||
docs/.vitepress/data/iconDetails
|
docs/.vitepress/data/iconDetails
|
||||||
docs/.vitepress/data/relatedIcons.json
|
docs/.vitepress/data/relatedIcons.json
|
||||||
docs/.vercel
|
docs/.vercel
|
||||||
docs/.nitro
|
docs/.nitro
|
||||||
.gitignore
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,5 @@
|
|||||||
pnpm-lock.yaml
|
pnpm-lock.yaml
|
||||||
|
|
||||||
# docs examples
|
|
||||||
docs/**/examples/
|
|
||||||
docs/.vitepress/.temp
|
|
||||||
docs/.vitepress/cache
|
|
||||||
docs/.vitepress/data
|
|
||||||
docs/.nitro
|
|
||||||
|
|
||||||
# lucide-angular
|
# lucide-angular
|
||||||
packages/lucide-angular/.angular/cache
|
packages/lucide-angular/.angular/cache
|
||||||
|
|
||||||
|
|||||||
2
.vscode/launch.json
vendored
2
.vscode/launch.json
vendored
@@ -12,4 +12,4 @@
|
|||||||
"webRoot": "${workspaceFolder}"
|
"webRoot": "${workspaceFolder}"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
11
.vscode/settings.json
vendored
11
.vscode/settings.json
vendored
@@ -1,6 +1,13 @@
|
|||||||
{
|
{
|
||||||
"cSpell.words": ["devs", "preact", "Preact"],
|
"cSpell.words": [
|
||||||
|
"devs",
|
||||||
|
"preact",
|
||||||
|
"Preact"
|
||||||
|
],
|
||||||
"eslint.enable": true,
|
"eslint.enable": true,
|
||||||
"eslint.validate": ["javascript", "svg"],
|
"eslint.validate": [
|
||||||
|
"javascript",
|
||||||
|
"svg"
|
||||||
|
],
|
||||||
"svg.preview.background": "transparent"
|
"svg.preview.background": "transparent"
|
||||||
}
|
}
|
||||||
|
|||||||
2
.vscode/svg.code-snippets
vendored
2
.vscode/svg.code-snippets
vendored
@@ -49,7 +49,7 @@
|
|||||||
"circle",
|
"circle",
|
||||||
"<circle"
|
"<circle"
|
||||||
],
|
],
|
||||||
"body": "<circle cx=\"${2:12}\" cy=\"${3:$2}\" r=\"${1|10,2,.5\" fill=\"currentColor|}\" />"
|
"body": "<circle cx=\"${2:12}\" cy=\"${3:$2}\" r=\"${1|10,2,.5|}\" />"
|
||||||
},
|
},
|
||||||
"Ellipse": {
|
"Ellipse": {
|
||||||
"scope": "xml",
|
"scope": "xml",
|
||||||
|
|||||||
@@ -39,8 +39,6 @@ You can also [download an Adobe Illustrator template](https://github.com/lucide-
|
|||||||
|
|
||||||
#### [Figma Guide](https://lucide.dev/docs/figma-guide)
|
#### [Figma Guide](https://lucide.dev/docs/figma-guide)
|
||||||
|
|
||||||
#### [Affinity Designer Guide](https://lucide.dev/guide/design/affinity-designer-guide)
|
|
||||||
|
|
||||||
### Submitting Multiple Icons
|
### Submitting Multiple Icons
|
||||||
|
|
||||||
If you want submit multiple icons, please separate the icons and group them. That makes reviewing the icons easier and keep the thread clean and scoped.
|
If you want submit multiple icons, please separate the icons and group them. That makes reviewing the icons easier and keep the thread clean and scoped.
|
||||||
@@ -72,7 +70,7 @@ pnpm install # Install dependencies, including the workspace packages
|
|||||||
|
|
||||||
### Packages -> PNPM Workspaces
|
### Packages -> PNPM Workspaces
|
||||||
|
|
||||||
To distribute different packages we use [PNPM workspaces](https://pnpm.io/workspaces). Before you start make sure you are familiar with this concept. The concept of working in workspaces is created by Yarn, they have a well written introduction: [yarn workspaces](https://classic.yarnpkg.com/en/docs/workspaces).
|
To distribute different packages we use PNPM workspaces. Before you start make sure you are familiar with this concept. The concept of working in workspaces is created by Yarn, they have a well written introduction: [yarn workspaces](https://classic.yarnpkg.com/lang/enhttps://lucide.dev/docs/workspaces).
|
||||||
|
|
||||||
The configured directory for workspaces is the [packages](https://github.com/lucide-icons/lucide/tree/main/packages) directory, located in the root directory. There you will find all the current packages from lucide.
|
The configured directory for workspaces is the [packages](https://github.com/lucide-icons/lucide/tree/main/packages) directory, located in the root directory. There you will find all the current packages from lucide.
|
||||||
There are more workspaces defined, see [`pnpm-workspace.yaml`](https://github.com/lucide-icons/lucide/blob/main/pnpm-workspace.yaml).
|
There are more workspaces defined, see [`pnpm-workspace.yaml`](https://github.com/lucide-icons/lucide/blob/main/pnpm-workspace.yaml).
|
||||||
@@ -127,7 +125,7 @@ When adding new features to for example the icon component for a framework. It i
|
|||||||
|
|
||||||
### Local Testing
|
### Local Testing
|
||||||
|
|
||||||
To test changes in a local project, you can use `yarn link`, `npm link`, `bun link` or `pnpm link` to link the package. Before you do this make sure you builded the package first.
|
To test changes in a local project, you can use `yarn link`, `npm link` or `pnpm link` to link the package. Before you do this make sure you builded the package first.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
# in packages/lucide-react
|
# in packages/lucide-react
|
||||||
|
|||||||
275
README.md
275
README.md
@@ -1,46 +1,185 @@
|
|||||||
<p align="center">
|
<p align=center><img width="480" src="https://lucide.dev/lucide-logo-repo.svg" alt="Lucide Logo"></p>
|
||||||
<a href="https://github.com/lucide-icons/lucide#gh-light-mode-only">
|
|
||||||
<img src="https://lucide.dev/lucide-logo-repo.svg#gh-light-mode-only" alt="Lucide - Beautiful & consistent icon toolkit made by the community. Open-source project and a fork of Feather Icons." width="480">
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/lucide-icons/lucide#gh-dark-mode-only">
|
|
||||||
<img src="https://lucide.dev/lucide-logo-repo-dark.svg#gh-dark-mode-only" alt="Lucide - Beautiful & consistent icon toolkit made by the community. Open-source project and a fork of Feather Icons." width="480">
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://github.com/lucide-icons/lucide/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/lucide" alt="license"></a>
|
<a href="https://github.com/lucide-icons/lucide/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/lucide" alt="license"></a>
|
||||||
<a href="https://www.figma.com/community/plugin/939567362549682242/Lucide-Icons"><img src="https://img.shields.io/badge/Figma-F24E1E?logo=figma&logoColor=white" alt="figma installs"></a>
|
<a href="https://www.npmjs.com/package/lucide"><img src="https://img.shields.io/npm/v/lucide" alt="npm package"></a>
|
||||||
|
<a href="https://www.figma.com/community/plugin/939567362549682242/Lucide-Icons"><img src="https://img.shields.io/endpoint?logo=figma&label=installs&url=https://yuanqing.github.io/figma-plugins-stats/plugin/939567362549682242/installs.json" alt="figma installs"></a>
|
||||||
<a href="https://github.com/lucide-icons/lucide/actions/workflows/release.yml"><img src="https://github.com/lucide-icons/lucide/actions/workflows/release.yml/badge.svg" alt="build status"></a>
|
<a href="https://github.com/lucide-icons/lucide/actions/workflows/release.yml"><img src="https://github.com/lucide-icons/lucide/actions/workflows/release.yml/badge.svg" alt="build status"></a>
|
||||||
<a href="https://discord.gg/EH6nSts"><img src="https://img.shields.io/discord/723074157486800936?label=chat&logo=discord&logoColor=%23ffffff&colorB=%237289DA" alt="discord chat"></a>
|
<a href="https://discord.gg/EH6nSts"><img src="https://img.shields.io/discord/723074157486800936?label=chat&logo=discord&logoColor=%23ffffff&colorB=%237289DA" alt="discord chat"></a>
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
|
||||||
<a href="https://lucide.dev/icons/">Icons</a>
|
|
||||||
·
|
|
||||||
<a href="https://lucide.dev/guide/">Guide</a>
|
|
||||||
·
|
|
||||||
<a href="https://lucide.dev/packages">Packages</a>
|
|
||||||
·
|
|
||||||
<a href="https://lucide.dev/license">License</a>
|
|
||||||
·
|
|
||||||
<a href="https://lucide.dev/showcase">Showcase</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
# Lucide
|
# Lucide
|
||||||
|
|
||||||
Lucide is an open-source icon library that provides 1000+ vector (svg) files for displaying icons and symbols in digital and non-digital projects. The library aims to make it easier for designers and developers to incorporate icons into their projects by providing several official [packages](https://lucide.dev/packages) to make it easier to use these icons in your project.
|
Community-run fork of [Feather Icons](https://github.com/feathericons/feather), open for anyone to contribute icons.
|
||||||
|
|
||||||
## Packages
|
It began after growing dissatisfaction with the [Feather Icons](https://github.com/feathericons/feather) project moderation. With over 300+ open issues and over 100+ open PRs, the Feather Icons project has been abandoned. This unfortunately means that hundreds of developers and designers wasted their time contributing to Feather Icons with no chance of PRs being accepted.
|
||||||
|
|
||||||
| Logo | Package | Version | Downloads | Links |
|
Lucide is trying to expand the icon set as much as possible while staying faithful to the original simplistic design language. We do this as a community of devs and designers and hope that you'll join us!
|
||||||
| ---- | ------- | ------- | --------- | ----- |
|
|
||||||
| <img src="https://lucide.dev/framework-logos/js.svg" alt="JS logo" width="48"> | **`lucide`** | [](https://www.npmjs.com/package/lucide) |  | [Docs](https://lucide.dev/guide/packages/lucide) · [Source](./packages/lucide) |
|
### Why choose Lucide over Feather Icons
|
||||||
| <img src="https://lucide.dev/framework-logos/react.svg" alt="React logo" width="48"> | **`lucide-react`** | [](https://www.npmjs.com/package/lucide-react) |  | [Docs](https://lucide.dev/guide/packages/lucide-react) · [Source](./packages/lucide-react) |
|
|
||||||
| <img src="https://lucide.dev/framework-logos/vue.svg" alt="Vue logo" width="48"> | **`lucide-vue-next`** | [](https://www.npmjs.com/package/lucide-vue-next) |  | [Docs](https://lucide.dev/guide/packages/lucide-vue-next) · [Source](./packages/lucide-vue-next) |
|
- More icons to work with: Lucide already has hundreds of icons more than Feather does.
|
||||||
| <img src="https://lucide.dev/framework-logos/svelte.svg" alt="Svelte logo" width="48"> | **`lucide-svelte`** | [](https://www.npmjs.com/package/lucide-svelte) |  | [Docs](https://lucide.dev/guide/packages/lucide-svelte) · [Source](./packages/lucide-svelte) |
|
- Official libraries and integrations with popular frameworks and design tools.
|
||||||
| <img src="https://lucide.dev/framework-logos/solid.svg" alt="Solid logo" width="48"> | **`lucide-solid`** | [](https://www.npmjs.com/package/lucide-solid) |  | [Docs](https://lucide.dev/guide/packages/lucide-solid) · [Source](./packages/lucide-solid) |
|
- Well maintained code base.
|
||||||
| <img src="https://lucide.dev/framework-logos/preact.svg" alt="Preact logo" width="48"> | **`lucide-preact`** | [](https://www.npmjs.com/package/lucide-preact) |  | [Docs](https://lucide.dev/guide/packages/lucide-preact) · [Source](./packages/lucide-preact) |
|
- Active community, regularly growing and improving the set.
|
||||||
| <img src="https://lucide.dev/framework-logos/react-native.svg" alt="React Native logo" width="48"> | **`lucide-react-native`** | [](https://www.npmjs.com/package/lucide-react-native) |  | [Docs](https://lucide.dev/guide/packages/lucide-react-native) · [Source](./packages/lucide-react-native) |
|
|
||||||
| <img src="https://lucide.dev/framework-logos/angular.svg" alt="Angular logo" width="48"> | **`lucide-angular`** | [](https://www.npmjs.com/package/lucide-angular) |  | [Docs](https://lucide.dev/guide/packages/lucide-angular) · [Source](./packages/lucide-angular) |
|
## Table of Contents
|
||||||
| <img src="https://lucide.dev/framework-logos/svg.svg" alt="SVG logo" width="48"> | **`lucide-static`** | [](https://www.npmjs.com/package/lucide-static) |  | [Docs](https://lucide.dev/guide/packages/lucide-static) · [Source](./packages/lucide-static) |
|
|
||||||
|
- [Usage](#usage)
|
||||||
|
- [Web](#web)
|
||||||
|
- [React](#react)
|
||||||
|
- [React Native](#react-native)
|
||||||
|
- [Vue 2](#vue-2)
|
||||||
|
- [Vue 3](#vue-3)
|
||||||
|
- [Angular](#angular)
|
||||||
|
- [Preact](#preact)
|
||||||
|
- [Static (svg sprite, font, icons ..)](#static-svg-sprite-font-icons-)
|
||||||
|
- [Figma](#figma)
|
||||||
|
- [Laravel](#laravel)
|
||||||
|
- [Svelte](#svelte)
|
||||||
|
- [Solid](#solid)
|
||||||
|
- [Hyva](#hyva)
|
||||||
|
- [Eleventy](#eleventy)
|
||||||
|
- [Contributing](#contributing)
|
||||||
|
- [Community](#community)
|
||||||
|
- [License](#license)
|
||||||
|
- [Credits](#credits)
|
||||||
|
- [Sponsors](#sponsors)
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
At its core, Lucide is a collection of [SVG](https://svgontheweb.com/#svg) files. This means that you can use Lucide icons in all the same ways you can use SVGs (e.g. `img`, `background-image`, `inline`, `object`, `embed`, `iframe`). Here's a helpful article detailing the many ways SVGs can be used on the web: [SVG on the Web – Implementation Options](https://svgontheweb.com/#implementation)
|
||||||
|
|
||||||
|
The following are additional ways you can use Lucide.
|
||||||
|
With the Javascript library you can easily incorporate the icon you want in your webpage.
|
||||||
|
|
||||||
|
### Web
|
||||||
|
|
||||||
|
Implementation of the lucide icon library for web applications.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm install lucide
|
||||||
|
```
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
```sh
|
||||||
|
yarn add lucide
|
||||||
|
```
|
||||||
|
|
||||||
|
For more details, see the [documentation](https://github.com/lucide-icons/lucide/tree/main/packages/lucide#lucide).
|
||||||
|
|
||||||
|
### React
|
||||||
|
|
||||||
|
Implementation of the lucide icon library for react applications.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
yarn add lucide-react
|
||||||
|
```
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm install lucide-react
|
||||||
|
```
|
||||||
|
|
||||||
|
For more details, see the [documentation](https://github.com/lucide-icons/lucide/tree/main/packages/lucide-react#lucide-react).
|
||||||
|
|
||||||
|
### React Native
|
||||||
|
|
||||||
|
Implementation of the lucide icon library for React Native applications.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
yarn add lucide-react-native
|
||||||
|
```
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm install lucide-react-native
|
||||||
|
```
|
||||||
|
|
||||||
|
For more details, see the [documentation](https://github.com/lucide-icons/lucide/tree/main/packages/lucide-react-native#lucide-react-native).
|
||||||
|
|
||||||
|
### Vue 2
|
||||||
|
|
||||||
|
Implementation of the lucide icon library for vue applications.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
yarn add lucide-vue
|
||||||
|
```
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm install lucide-vue
|
||||||
|
```
|
||||||
|
|
||||||
|
For more details, see the [documentation](https://github.com/lucide-icons/lucide/tree/main/packages/lucide-vue#lucide-vue).
|
||||||
|
|
||||||
|
### Vue 3
|
||||||
|
|
||||||
|
Implementation of the lucide icon library for vue applications.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
yarn add lucide-vue-next
|
||||||
|
```
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm install lucide-vue-next
|
||||||
|
```
|
||||||
|
|
||||||
|
For more details, see the [documentation](https://github.com/lucide-icons/lucide/tree/main/packages/lucide-vue-next#lucide-vue-next).
|
||||||
|
|
||||||
|
### Angular
|
||||||
|
|
||||||
|
```sh
|
||||||
|
yarn add lucide-angular
|
||||||
|
```
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm install lucide-angular
|
||||||
|
```
|
||||||
|
|
||||||
|
For more details, see the [documentation](https://github.com/lucide-icons/lucide/tree/main/packages/lucide-angular#lucide-angular).
|
||||||
|
|
||||||
|
### Preact
|
||||||
|
|
||||||
|
Implementation of the lucide icon library for preact applications.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
yarn add lucide-preact
|
||||||
|
```
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm install lucide-preact
|
||||||
|
```
|
||||||
|
|
||||||
|
For more details, see the [documentation](https://github.com/lucide-icons/lucide/tree/main/packages/lucide-preact#lucide-preact).
|
||||||
|
|
||||||
|
### Static (svg sprite, font, icons ..)
|
||||||
|
|
||||||
|
Assets:
|
||||||
|
[Font Files](https://github.com/lucide-icons/lucide/releases/latest)
|
||||||
|
[SVG Files](https://github.com/lucide-icons/lucide/releases/latest)
|
||||||
|
[SVG Sprite](https://cdn.jsdelivr.net/npm/lucide-static@latest/sprite.svg)
|
||||||
|
|
||||||
|
NPM package
|
||||||
|
|
||||||
|
```sh
|
||||||
|
yarn add lucide-static
|
||||||
|
```
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm install lucide-static
|
||||||
|
```
|
||||||
|
|
||||||
### Figma
|
### Figma
|
||||||
|
|
||||||
@@ -50,6 +189,68 @@ Visit [Figma community page](https://www.figma.com/community/plugin/939567362549
|
|||||||
|
|
||||||
<img width="420" src="https://www.figma.com/community/plugin/939567362549682242/thumbnail" alt="Figma Lucide Cover">
|
<img width="420" src="https://www.figma.com/community/plugin/939567362549682242/thumbnail" alt="Figma Lucide Cover">
|
||||||
|
|
||||||
|
### Laravel
|
||||||
|
|
||||||
|
Implementation of Lucide icon's using `blade-icons` for Laravel based projects.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
composer require mallardduck/blade-lucide-icons
|
||||||
|
```
|
||||||
|
|
||||||
|
For more details, see the [documentation](https://github.com/mallardduck/blade-lucide-icons/blob/main/README.md).
|
||||||
|
|
||||||
|
### Svelte
|
||||||
|
|
||||||
|
Implementation of the lucide icon library for Svelte applications.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
yarn add lucide-svelte
|
||||||
|
```
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm install lucide-svelte
|
||||||
|
```
|
||||||
|
|
||||||
|
For more details, see the [documentation](https://github.com/lucide-icons/lucide/tree/main/packages/lucide-svelte#lucide-svelte).
|
||||||
|
|
||||||
|
### Solid
|
||||||
|
|
||||||
|
Implementation of the lucide icon library for solid applications.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
yarn add lucide-solid
|
||||||
|
```
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm install lucide-solid
|
||||||
|
```
|
||||||
|
|
||||||
|
For more details, see the [documentation](https://github.com/lucide-icons/lucide/tree/main/packages/lucide-solid#lucide-solid).
|
||||||
|
|
||||||
|
### Hyva
|
||||||
|
|
||||||
|
Implementation of Lucide icon's using Hyvä's svg php viewmodal to render icons for Magento 2 Hyva theme based projects.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
composer require siteation/magento2-hyva-icons-lucide
|
||||||
|
```
|
||||||
|
|
||||||
|
For more details, see the [documentation](https://github.com/Siteation/magento2-hyva-icons-lucide/blob/main/README.md).
|
||||||
|
|
||||||
|
### Eleventy
|
||||||
|
|
||||||
|
Using this plugin, Eleventy projects can incorporate Lucide icons. it makes it simple to use Lucide icons into your themes via shortcodes, improving your website's overall usability and visual appeal.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm install @grimlink/eleventy-plugin-lucide-icons
|
||||||
|
```
|
||||||
|
|
||||||
|
For more details, see the [documentation](https://github.com/GrimLink/eleventy-plugin-lucide-icons/blob/main/README.md).
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
For more info on how to contribute please see the [contribution guidelines](https://github.com/lucide-icons/lucide/blob/main/CONTRIBUTING.md).
|
For more info on how to contribute please see the [contribution guidelines](https://github.com/lucide-icons/lucide/blob/main/CONTRIBUTING.md).
|
||||||
@@ -62,7 +263,7 @@ Join the community on our [Discord](https://discord.gg/EH6nSts) server!
|
|||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Lucide is totally free for commercial use and personal use, this software is licensed under the [ISC License](https://github.com/lucide-icons/lucide/blob/main/LICENSE).
|
Lucide is totally free for commercial use and personally use, this software is licensed under the [ISC License](https://github.com/lucide-icons/lucide/blob/main/LICENSE).
|
||||||
|
|
||||||
## Credits
|
## Credits
|
||||||
|
|
||||||
@@ -73,13 +274,9 @@ Thank you to all the people who contributed to Lucide!
|
|||||||
|
|
||||||
## Sponsors
|
## Sponsors
|
||||||
|
|
||||||
|
|
||||||
<a href="https://vercel.com?utm_source=lucide&utm_campaign=oss">
|
<a href="https://vercel.com?utm_source=lucide&utm_campaign=oss">
|
||||||
<img src="docs/public/vercel.svg" alt="Powered by Vercel" width="200" />
|
<img src="docs/public/vercel.svg" alt="Powered by Vercel" width="200" />
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a href="https://www.digitalocean.com/?refcode=b0877a2caebd&utm_campaign=Referral_Invite&utm_medium=Referral_Program&utm_source=badge"><img src="docs/public/digitalocean.svg" width="200" alt="DigitalOcean Referral Badge" /></a>
|
<a href="https://www.digitalocean.com/?refcode=b0877a2caebd&utm_campaign=Referral_Invite&utm_medium=Referral_Program&utm_source=badge"><img src="docs/public/digitalocean.svg" width="200" alt="DigitalOcean Referral Badge" /></a>
|
||||||
|
|
||||||
### Awesome backers 🍺
|
|
||||||
|
|
||||||
<a href="https://www.scipress.io?utm_source=lucide"><img src="docs/public/sponsors/scipress.svg" width="180" alt="Scipress sponsor badge" /></a>
|
|
||||||
<a href="https://github.com/pdfme/pdfme"><img src="docs/public/sponsors/pdfme.svg" width="180" alt="pdfme sponsor badge" /></a>
|
|
||||||
|
|||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Accessibility",
|
"title": "Accessibility",
|
||||||
"icon": "accessibility"
|
"icon": "accessibility"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Accounts & access",
|
"title": "Accounts & access",
|
||||||
"icon": "user"
|
"icon": "user"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Animals",
|
"title": "Animals",
|
||||||
"icon": "dog"
|
"icon": "dog"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Arrows",
|
"title": "Arrows",
|
||||||
"icon": "arrow-left-right"
|
"icon": "arrow-left-right"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Brands",
|
"title": "Brands",
|
||||||
"icon": "facebook"
|
"icon": "facebook"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Buildings",
|
"title": "Buildings",
|
||||||
"icon": "building"
|
"icon": "building"
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Charts",
|
"title": "Charts",
|
||||||
"icon": "chart-pie"
|
"icon": "pie-chart"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Communication",
|
"title": "Communication",
|
||||||
"icon": "message-circle"
|
"icon": "message-circle"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Connectivity",
|
"title": "Connectivity",
|
||||||
"icon": "wifi"
|
"icon": "wifi"
|
||||||
}
|
}
|
||||||
5
categories/currency.json
Normal file
5
categories/currency.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Currency",
|
||||||
|
"icon": "dollar-sign"
|
||||||
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Cursors",
|
"title": "Cursors",
|
||||||
"icon": "mouse-pointer-2"
|
"icon": "mouse-pointer-2"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Design",
|
"title": "Design",
|
||||||
"icon": "palette"
|
"icon": "palette"
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Coding & development",
|
"title": "Coding & development",
|
||||||
"icon": "code-xml"
|
"icon": "code-2"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Devices",
|
"title": "Devices",
|
||||||
"icon": "smartphone"
|
"icon": "smartphone"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Emoji",
|
"title": "Emoji",
|
||||||
"icon": "smile"
|
"icon": "smile"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "File icons",
|
"title": "File icons",
|
||||||
"icon": "panels-top-left"
|
"icon": "panels-top-left"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Food & beverage",
|
"title": "Food & beverage",
|
||||||
"icon": "coffee"
|
"icon": "coffee"
|
||||||
}
|
}
|
||||||
5
categories/furniture.json
Normal file
5
categories/furniture.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Furniture",
|
||||||
|
"icon": "rocking-chair"
|
||||||
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Gaming",
|
"title": "Gaming",
|
||||||
"icon": "gamepad-2"
|
"icon": "gamepad-2"
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Home",
|
"title": "Home",
|
||||||
"icon": "house"
|
"icon": "home"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Layout",
|
"title": "Layout",
|
||||||
"icon": "panels-top-left"
|
"icon": "panels-top-left"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Mail",
|
"title": "Mail",
|
||||||
"icon": "mail"
|
"icon": "mail"
|
||||||
}
|
}
|
||||||
5
categories/maps.json
Normal file
5
categories/maps.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Maps",
|
||||||
|
"icon": "map"
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Mathematics",
|
"title": "Maths",
|
||||||
"icon": "divide"
|
"icon": "divide"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Medical",
|
"title": "Medical",
|
||||||
"icon": "heart"
|
"icon": "heart"
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Finance",
|
"title": "Money",
|
||||||
"icon": "piggy-bank"
|
"icon": "piggy-bank"
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Multimedia",
|
"title": "Multimedia",
|
||||||
"icon": "circle-play"
|
"icon": "play-circle"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Nature",
|
"title": "Nature",
|
||||||
"icon": "sprout"
|
"icon": "sprout"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Navigation",
|
"title": "Navigation",
|
||||||
"icon": "compass"
|
"icon": "compass"
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Notification",
|
"title": "Notifications",
|
||||||
"icon": "triangle-alert"
|
"icon": "alert-triangle"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "People",
|
"title": "People",
|
||||||
"icon": "person-standing"
|
"icon": "person-standing"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Photography",
|
"title": "Photography",
|
||||||
"icon": "camera"
|
"icon": "camera"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Science",
|
"title": "Science",
|
||||||
"icon": "flask-conical"
|
"icon": "flask-conical"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Seasons",
|
"title": "Seasons",
|
||||||
"icon": "leaf"
|
"icon": "leaf"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Security",
|
"title": "Security",
|
||||||
"icon": "shield"
|
"icon": "shield"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Shapes",
|
"title": "Shapes",
|
||||||
"icon": "triangle"
|
"icon": "triangle"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Shopping",
|
"title": "Shopping",
|
||||||
"icon": "shopping-bag"
|
"icon": "shopping-bag"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Social",
|
"title": "Social",
|
||||||
"icon": "thumbs-up"
|
"icon": "thumbs-up"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Sports",
|
"title": "Sports",
|
||||||
"icon": "type"
|
"icon": "type"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Sustainability",
|
"title": "Sustainability",
|
||||||
"icon": "recycle"
|
"icon": "recycle"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Time & calendar",
|
"title": "Time & calendar",
|
||||||
"icon": "calendar"
|
"icon": "calendar"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Tools",
|
"title": "Tools",
|
||||||
"icon": "hammer"
|
"icon": "hammer"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Transportation",
|
"title": "Transportation",
|
||||||
"icon": "train-front"
|
"icon": "train-front"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Travel",
|
"title": "Travel",
|
||||||
"icon": "backpack"
|
"icon": "backpack"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Weather",
|
"title": "Weather",
|
||||||
"icon": "cloud-sun"
|
"icon": "cloud-sun"
|
||||||
}
|
}
|
||||||
10
cspell.json
10
cspell.json
@@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"dictionaries": ["en-us", "custom-words"],
|
|
||||||
"dictionaryDefinitions": [
|
|
||||||
{
|
|
||||||
"name": "custom-words",
|
|
||||||
"path": "./.cspell/custom-words.txt",
|
|
||||||
"addWords": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
import iconMetaData from '../../data/iconMetaData';
|
import { eventHandler, setResponseHeader } from 'h3'
|
||||||
|
import iconMetaData from '../../data/iconMetaData'
|
||||||
|
|
||||||
export default eventHandler((event) => {
|
export default eventHandler((event) => {
|
||||||
setResponseHeader(event, 'Cache-Control', 'public, max-age=86400');
|
setResponseHeader(event, 'Cache-Control', 'public, max-age=86400')
|
||||||
setResponseHeader(event, 'Access-Control-Allow-Origin', '*');
|
setResponseHeader(event, 'Access-Control-Allow-Origin', '*')
|
||||||
|
|
||||||
return Object.fromEntries(
|
return Object.fromEntries(
|
||||||
Object.entries(iconMetaData).map(([name, { categories }]) => [name, categories]),
|
Object.entries(iconMetaData).map(([name, { categories }]) => [ name, categories ])
|
||||||
);
|
)
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
import iconNodes from '../../data/iconNodes/index.ts';
|
|
||||||
import { IconNodeWithKeys } from '../../theme/types';
|
|
||||||
import iconMetaData from '../../data/iconMetaData';
|
|
||||||
import releaseMeta from '../../data/releaseMetaData.json';
|
|
||||||
import categories from '../../data/categoriesData.json';
|
|
||||||
|
|
||||||
const dataResponse = {
|
|
||||||
icons: Object.entries(iconNodes).reduce((acc, [name, iconNode]) => {
|
|
||||||
const newIconNode = (iconNode as IconNodeWithKeys).map(([name, { key, ...attrs }]) => {
|
|
||||||
return [name, attrs];
|
|
||||||
});
|
|
||||||
|
|
||||||
acc[name] = {
|
|
||||||
iconNode: newIconNode,
|
|
||||||
aliases: (iconMetaData[name]?.aliases ?? []).map((alias) =>
|
|
||||||
typeof alias === 'string' ? alias : alias.name,
|
|
||||||
),
|
|
||||||
tags: iconMetaData[name].tags ?? [],
|
|
||||||
categories: iconMetaData[name].categories ?? [],
|
|
||||||
...releaseMeta[name],
|
|
||||||
};
|
|
||||||
|
|
||||||
return acc;
|
|
||||||
}, {}),
|
|
||||||
aliases: Object.entries(iconNodes).reduce((acc, [name]) => {
|
|
||||||
for (const alias of iconMetaData[name]?.aliases ?? []) {
|
|
||||||
acc[typeof alias === 'string' ? alias : alias.name] = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
return acc;
|
|
||||||
}, {}),
|
|
||||||
categories,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default eventHandler((event) => {
|
|
||||||
setResponseHeader(event, 'Cache-Control', 'public, max-age=86400');
|
|
||||||
setResponseHeader(event, 'Access-Control-Allow-Origin', '*');
|
|
||||||
|
|
||||||
return dataResponse;
|
|
||||||
});
|
|
||||||
@@ -13,10 +13,7 @@ export default eventHandler((event) => {
|
|||||||
const data = pathData.at(-1).slice(0, -4);
|
const data = pathData.at(-1).slice(0, -4);
|
||||||
const [name] = pathData;
|
const [name] = pathData;
|
||||||
|
|
||||||
const src = Buffer.from(data, 'base64')
|
const src = Buffer.from(data, 'base64').toString('utf8');
|
||||||
.toString('utf8')
|
|
||||||
.replaceAll('\n', '')
|
|
||||||
.replace(/<svg[^>]*>|<\/svg>/g, '');
|
|
||||||
|
|
||||||
const children = [];
|
const children = [];
|
||||||
|
|
||||||
@@ -28,25 +25,25 @@ export default eventHandler((event) => {
|
|||||||
.map((_, idx, arr) => arr.slice(0, idx + 1).join('-'))
|
.map((_, idx, arr) => arr.slice(0, idx + 1).join('-'))
|
||||||
.reverse()
|
.reverse()
|
||||||
.find((groupName) => groupName in iconNodes);
|
.find((groupName) => groupName in iconNodes);
|
||||||
if (!(name in iconNodes) && backdropName) {
|
if (backdropName) {
|
||||||
const iconNode = iconNodes[backdropName];
|
const iconNode = iconNodes[backdropName];
|
||||||
|
|
||||||
const LucideIcon = createLucideIcon(backdropName, iconNode);
|
const LucideIcon = createLucideIcon(backdropName, iconNode);
|
||||||
const svg = renderToStaticMarkup(createElement(LucideIcon));
|
const svg = renderToStaticMarkup(createElement(LucideIcon));
|
||||||
const backdropString = svg.replaceAll('\n', '').replace(/<svg[^>]*>|<\/svg>/g, '');
|
const backdropString = svg.replace(/<svg[^>]*>|<\/svg>/g, '');
|
||||||
|
|
||||||
children.push(
|
children.push(
|
||||||
createElement(Backdrop, {
|
createElement(Backdrop, {
|
||||||
backdropString,
|
backdropString,
|
||||||
src,
|
src,
|
||||||
color: '#777',
|
color: name in iconNodes ? 'red' : '#777',
|
||||||
}),
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const svg = Buffer.from(
|
const svg = Buffer.from(
|
||||||
// We can't use jsx here, is not supported here by nitro.
|
// We can't use jsx here, is not supported here by nitro.
|
||||||
renderToString(createElement(SvgPreview, { src, showGrid: true }, children)),
|
renderToString(createElement(SvgPreview, { src, showGrid: true }, children))
|
||||||
).toString('utf8');
|
).toString('utf8');
|
||||||
|
|
||||||
defaultContentType(event, 'image/svg+xml');
|
defaultContentType(event, 'image/svg+xml');
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
import { eventHandler, setResponseHeader, defaultContentType } from 'h3';
|
|
||||||
import { renderToString, renderToStaticMarkup } from 'react-dom/server';
|
|
||||||
import { createElement } from 'react';
|
|
||||||
import Diff from '../../../lib/SvgPreview/Diff.tsx';
|
|
||||||
import iconNodes from '../../../data/iconNodes';
|
|
||||||
import createLucideIcon from 'lucide-react/src/createLucideIcon';
|
|
||||||
|
|
||||||
export default eventHandler((event) => {
|
|
||||||
const { params } = event.context;
|
|
||||||
|
|
||||||
const pathData = params.data.split('/');
|
|
||||||
const data = pathData.at(-1).slice(0, -4);
|
|
||||||
const [name] = pathData;
|
|
||||||
|
|
||||||
const newSrc = Buffer.from(data, 'base64')
|
|
||||||
.toString('utf8')
|
|
||||||
.replaceAll('\n', '')
|
|
||||||
.replace(/<svg[^>]*>|<\/svg>/g, '');
|
|
||||||
|
|
||||||
const children = [];
|
|
||||||
|
|
||||||
const oldSrc = iconNodes[name]
|
|
||||||
? renderToStaticMarkup(createElement(createLucideIcon(name, iconNodes[name])))
|
|
||||||
.replaceAll('\n', '')
|
|
||||||
.replace(/<svg[^>]*>|<\/svg>/g, '')
|
|
||||||
: '';
|
|
||||||
|
|
||||||
const svg = Buffer.from(
|
|
||||||
// We can't use jsx here, is not supported here by nitro.
|
|
||||||
renderToString(createElement(Diff, { oldSrc, newSrc, showGrid: true }, children)),
|
|
||||||
).toString('utf8');
|
|
||||||
|
|
||||||
defaultContentType(event, 'image/svg+xml');
|
|
||||||
setResponseHeader(event, 'Cache-Control', 'public,max-age=31536000');
|
|
||||||
|
|
||||||
return svg;
|
|
||||||
});
|
|
||||||
@@ -28,7 +28,7 @@ export default eventHandler(async (event) => {
|
|||||||
stroke-width="2"
|
stroke-width="2"
|
||||||
stroke-linecap="round"
|
stroke-linecap="round"
|
||||||
stroke-linejoin="round"
|
stroke-linejoin="round"
|
||||||
`,
|
`
|
||||||
);
|
);
|
||||||
|
|
||||||
const resvg = new Resvg(svg, { background: '#000' });
|
const resvg = new Resvg(svg, { background: '#000' });
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
import { eventHandler, setResponseHeader, defaultContentType } from 'h3';
|
import { eventHandler, setResponseHeader, defaultContentType } from 'h3'
|
||||||
import { renderToString } from 'react-dom/server';
|
import { renderToString } from 'react-dom/server'
|
||||||
import { createElement } from 'react';
|
import { createElement } from 'react'
|
||||||
import SvgPreview from '../../../lib/SvgPreview/index.tsx';
|
import SvgPreview from '../../../lib/SvgPreview/index.tsx';
|
||||||
import createLucideIcon, { IconNode } from 'lucide-react/src/createLucideIcon';
|
import createLucideIcon, { IconNode } from 'lucide-react/src/createLucideIcon'
|
||||||
import { parseSync } from 'svgson';
|
import { parseSync } from 'svgson';
|
||||||
|
|
||||||
export default eventHandler((event) => {
|
export default eventHandler((event) => {
|
||||||
const { params } = event.context;
|
const { params } = event.context
|
||||||
|
|
||||||
const [strokeWidth, svgData] = params.data.split('/');
|
const [strokeWidth, svgData] = params.data.split('/');
|
||||||
const data = svgData.slice(0, -4);
|
const data = svgData.slice(0, -4);
|
||||||
@@ -16,8 +16,8 @@ export default eventHandler((event) => {
|
|||||||
const Icon = createLucideIcon(
|
const Icon = createLucideIcon(
|
||||||
'icon',
|
'icon',
|
||||||
parseSync(src.includes('<svg') ? src : `<svg>${src}</svg>`).children.map(
|
parseSync(src.includes('<svg') ? src : `<svg>${src}</svg>`).children.map(
|
||||||
({ name, attributes }) => [name, attributes],
|
({ name, attributes }) => [name, attributes]
|
||||||
) as IconNode,
|
) as IconNode
|
||||||
);
|
);
|
||||||
|
|
||||||
const svg = Buffer.from(
|
const svg = Buffer.from(
|
||||||
@@ -33,12 +33,12 @@ export default eventHandler((event) => {
|
|||||||
@media screen and (prefers-color-scheme: dark) {
|
@media screen and (prefers-color-scheme: dark) {
|
||||||
svg { stroke: #fff; fill: transparent !important; }
|
svg { stroke: #fff; fill: transparent !important; }
|
||||||
}
|
}
|
||||||
</style>`,
|
</style>`
|
||||||
),
|
)
|
||||||
).toString('utf8');
|
).toString('utf8');
|
||||||
|
|
||||||
defaultContentType(event, 'image/svg+xml');
|
defaultContentType(event, 'image/svg+xml')
|
||||||
setResponseHeader(event, 'Cache-Control', 'public,max-age=31536000');
|
setResponseHeader(event, 'Cache-Control', 'public,max-age=31536000')
|
||||||
|
|
||||||
return svg;
|
return svg
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,30 +1,30 @@
|
|||||||
import { eventHandler, getQuery, setResponseHeader } from 'h3';
|
import { eventHandler, getQuery, setResponseHeader } from 'h3'
|
||||||
import iconNodes from '../../data/iconNodes';
|
import iconNodes from '../../data/iconNodes'
|
||||||
import { IconNodeWithKeys } from '../../theme/types';
|
import { IconNodeWithKeys } from '../../theme/types'
|
||||||
|
|
||||||
export default eventHandler((event) => {
|
export default eventHandler((event) => {
|
||||||
const query = getQuery(event);
|
const query = getQuery(event)
|
||||||
|
|
||||||
const withUniqueKeys = query.withUniqueKeys === 'true';
|
const withUniqueKeys = query.withUniqueKeys === 'true'
|
||||||
|
|
||||||
setResponseHeader(event, 'Cache-Control', 'public, max-age=86400');
|
setResponseHeader(event, 'Cache-Control', 'public, max-age=86400')
|
||||||
setResponseHeader(event, 'Access-Control-Allow-Origin', '*');
|
setResponseHeader(event, 'Access-Control-Allow-Origin', '*')
|
||||||
|
|
||||||
if (withUniqueKeys) {
|
if (withUniqueKeys) {
|
||||||
return iconNodes;
|
return iconNodes
|
||||||
}
|
}
|
||||||
|
|
||||||
return Object.entries(iconNodes).reduce((acc, [name, iconNode]) => {
|
return Object.entries(iconNodes).reduce((acc, [name, iconNode]) => {
|
||||||
if (withUniqueKeys) {
|
if (withUniqueKeys) {
|
||||||
return [name, iconNode];
|
return [name, iconNode]
|
||||||
}
|
}
|
||||||
|
|
||||||
const newIconNode = (iconNode as IconNodeWithKeys).map(([name, { key, ...attrs }]) => {
|
const newIconNode = (iconNode as IconNodeWithKeys).map(([name, { key, ...attrs}]) => {
|
||||||
return [name, attrs];
|
return [name, attrs]
|
||||||
});
|
})
|
||||||
|
|
||||||
acc[name] = newIconNode;
|
acc[name] = newIconNode
|
||||||
|
|
||||||
return acc;
|
return acc
|
||||||
}, {});
|
}, {})
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,29 +1,29 @@
|
|||||||
import { eventHandler, getQuery, setResponseHeader, createError } from 'h3';
|
import { eventHandler, getQuery, setResponseHeader, createError } from 'h3'
|
||||||
import iconNodes from '../../data/iconNodes';
|
import iconNodes from '../../data/iconNodes'
|
||||||
import createLucideIcon from 'lucide-react/src/createLucideIcon';
|
import createLucideIcon from 'lucide-react/src/createLucideIcon'
|
||||||
import { renderToString } from 'react-dom/server';
|
import { renderToString } from 'react-dom/server'
|
||||||
import { createElement } from 'react';
|
import { createElement } from 'react'
|
||||||
|
|
||||||
export default eventHandler((event) => {
|
export default eventHandler((event) => {
|
||||||
const { params } = event.context;
|
const { params } = event.context
|
||||||
|
|
||||||
const iconNode = iconNodes[params.iconName];
|
const iconNode = iconNodes[params.iconName]
|
||||||
|
|
||||||
if (iconNode == null) {
|
if (iconNode == null) {
|
||||||
const error = createError({
|
const error = createError({
|
||||||
statusCode: 404,
|
statusCode: 404,
|
||||||
message: `Icon "${params.iconName}" not found`,
|
message: `Icon "${params.iconName}" not found`,
|
||||||
});
|
})
|
||||||
|
|
||||||
return sendError(event, error);
|
return sendError(event, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
const width = getQuery(event).width || undefined;
|
const width = getQuery(event).width || undefined
|
||||||
const height = getQuery(event).height || undefined;
|
const height = getQuery(event).height || undefined
|
||||||
const color = getQuery(event).color || undefined;
|
const color = getQuery(event).color || undefined
|
||||||
const strokeWidth = getQuery(event).strokeWidth || undefined;
|
const strokeWidth = getQuery(event).strokeWidth || undefined
|
||||||
|
|
||||||
const LucideIcon = createLucideIcon(params.iconName, iconNode);
|
const LucideIcon = createLucideIcon(params.iconName, iconNode)
|
||||||
|
|
||||||
const svg = Buffer.from(
|
const svg = Buffer.from(
|
||||||
renderToString(
|
renderToString(
|
||||||
@@ -32,13 +32,14 @@ export default eventHandler((event) => {
|
|||||||
height,
|
height,
|
||||||
color: color ? `#${color}` : undefined,
|
color: color ? `#${color}` : undefined,
|
||||||
strokeWidth,
|
strokeWidth,
|
||||||
}),
|
}
|
||||||
),
|
))
|
||||||
).toString('utf8');
|
).toString('utf8');
|
||||||
|
|
||||||
defaultContentType(event, 'image/svg+xml');
|
defaultContentType(event, 'image/svg+xml')
|
||||||
setResponseHeader(event, 'Cache-Control', 'public,max-age=31536000');
|
setResponseHeader(event, 'Cache-Control', 'public,max-age=31536000')
|
||||||
setResponseHeader(event, 'Access-Control-Allow-Origin', '*');
|
setResponseHeader(event, 'Access-Control-Allow-Origin', '*')
|
||||||
|
|
||||||
return svg;
|
return svg
|
||||||
});
|
|
||||||
|
})
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
import iconMetaData from '../../data/iconMetaData';
|
import { eventHandler, setResponseHeader } from 'h3'
|
||||||
|
import iconMetaData from '../../data/iconMetaData'
|
||||||
|
|
||||||
export default eventHandler((event) => {
|
export default eventHandler((event) => {
|
||||||
setResponseHeader(event, 'Cache-Control', 'public, max-age=86400');
|
setResponseHeader(event, 'Cache-Control', 'public, max-age=86400')
|
||||||
setResponseHeader(event, 'Access-Control-Allow-Origin', '*');
|
setResponseHeader(event, 'Access-Control-Allow-Origin', '*')
|
||||||
|
|
||||||
return Object.fromEntries(Object.entries(iconMetaData).map(([name, { tags }]) => [name, tags]));
|
return Object.fromEntries(
|
||||||
});
|
Object.entries(iconMetaData).map(([name, { tags }]) => [ name, tags ])
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
export default eventHandler(() => {
|
export default eventHandler(() => {
|
||||||
return { nitro: 'Is Awesome! asda' };
|
return { nitro: 'Is Awesome! asda' }
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import { fileURLToPath, URL } from 'node:url';
|
import { fileURLToPath, URL } from 'node:url'
|
||||||
import { defineConfig } from 'vitepress';
|
import { defineConfig } from 'vitepress'
|
||||||
import sidebar from './sidebar';
|
import sidebar from './sidebar';
|
||||||
|
|
||||||
const title = 'Lucide';
|
const title = "Lucide";
|
||||||
const socialTitle = 'Lucide Icons';
|
const socialTitle = "Lucide Icons";
|
||||||
const description = 'Beautiful & consistent icon toolkit made by the community.';
|
const description = "Beautiful & consistent icon toolkit made by the community."
|
||||||
|
|
||||||
// https://vitepress.dev/reference/site-config
|
// https://vitepress.dev/reference/site-config
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
@@ -19,135 +19,86 @@ export default defineConfig({
|
|||||||
{
|
{
|
||||||
find: /^.*\/VPIconAlignLeft\.vue$/,
|
find: /^.*\/VPIconAlignLeft\.vue$/,
|
||||||
replacement: fileURLToPath(
|
replacement: fileURLToPath(
|
||||||
new URL('./theme/components/overrides/VPIconAlignLeft.vue', import.meta.url),
|
new URL('./theme/components/overrides/VPIconAlignLeft.vue', import.meta.url)
|
||||||
),
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
find: /^.*\/VPFooter\.vue$/,
|
find: /^.*\/VPFooter\.vue$/,
|
||||||
replacement: fileURLToPath(
|
replacement: fileURLToPath(
|
||||||
new URL('./theme/components/overrides/VPFooter.vue', import.meta.url),
|
new URL('./theme/components/overrides/VPFooter.vue', import.meta.url)
|
||||||
),
|
)
|
||||||
},
|
}
|
||||||
{
|
]
|
||||||
find: '~/.vitepress',
|
|
||||||
replacement: fileURLToPath(new URL('./', import.meta.url)),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
head: [
|
head: [
|
||||||
[
|
[ 'script', {
|
||||||
'script',
|
src: 'https://analytics.lucide.dev/js/script.js',
|
||||||
{
|
'data-domain': 'lucide.dev',
|
||||||
src: 'https://analytics.lucide.dev/js/script.js',
|
defer: ''
|
||||||
'data-domain': 'lucide.dev',
|
}],
|
||||||
defer: '',
|
[ 'meta', {
|
||||||
},
|
property:"og:locale",
|
||||||
],
|
content:"en_US"
|
||||||
[
|
}],
|
||||||
'meta',
|
[ 'meta', {
|
||||||
{
|
property:"og:type",
|
||||||
property: 'og:locale',
|
content:"website"
|
||||||
content: 'en_US',
|
}],
|
||||||
},
|
[ 'meta', {
|
||||||
],
|
property:"og:site_name",
|
||||||
[
|
content: title,
|
||||||
'meta',
|
}],
|
||||||
{
|
[ 'meta', {
|
||||||
property: 'og:type',
|
property:"og:title",
|
||||||
content: 'website',
|
content: socialTitle,
|
||||||
},
|
}],
|
||||||
],
|
[ 'meta', {
|
||||||
[
|
property:"og:description",
|
||||||
'meta',
|
content: description
|
||||||
{
|
}],
|
||||||
property: 'og:site_name',
|
[ 'meta', {
|
||||||
content: title,
|
property:"og:url",
|
||||||
},
|
content:"https://lucide.dev"
|
||||||
],
|
}],
|
||||||
[
|
[ 'meta', {
|
||||||
'meta',
|
property:"og:image",
|
||||||
{
|
content: "https://lucide.dev/og.png"
|
||||||
property: 'og:title',
|
}],
|
||||||
content: socialTitle,
|
[ 'meta', {
|
||||||
},
|
property:"og:image:width",
|
||||||
],
|
content:"1200"
|
||||||
[
|
}],
|
||||||
'meta',
|
[ 'meta', {
|
||||||
{
|
property:"og:image:height",
|
||||||
property: 'og:description',
|
content:"630"
|
||||||
content: description,
|
}],
|
||||||
},
|
[ 'meta', {
|
||||||
],
|
property:"og:image:type",
|
||||||
[
|
content:"image/png"
|
||||||
'meta',
|
}],
|
||||||
{
|
[ 'meta', {
|
||||||
property: 'og:url',
|
property:"twitter:card",
|
||||||
content: 'https://lucide.dev',
|
content:"summary_large_image"
|
||||||
},
|
}],
|
||||||
],
|
[ 'meta', {
|
||||||
[
|
property:"twitter:title",
|
||||||
'meta',
|
content: socialTitle,
|
||||||
{
|
}],
|
||||||
property: 'og:image',
|
[ 'meta', {
|
||||||
content: 'https://lucide.dev/og.png',
|
property:"twitter:description",
|
||||||
},
|
content: description
|
||||||
],
|
}],
|
||||||
[
|
[ 'meta', {
|
||||||
'meta',
|
property:"twitter:image",
|
||||||
{
|
content:"https://lucide.dev/og.png"
|
||||||
property: 'og:image:width',
|
}],
|
||||||
content: '1200',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'meta',
|
|
||||||
{
|
|
||||||
property: 'og:image:height',
|
|
||||||
content: '630',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'meta',
|
|
||||||
{
|
|
||||||
property: 'og:image:type',
|
|
||||||
content: 'image/png',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'meta',
|
|
||||||
{
|
|
||||||
property: 'twitter:card',
|
|
||||||
content: 'summary_large_image',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'meta',
|
|
||||||
{
|
|
||||||
property: 'twitter:title',
|
|
||||||
content: socialTitle,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'meta',
|
|
||||||
{
|
|
||||||
property: 'twitter:description',
|
|
||||||
content: description,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'meta',
|
|
||||||
{
|
|
||||||
property: 'twitter:image',
|
|
||||||
content: 'https://lucide.dev/og.png',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
],
|
],
|
||||||
themeConfig: {
|
themeConfig: {
|
||||||
// https://vitepress.dev/reference/default-theme-config
|
// https://vitepress.dev/reference/default-theme-config
|
||||||
logo: {
|
logo: {
|
||||||
light: '/logo.light.svg',
|
light: '/logo.light.svg',
|
||||||
dark: '/logo.dark.svg',
|
dark: '/logo.dark.svg'
|
||||||
},
|
},
|
||||||
nav: [
|
nav: [
|
||||||
{ text: 'Icons', link: '/icons/' },
|
{ text: 'Icons', link: '/icons/' },
|
||||||
@@ -159,21 +110,21 @@ export default defineConfig({
|
|||||||
sidebar,
|
sidebar,
|
||||||
socialLinks: [
|
socialLinks: [
|
||||||
{ icon: 'github', link: 'https://github.com/lucide-icons/lucide' },
|
{ icon: 'github', link: 'https://github.com/lucide-icons/lucide' },
|
||||||
{ icon: 'discord', link: 'https://discord.gg/EH6nSts' },
|
{ icon: 'discord', link: 'https://discord.gg/EH6nSts' }
|
||||||
],
|
],
|
||||||
footer: {
|
footer: {
|
||||||
message: 'Released under the ISC License.',
|
message: 'Released under the ISC License.',
|
||||||
copyright: `Copyright © ${new Date().getFullYear()} Lucide Contributors`,
|
copyright: `Copyright © ${new Date().getFullYear()} Lucide Contributors`
|
||||||
},
|
},
|
||||||
editLink: {
|
editLink: {
|
||||||
pattern: 'https://github.com/lucide-icons/lucide/edit/main/docs/:path',
|
pattern: 'https://github.com/lucide-icons/lucide/edit/main/docs/:path'
|
||||||
},
|
},
|
||||||
carbonAds: {
|
carbonAds: {
|
||||||
code: 'CWYIC53U',
|
code: 'CWYIC53U',
|
||||||
placement: 'lucidedev',
|
placement: 'lucidedev'
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
sitemap: {
|
sitemap: {
|
||||||
hostname: 'https://lucide.dev/',
|
hostname: 'https://lucide.dev/'
|
||||||
},
|
}
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,174 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"name": "accessibility",
|
|
||||||
"title": "Accessibility"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "account",
|
|
||||||
"title": "Accounts & access"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "animals",
|
|
||||||
"title": "Animals"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "arrows",
|
|
||||||
"title": "Arrows"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "brands",
|
|
||||||
"title": "Brands"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "buildings",
|
|
||||||
"title": "Buildings"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "charts",
|
|
||||||
"title": "Charts"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "communication",
|
|
||||||
"title": "Communication"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "connectivity",
|
|
||||||
"title": "Connectivity"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "cursors",
|
|
||||||
"title": "Cursors"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "design",
|
|
||||||
"title": "Design"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "development",
|
|
||||||
"title": "Coding & development"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "devices",
|
|
||||||
"title": "Devices"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "emoji",
|
|
||||||
"title": "Emoji"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "files",
|
|
||||||
"title": "File icons"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "finance",
|
|
||||||
"title": "Finance"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "food-beverage",
|
|
||||||
"title": "Food & beverage"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "gaming",
|
|
||||||
"title": "Gaming"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "home",
|
|
||||||
"title": "Home"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "layout",
|
|
||||||
"title": "Layout"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "mail",
|
|
||||||
"title": "Mail"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "math",
|
|
||||||
"title": "Mathematics"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "medical",
|
|
||||||
"title": "Medical"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "multimedia",
|
|
||||||
"title": "Multimedia"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "nature",
|
|
||||||
"title": "Nature"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "navigation",
|
|
||||||
"title": "Navigation"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "notifications",
|
|
||||||
"title": "Notification"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "people",
|
|
||||||
"title": "People"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "photography",
|
|
||||||
"title": "Photography"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "science",
|
|
||||||
"title": "Science"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "seasons",
|
|
||||||
"title": "Seasons"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "security",
|
|
||||||
"title": "Security"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "shapes",
|
|
||||||
"title": "Shapes"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "shopping",
|
|
||||||
"title": "Shopping"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "social",
|
|
||||||
"title": "Social"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "sports",
|
|
||||||
"title": "Sports"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "sustainability",
|
|
||||||
"title": "Sustainability"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "text",
|
|
||||||
"title": "Text formatting"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "time",
|
|
||||||
"title": "Time & calendar"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "tools",
|
|
||||||
"title": "Tools"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "transportation",
|
|
||||||
"title": "Transportation"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "travel",
|
|
||||||
"title": "Travel"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "weather",
|
|
||||||
"title": "Weather"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@@ -14,13 +14,5 @@
|
|||||||
"light": "/library-logos/tamagui.svg",
|
"light": "/library-logos/tamagui.svg",
|
||||||
"dark": "/library-logos/tamagui.svg"
|
"dark": "/library-logos/tamagui.svg"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Reflex",
|
|
||||||
"url": "https://reflex.dev",
|
|
||||||
"image": {
|
|
||||||
"light": "/library-logos/reflex-light.svg",
|
|
||||||
"dark": "/library-logos/reflex-dark.svg"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -3,144 +3,87 @@
|
|||||||
"order": 0,
|
"order": 0,
|
||||||
"icon": "js",
|
"icon": "js",
|
||||||
"shields": [
|
"shields": [
|
||||||
{
|
{ "alt": "npm", "src": "https://img.shields.io/npm/v/lucide", "href": "https://www.npmjs.com/package/lucide" },
|
||||||
"alt": "npm",
|
{ "alt": "npm", "src": "https://img.shields.io/npm/dw/lucide", "href": "https://www.npmjs.com/package/lucide" }
|
||||||
"src": "https://img.shields.io/npm/v/lucide",
|
|
||||||
"href": "https://www.npmjs.com/package/lucide"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"alt": "npm",
|
|
||||||
"src": "https://img.shields.io/npm/dw/lucide",
|
|
||||||
"href": "https://www.npmjs.com/package/lucide"
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"lucide-react": {
|
"lucide-react": {
|
||||||
"order": 1,
|
"order": 1,
|
||||||
"icon": "react",
|
"icon": "react",
|
||||||
"shields": [
|
"shields": [
|
||||||
{
|
{ "alt": "npm", "src": "https://img.shields.io/npm/v/lucide-react", "href": "https://www.npmjs.com/package/lucide-react" },
|
||||||
"alt": "npm",
|
{ "alt": "npm", "src": "https://img.shields.io/npm/dw/lucide-react", "href": "https://www.npmjs.com/package/lucide-react" }
|
||||||
"src": "https://img.shields.io/npm/v/lucide-react",
|
]
|
||||||
"href": "https://www.npmjs.com/package/lucide-react"
|
},
|
||||||
},
|
"lucide-vue": {
|
||||||
{
|
"order": 2,
|
||||||
"alt": "npm",
|
"icon": "vue",
|
||||||
"src": "https://img.shields.io/npm/dw/lucide-react",
|
"shields": [
|
||||||
"href": "https://www.npmjs.com/package/lucide-react"
|
{ "alt": "npm", "src": "https://img.shields.io/npm/v/lucide-vue", "href": "https://www.npmjs.com/package/lucide-vue" },
|
||||||
}
|
{ "alt": "npm", "src": "https://img.shields.io/npm/dw/lucide-vue", "href": "https://www.npmjs.com/package/lucide-vue" }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"lucide-vue-next": {
|
"lucide-vue-next": {
|
||||||
"order": 2,
|
"order": 3,
|
||||||
"icon": "vue-next",
|
"icon": "vue-next",
|
||||||
"shields": [
|
"shields": [
|
||||||
{
|
{ "alt": "npm", "src": "https://img.shields.io/npm/v/lucide-vue-next", "href": "https://www.npmjs.com/package/lucide-vue-next" },
|
||||||
"alt": "npm",
|
{ "alt": "npm", "src": "https://img.shields.io/npm/dw/lucide-vue-next", "href": "https://www.npmjs.com/package/lucide-vue-next" }
|
||||||
"src": "https://img.shields.io/npm/v/lucide-vue-next",
|
|
||||||
"href": "https://www.npmjs.com/package/lucide-vue-next"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"alt": "npm",
|
|
||||||
"src": "https://img.shields.io/npm/dw/lucide-vue-next",
|
|
||||||
"href": "https://www.npmjs.com/package/lucide-vue-next"
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"lucide-svelte": {
|
"lucide-svelte": {
|
||||||
"order": 3,
|
"order": 4,
|
||||||
"icon": "svelte",
|
"icon": "svelte",
|
||||||
"shields": [
|
"shields": [
|
||||||
{
|
{ "alt": "npm", "src": "https://img.shields.io/npm/v/lucide-svelte", "href": "https://www.npmjs.com/package/lucide-svelte" },
|
||||||
"alt": "npm",
|
{ "alt": "npm", "src": "https://img.shields.io/npm/dw/lucide-svelte", "href": "https://www.npmjs.com/package/lucide-svelte" }
|
||||||
"src": "https://img.shields.io/npm/v/lucide-svelte",
|
|
||||||
"href": "https://www.npmjs.com/package/lucide-svelte"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"alt": "npm",
|
|
||||||
"src": "https://img.shields.io/npm/dw/lucide-svelte",
|
|
||||||
"href": "https://www.npmjs.com/package/lucide-svelte"
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"lucide-solid": {
|
"lucide-solid": {
|
||||||
"order": 4,
|
"order": 4,
|
||||||
"icon": "solid",
|
"icon": "solid",
|
||||||
"shields": [
|
"shields": [
|
||||||
{
|
{ "alt": "npm", "src": "https://img.shields.io/npm/v/lucide-solid", "href": "https://www.npmjs.com/package/lucide-solid" },
|
||||||
"alt": "npm",
|
{ "alt": "npm", "src": "https://img.shields.io/npm/dw/lucide-solid", "href": "https://www.npmjs.com/package/lucide-solid" }
|
||||||
"src": "https://img.shields.io/npm/v/lucide-solid",
|
|
||||||
"href": "https://www.npmjs.com/package/lucide-solid"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"alt": "npm",
|
|
||||||
"src": "https://img.shields.io/npm/dw/lucide-solid",
|
|
||||||
"href": "https://www.npmjs.com/package/lucide-solid"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"lucide-react-native": {
|
|
||||||
"order": 5,
|
|
||||||
"icon": "react-native",
|
|
||||||
"shields": [
|
|
||||||
{
|
|
||||||
"alt": "npm",
|
|
||||||
"src": "https://img.shields.io/npm/v/lucide-react-native",
|
|
||||||
"href": "https://www.npmjs.com/package/lucide-react-native"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"alt": "npm",
|
|
||||||
"src": "https://img.shields.io/npm/dw/lucide-react-native",
|
|
||||||
"href": "https://www.npmjs.com/package/lucide-react-native"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"lucide-angular": {
|
|
||||||
"order": 6,
|
|
||||||
"icon": "angular",
|
|
||||||
"shields": [
|
|
||||||
{
|
|
||||||
"alt": "npm",
|
|
||||||
"src": "https://img.shields.io/npm/v/lucide-angular",
|
|
||||||
"href": "https://www.npmjs.com/package/lucide-angular"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"alt": "npm",
|
|
||||||
"src": "https://img.shields.io/npm/dw/lucide-angular",
|
|
||||||
"href": "https://www.npmjs.com/package/lucide-angular"
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"lucide-preact": {
|
"lucide-preact": {
|
||||||
"order": 7,
|
"order": 5,
|
||||||
"icon": "preact",
|
"icon": "preact",
|
||||||
"shields": [
|
"shields": [
|
||||||
{
|
{ "alt": "npm", "src": "https://img.shields.io/npm/v/lucide-preact", "href": "https://www.npmjs.com/package/lucide-preact" },
|
||||||
"alt": "npm",
|
{ "alt": "npm", "src": "https://img.shields.io/npm/dw/lucide-preact", "href": "https://www.npmjs.com/package/lucide-preact" }
|
||||||
"src": "https://img.shields.io/npm/v/lucide-preact",
|
]
|
||||||
"href": "https://www.npmjs.com/package/lucide-preact"
|
},
|
||||||
},
|
"lucide-react-native": {
|
||||||
{
|
"order": 6,
|
||||||
"alt": "npm",
|
"icon": "react-native",
|
||||||
"src": "https://img.shields.io/npm/dw/lucide-preact",
|
"shields": [
|
||||||
"href": "https://www.npmjs.com/package/lucide-preact"
|
{ "alt": "npm", "src": "https://img.shields.io/npm/v/lucide-react-native", "href": "https://www.npmjs.com/package/lucide-react-native" },
|
||||||
}
|
{ "alt": "npm", "src": "https://img.shields.io/npm/dw/lucide-react-native", "href": "https://www.npmjs.com/package/lucide-react-native" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"lucide-angular": {
|
||||||
|
"order": 7,
|
||||||
|
"icon": "angular",
|
||||||
|
"shields": [
|
||||||
|
{ "alt": "npm", "src": "https://img.shields.io/npm/v/lucide-angular", "href": "https://www.npmjs.com/package/lucide-angular" },
|
||||||
|
{ "alt": "npm", "src": "https://img.shields.io/npm/dw/lucide-angular", "href": "https://www.npmjs.com/package/lucide-angular" }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"lucide-static": {
|
"lucide-static": {
|
||||||
"order": 8,
|
"order": 8,
|
||||||
"icon": "svg",
|
"icon": "svg",
|
||||||
"shields": [
|
"shields": [
|
||||||
{
|
{ "alt": "npm", "src": "https://img.shields.io/npm/v/lucide-static", "href": "https://www.npmjs.com/package/lucide-static" },
|
||||||
"alt": "npm",
|
{ "alt": "npm", "src": "https://img.shields.io/npm/dw/lucide-static", "href": "https://www.npmjs.com/package/lucide-static" }
|
||||||
"src": "https://img.shields.io/npm/v/lucide-static",
|
]
|
||||||
"href": "https://www.npmjs.com/package/lucide-static"
|
},
|
||||||
},
|
"lucide-flutter": {
|
||||||
{
|
"order": 9,
|
||||||
"alt": "npm",
|
"icon": "flutter",
|
||||||
"src": "https://img.shields.io/npm/dw/lucide-static",
|
"shields": [
|
||||||
"href": "https://www.npmjs.com/package/lucide-static"
|
{ "alt": "flutter", "src": "https://img.shields.io/pub/v/lucide_icons", "href": "https://img.shields.io/pub/v/lucide_icons" }
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,24 +76,5 @@
|
|||||||
],
|
],
|
||||||
"source": "https://github.com/swisnl/nuxt-lucide-icons",
|
"source": "https://github.com/swisnl/nuxt-lucide-icons",
|
||||||
"documentation": "https://github.com/swisnl/nuxt-lucide-icons/blob/main/README.md"
|
"documentation": "https://github.com/swisnl/nuxt-lucide-icons/blob/main/README.md"
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lucide-lustre",
|
|
||||||
"description": "A library providing https://lucide.dev icons to lustre",
|
|
||||||
"icon": "/framework-logos/lustre.webp",
|
|
||||||
"shields": [
|
|
||||||
{
|
|
||||||
"alt": "Latest Stable Version",
|
|
||||||
"src": "https://img.shields.io/hexpm/v/lucide_lustre",
|
|
||||||
"href": "https://hex.pm/packages/lucide_lustre"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"alt": "Total Downloads",
|
|
||||||
"src": "https://img.shields.io/hexpm/dw/lucide_lustre",
|
|
||||||
"href": "https://hex.pm/packages/lucide_lustre"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"source": "https://github.com/dinkelspiel/lucide_lustre",
|
|
||||||
"documentation": "https://github.com/dinkelspiel/lucide_lustre/blob/master/README.md"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,48 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"name": "Eric Fennis",
|
|
||||||
"title": "Creator of Lucide & Software engineer @nedap",
|
|
||||||
"image": "https://github.com/ericfennis.png?size=192",
|
|
||||||
"sponsor": "https://github.com/sponsors/ericfennis",
|
|
||||||
"socialLinks": [
|
|
||||||
{
|
|
||||||
"icon": "github",
|
|
||||||
"link": "https://github.com/ericfennis"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"icon": "x",
|
|
||||||
"link": "https://x.com/ericfennis"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Karsa Rigó",
|
|
||||||
"title": "Maintainer of Lucide & Software engineer @sztaki",
|
|
||||||
"image": "https://github.com/karsa-mistmere.png?size=192",
|
|
||||||
"socialLinks": [
|
|
||||||
{
|
|
||||||
"icon": "github",
|
|
||||||
"link": "https://github.com/karsa-mistmere"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"icon": "linkedin",
|
|
||||||
"link": "https://www.linkedin.com/in/karsamistmere"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Jakob Guddas",
|
|
||||||
"title": "Maintainer of Lucide & Software engineer @LEGO",
|
|
||||||
"image": "https://github.com/jguddas.png?size=192",
|
|
||||||
"socialLinks": [
|
|
||||||
{
|
|
||||||
"icon": "github",
|
|
||||||
"link": "https://github.com/jguddas"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"icon": "linkedin",
|
|
||||||
"link": "https://www.linkedin.com/in/jguddas"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@@ -3,92 +3,55 @@ import React from 'react';
|
|||||||
interface BackdropProps {
|
interface BackdropProps {
|
||||||
src: string;
|
src: string;
|
||||||
color?: string;
|
color?: string;
|
||||||
outline?: boolean;
|
|
||||||
backdropString: string;
|
backdropString: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Backdrop = ({
|
const Backdrop = ({ src, color = 'red', backdropString }: BackdropProps): JSX.Element => {
|
||||||
src,
|
|
||||||
color = 'red',
|
|
||||||
outline = true,
|
|
||||||
backdropString,
|
|
||||||
}: BackdropProps): JSX.Element => {
|
|
||||||
const id = React.useId();
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<defs xmlns="http://www.w3.org/2000/svg">
|
<defs xmlns="http://www.w3.org/2000/svg">
|
||||||
<pattern
|
<pattern
|
||||||
id={`pattern-${id}`}
|
id="pattern"
|
||||||
width=".1"
|
width=".1"
|
||||||
height=".1"
|
height=".1"
|
||||||
patternUnits="userSpaceOnUse"
|
patternUnits="userSpaceOnUse"
|
||||||
patternTransform="rotate(45 50 50)"
|
patternTransform="rotate(45 50 50)"
|
||||||
>
|
>
|
||||||
<line
|
<line stroke={color} strokeWidth={0.1} y2={1} />
|
||||||
stroke={color}
|
<line stroke={color} strokeWidth={0.1} y2={1} />
|
||||||
strokeWidth={0.1}
|
|
||||||
y2={1}
|
|
||||||
/>
|
|
||||||
<line
|
|
||||||
stroke={color}
|
|
||||||
strokeWidth={0.1}
|
|
||||||
y2={1}
|
|
||||||
/>
|
|
||||||
</pattern>
|
</pattern>
|
||||||
</defs>
|
</defs>
|
||||||
<mask
|
<mask id="svg-preview-backdrop-mask-outline" maskUnits="userSpaceOnUse">
|
||||||
id={`svg-preview-backdrop-mask-${id}`}
|
<g stroke="#fff" dangerouslySetInnerHTML={{ __html: backdropString }} />
|
||||||
maskUnits="userSpaceOnUse"
|
<g dangerouslySetInnerHTML={{ __html: src }} strokeWidth={2.05} />
|
||||||
>
|
|
||||||
<g
|
|
||||||
stroke="#fff"
|
|
||||||
dangerouslySetInnerHTML={{ __html: backdropString }}
|
|
||||||
/>
|
|
||||||
<g dangerouslySetInnerHTML={{ __html: src }} />
|
|
||||||
</mask>
|
</mask>
|
||||||
<mask
|
<mask id="svg-preview-backdrop-mask-fill" maskUnits="userSpaceOnUse">
|
||||||
id={`svg-preview-backdrop-mask-outline-${id}`}
|
<g stroke="#fff" dangerouslySetInnerHTML={{ __html: backdropString }} />
|
||||||
maskUnits="userSpaceOnUse"
|
<g dangerouslySetInnerHTML={{ __html: src }} strokeWidth={2.05} />
|
||||||
>
|
<g strokeWidth={1.75} dangerouslySetInnerHTML={{ __html: backdropString }} />
|
||||||
<rect
|
|
||||||
x="0"
|
|
||||||
y="0"
|
|
||||||
width="24"
|
|
||||||
height="24"
|
|
||||||
fill="#fff"
|
|
||||||
stroke="none"
|
|
||||||
/>
|
|
||||||
<g
|
|
||||||
strokeWidth={1.75}
|
|
||||||
dangerouslySetInnerHTML={{ __html: backdropString }}
|
|
||||||
/>
|
|
||||||
</mask>
|
</mask>
|
||||||
<g mask={`url(#svg-preview-backdrop-mask-${id})`}>
|
<g strokeWidth={2.25} stroke="url(#pattern)" mask={'url(#svg-preview-backdrop-mask-outline)'}>
|
||||||
<rect
|
<rect x="0" y="0" width="24" height="24" fill="url(#pattern)" opacity={0.5} stroke="none" />
|
||||||
x="0"
|
|
||||||
y="0"
|
|
||||||
width="24"
|
|
||||||
height="24"
|
|
||||||
opacity={0.5}
|
|
||||||
fill={`url(#pattern-${id})`}
|
|
||||||
stroke="none"
|
|
||||||
/>
|
|
||||||
<g
|
|
||||||
stroke={color}
|
|
||||||
strokeWidth={2.25}
|
|
||||||
opacity={0.75}
|
|
||||||
dangerouslySetInnerHTML={{ __html: src }}
|
|
||||||
/>
|
|
||||||
{outline && (
|
|
||||||
<g
|
|
||||||
stroke={color}
|
|
||||||
strokeWidth={2.25}
|
|
||||||
opacity={0.75}
|
|
||||||
mask={`url(#svg-preview-backdrop-mask-outline-${id})`}
|
|
||||||
dangerouslySetInnerHTML={{ __html: backdropString }}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</g>
|
</g>
|
||||||
|
<rect
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
fill="url(#pattern)"
|
||||||
|
stroke="none"
|
||||||
|
mask={'url(#svg-preview-backdrop-mask-fill)'}
|
||||||
|
/>
|
||||||
|
<rect
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
fill={color}
|
||||||
|
opacity={0.5}
|
||||||
|
stroke="none"
|
||||||
|
mask={'url(#svg-preview-backdrop-mask-fill)'}
|
||||||
|
/>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,71 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import Backdrop from './Backdrop.tsx';
|
|
||||||
import { darkModeCss, Grid } from './index.tsx';
|
|
||||||
|
|
||||||
const SvgPreview = React.forwardRef<
|
|
||||||
SVGSVGElement,
|
|
||||||
{
|
|
||||||
oldSrc: string;
|
|
||||||
newSrc: string;
|
|
||||||
} & React.SVGProps<SVGSVGElement>
|
|
||||||
>(({ oldSrc, newSrc, children, ...props }, ref) => {
|
|
||||||
return (
|
|
||||||
<svg
|
|
||||||
ref={ref}
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
width={24}
|
|
||||||
height={24}
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
fill="none"
|
|
||||||
stroke="currentColor"
|
|
||||||
strokeWidth={2}
|
|
||||||
strokeLinecap="round"
|
|
||||||
strokeLinejoin="round"
|
|
||||||
{...props}
|
|
||||||
>
|
|
||||||
<style>{darkModeCss}</style>
|
|
||||||
<Grid
|
|
||||||
strokeWidth={0.1}
|
|
||||||
stroke="#777"
|
|
||||||
strokeOpacity={0.3}
|
|
||||||
radius={1}
|
|
||||||
/>
|
|
||||||
<mask
|
|
||||||
id="gray"
|
|
||||||
maskUnits="userSpaceOnUse"
|
|
||||||
>
|
|
||||||
<rect
|
|
||||||
x="0"
|
|
||||||
y="0"
|
|
||||||
width="24"
|
|
||||||
height="24"
|
|
||||||
fill="#000"
|
|
||||||
stroke="none"
|
|
||||||
/>
|
|
||||||
<g
|
|
||||||
stroke="#fff"
|
|
||||||
dangerouslySetInnerHTML={{ __html: oldSrc }}
|
|
||||||
/>
|
|
||||||
</mask>
|
|
||||||
<Backdrop
|
|
||||||
src=""
|
|
||||||
outline={false}
|
|
||||||
backdropString={`<g mask="url('#gray')">${newSrc}</g>`}
|
|
||||||
color="#777"
|
|
||||||
/>
|
|
||||||
<Backdrop
|
|
||||||
src={oldSrc}
|
|
||||||
backdropString={newSrc}
|
|
||||||
color="lime"
|
|
||||||
/>
|
|
||||||
<Backdrop
|
|
||||||
src={newSrc}
|
|
||||||
backdropString={oldSrc}
|
|
||||||
color="red"
|
|
||||||
/>
|
|
||||||
{children}
|
|
||||||
</svg>
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
export default SvgPreview;
|
|
||||||
@@ -2,23 +2,7 @@ import React from 'react';
|
|||||||
import { PathProps, Path } from './types';
|
import { PathProps, Path } from './types';
|
||||||
import { getPaths, assert } from './utils';
|
import { getPaths, assert } from './utils';
|
||||||
|
|
||||||
export const darkModeCss = `
|
const Grid = ({
|
||||||
@media screen and (prefers-color-scheme: light) {
|
|
||||||
.svg-preview-grid-rect { fill: none }
|
|
||||||
}
|
|
||||||
@media screen and (prefers-color-scheme: dark) {
|
|
||||||
.svg-preview-grid-rect { fill: none }
|
|
||||||
.svg
|
|
||||||
.svg-preview-grid-group,
|
|
||||||
.svg-preview-radii-group,
|
|
||||||
.svg-preview-shadow-mask-group,
|
|
||||||
.svg-preview-shadow-group {
|
|
||||||
stroke: #fff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
export const Grid = ({
|
|
||||||
radius,
|
radius,
|
||||||
fill = '#fff',
|
fill = '#fff',
|
||||||
...props
|
...props
|
||||||
@@ -26,11 +10,7 @@ export const Grid = ({
|
|||||||
strokeWidth: number;
|
strokeWidth: number;
|
||||||
radius: number;
|
radius: number;
|
||||||
} & PathProps<'stroke', 'strokeWidth'>) => (
|
} & PathProps<'stroke', 'strokeWidth'>) => (
|
||||||
<g
|
<g className="svg-preview-grid-group" strokeLinecap="butt" {...props}>
|
||||||
className="svg-preview-grid-group"
|
|
||||||
strokeLinecap="butt"
|
|
||||||
{...props}
|
|
||||||
>
|
|
||||||
<rect
|
<rect
|
||||||
className="svg-preview-grid-rect"
|
className="svg-preview-grid-rect"
|
||||||
width={24 - props.strokeWidth}
|
width={24 - props.strokeWidth}
|
||||||
@@ -41,29 +21,11 @@ export const Grid = ({
|
|||||||
fill={fill}
|
fill={fill}
|
||||||
/>
|
/>
|
||||||
<path
|
<path
|
||||||
strokeDasharray={'0 0.1 ' + '0.1 0.15 '.repeat(11) + '0 0.15'}
|
|
||||||
strokeWidth={0.1}
|
|
||||||
d={
|
d={
|
||||||
props.d ||
|
props.d ||
|
||||||
new Array(Math.floor(24 - 1))
|
new Array(Math.floor(24 - 1))
|
||||||
.fill(null)
|
.fill(null)
|
||||||
.map((_, i) => i)
|
.flatMap((_, i) => [
|
||||||
.filter((i) => i % 3 !== 2)
|
|
||||||
.flatMap((i) => [
|
|
||||||
`M${props.strokeWidth} ${i + 1}h${24 - props.strokeWidth * 2}`,
|
|
||||||
`M${i + 1} ${props.strokeWidth}v${24 - props.strokeWidth * 2}`,
|
|
||||||
])
|
|
||||||
.join('')
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
<path
|
|
||||||
d={
|
|
||||||
props.d ||
|
|
||||||
new Array(Math.floor(24 - 1))
|
|
||||||
.fill(null)
|
|
||||||
.map((_, i) => i)
|
|
||||||
.filter((i) => i % 3 === 2)
|
|
||||||
.flatMap((i) => [
|
|
||||||
`M${props.strokeWidth} ${i + 1}h${24 - props.strokeWidth * 2}`,
|
`M${props.strokeWidth} ${i + 1}h${24 - props.strokeWidth * 2}`,
|
||||||
`M${i + 1} ${props.strokeWidth}v${24 - props.strokeWidth * 2}`,
|
`M${i + 1} ${props.strokeWidth}v${24 - props.strokeWidth * 2}`,
|
||||||
])
|
])
|
||||||
@@ -82,21 +44,15 @@ const Shadow = ({
|
|||||||
paths: Path[];
|
paths: Path[];
|
||||||
} & PathProps<'stroke' | 'strokeWidth' | 'strokeOpacity', 'd'>) => {
|
} & PathProps<'stroke' | 'strokeWidth' | 'strokeOpacity', 'd'>) => {
|
||||||
const groupedPaths = Object.entries(
|
const groupedPaths = Object.entries(
|
||||||
paths.reduce(
|
paths.reduce((groups, val) => {
|
||||||
(groups, val) => {
|
const key = val.c.id;
|
||||||
const key = val.c.id;
|
groups[key] = [...(groups[key] || []), val];
|
||||||
groups[key] = [...(groups[key] || []), val];
|
return groups;
|
||||||
return groups;
|
}, {} as Record<number, Path[]>)
|
||||||
},
|
|
||||||
{} as Record<number, Path[]>,
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<g
|
<g className="svg-preview-shadow-mask-group" {...props}>
|
||||||
className="svg-preview-shadow-mask-group"
|
|
||||||
{...props}
|
|
||||||
>
|
|
||||||
{groupedPaths.map(([id, paths]) => (
|
{groupedPaths.map(([id, paths]) => (
|
||||||
<mask
|
<mask
|
||||||
id={`svg-preview-shadow-mask-${id}`}
|
id={`svg-preview-shadow-mask-${id}`}
|
||||||
@@ -105,15 +61,7 @@ const Shadow = ({
|
|||||||
strokeWidth={props.strokeWidth}
|
strokeWidth={props.strokeWidth}
|
||||||
stroke="#000"
|
stroke="#000"
|
||||||
>
|
>
|
||||||
<rect
|
<rect x={0} y={0} width={24} height={24} fill="#fff" stroke="none" rx={radius} />
|
||||||
x={0}
|
|
||||||
y={0}
|
|
||||||
width={24}
|
|
||||||
height={24}
|
|
||||||
fill="#fff"
|
|
||||||
stroke="none"
|
|
||||||
rx={radius}
|
|
||||||
/>
|
|
||||||
<path
|
<path
|
||||||
d={paths
|
d={paths
|
||||||
.flatMap(({ prev, next }) => [
|
.flatMap(({ prev, next }) => [
|
||||||
@@ -126,16 +74,9 @@ const Shadow = ({
|
|||||||
</mask>
|
</mask>
|
||||||
))}
|
))}
|
||||||
</g>
|
</g>
|
||||||
<g
|
<g className="svg-preview-shadow-group" {...props}>
|
||||||
className="svg-preview-shadow-group"
|
|
||||||
{...props}
|
|
||||||
>
|
|
||||||
{paths.map(({ d, c: { id } }, i) => (
|
{paths.map(({ d, c: { id } }, i) => (
|
||||||
<path
|
<path key={i} mask={`url(#svg-preview-shadow-mask-${id})`} d={d} />
|
||||||
key={i}
|
|
||||||
mask={`url(#svg-preview-shadow-mask-${id})`}
|
|
||||||
d={d}
|
|
||||||
/>
|
|
||||||
))}
|
))}
|
||||||
<path
|
<path
|
||||||
d={paths
|
d={paths
|
||||||
@@ -153,16 +94,9 @@ const ColoredPath = ({
|
|||||||
paths,
|
paths,
|
||||||
...props
|
...props
|
||||||
}: { paths: Path[]; colors: string[] } & PathProps<never, 'd' | 'stroke'>) => (
|
}: { paths: Path[]; colors: string[] } & PathProps<never, 'd' | 'stroke'>) => (
|
||||||
<g
|
<g className="svg-preview-colored-path-group" {...props}>
|
||||||
className="svg-preview-colored-path-group"
|
|
||||||
{...props}
|
|
||||||
>
|
|
||||||
{paths.map(({ d, c }, i) => (
|
{paths.map(({ d, c }, i) => (
|
||||||
<path
|
<path key={i} d={d} stroke={colors[(c.name === 'path' ? i : c.id) % colors.length]} />
|
||||||
key={i}
|
|
||||||
d={d}
|
|
||||||
stroke={colors[(c.name === 'path' ? i : c.id) % colors.length]}
|
|
||||||
/>
|
|
||||||
))}
|
))}
|
||||||
</g>
|
</g>
|
||||||
);
|
);
|
||||||
@@ -204,15 +138,7 @@ const ControlPath = ({
|
|||||||
key={i}
|
key={i}
|
||||||
maskUnits="userSpaceOnUse"
|
maskUnits="userSpaceOnUse"
|
||||||
>
|
>
|
||||||
<rect
|
<rect x="0" y="0" width="24" height="24" fill="#fff" stroke="none" rx={radius} />
|
||||||
x="0"
|
|
||||||
y="0"
|
|
||||||
width="24"
|
|
||||||
height="24"
|
|
||||||
fill="#fff"
|
|
||||||
stroke="none"
|
|
||||||
rx={radius}
|
|
||||||
/>
|
|
||||||
<path d={`M${prev.x} ${prev.y}h.01`} />
|
<path d={`M${prev.x} ${prev.y}h.01`} />
|
||||||
<path d={`M${next.x} ${next.y}h.01`} />
|
<path d={`M${next.x} ${next.y}h.01`} />
|
||||||
</mask>
|
</mask>
|
||||||
@@ -220,10 +146,7 @@ const ControlPath = ({
|
|||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
</g>
|
</g>
|
||||||
<g
|
<g className="svg-preview-control-path-group" {...props}>
|
||||||
className="svg-preview-control-path-group"
|
|
||||||
{...props}
|
|
||||||
>
|
|
||||||
{controlPaths.map(({ d, showMarker }, i) => (
|
{controlPaths.map(({ d, showMarker }, i) => (
|
||||||
<path
|
<path
|
||||||
key={i}
|
key={i}
|
||||||
@@ -232,33 +155,18 @@ const ControlPath = ({
|
|||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</g>
|
</g>
|
||||||
<g
|
<g className="svg-preview-control-path-marker-group" {...props}>
|
||||||
className="svg-preview-control-path-marker-group"
|
|
||||||
{...props}
|
|
||||||
>
|
|
||||||
<path
|
<path
|
||||||
d={controlPaths
|
d={controlPaths
|
||||||
.flatMap(({ prev, next, showMarker }) =>
|
.flatMap(({ prev, next, showMarker }) =>
|
||||||
showMarker ? [`M${prev.x} ${prev.y}h.01`, `M${next.x} ${next.y}h.01`] : [],
|
showMarker ? [`M${prev.x} ${prev.y}h.01`, `M${next.x} ${next.y}h.01`] : []
|
||||||
)
|
)
|
||||||
.join('')}
|
.join('')}
|
||||||
/>
|
/>
|
||||||
{controlPaths.map(({ d, prev, next, startMarker, endMarker }, i) => (
|
{controlPaths.map(({ d, prev, next, startMarker, endMarker }, i) => (
|
||||||
<React.Fragment key={i}>
|
<React.Fragment key={i}>
|
||||||
{startMarker && (
|
{startMarker && <circle cx={prev.x} cy={prev.y} r={pointSize / 2} />}
|
||||||
<circle
|
{endMarker && <circle cx={next.x} cy={next.y} r={pointSize / 2} />}
|
||||||
cx={prev.x}
|
|
||||||
cy={prev.y}
|
|
||||||
r={pointSize / 2}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
{endMarker && (
|
|
||||||
<circle
|
|
||||||
cx={next.x}
|
|
||||||
cy={next.y}
|
|
||||||
r={pointSize / 2}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</React.Fragment>
|
</React.Fragment>
|
||||||
))}
|
))}
|
||||||
</g>
|
</g>
|
||||||
@@ -274,16 +182,15 @@ const Radii = ({
|
|||||||
any
|
any
|
||||||
>) => {
|
>) => {
|
||||||
return (
|
return (
|
||||||
<g
|
<g className="svg-preview-radii-group" {...props}>
|
||||||
className="svg-preview-radii-group"
|
|
||||||
{...props}
|
|
||||||
>
|
|
||||||
{paths.map(
|
{paths.map(
|
||||||
({ c, prev, next, circle }, i) =>
|
({ c, prev, next, circle }, i) =>
|
||||||
circle && (
|
circle && (
|
||||||
<React.Fragment key={i}>
|
<React.Fragment key={i}>
|
||||||
{c.name !== 'circle' && (
|
{c.name !== "circle" && (
|
||||||
<path d={`M${prev.x} ${prev.y} ${circle.x} ${circle.y} ${next.x} ${next.y}`} />
|
<path
|
||||||
|
d={`M${prev.x} ${prev.y} ${circle.x} ${circle.y} ${next.x} ${next.y}`}
|
||||||
|
/>
|
||||||
)}
|
)}
|
||||||
<circle
|
<circle
|
||||||
cy={circle.y}
|
cy={circle.y}
|
||||||
@@ -293,7 +200,7 @@ const Radii = ({
|
|||||||
stroke={
|
stroke={
|
||||||
(Math.round(circle.x * 100) / 100) % 1 !== 0 ||
|
(Math.round(circle.x * 100) / 100) % 1 !== 0 ||
|
||||||
(Math.round(circle.y * 100) / 100) % 1 !== 0
|
(Math.round(circle.y * 100) / 100) % 1 !== 0
|
||||||
? 'red'
|
? "red"
|
||||||
: undefined
|
: undefined
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
@@ -301,7 +208,11 @@ const Radii = ({
|
|||||||
cy={circle.y}
|
cy={circle.y}
|
||||||
cx={circle.x}
|
cx={circle.x}
|
||||||
r={circle.r}
|
r={circle.r}
|
||||||
stroke={(Math.round(circle.r * 1000) / 1000) % 1 !== 0 ? 'red' : undefined}
|
stroke={
|
||||||
|
(Math.round(circle.r * 1000) / 1000) % 1 !== 0
|
||||||
|
? "red"
|
||||||
|
: undefined
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
</React.Fragment>
|
</React.Fragment>
|
||||||
),
|
),
|
||||||
@@ -317,29 +228,15 @@ const Handles = ({
|
|||||||
'strokeWidth' | 'stroke' | 'strokeDasharray' | 'strokeOpacity',
|
'strokeWidth' | 'stroke' | 'strokeDasharray' | 'strokeOpacity',
|
||||||
any
|
any
|
||||||
>) => {
|
>) => {
|
||||||
|
console.log(paths);
|
||||||
return (
|
return (
|
||||||
<g
|
<g className="svg-preview-handles-group" {...props}>
|
||||||
className="svg-preview-handles-group"
|
|
||||||
{...props}
|
|
||||||
>
|
|
||||||
{paths.map(({ c, prev, next, cp1, cp2 }) => (
|
{paths.map(({ c, prev, next, cp1, cp2 }) => (
|
||||||
<>
|
<>
|
||||||
{cp1 && <path d={`M${prev.x} ${prev.y} ${cp1.x} ${cp1.y}`} />}
|
{cp1 && <path d={`M${prev.x} ${prev.y} ${cp1.x} ${cp1.y}`} />}
|
||||||
{cp1 && (
|
{cp1 && <circle cy={cp1.y} cx={cp1.x} r={0.25} />}
|
||||||
<circle
|
|
||||||
cy={cp1.y}
|
|
||||||
cx={cp1.x}
|
|
||||||
r={0.25}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
{cp2 && <path d={`M${next.x} ${next.y} ${cp2.x} ${cp2.y}`} />}
|
{cp2 && <path d={`M${next.x} ${next.y} ${cp2.x} ${cp2.y}`} />}
|
||||||
{cp2 && (
|
{cp2 && <circle cy={cp2.y} cx={cp2.x} r={0.25} />}
|
||||||
<circle
|
|
||||||
cy={cp2.y}
|
|
||||||
cx={cp2.x}
|
|
||||||
r={0.25}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</>
|
</>
|
||||||
))}
|
))}
|
||||||
</g>
|
</g>
|
||||||
@@ -355,6 +252,19 @@ const SvgPreview = React.forwardRef<
|
|||||||
>(({ src, children, showGrid = false, ...props }, ref) => {
|
>(({ src, children, showGrid = false, ...props }, ref) => {
|
||||||
const paths = typeof src === 'string' ? getPaths(src) : src;
|
const paths = typeof src === 'string' ? getPaths(src) : src;
|
||||||
|
|
||||||
|
const darkModeCss = `@media screen and (prefers-color-scheme: light) {
|
||||||
|
.svg-preview-grid-rect { fill: none }
|
||||||
|
}
|
||||||
|
@media screen and (prefers-color-scheme: dark) {
|
||||||
|
.svg-preview-grid-rect { fill: none }
|
||||||
|
.svg
|
||||||
|
.svg-preview-grid-group,
|
||||||
|
.svg-preview-radii-group,
|
||||||
|
.svg-preview-shadow-mask-group,
|
||||||
|
.svg-preview-shadow-group {
|
||||||
|
stroke: #fff;
|
||||||
|
}
|
||||||
|
}`;
|
||||||
return (
|
return (
|
||||||
<svg
|
<svg
|
||||||
ref={ref}
|
ref={ref}
|
||||||
@@ -370,27 +280,9 @@ const SvgPreview = React.forwardRef<
|
|||||||
{...props}
|
{...props}
|
||||||
>
|
>
|
||||||
<style>{darkModeCss}</style>
|
<style>{darkModeCss}</style>
|
||||||
{showGrid && (
|
{showGrid && <Grid strokeWidth={0.1} stroke="#777" strokeOpacity={0.3} radius={1} />}
|
||||||
<Grid
|
<Shadow paths={paths} strokeWidth={4} stroke="#777" radius={1} strokeOpacity={0.15} />
|
||||||
strokeWidth={0.1}
|
<Handles paths={paths} strokeWidth={0.12} stroke="#777" strokeOpacity={0.6} />
|
||||||
stroke="#777"
|
|
||||||
strokeOpacity={0.3}
|
|
||||||
radius={1}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
<Shadow
|
|
||||||
paths={paths}
|
|
||||||
strokeWidth={4}
|
|
||||||
stroke="#777"
|
|
||||||
radius={1}
|
|
||||||
strokeOpacity={0.15}
|
|
||||||
/>
|
|
||||||
<Handles
|
|
||||||
paths={paths}
|
|
||||||
strokeWidth={0.12}
|
|
||||||
stroke="#777"
|
|
||||||
strokeOpacity={0.6}
|
|
||||||
/>
|
|
||||||
<ColoredPath
|
<ColoredPath
|
||||||
paths={paths}
|
paths={paths}
|
||||||
colors={[
|
colors={[
|
||||||
@@ -415,19 +307,8 @@ const SvgPreview = React.forwardRef<
|
|||||||
stroke="#777"
|
stroke="#777"
|
||||||
strokeOpacity={0.3}
|
strokeOpacity={0.3}
|
||||||
/>
|
/>
|
||||||
<ControlPath
|
<ControlPath radius={1} paths={paths} pointSize={1} stroke="#fff" strokeWidth={0.125} />
|
||||||
radius={1}
|
<Handles paths={paths} strokeWidth={0.12} stroke="#FFF" strokeOpacity={0.3} />
|
||||||
paths={paths}
|
|
||||||
pointSize={1}
|
|
||||||
stroke="#fff"
|
|
||||||
strokeWidth={0.125}
|
|
||||||
/>
|
|
||||||
<Handles
|
|
||||||
paths={paths}
|
|
||||||
strokeWidth={0.12}
|
|
||||||
stroke="#FFF"
|
|
||||||
strokeOpacity={0.3}
|
|
||||||
/>
|
|
||||||
{children}
|
{children}
|
||||||
</svg>
|
</svg>
|
||||||
);
|
);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user