@fusion.dev/helix-headless 0.53.0 → 0.53.2

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 (77) hide show
  1. package/custom-elements.json +141 -141
  2. package/dist/accordion/item/accordion-item.d.ts +13 -13
  3. package/dist/accordion/root/accordion-root.d.ts +1 -1
  4. package/dist/area-chart/root/area-chart-root.js +1 -1
  5. package/dist/avatar/group/avatar-group.d.ts +11 -11
  6. package/dist/bar-chart/root/bar-chart-root.d.ts +1 -1
  7. package/dist/breadcrumbs/breadcrumb/breadcrumb.d.ts +6 -6
  8. package/dist/button/root/button-root.d.ts +1 -1
  9. package/dist/card/root/card-root.d.ts +1 -1
  10. package/dist/carousel/root/carousel-root.d.ts +14 -14
  11. package/dist/chat/composer/chat-composer.d.ts +6 -6
  12. package/dist/chat/root/chat-root.d.ts +9 -9
  13. package/dist/checkbox/root/checkbox-root.d.ts +2 -2
  14. package/dist/checkbox/root/checkbox-root.js +1 -1
  15. package/dist/code-block/root/code-block-root.d.ts +5 -5
  16. package/dist/color-input/root/color-input-root.d.ts +3 -3
  17. package/dist/color-picker/root/color-picker-root.d.ts +14 -14
  18. package/dist/combobox/root/combobox-root.d.ts +25 -5
  19. package/dist/combobox/root/combobox-root.js +6 -4
  20. package/dist/command/root/command-root.d.ts +6 -7
  21. package/dist/data-table/root/data-table-root.d.ts +61 -38
  22. package/dist/data-table/root/data-table-root.js +8 -3
  23. package/dist/data-table/root/order.d.ts +3 -3
  24. package/dist/date-input/root/date-input-root.d.ts +12 -11
  25. package/dist/dialog/root/dialog-root.d.ts +4 -4
  26. package/dist/drawer/root/drawer-root.d.ts +5 -5
  27. package/dist/filter-input/menu/filter-menu.d.ts +7 -1
  28. package/dist/filter-input/menu/filter-menu.js +2 -1
  29. package/dist/filter-input/root/filter-input-root.d.ts +6 -6
  30. package/dist/format-date/root/format-date-root.d.ts +6 -5
  31. package/dist/heatmap/root/heatmap-root.d.ts +11 -16
  32. package/dist/image/root/image-root.d.ts +4 -4
  33. package/dist/input/root/input-root.d.ts +7 -7
  34. package/dist/line-chart/root/line-chart-root.d.ts +1 -2
  35. package/dist/list/item/list-item.d.ts +6 -7
  36. package/dist/list/root/list-root.d.ts +4 -4
  37. package/dist/megamenu/root/megamenu-root.d.ts +4 -4
  38. package/dist/notifications/notification/notification.d.ts +10 -10
  39. package/dist/notifications/root/notifications-root.d.ts +1 -1
  40. package/dist/option/root/option-root.d.ts +3 -3
  41. package/dist/pagination/root/pagination-root.d.ts +2 -2
  42. package/dist/pin-input/root/pin-input-root.d.ts +4 -4
  43. package/dist/popover/root/popover-root.d.ts +7 -6
  44. package/dist/radio/root/radio-root.d.ts +12 -2
  45. package/dist/radio/root/radio-root.js +5 -1
  46. package/dist/select/root/select-root.d.ts +24 -0
  47. package/dist/select/root/select-root.js +4 -1
  48. package/dist/speed-dial/root/speed-dial-root.d.ts +8 -9
  49. package/dist/stat/root/stat-root.d.ts +3 -3
  50. package/dist/steps/root/steps-root.d.ts +1 -1
  51. package/dist/steps/step/step.d.ts +5 -5
  52. package/dist/switch/root/switch-root.js +1 -1
  53. package/dist/table/column/table-column.d.ts +28 -28
  54. package/dist/table/root/table-root.d.ts +14 -17
  55. package/dist/table/row/table-row.d.ts +4 -4
  56. package/dist/tabs/panel/tab-panel.d.ts +2 -2
  57. package/dist/tabs/root/tabs-root.js +11 -4
  58. package/dist/tabs/tab/tab.d.ts +11 -1
  59. package/dist/tabs/tab/tab.js +5 -1
  60. package/dist/time-input/root/time-input-root.d.ts +13 -13
  61. package/dist/time-picker/root/time-picker-root.d.ts +8 -8
  62. package/dist/toast/root/toast-root.d.ts +2 -2
  63. package/dist/toggle/root/toggle-root.d.ts +16 -6
  64. package/dist/toggle/root/toggle-root.js +5 -1
  65. package/dist/tooltip/root/tooltip-root.d.ts +2 -2
  66. package/dist/tour/stop/tour-stop.d.ts +3 -3
  67. package/dist/tree/item/tree-item.d.ts +2 -2
  68. package/dist/tree/item/tree-item.js +4 -3
  69. package/dist/tree/root/tree-root.d.ts +8 -7
  70. package/dist/tree/root/tree-root.js +9 -5
  71. package/dist/video-playlist/menu/video-playlist-menu.d.ts +7 -1
  72. package/dist/video-playlist/menu/video-playlist-menu.js +4 -2
  73. package/dist/video-playlist/root/video-playlist-root.d.ts +5 -5
  74. package/dist/video-playlist/root/video-playlist-root.js +2 -3
  75. package/package.json +5 -5
  76. package/types/jsx.d.ts +754 -780
  77. package/types/vue.d.ts +172 -185
