@fusion.dev/helix 0.193.0 → 0.194.0

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 (34) hide show
  1. package/api.json +1 -1
  2. package/custom-elements.json +126 -28
  3. package/dist/accordion/root/accordion-root.d.ts +2 -0
  4. package/dist/blockquote/root/blockquote-root.d.ts +2 -0
  5. package/dist/button/root/button-root.d.ts +2 -0
  6. package/dist/checkbox/root/checkbox-root.d.ts +2 -0
  7. package/dist/code/root/code-root.d.ts +2 -0
  8. package/dist/code-block/root/code-block-root.d.ts +2 -0
  9. package/dist/color-input/root/color-input-root.d.ts +2 -0
  10. package/dist/date-input/root/date-input-root.d.ts +2 -0
  11. package/dist/dialog/root/dialog-root.d.ts +2 -0
  12. package/dist/divider/root/divider-root.d.ts +2 -0
  13. package/dist/file-input/root/file-input-root.d.ts +2 -0
  14. package/dist/image/root/image-root.d.ts +2 -0
  15. package/dist/input/root/input-root.d.ts +2 -0
  16. package/dist/kbd/root/kbd-root.d.ts +2 -0
  17. package/dist/list/root/list-root.d.ts +2 -0
  18. package/dist/meter/root/meter-root.d.ts +2 -0
  19. package/dist/notifications/root/notifications-root.css.js +1 -1
  20. package/dist/number-input/root/number-input-root.d.ts +2 -0
  21. package/dist/progress/root/progress-root.d.ts +2 -0
  22. package/dist/quote/root/quote-root.d.ts +2 -0
  23. package/dist/radio/root/radio-root.d.ts +2 -0
  24. package/dist/select/root/select-root.d.ts +2 -0
  25. package/dist/slider/root/slider-root.d.ts +2 -0
  26. package/dist/table/root/table-root.d.ts +2 -0
  27. package/dist/text/root/text-root.d.ts +2 -0
  28. package/dist/textarea/root/textarea-root.d.ts +2 -0
  29. package/dist/time-input/root/time-input-root.d.ts +2 -0
  30. package/dist/video/root/video-root.d.ts +2 -0
  31. package/examples.json +1 -1
  32. package/lint.json +1 -1
  33. package/package.json +6 -6
  34. package/skills/helix/SKILL.md +58 -296
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fusion.dev/helix",
3
3
  "description": "Styled component tier. Extends the headless tier with token-driven presentation.",
4
- "version": "0.193.0",
4
+ "version": "0.194.0",
5
5
  "license": "MIT",
6
6
  "author": "Ross Sheppard <ross.sheppard@fusion.dev>",
7
7
  "repository": {
@@ -60,14 +60,14 @@
60
60
  },
61
61
  "bugs": "https://github.com/project-fusion/fusion/issues",
62
62
  "dependencies": {
63
- "@fusion.dev/helix-core": "0.193.0",
64
- "@fusion.dev/helix-headless": "0.193.0",
65
- "@fusion.dev/helix-styles": "0.193.0",
63
+ "@fusion.dev/helix-core": "0.194.0",
64
+ "@fusion.dev/helix-headless": "0.194.0",
65
+ "@fusion.dev/helix-styles": "0.194.0",
66
66
  "tslib": "^2.8.1"
67
67
  },
