@fusion.dev/helix-headless 0.147.0 → 0.148.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/custom-elements.json +4512 -790
  2. package/dist/accordion/item/accordion-item.d.ts +5 -2
  3. package/dist/accordion/item/accordion-item.js +11 -7
  4. package/dist/accordion/root/accordion-root.js +4 -6
  5. package/dist/announcement/root/announcement-root.d.ts +56 -5
  6. package/dist/announcement/root/announcement-root.js +124 -21
  7. package/dist/area-chart/root/area-chart-root.js +3 -4
  8. package/dist/badge/count.d.ts +14 -0
  9. package/dist/badge/count.js +20 -0
  10. package/dist/badge/root/badge-root.js +8 -22
  11. package/dist/blockquote/root/blockquote-root.d.ts +66 -8
  12. package/dist/blockquote/root/blockquote-root.js +85 -8
  13. package/dist/breadcrumbs/breadcrumb/breadcrumb.js +2 -2
  14. package/dist/button-group/arrows.d.ts +14 -0
  15. package/dist/button-group/arrows.js +10 -0
  16. package/dist/button-group/root/button-group-root.d.ts +141 -3
  17. package/dist/button-group/root/button-group-root.js +142 -2
  18. package/dist/canvas/edge-pan.d.ts +61 -0
  19. package/dist/canvas/edge-pan.js +63 -0
  20. package/dist/canvas/node/canvas-node.d.ts +12 -2
  21. package/dist/canvas/node/canvas-node.js +6 -2
  22. package/dist/canvas/root/canvas-document.d.ts +10 -0
  23. package/dist/canvas/root/canvas-document.js +1 -0
  24. package/dist/canvas/root/canvas-root.d.ts +107 -5
  25. package/dist/canvas/root/canvas-root.js +140 -36
  26. package/dist/canvas/snap.d.ts +42 -0
  27. package/dist/canvas/snap.js +32 -0
  28. package/dist/carousel/root/carousel-root.d.ts +4 -3
  29. package/dist/carousel/root/carousel-root.js +2 -6
  30. package/dist/chat/root/chat-root.d.ts +13 -3
  31. package/dist/chat/root/chat-root.js +2 -6
  32. package/dist/checkbox-group/root/checkbox-group-root.d.ts +13 -0
  33. package/dist/checkbox-group/root/checkbox-group-root.js +18 -10
  34. package/dist/checkbox-group/select-all.d.ts +11 -0
  35. package/dist/checkbox-group/select-all.js +5 -0
  36. package/dist/code-block/root/code-block-root.d.ts +8 -6
  37. package/dist/code-block/root/code-block-root.js +4 -3
  38. package/dist/color-picker/root/color-picker-root.js +6 -12
  39. package/dist/color-picker/wheel.d.ts +11 -0
  40. package/dist/color-picker/wheel.js +9 -0
  41. package/dist/combobox/root/combobox-root.d.ts +70 -11
  42. package/dist/combobox/root/combobox-root.js +68 -18
  43. package/dist/command/root/command-root.d.ts +4 -3
  44. package/dist/data-table/root/data-table-root.js +17 -44
  45. package/dist/description-list/item/description-list-item.d.ts +4 -0
  46. package/dist/description-list/item/description-list-item.js +7 -1
  47. package/dist/divider/root/divider-root.d.ts +45 -16
  48. package/dist/divider/root/divider-root.js +28 -4
  49. package/dist/drilldown/item/drilldown-item.js +3 -4
  50. package/dist/element-events.generated.js +1 -0
  51. package/dist/empty/root/empty-root.d.ts +17 -3
  52. package/dist/empty/root/empty-root.js +29 -5
  53. package/dist/file-input/root/file-input-root.js +3 -4
  54. package/dist/file-input/status.js +2 -1
  55. package/dist/filter-input/chip/filter-chip.js +2 -3
  56. package/dist/format-date/fields.d.ts +20 -0
  57. package/dist/format-date/fields.js +14 -0
  58. package/dist/format-date/options.d.ts +2 -1
  59. package/dist/format-date/options.js +9 -38
  60. package/dist/format-date/root/format-date-root.d.ts +35 -3
  61. package/dist/format-date/root/format-date-root.js +24 -32
  62. package/dist/graph/root/graph-root.d.ts +23 -5
  63. package/dist/graph/root/graph-root.js +17 -20
  64. package/dist/heatmap/root/heatmap-root.d.ts +12 -0
  65. package/dist/heatmap/root/heatmap-root.js +26 -11
  66. package/dist/image/root/image-root.d.ts +11 -0
  67. package/dist/kbd/root/kbd-root.js +1 -2
  68. package/dist/legend/root/legend-root.js +4 -17
  69. package/dist/list/root/list-root.js +8 -22
  70. package/dist/listbox/root/listbox-root.d.ts +119 -24
  71. package/dist/listbox/root/listbox-root.js +130 -132
  72. package/dist/map/marker/map-marker.d.ts +2 -1
  73. package/dist/map/root/map-root.d.ts +40 -2
  74. package/dist/map/root/map-root.js +64 -23
  75. package/dist/megamenu/root/megamenu-root.js +4 -11
  76. package/dist/menu/root/menu-root.d.ts +2 -2
  77. package/dist/navigation/root/navigation-root.js +5 -8
  78. package/dist/notifications/group/notification-group.d.ts +8 -1
  79. package/dist/notifications/group/notification-group.js +12 -6
  80. package/dist/notifications/notification/notification.d.ts +12 -1
  81. package/dist/notifications/notification/notification.js +3 -1
  82. package/dist/notifications/root/notifications-root.d.ts +41 -5
  83. package/dist/notifications/root/notifications-root.js +27 -7
  84. package/dist/object-inspector/root/object-inspector-root.d.ts +5 -1
  85. package/dist/object-inspector/root/object-inspector-root.js +21 -11
  86. package/dist/pagination/size/pagination-size.d.ts +1 -0
  87. package/dist/pagination/size/pagination-size.js +1 -1
  88. package/dist/pin-input/code.d.ts +23 -0
  89. package/dist/pin-input/code.js +25 -0
  90. package/dist/pin-input/root/pin-input-root.js +9 -23
  91. package/dist/qr-code/root/qr-code-root.d.ts +14 -3
  92. package/dist/qr-code/root/qr-code-root.js +19 -5
  93. package/dist/scatter-chart/measures.d.ts +22 -0
  94. package/dist/scatter-chart/measures.js +11 -0
  95. package/dist/scatter-chart/root/scatter-chart-root.d.ts +2 -6
  96. package/dist/scatter-chart/root/scatter-chart-root.js +6 -19
  97. package/dist/select/root/select-root.d.ts +56 -8
  98. package/dist/select/root/select-root.js +33 -9
  99. package/dist/speed-dial/group/speed-dial-group.d.ts +48 -0
  100. package/dist/speed-dial/group/speed-dial-group.js +43 -0
  101. package/dist/speed-dial/index.d.ts +1 -0
  102. package/dist/speed-dial/index.js +1 -0
  103. package/dist/speed-dial/item/speed-dial-item.d.ts +26 -1
  104. package/dist/speed-dial/item/speed-dial-item.js +41 -3
  105. package/dist/speed-dial/long-press.d.ts +50 -0
  106. package/dist/speed-dial/long-press.js +48 -0
  107. package/dist/speed-dial/root/speed-dial-root.d.ts +80 -1
  108. package/dist/speed-dial/root/speed-dial-root.js +114 -5
  109. package/dist/splitter/root/splitter-root.d.ts +7 -3
  110. package/dist/splitter/root/splitter-root.js +16 -3
  111. package/dist/table/cell/table-cell.d.ts +8 -1
  112. package/dist/table/cell/table-cell.js +6 -2
  113. package/dist/table/grid-controller.d.ts +117 -0
  114. package/dist/table/grid-controller.js +293 -0
  115. package/dist/table/root/table-root.d.ts +47 -3
  116. package/dist/table/root/table-root.js +81 -24
  117. package/dist/table/row/table-row.d.ts +13 -1
  118. package/dist/table/row/table-row.js +20 -6
  119. package/dist/tag/group/tag-group.js +6 -15
  120. package/dist/time-picker/root/time-picker-root.d.ts +1 -0
  121. package/dist/time-picker/root/time-picker-root.js +3 -0
  122. package/dist/toast/item/toast-item.d.ts +6 -3
  123. package/dist/toast/item/toast-item.js +1 -0
  124. package/dist/toast/root/toast-root.d.ts +13 -1
  125. package/dist/toast/root/toast-root.js +20 -14
  126. package/dist/toggle/group/toggle-group.js +3 -5
  127. package/dist/toolbar/root/toolbar-root.d.ts +31 -0
  128. package/dist/toolbar/root/toolbar-root.js +39 -8
  129. package/dist/tooltip/root/tooltip-root.js +1 -2
  130. package/dist/video/root/video-root.d.ts +11 -0
  131. package/dist/video/root/video-root.js +15 -1
  132. package/dist/virtual-list/root/virtual-list-root.js +6 -18
  133. package/lint.json +1 -1
  134. package/package.json +5 -5
  135. package/types/jsx.d.ts +2005 -266
  136. package/types/svelte.d.ts +1 -0
  137. package/types/vue.d.ts +338 -62
  138. package/dist/kbd/keys.d.ts +0 -29
  139. package/dist/kbd/keys.js +0 -52
  140. package/dist/tooltip/focus-target.d.ts +0 -6
  141. package/dist/tooltip/focus-target.js +0 -9
