mirror of
https://github.com/lucide-icons/lucide.git
synced 2025-12-17 14:17:40 +01:00
Compare commits
5 Commits
pr-commit-
...
lucide-vue
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d1d57d3c85 | ||
|
|
701c2fb6b2 | ||
|
|
294ec9c727 | ||
|
|
99c883e60a | ||
|
|
9e68779d22 |
@@ -1,16 +0,0 @@
|
|||||||
# Custom words
|
|
||||||
fullscreen
|
|
||||||
gamepad
|
|
||||||
gantt
|
|
||||||
kanban
|
|
||||||
pilcrow
|
|
||||||
squircle
|
|
||||||
strikethrough
|
|
||||||
touchpad
|
|
||||||
ungroup
|
|
||||||
pilcrow
|
|
||||||
|
|
||||||
# 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. -->
|
||||||
|
|||||||
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
|
||||||
|
|||||||
17
.github/workflows/lucide-angular.yml
vendored
17
.github/workflows/lucide-angular.yml
vendored
@@ -8,7 +8,7 @@ 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
|
||||||
@@ -26,20 +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
|
|
||||||
with:
|
|
||||||
version: 8
|
|
||||||
- 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
|
||||||
|
|||||||
2
.github/workflows/lucide-font.yml
vendored
2
.github/workflows/lucide-font.yml
vendored
@@ -29,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
|
||||||
|
|||||||
3
.github/workflows/lucide-preact.yml
vendored
3
.github/workflows/lucide-preact.yml
vendored
@@ -24,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
|
||||||
|
|||||||
3
.github/workflows/lucide-react-native.yml
vendored
3
.github/workflows/lucide-react-native.yml
vendored
@@ -24,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
|
||||||
|
|||||||
17
.github/workflows/lucide-react.yml
vendored
17
.github/workflows/lucide-react.yml
vendored
@@ -10,7 +10,7 @@ on:
|
|||||||
- 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
|
||||||
@@ -28,20 +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
|
|
||||||
with:
|
|
||||||
version: 8
|
|
||||||
- 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
|
||||||
|
|||||||
17
.github/workflows/lucide-solid.yml
vendored
17
.github/workflows/lucide-solid.yml
vendored
@@ -9,7 +9,7 @@ on:
|
|||||||
- 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
|
||||||
@@ -27,20 +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
|
|
||||||
with:
|
|
||||||
version: 8
|
|
||||||
- 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
|
||||||
|
|||||||
17
.github/workflows/lucide-svelte.yml
vendored
17
.github/workflows/lucide-svelte.yml
vendored
@@ -9,7 +9,7 @@ on:
|
|||||||
- 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
|
||||||
@@ -27,20 +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
|
|
||||||
with:
|
|
||||||
version: 8
|
|
||||||
- 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
|
||||||
|
|||||||
17
.github/workflows/lucide-vue-next.yml
vendored
17
.github/workflows/lucide-vue-next.yml
vendored
@@ -9,7 +9,7 @@ on:
|
|||||||
- 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
|
||||||
@@ -27,20 +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
|
|
||||||
with:
|
|
||||||
version: 8
|
|
||||||
- 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
|
||||||
|
|||||||
17
.github/workflows/lucide-vue.yml
vendored
17
.github/workflows/lucide-vue.yml
vendored
@@ -9,7 +9,7 @@ on:
|
|||||||
- 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
|
||||||
@@ -27,20 +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
|
|
||||||
with:
|
|
||||||
version: 8
|
|
||||||
- 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,7 +9,7 @@ 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
|
||||||
@@ -27,20 +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
|
|
||||||
with:
|
|
||||||
version: 8
|
|
||||||
- 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-title.yml
vendored
16
.github/workflows/pull-request-title.yml
vendored
@@ -1,16 +0,0 @@
|
|||||||
name: Validate PR title
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
types:
|
|
||||||
- opened
|
|
||||||
- edited
|
|
||||||
- synchronize
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
semantic-pull-request:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: amannn/action-semantic-pull-request@v5
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
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
|
||||||
|
|||||||
30
.github/workflows/release.yml
vendored
30
.github/workflows/release.yml
vendored
@@ -41,18 +41,17 @@ 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
|
||||||
@@ -137,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
|
||||||
@@ -146,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
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -34,7 +34,6 @@ 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
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
14
README.md
14
README.md
@@ -1,11 +1,4 @@
|
|||||||
<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.npmjs.com/package/lucide"><img src="https://img.shields.io/npm/v/lucide" alt="npm package"></a>
|
<a href="https://www.npmjs.com/package/lucide"><img src="https://img.shields.io/npm/v/lucide" alt="npm package"></a>
|
||||||
@@ -281,12 +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 backer 🍺
|
|
||||||
|
|
||||||
<a href="https://www.scipress.io?utm_source=lucide"><img src="docs/public/sponsors/scipress.svg" width="180" alt="Scipress 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"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Charts",
|
"title": "Charts",
|
||||||
"icon": "pie-chart"
|
"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"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Currency",
|
"title": "Currency",
|
||||||
"icon": "dollar-sign"
|
"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"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Furniture",
|
"title": "Furniture",
|
||||||
"icon": "rocking-chair"
|
"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"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Maps",
|
"title": "Maps",
|
||||||
"icon": "map"
|
"icon": "map"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Maths",
|
"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"
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
"$schema": "../category.schema.json",
|
"$schema": "../category.schema.json",
|
||||||
"title": "Money",
|
"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": "Notifications",
|
"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"
|
||||||
}
|
}
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
import type { UserConfig } from '@commitlint/types';
|
|
||||||
import fs from 'fs/promises'
|
|
||||||
import path from 'path'
|
|
||||||
|
|
||||||
// Read directory
|
|
||||||
const getAllPackageFromDirectory = async (directory: string) => {
|
|
||||||
return fs.readdir(path.resolve(process.cwd(), directory))
|
|
||||||
}
|
|
||||||
|
|
||||||
const Configuration: UserConfig = {
|
|
||||||
extends: ['@commitlint/config-conventional'],
|
|
||||||
rules: {
|
|
||||||
'scope-enum': async () => {
|
|
||||||
const packages = await getAllPackageFromDirectory('packages')
|
|
||||||
const toolPackages = await getAllPackageFromDirectory('tools')
|
|
||||||
|
|
||||||
return [2, 'always', [
|
|
||||||
'site',
|
|
||||||
'meta',
|
|
||||||
...packages,
|
|
||||||
...toolPackages,
|
|
||||||
]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
export default Configuration;
|
|
||||||
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 = [];
|
||||||
|
|
||||||
@@ -33,29 +30,20 @@ export default eventHandler((event) => {
|
|||||||
|
|
||||||
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: name in iconNodes ? 'red' : '#777',
|
color: name in iconNodes ? 'red' : '#777',
|
||||||
}),
|
})
|
||||||
);
|
);
|
||||||
if (name in iconNodes) {
|
|
||||||
children.push(
|
|
||||||
createElement(Backdrop, {
|
|
||||||
backdropString: src,
|
|
||||||
src: backdropString,
|
|
||||||
color: 'lime',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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');
|
||||||
|
|||||||
@@ -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,186 +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": "currency",
|
|
||||||
"title": "Currency"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"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": "food-beverage",
|
|
||||||
"title": "Food & beverage"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "furniture",
|
|
||||||
"title": "Furniture"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "gaming",
|
|
||||||
"title": "Gaming"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "home",
|
|
||||||
"title": "Home"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "layout",
|
|
||||||
"title": "Layout"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "mail",
|
|
||||||
"title": "Mail"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "maps",
|
|
||||||
"title": "Maps"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "maths",
|
|
||||||
"title": "Maths"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "medical",
|
|
||||||
"title": "Medical"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "money",
|
|
||||||
"title": "Money"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "multimedia",
|
|
||||||
"title": "Multimedia"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "nature",
|
|
||||||
"title": "Nature"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "navigation",
|
|
||||||
"title": "Navigation"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "notifications",
|
|
||||||
"title": "Notifications"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"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"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@@ -3,160 +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"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"alt": "npm",
|
|
||||||
"src": "https://img.shields.io/npm/dw/lucide-react",
|
|
||||||
"href": "https://www.npmjs.com/package/lucide-react"
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"lucide-vue": {
|
"lucide-vue": {
|
||||||
"order": 2,
|
"order": 2,
|
||||||
"icon": "vue",
|
"icon": "vue",
|
||||||
"shields": [
|
"shields": [
|
||||||
{
|
{ "alt": "npm", "src": "https://img.shields.io/npm/v/lucide-vue", "href": "https://www.npmjs.com/package/lucide-vue" },
|
||||||
"alt": "npm",
|
{ "alt": "npm", "src": "https://img.shields.io/npm/dw/lucide-vue", "href": "https://www.npmjs.com/package/lucide-vue" }
|
||||||
"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": 3,
|
"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": 4,
|
"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-preact": {
|
"lucide-preact": {
|
||||||
"order": 5,
|
"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"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"alt": "npm",
|
|
||||||
"src": "https://img.shields.io/npm/dw/lucide-preact",
|
|
||||||
"href": "https://www.npmjs.com/package/lucide-preact"
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"lucide-react-native": {
|
"lucide-react-native": {
|
||||||
"order": 6,
|
"order": 6,
|
||||||
"icon": "react-native",
|
"icon": "react-native",
|
||||||
"shields": [
|
"shields": [
|
||||||
{
|
{ "alt": "npm", "src": "https://img.shields.io/npm/v/lucide-react-native", "href": "https://www.npmjs.com/package/lucide-react-native" },
|
||||||
"alt": "npm",
|
{ "alt": "npm", "src": "https://img.shields.io/npm/dw/lucide-react-native", "href": "https://www.npmjs.com/package/lucide-react-native" }
|
||||||
"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": {
|
"lucide-angular": {
|
||||||
"order": 7,
|
"order": 7,
|
||||||
"icon": "angular",
|
"icon": "angular",
|
||||||
"shields": [
|
"shields": [
|
||||||
{
|
{ "alt": "npm", "src": "https://img.shields.io/npm/v/lucide-angular", "href": "https://www.npmjs.com/package/lucide-angular" },
|
||||||
"alt": "npm",
|
{ "alt": "npm", "src": "https://img.shields.io/npm/dw/lucide-angular", "href": "https://www.npmjs.com/package/lucide-angular" }
|
||||||
"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" }
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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://github.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"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@@ -7,80 +7,51 @@ interface BackdropProps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const Backdrop = ({ src, color = 'red', backdropString }: BackdropProps): JSX.Element => {
|
const Backdrop = ({ src, color = 'red', 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 }}
|
|
||||||
/>
|
|
||||||
<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)'}
|
||||||
|
/>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -10,11 +10,7 @@ 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}
|
||||||
@@ -25,29 +21,11 @@ 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}`,
|
||||||
])
|
])
|
||||||
@@ -66,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}`}
|
||||||
@@ -89,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 }) => [
|
||||||
@@ -110,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
|
||||||
@@ -137,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>
|
||||||
);
|
);
|
||||||
@@ -188,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>
|
||||||
@@ -204,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}
|
||||||
@@ -216,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>
|
||||||
@@ -258,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}
|
||||||
@@ -277,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
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
@@ -285,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>
|
||||||
),
|
),
|
||||||
@@ -301,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>
|
||||||
@@ -367,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={[
|
||||||
@@ -412,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>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ export type Path = {
|
|||||||
|
|
||||||
export type PathProps<
|
export type PathProps<
|
||||||
RequiredProps extends keyof SVGProps<SVGPathElement | SVGRectElement | SVGCircleElement>,
|
RequiredProps extends keyof SVGProps<SVGPathElement | SVGRectElement | SVGCircleElement>,
|
||||||
NeverProps extends keyof SVGProps<SVGPathElement | SVGRectElement | SVGCircleElement>,
|
NeverProps extends keyof SVGProps<SVGPathElement | SVGRectElement | SVGCircleElement>
|
||||||
> = Required<Pick<React.SVGProps<SVGElement & SVGRectElement & SVGCircleElement>, RequiredProps>> &
|
> = Required<Pick<React.SVGProps<SVGElement & SVGRectElement & SVGCircleElement>, RequiredProps>> &
|
||||||
Omit<
|
Omit<
|
||||||
React.SVGProps<SVGPathElement & SVGRectElement & SVGCircleElement>,
|
React.SVGProps<SVGPathElement & SVGRectElement & SVGCircleElement>,
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ export const getCommands = (src: string) =>
|
|||||||
getNodes(src)
|
getNodes(src)
|
||||||
.map(convertToPathNode)
|
.map(convertToPathNode)
|
||||||
.flatMap(({ d, name }, idx) =>
|
.flatMap(({ d, name }, idx) =>
|
||||||
new SVGPathData(d).toAbs().commands.map((c, cIdx) => ({ ...c, id: idx, idx: cIdx, name })),
|
new SVGPathData(d).toAbs().commands.map((c, cIdx) => ({ ...c, id: idx, idx: cIdx, name }))
|
||||||
);
|
);
|
||||||
|
|
||||||
export const getPaths = (src: string) => {
|
export const getPaths = (src: string) => {
|
||||||
@@ -60,10 +60,10 @@ export const getPaths = (src: string) => {
|
|||||||
let prev: Point | undefined = undefined;
|
let prev: Point | undefined = undefined;
|
||||||
let start: Point | undefined = undefined;
|
let start: Point | undefined = undefined;
|
||||||
const addPath = (
|
const addPath = (
|
||||||
c: (typeof commands)[number],
|
c: typeof commands[number],
|
||||||
next: Point,
|
next: Point,
|
||||||
d?: string,
|
d?: string,
|
||||||
extras?: { circle?: Path['circle']; cp1?: Path['cp1']; cp2?: Path['cp2'] },
|
extras?: { circle?: Path['circle']; cp1?: Path['cp1']; cp2?: Path['cp2'] }
|
||||||
) => {
|
) => {
|
||||||
assert(prev);
|
assert(prev);
|
||||||
paths.push({
|
paths.push({
|
||||||
@@ -153,7 +153,7 @@ export const getPaths = (src: string) => {
|
|||||||
{
|
{
|
||||||
cp1: { x: prev.x - reflectedCp1.x, y: prev.y - reflectedCp1.y },
|
cp1: { x: prev.x - reflectedCp1.x, y: prev.y - reflectedCp1.y },
|
||||||
cp2: { x: c.x2, y: c.y2 },
|
cp2: { x: c.x2, y: c.y2 },
|
||||||
},
|
}
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -169,7 +169,7 @@ export const getPaths = (src: string) => {
|
|||||||
assert(prev);
|
assert(prev);
|
||||||
const backTrackCP = (
|
const backTrackCP = (
|
||||||
index: number,
|
index: number,
|
||||||
currentPoint: { x: number; y: number },
|
currentPoint: { x: number; y: number }
|
||||||
): { x: number; y: number } => {
|
): { x: number; y: number } => {
|
||||||
const previousCommand = commands[index - 1];
|
const previousCommand = commands[index - 1];
|
||||||
if (!previousCommand) {
|
if (!previousCommand) {
|
||||||
@@ -211,7 +211,7 @@ export const getPaths = (src: string) => {
|
|||||||
{
|
{
|
||||||
cp1: { x: prevCP.x, y: prevCP.y },
|
cp1: { x: prevCP.x, y: prevCP.y },
|
||||||
cp2: { x: prevCP.x, y: prevCP.y },
|
cp2: { x: prevCP.x, y: prevCP.y },
|
||||||
},
|
}
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -226,13 +226,13 @@ export const getPaths = (src: string) => {
|
|||||||
c.lArcFlag,
|
c.lArcFlag,
|
||||||
c.sweepFlag,
|
c.sweepFlag,
|
||||||
c.x,
|
c.x,
|
||||||
c.y,
|
c.y
|
||||||
);
|
);
|
||||||
addPath(
|
addPath(
|
||||||
c,
|
c,
|
||||||
c,
|
c,
|
||||||
`M ${prev.x} ${prev.y} A${c.rX} ${c.rY} ${c.xRot} ${c.lArcFlag} ${c.sweepFlag} ${c.x} ${c.y}`,
|
`M ${prev.x} ${prev.y} A${c.rX} ${c.rY} ${c.xRot} ${c.lArcFlag} ${c.sweepFlag} ${c.x} ${c.y}`,
|
||||||
{ circle: c.rX === c.rY ? { ...center, r: c.rX } : undefined },
|
{ circle: c.rX === c.rY ? { ...center, r: c.rX } : undefined }
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -253,7 +253,7 @@ export const arcEllipseCenter = (
|
|||||||
fa: number,
|
fa: number,
|
||||||
fs: number,
|
fs: number,
|
||||||
x2: number,
|
x2: number,
|
||||||
y2: number,
|
y2: number
|
||||||
) => {
|
) => {
|
||||||
const phi = (a * Math.PI) / 180;
|
const phi = (a * Math.PI) / 180;
|
||||||
|
|
||||||
@@ -280,7 +280,7 @@ export const arcEllipseCenter = (
|
|||||||
sign *
|
sign *
|
||||||
Math.sqrt(
|
Math.sqrt(
|
||||||
Math.max(rx * rx * ry * ry - rx * rx * y1p * y1p - ry * ry * x1p * x1p, 0) /
|
Math.max(rx * rx * ry * ry - rx * rx * y1p * y1p - ry * ry * x1p * x1p, 0) /
|
||||||
(rx * rx * y1p * y1p + ry * ry * x1p * x1p),
|
(rx * rx * y1p * y1p + ry * ry * x1p * x1p)
|
||||||
);
|
);
|
||||||
|
|
||||||
const V2 = [(rx * y1p) / ry, (-ry * x1p) / rx];
|
const V2 = [(rx * y1p) / ry, (-ry * x1p) / rx];
|
||||||
|
|||||||
@@ -1,34 +1,28 @@
|
|||||||
import fs from 'fs';
|
import fs from "fs";
|
||||||
import path from 'path';
|
import path from "path";
|
||||||
import { Category, IconEntity } from '../theme/types';
|
import {Category, IconEntity} from "../theme/types";
|
||||||
|
|
||||||
const directory = path.join(process.cwd(), '../categories');
|
const directory = path.join(process.cwd(), "../categories");
|
||||||
|
|
||||||
export function getAllCategoryFiles(): Category[] {
|
export function getAllCategoryFiles(): Category[] {
|
||||||
const fileNames = fs.readdirSync(directory).filter((file) => path.extname(file) === '.json');
|
const fileNames = fs.readdirSync(directory).filter((file) => path.extname(file) === '.json');
|
||||||
|
|
||||||
return fileNames.map((fileName) => {
|
return fileNames.map((fileName) => {
|
||||||
const name = path.basename(fileName, '.json');
|
const name = path.basename(fileName, '.json')
|
||||||
const fileContent = fs.readFileSync(path.join(directory, fileName), 'utf8');
|
const fileContent = fs.readFileSync(path.join(directory, fileName), 'utf8')
|
||||||
|
|
||||||
const parsedFileContent = JSON.parse(fileContent);
|
const parsedFileContent = JSON.parse(fileContent)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
name,
|
name,
|
||||||
title: parsedFileContent.title,
|
title: parsedFileContent.title,
|
||||||
};
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function mapCategoryIconCount(
|
export function mapCategoryIconCount(categories: Category[], icons: { categories: IconEntity['categories'] }[]) {
|
||||||
categories: Category[],
|
|
||||||
icons: { categories: IconEntity['categories'] }[],
|
|
||||||
) {
|
|
||||||
return categories.map((category) => ({
|
return categories.map((category) => ({
|
||||||
...category,
|
...category,
|
||||||
iconCount: icons.reduce(
|
iconCount: icons.reduce((acc, curr) => (curr.categories.includes(category.name) ? ++acc : acc), 0)
|
||||||
(acc, curr) => (curr.categories.includes(category.name) ? ++acc : acc),
|
}))
|
||||||
0,
|
|
||||||
),
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,161 +0,0 @@
|
|||||||
import { bundledLanguages, type ThemeRegistration } from 'shikiji';
|
|
||||||
import { getHighlighter } from 'shikiji';
|
|
||||||
|
|
||||||
type CodeExampleType = {
|
|
||||||
title: string;
|
|
||||||
language: string;
|
|
||||||
code: string;
|
|
||||||
}[];
|
|
||||||
|
|
||||||
const getIconCodes = (): CodeExampleType => {
|
|
||||||
return [
|
|
||||||
{
|
|
||||||
language: 'js',
|
|
||||||
title: 'Vanilla',
|
|
||||||
code: `\
|
|
||||||
import { createIcons, icons } from 'lucide';
|
|
||||||
import { $CamelCase } from '@lucide/lab';
|
|
||||||
|
|
||||||
createIcons({
|
|
||||||
icons: {
|
|
||||||
$CamelCase
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
document.body.append('<i data-lucide="$Name"></i>');\
|
|
||||||
`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
language: 'tsx',
|
|
||||||
title: 'React',
|
|
||||||
code: `import { Icon } from 'lucide-react';
|
|
||||||
import { $CamelCase } from '@lucide/lab';
|
|
||||||
|
|
||||||
const App = () => {
|
|
||||||
return (
|
|
||||||
<Icon iconNode={$CamelCase} />
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default App;
|
|
||||||
`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
language: 'vue',
|
|
||||||
title: 'Vue',
|
|
||||||
code: `<script setup>
|
|
||||||
import { Icon } from 'lucide-vue-next';
|
|
||||||
import { $CamelCase } from '@lucide/lab';
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<Icon :iconNode="burger" />
|
|
||||||
</template>
|
|
||||||
`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
language: 'svelte',
|
|
||||||
title: 'Svelte',
|
|
||||||
code: `<script>
|
|
||||||
import { Icon } from 'lucide-svelte';
|
|
||||||
import { $CamelCase } from '@lucide/lab';
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<Icon iconNode={burger} />
|
|
||||||
`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
language: 'tsx',
|
|
||||||
title: 'Preact',
|
|
||||||
code: `import { Icon } from 'lucide-preact';
|
|
||||||
import { $CamelCase } from '@lucide/lab';
|
|
||||||
|
|
||||||
const App = () => {
|
|
||||||
return (
|
|
||||||
<Icon iconNode={$CamelCase} />
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default App;
|
|
||||||
`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
language: 'tsx',
|
|
||||||
title: 'Solid',
|
|
||||||
code: `import { Icon } from 'lucide-solid';
|
|
||||||
import { $CamelCase } from '@lucide/lab';
|
|
||||||
|
|
||||||
const App = () => {
|
|
||||||
return (
|
|
||||||
<Icon iconNode={$CamelCase} />
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default App;
|
|
||||||
`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
language: 'tsx',
|
|
||||||
title: 'Angular',
|
|
||||||
code: `// app.module.ts
|
|
||||||
import { LucideAngularModule } from 'lucide-angular';
|
|
||||||
import { $CamelCase } from '@lucide/lab';
|
|
||||||
|
|
||||||
@NgModule({
|
|
||||||
imports: [
|
|
||||||
LucideAngularModule.pick({ $CamelCase })
|
|
||||||
],
|
|
||||||
})
|
|
||||||
|
|
||||||
// app.component.html
|
|
||||||
<lucide-icon name="$CamelCase"></lucide-icon>
|
|
||||||
`,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
export type ThemeOptions =
|
|
||||||
| ThemeRegistration
|
|
||||||
| { light: ThemeRegistration; dark: ThemeRegistration };
|
|
||||||
|
|
||||||
const highLightCode = async (code: string, lang: string, active?: boolean) => {
|
|
||||||
const highlighter = await getHighlighter({
|
|
||||||
themes: ['github-light', 'github-dark'],
|
|
||||||
langs: Object.keys(bundledLanguages),
|
|
||||||
});
|
|
||||||
|
|
||||||
const highlightedCode = highlighter
|
|
||||||
.codeToHtml(code, {
|
|
||||||
lang,
|
|
||||||
themes: {
|
|
||||||
light: 'github-light',
|
|
||||||
dark: 'github-dark',
|
|
||||||
},
|
|
||||||
defaultColor: false,
|
|
||||||
})
|
|
||||||
.replace('shiki-themes', 'shiki-themes vp-code');
|
|
||||||
|
|
||||||
return `<div class="language-${lang} ${active ? 'active' : ''}">
|
|
||||||
<button title="Copy Code" class="copy"></button>
|
|
||||||
<span class="lang">${lang}</span>
|
|
||||||
${highlightedCode}
|
|
||||||
</div>`;
|
|
||||||
};
|
|
||||||
|
|
||||||
export default async function createCodeExamples() {
|
|
||||||
const codes = getIconCodes();
|
|
||||||
|
|
||||||
const codeExamplePromises = codes.map(async ({ title, language, code }, index) => {
|
|
||||||
const isFirst = index === 0;
|
|
||||||
|
|
||||||
const codeString = await highLightCode(code, language, isFirst);
|
|
||||||
|
|
||||||
return {
|
|
||||||
title,
|
|
||||||
language: language,
|
|
||||||
code: codeString,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
return Promise.all(codeExamplePromises);
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
import { bundledLanguages, type ThemeRegistration } from 'shikiji';
|
|
||||||
import { getHighlighter } from 'shikiji';
|
|
||||||
|
|
||||||
export type ThemeOptions =
|
|
||||||
| ThemeRegistration
|
|
||||||
| { light: ThemeRegistration; dark: ThemeRegistration };
|
|
||||||
|
|
||||||
const highLightCode = async (code: string, lang: string, active?: boolean) => {
|
|
||||||
const highlighter = await getHighlighter({
|
|
||||||
themes: ['github-light', 'github-dark'],
|
|
||||||
langs: Object.keys(bundledLanguages),
|
|
||||||
});
|
|
||||||
|
|
||||||
const highlightedCode = highlighter
|
|
||||||
.codeToHtml(code, {
|
|
||||||
lang,
|
|
||||||
themes: {
|
|
||||||
light: 'github-light',
|
|
||||||
dark: 'github-dark',
|
|
||||||
},
|
|
||||||
defaultColor: false,
|
|
||||||
})
|
|
||||||
.replace('shiki-themes', 'shiki-themes vp-code');
|
|
||||||
|
|
||||||
return `<div class="language-${lang} ${active ? 'active' : ''}">
|
|
||||||
<button title="Copy Code" class="copy"></button>
|
|
||||||
<span class="lang">${lang}</span>
|
|
||||||
${highlightedCode}
|
|
||||||
</div>`;
|
|
||||||
};
|
|
||||||
|
|
||||||
export default highLightCode;
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
export type CodeExampleType = {
|
|
||||||
title: string;
|
|
||||||
language: string;
|
|
||||||
code: string;
|
|
||||||
}[];
|
|
||||||
@@ -1,33 +1,33 @@
|
|||||||
import { bundledLanguages, type ThemeRegistration } from 'shikiji';
|
import {
|
||||||
import { getHighlighter } from 'shikiji';
|
bundledLanguages,
|
||||||
|
type ThemeRegistration
|
||||||
|
} from 'shikiji'
|
||||||
|
import {
|
||||||
|
getHighlighter,
|
||||||
|
} from 'shikiji'
|
||||||
|
|
||||||
|
|
||||||
type CodeExampleType = {
|
type CodeExampleType = {
|
||||||
title: string;
|
title: string,
|
||||||
language: string;
|
language: string,
|
||||||
code: string;
|
code: string,
|
||||||
}[];
|
}[]
|
||||||
|
|
||||||
const getIconCodes = (): CodeExampleType => {
|
const getIconCodes = (): CodeExampleType => {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
language: 'js',
|
language: 'html',
|
||||||
title: 'Vanilla',
|
title: 'HTML',
|
||||||
code: `\
|
code: `<i data-lucide="Name"></i>`
|
||||||
import { createIcons, icons } from 'lucide';
|
|
||||||
|
|
||||||
createIcons({ icons });
|
|
||||||
|
|
||||||
document.body.append('<i data-lucide="$Name"></i>');\
|
|
||||||
`,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
language: 'tsx',
|
language: 'tsx',
|
||||||
title: 'React',
|
title: 'React',
|
||||||
code: `import { $PascalCase } from 'lucide-react';
|
code: `import { PascalCase } from 'lucide-react';
|
||||||
|
|
||||||
const App = () => {
|
const App = () => {
|
||||||
return (
|
return (
|
||||||
<$PascalCase />
|
<PascalCase />
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -38,11 +38,11 @@ export default App;
|
|||||||
language: 'vue',
|
language: 'vue',
|
||||||
title: 'Vue',
|
title: 'Vue',
|
||||||
code: `<script setup>
|
code: `<script setup>
|
||||||
import { $PascalCase } from 'lucide-vue-next';
|
import { PascalCase } from 'lucide-vue-next';
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<$PascalCase />
|
<PascalCase />
|
||||||
</template>
|
</template>
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
@@ -50,20 +50,20 @@ import { $PascalCase } from 'lucide-vue-next';
|
|||||||
language: 'svelte',
|
language: 'svelte',
|
||||||
title: 'Svelte',
|
title: 'Svelte',
|
||||||
code: `<script>
|
code: `<script>
|
||||||
import { $PascalCase } from 'lucide-svelte';
|
import { PascalCase } from 'lucide-svelte';
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<$PascalCase />
|
<PascalCase />
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
language: 'tsx',
|
language: 'tsx',
|
||||||
title: 'Preact',
|
title: 'Preact',
|
||||||
code: `import { $PascalCase } from 'lucide-preact';
|
code: `import { PascalCase } from 'lucide-preact';
|
||||||
|
|
||||||
const App = () => {
|
const App = () => {
|
||||||
return (
|
return (
|
||||||
<$PascalCase />
|
<PascalCase />
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -73,11 +73,11 @@ export default App;
|
|||||||
{
|
{
|
||||||
language: 'tsx',
|
language: 'tsx',
|
||||||
title: 'Solid',
|
title: 'Solid',
|
||||||
code: `import { $PascalCase } from 'lucide-solid';
|
code: `import { PascalCase } from 'lucide-solid';
|
||||||
|
|
||||||
const App = () => {
|
const App = () => {
|
||||||
return (
|
return (
|
||||||
<$PascalCase />
|
<PascalCase />
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -88,16 +88,16 @@ export default App;
|
|||||||
language: 'tsx',
|
language: 'tsx',
|
||||||
title: 'Angular',
|
title: 'Angular',
|
||||||
code: `// app.module.ts
|
code: `// app.module.ts
|
||||||
import { LucideAngularModule, $PascalCase } from 'lucide-angular';
|
import { LucideAngularModule, PascalCase } from 'lucide-angular';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [
|
imports: [
|
||||||
LucideAngularModule.pick({ $PascalCase })
|
LucideAngularModule.pick({ PascalCase })
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
|
|
||||||
// app.component.html
|
// app.component.html
|
||||||
<lucide-icon name="$Name"></lucide-icon>
|
<lucide-icon name="Name"></lucide-icon>
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -107,39 +107,38 @@ import { LucideAngularModule, $PascalCase } from 'lucide-angular';
|
|||||||
@import ('~lucide-static/font/Lucide.css');
|
@import ('~lucide-static/font/Lucide.css');
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<div class="icon-$Name"></div>
|
<div class="icon-Name"></div>
|
||||||
`,
|
`,
|
||||||
},
|
}
|
||||||
];
|
]
|
||||||
};
|
}
|
||||||
|
|
||||||
export type ThemeOptions =
|
export type ThemeOptions =
|
||||||
| ThemeRegistration
|
| ThemeRegistration
|
||||||
| { light: ThemeRegistration; dark: ThemeRegistration };
|
| { light: ThemeRegistration; dark: ThemeRegistration }
|
||||||
|
|
||||||
const highLightCode = async (code: string, lang: string, active?: boolean) => {
|
const highLightCode = async (code: string, lang: string, active?: boolean) => {
|
||||||
const highlighter = await getHighlighter({
|
const highlighter = await getHighlighter({
|
||||||
themes: ['github-light', 'github-dark'],
|
themes: ['github-light', 'github-dark'],
|
||||||
langs: Object.keys(bundledLanguages),
|
langs: Object.keys(bundledLanguages)
|
||||||
});
|
})
|
||||||
|
|
||||||
const highlightedCode = highlighter
|
const highlightedCode = highlighter.codeToHtml(code, {
|
||||||
.codeToHtml(code, {
|
lang,
|
||||||
lang,
|
themes: {
|
||||||
themes: {
|
light: 'github-light',
|
||||||
light: 'github-light',
|
dark: 'github-dark'
|
||||||
dark: 'github-dark',
|
},
|
||||||
},
|
defaultColor: false
|
||||||
defaultColor: false,
|
}).replace('shiki-themes', 'shiki-themes vp-code')
|
||||||
})
|
|
||||||
.replace('shiki-themes', 'shiki-themes vp-code');
|
|
||||||
|
|
||||||
return `<div class="language-${lang} ${active ? 'active' : ''}">
|
return `<div class="language-${lang} ${active ? 'active' : ''}">
|
||||||
<button title="Copy Code" class="copy"></button>
|
<button title="Copy Code" class="copy"></button>
|
||||||
<span class="lang">${lang}</span>
|
<span class="lang">${lang}</span>
|
||||||
${highlightedCode}
|
${highlightedCode}
|
||||||
</div>`;
|
</div>`
|
||||||
};
|
}
|
||||||
|
|
||||||
|
|
||||||
export default async function createCodeExamples() {
|
export default async function createCodeExamples() {
|
||||||
const codes = getIconCodes();
|
const codes = getIconCodes();
|
||||||
@@ -154,7 +153,7 @@ export default async function createCodeExamples() {
|
|||||||
language: language,
|
language: language,
|
||||||
code: codeString,
|
code: codeString,
|
||||||
};
|
};
|
||||||
});
|
})
|
||||||
|
|
||||||
return Promise.all(codeExamplePromises);
|
return Promise.all(codeExamplePromises);
|
||||||
}
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user