Omit absent className values when calling the shared icon builder so
shipped Astro source passes exactOptionalPropertyTypes without changing
rendered classes.
Enable exactOptionalPropertyTypes and noUncheckedIndexedAccess in the
package tsconfig so the existing CI typecheck catches regressions.
Background: https://github.com/withastro/astro/issues/18471
Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
- Implemented `createIconIndex` to resolve icon markers and manage metadata.
- Introduced `metadata.mts` for defining metadata fields and types.
- Created `model.mts` for handling metadata suggestions and OpenAI interactions.
- Developed `pullRequest.mts` to manage pull request suggestions and caching.
- Added `referenceExamples.mts` for generating reference examples based on icon metadata.
- Established `repository.mts` for loading categories, groups, and icons from the repository.
- Built `suggestionComments.mts` to generate GitHub review comments with suggestions for icon metadata.
* feat(icons): apply tag groups to variant icons
Add 23 groups for common variant suffixes and use them in 89 icons, removing
the literal tags a group now provides. No icon loses a resolved tag; 65
icons gain tags from their group.
Groups: alert, check, clock, code, cog, currency, dot, heart, key, lock,
off, pause, pen, percent, play, question-mark, search, slash, sparkles,
star, stop, sync, user.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Add favorite
* feat(icons): extend base icon metadata in variant icons
Use `$extends:<base>` in 703 variant icons whose tags or categories already
include every value of their base icon, and remove the 1952 tags and 1058
categories the base now provides. The base is the longest prefix of the icon
name that is an icon, e.g. `clipboard-pen-line` extends `clipboard-pen`.
- `tags` extend their base in 417 icons, `categories` in 675
- Only applied where the base adds nothing new, so the resolved tags and
categories of every icon are unchanged
- `contributors` are left as they are
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YBLsKpZMoKKKVeibcuRXnC
* Apply batched suggestions from code review
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Karsa <contact@karsa.org>
* Apply feedback
* Updated groups
* Apply updates
* Apply more extends and groups
* Stricter checks
* Remove more duplicates
* Update tags
* Apply batched suggestions from code review
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Fix tags
* fix(icons): clean up groups manually, added directional, positional groups & shield, sort groups
* fix(icons): clean up groups manually, added directional, positional groups & shield, sort groups
* fix(icons): clean up groups manually, added directional, positional groups & shield, sort groups
* Added checkmark
---------
Co-authored-by: Eric <eric.fennis@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* feat(metadata): reusable tag groups with `$group:`
A `$group:<group-name>` marker in `tags` is replaced in place with the tags of
`groups/<group-name>.json`: a small set of tags for what a variant suffix
means, such as `-minus` → remove, delete.
- Read groups in `readGroups` and resolve markers next to `$extends:`,
failing on unknown groups and on `$group:` outside `tags`
- Add `group.schema.json` and lint, spell-check and format `groups/*.json`
- `pnpm checkIcons` also fails on literals a group already provides, and
warns about icons that list a group's tags by hand and unused groups
- Add the `minus`, `plus` and `x` groups and use them in
`alarm-clock-minus`, `file-minus`, `file-plus` and `file-x`
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(icons): apply tag groups to variant icons
Add 23 groups for common variant suffixes and use them in 89 icons, removing
the literal tags a group now provides. No icon loses a resolved tag; 65
icons gain tags from their group.
Groups: alert, check, clock, code, cog, currency, dot, heart, key, lock,
off, pause, pen, percent, play, question-mark, search, slash, sparkles,
star, stop, sync, user.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Add favorite
* feat(icons): extend base icon metadata in variant icons
Use `$extends:<base>` in 703 variant icons whose tags or categories already
include every value of their base icon, and remove the 1952 tags and 1058
categories the base now provides. The base is the longest prefix of the icon
name that is an icon, e.g. `clipboard-pen-line` extends `clipboard-pen`.
- `tags` extend their base in 417 icons, `categories` in 675
- Only applied where the base adds nothing new, so the resolved tags and
categories of every icon are unchanged
- `contributors` are left as they are
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YBLsKpZMoKKKVeibcuRXnC
* Apply batched suggestions from code review
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Karsa <contact@karsa.org>
* Apply feedback
* Updated groups
* Apply updates
* Apply more extends and groups
* Stricter checks
* Remove more duplicates
* Update tags
* Apply batched suggestions from code review
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Fix tags
* feat(metadata): reusable tag groups with `$group:`
A `$group:<group-name>` marker in `tags` is replaced in place with the tags of
`groups/<group-name>.json`: a small set of tags for what a variant suffix
means, such as `-minus` → remove, delete.
- Read groups in `readGroups` and resolve markers next to `$extends:`,
failing on unknown groups and on `$group:` outside `tags`
- Add `group.schema.json` and lint, spell-check and format `groups/*.json`
- `pnpm checkIcons` also fails on literals a group already provides, and
warns about icons that list a group's tags by hand and unused groups
- Add the `minus`, `plus` and `x` groups and use them in
`alarm-clock-minus`, `file-minus`, `file-plus` and `file-x`
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(icons): apply tag groups to variant icons
Add 23 groups for common variant suffixes and use them in 89 icons, removing
the literal tags a group now provides. No icon loses a resolved tag; 65
icons gain tags from their group.
Groups: alert, check, clock, code, cog, currency, dot, heart, key, lock,
off, pause, pen, percent, play, question-mark, search, slash, sparkles,
star, stop, sync, user.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Add favorite
* feat(icons): extend base icon metadata in variant icons
Use `$extends:<base>` in 703 variant icons whose tags or categories already
include every value of their base icon, and remove the 1952 tags and 1058
categories the base now provides. The base is the longest prefix of the icon
name that is an icon, e.g. `clipboard-pen-line` extends `clipboard-pen`.
- `tags` extend their base in 417 icons, `categories` in 675
- Only applied where the base adds nothing new, so the resolved tags and
categories of every icon are unchanged
- `contributors` are left as they are
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YBLsKpZMoKKKVeibcuRXnC
* Apply batched suggestions from code review
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Karsa <contact@karsa.org>
* Apply feedback
* Updated groups
* Apply updates
* Apply more extends and groups
* Stricter checks
* Remove more duplicates
* Update tags
* Apply batched suggestions from code review
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Fix tags
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Karsa <contact@karsa.org>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* feat(metadata): reusable tag groups with `$group:`
A `$group:<group-name>` marker in `tags` is replaced in place with the tags of
`groups/<group-name>.json`: a small set of tags for what a variant suffix
means, such as `-minus` → remove, delete.
- Read groups in `readGroups` and resolve markers next to `$extends:`,
failing on unknown groups and on `$group:` outside `tags`
- Add `group.schema.json` and lint, spell-check and format `groups/*.json`
- `pnpm checkIcons` also fails on literals a group already provides, and
warns about icons that list a group's tags by hand and unused groups
- Add the `minus`, `plus` and `x` groups and use them in
`alarm-clock-minus`, `file-minus`, `file-plus` and `file-x`
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fix group checker
* Apply batched suggestions from code review
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* feat(metadata): reusable tag groups with `$group:`
A `$group:<group-name>` marker in `tags` is replaced in place with the tags of
`groups/<group-name>.json`: a small set of tags for what a variant suffix
means, such as `-minus` → remove, delete.
- Read groups in `readGroups` and resolve markers next to `$extends:`,
failing on unknown groups and on `$group:` outside `tags`
- Add `group.schema.json` and lint, spell-check and format `groups/*.json`
- `pnpm checkIcons` also fails on literals a group already provides, and
warns about icons that list a group's tags by hand and unused groups
- Add the `minus`, `plus` and `x` groups and use them in
`alarm-clock-minus`, `file-minus`, `file-plus` and `file-x`
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fix group checker
* Apply batched suggestions from code review
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* feat(metadata): reusable tag groups with `$group:`
A `$group:<group-name>` marker in `tags` is replaced in place with the tags of
`groups/<group-name>.json`: a small set of tags for what a variant suffix
means, such as `-minus` → remove, delete.
- Read groups in `readGroups` and resolve markers next to `$extends:`,
failing on unknown groups and on `$group:` outside `tags`
- Add `group.schema.json` and lint, spell-check and format `groups/*.json`
- `pnpm checkIcons` also fails on literals a group already provides, and
warns about icons that list a group's tags by hand and unused groups
- Add the `minus`, `plus` and `x` groups and use them in
`alarm-clock-minus`, `file-minus`, `file-plus` and `file-x`
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fix group checker
* Apply batched suggestions from code review
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* feat(metadata): reusable tag groups with `$group:`
A `$group:<group-name>` marker in `tags` is replaced in place with the tags of
`groups/<group-name>.json`: a small set of tags for what a variant suffix
means, such as `-minus` → remove, delete.
- Read groups in `readGroups` and resolve markers next to `$extends:`,
failing on unknown groups and on `$group:` outside `tags`
- Add `group.schema.json` and lint, spell-check and format `groups/*.json`
- `pnpm checkIcons` also fails on literals a group already provides, and
warns about icons that list a group's tags by hand and unused groups
- Add the `minus`, `plus` and `x` groups and use them in
`alarm-clock-minus`, `file-minus`, `file-plus` and `file-x`
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fix group checker
* Apply batched suggestions from code review
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* feat(metadata): reuse metadata from a base icon with `$extends:`
Icon metadata can reference a base icon with an inline `$extends:<icon-name>`
marker in `tags`, `categories` or `contributors`. The marker is replaced in
place with the base icon's resolved values at build time.
- Resolve markers in `readAllMetadata` and `getIconMetaData`, failing on
unknown icons, self references and circular chains
- Accept markers in `icon.schema.json`
- `pnpm checkIcons` fails on duplicate markers and on literals a marker
already provides, and runs in CI
- Docs read the resolved metadata index instead of the raw icon JSON
- Use `$extends:alarm-clock` in `alarm-clock-minus`
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(metadata): reuse metadata from a base icon with `$extends:`
Icon metadata can reference a base icon with an inline `$extends:<icon-name>`
marker in `tags`, `categories` or `contributors`. The marker is replaced in
place with the base icon's resolved values at build time.
- Resolve markers in `readAllMetadata` and `getIconMetaData`, failing on
unknown icons, self references and circular chains
- Accept markers in `icon.schema.json`
- `pnpm checkIcons` fails on duplicate markers and on literals a marker
already provides, and runs in CI
- Docs read the resolved metadata index instead of the raw icon JSON
- Use `$extends:alarm-clock` in `alarm-clock-minus`
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fix comments
* Format code
* Update tools/build-helpers/src/resolveMetadataExtends.ts
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Fix resolving icon metadata
* feat(metadata): reuse metadata from a base icon with `$extends:`
Icon metadata can reference a base icon with an inline `$extends:<icon-name>`
marker in `tags`, `categories` or `contributors`. The marker is replaced in
place with the base icon's resolved values at build time.
- Resolve markers in `readAllMetadata` and `getIconMetaData`, failing on
unknown icons, self references and circular chains
- Accept markers in `icon.schema.json`
- `pnpm checkIcons` fails on duplicate markers and on literals a marker
already provides, and runs in CI
- Docs read the resolved metadata index instead of the raw icon JSON
- Use `$extends:alarm-clock` in `alarm-clock-minus`
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fix comments
* Format code
* Update tools/build-helpers/src/resolveMetadataExtends.ts
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Fix resolving icon metadata
* Fix comments
* Format code
* Update tools/build-helpers/src/resolveMetadataExtends.ts
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* chore(deps): bump the build-deps group across 1 directory with 2 updates
Bumps the build-deps group with 2 updates in the / directory: [typescript](https://github.com/microsoft/TypeScript) and [rollup](https://github.com/rollup/rollup).
Updates `typescript` from 6.0.3 to 7.0.2
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Commits](https://github.com/microsoft/TypeScript/compare/v6.0.3...v7.0.2)
Updates `rollup` from 4.63.1 to 4.65.0
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.63.1...v4.65.0)
---
updated-dependencies:
- dependency-name: typescript
dependency-version: 7.0.2
dependency-type: direct:development
update-type: version-update:semver-major
dependency-group: build-deps
- dependency-name: rollup
dependency-version: 4.65.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: build-deps
...
Signed-off-by: dependabot[bot] <support@github.com>
* chore(deps): keep typescript on v6 and ignore v7 major updates
TypeScript 7 (the native port) ships without the JS compiler API, which
typescript-eslint, rollup-plugin-dts, svelte-package/svelte-check, astro
check, the Angular compiler, vue-tsc and @vue/compiler-sfc all depend on.
Revert typescript to ^6.0.3, keep the rollup bump, and tell dependabot to
skip typescript major updates until the ecosystem supports v7.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Eric <eric.fennis@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Update deps
* chore(deps): use next for solid-js and @solidjs/web in Solid 2 integration
Keeps the integration on the same Solid release as @lucide/solid, so the
two no longer resolve separate solid-js copies sharing one @solidjs/signals,
which broke the declaration typecheck (TS2717 on ServerObserve.trace).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix(icons): align Unicode currency icon cap heights with other typographic icons
Also deprecates badge-, receipt- currency variants
* fix(icons): update riyal to be more in line with specifications
Rightmost lines evenly spaced, leftmost path somewhat lower than the currently matching line
* feat(icons): added letter icons for each uppercase letter of the English alphabet
* feat(icons): extend letter icons with specific use cases instead of generic ones
* feat(icons): replaced letter-z with more grid-aliged version
* feat(icons): add contributors from strikethrough to letter-s
* feat(icons): added square-letter-* & circle-letter-* icons
* feat(icons): manually optimized some icons
* fix(icons): deprecated circle-parking
* Rename import
* fix(icons): fix use case syntax for (circle|square)-letter icons
* fix(icons): added new Letters & digits category
* fix(icons): added numbers to new Letters & digits category
---------
Co-authored-by: Eric <eric.fennis@gmail.com>
* feat(icons): added letter icons for each uppercase letter of the English alphabet
* feat(icons): extend letter icons with specific use cases instead of generic ones
* feat(icons): replaced letter-z with more grid-aliged version
* feat(icons): add contributors from strikethrough to letter-s
* fix(icons): fix use case syntax for letter icons
* feat(icons): added `square-kanban-plus` icon
Adds square-kanban-plus for issue #4416.
Also updates emoji category icon reference after smile rename.
* chore(icons): expand square-kanban-plus metadata from PR suggestions
Apply curated tags, categories, and use-cases from automated
metadata review suggestions.
* Apply design from @jguddas
* Update contributors and use cases in square-kanban-plus.json
Added new contributors and updated use cases to improve clarity.
---------
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
* feat(docs): track homepage, icons page and icon drawer interactions with OpenPanel
Adds track/trackDebounced helpers around the shared OpenPanel instance and
sends events for hero actions, home search, packages, the style customizers,
homepage scroll depth, icon search (start, queries, no results), sort,
Lab library toggle, and the drawer's See in action, copy and studio buttons.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011GcWdCmSmcDiiAazR5mNUD
* feat(docs): send homepage scroll depth once on page leave
Instead of one event per milestone, record the deepest scroll position and
send a single home_scroll_depth event (percent + milestone) when the visitor
navigates away, closes the tab, or hides it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011GcWdCmSmcDiiAazR5mNUD
* feat(docs): simplify scroll depth tracking to the position on page leave
Drop the max-depth composable and send a single scroll_depth event with the
current scroll percentage before a route change and on visibilitychange,
pagehide and beforeunload, for every page.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011GcWdCmSmcDiiAazR5mNUD
* refactor(docs): move scroll depth tracking into the OpenPanel utils
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011GcWdCmSmcDiiAazR5mNUD
* refactor(docs): move router and browser tracking setup into the OpenPanel utils
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011GcWdCmSmcDiiAazR5mNUD
* Add privacy-policy
* adjust text
* Remove plausible
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Added icons/earbuds.svg
* Added icons/earbuds.json
* Create earbuds-off.json icon schema
Added a JSON schema for earbuds-off icon with use cases, tags, and categories.
* Add earbuds-off.svg icon file
* Update use-cases and fix typo in earbuds-off.json
* Refine use-cases and correct tag spelling
Updated use-cases and tags for clarity and added communication category.
* Update use cases and categories in earbuds-off.json
* Update categories
---------
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
Rewrite non-empty use-cases in icon metadata to follow
.github/instructions/metadata.instructions.md: start with a capitalized
present participle, no trailing periods, roughly 4-12 words, no first
person, and variant-specific wording instead of copied lines.
Claude-Session: https://claude.ai/code/session_011ftUgp98e8VLgymjSb9qbQ
Co-authored-by: Claude <noreply@anthropic.com>
2026-10-27 14:55:29 +01:00
Eric Fennisgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>Karsa
* feat(icons): add laser icon with metadata
* Update icons/laser.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Add more use cases and tags
* Update laser icon design
The laser design is according to @karsa-mistmere suggestion.
* Update laser icon design and its metadata
* Remove 'cursors' and 'devices' from categories
---------
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>
When the name prop changes while the previous icon is still loading, the earlier import could resolve last and overwrite the newer icon, leaving DynamicIcon showing the wrong icon. The effect now ignores results from a superseded name.
* feat(icons): added dirham icon
* feat(icons): use letter-d geometry from karsa-mistmere for dirham
* Apply suggestion from @github-actions[bot]
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* feat(metadata): add full names to dirham tags as requested by maintainer
* fix(metadata): add required use-cases field to dirham.json
* Apply suggestion from @github-actions[bot]
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update and rename dirham.json to emirati-dirham.json
* Rename dirham.svg to emirati-dirham.svg
---------
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Karsa <contact@karsa.org>
* feat(lucide-react): add package exports for per-icon imports without changing how Node resolves the package
Makes `lucide-react/icons/<name>` and `lucide-react/types` public so a
single icon can be imported with a small shared declaration instead of
the 2.2 MB `dist/lucide-react.d.ts`, and without loading the CJS barrel
on the server.
The root entry only lists `module` and `default`, so bundlers keep the
ESM barrel and Node keeps resolving to `dist/cjs/lucide-react.js` as it
does today through `main`. The map reverted in #2814 sent Node to the
ESM barrel, which is what #2743 hit. `./dist/*` keeps existing deep
imports working.
* Modify getting started guide for icon imports
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix(lucide-react): add node, import and require conditions after module and keep the extension-specific and src subpaths exported
Resolvers that are called with a custom condition list drop `module` and fell through to `default`, the CJS bundle; esbuild with `conditions: ['workerd', 'worker']` bundled 1.3 MB instead of the 58 KB tree-shaken output it gets on main. The root and `./icons` entries now list `node`, `import` and `require` after `module`, with `node` ahead of `import` so Node keeps resolving to `dist/cjs/lucide-react.js` for both `import` and `require`.
`lucide-react/dynamic.mjs`, `lucide-react/dynamic.js` and `lucide-react/dynamicIconImports.mjs` are imported by consumers and threw ERR_PACKAGE_PATH_NOT_EXPORTED; they have explicit entries again. The docs API routes import `lucide-react/src/createLucideIcon` and `lucide-react/src/Icon`, which Nitro left as external imports without a `./src/*` entry, so the entry from the 0.470.0 map is back.
* test(lucide-react): resolve the package entry points with Node itself in the React Router fixture
The browser suite resolves lucide-react through Vite, so nothing checked the `exports` map the way a server runtime does. `tests/exports.node.test.ts` runs under `node --test` from the fixture's `check` script and asserts where `import.meta.resolve` and `require.resolve` land for the root, `./icons`, a single icon, the dynamic entries with and without an extension, the `dist/*` passthrough and `package.json`, that `./types` is declaration-only, and that the resolved modules load. Vitest is told to leave that file to Node.
* docs(lucide-react): note that per-icon imports are ESM only
`require()` of `lucide-react/icons/<name>` needs Node.js 20.19 or 22.12; 20.18 throws ERR_REQUIRE_ESM.
---------
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
* refactor(ci): move icon preview markup into a composite action
Move generateChangedIconsCommentMarkup.mts into .github/actions/icon-preview
as its own pnpm workspace package, following the suggest-metadata action.
svgson and @lucide/helpers are now real dependencies installed with a
filtered pnpm install, replacing the ad-hoc `npm install svgson --force`.
Paths are resolved from the repo root relative to the script, so it also
works through `pnpm --filter @lucide/icon-preview-action start`.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(ci): skip icon preview comment when no icons changed
When a pull request only deletes icons, CHANGED_FILES has no SVGs and the
script printed "No changed icons found" to stdout, which was then posted as
the preview comment.
The script now logs that to stderr. The action writes no markup file and
sets `has-changes=false`, the workflow skips the artifact upload, and the
comment workflow skips its steps when no artifact exists instead of failing
on the missing artifact.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* ci(icon-preview): post the preview comment from a pull_request_target workflow
Like the PR title workflow, the icon preview now runs on pull_request_target
and posts its comment directly, so comment-icon-preview.yml and the
workflow_run artifact hand-off are removed.
The job checks out the base branch and runs the action from there. The
changed SVGs are read from the pull request head with `git fetch` + `git show`
into a temp directory, so no code from the pull request is checked out or run.
File names are checked against `icons/<kebab-case>.svg` before use.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>