package/types/vue.d.ts CHANGED
@@ -129,6 +129,7 @@ import type {
129
129
  HelixHeadlessSkipLink,
130
130
  HelixHeadlessSlider,
131
131
  HelixHeadlessSparkline,
132
+ HelixHeadlessSpeedDialGroup,
132
133
  HelixHeadlessSpeedDialItem,
133
134
  HelixHeadlessSpeedDial,
134
135
  HelixHeadlessSplitter,
@@ -174,6 +175,7 @@ import type {
174
175
  ToggleEvent,
175
176
  HelixDismissEvent,
176
177
  HelixScrolledEvent,
178
+ HelixBeforeChangeEvent,
177
179
  HelixPressEvent,
178
180
  HelixBeforeMoveEvent,
179
181
  HelixBeforeReconnectEvent,
@@ -194,7 +196,6 @@ import type {
194
196
  HelixBeforePinEvent,
195
197
  HelixHistoryEvent,
196
198
  HelixPinEvent,
197
- HelixBeforeChangeEvent,
198
199
  HelixBeforeToggleEvent,
199
200
  HelixCopyEvent,
200
201
  HelixSampleEndEvent,
@@ -453,6 +454,22 @@ export type HelixHeadlessAnnouncementVueProps = {
453
454
  Read once when the announcement is first rendered, as `Toast` reads its
454
455
  own. The clock stops while the pointer or focus is on the announcement. */
455
456
  duration?: (HelixHeadlessAnnouncement["duration"]) | undefined;
457
+ /** The key that moves focus to the announcement's first control, and back
458
+ to where it was, written as keys joined by `+`, such as `F6` or `Alt+A`.
459
+
460
+ F6 by default, the key React Aria's regions answer to. Empty turns it
461
+ off. With several announcements, the first one in the page takes focus. */
462
+ hotkey?: (HelixHeadlessAnnouncement["hotkey"]) | undefined;
463
+ /** The name of the announcement's region, which screen readers list among
464
+ the page's landmarks. Translate it with the rest of your interface.
465
+
466
+ Empty leaves the announcement no region. */
467
+ label?: (HelixHeadlessAnnouncement["label"]) | undefined;
468
+ /** Whether the announcement waits its turn behind the queued announcements
469
+ before it in the same parent, showing when the last of them is removed.
470
+
471
+ Off by default, so every announcement on a page shows at once. */
472
+ queued?: (HelixHeadlessAnnouncement["queued"]) | undefined;
456
473
  /** The band's color.
457
474
 
458
475
  Paint only: unlike `Callout`, no value here draws a mark, changes the label,
@@ -915,8 +932,19 @@ legend hid is not counted. */
915
932
  export type HelixHeadlessBarChartVueEvents = {};
916
933
 
917
934
  export type HelixHeadlessBlockquoteVueProps = {
918
- /** The URL of the source the passage came from. */
935
+ /** Who said it, and where, as words, such as "Maria Lopez, operations
936
+ manager". The `attribution` slot replaces them, for markup such as a link.
937
+
938
+ Words are served with the figure they name, where a server cannot see a
939
+ slotted attribution. */
940
+ attribution?: (HelixHeadlessBlockquote["attribution"]) | undefined;
941
+ /** The URL of the source the passage came from. Who said it goes in
942
+ `attribution`: a `cite` with words in it warns once, with the runtime kind
943
+ `cite-not-url`. */
919
944
  cite?: (HelixHeadlessBlockquote["cite"]) | undefined;
945
+ /** Whether to draw an opening quotation mark before the passage, in the
946
+ element's language. Leave the marks out of the text. */
947
+ marks?: (HelixHeadlessBlockquote["marks"]) | undefined;
920
948
  };
921
949
 
922
950
  export type HelixHeadlessBlockquoteVueEvents = {};
@@ -980,6 +1008,15 @@ attribute would put the whole path into the markup twice. */
980
1008
 
981
1009
  export type HelixHeadlessBreadcrumbsVueEvents = {};
982
1010
 
1011
+ /** `HelixHeadlessButtonGroup` component event */
1012
+ export type HelixHeadlessButtonGroupElementEvent<E = Event> = TypedEvent<
1013
+ HelixHeadlessButtonGroup,
1014
+ E
1015
+ >;
1016
+ /** `helix-before-change` event type */
1017
+ export type HelixHeadlessButtonGroupHelixBeforeChangeElementEvent =
1018
+ HelixHeadlessButtonGroupElementEvent<HelixBeforeChangeEvent>;
1019
+
983
1020
  export type HelixHeadlessButtonGroupVueProps = {
984
1021
  /** The group's name, read by screen readers.
985
1022
 
@@ -1004,9 +1041,32 @@ buttons sharing edges as one shape, and a wrapped row carries the corners of
1004
1041
  a first row into a second. Stacked, the same three keep one shape and one
1005
1042
  column. */
1006
1043
  orientation?: (HelixHeadlessButtonGroup["orientation"]) | undefined;
1044
+ /** Whether the buttons stay pressed: `single` keeps one pressed at a time and
1045
+ `multiple` any number. Unset, they are action buttons, each its own tab
1046
+ stop, as before.
1047
+
1048
+ Optional, so the attribute is absent until a consumer writes it. */
1049
+ "selection-mode"?: (HelixHeadlessButtonGroup["selectionMode"]) | undefined;
1050
+ /** Whether the buttons stay pressed: `single` keeps one pressed at a time and
1051
+ `multiple` any number. Unset, they are action buttons, each its own tab
1052
+ stop, as before.
1053
+
1054
+ Optional, so the attribute is absent until a consumer writes it. */
1055
+ selectionMode?: (HelixHeadlessButtonGroup["selectionMode"]) | undefined;
1056
+ /** The values of the pressed buttons, comma separated, in a selection mode.
1057
+ A button's own `value` names it, so a value holds no comma.
1058
+
1059
+ The attribute is the seed, and a press changes the property, which does
1060
+ not reflect, as a native control's `value` does not. */
1061
+ value?: (HelixHeadlessButtonGroup["value"]) | undefined;
1007
1062
  };
1008
1063
 
1009
- export type HelixHeadlessButtonGroupVueEvents = {};
1064
+ export type HelixHeadlessButtonGroupVueEvents = {
1065
+ /** Fired after a press changes `value`, in a selection mode. */
1066
+ change: HelixHeadlessButtonGroupElementEvent;
1067
+ /** Fired before a press changes `value`, with the value it would leave in `detail.value`. Cancelable: call `preventDefault()` to keep the buttons as they are. */
1068
+ "helix-before-change": HelixHeadlessButtonGroupHelixBeforeChangeElementEvent;
1069
+ };
1010
1070
 
1011
1071
  /** `HelixHeadlessButton` component event */
1012
1072
  export type HelixHeadlessButtonElementEvent<E = Event> = TypedEvent<
@@ -1490,6 +1550,20 @@ as the list.
1490
1550
  The list is joined the way the page's language joins one, "Second and
1491
1551
  Third", rather than with a comma this component chose. */
1492
1552
  leadsToLabel?: (HelixHeadlessCanvas["leadsToLabel"]) | undefined;
1553
+ /** What screen readers hear after a key moves a card, with `{name}` for the
1554
+ card and `{x}` and `{y}` for where it now is, in the document's units.
1555
+
1556
+ **A move a reader cannot see has to be said.** Shift with an arrow moved
1557
+ the card and said nothing, so a reader moving one by keys could not tell
1558
+ whether it had moved, or how far. */
1559
+ "moved-label"?: (HelixHeadlessCanvas["movedLabel"]) | undefined;
1560
+ /** What screen readers hear after a key moves a card, with `{name}` for the
1561
+ card and `{x}` and `{y}` for where it now is, in the document's units.
1562
+
1563
+ **A move a reader cannot see has to be said.** Shift with an arrow moved
1564
+ the card and said nothing, so a reader moving one by keys could not tell
1565
+ whether it had moved, or how far. */
1566
+ movedLabel?: (HelixHeadlessCanvas["movedLabel"]) | undefined;
1493
1567
  /** The order the arrow keys and screen readers move through the cards:
1494
1568
  `spatial` or `edges`.
1495
1569
 
@@ -1530,6 +1604,14 @@ walk the cards. */
1530
1604
  /** The text announced when a connection's end is picked up, with `{from}` and
1531
1605
  `{to}`. */
1532
1606
  reconnectingLabel?: (HelixHeadlessCanvas["reconnectingLabel"]) | undefined;
1607
+ /** What screen readers hear after a key resizes a card, with `{name}` for the
1608
+ card and `{width}` and `{height}` for its new size, in the document's
1609
+ units. */
1610
+ "resized-label"?: (HelixHeadlessCanvas["resizedLabel"]) | undefined;
1611
+ /** What screen readers hear after a key resizes a card, with `{name}` for the
1612
+ card and `{width}` and `{height}` for its new size, in the document's
1613
+ units. */
1614
+ resizedLabel?: (HelixHeadlessCanvas["resizedLabel"]) | undefined;
1533
1615
  /** The names of the selected cards and connections, comma separated. Empty
1534
1616
  when nothing is selected.
1535
1617
 
@@ -1550,6 +1632,43 @@ on its board across cards and connections both, and may not hold a comma.
1550
1632
 
1551
1633
  Written to select from outside, and read to act on the selection. */
1552
1634
  selected?: (HelixHeadlessCanvas["selected"]) | undefined;
1635
+ /** What a selected card or connection adds to what screen readers hear on
1636
+ it, before its tone and its connections. Empty adds nothing.
1637
+
1638
+ A card is an article and a connection a button, and neither has a selected
1639
+ state for `aria-selected` to carry, so the state is said in words. */
1640
+ "selected-label"?: (HelixHeadlessCanvas["selectedLabel"]) | undefined;
1641
+ /** What a selected card or connection adds to what screen readers hear on
1642
+ it, before its tone and its connections. Empty adds nothing.
1643
+
1644
+ A card is an article and a connection a button, and neither has a selected
1645
+ state for `aria-selected` to carry, so the state is said in words. */
1646
+ selectedLabel?: (HelixHeadlessCanvas["selectedLabel"]) | undefined;
1647
+ /** What screen readers hear after the selection grows or shrinks, with
1648
+ `{count}` for how many cards and connections are selected: by Space, a
1649
+ click with Shift, Command or Control, Command or Control with A, a box
1650
+ drawn across the board, or Escape.
1651
+
1652
+ A selection of one made by arriving on a card or clicking it is not said,
1653
+ since the card is. */
1654
+ "selection-label"?: (HelixHeadlessCanvas["selectionLabel"]) | undefined;
1655
+ /** What screen readers hear after the selection grows or shrinks, with
1656
+ `{count}` for how many cards and connections are selected: by Space, a
1657
+ click with Shift, Command or Control, Command or Control with A, a box
1658
+ drawn across the board, or Escape.
1659
+
1660
+ A selection of one made by arriving on a card or clicking it is not said,
1661
+ since the card is. */
1662
+ selectionLabel?: (HelixHeadlessCanvas["selectionLabel"]) | undefined;
1663
+ /** Snaps the cards a reader moves or resizes to a multiple of this many of the
1664
+ document's units, such as `32` to land on the lines `grid` draws.
1665
+
1666
+ **A drag lets go on the nearest line and a key goes to the next one.**
1667
+ Shift with an arrow moves a card to the next line that way, rather than
1668
+ by its step of 16, and Alt with an arrow moves its bottom right corner
1669
+ the same way. A group moves with what it carries, so a card inside one
1670
+ keeps its place in it. Absent, cards land where they are let go. */
1671
+ snap?: (HelixHeadlessCanvas["snap"]) | undefined;
1553
1672
  /** The text announced when a connection is stopped before it is requested. */
1554
1673
  "stopped-label"?: (HelixHeadlessCanvas["stoppedLabel"]) | undefined;
1555
1674
  /** The text announced when a connection is stopped before it is requested. */
@@ -1572,6 +1691,12 @@ red is "blocked" on one board and "urgent" on the next. A reader who can
1572
1691
  see the board is told by the color; this is how a reader who cannot is
1573
1692
  told the same. A tone left out is not read. */
1574
1693
  toneLabels?: (HelixHeadlessCanvas["toneLabels"]) | undefined;
1694
+ /** What screen readers hear after a zoom button or key, with `{zoom}` for the
1695
+ zoom as a percentage, written the way the page's language writes one. */
1696
+ "zoomed-label"?: (HelixHeadlessCanvas["zoomedLabel"]) | undefined;
1697
+ /** What screen readers hear after a zoom button or key, with `{zoom}` for the
1698
+ zoom as a percentage, written the way the page's language writes one. */
1699
+ zoomedLabel?: (HelixHeadlessCanvas["zoomedLabel"]) | undefined;
1575
1700
  /** The hint shown when a surface waiting to be pressed is scrolled or
1576
1701
  swiped over, with `gestures="activate"`. Absent is the family's own. */
1577
1702
  "activate-hint-label"?: (HelixHeadlessCanvas["activateHintLabel"]) | undefined;
@@ -2663,16 +2788,18 @@ block lays out. Not for a diff, whose files each scroll on their own. */
2663
2788
  "expand-label"?: (HelixHeadlessCodeBlock["expandLabel"]) | undefined;
2664
2789
  /** The expand button's words while the cap hides lines. */
2665
2790
  expandLabel?: (HelixHeadlessCodeBlock["expandLabel"]) | undefined;
2666
- /** The block's name, usually a file name or a language.
2791
+ /** The block's name, usually a file name, drawn in the header.
2667
2792
 
2668
- In a diff, each file is named from the patch, and this names a patch that
2669
- carries no name of its own. */
2793
+ Absent, the block is named by `language` where there is one. In a diff,
2794
+ each file is named from the patch, and this names a patch that carries no
2795
+ name of its own. */
2670
2796
  label?: (HelixHeadlessCodeBlock["label"]) | undefined;
2671
2797
  /** The language the code is written in, such as `ts` or `css`, handed to
2672
2798
  `highlight` as its second argument.
2673
2799
 
2674
- Absent hands it an empty string. It draws nothing of its own: the block's
2675
- name is `label`. */
2800
+ A block with no `label` is named by it, in the header and on the copy
2801
+ button, as a docs site names a snippet by its language. Absent hands
2802
+ `highlight` an empty string and names nothing. */
2676
2803
  language?: (HelixHeadlessCodeBlock["language"]) | undefined;
2677
2804
  /** Whether the lines are numbered in a gutter beside the code.
2678
2805
 
@@ -3386,12 +3513,19 @@ leaves the field or presses Enter with nothing highlighted, and text that
3386
3513
  names an option takes that option. Unlike `creatable`, no event asks
3387
3514
  first and no option is expected to be added: the value is the text. */
3388
3515
  allowsCustomValue?: (HelixHeadlessCombobox["allowsCustomValue"]) | undefined;
3389
- /** What the browser may autofill in the text field, as a platform token.
3516
+ /** What the browser may autofill, as a platform token such as `country`.
3390
3517
 
3391
3518
  **Defaults to `off`, which is not the platform's default and is the
3392
3519
  point.** The field filters a list rather than collecting a value, so a
3393
3520
  browser offering to fill it with a saved address is competing for the same
3394
- keystrokes as the listbox. A consumer who wants autofill can still ask. */
3521
+ keystrokes as the listbox. A consumer who wants autofill can still ask.
3522
+
3523
+ Set, a combobox whose answer is one of its options keeps a hidden native
3524
+ `<select>` with the same options for the browser to fill, as React Aria's
3525
+ combobox and Select do, and the option the browser picks, by its value or
3526
+ its words, becomes the value. The text field itself stays `off`, so the
3527
+ browser fills the answer and not the filter. With `allows-custom-value`
3528
+ the token goes on the text field, whose words are the answer. */
3395
3529
  autocomplete?: (HelixHeadlessCombobox["autocomplete"]) | undefined;
3396
3530
  /** Whether the user can add a value that is not in the list.
3397
3531
 
@@ -3430,12 +3564,14 @@ every keystroke. See Listbox's `filter-delay`. */
3430
3564
  /** The list's name, read by screen readers. The list has no visible name. */
3431
3565
  listLabel?: (HelixHeadlessCombobox["listLabel"]) | undefined;
3432
3566
  /** What the list says when its options could not be loaded, such as after a
3433
- request to a server fails. Empty is no error. Passed to the list, which
3434
- shows it under any options there are and tells screen readers. */
3567
+ request to a server fails. Empty, null or no attribute is no error, so
3568
+ removing the attribute clears it. Passed to the list, which shows it
3569
+ under any options there are and tells screen readers. */
3435
3570
  "load-error"?: (HelixHeadlessCombobox["loadError"]) | undefined;
3436
3571
  /** What the list says when its options could not be loaded, such as after a
3437
- request to a server fails. Empty is no error. Passed to the list, which
3438
- shows it under any options there are and tells screen readers. */
3572
+ request to a server fails. Empty, null or no attribute is no error, so
3573
+ removing the attribute clears it. Passed to the list, which shows it
3574
+ under any options there are and tells screen readers. */
3439
3575
  loadError?: (HelixHeadlessCombobox["loadError"]) | undefined;
3440
3576
  /** Whether the options are still loading.
3441
3577
 
@@ -3518,6 +3654,12 @@ two. */
3518
3654
  options. `{count}` is the count, and `Intl.PluralRules` picks between the
3519
3655
  two. */
3520
3656
  resultsLabel?: (HelixHeadlessCombobox["resultsLabel"]) | undefined;
3657
+ /** What VoiceOver hears for a chosen option, as the highlight reaches it and
3658
+ once it is chosen, on Apple devices. `{name}` is the option's words. */
3659
+ "selected-label"?: (HelixHeadlessCombobox["selectedLabel"]) | undefined;
3660
+ /** What VoiceOver hears for a chosen option, as the highlight reaches it and
3661
+ once it is chosen, on Apple devices. `{name}` is the option's words. */
3662
+ selectedLabel?: (HelixHeadlessCombobox["selectedLabel"]) | undefined;
3521
3663
  /** Whether the field completes the word as the user types.
3522
3664
 
3523
3665
  `suggest` rather than `autocomplete`, which is a real HTML attribute this
@@ -3707,12 +3849,14 @@ with: one key, said once. */
3707
3849
  /** Accessible name for the overlay, which has no visible heading. */
3708
3850
  label?: (HelixHeadlessCommand["label"]) | undefined;
3709
3851
  /** What the list says when its commands could not be loaded, such as after a
3710
- request to a server fails. Empty is no error. Passed to the list, which
3711
- shows it under any commands there are and tells screen readers. */
3852
+ request to a server fails. Empty, null or no attribute is no error, so
3853
+ removing the attribute clears it. Passed to the list, which shows it
3854
+ under any commands there are and tells screen readers. */
3712
3855
  "load-error"?: (HelixHeadlessCommand["loadError"]) | undefined;
3713
3856
  /** What the list says when its commands could not be loaded, such as after a
3714
- request to a server fails. Empty is no error. Passed to the list, which
3715
- shows it under any commands there are and tells screen readers. */
3857
+ request to a server fails. Empty, null or no attribute is no error, so
3858
+ removing the attribute clears it. Passed to the list, which shows it
3859
+ under any commands there are and tells screen readers. */
3716
3860
  loadError?: (HelixHeadlessCommand["loadError"]) | undefined;
3717
3861
  /** Whether the commands are still loading, for a palette that asks a server
3718
3862
  for them as the user types.
@@ -5148,20 +5292,23 @@ export type HelixHeadlessDialogVueEvents = {
5148
5292
  };
5149
5293
 
5150
5294
  export type HelixHeadlessDividerVueProps = {
5151
- /** Whether screen readers announce the line as a separator.
5152
-
5153
- Off by default, and out of the accessibility tree. Most rules on a page
5154
- separate nothing: they underline a heading or close a section that space
5155
- had already closed, and announcing every one as a separator is noise a
5156
- screen-reader user has to walk past.
5157
-
5158
- An opt-in, not a `decorative` opt-out, because a boolean attribute cannot
5159
- be turned off: `decorative="false"` parses as `true`, which would put the
5160
- quiet default out of reach from HTML and leave it settable only as a
5161
- property. An opt-in is absent by default, which every reflected property
5162
- here has to be. */
5295
+ /** Whether screen readers announce the line as a separator, which they now do
5296
+ by default.
5297
+
5298
+ It dates from when the line was decorative by default. It is still read,
5299
+ and it wins over `decorative`, so a divider written with it stays a
5300
+ separator. */
5163
5301
  announced?: (HelixHeadlessDivider["announced"]) | undefined;
5164
- /** The direction the line runs: `horizontal` or `vertical`. */
5302
+ /** Takes the line out of the accessibility tree, for a rule that separates
5303
+ nothing: one under a heading, or between the facts of a byline.
5304
+
5305
+ Absent, the line is a separator, as `<hr>` is. Radix Separator's opt-out
5306
+ has the same name. It turns the role off because a boolean attribute that
5307
+ is on by default cannot be turned off from HTML. */
5308
+ decorative?: (HelixHeadlessDivider["decorative"]) | undefined;
5309
+ /** The direction the line runs: `horizontal` or `vertical`.
5310
+
5311
+ Unset is horizontal, or across the toolbar the divider sits in. */
5165
5312
  orientation?: (HelixHeadlessDivider["orientation"]) | undefined;
5166
5313
  };
5167
5314
 
@@ -6062,6 +6209,14 @@ few characters and a date is not. */
6062
6209
  elapsed?: (HelixHeadlessFormatDate["elapsed"]) | undefined;
6063
6210
  /** How the era is written, such as AD, where a date is shown. */
6064
6211
  era?: (HelixHeadlessFormatDate["era"]) | undefined;
6212
+ /** Draws each field of a date in a part of its own: `weekday`, `day`,
6213
+ `month`, `year`, `era`, `hour`, `minute`, `second`, `day-period` and
6214
+ `time-zone-name`, so `::part(year)` can set the year apart.
6215
+
6216
+ Off by default, which draws the date as one run of text, as Shoelace and
6217
+ Web Awesome do. An `elapsed` or `relative` reading is one phrase either
6218
+ way. */
6219
+ fields?: (HelixHeadlessFormatDate["fields"]) | undefined;
6065
6220
  /** Draws an `elapsed` or `relative` reading once and leaves it, where it
6066
6221
  would otherwise move on as it goes stale.
6067
6222
 
@@ -6511,6 +6666,14 @@ calendar heatmap does: a week is a column, so the strip reads along the
6511
6666
  line in weeks, from the right on a right-to-left page, and top to bottom in
6512
6667
  days. */
6513
6668
  rows?: (HelixHeadlessHeatmap["rows"]) | undefined;
6669
+ /** What the readout adds for a selected cell, under `selection-mode`, after
6670
+ where the cell stands: "Day 1: 0 (1 of 14, selected)". Empty adds
6671
+ nothing. */
6672
+ "selected-label"?: (HelixHeadlessHeatmap["selectedLabel"]) | undefined;
6673
+ /** What the readout adds for a selected cell, under `selection-mode`, after
6674
+ where the cell stands: "Day 1: 0 (1 of 14, selected)". Empty adds
6675
+ nothing. */
6676
+ selectedLabel?: (HelixHeadlessHeatmap["selectedLabel"]) | undefined;
6514
6677
  /** What the `selection` part says after the selection changes, with `{count}` for
6515
6678
  how many cells are selected. */
6516
6679
  "selection-label"?: (HelixHeadlessHeatmap["selectionLabel"]) | undefined;
@@ -7811,12 +7974,16 @@ export type HelixHeadlessListboxHelixLoadMoreElementEvent =
7811
7974
  HelixHeadlessListboxElementEvent<HelixLoadMoreEvent>;
7812
7975
 
7813
7976
  export type HelixHeadlessListboxVueProps = {
7814
- /** What the browser may autofill in the text field, as a platform token.
7977
+ /** What a browser's autofill may choose, as a platform token such as
7978
+ `country` or `cc-exp-month`, as a native `<select>` takes it.
7815
7979
 
7816
- **Defaults to `off`, which is not the platform's default and is the
7817
- point.** The field filters a list rather than collecting a value, so a
7818
- browser offering to fill it with a saved address is competing for the same
7819
- keystrokes as the listbox. A consumer who wants autofill can still ask. */
7980
+ Set, the list draws a hidden native `<select>` with the same options for
7981
+ the browser to fill, as React Aria's `HiddenSelect` does, and a fill
7982
+ chooses the option. `off`, the default, draws none.
7983
+
7984
+ **The filter field is never filled.** It narrows the list rather than
7985
+ collecting a value, so a browser offering it a saved address competes
7986
+ with the reader for the same keystrokes: it is always `off`. */
7820
7987
  autocomplete?: (HelixHeadlessListbox["autocomplete"]) | undefined;
7821
7988
  /** The filter text the list starts with, when `filter` is not set. */
7822
7989
  "default-filter"?: (HelixHeadlessListbox["defaultFilter"]) | undefined;
@@ -7870,14 +8037,27 @@ act on the list the reader expects. */
7870
8037
  "filter-label"?: (HelixHeadlessListbox["filterLabel"]) | undefined;
7871
8038
  /** Placeholder text for the filter field. */
7872
8039
  filterLabel?: (HelixHeadlessListbox["filterLabel"]) | undefined;
8040
+ /** How the options are laid out, which the arrow keys follow: `stack`, one
8041
+ under another, or `grid`, in rows and columns, as React Aria's `ListBox`
8042
+ lays out cards or photos. With `grid`, Up and Down move within a column,
8043
+ and Left and Right along the list, mirrored right to left.
8044
+
8045
+ The columns are the stylesheet's: the styled tier draws them at
8046
+ `--listbox-column-min-inline-size` or wider, and a headless list lays out
8047
+ `::part(items)` as it likes, since the keys read where each option is
8048
+ drawn. A list of `items` stays a stack. Left out, the list is a stack,
8049
+ and the host carries no attribute for it. */
8050
+ layout?: (HelixHeadlessListbox["layout"]) | undefined;
7873
8051
  /** What the list says when its options could not be loaded, such as after a
7874
- request to a server fails. Empty is no error.
8052
+ request to a server fails. Empty, null or no attribute is no error, so
8053
+ removing the attribute clears it.
7875
8054
 
7876
8055
  Set, it shows under any options there are, in place of `empty-text` and
7877
8056
  `loading-text`, and a screen reader hears it. Clear it when you ask again. */
7878
8057
  "load-error"?: (HelixHeadlessListbox["loadError"]) | undefined;
7879
8058
  /** What the list says when its options could not be loaded, such as after a
7880
- request to a server fails. Empty is no error.
8059
+ request to a server fails. Empty, null or no attribute is no error, so
8060
+ removing the attribute clears it.
7881
8061
 
7882
8062
  Set, it shows under any options there are, in place of `empty-text` and
7883
8063
  `loading-text`, and a screen reader hears it. Clear it when you ask again. */
@@ -7921,6 +8101,12 @@ options. `{count}` is the count.
7921
8101
  pair: a language with more forms than two picks the one for its `one` and
7922
8102
  writes the rest here. */
7923
8103
  resultsLabel?: (HelixHeadlessListbox["resultsLabel"]) | undefined;
8104
+ /** What VoiceOver hears as the highlight reaches a chosen option from the
8105
+ filter field, on Apple devices. `{name}` is the option's words. */
8106
+ "selected-label"?: (HelixHeadlessListbox["selectedLabel"]) | undefined;
8107
+ /** What VoiceOver hears as the highlight reaches a chosen option from the
8108
+ filter field, on Apple devices. `{name}` is the option's words. */
8109
+ selectedLabel?: (HelixHeadlessListbox["selectedLabel"]) | undefined;
7924
8110
  /** Whether the rows are still loading.
7925
8111
 
7926
8112
  Reflected, because a stylesheet needs it: the rows that are already there
@@ -8002,6 +8188,23 @@ imperatively later, and nothing is hydrating by then.
8002
8188
 
8003
8189
  Here rather than on each control. */
8004
8190
  name?: (HelixHeadlessListbox["name"]) | undefined;
8191
+ /** The options as data, for a list too long to draw whole: each a value,
8192
+ which is also its words, or a record with a `value`, a `label` and
8193
+ `disabled`. Set, the list draws only the options in sight, and the ones
8194
+ you write as children are not read.
8195
+
8196
+ **Every option is still reachable.** The keyboard, the typeahead, the
8197
+ filter and the value work over the whole set, and the option the keyboard
8198
+ is on is drawn wherever it is, so a screen reader is told about it. Each
8199
+ drawn option says its place in the set (`aria-posinset`, `aria-setsize`).
8200
+ React Aria virtualizes a `ListBox` with its `Virtualizer`; this is core's
8201
+ `VirtualizeController`.
8202
+
8203
+ **The list needs a height to scroll in**: the styled tier's
8204
+ `--listbox-max-block-size`, or a `max-block-size` on `::part(items)` in the
8205
+ headless tier. Import the Option family as well, whose elements are drawn.
8206
+ A server sends the list empty, and the options are drawn once it hydrates. */
8207
+ items?: (HelixHeadlessListbox["items"]) | undefined;
8005
8208
  /** Which option is chosen, as an index, or `-1` where none is.
8006
8209
 
8007
8210
  `<select>`'s own pair, and this control is what stands in for one. The
@@ -9420,6 +9623,20 @@ export type HelixHeadlessNotificationsHelixReadElementEvent =
9420
9623
  export type HelixHeadlessNotificationsVueProps = {
9421
9624
  /** The feed's name, read by screen readers. */
9422
9625
  label?: (HelixHeadlessNotifications["label"]) | undefined;
9626
+ /** What the feed says when a page of it could not be loaded, such as after a
9627
+ request to a server fails. Empty, null or no attribute is no error, so
9628
+ removing the attribute clears it.
9629
+
9630
+ Set, it shows under the rows there are, in place of `empty-text` and
9631
+ `loading-text`, and a screen reader hears it. Clear it when you ask again. */
9632
+ "load-error"?: (HelixHeadlessNotifications["loadError"]) | undefined;
9633
+ /** What the feed says when a page of it could not be loaded, such as after a
9634
+ request to a server fails. Empty, null or no attribute is no error, so
9635
+ removing the attribute clears it.
9636
+
9637
+ Set, it shows under the rows there are, in place of `empty-text` and
9638
+ `loading-text`, and a screen reader hears it. Clear it when you ask again. */
9639
+ loadError?: (HelixHeadlessNotifications["loadError"]) | undefined;
9423
9640
  /** Whether to draw a button after the list that asks for the next page, by
9424
9641
  sending `helix-load-more`. Take it off once there is nothing more. */
9425
9642
  "load-more"?: (HelixHeadlessNotifications["loadMore"]) | undefined;
@@ -11363,6 +11580,14 @@ export type HelixHeadlessSelectToggleElementEvent =
11363
11580
  HelixHeadlessSelectElementEvent<ToggleEvent>;
11364
11581
 
11365
11582
  export type HelixHeadlessSelectVueProps = {
11583
+ /** What a browser's autofill may fill in, as a platform token such as
11584
+ `country` or `cc-exp-month`, as on a native `<select>`.
11585
+
11586
+ Set, the select keeps a hidden native `<select>` with the same options for
11587
+ the browser to fill, as React Aria's `HiddenSelect` does, and takes the
11588
+ option the browser picks, by its value or its words, as the value. Empty
11589
+ draws no hidden select, and a browser fills nothing. */
11590
+ autocomplete?: (HelixHeadlessSelect["autocomplete"]) | undefined;
11366
11591
  /** The text shown when no options match the filter. */
11367
11592
  "empty-text"?: (HelixHeadlessSelect["emptyText"]) | undefined;
11368
11593
  /** The text shown when no options match the filter. */
@@ -11918,6 +12143,13 @@ not. */
11918
12143
 
11919
12144
  export type HelixHeadlessSparklineVueEvents = {};
11920
12145
 
12146
+ export type HelixHeadlessSpeedDialGroupVueProps = {
12147
+ /** The group's name, drawn above its actions and read by screen readers. */
12148
+ label?: (HelixHeadlessSpeedDialGroup["label"]) | undefined;
12149
+ };
12150
+
12151
+ export type HelixHeadlessSpeedDialGroupVueEvents = {};
12152
+
11921
12153
  /** `HelixHeadlessSpeedDialItem` component event */
11922
12154
  export type HelixHeadlessSpeedDialItemElementEvent<E = Event> = TypedEvent<
11923
12155
  HelixHeadlessSpeedDialItem,
@@ -11930,6 +12162,10 @@ export type HelixHeadlessSpeedDialItemHelixSelectElementEvent =
11930
12162
  export type HelixHeadlessSpeedDialItemVueProps = {
11931
12163
  /** Whether the action is disabled, so it cannot be chosen. */
11932
12164
  disabled?: (HelixHeadlessSpeedDialItem["disabled"]) | undefined;
12165
+ /** The action's keyboard shortcut as a chord, such as `mod+s`, carried as
12166
+ `aria-keyshortcuts` and drawn after the name. `mod` is Command on an Apple
12167
+ keyboard and Control elsewhere. Showing a shortcut does not bind it. */
12168
+ shortcut?: (HelixHeadlessSpeedDialItem["shortcut"]) | undefined;
11933
12169
  /** The action's value, sent in `helix-select` when the action is chosen. */
11934
12170
  value?: (HelixHeadlessSpeedDialItem["value"]) | undefined;
11935
12171
  };
@@ -11960,8 +12196,32 @@ export type HelixHeadlessSpeedDialToggleElementEvent =
11960
12196
  export type HelixHeadlessSpeedDialVueProps = {
11961
12197
  /** Accessible name for the trigger and the set of actions it opens. */
11962
12198
  label?: (HelixHeadlessSpeedDial["label"]) | undefined;
12199
+ /** The description the trigger gives under `open-on="long-press"`, saying how
12200
+ its actions are reached.
12201
+
12202
+ A slotted trigger is described by the dial, which carries the words as
12203
+ its own label for that: a Helix button's inner control at once, and a
12204
+ plain element of yours once a reader reaches it, after hydration, unless
12205
+ you described or labeled it yourself. */
12206
+ "long-press-label"?: (HelixHeadlessSpeedDial["longPressLabel"]) | undefined;
12207
+ /** The description the trigger gives under `open-on="long-press"`, saying how
12208
+ its actions are reached.
12209
+
12210
+ A slotted trigger is described by the dial, which carries the words as
12211
+ its own label for that: a Helix button's inner control at once, and a
12212
+ plain element of yours once a reader reaches it, after hydration, unless
12213
+ you described or labeled it yourself. */
12214
+ longPressLabel?: (HelixHeadlessSpeedDial["longPressLabel"]) | undefined;
11963
12215
  /** Space between the trigger and the actions, in pixels. */
11964
12216
  offset?: (HelixHeadlessSpeedDial["offset"]) | undefined;
12217
+ /** What opens the dial. `click` opens it on a press of the trigger. Under
12218
+ `long-press`, a press is the trigger's own action, and the dial opens on a
12219
+ press held for half a second, or on Alt+Down or Alt+Up. */
12220
+ "open-on"?: (HelixHeadlessSpeedDial["openOn"]) | undefined;
12221
+ /** What opens the dial. `click` opens it on a press of the trigger. Under
12222
+ `long-press`, a press is the trigger's own action, and the dial opens on a
12223
+ press held for half a second, or on Alt+Down or Alt+Up. */
12224
+ openOn?: (HelixHeadlessSpeedDial["openOn"]) | undefined;
11965
12225
  /** The direction the actions open in. They move to another side if that side
11966
12226
  does not fit.
11967
12227
 
@@ -12147,7 +12407,7 @@ export type HelixHeadlessSplitterVueEvents = {
12147
12407
  "helix-collapse": HelixHeadlessSplitterHelixCollapseElementEvent;
12148
12408
  /** Fired after the divider settles somewhere new, with the new position. */
12149
12409
  "helix-resized": HelixHeadlessSplitterHelixResizedElementEvent;
12150
- /** Fired each time a drag moves the divider, before it settles, as a range input does while it is dragged. Read `position` for where it is now. */
12410
+ /** Fired each time the divider moves, as a range input does: on each step of a drag, and before `helix-resized` for a key, a double click or a corner. Read `position` for where it is now. */
12151
12411
  input: HelixHeadlessSplitterElementEvent;
12152
12412
  };
12153
12413
 
@@ -12699,6 +12959,14 @@ is set. */
12699
12959
  "descending-label"?: (HelixHeadlessTable["descendingLabel"]) | undefined;
12700
12960
  /** The word for a descending sort, in `sorted-label`. */
12701
12961
  descendingLabel?: (HelixHeadlessTable["descendingLabel"]) | undefined;
12962
+ /** Makes the table a grid: one tab stop, and the arrow keys, Home, End and the
12963
+ Page keys move focus between its cells, the headings included. Enter moves
12964
+ into a cell's controls, and Tab leaves the table.
12965
+
12966
+ Off by default, where the table is a static `table` and Tab reaches each
12967
+ link and control in it. On, the table writes a `tabindex` onto each of its
12968
+ cells, which is the one way a cell of your markup can take focus. */
12969
+ grid?: (HelixHeadlessTable["grid"]) | undefined;
12702
12970
  /** Accessible name for the table.
12703
12971
 
12704
12972
  An `aria-label` or `aria-labelledby` on the host names the table too, and
@@ -15539,6 +15807,8 @@ export type CustomCssProperties = {
15539
15807
  "--bar-chart-secondary"?: (string) | undefined;
15540
15808
  /** The gradient for a bar, named per bar so the styled tier can use it as the `fill`. It is always drawn, and used only when `wash="gradient"` is set. */
15541
15809
  "--chart-bar-wash"?: (string) | undefined;
15810
+ /** Written on the control inside each toggle button of a group with `selection-mode`: `1` while it is pressed and `0` while it is not. Read it in a `::part(button)` rule to draw the pressed look. */
15811
+ "--button-group-pressed"?: (string) | undefined;
15542
15812
  /** Space between slides. Your stylesheet sets it, and the component uses it to measure the run. */
15543
15813
  "--carousel-gap"?: (string) | undefined;
15544
15814
  /** The size of one pane. Your stylesheet sets it, and the component uses it to measure the run. */
@@ -15721,7 +15991,7 @@ export interface WcToolkitVueGlobalComponents {
15721
15991
  HelixHeadlessAccordionVueProps,
15722
15992
  HelixHeadlessAccordionVueEvents
15723
15993
  >;
15724
- /** An announcement is a banner above the page header with news about the whole site or session, such as a trial ending, a degraded service, or a change of terms. For a passage inside a document, use 'Callout', which stays where it is placed and cannot be dismissed. The announcement is always a polite live region, whatever its 'tone'. 'role="alert"' is assertive and interrupts a screen reader, so an announcement served with the page would interrupt on every page load. The live region is its own part. When the announcement appears after the page has loaded, the message is written into the region one frame later, so screen readers read it reliably, and the region is emptied seven seconds later. While the region holds the copy, the message itself is hidden from screen readers, so it is in the page once. When the announcement is in the served HTML, the region stays empty and nothing is read out. The dismiss button fires 'helix-dismiss', and the announcement stays in the document, so remove it in your listener. The event is cancelable, and 'dismiss()' returns 'false' when a listener calls 'preventDefault()'. When your listener removes an announcement whose dismiss button has focus, focus moves to the dismiss button of the announcement beside it. With no other announcement beside it, move focus yourself, for example to the page's main heading. Set 'duration' to dismiss it after a time. The clock stops while the pointer or focus is on the announcement, and continues from what was left, so a reader partway through is not cut off. It stops while the page is hidden too, in another tab or a minimized window, so the message is not spent where nobody can see it. While the clock is stopped the announcement carries ':state(paused)'. When the time runs out it sends 'helix-dismiss', as the button does. */
15994
+ /** An announcement is a banner above the page header with news about the whole site or session, such as a trial ending, a degraded service, or a change of terms. For a passage inside a document, use 'Callout', which stays where it is placed and cannot be dismissed. The announcement is always a polite live region, whatever its 'tone'. 'role="alert"' is assertive and interrupts a screen reader, so an announcement served with the page would interrupt on every page load. The live region is its own part. When the announcement appears after the page has loaded, the message is written into the region one frame later, so screen readers read it reliably, and the region is emptied seven seconds later. While the region holds the copy, the message itself is hidden from screen readers, so it is in the page once. When the announcement is in the served HTML, the region stays empty and nothing is read out. The dismiss button fires 'helix-dismiss', and the announcement stays in the document, so remove it in your listener. The event is cancelable, and 'dismiss()' returns 'false' when a listener calls 'preventDefault()'. When your listener removes an announcement whose dismiss button has focus, focus moves to the dismiss button of the announcement beside it. With no other announcement beside it, move focus yourself, for example to the page's main heading. **The announcement is a landmark region**, named by 'label', "Announcement" unless you set it, so a screen reader lists it among the page's regions. 'hotkey', F6 unless you set it, moves focus to the announcement's first control, an action or the dismiss button, and pressed there moves focus back to where it was, as React Aria's toast region does. An announcement with no control leaves the key to the browser. When an announcement that the key moved focus into is removed with focus still inside, focus goes back to where it was before the key. **Set 'queued' to show several announcements one at a time.** A queued announcement waits while a queued announcement before it in the same parent is still there, and shows when that one is removed: its message is then read out, and its 'duration' starts. While it waits it renders nothing, is no region, and carries ':state(waiting)'. A server cannot see the announcements beside it, so a served page shows every one until the script runs. Set 'duration' to dismiss it after a time. The clock stops while the pointer or focus is on the announcement, and continues from what was left, so a reader partway through is not cut off. It stops while the page is hidden too, in another tab or a minimized window, so the message is not spent where nobody can see it. While the clock is stopped the announcement carries ':state(paused)'. When the time runs out it sends 'helix-dismiss', as the button does. */
15725
15995
  "helix-headless-announcement": DefineCustomElement<
15726
15996
  HelixHeadlessAnnouncement,
15727
15997
  HelixHeadlessAnnouncementVueProps,
@@ -15763,7 +16033,7 @@ export interface WcToolkitVueGlobalComponents {
15763
16033
  HelixHeadlessBarChartVueProps,
15764
16034
  HelixHeadlessBarChartVueEvents
15765
16035
  >;
15766
- /** Renders a '<figure>' holding the '<blockquote>' and a '<figcaption>' for the attribution, the structure the HTML spec describes. The attribution sits outside the quotation because it is about the quotation, and it names the figure, so a screen reader reads the source as the figure's caption. The figure keeps the browser's default margins on this tier. Set '::part(figure) { margin: 0 }' where they are unwanted. For a quotation inside a sentence, use 'Quote'. */
16036
+ /** Renders a figure holding the '<blockquote>' and a caption for the attribution, the structure the HTML spec describes. The attribution sits outside the quotation because it is about the quotation, and it names the figure, so a screen reader reads the source as the figure's caption. **The figure is a '<div role="figure">'**, so the headless tier draws no space around the quotation. A '<figure>' takes a 40px indent and a line of space above and below from the browser's own sheet, which every page had to reset. The '<blockquote>' keeps its own margins, as a bare one does. A screen reader meets the same figure, named by its caption. **A figure only while there is an attribution.** With nothing in the caption the figure has no name and nothing to say, so the role and its name are dropped and a reader meets the quotation alone. A server cannot see what is slotted, so it serves the figure, and the client drops it after hydration; an 'attribution' written as words is served exactly. **Quotation marks follow the language**, under 'marks'. The opening mark is the one the browser sets for a '<q>' in the element's language, „ under 'lang="de"' and « under 'lang="fr"', and a 'Quote' inside the passage takes the inner marks. The mark is drawn, not read: a screen reader hears the passage. A passage under 'marks' that starts with a mark typed into the text would show two, and warns once, with the runtime kind 'typed-marks'. **'cite' is the source's URL**, which the browser keeps and does not show. Words in it, such as the author's name, warn once, with the runtime kind 'cite-not-url'. For a quotation inside a sentence, use 'Quote'. */
15767
16037
  "helix-headless-blockquote": DefineCustomElement<
15768
16038
  HelixHeadlessBlockquote,
15769
16039
  HelixHeadlessBlockquoteVueProps,
@@ -15781,7 +16051,7 @@ export interface WcToolkitVueGlobalComponents {
15781
16051
  HelixHeadlessBreadcrumbsVueProps,
15782
16052
  HelixHeadlessBreadcrumbsVueEvents
15783
16053
  >;
15784
- /** Sets 'role="group"' on the host through internals, and 'label' names the group. Without a name, a screen reader announces the buttons as separate controls, and a development build warns once with the kind 'missing-name'. The group does not manage focus, so each button keeps its own tab stop. For one tab stop with arrow keys between the buttons, the APG toolbar pattern, use Toolbar. Buttons are slotted, so they stay your own elements and keep their own appearance and size. */
16054
+ /** Sets 'role="group"' on the host through internals, and 'label' names the group. Without a name, a screen reader announces the buttons as separate controls, and a development build warns once with the kind 'missing-name'. The group does not manage focus, so each button keeps its own tab stop. For one tab stop with arrow keys between a mix of controls, the APG toolbar pattern, use Toolbar. Buttons are slotted, so they stay your own elements and keep their own appearance and size. **Buttons that stay pressed.** With 'selection-mode', each button with a 'value' is a toggle button: a press presses or releases it, and it says so with 'aria-pressed'. 'single' keeps one pressed at a time, and a press on the pressed one releases it. 'multiple' lets any number be pressed. 'value' is the pressed values, comma separated. A press sends a cancelable 'helix-before-change' with the value it would leave, then 'change'. The pressed state is written on the control inside each button's shadow root, so the markup you rendered is never changed and a framework hydrating it sees what its server sent. That is also why only Helix buttons are toggles: a native '<button>' or a button without a 'value' stays a plain action button in the group, and a native one without its own 'aria-pressed' warns once, with the runtime kind 'untold-toggle'. The inner control also carries '--button-group-pressed', '1' or '0', for a '::part(button)' rule of yours. Use Toggle Group instead for a choice that belongs in a form, or one where the arrow keys choose as they move: it is a 'radiogroup' of options with a form value, 'required' and validation. A Button Group in a selection mode is a set of actions that stay on, such as bold and italic, or a view that a press switches, and it submits nothing. **Keyboard.** In a selection mode the group is one tab stop: the button focus was last on, then the first pressed one, then the first one. | Key | What it does | |---|---| | Right, Down | Moves to the next button, from the last back to the first. | | Left, Up | Moves to the button before, from the first round to the last. | | Home, End | Moves to the first or the last button. | | Space, Enter | Presses or releases the focused button. | Left and Right swap on a right-to-left page, and a disabled button is passed over. In a selection mode the group is a 'toolbar', with 'aria-orientation' under 'orientation="vertical"'. Inside a toolbar it stays a named 'group', and the toolbar's own arrow keys walk its buttons, so a reader meets one toolbar. */
15785
16055
  "helix-headless-button-group": DefineCustomElement<
15786
16056
  HelixHeadlessButtonGroup,
15787
16057
  HelixHeadlessButtonGroupVueProps,
@@ -15811,7 +16081,7 @@ export interface WcToolkitVueGlobalComponents {
15811
16081
  HelixHeadlessCanvasNodeVueProps,
15812
16082
  HelixHeadlessCanvasNodeVueEvents
15813
16083
  >;
15814
- /** A board of cards and connectors, drawn by Helix. On a canvas every position is data that someone placed, so drawing is arithmetic over rectangles with no layout to compute. 'Map' takes a slotted map, because another renderer draws its tiles. The format is [JSON Canvas](https://jsoncanvas.org), an open format. Each node has an 'x', 'y', 'width', 'height', and a type. Each edge names the two nodes it joins and the sides it leaves and arrives on. A card belongs to a group when it sits inside the group's bounds. The cards are text in the DOM, so a screen reader can read them. The family adds a reading order and states each card's connections as text. 'order' sets the reading order: - 'spatial' bands the cards into rows. - 'edges' follows the arrows, starting from the cards that nothing points to. **Cards move by default.** The board writes the new 'x' and 'y' onto the card, the way an input writes its own value, and dispatches two events: - 'helix-before-move' for every step. Cancel it to hold the positions in your own state and apply them yourself. - 'helix-move' once the move is finished. A resize dispatches the same pair with a size. Set 'readonly' on the board to keep every card in place, such as on a published board. Set 'readonly' on one card or connection to keep only that one in place. Keyboard behavior: - One card holds the board's tab stop. - The arrow keys move through the cards in reading order. The card you land on scrolls into view, and its connections are announced with it. - Shift with an arrow key moves the card. - The connections leaving a card are stops of their own, straight after it. Enter on one moves to the card it arrives at. Every drag also works with clicks, as WCAG 2.5.7 requires for a pointer that cannot hold a button down. Click a selected card's move handle, a corner, a card's connection point, or the end of a selected connection to pick it up. It follows the pointer with no button held, and the next click puts it down where a drag would have. On touch, the next tap sets where it lands. Escape, or a press outside the board, puts it back. Connecting and removing dispatch requests, and your code applies them: - Drawing from a card's handle to another card, or pressing C on one card and Enter on another, dispatches 'helix-connect'. - Delete on a card or a connection dispatches 'helix-remove'. The event names every connection that removing the card would leave without an end. The board applies a move itself, because the card already exists. A connection is a new element, and React discards an element the board adds to its markup on the next render, so you write the connection. Cards and connections are 'helix-canvas-node' and 'helix-canvas-edge' elements, so they are in the served markup whichever renderer wrote them. The library fetches nothing, and an array passed to an element is missing from the first paint of a server-rendered React page. 'fromJsonCanvas' turns a JSON Canvas document into their props, and 'toJsonCanvas()' writes a board back out. */
16084
+ /** A board of cards and connectors, drawn by Helix. On a canvas every position is data that someone placed, so drawing is arithmetic over rectangles with no layout to compute. 'Map' takes a slotted map, because another renderer draws its tiles. The format is [JSON Canvas](https://jsoncanvas.org), an open format. Each node has an 'x', 'y', 'width', 'height', and a type. Each edge names the two nodes it joins and the sides it leaves and arrives on. A card belongs to a group when it sits inside the group's bounds. The cards are text in the DOM, so a screen reader can read them. The family adds a reading order and states each card's connections as text. 'order' sets the reading order: - 'spatial' bands the cards into rows. - 'edges' follows the arrows, starting from the cards that nothing points to. **Cards move by default.** The board writes the new 'x' and 'y' onto the card, the way an input writes its own value, and dispatches two events: - 'helix-before-move' for every step. Cancel it to hold the positions in your own state and apply them yourself. - 'helix-move' once the move is finished. A resize dispatches the same pair with a size. Set 'readonly' on the board to keep every card in place, such as on a published board. Set 'readonly' on one card or connection to keep only that one in place. Set 'snap' to a length in the document's units, such as '32', and a card that is moved or resized lands on a multiple of it. Carrying a card, a corner, a connection, or the selection box near the edge of the board moves the board under it, so a card can be taken to a place off screen in one drag. A connection let go within 20 pixels of a card arrives at it. A double click on the empty board zooms in about that point, and Shift with a double click zooms out. Keyboard behavior: - One card holds the board's tab stop. - The arrow keys move through the cards in reading order. The card you land on scrolls into view, and its connections are announced with it. - Shift with an arrow key moves the card: by 16 units, or to the next multiple of 'snap' where it is set. Alt with an arrow key resizes it from its bottom right corner the same way. - The connections leaving a card are stops of their own, straight after it. Enter on one moves to the card it arrives at. - What a key changes that a reader cannot see is said: where a card moved to, its new size, how many cards are selected, and the zoom. A selected card or connection says so when a reader arrives on it. Every drag also works with clicks, as WCAG 2.5.7 requires for a pointer that cannot hold a button down. Click a selected card's move handle, a corner, a card's connection point, or the end of a selected connection to pick it up. It follows the pointer with no button held, and the next click puts it down where a drag would have. On touch, the next tap sets where it lands. Escape, or a press outside the board, puts it back. So a finger connects two cards with three taps: the card, one of its points, and the card to connect to. Connecting and removing dispatch requests, and your code applies them: - Drawing from a card's handle to another card, or pressing C on one card and Enter on another, dispatches 'helix-connect'. - Delete on a card or a connection dispatches 'helix-remove'. The event names every connection that removing the card would leave without an end. The board applies a move itself, because the card already exists. A connection is a new element, and React discards an element the board adds to its markup on the next render, so you write the connection. Cards and connections are 'helix-canvas-node' and 'helix-canvas-edge' elements, so they are in the served markup whichever renderer wrote them. The library fetches nothing, and an array passed to an element is missing from the first paint of a server-rendered React page. 'fromJsonCanvas' turns a JSON Canvas document into their props, and 'toJsonCanvas()' writes a board back out. */
15815
16085
  "helix-headless-canvas": DefineCustomElement<
15816
16086
  HelixHeadlessCanvas,
15817
16087
  HelixHeadlessCanvasVueProps,
@@ -15883,7 +16153,7 @@ export interface WcToolkitVueGlobalComponents {
15883
16153
  HelixHeadlessColorPickerVueProps,
15884
16154
  HelixHeadlessColorPickerVueEvents
15885
16155
  >;
15886
- /** The list is a 'Listbox', which handles filtering, the empty state, the highlight, 'aria-activedescendant', and scrolling an option into view. This element handles the field, the panel, and the communication between them. The typed text and the value are separate. The text is a filter: it narrows the list and is then discarded. The value is the option you choose, and the field then shows that option's text. The filter clears on close, so a reopened combobox starts from the whole list. Focus stays in the text field. The arrow keys move through the list with the listbox's public 'navigate' method. 'role="combobox"' is on the input itself. ArrowDown and ArrowUp open the list on the chosen option, and Enter chooses the highlighted one. As typing narrows the list, a screen reader hears how many options are left, such as "3 results". Space, Home, End and letters edit the text, and Enter in a closed field is left to the form. Emptying the field and leaving it clears a single choice; Escape puts the chosen words back, and a second Escape on the closed field clears the choice. With 'multiple', each chosen option is a tag in the field with its own remove control. The panel stays open and the filter clears after each choice, so the next choice starts from the whole list. With 'creatable', the combobox offers a create row and fires 'helix-create'. It does not add the option. The options are your light DOM, and your framework would re-render over an element the combobox inserted, so add the option in your event handler. */
16156
+ /** The list is a 'Listbox', which handles filtering, the empty state, the highlight, 'aria-activedescendant', and scrolling an option into view. This element handles the field, the panel, and the communication between them. The typed text and the value are separate. The text is a filter: it narrows the list and is then discarded. The value is the option you choose, and the field then shows that option's text. The filter clears on close, so a reopened combobox starts from the whole list. Focus stays in the text field. The arrow keys move through the list with the listbox's public 'navigate' method. As typing narrows the list, a screen reader hears how many options are left, such as "3 results". Emptying the field and leaving it clears a single choice. **Keyboard.** | Key | What it does | |---|---| | Down, Up | On a closed field, opens the list on the chosen option, or the first or the last. In the open list, moves the highlight, round from the last option to the first. | | Page Down, Page Up | In the open list, moves the highlight by as many options as the list shows at once. | | Enter | Chooses the highlighted option. With nothing left in the list, creates what was typed with 'creatable', or takes it with 'allows-custom-value'. On a closed field, submits the form. | | Escape | Closes the list and puts the chosen words back. On a closed field, a second Escape clears a single choice. | | Tab | Closes the list and moves on. | | Backspace | With 'multiple', on an empty field, removes the last tag. | | Space, Home, End, letters | Edit the text. | **ARIA.** The input is the 'combobox', named by the label, with 'aria-expanded', 'aria-controls' naming the list, 'aria-autocomplete' ('both' with 'suggest', 'list' otherwise) and 'aria-activedescendant' on the highlighted option. The list is the listbox 'Listbox' describes. On Apple devices, where VoiceOver does not read the option the field points to, the field says it in a live region as the highlight moves, says how many options there are as the list opens, and says a choice once it is made, as React Aria's combobox does there. Set 'autocomplete' to let a browser's autofill choose an option. With 'multiple', each chosen option is a tag in the field with its own remove control. The panel stays open and the filter clears after each choice, so the next choice starts from the whole list. With 'creatable', the combobox offers a create row and fires 'helix-create'. It does not add the option. The options are your light DOM, and your framework would re-render over an element the combobox inserted, so add the option in your event handler. */
15887
16157
  "helix-headless-combobox": DefineCustomElement<
15888
16158
  HelixHeadlessCombobox,
15889
16159
  HelixHeadlessComboboxVueProps,
@@ -15937,7 +16207,7 @@ export interface WcToolkitVueGlobalComponents {
15937
16207
  HelixHeadlessDialogVueProps,
15938
16208
  HelixHeadlessDialogVueEvents
15939
16209
  >;
15940
- /** The separator role is on the rule inside the shadow root. A role does not need to cross the shadow boundary the way an IDREF does, so it can sit on the rendered element. The semantics are then in the server-rendered markup, with no attribute written by script after the element connects. Set 'announced' for a line that divides one thing from another, and it is read as a separator, named by any content set into it. Use 'orientation="vertical"' between items on one line, such as inside a toolbar. A vertical divider stretches to fit its flex parent and sets no height of its own. */
16210
+ /** The separator role is on the rule inside the shadow root. A role does not need to cross the shadow boundary the way an IDREF does, so it can sit on the rendered element. The semantics are then in the server-rendered markup, with no attribute written by script after the element connects. **The line is a separator**, as '<hr>' is, and as Radix Separator, React Aria Separator, and Web Awesome's divider are. It is named by any content set into it, so a screen reader says "Or, separator" where you wrote "Or" on the line. Set 'decorative' on a rule that separates nothing, such as one under a heading or between the facts of a byline, and it leaves the accessibility tree. Use 'orientation="vertical"' between items on one line. A vertical divider stretches to fit its flex parent and sets no height of its own. **Inside a toolbar it runs across the toolbar** without being told: vertical in a horizontal toolbar and horizontal in a vertical one, with 'aria-orientation' to match, as React Aria's separator does inside a toolbar. Inside means a child of Toolbar or of the page's own 'role="toolbar"'. An 'orientation' you write still wins. A server cannot see the toolbar, so the turn arrives with hydration, inside the shadow root. */
15941
16211
  "helix-headless-divider": DefineCustomElement<
15942
16212
  HelixHeadlessDivider,
15943
16213
  HelixHeadlessDividerVueProps,
@@ -15967,7 +16237,7 @@ export interface WcToolkitVueGlobalComponents {
15967
16237
  HelixHeadlessDrilldownVueProps,
15968
16238
  HelixHeadlessDrilldownVueEvents
15969
16239
  >;
15970
- /** Shows what would be in a region and the one action that would fill it, so an empty region does not look like one that failed to load. The message is announced, because an empty view often replaces content that was loading, and the announcement tells a screen reader user that the search returned nothing. It is announced from a status region of its own, which is rendered empty and filled a frame after the view appears. Screen readers read a region that arrives with its text already in it inconsistently. For the seven seconds the region holds its copy, the heading and the message are hidden from screen readers, so the words are in the page once. Every region is a bare slot. There is no 'empty-state-heading' or 'empty-state-actions' element: assign your own heading and actions to the slots. **Or give the heading as words.** 'heading' draws them in a 'heading' part that is a heading at 'heading-level', 3 where it is not set, so a page rendering from data or on a server gets a heading a reader finds in the outline without writing the element. A heading slotted in replaces it. */
16240
+ /** Shows what would be in a region and the one action that would fill it, so an empty region does not look like one that failed to load. The message is announced, because an empty view often replaces content that was loading, and the announcement tells a screen reader user that the search returned nothing. It is announced from a status region of its own, which is rendered empty and filled a frame after the view appears. Screen readers read a region that arrives with its text already in it inconsistently. For the seven seconds the region holds its copy, the heading and the message are hidden from screen readers, so the words are in the page once. Every region is a bare slot. There is no 'empty-state-heading' or 'empty-state-actions' element: assign your own heading and actions to the slots. **Or give the heading as words.** 'heading' draws them in a 'heading' part that is a heading at 'heading-level', 3 where it is not set, so a page rendering from data or on a server gets a heading a reader finds in the outline without writing the element. A heading slotted in replaces it. **Whatever is slotted into 'heading' is read as a heading.** An element that is no heading, such as a '<span>' or a '<p>', is set inside the 'heading' part at 'heading-level', so a screen reader still finds it in the outline. A heading element, or an element holding one, keeps its own level. A server cannot see the slotted element, so a served '<span>' becomes a heading once the script runs. */
15971
16241
  "helix-headless-empty": DefineCustomElement<
15972
16242
  HelixHeadlessEmpty,
15973
16243
  HelixHeadlessEmptyVueProps,
@@ -16009,7 +16279,7 @@ export interface WcToolkitVueGlobalComponents {
16009
16279
  HelixHeadlessFilterInputVueProps,
16010
16280
  HelixHeadlessFilterInputVueEvents
16011
16281
  >;
16012
- /** Formats a date with 'Intl' where it is shown, so you do not write the same 'Intl' call and options in your own code. **'elapsed' shows compact relative time for a feed**, such as "42m", "3h", or "1d". After six days it shows a date. In en-US, 'Intl.NumberFormat' narrow renders both 'minute' and 'month' as 'm', so a compact "3m" could mean three minutes or three months. 'elapsedTime' in 'helix/core' does the measurement. **'relative' shows the same reading in words**, such as "3 hours ago" at 'long', "3 hr. ago" at 'short' and "3h ago" at 'narrow', the styles 'sl-relative-time' offers. 'numeric="always"' says "1 day ago" where the default says "yesterday". **'date-style' and 'time-style' take each locale's own pattern**, such as "Tuesday, August 4, 2026" at 'full', and stand in for the separate fields, which 'Intl' refuses beside them. 'hour-cycle' sets a twelve or twenty-four hour clock either way. **The text refreshes on one timer shared by the page.** Each element schedules an update for when its current reading expires, and an element showing a date schedules none, so a long feed left open costs almost nothing. 'frozen' draws the reading once and leaves it. **The output is always '<time datetime>'**, so copy and paste and scripts parsing the page get the exact instant, whatever the visible text says. A screen reader reads the text, so an 'elapsed' reading is named in full, such as "3 hours ago", and carries the whole date as its title. **A date with no time, such as '2026-08-04', is that day everywhere.** It is formatted in UTC unless 'time-zone' says otherwise, as Date Input and Date Picker format their dates, so a reader west of UTC sees August 4 and not August 3. */
16282
+ /** Formats a date with 'Intl' where it is shown, so you do not write the same 'Intl' call and options in your own code. **'elapsed' shows compact relative time for a feed**, such as "42m", "3h", or "1d". After six days it shows a date. In en-US, 'Intl.NumberFormat' narrow renders both 'minute' and 'month' as 'm', so a compact "3m" could mean three minutes or three months. 'elapsedTime' in 'helix/core' does the measurement. **'relative' shows the same reading in words**, such as "3 hours ago" at 'long', "3 hr. ago" at 'short' and "3h ago" at 'narrow', the styles 'sl-relative-time' offers. 'numeric="always"' says "1 day ago" where the default says "yesterday". **'date-style' and 'time-style' take each locale's own pattern**, such as "Tuesday, August 4, 2026" at 'full', and stand in for the separate fields, which 'Intl' refuses beside them. 'hour-cycle' sets a twelve or twenty-four hour clock either way. **The text refreshes on one timer shared by the page.** Each element schedules an update for when its current reading expires, and an element showing a date schedules none, so a long feed left open costs almost nothing. 'frozen' draws the reading once and leaves it. **'fields' draws each field of a date as a part of its own**, such as 'day', 'month' and 'year', so a stylesheet can set the year in a lighter ink or the weekday in capitals with '::part()'. The text between the fields is the locale's own and has no part. An 'elapsed' or 'relative' reading is one phrase, with no parts inside it. **The output is always '<time datetime>'**, so copy and paste and scripts parsing the page get the exact instant, whatever the visible text says. A screen reader reads the text, so an 'elapsed' reading is named in full, such as "3 hours ago", and carries the whole date as its title. **A date with no time, such as '2026-08-04', is that day everywhere.** It is formatted in UTC unless 'time-zone' says otherwise, as Date Input and Date Picker format their dates, so a reader west of UTC sees August 4 and not August 3. */
16013
16283
  "helix-headless-format-date": DefineCustomElement<
16014
16284
  HelixHeadlessFormatDate,
16015
16285
  HelixHeadlessFormatDateVueProps,
@@ -16039,7 +16309,7 @@ export interface WcToolkitVueGlobalComponents {
16039
16309
  HelixHeadlessIconVueProps,
16040
16310
  HelixHeadlessIconVueEvents
16041
16311
  >;
16042
- /** Image handles the part CSS cannot: when the picture has loaded, or that it failed. 'aspect-ratio' in your stylesheet reserves the box. The element tracks three states and relays the two events that move between them, and leaves the box to the stylesheet. The 'placeholder' slot is empty by default, so the headless tier does not depend on 'Skeleton', which it does not ship. The placeholder is hidden from screen readers, the picture having a name of its own. The fallback is read once the picture fails, after the picture's 'alt', so a reader hears that it did not load, as a sighted reader sees. */
16312
+ /** Image handles the part CSS cannot: when the picture has loaded, or that it failed. 'aspect-ratio' in your stylesheet reserves the box. The element tracks three states and relays the two events that move between them, and leaves the box to the stylesheet. The 'placeholder' slot is empty by default, so the headless tier does not depend on 'Skeleton', which it does not ship. The placeholder is hidden from screen readers, the picture having a name of its own. The fallback is read once the picture fails, after the picture's 'alt', so a reader hears that it did not load, as a sighted reader sees. **An image with no 'alt' says so.** At its first render it reports a 'missing-alt' warning, printed in the console and counted by '@fusion.dev/helix-diagnostics', which names the fix: describe the picture in 'alt', or write 'alt=""' for one that is decoration. An image hidden with 'aria-hidden="true"' needs neither and is not reported. A sheet of yours reads the state as ':state(loading)', ':state(loaded)', ':state(error)', and ':state(waiting)', the last while 'placeholder-delay' holds the placeholder back. It can also read 'data-status' on the host once the picture has loaded or failed. */
16043
16313
  "helix-headless-image": DefineCustomElement<
16044
16314
  HelixHeadlessImage,
16045
16315
  HelixHeadlessImageVueProps,
@@ -16093,7 +16363,7 @@ export interface WcToolkitVueGlobalComponents {
16093
16363
  HelixHeadlessListVueProps,
16094
16364
  HelixHeadlessListVueEvents
16095
16365
  >;
16096
- /** The listbox is the control, and options are its items. A Select is a listbox with a trigger in front of it, a Combobox is a listbox with a text input, and a command palette is a listbox in a dialog. They differ only in what opens the list and what filters it. With 'multiple' set, 'value' is a comma-separated string, like 'Checkbox.Group''s, because 'MixinControllerValue' holds a string. The form receives one entry per selected option, as a native '<select multiple>' sends it, so your server does not split on commas. Selected and active are separate. The selected option is the value. The active option is where the keyboard is: the arrow keys move it, and 'aria-activedescendant' points to it while focus stays on the list. The arrow keys, Home, End, PageUp and PageDown move the highlight, and typed letters move it to the next option whose words start with them. In a single-choice list the highlight is the choice unless 'manual' is set; then Enter, Space or a click chooses. With 'multiple', Space toggles the highlighted option, Shift with an arrow adds the option it moves to, Shift with Home or End adds every option from the highlight to that end, and Control+A or Command+A chooses every option, or none where all are chosen. In a filter field, Space, Home, End and letters edit the text, and with 'multiple', Control with Shift and Home or End adds every option from the highlight to that end. An option with 'href' is a link: Enter or a press follows it and selects nothing, and moving onto it with the arrows does not follow it. As a filter narrows the list, a screen reader hears how many options are left, such as "3 results", from 'result-label' and 'results-label'. A filter that leaves none says 'empty-text'. */
16366
+ /** The listbox is the control, and options are its items. A Select is a listbox with a trigger in front of it, a Combobox is a listbox with a text input, and a command palette is a listbox in a dialog. They differ only in what opens the list and what filters it. With 'multiple' set, 'value' is a comma-separated string, like 'Checkbox.Group''s, because 'MixinControllerValue' holds a string. The form receives one entry per selected option, as a native '<select multiple>' sends it, so your server does not split on commas. Selected and active are separate. The selected option is the value. The active option is where the keyboard is: the arrow keys move it, and 'aria-activedescendant' points to it while focus stays on the list. **Keyboard.** The list is one tab stop, or its filter field is where there is one. In a single-choice list the highlight is the choice unless 'manual' is set; then Enter, Space or a click chooses. | Key | What it does | |---|---| | Down, Up | Moves the highlight to the next or the previous option, round from the last to the first. With 'layout="grid"', to the option below or above, stopping at the edge. | | Right, Left | With 'layout="grid"', moves to the next or the previous option, mirrored right to left. In a filter field, moves the caret. | | Home, End | Moves to the first or the last option. In a filter field, moves the caret. | | Page Down, Page Up | Moves by as many options as the list shows at once. | | A letter or a word | Moves to the next option whose words start with what you typed. In a filter field, types it. | | Enter | Chooses the highlighted option, or follows it where it is a link. | | Space | Chooses the highlighted option, or with 'multiple' toggles it. In a filter field, types a space. | | Shift with Down or Up | With 'multiple', adds the option the highlight moves to. In a filter field, moves the highlight and leaves the value. | | Shift with Space | With 'multiple', adds every option from the one last chosen to the highlighted one. In a filter field, types a space. | | Shift with Home or End | With 'multiple', adds every option from the highlight to that end. In a filter field, hold Control as well. | | Control or Command with A | With 'multiple', chooses every option, or none where all are chosen. In a filter field, selects the text. | | Escape | In a filter field, clears the filter. | **ARIA.** The 'items' part is the 'listbox', named by the label and described by the hint and the message, with 'aria-multiselectable' under 'multiple', 'aria-required', 'aria-invalid', and 'aria-busy' while loading. Each option is an 'option' with 'aria-selected'. The list, or its filter field, points 'aria-activedescendant' at the highlighted option; the field is 'aria-autocomplete="list"' and controls the list. An option with 'href' is a link: Enter or a press follows it and selects nothing, and moving onto it with the arrows does not follow it. As a filter narrows the list, a screen reader hears how many options are left, such as "3 results", from 'result-label' and 'results-label'. A filter that leaves none says 'empty-text'. */
16097
16367
  "helix-headless-listbox": DefineCustomElement<
16098
16368
  HelixHeadlessListbox,
16099
16369
  HelixHeadlessListboxVueProps,
@@ -16129,7 +16399,7 @@ export interface WcToolkitVueGlobalComponents {
16129
16399
  HelixHeadlessMapLandcoverVueProps,
16130
16400
  HelixHeadlessMapLandcoverVueEvents
16131
16401
  >;
16132
- /** A button placed at a latitude and longitude. 'connectMap' positions it on the map and moves it as the map moves. Its name shows beside it on hover and focus. Pressing a marker sends 'helix-activate' from the frame with the marker's 'name', or its 'label' if it has no name. All the markers in a map share one tab stop. The arrow keys move between them in the order they are written. */
16402
+ /** A button placed at a latitude and longitude. 'connectMap' positions it on the map and moves it as the map moves. Its name shows beside it on hover and focus. Pressing a marker sends 'helix-activate' from the frame with the marker's 'name', or its 'label' if it has no name. All the markers in a map share one tab stop. The arrow keys move between them in the order they are written. Taking away the marker that has focus moves focus to the next one, or to the one before where it was the last. */
16133
16403
  "helix-headless-map-marker": DefineCustomElement<
16134
16404
  HelixHeadlessMapMarker,
16135
16405
  HelixHeadlessMapMarkerVueProps,
@@ -16183,7 +16453,7 @@ export interface WcToolkitVueGlobalComponents {
16183
16453
  HelixHeadlessMenuItemVueProps,
16184
16454
  HelixHeadlessMenuItemVueEvents
16185
16455
  >;
16186
- /** The trigger is slotted and stays your own element, as with the tooltip. The menu renders its surface in the top layer with the popover API, so an ancestor with 'overflow: hidden' does not clip it and it needs no 'z-index'. Slot a 'helix-button' or 'helix-icon-button' as the trigger, and the menu tells it that it opens a menu and whether the menu is open. A plain '<button>' can only be told by writing attributes onto your markup, which the menu does not do, so give it 'aria-haspopup="menu"' and set its 'aria-expanded' from the 'toggle' event. Submenus drill down. A submenu replaces the panel's content, and a back row returns to the previous page. One panel avoids the diagonal pointer path that side-by-side panels need, stays inside a narrow window, and works on touch screens, which have no hover. The root holds which page is open, because only one page shows at a time. It sets this on items as a property, never as an attribute. An attribute written onto your element after it upgrades causes a hydration mismatch. Group rows under a heading with 'Menu.Section', which is a 'group' named by its heading. Between runs of rows, a '<helix-divider announced>' is a separator a screen reader announces. Keys: Enter, Space or Down Arrow on the trigger opens the menu on its first row, and Up Arrow on its last. In the menu, Up and Down Arrow move between rows, Home and End go to the first and the last, a typed letter moves to the next row whose name starts with it, Enter and Space choose, Right Arrow opens a row's submenu and Left Arrow goes back, the two swapping on a right-to-left page, and Escape closes the menu and returns focus to the trigger. Tab closes it and moves on. While it is open, the surface carries the trigger's width as '--floating-anchor-inline-size' and the room left below it as '--floating-available-block-size', as Radix's dropdown menu publishes its trigger's width, for a menu as wide as its trigger: 'helix-menu::part(surface) { min-inline-size: var(--floating-anchor-inline-size) }'. With 'context', the trigger is an area and the menu is its context menu: a right-click, a long press, Shift+F10 or the menu key over the area opens it at the pointer, or at the area's corner from the keyboard, as Radix's context menu does. A press on the area does not open it, and closing it returns focus to where it was. */
16456
+ /** The trigger is slotted and stays your own element, as with the tooltip. The menu renders its surface in the top layer with the popover API, so an ancestor with 'overflow: hidden' does not clip it and it needs no 'z-index'. Slot a 'helix-button' or 'helix-icon-button' as the trigger, and the menu tells it that it opens a menu and whether the menu is open. A plain '<button>' can only be told by writing attributes onto your markup, which the menu does not do, so give it 'aria-haspopup="menu"' and set its 'aria-expanded' from the 'toggle' event. Submenus drill down. A submenu replaces the panel's content, and a back row returns to the previous page. One panel avoids the diagonal pointer path that side-by-side panels need, stays inside a narrow window, and works on touch screens, which have no hover. The root holds which page is open, because only one page shows at a time. It sets this on items as a property, never as an attribute. An attribute written onto your element after it upgrades causes a hydration mismatch. Group rows under a heading with 'Menu.Section', which is a 'group' named by its heading. Between runs of rows, a '<helix-divider>' is a separator a screen reader announces. Keys: Enter, Space or Down Arrow on the trigger opens the menu on its first row, and Up Arrow on its last. In the menu, Up and Down Arrow move between rows, Home and End go to the first and the last, a typed letter moves to the next row whose name starts with it, Enter and Space choose, Right Arrow opens a row's submenu and Left Arrow goes back, the two swapping on a right-to-left page, and Escape closes the menu and returns focus to the trigger. Tab closes it and moves on. While it is open, the surface carries the trigger's width as '--floating-anchor-inline-size' and the room left below it as '--floating-available-block-size', as Radix's dropdown menu publishes its trigger's width, for a menu as wide as its trigger: 'helix-menu::part(surface) { min-inline-size: var(--floating-anchor-inline-size) }'. With 'context', the trigger is an area and the menu is its context menu: a right-click, a long press, Shift+F10 or the menu key over the area opens it at the pointer, or at the area's corner from the keyboard, as Radix's context menu does. A press on the area does not open it, and closing it returns focus to where it was. */
16187
16457
  "helix-headless-menu": DefineCustomElement<
16188
16458
  HelixHeadlessMenu,
16189
16459
  HelixHeadlessMenuVueProps,
@@ -16219,7 +16489,7 @@ export interface WcToolkitVueGlobalComponents {
16219
16489
  HelixHeadlessNotificationVueProps,
16220
16490
  HelixHeadlessNotificationVueEvents
16221
16491
  >;
16222
- /** Notifications are slotted children. Each one is your own markup, with an avatar, a link, or a button in it. Feeds usually hold tens of items, so writing them out lets an item hold anything. The list does not virtualize. Windowing needs the list to own the data, and here you own it, so N notifications are N elements. For a feed of thousands, use a data table with a custom cell. Read state is reported to you. Marking read goes from the root to the item and from the item to you, so a canceled 'helix-read' changes nothing, and if you own 'read', nothing changes until you set it. 'unread' is derived from the items and written to an attribute, so a stylesheet and a badge can both use it without counting. **The feed is one 'Tab' stop for its rows.** Each row takes focus itself and is read by its label. 'ArrowDown' and 'ArrowUp' move to the next and the previous row, 'Home' and 'End' to the first and the last, and 'PageDown' and 'PageUp' move a row on or back from anywhere inside one, as in the APG feed pattern. The controls inside a row stay in the 'Tab' order. Set 'total' when the feed holds one page of a longer list, and each row says its place in the whole of it. **'load-more' adds a button after the list** that sends 'helix-load-more', for a feed that holds one page of a longer list. Append the next page, set 'loading' while it is on its way, and take 'load-more' off once there is nothing more. While the feed is loading the button stays, so focus stays on it, and it is 'aria-disabled' and sends nothing. */
16492
+ /** Notifications are slotted children. Each one is your own markup, with an avatar, a link, or a button in it. Feeds usually hold tens of items, so writing them out lets an item hold anything. The list does not virtualize. Windowing needs the list to own the data, and here you own it, so N notifications are N elements. For a feed of thousands, use a data table with a custom cell. Read state is reported to you. Marking read goes from the root to the item and from the item to you, so a canceled 'helix-read' changes nothing, and if you own 'read', nothing changes until you set it. 'unread' is derived from the items and written to an attribute, so a stylesheet and a badge can both use it without counting. **The feed is one 'Tab' stop for its rows.** Each row takes focus itself and is read by its label. 'ArrowDown' and 'ArrowUp' move to the next and the previous row, 'Home' and 'End' to the first and the last, and 'PageDown' and 'PageUp' move a row on or back from anywhere inside one, as in the APG feed pattern. The controls inside a row stay in the 'Tab' order. Set 'total' when the feed holds one page of a longer list, and each row says its place in the whole of it. **'load-more' adds a button after the list** that sends 'helix-load-more', for a feed that holds one page of a longer list. Append the next page, set 'loading' while it is on its way, and take 'load-more' off once there is nothing more. While the feed is loading the button stays, so focus stays on it, and it is 'aria-disabled' and sends nothing. **'load-error' says a page could not be fetched**, such as "Could not load notifications": it shows under the rows there are, in the 'error' part, in place of the empty and loading lines, and a screen reader hears it. Clear it when you ask again. */
16223
16493
  "helix-headless-notifications": DefineCustomElement<
16224
16494
  HelixHeadlessNotifications,
16225
16495
  HelixHeadlessNotificationsVueProps,
@@ -16297,7 +16567,7 @@ export interface WcToolkitVueGlobalComponents {
16297
16567
  HelixHeadlessProgressVueProps,
16298
16568
  HelixHeadlessProgressVueEvents
16299
16569
  >;
16300
- /** The code is drawn as one '<path>'. Runs of adjacent dark modules are joined, so a row of eight is one horizontal move. A code of useful length has about a thousand modules, and an element for each would be a thousand nodes for one image. The element has 'role="img"' and an accessible name. Set 'label' to what the code is for, such as "Open the menu". With no 'label', a code is named by 'code-label', "QR code", followed by its value where the value is a web address, which a URL read aloud makes a destination. Any other value is never read out: a code that sets up an authenticator or joins a network carries a secret in it. The quiet zone of four modules is required by the specification, and a scanner rejects a code cropped to its edge. It is drawn inside the 'viewBox', so it stays at any size, including a size set in CSS. 'correction' sets how much of the code can be lost. At 'H' a code can lose thirty percent and still scan, so a mark in the center slot is safe. At 'L' the same mark makes the code unscannable. The default is 'M', and 'H' when the 'logo' slot is filled. A higher level holds fewer characters, so a value that fits at 'M' can be too long once a logo raises the level to 'H'. A value too long for the level draws no code: the element fires 'error', carries ':state(overflow)', and shows what is in the 'fallback' slot, such as the link written out. 'toSvg()', 'toPng()' and 'download()' give the drawn code as a file of its own, in the colors it is drawn in, with a slotted image or SVG logo where it sits, for a page that offers it to save or print, as Zag's download trigger does. */
16570
+ /** The code is drawn as one '<path>'. Runs of adjacent dark modules are joined, so a row of eight is one horizontal move. A code of useful length has about a thousand modules, and an element for each would be a thousand nodes for one image. The element has 'role="img"' and an accessible name. Set 'label' to what the code is for, such as "Open the menu". With no 'label', a code is named by 'code-label', "QR code", followed by its value where the value is a web address, which a URL read aloud makes a destination. Any other value is never read out: a code that sets up an authenticator or joins a network carries a secret in it. The quiet zone of four modules is required by the specification, and a scanner rejects a code cropped to its edge. It is drawn inside the 'viewBox', so it stays at any size, including a size set in CSS. 'correction' sets how much of the code can be lost. At 'H' a code can lose thirty percent and still scan, so a mark in the center slot is safe. At 'L' the same mark makes the code unscannable. The default is 'M', and 'H' when the 'logo' slot is filled. A code that holds a logo at a 'correction' below 'H' warns once with the kind 'unscannable-logo'. A higher level holds fewer characters, so a value that fits at 'M' can be too long once a logo raises the level to 'H'. A value too long for the level draws no code: the element fires 'error', carries ':state(overflow)', and shows what is in the 'fallback' slot, such as the link written out. 'toSvg()', 'toPng()' and 'download()' give the drawn code as a file of its own, in the colors it is drawn in, with a slotted image or SVG logo where it sits, for a page that offers it to save or print, as Zag's download trigger does. 'download()' saves an SVG for a name ending in '.svg', and a PNG for any other. */
16301
16571
  "helix-headless-qr-code": DefineCustomElement<
16302
16572
  HelixHeadlessQrCode,
16303
16573
  HelixHeadlessQrCodeVueProps,
@@ -16339,7 +16609,7 @@ export interface WcToolkitVueGlobalComponents {
16339
16609
  HelixHeadlessScrollAreaVueProps,
16340
16610
  HelixHeadlessScrollAreaVueEvents
16341
16611
  >;
16342
- /** A trigger that opens a 'Listbox'. The list is the same element you can use on its own, with the same keyboard behavior, filtering, and multi-select rules. Select adds a trigger that shows what is chosen, a floating surface, and a place for focus to return to when the list closes. Your options stay in your light DOM and are slotted through into the listbox, so the listbox looks through slots to find them. 'Select' owns the value, passes it down to the listbox, and takes changes back, so the value lives in one place. Set 'valueContent' to draw the trigger's content from the chosen options, and several chosen options are written as a list in the reader's language. In the open list the arrow keys, Home, End, PageUp, PageDown and typed letters move the highlight, and Enter, Space or a click chooses it and closes the list. Tab closes the list and moves on. On the closed trigger, ArrowDown, Enter and Space open the list on the chosen option, ArrowUp opens it on the chosen or last option, Home and End open it on the first or last, and typed letters choose the option whose words start with them, as a native '<select>' does. */
16612
+ /** A trigger that opens a 'Listbox'. The list is the same element you can use on its own, with the same keyboard behavior, filtering, and multi-select rules. Select adds a trigger that shows what is chosen, a floating surface, and a place for focus to return to when the list closes. Your options stay in your light DOM and are slotted through into the listbox, so the listbox looks through slots to find them. 'Select' owns the value, passes it down to the listbox, and takes changes back, so the value lives in one place. Set 'valueContent' to draw the trigger's content from the chosen options, and several chosen options are written as a list in the reader's language. **Keyboard.** On the closed trigger: | Key | What it does | |---|---| | Down, Enter, Space | Opens the list on the chosen option, or the first. | | Up | Opens the list on the chosen option, or the last. | | Home, End | Opens the list on the first or the last option. | | Left, Right | Chooses the option before or after the chosen one without opening, as React Aria's Select does, in either direction of text. | | A letter or a word | Chooses the option whose words start with what you typed, as a native '<select>' does. With 'multiple', opens the list on it. | In the open list, which is a 'Listbox': | Key | What it does | |---|---| | Down, Up, Home, End, Page Down, Page Up | Moves the highlight. | | A letter or a word | Moves the highlight to the next option whose words start with what you typed. | | Enter, Space | Chooses the highlighted option and closes the list. With 'multiple', toggles it and leaves the list open. | | Escape | Closes the list and puts focus back on the trigger. | | Tab | Closes the list and moves on. | A choice made on the closed trigger is said aloud on Apple devices, where VoiceOver does not read the trigger's new name. **ARIA.** The trigger is a 'button' with 'aria-haspopup="listbox"' and 'aria-expanded', named by the label and then the chosen words, as a native '<select>' is. The list is the listbox 'Listbox' describes, named by the label, or by 'list-label' where there is none. Set 'autocomplete' to let a browser's autofill choose, as a native '<select>' with the same attribute would. */
16343
16613
  "helix-headless-select": DefineCustomElement<
16344
16614
  HelixHeadlessSelect,
16345
16615
  HelixHeadlessSelectVueProps,
@@ -16369,19 +16639,25 @@ export interface WcToolkitVueGlobalComponents {
16369
16639
  HelixHeadlessSparklineVueProps,
16370
16640
  HelixHeadlessSparklineVueEvents
16371
16641
  >;
16372
- /** Each item is a command, so it has the 'menuitem' role. A megamenu holds destinations, so it is a disclosure of links. A speed dial holds actions, which is what 'role="menu"' is for. The name is text rendered beside the icon, and it is the accessible name. A 'title' on an icon shows only on hover. Visible text is read, searched, and translated like other text. */
16642
+ /** A 'group' of the dial's menu, named by its label, as React Aria's menu sections and Menu's groups are: a reader hears the name on entering the set, and the arrow keys walk through every group's actions in order, from the last action of one group to the first of the next. Put actions straight into the group, and the group straight into the dial. Anything else slotted here is drawn and is not an action. */
16643
+ "helix-headless-speed-dial-group": DefineCustomElement<
16644
+ HelixHeadlessSpeedDialGroup,
16645
+ HelixHeadlessSpeedDialGroupVueProps,
16646
+ HelixHeadlessSpeedDialGroupVueEvents
16647
+ >;
16648
+ /** Each item is a command, so it has the 'menuitem' role. A megamenu holds destinations, so it is a disclosure of links. A speed dial holds actions, which is what 'role="menu"' is for. The name is text rendered beside the icon, and it is the accessible name. A 'title' on an icon shows only on hover. Visible text is read, searched, and translated like other text. 'shortcut' gives the action's keyboard shortcut as a chord, such as 'mod+s', the grammar Menu's rows use. The action carries it as 'aria-keyshortcuts' and draws it after the name in the platform's glyphs or words, '⌘S' on an Apple keyboard and 'Ctrl+S' elsewhere, as Menu draws its rows' shortcuts. Put a 'Kbd' in the 'shortcut' slot to draw it as keys instead; the dial imports no 'Kbd' of its own. Showing a shortcut does not bind it. */
16373
16649
  "helix-headless-speed-dial-item": DefineCustomElement<
16374
16650
  HelixHeadlessSpeedDialItem,
16375
16651
  HelixHeadlessSpeedDialItemVueProps,
16376
16652
  HelixHeadlessSpeedDialItemVueEvents
16377
16653
  >;
16378
- /** A speed dial is a menu. Its items are commands, so it uses 'role="menu"' and 'menuitem', and it is built from the same pieces as 'Menu': - 'KeyboardNavigationController' for the arrow keys - 'PopoverController' for the panel - 'MixinControllerOpen' for open and closed It is a separate component because a speed dial has no submenus, headers, or checkable items. You slot the trigger. The usual floating action button is 'IconButton' with 'shape="circle"' and 'raised'. There is no 'helix-fab', because 'IconButton' already has 'emphasis', 'tone', 'label', and a size. Position the button with 'data-dock' in the base layer. All four arrow keys move through the actions, because a speed dial has no nested levels to reserve the horizontal pair for. This is the default behavior of the keyboard controller. Typing a letter moves to the next action whose name starts with it. The actions are one tab stop, and Tab closes the dial and moves on. */
16654
+ /** A speed dial is a menu. Its items are commands, so it uses 'role="menu"' and 'menuitem', and it is built from the same pieces as 'Menu': - 'KeyboardNavigationController' for the arrow keys - 'PopoverController' for the panel - 'MixinControllerOpen' for open and closed It is a separate component because a speed dial has no submenus, headers, or checkable items. You slot the trigger. The usual floating action button is 'IconButton' with 'shape="circle"' and 'raised'. There is no 'helix-fab', because 'IconButton' already has 'emphasis', 'tone', 'label', and a size. Position the button with 'data-dock' in the base layer. All four arrow keys move through the actions, because a speed dial has no nested levels to reserve the horizontal pair for. This is the default behavior of the keyboard controller. Typing a letter moves to the next action whose name starts with it. The actions are one tab stop, and Tab closes the dial and moves on. **Keyboard.** On the trigger, Enter, Space or a press opens the dial on its first action. With the dial open: | Key | What it does | |---|---| | Down, Right | Moves to the next action, from the last back to the first. | | Up, Left | Moves to the action before, from the first round to the last. | | Home, End | Moves to the first or the last action. | | A letter | Moves to the next action whose name starts with it. | | Enter, Space | Chooses the action, and the dial closes. | | Escape | Closes the dial and puts focus back on the trigger. | | Tab | Closes the dial and moves on. | **Groups.** Put actions in 'Speed Dial.Group', named by its 'label', to set them apart as Menu's sections do: each is a 'group' of the menu, and the arrow keys walk through every group's actions in order. **A trigger with its own action.** With 'open-on="long-press"', a press on the trigger is the trigger's own, such as composing a message, and holding it for half a second opens the dial, as React Aria's menu trigger does with 'trigger="longPress"'. Alt+Down or Alt+Up opens it from the keyboard, and the trigger says so in its description, 'long-press-label', the drawn one and a slotted one alike. A press that has opened the dial does not also do the trigger's action. */
16379
16655
  "helix-headless-speed-dial": DefineCustomElement<
16380
16656
  HelixHeadlessSpeedDial,
16381
16657
  HelixHeadlessSpeedDialVueProps,
16382
16658
  HelixHeadlessSpeedDialVueEvents
16383
16659
  >;
16384
- /** A splitter has one axis. Nest splitters to get two axes and three-pane or four-pane layouts. When a splitter is slotted into a pane of another at a right angle, a corner handle appears where the dividers cross. It shows the 'move' cursor, responds to both arrow axes, and a drag moves both dividers at once. The corner is added at 'firstUpdated' and is not in the server markup. Before it appears, both dividers work on their own. The divider has 'role="separator"' and 'aria-valuenow', and 'aria-controls' names the start pane. Drag it with a pointer or move it with the arrow keys, press 'Home' or 'End' to move it to its bounds, and press 'Enter' to collapse the start pane and open it again. A drag in progress is tracked as a state, so both dividers a corner moves stay lit for as long as they move. By default, 'min' and 'max' let the divider reach either edge, so you can drag a pane fully closed. Set them to limit the range. A pane can be collapsed, which is a separate state from a divider at the edge. 'collapsed' names the shut pane, 'start' or 'end', and the pane opens back to the position where the collapsing gesture began. A drag records that position on press, and every other way of collapsing records it in 'settle'. 'collapsed-size' keeps a sliver of the pane visible, such as a tab strip. Collapsing overrides 'min' and 'max'. */
16660
+ /** A splitter has one axis. Nest splitters to get two axes and three-pane or four-pane layouts. When a splitter is slotted into a pane of another at a right angle, a corner handle appears where the dividers cross. It shows the 'move' cursor, responds to both arrow axes, and a drag moves both dividers at once. The corner is added at 'firstUpdated' and is not in the server markup. Before it appears, both dividers work on their own. The divider has 'role="separator"' and 'aria-valuenow', with 'aria-valuetext' saying the start pane's share as a percentage in the reader's locale, and 'aria-controls' names the start pane. Drag it with a pointer or move it with the arrow keys, press 'Home' or 'End' to move it to its bounds, and press 'Enter' to collapse the start pane and open it again. A drag in progress is tracked as a state, so both dividers a corner moves stay lit for as long as they move. By default, 'min' and 'max' let the divider reach either edge, so you can drag a pane fully closed. Set them to limit the range. A pane can be collapsed, which is a separate state from a divider at the edge. 'collapsed' names the shut pane, 'start' or 'end', and the pane opens back to the position where the collapsing gesture began. A drag records that position on press, and every other way of collapsing records it in 'settle'. 'collapsed-size' keeps a sliver of the pane visible, such as a tab strip. Collapsing overrides 'min' and 'max'. */
16385
16661
  "helix-headless-splitter": DefineCustomElement<
16386
16662
  HelixHeadlessSplitter,
16387
16663
  HelixHeadlessSplitterVueProps,
@@ -16417,7 +16693,7 @@ export interface WcToolkitVueGlobalComponents {
16417
16693
  HelixHeadlessSwitchVueProps,
16418
16694
  HelixHeadlessSwitchVueEvents
16419
16695
  >;
16420
- /** Sets its own role, because a grid of elements has no table structure for assistive technology otherwise. 'header' makes the cell a header, so a screen reader announces it with the values it heads: - In a row that holds a cell without 'header', it is a 'rowheader' and names its row, for example "web-app" in a row of a service's values. - In a row of 'header' cells alone, it is a 'columnheader', which is what a table with no 'TableColumn' heads its columns with. The role is on the host so the cell stays a child of its row in the flat tree, which keeps the table structure intact. */
16696
+ /** Sets its own role, because a grid of elements has no table structure for assistive technology otherwise. 'header' makes the cell a header, so a screen reader announces it with the values it heads: - In a row that holds a cell without 'header', it is a 'rowheader' and names its row, for example "web-app" in a row of a service's values. - In a row of 'header' cells alone, it is a 'columnheader', which is what a table with no 'TableColumn' heads its columns with. The role is on the host so the cell stays a child of its row in the flat tree, which keeps the table structure intact. In a 'grid' table a value is a 'gridcell', and the table gives the cell a 'tabindex' so focus can rest on it. */
16421
16697
  "helix-headless-table-cell": DefineCustomElement<
16422
16698
  HelixHeadlessTableCell,
16423
16699
  HelixHeadlessTableCellVueProps,
@@ -16429,13 +16705,13 @@ export interface WcToolkitVueGlobalComponents {
16429
16705
  HelixHeadlessTableColumnVueProps,
16430
16706
  HelixHeadlessTableColumnVueEvents
16431
16707
  >;
16432
- /** Lays out the rows on a CSS grid, so every column lines up across rows and each row stays a real element that can be styled, hidden, or made interactive. A '<table>' layout aligns columns but limits almost everything else. A grid of elements has no table structure for assistive technology, so the roles are set explicitly: 'table', 'row', 'cell', 'columnheader', and 'rowheader' for a 'header' cell in a row of values. Rows are 'display: contents', so their cells become items of the one grid. **Sorting.** A column with 'sortable' and a 'field' draws its heading as a button that sorts the rows by the text of its cells, numbers by their value. Your markup is not reordered: the table draws the rows in the sorted order. 1. Each press cycles the column through ascending, descending, and the order the rows were written in, which keeps a server's own ranking reachable. 2. 'helix-sort' asks first, with 'field:direction', or empty for the written order. Refuse it to keep the order, or to sort the rows yourself and set 'sort'. 3. 'helix-sorted' follows once the order stands, and 'sort' holds it. 4. The heading carries 'aria-sort', and a screen reader hears 'sorted-label' ("Sorted by Name, ascending") or 'unsorted-label' from a polite region. Tab reaches each sort button, and Enter or Space presses it. The 'heading' slot names the table: slot a heading or a line of text into it, and the table is named by its words. An 'aria-label' or 'aria-labelledby' on the host wins over it. **Selecting.** 'selectable' adds a column of checkboxes. 1. Each row is known by its 'value', or by its place among the rows where it has none, and 'selected' holds the chosen keys, comma separated, the same shape 'DataTable' uses. 'default-selected' is where it starts. 2. A row's checkbox is named by 'select-row-label' ("Select {row}") with the words of the row's first cell. The checkbox in the heading selects every row, and shows a dash while only some are chosen. 3. 'helix-select' asks first, with every key the change would leave. Refuse it to keep the selection. 'helix-selected' follows once it stands. 4. A chosen row takes ':state(selected)', and a screen reader hears 'selected-label' ("2 selected") from a polite region. Tab reaches each checkbox, and Space ticks it. For a grid a reader moves through with the arrow keys, with typeahead and range selection, use 'DataTable'. To act on one row, put a link or a button in a cell. The CSS custom properties listed for this component are written by it and read by the stylesheet that draws it. Do not set them. Each holds a number the component computes and CSS cannot, so the stylesheet can draw the table without measuring anything. */
16708
+ /** Lays out the rows on a CSS grid, so every column lines up across rows and each row stays a real element that can be styled, hidden, or made interactive. A '<table>' layout aligns columns but limits almost everything else. A grid of elements has no table structure for assistive technology, so the roles are set explicitly: 'table', 'row', 'cell', 'columnheader', and 'rowheader' for a 'header' cell in a row of values. Rows are 'display: contents', so their cells become items of the one grid. **Sorting.** A column with 'sortable' and a 'field' draws its heading as a button that sorts the rows by the text of its cells, numbers by their value. Your markup is not reordered: the table draws the rows in the sorted order. 1. Each press cycles the column through ascending, descending, and the order the rows were written in, which keeps a server's own ranking reachable. 2. 'helix-sort' asks first, with 'field:direction', or empty for the written order. Refuse it to keep the order, or to sort the rows yourself and set 'sort'. 3. 'helix-sorted' follows once the order stands, and 'sort' holds it. 4. The heading carries 'aria-sort', and a screen reader hears 'sorted-label' ("Sorted by Name, ascending") or 'unsorted-label' from a polite region. Tab reaches each sort button, and Enter or Space presses it. The 'heading' slot names the table: slot a heading or a line of text into it, and the table is named by its words. An 'aria-label' or 'aria-labelledby' on the host wins over it. **Selecting.** 'selectable' adds a column of checkboxes. 1. Each row is known by its 'value', or by its place among the rows where it has none, and 'selected' holds the chosen keys, comma separated, the same shape 'DataTable' uses. 'default-selected' is where it starts. 2. A row's checkbox is named by 'select-row-label' ("Select {row}") with the words of the row's first cell. The checkbox in the heading selects every row, and shows a dash while only some are chosen. 3. 'helix-select' asks first, with every key the change would leave. Refuse it to keep the selection. 'helix-selected' follows once it stands. 4. A chosen row takes ':state(selected)', and a screen reader hears 'selected-label' ("2 selected") from a polite region. Tab reaches each checkbox, and Space ticks it. To act on one row, put a link or a button in a cell, or give the row an 'href'. **A grid.** 'grid' makes the table one tab stop that the arrow keys move through cell by cell, the headings included, as React Aria's table is. The table is then a 'grid' and each value a 'gridcell', and the table gives every cell a 'tabindex' so focus can rest on it: set 'grid' only where the cells may carry one. For typeahead and range selection, use 'DataTable'. | Key | What it does | |---|---| | Right, Left | Moves one cell along the row. Left moves on, on a right-to-left page. | | Down, Up | Moves one row, the headings included. | | Home, End | Moves to the first or the last cell of the row. | | Control with Home or End | Moves to the first or the last cell of the table. | | Page Down, Page Up | Moves by the rows that fit in view. | | Enter, F2 | Moves into the cell's links and controls. Escape or F2 moves back to the cell, and Tab moves between the controls of one cell. | | Enter on a cell of a row with 'href' | Follows the row's link. | | Enter, Space on a sortable heading | Sorts by the column. | | Space on a row, Enter or Space on its checkbox cell | Selects the row, in a 'selectable' table. | | Control or Command with A | Selects every row, in a 'selectable' table. | | Tab | Leaves the table. | The CSS custom properties listed for this component are written by it and read by the stylesheet that draws it. Do not set them. Each holds a number the component computes and CSS cannot, so the stylesheet can draw the table without measuring anything. */
16433
16709
  "helix-headless-table": DefineCustomElement<
16434
16710
  HelixHeadlessTable,
16435
16711
  HelixHeadlessTableVueProps,
16436
16712
  HelixHeadlessTableVueEvents
16437
16713
  >;
16438
- /** The row renders its cells straight through and lays out none of them, so a stylesheet can place them in the table's grid and every column lines up across rows. The row still exists as an element, so you can style it, hide it, or make it interactive. In a 'selectable' table the row draws a checkbox cell before its own cells, and 'value' is the key the table's 'selected' lists it by. **'href' makes the whole row a link**, as a row action does in React Aria's table: a press anywhere on the row follows it, except on a link or a control of the row's own, and Control, Command or Shift open it the way they open a link. A drag that selects text follows nothing. A row in a table is not a stop of its own, so put the same link in a cell, usually the row header, which is what the keyboard and a screen reader reach. */
16714
+ /** The row renders its cells straight through and lays out none of them, so a stylesheet can place them in the table's grid and every column lines up across rows. The row still exists as an element, so you can style it, hide it, or make it interactive. In a 'selectable' table the row draws a checkbox cell before its own cells, and 'value' is the key the table's 'selected' lists it by. **'href' makes the whole row a link**, as a row action does in React Aria's table: a press anywhere on the row follows it, except on a link or a control of the row's own, and Control, Command or Shift open it the way they open a link. A drag that selects text follows nothing. A row in a table is not a stop of its own, so put the same link in a cell, usually the row header, which is what the keyboard and a screen reader reach. In a 'grid' table, Enter on any cell of the row follows it as well. */
16439
16715
  "helix-headless-table-row": DefineCustomElement<
16440
16716
  HelixHeadlessTableRow,
16441
16717
  HelixHeadlessTableRowVueProps,
@@ -16507,7 +16783,7 @@ export interface WcToolkitVueGlobalComponents {
16507
16783
  HelixHeadlessTimelineVueProps,
16508
16784
  HelixHeadlessTimelineVueEvents
16509
16785
  >;
16510
- /** Each message is an element because it has a timeout, a tone, a dismiss control, and a lifetime that pauses. **Each item runs its own timer.** A timer held by the region would restart with each new message, and the last of three messages would stay for nine seconds. **Each message is an 'alertdialog' named by its words**, which is how a reader who moves into the stack hears which message they are on. Give it a 'heading' and a 'description', and the heading names it and the description describes it, for a message with a title and a line of detail. The region says each message once as it arrives, a 'danger' one assertively, so a message is never a live region of its own. A touch or a pen swipes a message toward the end of the line, and past halfway, or quickly, dismisses it through the same 'helix-dismiss' as its control. While it moves, the distance is on the 'item' part as '--toast-swipe-x'. **Messages are inverted by default.** The item flips 'color-scheme', so a new message stands out from the page without using a color that carries meaning. */
16786
+ /** Each message is an element because it has a timeout, a tone, a dismiss control, and a lifetime that pauses. **Each item runs its own timer.** A timer held by the region would restart with each new message, and the last of three messages would stay for nine seconds. It pauses while the pointer or focus is on the message, and while the page is hidden, so a message is not spent in a background tab. **Each message is an 'alertdialog' named by its words**, which is how a reader who moves into the stack hears which message they are on. Give it a 'heading' and a 'description', and the heading names it and the description describes it, for a message with a title and a line of detail. The region says each message once as it arrives, a 'danger' one assertively, so a message is never a live region of its own. A touch or a pen swipes a message toward the end of the line, and past halfway, or quickly, dismisses it through the same 'helix-dismiss' as its control. While it moves, the distance is on the 'item' part as '--toast-swipe-x'. **Messages are inverted by default.** The item flips 'color-scheme', so a new message stands out from the page without using a color that carries meaning. */
16511
16787
  "helix-headless-toast-item": DefineCustomElement<
16512
16788
  HelixHeadlessToastItem,
16513
16789
  HelixHeadlessToastItemVueProps,
@@ -16531,7 +16807,7 @@ export interface WcToolkitVueGlobalComponents {
16531
16807
  HelixHeadlessToggleVueProps,
16532
16808
  HelixHeadlessToggleVueEvents
16533
16809
  >;
16534
- /** A toolbar holds a mix of controls, such as buttons, toggles, and menus. A button group holds one kind, so the two are separate components. The toolbar is one tab stop, and the arrow keys move between its controls, so three toolbars take three presses of Tab to pass. Any element the browser can focus counts as a control, including your own elements. A child that takes no focus, such as a divider, is skipped. A menu is reached at its trigger. Controls inside a plain wrapper, such as a 'Button Group', are each a stop of the toolbar's own, as React Aria's toolbar flattens a group: the arrows walk through the group's buttons and on past it, and the group takes no tab stop of its own. The arrows wrap from the last control to the first. Set 'stop-at-ends' to keep them at the ends, as Radix's 'loop' set to false does. A toggle group of pressed buttons, 'selection-mode="multiple"', is walked through the same way, each toggle a stop on the toolbar's axis, as React Aria's toolbar walks its toggle buttons. Another nested composite, such as a radio-style toggle group, is one stop on the toolbar's axis: the toolbar's arrows move past it, and the arrows across the toolbar move inside it. A composite with a 'focusable' property, as Toggle Group has, gives up its own tab stop while the toolbar's is elsewhere, so Tab stops once in the toolbar. A composite without one keeps its own tab stop. A toolbar inside another toolbar, a Helix one or the page's own 'role="toolbar"', is a 'group' of the outer one, as React Aria's is: the outer toolbar's arrows walk through its controls and on past them, and it takes no keys and no tab stop of its own. A server renders it as a toolbar, having no parent to read, until it upgrades. */
16810
+ /** A toolbar holds a mix of controls, such as buttons, toggles, and menus. A button group holds one kind, so the two are separate components. The toolbar is one tab stop, and the arrow keys move between its controls, so three toolbars take three presses of Tab to pass. Any element the browser can focus counts as a control, including your own elements. A child that takes no focus, such as a divider, is skipped. A menu is reached at its trigger. A Divider in the toolbar is a separator across the toolbar's axis, as React Aria's is: vertical in a horizontal toolbar and horizontal in a vertical one, without an 'orientation' of its own. Controls inside a plain wrapper, such as a 'Button Group', are each a stop of the toolbar's own, as React Aria's toolbar flattens a group: the arrows walk through the group's buttons and on past it, and the group takes no tab stop of its own. The arrows wrap from the last control to the first. Set 'stop-at-ends' to keep them at the ends, as Radix's 'loop' set to false does. **Keyboard.** Tab enters the toolbar on the control that last had focus, the first control at the start, and the next Tab leaves it. | Key | What it does | |---|---| | Right | Moves to the next control in a horizontal toolbar, from the last back to the first. | | Left | Moves to the control before in a horizontal toolbar, from the first round to the last. | | Down, Up | The same in a vertical toolbar. | | Home, End | Moves to the first or the last control. | Left and Right swap on a right-to-left page, where the first control is on the right. The arrows across the toolbar's axis are left to the control that has focus, so a radio-style toggle group or a select answers them itself. The toolbar is 'role="toolbar"' with 'aria-orientation', named by 'label'. The stop moves through a control's own 'focusable' property where it has one, as Button, Select and Toggle Group do. A control without one has 'tabindex' written on the element that takes focus: a native element itself, or the control inside a custom element's open shadow root, so the host keeps the markup you rendered. Only a custom element whose shadow root is closed takes it on the host. A toggle group of pressed buttons, 'selection-mode="multiple"', is walked through the same way, each toggle a stop on the toolbar's axis, as React Aria's toolbar walks its toggle buttons. Another nested composite, such as a radio-style toggle group, is one stop on the toolbar's axis: the toolbar's arrows move past it, and the arrows across the toolbar move inside it. A composite with a 'focusable' property, as Toggle Group has, gives up its own tab stop while the toolbar's is elsewhere, so Tab stops once in the toolbar. A composite without one keeps its own tab stop. A toolbar inside another toolbar, a Helix one or the page's own 'role="toolbar"', is a 'group' of the outer one, as React Aria's is: the outer toolbar's arrows walk through its controls and on past them, and it takes no keys and no tab stop of its own. A server renders it as a toolbar, having no parent to read, until it upgrades. */
16535
16811
  "helix-headless-toolbar": DefineCustomElement<
16536
16812
  HelixHeadlessToolbar,
16537
16813
  HelixHeadlessToolbarVueProps,