Compare commits
147 Commits
0.365.0
...
pr-commit-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
224b4e60c2 | ||
|
|
f2f685bd65 | ||
|
|
18d18361e8 | ||
|
|
45c3c00d1d | ||
|
|
45bc8c08da | ||
|
|
6676cdd513 | ||
|
|
eb93f112bd | ||
|
|
54a58881da | ||
|
|
568d0b2fa3 | ||
|
|
2d1be858c8 | ||
|
|
fa6ddf923f | ||
|
|
658b94e65a | ||
|
|
137ab5c885 | ||
|
|
83284d842a | ||
|
|
8993b0b174 | ||
|
|
1b2b66f1f3 | ||
|
|
0186afc0e6 | ||
|
|
36c68bd901 | ||
|
|
e8abed3fa7 | ||
|
|
b4af645560 | ||
|
|
8f65b7e6f4 | ||
|
|
3c3e3508ec | ||
|
|
01e5fd74e6 | ||
|
|
7c62c7c662 | ||
|
|
e92d5e2d40 | ||
|
|
3975020fd2 | ||
|
|
43dfe362b6 | ||
|
|
58524b25ee | ||
|
|
34805df73f | ||
|
|
7cb867782d | ||
|
|
63deb3e4f9 | ||
|
|
4dcc340301 | ||
|
|
8bd401fa8c | ||
|
|
338fc70f6d | ||
|
|
7ca1fabc12 | ||
|
|
0d2c6c457e | ||
|
|
2539470978 | ||
|
|
12b412aa87 | ||
|
|
c8b00be37e | ||
|
|
291b11fbd1 | ||
|
|
4635141dfa | ||
|
|
c761ec7b5e | ||
|
|
bbd877a3ba | ||
|
|
e830fb16e0 | ||
|
|
7625cab264 | ||
|
|
7726b7e7ff | ||
|
|
bca0eeaf09 | ||
|
|
8125a21a7e | ||
|
|
077242cfa0 | ||
|
|
ce79418c66 | ||
|
|
80350b2cb1 | ||
|
|
172f397019 | ||
|
|
a463d8a5c7 | ||
|
|
fbd5225aad | ||
|
|
acd4a879f2 | ||
|
|
e11fa135a0 | ||
|
|
f980863f6c | ||
|
|
07230a442f | ||
|
|
a34919f0af | ||
|
|
f4d451de80 | ||
|
|
1e887bc30f | ||
|
|
1442b9a35b | ||
|
|
41fd856578 | ||
|
|
621b60b19d | ||
|
|
b77e372f3e | ||
|
|
d4891a7307 | ||
|
|
199987276b | ||
|
|
5647b34594 | ||
|
|
439e463430 | ||
|
|
22921304a7 | ||
|
|
220abb1510 | ||
|
|
91ce9221e8 | ||
|
|
904d74fe4a | ||
|
|
f507644488 | ||
|
|
501b65a7a1 | ||
|
|
14862fb0dc | ||
|
|
2963369c8d | ||
|
|
1e20d5087a | ||
|
|
4b312b369f | ||
|
|
afbef743de | ||
|
|
864fdeca84 | ||
|
|
541add925c | ||
|
|
2e7df30267 | ||
|
|
0a578c8803 | ||
|
|
b227caee98 | ||
|
|
72b74fbdb4 | ||
|
|
01d36ad363 | ||
|
|
548cb9cdf5 | ||
|
|
79430da42e | ||
|
|
0620843f4c | ||
|
|
34d063302a | ||
|
|
0abc3389db | ||
|
|
ebb8ec66af | ||
|
|
f55ced97a5 | ||
|
|
8458345535 | ||
|
|
66d6c2fe4b | ||
|
|
053808685c | ||
|
|
4f2a6b70d8 | ||
|
|
d8004e471a | ||
|
|
e2b46eac8e | ||
|
|
1b3173b17b | ||
|
|
d5f4275055 | ||
|
|
6abae7cc14 | ||
|
|
f32ffcd2a2 | ||
|
|
824bb897cf | ||
|
|
2843a76e28 | ||
|
|
155ff3319a | ||
|
|
34dddb811b | ||
|
|
5fead67bf3 | ||
|
|
48dc9372db | ||
|
|
747446fc76 | ||
|
|
5862ea735e | ||
|
|
3a8a349771 | ||
|
|
70bc2245c7 | ||
|
|
89f6b6357d | ||
|
|
354af456d3 | ||
|
|
e50582e93e | ||
|
|
65deefa53c | ||
|
|
54ef137b49 | ||
|
|
d4df542117 | ||
|
|
8c1e56a7bf | ||
|
|
dff2172173 | ||
|
|
e8ccd3df7e | ||
|
|
b593355537 | ||
|
|
09420cbca5 | ||
|
|
45e82a51b8 | ||
|
|
305e282e19 | ||
|
|
ad7ae84987 | ||
|
|
df100bde73 | ||
|
|
0724851934 | ||
|
|
34cf88d209 | ||
|
|
6322d1df66 | ||
|
|
8a414b3249 | ||
|
|
58f614acca | ||
|
|
d598ad7190 | ||
|
|
439ee3f707 | ||
|
|
c2c85fbd5c | ||
|
|
59aa7bc824 | ||
|
|
0beb50ebca | ||
|
|
649b440d9d | ||
|
|
a74e8f3863 | ||
|
|
46318b1605 | ||
|
|
4bf91a3c51 | ||
|
|
3cde4f2a41 | ||
|
|
d75c7613b2 | ||
|
|
d17e81d712 | ||
|
|
3b4a19efcf |
@@ -1,4 +1,4 @@
|
||||
const DEFAULT_ATTRS = require('./scripts/render/default-attrs.json');
|
||||
const DEFAULT_ATTRS = require('./tools/build-icons/render/default-attrs.json');
|
||||
|
||||
module.exports = {
|
||||
root: true,
|
||||
@@ -15,7 +15,9 @@ module.exports = {
|
||||
'no-use-before-define': 'off',
|
||||
'import/no-extraneous-dependencies': [
|
||||
'error',
|
||||
{ devDependencies: ['**/*.test.js', '**/*.spec.js', './scripts/**'] },
|
||||
{
|
||||
devDependencies: ['**/*.test.js', '**/*.spec.js', '**/scripts/**'],
|
||||
},
|
||||
],
|
||||
'import/extensions': [
|
||||
'error',
|
||||
|
||||
3
.github/ISSUE_TEMPLATE/02_bug_report.yml
vendored
@@ -69,6 +69,9 @@ body:
|
||||
- label: Windows
|
||||
- label: Linux
|
||||
- label: macOS
|
||||
- label: ChromeOS
|
||||
- label: iOS
|
||||
- label: Android
|
||||
- label: Other/not relevant
|
||||
- type: textarea
|
||||
id: description
|
||||
|
||||
@@ -30,6 +30,9 @@ body:
|
||||
- label: Windows
|
||||
- label: Linux
|
||||
- label: macOS
|
||||
- label: ChromeOS
|
||||
- label: iOS
|
||||
- label: Android
|
||||
- label: Other/not relevant
|
||||
- type: textarea
|
||||
id: description
|
||||
|
||||
17
.github/workflows/lucide-angular.yml
vendored
@@ -8,7 +8,7 @@ on:
|
||||
- pnpm-lock.yaml
|
||||
|
||||
jobs:
|
||||
lucide-angular:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
@@ -26,5 +26,20 @@ jobs:
|
||||
- name: 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
|
||||
run: pnpm --filter lucide-angular test
|
||||
|
||||
3
.github/workflows/lucide-preact.yml
vendored
@@ -24,8 +24,5 @@ jobs:
|
||||
- name: Install dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Build
|
||||
run: pnpm --filter lucide-preact build
|
||||
|
||||
- name: Test
|
||||
run: pnpm --filter lucide-preact test
|
||||
|
||||
3
.github/workflows/lucide-react-native.yml
vendored
@@ -24,8 +24,5 @@ jobs:
|
||||
- name: Install dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Build
|
||||
run: pnpm --filter lucide-react-native build
|
||||
|
||||
- name: Test
|
||||
run: pnpm --filter lucide-react-native test
|
||||
|
||||
17
.github/workflows/lucide-react.yml
vendored
@@ -10,7 +10,7 @@ on:
|
||||
- pnpm-lock.yaml
|
||||
|
||||
jobs:
|
||||
lucide-react:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
@@ -28,5 +28,20 @@ jobs:
|
||||
- name: 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
|
||||
run: pnpm --filter lucide-react test
|
||||
|
||||
17
.github/workflows/lucide-solid.yml
vendored
@@ -9,7 +9,7 @@ on:
|
||||
- pnpm-lock.yaml
|
||||
|
||||
jobs:
|
||||
lucide-solid:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
@@ -27,5 +27,20 @@ jobs:
|
||||
- name: 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
|
||||
run: pnpm --filter lucide-solid test
|
||||
|
||||
17
.github/workflows/lucide-svelte.yml
vendored
@@ -9,7 +9,7 @@ on:
|
||||
- pnpm-lock.yaml
|
||||
|
||||
jobs:
|
||||
lucide-svelte:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
@@ -27,5 +27,20 @@ jobs:
|
||||
- name: 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
|
||||
run: pnpm --filter lucide-svelte test
|
||||
|
||||
17
.github/workflows/lucide-vue-next.yml
vendored
@@ -9,7 +9,7 @@ on:
|
||||
- pnpm-lock.yaml
|
||||
|
||||
jobs:
|
||||
lucide-vue-next:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
@@ -27,5 +27,20 @@ jobs:
|
||||
- name: 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
|
||||
run: pnpm --filter lucide-vue-next test
|
||||
|
||||
17
.github/workflows/lucide-vue.yml
vendored
@@ -9,7 +9,7 @@ on:
|
||||
- pnpm-lock.yaml
|
||||
|
||||
jobs:
|
||||
lucide-vue:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
@@ -27,5 +27,20 @@ jobs:
|
||||
- name: 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
|
||||
run: pnpm --filter lucide-vue test
|
||||
|
||||
17
.github/workflows/lucide.yml
vendored
@@ -9,7 +9,7 @@ on:
|
||||
- pnpm-lock.yaml
|
||||
|
||||
jobs:
|
||||
lucide:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
@@ -27,5 +27,20 @@ jobs:
|
||||
- name: 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
|
||||
run: pnpm --filter lucide test
|
||||
|
||||
16
.github/workflows/pull-request-title.yml
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
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 }}
|
||||
12
.github/workflows/pull-request.yml
vendored
@@ -3,7 +3,7 @@ name: Add Changed Icons comment
|
||||
on:
|
||||
pull_request_target:
|
||||
paths:
|
||||
- 'icons/*.svg'
|
||||
- 'icons/*'
|
||||
branches:
|
||||
- main
|
||||
- fix-icon-preview
|
||||
@@ -68,6 +68,16 @@ jobs:
|
||||
# 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
|
||||
|
||||
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:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
|
||||
1
.gitignore
vendored
@@ -34,6 +34,7 @@ docs/.vitepress/data/iconNodes
|
||||
docs/.vitepress/data/iconMetaData.ts
|
||||
docs/.vitepress/data/releaseMetaData.json
|
||||
docs/.vitepress/data/releaseMetaData
|
||||
docs/.vitepress/data/categoriesData.json
|
||||
docs/.vitepress/data/iconDetails
|
||||
docs/.vitepress/data/relatedIcons.json
|
||||
docs/.vercel
|
||||
|
||||
@@ -2,6 +2,10 @@ pnpm-lock.yaml
|
||||
|
||||
# docs examples
|
||||
docs/**/examples/
|
||||
docs/.vitepress/.temp
|
||||
docs/.vitepress/cache
|
||||
docs/.vitepress/data
|
||||
docs/.nitro
|
||||
|
||||
# lucide-angular
|
||||
packages/lucide-angular/.angular/cache
|
||||
|
||||
@@ -39,6 +39,8 @@ You can also [download an Adobe Illustrator template](https://github.com/lucide-
|
||||
|
||||
#### [Figma Guide](https://lucide.dev/docs/figma-guide)
|
||||
|
||||
#### [Affinity Designer Guide](https://lucide.dev/guide/design/affinity-designer-guide)
|
||||
|
||||
### 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.
|
||||
|
||||
14
README.md
@@ -1,4 +1,11 @@
|
||||
<p align=center><img width="480" src="https://lucide.dev/lucide-logo-repo.svg" alt="Lucide Logo"></p>
|
||||
<p align="center">
|
||||
<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">
|
||||
<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>
|
||||
@@ -274,9 +281,12 @@ Thank you to all the people who contributed to Lucide!
|
||||
|
||||
## Sponsors
|
||||
|
||||
|
||||
<a href="https://vercel.com?utm_source=lucide&utm_campaign=oss">
|
||||
<img src="docs/public/vercel.svg" alt="Powered by Vercel" width="200" />
|
||||
</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>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"$schema": "../category.schema.json",
|
||||
"title": "Home",
|
||||
"icon": "home"
|
||||
"icon": "house"
|
||||
}
|
||||
|
||||
28
commitlint.config.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
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;
|
||||
@@ -1,4 +1,3 @@
|
||||
import { eventHandler, setResponseHeader } from 'h3';
|
||||
import iconMetaData from '../../data/iconMetaData';
|
||||
|
||||
export default eventHandler((event) => {
|
||||
|
||||
40
docs/.vitepress/api/figma/data.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
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,7 +13,10 @@ export default eventHandler((event) => {
|
||||
const data = pathData.at(-1).slice(0, -4);
|
||||
const [name] = pathData;
|
||||
|
||||
const src = Buffer.from(data, 'base64').toString('utf8');
|
||||
const src = Buffer.from(data, 'base64')
|
||||
.toString('utf8')
|
||||
.replaceAll('\n', '')
|
||||
.replace(/<svg[^>]*>|<\/svg>/g, '');
|
||||
|
||||
const children = [];
|
||||
|
||||
@@ -30,7 +33,7 @@ export default eventHandler((event) => {
|
||||
|
||||
const LucideIcon = createLucideIcon(backdropName, iconNode);
|
||||
const svg = renderToStaticMarkup(createElement(LucideIcon));
|
||||
const backdropString = svg.replace(/<svg[^>]*>|<\/svg>/g, '');
|
||||
const backdropString = svg.replaceAll('\n', '').replace(/<svg[^>]*>|<\/svg>/g, '');
|
||||
|
||||
children.push(
|
||||
createElement(Backdrop, {
|
||||
@@ -39,6 +42,15 @@ export default eventHandler((event) => {
|
||||
color: name in iconNodes ? 'red' : '#777',
|
||||
}),
|
||||
);
|
||||
if (name in iconNodes) {
|
||||
children.push(
|
||||
createElement(Backdrop, {
|
||||
backdropString: src,
|
||||
src: backdropString,
|
||||
color: 'lime',
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
const svg = Buffer.from(
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import { eventHandler, setResponseHeader } from 'h3';
|
||||
import iconMetaData from '../../data/iconMetaData';
|
||||
|
||||
export default eventHandler((event) => {
|
||||
|
||||
@@ -28,6 +28,10 @@ export default defineConfig({
|
||||
new URL('./theme/components/overrides/VPFooter.vue', import.meta.url),
|
||||
),
|
||||
},
|
||||
{
|
||||
find: '~/.vitepress',
|
||||
replacement: fileURLToPath(new URL('./', import.meta.url)),
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
|
||||
186
docs/.vitepress/data/categoriesData.json
Normal file
@@ -0,0 +1,186 @@
|
||||
[
|
||||
{
|
||||
"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"
|
||||
}
|
||||
]
|
||||
@@ -158,16 +158,5 @@
|
||||
"href": "https://www.npmjs.com/package/lucide-static"
|
||||
}
|
||||
]
|
||||
},
|
||||
"lucide-flutter": {
|
||||
"order": 9,
|
||||
"icon": "flutter",
|
||||
"shields": [
|
||||
{
|
||||
"alt": "flutter",
|
||||
"src": "https://img.shields.io/pub/v/lucide_icons",
|
||||
"href": "https://img.shields.io/pub/v/lucide_icons"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,8 +31,8 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "jguddas",
|
||||
"title": "Maintainer of Lucide & Software engineer @lego",
|
||||
"name": "Jakob Guddas",
|
||||
"title": "Maintainer of Lucide & Software engineer @LEGO",
|
||||
"image": "https://github.com/jguddas.png?size=192",
|
||||
"socialLinks": [
|
||||
{
|
||||
|
||||
@@ -7,11 +7,12 @@ interface BackdropProps {
|
||||
}
|
||||
|
||||
const Backdrop = ({ src, color = 'red', backdropString }: BackdropProps): JSX.Element => {
|
||||
const id = React.useId();
|
||||
return (
|
||||
<>
|
||||
<defs xmlns="http://www.w3.org/2000/svg">
|
||||
<pattern
|
||||
id="pattern"
|
||||
id={`pattern-${id}`}
|
||||
width=".1"
|
||||
height=".1"
|
||||
patternUnits="userSpaceOnUse"
|
||||
@@ -30,69 +31,56 @@ const Backdrop = ({ src, color = 'red', backdropString }: BackdropProps): JSX.El
|
||||
</pattern>
|
||||
</defs>
|
||||
<mask
|
||||
id="svg-preview-backdrop-mask-outline"
|
||||
id={`svg-preview-backdrop-mask-${id}`}
|
||||
maskUnits="userSpaceOnUse"
|
||||
>
|
||||
<g
|
||||
stroke="#fff"
|
||||
dangerouslySetInnerHTML={{ __html: backdropString }}
|
||||
/>
|
||||
<g
|
||||
dangerouslySetInnerHTML={{ __html: src }}
|
||||
strokeWidth={2.05}
|
||||
/>
|
||||
<g dangerouslySetInnerHTML={{ __html: src }} />
|
||||
</mask>
|
||||
<mask
|
||||
id="svg-preview-backdrop-mask-fill"
|
||||
id={`svg-preview-backdrop-mask-outline-${id}`}
|
||||
maskUnits="userSpaceOnUse"
|
||||
>
|
||||
<g
|
||||
stroke="#fff"
|
||||
dangerouslySetInnerHTML={{ __html: backdropString }}
|
||||
/>
|
||||
<g
|
||||
dangerouslySetInnerHTML={{ __html: src }}
|
||||
strokeWidth={2.05}
|
||||
/>
|
||||
<g
|
||||
strokeWidth={1.75}
|
||||
dangerouslySetInnerHTML={{ __html: backdropString }}
|
||||
/>
|
||||
</mask>
|
||||
<g
|
||||
strokeWidth={2.25}
|
||||
stroke="url(#pattern)"
|
||||
mask={'url(#svg-preview-backdrop-mask-outline)'}
|
||||
>
|
||||
<rect
|
||||
x="0"
|
||||
y="0"
|
||||
width="24"
|
||||
height="24"
|
||||
fill="url(#pattern)"
|
||||
opacity={0.5}
|
||||
fill="#fff"
|
||||
stroke="none"
|
||||
/>
|
||||
<g
|
||||
strokeWidth={1.75}
|
||||
dangerouslySetInnerHTML={{ __html: backdropString }}
|
||||
/>
|
||||
</mask>
|
||||
<g mask={`url(#svg-preview-backdrop-mask-${id})`}>
|
||||
<rect
|
||||
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>
|
||||
<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)'}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -301,7 +301,6 @@ const Handles = ({
|
||||
'strokeWidth' | 'stroke' | 'strokeDasharray' | 'strokeOpacity',
|
||||
any
|
||||
>) => {
|
||||
console.log(paths);
|
||||
return (
|
||||
<g
|
||||
className="svg-preview-handles-group"
|
||||
|
||||
@@ -10,18 +10,24 @@ type CodeExampleType = {
|
||||
const getIconCodes = (): CodeExampleType => {
|
||||
return [
|
||||
{
|
||||
language: 'html',
|
||||
title: 'HTML',
|
||||
code: `<i data-lucide="Name"></i>`,
|
||||
language: 'js',
|
||||
title: 'Vanilla',
|
||||
code: `\
|
||||
import { createIcons, icons } from 'lucide';
|
||||
|
||||
createIcons({ icons });
|
||||
|
||||
document.body.append('<i data-lucide="$Name"></i>');\
|
||||
`,
|
||||
},
|
||||
{
|
||||
language: 'tsx',
|
||||
title: 'React',
|
||||
code: `import { PascalCase } from 'lucide-react';
|
||||
code: `import { $PascalCase } from 'lucide-react';
|
||||
|
||||
const App = () => {
|
||||
return (
|
||||
<PascalCase />
|
||||
<$PascalCase />
|
||||
);
|
||||
};
|
||||
|
||||
@@ -32,11 +38,11 @@ export default App;
|
||||
language: 'vue',
|
||||
title: 'Vue',
|
||||
code: `<script setup>
|
||||
import { PascalCase } from 'lucide-vue-next';
|
||||
import { $PascalCase } from 'lucide-vue-next';
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<PascalCase />
|
||||
<$PascalCase />
|
||||
</template>
|
||||
`,
|
||||
},
|
||||
@@ -44,20 +50,20 @@ export default App;
|
||||
language: 'svelte',
|
||||
title: 'Svelte',
|
||||
code: `<script>
|
||||
import { PascalCase } from 'lucide-svelte';
|
||||
import { $PascalCase } from 'lucide-svelte';
|
||||
</script>
|
||||
|
||||
<PascalCase />
|
||||
<$PascalCase />
|
||||
`,
|
||||
},
|
||||
{
|
||||
language: 'tsx',
|
||||
title: 'Preact',
|
||||
code: `import { PascalCase } from 'lucide-preact';
|
||||
code: `import { $PascalCase } from 'lucide-preact';
|
||||
|
||||
const App = () => {
|
||||
return (
|
||||
<PascalCase />
|
||||
<$PascalCase />
|
||||
);
|
||||
};
|
||||
|
||||
@@ -67,11 +73,11 @@ export default App;
|
||||
{
|
||||
language: 'tsx',
|
||||
title: 'Solid',
|
||||
code: `import { PascalCase } from 'lucide-solid';
|
||||
code: `import { $PascalCase } from 'lucide-solid';
|
||||
|
||||
const App = () => {
|
||||
return (
|
||||
<PascalCase />
|
||||
<$PascalCase />
|
||||
);
|
||||
};
|
||||
|
||||
@@ -82,16 +88,16 @@ export default App;
|
||||
language: 'tsx',
|
||||
title: 'Angular',
|
||||
code: `// app.module.ts
|
||||
import { LucideAngularModule, PascalCase } from 'lucide-angular';
|
||||
import { LucideAngularModule, $PascalCase } from 'lucide-angular';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
LucideAngularModule.pick({ PascalCase })
|
||||
LucideAngularModule.pick({ $PascalCase })
|
||||
],
|
||||
})
|
||||
|
||||
// app.component.html
|
||||
<lucide-icon name="Name"></lucide-icon>
|
||||
<lucide-icon name="$Name"></lucide-icon>
|
||||
`,
|
||||
},
|
||||
{
|
||||
@@ -101,7 +107,7 @@ import { LucideAngularModule, PascalCase } from 'lucide-angular';
|
||||
@import ('~lucide-static/font/Lucide.css');
|
||||
</style>
|
||||
|
||||
<div class="icon-Name"></div>
|
||||
<div class="icon-$Name"></div>
|
||||
`,
|
||||
},
|
||||
];
|
||||
161
docs/.vitepress/lib/codeExamples/createLabCodeExamples.ts
Normal file
@@ -0,0 +1,161 @@
|
||||
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);
|
||||
}
|
||||
32
docs/.vitepress/lib/codeExamples/highLightCode.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
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;
|
||||
5
docs/.vitepress/lib/codeExamples/types.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
export type CodeExampleType = {
|
||||
title: string;
|
||||
language: string;
|
||||
code: string;
|
||||
}[];
|
||||
@@ -1,6 +1,5 @@
|
||||
import { promises as fs, constants } from 'fs';
|
||||
import path from 'path';
|
||||
import yaml from 'js-yaml';
|
||||
import { PackageItem } from '../theme/types';
|
||||
|
||||
const fileExist = (filePath) =>
|
||||
@@ -27,11 +26,6 @@ const fetchPackages = async (): Promise<PackageItem[]> => {
|
||||
return JSON.parse(await fs.readFile(jsonFilePath, 'utf-8'));
|
||||
}
|
||||
|
||||
const ymlFilePath = path.resolve(filePath, 'pubspec.yaml');
|
||||
if (await fileExist(ymlFilePath)) {
|
||||
return yaml.load(await fs.readFile(ymlFilePath, 'utf-8'));
|
||||
}
|
||||
|
||||
return null;
|
||||
}),
|
||||
);
|
||||
|
||||
@@ -31,10 +31,10 @@ const sidebar: UserConfig<DefaultTheme.Config>['themeConfig']['sidebar'] = {
|
||||
{
|
||||
text: 'Advanced',
|
||||
items: [
|
||||
// {
|
||||
// text: 'Accessibility',
|
||||
// link: '/guide/advanced/accessibility'
|
||||
// },
|
||||
{
|
||||
text: 'Accessibility',
|
||||
link: '/guide/advanced/accessibility',
|
||||
},
|
||||
{
|
||||
text: 'Global styling',
|
||||
link: '/guide/advanced/global-styling',
|
||||
@@ -117,6 +117,10 @@ const sidebar: UserConfig<DefaultTheme.Config>['themeConfig']['sidebar'] = {
|
||||
text: 'Designing in Figma',
|
||||
link: '/guide/design/figma-guide',
|
||||
},
|
||||
{
|
||||
text: 'Designing in Affinity Designer',
|
||||
link: '/guide/design/affinity-designer-guide',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
|
||||
@@ -7,7 +7,16 @@ const props = defineProps<{
|
||||
href?: string
|
||||
}>()
|
||||
|
||||
const isExternal = computed(() => props.href?.startsWith('http') ?? false)
|
||||
|
||||
const component = computed(() => props.href ? 'a' : 'div')
|
||||
const target = computed(() => isExternal.value ? '_blank' : undefined)
|
||||
const rel = computed(() => isExternal.value ? 'noreferrer noopener' : undefined)
|
||||
|
||||
const onClick = computed(() => {
|
||||
if(!props.href || isExternal) return
|
||||
return go(props.href)
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -15,7 +24,9 @@ const component = computed(() => props.href ? 'a' : 'div')
|
||||
:is="component"
|
||||
:href="href"
|
||||
class="badge"
|
||||
@click="props?.href ? go(href) : undefined"
|
||||
:target="target"
|
||||
:rel="rel"
|
||||
@click="onClick"
|
||||
>
|
||||
<slot/>
|
||||
</component>
|
||||
|
||||
90
docs/.vitepress/theme/components/base/Checkbox.vue
Normal file
@@ -0,0 +1,90 @@
|
||||
<script setup lang="ts">
|
||||
import { computed } from 'vue';
|
||||
|
||||
const props = defineProps<{
|
||||
label: string
|
||||
id: string
|
||||
value: string
|
||||
modelValue: string | string[]
|
||||
}>()
|
||||
|
||||
const emit = defineEmits(['change', 'input', 'update:modelValue'])
|
||||
|
||||
const model = computed({
|
||||
get: () => {
|
||||
if (Array.isArray(props.modelValue)) {
|
||||
return props.modelValue.includes(props.value)
|
||||
}
|
||||
return props.modelValue === props.value
|
||||
|
||||
},
|
||||
set: (value: string) => {
|
||||
if (Array.isArray(props.modelValue)) {
|
||||
const newValue = [...props.modelValue]
|
||||
const index = newValue.indexOf(props.value)
|
||||
if (value) {
|
||||
if (index === -1) {
|
||||
newValue.push(props.value)
|
||||
}
|
||||
} else {
|
||||
if (index !== -1) {
|
||||
newValue.splice(index, 1)
|
||||
}
|
||||
}
|
||||
emit('update:modelValue', newValue)
|
||||
} else {
|
||||
emit('update:modelValue', value)
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="checkbox-wrapper">
|
||||
<input
|
||||
type="checkbox"
|
||||
class="checkbox"
|
||||
ref="input"
|
||||
:id="id"
|
||||
v-model="model"
|
||||
v-bind="$attrs"
|
||||
/>
|
||||
<label :for="id" class="checkbox-label">
|
||||
{{ label }}
|
||||
</label>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.checkbox-wrapper {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.checkbox-label {
|
||||
line-height: 20px;
|
||||
font-size: 13px;
|
||||
color: var(--vt-c-text-1);
|
||||
transition: color .5s;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.checkbox {
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
cursor: pointer;
|
||||
border: 1px solid var(--vp-input-border-color);
|
||||
background-color: var(--vp-input-switch-bg-color);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.checkbox:checked {
|
||||
border-color: transparent;
|
||||
background: url("data:image/svg+xml,%3Csvg width='12px' height='12px' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='4' stroke-linecap='round' stroke-linejoin='round' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E")
|
||||
center no-repeat var(--vp-c-brand);;
|
||||
}
|
||||
|
||||
</style>
|
||||
@@ -8,8 +8,6 @@ import { data } from './HomeHeroBefore.data'
|
||||
<HomeContainer class="container">
|
||||
<Badge
|
||||
:href="`https://github.com/lucide-icons/lucide/releases/tag/${data.version}`"
|
||||
target="_blank"
|
||||
rel="noreferrer noopener"
|
||||
>v{{ data.version }}</Badge>
|
||||
</HomeContainer>
|
||||
</template>
|
||||
|
||||
@@ -1,17 +1,23 @@
|
||||
<script setup lang="ts">
|
||||
import Card from '../base/Card.vue'
|
||||
import HomeSectionTitle from './HomeSectionTitle.vue'
|
||||
import VPButton from 'vitepress/dist/client/theme-default/components/VPButton.vue'
|
||||
import Card from '../base/Card.vue';
|
||||
import HomeSectionTitle from './HomeSectionTitle.vue';
|
||||
import VPButton from 'vitepress/dist/client/theme-default/components/VPButton.vue';
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<HomeSectionTitle :headingLevel="3">
|
||||
Sponsor the Lucide maintainers
|
||||
</HomeSectionTitle>
|
||||
<HomeSectionTitle :headingLevel="3"> Sponsor the Lucide maintainers </HomeSectionTitle>
|
||||
<Card class="sponsor-card">
|
||||
<img
|
||||
src="/open-collective.png"
|
||||
src="/company-logos/open-collective-light.svg"
|
||||
alt="Open Collective logo"
|
||||
class="logo light"
|
||||
width="242"
|
||||
height="42"
|
||||
/>
|
||||
<img
|
||||
src="/company-logos/open-collective-dark.svg"
|
||||
alt="Open Collective logo"
|
||||
class="logo dark"
|
||||
width="242"
|
||||
height="42"
|
||||
/>
|
||||
@@ -37,6 +43,13 @@ import VPButton from 'vitepress/dist/client/theme-default/components/VPButton.vu
|
||||
margin: auto 0;
|
||||
}
|
||||
|
||||
html.dark .logo.dark {
|
||||
display: none;
|
||||
}
|
||||
html:not(.dark) .logo.light {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media (min-width: 640px) {
|
||||
.sponsor-card {
|
||||
flex-direction: row;
|
||||
|
||||
@@ -3,7 +3,7 @@ export interface TeamMember {
|
||||
name: string
|
||||
title: string
|
||||
image: string
|
||||
sponsor: string
|
||||
sponsor?: string
|
||||
socialLinks: DefaultTheme.SocialLink[]
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -6,6 +6,7 @@ import { isActive } from 'vitepress/dist/client/shared'
|
||||
import { useActiveAnchor } from '../../composables/useActiveAnchor'
|
||||
import { data } from './CategoryList.data'
|
||||
import CategoryListItem from './CategoryListItem.vue'
|
||||
import SidebarTitle from './SidebarTitle.vue'
|
||||
import { useCategoryView } from '../../composables/useCategoryView'
|
||||
|
||||
const { page } = useData()
|
||||
@@ -46,10 +47,13 @@ watch(headers, () => {
|
||||
|
||||
<template>
|
||||
<div class="category-list" ref="container">
|
||||
<VPLink class="sidebar-title" href="/icons/" :class="{ 'active': overviewIsActive } ">
|
||||
<SidebarTitle>
|
||||
View
|
||||
</SidebarTitle>
|
||||
<VPLink class="sidebar-link sidebar-text" href="/icons/" :class="{ 'active': overviewIsActive } ">
|
||||
All
|
||||
</VPLink>
|
||||
<VPLink class="sidebar-title" href="/icons/categories" :class="{ 'active': categoriesIsActive } ">
|
||||
<VPLink class="sidebar-link sidebar-text" href="/icons/categories" :class="{ 'active': categoriesIsActive } ">
|
||||
Categories
|
||||
</VPLink>
|
||||
<div class="content">
|
||||
@@ -62,17 +66,20 @@ watch(headers, () => {
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.sidebar-title {
|
||||
font-weight: 500;
|
||||
color: var(--vp-c-text-2);
|
||||
margin-bottom: 6px;
|
||||
.sidebar-text {
|
||||
line-height: 24px;
|
||||
font-size: 14px;
|
||||
display: block;
|
||||
transition: color 0.25s;
|
||||
padding: 4px 0;
|
||||
}
|
||||
|
||||
.sidebar-title:hover, .sidebar-title.active {
|
||||
.sidebar-link {
|
||||
font-weight: 500;
|
||||
color: var(--vp-c-text-2);
|
||||
}
|
||||
|
||||
.sidebar-link:hover, .sidebar-link.active {
|
||||
color: var(--vp-c-brand);
|
||||
}
|
||||
.content {
|
||||
|
||||
@@ -39,6 +39,12 @@ function copyJSX() {
|
||||
navigator.clipboard.writeText(code)
|
||||
}
|
||||
|
||||
function copyComponentName() {
|
||||
const code = componentName.value
|
||||
|
||||
navigator.clipboard.writeText(code)
|
||||
}
|
||||
|
||||
function copyVue() {
|
||||
let attrs = ['']
|
||||
|
||||
@@ -101,6 +107,7 @@ function copyAngular() {
|
||||
:popoverPosition="popoverPosition"
|
||||
:options="[
|
||||
{ text: 'Copy JSX' , onClick: copyJSX },
|
||||
{ text: 'Copy Component Name' , onClick: copyComponentName },
|
||||
{ text: 'Copy Vue' , onClick: copyVue },
|
||||
{ text: 'Copy Svelte' , onClick: copyJSX },
|
||||
{ text: 'Copy Angular' , onClick: copyAngular },
|
||||
|
||||
@@ -11,19 +11,30 @@ import IconInfo from './IconInfo.vue';
|
||||
import Badge from '../base/Badge.vue';
|
||||
import { computedAsync } from '@vueuse/core';
|
||||
import { satisfies } from 'semver';
|
||||
import { useExternalLibs } from '../../composables/useExternalLibs';
|
||||
|
||||
const props = defineProps<{
|
||||
iconName: string | null
|
||||
}>()
|
||||
|
||||
const { externalIconNodes } = useExternalLibs()
|
||||
|
||||
const { go } = useRouter()
|
||||
|
||||
const icon = computedAsync<IconEntity | null>(async () => {
|
||||
if (props.iconName) {
|
||||
try {
|
||||
return (await import(`../../../data/iconDetails/${props.iconName}.ts`)).default as IconEntity
|
||||
if (props.iconName.includes(':')) {
|
||||
const [library, name] = props.iconName.split(':')
|
||||
|
||||
return externalIconNodes.value[library].find((icon) => icon.name === name)
|
||||
} else {
|
||||
return (await import(`../../../data/iconDetails/${props.iconName}.ts`)).default as IconEntity
|
||||
}
|
||||
} catch (err) {
|
||||
go(`/icons/${props.iconName}`)
|
||||
if (!props.iconName.includes(':')) {
|
||||
go(`/icons/${props.iconName}`)
|
||||
}
|
||||
}
|
||||
}
|
||||
return null
|
||||
@@ -55,10 +66,8 @@ const Expand = createLucideIcon('Expand', expand)
|
||||
v-if="icon.createdRelease"
|
||||
class="version"
|
||||
:href="releaseTagLink(icon.createdRelease.version)"
|
||||
target="_blank"
|
||||
rel="noreferrer noopener"
|
||||
>v{{ icon.createdRelease.version }}</Badge>
|
||||
<IconButton @click="go(`/icons/${icon.name}`)">
|
||||
<IconButton @click="go(icon.externalLibrary ? `/icons/${icon.externalLibrary}/${icon.name}` : `/icons/${icon.name}`)">
|
||||
<component :is="Expand" />
|
||||
</IconButton>
|
||||
<IconButton @click="onClose">
|
||||
|
||||
@@ -25,8 +25,10 @@ function setActiveIcon(name: string) {
|
||||
:key="icon.name"
|
||||
>
|
||||
<IconItem
|
||||
v-bind="icon"
|
||||
@setActiveIcon="setActiveIcon(icon.name)"
|
||||
:iconNode="icon.iconNode"
|
||||
:name="icon.name"
|
||||
:externalLibrary="icon.externalLibrary"
|
||||
@setActiveIcon="setActiveIcon"
|
||||
:active="activeIcon === icon.name"
|
||||
customizable
|
||||
:overlayMode="overlayMode"
|
||||
|
||||
@@ -7,6 +7,8 @@ import CopyCodeButton from './CopyCodeButton.vue';
|
||||
import VPButton from 'vitepress/dist/client/theme-default/components/VPButton.vue';
|
||||
import {useData, useRouter} from 'vitepress';
|
||||
import { computed } from 'vue';
|
||||
import createLucideIcon from 'lucide-vue-next/src/createLucideIcon';
|
||||
import { diamond } from '../../../data/iconNodes'
|
||||
|
||||
const props = defineProps<{
|
||||
icon: IconEntity
|
||||
@@ -20,13 +22,21 @@ const tags = computed(() => {
|
||||
if (!props.icon || !props?.icon?.tags) return []
|
||||
return props.icon.tags.join(' • ')
|
||||
})
|
||||
|
||||
const DiamondIcon = createLucideIcon('Diamond', diamond)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="icon-info">
|
||||
<IconDetailName class="icon-name">
|
||||
{{ icon.name }}
|
||||
</IconDetailName>
|
||||
<div class="icon-name-wrapper">
|
||||
<IconDetailName class="icon-name">
|
||||
{{ icon.name }}
|
||||
</IconDetailName>
|
||||
<div v-if="icon.externalLibrary" class="icon-external-lib">
|
||||
<DiamondIcon fill="currentColor" :size="12"/>
|
||||
{{ icon.externalLibrary }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="tags-scroller" v-if="tags.length">
|
||||
<p class="icon-tags horizontal-scroller">
|
||||
{{ tags }}
|
||||
@@ -44,10 +54,10 @@ const tags = computed(() => {
|
||||
|
||||
<div class="group buttons">
|
||||
<VPButton
|
||||
v-if="!page?.relativePath?.startsWith?.(`icons/${icon.name}`)"
|
||||
:href="`/icons/${icon.name}`"
|
||||
v-if="!page?.relativePath?.startsWith?.(icon.externalLibrary ? `icons/${icon.externalLibrary}/${icon.name}`: `icons/${icon.name}`)"
|
||||
:href="icon.externalLibrary ? `/icons/${icon.externalLibrary}/${icon.name}`: `/icons/${icon.name}`"
|
||||
text="See in action"
|
||||
@click="go(`/icons/${icon.name}`)"
|
||||
@click="go(icon.externalLibrary ? `/icons/${icon.externalLibrary}/${icon.name}`: `/icons/${icon.name}`)"
|
||||
/>
|
||||
<CopySVGButton :name="icon.name" :popoverPosition="popoverPosition"/>
|
||||
<CopyCodeButton :name="icon.name" :popoverPosition="popoverPosition"/>
|
||||
@@ -67,9 +77,27 @@ const tags = computed(() => {
|
||||
text-transform: capitalize;
|
||||
}
|
||||
.icon-name {
|
||||
margin-right: -36px;
|
||||
}
|
||||
|
||||
.icon-name-wrapper {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 2px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.icon-external-lib {
|
||||
color: var(--vp-c-brand-dark);
|
||||
padding: 4px 12px;
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
line-height: 28px;
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.icon-tags {
|
||||
font-size: 16px;
|
||||
color: var(--vp-c-text-2);
|
||||
|
||||
@@ -6,6 +6,7 @@ import { useRouter } from 'vitepress';
|
||||
import getSVGIcon from '../../utils/getSVGIcon';
|
||||
import useConfetti from '../../composables/useConfetti';
|
||||
import Tooltip from '../base/Tooltip.vue';
|
||||
import { diamond } from '../../../data/iconNodes'
|
||||
|
||||
const downloadText = 'Download!'
|
||||
const copiedText = 'Copied!'
|
||||
@@ -16,6 +17,7 @@ const props = defineProps<{
|
||||
name: string;
|
||||
iconNode: IconNode;
|
||||
active: boolean;
|
||||
externalLibrary?: string;
|
||||
customizable?: boolean;
|
||||
overlayMode?: boolean
|
||||
hideIcon?: boolean
|
||||
@@ -33,8 +35,9 @@ const icon = computed(() => {
|
||||
return createLucideIcon(props.name, props.iconNode)
|
||||
})
|
||||
|
||||
async function navigateToIcon(event) {
|
||||
const href = computed(() => props.externalLibrary ? `/icons/${props.externalLibrary}/${props.name}` : `/icons/${props.name}`)
|
||||
|
||||
async function navigateToIcon(event) {
|
||||
if (event.shiftKey) {
|
||||
event.preventDefault()
|
||||
const svgString = getSVGIcon(event.target.firstChild, {
|
||||
@@ -50,13 +53,16 @@ async function navigateToIcon(event) {
|
||||
|
||||
if(props.overlayMode && showOverlay.value) {
|
||||
event.preventDefault()
|
||||
window.history.pushState({}, '', `/icons/${props.name}`)
|
||||
emit('setActiveIcon', props.name)
|
||||
|
||||
window.history.pushState({}, '', props.externalLibrary ? `/icons/${props.externalLibrary}/${props.name}` : `/icons/${props.name}`)
|
||||
emit('setActiveIcon', props.externalLibrary ? `${props.externalLibrary}:${props.name}`: props.name)
|
||||
} else {
|
||||
event.preventDefault()
|
||||
go(`/icons/${props.name}`)
|
||||
go(props.externalLibrary ? `/icons/${props.externalLibrary}/${props.name}` : `/icons/${props.name}`)
|
||||
}
|
||||
}
|
||||
|
||||
const DiamondIcon = createLucideIcon('Diamond', diamond)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -66,7 +72,7 @@ async function navigateToIcon(event) {
|
||||
@click="navigateToIcon"
|
||||
:class="{ active, animate }"
|
||||
:aria-label="name"
|
||||
:href="`/icons/${props.name}`"
|
||||
|
||||
:data-confetti-text="confettiText"
|
||||
ref="ref"
|
||||
>
|
||||
@@ -80,6 +86,13 @@ async function navigateToIcon(event) {
|
||||
}"
|
||||
/>
|
||||
</KeepAlive>
|
||||
<div
|
||||
v-if="externalLibrary"
|
||||
class="floating-diamond"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<DiamondIcon fill="currentColor" :size="8"/>
|
||||
</div>
|
||||
</a>
|
||||
</Tooltip>
|
||||
</template>
|
||||
@@ -88,6 +101,7 @@ async function navigateToIcon(event) {
|
||||
|
||||
<style scoped>
|
||||
.icon-button {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
border: 1px solid transparent;
|
||||
text-align: center;
|
||||
@@ -104,6 +118,13 @@ async function navigateToIcon(event) {
|
||||
color: var(--vp-c-text-1);
|
||||
}
|
||||
|
||||
.floating-diamond {
|
||||
position: absolute;
|
||||
top: 4px;
|
||||
right: 4px;
|
||||
color: var(--vp-c-brand);
|
||||
}
|
||||
|
||||
.confetti-button:before,
|
||||
.confetti-button:after {
|
||||
z-index: 100;
|
||||
|
||||
@@ -19,7 +19,7 @@ export type CategoryRow = CategoryNameRow | CategoryIconsRow;
|
||||
import IconGrid from './IconGrid.vue'
|
||||
|
||||
defineProps<{
|
||||
activeIconName: string
|
||||
activeIconName: string | null
|
||||
categoryRow: CategoryRow
|
||||
}>()
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<script setup lang="ts">
|
||||
import { ref, computed, defineAsyncComponent, onMounted } from 'vue';
|
||||
import { ref, computed, defineAsyncComponent, onMounted, watch, watchEffect } from 'vue';
|
||||
import type { IconEntity, Category } from '../../types';
|
||||
import useSearch from '../../composables/useSearch';
|
||||
import InputSearch from '../base/InputSearch.vue';
|
||||
@@ -69,7 +69,7 @@ const categories = computed(() => {
|
||||
return props.categories
|
||||
.map(({ name, title }) => {
|
||||
const categoryIcons = props.icons.filter((icon) => {
|
||||
const iconCategories = props.iconCategories[icon.name];
|
||||
const iconCategories = icon?.externalLibrary ? icon.categories : props.iconCategories[icon.name]
|
||||
|
||||
return iconCategories?.includes(name);
|
||||
});
|
||||
@@ -140,6 +140,12 @@ function handleCloseDrawer() {
|
||||
|
||||
window.history.pushState({}, '', '/icons/categories');
|
||||
}
|
||||
|
||||
watchEffect(() => {
|
||||
|
||||
console.log(props.icons.find((icon) => icon.name === 'burger'));
|
||||
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
<script setup lang="ts">
|
||||
import Checkbox from '../base/Checkbox.vue'
|
||||
import SidebarTitle from './SidebarTitle.vue'
|
||||
import { useExternalLibs } from '../../composables/useExternalLibs';
|
||||
import { ExternalLibs } from '../../types';
|
||||
|
||||
interface ExternalLibrary {
|
||||
name: string;
|
||||
value: ExternalLibs;
|
||||
}
|
||||
|
||||
const externalLibraries: ExternalLibrary[] = [
|
||||
{
|
||||
name: 'Lab',
|
||||
value: 'lab'
|
||||
},
|
||||
];
|
||||
|
||||
const { selectedLibs } = useExternalLibs();
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="external-library-select">
|
||||
<SidebarTitle>
|
||||
Include external libs
|
||||
</SidebarTitle>
|
||||
<ul>
|
||||
<li
|
||||
v-for="library in externalLibraries"
|
||||
:key="library.name"
|
||||
>
|
||||
<Checkbox
|
||||
:label="library.name"
|
||||
:id="library.name"
|
||||
v-model="selectedLibs"
|
||||
:value="library.value"
|
||||
/>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.external-library-select {
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
</style>
|
||||
19
docs/.vitepress/theme/components/icons/SidebarTitle.vue
Normal file
@@ -0,0 +1,19 @@
|
||||
<template>
|
||||
<h2 class="sidebar-title sidebar-text">
|
||||
<slot />
|
||||
</h2>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.sidebar-title {
|
||||
font-weight: 700;
|
||||
color: var(--vp-c-text-1);
|
||||
}
|
||||
.sidebar-text {
|
||||
line-height: 24px;
|
||||
font-size: 14px;
|
||||
display: block;
|
||||
transition: color 0.25s;
|
||||
padding: 4px 0;
|
||||
}
|
||||
</style>
|
||||
@@ -24,7 +24,7 @@ const links = computed(() => [
|
||||
},
|
||||
{
|
||||
text: 'Github',
|
||||
href: `${githubLink.value}/issues`
|
||||
href: `${githubLink.value}`
|
||||
},
|
||||
{
|
||||
text: 'Issues',
|
||||
|
||||
@@ -5,9 +5,10 @@ import fetchPackages from '../../../lib/fetchPackages';
|
||||
export default {
|
||||
async load() {
|
||||
const packages = await fetchPackages();
|
||||
|
||||
return {
|
||||
packages: packages
|
||||
.filter((p) => p.name in packageData)
|
||||
.filter((p) => p?.name != null && p.name in packageData)
|
||||
.map((pData) => ({
|
||||
...pData,
|
||||
...packageData[pData.name],
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
<script setup lang="ts">
|
||||
import { data } from './PackageList.data'
|
||||
import GridSection from '../base/GridSection.vue'
|
||||
import PackageListItem from "./PackageListItem.vue";</script>
|
||||
import PackageListItem from "./PackageListItem.vue";
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<GridSection
|
||||
|
||||
@@ -19,7 +19,7 @@ const props = defineProps<{
|
||||
<img v-if="packageData.iconDark" :src="packageData.iconDark" alt="" class="package-icon dark" :class="packageData.iconClass" />
|
||||
</div>
|
||||
<div class="package-title">
|
||||
<h2 class="title">{{ props.packageData.name }}</h2>
|
||||
<h2 class="title">{{ props.packageData?.name }}</h2>
|
||||
<a v-for="shield in props.packageData.shields" :href="shield.href" class="package-shield" rel="noreferrer noopener">
|
||||
<img :src="shield.src" :alt="shield.href" />
|
||||
</a>
|
||||
|
||||
57
docs/.vitepress/theme/composables/useExternalLibs.ts
Normal file
@@ -0,0 +1,57 @@
|
||||
import { ref, inject, Ref, watch } from 'vue';
|
||||
import { ExternalLibs, IconEntity } from '../types';
|
||||
|
||||
export const EXTERNAL_LIBS_CONTEXT = Symbol('externalLibs');
|
||||
|
||||
type ExternalIconNodes = Partial<Record<ExternalLibs, IconEntity[]>>;
|
||||
|
||||
interface ExternalLibContext {
|
||||
selectedLibs: Ref<[ExternalLibs]>;
|
||||
externalIconNodes: Ref<ExternalIconNodes>;
|
||||
}
|
||||
|
||||
export const externalLibContext = {
|
||||
selectedLibs: ref([]),
|
||||
externalIconNodes: ref({}),
|
||||
};
|
||||
|
||||
const externalLibIconNodesAPI = {
|
||||
lab: 'https://lab.lucide.dev/api/icon-details',
|
||||
};
|
||||
|
||||
export function useExternalLibs(): ExternalLibContext {
|
||||
const context = inject<ExternalLibContext>(EXTERNAL_LIBS_CONTEXT);
|
||||
|
||||
watch(context?.selectedLibs, async (selectedLibs) => {
|
||||
const savedIconNodes = { ...context?.externalIconNodes.value };
|
||||
const newExternalIconNodes: ExternalIconNodes = {};
|
||||
|
||||
try {
|
||||
for (const lib of selectedLibs) {
|
||||
if (savedIconNodes[lib]) {
|
||||
newExternalIconNodes[lib] = savedIconNodes[lib];
|
||||
} else {
|
||||
const response = await fetch(externalLibIconNodesAPI[lib]);
|
||||
const iconNodes = await response.json();
|
||||
|
||||
if (iconNodes) {
|
||||
newExternalIconNodes[lib] = Object.values(iconNodes).map((iconEntity: IconEntity) => ({
|
||||
...iconEntity,
|
||||
externalLibrary: lib,
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
context.externalIconNodes.value = newExternalIconNodes;
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
});
|
||||
|
||||
if (!context) {
|
||||
throw new Error('useExternalLibs must be used with externalLibs context');
|
||||
}
|
||||
|
||||
return context;
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
import { computed } from 'vue';
|
||||
import { useExternalLibs } from '~/.vitepress/theme/composables/useExternalLibs';
|
||||
import { IconEntity } from '../types';
|
||||
|
||||
const useIconsWithExternalLibs = (initialIcons?: IconEntity[]) => {
|
||||
const { externalIconNodes } = useExternalLibs();
|
||||
|
||||
return computed(() => {
|
||||
let icons = [];
|
||||
|
||||
if (initialIcons) {
|
||||
icons = icons.concat(initialIcons);
|
||||
}
|
||||
|
||||
const externalIconNodesArray = Object.values(externalIconNodes.value);
|
||||
|
||||
if (externalIconNodesArray?.length) {
|
||||
externalIconNodesArray.forEach((iconNodes) => {
|
||||
if (iconNodes?.length) {
|
||||
icons = icons.concat(iconNodes);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return icons;
|
||||
});
|
||||
};
|
||||
|
||||
export default useIconsWithExternalLibs;
|
||||
@@ -7,6 +7,7 @@ import HomeHeroIconsCard from './components/home/HomeHeroIconsCard.vue';
|
||||
import HomeHeroBefore from './components/home/HomeHeroBefore.vue';
|
||||
import { ICON_STYLE_CONTEXT, iconStyleContext } from './composables/useIconStyle';
|
||||
import { CATEGORY_VIEW_CONTEXT, categoryViewContext } from './composables/useCategoryView';
|
||||
import { EXTERNAL_LIBS_CONTEXT, externalLibContext } from './composables/useExternalLibs';
|
||||
|
||||
const theme: Partial<Theme> = {
|
||||
extends: DefaultTheme,
|
||||
@@ -20,6 +21,7 @@ const theme: Partial<Theme> = {
|
||||
enhanceApp({ app }) {
|
||||
app.provide(ICON_STYLE_CONTEXT, iconStyleContext);
|
||||
app.provide(CATEGORY_VIEW_CONTEXT, categoryViewContext);
|
||||
app.provide(EXTERNAL_LIBS_CONTEXT, externalLibContext);
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ import { useData } from 'vitepress'
|
||||
|
||||
import CategoryList from '../components/icons/CategoryList.vue'
|
||||
import SidebarIconCustomizer from '../components/icons/SidebarIconCustomizer.vue'
|
||||
import ExternalLibrarySelect from '../components/icons/SidebarExternalLibrarySelect.vue'
|
||||
|
||||
const { page } = useData()
|
||||
|
||||
@@ -11,6 +12,7 @@ const { page } = useData()
|
||||
<template>
|
||||
<div>
|
||||
<SidebarIconCustomizer v-if="page?.relativePath?.startsWith?.('icons')"/>
|
||||
<ExternalLibrarySelect v-if="page?.relativePath?.startsWith?.('icons')"/>
|
||||
<CategoryList v-if="page?.relativePath?.startsWith?.('icons')"/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -1,13 +1,18 @@
|
||||
export type IconNode = [elementName: string, attrs: Record<string, string>][];
|
||||
export type IconNodeWithKeys = [elementName: string, attrs: Record<string, string>, key: string][];
|
||||
|
||||
export interface IconEntity {
|
||||
name: string;
|
||||
export interface IconMetaData {
|
||||
tags: string[];
|
||||
categories: string[];
|
||||
contributors: string[];
|
||||
aliases?: string[];
|
||||
}
|
||||
|
||||
export type ExternalLibs = 'lab';
|
||||
export interface IconEntity extends IconMetaData {
|
||||
name: string;
|
||||
iconNode: IconNode;
|
||||
externalLibrary?: ExternalLibs;
|
||||
createdRelease?: Release;
|
||||
changedRelease?: Release;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,215 @@
|
||||
---
|
||||
title: Accessibility
|
||||
---
|
||||
|
||||
# Accessibility
|
||||
|
||||
<!-- Description how you should use svg icons keeping web accessible -->
|
||||
<!-- See @JanTrichter comment about some information to write this: https://github.com/lucide-icons/lucide/pull/1521#discussion_r1332141390 -->
|
||||
Icons are pictures that show what something means without using words. They can be very helpful
|
||||
because they can quickly give information.
|
||||
|
||||
However, not everyone can understand them easily. When using icons it is very important to consider
|
||||
the following aspects of accessibility.
|
||||
|
||||
## Provide visible labels
|
||||
|
||||
Icons are a helpful tool to improve perception, but they aren't a replacement for text.
|
||||
|
||||
In most cases, it is probably a good idea to also provide a textual representation of your icon's
|
||||
function.
|
||||
|
||||

|
||||
|
||||
## Contrast
|
||||
|
||||
Ensure there's enough contrast between the icon and its background so that it's visible to people
|
||||
with low vision or color vision deficiencies.
|
||||
|
||||
We recommend
|
||||
following [WCAG 2.1 SC 1.4.3](https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html).
|
||||
|
||||

|
||||
|
||||
## Use of color
|
||||
|
||||
Avoid relying solely on color to convey meaning in icons, as some users may have color blindness.
|
||||
Instead, use additional visual cues like shape, shading or text.
|
||||
|
||||

|
||||
|
||||
## Interactivity
|
||||
|
||||
Ensure that interactive icons are accessible via keyboard navigation and provide clear feedback when
|
||||
activated.
|
||||
|
||||

|
||||
|
||||
In most cases this is easily done by wrapping them in icon buttons.
|
||||
|
||||
## Minimum target size
|
||||
|
||||
Small targets can be difficult to click or touch, if your icon is interactive, we recommend that it
|
||||
should have a minimum target size of 44×44 pixels.
|
||||
|
||||

|
||||
|
||||
In practice, this doesn't necessarily mean that the icon itself should be this large, only its
|
||||
interactive wrapper element.
|
||||
|
||||
## Meaningfulness
|
||||
|
||||
Icons should represent concepts or actions in a universally understandable way. Avoid using abstract
|
||||
or ambiguous, or culture-specific symbols that might confuse some users.
|
||||
|
||||

|
||||
|
||||
## Consistency
|
||||
|
||||
Maintain consistency in icon design and usage across your interface to help users learn and
|
||||
understand their meanings more easily.
|
||||
|
||||

|
||||
|
||||
## Text Alternatives
|
||||
|
||||
You may have to provide text labels or alternative text descriptions for icons, especially for
|
||||
screen readers used by people with visual impairments.
|
||||
|
||||
However: descriptions should only be provided to standalone icons that aren't purely decorative, as
|
||||
providing accessible names to non-functional elements only increases clutter when using screen
|
||||
readers.
|
||||
|
||||
### On standalone icons
|
||||
|
||||
Icons are usually very unlikely to stand on their own with no semantically meaningful wrapper
|
||||
element. In most cases they will be part of a badge, button (including icon buttons), navigation
|
||||
item or other interactive UI element.
|
||||
|
||||
::: warning
|
||||
In case some of your icons stand alone, and they serve a non-decorative function, make sure to
|
||||
provide the appropriate accessible label for them.
|
||||
:::
|
||||
|
||||

|
||||
|
||||
In general try to avoid using functional icons with no interactivity, we recommend that:
|
||||
|
||||
1) you either add a visible description next to them, or
|
||||
2) place them in badges, labels or on buttons, and at least add a tooltip to them.
|
||||
|
||||
In any such case, it is preferred that the accessible name be provided for these interactive
|
||||
elements (badges, buttons, nav items etc.) only, _not_ the icons themselves.
|
||||
|
||||
### On buttons
|
||||
|
||||
Do not provide an accessible label to icons when used on a button, as this label will be read out by
|
||||
screen readers, leading to nonsensical text.
|
||||
|
||||

|
||||
|
||||
::: details Code examples
|
||||
|
||||
```tsx
|
||||
// Don't do this
|
||||
<button>
|
||||
<Plus aria-label="Plus icon"/>
|
||||
Add document
|
||||
</button>
|
||||
|
||||
// Do this, just leave it
|
||||
<button>
|
||||
<Plus/>
|
||||
Add document
|
||||
</button>
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
### On icon buttons
|
||||
|
||||
Icon buttons are buttons that do not contain any visible text apart from the icon itself (think of
|
||||
the close button of a dialog for example).
|
||||
|
||||
As previously stated, you should provide your accessible label on the icon button itself, not the
|
||||
contained icon.
|
||||
|
||||

|
||||
|
||||
::: details Code examples
|
||||
|
||||
```tsx
|
||||
// Don't do this
|
||||
<button class="btn-icon">
|
||||
<Home/>
|
||||
</button>
|
||||
|
||||
// Don't do this either
|
||||
<button class="btn-icon">
|
||||
<Home aria-label="Home icon"/>
|
||||
</button>
|
||||
|
||||
// This works but might not be the best solution, see below
|
||||
<button aria-label="Go to home" class="btn-icon">
|
||||
<Home/>
|
||||
</button>
|
||||
|
||||
// Do this instead
|
||||
<button class="btn-icon">
|
||||
<Home/>
|
||||
<span class="visually-hidden">Go to home</span>
|
||||
</button>
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
## A note on `aria-label`
|
||||
|
||||
Although you could provide accessible labels to your elements via the `aria-label` attribute, we
|
||||
generally recommend avoiding this and instead suggest that you use your chosen CSS framework's "
|
||||
visually hidden" utility whenever possible. You can
|
||||
[read more about why `aria-label` might not be the best solution](https://gomakethings.com/revisting-aria-label-versus-a-visually-hidden-class/).
|
||||
### Example - Radix UI
|
||||
|
||||
Use [Radix UI's built-in accessible icon utility component](https://www.radix-ui.com/primitives/docs/utilities/accessible-icon).
|
||||
|
||||
```tsx
|
||||
import { ArrowRightIcon } from 'lucide-react';
|
||||
import { AccessibleIcon } from '@radix-ui/react-accessible-icon';
|
||||
|
||||
<AccessibleIcon label="Next item">
|
||||
<ArrowRightIcon />
|
||||
</AccessibleIcon>
|
||||
```
|
||||
### Example - Bootstrap
|
||||
|
||||
```html
|
||||
|
||||
<div>
|
||||
<i data-lucide="phone" aria-hidden="true"></i>
|
||||
<span class="visually-hidden">Phone number</span>
|
||||
</div>
|
||||
```
|
||||
|
||||
### Example - Tailwind CSS
|
||||
|
||||
```html
|
||||
|
||||
<div>
|
||||
<i data-lucide="phone" aria-hidden="true"></i>
|
||||
<span class="sr-only">Phone number</span>
|
||||
</div>
|
||||
```
|
||||
|
||||
If you're not sure, you may consider learning more
|
||||
about [how to hide content.](https://www.a11yproject.com/posts/how-to-hide-content/)
|
||||
|
||||
## Further resources
|
||||
|
||||
We also recommend checking out the following resources about accessibility:
|
||||
|
||||
- [Web Content Accessibility Guidelines (WCAG) 2.1](https://www.w3.org/TR/WCAG21/)
|
||||
- [Web Accessibility Initiative (WAI)](https://www.w3.org/WAI/)
|
||||
- [Learn accessibility on web.dev](https://web.dev/learn/accessibility)
|
||||
- [Inclusive Components](https://inclusive-components.design/)
|
||||
- [A11yTalks](https://www.a11ytalks.com/)
|
||||
- [A11y automation tracker](https://a11y-automation.dev/)
|
||||
- [The A11Y Project](https://www.a11yproject.com/)
|
||||
|
||||
18
docs/guide/design/affinity-designer-guide.md
Normal file
@@ -0,0 +1,18 @@
|
||||
---
|
||||
title: Affinity Designer Template Guide
|
||||
---
|
||||
|
||||
# Affinity Designer Template Guide
|
||||
|
||||
This guide describes how to use the Affinity Designer template for Lucide.
|
||||
|
||||
## General Workflow
|
||||
|
||||
>Attention: By default, Affinity Designer sets the unit for stroke to points. Make sure that it is set to pixel. To do this, open `Preferences > User Interface`. Under `Decimal Places for Unit Types`, uncheck `Show Lines in points`.
|
||||
|
||||
1. Download and open the [Affinity Designer template](https://github.com/lucide-icons/lucide/blob/main/docs/public/templates/affinity_designer.aftemplate).
|
||||
2. Follow the [Icon Design Principles](icon-design-guide.md) while you use the template (to ensure integrity with the Lucide icon pack).
|
||||
3. Export the file as SVG (`File > Export`). Make sure that _Rastering_ is set to _Nothing_, _Export text as curves_ is checked (hopefully, you won't need this), _Use hex colors_ is checked, and _Flatten transforms_ is checked.
|
||||
|
||||

|
||||
4. Optimize the exported SVG file further with [SVGOMG](https://jakearchibald.github.io/svgomg/) or [`svgo`](https://github.com/svg/svgo) (using `svgo --multipass exported_icon.svg`).
|
||||
@@ -109,8 +109,8 @@ Here are rules that should be followed to keep quality and consistency when maki
|
||||
7. Icons depicting multiple elements (e.g. a person and a circle) of different sizes must list these elements in decreasing order of size.\
|
||||
For example: if the circle is bigger, it should be `circle-person`, if the person is bigger, it should be `person-circle`.
|
||||
|
||||
8. Icons depicting multiple elements of roughly equal sizes (e.g. a `ruler` and a `pencil`) must list these elements in English reading order.\
|
||||
For example: if the `pencil` is either above or left of `ruler`, it should be `pencil-ruler`, otherwise, it should be `ruler-pencil`.
|
||||
8. Icons depicting multiple elements of roughly equal sizes (e.g. a `ruler` and a `pencil`) must list these elements front to back in case one element is in front of the other, otherwise in English reading order (top to bottom, left to right).\
|
||||
For example: if the `pencil` is either in front of, above or left of `ruler`, it should be `pencil-ruler`, otherwise, it should be `ruler-pencil`.
|
||||
|
||||
9. Icons depicting some sort of variation of an element must use the `[element]-[modifier]` naming scheme, with modifiers being applied to each element respectively.\
|
||||
For example: a dashed circle must be named `circle-dashed`, not `dashed-circle`, and in coordination with the previous guidelines, a dashed circle containing a broken heart would be named `circle-dashed-heart-broken`, due to the heart being smaller than the circle.
|
||||
|
||||
@@ -20,6 +20,12 @@ As new applications with specific features arise, Lucide aims to provide a compl
|
||||
|
||||
In addition to design, code is also important. Assets like icons can significantly increase bandwidth usage in web projects. With the growing internet, Lucide has a responsibility to keep their assets as small as possible. To achieve this, Lucide uses SVG compression and specific code architecture for tree-shaking abilities. After tree-shaking, you only ship the icons you used, which helps to keep software distribution size to a minimum.
|
||||
|
||||
## Accessibility
|
||||
|
||||
Icons are pictures that show what something means without using words. They can be very helpful because they can quickly give information.
|
||||
|
||||
However, not everyone can understand them easily. Read more about [how to use Lucide in an accessible way](./advanced/accessibility.md).
|
||||
|
||||
## Official Packages
|
||||
|
||||
Lucide's official packages are designed to work on different platforms, making it easier for users to integrate icons into their projects. The packages are available for various technologies, including [Web (Vanilla)](https://lucide.dev/guide/packages/lucide), [React](https://lucide.dev/guide/packages/lucide-react), [React Native](https://lucide.dev/guide/packages/lucide-react-native), [Vue](https://lucide.dev/guide/packages/lucide-vue), [Vue 3](https://lucide.dev/guide/packages/lucide-vue-next), [Svelte](https://lucide.dev/guide/packages/lucide-svelte),[Preact](https://lucide.dev/guide/packages/lucide-preact), [Solid](https://lucide.dev/guide/packages/lucide-solid), [Angular](https://lucide.dev/guide/packages/lucide-angular), [NodeJS](https://lucide.dev/guide/packages/lucide-static#nodejs) and [Flutter](https://lucide.dev/guide/packages/lucide-flutter).
|
||||
|
||||
@@ -115,3 +115,20 @@ import { icons } from 'lucide-angular';
|
||||
|
||||
LucideAngularModule.pick(icons)
|
||||
```
|
||||
|
||||
## With Lucide lab or custom icons
|
||||
|
||||
[Lucide lab](https://github.com/lucide-icons/lucide-lab) is a collection of icons that are not part of the Lucide main library.
|
||||
They can be used in the same way as the official icons.
|
||||
|
||||
```js
|
||||
import { LucideAngularModule } from 'lucide-angular';
|
||||
import { burger } from '@lucide/lab';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
LucideAngularModule.pick({ burger })
|
||||
]
|
||||
})
|
||||
export class AppModule { }
|
||||
```
|
||||
|
||||
@@ -67,6 +67,26 @@ const App = () => {
|
||||
|
||||
> SVG attributes in Preact aren't transformed, so if you want to change for example the `stroke-linejoin` you need to pass it in kebabcase. Basically how the SVG spec want you to write it. See this topic in the [Preact documentation](https://preactjs.com/guide/v10/differences-to-react/#svg-inside-jsx).
|
||||
|
||||
## With Lucide lab or custom icons
|
||||
|
||||
[Lucide lab](https://github.com/lucide-icons/lucide-lab) is a collection of icons that are not part of the Lucide main library.
|
||||
|
||||
They can be used by using the `Icon` component.
|
||||
All props like regular lucide icons can be passed to adjust the icon appearance.
|
||||
|
||||
### Using the `Icon` component
|
||||
|
||||
This creates a single icon based on the iconNode passed and renders a Lucide icon component.
|
||||
|
||||
```jsx
|
||||
import { Icon } from 'lucide-preact';
|
||||
import { burger } from '@lucide/lab';
|
||||
|
||||
const App = () => (
|
||||
<Icon iconNode={burger} />
|
||||
);
|
||||
```
|
||||
|
||||
## One generic icon component
|
||||
|
||||
It is possible to create one generic icon component to load icons, but it is not recommended.
|
||||
|
||||
@@ -61,6 +61,26 @@ const App = () => {
|
||||
};
|
||||
```
|
||||
|
||||
## With Lucide lab or custom icons
|
||||
|
||||
[Lucide lab](https://github.com/lucide-icons/lucide-lab) is a collection of icons that are not part of the Lucide main library.
|
||||
|
||||
They can be used by using the `Icon` component.
|
||||
All props like regular lucide icons can be passed to adjust the icon appearance.
|
||||
|
||||
### Using the `Icon` component
|
||||
|
||||
This creates a single icon based on the iconNode passed and renders a Lucide icon component.
|
||||
|
||||
```jsx
|
||||
import { Icon } from 'lucide-react-native';
|
||||
import { burger } from '@lucide/lab';
|
||||
|
||||
const App = () => (
|
||||
<Icon iconNode={burger} />
|
||||
);
|
||||
```
|
||||
|
||||
## One generic icon component
|
||||
|
||||
It is possible to create one generic icon component to load icons, but it is not recommended.
|
||||
|
||||
@@ -61,6 +61,26 @@ const App = () => {
|
||||
};
|
||||
```
|
||||
|
||||
## With Lucide lab or custom icons
|
||||
|
||||
[Lucide lab](https://github.com/lucide-icons/lucide-lab) is a collection of icons that are not part of the Lucide main library.
|
||||
|
||||
They can be used by using the `Icon` component.
|
||||
All props like regular lucide icons can be passed to adjust the icon appearance.
|
||||
|
||||
### Using the `Icon` component
|
||||
|
||||
This creates a single icon based on the iconNode passed and renders a Lucide icon component.
|
||||
|
||||
```jsx
|
||||
import { Icon } from 'lucide-react';
|
||||
import { burger } from '@lucide/lab';
|
||||
|
||||
const App = () => (
|
||||
<Icon iconNode={burger} />
|
||||
);
|
||||
```
|
||||
|
||||
## One generic icon component
|
||||
|
||||
It is possible to create one generic icon component to load icons, but it is not recommended.
|
||||
|
||||
@@ -61,6 +61,26 @@ const App = () => {
|
||||
};
|
||||
```
|
||||
|
||||
## With Lucide lab or custom icons
|
||||
|
||||
[Lucide lab](https://github.com/lucide-icons/lucide-lab) is a collection of icons that are not part of the Lucide main library.
|
||||
|
||||
They can be used by using the `Icon` component.
|
||||
All props like the regular Lucide icons can be passed to adjust the icon appearance.
|
||||
|
||||
### Using the `Icon` component
|
||||
|
||||
This creates a single icon based on the iconNode passed and renders a Lucide icon component.
|
||||
|
||||
```jsx
|
||||
import { Icon } from 'lucide-solid';
|
||||
import { burger, sausage } from '@lucide/lab';
|
||||
|
||||
const App = () => (
|
||||
<Icon iconNode={sausage} color="red"/>
|
||||
);
|
||||
```
|
||||
|
||||
## One generic icon component
|
||||
|
||||
It is possible to create one generic icon component to load icons. It's not recommended.
|
||||
|
||||
@@ -143,7 +143,7 @@ and update the SVG as follows
|
||||
### Icon Font
|
||||
|
||||
```css
|
||||
@import ('~lucide-static/font/Lucide.css');
|
||||
@import ('~lucide-static/font/lucide.css');
|
||||
```
|
||||
|
||||
```html
|
||||
|
||||
@@ -166,6 +166,27 @@ The package includes type definitions for all icons. This is useful if you want
|
||||
|
||||
For more details about typing the `svelte:component` directive, see the [Svelte documentation](https://svelte.dev/docs/typescript#types-componenttype).
|
||||
|
||||
## With Lucide lab or custom icons
|
||||
|
||||
[Lucide lab](https://github.com/lucide-icons/lucide-lab) is a collection of icons that are not part of the Lucide main library.
|
||||
|
||||
They can be used by using the `Icon` component.
|
||||
All props like the regular Lucide icons can be passed to adjust the icon appearance.
|
||||
|
||||
### Using the `Icon` component
|
||||
|
||||
This creates a single icon based on the iconNode passed and renders a Lucide icon component.
|
||||
|
||||
```svelte
|
||||
<script>
|
||||
import { Icon } from 'lucide-svelte';
|
||||
import { burger, sausage } from '@lucide/lab';
|
||||
</script>
|
||||
|
||||
<Icon iconNode={burger} />
|
||||
<Icon iconNode={sausage} color="red"/>
|
||||
```
|
||||
|
||||
## One generic icon component
|
||||
|
||||
It is possible to create one generic icon component to load icons, but it is not recommended.
|
||||
|
||||
@@ -37,16 +37,16 @@ Each icon can be imported as a Vue component, which renders an inline SVG Elemen
|
||||
You can pass additional props to adjust the icon.
|
||||
|
||||
```vue
|
||||
<script setup>
|
||||
import { Camera } from 'lucide-vue-next';
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<Camera
|
||||
color="red"
|
||||
:size="32"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { Camera } from 'lucide-vue-next';
|
||||
</script>
|
||||
```
|
||||
|
||||
## Props
|
||||
@@ -69,6 +69,28 @@ To customize the appearance of an icon, you can pass custom properties as props
|
||||
</template>
|
||||
```
|
||||
|
||||
## With Lucide lab or custom icons
|
||||
|
||||
[Lucide lab](https://github.com/lucide-icons/lucide-lab) is a collection of icons that are not part of the Lucide main library.
|
||||
|
||||
They can be used by using the `Icon` component.
|
||||
All props like regular lucide icons can be passed to adjust the icon appearance.
|
||||
|
||||
### Using the `Icon` component
|
||||
|
||||
This creates a single icon based on the iconNode passed and renders a Lucide icon component.
|
||||
|
||||
```vue
|
||||
<script setup>
|
||||
import { Icon } from 'lucide-vue-next';
|
||||
import { burger } from '@lucide/lab';
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<Icon :iconNode="burger" />
|
||||
</template>
|
||||
```
|
||||
|
||||
## One generic icon component
|
||||
|
||||
It is possible to create one generic icon component to load icons, but it is not recommended.
|
||||
|
||||
@@ -130,3 +130,18 @@ menuIcon.classList.add('my-icon-class');
|
||||
const myApp = document.getElementById('app');
|
||||
myApp.appendChild(menuIcon);
|
||||
```
|
||||
|
||||
### With Lucide lab or custom icons
|
||||
|
||||
[Lucide lab](https://github.com/lucide-icons/lucide-lab) is a collection of icons that are not part of the Lucide main library.
|
||||
They can be used in the same way as the official icons.
|
||||
|
||||
```js
|
||||
import { burger } from '@lucide/lab';
|
||||
|
||||
createIcons({
|
||||
icons: {
|
||||
burger
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
@@ -10,14 +10,14 @@ sidebar: true
|
||||
<script setup>
|
||||
import { computed } from 'vue'
|
||||
import { useData } from 'vitepress'
|
||||
import IconPreview from '../.vitepress/theme/components/icons/IconPreview.vue'
|
||||
import IconPreviewSmall from '../.vitepress/theme/components/icons/IconPreviewSmall.vue'
|
||||
import IconInfo from '../.vitepress/theme/components/icons/IconInfo.vue'
|
||||
import IconContributors from '../.vitepress/theme/components/icons/IconContributors.vue'
|
||||
import RelatedIcons from '../.vitepress/theme/components/icons/RelatedIcons.vue'
|
||||
import CodeGroup from '../.vitepress/theme/components/base/CodeGroup.vue'
|
||||
import Badge from '../.vitepress/theme/components/base/Badge.vue'
|
||||
import Label from '../.vitepress/theme/components/base/Label.vue'
|
||||
import IconPreview from '~/.vitepress/theme/components/icons/IconPreview.vue'
|
||||
import IconPreviewSmall from '~/.vitepress/theme/components/icons/IconPreviewSmall.vue'
|
||||
import IconInfo from '~/.vitepress/theme/components/icons/IconInfo.vue'
|
||||
import IconContributors from '~/.vitepress/theme/components/icons/IconContributors.vue'
|
||||
import RelatedIcons from '~/.vitepress/theme/components/icons/RelatedIcons.vue'
|
||||
import CodeGroup from '~/.vitepress/theme/components/base/CodeGroup.vue'
|
||||
import Badge from '~/.vitepress/theme/components/base/Badge.vue'
|
||||
import Label from '~/.vitepress/theme/components/base/Label.vue'
|
||||
import VPButton from 'vitepress/dist/client/theme-default/components/VPButton.vue';
|
||||
import { data } from './codeExamples.data'
|
||||
import { camelCase, startCase } from 'lodash-es'
|
||||
@@ -31,8 +31,13 @@ const tabs = computed(() => data.codeExamples?.map(
|
||||
|
||||
const codeExample = computed(() => data.codeExamples?.map(
|
||||
(codeExample) => {
|
||||
const pascalCase = startCase(camelCase( params.value.name)).replace(/\s/g, '')
|
||||
return codeExample.code.replace(/PascalCase/g, pascalCase).replace(/Name/g, params.value.name)
|
||||
const pascalCaseName = startCase(camelCase( params.value.name)).replace(/\s/g, '')
|
||||
const camelCaseName = camelCase(params.value.name)
|
||||
|
||||
return codeExample.code
|
||||
.replace(/\$(?:<[^>]+>)*PascalCase/g, pascalCaseName)
|
||||
.replace(/\$CamelCase/g, camelCaseName)
|
||||
.replace(/\$Name/g, params.value.name)
|
||||
}
|
||||
).join('') ?? []
|
||||
)
|
||||
@@ -69,8 +74,6 @@ function releaseTagLink(version) {
|
||||
<Label>Created:</Label>
|
||||
<Badge
|
||||
:href="releaseTagLink(params.createdRelease.version)"
|
||||
target="_blank"
|
||||
rel="noreferrer noopener"
|
||||
>
|
||||
v{{params.createdRelease.version}}
|
||||
</Badge>
|
||||
@@ -82,8 +85,6 @@ function releaseTagLink(version) {
|
||||
<Label>Last changed:</Label>
|
||||
<Badge
|
||||
:href="releaseTagLink(params.changedRelease.version)"
|
||||
target="_blank"
|
||||
rel="noreferrer noopener"
|
||||
>
|
||||
v{{params.changedRelease.version}}
|
||||
</Badge>
|
||||
@@ -104,7 +105,10 @@ function releaseTagLink(version) {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<RelatedIcons :icons="params.relatedIcons" />
|
||||
<RelatedIcons
|
||||
v-if="params.relatedIcons"
|
||||
:icons="params.relatedIcons"
|
||||
/>
|
||||
|
||||
<style module>
|
||||
.preview {
|
||||
|
||||
@@ -10,13 +10,16 @@ import { data } from './icons.data.ts'
|
||||
import { data as categoriesData } from './categories.data.ts'
|
||||
import PageContainer from '../.vitepress/theme/components/PageContainer.vue'
|
||||
import IconsCategoryOverview from '../.vitepress/theme/components/icons/IconsCategoryOverview.vue'
|
||||
import useIconsWithExternalLibs from '~/.vitepress/theme/composables/useIconsWithExternalLibs'
|
||||
|
||||
const icons = useIconsWithExternalLibs(data.icons)
|
||||
</script>
|
||||
|
||||
<div class="VPDoc content">
|
||||
<PageContainer>
|
||||
<IconsCategoryOverview
|
||||
:categories="categoriesData.categories"
|
||||
:icons="data.icons"
|
||||
:icons="icons"
|
||||
:iconCategories="categoriesData.iconCategories"
|
||||
/>
|
||||
</PageContainer>
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
import createCodeExamples from '../.vitepress/lib/createCodeExamples';
|
||||
import createCodeExamples from '../.vitepress/lib/codeExamples/createCodeExamples';
|
||||
|
||||
export default {
|
||||
async load() {
|
||||
const codeExamples = await createCodeExamples();
|
||||
|
||||
// const randomIcons = Array.from({ length: 200 }, () => getRandomItem(icons))
|
||||
|
||||
return {
|
||||
codeExamples,
|
||||
};
|
||||
|
||||
@@ -10,13 +10,17 @@ head:
|
||||
---
|
||||
|
||||
<script setup>
|
||||
import { computed } from 'vue'
|
||||
import { data } from './icons.data.ts'
|
||||
import IconsOverview from '../.vitepress/theme/components/icons/IconsOverview.vue'
|
||||
import PageContainer from '../.vitepress/theme/components/PageContainer.vue'
|
||||
import IconsOverview from '~/.vitepress/theme/components/icons/IconsOverview.vue'
|
||||
import PageContainer from '~/.vitepress/theme/components/PageContainer.vue'
|
||||
import useIconsWithExternalLibs from '~/.vitepress/theme/composables/useIconsWithExternalLibs'
|
||||
|
||||
const icons = useIconsWithExternalLibs(data.icons)
|
||||
</script>
|
||||
|
||||
<div class="VPDoc content">
|
||||
<PageContainer>
|
||||
<IconsOverview :icons="data.icons" />
|
||||
<IconsOverview :icons="icons" />
|
||||
</PageContainer>
|
||||
</div>
|
||||
|
||||
10
docs/icons/lab/[name].md
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
layout: doc
|
||||
footer: false
|
||||
aside: false
|
||||
editLink: false
|
||||
next: false
|
||||
prev: false
|
||||
sidebar: true
|
||||
---
|
||||
<!--@include: ../[name].md -->
|
||||
19
docs/icons/lab/[name].paths.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
import { IconEntity } from '../../.vitepress/theme/types';
|
||||
|
||||
export default {
|
||||
paths: async () => {
|
||||
const iconDetailsResponse = await fetch('https://lab.lucide.dev/api/icon-details');
|
||||
const iconDetails = (await iconDetailsResponse.json()) as Record<string, IconEntity>;
|
||||
|
||||
return Object.values(iconDetails).map((iconEntity) => {
|
||||
const params = {
|
||||
externalLibrary: 'lab',
|
||||
...iconEntity,
|
||||
};
|
||||
|
||||
return {
|
||||
params,
|
||||
};
|
||||
});
|
||||
},
|
||||
};
|
||||
11
docs/icons/lab/codeExamples.data.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
import createCodeExamples from '../../.vitepress/lib/codeExamples/createLabCodeExamples';
|
||||
|
||||
export default {
|
||||
async load() {
|
||||
const codeExamples = await createCodeExamples();
|
||||
|
||||
return {
|
||||
codeExamples,
|
||||
};
|
||||
},
|
||||
};
|
||||
41
docs/images/a11y/alttext-buttons.svg
Normal file
|
After Width: | Height: | Size: 112 KiB |
41
docs/images/a11y/alttext-iconbuttons.svg
Normal file
|
After Width: | Height: | Size: 101 KiB |
91
docs/images/a11y/alttext-standalone.svg
Normal file
|
After Width: | Height: | Size: 244 KiB |
37
docs/images/a11y/consistency.svg
Normal file
|
After Width: | Height: | Size: 209 KiB |
15
docs/images/a11y/contrast.svg
Normal file
|
After Width: | Height: | Size: 50 KiB |
18
docs/images/a11y/interactivity.svg
Normal file
|
After Width: | Height: | Size: 118 KiB |
43
docs/images/a11y/meaningfulness.svg
Normal file
|
After Width: | Height: | Size: 239 KiB |
48
docs/images/a11y/target-size.svg
Normal file
|
After Width: | Height: | Size: 76 KiB |
92
docs/images/a11y/use-of-color.svg
Normal file
|
After Width: | Height: | Size: 142 KiB |
17
docs/images/a11y/visible-labels.svg
Normal file
|
After Width: | Height: | Size: 108 KiB |
BIN
docs/images/affinity-designer-export-options.png
Normal file
|
After Width: | Height: | Size: 169 KiB |
@@ -9,12 +9,13 @@
|
||||
"docs:build": "pnpm run /^prebuild:.*/ && vitepress build",
|
||||
"docs:preview": "vitepress preview",
|
||||
"build:docs": "vitepress build",
|
||||
"prebuild:iconNodes": "node ../scripts/writeIconNodes.mjs",
|
||||
"prebuild:metaJson": "node ../scripts/writeIconMetaIndex.mjs",
|
||||
"prebuild:releaseJson": "node ../scripts/writeReleaseMetadata.mjs",
|
||||
"prebuild:relatedIcons": "node ../scripts/writeIconRelatedIcons.mjs",
|
||||
"prebuild:iconDetails": "node ../scripts/writeIconDetails.mjs",
|
||||
"postbuild:vercelJson": "node ../scripts/writeVercelOutput.mjs",
|
||||
"prebuild:iconNodes": "node ./scripts/writeIconNodes.mjs",
|
||||
"prebuild:metaJson": "node ./scripts/writeIconMetaIndex.mjs",
|
||||
"prebuild:releaseJson": "node ./scripts/writeReleaseMetadata.mjs",
|
||||
"prebuild:categoriesJson": "node ./scripts/writeCategoriesMetadata.mjs",
|
||||
"prebuild:relatedIcons": "node ./scripts/writeIconRelatedIcons.mjs",
|
||||
"prebuild:iconDetails": "node ./scripts/writeIconDetails.mjs",
|
||||
"postbuild:vercelJson": "node ./scripts/writeVercelOutput.mjs",
|
||||
"dev": "npx nitropack dev",
|
||||
"prebuild:api": "npx nitropack prepare",
|
||||
"build:api": "npx nitropack build",
|
||||
@@ -24,6 +25,9 @@
|
||||
"author": "Eric Fennis",
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"@lucide/build-icons": "workspace:*",
|
||||
"@lucide/helpers": "workspace:*",
|
||||
"@lucide/shared": "workspace:*",
|
||||
"@rollup/plugin-replace": "^5.0.2",
|
||||
"@types/semver": "^7.5.3",
|
||||
"h3": "^1.8.0",
|
||||
@@ -40,7 +44,6 @@
|
||||
"@vueuse/core": "^10.7.2",
|
||||
"element-to-path": "^1.2.1",
|
||||
"fuse.js": "^6.5.3",
|
||||
"js-yaml": "^4.1.0",
|
||||
"jszip": "^3.7.0",
|
||||
"lodash": "^4.17.20",
|
||||
"lodash-es": "^4.17.21",
|
||||
|
||||
10
docs/public/lucide-logo-repo-dark.svg
Normal file
@@ -0,0 +1,10 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 79 22">
|
||||
<path fill="#fff" d="M74.2 17.17a4.5 4.5 0 0 1-2.27-.55 3.7 3.7 0 0 1-1.46-1.55 5.21 5.21 0 0 1-.5-2.38c0-.9.16-1.69.5-2.37a3.87 3.87 0 0 1 3.62-2.16c.54 0 1.05.09 1.53.26s.9.44 1.27.8c.37.36.66.81.87 1.37.22.55.32 1.21.32 1.98v.63h-7.15V11.8h5.18c0-.4-.09-.74-.25-1.05-.17-.3-.4-.55-.7-.73-.3-.18-.64-.27-1.04-.27a2 2 0 0 0-1.1.3c-.32.2-.57.47-.75.8-.17.33-.26.69-.27 1.08v1.2c0 .52.1.95.28 1.31.19.36.45.64.78.83.33.2.72.29 1.17.29.3 0 .57-.04.81-.13.25-.08.46-.21.63-.38.18-.16.32-.37.4-.62l1.93.22a3 3 0 0 1-.7 1.33c-.33.37-.76.67-1.3.87-.52.2-1.12.31-1.8.31Z"/>
|
||||
<path fill="#fff" d="M63.5 17.15a3.3 3.3 0 0 1-3.13-2.06 5.73 5.73 0 0 1-.47-2.44c0-.97.16-1.79.48-2.46a3.34 3.34 0 0 1 4.39-1.77c.33.17.59.38.78.62.2.24.34.46.45.68h.08V5.36h2.07V17h-2.03v-1.38H66c-.1.22-.26.44-.46.68a2.53 2.53 0 0 1-2.04.85Zm.57-1.68c.44 0 .8-.12 1.12-.36.3-.23.54-.57.7-1 .15-.41.23-.9.23-1.47s-.08-1.06-.24-1.48a2.1 2.1 0 0 0-.69-.97 1.8 1.8 0 0 0-1.12-.34c-.46 0-.84.12-1.15.35-.3.24-.53.57-.69 1-.15.41-.23.9-.23 1.44 0 .54.08 1.03.23 1.46.16.42.4.76.7 1 .31.24.7.37 1.14.37Z"/>
|
||||
<path fill="#fff" d="M56.09 17V8.27h2.05V17H56.1Zm1.03-9.97c-.32 0-.6-.1-.84-.32a1.04 1.04 0 0 1-.35-.79c0-.31.12-.57.35-.79.24-.22.52-.33.84-.33.33 0 .61.11.84.33.24.22.36.48.36.79 0 .3-.12.57-.36.79-.23.22-.5.32-.84.32Z"/>
|
||||
<path fill="#fff" d="M50.66 17.17a3.83 3.83 0 0 1-3.68-2.16 5.24 5.24 0 0 1-.5-2.34c0-.89.17-1.67.51-2.35.34-.68.82-1.2 1.44-1.59a4.16 4.16 0 0 1 2.22-.57c.7 0 1.33.13 1.88.4a3.21 3.21 0 0 1 1.87 2.74h-1.97a1.88 1.88 0 0 0-.56-1.06c-.3-.28-.7-.42-1.2-.42-.41 0-.78.11-1.1.34-.32.22-.57.54-.74.96-.18.43-.27.93-.27 1.52 0 .6.1 1.1.27 1.53.17.42.41.75.73.98.32.23.69.34 1.12.34.3 0 .57-.05.81-.17.24-.11.45-.28.6-.5.17-.22.28-.49.34-.8h1.97a3.23 3.23 0 0 1-1.83 2.76 4.3 4.3 0 0 1-1.9.39Z"/>
|
||||
<path fill="#fff" d="M42.68 13.33V8.27h2.06V17h-2v-1.55h-.09c-.2.49-.52.89-.97 1.2-.45.3-1 .46-1.65.46a2.65 2.65 0 0 1-2.54-1.5 3.95 3.95 0 0 1-.37-1.78V8.27h2.06v5.24c0 .55.15 1 .45 1.32.3.33.7.49 1.2.49a1.89 1.89 0 0 0 1.57-.88c.19-.3.28-.67.28-1.11Z"/>
|
||||
<path fill="#fff" d="M28.15 17V5.36h2.1v9.87h5.13V17h-7.23Z"/>
|
||||
<path stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 11a4 4 0 0 0-8 0 8 8 0 0 0 16 0c0-3.55-1.55-6.75-4-8.94"/>
|
||||
<path stroke="#F56565" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 11a4 4 0 0 0 8 0 8 8 0 1 0-16 0c0 3.58 1.57 6.8 4.06 9"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.4 KiB |
@@ -1,9 +1,10 @@
|
||||
<svg width="98" height="32" viewBox="0 0 98 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="98" height="32" rx="5" fill="white"/>
|
||||
<svg height="24" width="82" y="4" x="8" viewBox="0 0 82 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M28.52 5.4h2.14v10.84h5.28V18h-7.42V5.4zm15.24 3.16h2.06V18h-1.58l-.26-1.14h-.08a5.26 5.26 0 01-1.26.94c-.507.267-1.12.4-1.84.4-1 0-1.8-.28-2.4-.84-.6-.56-.9-1.4-.9-2.52V8.56h2.06v6.06c0 .733.166 1.247.5 1.54.346.293.76.44 1.24.44.52 0 .98-.107 1.38-.32.4-.227.76-.52 1.08-.88V8.56zm9.297 8.08c.427 0 .8-.047 1.12-.14.334-.107.633-.227.9-.36l.42 1.48a4.7 4.7 0 01-1.16.42 6.55 6.55 0 01-1.5.16c-.693 0-1.347-.1-1.96-.3a4.782 4.782 0 01-1.58-.92 4.593 4.593 0 01-1.06-1.54c-.253-.613-.38-1.327-.38-2.14 0-.747.12-1.42.36-2.02.24-.613.58-1.133 1.02-1.56.44-.427.967-.753 1.58-.98a5.786 5.786 0 012.02-.34c.413 0 .827.033 1.24.1.427.067.894.22 1.4.46l-.46 1.5a3.995 3.995 0 00-1.96-.52c-.92 0-1.666.287-2.24.86-.573.573-.86 1.387-.86 2.44 0 .64.087 1.18.26 1.62.187.427.427.773.72 1.04.294.267.62.46.98.58.373.107.753.16 1.14.16zM57.211 18V8.56h2.06V18h-2.06zm1.04-11.78c-.36 0-.646-.107-.86-.32a1.18 1.18 0 01-.32-.84c0-.333.107-.607.32-.82.214-.227.5-.34.86-.34.347 0 .627.113.84.34.227.213.34.487.34.82 0 .347-.113.627-.34.84-.213.213-.493.32-.84.32zM68.33 3.78h2.06V18h-1.62l-.24-1.04h-.08c-.347.4-.734.707-1.16.92-.427.213-.98.32-1.66.32-.534 0-1.047-.1-1.54-.3a3.997 3.997 0 01-1.3-.94c-.374-.413-.674-.927-.9-1.54-.227-.613-.34-1.32-.34-2.12 0-.747.093-1.42.28-2.02.2-.6.48-1.113.84-1.54a3.71 3.71 0 011.36-.98c.533-.24 1.14-.36 1.82-.36.466 0 .92.073 1.36.22.44.147.813.353 1.12.62V3.78zm0 7.12c-.56-.64-1.234-.96-2.02-.96-.347 0-.68.06-1 .18-.32.12-.607.313-.86.58a2.834 2.834 0 00-.6 1.02c-.147.413-.22.92-.22 1.52s.066 1.113.2 1.54c.146.427.333.78.56 1.06.226.28.486.487.78.62.306.12.62.18.94.18.48 0 .9-.107 1.26-.32a2.93 2.93 0 00.96-.9V10.9zm12.858 2.74h-6.62v.08c0 .96.28 1.687.84 2.18.56.493 1.3.74 2.22.74.507 0 .96-.04 1.36-.12a6.47 6.47 0 001.24-.42l.4 1.5a6.51 6.51 0 01-1.38.42c-.533.12-1.12.18-1.76.18-.68 0-1.327-.093-1.94-.28a4.449 4.449 0 01-1.62-.88 4.253 4.253 0 01-1.08-1.52c-.267-.613-.4-1.347-.4-2.2 0-.733.107-1.4.32-2a4.56 4.56 0 01.94-1.56c.413-.44.907-.773 1.48-1a5.077 5.077 0 011.94-.36c.613 0 1.167.1 1.66.3.507.2.933.487 1.28.86.36.36.633.807.82 1.34.2.52.3 1.1.3 1.74v1zm-2.12-1.44c0-.32-.04-.62-.12-.9-.08-.28-.2-.52-.36-.72a1.605 1.605 0 00-.64-.5c-.253-.133-.56-.2-.92-.2-.667 0-1.213.213-1.64.64-.413.427-.667 1-.76 1.72l4.44-.04z" fill="#2D3748"/>
|
||||
<path d="M14 12a4 4 0 00-8 0 8 8 0 1016 0 11.97 11.97 0 00-4-8.944" stroke="#2D3748" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M10 12a4 4 0 008 0 8 8 0 10-16 0c0 3.584 1.571 6.801 4.063 9" stroke="#F56565" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 79 22">
|
||||
<path fill="#1B1B1F" d="M74.2 17.17a4.5 4.5 0 0 1-2.27-.55 3.7 3.7 0 0 1-1.46-1.55 5.21 5.21 0 0 1-.5-2.38c0-.9.16-1.69.5-2.37a3.87 3.87 0 0 1 3.62-2.16c.54 0 1.05.09 1.53.26s.9.44 1.27.8c.37.36.66.81.87 1.37.22.55.32 1.21.32 1.98v.63h-7.15V11.8h5.18c0-.4-.09-.74-.25-1.05-.17-.3-.4-.55-.7-.73-.3-.18-.64-.27-1.04-.27a2 2 0 0 0-1.1.3c-.32.2-.57.47-.75.8-.17.33-.26.69-.27 1.08v1.2c0 .52.1.95.28 1.31.19.36.45.64.78.83.33.2.72.29 1.17.29.3 0 .57-.04.81-.13.25-.08.46-.21.63-.38.18-.16.32-.37.4-.62l1.93.22a3 3 0 0 1-.7 1.33c-.33.37-.76.67-1.3.87-.52.2-1.12.31-1.8.31Z"/>
|
||||
<path fill="#1B1B1F" d="M63.5 17.15a3.3 3.3 0 0 1-3.13-2.06 5.73 5.73 0 0 1-.47-2.44c0-.97.16-1.79.48-2.46a3.34 3.34 0 0 1 4.39-1.77c.33.17.59.38.78.62.2.24.34.46.45.68h.08V5.36h2.07V17h-2.03v-1.38H66c-.1.22-.26.44-.46.68a2.53 2.53 0 0 1-2.04.85Zm.57-1.68c.44 0 .8-.12 1.12-.36.3-.23.54-.57.7-1 .15-.41.23-.9.23-1.47s-.08-1.06-.24-1.48a2.1 2.1 0 0 0-.69-.97 1.8 1.8 0 0 0-1.12-.34c-.46 0-.84.12-1.15.35-.3.24-.53.57-.69 1-.15.41-.23.9-.23 1.44 0 .54.08 1.03.23 1.46.16.42.4.76.7 1 .31.24.7.37 1.14.37Z"/>
|
||||
<path fill="#1B1B1F" d="M56.09 17V8.27h2.05V17H56.1Zm1.03-9.97c-.32 0-.6-.1-.84-.32a1.04 1.04 0 0 1-.35-.79c0-.31.12-.57.35-.79.24-.22.52-.33.84-.33.33 0 .61.11.84.33.24.22.36.48.36.79 0 .3-.12.57-.36.79-.23.22-.5.32-.84.32Z"/>
|
||||
<path fill="#1B1B1F" d="M50.66 17.17a3.83 3.83 0 0 1-3.68-2.16 5.24 5.24 0 0 1-.5-2.34c0-.89.17-1.67.51-2.35.34-.68.82-1.2 1.44-1.59a4.16 4.16 0 0 1 2.22-.57c.7 0 1.33.13 1.88.4a3.21 3.21 0 0 1 1.87 2.74h-1.97a1.88 1.88 0 0 0-.56-1.06c-.3-.28-.7-.42-1.2-.42-.41 0-.78.11-1.1.34-.32.22-.57.54-.74.96-.18.43-.27.93-.27 1.52 0 .6.1 1.1.27 1.53.17.42.41.75.73.98.32.23.69.34 1.12.34.3 0 .57-.05.81-.17.24-.11.45-.28.6-.5.17-.22.28-.49.34-.8h1.97a3.23 3.23 0 0 1-1.83 2.76 4.3 4.3 0 0 1-1.9.39Z"/>
|
||||
<path fill="#1B1B1F" d="M42.68 13.33V8.27h2.06V17h-2v-1.55h-.09c-.2.49-.52.89-.97 1.2-.45.3-1 .46-1.65.46a2.65 2.65 0 0 1-2.54-1.5 3.95 3.95 0 0 1-.37-1.78V8.27h2.06v5.24c0 .55.15 1 .45 1.32.3.33.7.49 1.2.49a1.89 1.89 0 0 0 1.57-.88c.19-.3.28-.67.28-1.11Z"/>
|
||||
<path fill="#1B1B1F" d="M28.15 17V5.36h2.1v9.87h5.13V17h-7.23Z"/>
|
||||
<path stroke="#1B1B1F" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 11a4 4 0 0 0-8 0 8 8 0 0 0 16 0c0-3.55-1.55-6.75-4-8.94"/>
|
||||
<path stroke="#F56565" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 11a4 4 0 0 0 8 0 8 8 0 1 0-16 0c0 3.58 1.57 6.8 4.06 9"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 6.5 KiB |
27
docs/public/package-logos/dark/lucide-angular.svg
Normal file
@@ -0,0 +1,27 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 118 22">
|
||||
<path fill="#fff" d="M74.202 17.17c-.875 0-1.63-.181-2.267-.545a3.694 3.694 0 0 1-1.46-1.557c-.341-.674-.512-1.468-.512-2.38 0-.898.17-1.686.512-2.364a3.867 3.867 0 0 1 1.443-1.591c.617-.383 1.342-.574 2.176-.574.538 0 1.045.087 1.523.261.48.17.905.436 1.272.796.371.36.663.818.875 1.375.212.553.319 1.212.319 1.977v.63h-7.154v-1.386h5.182a2.213 2.213 0 0 0-.256-1.05c-.166-.311-.4-.556-.699-.734a1.964 1.964 0 0 0-1.034-.267c-.42 0-.79.103-1.108.307-.318.2-.566.466-.744.796a2.289 2.289 0 0 0-.267 1.073v1.21c0 .508.093.944.278 1.307.186.36.445.637.779.83.333.19.723.284 1.17.284.3 0 .57-.041.813-.125.242-.087.452-.214.63-.38.178-.167.313-.374.404-.62l1.92.216c-.121.508-.352.95-.693 1.33a3.379 3.379 0 0 1-1.295.875c-.527.204-1.13.306-1.807.306Z"/>
|
||||
<path fill="#fff" d="M63.498 17.153c-.685 0-1.299-.176-1.84-.528-.542-.352-.97-.864-1.285-1.534-.314-.67-.471-1.485-.471-2.443 0-.97.159-1.788.477-2.455.322-.67.756-1.176 1.301-1.517a3.344 3.344 0 0 1 1.824-.517c.512 0 .932.087 1.262.261.329.17.59.377.784.62.193.238.342.464.448.676h.086V5.364h2.062V17h-2.023v-1.375h-.125c-.106.212-.259.438-.46.676a2.53 2.53 0 0 1-.795.602c-.33.167-.745.25-1.245.25Zm.574-1.687c.436 0 .807-.117 1.114-.352.307-.239.54-.57.699-.995.159-.424.238-.918.238-1.483 0-.564-.08-1.055-.238-1.471-.156-.417-.387-.74-.693-.972-.303-.23-.676-.346-1.12-.346-.458 0-.84.119-1.147.358-.307.238-.538.568-.694.988-.155.42-.233.902-.233 1.443 0 .546.078 1.033.233 1.46.16.425.392.76.7 1.006.31.243.69.364 1.141.364Z"/>
|
||||
<path fill="#fff" d="M56.088 17V8.273h2.057V17h-2.057Zm1.034-9.966a1.2 1.2 0 0 1-.84-.324 1.044 1.044 0 0 1-.353-.79c0-.31.117-.573.352-.79.235-.219.515-.329.841-.329.33 0 .61.11.841.33.235.216.352.479.352.79 0 .306-.117.57-.352.79a1.187 1.187 0 0 1-.84.323Z"/>
|
||||
<path fill="#fff" d="M50.66 17.17c-.87 0-1.619-.19-2.244-.573a3.831 3.831 0 0 1-1.437-1.586c-.334-.678-.5-1.458-.5-2.34 0-.887.17-1.67.511-2.347a3.817 3.817 0 0 1 1.443-1.591c.625-.383 1.364-.574 2.216-.574.709 0 1.335.13 1.88.392.55.258.988.623 1.313 1.097.326.47.512 1.019.557 1.647h-1.966c-.08-.42-.269-.77-.568-1.05-.295-.285-.691-.427-1.187-.427-.42 0-.79.114-1.108.341-.319.223-.567.545-.745.966-.174.42-.261.924-.261 1.511 0 .595.087 1.106.261 1.534.175.425.419.752.733.983.319.228.692.341 1.12.341.303 0 .574-.056.812-.17.242-.118.445-.286.608-.506a1.94 1.94 0 0 0 .335-.801H54.4a3.427 3.427 0 0 1-.545 1.642 3.23 3.23 0 0 1-1.284 1.114c-.542.265-1.178.397-1.91.397Z"/>
|
||||
<path fill="#fff" d="M42.682 13.33V8.272h2.057V17h-1.995v-1.551h-.09c-.198.489-.521.888-.972 1.199-.447.31-.998.466-1.654.466-.572 0-1.077-.127-1.517-.381a2.645 2.645 0 0 1-1.022-1.12c-.246-.492-.37-1.086-.37-1.784V8.273h2.057v5.238c0 .553.152.993.455 1.319.303.325.7.488 1.193.488.303 0 .596-.074.88-.221.285-.148.518-.368.7-.66.185-.295.278-.664.278-1.107Z"/>
|
||||
<path fill="#fff" d="M28.148 17V5.364h2.108v9.869h5.125V17h-7.233Z"/>
|
||||
<path stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 11a4 4 0 0 0-8 0 8 8 0 0 0 16 0 11.97 11.97 0 0 0-4-8.944"/>
|
||||
<path stroke="#F56565" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 11a4 4 0 0 0 8 0 8 8 0 1 0-16 0c0 3.584 1.571 6.801 4.063 9"/>
|
||||
<circle cx="88" cy="11" r="2" fill="#737374"/>
|
||||
<path fill="url(#a)" d="m117.917 4.466-.719 11.135L110.322 1l7.595 3.466Zm-4.762 14.399-5.196 2.922-5.196-2.922 1.057-2.526h8.278l1.056 2.526h.001Zm-5.197-12.322 2.723 6.526h-5.445l2.723-6.526h-.001Zm-9.246 9.059L98 4.466 105.596 1l-6.884 14.602Z"/>
|
||||
<path fill="url(#b)" d="m117.917 4.466-.719 11.135L110.322 1l7.595 3.466Zm-4.762 14.399-5.196 2.922-5.196-2.922 1.057-2.526h8.278l1.056 2.526h.001Zm-5.197-12.322 2.723 6.526h-5.445l2.723-6.526h-.001Zm-9.246 9.059L98 4.466 105.596 1l-6.884 14.602Z"/>
|
||||
<defs>
|
||||
<linearGradient id="a" x1="102.396" x2="118.171" y1="19.902" y2="12.299" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#E40035"/>
|
||||
<stop offset=".24" stop-color="#F60A48"/>
|
||||
<stop offset=".35" stop-color="#F20755"/>
|
||||
<stop offset=".49" stop-color="#DC087D"/>
|
||||
<stop offset=".74" stop-color="#9717E7"/>
|
||||
<stop offset="1" stop-color="#6C00F5"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="b" x1="101.679" x2="111.892" y1="3.506" y2="15.322" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FF31D9"/>
|
||||
<stop offset="1" stop-color="#FF5BE1" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.4 KiB |
15
docs/public/package-logos/dark/lucide-preact.svg
Normal file
@@ -0,0 +1,15 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 118 24">
|
||||
<path fill="#fff" d="M74.202 18.17c-.875 0-1.63-.181-2.267-.545a3.694 3.694 0 0 1-1.46-1.557c-.341-.674-.512-1.468-.512-2.38 0-.898.17-1.686.512-2.364a3.867 3.867 0 0 1 1.443-1.591c.617-.383 1.342-.574 2.176-.574.538 0 1.045.087 1.523.261.48.17.905.436 1.272.796.371.36.663.818.875 1.375.212.553.319 1.212.319 1.977v.63h-7.154v-1.386h5.182a2.213 2.213 0 0 0-.256-1.05c-.166-.311-.4-.556-.699-.734a1.964 1.964 0 0 0-1.034-.267c-.42 0-.79.103-1.108.307-.318.2-.566.466-.744.796a2.289 2.289 0 0 0-.267 1.073v1.21c0 .508.093.944.278 1.307.186.36.445.637.779.83.333.19.723.284 1.17.284.3 0 .57-.042.813-.125.242-.087.452-.214.63-.38.178-.167.313-.374.404-.62l1.92.216c-.121.508-.352.95-.693 1.33a3.379 3.379 0 0 1-1.295.875c-.527.204-1.13.306-1.807.306Z"/>
|
||||
<path fill="#fff" d="M63.498 18.153c-.685 0-1.299-.176-1.84-.528-.542-.352-.97-.864-1.285-1.534-.314-.67-.471-1.485-.471-2.443 0-.97.159-1.788.477-2.455.322-.67.756-1.176 1.301-1.517a3.344 3.344 0 0 1 1.824-.517c.512 0 .932.087 1.262.261.329.17.59.377.784.62.193.238.342.464.448.676h.086V6.364h2.062V18h-2.023v-1.375h-.125c-.106.212-.259.438-.46.676a2.53 2.53 0 0 1-.795.602c-.33.167-.745.25-1.245.25Zm.574-1.687c.436 0 .807-.117 1.114-.352.307-.239.54-.57.699-.995.159-.424.238-.918.238-1.483 0-.564-.08-1.055-.238-1.471-.156-.417-.387-.74-.693-.972-.303-.23-.676-.346-1.12-.346-.458 0-.84.119-1.147.358-.307.238-.538.568-.694.988-.155.42-.233.902-.233 1.443 0 .546.078 1.033.233 1.46.16.425.392.76.7 1.006.31.243.69.364 1.141.364Z"/>
|
||||
<path fill="#fff" d="M56.088 18V9.273h2.057V18h-2.057Zm1.034-9.966a1.2 1.2 0 0 1-.84-.324 1.044 1.044 0 0 1-.353-.79c0-.31.117-.573.352-.79.235-.219.515-.329.841-.329.33 0 .61.11.841.33.235.216.352.479.352.79 0 .306-.117.57-.352.79a1.187 1.187 0 0 1-.84.323Z"/>
|
||||
<path fill="#fff" d="M50.66 18.17c-.87 0-1.619-.19-2.244-.573a3.831 3.831 0 0 1-1.437-1.586c-.334-.678-.5-1.458-.5-2.34 0-.887.17-1.67.511-2.347a3.817 3.817 0 0 1 1.443-1.591c.625-.383 1.364-.574 2.216-.574.709 0 1.335.13 1.88.392.55.258.988.623 1.313 1.097.326.47.512 1.019.557 1.647h-1.966c-.08-.42-.269-.77-.568-1.05-.295-.285-.691-.427-1.187-.427-.42 0-.79.114-1.108.341-.319.223-.567.545-.745.966-.174.42-.261.924-.261 1.511 0 .595.087 1.106.261 1.534.175.425.419.752.733.983.319.228.692.341 1.12.341.303 0 .574-.056.812-.17.242-.118.445-.286.608-.506a1.94 1.94 0 0 0 .335-.801H54.4a3.427 3.427 0 0 1-.545 1.642 3.23 3.23 0 0 1-1.284 1.114c-.542.265-1.178.397-1.91.397Z"/>
|
||||
<path fill="#fff" d="M42.682 14.33V9.272h2.057V18h-1.995v-1.551h-.09c-.198.488-.521.888-.972 1.199-.447.31-.998.466-1.654.466-.572 0-1.077-.127-1.517-.381a2.645 2.645 0 0 1-1.022-1.12c-.246-.492-.37-1.086-.37-1.784V9.273h2.057v5.238c0 .553.152.993.455 1.319.303.325.7.488 1.193.488.303 0 .596-.074.88-.221.285-.148.518-.368.7-.66.185-.295.278-.664.278-1.107Z"/>
|
||||
<path fill="#fff" d="M28.148 18V6.364h2.108v9.869h5.125V18h-7.233Z"/>
|
||||
<path stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 12a4 4 0 0 0-8 0 8 8 0 0 0 16 0 11.97 11.97 0 0 0-4-8.944"/>
|
||||
<path stroke="#F56565" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 12a4 4 0 0 0 8 0 8 8 0 1 0-16 0c0 3.584 1.571 6.801 4.063 9"/>
|
||||
<circle cx="88" cy="12" r="2" fill="#737374"/>
|
||||
<path fill="#673AB8" d="m108 0 10 5.773V17.32l-10 5.774-10-5.774V5.773L108 0Z"/>
|
||||
<path fill="#fff" d="M100.724 17.225c1.329 1.701 5.554.405 9.543-2.711 3.988-3.117 6.269-6.902 4.939-8.604-1.329-1.702-5.554-.405-9.543 2.711-3.988 3.117-6.269 6.902-4.939 8.604Zm.568-.444c-.441-.564-.249-1.672.591-3.067.885-1.468 2.386-3.09 4.224-4.525 1.837-1.435 3.774-2.5 5.412-3.003 1.557-.478 2.678-.397 3.119.168.441.564.248 1.672-.591 3.066-.885 1.469-2.386 3.09-4.224 4.526-1.837 1.435-3.774 2.5-5.412 3.003-1.557.478-2.678.396-3.119-.168Z"/>
|
||||
<path fill="#fff" d="M115.206 17.225c1.33-1.702-.951-5.487-4.939-8.604-3.989-3.116-8.214-4.413-9.543-2.711-1.33 1.702.951 5.487 4.939 8.604 3.989 3.116 8.214 4.413 9.543 2.71Zm-.568-.444c-.441.565-1.562.646-3.119.168-1.638-.503-3.575-1.568-5.412-3.003-1.838-1.436-3.339-3.057-4.224-4.526-.84-1.394-1.032-2.502-.591-3.066.441-.565 1.562-.646 3.119-.168 1.638.503 3.575 1.568 5.412 3.003 1.838 1.436 3.339 3.057 4.224 4.525.839 1.395 1.032 2.503.591 3.067Z"/>
|
||||
<path fill="#fff" d="M107.965 13.099a1.531 1.531 0 1 0 0-3.062 1.531 1.531 0 0 0 0 3.062Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.3 KiB |
26
docs/public/package-logos/dark/lucide-react-native.svg
Normal file
@@ -0,0 +1,26 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 119 26">
|
||||
<g clip-path="url(#a)">
|
||||
<path fill="#fff" d="M74.2 19.17a4.5 4.5 0 0 1-2.27-.55 3.7 3.7 0 0 1-1.46-1.55 5.21 5.21 0 0 1-.5-2.38c0-.9.16-1.69.5-2.37a3.87 3.87 0 0 1 3.62-2.16c.54 0 1.05.09 1.53.26s.9.44 1.27.8c.37.36.66.81.87 1.37.22.55.32 1.21.32 1.98v.63h-7.15V13.8h5.18c0-.4-.09-.74-.25-1.05-.17-.3-.4-.55-.7-.73-.3-.18-.64-.27-1.04-.27a2 2 0 0 0-1.1.3c-.32.2-.57.47-.75.8-.17.33-.26.69-.27 1.08v1.2c0 .52.1.95.28 1.31.19.36.45.64.78.83.33.2.72.29 1.17.29.3 0 .57-.04.81-.13.25-.08.46-.21.63-.38.18-.16.32-.37.4-.62l1.93.22a3 3 0 0 1-.7 1.33c-.33.37-.76.67-1.3.87-.52.2-1.12.31-1.8.31Z"/>
|
||||
<path fill="#fff" d="M63.5 19.15a3.3 3.3 0 0 1-3.13-2.06 5.73 5.73 0 0 1-.47-2.44c0-.97.16-1.79.48-2.46a3.34 3.34 0 0 1 4.39-1.77c.33.17.59.38.78.62.2.24.34.46.45.68h.08V7.36h2.07V19h-2.03v-1.38H66c-.1.22-.26.44-.46.68a2.53 2.53 0 0 1-2.04.85Zm.57-1.68c.44 0 .8-.12 1.12-.36.3-.23.54-.57.7-1 .15-.41.23-.9.23-1.47s-.08-1.06-.24-1.48a2.1 2.1 0 0 0-.69-.97 1.8 1.8 0 0 0-1.12-.34c-.46 0-.84.12-1.15.35-.3.24-.53.57-.69 1-.15.41-.23.9-.23 1.44 0 .54.08 1.03.23 1.46.16.42.4.76.7 1 .31.24.7.37 1.14.37Z"/>
|
||||
<path fill="#fff" d="M56.09 19v-8.73h2.05V19H56.1Zm1.03-9.97c-.32 0-.6-.1-.84-.32a1.04 1.04 0 0 1-.35-.79c0-.31.12-.57.35-.79.24-.22.52-.33.84-.33.33 0 .61.11.84.33.24.22.36.48.36.79 0 .3-.12.57-.36.79-.23.22-.5.32-.84.32Z"/>
|
||||
<path fill="#fff" d="M50.66 19.17a3.83 3.83 0 0 1-3.68-2.16 5.24 5.24 0 0 1-.5-2.34c0-.89.17-1.67.51-2.35.34-.68.82-1.2 1.44-1.59a4.16 4.16 0 0 1 2.22-.57c.7 0 1.33.13 1.88.4a3.21 3.21 0 0 1 1.87 2.74h-1.97a1.88 1.88 0 0 0-.56-1.06c-.3-.28-.7-.42-1.2-.42-.41 0-.78.11-1.1.34-.32.22-.57.54-.74.96-.18.43-.27.93-.27 1.52 0 .6.1 1.1.27 1.53.17.42.41.75.73.98.32.23.69.34 1.12.34.3 0 .57-.05.81-.17.24-.11.45-.28.6-.5.17-.22.28-.49.34-.8h1.97a3.23 3.23 0 0 1-1.83 2.76 4.3 4.3 0 0 1-1.9.39Z"/>
|
||||
<path fill="#fff" d="M42.68 15.33v-5.06h2.06V19h-2v-1.55h-.09c-.2.49-.52.89-.97 1.2-.45.3-1 .46-1.65.46a2.64 2.64 0 0 1-2.54-1.5 3.95 3.95 0 0 1-.37-1.78v-5.56h2.06v5.24c0 .55.15 1 .45 1.32.3.33.7.49 1.2.49a1.89 1.89 0 0 0 1.57-.88c.19-.3.28-.67.28-1.11Z"/>
|
||||
<path fill="#fff" d="M28.15 19V7.36h2.1v9.87h5.13V19h-7.23Z"/>
|
||||
<path stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 13a4 4 0 1 0-8 0 8 8 0 0 0 16 0c0-3.55-1.55-6.75-4-8.94"/>
|
||||
<path stroke="#F56565" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 13a4 4 0 0 0 8 0 8 8 0 1 0-16 0c0 3.58 1.57 6.8 4.06 9"/>
|
||||
</g>
|
||||
<path fill="#54C1DE" d="m112.75 6.34-.63-.2.1-.42c.47-2.3.17-4.14-.89-4.75-1.01-.58-2.67.02-4.34 1.48l-.48.44-.32-.3c-1.75-1.55-3.51-2.2-4.56-1.6-1.02.6-1.31 2.33-.89 4.5l.14.65c-.25.07-.49.15-.71.23-2.06.71-3.37 1.84-3.37 3 0 1.2 1.4 2.4 3.55 3.14l.52.16c-.06.23-.1.46-.15.7-.4 2.13-.09 3.83.92 4.41 1.04.6 2.79-.02 4.5-1.5l.4-.38c.17.17.34.33.52.48 1.65 1.42 3.28 2 4.28 1.41 1.05-.6 1.38-2.42.94-4.64l-.11-.52.36-.11c2.22-.75 3.67-1.94 3.67-3.16 0-1.17-1.35-2.3-3.45-3.02Zm-5.21-3.27c1.43-1.25 2.77-1.73 3.37-1.38.65.37.9 1.88.5 3.86a12 12 0 0 1-.09.39c-.85-.2-1.72-.33-2.59-.41-.5-.72-1.05-1.4-1.64-2.05l.45-.4Zm-5.01 7.29c.36.68.74 1.35 1.16 2-.6-.07-1.2-.17-1.79-.3.18-.57.4-1.14.63-1.7Zm0-1.95c-.23-.55-.44-1.11-.62-1.68.56-.13 1.15-.23 1.76-.3-.41.64-.8 1.3-1.14 1.98Zm.44.97c.51-1.06 1.1-2.09 1.77-3.06 1.17-.1 2.35-.1 3.53 0 .66.97 1.25 2 1.77 3.05a26.12 26.12 0 0 1-1.76 3.07c-1.18.09-2.36.09-3.53.01-.67-.98-1.26-2-1.78-3.07Zm6.95 1.97c.2-.33.39-.68.57-1.02.25.55.46 1.12.65 1.7-.6.14-1.2.24-1.81.31l.6-.99Zm.56-2.94a29.97 29.97 0 0 0-1.15-1.98c.62.08 1.21.18 1.77.3-.18.58-.38 1.13-.62 1.68Zm-3.97-4.33c.4.43.78.9 1.14 1.37-.76-.03-1.53-.03-2.3 0 .37-.47.76-.93 1.16-1.37Zm-4.47-2.37c.65-.37 2.08.16 3.6 1.5l.29.27c-.6.64-1.15 1.33-1.65 2.05-.87.08-1.74.21-2.6.4l-.13-.6c-.36-1.86-.12-3.27.5-3.62Zm-.94 10.16-.48-.15a7.1 7.1 0 0 1-2.27-1.2c-.47-.42-.72-.83-.72-1.16 0-.7 1.05-1.61 2.8-2.22.23-.08.45-.15.68-.2.26.83.57 1.65.94 2.44-.37.8-.69 1.64-.95 2.49Zm4.49 3.77a6.9 6.9 0 0 1-2.17 1.36c-.6.21-1.08.22-1.36.05-.62-.35-.87-1.71-.53-3.54l.15-.64c.86.18 1.73.3 2.61.37.51.72 1.07 1.41 1.67 2.06l-.37.34Zm.94-.93c-.4-.45-.8-.92-1.17-1.4.77.03 1.54.03 2.31 0-.35.48-.73.95-1.14 1.4Zm5.03 1.15c-.11.63-.34 1.04-.63 1.2-.61.36-1.92-.1-3.33-1.31a9.83 9.83 0 0 1-.49-.45c.6-.65 1.13-1.34 1.63-2.07.88-.07 1.76-.2 2.62-.4a6.93 6.93 0 0 1 .2 3.03Zm.7-4.14-.32.1c-.27-.84-.6-1.66-.98-2.45.37-.79.69-1.6.95-2.43l.57.19c1.8.62 2.9 1.53 2.9 2.23 0 .75-1.2 1.73-3.11 2.36Z"/>
|
||||
<path fill="#54C1DE" d="M106.5 11.1a1.73 1.73 0 1 0 0-3.47 1.73 1.73 0 0 0 0 3.47Z"/>
|
||||
<path fill="#54C1DE" d="M100.25 19.75v4.62h-.71l-2.56-3.13v3.14h-.86v-4.63h.71l2.56 3.13v-3.13h.86Z"/>
|
||||
<path fill="#54C1DE" d="M104.38 22.25v2.08h-.8v-.43c-.2.3-.58.48-1.12.48-.82 0-1.33-.46-1.33-1.07 0-.6.4-1.05 1.48-1.05h.92v-.05c0-.49-.3-.77-.89-.77-.39 0-.77.12-1.08.35l-.33-.6c.45-.3.98-.46 1.52-.44 1.03 0 1.63.48 1.63 1.5Zm-.84.97v-.41h-.87c-.56 0-.72.21-.72.47 0 .3.26.49.7.49a.91.91 0 0 0 .89-.55Z"/>
|
||||
<path fill="#54C1DE" d="M107.5 24.15c-.24.16-.52.24-.8.22-.79 0-1.24-.4-1.24-1.2v-1.7h-.58v-.66h.58V20h.84v.81h.95v.66h-.95v1.69c0 .34.17.53.5.53.16 0 .32-.05.45-.14l.25.6Z"/>
|
||||
<path fill="#54C1DE" d="M108 19.75a.5.5 0 0 1 .17-.36.53.53 0 0 1 .4-.14c.14 0 .28.04.38.13a.48.48 0 0 1 .17.35c0 .14-.06.26-.17.36a.58.58 0 0 1-.77.01.52.52 0 0 1-.18-.35Zm.12 1.08h.88v3.55h-.88v-3.55Z"/>
|
||||
<path fill="#54C1DE" d="m113.38 20.88-1.52 3.5h-.85l-1.51-3.5h.86l1.1 2.59 1.13-2.6h.78Z"/>
|
||||
<path fill="#54C1DE" d="M117 22.82h-2.69c.1.52.51.85 1.1.85a1.2 1.2 0 0 0 .93-.38l.43.5a1.73 1.73 0 0 1-1.38.58c-1.14 0-1.89-.76-1.89-1.81a1.8 1.8 0 0 1 .5-1.3 1.67 1.67 0 0 1 1.26-.51c1 0 1.73.72 1.73 1.82v.25Zm-2.7-.54h1.95a.97.97 0 0 0-.32-.63.92.92 0 0 0-.65-.23.93.93 0 0 0-.65.23.99.99 0 0 0-.32.63Z"/>
|
||||
<circle cx="88" cy="13" r="2" fill="#737374"/>
|
||||
<defs>
|
||||
<clipPath id="a">
|
||||
<path fill="#fff" d="M0 2h82v22H0z"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.8 KiB |
15
docs/public/package-logos/dark/lucide-react.svg
Normal file
@@ -0,0 +1,15 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 119 22">
|
||||
<path fill="#61DAFB" d="M107.5 13.28a2.05 2.05 0 1 0 0-4.1 2.05 2.05 0 0 0 0 4.1Z"/>
|
||||
<path stroke="#61DAFB" d="M107.5 15.43c6.08 0 11-1.88 11-4.2 0-2.32-4.92-4.2-11-4.2s-11 1.88-11 4.2c0 2.32 4.92 4.2 11 4.2Z"/>
|
||||
<path stroke="#61DAFB" d="M103.86 13.33c3.04 5.26 7.13 8.59 9.14 7.43 2-1.16 1.17-6.37-1.86-11.63C108.1 3.87 104 .55 102 1.71c-2 1.16-1.17 6.36 1.86 11.62Z"/>
|
||||
<path stroke="#61DAFB" d="M103.86 9.13C100.83 14.4 100 19.6 102 20.76c2 1.16 6.1-2.17 9.14-7.43C114.17 8.07 115 2.87 113 1.71c-2-1.16-6.1 2.16-9.14 7.42Z"/>
|
||||
<path fill="#fff" d="M74.2 17.17a4.5 4.5 0 0 1-2.27-.55 3.7 3.7 0 0 1-1.46-1.55 5.21 5.21 0 0 1-.5-2.38c0-.9.16-1.69.5-2.37a3.87 3.87 0 0 1 3.62-2.16c.54 0 1.05.09 1.53.26s.9.44 1.27.8c.37.36.66.81.87 1.37.22.55.32 1.21.32 1.98v.63h-7.15V11.8h5.18c0-.4-.09-.74-.25-1.05-.17-.3-.4-.55-.7-.73-.3-.18-.64-.27-1.04-.27a2 2 0 0 0-1.1.3c-.32.2-.57.47-.75.8-.17.33-.26.69-.27 1.08v1.2c0 .52.1.95.28 1.31.19.36.45.64.78.83.33.2.72.29 1.17.29.3 0 .57-.04.81-.13.25-.08.46-.21.63-.38.18-.16.32-.37.4-.62l1.93.22a3 3 0 0 1-.7 1.33c-.33.37-.76.67-1.3.87-.52.2-1.12.31-1.8.31Z"/>
|
||||
<path fill="#fff" d="M63.5 17.15a3.3 3.3 0 0 1-3.13-2.06 5.73 5.73 0 0 1-.47-2.44c0-.97.16-1.79.48-2.46a3.34 3.34 0 0 1 4.39-1.77c.33.17.59.38.78.62.2.24.34.46.45.68h.08V5.36h2.07V17h-2.03v-1.38H66c-.1.22-.26.44-.46.68a2.53 2.53 0 0 1-2.04.85Zm.57-1.68c.44 0 .8-.12 1.12-.36.3-.23.54-.57.7-1 .15-.41.23-.9.23-1.47s-.08-1.06-.24-1.48a2.1 2.1 0 0 0-.69-.97 1.8 1.8 0 0 0-1.12-.34c-.46 0-.84.12-1.15.35-.3.24-.53.57-.69 1-.15.41-.23.9-.23 1.44 0 .54.08 1.03.23 1.46.16.42.4.76.7 1 .31.24.7.37 1.14.37Z"/>
|
||||
<path fill="#fff" d="M56.09 17V8.27h2.05V17H56.1Zm1.03-9.97c-.32 0-.6-.1-.84-.32a1.04 1.04 0 0 1-.35-.79c0-.31.12-.57.35-.79.24-.22.52-.33.84-.33.33 0 .61.11.84.33.24.22.36.48.36.79 0 .3-.12.57-.36.79-.23.22-.5.32-.84.32Z"/>
|
||||
<path fill="#fff" d="M50.66 17.17a3.83 3.83 0 0 1-3.68-2.16 5.24 5.24 0 0 1-.5-2.34c0-.89.17-1.67.51-2.35.34-.68.82-1.2 1.44-1.59a4.16 4.16 0 0 1 2.22-.57c.7 0 1.33.13 1.88.4a3.21 3.21 0 0 1 1.87 2.74h-1.97a1.88 1.88 0 0 0-.56-1.06c-.3-.28-.7-.42-1.2-.42-.41 0-.78.11-1.1.34-.32.22-.57.54-.74.96-.18.43-.27.93-.27 1.52 0 .6.1 1.1.27 1.53.17.42.41.75.73.98.32.23.69.34 1.12.34.3 0 .57-.05.81-.17.24-.11.45-.28.6-.5.17-.22.28-.49.34-.8h1.97a3.23 3.23 0 0 1-1.83 2.76 4.3 4.3 0 0 1-1.9.39Z"/>
|
||||
<path fill="#fff" d="M42.68 13.33V8.27h2.06V17h-2v-1.55h-.09c-.2.49-.52.89-.97 1.2-.45.3-1 .46-1.65.46a2.64 2.64 0 0 1-2.54-1.5 3.95 3.95 0 0 1-.37-1.78V8.27h2.06v5.24c0 .55.15 1 .45 1.32.3.33.7.49 1.2.49a1.89 1.89 0 0 0 1.57-.88c.19-.3.28-.67.28-1.11Z"/>
|
||||
<path fill="#fff" d="M28.15 17V5.36h2.1v9.87h5.13V17h-7.23Z"/>
|
||||
<path stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 11a4 4 0 0 0-8 0 8 8 0 0 0 16 0c0-3.55-1.55-6.75-4-8.94"/>
|
||||
<path stroke="#F56565" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 11a4 4 0 0 0 8 0 8 8 0 1 0-16 0c0 3.58 1.57 6.8 4.06 9"/>
|
||||
<circle cx="88" cy="11" r="2" fill="#737374"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.0 KiB |
39
docs/public/package-logos/dark/lucide-solid.svg
Normal file
@@ -0,0 +1,39 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 120 23">
|
||||
<path fill="#76B3E1" d="M119.14 5.18S111.29-.59 105.22.74l-.44.15c-.9.3-1.63.74-2.08 1.33l-.3.45-2.22 3.85 3.85.74a7.51 7.51 0 0 0 5.63 1.03l6.81 1.34 2.67-4.45Z"/>
|
||||
<path fill="url(#a)" d="M119.14 5.18S111.29-.59 105.22.74l-.44.15c-.9.3-1.63.74-2.08 1.33l-.3.45-2.22 3.85 3.85.74a7.51 7.51 0 0 0 5.63 1.03l6.81 1.34 2.67-4.45Z" opacity=".3"/>
|
||||
<path fill="#518AC8" d="m102.7 5.18-.6.15c-2.5.74-3.25 3.11-1.92 5.19a7.01 7.01 0 0 0 7.11 2.22l9.18-3.11s-7.84-5.78-13.77-4.45Z"/>
|
||||
<path fill="url(#b)" d="m102.7 5.18-.6.15c-2.5.74-3.25 3.11-1.92 5.19a7.01 7.01 0 0 0 7.11 2.22l9.18-3.11s-7.84-5.78-13.77-4.45Z" opacity=".3"/>
|
||||
<path fill="url(#c)" d="M114.84 11.85a6.66 6.66 0 0 0-7.1-2.22l-9.19 2.96-2.96 5.18 16.59 2.82 2.96-5.34c.6-1.03.45-2.22-.3-3.4Z"/>
|
||||
<path fill="url(#d)" d="M111.88 17.03a6.66 6.66 0 0 0-7.1-2.22l-9.19 2.96s7.85 5.93 13.92 4.45l.45-.15c2.52-.74 3.4-3.11 1.92-5.04Z"/>
|
||||
<path fill="#fff" d="M74.2 18.17a4.5 4.5 0 0 1-2.27-.55 3.7 3.7 0 0 1-1.46-1.55 5.21 5.21 0 0 1-.5-2.38c0-.9.16-1.69.5-2.37a3.87 3.87 0 0 1 3.62-2.16c.54 0 1.05.09 1.53.26s.9.44 1.27.8c.37.36.66.81.87 1.37.22.55.32 1.21.32 1.98v.63h-7.15V12.8h5.18c0-.4-.09-.74-.25-1.05-.17-.3-.4-.55-.7-.73-.3-.18-.64-.27-1.04-.27a2 2 0 0 0-1.1.3c-.32.2-.57.47-.75.8-.17.33-.26.69-.27 1.08v1.2c0 .52.1.95.28 1.31.19.36.45.64.78.83.33.2.72.29 1.17.29.3 0 .57-.04.81-.13.25-.08.46-.21.63-.38.18-.16.32-.37.4-.62l1.93.22a3 3 0 0 1-.7 1.33c-.33.37-.76.67-1.3.87-.52.2-1.12.31-1.8.31Z"/>
|
||||
<path fill="#fff" d="M63.5 18.15a3.3 3.3 0 0 1-3.13-2.06 5.73 5.73 0 0 1-.47-2.44c0-.97.16-1.79.48-2.46a3.34 3.34 0 0 1 4.39-1.77c.33.17.59.38.78.62.2.24.34.46.45.68h.08V6.36h2.07V18h-2.03v-1.38H66c-.1.22-.26.44-.46.68a2.53 2.53 0 0 1-2.04.85Zm.57-1.68c.44 0 .8-.12 1.12-.36.3-.23.54-.57.7-1 .15-.41.23-.9.23-1.47s-.08-1.06-.24-1.48a2.1 2.1 0 0 0-.69-.97 1.8 1.8 0 0 0-1.12-.34c-.46 0-.84.12-1.15.35-.3.24-.53.57-.69 1-.15.41-.23.9-.23 1.44 0 .54.08 1.03.23 1.46.16.42.4.76.7 1 .31.24.7.37 1.14.37Z"/>
|
||||
<path fill="#fff" d="M56.09 18V9.27h2.05V18H56.1Zm1.03-9.97c-.32 0-.6-.1-.84-.32a1.04 1.04 0 0 1-.35-.79c0-.31.12-.57.35-.79.24-.22.52-.33.84-.33.33 0 .61.11.84.33.24.22.36.48.36.79 0 .3-.12.57-.36.79-.23.22-.5.32-.84.32Z"/>
|
||||
<path fill="#fff" d="M50.66 18.17a3.83 3.83 0 0 1-3.68-2.16 5.24 5.24 0 0 1-.5-2.34c0-.89.17-1.67.51-2.35.34-.68.82-1.2 1.44-1.59a4.16 4.16 0 0 1 2.22-.57c.7 0 1.33.13 1.88.4a3.21 3.21 0 0 1 1.87 2.74h-1.97a1.88 1.88 0 0 0-.56-1.06c-.3-.28-.7-.42-1.2-.42-.41 0-.78.11-1.1.34-.32.22-.57.54-.74.96-.18.43-.27.93-.27 1.52 0 .6.1 1.1.27 1.53.17.42.41.75.73.98.32.23.69.34 1.12.34.3 0 .57-.05.81-.17.24-.11.45-.28.6-.5.17-.22.28-.49.34-.8h1.97a3.23 3.23 0 0 1-1.83 2.76 4.3 4.3 0 0 1-1.9.39Z"/>
|
||||
<path fill="#fff" d="M42.68 14.33V9.27h2.06V18h-2v-1.55h-.09c-.2.49-.52.89-.97 1.2-.45.3-1 .46-1.65.46a2.64 2.64 0 0 1-2.54-1.5 3.95 3.95 0 0 1-.37-1.78V9.27h2.06v5.24c0 .55.15 1 .45 1.32.3.33.7.49 1.2.49a1.89 1.89 0 0 0 1.57-.88c.19-.3.28-.67.28-1.11Z"/>
|
||||
<path fill="#fff" d="M28.15 18V6.36h2.1v9.87h5.13V18h-7.23Z"/>
|
||||
<path stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 12a4 4 0 0 0-8 0 8 8 0 0 0 16 0c0-3.55-1.55-6.75-4-8.94"/>
|
||||
<path stroke="#F56565" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 12a4 4 0 0 0 8 0 8 8 0 1 0-16 0c0 3.58 1.57 6.8 4.06 9"/>
|
||||
<circle cx="88" cy="12" r="2" fill="#737374"/>
|
||||
<defs>
|
||||
<linearGradient id="a" x1="99.07" x2="117.51" y1=".44" y2="9.4" gradientUnits="userSpaceOnUse">
|
||||
<stop offset=".1" stop-color="#76B3E1"/>
|
||||
<stop offset=".3" stop-color="#DCF2FD"/>
|
||||
<stop offset="1" stop-color="#76B3E1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="b" x1="109.19" x2="105.96" y1="4.83" y2="15.58" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#76B3E1"/>
|
||||
<stop offset=".5" stop-color="#4377BB"/>
|
||||
<stop offset="1" stop-color="#1F3B77"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="c" x1="97.72" x2="116.37" y1="9.51" y2="22.19" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#315AA9"/>
|
||||
<stop offset=".5" stop-color="#518AC8"/>
|
||||
<stop offset="1" stop-color="#315AA9"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="d" x1="106.14" x2="98.61" y1="11.03" y2="38.62" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#4377BB"/>
|
||||
<stop offset=".5" stop-color="#1A336B"/>
|
||||
<stop offset="1" stop-color="#1A336B"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.4 KiB |