@fusion.dev/helix-docs 0.223.1 → 0.224.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.
- package/content/building-on-the-headless-tier.mdx +6 -8
- package/content/events.mdx +151 -49
- package/content/graphs.mdx +7 -5
- package/content/introduction.mdx +2 -2
- package/content/maps.mdx +1 -1
- package/content/metrics.mdx +288 -288
- package/content/other-frameworks.mdx +1 -1
- package/content/routing.mdx +17 -10
- package/content/sandbox.mdx +1 -1
- package/content/using-helix-with-an-agent.mdx +1 -1
- package/content/using-the-elements.mdx +30 -5
- package/content/visual-testing.mdx +59 -2
- package/dist/pages.generated.js +1 -1
- package/dist/sources.generated.js +564 -373
- package/package.json +14 -14
|
@@ -541,17 +541,16 @@ Each flag does one job, and the manifest is incomplete without either:
|
|
|
541
541
|
- \`--litelement\` reads Lit's decorators, so the properties you declare with
|
|
542
542
|
\`@property\` are attributes too.
|
|
543
543
|
|
|
544
|
-
Then run a typings generator over the manifest
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
wrote.
|
|
544
|
+
Then run a typings generator over the manifest, such as \`@wc-toolkit/jsx-types\`
|
|
545
|
+
or \`@wc-toolkit/vuejs-types\`. The typings for \`acme-combobox\` then include the
|
|
546
|
+
members it inherits, as well as the ones you wrote.
|
|
548
547
|
|
|
549
548
|
The generated file names Helix's event classes, such as
|
|
550
549
|
\`HelixBeforeChangeEvent\`, without importing them. Add one line at its top that
|
|
551
550
|
imports the names TypeScript reports as missing:
|
|
552
551
|
|
|
553
552
|
\`\`\`ts
|
|
554
|
-
import type { HelixBeforeChangeEvent,
|
|
553
|
+
import type { HelixBeforeChangeEvent, HelixBeforeFilterEvent } from '@fusion.dev/helix-core'
|
|
555
554
|
\`\`\`
|
|
556
555
|
|
|
557
556
|
Without that line, a project that sets \`skipLibCheck\` gets no error, and each
|
|
@@ -575,9 +574,8 @@ declare module 'react' {
|
|
|
575
574
|
|
|
576
575
|
A subclass that adds properties joins its own to them with \`&\`.
|
|
577
576
|
|
|
578
|
-
\`@fusion.dev/helix-cem\`, the step that
|
|
579
|
-
|
|
580
|
-
repository.
|
|
577
|
+
\`@fusion.dev/helix-cem\`, the step that writes our own typings from our manifests,
|
|
578
|
+
is not published. It is build tooling for this repository.
|
|
581
579
|
|
|
582
580
|
### The tag map
|
|
583
581
|
|
|
@@ -2235,8 +2233,9 @@ ways:
|
|
|
2235
2233
|
|
|
2236
2234
|
- The class name is in the manifest, so the framework typings can emit a typed
|
|
2237
2235
|
callback. A bare \`CustomEvent\` would give \`(detail: unknown)\`.
|
|
2238
|
-
- The
|
|
2239
|
-
|
|
2236
|
+
- The family augments \`HTMLElementEventMap\` for its own events, and core does
|
|
2237
|
+
for the events several families share. Importing a family types
|
|
2238
|
+
\`addEventListener\` for its events when you write plain HTML.
|
|
2240
2239
|
- The name is defined on the class, so a dispatch and a listener always use the
|
|
2241
2240
|
same string.
|
|
2242
2241
|
|
|
@@ -2276,9 +2275,10 @@ from an unprefixed name, and you would.
|
|
|
2276
2275
|
\`helix-before-open\` and \`helix-before-close\`. Overlays nest, and an inner
|
|
2277
2276
|
overlay's lifecycle must never reach the outer overlay that contains it. A
|
|
2278
2277
|
menu that closes inside a dialog does not close the dialog.
|
|
2279
|
-
- **Coordination events** bubble and are composed. These are
|
|
2280
|
-
\`helix-dismiss\`, and \`helix-before-change\`. A parent or
|
|
2281
|
-
them across a shadow boundary, so you can use a \`Tree\`
|
|
2278
|
+
- **Coordination events** bubble and are composed. These are
|
|
2279
|
+
\`helix-before-select\`, \`helix-dismiss\`, and \`helix-before-change\`. A parent or
|
|
2280
|
+
a router can intercept them across a shadow boundary, so you can use a \`Tree\`
|
|
2281
|
+
as navigation.
|
|
2282
2282
|
|
|
2283
2283
|
If you listen on a container and receive nothing, the event is probably a
|
|
2284
2284
|
lifecycle event. Add the listener to the element itself.
|
|
@@ -2296,31 +2296,157 @@ dialog.addEventListener('helix-before-close', (event) => {
|
|
|
2296
2296
|
})
|
|
2297
2297
|
\`\`\`
|
|
2298
2298
|
|
|
2299
|
-
Every dispatched event is checked against a declaration,
|
|
2300
|
-
|
|
2299
|
+
Every dispatched event is checked against a declaration, so every event you can
|
|
2300
|
+
listen for is documented. A declaration needs no dispatch of its own, because a
|
|
2301
|
+
parent declares the events its children send and a form control declares the
|
|
2302
|
+
native event it relays.
|
|
2303
|
+
|
|
2304
|
+
## Names
|
|
2305
|
+
|
|
2306
|
+
Every Helix event follows one grammar:
|
|
2307
|
+
|
|
2308
|
+
- A request is named \`helix-before-<verb>\`. It is cancelable, carries what is
|
|
2309
|
+
being proposed, and is sent before anything moves.
|
|
2310
|
+
- Its notification is the native event where the platform has one, such as
|
|
2311
|
+
\`change\` or \`toggle\`. Otherwise it is \`helix-<verb>\`, the same verb without
|
|
2312
|
+
\`before\`. It is not cancelable, carries the state now in force, and is sent
|
|
2313
|
+
once the change stands. A request that is refused sends no notification.
|
|
2314
|
+
- \`toggle\` means open and closed, as it does on \`<details>\`. A checked state
|
|
2315
|
+
uses \`helix-before-check\`, followed by \`change\` on a form control or by
|
|
2316
|
+
\`helix-check\` elsewhere.
|
|
2317
|
+
|
|
2318
|
+
Two notifications use the past tense, because the plain verb is taken:
|
|
2319
|
+
\`helix-resized\`, since \`helix-resize\` reports a measurement, and
|
|
2320
|
+
\`helix-pasted\`, since \`paste\` is the clipboard event.
|
|
2321
|
+
|
|
2322
|
+
### Commands
|
|
2323
|
+
|
|
2324
|
+
Five events are cancelable and have no \`before\` in their name. Each one is a
|
|
2325
|
+
command you can refuse, and no notification follows, because nothing is in
|
|
2326
|
+
force afterwards to report:
|
|
2327
|
+
|
|
2328
|
+
- \`helix-create\`, a value a combobox list does not hold
|
|
2329
|
+
- \`helix-dismiss\`, an element asking to be taken away
|
|
2330
|
+
- \`helix-send\`, what a reader wrote in a chat composer
|
|
2331
|
+
- \`helix-shortcut\`, a chord that was pressed
|
|
2332
|
+
- \`helix-terminal-link\`, an address a terminal would open
|
|
2333
|
+
|
|
2334
|
+
### Changed in October 2026
|
|
2335
|
+
|
|
2336
|
+
Requests that had plain names now carry \`before\`, and the plain name is the
|
|
2337
|
+
notification:
|
|
2338
|
+
|
|
2339
|
+
- \`helix-sort\`, \`helix-filter\`, \`helix-select\`, and \`helix-reorder\` were the
|
|
2340
|
+
requests on Data Table. They are \`helix-before-sort\`, \`helix-before-filter\`,
|
|
2341
|
+
\`helix-before-select\`, and \`helix-before-reorder\` now. The plain names are
|
|
2342
|
+
the notifications that were \`helix-sorted\`, \`helix-filtered\`,
|
|
2343
|
+
\`helix-selected\`, and \`helix-reordered\`. **A page that bound \`helix-sort\` to
|
|
2344
|
+
refuse a sort binds \`helix-before-sort\` now**, because \`helix-sort\` arrives
|
|
2345
|
+
after the order has moved and cannot be refused.
|
|
2346
|
+
- \`helix-navigate\` is \`helix-before-navigate\`, and \`helix-navigate\` follows it
|
|
2347
|
+
on Pagination, Data Table, Date Picker, and Drilldown. Pagination and Data
|
|
2348
|
+
Table sent \`helix-activate\` after a page moved, and send \`helix-navigate\`
|
|
2349
|
+
now.
|
|
2350
|
+
- \`helix-select\` on Carousel is \`helix-before-activate\`, and \`helix-activate\`
|
|
2351
|
+
still follows it.
|
|
2352
|
+
- \`helix-facet\`, \`helix-graph-filter\`, and \`helix-read\` are
|
|
2353
|
+
\`helix-before-facet\`, \`helix-before-graph-filter\`, and \`helix-before-read\`,
|
|
2354
|
+
and each plain name is the notification after it.
|
|
2355
|
+
- \`helix-before-toggle\` is \`helix-before-check\`, and \`helix-toggle\` is
|
|
2356
|
+
\`helix-check\`. A row of Table that opens sends \`helix-before-expand\` and
|
|
2357
|
+
\`helix-expand\`.
|
|
2358
|
+
- \`helix-reorder\` on a list, a tree, or a table is no longer cancelable. Refuse
|
|
2359
|
+
\`helix-before-reorder\` to keep an item where it is.
|
|
2301
2360
|
|
|
2302
2361
|
## Helix events
|
|
2303
2362
|
|
|
2363
|
+
Each component's page lists the events it sends, with the class and the detail.
|
|
2364
|
+
|
|
2365
|
+
### Requests and notifications
|
|
2366
|
+
|
|
2367
|
+
| Event | Meaning |
|
|
2368
|
+
|---|---|
|
|
2369
|
+
| \`helix-before-activate\`, \`helix-activate\` | A set is about to make a different child current, and then did |
|
|
2370
|
+
| \`helix-before-change\` | A value is about to change. \`input\` and \`change\` follow |
|
|
2371
|
+
| \`helix-before-check\`, \`helix-check\` | A checked state is about to change, and then did. A form control sends \`change\` in place of \`helix-check\` |
|
|
2372
|
+
| \`helix-before-collapse\`, \`helix-collapse\` | A splitter's pane is about to shut or reopen, and then did |
|
|
2373
|
+
| \`helix-before-edit\`, \`helix-edit\` | A sandbox's source is about to be edited, and then was |
|
|
2374
|
+
| \`helix-before-expand\`, \`helix-expand\` | Rows of a table are about to open or close in place, and then did |
|
|
2375
|
+
| \`helix-before-facet\`, \`helix-facet\` | A filter input's field is about to be filtered by other values, and then was |
|
|
2376
|
+
| \`helix-before-filter\`, \`helix-filter\` | A list or a table is about to narrow what it shows, and then did |
|
|
2377
|
+
| \`helix-before-follow\`, \`helix-follow\` | A press on a link in a table cell is about to load its page, and then is |
|
|
2378
|
+
| \`helix-before-graph-filter\`, \`helix-graph-filter\` | A graph is about to show or hide a group's notes, and then did |
|
|
2379
|
+
| \`helix-before-listen\`, \`helix-listen\` | A field is about to listen for dictation, and then put a phrase in its text |
|
|
2380
|
+
| \`helix-before-move\`, \`helix-move\` | Cards on a canvas are about to move, and then did |
|
|
2381
|
+
| \`helix-before-navigate\`, \`helix-navigate\` | A component is about to move the view it shows, such as a page or a month, and then did |
|
|
2382
|
+
| \`helix-before-open\`, \`helix-before-close\` | An open state is about to change. \`toggle\` follows |
|
|
2383
|
+
| \`helix-before-panel-resize\`, \`helix-panel-resize\` | A sandbox's panel is about to change height, and then did |
|
|
2384
|
+
| \`helix-before-paste\`, \`helix-pasted\` | Cards are about to be pasted onto a canvas, and then were |
|
|
2385
|
+
| \`helix-before-pin\`, \`helix-pin\` | A transcript is about to be pinned to the bottom or let go of it, and then was |
|
|
2386
|
+
| \`helix-before-read\`, \`helix-read\` | A notification is about to be marked read or unread, and then was |
|
|
2387
|
+
| \`helix-before-reconnect\`, \`helix-reconnect\` | A connection's end on a canvas is about to move, and then did |
|
|
2388
|
+
| \`helix-before-relabel\`, \`helix-relabel\` | A label a canvas draws is about to change, and then did |
|
|
2389
|
+
| \`helix-before-reorder\`, \`helix-reorder\` | A row, an item, or a column is about to move to a new place, and then did |
|
|
2390
|
+
| \`helix-before-resize\`, \`helix-resized\` | A splitter's divider is about to settle, and then did |
|
|
2391
|
+
| \`helix-before-select\`, \`helix-select\` | An item in a set is about to be chosen, and then a selection changed |
|
|
2392
|
+
| \`helix-before-sort\`, \`helix-sort\` | A table is about to change its order, and then did |
|
|
2393
|
+
| \`helix-before-split\`, \`helix-split\` | The divider between a sandbox's panes is about to move, and then did |
|
|
2394
|
+
|
|
2395
|
+
### Command events
|
|
2396
|
+
|
|
2397
|
+
| Event | Meaning |
|
|
2398
|
+
|---|---|
|
|
2399
|
+
| \`helix-create\` | A combobox was asked for a value its list does not hold |
|
|
2400
|
+
| \`helix-dismiss\` | An element asks to be taken away |
|
|
2401
|
+
| \`helix-send\` | A chat composer is handing over what the reader wrote |
|
|
2402
|
+
| \`helix-shortcut\` | A shortcut's chord was pressed |
|
|
2403
|
+
| \`helix-terminal-link\` | A link in a terminal's output was activated |
|
|
2404
|
+
|
|
2405
|
+
### Other notifications
|
|
2406
|
+
|
|
2304
2407
|
| Event | Meaning |
|
|
2305
2408
|
|---|---|
|
|
2306
|
-
| \`helix-
|
|
2307
|
-
| \`helix-
|
|
2308
|
-
| \`helix-
|
|
2309
|
-
| \`helix-
|
|
2310
|
-
| \`helix-
|
|
2311
|
-
| \`helix-
|
|
2312
|
-
| \`helix-
|
|
2313
|
-
| \`helix-select\` | An item was chosen from a set |
|
|
2314
|
-
| \`helix-dismiss\` | A user asked for something to close |
|
|
2315
|
-
| \`helix-next\`, \`helix-previous\` | Movement through a sequence |
|
|
2316
|
-
| \`helix-filter\` | A query changed in a filtering control |
|
|
2317
|
-
| \`helix-navigate\` | A component is about to navigate |
|
|
2318
|
-
| \`helix-copy\` | Something was copied |
|
|
2319
|
-
| \`helix-caret\` | The cursor moved in a text control |
|
|
2409
|
+
| \`helix-action\` | A reader acted on a list row |
|
|
2410
|
+
| \`helix-aura-fallback\` | An aura stopped drawing its shader and shows its gradient |
|
|
2411
|
+
| \`helix-band\` | A meter's reading moved into another band |
|
|
2412
|
+
| \`helix-canvas-edit\` | A reader asked to edit a card |
|
|
2413
|
+
| \`helix-canvas-pan\`, \`helix-canvas-zoom\`, \`helix-canvas-view\` | A canvas moved, zoomed, or changed its view |
|
|
2414
|
+
| \`helix-caret\` | The cursor moved in a text editor |
|
|
2415
|
+
| \`helix-clear\` | A reader cleared a value |
|
|
2320
2416
|
| \`helix-complete\` | A control that fills up has filled |
|
|
2321
|
-
| \`helix-
|
|
2417
|
+
| \`helix-connect\` | A reader asked for two cards to be joined |
|
|
2322
2418
|
| \`helix-console\` | The sandbox passes on a log message |
|
|
2323
|
-
| \`helix-
|
|
2419
|
+
| \`helix-copy\`, \`helix-copy-error\` | Something was copied, or nothing could be |
|
|
2420
|
+
| \`helix-device-button\`, \`helix-device-key\`, \`helix-device-screenshot\` | A device screen's button, key, or screenshot was asked for |
|
|
2421
|
+
| \`helix-device-scroll\`, \`helix-device-swipe\`, \`helix-device-tap\`, \`helix-device-text\`, \`helix-device-touch\` | A reader scrolled, swiped, tapped, pasted, or touched a device screen |
|
|
2422
|
+
| \`helix-end\` | A video playlist reached its last entry and stopped |
|
|
2423
|
+
| \`helix-found\` | A search found its matches, or moved among them |
|
|
2424
|
+
| \`helix-graph-layout\`, \`helix-graph-ready\` | A graph's layout settled, or the graph was drawn whole |
|
|
2425
|
+
| \`helix-graph-pan\`, \`helix-graph-zoom\` | A reader asked a graph to move or to zoom |
|
|
2426
|
+
| \`helix-graph-part-change\`, \`helix-graph-signal\` | What a graph's connector draws changed, or something passed between two notes |
|
|
2427
|
+
| \`helix-history\` | A transcript reached its oldest turn, and older ones can be fetched |
|
|
2428
|
+
| \`helix-load\` | A lazy tree branch opened and asks for its children |
|
|
2429
|
+
| \`helix-load-more\` | A reader asked for more items |
|
|
2430
|
+
| \`helix-map-cluster\` | A reader pressed a cluster of map markers |
|
|
2431
|
+
| \`helix-map-pan\`, \`helix-map-rotate\`, \`helix-map-tilt\`, \`helix-map-zoom\` | A reader asked a map to move, rotate, tilt, or zoom |
|
|
2432
|
+
| \`helix-map-part-change\`, \`helix-map-ready\` | What a map's connector draws changed, or the map was drawn whole |
|
|
2433
|
+
| \`helix-next\`, \`helix-previous\` | A reader asked for the next or the previous item in a sequence |
|
|
2434
|
+
| \`helix-plot-change\`, \`helix-plot-turn\` | What a plot's connector draws changed, or a reader turned a 3D plot by key |
|
|
2435
|
+
| \`helix-press\` | A control was pressed and acted |
|
|
2436
|
+
| \`helix-preview\` | A control shows what a press would choose |
|
|
2437
|
+
| \`helix-range-change\` | The items a virtual list shows changed |
|
|
2438
|
+
| \`helix-reading-change\`, \`helix-reading-press\` | A chart moved to a reading, or a reading was pressed |
|
|
2439
|
+
| \`helix-reject\` | A file field refused some of the files it was given |
|
|
2440
|
+
| \`helix-remove\` | A reader asked for cards or connections to be taken away |
|
|
2441
|
+
| \`helix-resize\` | A preview reports how much room its content needs |
|
|
2442
|
+
| \`helix-sample-start\`, \`helix-sample-end\` | The eyedropper opened, or closed |
|
|
2443
|
+
| \`helix-scrolled\` | A header started or stopped floating over the page |
|
|
2444
|
+
| \`helix-stop\` | A reader asked for what is under way to stop |
|
|
2445
|
+
| \`helix-strands-fallback\` | A strands element stopped drawing its ribbon and shows its gradient |
|
|
2446
|
+
| \`helix-terminal-bell\`, \`helix-terminal-title\` | A terminal's program rang the bell or set its title |
|
|
2447
|
+
| \`helix-terminal-input\`, \`helix-terminal-resize\`, \`helix-terminal-restart\` | A terminal has input for the process, changed size, or was asked to restart |
|
|
2448
|
+
| \`helix-tour-ask\`, \`helix-tour-status\` | A tour stop asked the tour to move, or the tour's progress changed |
|
|
2449
|
+
| \`helix-typing\` | A reader started or stopped writing in a chat composer |
|
|
2324
2450
|
|
|
2325
2451
|
Every stateful component also sends native events once the change is applied:
|
|
2326
2452
|
|
|
@@ -2331,32 +2457,6 @@ Every stateful component also sends native events once the change is applied:
|
|
|
2331
2457
|
- \`close\` on a dialog
|
|
2332
2458
|
- \`load\` and \`error\` on an image
|
|
2333
2459
|
|
|
2334
|
-
Each component's page lists the events it dispatches, with the class and the
|
|
2335
|
-
detail. The table above lists the common ones.
|
|
2336
|
-
|
|
2337
|
-
## Requests under a plain name
|
|
2338
|
-
|
|
2339
|
-
A few events with no \`before\` in their name are also cancelable requests. Each
|
|
2340
|
-
is sent before the change, and you refuse the change with \`preventDefault()\`:
|
|
2341
|
-
|
|
2342
|
-
- \`helix-navigate\` on Pagination, Data Table, and Date Picker
|
|
2343
|
-
- \`helix-sort\`, \`helix-filter\`, \`helix-select\`, and \`helix-reorder\` on Data Table
|
|
2344
|
-
- \`helix-select\` on Carousel
|
|
2345
|
-
|
|
2346
|
-
Each of these requests had its name before the library had a word for the
|
|
2347
|
-
notification, so the notification has its own name. It is sent after the
|
|
2348
|
-
change, is not cancelable, and carries the new state:
|
|
2349
|
-
|
|
2350
|
-
- \`helix-activate\` after the page moves on Pagination and Data Table, and after
|
|
2351
|
-
the slide moves on Carousel
|
|
2352
|
-
- \`helix-sorted\`, \`helix-filtered\`, \`helix-selected\`, and \`helix-reordered\` on
|
|
2353
|
-
Data Table
|
|
2354
|
-
- \`input\` and \`change\` together on Pagination Size, as a native \`<select>\`
|
|
2355
|
-
sends them
|
|
2356
|
-
|
|
2357
|
-
A request that is refused sends no notification. Date Picker's \`helix-navigate\`
|
|
2358
|
-
moves the month on show, and the month sends no notification.
|
|
2359
|
-
|
|
2360
2460
|
## Events in a framework
|
|
2361
2461
|
|
|
2362
2462
|
Native events use their usual props, such as \`onChange\`, \`onInput\`, and
|
|
@@ -2851,12 +2951,13 @@ list:
|
|
|
2851
2951
|
\`\`\`
|
|
2852
2952
|
|
|
2853
2953
|
\`hiddenGroups\` holds the names of the groups turned off. Set it to start with
|
|
2854
|
-
some hidden. A press sends \`helix-graph-filter\` first, with every group
|
|
2855
|
-
would be hidden. Cancel it to keep the groups as they were, or to keep them
|
|
2856
|
-
your own state and set \`hiddenGroups\` yourself
|
|
2954
|
+
some hidden. A press sends \`helix-before-graph-filter\` first, with every group
|
|
2955
|
+
that would be hidden. Cancel it to keep the groups as they were, or to keep them
|
|
2956
|
+
in your own state and set \`hiddenGroups\` yourself. \`helix-graph-filter\` follows
|
|
2957
|
+
once the groups have changed, with every group now hidden:
|
|
2857
2958
|
|
|
2858
2959
|
\`\`\`ts
|
|
2859
|
-
frame.addEventListener('helix-graph-filter', (event) => {
|
|
2960
|
+
frame.addEventListener('helix-before-graph-filter', (event) => {
|
|
2860
2961
|
event.preventDefault()
|
|
2861
2962
|
frame.hiddenGroups = event.detail.hidden
|
|
2862
2963
|
})
|
|
@@ -3148,7 +3249,8 @@ The frame sends these events. Their names follow Map's: \`helix-graph-pan\`,
|
|
|
3148
3249
|
|---|---|---|---|
|
|
3149
3250
|
| \`helix-before-activate\` | A note is about to be selected | Yes | You, to keep the selection in your own state |
|
|
3150
3251
|
| \`helix-activate\` | A note was selected, in the list or the drawing | No | You |
|
|
3151
|
-
| \`helix-graph-filter\` | A group in the legend was pressed, before its notes are shown or hidden | Yes | You, to set \`hiddenGroups\` yourself |
|
|
3252
|
+
| \`helix-before-graph-filter\` | A group in the legend was pressed, before its notes are shown or hidden | Yes | You, to set \`hiddenGroups\` yourself |
|
|
3253
|
+
| \`helix-graph-filter\` | A group's notes were shown or hidden | No | You |
|
|
3152
3254
|
| \`helix-graph-layout\` | A layout settled, with where it put each note | No | You, to keep the positions |
|
|
3153
3255
|
| \`helix-graph-ready\` | The graph has been drawn whole | No | You, to show the graph once it is finished |
|
|
3154
3256
|
| \`helix-graph-pan\` | An arrow key or a pan button asked the drawing to move | No | \`connectGraph\`, or your own renderer |
|
|
@@ -3692,13 +3794,13 @@ namespace is refused with the value it received, such as an empty one, \`--acme\
|
|
|
3692
3794
|
or \`acme tokens\`.
|
|
3693
3795
|
`,
|
|
3694
3796
|
introduction: `---
|
|
3695
|
-
description: What Helix is, and the packages it includes.
|
|
3797
|
+
description: What Fusion Helix is, and the packages it includes.
|
|
3696
3798
|
order: 1
|
|
3697
3799
|
section: Getting started
|
|
3698
3800
|
title: Introduction
|
|
3699
3801
|
---
|
|
3700
3802
|
|
|
3701
|
-
# Helix
|
|
3803
|
+
# Fusion Helix
|
|
3702
3804
|
|
|
3703
3805
|
Helix is a design system of web components. It includes:
|
|
3704
3806
|
|
|
@@ -4846,7 +4948,7 @@ tile is lit while its layer is shown. Pressing a tile sets its layer's \`hidden\
|
|
|
4846
4948
|
attribute, and \`connectMap\` does not draw a hidden layer. Write \`hidden\` on a
|
|
4847
4949
|
layer to start it turned off.
|
|
4848
4950
|
|
|
4849
|
-
Before it sets \`hidden\`, a tile sends \`helix-before-
|
|
4951
|
+
Before it sets \`hidden\`, a tile sends \`helix-before-check\` from the layer, with
|
|
4850
4952
|
\`checked\` true when the layer is to be shown. Store the choice from it, or
|
|
4851
4953
|
cancel it to keep the layer as it is.
|
|
4852
4954
|
|
|
@@ -5134,7 +5236,7 @@ on its own.
|
|
|
5134
5236
|
|
|
5135
5237
|
| | Raw | Gzip | Brotli |
|
|
5136
5238
|
|---|---|---|---|
|
|
5137
|
-
| Lit and \`@fusion.dev/helix-core\` |
|
|
5239
|
+
| Lit and \`@fusion.dev/helix-core\` | 295,793 | 95,870 | 82,233 |
|
|
5138
5240
|
|
|
5139
5241
|
## Whole packages
|
|
5140
5242
|
|
|
@@ -5145,12 +5247,12 @@ either barrel. The per-component tables show what your page pays.
|
|
|
5145
5247
|
|
|
5146
5248
|
| Package | Raw | Gzip | Brotli | |
|
|
5147
5249
|
|---|---|---|---|---|
|
|
5148
|
-
| \`@fusion.dev/helix-core\` |
|
|
5149
|
-
| \`@fusion.dev/helix-headless\` | 1,
|
|
5150
|
-
| \`@fusion.dev/helix-icons\` |
|
|
5250
|
+
| \`@fusion.dev/helix-core\` | 295,002 | 95,659 | 81,807 | The element base class, mixins, decorators, and floating positioning. |
|
|
5251
|
+
| \`@fusion.dev/helix-headless\` | 1,699,188 | 468,312 | 352,503 | Every headless family. The barrel entry includes all of them. |
|
|
5252
|
+
| \`@fusion.dev/helix-icons\` | 77,621 | 24,510 | 20,384 | The whole glyph set. |
|
|
5151
5253
|
| \`@fusion.dev/helix-theme\` | 4,022 | 1,720 | 1,541 | The JavaScript that runs the derivation engine. Most sites run it at build time, and a theme switcher runs it in the browser. |
|
|
5152
5254
|
| \`fusion_helix_theme_bg.wasm\` | 412,026 | 152,285 | 123,363 | The derivation engine itself, in WebAssembly. The entry above loads it when the engine runs. |
|
|
5153
|
-
| \`@fusion.dev/helix\` | 2,
|
|
5255
|
+
| \`@fusion.dev/helix\` | 2,503,553 | 640,893 | 458,250 | Every styled family. |
|
|
5154
5256
|
| \`lit\` | 15,396 | 5,990 | 5,419 | Lit itself, listed so you can subtract it from every row above. |
|
|
5155
5257
|
|
|
5156
5258
|
## Stylesheets
|
|
@@ -5163,7 +5265,7 @@ shows the whole cost of using the base layer on its own.
|
|
|
5163
5265
|
|
|
5164
5266
|
| File | Raw | Gzip | Brotli | |
|
|
5165
5267
|
|---|---|---|---|---|
|
|
5166
|
-
| \`base.css\` |
|
|
5268
|
+
| \`base.css\` | 37,882 | 5,293 | 4,566 | The base layer. It styles markup Helix does not render, and it works with no JavaScript. |
|
|
5167
5269
|
| \`elements.css\` | 24,939 | 3,469 | 3,047 | Hides each element until its definition loads. It is generated from the tags in \`@fusion.dev/helix\`. |
|
|
5168
5270
|
| \`helix.css\` | 207 | 149 | 118 | The other four stylesheets in one import, in the order they must load. |
|
|
5169
5271
|
| \`primitives.css\` | 7,511 | 1,411 | 1,221 | The primitive layer. It is private, and it ships because \`tokens.css\` refers to it. |
|
|
@@ -5171,17 +5273,17 @@ shows the whole cost of using the base layer on its own.
|
|
|
5171
5273
|
|
|
5172
5274
|
## What the numbers say
|
|
5173
5275
|
|
|
5174
|
-
**Most of your first component is the shared runtime.** The median styled family is 22,
|
|
5276
|
+
**Most of your first component is the shared runtime.** The median styled family is 22,915 bytes gzipped alone, and it adds 5,551 to a page that already has Helix. The shared runtime is 76 percent of the first component, and the component itself is 24 percent. Ten typical components cost the first number once, plus nine of the added number. The two columns in the tables below let you work that out for your own components.
|
|
5175
5277
|
|
|
5176
|
-
Across the 122 styled components, the smallest is \`code\` at 9,
|
|
5278
|
+
Across the 122 styled components, the smallest is \`code\` at 9,897 bytes gzipped alone, and the largest is \`data-table\` at 76,830. Every family together is 640,893.
|
|
5177
5279
|
|
|
5178
|
-
No family imports a barrel. The \`barrels\` rule in \`fusion x workspace\` enforces that. \`@fusion.dev/helix-headless\` marks every module in \`dist\` as having side effects, which is true of a file that calls \`customElements.define\`. A bundler can remove none of it. One \`import { HelixHeadlessButton } from '@fusion.dev/helix-headless'\` costs
|
|
5280
|
+
No family imports a barrel. The \`barrels\` rule in \`fusion x workspace\` enforces that. \`@fusion.dev/helix-headless\` marks every module in \`dist\` as having side effects, which is true of a file that calls \`customElements.define\`. A bundler can remove none of it. One \`import { HelixHeadlessButton } from '@fusion.dev/helix-headless'\` costs 468,312 bytes gzipped, whatever else the page imports. That is 20 times the median family above. All 122 styled families import the headless family they extend directly. The rule checks the shape of the import, so it applies to any package that sets \`sideEffects\`, whatever its name.
|
|
5179
5281
|
|
|
5180
|
-
The headless tier never had the problem, so it serves as the control. \`@fusion.dev/helix-core\` is \`sideEffects: false\`, and the median headless family is
|
|
5282
|
+
The headless tier never had the problem, so it serves as the control. \`@fusion.dev/helix-core\` is \`sideEffects: false\`, and the median headless family is 21,061 bytes gzipped alone.
|
|
5181
5283
|
|
|
5182
5284
|
## Compared with other systems
|
|
5183
5285
|
|
|
5184
|
-
We compare Helix with the libraries of custom elements listed under the table. \`turbo run peers\` measured them on October
|
|
5286
|
+
We compare Helix with the libraries of custom elements listed under the table. \`turbo run peers\` measured them on October 31, 2026. It installs pinned versions into \`.local\` and bundles them with the same harness as the tables above. The Helix rows are measured on every run of \`bun run gen:metrics\`, so they always match this repository.
|
|
5185
5287
|
|
|
5186
5288
|
Every system in the table is built on Lit. The runtime is the same library in every column, so the differences come from the components. React component libraries are left out, because comparing a custom element with a React component would measure the framework.
|
|
5187
5289
|
|
|
@@ -5189,43 +5291,43 @@ The table has no whole-library row. That row would compare how many components e
|
|
|
5189
5291
|
|
|
5190
5292
|
| Component | System | Raw | Gzip | Brotli |
|
|
5191
5293
|
|---|---|---|---|---|
|
|
5192
|
-
| \`button\` | **Helix** |
|
|
5193
|
-
| | Carbon | 133,
|
|
5194
|
-
| | Material Web | 47,
|
|
5195
|
-
| | Spectrum | 98,
|
|
5196
|
-
| | Web Awesome | 136,
|
|
5197
|
-
| \`checkbox\` | **Helix** |
|
|
5198
|
-
| | Carbon | 60,
|
|
5199
|
-
| | Material Web | 43,
|
|
5200
|
-
| | Spectrum |
|
|
5201
|
-
| | Web Awesome | 115,
|
|
5202
|
-
| \`dialog\` | **Helix** | 48,
|
|
5203
|
-
| | Carbon | 510,
|
|
5204
|
-
| | Material Web | 34,
|
|
5205
|
-
| | Spectrum |
|
|
5206
|
-
| | Web Awesome | 148,
|
|
5207
|
-
| \`radio\` | **Helix** |
|
|
5208
|
-
| | Carbon |
|
|
5209
|
-
| | Material Web | 41,
|
|
5210
|
-
| | Spectrum | 38,
|
|
5211
|
-
| | Web Awesome | 112,
|
|
5212
|
-
| \`switch\` | **Helix** |
|
|
5213
|
-
| | Carbon | 69,
|
|
5214
|
-
| | Material Web | 50,
|
|
5215
|
-
| | Spectrum | 62,
|
|
5216
|
-
| | Web Awesome | 45,
|
|
5217
|
-
| \`tabs\` | **Helix** | 61,
|
|
5218
|
-
| | Carbon | 578,
|
|
5219
|
-
| | Material Web | 38,
|
|
5220
|
-
| | Spectrum | 64,
|
|
5221
|
-
| | Web Awesome | 153,
|
|
5222
|
-
| \`tooltip\` | **Helix** | 67,
|
|
5223
|
-
| | Carbon | 189,
|
|
5294
|
+
| \`button\` | **Helix** | 49,256 | 16,177 | 14,575 |
|
|
5295
|
+
| | Carbon | 133,019 | 20,696 | 17,673 |
|
|
5296
|
+
| | Material Web | 47,039 | 13,980 | 12,488 |
|
|
5297
|
+
| | Spectrum | 98,861 | 21,731 | 18,547 |
|
|
5298
|
+
| | Web Awesome | 136,082 | 34,015 | 28,815 |
|
|
5299
|
+
| \`checkbox\` | **Helix** | 52,190 | 16,959 | 15,249 |
|
|
5300
|
+
| | Carbon | 60,226 | 15,349 | 13,476 |
|
|
5301
|
+
| | Material Web | 43,770 | 13,361 | 11,940 |
|
|
5302
|
+
| | Spectrum | 60,006 | 14,720 | 12,834 |
|
|
5303
|
+
| | Web Awesome | 115,313 | 28,720 | 24,391 |
|
|
5304
|
+
| \`dialog\` | **Helix** | 48,868 | 16,562 | 14,904 |
|
|
5305
|
+
| | Carbon | 510,751 | 66,753 | 39,054 |
|
|
5306
|
+
| | Material Web | 34,234 | 11,327 | 10,171 |
|
|
5307
|
+
| | Spectrum | 152,934 | 30,766 | 25,567 |
|
|
5308
|
+
| | Web Awesome | 148,696 | 36,894 | 31,476 |
|
|
5309
|
+
| \`radio\` | **Helix** | 55,036 | 17,528 | 15,711 |
|
|
5310
|
+
| | Carbon | 62,982 | 16,599 | 14,519 |
|
|
5311
|
+
| | Material Web | 41,029 | 13,048 | 11,659 |
|
|
5312
|
+
| | Spectrum | 38,765 | 10,485 | 9,337 |
|
|
5313
|
+
| | Web Awesome | 112,100 | 27,426 | 23,157 |
|
|
5314
|
+
| \`switch\` | **Helix** | 49,022 | 16,458 | 14,793 |
|
|
5315
|
+
| | Carbon | 69,388 | 16,861 | 14,710 |
|
|
5316
|
+
| | Material Web | 50,129 | 14,355 | 12,869 |
|
|
5317
|
+
| | Spectrum | 62,390 | 14,852 | 13,259 |
|
|
5318
|
+
| | Web Awesome | 45,922 | 15,043 | 13,489 |
|
|
5319
|
+
| \`tabs\` | **Helix** | 61,660 | 19,580 | 17,610 |
|
|
5320
|
+
| | Carbon | 578,657 | 72,708 | 43,044 |
|
|
5321
|
+
| | Material Web | 38,875 | 12,619 | 11,290 |
|
|
5322
|
+
| | Spectrum | 64,371 | 17,857 | 16,004 |
|
|
5323
|
+
| | Web Awesome | 153,457 | 37,241 | 31,779 |
|
|
5324
|
+
| \`tooltip\` | **Helix** | 67,881 | 23,739 | 21,356 |
|
|
5325
|
+
| | Carbon | 189,319 | 29,833 | 22,169 |
|
|
5224
5326
|
| | Material Web | | not shipped | |
|
|
5225
|
-
| | Spectrum | 136,
|
|
5226
|
-
| | Web Awesome | 70,
|
|
5327
|
+
| | Spectrum | 136,084 | 39,731 | 34,997 |
|
|
5328
|
+
| | Web Awesome | 70,482 | 23,540 | 21,032 |
|
|
5227
5329
|
|
|
5228
|
-
At least one system is smaller than Helix on \`button\`, \`checkbox\`, \`dialog\`, \`radio\`, \`switch\`, \`tabs\`. The largest gap is radio against Spectrum, at
|
|
5330
|
+
At least one system is smaller than Helix on \`button\`, \`checkbox\`, \`dialog\`, \`radio\`, \`switch\`, \`tabs\`, \`tooltip\`. The largest gap is radio against Spectrum, at 7,043 bytes gzipped. 14 of 27 peer measurements are smaller than the Helix row.
|
|
5229
5331
|
|
|
5230
5332
|
Helix's \`radio\` family includes Radio Group, so its row carries an element that some peer rows measure without.
|
|
5231
5333
|
|
|
@@ -5238,7 +5340,7 @@ Every specifier we measured is in [\`peers.json\`](https://github.com/project-fu
|
|
|
5238
5340
|
|
|
5239
5341
|
## What each system ships
|
|
5240
5342
|
|
|
5241
|
-
Every system in the size comparison ships buttons, form controls, menus, and dialogs. This table lists jobs beyond those, and the elements each system ships for each job. Each name comes from the manifest the system publishes, read by \`turbo run peers\` on October
|
|
5343
|
+
Every system in the size comparison ships buttons, form controls, menus, and dialogs. This table lists jobs beyond those, and the elements each system ships for each job. Each name comes from the manifest the system publishes, read by \`turbo run peers\` on October 31, 2026. The Helix column reads \`@fusion.dev/helix\` on every run.
|
|
5242
5344
|
|
|
5243
5345
|
A system covers a job when its manifest defines an element with one of a fixed list of names, after its prefix. The list is the same for every system, and it is in \`build-metrics.mjs\`. An empty cell means no element has one of those names. A system can still do the job with a pattern, a separate library, or an element under another name.
|
|
5244
5346
|
|
|
@@ -5299,120 +5401,120 @@ Structure, accessibility, state, and form participation. It has no presentation
|
|
|
5299
5401
|
|
|
5300
5402
|
| Family | Alone raw | Alone gzip | Alone brotli | Added raw | Added gzip | Added brotli |
|
|
5301
5403
|
|---|---|---|---|---|---|---|
|
|
5302
|
-
| \`accordion\` | 36,
|
|
5303
|
-
| \`announcement\` |
|
|
5304
|
-
| \`app-header\` |
|
|
5305
|
-
| \`area-chart\` | 110,
|
|
5306
|
-
| \`avatar\` | 35,
|
|
5307
|
-
| \`badge\` |
|
|
5308
|
-
| \`bar-chart\` | 118,
|
|
5309
|
-
| \`blockquote\` | 28,
|
|
5310
|
-
| \`breadcrumbs\` |
|
|
5311
|
-
| \`button\` |
|
|
5312
|
-
| \`button-group\` | 32,
|
|
5313
|
-
| \`callout\` |
|
|
5314
|
-
| \`canvas\` |
|
|
5315
|
-
| \`card\` |
|
|
5316
|
-
| \`carousel\` |
|
|
5317
|
-
| \`chat\` |
|
|
5318
|
-
| \`checkbox\` | 45,
|
|
5319
|
-
| \`checkbox-group\` | 52,
|
|
5320
|
-
| \`code\` | 24,
|
|
5321
|
-
| \`code-block\` |
|
|
5322
|
-
| \`code-editor\` |
|
|
5323
|
-
| \`code-input\` | 65,
|
|
5324
|
-
| \`color-input\` |
|
|
5325
|
-
| \`color-picker\` |
|
|
5326
|
-
| \`combobox\` |
|
|
5327
|
-
| \`command\` |
|
|
5328
|
-
| \`copy-button\` |
|
|
5329
|
-
| \`data-table\` |
|
|
5330
|
-
| \`date-input\` |
|
|
5331
|
-
| \`date-picker\` |
|
|
5332
|
-
| \`description-list\` | 27,
|
|
5333
|
-
| \`device-screen\` |
|
|
5334
|
-
| \`dialog\` |
|
|
5335
|
-
| \`divider\` |
|
|
5336
|
-
| \`donut-chart\` |
|
|
5337
|
-
| \`drawer\` | 47,
|
|
5338
|
-
| \`drilldown\` |
|
|
5339
|
-
| \`editor\` |
|
|
5340
|
-
| \`empty\` |
|
|
5341
|
-
| \`file-input\` |
|
|
5342
|
-
| \`filter-input\` |
|
|
5343
|
-
| \`find\` |
|
|
5344
|
-
| \`format-date\` |
|
|
5345
|
-
| \`graph\` |
|
|
5346
|
-
| \`heatmap\` |
|
|
5347
|
-
| \`icon\` |
|
|
5348
|
-
| \`icon-button\` |
|
|
5349
|
-
| \`image\` |
|
|
5350
|
-
| \`input\` |
|
|
5351
|
-
| \`kbd\` |
|
|
5352
|
-
| \`legend\` |
|
|
5353
|
-
| \`lightbox\` | 60,
|
|
5354
|
-
| \`line-chart\` | 113,
|
|
5355
|
-
| \`list\` |
|
|
5356
|
-
| \`listbox\` |
|
|
5357
|
-
| \`loader\` |
|
|
5358
|
-
| \`log\` | 89,
|
|
5359
|
-
| \`map\` |
|
|
5360
|
-
| \`markdown\` |
|
|
5361
|
-
| \`megamenu\` |
|
|
5362
|
-
| \`menu\` |
|
|
5363
|
-
| \`meter\` |
|
|
5364
|
-
| \`motion-toggle\` |
|
|
5365
|
-
| \`navigation\` | 37,
|
|
5366
|
-
| \`notifications\` |
|
|
5367
|
-
| \`number-input\` | 61,
|
|
5368
|
-
| \`object-inspector\` |
|
|
5369
|
-
| \`option\` |
|
|
5370
|
-
| \`outline\` |
|
|
5371
|
-
| \`pagination\` |
|
|
5372
|
-
| \`pin-input\` | 52,
|
|
5373
|
-
| \`popover\` |
|
|
5374
|
-
| \`progress\` |
|
|
5375
|
-
| \`qr-code\` | 47,
|
|
5376
|
-
| \`quote\` |
|
|
5377
|
-
| \`radio\` |
|
|
5378
|
-
| \`rating\` |
|
|
5379
|
-
| \`scatter-chart\` |
|
|
5380
|
-
| \`scroll-area\` | 35,
|
|
5381
|
-
| \`select\` | 132,
|
|
5382
|
-
| \`shortcut-overlay\` |
|
|
5383
|
-
| \`skeleton\` | 26,
|
|
5384
|
-
| \`skip-link\` | 28,
|
|
5385
|
-
| \`slider\` |
|
|
5386
|
-
| \`sparkline\` |
|
|
5387
|
-
| \`spatial-bar-chart\` | 125,
|
|
5388
|
-
| \`spatial-heatmap\` | 128,
|
|
5389
|
-
| \`spatial-ribbon-chart\` |
|
|
5390
|
-
| \`spatial-scatter-chart\` |
|
|
5391
|
-
| \`spatial-surface-chart\` |
|
|
5392
|
-
| \`spatial-treemap\` |
|
|
5393
|
-
| \`speed-dial\` |
|
|
5394
|
-
| \`splitter\` |
|
|
5395
|
-
| \`stat\` |
|
|
5396
|
-
| \`steps\` |
|
|
5397
|
-
| \`switch\` | 44,
|
|
5398
|
-
| \`table\` |
|
|
5399
|
-
| \`tabs\` |
|
|
5400
|
-
| \`tag\` |
|
|
5401
|
-
| \`terminal\` |
|
|
5402
|
-
| \`textarea\` | 59,
|
|
5403
|
-
| \`time-input\` |
|
|
5404
|
-
| \`time-picker\` |
|
|
5405
|
-
| \`timeline\` |
|
|
5406
|
-
| \`toast\` |
|
|
5407
|
-
| \`toggle\` |
|
|
5408
|
-
| \`toolbar\` |
|
|
5409
|
-
| \`tooltip\` |
|
|
5410
|
-
| \`tour\` |
|
|
5411
|
-
| \`tree\` | 72,
|
|
5412
|
-
| \`trend\` |
|
|
5413
|
-
| \`video\` |
|
|
5414
|
-
| \`video-playlist\` |
|
|
5415
|
-
| \`virtual-list\` |
|
|
5404
|
+
| \`accordion\` | 36,788 | 13,361 | 12,020 | 5,369 | 1,510 | 1,069 |
|
|
5405
|
+
| \`announcement\` | 41,504 | 14,908 | 13,466 | 4,788 | 1,396 | 1,068 |
|
|
5406
|
+
| \`app-header\` | 37,460 | 13,637 | 12,255 | 6,103 | 1,831 | 1,298 |
|
|
5407
|
+
| \`area-chart\` | 110,876 | 38,446 | 34,326 | 14,781 | 4,514 | 3,697 |
|
|
5408
|
+
| \`avatar\` | 35,972 | 13,427 | 12,201 | 3,980 | 1,241 | 872 |
|
|
5409
|
+
| \`badge\` | 32,204 | 12,203 | 11,028 | 2,941 | 889 | 658 |
|
|
5410
|
+
| \`bar-chart\` | 118,895 | 41,034 | 36,639 | 22,275 | 6,958 | 5,707 |
|
|
5411
|
+
| \`blockquote\` | 28,797 | 10,961 | 9,858 | 2,400 | 870 | 638 |
|
|
5412
|
+
| \`breadcrumbs\` | 42,197 | 15,744 | 14,225 | 7,912 | 2,506 | 1,986 |
|
|
5413
|
+
| \`button\` | 41,599 | 14,659 | 13,253 | 5,695 | 1,678 | 1,144 |
|
|
5414
|
+
| \`button-group\` | 32,666 | 11,956 | 10,770 | 4,897 | 1,457 | 993 |
|
|
5415
|
+
| \`callout\` | 40,054 | 15,112 | 13,582 | 2,875 | 992 | 604 |
|
|
5416
|
+
| \`canvas\` | 179,749 | 56,211 | 49,056 | 86,219 | 25,106 | 20,658 |
|
|
5417
|
+
| \`card\` | 28,502 | 10,629 | 9,573 | 2,074 | 613 | 353 |
|
|
5418
|
+
| \`carousel\` | 49,408 | 17,355 | 15,659 | 15,477 | 4,259 | 3,313 |
|
|
5419
|
+
| \`chat\` | 141,862 | 46,118 | 40,744 | 44,186 | 12,189 | 9,641 |
|
|
5420
|
+
| \`checkbox\` | 45,709 | 15,484 | 13,917 | 3,154 | 977 | 632 |
|
|
5421
|
+
| \`checkbox-group\` | 52,892 | 17,350 | 15,561 | 8,351 | 2,350 | 1,644 |
|
|
5422
|
+
| \`code\` | 24,987 | 9,594 | 8,634 | 136 | 57 | 121 |
|
|
5423
|
+
| \`code-block\` | 113,571 | 38,287 | 34,035 | 40,487 | 11,882 | 9,609 |
|
|
5424
|
+
| \`code-editor\` | 101,737 | 31,707 | 28,089 | 37,299 | 9,474 | 7,485 |
|
|
5425
|
+
| \`code-input\` | 65,648 | 22,502 | 20,155 | 10,559 | 3,404 | 2,611 |
|
|
5426
|
+
| \`color-input\` | 149,480 | 47,457 | 41,565 | 56,692 | 14,691 | 11,742 |
|
|
5427
|
+
| \`color-picker\` | 110,841 | 35,126 | 31,161 | 48,828 | 13,102 | 10,399 |
|
|
5428
|
+
| \`combobox\` | 150,510 | 47,620 | 41,997 | 37,524 | 9,378 | 7,436 |
|
|
5429
|
+
| \`command\` | 127,691 | 39,998 | 35,143 | 38,272 | 9,836 | 7,876 |
|
|
5430
|
+
| \`copy-button\` | 88,951 | 30,220 | 26,982 | 19,839 | 5,302 | 4,156 |
|
|
5431
|
+
| \`data-table\` | 221,008 | 67,295 | 58,004 | 93,771 | 24,748 | 19,681 |
|
|
5432
|
+
| \`date-input\` | 147,158 | 45,984 | 40,691 | 38,735 | 9,419 | 7,541 |
|
|
5433
|
+
| \`date-picker\` | 67,350 | 22,765 | 20,544 | 20,821 | 5,644 | 4,435 |
|
|
5434
|
+
| \`description-list\` | 27,583 | 10,320 | 9,292 | 1,554 | 489 | 261 |
|
|
5435
|
+
| \`device-screen\` | 122,587 | 38,605 | 34,172 | 46,259 | 11,429 | 8,971 |
|
|
5436
|
+
| \`dialog\` | 43,110 | 15,225 | 13,667 | 6,075 | 1,792 | 1,266 |
|
|
5437
|
+
| \`divider\` | 28,042 | 10,561 | 9,490 | 1,410 | 479 | 189 |
|
|
5438
|
+
| \`donut-chart\` | 104,235 | 35,856 | 32,068 | 15,091 | 4,568 | 3,680 |
|
|
5439
|
+
| \`drawer\` | 47,598 | 16,648 | 14,964 | 7,778 | 2,238 | 1,689 |
|
|
5440
|
+
| \`drilldown\` | 48,006 | 16,533 | 14,855 | 10,059 | 2,735 | 2,069 |
|
|
5441
|
+
| \`editor\` | 178,365 | 54,257 | 47,139 | 83,366 | 20,565 | 16,435 |
|
|
5442
|
+
| \`empty\` | 29,125 | 10,882 | 9,801 | 1,974 | 632 | 504 |
|
|
5443
|
+
| \`file-input\` | 63,256 | 21,754 | 19,568 | 13,323 | 4,169 | 3,120 |
|
|
5444
|
+
| \`filter-input\` | 113,026 | 37,877 | 33,646 | 21,663 | 6,136 | 4,815 |
|
|
5445
|
+
| \`find\` | 78,192 | 25,912 | 23,108 | 21,809 | 5,715 | 4,516 |
|
|
5446
|
+
| \`format-date\` | 35,311 | 12,969 | 11,694 | 4,462 | 1,239 | 821 |
|
|
5447
|
+
| \`graph\` | 146,422 | 46,081 | 40,298 | 40,018 | 10,987 | 8,811 |
|
|
5448
|
+
| \`heatmap\` | 113,308 | 38,183 | 34,067 | 19,434 | 5,634 | 4,506 |
|
|
5449
|
+
| \`icon\` | 108,395 | 36,072 | 30,978 | 78,520 | 25,860 | 20,908 |
|
|
5450
|
+
| \`icon-button\` | 41,708 | 14,699 | 13,267 | 5,802 | 1,678 | 1,227 |
|
|
5451
|
+
| \`image\` | 30,491 | 11,154 | 10,066 | 3,842 | 1,115 | 814 |
|
|
5452
|
+
| \`input\` | 62,209 | 21,266 | 18,976 | 7,350 | 2,355 | 1,472 |
|
|
5453
|
+
| \`kbd\` | 34,229 | 12,745 | 11,457 | 3,926 | 1,249 | 864 |
|
|
5454
|
+
| \`legend\` | 44,093 | 15,635 | 14,129 | 2,764 | 882 | 584 |
|
|
5455
|
+
| \`lightbox\` | 60,994 | 20,490 | 18,368 | 16,839 | 4,619 | 3,432 |
|
|
5456
|
+
| \`line-chart\` | 113,879 | 39,280 | 35,067 | 17,183 | 5,120 | 4,259 |
|
|
5457
|
+
| \`list\` | 67,327 | 23,172 | 20,655 | 15,570 | 4,400 | 3,386 |
|
|
5458
|
+
| \`listbox\` | 94,025 | 31,049 | 27,469 | 16,516 | 4,667 | 3,520 |
|
|
5459
|
+
| \`loader\` | 31,541 | 11,771 | 10,632 | 2,875 | 940 | 782 |
|
|
5460
|
+
| \`log\` | 89,716 | 29,999 | 26,842 | 40,360 | 12,455 | 10,375 |
|
|
5461
|
+
| \`map\` | 159,903 | 47,424 | 40,911 | 63,298 | 15,416 | 11,801 |
|
|
5462
|
+
| \`markdown\` | 140,272 | 47,303 | 41,887 | 62,608 | 19,544 | 16,186 |
|
|
5463
|
+
| \`megamenu\` | 65,596 | 23,361 | 20,885 | 8,742 | 2,372 | 1,714 |
|
|
5464
|
+
| \`menu\` | 106,453 | 34,786 | 30,995 | 32,752 | 8,412 | 6,780 |
|
|
5465
|
+
| \`meter\` | 38,888 | 14,279 | 12,919 | 6,365 | 1,817 | 1,438 |
|
|
5466
|
+
| \`motion-toggle\` | 30,535 | 11,627 | 10,438 | 1,539 | 547 | 214 |
|
|
5467
|
+
| \`navigation\` | 37,912 | 13,969 | 12,527 | 3,497 | 1,156 | 832 |
|
|
5468
|
+
| \`notifications\` | 64,044 | 21,590 | 19,442 | 18,695 | 5,072 | 3,998 |
|
|
5469
|
+
| \`number-input\` | 61,522 | 20,549 | 18,502 | 13,492 | 3,631 | 2,646 |
|
|
5470
|
+
| \`object-inspector\` | 124,337 | 41,342 | 36,606 | 37,188 | 10,579 | 8,423 |
|
|
5471
|
+
| \`option\` | 31,105 | 11,300 | 10,179 | 4,446 | 1,157 | 855 |
|
|
5472
|
+
| \`outline\` | 41,449 | 14,806 | 13,355 | 10,620 | 3,117 | 2,381 |
|
|
5473
|
+
| \`pagination\` | 154,678 | 49,078 | 42,930 | 47,274 | 12,176 | 9,610 |
|
|
5474
|
+
| \`pin-input\` | 52,802 | 18,248 | 16,422 | 7,187 | 2,356 | 1,694 |
|
|
5475
|
+
| \`popover\` | 69,330 | 24,448 | 21,878 | 6,480 | 1,830 | 1,310 |
|
|
5476
|
+
| \`progress\` | 33,407 | 12,448 | 11,245 | 3,075 | 944 | 778 |
|
|
5477
|
+
| \`qr-code\` | 47,683 | 18,136 | 16,366 | 16,927 | 6,238 | 5,245 |
|
|
5478
|
+
| \`quote\` | 27,206 | 10,427 | 9,378 | 1,205 | 496 | 269 |
|
|
5479
|
+
| \`radio\` | 47,265 | 16,015 | 14,377 | 3,799 | 1,217 | 674 |
|
|
5480
|
+
| \`rating\` | 56,091 | 19,233 | 17,281 | 8,272 | 2,510 | 1,796 |
|
|
5481
|
+
| \`scatter-chart\` | 110,294 | 37,893 | 33,810 | 20,721 | 6,412 | 5,241 |
|
|
5482
|
+
| \`scroll-area\` | 35,923 | 12,852 | 11,556 | 9,027 | 2,676 | 1,979 |
|
|
5483
|
+
| \`select\` | 132,912 | 43,503 | 38,265 | 27,302 | 7,299 | 5,572 |
|
|
5484
|
+
| \`shortcut-overlay\` | 54,311 | 19,106 | 17,101 | 11,631 | 3,435 | 2,616 |
|
|
5485
|
+
| \`skeleton\` | 26,984 | 10,207 | 9,193 | 954 | 353 | 181 |
|
|
5486
|
+
| \`skip-link\` | 28,768 | 10,918 | 9,831 | 1,334 | 494 | 321 |
|
|
5487
|
+
| \`slider\` | 59,094 | 19,778 | 17,838 | 13,667 | 3,858 | 2,977 |
|
|
5488
|
+
| \`sparkline\` | 53,331 | 19,123 | 17,287 | 5,968 | 2,067 | 1,598 |
|
|
5489
|
+
| \`spatial-bar-chart\` | 125,627 | 43,812 | 38,963 | 28,914 | 9,746 | 8,037 |
|
|
5490
|
+
| \`spatial-heatmap\` | 128,676 | 43,336 | 38,529 | 32,104 | 9,606 | 7,867 |
|
|
5491
|
+
| \`spatial-ribbon-chart\` | 116,031 | 40,303 | 35,847 | 21,327 | 7,073 | 5,756 |
|
|
5492
|
+
| \`spatial-scatter-chart\` | 114,102 | 39,465 | 35,131 | 19,459 | 6,299 | 5,086 |
|
|
5493
|
+
| \`spatial-surface-chart\` | 117,034 | 40,688 | 36,207 | 22,328 | 7,462 | 6,090 |
|
|
5494
|
+
| \`spatial-treemap\` | 118,137 | 41,301 | 36,767 | 21,742 | 7,350 | 6,011 |
|
|
5495
|
+
| \`speed-dial\` | 74,018 | 26,161 | 23,404 | 11,107 | 2,927 | 2,157 |
|
|
5496
|
+
| \`splitter\` | 49,870 | 17,059 | 15,405 | 15,021 | 3,923 | 3,111 |
|
|
5497
|
+
| \`stat\` | 30,366 | 11,365 | 10,270 | 2,291 | 745 | 516 |
|
|
5498
|
+
| \`steps\` | 60,474 | 20,856 | 18,679 | 14,540 | 4,050 | 2,972 |
|
|
5499
|
+
| \`switch\` | 44,568 | 15,309 | 13,740 | 1,733 | 654 | 377 |
|
|
5500
|
+
| \`table\` | 125,700 | 38,956 | 34,305 | 45,249 | 12,360 | 9,920 |
|
|
5501
|
+
| \`tabs\` | 51,456 | 17,513 | 15,743 | 10,607 | 2,836 | 2,209 |
|
|
5502
|
+
| \`tag\` | 47,412 | 17,110 | 15,426 | 8,490 | 2,491 | 1,802 |
|
|
5503
|
+
| \`terminal\` | 141,582 | 44,590 | 39,304 | 54,204 | 13,436 | 10,727 |
|
|
5504
|
+
| \`textarea\` | 59,949 | 20,470 | 18,375 | 5,642 | 1,666 | 1,189 |
|
|
5505
|
+
| \`time-input\` | 187,028 | 58,028 | 50,519 | 50,345 | 12,610 | 10,109 |
|
|
5506
|
+
| \`time-picker\` | 117,065 | 37,039 | 32,675 | 35,289 | 9,370 | 7,479 |
|
|
5507
|
+
| \`timeline\` | 36,581 | 13,678 | 12,360 | 4,128 | 1,206 | 841 |
|
|
5508
|
+
| \`toast\` | 74,603 | 25,176 | 22,451 | 20,050 | 5,568 | 4,433 |
|
|
5509
|
+
| \`toggle\` | 51,029 | 16,915 | 15,291 | 6,038 | 1,790 | 1,288 |
|
|
5510
|
+
| \`toolbar\` | 37,383 | 13,551 | 12,196 | 1,406 | 490 | 239 |
|
|
5511
|
+
| \`tooltip\` | 65,000 | 22,983 | 20,679 | 8,862 | 2,439 | 2,039 |
|
|
5512
|
+
| \`tour\` | 90,755 | 30,739 | 27,493 | 21,104 | 5,649 | 4,382 |
|
|
5513
|
+
| \`tree\` | 72,738 | 24,341 | 21,756 | 17,539 | 4,881 | 3,825 |
|
|
5514
|
+
| \`trend\` | 35,034 | 13,356 | 12,086 | 3,577 | 1,126 | 815 |
|
|
5515
|
+
| \`video\` | 152,045 | 46,721 | 41,179 | 69,404 | 17,303 | 13,962 |
|
|
5516
|
+
| \`video-playlist\` | 137,298 | 43,792 | 38,726 | 45,878 | 11,721 | 9,509 |
|
|
5517
|
+
| \`virtual-list\` | 72,396 | 23,976 | 21,619 | 25,472 | 7,513 | 6,160 |
|
|
5416
5518
|
|
|
5417
5519
|
### Styled tier
|
|
5418
5520
|
|
|
@@ -5420,128 +5522,128 @@ The headless tier plus presentation. \`bun add @fusion.dev/helix\` installs this
|
|
|
5420
5522
|
|
|
5421
5523
|
| Family | Alone raw | Alone gzip | Alone brotli | Added raw | Added gzip | Added brotli |
|
|
5422
5524
|
|---|---|---|---|---|---|---|
|
|
5423
|
-
| \`accordion\` |
|
|
5424
|
-
| \`announcement\` |
|
|
5425
|
-
| \`app-header\` |
|
|
5426
|
-
| \`area-chart\` |
|
|
5427
|
-
| \`aura\` |
|
|
5428
|
-
| \`avatar\` | 38,
|
|
5429
|
-
| \`badge\` | 37,
|
|
5430
|
-
| \`bar-chart\` |
|
|
5431
|
-
| \`blockquote\` |
|
|
5432
|
-
| \`breadcrumbs\` |
|
|
5433
|
-
| \`button\` |
|
|
5434
|
-
| \`button-group\` |
|
|
5435
|
-
| \`callout\` | 43,
|
|
5436
|
-
| \`canvas\` |
|
|
5437
|
-
| \`card\` |
|
|
5438
|
-
| \`carousel\` | 59,
|
|
5439
|
-
| \`chat\` |
|
|
5440
|
-
| \`checkbox\` |
|
|
5441
|
-
| \`checkbox-group\` |
|
|
5442
|
-
| \`code\` | 25,
|
|
5443
|
-
| \`code-block\` |
|
|
5444
|
-
| \`code-editor\` |
|
|
5445
|
-
| \`code-input\` | 80,
|
|
5446
|
-
| \`color-input\` |
|
|
5447
|
-
| \`color-picker\` |
|
|
5448
|
-
| \`combobox\` |
|
|
5449
|
-
| \`command\` |
|
|
5450
|
-
| \`copy-button\` |
|
|
5451
|
-
| \`data-table\` |
|
|
5452
|
-
| \`date-input\` |
|
|
5453
|
-
| \`date-picker\` |
|
|
5454
|
-
| \`description-list\` | 30,
|
|
5455
|
-
| \`device-screen\` |
|
|
5456
|
-
| \`dialog\` | 48,
|
|
5457
|
-
| \`divider\` |
|
|
5458
|
-
| \`donut-chart\` | 115,
|
|
5459
|
-
| \`drawer\` |
|
|
5460
|
-
| \`drilldown\` |
|
|
5461
|
-
| \`editor\` |
|
|
5462
|
-
| \`empty\` |
|
|
5463
|
-
| \`file-input\` |
|
|
5464
|
-
| \`filter-input\` |
|
|
5465
|
-
| \`find\` |
|
|
5466
|
-
| \`flex\` |
|
|
5467
|
-
| \`format-date\` | 35,
|
|
5468
|
-
| \`graph\` |
|
|
5469
|
-
| \`grid\` | 31,
|
|
5470
|
-
| \`heatmap\` |
|
|
5471
|
-
| \`icon\` |
|
|
5472
|
-
| \`icon-button\` |
|
|
5473
|
-
| \`image\` | 31,
|
|
5474
|
-
| \`input\` | 77,
|
|
5475
|
-
| \`kbd\` |
|
|
5476
|
-
| \`legend\` |
|
|
5477
|
-
| \`lightbox\` |
|
|
5478
|
-
| \`line-chart\` | 126,
|
|
5479
|
-
| \`list\` |
|
|
5480
|
-
| \`listbox\` |
|
|
5481
|
-
| \`loader\` |
|
|
5482
|
-
| \`log\` |
|
|
5483
|
-
| \`map\` |
|
|
5484
|
-
| \`markdown\` |
|
|
5485
|
-
| \`megamenu\` |
|
|
5486
|
-
| \`menu\` |
|
|
5487
|
-
| \`meter\` |
|
|
5488
|
-
| \`motion-toggle\` |
|
|
5489
|
-
| \`navigation\` |
|
|
5490
|
-
| \`notifications\` |
|
|
5491
|
-
| \`number-input\` | 66,
|
|
5492
|
-
| \`object-inspector\` |
|
|
5493
|
-
| \`option\` |
|
|
5494
|
-
| \`orb\` | 40,
|
|
5495
|
-
| \`outline\` |
|
|
5496
|
-
| \`pagination\` |
|
|
5497
|
-
| \`pin-input\` |
|
|
5498
|
-
| \`popover\` |
|
|
5499
|
-
| \`progress\` |
|
|
5500
|
-
| \`qr-code\` |
|
|
5501
|
-
| \`quote\` | 27,
|
|
5502
|
-
| \`radio\` |
|
|
5503
|
-
| \`rating\` |
|
|
5504
|
-
| \`sandbox\` |
|
|
5505
|
-
| \`scatter-chart\` |
|
|
5506
|
-
| \`scroll-area\` | 43,
|
|
5507
|
-
| \`select\` | 153,
|
|
5508
|
-
| \`shortcut-overlay\` |
|
|
5509
|
-
| \`skeleton\` | 30,
|
|
5510
|
-
| \`skip-link\` |
|
|
5511
|
-
| \`slider\` |
|
|
5512
|
-
| \`sparkline\` | 58,
|
|
5513
|
-
| \`spatial-bar-chart\` | 137,
|
|
5514
|
-
| \`spatial-heatmap\` | 139,
|
|
5515
|
-
| \`spatial-ribbon-chart\` |
|
|
5516
|
-
| \`spatial-scatter-chart\` |
|
|
5517
|
-
| \`spatial-surface-chart\` | 126,
|
|
5518
|
-
| \`spatial-treemap\` | 128,
|
|
5519
|
-
| \`speed-dial\` |
|
|
5520
|
-
| \`splitter\` |
|
|
5521
|
-
| \`stat\` |
|
|
5522
|
-
| \`steps\` |
|
|
5523
|
-
| \`strands\` |
|
|
5524
|
-
| \`switch\` |
|
|
5525
|
-
| \`table\` |
|
|
5526
|
-
| \`tabs\` | 61,
|
|
5527
|
-
| \`tag\` | 51,
|
|
5528
|
-
| \`terminal\` |
|
|
5529
|
-
| \`text\` |
|
|
5530
|
-
| \`textarea\` | 75,
|
|
5531
|
-
| \`time-input\` | 222,
|
|
5532
|
-
| \`time-picker\` |
|
|
5533
|
-
| \`timeline\` |
|
|
5534
|
-
| \`toast\` |
|
|
5535
|
-
| \`toggle\` | 55,
|
|
5536
|
-
| \`toolbar\` |
|
|
5537
|
-
| \`tooltip\` | 67,
|
|
5538
|
-
| \`tour\` |
|
|
5539
|
-
| \`tree\` | 81,
|
|
5540
|
-
| \`trend\` | 36,
|
|
5541
|
-
| \`video\` |
|
|
5542
|
-
| \`video-playlist\` |
|
|
5543
|
-
| \`virtual-list\` |
|
|
5544
|
-
| \`voice-level\` |
|
|
5525
|
+
| \`accordion\` | 40,217 | 14,216 | 12,814 | 8,788 | 2,386 | 1,821 |
|
|
5526
|
+
| \`announcement\` | 46,117 | 15,939 | 14,383 | 9,382 | 2,454 | 1,969 |
|
|
5527
|
+
| \`app-header\` | 42,621 | 14,828 | 13,354 | 11,246 | 3,025 | 2,311 |
|
|
5528
|
+
| \`area-chart\` | 120,454 | 40,556 | 36,188 | 24,355 | 6,666 | 5,381 |
|
|
5529
|
+
| \`aura\` | 64,184 | 21,751 | 19,460 | 32,004 | 9,688 | 8,043 |
|
|
5530
|
+
| \`avatar\` | 38,970 | 14,169 | 12,846 | 6,964 | 1,980 | 1,574 |
|
|
5531
|
+
| \`badge\` | 37,710 | 13,446 | 12,164 | 8,435 | 2,133 | 1,697 |
|
|
5532
|
+
| \`bar-chart\` | 135,311 | 44,251 | 39,488 | 38,673 | 10,242 | 8,470 |
|
|
5533
|
+
| \`blockquote\` | 31,018 | 11,503 | 10,350 | 4,608 | 1,410 | 1,226 |
|
|
5534
|
+
| \`breadcrumbs\` | 49,213 | 16,960 | 15,322 | 14,918 | 3,777 | 3,046 |
|
|
5535
|
+
| \`button\` | 49,256 | 16,177 | 14,575 | 13,332 | 3,195 | 2,540 |
|
|
5536
|
+
| \`button-group\` | 36,163 | 12,635 | 11,427 | 8,378 | 2,145 | 1,673 |
|
|
5537
|
+
| \`callout\` | 43,845 | 16,045 | 14,425 | 6,648 | 1,921 | 1,384 |
|
|
5538
|
+
| \`canvas\` | 214,020 | 61,607 | 53,838 | 120,476 | 30,722 | 25,537 |
|
|
5539
|
+
| \`card\` | 32,401 | 11,628 | 10,463 | 5,958 | 1,609 | 1,218 |
|
|
5540
|
+
| \`carousel\` | 59,895 | 19,117 | 17,308 | 25,946 | 6,077 | 4,690 |
|
|
5541
|
+
| \`chat\` | 179,720 | 54,376 | 48,039 | 79,359 | 19,646 | 16,230 |
|
|
5542
|
+
| \`checkbox\` | 52,190 | 16,959 | 15,249 | 9,617 | 2,490 | 1,889 |
|
|
5543
|
+
| \`checkbox-group\` | 60,104 | 18,966 | 17,003 | 15,554 | 3,970 | 3,040 |
|
|
5544
|
+
| \`code\` | 25,842 | 9,897 | 8,921 | 972 | 368 | 329 |
|
|
5545
|
+
| \`code-block\` | 141,674 | 42,399 | 37,678 | 68,566 | 16,130 | 13,109 |
|
|
5546
|
+
| \`code-editor\` | 132,746 | 35,888 | 31,845 | 68,302 | 13,908 | 11,119 |
|
|
5547
|
+
| \`code-input\` | 80,798 | 26,901 | 24,130 | 22,581 | 6,880 | 5,627 |
|
|
5548
|
+
| \`color-input\` | 193,253 | 53,854 | 47,196 | 100,452 | 21,027 | 17,249 |
|
|
5549
|
+
| \`color-picker\` | 149,088 | 40,760 | 36,140 | 87,075 | 18,843 | 15,435 |
|
|
5550
|
+
| \`combobox\` | 177,485 | 54,011 | 47,565 | 61,349 | 14,872 | 12,127 |
|
|
5551
|
+
| \`command\` | 154,679 | 46,715 | 40,952 | 61,962 | 15,656 | 12,847 |
|
|
5552
|
+
| \`copy-button\` | 104,615 | 32,690 | 29,178 | 35,479 | 7,884 | 6,250 |
|
|
5553
|
+
| \`data-table\` | 266,891 | 76,830 | 66,074 | 136,619 | 33,429 | 26,902 |
|
|
5554
|
+
| \`date-input\` | 168,543 | 49,733 | 44,209 | 60,091 | 13,241 | 10,854 |
|
|
5555
|
+
| \`date-picker\` | 75,396 | 24,195 | 21,813 | 28,847 | 7,090 | 5,727 |
|
|
5556
|
+
| \`description-list\` | 30,533 | 11,064 | 9,991 | 4,493 | 1,256 | 882 |
|
|
5557
|
+
| \`device-screen\` | 143,681 | 42,193 | 37,327 | 67,336 | 15,073 | 11,999 |
|
|
5558
|
+
| \`dialog\` | 48,868 | 16,562 | 14,904 | 11,811 | 3,141 | 2,492 |
|
|
5559
|
+
| \`divider\` | 30,340 | 11,172 | 10,050 | 3,691 | 1,115 | 766 |
|
|
5560
|
+
| \`donut-chart\` | 115,589 | 38,200 | 34,100 | 26,438 | 7,005 | 5,694 |
|
|
5561
|
+
| \`drawer\` | 53,528 | 18,048 | 16,239 | 13,686 | 3,699 | 3,024 |
|
|
5562
|
+
| \`drilldown\` | 53,685 | 17,818 | 15,995 | 15,727 | 4,025 | 3,165 |
|
|
5563
|
+
| \`editor\` | 222,769 | 60,471 | 52,602 | 127,752 | 26,930 | 21,967 |
|
|
5564
|
+
| \`empty\` | 30,432 | 11,353 | 10,212 | 3,263 | 1,092 | 806 |
|
|
5565
|
+
| \`file-input\` | 74,781 | 24,152 | 21,697 | 24,828 | 6,563 | 5,259 |
|
|
5566
|
+
| \`filter-input\` | 134,913 | 43,377 | 38,531 | 40,410 | 10,819 | 8,914 |
|
|
5567
|
+
| \`find\` | 102,866 | 29,322 | 26,094 | 46,485 | 9,270 | 7,388 |
|
|
5568
|
+
| \`flex\` | 30,430 | 10,756 | 9,677 | 4,761 | 1,034 | 780 |
|
|
5569
|
+
| \`format-date\` | 35,565 | 13,094 | 11,839 | 4,698 | 1,347 | 1,034 |
|
|
5570
|
+
| \`graph\` | 175,865 | 50,597 | 44,230 | 69,440 | 15,620 | 12,534 |
|
|
5571
|
+
| \`grid\` | 31,880 | 11,439 | 10,348 | 5,650 | 1,435 | 1,130 |
|
|
5572
|
+
| \`heatmap\` | 123,013 | 40,317 | 36,054 | 29,119 | 7,761 | 6,412 |
|
|
5573
|
+
| \`icon\` | 110,428 | 36,672 | 31,502 | 80,371 | 26,386 | 21,402 |
|
|
5574
|
+
| \`icon-button\` | 53,001 | 16,399 | 14,761 | 17,079 | 3,443 | 2,535 |
|
|
5575
|
+
| \`image\` | 31,876 | 11,613 | 10,463 | 5,207 | 1,567 | 1,239 |
|
|
5576
|
+
| \`input\` | 77,465 | 25,725 | 22,997 | 19,462 | 5,845 | 4,603 |
|
|
5577
|
+
| \`kbd\` | 36,435 | 13,329 | 11,949 | 6,116 | 1,824 | 1,418 |
|
|
5578
|
+
| \`legend\` | 49,334 | 16,920 | 15,248 | 7,866 | 2,168 | 1,719 |
|
|
5579
|
+
| \`lightbox\` | 67,279 | 21,825 | 19,596 | 23,114 | 5,887 | 4,620 |
|
|
5580
|
+
| \`line-chart\` | 126,626 | 41,927 | 37,454 | 29,914 | 7,842 | 6,480 |
|
|
5581
|
+
| \`list\` | 73,668 | 24,659 | 22,019 | 21,897 | 5,912 | 4,675 |
|
|
5582
|
+
| \`listbox\` | 110,173 | 35,677 | 31,570 | 29,372 | 8,308 | 6,677 |
|
|
5583
|
+
| \`loader\` | 34,424 | 12,530 | 11,320 | 5,740 | 1,718 | 1,439 |
|
|
5584
|
+
| \`log\` | 106,381 | 33,038 | 29,699 | 57,028 | 15,635 | 13,117 |
|
|
5585
|
+
| \`map\` | 206,709 | 54,490 | 47,137 | 110,092 | 22,337 | 17,993 |
|
|
5586
|
+
| \`markdown\` | 172,399 | 52,067 | 46,115 | 94,719 | 24,398 | 20,297 |
|
|
5587
|
+
| \`megamenu\` | 70,645 | 24,510 | 21,956 | 13,773 | 3,534 | 2,660 |
|
|
5588
|
+
| \`menu\` | 118,673 | 37,197 | 33,103 | 44,956 | 10,909 | 8,904 |
|
|
5589
|
+
| \`meter\` | 47,432 | 16,009 | 14,488 | 14,899 | 3,609 | 2,867 |
|
|
5590
|
+
| \`motion-toggle\` | 32,169 | 12,107 | 10,881 | 3,155 | 1,035 | 643 |
|
|
5591
|
+
| \`navigation\` | 41,636 | 14,818 | 13,266 | 7,206 | 1,990 | 1,556 |
|
|
5592
|
+
| \`notifications\` | 77,524 | 24,119 | 21,717 | 32,161 | 7,640 | 6,233 |
|
|
5593
|
+
| \`number-input\` | 66,501 | 21,754 | 19,539 | 18,455 | 4,805 | 3,602 |
|
|
5594
|
+
| \`object-inspector\` | 144,379 | 44,497 | 39,328 | 57,202 | 13,807 | 11,322 |
|
|
5595
|
+
| \`option\` | 34,170 | 12,241 | 11,023 | 7,503 | 2,125 | 1,633 |
|
|
5596
|
+
| \`orb\` | 40,942 | 15,257 | 13,793 | 9,996 | 3,687 | 3,050 |
|
|
5597
|
+
| \`outline\` | 47,889 | 16,157 | 14,576 | 17,042 | 4,459 | 3,570 |
|
|
5598
|
+
| \`pagination\` | 183,162 | 55,752 | 48,804 | 72,624 | 18,050 | 14,490 |
|
|
5599
|
+
| \`pin-input\` | 56,180 | 19,131 | 17,213 | 10,546 | 3,243 | 2,457 |
|
|
5600
|
+
| \`popover\` | 73,236 | 25,367 | 22,701 | 10,368 | 2,742 | 2,079 |
|
|
5601
|
+
| \`progress\` | 40,587 | 14,105 | 12,770 | 10,242 | 2,577 | 2,269 |
|
|
5602
|
+
| \`qr-code\` | 49,283 | 18,619 | 16,826 | 18,509 | 6,707 | 5,687 |
|
|
5603
|
+
| \`quote\` | 27,762 | 10,613 | 9,547 | 1,744 | 693 | 385 |
|
|
5604
|
+
| \`radio\` | 55,036 | 17,528 | 15,711 | 11,564 | 2,751 | 2,019 |
|
|
5605
|
+
| \`rating\` | 60,021 | 20,445 | 18,366 | 12,186 | 3,720 | 2,771 |
|
|
5606
|
+
| \`sandbox\` | 212,690 | 61,609 | 53,213 | 149,207 | 39,582 | 32,146 |
|
|
5607
|
+
| \`scatter-chart\` | 121,046 | 40,257 | 35,955 | 31,457 | 8,878 | 7,186 |
|
|
5608
|
+
| \`scroll-area\` | 43,866 | 14,231 | 12,822 | 16,953 | 4,139 | 3,156 |
|
|
5609
|
+
| \`select\` | 153,820 | 48,898 | 42,976 | 44,913 | 11,781 | 9,415 |
|
|
5610
|
+
| \`shortcut-overlay\` | 62,103 | 20,797 | 18,702 | 19,408 | 5,156 | 4,083 |
|
|
5611
|
+
| \`skeleton\` | 30,931 | 11,286 | 10,172 | 4,716 | 1,376 | 1,109 |
|
|
5612
|
+
| \`skip-link\` | 30,338 | 11,427 | 10,282 | 2,887 | 996 | 769 |
|
|
5613
|
+
| \`slider\` | 74,143 | 22,101 | 19,926 | 28,691 | 6,249 | 5,015 |
|
|
5614
|
+
| \`sparkline\` | 58,788 | 20,432 | 18,448 | 11,406 | 3,399 | 2,708 |
|
|
5615
|
+
| \`spatial-bar-chart\` | 137,900 | 46,372 | 41,182 | 41,162 | 12,321 | 10,250 |
|
|
5616
|
+
| \`spatial-heatmap\` | 139,798 | 45,724 | 40,732 | 43,210 | 12,062 | 9,965 |
|
|
5617
|
+
| \`spatial-ribbon-chart\` | 126,327 | 42,546 | 37,835 | 31,604 | 9,347 | 7,755 |
|
|
5618
|
+
| \`spatial-scatter-chart\` | 124,456 | 41,659 | 37,134 | 29,790 | 8,490 | 6,967 |
|
|
5619
|
+
| \`spatial-surface-chart\` | 126,850 | 42,827 | 38,238 | 32,127 | 9,622 | 8,040 |
|
|
5620
|
+
| \`spatial-treemap\` | 128,537 | 43,580 | 38,775 | 32,121 | 9,647 | 7,940 |
|
|
5621
|
+
| \`speed-dial\` | 81,060 | 27,548 | 24,696 | 18,133 | 4,356 | 3,429 |
|
|
5622
|
+
| \`splitter\` | 56,008 | 18,111 | 16,389 | 21,147 | 4,992 | 3,998 |
|
|
5623
|
+
| \`stat\` | 33,246 | 12,062 | 10,901 | 5,160 | 1,480 | 1,177 |
|
|
5624
|
+
| \`steps\` | 75,697 | 23,728 | 21,267 | 29,752 | 6,985 | 5,594 |
|
|
5625
|
+
| \`strands\` | 68,950 | 25,204 | 22,431 | 39,058 | 13,871 | 12,012 |
|
|
5626
|
+
| \`switch\` | 49,022 | 16,458 | 14,793 | 6,169 | 1,788 | 1,274 |
|
|
5627
|
+
| \`table\` | 143,467 | 41,990 | 36,983 | 63,012 | 15,519 | 12,595 |
|
|
5628
|
+
| \`tabs\` | 61,660 | 19,580 | 17,610 | 20,808 | 4,929 | 4,000 |
|
|
5629
|
+
| \`tag\` | 51,985 | 18,223 | 16,455 | 13,051 | 3,578 | 2,698 |
|
|
5630
|
+
| \`terminal\` | 175,850 | 49,377 | 43,572 | 88,452 | 18,377 | 14,927 |
|
|
5631
|
+
| \`text\` | 33,404 | 11,508 | 10,312 | 7,178 | 1,459 | 1,130 |
|
|
5632
|
+
| \`textarea\` | 75,690 | 24,957 | 22,422 | 18,254 | 5,257 | 4,363 |
|
|
5633
|
+
| \`time-input\` | 222,800 | 65,638 | 57,053 | 83,073 | 19,366 | 15,740 |
|
|
5634
|
+
| \`time-picker\` | 140,696 | 42,811 | 37,684 | 55,889 | 14,299 | 11,639 |
|
|
5635
|
+
| \`timeline\` | 43,470 | 15,146 | 13,631 | 11,014 | 2,672 | 2,166 |
|
|
5636
|
+
| \`toast\` | 89,991 | 28,135 | 25,130 | 35,434 | 8,548 | 6,993 |
|
|
5637
|
+
| \`toggle\` | 55,883 | 18,168 | 16,374 | 10,882 | 3,031 | 2,423 |
|
|
5638
|
+
| \`toolbar\` | 40,062 | 14,020 | 12,630 | 4,068 | 1,005 | 663 |
|
|
5639
|
+
| \`tooltip\` | 67,881 | 23,739 | 21,356 | 11,725 | 3,189 | 2,625 |
|
|
5640
|
+
| \`tour\` | 101,987 | 32,857 | 29,342 | 32,330 | 7,799 | 6,214 |
|
|
5641
|
+
| \`tree\` | 81,748 | 26,348 | 23,572 | 26,526 | 6,927 | 5,698 |
|
|
5642
|
+
| \`trend\` | 36,950 | 13,914 | 12,545 | 5,472 | 1,648 | 1,319 |
|
|
5643
|
+
| \`video\` | 173,841 | 50,679 | 44,753 | 91,177 | 21,116 | 17,482 |
|
|
5644
|
+
| \`video-playlist\` | 154,530 | 47,005 | 41,557 | 63,105 | 14,988 | 12,401 |
|
|
5645
|
+
| \`virtual-list\` | 74,388 | 24,483 | 22,090 | 27,449 | 8,044 | 6,602 |
|
|
5646
|
+
| \`voice-level\` | 38,396 | 14,077 | 12,748 | 7,526 | 2,476 | 2,084 |
|
|
5545
5647
|
|
|
5546
5648
|
## What an install adds to \`node_modules\`
|
|
5547
5649
|
|
|
@@ -5554,12 +5656,12 @@ without its whitespace, and the sizes count each one that way.
|
|
|
5554
5656
|
|
|
5555
5657
|
| Package | Unpacked | Files | Source maps stripped | Runtime dependencies |
|
|
5556
5658
|
|---|---|---|---|---|
|
|
5557
|
-
| \`@fusion.dev/helix-core\` | 2,
|
|
5558
|
-
| \`@fusion.dev/helix-headless\` |
|
|
5559
|
-
| \`@fusion.dev/helix-icons\` |
|
|
5560
|
-
| \`@fusion.dev/helix-styles\` |
|
|
5659
|
+
| \`@fusion.dev/helix-core\` | 2,238,908 | 491 | 839,402 | \`@floating-ui/dom\`, \`@fusion.dev/helix-icons\`, \`tslib\` |
|
|
5660
|
+
| \`@fusion.dev/helix-headless\` | 23,432,287 | 1,082 | 2,941,841 | \`@fusion.dev/helix-core\`, \`@fusion.dev/helix-icons\`, \`tslib\`, \`uqr\` |
|
|
5661
|
+
| \`@fusion.dev/helix-icons\` | 202,243 | 22 | 63,839 | \`svgo\` |
|
|
5662
|
+
| \`@fusion.dev/helix-styles\` | 131,750 | 6 | 0 | none |
|
|
5561
5663
|
| \`@fusion.dev/helix-theme\` | 453,157 | 8 | 6,257 | none |
|
|
5562
|
-
| \`@fusion.dev/helix\` |
|
|
5664
|
+
| \`@fusion.dev/helix\` | 23,581,858 | 1,151 | 644,779 | \`@fusion.dev/helix-core\`, \`@fusion.dev/helix-headless\`, \`@fusion.dev/helix-styles\`, \`tslib\` |
|
|
5563
5665
|
|
|
5564
5666
|
## Not measured yet
|
|
5565
5667
|
|
|
@@ -5738,7 +5840,7 @@ element.items = tabs
|
|
|
5738
5840
|
\`\`\`
|
|
5739
5841
|
|
|
5740
5842
|
**Bind events with \`addEventListener\`, using the event's own name.** Helix event
|
|
5741
|
-
names, such as \`helix-before-open\`, \`helix-before-change\`, and \`helix-select\`,
|
|
5843
|
+
names, such as \`helix-before-open\`, \`helix-before-change\`, and \`helix-before-select\`,
|
|
5742
5844
|
are lowercase and hyphenated. They have no camel-case variant. Your framework's
|
|
5743
5845
|
\`on*\` syntax needs to pass that exact name through.
|
|
5744
5846
|
|
|
@@ -6649,15 +6751,15 @@ title: Routing and navigation
|
|
|
6649
6751
|
|
|
6650
6752
|
# Routing and navigation
|
|
6651
6753
|
|
|
6652
|
-
Some components navigate, such as a tree used as a sidebar, a
|
|
6653
|
-
another page, or a tab that is a page. Each of these should be a link. A
|
|
6754
|
+
Some components navigate, such as a tree used as a sidebar, a menu item that
|
|
6755
|
+
opens another page, or a tab that is a page. Each of these should be a link. A
|
|
6654
6756
|
framework router does not handle a link inside a shadow root the way it handles
|
|
6655
6757
|
its own links.
|
|
6656
6758
|
|
|
6657
6759
|
## A component that navigates renders its own anchor
|
|
6658
6760
|
|
|
6659
|
-
\`Tree.Item\` and \`
|
|
6660
|
-
press *is* an \`<a>\`:
|
|
6761
|
+
\`Tree.Item\`, \`Tab\`, and \`Menu.Item\` take an \`href\`. With an \`href\`, the element
|
|
6762
|
+
you press *is* an \`<a>\`:
|
|
6661
6763
|
|
|
6662
6764
|
\`\`\`html
|
|
6663
6765
|
<helix-tree-item
|
|
@@ -6746,9 +6848,11 @@ changes the structure of the markup as well as adding an attribute. Without an
|
|
|
6746
6848
|
\`href\`, nothing moves. The wrapper stays the \`treeitem\` and contains its group,
|
|
6747
6849
|
the same way an \`<li>\` contains a \`<ul>\`.
|
|
6748
6850
|
|
|
6749
|
-
|
|
6750
|
-
|
|
6751
|
-
|
|
6851
|
+
A tab with an \`href\` renders \`role="tab"\` on the \`<a>\` itself, so a press,
|
|
6852
|
+
Enter, and the browser's own link gestures follow it. It sends \`helix-before-select\`
|
|
6853
|
+
first, and canceling that keeps the browser from following, so a client-side
|
|
6854
|
+
router can follow it instead. Web Awesome drops the anchor and navigates in
|
|
6855
|
+
JavaScript, which loses every item in the list above.
|
|
6752
6856
|
|
|
6753
6857
|
## Use client-side routing with real anchors
|
|
6754
6858
|
|
|
@@ -6809,9 +6913,14 @@ That is expected.
|
|
|
6809
6913
|
|
|
6810
6914
|
| Component | Notes |
|
|
6811
6915
|
|---|---|
|
|
6812
|
-
| \`Button\` | Renders an \`<a>\` styled as a button. |
|
|
6813
6916
|
| \`Tree.Item\` | Changes the ARIA shape, as above. A linked branch navigates from its row and opens from its chevron. |
|
|
6814
6917
|
| \`Menu.Item\` | The row becomes the anchor and carries \`menuitem\`. Takes \`target\`, \`rel\` and \`download\`. |
|
|
6918
|
+
| \`Tab\` | The tab becomes the anchor and carries \`tab\`. Takes \`target\` and \`rel\`. \`helix-before-select\` comes first, and canceling it keeps the browser from following. |
|
|
6919
|
+
|
|
6920
|
+
\`Button\` never renders an anchor, because a router renders its own \`<a>\` and
|
|
6921
|
+
cannot render one inside the button's shadow root. For a link that looks like a
|
|
6922
|
+
button, put the \`data-button\` recipe on your own anchor, such as
|
|
6923
|
+
\`<Link data-button="solid" href="/pricing">\`, which draws the same control.
|
|
6815
6924
|
|
|
6816
6925
|
Other components that should navigate do not take an \`href\` yet. To make one
|
|
6817
6926
|
navigate, slot a link into it. \`Tree.Item\` follows a slotted anchor when you
|
|
@@ -6847,8 +6956,8 @@ it cannot work here.
|
|
|
6847
6956
|
|
|
6848
6957
|
No arrangement of the markup meets both of these constraints.
|
|
6849
6958
|
|
|
6850
|
-
**In a command palette, navigate from the \`helix-select\` event.** Listen for
|
|
6851
|
-
\`helix-select\` on \`helix-command\` and call your router. A palette entry is a
|
|
6959
|
+
**In a command palette, navigate from the \`helix-before-select\` event.** Listen for
|
|
6960
|
+
\`helix-before-select\` on \`helix-command\` and call your router. A palette entry is a
|
|
6852
6961
|
command, and "go to Settings" is a command that navigates. Command palettes in
|
|
6853
6962
|
other applications work the same way. You lose the gestures that only a real
|
|
6854
6963
|
anchor has:
|
|
@@ -7041,7 +7150,7 @@ preview, and \`helix-caret\` from it fills the status bar's position. A wrapper
|
|
|
7041
7150
|
around CodeMirror:
|
|
7042
7151
|
|
|
7043
7152
|
\`\`\`ts
|
|
7044
|
-
import { HelixBeforeEditEvent } from '@fusion.dev/helix
|
|
7153
|
+
import { HelixBeforeEditEvent } from '@fusion.dev/helix/sandbox/events'
|
|
7045
7154
|
import { EditorView, basicSetup } from 'codemirror'
|
|
7046
7155
|
|
|
7047
7156
|
class CodeEditor extends HTMLElement {
|
|
@@ -9795,7 +9904,7 @@ casing must match. Outside React, use
|
|
|
9795
9904
|
|
|
9796
9905
|
**Lifecycle events do not bubble. Coordination events do.**
|
|
9797
9906
|
\`helix-before-open\` and \`helix-before-close\` reach the element and stop there,
|
|
9798
|
-
so a menu closing inside a dialog does not close the dialog. \`helix-select\`,
|
|
9907
|
+
so a menu closing inside a dialog does not close the dialog. \`helix-before-select\`,
|
|
9799
9908
|
\`helix-before-change\`, and \`helix-dismiss\` cross shadow boundaries, so you can
|
|
9800
9909
|
listen for them on a container. If a listener on a wrapper receives nothing, the
|
|
9801
9910
|
event is a lifecycle event. Put the listener on the element.
|
|
@@ -9952,12 +10061,37 @@ The bug is [facebook/react#35446](https://github.com/facebook/react/issues/35446
|
|
|
9952
10061
|
and it is still open. The elements work around it for you.
|
|
9953
10062
|
|
|
9954
10063
|
Every Helix element binds the handler itself, just before it dispatches any
|
|
9955
|
-
event, using the function React already holds for it.
|
|
9956
|
-
|
|
9957
|
-
|
|
10064
|
+
event, using the function React already holds for it. On a hydrated page, the
|
|
10065
|
+
first event reaches the handler. After React binds its own listener, no event
|
|
10066
|
+
is delivered twice.
|
|
9958
10067
|
|
|
9959
10068
|
You do not need to do anything, and nothing changes when React fixes the bug.
|
|
9960
10069
|
|
|
10070
|
+
We measured this in Chromium against React 19.3.1 on October 25, 2026. Each
|
|
10071
|
+
version below rendered a page with \`renderToString\` and hydrated it with
|
|
10072
|
+
\`hydrateRoot\`:
|
|
10073
|
+
|
|
10074
|
+
| React | Bug present | Helix handles it |
|
|
10075
|
+
| --- | --- | --- |
|
|
10076
|
+
| 19.0.9 | Yes | Yes |
|
|
10077
|
+
| 19.2.9 | Yes | Yes |
|
|
10078
|
+
| 19.3.1 | Yes | Yes |
|
|
10079
|
+
| 19.3.0 canary of October 23, 2026 | Yes | Yes |
|
|
10080
|
+
| 18.3.1 | Yes | The first event only |
|
|
10081
|
+
|
|
10082
|
+
Helix supports React 19. React 18 binds no \`on\` prop on a custom element at
|
|
10083
|
+
all. Helix binds the first handler, but each render that passes a new function
|
|
10084
|
+
adds another listener, so a handler runs once for every render it has been
|
|
10085
|
+
through.
|
|
10086
|
+
|
|
10087
|
+
In a development build, the page logs an error when React has a root and no
|
|
10088
|
+
Helix element finds the props React holds for it. This means the installed
|
|
10089
|
+
React stores its props under a key Helix does not read, and every \`onhelix-*\`
|
|
10090
|
+
handler on a server-rendered page is dead. Pin React to a version in the table,
|
|
10091
|
+
and open an issue at
|
|
10092
|
+
[github.com/project-fusion/fusion](https://github.com/project-fusion/fusion/issues)
|
|
10093
|
+
that names the version you installed.
|
|
10094
|
+
|
|
9961
10095
|
React's own events work when they bubble. \`onClick\` on a \`<helix-button>\` goes
|
|
9962
10096
|
through React's synthetic event system, which hydration sets up.
|
|
9963
10097
|
|
|
@@ -9979,8 +10113,8 @@ written.
|
|
|
9979
10113
|
- \`onhelix-sample-start\` reaches \`helix-sample-start\`. ✅
|
|
9980
10114
|
- \`onHelixOpen\` binds an event called \`HelixOpen\`, which is never dispatched. ❌
|
|
9981
10115
|
|
|
9982
|
-
The number of hyphens does not matter. We measured this in
|
|
9983
|
-
19.
|
|
10116
|
+
The number of hyphens does not matter. We measured this in Chromium against
|
|
10117
|
+
React 19.3.1.
|
|
9984
10118
|
|
|
9985
10119
|
## Register the elements in one client component
|
|
9986
10120
|
|
|
@@ -10486,7 +10620,13 @@ npx playwright install --with-deps chromium
|
|
|
10486
10620
|
|
|
10487
10621
|
Capture runs in Playwright, which you install beside the command line. The
|
|
10488
10622
|
rest of \`helix\` needs no browser, so Playwright is an optional peer, and
|
|
10489
|
-
\`helix visual test\` names it when it is missing.
|
|
10623
|
+
\`helix visual test\` names it when it is missing. A config in TypeScript needs
|
|
10624
|
+
Node 22.18 or later. On an older Node, write it as \`visual.config.mjs\`.
|
|
10625
|
+
|
|
10626
|
+
**On macOS and Windows, a run skips until you choose where baselines are taken.**
|
|
10627
|
+
\`test\` and \`update\` say so, compare nothing, and exit 0, because text draws
|
|
10628
|
+
differently on each platform. Take baselines on Linux, or set \`platform: 'any'\`
|
|
10629
|
+
to compare on the machine in front of you.
|
|
10490
10630
|
|
|
10491
10631
|
## Commands
|
|
10492
10632
|
|
|
@@ -10517,6 +10657,38 @@ Each run ends with one line that says what it compared and what it skipped.
|
|
|
10517
10657
|
\`helix --json visual …\` prints one JSON document on stdout and moves the
|
|
10518
10658
|
sentences to stderr.
|
|
10519
10659
|
|
|
10660
|
+
## Picture a site
|
|
10661
|
+
|
|
10662
|
+
Picture a production build, because a dev server draws its own overlays, and they
|
|
10663
|
+
differ from run to run. \`visual.config.ts\`, for a Next.js site:
|
|
10664
|
+
|
|
10665
|
+
\`\`\`ts
|
|
10666
|
+
import { defineConfig } from '@fusion.dev/helix-cli/visual'
|
|
10667
|
+
|
|
10668
|
+
export default defineConfig({
|
|
10669
|
+
sources: [
|
|
10670
|
+
{
|
|
10671
|
+
baselines: 'visual/baselines',
|
|
10672
|
+
kind: 'server',
|
|
10673
|
+
name: 'site',
|
|
10674
|
+
routes: ['/', '/pricing', { name: 'not-found', path: '/nope', status: 404 }],
|
|
10675
|
+
start: 'npm run start -- --port 3100',
|
|
10676
|
+
url: 'http://localhost:3100',
|
|
10677
|
+
},
|
|
10678
|
+
],
|
|
10679
|
+
})
|
|
10680
|
+
\`\`\`
|
|
10681
|
+
|
|
10682
|
+
\`\`\`sh
|
|
10683
|
+
npm run build
|
|
10684
|
+
npx helix visual update
|
|
10685
|
+
\`\`\`
|
|
10686
|
+
|
|
10687
|
+
\`update\` writes the baselines and the fingerprint, and its report shows each
|
|
10688
|
+
picture it wrote. Look at them, commit them, and run \`helix visual test\` from then
|
|
10689
|
+
on. Any page that answers 400 or above fails the entry, unless its route names that
|
|
10690
|
+
\`status\`.
|
|
10691
|
+
|
|
10520
10692
|
## The config
|
|
10521
10693
|
|
|
10522
10694
|
\`visual.config.ts\`, in the directory you run \`helix visual\` from:
|
|
@@ -10553,9 +10725,28 @@ export default defineConfig({
|
|
|
10553
10725
|
width, and dark when you give none. Each baseline is written beside its
|
|
10554
10726
|
entry as \`<stem>.<name>.png\`.
|
|
10555
10727
|
- **\`serve\`** is URL paths served from disk, relative to the config.
|
|
10728
|
+
- **\`baselines\`** is, on a server source, the directory its baselines are written
|
|
10729
|
+
in, relative to the config.
|
|
10730
|
+
- **\`platform\`** is where baselines are taken and compared: \`linux\` unless you set
|
|
10731
|
+
\`any\`.
|
|
10732
|
+
- **\`network\`** is what a page may reach. \`origin\`, the default, refuses every
|
|
10733
|
+
request to another host and names each host in the log and in \`run.json\`.
|
|
10734
|
+
\`{ allow: ['tiles.example.com'] }\` lets those hosts through, and \`open\` lets every
|
|
10735
|
+
host through.
|
|
10736
|
+
- **\`mask\`** is selectors whose elements are painted over in every picture, for
|
|
10737
|
+
what changes on its own, such as a clock. A mask paints over the element's box and
|
|
10738
|
+
anything drawn on top of it. The run names a mask that matches nothing on a page,
|
|
10739
|
+
or only elements with no box.
|
|
10740
|
+
- **\`style\`** is a stylesheet applied while each picture is taken, to hold still
|
|
10741
|
+
what \`mask\` cannot.
|
|
10742
|
+
- **\`settle.selector\`** names what a page matches once it has drawn what it draws
|
|
10743
|
+
late, such as a map's tiles. The entry fails when nothing matches within
|
|
10744
|
+
\`settle.timeout\`, 30 seconds unless you set it.
|
|
10556
10745
|
- **\`settle.readyProperty\`** names a property your elements carry holding a
|
|
10557
10746
|
promise that resolves once they have rendered. The run awaits it before each
|
|
10558
|
-
shot.
|
|
10747
|
+
shot, for 5 seconds, and then names the tags still waiting.
|
|
10748
|
+
- **\`settle.elements\`** limits the custom elements a run waits for to one tag
|
|
10749
|
+
prefix, for a framework that writes hyphenated tags it never defines.
|
|
10559
10750
|
- **\`aria\`** keeps each entry's accessibility snapshot beside its baselines
|
|
10560
10751
|
and compares it as text, so a lost label fails even when no pixel moved.
|
|
10561
10752
|
- **\`checks\`** adds judgments that need no baseline: \`code\` fails a code block
|