68
68
  "devDependencies": {
69
- "@fusion.dev/helix-cem": "0.193.0",
70
- "@fusion.dev/helix-testing": "0.193.0",
69
+ "@fusion.dev/helix-cem": "0.194.0",
70
+ "@fusion.dev/helix-testing": "0.194.0",
71
71
  "@fusion.dev/scripts": "0.0.0-dev",
72
72
  "@happy-dom/global-registrator": "^20.14.5",
73
73
  "@lit-labs/ssr": "^4.1.0",
@@ -1,51 +1,62 @@
1
1
  ---
2
2
  name: helix
3
- description: Writes and checks pages built with Helix, the web components in @fusion.dev/helix. Use when writing or reviewing code with helix- elements, Helix tokens, or the helix command line.
3
+ description: Writes and checks pages built with Helix, the web components in @fusion.dev/helix. Use when building or reviewing any user interface in a project that installs @fusion.dev/helix, and when code has helix- elements, Helix tokens, or the helix command line.
4
4
  metadata:
5
- version: "0.193.0"
5
+ version: "0.194.0"
6
6
  ---
7
7
 
8
8
  # Helix
9
9
 
10
- This guide is for @fusion.dev/helix 0.193.0, the version installed beside it.
10
+ This guide is for @fusion.dev/helix 0.194.0, the version installed beside it.
11
11
 
12
12
  ## Using Helix with an agent
13
13
 
14
- This guide is in two places, and both say the same thing:
14
+ This guide is what an agent reads before writing Helix code. It is also the
15
+ `helix` skill: `skills/helix/SKILL.md` in `@fusion.dev/helix`, which matches the
16
+ version installed, and the skill in Helix's plugin for coding agents. [Coding
17
+ agents](https://fusion.dev/helix/docs/coding-agents) says how to install the plugin or link the skill.
15
18
 
16
- - this page, which [llms.txt](https://fusion.dev/llms.txt) indexes
17
- - `skills/helix/SKILL.md` inside `@fusion.dev/helix`, which matches the version
18
- you installed and works offline
19
+ ### Use a Helix family wherever one exists
19
20
 
20
- [Link your tool to this guide](#link-your-tool-to-this-guide) says how to point
21
- each tool at one of them. [The MCP server](https://fusion.dev/helix/docs/coding-agents) works with any
22
- vendor and runs code, and Claude, Cursor, Windsurf, and Zed all support it.
21
+ Write a Helix element for everything Helix has a family for, and a native
22
+ element only for page structure. Before you write a native element, ask whether
23
+ a family stands in for it:
23
24
 
24
- ### Read the family before writing its tags
25
+ - `helix api find <tag>`, or the MCP tool `helix_find`, answers a native tag
26
+ with its family: `button` finds Button, and `h1` finds Text.
27
+ - Each family's file lists the native elements it replaces under `replaces`.
25
28
 
26
- ```
27
- https://fusion.dev/helix/components/<family>.md
28
- https://fusion.dev/helix/components/<family>.json
29
- ```
29
+ These native elements have families:
30
30
 
31
- Each family's file lists:
31
+ - controls: `button`, `input` of every visible type, `select`, and `textarea`
32
+ - overlays and disclosure: `dialog` and `details`
33
+ - text: `h1` to `h6` and `p`, which `helix-text` writes with `as="h1"` and the
34
+ rest
35
+ - content: `img`, `picture`, `hr`, `ul`, `ol`, `table`, `code`, `pre`, `kbd`,
36
+ `blockquote`, `q`, `video`, `progress`, and `meter`
32
37
 
33
- - the import lines for the family
34
- - every tag
35
- - every property, with its literal union
36
- - every event, with its class and its React prop
37
- - every slot, part, and custom property
38
- - the examples, each with the import lines it needs
38
+ Page structure stays native: `main`, `section`, `article`, `header`, `footer`,
39
+ `nav`, `form`, `label`, `div`, `span`, and `a`. So does markup a CMS writes
40
+ inside `data-prose`.
39
41
 
40
- **If a tag is not in a family's file, it does not exist.** A property value
41
- outside a declared union is invalid. Property types are literal unions for this
42
- reason. `'ghost' | 'outlined' | 'solid' | 'subtle'` shows you the values, and a
43
- named type such as `ButtonEmphasis` sends you somewhere else to find them.
42
+ `helix scan` and the MCP tool `helix_check` report each native element a page
43
+ writes where an installed family stands in for it, as `native-element`.
44
+
45
+ ### Look up a family before writing its tags
46
+
47
+ Each family's API is in the packages you installed, and on this site:
48
+
49
+ - `helix api family <family>`, or the MCP tool `helix_family`
50
+ - `node_modules/@fusion.dev/helix/api.json`
51
+ - `https://fusion.dev/helix/components/<family>.md` and `.json`
44
52
 
45
- The manifest at `https://fusion.dev/helix/custom-elements.json` holds every
46
- family in one file, which is several megabytes. Read the families you use.
47
- Start from `https://fusion.dev/llms.txt`. In one request, it names every
48
- document and the machine-readable sources.
53
+ Each lists the import lines, every tag, every property with its literal union,
54
+ every event with its React prop, every slot, part, and custom property, and the
55
+ examples with the imports each one needs.
56
+
57
+ **If a tag is not in a family's file, it does not exist.** A property value
58
+ outside a declared union is invalid. Find a family by name, alias, or purpose
59
+ with `helix api find`, or the MCP tool `helix_find`.
49
60
 
50
61
  ### Five mistakes that look like Helix bugs
51
62
 
@@ -150,12 +161,9 @@ Each missing layer has its own symptom:
150
161
  - Unstyled headings mean `base.css` is missing.
151
162
  - No color anywhere means `primitives.css` or `tokens.css` is missing.
152
163
 
153
- To tell the last two apart, look at the stylesheet. The screen looks the same.
154
- Without `tokens.css`, nothing declares `--helix-color-*`. Without
155
- `primitives.css`, all 185 semantic tokens are declared and every color resolves
156
- to `rgba(0, 0, 0, 0)`, because `tokens.css` refers to a primitive 297 times and
157
- to nothing else. A missing `primitives.css` looks like a working install, and
158
- `helix.css` exists to prevent it.
164
+ To tell the last two apart, look at the stylesheet. Without `tokens.css`,
165
+ nothing declares `--helix-color-*`. Without `primitives.css`, every token is
166
+ declared and every color resolves to transparent.
159
167
 
160
168
  ### Choosing a component family
161
169
 
@@ -195,73 +203,25 @@ You can style a component in three ways. Try them in this order:
195
203
  belong to `@fusion.dev/helix-styles`. The underscore marks them as internal.
196
204
  Read the semantic tokens that refer to them.
197
205
 
198
- ### Styling HTML without custom elements
199
-
200
- `@fusion.dev/helix-styles` is plain CSS with no JavaScript. It includes recipes
201
- for markup that Helix does not render:
202
-
203
- ```html
204
- <button
205
- data-button="solid"
206
- data-button-tone="primary"
207
- >Save</button>
208
- <article data-prose><h2>From a CMS</h2></article>
209
- <div data-density="sm">…</div>
210
- ```
211
-
212
- A recipe sets appearance only. It has none of these:
213
-
214
- - state
215
- - form participation
216
- - focus trapping
217
- - keyboard handling
218
-
219
- If you are adding a script to a recipe, use the component.
220
-
221
- ### Link your tool to this guide
222
-
223
- **Point your tool at the guide, and do not copy it.** A copy starts to go stale
224
- as soon as you paste it, and the guide changes with the library.
225
-
226
- The skill in the package matches the Helix you installed. In Claude Code, link
227
- it into your project's skills folder:
228
-
229
- ```sh
230
- mkdir -p .claude/skills
231
- ln -s ../../node_modules/@fusion.dev/helix/skills/helix .claude/skills/helix
232
- ```
233
-
234
- Other tools read a file in your repository. Add a line to it that names the
235
- skill, or this page:
236
-
237
- ```md
238
- Helix: read node_modules/@fusion.dev/helix/skills/helix/SKILL.md before
239
- writing components, and node_modules/@fusion.dev/helix/api.json for the API.
240
- ```
206
+ ### Markup Helix does not render
241
207
 
242
- | Tool | Where it goes |
243
- |---|---|
244
- | Claude Code | `.claude/skills/helix`, or a line in `AGENTS.md` or `CLAUDE.md` |
245
- | Cursor | `.cursor/rules/` |
246
- | GitHub Copilot | `.github/copilot-instructions.md` |
247
- | Anything else | Whatever it reads. The line is the same |
208
+ HTML that a CMS or a Markdown library writes, inside an element with
209
+ `data-prose`, takes Helix's typography from `@fusion.dev/helix-styles` and needs
210
+ no Helix elements. Everywhere else, write the Helix element.
248
211
 
249
- We do not write those files for you, and we chose this on purpose. You would
250
- have to maintain a file we generated in your repository against our changes. A
251
- tool that rewrote it on install would be a dependency you did not ask for, in a
252
- directory you own. You add the link or the line, and you can delete it.
212
+ ### Check the code you wrote
253
213
 
254
- ### Install the Helix MCP server
214
+ Run these after you write Helix code, and fix every finding at `error` and
215
+ `warn` before you finish. Each prints JSON with `--json`.
255
216
 
256
- ```sh
257
- helix mcp init --client claude
258
- ```
217
+ | Command | MCP tool | What it finds |
218
+ |---|---|---|
219
+ | `helix scan` | `helix_check` | Unknown tags, attributes, values, slots, parts, hooks, events, and tokens, a native element a Helix family replaces, a missing import, and the rest, each with its file and line |
220
+ | `helix diagnostics --once <url>` | `helix_check_page` | The same on the running page, and what the library logged as it ran |
221
+ | `helix theme audit` | `helix_audit_theme` | Every foreground and background pair in your theme that misses its contrast target |
259
222
 
260
- `helix mcp` answers from the Helix packages your project installs: families,
261
- examples, import lines, tokens, and the theme a brand color produces. `--client`
262
- takes `claude`, `cursor`, or `vscode`, and writes the server into the file that
263
- client reads. [Coding agents](https://fusion.dev/helix/docs/coding-agents) lists the tools. It runs on your
264
- machine, talks to a client you chose, and makes no network requests.
223
+ `helix scan --file <path>` reports one file's findings and still reads the whole
224
+ project, so an import in another file counts.
265
225
 
266
226
  ### What this guide does not cover
267
227
 
@@ -276,201 +236,3 @@ of them here would be a second copy that goes stale. Fetch the family.
276
236
  **Whether a component fits your case.** Read the examples to decide. Every
277
237
  family's `.md` file includes them as text, and
278
238
  `https://fusion.dev/helix/sandbox?e=<family>.<slug>` opens one for editing.
279
-
280
- ## Coding agents
281
-
282
- We publish Helix as text for agents that write Helix code, so an agent does not
283
- need to read the rendered website. Three sources give it the library as text.
284
- We generate all three from the same sources as this site.
285
-
286
- ### The manifest
287
-
288
- ```
289
- https://fusion.dev/helix/custom-elements.json
290
- @fusion.dev/helix/custom-elements.json
291
- ```
292
-
293
- The URL and the package path serve the same file. A package path works only
294
- from a `node_modules` folder. An agent that found Helix through `llms.txt` can
295
- reach this site and has no checkout, so it needs the URL.
296
-
297
- The manifest lists:
298
-
299
- - every element
300
- - every property, with its literal type union
301
- - every event, with its class
302
- - every slot
303
- - every part
304
- - every custom property
305
-
306
- We generate the framework typings, the reference documentation, and the site's
307
- component pages from the manifest, so they always match it.
308
-
309
- **If a tag is not in the manifest, it does not exist.** An agent can check every
310
- tag and value it writes against the file, so an invented component is caught. A
311
- prop value outside a declared union is invalid.
312
-
313
- For the same reason, the analyzer requires literal unions for property types.
314
- `'ghost' | 'outlined' | 'solid' | 'subtle'` shows you what to write. A named
315
- type such as `ButtonEmphasis` sends you somewhere else to look.
316
-
317
- ### Markdown and JSON for each component family
318
-
319
- ```
320
- https://fusion.dev/helix/components/<family>.md
321
- https://fusion.dev/helix/components/<family>.json
322
- ```
323
-
324
- These are static files, one pair for each family. Read the family you are
325
- writing instead of the whole manifest. The manifest holds every family in one
326
- file, and it is several megabytes.
327
-
328
- The `.md` file has:
329
-
330
- - the family's metadata
331
- - a Usage block with the import lines for the family
332
- - every element's description and API tables
333
- - the examples, each with the import lines it needs
334
-
335
- The HTML page leaves the examples out on purpose. The page lists what a
336
- component can do, and the sandbox beside it shows what the component looks
337
- like. Keeping pictures out of the reference keeps it the one place you can trust
338
- to be complete. An agent cannot use the sandbox, and it reads an example as
339
- text, so the `.md` file includes the examples.
340
-
341
- Each example the visual check pictures links its pictures under it: wide at
342
- 640 pixels, narrow at 390, and dark at 640, taken in the environment that
343
- `examples.json` records. Compare a render of your own to them.
344
-
345
- The `.json` file has the same family as structured data, and three fields an
346
- agent uses most:
347
-
348
- - `usage`, the import block for each tier
349
- - `imports` on each example, an import line for every element it writes
350
- - `specifier` and `words` on each element: the line that registers it, and the
351
- properties `registerWords` translates
352
-
353
- ### Import every family you write
354
-
355
- Each tag needs its family's entry imported. A family registers its own parts,
356
- so `@fusion.dev/helix/tabs` registers Tab and Tab Panel. A family does not
357
- register another family's elements that you write inside it:
358
-
359
- ```js
360
- import '@fusion.dev/helix/select'
361
- import '@fusion.dev/helix/option'
362
- ```
363
-
364
- Without the Option import, the options are unknown elements and the Select
365
- offers nothing. The same is true
366
- of the layout around an example: a Button inside a Flex needs both imports.
367
- Copy the import lines above an example together with its markup.
368
-
369
- ### Check the code you wrote
370
-
371
- These checks run on your project, and each one prints JSON with `--json`:
372
-
373
- | Command | What it finds |
374
- |---|---|
375
- | `helix scan` | Unknown tags, attributes, values, slots, parts, hooks, React event props, and tokens, a `--_helix-` primitive read, `[disabled]` on a form control, a selector on an attribute the element never writes back, and a tag whose entry nothing imports, each with its file and line |
376
- | `helix theme audit` | Every foreground and background pair in your theme that misses its contrast target |
377
- | `initDiagnostics()` from `@fusion.dev/helix-diagnostics` | The same findings on the running page, and what the library reports as it runs, such as an option nobody imported |
378
-
379
- `helix scan` and `helix theme audit` exit 1 when they find an error and 0 when
380
- they find none. Run them after you write Helix code, and fix each finding
381
- before you finish. `helix scan --file <path>` reports one file's findings, and
382
- `helix scan --stdin tsx` reads a snippet from stdin. Both still read the whole
383
- project, so an import in another file counts.
384
-
385
- ### The index
386
-
387
- ```
388
- /llms.txt
389
- ```
390
-
391
- `llms.txt` lists every page on the site, in groups. Each entry links to the
392
- page's `.md` file and has a one-sentence summary. We generate it from the same
393
- route registry as the sitemap. Every page appears in it, and every entry in it
394
- is a page that exists.
395
-
396
- Start with `llms.txt`. In one request, it names every page on the site and the
397
- two machine-readable sources above. This guide gives no page count, because a
398
- number typed into prose goes stale.
399
-
400
- ### Links on each component page
401
-
402
- Each family page has a menu beside its title with:
403
-
404
- - **View Markdown**
405
- - **Copy Markdown**
406
- - links that send the document's URL to Claude or to Cursor
407
-
408
- The links send the URL, because the URL stays current. A pasted copy starts to
409
- go stale as soon as you paste it.
410
-
411
- ### The Helix MCP server
412
-
413
- ```sh
414
- helix mcp init --client claude
415
- ```
416
-
417
- `helix mcp` runs an MCP server over stdio. It answers from the Helix packages
418
- your project installs, so every answer is for the version you build with, and
419
- each one names that package and version. `helix mcp init` adds the server to
420
- the file your client reads and keeps every other server in it:
421
-
422
- | Client | File |
423
- |---|---|
424
- | `claude` | `.mcp.json` |
425
- | `cursor` | `.cursor/mcp.json` |
426
- | `vscode` | `.vscode/mcp.json` |
427
-
428
- The server runs `npx @fusion.dev/helix-cli mcp`, which is the copy in your
429
- project. It has nine tools:
430
-
431
- | Tool | What it returns |
432
- |---|---|
433
- | `helix_find` | The families that answer a name, an alias, a tag, or a purpose, best first |
434
- | `helix_family` | One family's tags, properties and their unions, events and their React props, slots, parts, custom properties, words, and import lines |
435
- | `helix_example` | One example as HTML and TSX, with its stylesheet, the import lines it needs, and links to its pictures |
436
- | `helix_imports` | The import lines for a list of tags, and the closest tag to any unknown one |
437
- | `helix_tokens` | The semantic tokens, by a word in the name or description and by category |
438
- | `helix_check` | The findings `helix scan` reports for the files you name, or for a snippet before you write it |
439
- | `helix_check_page` | The findings the page diagnostics report for each address you name, opened headless, with what the library logged as the page ran |
440
- | `helix_audit_theme` | Every foreground and background pair a brand color derives to, with its ratio and target |
441
- | `helix_derive_theme` | The theme's CSS |
442
-
443
- Each result is structured, with an output schema, and the same JSON as text.
444
- A name that matches more than one family, such as `Dropdown`, returns an error
445
- listing each family. The theme tools take the same JSON that a
446
- `helix.theme.json` file holds.
447
-
448
- Each lookup is also a command, for a script or a person:
449
-
450
- ```sh
451
- helix api find dropdown
452
- helix api family select
453
- helix api example select
454
- helix api imports helix-select helix-option
455
- helix api tokens surface --category color
456
- ```
457
-
458
- `--json` prints what the MCP tool returns.
459
-
460
- **`helix_derive_theme` does not return a palette that fails its own targets**,
461
- the same as `helix theme build`. A failing palette pasted into a stylesheet is
462
- worse than a warning above it, and an agent does not read warnings.
463
-
464
- You run `helix mcp` yourself, and we do not host it. A server we operated would
465
- be one more service between you and your own tokens. `helix mcp` is a
466
- subcommand of a binary you installed. It talks to a client you chose and makes
467
- no network requests.
468
-
469
- ### What we do not publish for agents
470
-
471
- **`llms-full.txt`, or any other whole-library download of the pages.** A single
472
- file with every page goes out of date as soon as anything changes. Each link in
473
- `llms.txt` can be cached on its own and stays current on its own.
474
-
475
- `llms.txt` is the index, in one request, and each family's `.md` file is its
476
- document. Fetch the families you use, or ask `helix mcp`.