Compare commits

...
10 Commits
Author SHA1 Message Date
gridalchemygithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>Eric Fennis
b826f0c527 feat(icons): added grid-3x3-off icon (#5071)
* feat(icons): added grid-3x3-off icon

* chore(icons): add suggested tags to `grid-3x3-off`

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(icons): use standard off geometry for `grid-3x3-off`

* chore(icons): use metadata markers for `grid-3x3-off`

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2026-11-05 23:02:56 +01:00
Eric FennisandKarsa 558bdd83b5 feat(icons): added user-exclamation-point, user-round-exclamation-point icons (#5144)
* Added icons/user-round-exclamation-point.svg

* Added icons/user-round-exclamation-point.json

* Updated metadata

* Add user-exclamation-point

* Adds suggestions

* Update icons/user-round-exclamation-point.svg

Co-authored-by: Karsa <karsa@karsa.org>

* Modify user-exclamation-point icon SVG paths

---------

Co-authored-by: Karsa <karsa@karsa.org>
2026-11-05 20:32:56 +01:00
Jamie Lawgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>Eric Fennis
a805955781 feat(icons): added moped icon (#3373)
* Add `dirt-bike` icon

* Fix JSON formatting

* Fix JSON formatting again

* Rounded the handlebars

* Rename icon and add metadata

* Update icons/moped.json

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-11-05 18:43:20 +01:00
tlq5landEric Fennis ee8e10d746 fix(lucide-react-native): emit runtime files for alias icon subpaths (#5055)
closes #5043

Agent: claude

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2026-11-05 14:11:40 +01:00
DominikCursorgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>Eric FennisKarsa
2c2ee80687 feat(icons): added square-dashed-search icon (#5119)
* Add the square-dashed-search lab icon.

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(lab): added zoom selection use case to `square-dashed-search`

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(icons): delegated `square-dashed-search` icon from lab

Co-authored-by: Cursor <cursoragent@cursor.com>

* Update icons/square-dashed-search.json

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Update icons/square-dashed-search.json

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Adjust metadata

* Apply feedback

* Remove text category

* Update icons/square-dashed-search.svg

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
Co-authored-by: Karsa <contact@karsa.org>
2026-11-05 10:24:38 +01:00
Eric FennisandClaude 1c93e0a476 fix(docs): fix vercel.json redirects that land on 404 (#5157)
- Redirect /docs/lucide-*, /guide/lucide-* and /guide/packages/lucide-*/ to
  the current /guide/<pkg> pages (vue-next -> vue)
- Redirect old /guide/basics/*, /guide/advanced/* and /guide/design/* pages
- Redirect graduated lab icons carton-off and briefcase-plus to core
- Remove the /docs/:slug(lucide-?.*) rule that produced 404 destinations

Fixes LUCIDE-15


Claude-Session: https://claude.ai/code/session_01G9u8FetMRtXGCVFrfg619a

Co-authored-by: Claude <noreply@anthropic.com>
2026-11-05 07:49:42 +01:00
91a1359b5e feat(icons): added circle-fading-check icon (#4089)
* Added icons/circle-fading-check.svg

* Added icons/circle-fading-check.json

* Refactor SVG paths in circle-fading-check.svg

* Add empty use-cases array to circle-fading-check.json

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Update metadata

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-11-04 16:03:14 +01:00
Ilya VredandEric 90e8041a35 feat(icons): added opacity icon (#4222)
* Added icons/opacity.svg

* Added icons/opacity.json

* Updated icons/opacity.svg

* Updated icons/opacity.json

* Adjust usecases

---------

Co-authored-by: Eric <eric.fennis@gmail.com>
2026-11-04 15:56:22 +01:00
Eric FennisandKarsa 3898742b6a feat(icons): added package-question-mark icon (#5155)
* Add metadata

* Add more tags to `package.json`

* Update icons/package-question-mark.json

Co-authored-by: Karsa <contact@karsa.org>

---------

Co-authored-by: Karsa <contact@karsa.org>
2026-11-04 15:29:36 +01:00
Eric FennisandKarsa a4a0e20ff5 feat(icons): added package-pen icon (#5154)
* Add package pen icon

* Update icons/package-pen.json

Co-authored-by: Karsa <contact@karsa.org>

* update metadata

---------

Co-authored-by: Karsa <contact@karsa.org>
2026-11-04 15:26:37 +01:00
25 changed files with 499 additions and 13 deletions
+62 -7
View File
@@ -12,8 +12,68 @@
"permanent": true
},
{
"source": "/docs/:slug(lucide-?.*)",
"destination": "/guide/:slug",
"source": "/docs/lucide-vue-next",
"destination": "/guide/vue",
"permanent": true
},
{
"source": "/guide/packages/lucide-vue-next",
"destination": "/guide/vue",
"permanent": true
},
{
"source": "/guide/vue-next",
"destination": "/guide/vue",
"permanent": true
},
{
"source": "/docs/lucide",
"destination": "/guide/lucide",
"permanent": true
},
{
"source": "/docs/lucide-:pkg",
"destination": "/guide/:pkg",
"permanent": true
},
{
"source": "/guide/lucide-:pkg",
"destination": "/guide/:pkg",
"permanent": true
},
{
"source": "/guide/packages/lucide-:pkg/",
"destination": "/guide/:pkg",
"permanent": true
},
{
"source": "/guide/advanced/accessibility",
"destination": "/how-to/accessibility",
"permanent": true
},
{
"source": "/guide/basics/:slug",
"destination": "/guide/react/basics/:slug",
"permanent": true
},
{
"source": "/guide/advanced/:slug",
"destination": "/guide/react/advanced/:slug",
"permanent": true
},
{
"source": "/guide/design/figma-guide",
"destination": "/contribute/icons/figma-guide",
"permanent": true
},
{
"source": "/guide/design/:slug(icon-design-guide|icon-properties)",
"destination": "/contribute/icons/design-principles",
"permanent": true
},
{
"source": "/icons/lab/:name(carton-off|briefcase-plus)",
"destination": "/icons/:name",
"permanent": true
},
{
@@ -47,11 +107,6 @@
"destination": "/how-to/accessibility",
"permanent": true
},
{
"source": "/guide/advanced/accessibility",
"destination": "/how-to/accessibility",
"permanent": true
},
{
"source": "/guide/advanced",
"destination": "/guide/react/advanced",
+3 -1
View File
@@ -20,6 +20,8 @@
"investigate",
"magnifying glass",
"lens",
"zoom"
"zoom",
"inspection",
"visual search"
]
}
+23
View File
@@ -0,0 +1,23 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"n2duc"
],
"use-cases": [
"Indicating a submission or payment that is still being verified",
"Showing a deployment, upload, or backup that is finishing up",
"Marking a task as partially completed or awaiting final approval",
"Displaying a step in a progress tracker that is in progress"
],
"tags": [
"$group:check",
"pending",
"progress",
"processing",
"verifying",
"loading"
],
"categories": [
"notifications"
]
}
+18
View File
@@ -0,0 +1,18 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M12 2a10 10 0 017.38 16.75" />
<path d="m16 9-5.5 5.5L8 12" />
<path d="M2.5 8.875a10 10 0 00-.5 3" />
<path d="M2.83 16a10 10 0 002.43 3.4" />
<path d="M4.636 5.235a10 10 0 01.891-.857" />
<path d="M8.644 21.42a10 10 0 007.631-.38" />
</svg>

After

Width:  |  Height:  |  Size: 465 B

+27
View File
@@ -0,0 +1,27 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"$extends:grid-3x3",
"gridalchemy"
],
"use-cases": [
"Hiding grid lines on a canvas or artboard",
"Indicating that snap to grid is turned off",
"Hiding the cell grid in spreadsheets"
],
"tags": [
"$extends:grid-3x3",
"$group:off",
"guides",
"snap",
"canvas",
"spreadsheet",
"cells",
"data table",
"diagram",
"overlay"
],
"categories": [
"$extends:grid-3x3"
]
}
+21
View File
@@ -0,0 +1,21 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M15 9.344V3" />
<path d="m2 2 20 20" />
<path d="M20.414 20.414A2 2 0 0119 21H5a2 2 0 01-2-2V5a2 2 0 01.586-1.414" />
<path d="M20.656 15H21" />
<path d="M21 9h-6.344" />
<path d="M3 15h12v6" />
<path d="M3 9h6v12" />
<path d="M8.656 3H19a2 2 0 012 2v10.343" />
<path d="M9 3v.344" />
</svg>

After

Width:  |  Height:  |  Size: 520 B

+38
View File
@@ -0,0 +1,38 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"jamiemlaw",
"jguddas"
],
"use-cases": [
"Picking a transport type in journey planning or racing apps",
"Highlighting a delivery driver on a map when they ride a motorbike"
],
"tags": [
"scooter",
"two-wheeler",
"commute",
"urban",
"city",
"courier",
"motorbike",
"moto",
"motorcycle",
"transport",
"vehicle",
"drive",
"ride",
"race",
"racing",
"trip",
"journey",
"delivery",
"off-road",
"dirt bike",
"trail",
"enduro"
],
"categories": [
"transportation"
]
}
+17
View File
@@ -0,0 +1,17 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="m18.16 14.12-2.927-8.447A1 1 0 0 0 14.288 5H13" />
<path d="M19 10a7 7 0 0 0-6.928 6" />
<path d="M2 10h5.5a3 3 0 0 1 2.747 1.795l1.669 3.803A1 1 0 0 1 11.01 17H8" />
<circle cx="19" cy="17" r="3" />
<circle cx="5" cy="17" r="3" />
</svg>

After

Width:  |  Height:  |  Size: 459 B

+32
View File
@@ -0,0 +1,32 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"ilyavred",
"jamiemlaw"
],
"use-cases": [
"Setting the opacity of layers or objects in graphic editors",
"Adjusting the opacity of fills, strokes, or other object attributes",
"Adjusting the alpha channel in color pickers",
"Indicating that a layer or element is semi-transparent"
],
"tags": [
"opacity",
"opaque",
"transparency",
"visibility",
"fade",
"lens",
"glass",
"blur",
"filter",
"clear",
"mask",
"cover",
"gradient"
],
"categories": [
"design",
"photography"
]
}
+25
View File
@@ -0,0 +1,25 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M12 3h.01" />
<path d="M12 9h.01" />
<path d="M15 6h.01" />
<path d="M18 3h.01" />
<path d="M21 6v13a2 2 0 0 1-2 2H6" />
<path d="M3 12h.01" />
<path d="M3 18h.01" />
<path d="M3 6h.01" />
<path d="M6 15h.01" />
<path d="M6 3h.01" />
<path d="M6 9h.01" />
<path d="M9 12h.01" />
<path d="M9 6h.01" />
</svg>

After

Width:  |  Height:  |  Size: 544 B

+19
View File
@@ -0,0 +1,19 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"$extends:package"
],
"use-cases": [
"Editing recipient addresses or package contents in shipping systems",
"Modifying customer orders before shipment",
"Updating product listings in inventory or e-commerce platforms",
"Editing software package manifests or metadata"
],
"tags": [
"$extends:package",
"$group:pen"
],
"categories": [
"$extends:package"
]
}
+17
View File
@@ -0,0 +1,17 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M12 14.34V12l8.71-5" />
<path d="M16.511 21.141a2 2 0 0 0 .854-.506l4.013-4.009a1 1 0 1 0-3.004-3.004l-4.01 4.012a2 2 0 0 0-.506.854l-.837 2.87a.5.5 0 0 0 .599.626z" />
<path d="M21 9.114V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l5.087 2.907" />
<path d="M3.29 7 12 12" />
<path d="m7.5 4.27 9 5.15" />
</svg>

After

Width:  |  Height:  |  Size: 564 B

+24
View File
@@ -0,0 +1,24 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"$extends:package"
],
"use-cases": [
"Marking an unknown or unrecognized package in a package registry",
"Indicating a dependency that is still being resolved in a package manager",
"Indicating a lost or missing delivery package",
"Showing a shipment with an unknown delivery status"
],
"tags": [
"$extends:package",
"$group:question-mark",
"unresolved",
"placeholder",
"pending",
"lost",
"dependency"
],
"categories": [
"$extends:package"
]
}
+18
View File
@@ -0,0 +1,18 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M12 22V12l8.71-5" />
<path d="M17 15.27c.2-.4.5-.8.9-1a2.1 2.1 0 0 1 2.6.4c.3.4.5.8.5 1.3 0 1.3-2 2-2 2" />
<path d="M19 21.99h.01" />
<path d="M21 10.342V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l2.33-1.332" />
<path d="M3.29 7 12 12" />
<path d="m7.5 4.27 9 5.15" />
</svg>

After

Width:  |  Height:  |  Size: 550 B

+8 -1
View File
@@ -21,7 +21,14 @@
"packed",
"archive",
"zip",
"module"
"module",
"shipping",
"recipient",
"inventory",
"logistics",
"tracking",
"order",
"product"
],
"categories": [
"files",
+20
View File
@@ -0,0 +1,20 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"$extends:square-dashed",
"domarku"
],
"use-cases": [
"Searching within a selected region",
"Finding content inside a placeholder area",
"Scanning a marquee selection",
"Zooming a selected region"
],
"tags": [
"$extends:square-dashed",
"$group:search"
],
"categories": [
"$extends:square-dashed"
]
}
+23
View File
@@ -0,0 +1,23 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M14 3h1" />
<path d="M19 3a2 2 0 012 2" />
<path d="m21 21-1.875-1.875" />
<path d="M21 9v1" />
<path d="M3 14v1" />
<path d="M3 9v1" />
<path d="M5 21a2 2 0 01-2-2" />
<path d="M5 3a2 2 0 00-2 2" />
<path d="M9 21h1" />
<path d="M9 3h1" />
<circle cx="17" cy="17" r="3" />
</svg>

After

Width:  |  Height:  |  Size: 513 B

+4 -1
View File
@@ -15,7 +15,10 @@
"marquee",
"tool",
"dashed",
"box"
"box",
"region",
"area",
"region of interest"
],
"categories": [
"design",
+26
View File
@@ -0,0 +1,26 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"$extends:user"
],
"use-cases": [
"Flagging an account as suspicious in moderation tools",
"Indicating a problem with a user's account or profile",
"Showing that a user has received a warning",
"Issuing a warning to a member in community management"
],
"tags": [
"$extends:user",
"$group:exclamation-mark",
"flagged",
"suspicious",
"reported",
"violation",
"moderation",
"account issue",
"review"
],
"categories": [
"$extends:user"
]
}
+16
View File
@@ -0,0 +1,16 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M15 15H9a4 4 0 00-4 4v2" />
<path d="M18.988 13v4" />
<path d="M18.988 21h.01" />
<circle cx="12" cy="7" r="4" />
</svg>

After

Width:  |  Height:  |  Size: 339 B

+16
View File
@@ -0,0 +1,16 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"$extends:user-round"
],
"use-cases": [
"$extends:user-exclamation-point"
],
"tags": [
"$extends:user-round",
"$extends:user-exclamation-point"
],
"categories": [
"$extends:user-round"
]
}
+16
View File
@@ -0,0 +1,16 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M19.99 13v4" />
<path d="M19.99 21H20" />
<path d="M4 21a8 8 0 0111.99-6.934" />
<circle cx="12" cy="8" r="5" />
</svg>

After

Width:  |  Height:  |  Size: 338 B

+2 -1
View File
@@ -55,11 +55,12 @@
"dist"
],
"scripts": {
"build": "pnpm clean && pnpm copy:license && pnpm build:icons && pnpm build:bundles",
"build": "pnpm clean && pnpm copy:license && pnpm build:icons && pnpm build:bundles && pnpm check:icon-subpaths",
"copy:license": "cp ../../LICENSE ./LICENSE",
"clean": "rm -rf dist && rm -rf stats && rm -rf ./src/icons/*.ts",
"build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mts --renderUniqueKey --iconFileExtension=.ts --exportFileName=index.ts --withAliases --separateAliasesFile --separateAliasesFileIgnore=fingerprint --aliasesFileExtension=.ts",
"build:bundles": "rollup -c ./rollup.config.mjs",
"check:icon-subpaths": "node ./scripts/checkIconSubpaths.mts",
"test": "pnpm build:icons && vitest run",
"test:watch": "vitest watch",
"typecheck": "pnpm build:icons && tsc"
@@ -11,7 +11,14 @@ const dtsOptions = {
const packageName = 'LucideReact';
const outputFileName = 'lucide-react-native';
const outputDir = 'dist';
const inputs = ['src/lucide-react-native.ts', 'src/icons/index.ts'];
const iconAndAliasEntries = await getIconEntryNamesAndAliases();
// Alias modules (e.g. `icons/trash-2`) aren't imported by the index, so list them as entries
// to emit the runtime files the `./icons/*` export map points at.
const inputs = [
'src/lucide-react-native.ts',
'src/icons/index.ts',
...Object.values(iconAndAliasEntries),
];
const bundles = [
{
format: 'cjs',
@@ -28,7 +35,6 @@ const bundles = [
},
];
const iconAndAliasEntries = await getIconEntryNamesAndAliases();
const typesModuleMatcher = /[/\\]src[/\\]types\.(d\.)?ts$/;
const configs = bundles.map(({ inputs, outputDir, format, preserveModules, extension = 'js' }) => ({
@@ -0,0 +1,16 @@
// Fails the build when an `icons/*` subpath has type declarations but no runtime file.
import { existsSync, readdirSync } from 'node:fs';
const declarations = readdirSync('dist/types/icons').filter((file) => file.endsWith('.d.ts'));
const missing = declarations.flatMap((file) => {
const name = file.replace(/\.d\.ts$/, '');
return [`dist/esm/icons/${name}.mjs`, `dist/cjs/icons/${name}.js`].filter(
(runtimeFile) => !existsSync(runtimeFile),
);
});
if (missing.length > 0) {
console.error(`Missing runtime files for icon subpaths:\n${missing.join('\n')}`);
process.exit(1);
}