package/types/vue.d.ts CHANGED
@@ -459,13 +459,13 @@ export type HelixHeadlessAvatarGroupVueProps = {
459
459
  Unset shows all of them, which is what no limit means and is more useful
460
460
  than refusing to render.
461
461
 
462
- **Reflected, because the fold is a stylesheet rule and nothing else.** The
463
- styled tier hides past the limit with `:host([max="N"]) ::slotted(:nth-child(n + N+1))`,
464
- so the attribute *is* the mechanism: a `max` that reaches this property and
465
- never reaches the host matches no rule, and every avatar is drawn beside a
466
- count claiming some are hidden. Markup is the safe path and hides the fault;
467
- a script is the broken one, and React takes it for everyone, assigning a
468
- matching property rather than an attribute.
462
+ **Reflected, because the fold is a stylesheet rule and nothing else.** A
463
+ sheet hides past the limit one selector per value, as `FOLDS_UP_TO`
464
+ describes, so the attribute *is* the mechanism: a `max` that reaches this
465
+ property and never reaches the host matches no rule, and every avatar is
466
+ drawn beside a count claiming some are hidden. Markup is the safe path and
467
+ hides the fault; a script is the broken one, and React takes it for
468
+ everyone, assigning a matching property rather than an attribute.
469
469
 
470
470
  **Optional rather than defaulted, per the rule that a reflected property
471
471
  takes no default**: `max = 0` would stamp `max="0"` onto every host that
@@ -647,12 +647,12 @@ export type HelixHeadlessBreadcrumbVueProps = {
647
647
  current?: (HelixHeadlessBreadcrumb["current"]) | undefined;
648
648
  /** Where the crumb goes, and nothing where it is the current page.
649
649
 
650
- **Optional and reflected, because a stylesheet does select on it.**
651
- `breadcrumb.css` writes `:host(:not([href])) [part="link"]` to take the
652
- block padding off a crumb that is not a link, so the attribute is what
653
- decides how tall a crumb is. Unreflected, an `href` set from script reached
654
- the property, rendered the anchor, and left the host looking unlinked: the
655
- crumb drew at 20px where a markup twin drew at 28.
650
+ **Optional and reflected, because a stylesheet does select on it.** A sheet
651
+ writes `:host(:not([href])) [part="link"]` to take the block padding off a
652
+ crumb that is not a link, so the attribute is what decides how tall a crumb
653
+ is. Unreflected, an `href` set from script reached the property, rendered
654
+ the anchor, and left the host looking unlinked: the crumb drew at 20px
655
+ where a markup twin drew at 28.
656
656
 
657
657
  Optional rather than defaulted, which is the general rule that a reflected
658
658
  property takes no default: an `href` written onto every host would be a link
@@ -714,7 +714,7 @@ the trigger silently does nothing at all. A wrapper has to hand them down,
714
714
  the same way `label` becomes `aria-label` in there.
715
715
 
716
716
  ```html
717
- <helix-button commandfor="confirm" command="--show">Delete…</helix-button>
717
+ <helix-headless-button commandfor="confirm" command="--show">Delete…</helix-headless-button>
718
718
  ```
719
719
 
720
720
  `commandFor` spells its attribute out, because Lit lowercases a property
@@ -995,13 +995,13 @@ end while the slides stop moving a third of the way through.
995
995
  **The number is published to the styles rather than enumerated by them**,
996
996
  as `--carousel-per-view` on the track, which is what keeps a width and a
997
997
  count from disagreeing. A sheet can only name a value it wrote a rule for,
998
- so the styled tier enumerated `per-view="2"` through `5` and called five a
999
- judgment; above it the pane fell back to one across while this file went on
1000
- counting positions. Measured in Chromium over eight slides, six across gave
1001
- three dots, a pane taking the whole track and five slides reachable only by
1002
- dragging. Written from here there is no ceiling to exceed, and a consumer's
1003
- own sheet reads the same declaration the styled one does. `runEnd` publishes
1004
- its correction the same way and for the same reason.
998
+ so a sheet enumerating `per-view="2"` through `5` is a ceiling of five, and
999
+ above it the pane falls back to one across while this file goes on counting
1000
+ positions. Measured in Chromium over eight slides against such a sheet, six
1001
+ across gave three dots, a pane taking the whole track and five slides
1002
+ reachable only by dragging. Published from here there is no ceiling to
1003
+ exceed, and every sheet reads the same declaration. `runEnd` publishes its
1004
+ correction the same way and for the same reason.
1005
1005
 
1006
1006
  **On the track and not on the host.** A custom property on the host is a
1007
1007
  reflected attribute by another name: it would arrive on upgrade, and a
@@ -1026,8 +1026,8 @@ inline the count would outrank the sheet that computes it, which is why an
1026
1026
  `auto` track is handed nothing. A count stays for the design that calls for
1027
1027
  exactly three.
1028
1028
 
1029
- The styled sheet says how it divides, and the headless `auto` example
1030
- carries the same three lines for a consumer writing their own.
1029
+ A sheet says how it divides, and the `auto` example here carries the same
1030
+ three lines for a consumer writing their own.
1031
1031
 
1032
1032
  **A value rather than the resting behavior**, which is what the
1033
1033
  responsiveness policy asks of every axis that a box decides: a splitter
@@ -1055,13 +1055,13 @@ end while the slides stop moving a third of the way through.
1055
1055
  **The number is published to the styles rather than enumerated by them**,
1056
1056
  as `--carousel-per-view` on the track, which is what keeps a width and a
1057
1057
  count from disagreeing. A sheet can only name a value it wrote a rule for,
1058
- so the styled tier enumerated `per-view="2"` through `5` and called five a
1059
- judgment; above it the pane fell back to one across while this file went on
1060
- counting positions. Measured in Chromium over eight slides, six across gave
1061
- three dots, a pane taking the whole track and five slides reachable only by
1062
- dragging. Written from here there is no ceiling to exceed, and a consumer's
1063
- own sheet reads the same declaration the styled one does. `runEnd` publishes
1064
- its correction the same way and for the same reason.
1058
+ so a sheet enumerating `per-view="2"` through `5` is a ceiling of five, and
1059
+ above it the pane falls back to one across while this file goes on counting
1060
+ positions. Measured in Chromium over eight slides against such a sheet, six
1061
+ across gave three dots, a pane taking the whole track and five slides
1062
+ reachable only by dragging. Published from here there is no ceiling to
1063
+ exceed, and every sheet reads the same declaration. `runEnd` publishes its
1064
+ correction the same way and for the same reason.
1065
1065
 
1066
1066
  **On the track and not on the host.** A custom property on the host is a
1067
1067
  reflected attribute by another name: it would arrive on upgrade, and a
@@ -1086,8 +1086,8 @@ inline the count would outrank the sheet that computes it, which is why an
1086
1086
  `auto` track is handed nothing. A count stays for the design that calls for
1087
1087
  exactly three.
1088
1088
 
1089
- The styled sheet says how it divides, and the headless `auto` example
1090
- carries the same three lines for a consumer writing their own.
1089
+ A sheet says how it divides, and the `auto` example here carries the same
1090
+ three lines for a consumer writing their own.
1091
1091
 
1092
1092
  **A value rather than the resting behavior**, which is what the
1093
1093
  responsiveness policy asks of every axis that a box decides: a splitter
@@ -1251,13 +1251,13 @@ pinned because a conversation opens at its most recent turn.
1251
1251
 
1252
1252
  **Not reflected, and the default is why.** A reflected property that
1253
1253
  defaults to true writes its attribute on upgrade whether or not the
1254
- consumer wrote one, so the server serves `<helix-chat label="x">` and the
1255
- client turns it into `<helix-chat label="x" pinned>`: a hydration mismatch a
1256
- React consumer reports and does not patch up. Nothing needs the attribute
1257
- either, because the one thing that changes with the pin is the way back, and
1258
- that is a part inside the shadow tree where a stylesheet can already reach
1259
- it. Measured rather than assumed: `label, pinned` after upgrade against
1260
- `label` from the server. */
1254
+ consumer wrote one, so the server serves `<helix-headless-chat label="x">`
1255
+ and the client turns it into `<helix-headless-chat label="x" pinned>`: a
1256
+ hydration mismatch a React consumer reports and does not patch up. Nothing
1257
+ needs the attribute either, because the one thing that changes with the pin
1258
+ is the way back, and that is a part inside the shadow tree where a
1259
+ stylesheet can already reach it. Measured rather than assumed: `label,
1260
+ pinned` after upgrade against `label` from the server. */
1261
1261
  pinned?: (HelixHeadlessChat["pinned"]) | undefined;
1262
1262
  /** How near the bottom still counts as being at it, in pixels.
1263
1263
 
@@ -1452,11 +1452,11 @@ present, which is true. Measured, and it is why this is named the other way
1452
1452
  round. The platform already writes booleans like this for the same reason,
1453
1453
  `novalidate` and `nomodule` and `noreferrer` among them.
1454
1454
 
1455
- **Reflected, because the gutter is a stylesheet rule.** `code-block.css`
1456
- reserves the copy button's width with `:host(:not([no-copy]))`, so the
1457
- attribute is what decides whether the block pays for a control. Unreflected,
1458
- setting it from script takes the button away (`render` reads the property)
1459
- and leaves the 40px it stood in reserved.
1455
+ **Reflected, because the gutter is a stylesheet rule.** A sheet reserves
1456
+ the copy button's width with `:host(:not([no-copy]))`, so the attribute is
1457
+ what decides whether the block pays for a control. Unreflected, setting it
1458
+ from script takes the button away (`render` reads the property) and leaves
1459
+ the 40px it stood in reserved.
1460
1460
 
1461
1461
  A false boolean reflects as the attribute's absence, so this costs no
1462
1462
  `no-copy=""` on hosts that never asked for one, and the rule about a
@@ -1472,11 +1472,11 @@ present, which is true. Measured, and it is why this is named the other way
1472
1472
  round. The platform already writes booleans like this for the same reason,
1473
1473
  `novalidate` and `nomodule` and `noreferrer` among them.
1474
1474
 
1475
- **Reflected, because the gutter is a stylesheet rule.** `code-block.css`
1476
- reserves the copy button's width with `:host(:not([no-copy]))`, so the
1477
- attribute is what decides whether the block pays for a control. Unreflected,
1478
- setting it from script takes the button away (`render` reads the property)
1479
- and leaves the 40px it stood in reserved.
1475
+ **Reflected, because the gutter is a stylesheet rule.** A sheet reserves
1476
+ the copy button's width with `:host(:not([no-copy]))`, so the attribute is
1477
+ what decides whether the block pays for a control. Unreflected, setting it
1478
+ from script takes the button away (`render` reads the property) and leaves
1479
+ the 40px it stood in reserved.
1480
1480
 
1481
1481
  A false boolean reflects as the attribute's absence, so this costs no
1482
1482
  `no-copy=""` on hosts that never asked for one, and the rule about a
@@ -1771,10 +1771,10 @@ letting it open would take a color from the reader and drop it. */
1771
1771
 
1772
1772
  **A color is exactly as requirable as a date**, which is the comparison
1773
1773
  that settles it: this element extends `HelixFormElement`, carries `name`
1774
- and reports its value, so a consumer writing
1775
- `<helix-color-picker name="brand" required>` inside a form has every reason
1776
- to expect the form to refuse an empty one. Its two siblings in the same
1777
- composition position, Date Picker and Time Picker, both check it.
1774
+ and reports its value, so a consumer writing `<helix-headless-color-picker
1775
+ name="brand" required>` inside a form has every reason to expect the form
1776
+ to refuse an empty one. Its two siblings in the same composition position,
1777
+ Date Picker and Time Picker, both check it.
1778
1778
 
1779
1779
  Written out rather than taken from `MixinField`, for the reason those two
1780
1780
  record: the mixin brings a label, a hint and a feedback region, and this is
@@ -2142,7 +2142,7 @@ the trigger silently does nothing at all. A wrapper has to hand them down,
2142
2142
  the same way `label` becomes `aria-label` in there.
2143
2143
 
2144
2144
  ```html
2145
- <helix-button commandfor="confirm" command="--show">Delete…</helix-button>
2145
+ <helix-headless-button commandfor="confirm" command="--show">Delete…</helix-headless-button>
2146
2146
  ```
2147
2147
 
2148
2148
  `commandFor` spells its attribute out, because Lit lowercases a property
@@ -2417,17 +2417,17 @@ refusing it leaves the selection as it was. */
2417
2417
 
2418
2418
  **It announces nothing, and that is not an omission.** Nothing in this
2419
2419
  element ever asks for a different page size: a size selector is
2420
- `helix-pagination-size`, which a consumer puts in the `footer` slot and
2421
- answers themselves. Routing this through `requestChange` would announce an
2422
- event the element never has cause to fire. */
2420
+ `PaginationSize`, which a consumer puts in the `footer` slot and answers
2421
+ themselves. Routing this through `requestChange` would announce an event
2422
+ the element never has cause to fire. */
2423
2423
  "page-size"?: (HelixHeadlessDataTable["pageSize"] | `${number}`) | undefined;
2424
2424
  /** How many rows a page holds. Zero is every row, which is what "no paging" means.
2425
2425
 
2426
2426
  **It announces nothing, and that is not an omission.** Nothing in this
2427
2427
  element ever asks for a different page size: a size selector is
2428
- `helix-pagination-size`, which a consumer puts in the `footer` slot and
2429
- answers themselves. Routing this through `requestChange` would announce an
2430
- event the element never has cause to fire. */
2428
+ `PaginationSize`, which a consumer puts in the `footer` slot and answers
2429
+ themselves. Routing this through `requestChange` would announce an event
2430
+ the element never has cause to fire. */
2431
2431
  pageSize?: (HelixHeadlessDataTable["pageSize"]) | undefined;
2432
2432
  /** How many rows the whole result has, where this element cannot count them.
2433
2433
 
@@ -3170,10 +3170,10 @@ not, rather than shown or hidden by CSS. */
3170
3170
  modal?: (HelixHeadlessDrawer["modal"]) | undefined;
3171
3171
  /** Which edge the drawer comes from.
3172
3172
 
3173
- Unset is `end`, which the styled tier reads as `:host(:not([placement]))`
3174
- beside `:host([placement="end"])` rather than as a value written here: a
3173
+ Unset is `end`, and it stays unset rather than being written down: a
3175
3174
  default assigned to the property would reflect onto every host and put a
3176
- `placement="end"` into markup no consumer wrote. */
3175
+ `placement="end"` into markup no consumer wrote. So what this tier
3176
+ guarantees is the absence, and a sheet selects on it. */
3177
3177
  placement?: (HelixHeadlessDrawer["placement"]) | undefined;
3178
3178
  /** Whether the element is open.
3179
3179
 
@@ -3701,11 +3701,12 @@ renders nothing rather than the epoch, which is what parsing an empty string
3701
3701
  would give.
3702
3702
 
3703
3703
  **The element's own text is read as a fallback, and only in a browser.**
3704
- `<helix-format-date elapsed>2026-08-27T01:00:00Z</helix-format-date>` is the
3705
- spelling that reads best in markup, and it cannot be the only one: measured
3706
- against Lit's server shim, `textContent`, `children`, `firstChild` and
3707
- `querySelector` are all `undefined` there, so a server has no way to see it.
3708
- An element rendered on a server needs the attribute; one rendered in a
3704
+ `<helix-headless-format-date
3705
+ elapsed>2026-08-27T01:00:00Z</helix-headless-format-date>` is the spelling
3706
+ that reads best in markup, and it cannot be the only one: measured against
3707
+ Lit's server shim, `textContent`, `children`, `firstChild` and
3708
+ `querySelector` are all `undefined` there, so a server has no way to see
3709
+ it. An element rendered on a server needs the attribute; one rendered in a
3709
3710
  browser may use either. */
3710
3711
  date?: (HelixHeadlessFormatDate["date"]) | undefined;
3711
3712
  /** How the day of the month is written, where a date is shown. */
@@ -3779,12 +3780,12 @@ so a number written here that disagrees with the sheet is a promise the
3779
3780
  consumer has to keep by hand, and the one number a summary is told to trust
3780
3781
  is the one it gets wrong.
3781
3782
 
3782
- The strip measures itself, so `--heatmap-cell-inline-size` and `--heatmap-gap` are
3783
- enough on their own and these two are the estimate used until the first
3784
- measurement lands. Writing the attribute pins the value and stops the
3785
- measurement being consulted, which is what a container query or a transition
3786
- on the cell size wants, where what is drawn this frame is not what the
3787
- arithmetic should plan around.
3783
+ The strip measures itself, so sizing the cells in a sheet is enough on its
3784
+ own and these two are the estimate used until the first measurement lands.
3785
+ Writing the attribute pins the value and stops the measurement being
3786
+ consulted, which is what a container query or a transition on the cell size
3787
+ wants, where what is drawn this frame is not what the arithmetic should
3788
+ plan around.
3788
3789
 
3789
3790
  Zero turns the dropping off altogether, which is right for a strip in a
3790
3791
  container that cannot get narrow. */
@@ -3797,12 +3798,12 @@ so a number written here that disagrees with the sheet is a promise the
3797
3798
  consumer has to keep by hand, and the one number a summary is told to trust
3798
3799
  is the one it gets wrong.
3799
3800
 
3800
- The strip measures itself, so `--heatmap-cell-inline-size` and `--heatmap-gap` are
3801
- enough on their own and these two are the estimate used until the first
3802
- measurement lands. Writing the attribute pins the value and stops the
3803
- measurement being consulted, which is what a container query or a transition
3804
- on the cell size wants, where what is drawn this frame is not what the
3805
- arithmetic should plan around.
3801
+ The strip measures itself, so sizing the cells in a sheet is enough on its
3802
+ own and these two are the estimate used until the first measurement lands.
3803
+ Writing the attribute pins the value and stops the measurement being
3804
+ consulted, which is what a container query or a transition on the cell size
3805
+ wants, where what is drawn this frame is not what the arithmetic should
3806
+ plan around.
3806
3807
 
3807
3808
  Zero turns the dropping off altogether, which is right for a strip in a
3808
3809
  container that cannot get narrow. */
@@ -3864,7 +3865,7 @@ the trigger silently does nothing at all. A wrapper has to hand them down,
3864
3865
  the same way `label` becomes `aria-label` in there.
3865
3866
 
3866
3867
  ```html
3867
- <helix-button commandfor="confirm" command="--show">Delete…</helix-button>
3868
+ <helix-headless-button commandfor="confirm" command="--show">Delete…</helix-headless-button>
3868
3869
  ```
3869
3870
 
3870
3871
  `commandFor` spells its attribute out, because Lit lowercases a property
@@ -4095,10 +4096,10 @@ Read-only to a consumer: it is a report rather than a setting.
4095
4096
  **Mirrored to `data-status`, and not reflected as `status`.** It is element
4096
4097
  state, so reflecting it puts the element's own bookkeeping into the markup
4097
4098
  a consumer rendered: React reads the attribute appearing at upgrade as a
4098
- hydration mismatch, and a serialized `<helix-image status="loaded">` pasted
4099
- back declares that a picture has arrived which this element has never
4100
- fetched. The `data-` name is the library's answer to both, being a name a
4101
- re-parse cannot mistake for a declaration, and it is what `data-closed` on
4099
+ hydration mismatch, and a host pasted back carrying `status="loaded"`
4100
+ declares that a picture has arrived which this element has never fetched.
4101
+ The `data-` name is the library's answer to both, being a name a re-parse
4102
+ cannot mistake for a declaration, and it is what `data-closed` on
4102
4103
  `Toast.Item` already does. A picture arrives after somebody fetched it,
4103
4104
  which puts this on the safe side of hydration: a fact that can be true on
4104
4105
  the *first* update mirrors to a custom state instead, which is what
@@ -4165,20 +4166,20 @@ Not a label: it goes when typing starts. */
4165
4166
  **The attribute is `readonly`, which is the platform's spelling.** A
4166
4167
  camelCase property needs an explicit `attribute`, and dash-casing a word
4167
4168
  HTML writes as one costs what an attribute always costs here: nothing
4168
- warns. `<helix-input readonly>` is what anybody who has written HTML types;
4169
- against `read-only` it parses to no property at all, and the field stays
4170
- editable with no error anywhere. Measured on the dash-cased form, `readOnly`
4171
- came back `false`. */
4169
+ warns. `<helix-headless-input readonly>` is what anybody who has written
4170
+ HTML types; against `read-only` it parses to no property at all, and the
4171
+ field stays editable with no error anywhere. Measured on the dash-cased
4172
+ form, `readOnly` came back `false`. */
4172
4173
  readonly?: (HelixHeadlessInput["readOnly"]) | undefined;
4173
4174
  /** Whether the field refuses input while still submitting its value.
4174
4175
 
4175
4176
  **The attribute is `readonly`, which is the platform's spelling.** A
4176
4177
  camelCase property needs an explicit `attribute`, and dash-casing a word
4177
4178
  HTML writes as one costs what an attribute always costs here: nothing
4178
- warns. `<helix-input readonly>` is what anybody who has written HTML types;
4179
- against `read-only` it parses to no property at all, and the field stays
4180
- editable with no error anywhere. Measured on the dash-cased form, `readOnly`
4181
- came back `false`. */
4179
+ warns. `<helix-headless-input readonly>` is what anybody who has written
4180
+ HTML types; against `read-only` it parses to no property at all, and the
4181
+ field stays editable with no error anywhere. Measured on the dash-cased
4182
+ form, `readOnly` came back `false`. */
4182
4183
  readOnly?: (HelixHeadlessInput["readOnly"]) | undefined;
4183
4184
  /** Whether a password field offers a toggle that shows what was typed.
4184
4185
 
@@ -4199,9 +4200,9 @@ The state is `aria-pressed`, not this. */
4199
4200
 
4200
4201
  **Not reflected.** Reflection exists so a selector can reach a value, and
4201
4202
  no stylesheet in this repository selects on `type`. Reflecting it writes
4202
- `type="text"` onto every `<helix-input>` ever rendered, an attribute no
4203
- consumer's markup has, which is the fault the area rules write up under
4204
- `Button`'s `href`, `target` and `rel`.
4203
+ `type="text"` onto every `<helix-headless-input>` ever rendered, an
4204
+ attribute no consumer's markup has, which is the fault the area rules write
4205
+ up under `Button`'s `href`, `target` and `rel`.
4205
4206
 
4206
4207
  Nothing reads it from the attribute either. The real `<input>` inside takes
4207
4208
  it as a property binding, which is what makes the keyboard and the
@@ -4415,8 +4416,7 @@ beside it for instance. `ring` lets the ground through, for a chart drawn
4415
4416
  over something busy. `triangle` points along the axis and reads as "and
4416
4417
  onward" rather than as a second claim about the data.
4417
4418
 
4418
- The shapes come from
4419
- `helix/styled/src/shared/chart/terminus.css`, the same sheet `Sparkline` takes, so
4419
+ The shapes come from one shared sheet, the same one `Sparkline` takes, so
4420
4420
  the set is identical wherever one appears. **Which is why every value is
4421
4421
  named here.** `Sparkline` shipped `square` implemented, drawn, asserted and
4422
4422
  undocumented until the cohort before this one; this family reads the same
@@ -4497,10 +4497,10 @@ has to survive with the stylesheet turned off.
4497
4497
  label?: (HelixHeadlessList["label"]) | undefined;
4498
4498
  /** Which markers an ordered list draws, in `<ol type>`'s own five values.
4499
4499
 
4500
- Reflected, because this is one of the things a stylesheet selects on and
4501
- the styled tier maps each to a `list-style-type`. The platform's spellings
4502
- rather than the CSS ones, so `<helix-list kind="ordered" type="i">` is what
4503
- a consumer would have written on an `<ol>`.
4500
+ Reflected, because this is one of the things a stylesheet selects on, each
4501
+ value mapping to a `list-style-type`. The platform's spellings rather than
4502
+ the CSS ones, so `<helix-headless-list kind="ordered" type="i">` is what a
4503
+ consumer would have written on an `<ol>`.
4504
4504
 
4505
4505
  **`start` and `reversed` are both absent and neither can be done here.**
4506
4506
  This renders no `<ol>`: the rows are slotted and numbered by the CSS
@@ -5125,10 +5125,10 @@ this element then owns.
5125
5125
 
5126
5126
  **Not reflected.** Unread is a visual state, which is why the four mixins
5127
5127
  mirror theirs, but the mirror may not be the property's own attribute:
5128
- `<helix-notification default-read>` comes back from a server without `read`
5129
- and would gain it on the first update, which React reports as a hydration
5130
- mismatch, and which a copy of the serialized element re-parses as a
5131
- declaration. `:state(read)` is what the stylesheet reads.
5128
+ `<helix-headless-notification default-read>` comes back from a server
5129
+ without `read` and would gain it on the first update, which React reports
5130
+ as a hydration mismatch, and which a copy of the serialized element
5131
+ re-parses as a declaration. `:state(read)` is what the stylesheet reads.
5132
5132
  `hydration.dom.spec.ts` holds it. */
5133
5133
  read?: (HelixHeadlessNotification["read"]) | undefined;
5134
5134
  /** State to open with, where nothing declared one. */
@@ -5511,7 +5511,7 @@ attribute and the state is the property.
5511
5511
  **The attribute, read when it is asked for, and never a snapshot taken in
5512
5512
  the constructor.** A field initializer runs there, and an element the HTML
5513
5513
  parser created has none of its attributes yet at that moment: measured on
5514
- this element, on `Radio` and on `Toggle`, `<helix-option value="a"
5514
+ this element, on `Radio` and on `Toggle`, `<helix-headless-option value="a"
5515
5515
  selected>` reported `defaultSelected` as `false` both from parsed markup
5516
5516
  and from `createElement` followed by `setAttribute`, which is every way a
5517
5517
  consumer writes one. The snapshot could only ever be true for an element
@@ -5859,10 +5859,10 @@ other end is going to reject. A consumer whose codes really do carry
5859
5859
  marked letters wants `text`, which judges nothing.
5860
5860
 
5861
5861
  **Not reflected**: nothing selects on it, so reflecting only writes
5862
- `type="numeric"` onto every `<helix-pin-input>` ever rendered, an attribute
5863
- no consumer's markup had. The area rules carry the sentence "reflect only
5864
- what CSS selects on". The real inputs take it as a binding, which is what
5865
- makes the keyboard follow. */
5862
+ `type="numeric"` onto every `<helix-headless-pin-input>` ever rendered, an
5863
+ attribute no consumer's markup had. The area rules carry the sentence
5864
+ "reflect only what CSS selects on". The real inputs take it as a binding,
5865
+ which is what makes the keyboard follow. */
5866
5866
  type?: (HelixHeadlessPinInput["type"]) | undefined;
5867
5867
  /** The value the markup declared, which is where a reset returns to. */
5868
5868
  "default-value"?: (HelixHeadlessPinInput["defaultValue"]) | undefined;
@@ -6196,7 +6196,7 @@ attribute and the state is the property.
6196
6196
  **The attribute, read when it is asked for, and never a snapshot taken in
6197
6197
  the constructor.** A field initializer runs there, and an element the HTML
6198
6198
  parser created has none of its attributes yet at that moment: measured on
6199
- this element, on `Option` and on `Toggle`, `<helix-radio value="a"
6199
+ this element, on `Option` and on `Toggle`, `<helix-headless-radio value="a"
6200
6200
  selected>` reported `defaultSelected` as `false` both from parsed markup
6201
6201
  and from `createElement` followed by `setAttribute`, which is every way a
6202
6202
  consumer writes one. The snapshot could only ever be true for an element
@@ -6992,9 +6992,9 @@ the headline and the label is a caption under it.
6992
6992
  The row directions set them side by side, for a figure in a line of text or
6993
6993
  a narrow strip where a stacked pair would be two lines of almost nothing.
6994
6994
 
6995
- A property rather than a `helix-flex` around it, because the unit has to
6996
- stay on the value's baseline whichever way the pair goes, and only this
6997
- element knows which of its children the unit belongs to.
6995
+ A property rather than a `Flex` around it, because the unit has to stay on
6996
+ the value's baseline whichever way the pair goes, and only this element
6997
+ knows which of its children the unit belongs to.
6998
6998
 
6999
6999
  **Optional rather than defaulted to `column`, which is not a style
7000
7000
  preference.** A reflecting property with a default writes its attribute onto
@@ -7194,15 +7194,15 @@ export type HelixHeadlessTableColumnHelixBeforeResizeElementEvent =
7194
7194
  export type HelixHeadlessTableColumnVueProps = {
7195
7195
  /** Which edge the values line up against.
7196
7196
 
7197
- `end` is what a column of numbers wants, so digits of the same magnitude sit
7198
- above each other. Left unset the cell inherits the table's own alignment,
7199
- which is `start` for text in either writing direction. `helix-data-table`
7200
- aligns the cells it draws. A `helix-table`'s cells are markup the consumer
7201
- wrote, so the table writes nothing onto them: it publishes the edge to each
7202
- cell under this column as `--table-cell-align`, which `@fusion.dev/helix`
7203
- reads. The heading is this element's own, and `@fusion.dev/helix` sets it to
7204
- the same edge in either table. `end` is the inline end, so in a
7205
- right-to-left table it is the left.
7197
+ `end` is what a column of numbers wants, so digits of the same magnitude
7198
+ sit above each other. Left unset the cell inherits the table's own
7199
+ alignment, which is `start` for text in either writing direction.
7200
+ `DataTable` aligns the cells it draws. A `Table`'s cells are markup the
7201
+ consumer wrote, so the table writes nothing onto them: it publishes the
7202
+ edge to each cell under this column as `--table-cell-align`, which
7203
+ `@fusion.dev/helix` reads. The heading is this element's own, and
7204
+ `@fusion.dev/helix` sets it to the same edge in either table. `end` is the
7205
+ inline end, so in a right-to-left table it is the left.
7206
7206
 
7207
7207
  **Reflected, because the heading is drawn by a stylesheet and has no other
7208
7208
  way to learn it.** Set as a property, which is how React sets it, an
@@ -7249,8 +7249,8 @@ onto its host. */
7249
7249
  /** The track this column takes, as CSS.
7250
7250
 
7251
7251
  A single track value, so anything valid in `grid-template-columns` works:
7252
- `16rem`, `auto`, `minmax(0, 2fr)`. Left unset the column takes the track
7253
- in its place in a `helix-table`'s `columns`, where that table sets one, and
7252
+ `16rem`, `auto`, `minmax(0, 2fr)`. Left unset the column takes the track in
7253
+ its place in a `Table`'s `columns`, where that table sets one, and
7254
7254
  otherwise shares what is left over equally, as `minmax(max-content, 1fr)`.
7255
7255
  Set here, it wins over that list, which is what lets a reader resize a
7256
7256
  column in a table that set one.
@@ -7296,15 +7296,14 @@ export type HelixHeadlessTableColumnVueEvents = {
7296
7296
  export type HelixHeadlessTableVueProps = {
7297
7297
  /** The column widths as one track list, written once on the table.
7298
7298
 
7299
- With `helix-table-column` children, each track sizes the column in its
7300
- place, a hidden column counted, so hiding one takes its track with it and
7301
- the rest keep theirs. The columns decide how many tracks there are and this
7302
- list only how wide: a track past the last column is dropped, and a column
7303
- past the last track shares what is left. With no columns declared it is
7304
- the whole track list. Tracks count as the grid counts them, so
7305
- `minmax(0, 1fr)` is one and `repeat(2, 8rem)` is two, and one the grid
7306
- would refuse leaves its column at the default rather than taking the table
7307
- down to one column.
7299
+ With `TableColumn` children, each track sizes the column in its place, a
7300
+ hidden column counted, so hiding one takes its track with it and the rest
7301
+ keep theirs. The columns decide how many tracks there are and this list
7302
+ only how wide: a track past the last column is dropped, and a column past
7303
+ the last track shares what is left. With no columns declared it is the
7304
+ whole track list. Tracks count as the grid counts them, so `minmax(0, 1fr)`
7305
+ is one and `repeat(2, 8rem)` is two, and one the grid would refuse leaves
7306
+ its column at the default rather than taking the table down to one column.
7308
7307
 
7309
7308
  **A column's own `width` wins over its track here.** The width is written
7310
7309
  on the column it sizes, which is the more particular statement, and it is
@@ -7318,13 +7317,11 @@ to walk, so a render there knows of no columns and this attribute is the
7318
7317
  whole answer: a table given one lays its grid out in the first paint, and a
7319
7318
  table sized only by its columns is one track wide until it upgrades.
7320
7319
 
7321
- **`helix-data-table` has none of this, and should not.** Its columns are
7322
- its schema rather than an option, so there is always a column to write a
7323
- `width` on and a list here would be a second way to say what that says.
7324
- This table's cells are markup, and a table written as rows of cells with no
7325
- `helix-table-column` in it has nowhere else to be sized from. Both families
7326
- take the same CSS hook, `--table-columns` and `--data-table-columns`, which
7327
- wins over whichever list the element worked out. */
7320
+ **Data Table has none of this, and should not.** Its columns are its schema
7321
+ rather than an option, so there is always a column to write a `width` on
7322
+ and a list here would be a second way to say what that says. This table's
7323
+ cells are markup, and a table written as rows of cells with no column
7324
+ declared in it has nowhere else to be sized from. */
7328
7325
  columns?: (HelixHeadlessTable["columns"]) | undefined;
7329
7326
  /** Accessible name for the table. */
7330
7327
  label?: (HelixHeadlessTable["label"]) | undefined;
@@ -7679,8 +7676,8 @@ Absent uses the runtime's own. */
7679
7676
 
7680
7677
  Absent is one. `range` holds a start and an end, `multiple` holds any
7681
7678
  number, and both are carried as one comma-separated value, which is what a
7682
- form submits. `helix-time-picker` carries the longer note on the interaction and on
7683
- why a wheel cannot do either. */
7679
+ form submits. `TimePicker` carries the longer note on the interaction and
7680
+ on why a wheel cannot do either. */
7684
7681
  mode?: (HelixHeadlessTimeInput["mode"]) | undefined;
7685
7682
  /** What the field says before a time is in it. */
7686
7683
  placeholder?: (HelixHeadlessTimeInput["placeholder"]) | undefined;
@@ -7709,7 +7706,7 @@ never something this element would refuse to read back. */
7709
7706
  `list` offers whole times, which is what a product with slots or opening
7710
7707
  hours has. `wheels` splits them into an hour, a minute and a meridiem where
7711
7708
  the locale uses one, which is the only way to reach `23:45` without
7712
- scrolling most of a day. `helix-time-picker` carries the longer note on the trade.
7709
+ scrolling most of a day. `TimePicker` carries the longer note on the trade.
7713
7710
 
7714
7711
  **Optional rather than defaulted, which is not a style preference.** A
7715
7712
  reflecting property with a default writes its attribute onto every host the
@@ -7899,7 +7896,7 @@ Absent uses the runtime's own. */
7899
7896
 
7900
7897
  Absent is one. `range` holds a start and an end with everything between
7901
7898
  them shown as part of the answer, `multiple` holds any number, and both are
7902
- carried as one comma-separated value: the same shape `helix-date-picker` uses,
7899
+ carried as one comma-separated value: the same shape `DatePicker` uses,
7903
7900
  because it is the same question asked of a different unit.
7904
7901
 
7905
7902
  **A range is two picks, and a third starts over.** That is the calendar's
@@ -8123,7 +8120,7 @@ where they were would not be a stack.
8123
8120
  **Optional, and bottom-end is the absence of it.** Reflecting *and*
8124
8121
  defaulting is the pair that writes onto a host: every toast region anybody
8125
8122
  rendered would gain a `placement="bottom-end"` nobody typed, which a React
8126
- consumer's server markup does not have. The styled sheet carries the resting
8123
+ consumer's server markup does not have. A sheet carries the resting
8127
8124
  arrangement in its own `:host` rule and the selectors describe only the
8128
8125
  departures, which is what `orientation` does. */
8129
8126
  placement?: (HelixHeadlessToast["placement"]) | undefined;
@@ -8265,11 +8262,11 @@ attribute and the state is the property.
8265
8262
  **The attribute, read when it is asked for, and never a snapshot taken in
8266
8263
  the constructor.** A field initializer runs there, and an element the HTML
8267
8264
  parser created has none of its attributes yet at that moment: measured on
8268
- this element, on `Option` and on `Radio`, `<helix-toggle value="light"
8269
- selected>` reported `defaultSelected` as `false` both from parsed markup
8270
- and from `createElement` followed by `setAttribute`, which is every way a
8271
- consumer writes one. The snapshot could only ever be true for an element
8272
- already in the document when `customElements.define` ran.
8265
+ this element, on `Option` and on `Radio`, `<helix-headless-toggle
8266
+ value="light" selected>` reported `defaultSelected` as `false` both from
8267
+ parsed markup and from `createElement` followed by `setAttribute`, which is
8268
+ every way a consumer writes one. The snapshot could only ever be true for
8269
+ an element already in the document when `customElements.define` ran.
8273
8270
 
8274
8271
  Nothing overwrites it either, which is what makes reading it late correct
8275
8272
  rather than merely later: `selected` does not reflect, for the reason
@@ -9142,7 +9139,7 @@ export type HelixHeadlessVirtualListVueEvents = {};
9142
9139
  export type CustomCssProperties = {
9143
9140
  /** How wide an axis column is drawn, in `ch`, from the widest number on it. Written on the axis itself, and only where the categories run along the bottom: turned sideways an axis is a row and takes a line's height instead. */
9144
9141
  "--bar-chart-axis"?: (string) | undefined;
9145
- /** The color of the secondary axis when one series owns it. It resolves a `--helix-color-series-*` token, so on the headless tier alone it names something that is not there. #138. */
9142
+ /** The color of the secondary axis, where one series owns it. Written by the component from that series' `--chart-series-*`, so it promises the series color and nothing more: whatever that hook resolves to is what the axis is drawn in. */
9146
9143
  "--bar-chart-secondary"?: (string) | undefined;
9147
9144
  /** The gradient a bar would take, named per bar so the styled tier can point `fill` at it. Drawn whatever the treatment and used only where `wash="gradient"` asks for it. */
9148
9145
  "--chart-bar-wash"?: (string) | undefined;
@@ -9166,24 +9163,14 @@ export type CustomCssProperties = {
9166
9163
  "--color-picker-saturation"?: (string) | undefined;
9167
9164
  /** A color to paint: the current one on the sample, a preset's on each preset. */
9168
9165
  "--color-picker-swatch"?: (string) | undefined;
9169
- /** The edge the column a cell sits under is set to, `start`, `center` or `end`, and unset under a column that sets none. Written by the component onto each cell it draws, read by the sheet that paints one; `helix-table` publishes `--table-cell-align` for the same attribute on the cells a consumer wrote, under its own family's name. */
9166
+ /** The edge the column a cell sits under is set to, `start`, `center` or `end`, and unset under a column that sets none. Written by the component onto each cell it draws, read by the sheet that paints one; Table publishes `--table-cell-align` for the same attribute on the cells a consumer wrote, under its own family's name. */
9170
9167
  "--data-table-cell-align"?: (string) | undefined;
9171
- /** The column track list this element worked out from the columns declared in it. Written by the component, read by the sheet that paints: a stylesheet takes it to lay the grid out, and setting it does nothing, because the component writes it inline on the very element that reads it and an inline declaration beats any sheet. `--data-table-columns` is the one to set. */
9168
+ /** The column track list this element worked out from the columns declared in it. Written by the component, read by the sheet that paints: a stylesheet takes it to lay the grid out, and setting it does nothing, because the component writes it inline on the very element that reads it and an inline declaration beats any sheet. A column's `width` is the one to set. */
9172
9169
  "--data-table-template"?: (string) | undefined;
9173
9170
  /** How many month columns are drawn, capped at two. `--date-picker-columns` overrides it. */
9174
9171
  "--date-picker-column-count"?: (string) | undefined;
9175
9172
  /** How thick the ring is drawn, derived from `hole`. */
9176
9173
  "--donut-chart-stroke"?: (string) | undefined;
9177
- /** How tall a cell is. A row of a tall thin cell is what a status page draws. */
9178
- "--heatmap-cell-height"?: (string) | undefined;
9179
- /** How wide a cell is. The strip fits as many as the container allows. */
9180
- "--heatmap-cell-inline-size"?: (string) | undefined;
9181
- /** How far a cell's corners are rounded. */
9182
- "--heatmap-cell-radius"?: (string) | undefined;
9183
- /** The size a cell wants on both axes, where neither is given its own. */
9184
- "--heatmap-cell-size"?: (string) | undefined;
9185
- /** Space between cells. Zero is a continuous field rather than a grid of tiles. */
9186
- "--heatmap-gap"?: (string) | undefined;
9187
9174
  /** How many rows the strip lays out. Written by the component from the data, read by the tier that draws it. */
9188
9175
  "--heatmap-rows"?: (string) | undefined;
9189
9176
  /** The tone of the cell this is set on. Written by the component, read by the sheet that paints. */
@@ -9258,7 +9245,7 @@ export type CustomCssProperties = {
9258
9245
  "--splitter-position"?: (string) | undefined;
9259
9246
  /** The edge the column this cell sits under is set to, `start`, `center` or `end`, and unset under a column that sets none. Written by the table around it, since the cell is the consumer's markup and nothing is written onto it; read by the sheet that draws the cell, where `justify-content` and `text-align` both take it as it comes and both follow the writing direction. */
9260
9247
  "--table-cell-align"?: (string) | undefined;
9261
- /** The column track list this element worked out from the columns declared in it. Written by the component, read by the sheet that paints: a stylesheet takes it to lay the grid out, and setting it does nothing, because the component writes it inline on the very element that reads it and an inline declaration beats any sheet. `--table-columns` is the one to set. */
9248
+ /** The column track list this element worked out from the columns declared in it. Written by the component, read by the sheet that paints: a stylesheet takes it to lay the grid out, and setting it does nothing, because the component writes it inline on the very element that reads it and an inline declaration beats any sheet. `columns` is the one to set. */
9262
9249
  "--table-template"?: (string) | undefined;
9263
9250
  /** How long this message stays, in milliseconds, for a progress hint. */
9264
9251
  "--toast-duration"?: (string) | undefined;
@@ -9282,7 +9269,7 @@ export interface WcToolkitVueGlobalComponents {
9282
9269
  HelixHeadlessAccordionItemVueProps,
9283
9270
  HelixHeadlessAccordionItemVueEvents
9284
9271
  >;
9285
- /** Holds the mode and nothing else. The item that was clicked is what coordinates: it walks up to the nearest accordion, reads the mode off it, and closes its peers itself. Coordination is structural, not a subscription. 'helix-before-open' does not bubble and is not composed, because overlays nest and an inner one's lifecycle must never read as the outer one's, so an accordion cannot learn that a child opened by listening for it. Membership resolves on demand, so there is no registry to keep in step: an item added a second after render coordinates on its first click. Items are matched with 'instanceof HelixHeadlessAccordionItem', never by tag name. Matching 'helix-accordion-item' would tie this tier to the styled one. The keyboard listener is the controller's and is attached on connect, so none of it runs on the server, where there is no tree to walk and no events to hear. */
9272
+ /** Holds the mode and nothing else. The item that was clicked is what coordinates: it walks up to the nearest accordion, reads the mode off it, and closes its peers itself. Coordination is structural, not a subscription. 'helix-before-open' does not bubble and is not composed, because overlays nest and an inner one's lifecycle must never read as the outer one's, so an accordion cannot learn that a child opened by listening for it. Membership resolves on demand, so there is no registry to keep in step: an item added a second after render coordinates on its first click. Items are matched with 'instanceof HelixHeadlessAccordionItem', never by tag name, so this tier does not learn about the styled one. The keyboard listener is the controller's and is attached on connect, so none of it runs on the server, where there is no tree to walk and no events to hear. */
9286
9273
  "helix-headless-accordion": DefineCustomElement<
9287
9274
  HelixHeadlessAccordion,
9288
9275
  HelixHeadlessAccordionVueProps,
@@ -9366,7 +9353,7 @@ export interface WcToolkitVueGlobalComponents {
9366
9353
  HelixHeadlessCalloutVueProps,
9367
9354
  HelixHeadlessCalloutVueEvents
9368
9355
  >;
9369
- /** Regions are slots rather than separate elements, because a header, body, and footer carry no state, no behavior, and no API of their own. Slotting them costs one custom element instead of five and lets the consumer bring their own markup, so a title can be a real '<h2>' rather than an emulated one. The host is the surface. A wrapper '<div part="container">' would be a second box doing nothing the host cannot: the element itself takes the border, the radius, and the grid, and a consumer styles 'helix-card' rather than reaching through '::part'. One node instead of two, on every card on the page. Name the card with 'aria-label' or 'aria-labelledby'. That is the only naming that survives server rendering: reading a title out of the light DOM needs a DOM, and the server has none. */
9356
+ /** Regions are slots rather than separate elements, because a header, body, and footer carry no state, no behavior, and no API of their own. Slotting them costs one custom element instead of five and lets the consumer bring their own markup, so a title can be a real '<h2>' rather than an emulated one. The host is the surface. A wrapper '<div part="container">' would be a second box doing nothing the host cannot: the element itself takes the border, the radius, and the grid, and a consumer styles 'Card' rather than reaching through '::part'. One node instead of two, on every card on the page. Name the card with 'aria-label' or 'aria-labelledby'. That is the only naming that survives server rendering: reading a title out of the light DOM needs a DOM, and the server has none. */
9370
9357
  "helix-headless-card": DefineCustomElement<
9371
9358
  HelixHeadlessCard,
9372
9359
  HelixHeadlessCardVueProps,
@@ -9420,7 +9407,7 @@ export interface WcToolkitVueGlobalComponents {
9420
9407
  HelixHeadlessCodeVueProps,
9421
9408
  HelixHeadlessCodeVueEvents
9422
9409
  >;
9423
- /** **The picker is 'helix-color-picker', not a second one written here.** It owns the square, the ramps, the eyedropper and the syntax toggle, and it is worth having on its own: a settings pane wants a picker flat on the page with nothing to open. This element is the field, the overlay, and the form. Exactly the arrangement Date Input has with 'helix-date-picker'. **Typed as well as picked, and the typing is the reason this is not '<input type="color">'.** The native control gives a free picker and takes nearly all styling with it, which is a fair trade until a product needs the panel to match everything around it. What is kept from the native one is the part worth keeping: a real text field, so a reader who has the hex pastes it and never opens anything. **Every syntax is read; the one 'format' names is written.** '#f00', '#ff0000', 'rgb(255 0 0)', 'rgba(255,0,0,.5)', 'rgb(255 0 0 / 50%)' and 'hsl(0 100% 50%)' are all colors, and a field that refuses one because it prefers another is arguing with the person using it. What the field *shows* is the value itself, for the reason Date Input gives about its dates: half-typed input does not survive a round trip through a formatter. The custom property below is written by this component and never set by a consumer: it carries a value this element resolved and CSS cannot, which is what lets a stylesheet on this tier paint the swatch without parsing anything itself. */
9410
+ /** **The picker is 'ColorPicker', not a second one written here.** It owns the square, the ramps, the eyedropper and the syntax toggle, and it is worth having on its own: a settings pane wants a picker flat on the page with nothing to open. This element is the field, the overlay, and the form. Exactly the arrangement Date Input has with 'DatePicker'. **Typed as well as picked, and the typing is the reason this is not '<input type="color">'.** The native control gives a free picker and takes nearly all styling with it, which is a fair trade until a product needs the panel to match everything around it. What is kept from the native one is the part worth keeping: a real text field, so a reader who has the hex pastes it and never opens anything. **Every syntax is read; the one 'format' names is written.** '#f00', '#ff0000', 'rgb(255 0 0)', 'rgba(255,0,0,.5)', 'rgb(255 0 0 / 50%)' and 'hsl(0 100% 50%)' are all colors, and a field that refuses one because it prefers another is arguing with the person using it. What the field *shows* is the value itself, for the reason Date Input gives about its dates: half-typed input does not survive a round trip through a formatter. The custom property below is written by this component and never set by a consumer: it carries a value this element resolved and CSS cannot, which is what lets a stylesheet on this tier paint the swatch without parsing anything itself. */
9424
9411
  "helix-headless-color-input": DefineCustomElement<
9425
9412
  HelixHeadlessColorInput,
9426
9413
  HelixHeadlessColorInputVueProps,
@@ -9432,13 +9419,13 @@ export interface WcToolkitVueGlobalComponents {
9432
9419
  HelixHeadlessColorPickerVueProps,
9433
9420
  HelixHeadlessColorPickerVueEvents
9434
9421
  >;
9435
- /** **The list is 'helix-listbox', and the filtering is its own.** It owns narrowing, the empty state, the highlight, 'aria-activedescendant' and scrolling an option into view. What is left for this element is the field, the panel and the traffic between them. **The text and the value are two things.** What a reader types is a filter: it narrows the list and is thrown away. The value is whichever option they then choose, and the field is rewritten to that option's words once they have. The filter is cleared on close, so a reopened control does not start from the last visit's leftovers. **Focus stays in the field, which is the whole of what a combobox is.** The arrows move the list without leaving the text, through the listbox's public 'navigate'. 'role="combobox"' is on the input rather than on a wrapper, because the thing the pattern describes is the text field. **With 'multiple', the chosen options are tags in the field**, one object per answer, each with its own remove control. The panel stays open while more than one can be chosen and the filter clears on each choice, so the next pick starts from the whole list. **'creatable' announces, and does not write.** The options are the consumer's light DOM and nothing here puts an element into it: a component that grew the consumer's markup would be one their framework re-renders over. It offers the row and fires the event; adding the option is the consumer's. */
9422
+ /** **The list is 'Listbox', and the filtering is its own.** It owns narrowing, the empty state, the highlight, 'aria-activedescendant' and scrolling an option into view. What is left for this element is the field, the panel and the traffic between them. **The text and the value are two things.** What a reader types is a filter: it narrows the list and is thrown away. The value is whichever option they then choose, and the field is rewritten to that option's words once they have. The filter is cleared on close, so a reopened control does not start from the last visit's leftovers. **Focus stays in the field, which is the whole of what a combobox is.** The arrows move the list without leaving the text, through the listbox's public 'navigate'. 'role="combobox"' is on the input rather than on a wrapper, because the thing the pattern describes is the text field. **With 'multiple', the chosen options are tags in the field**, one object per answer, each with its own remove control. The panel stays open while more than one can be chosen and the filter clears on each choice, so the next pick starts from the whole list. **'creatable' announces, and does not write.** The options are the consumer's light DOM and nothing here puts an element into it: a component that grew the consumer's markup would be one their framework re-renders over. It offers the row and fires the event; adding the option is the consumer's. */
9436
9423
  "helix-headless-combobox": DefineCustomElement<
9437
9424
  HelixHeadlessCombobox,
9438
9425
  HelixHeadlessComboboxVueProps,
9439
9426
  HelixHeadlessComboboxVueEvents
9440
9427
  >;
9441
- /** **The list is 'helix-listbox', filtering and all.** Listbox already owns narrowing, the empty state, the highlight over what matched, 'aria-activedescendant', scrolling an option into view and the keyboard that moves between them. Its own note says a command palette is that list again with something different opening it, and this is that something: a dialog, and a key that summons it. **The value is not kept.** A palette runs a command and forgets it: nothing here is a form control and nothing is submitted, so what it reports is that an option was chosen, once, with 'helix-select'. A consumer that wants the last command remembered is a consumer with somewhere better to keep it. **The hotkey is global and the element does not have to be open to hear it.** The listener is on the document, because the point of a palette is that it answers from wherever the reader is, including from inside another control's text field. 'mod' is Command on a Mac and Control elsewhere, resolved here so a consumer writes one thing. The filter is emptied as the palette closes, for the reason Combobox and Select both record: a control reopened still narrowed by the last visit's search is one whose second use starts from the first one's leftovers, and a palette is used far more often than either. */
9428
+ /** **The list is 'Listbox', filtering and all.** Listbox already owns narrowing, the empty state, the highlight over what matched, 'aria-activedescendant', scrolling an option into view and the keyboard that moves between them. Its own note says a command palette is that list again with something different opening it, and this is that something: a dialog, and a key that summons it. **The value is not kept.** A palette runs a command and forgets it: nothing here is a form control and nothing is submitted, so what it reports is that an option was chosen, once, with 'helix-select'. A consumer that wants the last command remembered is a consumer with somewhere better to keep it. **The hotkey is global and the element does not have to be open to hear it.** The listener is on the document, because the point of a palette is that it answers from wherever the reader is, including from inside another control's text field. 'mod' is Command on a Mac and Control elsewhere, resolved here so a consumer writes one thing. The filter is emptied as the palette closes, for the reason Combobox and Select both record: a control reopened still narrowed by the last visit's search is one whose second use starts from the first one's leftovers, and a palette is used far more often than either. */
9442
9429
  "helix-headless-command": DefineCustomElement<
9443
9430
  HelixHeadlessCommand,
9444
9431
  HelixHeadlessCommandVueProps,
@@ -9450,13 +9437,13 @@ export interface WcToolkitVueGlobalComponents {
9450
9437
  HelixHeadlessCopyButtonVueProps,
9451
9438
  HelixHeadlessCopyButtonVueEvents
9452
9439
  >;
9453
- /** **The schema is markup and the data is a property.** Columns are declared as 'helix-table-column' children, because a schema is small and something a reader should see in the HTML; rows are handed over as an array, because a table that draws ten thousand elements cannot window them. '''html <helix-data-table .rows=${rows} sort="name:asc" page-size="20"> <helix-table-column field="name" sortable>Name</helix-table-column> <helix-table-column field="size" align="end" sortable .cell=${bytes}>Size</helix-table-column> </helix-data-table> ''' 'helix-table' takes rows as markup and is the right component for a table of twelve things a person wrote out. **Sort and filter apply to the whole set, never the page.** Sorting the drawn window is correct on the first screen and wrong on every other one. **The cell values do not server-render.** The headings do, and the row elements do, but reading a cell needs the columns, and the columns are markup children Lit SSR does not hand this element. So a crawler sees a table of the right shape with nothing in it. That is the cost of the first paragraph: use 'helix-table' where the served HTML has to carry the values. **'selectable' adds a column of checkboxes, keyed on 'row-key'.** A row is selected by its identity rather than its position, so a selection survives a sort, a filter and a page. 'selected' is the chosen keys, comma separated, the shape Listbox uses for a multiple choice, and like 'sort' it is controlled when set and seeded by 'default-selected'. The box in the heading selects every row in the result, across pages, and shows a dash while only some are chosen. Choosing one of many, rather than several, is opening a row, and that is a link or a button in a cell rather than a selection. **A reader can size and order the columns.** 'resizable' on a column puts a separator on its edge; 'reorderable' on the table puts a grip on each heading that has a 'field', moved by dragging or with the arrow keys. The order lands in 'order' as fields, and the consumer's own markup is never rewritten: the table assigns the headings to its header in that order instead. **'csv()' hands back the result as text**: every row the filter lets through, in the order on screen, in the columns on screen. Saving it is the page's business, the same as any other file. **There is no 'columns' attribute here, and 'helix-table' has one.** The difference is what a column is in each: here it is the schema, so a table without one has nothing to read a row with, and every column is a place to write a 'width'. A 'helix-table' holds cells a consumer wrote and can be written with no column at all, so its 'columns' is where such a table is sized from. Written on this element the attribute is inert, which is the trap worth knowing when moving between the two. What both take is the CSS hook, '--data-table-columns' here and '--table-columns' there. */
9440
+ /** **The schema is markup and the data is a property.** Columns are declared as 'TableColumn' children, because a schema is small and something a reader should see in the HTML; rows are handed over as an array, because a table that draws ten thousand elements cannot window them. '''html <helix-headless-data-table .rows=${rows} sort="name:asc" page-size="20"> <helix-headless-table-column field="name" sortable>Name</helix-headless-table-column> <helix-headless-table-column field="size" align="end" sortable .cell=${bytes}>Size</helix-headless-table-column> </helix-headless-data-table> ''' 'Table' takes rows as markup and is the right component for a table of twelve things a person wrote out. **Sort and filter apply to the whole set, never the page.** Sorting the drawn window is correct on the first screen and wrong on every other one. **The cell values do not server-render.** The headings do, and the row elements do, but reading a cell needs the columns, and the columns are markup children Lit SSR does not hand this element. So a crawler sees a table of the right shape with nothing in it. That is the cost of the first paragraph: use 'Table' where the served HTML has to carry the values. **'selectable' adds a column of checkboxes, keyed on 'row-key'.** A row is selected by its identity rather than its position, so a selection survives a sort, a filter and a page. 'selected' is the chosen keys, comma separated, the shape Listbox uses for a multiple choice, and like 'sort' it is controlled when set and seeded by 'default-selected'. The box in the heading selects every row in the result, across pages, and shows a dash while only some are chosen. Choosing one of many, rather than several, is opening a row, and that is a link or a button in a cell rather than a selection. **A reader can size and order the columns.** 'resizable' on a column puts a separator on its edge; 'reorderable' on the table puts a grip on each heading that has a 'field', moved by dragging or with the arrow keys. The order lands in 'order' as fields, and the consumer's own markup is never rewritten: the table assigns the headings to its header in that order instead. **'csv()' hands back the result as text**: every row the filter lets through, in the order on screen, in the columns on screen. Saving it is the page's business, the same as any other file. **There is no 'columns' attribute here, and Table has one.** The difference is what a column is in each: here it is the schema, so a table without one has nothing to read a row with, and every column is a place to write a 'width'. A Table holds cells a consumer wrote and can be written with no column at all, so its 'columns' is where such a table is sized from. Written on this element the attribute is inert, which is the trap worth knowing when moving between the two. */
9454
9441
  "helix-headless-data-table": DefineCustomElement<
9455
9442
  HelixHeadlessDataTable,
9456
9443
  HelixHeadlessDataTableVueProps,
9457
9444
  HelixHeadlessDataTableVueEvents
9458
9445
  >;
9459
- /** **The calendar is 'helix-date-picker', not a second one written here.** It already knows about months, ranges, disabled days, the first day of the week and every keyboard rule a grid owes a reader. This element is the field, the overlay, and the translation between them. **Typed as well as picked, and the typing is why it is not '<input type="date">'.** The native control gives a free picker and a free locale and takes almost all styling with it. What is kept from it is the part worth keeping: a real text field. */
9446
+ /** **The calendar is 'DatePicker', not a second one written here.** It already knows about months, ranges, disabled days, the first day of the week and every keyboard rule a grid owes a reader. This element is the field, the overlay, and the translation between them. **Typed as well as picked, and the typing is why it is not '<input type="date">'.** The native control gives a free picker and a free locale and takes almost all styling with it. What is kept from it is the part worth keeping: a real text field. */
9460
9447
  "helix-headless-date-input": DefineCustomElement<
9461
9448
  HelixHeadlessDateInput,
9462
9449
  HelixHeadlessDateInputVueProps,
@@ -9498,7 +9485,7 @@ export interface WcToolkitVueGlobalComponents {
9498
9485
  HelixHeadlessDonutChartVueProps,
9499
9486
  HelixHeadlessDonutChartVueEvents
9500
9487
  >;
9501
- /** Takes 'MixinControllerOpen', so 'open', 'defaultOpen' and the 'helix-before-open' and 'helix-before-close' requests behave exactly as they do on an accordion item, and a consumer already knows the API. Modal by default, which is three things together and not one: focus is trapped inside, Escape and an outside press close it, and the page behind is covered. A panel with the look of a modal and none of its behavior is worse than an inline one, because it invites the reader to treat it as blocking. Content stays mounted when closed, so it is in the server's markup and can animate. A closed '<dialog>' is already out of the tab order and out of the accessibility tree, so nothing here writes 'inert'. The 'role', the 'aria-modal' and the scrim come from the element too, and 'drawer-root.ssr.spec.ts' asserts the panel carries no hand-written 'inert' and no hand-written 'role'. Opened declaratively with the platform's invoker attributes: '''html <helix-button commandfor="nav" command="--toggle">Menu</helix-button> <helix-drawer id="nav">…</helix-drawer> ''' */
9488
+ /** Takes 'MixinControllerOpen', so 'open', 'defaultOpen' and the 'helix-before-open' and 'helix-before-close' requests behave exactly as they do on an accordion item, and a consumer already knows the API. Modal by default, which is three things together and not one: focus is trapped inside, Escape and an outside press close it, and the page behind is covered. A panel with the look of a modal and none of its behavior is worse than an inline one, because it invites the reader to treat it as blocking. Content stays mounted when closed, so it is in the server's markup and can animate. A closed '<dialog>' is already out of the tab order and out of the accessibility tree, so nothing here writes 'inert'. The 'role', the 'aria-modal' and the scrim come from the element too, and 'drawer-root.ssr.spec.ts' asserts the panel carries no hand-written 'inert' and no hand-written 'role'. Opened declaratively with the platform's invoker attributes: '''html <helix-headless-button commandfor="nav" command="--toggle">Menu</helix-headless-button> <helix-headless-drawer id="nav">…</helix-headless-drawer> ''' */
9502
9489
  "helix-headless-drawer": DefineCustomElement<
9503
9490
  HelixHeadlessDrawer,
9504
9491
  HelixHeadlessDrawerVueProps,
@@ -9552,7 +9539,7 @@ export interface WcToolkitVueGlobalComponents {
9552
9539
  HelixHeadlessFilterOperatorVueProps,
9553
9540
  HelixHeadlessFilterOperatorVueEvents
9554
9541
  >;
9555
- /** **The tokens are the consumer's own elements, slotted.** What a filter narrows by belongs to the consumer's model rather than to this element: a facet with a prefix, a saved query, a range. So they are slotted rather than rendered from a list of strings, and removing one is a request this element makes rather than a change it applies. Combobox is the other way round, and that is the difference between the two: its tokens are a view of a selection it owns, drawn from options it was handed. **'value' is the text being typed, not the tokens**, which is what makes this a field a consumer can listen to. Every keystroke announces 'input' with the text on the element, so a table narrows as the reader types. The tokens need no reporting back, being markup the consumer already holds. Backspace on an empty field asks the last token to go, through the same 'helix-dismiss' its own remove control fires, so a consumer who handled the pointer has already handled the keyboard. **It reads what was declared, and nothing that was not.** Write 'FilterField's (usually inside the 'FilterMenu' slotted into 'start', so the picker and the text work off one set), and Enter reads the box against them: 'disposition:refunded,settled' and '-disposition:refunded' announce 'helix-facet', exactly as ticking those values in the picker would, and the text they were read from goes. Everything else stays where it was typed, so 'refund tuesday disposition:settled' is a filter and a search at once. 'grammar.ts' carries the whole rule and is worth reading before relying on it; the short version is that Helix owns the punctuation and the consumer owns every word in it. A field with no 'FilterField' in it parses nothing, which is the behavior this had before it could. **A field whose values cannot be listed belongs here rather than in the picker.** 'assignee:ada' is a filter and nobody wants to enumerate every name in the company, but a menu page for it would have nothing on it to press. Written directly inside this element it is read by the grammar and never offered as a page: unslotted, so nothing draws it, which is the same trick 'FilterField' already plays on its own children. **It can suggest what to type next, and deciding what to suggest is still the consumer's.** Slot 'helix-option' elements into 'suggestions' and the field shows them, moves through them with the arrows, and lets Enter press one; the option fires its own 'helix-select' and the consumer decides what choosing meant. Keys before a colon and values after it are the same panel with different contents, and 'readFilterText' is exported for a consumer narrowing that panel against what a reader has half typed. **The panel opens when there is something in it and closes when there is not**, rather than on a choice. A reader who picks a key wants its values next, and closing on the choice would shut the panel between two renders. Use 'selectionStart' and 'setSelectionRange' to write a completion back and put the caret after it, or the next parse reads the wrong term. **Three things here have three different owners, and only one of them is a controlled property.** 'value' is the text, and it is uncontrolled by default: the reader types, the element applies it, and 'input' says so. **Writing 'value' does not take that over.** It is a seed and a correction, so a consumer who sets it and then expects the field to hold still will watch the next keystroke overwrite them. Ownership is taken by refusing 'helix-before-change' and writing the value you want, which is the same shape every field in this library uses and is worth saying out loud here because the property looks like React's. 'default-value' seeds the field without claiming anything. 'open' is the suggestions panel, and it is the ordinary controlled pair: refuse 'helix-before-open' or 'helix-before-close' to take the decision, and 'default-open' to seed it. The tokens are neither, because they are not state. They are the consumer's own elements in a slot, so there is nothing for this to own and nothing to report back: a token goes when the consumer removes it from their markup, having been asked by 'helix-dismiss'. **A 'FilterChip' naming a declared field is asked differently**, and it has to be: the picker holds what is ticked, so a chip that removed itself without telling it left the value ticked in a list nobody could see was wrong. That dismissal is answered as the field being filtered by nothing, so it arrives as 'helix-facet' like every other change and the chip goes because the filter went. */
9542
+ /** **The tokens are the consumer's own elements, slotted.** What a filter narrows by belongs to the consumer's model rather than to this element: a facet with a prefix, a saved query, a range. So they are slotted rather than rendered from a list of strings, and removing one is a request this element makes rather than a change it applies. Combobox is the other way round, and that is the difference between the two: its tokens are a view of a selection it owns, drawn from options it was handed. **'value' is the text being typed, not the tokens**, which is what makes this a field a consumer can listen to. Every keystroke announces 'input' with the text on the element, so a table narrows as the reader types. The tokens need no reporting back, being markup the consumer already holds. Backspace on an empty field asks the last token to go, through the same 'helix-dismiss' its own remove control fires, so a consumer who handled the pointer has already handled the keyboard. **It reads what was declared, and nothing that was not.** Write 'FilterField's (usually inside the 'FilterMenu' slotted into 'start', so the picker and the text work off one set), and Enter reads the box against them: 'disposition:refunded,settled' and '-disposition:refunded' announce 'helix-facet', exactly as ticking those values in the picker would, and the text they were read from goes. Everything else stays where it was typed, so 'refund tuesday disposition:settled' is a filter and a search at once. 'grammar.ts' carries the whole rule and is worth reading before relying on it; the short version is that Helix owns the punctuation and the consumer owns every word in it. A field with no 'FilterField' in it parses nothing, which is the behavior this had before it could. **A field whose values cannot be listed belongs here rather than in the picker.** 'assignee:ada' is a filter and nobody wants to enumerate every name in the company, but a menu page for it would have nothing on it to press. Written directly inside this element it is read by the grammar and never offered as a page: unslotted, so nothing draws it, which is the same trick 'FilterField' already plays on its own children. **It can suggest what to type next, and deciding what to suggest is still the consumer's.** Slot options into 'suggestions' and the field shows them, moves through them with the arrows, and lets Enter press one; the option fires its own 'helix-select' and the consumer decides what choosing meant. Keys before a colon and values after it are the same panel with different contents, and 'readFilterText' is exported for a consumer narrowing that panel against what a reader has half typed. **The panel opens when there is something in it and closes when there is not**, rather than on a choice. A reader who picks a key wants its values next, and closing on the choice would shut the panel between two renders. Use 'selectionStart' and 'setSelectionRange' to write a completion back and put the caret after it, or the next parse reads the wrong term. **Three things here have three different owners, and only one of them is a controlled property.** 'value' is the text, and it is uncontrolled by default: the reader types, the element applies it, and 'input' says so. **Writing 'value' does not take that over.** It is a seed and a correction, so a consumer who sets it and then expects the field to hold still will watch the next keystroke overwrite them. Ownership is taken by refusing 'helix-before-change' and writing the value you want, which is the same shape every field in this library uses and is worth saying out loud here because the property looks like React's. 'default-value' seeds the field without claiming anything. 'open' is the suggestions panel, and it is the ordinary controlled pair: refuse 'helix-before-open' or 'helix-before-close' to take the decision, and 'default-open' to seed it. The tokens are neither, because they are not state. They are the consumer's own elements in a slot, so there is nothing for this to own and nothing to report back: a token goes when the consumer removes it from their markup, having been asked by 'helix-dismiss'. **A 'FilterChip' naming a declared field is asked differently**, and it has to be: the picker holds what is ticked, so a chip that removed itself without telling it left the value ticked in a list nobody could see was wrong. That dismissal is answered as the field being filtered by nothing, so it arrives as 'helix-facet' like every other change and the chip goes because the filter went. */
9556
9543
  "helix-headless-filter-input": DefineCustomElement<
9557
9544
  HelixHeadlessFilterInput,
9558
9545
  HelixHeadlessFilterInputVueProps,
@@ -9672,7 +9659,7 @@ export interface WcToolkitVueGlobalComponents {
9672
9659
  HelixHeadlessNotificationGroupVueProps,
9673
9660
  HelixHeadlessNotificationGroupVueEvents
9674
9661
  >;
9675
- /** A notification is a toast that did not go away. 'helix-toast' is deliberately the opposite of this: a live region whose items carry a 'duration' and whose root never creates or destroys anything. What makes this its own family is the state each item carries rather than the arrangement it sits in: read and unread, a timestamp that has to stay correct, and an action a reader can take later. **The row is a label, a caption under it, and one trailing column that holds either the time or the controls.** A feed is scanned rather than read, so the thing that happened gets the first line on its own and everything qualifying it goes under. The time and the controls occupy the same place because a reader wants exactly one of them at a time: the time while they are scanning, and what they can do about it once they have stopped on a row. **The timestamp is 'helix-format-date'**, which is where the reading, the '<time datetime>' and the shared timer now live. It was implemented here, and a component that formats a date is not a fact about notifications: Chat wanted the same thing and had its own copy of half of it. **Read state is reported, not invented.** Marking something read is usually a round trip, and a component that flips its own state and then hears the request failed has told the reader something untrue. 'helix-read' is cancelable, and a 'read' set by the consumer makes this element defer entirely. */
9662
+ /** A notification is a toast that did not go away. 'Toast' is deliberately the opposite of this: a live region whose items carry a 'duration' and whose root never creates or destroys anything. What makes this its own family is the state each item carries rather than the arrangement it sits in: read and unread, a timestamp that has to stay correct, and an action a reader can take later. **The row is a label, a caption under it, and one trailing column that holds either the time or the controls.** A feed is scanned rather than read, so the thing that happened gets the first line on its own and everything qualifying it goes under. The time and the controls occupy the same place because a reader wants exactly one of them at a time: the time while they are scanning, and what they can do about it once they have stopped on a row. **The timestamp is 'FormatDate'**, which is where the reading, the '<time datetime>' and the shared timer now live. It was implemented here, and a component that formats a date is not a fact about notifications: Chat wanted the same thing and had its own copy of half of it. **Read state is reported, not invented.** Marking something read is usually a round trip, and a component that flips its own state and then hears the request failed has told the reader something untrue. 'helix-read' is cancelable, and a 'read' set by the consumer makes this element defer entirely. */
9676
9663
  "helix-headless-notification": DefineCustomElement<
9677
9664
  HelixHeadlessNotification,
9678
9665
  HelixHeadlessNotificationVueProps,
@@ -9714,7 +9701,7 @@ export interface WcToolkitVueGlobalComponents {
9714
9701
  HelixHeadlessOutlineVueProps,
9715
9702
  HelixHeadlessOutlineVueEvents
9716
9703
  >;
9717
- /** **The component is the truncation.** Given a page and a total it works out which numbers to show and where the runs break, so this is data-driven rather than composed: '<helix-pagination page="4" pages="12">' rather than twelve slotted children a consumer keeps in step with their own query. **The width does not change as you page.** The run around the current page is 'siblings' either side, and grows to absorb a gap slot at a boundary, so the control holds the same number of slots from the first page to the last. Anything that lets the count vary moves the buttons under the pointer between one click and the next. **A gap is only drawn where it hides more than one page, and a gap is a control.** It goes to the middle of the run it stands over, which is the binary-search step: any page in a set of any size is a handful of presses. **'href' is what makes these links.** Set it and every page renders an '<a>' with '{page}' filled in, so the output is crawlable, a middle click opens a tab, and the address bar is the state. Left unset they are buttons, which is right for a table paging in place. Either way the click announces 'helix-navigate' first, and 'preventDefault()' stops the navigation as well as the change, which is how a router takes over. **'helix-navigate' and not 'helix-change'.** Moving to page four chooses nothing; it moves the view over a result that has not changed. **The count and the page-size control are their own elements.** 'Pagination.Summary' and 'Pagination.Size' sit beside this one, because a slot can only offer one place: at one end of one row, in one order. */
9704
+ /** **The component is the truncation.** Given a page and a total it works out which numbers to show and where the runs break, so this is data-driven rather than composed: '<helix-headless-pagination page="4" pages="12">' rather than twelve slotted children a consumer keeps in step with their own query. **The width does not change as you page.** The run around the current page is 'siblings' either side, and grows to absorb a gap slot at a boundary, so the control holds the same number of slots from the first page to the last. Anything that lets the count vary moves the buttons under the pointer between one click and the next. **A gap is only drawn where it hides more than one page, and a gap is a control.** It goes to the middle of the run it stands over, which is the binary-search step: any page in a set of any size is a handful of presses. **'href' is what makes these links.** Set it and every page renders an '<a>' with '{page}' filled in, so the output is crawlable, a middle click opens a tab, and the address bar is the state. Left unset they are buttons, which is right for a table paging in place. Either way the click announces 'helix-navigate' first, and 'preventDefault()' stops the navigation as well as the change, which is how a router takes over. **'helix-navigate' and not 'helix-change'.** Moving to page four chooses nothing; it moves the view over a result that has not changed. **The count and the page-size control are their own elements.** 'Pagination.Summary' and 'Pagination.Size' sit beside this one, because a slot can only offer one place: at one end of one row, in one order. */
9718
9705
  "helix-headless-pagination": DefineCustomElement<
9719
9706
  HelixHeadlessPagination,
9720
9707
  HelixHeadlessPaginationVueProps,
@@ -9828,7 +9815,7 @@ export interface WcToolkitVueGlobalComponents {
9828
9815
  HelixHeadlessSpeedDialItemVueProps,
9829
9816
  HelixHeadlessSpeedDialItemVueEvents
9830
9817
  >;
9831
- /** **A menu, and deliberately not a new one.** Its rows are commands, which is what 'role="menu"' and 'menuitem' exist for, so this takes them and takes the behavior with them: the arrow keys are 'KeyboardNavigationController', the panel is 'PopoverController', and open and closed is 'MixinControllerOpen'. 'Menu' is built from the same pieces. What is not shared is what actually differs: a dial has no submenus, no headers, no checkable rows and no long list to type ahead through, and shipping it as an appearance of 'Menu' would mean defining what a dial with a submenu in it does. **The trigger is a control the consumer slots**, and the floating action button is the usual one: 'helix-icon-button' with 'shape="circle"' and 'raised'. There is no 'helix-fab', because it would re-declare 'emphasis', 'tone', 'label' and a size around a control that already has all four. A round raised button is a shape, and where it sits is 'data-dock' in the base layer. **Nothing is reserved from the keyboard.** A menu that drills has to keep the horizontal pair for going in and coming back; a dial goes nowhere, so all four arrows move through the actions and a reader who guesses either axis is answered. That is the controller's own house position, and this is a component with no reason to argue with it. */
9818
+ /** **A menu, and deliberately not a new one.** Its rows are commands, which is what 'role="menu"' and 'menuitem' exist for, so this takes them and takes the behavior with them: the arrow keys are 'KeyboardNavigationController', the panel is 'PopoverController', and open and closed is 'MixinControllerOpen'. 'Menu' is built from the same pieces. What is not shared is what actually differs: a dial has no submenus, no headers, no checkable rows and no long list to type ahead through, and shipping it as an appearance of 'Menu' would mean defining what a dial with a submenu in it does. **The trigger is a control the consumer slots**, and the floating action button is the usual one: 'IconButton' with 'shape="circle"' and 'raised'. There is no 'helix-fab', because it would re-declare 'emphasis', 'tone', 'label' and a size around a control that already has all four. A round raised button is a shape, and where it sits is 'data-dock' in the base layer. **Nothing is reserved from the keyboard.** A menu that drills has to keep the horizontal pair for going in and coming back; a dial goes nowhere, so all four arrows move through the actions and a reader who guesses either axis is answered. That is the controller's own house position, and this is a component with no reason to argue with it. */
9832
9819
  "helix-headless-speed-dial": DefineCustomElement<
9833
9820
  HelixHeadlessSpeedDial,
9834
9821
  HelixHeadlessSpeedDialVueProps,
@@ -9858,7 +9845,7 @@ export interface WcToolkitVueGlobalComponents {
9858
9845
  HelixHeadlessStepsVueProps,
9859
9846
  HelixHeadlessStepsVueEvents
9860
9847
  >;
9861
- /** **The name is a button, and only the name.** The marker is 'aria-hidden' decoration, so wrapping it would add hit area and no meaning. It is 'helix-button' rather than a '<button>' this element resets: the hover wash, the focus ring and the disabled treatment are decisions the button carries. **It says nothing about where a reader may go.** Every step is pressable and announces itself with 'helix-select'; refusing the ones ahead is 'disabled', which the consumer sets, because only they know whether a form can be skipped. **The marker is a slot whose fallback is the state.** A finished stage shows a check, the current one a target, one not yet reached an empty ring. Exactly one is rendered, chosen from the step's own two booleans, rather than three with two hidden in CSS: the accessibility tree would otherwise carry marks that are not there. */
9848
+ /** **The name is a button, and only the name.** The marker is 'aria-hidden' decoration, so wrapping it would add hit area and no meaning. It is 'Button' rather than a '<button>' this element resets: the hover wash, the focus ring and the disabled treatment are decisions the button carries. **It says nothing about where a reader may go.** Every step is pressable and announces itself with 'helix-select'; refusing the ones ahead is 'disabled', which the consumer sets, because only they know whether a form can be skipped. **The marker is a slot whose fallback is the state.** A finished stage shows a check, the current one a target, one not yet reached an empty ring. Exactly one is rendered, chosen from the step's own two booleans, rather than three with two hidden in CSS: the accessibility tree would otherwise carry marks that are not there. */
9862
9849
  "helix-headless-step": DefineCustomElement<
9863
9850
  HelixHeadlessStep,
9864
9851
  HelixHeadlessStepVueProps,
@@ -9876,7 +9863,7 @@ export interface WcToolkitVueGlobalComponents {
9876
9863
  HelixHeadlessTableCellVueProps,
9877
9864
  HelixHeadlessTableCellVueEvents
9878
9865
  >;
9879
- /** **The column is the source of both its heading and its track.** Add one and the table has another track; remove one and it does not. That is what ties the two together, and a table-level track list on its own does not: a list that is accidentally the headings is invalid CSS a grid ignores in silence, drawing the whole table as one column. 'helix-table''s 'columns' is dealt out a track at a time against the columns declared under it, so a heading among the widths costs its own column a width and no more, and a list longer or shorter than the columns is trimmed or shared rather than being a second count of them. A column's own 'width' wins over the track in its place. **It is also where every per-column fact goes**, which is the reason 'helix-data-table' needs no column config object. 'field' names the key the cell reads, 'sortable' says a reader may reorder by it, 'align' says which edge the values line up against, and 'cell' takes a function for anything the field alone cannot express. The schema is markup and the data is a property: a schema is small, declarative, and something a reader should be able to see in the HTML, and data is large and windowed. **The same element serves both tables**, the markup one and the data one. It is identified by a flag rather than by 'instanceof', so a 'helix-table-column' works inside either without the two roots sharing anything else. **It generates no box of its own**, the same as a row: the heading is a grid item of the table, so it lines up with the cells under it rather than sitting in a wrapper that has to be kept the same width. **'hidden' takes the column out of the grid**, its heading and its track both, so the columns after it keep their own widths and every row keeps its cells under their headings. 'hidden="until-found"' keeps its track, the heading being left drawn, as every Helix element leaves one with that value. 'helix-data-table' draws the cells, so it leaves out the ones under a hidden column. A 'helix-table''s cells are markup the consumer wrote, so hide them with the column, as removing a column means removing its cells: a row with a cell more than the table has tracks wraps into the next. **A heading that does something holds a control that does it.** The host is the column header, and a header is not focusable, so a sortable heading is a '<button>' inside it: the pattern for a sortable table, and the only way a reader on a keyboard reaches the sort at all. A column a reader may resize carries a 'separator' on its end edge, moved by dragging it or with the arrow keys, and a column in a table that lets a reader reorder its columns carries a grip the table moves. */
9866
+ /** **The column is the source of both its heading and its track.** Add one and the table has another track; remove one and it does not. That is what ties the two together, and a table-level track list on its own does not: a list that is accidentally the headings is invalid CSS a grid ignores in silence, drawing the whole table as one column. 'Table''s 'columns' is dealt out a track at a time against the columns declared under it, so a heading among the widths costs its own column a width and no more, and a list longer or shorter than the columns is trimmed or shared rather than being a second count of them. A column's own 'width' wins over the track in its place. **It is also where every per-column fact goes**, which is the reason 'DataTable' needs no column config object. 'field' names the key the cell reads, 'sortable' says a reader may reorder by it, 'align' says which edge the values line up against, and 'cell' takes a function for anything the field alone cannot express. The schema is markup and the data is a property: a schema is small, declarative, and something a reader should be able to see in the HTML, and data is large and windowed. **The same element serves both tables**, the markup one and the data one. It is identified by a flag rather than by 'instanceof', so a 'TableColumn' works inside either without the two roots sharing anything else. **It generates no box of its own**, the same as a row: the heading is a grid item of the table, so it lines up with the cells under it rather than sitting in a wrapper that has to be kept the same width. **'hidden' takes the column out of the grid**, its heading and its track both, so the columns after it keep their own widths and every row keeps its cells under their headings. 'hidden="until-found"' keeps its track, the heading being left drawn, as every Helix element leaves one with that value. 'DataTable' draws the cells, so it leaves out the ones under a hidden column. A 'Table''s cells are markup the consumer wrote, so hide them with the column, as removing a column means removing its cells: a row with a cell more than the table has tracks wraps into the next. **A heading that does something holds a control that does it.** The host is the column header, and a header is not focusable, so a sortable heading is a '<button>' inside it: the pattern for a sortable table, and the only way a reader on a keyboard reaches the sort at all. A column a reader may resize carries a 'separator' on its end edge, moved by dragging it or with the arrow keys, and a column in a table that lets a reader reorder its columns carries a grip the table moves. */
9880
9867
  "helix-headless-table-column": DefineCustomElement<
9881
9868
  HelixHeadlessTableColumn,
9882
9869
  HelixHeadlessTableColumnVueProps,
@@ -9888,7 +9875,7 @@ export interface WcToolkitVueGlobalComponents {
9888
9875
  HelixHeadlessTableVueProps,
9889
9876
  HelixHeadlessTableVueEvents
9890
9877
  >;
9891
- /** 'display: contents' in the styled tier, so the row's cells become items of the table's own grid and every column lines up across every row. The row still exists as an element, which is what a '<table>' gives away when its cells are laid out by the table algorithm. */
9878
+ /** The row renders its cells straight through and lays out none of them, so a sheet can take them into the table's own grid and every column lines up across every row. The row still exists as an element, which is what a '<table>' gives away when its cells are laid out by the table algorithm. */
9892
9879
  "helix-headless-table-row": DefineCustomElement<
9893
9880
  HelixHeadlessTableRow,
9894
9881
  HelixHeadlessTableRowVueProps,
@@ -9924,13 +9911,13 @@ export interface WcToolkitVueGlobalComponents {
9924
9911
  HelixHeadlessTextareaVueProps,
9925
9912
  HelixHeadlessTextareaVueEvents
9926
9913
  >;
9927
- /** **The list is 'helix-time-picker', not a second one written here.** It is worth having on its own, flat in a settings pane with nothing to open, and this element is the field, the overlay and the form. Exactly the arrangement Input Date has with 'helix-date-picker' and Color Input with 'helix-color-picker'. **Typed as well as picked, and that is the division the list depends on.** A list at a step offers the times a product actually has, and the field is how a reader says '09:07'. Neither is a worse version of the other: without the field a step is a cage, and without the list every common time is typed out. **The value is 'HH:mm' on a twenty-four hour clock, always**, because that is what a form submits, what 'min' and 'max' compare against, and what sorts as a string. What the field *shows* is the reader's own convention while it is idle, and the value itself once the caret is in it: the same separation Input Date draws, and for the same reason, which is that '2:30 PM' cannot be typed back and 'Intl' has no parser to make it so. */
9914
+ /** **The list is 'TimePicker', not a second one written here.** It is worth having on its own, flat in a settings pane with nothing to open, and this element is the field, the overlay and the form. Exactly the arrangement Input Date has with 'DatePicker' and Color Input with 'ColorPicker'. **Typed as well as picked, and that is the division the list depends on.** A list at a step offers the times a product actually has, and the field is how a reader says '09:07'. Neither is a worse version of the other: without the field a step is a cage, and without the list every common time is typed out. **The value is 'HH:mm' on a twenty-four hour clock, always**, because that is what a form submits, what 'min' and 'max' compare against, and what sorts as a string. What the field *shows* is the reader's own convention while it is idle, and the value itself once the caret is in it: the same separation Input Date draws, and for the same reason, which is that '2:30 PM' cannot be typed back and 'Intl' has no parser to make it so. */
9928
9915
  "helix-headless-time-input": DefineCustomElement<
9929
9916
  HelixHeadlessTimeInput,
9930
9917
  HelixHeadlessTimeInputVueProps,
9931
9918
  HelixHeadlessTimeInputVueEvents
9932
9919
  >;
9933
- /** **A list rather than three wheels**, and the reason is what a list already is. 'helix-listbox' brings the keyboard, the typeahead, the scroll into view and the announcement of a set of options, and a time at a step is a set of options. Three little wheels for hours, minutes and a meridiem are three controls to build, three to test, and a tab stop each for something a reader answers once. **A step is what makes it a list at all.** Fifteen minutes is ninety-six rows, which a reader scrolls or types into; one minute is one thousand four hundred and forty, which is a listbox in name only. So the list is for the times a product actually offers, and arbitrary times are the field's job in Input Time, the same division Date Input draws between typing a date and using the calendar. **The value is 'HH:mm' on a twenty-four hour clock, always.** That is what a form submits and what 'min' and 'max' compare against, and it sorts as a string, which is the whole reason the shape is that one. What each row *says* is the reader's own convention, from 'Intl'. **The chosen row is marked in the markup, not worked out on upgrade.** The listbox is handed the answer as '.value', and lit-ssr serializes no property binding, so a served 'value="09:30"' shipped ninety-six rows with nothing on any of them saying which one it was: the mark arrived when the listbox upgraded and ran 'place'. So each option is given 'selected' as well, which is an attribute binding and does serve, and which the listbox then agrees with rather than fights, 'place' writing the same answer from the same value. 'selected' is the declaration a consumer writes on 'Option' anywhere else in the library, and Date Picker expresses its own choice as markup for the same reason: a picker whose answer is invisible until a script runs is a picker whose answer is not served at all. Both readings do it, the list and the wheels, a wheel being a listbox like the list is. */
9920
+ /** **A list rather than three wheels**, and the reason is what a list already is. 'Listbox' brings the keyboard, the typeahead, the scroll into view and the announcement of a set of options, and a time at a step is a set of options. Three little wheels for hours, minutes and a meridiem are three controls to build, three to test, and a tab stop each for something a reader answers once. **A step is what makes it a list at all.** Fifteen minutes is ninety-six rows, which a reader scrolls or types into; one minute is one thousand four hundred and forty, which is a listbox in name only. So the list is for the times a product actually offers, and arbitrary times are the field's job in Input Time, the same division Date Input draws between typing a date and using the calendar. **The value is 'HH:mm' on a twenty-four hour clock, always.** That is what a form submits and what 'min' and 'max' compare against, and it sorts as a string, which is the whole reason the shape is that one. What each row *says* is the reader's own convention, from 'Intl'. **The chosen row is marked in the markup, not worked out on upgrade.** The listbox is handed the answer as '.value', and lit-ssr serializes no property binding, so a served 'value="09:30"' shipped ninety-six rows with nothing on any of them saying which one it was: the mark arrived when the listbox upgraded and ran 'place'. So each option is given 'selected' as well, which is an attribute binding and does serve, and which the listbox then agrees with rather than fights, 'place' writing the same answer from the same value. 'selected' is the declaration a consumer writes on 'Option' anywhere else in the library, and Date Picker expresses its own choice as markup for the same reason: a picker whose answer is invisible until a script runs is a picker whose answer is not served at all. Both readings do it, the list and the wheels, a wheel being a listbox like the list is. */
9934
9921
  "helix-headless-time-picker": DefineCustomElement<
9935
9922
  HelixHeadlessTimePicker,
9936
9923
  HelixHeadlessTimePickerVueProps,
@@ -9978,7 +9965,7 @@ export interface WcToolkitVueGlobalComponents {
9978
9965
  HelixHeadlessToolbarVueProps,
9979
9966
  HelixHeadlessToolbarVueEvents
9980
9967
  >;
9981
- /** The trigger is slotted and stays the consumer's own element. The bubble is rendered here, in the top layer through the popover API, so it clears any ancestor with 'overflow: hidden' without a 'z-index' anywhere. Position comes from 'FloatingController', which flips to another side when the preferred one does not fit. **Two forms, and they are not equivalent for a screen reader.** Wrapping is the convenience form and is right where the bubble decorates a control that already says what it is: nothing here can describe a slotted trigger, an IDREF being unable to cross a shadow boundary. 'for' is the form that works. The tooltip sits *beside* the trigger in the consumer's own tree and names it by id, so an IDREF between them is legal in the ordinary way: '''html <helix-button id="save" aria-describedby="save-tip">Save</helix-button> <helix-tooltip id="save-tip" for="save" content="Save your work"></helix-tooltip> ''' The reference points at *this host*, not at the bubble in its shadow root: the description is computed from the flat tree, which descends into shadow content on its own. **The consumer writes that 'aria-describedby', and nothing here writes it for them.** Setting it at runtime is a hydration mismatch React will not patch up. 'for' audits itself on first open and warns once where it is missing. It shows on hover and on focus, and hides on leave, on blur, on Escape, and once the trigger has been activated: the hint is spent when the control has been used. */
9968
+ /** The trigger is slotted and stays the consumer's own element. The bubble is rendered here, in the top layer through the popover API, so it clears any ancestor with 'overflow: hidden' without a 'z-index' anywhere. Position comes from 'FloatingController', which flips to another side when the preferred one does not fit. **Two forms, and they are not equivalent for a screen reader.** Wrapping is the convenience form and is right where the bubble decorates a control that already says what it is: nothing here can describe a slotted trigger, an IDREF being unable to cross a shadow boundary. 'for' is the form that works. The tooltip sits *beside* the trigger in the consumer's own tree and names it by id, so an IDREF between them is legal in the ordinary way: '''html <helix-headless-button id="save" aria-describedby="save-tip">Save</helix-headless-button> <helix-headless-tooltip id="save-tip" for="save" content="Save your work"></helix-headless-tooltip> ''' The reference points at *this host*, not at the bubble in its shadow root: the description is computed from the flat tree, which descends into shadow content on its own. **The consumer writes that 'aria-describedby', and nothing here writes it for them.** Setting it at runtime is a hydration mismatch React will not patch up. 'for' audits itself on first open and warns once where it is missing. It shows on hover and on focus, and hides on leave, on blur, on Escape, and once the trigger has been activated: the hint is spent when the control has been used. */
9982
9969
  "helix-headless-tooltip": DefineCustomElement<
9983
9970
  HelixHeadlessTooltip,
9984
9971
  HelixHeadlessTooltipVueProps,
@@ -9990,7 +9977,7 @@ export interface WcToolkitVueGlobalComponents {
9990
9977
  HelixHeadlessTourVueProps,
9991
9978
  HelixHeadlessTourVueEvents
9992
9979
  >;
9993
- /** A stop names a target with 'for' and holds whatever the consumer puts in it. It owns no content of its own, which is the whole shape of this family: the tour abstracts the three things that are genuinely hard, and the words are the consumer's. What it does own: - **Where the panel goes.** Anchored to the target through the same floating pass every other overlay here uses. - **That it is on top.** A popover, so it is in the top layer. A tour points at things inside dialogs, inside scrollers, inside anything with a stacking context, and a panel in the ordinary flow loses to all three. - **When it shows.** Which is 'current', and which the root decides. What it does not own is the heading, the paragraph, the picture and the layout. Slot a 'helix-card', or a heading and a line of prose, or anything else. Fixed 'title' and 'body' parts would be a component deciding what a tour is allowed to say. **The buttons are slot fallback, so the common case costs nothing and the uncommon one is possible.** Write nothing and get Back, Next and Skip already wired. Slot 'actions' and they are yours, driven by 'next()', 'back()' and 'skip()' on the root, which are public for exactly that. **'for' is an id, the same as 'Tooltip''s.** The target is elsewhere on the page, and an id is the one reference a consumer can write in markup without holding an element. Resolved against the root node, so a stop inside a shadow tree points at a target in that tree. */
9980
+ /** A stop names a target with 'for' and holds whatever the consumer puts in it. It owns no content of its own, which is the whole shape of this family: the tour abstracts the three things that are genuinely hard, and the words are the consumer's. What it does own: - **Where the panel goes.** Anchored to the target through the same floating pass every other overlay here uses. - **That it is on top.** A popover, so it is in the top layer. A tour points at things inside dialogs, inside scrollers, inside anything with a stacking context, and a panel in the ordinary flow loses to all three. - **When it shows.** Which is 'current', and which the root decides. What it does not own is the heading, the paragraph, the picture and the layout. Slot a 'Card', or a heading and a line of prose, or anything else. Fixed 'title' and 'body' parts would be a component deciding what a tour is allowed to say. **The buttons are slot fallback, so the common case costs nothing and the uncommon one is possible.** Write nothing and get Back, Next and Skip already wired. Slot 'actions' and they are yours, driven by 'next()', 'back()' and 'skip()' on the root, which are public for exactly that. **'for' is an id, the same as 'Tooltip''s.** The target is elsewhere on the page, and an id is the one reference a consumer can write in markup without holding an element. Resolved against the root node, so a stop inside a shadow tree points at a target in that tree. */
9994
9981
  "helix-headless-tour-stop": DefineCustomElement<
9995
9982
  HelixHeadlessTourStop,
9996
9983
  HelixHeadlessTourStopVueProps,