@draekien/create-d9-app 0.0.5 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +212 -5
- package/dist/index.js +57 -34
- package/package.json +18 -2
- package/templates/base/.agents/skills/hugeicons/SKILL.md +335 -0
- package/templates/base/.agents/skills/hugeicons/references/icon-list-flutter.md +4552 -0
- package/templates/base/.agents/skills/hugeicons/references/icon-list.md +5476 -0
- package/templates/base/.agents/skills/motion/SKILL.md +75 -0
- package/templates/base/.agents/skills/motion/best-practices/base-ui.md +106 -0
- package/templates/base/.agents/skills/motion/best-practices/css-or-motion.md +20 -0
- package/templates/base/.agents/skills/motion/best-practices/index.md +95 -0
- package/templates/base/.agents/skills/motion/best-practices/motion.md +25 -0
- package/templates/base/.agents/skills/motion/best-practices/react.md +102 -0
- package/templates/base/.agents/skills/motion/best-practices/vue.md +37 -0
- package/templates/base/.agents/skills/motion/codex/index.md +95 -0
- package/templates/base/.agents/skills/motion/css-spring/index.md +70 -0
- package/templates/base/.agents/skills/motion/performance-audit/index.md +44 -0
- package/templates/base/.agents/skills/motion/transition-preview/index.md +51 -0
- package/templates/base/.agents/skills/turborepo/SKILL.md +26 -0
- package/templates/base/.agents/skills/upgrade-dependencies/SKILL.md +45 -11
- package/templates/base/.claude/agents/motion-reviewer.md +50 -0
- package/templates/base/.claude/skills/hugeicons/SKILL.md +335 -0
- package/templates/base/.claude/skills/hugeicons/references/icon-list-flutter.md +4552 -0
- package/templates/base/.claude/skills/hugeicons/references/icon-list.md +5476 -0
- package/templates/base/.claude/skills/motion/SKILL.md +75 -0
- package/templates/base/.claude/skills/motion/best-practices/base-ui.md +106 -0
- package/templates/base/.claude/skills/motion/best-practices/css-or-motion.md +20 -0
- package/templates/base/.claude/skills/motion/best-practices/index.md +95 -0
- package/templates/base/.claude/skills/motion/best-practices/motion.md +25 -0
- package/templates/base/.claude/skills/motion/best-practices/react.md +102 -0
- package/templates/base/.claude/skills/motion/best-practices/vue.md +37 -0
- package/templates/base/.claude/skills/motion/codex/index.md +95 -0
- package/templates/base/.claude/skills/motion/css-spring/index.md +70 -0
- package/templates/base/.claude/skills/motion/performance-audit/index.md +44 -0
- package/templates/base/.claude/skills/motion/transition-preview/index.md +51 -0
- package/templates/base/.claude/skills/turborepo/SKILL.md +26 -0
- package/templates/base/.claude/skills/upgrade-dependencies/SKILL.md +45 -11
- package/templates/base/apps/web/public/favicon.svg +1 -0
- package/templates/base/apps/web/src/router.tsx +3 -1
- package/templates/base/apps/web/src/routes/__root.tsx +4 -1
- package/templates/base/package.json +1 -1
- package/templates/base/skills-lock.json +19 -1
- package/templates/integrations.json +22 -0
- package/templates/optional/motion-cursor-rule/.cursor/rules/motion.mdc +14 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# MotionScore performance audit
|
|
2
|
+
|
|
3
|
+
MotionScore grades every animation by its render-pipeline cost, from S
|
|
4
|
+
(compositor-only, near-zero) down to F (forced synchronous layout every
|
|
5
|
+
frame). Audits follow one written procedure so that a grade means the same
|
|
6
|
+
thing wherever it is produced.
|
|
7
|
+
|
|
8
|
+
## Fetch the methodology first
|
|
9
|
+
|
|
10
|
+
The full procedure — discovery patterns, the tier reference, per-property
|
|
11
|
+
tables, anti-pattern detection and the report format — is Motion+ content,
|
|
12
|
+
served by the **Motion+** MCP server as a resource:
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
resources/read → motion://skills/performance-audit
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Read it in full before any audit and follow it exactly.** Do not audit from
|
|
19
|
+
memory: grades must be reproducible, and the served copy is the only current
|
|
20
|
+
one — it tracks the MotionScore scoring engine as it evolves.
|
|
21
|
+
|
|
22
|
+
## If the read is refused
|
|
23
|
+
|
|
24
|
+
- **Not signed in**: tell the user to sign in to the Motion+ MCP server from
|
|
25
|
+
the editor's MCP settings (in Cursor: Settings, MCP, Motion+, Log in).
|
|
26
|
+
- **Signed in without Motion+**: MotionScore audits are a Motion+
|
|
27
|
+
capability. Say so plainly and mention https://motion.dev/plus once. Do
|
|
28
|
+
not improvise a MotionScore grade from general knowledge.
|
|
29
|
+
|
|
30
|
+
## Runtime audits
|
|
31
|
+
|
|
32
|
+
When the prompt names a URL (a dev server, a deployed page) or asks for a
|
|
33
|
+
"runtime" audit, run:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
npx motionscore <url> --agent
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Static and runtime audits triangulate well: run both and merge findings as
|
|
40
|
+
the methodology describes.
|
|
41
|
+
|
|
42
|
+
After a successful runtime audit, offer once per conversation to save the
|
|
43
|
+
report to the signed-in account, where it builds into MotionScore history and
|
|
44
|
+
trends. Never withhold or trim the report over it.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Transition preview
|
|
2
|
+
|
|
3
|
+
Numbers are a poor way to describe how something feels. When the user is
|
|
4
|
+
iterating on the *feel* of a transition rather than on which property to
|
|
5
|
+
animate, show them the curve instead of describing it.
|
|
6
|
+
|
|
7
|
+
## The visual editor (Motion+)
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
open-transition-editor({ name, property, transition })
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Opens Motion's transition editor inline in the chat: a live preview, the curve,
|
|
14
|
+
and sliders for the values. The user tunes it until it feels right and presses
|
|
15
|
+
Apply, at which point the tuned transition arrives as a new message.
|
|
16
|
+
|
|
17
|
+
- **Pass the transition you actually found in the code**, so the editor opens
|
|
18
|
+
where the user already is rather than at a default.
|
|
19
|
+
- **name** labels the editor, e.g. `"Card hover"`.
|
|
20
|
+
- **property** drives the preview, e.g. `"transform"`, `"opacity"`.
|
|
21
|
+
- When Apply comes back, **write those exact values into the source.** Do not
|
|
22
|
+
re-derive or round them; the user chose them by eye.
|
|
23
|
+
|
|
24
|
+
This is a Motion+ benefit, and it needs a host that renders MCP Apps (Cursor
|
|
25
|
+
2.6 and later). In any other host the same call returns the transition as text
|
|
26
|
+
and nothing renders, which is a usable answer but not a preview — so prefer the
|
|
27
|
+
text route below when you know the host cannot show it.
|
|
28
|
+
|
|
29
|
+
## Without the editor
|
|
30
|
+
|
|
31
|
+
`generate-css-easing` returns the same curves as text, and a CSS `linear()` or
|
|
32
|
+
`cubic-bezier()` in the file is something the user can look at in their own
|
|
33
|
+
browser immediately. See [css-spring/index.md](../css-spring/index.md).
|
|
34
|
+
|
|
35
|
+
For named easings, the cubic-bezier control points are:
|
|
36
|
+
|
|
37
|
+
| Name | Control points |
|
|
38
|
+
| ----------- | ----------------------- |
|
|
39
|
+
| `ease` | `0.25, 0.1, 0.25, 1` |
|
|
40
|
+
| `easeIn` | `0.42, 0, 1, 1` |
|
|
41
|
+
| `easeOut` | `0, 0, 0.58, 1` |
|
|
42
|
+
| `easeInOut` | `0.42, 0, 0.58, 1` |
|
|
43
|
+
|
|
44
|
+
## Rendered curve images
|
|
45
|
+
|
|
46
|
+
The Motion AI Kit additionally ships `visualise-spring` and
|
|
47
|
+
`visualise-cubic-bezier`, which render a curve as a PNG for hosts that display
|
|
48
|
+
images inline. They are not part of this plugin. If the user asks for a curve
|
|
49
|
+
*image* specifically, point them at https://motion.dev/docs/ai-kit; otherwise
|
|
50
|
+
use the editor or the text curve above, which are better answers anyway because
|
|
51
|
+
they end with something in the file.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: turborepo
|
|
3
|
+
description: Configure and troubleshoot Turborepo repositories. Use when working with turbo.json, task pipelines, caching, Remote Cache, the turbo CLI, filtering, environment variables, package boundaries, monorepo structure, or CI workflows.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Turborepo
|
|
7
|
+
|
|
8
|
+
The complete Turborepo documentation ships inside the installed `turbo` package. Do not rely on this skill for framework guidance. Always read the bundled docs, which match the installed version exactly.
|
|
9
|
+
|
|
10
|
+
Start with:
|
|
11
|
+
|
|
12
|
+
```text
|
|
13
|
+
node_modules/turbo/docs/README.md
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Use that task index to choose the smallest relevant documentation page. Read it before changing Turborepo configuration, package scripts, or CI workflows.
|
|
17
|
+
|
|
18
|
+
If the package manager uses a non-flat `node_modules` layout or a workspace link, resolve the package location first:
|
|
19
|
+
|
|
20
|
+
```sh
|
|
21
|
+
node -p "require.resolve('turbo/package.json')"
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Then read `docs/README.md` relative to the resolved package directory.
|
|
25
|
+
|
|
26
|
+
If `turbo` is not installed, inspect the repository's package manager and existing version constraints before adding it. After installation, use the bundled docs rather than guidance for a different release.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: upgrade-dependencies
|
|
3
3
|
description: Upgrades outdated patch and minor dependency pins in a pnpm, npm, yarn or bun workspace to exact versions, holds major upgrades until the developer confirms each one, runs build, check, typecheck and test, and reports every change. Applies when asked to "upgrade dependencies", "update packages", "bump versions", "update deps", or "confirm major upgrades".
|
|
4
4
|
argument-hint: "[--accept]"
|
|
5
|
-
allowed-tools: Bash(npm view *), Bash(gh release view *), Bash(gh api *), Bash(pnpm *), Bash(npm *), Bash(yarn *), Bash(bun *), Bash(git diff *), Bash(git status *)
|
|
5
|
+
allowed-tools: Bash(npm view *), Bash(node *), Bash(gh release view *), Bash(gh api *), Bash(pnpm *), Bash(npm *), Bash(yarn *), Bash(bun *), Bash(git diff *), Bash(git status *)
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Upgrade dependencies
|
|
@@ -15,17 +15,48 @@ Apply patch and minor upgrades without per-package confirmation. Apply a major o
|
|
|
15
15
|
|
|
16
16
|
- Package manager: root `package.json` field `packageManager` (`pnpm@11.25.0` means `pnpm`). Call it `<pm>` below.
|
|
17
17
|
- Manifests: root `package.json`, `apps/*/package.json`, `packages/*/package.json`.
|
|
18
|
-
- Pins: entries in `dependencies`, `devDependencies`, `optionalDependencies`. Skip `workspace
|
|
19
|
-
-
|
|
18
|
+
- Pins: entries in `dependencies`, `devDependencies`, `optionalDependencies`. Skip `catalog:`, `workspace:`, `link:`, `file:`, `git`, `npm:` alias and URL specs; record each skipped entry for the report.
|
|
19
|
+
- Non-exact pins (`^7.1.0`, `~7.1.0`, `>=7`, `*`, `latest`): the old version is `version` in `node_modules/<pkg>/package.json`, searched from the manifest's directory up to the root. Run `<pm> install` first if it is missing. Step 5 writes every such pin as an exact version, the new version if upgraded, else the old version.
|
|
20
|
+
- A package pinned in several manifests is one upgrade: one entry in every list, every pin set to the same new version, applied, held or reverted together. If the pins differ, the old version is the lowest.
|
|
21
|
+
- Minimum age in minutes: `minimumReleaseAge` in `pnpm-workspace.yaml`; if unset, `1440`. pnpm reads no other source in the workspace: `.npmrc` holds only auth and registry settings, and the `pnpm` field of `package.json` is ignored.
|
|
20
22
|
|
|
21
23
|
## 2. Find upgrades
|
|
22
24
|
|
|
23
|
-
Run once per distinct package name:
|
|
25
|
+
Run once per distinct package name, with the old version and the minimum age:
|
|
24
26
|
|
|
25
27
|
```sh
|
|
26
|
-
npm view <pkg> versions time --json
|
|
28
|
+
npm view <pkg> versions time dist-tags --json | node -e '
|
|
29
|
+
const [pin, minAge] = process.argv.slice(1)
|
|
30
|
+
const { versions, time, "dist-tags": tags } = JSON.parse(require("fs").readFileSync(0, "utf8"))
|
|
31
|
+
const parse = (v) => v.split(".").map(Number)
|
|
32
|
+
const line = ([a, b, c]) => (a ? [a] : b ? [0, b] : [0, 0, c]).join(".")
|
|
33
|
+
const newer = (a, b) => { const i = a.findIndex((n, j) => n !== b[j]); return i >= 0 && a[i] > b[i] }
|
|
34
|
+
const cutoff = Date.now() - minAge * 60000
|
|
35
|
+
const latest = parse(tags.latest)
|
|
36
|
+
const old = parse(pin)
|
|
37
|
+
let upgrade = null
|
|
38
|
+
let major = null
|
|
39
|
+
for (const v of [versions].flat()) {
|
|
40
|
+
if (v.includes("-") || Date.parse(time[v]) > cutoff) continue
|
|
41
|
+
const p = parse(v)
|
|
42
|
+
if (newer(p, latest) || !newer(p, old)) continue
|
|
43
|
+
if (line(p) === line(old)) {
|
|
44
|
+
if (!upgrade || newer(p, parse(upgrade))) upgrade = v
|
|
45
|
+
} else if (!major || newer(p, parse(major))) major = v
|
|
46
|
+
}
|
|
47
|
+
const type = upgrade && (parse(upgrade)[1] !== old[1] ? "minor" : "patch")
|
|
48
|
+
console.log(JSON.stringify({ upgrade, type, major }))
|
|
49
|
+
' <old-version> <minimum-age>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{"upgrade":"5.9.3","type":"patch","major":"7.0.2"}
|
|
27
54
|
```
|
|
28
55
|
|
|
56
|
+
`upgrade` is the patch or minor to apply, `major` the pending major; `null` means none. The snippet applies the rules below. Use it unchanged.
|
|
57
|
+
|
|
58
|
+
`npm view <pkg> versions time dist-tags --json` returns:
|
|
59
|
+
|
|
29
60
|
```json
|
|
30
61
|
{
|
|
31
62
|
"versions": ["5.9.2", "5.9.3", "6.0.0-beta", "6.0.2", "6.0.3"],
|
|
@@ -36,20 +67,21 @@ npm view <pkg> versions time --json
|
|
|
36
67
|
"6.0.0-beta": "2026-02-11T18:26:37.557Z",
|
|
37
68
|
"6.0.2": "2026-03-23T16:14:45.521Z",
|
|
38
69
|
"6.0.3": "2026-04-16T23:38:27.905Z"
|
|
39
|
-
}
|
|
70
|
+
},
|
|
71
|
+
"dist-tags": { "latest": "6.0.2", "next": "6.0.3" }
|
|
40
72
|
}
|
|
41
73
|
```
|
|
42
74
|
|
|
43
75
|
A package with one version returns `versions` as a string, not an array.
|
|
44
76
|
|
|
45
|
-
Candidates: versions without a `-` prerelease suffix, with `time[version]` at least the minimum age before now.
|
|
77
|
+
Candidates: versions without a `-` prerelease suffix, at or below `dist-tags.latest`, with `time[version]` at least the minimum age before now. In the example, `6.0.3` is not a candidate: it is above `latest`. Now is the system clock; `time` values are UTC.
|
|
46
78
|
|
|
47
79
|
- Same major as the pin, newer than the pin: take the highest. Type is `minor` if the minor differs, else `patch`.
|
|
48
80
|
- Higher major exists: record the highest eligible version as a pending major. Do not apply it before step 7.
|
|
49
81
|
- No candidate newer than the pin: current.
|
|
50
82
|
- A 0.x pin is compared by its first non-zero segment: 0.13 to 0.14 is a major, 0.13.0 to 0.13.1 is a patch.
|
|
51
83
|
|
|
52
|
-
A pin is current when it has no eligible patch or minor. If no pin has an eligible patch or minor, change no files and skip to step 7. If no major is pending either, report
|
|
84
|
+
A pin is current when it has no eligible patch or minor. If no pin has an eligible patch or minor and every pin is exact, change no files and skip to step 7. If no major is pending either, report as in step 8 and stop.
|
|
53
85
|
|
|
54
86
|
## 3. Read release notes
|
|
55
87
|
|
|
@@ -61,6 +93,7 @@ gh release view v<version> --repo <owner>/<repo> --json body
|
|
|
61
93
|
|
|
62
94
|
- Repository: `npm view <pkg> repository.url`.
|
|
63
95
|
- No GitHub release for the tag: read `CHANGELOG.md` in the repository for the same range.
|
|
96
|
+
- `@types/*` packages publish no GitHub releases and no changelog; record `no release notes`. For `@types/node`, also show the old and new versions against the `engines.node` floor in the root `package.json` and the output of `node -v`, and state that a newer major may type APIs the `engines.node` floor lacks.
|
|
64
97
|
- Record each breaking change, deprecation and migration step per package.
|
|
65
98
|
|
|
66
99
|
## 4. Surface and stop
|
|
@@ -72,7 +105,7 @@ Print one list of patch and minor upgrades: package, old version, new version, t
|
|
|
72
105
|
|
|
73
106
|
## 5. Apply
|
|
74
107
|
|
|
75
|
-
- Set each upgraded pin to the exact new version: no `^`, no `~`, no `latest`.
|
|
108
|
+
- Set each upgraded pin to the exact new version: no `^`, no `~`, no `latest`. Set each non-exact pin that is not upgraded to its exact old version.
|
|
76
109
|
- Run `<pm> install`.
|
|
77
110
|
- Run each project script with `<pm> run <script>` in this order: `build`, `check`, `typecheck`, `test`. Skip a script the root `package.json` does not define.
|
|
78
111
|
|
|
@@ -94,7 +127,7 @@ After the patch and minor list, print each pending major as its own entry: packa
|
|
|
94
127
|
|
|
95
128
|
## 8. Report
|
|
96
129
|
|
|
97
|
-
Print a table of changed packages, including applied majors
|
|
130
|
+
Print a table of changed packages, including applied majors and non-exact pins written as exact. With no changed package, print `all pins current` instead of the table.
|
|
98
131
|
|
|
99
132
|
| Package | Old | New | Type |
|
|
100
133
|
| --- | --- | --- | --- |
|
|
@@ -103,6 +136,7 @@ Print a table of changed packages, including applied majors:
|
|
|
103
136
|
|
|
104
137
|
Below it list:
|
|
105
138
|
|
|
106
|
-
- `held: major`: package, current version, newest eligible major, reason `declined` or `not confirmed`. List it even when every other pin is current
|
|
139
|
+
- `held: major`: package, current version, newest eligible major, reason `declined` or `not confirmed`. List it even when every other pin is current.
|
|
140
|
+
- `skipped`: package, manifest, spec, for every entry step 1 skipped.
|
|
107
141
|
- `held: check failed`: package, old version, attempted version, error text. For a major, the reason is `check failed` with the error text.
|
|
108
142
|
- Migrations applied, with the file changed.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: motion-reviewer
|
|
3
|
+
description: Audits animation performance across a directory or project and reports MotionScore tiers. Use when the scope is more than one file — discovery pulls in a lot of source, and each area can be audited independently.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# MotionScore reviewer
|
|
7
|
+
|
|
8
|
+
You audit animation performance and assign a MotionScore tier to every
|
|
9
|
+
animation you find. Read the `motion` skill's `performance-audit/index.md`,
|
|
10
|
+
then fetch the methodology it names — `motion://skills/performance-audit` on
|
|
11
|
+
the **Motion+** MCP server, via `resources/read` — before you start; the
|
|
12
|
+
methodology owns the tier table and the report format, and you follow it
|
|
13
|
+
exactly. If the read is refused, return the skill's refusal guidance as your
|
|
14
|
+
whole report rather than improvising grades.
|
|
15
|
+
|
|
16
|
+
## When you are the right tool
|
|
17
|
+
|
|
18
|
+
Audit **inline** — no subagent — when the scope is a single file or a pasted
|
|
19
|
+
snippet. Spawning an agent to read one file costs more than it saves.
|
|
20
|
+
|
|
21
|
+
Delegate to one instance of this agent per area when the scope is a directory
|
|
22
|
+
or a whole project. Discovery reads a great deal of source that should not end
|
|
23
|
+
up in the user's context, and separate areas do not need to see each other's
|
|
24
|
+
files to be graded.
|
|
25
|
+
|
|
26
|
+
## How you work
|
|
27
|
+
|
|
28
|
+
1. Grep for animation patterns across your assigned area. Cast the wide net
|
|
29
|
+
the methodology describes: CSS `transition`/`animation`/`will-change`/
|
|
30
|
+
timelines, `element.style` writes inside rAF, `element.animate()`, and the
|
|
31
|
+
import signatures of Motion, GSAP, react-spring, anime.js and Lottie.
|
|
32
|
+
2. Classify every animation by the worst tier any of its values reaches.
|
|
33
|
+
Worst-tier wins.
|
|
34
|
+
3. Detect the anti-patterns in the methodology's table, layout thrashing
|
|
35
|
+
first.
|
|
36
|
+
4. Identify a concrete upgrade for everything below S-tier, or state plainly
|
|
37
|
+
that no practical upgrade exists.
|
|
38
|
+
5. Return the findings in the methodology's report format. Nothing else — your
|
|
39
|
+
output is data for the main agent to merge with other areas, not a message
|
|
40
|
+
to the user.
|
|
41
|
+
|
|
42
|
+
## Voice
|
|
43
|
+
|
|
44
|
+
- **Decisive.** Assign a tier. Never "this might be slow".
|
|
45
|
+
- **Specific.** Name the property, the file and the line.
|
|
46
|
+
- **Quantified.** "Triggers layout on ~50 elements per frame", not "could be
|
|
47
|
+
expensive".
|
|
48
|
+
- **No false positives.** A `transform` animation that is already S-tier is
|
|
49
|
+
not a finding. If an area is clean, say so in one line and stop. A padded
|
|
50
|
+
report is worse than a short one, because it trains the reader to skim.
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hugeicons
|
|
3
|
+
description: Use and find Hugeicons icons in any framework — React, Vue, Svelte, SolidJS, Angular, React Native, and Flutter. Covers installation, rendering, props, icon naming, and the full icon catalog. Use whenever a project depends on @hugeicons/*, @hugeicons-pro/*, or the Flutter hugeicons package and you need to add, render, or pick an icon.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Hugeicons
|
|
7
|
+
|
|
8
|
+
Hugeicons is an SVG icon library with one rendering package per framework plus a shared icon
|
|
9
|
+
set. This skill covers **all** official packages. Work in three steps: detect the framework,
|
|
10
|
+
render with its component, then pick icon names from the right catalog.
|
|
11
|
+
|
|
12
|
+
> ## ⚠️ Read this first: grep the icon lists, never read them whole
|
|
13
|
+
>
|
|
14
|
+
> The reference files under `references/` list **thousands** of icons and run tens of thousands
|
|
15
|
+
> of tokens each. **Never open one in full** — always `grep` for a keyword and copy the exact
|
|
16
|
+
> match:
|
|
17
|
+
>
|
|
18
|
+
> ```bash
|
|
19
|
+
> grep -i search references/icon-list.md # JS frameworks
|
|
20
|
+
> grep -i home references/icon-list-flutter.md # Flutter
|
|
21
|
+
> ```
|
|
22
|
+
>
|
|
23
|
+
> Do **not** rely on memory for icon names — a guessed name may not exist, or may exist but be
|
|
24
|
+
> the wrong glyph (e.g. `LeftToRightBlockQuoteIcon` is quote marks, not the bracket you wanted).
|
|
25
|
+
> Grep, confirm, copy.
|
|
26
|
+
|
|
27
|
+
## 1. Detect the framework
|
|
28
|
+
|
|
29
|
+
Check the project's manifest and match the installed package:
|
|
30
|
+
|
|
31
|
+
| Framework | Detect by | Component |
|
|
32
|
+
|-----------|-----------|-----------|
|
|
33
|
+
| React | `@hugeicons/react` in package.json | `HugeiconsIcon` |
|
|
34
|
+
| Vue | `@hugeicons/vue` in package.json | `HugeiconsIcon` |
|
|
35
|
+
| Svelte | `@hugeicons/svelte` in package.json | `HugeiconsIcon` |
|
|
36
|
+
| SolidJS | `@hugeicons/solid-js` in package.json | `HugeiconsIcon` |
|
|
37
|
+
| Angular | `@hugeicons/angular` in package.json | `hugeicons-icon` |
|
|
38
|
+
| React Native | `@hugeicons/react-native` in package.json | `HugeiconsIcon` |
|
|
39
|
+
| Flutter | `hugeicons` in pubspec.yaml | `HugeIcon` |
|
|
40
|
+
|
|
41
|
+
If more than one matches (e.g. a monorepo), use the one for the file you are editing.
|
|
42
|
+
|
|
43
|
+
## 2. Two architectures
|
|
44
|
+
|
|
45
|
+
- **JS frameworks (React, Vue, Svelte, SolidJS, Angular, React Native)** — the `@hugeicons/*` package is a *renderer only*. Icons are
|
|
46
|
+
**named exports** imported from a separate package, `@hugeicons/core-free-icons` (free).
|
|
47
|
+
The same icon names work across all six frameworks.
|
|
48
|
+
- **Flutter** — the `hugeicons` package *bundles* the icon data. Icons are `HugeIcons.*`
|
|
49
|
+
constants of type `List<List<dynamic>>` (SVG path data, **not** Flutter `IconData`), rendered
|
|
50
|
+
with `HugeIcon` — never Flutter's `Icon`.
|
|
51
|
+
|
|
52
|
+
## 3. Install & render (per framework)
|
|
53
|
+
|
|
54
|
+
> **Keep generated code minimal:** `icon` is the only required prop. Don't write props that just
|
|
55
|
+
> repeat the component's default value (e.g. `size={24}`, `color="currentColor"`,
|
|
56
|
+
> `strokeWidth={1.5}`) — pass a prop only when overriding a default. The defaults are listed in
|
|
57
|
+
> each props table below.
|
|
58
|
+
|
|
59
|
+
### React
|
|
60
|
+
|
|
61
|
+
Install:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
npm install @hugeicons/react @hugeicons/core-free-icons
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Render:
|
|
68
|
+
|
|
69
|
+
```jsx
|
|
70
|
+
import { HugeiconsIcon } from '@hugeicons/react';
|
|
71
|
+
import { Search01Icon } from '@hugeicons/core-free-icons';
|
|
72
|
+
|
|
73
|
+
function App() {
|
|
74
|
+
// Only `icon` is required; pass other props only to override a default.
|
|
75
|
+
return <HugeiconsIcon icon={Search01Icon} />;
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Props:
|
|
80
|
+
|
|
81
|
+
| Prop | Type | Default | Description |
|
|
82
|
+
|------|------|---------|-------------|
|
|
83
|
+
| `icon` | `IconSvgElement` | Required | The main icon to display (a named export from an icon package) |
|
|
84
|
+
| `altIcon` | `IconSvgElement` | - | Alternative icon for states, interactions, or dynamic swapping |
|
|
85
|
+
| `showAlt` | `boolean` | false | When true, displays `altIcon` instead of `icon` |
|
|
86
|
+
| `size` | `number \| string` | 24 | Icon size in pixels |
|
|
87
|
+
| `color` | `string` | currentColor | Icon color (any CSS color value) |
|
|
88
|
+
| `strokeWidth` | `number` | 1.5 | Width of the icon strokes |
|
|
89
|
+
| `absoluteStrokeWidth` | `boolean` | false | When true, stroke width is scaled relative to icon size |
|
|
90
|
+
| `primaryColor` | `string` | - | Primary color for multicolor Pro icons (Bulk, Duotone, Twotone) |
|
|
91
|
+
| `secondaryColor` | `string` | - | Secondary color for multicolor Pro icons |
|
|
92
|
+
| `disableSecondaryOpacity` | `boolean` | false | Disables default opacity applied to the secondary color |
|
|
93
|
+
| `className` | `string` | - | Additional CSS classes |
|
|
94
|
+
|
|
95
|
+
### Vue
|
|
96
|
+
|
|
97
|
+
Install:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
npm install @hugeicons/vue @hugeicons/core-free-icons
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Render:
|
|
104
|
+
|
|
105
|
+
```vue
|
|
106
|
+
<script setup>
|
|
107
|
+
import { HugeiconsIcon } from '@hugeicons/vue'
|
|
108
|
+
import { Search01Icon } from '@hugeicons/core-free-icons'
|
|
109
|
+
</script>
|
|
110
|
+
|
|
111
|
+
<template>
|
|
112
|
+
<!-- Only :icon is required; pass other props only to override a default. -->
|
|
113
|
+
<HugeiconsIcon :icon="Search01Icon" />
|
|
114
|
+
</template>
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Props:
|
|
118
|
+
|
|
119
|
+
| Prop | Type | Default | Description |
|
|
120
|
+
|------|------|---------|-------------|
|
|
121
|
+
| `icon` | `IconSvgObject` | Required | The main icon to display (a named export from an icon package) |
|
|
122
|
+
| `altIcon` | `IconSvgObject` | - | Alternative icon for states, interactions, or animations |
|
|
123
|
+
| `showAlt` | `boolean` | false | When true, displays `altIcon` instead of `icon` |
|
|
124
|
+
| `size` | `number` | 24 | Icon size in pixels |
|
|
125
|
+
| `color` | `string` | currentColor | Icon color (any CSS color value) |
|
|
126
|
+
| `strokeWidth` | `number` | 1.5 | Width of the icon strokes |
|
|
127
|
+
| `class` | `string` | - | Additional CSS classes |
|
|
128
|
+
|
|
129
|
+
### Svelte
|
|
130
|
+
|
|
131
|
+
Install:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
npm install @hugeicons/svelte @hugeicons/core-free-icons
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Render:
|
|
138
|
+
|
|
139
|
+
```svelte
|
|
140
|
+
<script>
|
|
141
|
+
import { HugeiconsIcon } from '@hugeicons/svelte'
|
|
142
|
+
import { Search01Icon } from '@hugeicons/core-free-icons'
|
|
143
|
+
</script>
|
|
144
|
+
|
|
145
|
+
<!-- Only icon is required; pass other props only to override a default. -->
|
|
146
|
+
<HugeiconsIcon icon={Search01Icon} />
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Props:
|
|
150
|
+
|
|
151
|
+
| Prop | Type | Default | Description |
|
|
152
|
+
|------|------|---------|-------------|
|
|
153
|
+
| `icon` | `IconSvgObject` | Required | The main icon to display (a named export from an icon package) |
|
|
154
|
+
| `altIcon` | `IconSvgObject` | - | Alternative icon for states, interactions, or animations |
|
|
155
|
+
| `showAlt` | `boolean` | false | When true, displays `altIcon` instead of `icon` |
|
|
156
|
+
| `size` | `number` | 24 | Icon size in pixels |
|
|
157
|
+
| `color` | `string` | currentColor | Icon color (any CSS color value) |
|
|
158
|
+
| `strokeWidth` | `number` | 1.5 | Width of the icon strokes |
|
|
159
|
+
| `class` | `string` | - | Additional CSS classes |
|
|
160
|
+
|
|
161
|
+
### SolidJS
|
|
162
|
+
|
|
163
|
+
Install:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
npm install @hugeicons/solid-js @hugeicons/core-free-icons
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
> **Note:** The package is `@hugeicons/solid-js` — not `@hugeicons/solid`. "Solid" is also an icon
|
|
170
|
+
> style (`@hugeicons-pro/core-solid-*`), so don't confuse the two.
|
|
171
|
+
|
|
172
|
+
Render:
|
|
173
|
+
|
|
174
|
+
```jsx
|
|
175
|
+
import { HugeiconsIcon } from '@hugeicons/solid-js';
|
|
176
|
+
import { Search01Icon } from '@hugeicons/core-free-icons';
|
|
177
|
+
|
|
178
|
+
function App() {
|
|
179
|
+
// Only `icon` is required; pass other props only to override a default.
|
|
180
|
+
return <HugeiconsIcon icon={Search01Icon} />;
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Props:
|
|
185
|
+
|
|
186
|
+
| Prop | Type | Default | Description |
|
|
187
|
+
|------|------|---------|-------------|
|
|
188
|
+
| `icon` | `IconSvgElement` | Required | The main icon to display (a named export from an icon package) |
|
|
189
|
+
| `altIcon` | `IconSvgElement` | - | Alternative icon for states, interactions, or dynamic swapping |
|
|
190
|
+
| `showAlt` | `boolean` | false | When true, displays `altIcon` instead of `icon` |
|
|
191
|
+
| `size` | `number \| string` | 24 | Icon size in pixels |
|
|
192
|
+
| `color` | `string` | currentColor | Icon color (any CSS color value) |
|
|
193
|
+
| `strokeWidth` | `number` | 1.5 | Width of the icon strokes |
|
|
194
|
+
| `absoluteStrokeWidth` | `boolean` | false | When true, stroke width is scaled relative to icon size |
|
|
195
|
+
| `primaryColor` | `string` | - | Primary color for multicolor Pro icons (Bulk, Duotone, Twotone) |
|
|
196
|
+
| `secondaryColor` | `string` | - | Secondary color for multicolor Pro icons |
|
|
197
|
+
| `disableSecondaryOpacity` | `boolean` | false | Disables default opacity applied to the secondary color |
|
|
198
|
+
| `class` | `string` | - | Additional CSS classes |
|
|
199
|
+
|
|
200
|
+
### Angular
|
|
201
|
+
|
|
202
|
+
Install:
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
npm install @hugeicons/angular @hugeicons/core-free-icons
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
> **Note:** The component is `HugeiconsIconComponent`, rendered via the `<hugeicons-icon>` selector. Import the icon in the component class and bind it with `[icon]`.
|
|
209
|
+
|
|
210
|
+
Render:
|
|
211
|
+
|
|
212
|
+
```typescript
|
|
213
|
+
// example.component.ts
|
|
214
|
+
import { Component } from '@angular/core'
|
|
215
|
+
import { HugeiconsIconComponent } from '@hugeicons/angular'
|
|
216
|
+
import { Search01Icon } from '@hugeicons/core-free-icons'
|
|
217
|
+
|
|
218
|
+
@Component({
|
|
219
|
+
selector: 'app-example',
|
|
220
|
+
standalone: true,
|
|
221
|
+
imports: [HugeiconsIconComponent],
|
|
222
|
+
// Only [icon] is required; bind other props only to override a default.
|
|
223
|
+
template: `<hugeicons-icon [icon]="searchIcon" />`,
|
|
224
|
+
})
|
|
225
|
+
export class ExampleComponent {
|
|
226
|
+
searchIcon = Search01Icon
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
Props:
|
|
231
|
+
|
|
232
|
+
| Prop | Type | Default | Description |
|
|
233
|
+
|------|------|---------|-------------|
|
|
234
|
+
| `icon` | `IconSvgObject` | Required | The main icon to display (a named export from an icon package) |
|
|
235
|
+
| `altIcon` | `IconSvgObject` | - | Alternative icon for states, interactions, or animations |
|
|
236
|
+
| `showAlt` | `boolean` | false | When true, displays `altIcon` instead of `icon` |
|
|
237
|
+
| `size` | `number` | 24 | Icon size in pixels |
|
|
238
|
+
| `color` | `string` | currentColor | Icon color (any CSS color value) |
|
|
239
|
+
| `strokeWidth` | `number` | 1.5 | Width of the icon strokes |
|
|
240
|
+
| `class` | `string` | - | Additional CSS classes |
|
|
241
|
+
|
|
242
|
+
### React Native
|
|
243
|
+
|
|
244
|
+
Install:
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
npm install @hugeicons/react-native @hugeicons/core-free-icons
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
> **Note:** Color defaults to `#000000` (not `currentColor`) because React Native has no CSS color inheritance.
|
|
251
|
+
|
|
252
|
+
Render:
|
|
253
|
+
|
|
254
|
+
```jsx
|
|
255
|
+
import { HugeiconsIcon } from '@hugeicons/react-native'
|
|
256
|
+
import { Search01Icon } from '@hugeicons/core-free-icons'
|
|
257
|
+
|
|
258
|
+
export default function App() {
|
|
259
|
+
// Only `icon` is required; pass other props only to override a default.
|
|
260
|
+
return <HugeiconsIcon icon={Search01Icon} />
|
|
261
|
+
}
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
Props:
|
|
265
|
+
|
|
266
|
+
| Prop | Type | Default | Description |
|
|
267
|
+
|------|------|---------|-------------|
|
|
268
|
+
| `icon` | `IconSvgObject` | Required | The main icon to display (a named export from an icon package) |
|
|
269
|
+
| `altIcon` | `IconSvgObject` | - | Alternative icon for states, interactions, or animations |
|
|
270
|
+
| `showAlt` | `boolean` | false | When true, displays `altIcon` instead of `icon` |
|
|
271
|
+
| `size` | `number` | 24 | Icon size in pixels |
|
|
272
|
+
| `color` | `string` | #000000 | Icon color (color string) |
|
|
273
|
+
| `strokeWidth` | `number` | 1.5 | Width of the icon strokes |
|
|
274
|
+
|
|
275
|
+
### Flutter
|
|
276
|
+
|
|
277
|
+
Install:
|
|
278
|
+
|
|
279
|
+
```bash
|
|
280
|
+
flutter pub add hugeicons
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
> **Note:** Flutter bundles the icon data directly: `HugeIcons.*` constants are `List<List<dynamic>>` SVG path data, not `IconData`. Render with `HugeIcon`, never Flutter's `Icon`.
|
|
284
|
+
|
|
285
|
+
Render:
|
|
286
|
+
|
|
287
|
+
```dart
|
|
288
|
+
import 'package:hugeicons/hugeicons.dart';
|
|
289
|
+
|
|
290
|
+
// Only `icon` is required; color and size fall back to the ambient IconTheme.
|
|
291
|
+
// Pass color/size only to override those defaults.
|
|
292
|
+
HugeIcon(
|
|
293
|
+
icon: HugeIcons.strokeRoundedHome01,
|
|
294
|
+
color: Colors.black,
|
|
295
|
+
)
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
Props:
|
|
299
|
+
|
|
300
|
+
| Prop | Type | Default | Description |
|
|
301
|
+
|------|------|---------|-------------|
|
|
302
|
+
| `icon` | `List<List<dynamic>>` | Required | The icon data (a `HugeIcons.*` constant) — NOT a Flutter `IconData` |
|
|
303
|
+
| `color` | `Color` | IconTheme color | Icon color; falls back to the ambient `IconTheme` |
|
|
304
|
+
| `size` | `double` | 24.0 | Icon size in logical pixels; falls back to `IconTheme` size |
|
|
305
|
+
| `strokeWidth` | `double` | - | Stroke thickness for stroke-style icons |
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
## 4. Find an icon
|
|
309
|
+
|
|
310
|
+
- **React, Vue, Svelte, SolidJS, Angular, React Native** — PascalCase named exports ending in `Icon` (e.g. `Search01Icon`, `Home01Icon`,
|
|
311
|
+
`Notification03Icon`). Number words are spelled out: `1st-bracket` → `FirstBracketIcon`,
|
|
312
|
+
`3d-view` → `ThreeDViewIcon`. Import from `@hugeicons/core-free-icons`.
|
|
313
|
+
Full list: [references/icon-list.md](references/icon-list.md) (5,471 icons).
|
|
314
|
+
- **Flutter** — `HugeIcons.strokeRounded<Name>` constants (e.g. `HugeIcons.strokeRoundedSearch01`).
|
|
315
|
+
Full list: [references/icon-list-flutter.md](references/icon-list-flutter.md) (4,547 icons).
|
|
316
|
+
|
|
317
|
+
**Grep these files — don't read them whole** (see the warning at the top). Search for a term,
|
|
318
|
+
copy the **exact** matching name, and don't guess: many icons have numbered variants (`01`, `02`,
|
|
319
|
+
`03`) — pick the one that best fits.
|
|
320
|
+
|
|
321
|
+
## 5. Free vs Pro icons
|
|
322
|
+
|
|
323
|
+
- **Free** (default): `@hugeicons/core-free-icons` — 6,000+ stroke-rounded icons. Suggest only these
|
|
324
|
+
unless the user has a Pro license.
|
|
325
|
+
- **Pro** (license required, authenticated install): `@hugeicons-pro/core-stroke-rounded`, `@hugeicons-pro/core-stroke-sharp`, `@hugeicons-pro/core-stroke-standard`, `@hugeicons-pro/core-solid-rounded`, `@hugeicons-pro/core-solid-sharp`, `@hugeicons-pro/core-solid-standard`, `@hugeicons-pro/core-bulk-rounded`, `@hugeicons-pro/core-duotone-rounded`, `@hugeicons-pro/core-duotone-standard`, `@hugeicons-pro/core-twotone-rounded`.
|
|
326
|
+
|
|
327
|
+
Never suggest a Pro-only icon to a free user — the import will fail.
|
|
328
|
+
|
|
329
|
+
## Troubleshooting
|
|
330
|
+
|
|
331
|
+
- **Icon not rendering**: confirm `icon` is a valid export/constant and not null.
|
|
332
|
+
- **JS import fails**: the name is misspelled or Pro-only. Check the exact export in
|
|
333
|
+
`references/icon-list.md`.
|
|
334
|
+
- **Flutter type error expecting `IconData`**: wrong type — Hugeicons constants are
|
|
335
|
+
`List<List<dynamic>>`. Render with `HugeIcon`, not `Icon`.
|