@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.
Files changed (43) hide show
  1. package/README.md +212 -5
  2. package/dist/index.js +57 -34
  3. package/package.json +18 -2
  4. package/templates/base/.agents/skills/hugeicons/SKILL.md +335 -0
  5. package/templates/base/.agents/skills/hugeicons/references/icon-list-flutter.md +4552 -0
  6. package/templates/base/.agents/skills/hugeicons/references/icon-list.md +5476 -0
  7. package/templates/base/.agents/skills/motion/SKILL.md +75 -0
  8. package/templates/base/.agents/skills/motion/best-practices/base-ui.md +106 -0
  9. package/templates/base/.agents/skills/motion/best-practices/css-or-motion.md +20 -0
  10. package/templates/base/.agents/skills/motion/best-practices/index.md +95 -0
  11. package/templates/base/.agents/skills/motion/best-practices/motion.md +25 -0
  12. package/templates/base/.agents/skills/motion/best-practices/react.md +102 -0
  13. package/templates/base/.agents/skills/motion/best-practices/vue.md +37 -0
  14. package/templates/base/.agents/skills/motion/codex/index.md +95 -0
  15. package/templates/base/.agents/skills/motion/css-spring/index.md +70 -0
  16. package/templates/base/.agents/skills/motion/performance-audit/index.md +44 -0
  17. package/templates/base/.agents/skills/motion/transition-preview/index.md +51 -0
  18. package/templates/base/.agents/skills/turborepo/SKILL.md +26 -0
  19. package/templates/base/.agents/skills/upgrade-dependencies/SKILL.md +45 -11
  20. package/templates/base/.claude/agents/motion-reviewer.md +50 -0
  21. package/templates/base/.claude/skills/hugeicons/SKILL.md +335 -0
  22. package/templates/base/.claude/skills/hugeicons/references/icon-list-flutter.md +4552 -0
  23. package/templates/base/.claude/skills/hugeicons/references/icon-list.md +5476 -0
  24. package/templates/base/.claude/skills/motion/SKILL.md +75 -0
  25. package/templates/base/.claude/skills/motion/best-practices/base-ui.md +106 -0
  26. package/templates/base/.claude/skills/motion/best-practices/css-or-motion.md +20 -0
  27. package/templates/base/.claude/skills/motion/best-practices/index.md +95 -0
  28. package/templates/base/.claude/skills/motion/best-practices/motion.md +25 -0
  29. package/templates/base/.claude/skills/motion/best-practices/react.md +102 -0
  30. package/templates/base/.claude/skills/motion/best-practices/vue.md +37 -0
  31. package/templates/base/.claude/skills/motion/codex/index.md +95 -0
  32. package/templates/base/.claude/skills/motion/css-spring/index.md +70 -0
  33. package/templates/base/.claude/skills/motion/performance-audit/index.md +44 -0
  34. package/templates/base/.claude/skills/motion/transition-preview/index.md +51 -0
  35. package/templates/base/.claude/skills/turborepo/SKILL.md +26 -0
  36. package/templates/base/.claude/skills/upgrade-dependencies/SKILL.md +45 -11
  37. package/templates/base/apps/web/public/favicon.svg +1 -0
  38. package/templates/base/apps/web/src/router.tsx +3 -1
  39. package/templates/base/apps/web/src/routes/__root.tsx +4 -1
  40. package/templates/base/package.json +1 -1
  41. package/templates/base/skills-lock.json +19 -1
  42. package/templates/integrations.json +22 -0
  43. 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:*`, `link:`, `file:`, `git`, `npm:` alias and URL specs.
19
- - Minimum age in minutes: `minimumReleaseAge` in `pnpm-workspace.yaml` or `.npmrc`; if unset, `1440`.
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 `all pins current` and stop.
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; the no-change report is `all pins current` plus this list.
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`.