@fusion.dev/helix-headless 0.143.0 → 0.144.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 (191) hide show
  1. package/custom-elements.json +8551 -375
  2. package/dist/area-chart/root/area-chart-root.d.ts +12 -4
  3. package/dist/area-chart/root/area-chart-root.js +24 -7
  4. package/dist/avatar/root/avatar-root.d.ts +14 -0
  5. package/dist/avatar/root/avatar-root.js +23 -9
  6. package/dist/badge/root/badge-root.d.ts +11 -7
  7. package/dist/badge/root/badge-root.js +1 -1
  8. package/dist/bar-chart/root/bar-chart-root.d.ts +12 -3
  9. package/dist/bar-chart/root/bar-chart-root.js +17 -10
  10. package/dist/button/root/button-root.d.ts +47 -1
  11. package/dist/button/root/button-root.js +38 -4
  12. package/dist/callout/root/callout-root.d.ts +18 -1
  13. package/dist/callout/root/callout-root.js +15 -4
  14. package/dist/card/root/card-root.d.ts +30 -1
  15. package/dist/card/root/card-root.js +38 -5
  16. package/dist/checkbox/root/checkbox-root.js +2 -0
  17. package/dist/checkbox-group/root/checkbox-group-root.d.ts +53 -3
  18. package/dist/checkbox-group/root/checkbox-group-root.js +71 -22
  19. package/dist/code-block/lines.d.ts +13 -0
  20. package/dist/code-block/lines.js +2 -0
  21. package/dist/code-block/root/code-block-root.d.ts +30 -0
  22. package/dist/code-block/root/code-block-root.js +23 -2
  23. package/dist/color-input/root/color-input-root.d.ts +34 -1
  24. package/dist/color-input/root/color-input-root.js +23 -4
  25. package/dist/color-picker/channels.d.ts +26 -0
  26. package/dist/color-picker/channels.js +84 -0
  27. package/dist/color-picker/root/color-picker-root.d.ts +81 -5
  28. package/dist/color-picker/root/color-picker-root.js +103 -10
  29. package/dist/combobox/root/combobox-root.d.ts +38 -3
  30. package/dist/combobox/root/combobox-root.js +64 -2
  31. package/dist/command/root/command-root.d.ts +30 -4
  32. package/dist/command/root/command-root.js +33 -3
  33. package/dist/copy-button/from.d.ts +22 -0
  34. package/dist/copy-button/from.js +28 -0
  35. package/dist/copy-button/root/copy-button-root.d.ts +27 -1
  36. package/dist/copy-button/root/copy-button-root.js +43 -7
  37. package/dist/date-input/root/date-input-root.d.ts +73 -4
  38. package/dist/date-input/root/date-input-root.js +93 -43
  39. package/dist/date-picker/root/date-picker-root.d.ts +145 -1
  40. package/dist/date-picker/root/date-picker-root.js +239 -48
  41. package/dist/dialog/description.d.ts +9 -0
  42. package/dist/dialog/description.js +14 -0
  43. package/dist/dialog/root/dialog-root.d.ts +64 -1
  44. package/dist/dialog/root/dialog-root.js +49 -23
  45. package/dist/donut-chart/root/donut-chart-root.d.ts +25 -4
  46. package/dist/donut-chart/root/donut-chart-root.js +21 -6
  47. package/dist/drawer/root/drawer-root.d.ts +63 -2
  48. package/dist/drawer/root/drawer-root.js +95 -19
  49. package/dist/drawer/swipe-start.d.ts +9 -0
  50. package/dist/drawer/swipe-start.js +12 -0
  51. package/dist/element-events.generated.js +8 -5
  52. package/dist/empty/root/empty-root.d.ts +1 -1
  53. package/dist/file-input/root/file-input-root.d.ts +47 -0
  54. package/dist/file-input/root/file-input-root.js +60 -22
  55. package/dist/file-input/screen.d.ts +35 -0
  56. package/dist/file-input/screen.js +49 -0
  57. package/dist/filter-input/root/filter-input-root.d.ts +38 -4
  58. package/dist/filter-input/root/filter-input-root.js +67 -3
  59. package/dist/filter-input/suggest.d.ts +17 -0
  60. package/dist/filter-input/suggest.js +23 -0
  61. package/dist/format-date/options.d.ts +33 -0
  62. package/dist/format-date/options.js +42 -0
  63. package/dist/format-date/root/format-date-root.d.ts +51 -0
  64. package/dist/format-date/root/format-date-root.js +58 -38
  65. package/dist/heatmap/root/heatmap-root.d.ts +23 -6
  66. package/dist/heatmap/root/heatmap-root.js +24 -13
  67. package/dist/icon/index.d.ts +2 -0
  68. package/dist/icon/index.js +2 -0
  69. package/dist/icon/registry.d.ts +37 -0
  70. package/dist/icon/registry.js +83 -0
  71. package/dist/icon/root/icon-root.d.ts +30 -4
  72. package/dist/icon/root/icon-root.js +41 -6
  73. package/dist/icon/root/index.d.ts +2 -0
  74. package/dist/icon/root/index.js +2 -0
  75. package/dist/icon/set.d.ts +1 -0
  76. package/dist/icon/set.js +3 -0
  77. package/dist/image/root/image-root.d.ts +14 -0
  78. package/dist/image/root/image-root.js +15 -2
  79. package/dist/input/root/input-root.d.ts +11 -0
  80. package/dist/input/root/input-root.js +15 -0
  81. package/dist/kbd/root/kbd-root.d.ts +20 -13
  82. package/dist/kbd/root/kbd-root.js +35 -37
  83. package/dist/kbd/shortcut.d.ts +18 -0
  84. package/dist/kbd/shortcut.js +35 -0
  85. package/dist/legend/hidden-series.d.ts +8 -0
  86. package/dist/legend/hidden-series.js +13 -0
  87. package/dist/legend/root/legend-root.d.ts +56 -0
  88. package/dist/legend/root/legend-root.js +54 -5
  89. package/dist/lightbox/item/lightbox-item.d.ts +15 -0
  90. package/dist/lightbox/item/lightbox-item.js +10 -1
  91. package/dist/lightbox/root/lightbox-root.d.ts +61 -1
  92. package/dist/lightbox/root/lightbox-root.js +94 -4
  93. package/dist/line-chart/root/line-chart-root.d.ts +11 -3
  94. package/dist/line-chart/root/line-chart-root.js +19 -5
  95. package/dist/listbox/range.d.ts +17 -0
  96. package/dist/listbox/range.js +5 -0
  97. package/dist/listbox/root/listbox-root.d.ts +74 -3
  98. package/dist/listbox/root/listbox-root.js +87 -9
  99. package/dist/loader/busy.d.ts +17 -0
  100. package/dist/loader/busy.js +24 -0
  101. package/dist/loader/root/loader-root.d.ts +37 -0
  102. package/dist/loader/root/loader-root.js +52 -3
  103. package/dist/meter/root/meter-root.d.ts +7 -0
  104. package/dist/meter/root/meter-root.js +6 -3
  105. package/dist/notifications/feed-keys.d.ts +10 -0
  106. package/dist/notifications/feed-keys.js +14 -0
  107. package/dist/notifications/notification/notification.d.ts +17 -0
  108. package/dist/notifications/notification/notification.js +21 -2
  109. package/dist/notifications/root/notifications-root.d.ts +42 -0
  110. package/dist/notifications/root/notifications-root.js +60 -1
  111. package/dist/number-input/root/number-input-root.d.ts +47 -0
  112. package/dist/number-input/root/number-input-root.js +58 -22
  113. package/dist/object-inspector/root/object-inspector-root.d.ts +1 -0
  114. package/dist/object-inspector/root/object-inspector-root.js +1 -1
  115. package/dist/option/root/option-root.d.ts +54 -5
  116. package/dist/option/root/option-root.js +34 -5
  117. package/dist/pin-input/format.d.ts +7 -0
  118. package/dist/pin-input/format.js +16 -0
  119. package/dist/pin-input/root/pin-input-root.d.ts +21 -0
  120. package/dist/pin-input/root/pin-input-root.js +29 -2
  121. package/dist/popover/root/popover-root.d.ts +62 -4
  122. package/dist/popover/root/popover-root.js +53 -5
  123. package/dist/progress/root/progress-root.d.ts +7 -0
  124. package/dist/progress/root/progress-root.js +9 -3
  125. package/dist/qr-code/export.d.ts +31 -0
  126. package/dist/qr-code/export.js +10 -0
  127. package/dist/qr-code/root/qr-code-root.d.ts +26 -0
  128. package/dist/qr-code/root/qr-code-root.js +49 -2
  129. package/dist/radio/group/radio-group.d.ts +23 -0
  130. package/dist/radio/group/radio-group.js +18 -0
  131. package/dist/rating/root/rating-root.d.ts +25 -0
  132. package/dist/rating/root/rating-root.js +45 -3
  133. package/dist/scatter-chart/root/scatter-chart-root.d.ts +17 -3
  134. package/dist/scatter-chart/root/scatter-chart-root.js +25 -7
  135. package/dist/select/root/select-root.d.ts +24 -0
  136. package/dist/select/root/select-root.js +20 -6
  137. package/dist/skeleton/root/skeleton-root.d.ts +25 -0
  138. package/dist/skeleton/root/skeleton-root.js +17 -2
  139. package/dist/slider/root/slider-root.d.ts +39 -0
  140. package/dist/slider/root/slider-root.js +45 -9
  141. package/dist/stat/root/stat-root.d.ts +2 -0
  142. package/dist/stat/root/stat-root.js +1 -1
  143. package/dist/steps/step/step.d.ts +1 -0
  144. package/dist/steps/step/step.js +1 -1
  145. package/dist/switch/root/switch-root.d.ts +12 -2
  146. package/dist/switch/root/switch-root.js +6 -1
  147. package/dist/tag/group/tag-group.d.ts +107 -0
  148. package/dist/tag/group/tag-group.js +157 -0
  149. package/dist/tag/index.d.ts +1 -0
  150. package/dist/tag/index.js +1 -0
  151. package/dist/tag/root/tag-root.d.ts +60 -0
  152. package/dist/tag/root/tag-root.js +74 -18
  153. package/dist/tag/selection.d.ts +10 -0
  154. package/dist/tag/selection.js +12 -0
  155. package/dist/textarea/grow.d.ts +22 -0
  156. package/dist/textarea/grow.js +20 -0
  157. package/dist/textarea/root/textarea-root.d.ts +9 -0
  158. package/dist/textarea/root/textarea-root.js +9 -1
  159. package/dist/time-input/root/time-input-root.d.ts +44 -5
  160. package/dist/time-input/root/time-input-root.js +69 -39
  161. package/dist/time-picker/root/time-picker-root.d.ts +54 -8
  162. package/dist/time-picker/root/time-picker-root.js +121 -91
  163. package/dist/toast/hotkey.d.ts +22 -0
  164. package/dist/toast/hotkey.js +23 -0
  165. package/dist/toast/item/toast-item.d.ts +16 -1
  166. package/dist/toast/item/toast-item.js +41 -13
  167. package/dist/toast/root/toast-root.d.ts +42 -8
  168. package/dist/toast/root/toast-root.js +64 -4
  169. package/dist/toggle/group/toggle-group.d.ts +57 -15
  170. package/dist/toggle/group/toggle-group.js +69 -9
  171. package/dist/toggle/root/toggle-root.d.ts +12 -1
  172. package/dist/toggle/root/toggle-root.js +11 -3
  173. package/dist/tooltip/focus-target.d.ts +6 -0
  174. package/dist/tooltip/focus-target.js +9 -0
  175. package/dist/tooltip/root/tooltip-root.d.ts +42 -17
  176. package/dist/tooltip/root/tooltip-root.js +50 -9
  177. package/dist/tour/naming.d.ts +30 -0
  178. package/dist/tour/naming.js +10 -0
  179. package/dist/tour/root/tour-root.d.ts +35 -0
  180. package/dist/tour/root/tour-root.js +56 -5
  181. package/dist/tour/stop/tour-stop.d.ts +53 -8
  182. package/dist/tour/stop/tour-stop.js +45 -15
  183. package/dist/tour/wait.d.ts +11 -0
  184. package/dist/tour/wait.js +19 -0
  185. package/dist/trend/root/trend-root.d.ts +13 -0
  186. package/dist/trend/root/trend-root.js +14 -9
  187. package/lint.json +1 -1
  188. package/package.json +5 -5
  189. package/types/jsx.d.ts +4862 -254
  190. package/types/svelte.d.ts +1 -0
  191. package/types/vue.d.ts +1149 -67
package/types/vue.d.ts CHANGED
@@ -141,6 +141,7 @@ import type {
141
141
  HelixHeadlessTabPanel,
142
142
  HelixHeadlessTabs,
143
143
  HelixHeadlessTab,
144
+ HelixHeadlessTagGroup,
144
145
  HelixHeadlessTag,
145
146
  HelixHeadlessTextarea,
146
147
  HelixHeadlessTimeInput,
@@ -200,6 +201,7 @@ import type {
200
201
  HelixSelectedEvent,
201
202
  HelixSortEvent,
202
203
  HelixSortedEvent,
204
+ HelixRejectEvent,
203
205
  HelixFacetEvent,
204
206
  HelixBeforeActivateEvent,
205
207
  HelixGraphFilterEvent,
@@ -590,6 +592,24 @@ export type HelixHeadlessAvatarElementEvent<E = Event> = TypedEvent<
590
592
  >;
591
593
 
592
594
  export type HelixHeadlessAvatarVueProps = {
595
+ /** How long, in milliseconds, a picture may take before the initials stand
596
+ in for it while it loads.
597
+
598
+ Absent keeps the picture's place empty until it arrives or fails. Set,
599
+ the initials show once the wait is over and the picture
600
+ replaces them when it arrives, so a slow connection shows who it is
601
+ without a cached picture flashing initials first. Radix's `delayMs` is the
602
+ same idea. */
603
+ "fallback-delay"?: (HelixHeadlessAvatar["fallbackDelay"] | `${number}`) | undefined;
604
+ /** How long, in milliseconds, a picture may take before the initials stand
605
+ in for it while it loads.
606
+
607
+ Absent keeps the picture's place empty until it arrives or fails. Set,
608
+ the initials show once the wait is over and the picture
609
+ replaces them when it arrives, so a slow connection shows who it is
610
+ without a cached picture flashing initials first. Radix's `delayMs` is the
611
+ same idea. */
612
+ fallbackDelay?: (HelixHeadlessAvatar["fallbackDelay"]) | undefined;
593
613
  /** Name of the person or entity.
594
614
 
595
615
  Used for the label and the initials. */
@@ -908,6 +928,22 @@ Lives here rather than only on `IconButton` so the two share one render.
908
928
  An icon-only button without it is a control a screen reader announces as
909
929
  "button" and nothing else. */
910
930
  label?: (HelixHeadlessButton["label"]) | undefined;
931
+ /** Whether the action the button started is still running.
932
+
933
+ A pending button keeps focus and stays in the tab order, and refuses every
934
+ press: a click, Enter and Space, and Enter in a field of its form. The
935
+ click does not reach your listeners. The inner control carries
936
+ `aria-busy` and `aria-disabled`, and when the button becomes pending while
937
+ it has focus, a reader hears `pending-label`. The styled button draws a
938
+ turning ring over its words.
939
+
940
+ `disabled` takes the button out of reach. Use `pending` for the wait after
941
+ a press, so focus stays where the reader left it. */
942
+ pending?: (HelixHeadlessButton["pending"]) | undefined;
943
+ /** What a reader hears when the button becomes pending while it has focus. */
944
+ "pending-label"?: (HelixHeadlessButton["pendingLabel"]) | undefined;
945
+ /** What a reader hears when the button becomes pending while it has focus. */
946
+ pendingLabel?: (HelixHeadlessButton["pendingLabel"]) | undefined;
911
947
  /** What activating the button does to its form. */
912
948
  type?: (HelixHeadlessButton["type"]) | undefined;
913
949
  /** The value this button submits under its own `name`, as a native submit
@@ -1007,6 +1043,15 @@ invoker without an id in the same tree needs. */
1007
1043
 
1008
1044
  export type HelixHeadlessButtonVueEvents = {};
1009
1045
 
1046
+ /** `HelixHeadlessCallout` component event */
1047
+ export type HelixHeadlessCalloutElementEvent<E = Event> = TypedEvent<
1048
+ HelixHeadlessCallout,
1049
+ E
1050
+ >;
1051
+ /** `helix-dismiss` event type */
1052
+ export type HelixHeadlessCalloutHelixDismissElementEvent =
1053
+ HelixHeadlessCalloutElementEvent<HelixDismissEvent>;
1054
+
1010
1055
  export type HelixHeadlessCalloutVueProps = {
1011
1056
  /** What kind of attention the passage needs.
1012
1057
 
@@ -1025,9 +1070,28 @@ Absent is the English for the tone: "Error", "Information", "Note",
1025
1070
  Absent is the English for the tone: "Error", "Information", "Note",
1026
1071
  "Success" or "Warning". */
1027
1072
  toneLabel?: (HelixHeadlessCallout["toneLabel"]) | undefined;
1073
+ /** Whether the element shows a control that dismisses it. */
1074
+ dismissible?: (HelixHeadlessCallout["dismissible"]) | undefined;
1075
+ /** The dismiss control's label, read by screen readers.
1076
+
1077
+ `attribute` is spelled out because Lit lowercases a property name to
1078
+ derive one rather than dash-casing it, so this would otherwise be
1079
+ reachable only as `dismisslabel`, which nobody would guess and no linter
1080
+ would catch. */
1081
+ "dismiss-label"?: (HelixHeadlessCallout["dismissLabel"]) | undefined;
1082
+ /** The dismiss control's label, read by screen readers.
1083
+
1084
+ `attribute` is spelled out because Lit lowercases a property name to
1085
+ derive one rather than dash-casing it, so this would otherwise be
1086
+ reachable only as `dismisslabel`, which nobody would guess and no linter
1087
+ would catch. */
1088
+ dismissLabel?: (HelixHeadlessCallout["dismissLabel"]) | undefined;
1028
1089
  };
1029
1090
 
1030
- export type HelixHeadlessCalloutVueEvents = {};
1091
+ export type HelixHeadlessCalloutVueEvents = {
1092
+ /** The dismiss button was pressed. The callout does not remove itself, so remove it in response. Cancelable. */
1093
+ "helix-dismiss": HelixHeadlessCalloutHelixDismissElementEvent;
1094
+ };
1031
1095
 
1032
1096
  export type HelixHeadlessCanvasEdgeVueProps = {
1033
1097
  /** The name of the card the connection starts from. */
@@ -1593,6 +1657,10 @@ twice what this says once.
1593
1657
  Reflected and undefaulted, so a card that has not asked reads as a card
1594
1658
  with no attribute on it and the stylesheet only describes the departure. */
1595
1659
  mediaPlacement?: (HelixHeadlessCard["mediaPlacement"]) | undefined;
1660
+ /** */
1661
+ "aria-labelledby"?: unknown;
1662
+ /** */
1663
+ "aria-label"?: unknown;
1596
1664
  };
1597
1665
 
1598
1666
  export type HelixHeadlessCardVueEvents = {};
@@ -2066,10 +2134,19 @@ export type HelixHeadlessCheckboxGroupHelixBeforeChangeElementEvent =
2066
2134
  HelixHeadlessCheckboxGroupElementEvent<HelixBeforeChangeEvent>;
2067
2135
 
2068
2136
  export type HelixHeadlessCheckboxGroupVueProps = {
2137
+ /** Whether a box above the set checks or unchecks every enabled box. */
2138
+ "select-all"?: (HelixHeadlessCheckboxGroup["selectAll"]) | undefined;
2139
+ /** Whether a box above the set checks or unchecks every enabled box. */
2140
+ selectAll?: (HelixHeadlessCheckboxGroup["selectAll"]) | undefined;
2141
+ /** The words beside the box `select-all` draws. */
2142
+ "select-all-label"?: (HelixHeadlessCheckboxGroup["selectAllLabel"]) | undefined;
2143
+ /** The words beside the box `select-all` draws. */
2144
+ selectAllLabel?: (HelixHeadlessCheckboxGroup["selectAllLabel"]) | undefined;
2069
2145
  /** The checked values, comma separated.
2070
2146
 
2071
2147
  Read from the boxes once they are known, so a box a script ticks directly
2072
- is in it at once. Written, it is pushed onto the boxes. */
2148
+ is in it at once. Written, it is pushed onto the boxes. A box whose value
2149
+ holds a comma cannot be named here: use `values`. */
2073
2150
  value?: (HelixHeadlessCheckboxGroup["value"]) | undefined;
2074
2151
  /** */
2075
2152
  "aria-label"?: unknown;
@@ -2127,6 +2204,11 @@ imperatively later, and nothing is hydrating by then.
2127
2204
 
2128
2205
  Here rather than on each control. */
2129
2206
  name?: (HelixHeadlessCheckboxGroup["name"]) | undefined;
2207
+ /** The checked values, as a list, in the order the boxes are written.
2208
+
2209
+ The same set as `value`, and the one to use where a value may hold a
2210
+ comma. Written, it checks exactly those boxes and unchecks the rest. */
2211
+ values?: (HelixHeadlessCheckboxGroup["values"]) | undefined;
2130
2212
  };
2131
2213
 
2132
2214
  export type HelixHeadlessCheckboxGroupVueEvents = {
@@ -2171,6 +2253,28 @@ stylesheets. */
2171
2253
  "default-checked"?: (HelixHeadlessCheckbox["defaultChecked"]) | undefined;
2172
2254
  /** Whether the control starts checked. A form reset returns it to this state. */
2173
2255
  defaultChecked?: (HelixHeadlessCheckbox["defaultChecked"]) | undefined;
2256
+ /** Whether a reader can see and focus the control and cannot change it. A
2257
+ read-only control still submits its value.
2258
+
2259
+ React Aria's `isReadOnly`. A native checkbox has no read-only state, so
2260
+ the press is refused at the inner control, which keeps its box as it
2261
+ was, and the control says `aria-readonly`. A script can still set
2262
+ `checked`, as it can set the value of a read-only text field.
2263
+
2264
+ The attribute is `readonly`, which is the platform's spelling for the
2265
+ text fields. */
2266
+ readonly?: (HelixHeadlessCheckbox["readOnly"]) | undefined;
2267
+ /** Whether a reader can see and focus the control and cannot change it. A
2268
+ read-only control still submits its value.
2269
+
2270
+ React Aria's `isReadOnly`. A native checkbox has no read-only state, so
2271
+ the press is refused at the inner control, which keeps its box as it
2272
+ was, and the control says `aria-readonly`. A script can still set
2273
+ `checked`, as it can set the value of a read-only text field.
2274
+
2275
+ The attribute is `readonly`, which is the platform's spelling for the
2276
+ text fields. */
2277
+ readOnly?: (HelixHeadlessCheckbox["readOnly"]) | undefined;
2174
2278
  /** */
2175
2279
  "aria-label"?: unknown;
2176
2280
  /** The validation message shown under the control. It replaces the
@@ -2257,6 +2361,20 @@ Reflected, because the stylesheet paints a diff differently from code, and
2257
2361
  In a diff, each file is named from the patch, and this names a patch that
2258
2362
  carries no name of its own. */
2259
2363
  label?: (HelixHeadlessCodeBlock["label"]) | undefined;
2364
+ /** Whether the lines are numbered in a gutter beside the code.
2365
+
2366
+ The numbers are hidden from the accessibility tree and are not part of a
2367
+ copy, which takes the code alone. Reflected, because the stylesheet lays
2368
+ the gutter out beside the code. A diff numbers its lines from its hunks
2369
+ whether or not this is set. */
2370
+ "line-numbers"?: (HelixHeadlessCodeBlock["lineNumbers"]) | undefined;
2371
+ /** Whether the lines are numbered in a gutter beside the code.
2372
+
2373
+ The numbers are hidden from the accessibility tree and are not part of a
2374
+ copy, which takes the code alone. Reflected, because the stylesheet lays
2375
+ the gutter out beside the code. A diff numbers its lines from its hunks
2376
+ whether or not this is set. */
2377
+ lineNumbers?: (HelixHeadlessCodeBlock["lineNumbers"]) | undefined;
2260
2378
  /** Whether to leave the copy button off.
2261
2379
 
2262
2380
  Negative, which is not a style choice. A boolean attribute is true whenever
@@ -2303,6 +2421,17 @@ Absent is unified, each removal above its replacement, which fits any
2303
2421
  width. `split` sets the old version beside the new one. Optional rather
2304
2422
  than defaulted, so the host carries no attribute the consumer did not write. */
2305
2423
  variant?: (HelixHeadlessCodeBlock["variant"]) | undefined;
2424
+ /** Turns the code into highlighted markup, which the block draws in place of
2425
+ the plain text.
2426
+
2427
+ Called with the code as written and returning HTML, such as the output of
2428
+ Shiki's `codeToHtml` or Prism's `highlight`. **The markup is drawn as
2429
+ given**, so it has to escape the code it was handed, which those
2430
+ highlighters do. Bind the language in the function you pass. The code
2431
+ stays in the slot, so the copy button copies it as written and a reader
2432
+ without the script still has it. Not called on a server, which has no code
2433
+ to read, nor for a diff. */
2434
+ highlight?: (HelixHeadlessCodeBlock["highlight"]) | undefined;
2306
2435
  };
2307
2436
 
2308
2437
  export type HelixHeadlessCodeBlockVueEvents = {};
@@ -2339,6 +2468,26 @@ point.** The field holds a color, so a browser offering to fill it with a
2339
2468
  saved address is competing for the same keystrokes as the picker. A
2340
2469
  consumer who wants autofill can still ask. */
2341
2470
  autocomplete?: (HelixHeadlessColorInput["autocomplete"]) | undefined;
2471
+ /** Whether the panel shows a number field for each channel of the color.
2472
+ Passed to the panel; see Color Picker's `channel-fields`. */
2473
+ "channel-fields"?: (HelixHeadlessColorInput["channelFields"]) | undefined;
2474
+ /** Whether the panel shows a number field for each channel of the color.
2475
+ Passed to the panel; see Color Picker's `channel-fields`. */
2476
+ channelFields?: (HelixHeadlessColorInput["channelFields"]) | undefined;
2477
+ /** The words a color's name is spoken in, as JSON keyed by their English,
2478
+ such as `{"red": "rot", "vibrant": "kräftiges"}`.
2479
+
2480
+ Passed to the panel, whose square, hue ramp and presets say the color's
2481
+ name, and read by the swatch in `swatch`, which says it before the value.
2482
+ Color Picker lists the keys. */
2483
+ "color-words"?: (HelixHeadlessColorInput["colorWords"]) | undefined;
2484
+ /** The words a color's name is spoken in, as JSON keyed by their English,
2485
+ such as `{"red": "rot", "vibrant": "kräftiges"}`.
2486
+
2487
+ Passed to the panel, whose square, hue ramp and presets say the color's
2488
+ name, and read by the swatch in `swatch`, which says it before the value.
2489
+ Color Picker lists the keys. */
2490
+ colorWords?: (HelixHeadlessColorInput["colorWords"]) | undefined;
2342
2491
  /** The syntax the value is written in: `hex`, `rgb`, or `hsl`.
2343
2492
 
2344
2493
  **Undefaulted, because it reflects.** The two together stamp an attribute
@@ -2539,6 +2688,10 @@ ramps. A consumer who wants autofill can still ask. */
2539
2688
  "bad-input-message"?: (HelixHeadlessColorPicker["badInputMessage"]) | undefined;
2540
2689
  /** The message shown when the value is text that is not a color. */
2541
2690
  badInputMessage?: (HelixHeadlessColorPicker["badInputMessage"]) | undefined;
2691
+ /** What the blue channel's field is called, in `channel-fields`. */
2692
+ "blue-label"?: (HelixHeadlessColorPicker["blueLabel"]) | undefined;
2693
+ /** What the blue channel's field is called, in `channel-fields`. */
2694
+ blueLabel?: (HelixHeadlessColorPicker["blueLabel"]) | undefined;
2542
2695
  /** What the square's vertical ramp is called.
2543
2696
 
2544
2697
  **Every word the picker speaks is a property**, so a page in another
@@ -2549,6 +2702,50 @@ language hears its own rather than English between its own labels. */
2549
2702
  **Every word the picker speaks is a property**, so a page in another
2550
2703
  language hears its own rather than English between its own labels. */
2551
2704
  brightnessLabel?: (HelixHeadlessColorPicker["brightnessLabel"]) | undefined;
2705
+ /** Whether the picker shows a number field for each channel of the color, as
2706
+ React Aria's ColorField does with `channel`: red, green and blue for hex
2707
+ and rgb, hue, saturation and lightness for hsl, and the opacity with
2708
+ `alpha`.
2709
+
2710
+ For a reader who has the numbers from a brand guide, and for a keyboard,
2711
+ where typing 128 is quicker than holding an arrow key. The fields follow
2712
+ the syntax the format toggle sets. */
2713
+ "channel-fields"?: (HelixHeadlessColorPicker["channelFields"]) | undefined;
2714
+ /** Whether the picker shows a number field for each channel of the color, as
2715
+ React Aria's ColorField does with `channel`: red, green and blue for hex
2716
+ and rgb, hue, saturation and lightness for hsl, and the opacity with
2717
+ `alpha`.
2718
+
2719
+ For a reader who has the numbers from a brand guide, and for a keyboard,
2720
+ where typing 128 is quicker than holding an arrow key. The fields follow
2721
+ the syntax the format toggle sets. */
2722
+ channelFields?: (HelixHeadlessColorPicker["channelFields"]) | undefined;
2723
+ /** The words a color's name is spoken in, as JSON keyed by their English,
2724
+ such as `{"red": "rot", "vibrant": "kräftiges"}`.
2725
+
2726
+ **A color is named the way React Aria names one**, as "vibrant red" or
2727
+ "dark grayish blue", and the keys are the ones `@react-stately/color`
2728
+ translates, so a table a page already has for it can be handed over whole.
2729
+ `colorName` and `transparentColorName` are the two sentences that put the
2730
+ words together. A word left out is spoken in English.
2731
+
2732
+ The name follows the numbers on the square, follows the number on the hue
2733
+ ramp, and names each preset, so a reader who cannot see the color hears
2734
+ which one it is. */
2735
+ "color-words"?: (HelixHeadlessColorPicker["colorWords"]) | undefined;
2736
+ /** The words a color's name is spoken in, as JSON keyed by their English,
2737
+ such as `{"red": "rot", "vibrant": "kräftiges"}`.
2738
+
2739
+ **A color is named the way React Aria names one**, as "vibrant red" or
2740
+ "dark grayish blue", and the keys are the ones `@react-stately/color`
2741
+ translates, so a table a page already has for it can be handed over whole.
2742
+ `colorName` and `transparentColorName` are the two sentences that put the
2743
+ words together. A word left out is spoken in English.
2744
+
2745
+ The name follows the numbers on the square, follows the number on the hue
2746
+ ramp, and names each preset, so a reader who cannot see the color hears
2747
+ which one it is. */
2748
+ colorWords?: (HelixHeadlessColorPicker["colorWords"]) | undefined;
2552
2749
  /** The text the sample shows for a moment after it copies the value. */
2553
2750
  "copied-label"?: (HelixHeadlessColorPicker["copiedLabel"]) | undefined;
2554
2751
  /** The text the sample shows for a moment after it copies the value. */
@@ -2572,6 +2769,10 @@ Only what is written. Everything is read whatever this says, so a picker on
2572
2769
  "format-label"?: (HelixHeadlessColorPicker["formatLabel"]) | undefined;
2573
2770
  /** What the syntax toggle is called, with `{format}` filled in. */
2574
2771
  formatLabel?: (HelixHeadlessColorPicker["formatLabel"]) | undefined;
2772
+ /** What the green channel's field is called, in `channel-fields`. */
2773
+ "green-label"?: (HelixHeadlessColorPicker["greenLabel"]) | undefined;
2774
+ /** What the green channel's field is called, in `channel-fields`. */
2775
+ greenLabel?: (HelixHeadlessColorPicker["greenLabel"]) | undefined;
2575
2776
  /** What the hue channel is called. */
2576
2777
  "hue-label"?: (HelixHeadlessColorPicker["hueLabel"]) | undefined;
2577
2778
  /** What the hue channel is called. */
@@ -2584,6 +2785,12 @@ the label, the hint and the feedback, and a second message inside the panel
2584
2785
  would be the same error said twice. What is left for the picker is the one
2585
2786
  thing the field cannot draw from outside, the mark on the answer itself. */
2586
2787
  invalid?: (HelixHeadlessColorPicker["invalid"]) | undefined;
2788
+ /** What the lightness channel's field is called, in `channel-fields` with
2789
+ hsl. */
2790
+ "lightness-label"?: (HelixHeadlessColorPicker["lightnessLabel"]) | undefined;
2791
+ /** What the lightness channel's field is called, in `channel-fields` with
2792
+ hsl. */
2793
+ lightnessLabel?: (HelixHeadlessColorPicker["lightnessLabel"]) | undefined;
2587
2794
  /** Hides the eyedropper. Without it, the eyedropper appears in browsers that
2588
2795
  support one. */
2589
2796
  "no-eyedropper"?: (HelixHeadlessColorPicker["noEyedropper"]) | undefined;
@@ -2680,6 +2887,10 @@ letting it move would show `rgb` over a hex it is no longer allowed to
2680
2887
  restate. The eyedropper clears the screen and runs a system sampler, so
2681
2888
  letting it open would take a color from the reader and drop it. */
2682
2889
  readOnly?: (HelixHeadlessColorPicker["readOnly"]) | undefined;
2890
+ /** What the red channel's field is called, in `channel-fields`. */
2891
+ "red-label"?: (HelixHeadlessColorPicker["redLabel"]) | undefined;
2892
+ /** What the red channel's field is called, in `channel-fields`. */
2893
+ redLabel?: (HelixHeadlessColorPicker["redLabel"]) | undefined;
2683
2894
  /** Requires a color before the form can submit.
2684
2895
 
2685
2896
  **A color is exactly as requirable as a date**, which is the comparison
@@ -2806,6 +3017,24 @@ export type HelixHeadlessComboboxToggleElementEvent =
2806
3017
  HelixHeadlessComboboxElementEvent<ToggleEvent>;
2807
3018
 
2808
3019
  export type HelixHeadlessComboboxVueProps = {
3020
+ /** Whether text that names no option is taken as the value, as React Aria's
3021
+ `allowsCustomValue`.
3022
+
3023
+ For a field where the list is a help and not the whole of the answer, a
3024
+ city or a job title. What was typed becomes the value when the reader
3025
+ leaves the field or presses Enter with nothing highlighted, and text that
3026
+ names an option takes that option. Unlike `creatable`, no event asks
3027
+ first and no option is expected to be added: the value is the text. */
3028
+ "allows-custom-value"?: (HelixHeadlessCombobox["allowsCustomValue"]) | undefined;
3029
+ /** Whether text that names no option is taken as the value, as React Aria's
3030
+ `allowsCustomValue`.
3031
+
3032
+ For a field where the list is a help and not the whole of the answer, a
3033
+ city or a job title. What was typed becomes the value when the reader
3034
+ leaves the field or presses Enter with nothing highlighted, and text that
3035
+ names an option takes that option. Unlike `creatable`, no event asks
3036
+ first and no option is expected to be added: the value is the text. */
3037
+ allowsCustomValue?: (HelixHeadlessCombobox["allowsCustomValue"]) | undefined;
2809
3038
  /** What the browser may autofill in the text field, as a platform token.
2810
3039
 
2811
3040
  **Defaults to `off`, which is not the platform's default and is the
@@ -2884,6 +3113,20 @@ filled in.
2884
3113
  **The name goes in**, so a row of them is heard as which one each
2885
3114
  removes rather than as "Remove" said once per chosen option. */
2886
3115
  removeLabel?: (HelixHeadlessCombobox["removeLabel"]) | undefined;
3116
+ /** What a screen reader hears when typing leaves one option. `{count}` is
3117
+ the count. */
3118
+ "result-label"?: (HelixHeadlessCombobox["resultLabel"]) | undefined;
3119
+ /** What a screen reader hears when typing leaves one option. `{count}` is
3120
+ the count. */
3121
+ resultLabel?: (HelixHeadlessCombobox["resultLabel"]) | undefined;
3122
+ /** What a screen reader hears when typing leaves any other number of
3123
+ options. `{count}` is the count, and `Intl.PluralRules` picks between the
3124
+ two. */
3125
+ "results-label"?: (HelixHeadlessCombobox["resultsLabel"]) | undefined;
3126
+ /** What a screen reader hears when typing leaves any other number of
3127
+ options. `{count}` is the count, and `Intl.PluralRules` picks between the
3128
+ two. */
3129
+ resultsLabel?: (HelixHeadlessCombobox["resultsLabel"]) | undefined;
2887
3130
  /** Whether the field completes the word as the user types.
2888
3131
 
2889
3132
  `suggest` rather than `autocomplete`, which is a real HTML attribute this
@@ -3045,6 +3288,14 @@ export type HelixHeadlessCommandVueProps = {
3045
3288
  "empty-text"?: (HelixHeadlessCommand["emptyText"]) | undefined;
3046
3289
  /** The text shown when the filter matches no commands. */
3047
3290
  emptyText?: (HelixHeadlessCommand["emptyText"]) | undefined;
3291
+ /** How long typing rests before the commands are filtered, in milliseconds,
3292
+ so a palette filtered on a server sends one `helix-filter` for a word.
3293
+ `0` filters on every keystroke. See Listbox's `filter-delay`. */
3294
+ "filter-delay"?: (HelixHeadlessCommand["filterDelay"] | `${number}`) | undefined;
3295
+ /** How long typing rests before the commands are filtered, in milliseconds,
3296
+ so a palette filtered on a server sends one `helix-filter` for a word.
3297
+ `0` filters on every keystroke. See Listbox's `filter-delay`. */
3298
+ filterDelay?: (HelixHeadlessCommand["filterDelay"]) | undefined;
3048
3299
  /** The key that opens the palette, written as `mod+k`, `shift+p`, or `k`.
3049
3300
 
3050
3301
  Empty turns it off, for a consumer who opens the palette from a button or
@@ -3064,6 +3315,20 @@ Passed to the list, which shows `loading-text` and tells screen readers. */
3064
3315
  loadingText?: (HelixHeadlessCommand["loadingText"]) | undefined;
3065
3316
  /** The text shown in the filter field before anything is typed. */
3066
3317
  placeholder?: (HelixHeadlessCommand["placeholder"]) | undefined;
3318
+ /** What a screen reader hears when typing leaves one command. `{count}` is
3319
+ the count. */
3320
+ "result-label"?: (HelixHeadlessCommand["resultLabel"]) | undefined;
3321
+ /** What a screen reader hears when typing leaves one command. `{count}` is
3322
+ the count. */
3323
+ resultLabel?: (HelixHeadlessCommand["resultLabel"]) | undefined;
3324
+ /** What a screen reader hears when typing leaves any other number of
3325
+ commands. `{count}` is the count, and `Intl.PluralRules` picks between the
3326
+ two. */
3327
+ "results-label"?: (HelixHeadlessCommand["resultsLabel"]) | undefined;
3328
+ /** What a screen reader hears when typing leaves any other number of
3329
+ commands. `{count}` is the count, and `Intl.PluralRules` picks between the
3330
+ two. */
3331
+ resultsLabel?: (HelixHeadlessCommand["resultsLabel"]) | undefined;
3067
3332
  /** Whether the element starts open. Ignored once `open` is written. */
3068
3333
  "default-open"?: (HelixHeadlessCommand["defaultOpen"]) | undefined;
3069
3334
  /** Whether the element starts open. Ignored once `open` is written. */
@@ -3090,7 +3355,7 @@ export type HelixHeadlessCommandVueEvents = {
3090
3355
  "helix-before-open": HelixHeadlessCommandHelixBeforeOpenElementEvent;
3091
3356
  /** Fired as the user types, with the text the list is filtered by. Cancelable: cancel it to leave the list unfiltered and filter the commands yourself, for example on a server while `loading` is set. */
3092
3357
  "helix-filter": HelixHeadlessCommandHelixFilterElementEvent;
3093
- /** A command was chosen. Cancelable: cancel it to keep the palette open. */
3358
+ /** A command was chosen, with its `href` where the option is a link. Cancelable: cancel it to keep the palette open, and to keep the browser from following the link. */
3094
3359
  "helix-select": HelixHeadlessCommandHelixSelectElementEvent;
3095
3360
  /** The palette opened or closed. The event carries `newState` and `oldState`. */
3096
3361
  toggle: HelixHeadlessCommandToggleElementEvent;
@@ -3116,6 +3381,17 @@ dash-casing it, and `copiedlabel` is not what anyone would type. */
3116
3381
  `attribute` written out, because Lit lowercases a property name rather than
3117
3382
  dash-casing it, and `copiedlabel` is not what anyone would type. */
3118
3383
  copiedLabel?: (HelixHeadlessCopyButton["copiedLabel"]) | undefined;
3384
+ /** The button's name and tooltip text after a press that put nothing on the
3385
+ clipboard. */
3386
+ "error-label"?: (HelixHeadlessCopyButton["errorLabel"]) | undefined;
3387
+ /** The button's name and tooltip text after a press that put nothing on the
3388
+ clipboard. */
3389
+ errorLabel?: (HelixHeadlessCopyButton["errorLabel"]) | undefined;
3390
+ /** The element to copy from, by its id: `key` for its text, `key[value]` for
3391
+ an attribute, and `key.value` for a property. Read at the press, and used
3392
+ in place of `value`. An element that is not there copies nothing, which is
3393
+ a failed copy. */
3394
+ from?: (HelixHeadlessCopyButton["from"]) | undefined;
3119
3395
  /** The button's name and tooltip text before a copy.
3120
3396
 
3121
3397
  Defaulted rather than left empty. An icon-only control must be named, and
@@ -3195,6 +3471,22 @@ native submitter would have given it, which is the point. */
3195
3471
  formtarget?: (HelixHeadlessCopyButton["formTarget"]) | undefined;
3196
3472
  /** Which browsing context the response lands in, overriding the form's own. */
3197
3473
  formTarget?: (HelixHeadlessCopyButton["formTarget"]) | undefined;
3474
+ /** Whether the action the button started is still running.
3475
+
3476
+ A pending button keeps focus and stays in the tab order, and refuses every
3477
+ press: a click, Enter and Space, and Enter in a field of its form. The
3478
+ click does not reach your listeners. The inner control carries
3479
+ `aria-busy` and `aria-disabled`, and when the button becomes pending while
3480
+ it has focus, a reader hears `pending-label`. The styled button draws a
3481
+ turning ring over its words.
3482
+
3483
+ `disabled` takes the button out of reach. Use `pending` for the wait after
3484
+ a press, so focus stays where the reader left it. */
3485
+ pending?: (HelixHeadlessCopyButton["pending"]) | undefined;
3486
+ /** What a reader hears when the button becomes pending while it has focus. */
3487
+ "pending-label"?: (HelixHeadlessCopyButton["pendingLabel"]) | undefined;
3488
+ /** What a reader hears when the button becomes pending while it has focus. */
3489
+ pendingLabel?: (HelixHeadlessCopyButton["pendingLabel"]) | undefined;
3198
3490
  /** What activating the button does to its form. */
3199
3491
  type?: (HelixHeadlessCopyButton["type"]) | undefined;
3200
3492
  /** Whether the control is disabled and cannot be used.
@@ -3280,6 +3572,8 @@ invoker without an id in the same tree needs. */
3280
3572
  export type HelixHeadlessCopyButtonVueEvents = {
3281
3573
  /** Fired after the clipboard write succeeds. */
3282
3574
  "helix-copy": HelixHeadlessCopyButtonHelixCopyElementEvent;
3575
+ /** Fired when a press put nothing on the clipboard: the browser refused the write, or there was nothing to copy. */
3576
+ "helix-copy-error": HelixHeadlessCopyButtonElementEvent;
3283
3577
  };
3284
3578
 
3285
3579
  /** `HelixHeadlessDataTable` component event */
@@ -3705,6 +3999,12 @@ and is Sunday otherwise. */
3705
3999
  locale?: (HelixHeadlessDateInput["locale"]) | undefined;
3706
4000
  /** The latest date that can be chosen, as `YYYY-MM-DD`. */
3707
4001
  max?: (HelixHeadlessDateInput["max"]) | undefined;
4002
+ /** How far the calendar's heading steps back from the days: `month` or
4003
+ `year`. Handed to the calendar; see Date Picker's `max-view`. */
4004
+ "max-view"?: (HelixHeadlessDateInput["maxView"]) | undefined;
4005
+ /** How far the calendar's heading steps back from the days: `month` or
4006
+ `year`. Handed to the calendar; see Date Picker's `max-view`. */
4007
+ maxView?: (HelixHeadlessDateInput["maxView"]) | undefined;
3708
4008
  /** The earliest date that can be chosen, as `YYYY-MM-DD`. */
3709
4009
  min?: (HelixHeadlessDateInput["min"]) | undefined;
3710
4010
  /** How many dates can be held at once.
@@ -3720,16 +4020,38 @@ an end in April otherwise means paging between them and losing sight of the
3720
4020
  first. The panel is sized by its content, so this widens it, and where the
3721
4021
  window has no room for that width it shows one month until there is. */
3722
4022
  months?: (HelixHeadlessDateInput["months"]) | undefined;
4023
+ /** The name of the calendar's heading where it shows the months, with
4024
+ `{heading}` filled in. */
4025
+ "month-view-label"?: (HelixHeadlessDateInput["monthViewLabel"]) | undefined;
4026
+ /** The name of the calendar's heading where it shows the months, with
4027
+ `{heading}` filled in. */
4028
+ monthViewLabel?: (HelixHeadlessDateInput["monthViewLabel"]) | undefined;
3723
4029
  /** The name of the calendar's control that moves to the next month. */
3724
4030
  "next-label"?: (HelixHeadlessDateInput["nextLabel"]) | undefined;
3725
4031
  /** The name of the calendar's control that moves to the next month. */
3726
4032
  nextLabel?: (HelixHeadlessDateInput["nextLabel"]) | undefined;
4033
+ /** The name of the calendar's control that moves forward a year. */
4034
+ "next-year-label"?: (HelixHeadlessDateInput["nextYearLabel"]) | undefined;
4035
+ /** The name of the calendar's control that moves forward a year. */
4036
+ nextYearLabel?: (HelixHeadlessDateInput["nextYearLabel"]) | undefined;
4037
+ /** The name of the calendar's control that moves forward a page of years. */
4038
+ "next-years-label"?: (HelixHeadlessDateInput["nextYearsLabel"]) | undefined;
4039
+ /** The name of the calendar's control that moves forward a page of years. */
4040
+ nextYearsLabel?: (HelixHeadlessDateInput["nextYearsLabel"]) | undefined;
3727
4041
  /** The text the field shows before a date is entered. */
3728
4042
  placeholder?: (HelixHeadlessDateInput["placeholder"]) | undefined;
3729
4043
  /** The name of the calendar's control that moves to the previous month. */
3730
4044
  "previous-label"?: (HelixHeadlessDateInput["previousLabel"]) | undefined;
3731
4045
  /** The name of the calendar's control that moves to the previous month. */
3732
4046
  previousLabel?: (HelixHeadlessDateInput["previousLabel"]) | undefined;
4047
+ /** The name of the calendar's control that moves back a year. */
4048
+ "previous-year-label"?: (HelixHeadlessDateInput["previousYearLabel"]) | undefined;
4049
+ /** The name of the calendar's control that moves back a year. */
4050
+ previousYearLabel?: (HelixHeadlessDateInput["previousYearLabel"]) | undefined;
4051
+ /** The name of the calendar's control that moves back a page of years. */
4052
+ "previous-years-label"?: (HelixHeadlessDateInput["previousYearsLabel"]) | undefined;
4053
+ /** The name of the calendar's control that moves back a page of years. */
4054
+ previousYearsLabel?: (HelixHeadlessDateInput["previousYearsLabel"]) | undefined;
3733
4055
  /** The message shown when a range holds more than two dates.
3734
4056
 
3735
4057
  **Every sentence a control raises in the browser's bubble is a property**,
@@ -3785,6 +4107,26 @@ platform's base. */
3785
4107
  "unavailable-message"?: (HelixHeadlessDateInput["unavailableMessage"]) | undefined;
3786
4108
  /** The message shown when `disable-dates` or `disable-days` bars a date. */
3787
4109
  unavailableMessage?: (HelixHeadlessDateInput["unavailableMessage"]) | undefined;
4110
+ /** The name of the calendar's heading where it shows a page of years, with
4111
+ `{heading}` filled in. */
4112
+ "year-view-label"?: (HelixHeadlessDateInput["yearViewLabel"]) | undefined;
4113
+ /** The name of the calendar's heading where it shows a page of years, with
4114
+ `{heading}` filled in. */
4115
+ yearViewLabel?: (HelixHeadlessDateInput["yearViewLabel"]) | undefined;
4116
+ /** What a screen reader hears for a segment with nothing in it, which a
4117
+ sighted reader sees as dashes. */
4118
+ "empty-segment-label"?: (HelixHeadlessDateInput["emptySegmentLabel"]) | undefined;
4119
+ /** What a screen reader hears for a segment with nothing in it, which a
4120
+ sighted reader sees as dashes. */
4121
+ emptySegmentLabel?: (HelixHeadlessDateInput["emptySegmentLabel"]) | undefined;
4122
+ /** Whether the field is a row of segments, one for each part of the date or
4123
+ time, in place of a line of text.
4124
+
4125
+ Each segment is set with digits or the arrow keys, in the order the
4126
+ locale writes them, so a reader types a date the way they write one and
4127
+ no format has to be read back. The picker still opens from the trigger
4128
+ and with Alt+Down. */
4129
+ segmented?: (HelixHeadlessDateInput["segmented"]) | undefined;
3788
4130
  /** Whether the value is locked. A read-only control still submits its value.
3789
4131
 
3790
4132
  **Enforced by refusing every request in one place**, which is the seam this
@@ -3925,6 +4267,14 @@ imperatively later, and nothing is hydrating by then.
3925
4267
 
3926
4268
  Here rather than on each control. */
3927
4269
  name?: (HelixHeadlessDateInput["name"]) | undefined;
4270
+ /** What each day in the calendar shows, in place of its number: a function
4271
+ given the date as `YYYY-MM-DD`. Handed to the calendar; see Date Picker's
4272
+ `dayContent`. */
4273
+ dayContent?: (HelixHeadlessDateInput["dayContent"]) | undefined;
4274
+ /** A rule for which dates cannot be chosen: a function given the date as
4275
+ `YYYY-MM-DD` that returns `true` to bar it. The calendar offers such a date
4276
+ as unavailable, and a typed one is invalid, as with `disable-dates`. */
4277
+ isDateUnavailable?: (HelixHeadlessDateInput["isDateUnavailable"]) | undefined;
3928
4278
  /** The value as a `Date`, at midnight UTC, or `null` while there is no date.
3929
4279
 
3930
4280
  The platform's own pair on `<input type="date">`, and this control holds the
@@ -4017,6 +4367,24 @@ Absent uses the runtime's own. */
4017
4367
  locale?: (HelixHeadlessDatePicker["locale"]) | undefined;
4018
4368
  /** Latest selectable date, as `YYYY-MM-DD`. */
4019
4369
  max?: (HelixHeadlessDatePicker["max"]) | undefined;
4370
+ /** How far the heading lets a reader step back from the days: `month` to a
4371
+ year's months, or `year` to a page of years and then its months.
4372
+
4373
+ Absent, the heading is text and the calendar moves a month at a time. Set,
4374
+ the heading is a button that shows the months, and from there the years,
4375
+ so a birth date forty years back is three presses rather than four hundred
4376
+ and eighty. Choosing a year shows its months, and choosing a month shows
4377
+ its days. */
4378
+ "max-view"?: (HelixHeadlessDatePicker["maxView"]) | undefined;
4379
+ /** How far the heading lets a reader step back from the days: `month` to a
4380
+ year's months, or `year` to a page of years and then its months.
4381
+
4382
+ Absent, the heading is text and the calendar moves a month at a time. Set,
4383
+ the heading is a button that shows the months, and from there the years,
4384
+ so a birth date forty years back is three presses rather than four hundred
4385
+ and eighty. Choosing a year shows its months, and choosing a month shows
4386
+ its days. */
4387
+ maxView?: (HelixHeadlessDatePicker["maxView"]) | undefined;
4020
4388
  /** Earliest selectable date, as `YYYY-MM-DD`. */
4021
4389
  min?: (HelixHeadlessDatePicker["min"]) | undefined;
4022
4390
  /** How many dates can be held at once. */
@@ -4030,10 +4398,24 @@ can drive the view. Reading gives the month on show; writing sets it, and
4030
4398
  month?: (HelixHeadlessDatePicker["month"]) | undefined;
4031
4399
  /** How many months to show, side by side. */
4032
4400
  months?: (HelixHeadlessDatePicker["months"]) | undefined;
4401
+ /** The name of the heading where it shows the months, with `{heading}`
4402
+ filled in as the month on show. */
4403
+ "month-view-label"?: (HelixHeadlessDatePicker["monthViewLabel"]) | undefined;
4404
+ /** The name of the heading where it shows the months, with `{heading}`
4405
+ filled in as the month on show. */
4406
+ monthViewLabel?: (HelixHeadlessDatePicker["monthViewLabel"]) | undefined;
4033
4407
  /** Accessible name for the control that pages forward. */
4034
4408
  "next-label"?: (HelixHeadlessDatePicker["nextLabel"]) | undefined;
4035
4409
  /** Accessible name for the control that pages forward. */
4036
4410
  nextLabel?: (HelixHeadlessDatePicker["nextLabel"]) | undefined;
4411
+ /** Accessible name for the control that moves forward a year, in the months. */
4412
+ "next-year-label"?: (HelixHeadlessDatePicker["nextYearLabel"]) | undefined;
4413
+ /** Accessible name for the control that moves forward a year, in the months. */
4414
+ nextYearLabel?: (HelixHeadlessDatePicker["nextYearLabel"]) | undefined;
4415
+ /** Accessible name for the control that moves forward a page, in the years. */
4416
+ "next-years-label"?: (HelixHeadlessDatePicker["nextYearsLabel"]) | undefined;
4417
+ /** Accessible name for the control that moves forward a page, in the years. */
4418
+ nextYearsLabel?: (HelixHeadlessDatePicker["nextYearsLabel"]) | undefined;
4037
4419
  /** Accessible name for the control that pages back.
4038
4420
 
4039
4421
  A property because a calendar rendering its own month names from `locale`
@@ -4048,6 +4430,14 @@ would otherwise still announce its controls in English. `attribute:`
4048
4430
  spelled out, since Lit lowercases a camelCase name rather than dash-casing
4049
4431
  it. */
4050
4432
  previousLabel?: (HelixHeadlessDatePicker["previousLabel"]) | undefined;
4433
+ /** Accessible name for the control that moves back a year, in the months. */
4434
+ "previous-year-label"?: (HelixHeadlessDatePicker["previousYearLabel"]) | undefined;
4435
+ /** Accessible name for the control that moves back a year, in the months. */
4436
+ previousYearLabel?: (HelixHeadlessDatePicker["previousYearLabel"]) | undefined;
4437
+ /** Accessible name for the control that moves back a page, in the years. */
4438
+ "previous-years-label"?: (HelixHeadlessDatePicker["previousYearsLabel"]) | undefined;
4439
+ /** Accessible name for the control that moves back a page, in the years. */
4440
+ previousYearsLabel?: (HelixHeadlessDatePicker["previousYearsLabel"]) | undefined;
4051
4441
  /** The validation message for a date after `max`. `{max}` is replaced with
4052
4442
  `max`, written as a date in `locale`. */
4053
4443
  "range-overflow-message"?: (HelixHeadlessDatePicker["rangeOverflowMessage"]) | undefined;
@@ -4112,6 +4502,17 @@ bars. */
4112
4502
  "value-missing-message"?: (HelixHeadlessDatePicker["valueMissingMessage"]) | undefined;
4113
4503
  /** The validation message for a required date picker with no date chosen. */
4114
4504
  valueMissingMessage?: (HelixHeadlessDatePicker["valueMissingMessage"]) | undefined;
4505
+ /** What the calendar shows: the days of a month, the months of a year, or a
4506
+ page of years. `day` unless `max-view` lets a reader step back.
4507
+
4508
+ Not reflected, being state. Set it to open on the months or the years. */
4509
+ view?: (HelixHeadlessDatePicker["view"]) | undefined;
4510
+ /** The name of the heading where it shows a page of years, with `{heading}`
4511
+ filled in as the year on show. */
4512
+ "year-view-label"?: (HelixHeadlessDatePicker["yearViewLabel"]) | undefined;
4513
+ /** The name of the heading where it shows a page of years, with `{heading}`
4514
+ filled in as the year on show. */
4515
+ yearViewLabel?: (HelixHeadlessDatePicker["yearViewLabel"]) | undefined;
4115
4516
  /** The value the control starts with. A form reset returns it to this value. */
4116
4517
  "default-value"?: (HelixHeadlessDatePicker["defaultValue"]) | undefined;
4117
4518
  /** The value the control starts with. A form reset returns it to this value. */
@@ -4149,6 +4550,24 @@ imperatively later, and nothing is hydrating by then.
4149
4550
 
4150
4551
  Here rather than on each control. */
4151
4552
  name?: (HelixHeadlessDatePicker["name"]) | undefined;
4553
+ /** What each day shows, in place of its number: a function given the date as
4554
+ `YYYY-MM-DD` that returns text, an element or a Lit template.
4555
+
4556
+ For a price or a dot under the number, as React Aria's `CalendarCell`
4557
+ takes children. The cell is still named by its whole date, so what you
4558
+ draw here is for the eye; say anything a reader must hear in the date's
4559
+ description elsewhere. Return the day's number with it where it should
4560
+ still show. A property only, there being no way to write a function in
4561
+ markup. */
4562
+ dayContent?: (HelixHeadlessDatePicker["dayContent"]) | undefined;
4563
+ /** A rule for which dates cannot be chosen: a function given the date as
4564
+ `YYYY-MM-DD` that returns `true` to bar it.
4565
+
4566
+ For what a list cannot say, such as the second Tuesday of each month or
4567
+ the days a server has fully booked. It bars a date as `disable-dates`
4568
+ does, in the grid and in validation. A property only, as React Aria's
4569
+ `isDateUnavailable` is a prop. */
4570
+ isDateUnavailable?: (HelixHeadlessDatePicker["isDateUnavailable"]) | undefined;
4152
4571
  /** The value as a `Date`, at midnight UTC, or `null` while there is no date.
4153
4572
 
4154
4573
  The platform's own pair on `<input type="date">`, and this control holds the
@@ -4222,6 +4641,16 @@ export type HelixHeadlessDialogToggleElementEvent =
4222
4641
  HelixHeadlessDialogElementEvent<ToggleEvent>;
4223
4642
 
4224
4643
  export type HelixHeadlessDialogVueProps = {
4644
+ /** Makes the dialog an alert dialog, for a message that interrupts to ask for
4645
+ an answer, such as a confirmation before something is deleted.
4646
+
4647
+ The `<dialog>` takes `role="alertdialog"`, so a screen reader announces the
4648
+ dialog and its description as it opens. Everything else stays the same:
4649
+ the dialog is modal, Escape asks to close it, and `persistent` still
4650
+ refuses that.
4651
+
4652
+ Not reflected, because no stylesheet selects on it. */
4653
+ alert?: (HelixHeadlessDialog["alert"]) | undefined;
4225
4654
  /** Which close requests the browser handles on its own.
4226
4655
 
4227
4656
  `<dialog closedby>`, forwarded, and safe to forward because every path it
@@ -4244,6 +4673,17 @@ the property this component exists to keep.
4244
4673
  Absent by default, which is the platform's `auto` and this library's rule
4245
4674
  that a resting value is an attribute's absence. */
4246
4675
  closedBy?: (HelixHeadlessDialog["closedBy"]) | undefined;
4676
+ /** Draws a control that closes the dialog, in the corner where the title is.
4677
+
4678
+ Pressing it is `close()`, so it sends `helix-before-close` like every other
4679
+ way out, and `persistent` does not disable it. */
4680
+ dismissible?: (HelixHeadlessDialog["dismissible"]) | undefined;
4681
+ /** The close control's accessible name. Translate it with the rest of your
4682
+ interface. */
4683
+ "dismiss-label"?: (HelixHeadlessDialog["dismissLabel"]) | undefined;
4684
+ /** The close control's accessible name. Translate it with the rest of your
4685
+ interface. */
4686
+ dismissLabel?: (HelixHeadlessDialog["dismissLabel"]) | undefined;
4247
4687
  /** Accessible name for the dialog. When it is empty, the heading in the
4248
4688
  `header` slot names the dialog. */
4249
4689
  label?: (HelixHeadlessDialog["label"]) | undefined;
@@ -4451,6 +4891,24 @@ default assigned to the property would reflect onto every host and put a
4451
4891
  `placement="end"` into markup no consumer wrote. So what this tier
4452
4892
  guarantees is the absence, and a sheet selects on it. */
4453
4893
  placement?: (HelixHeadlessDrawer["placement"]) | undefined;
4894
+ /** The fractions of the panel a reader can leave on screen, as a list such as
4895
+ `0.5 1`. The drawer opens at the smallest, and a swipe comes to rest at the
4896
+ nearest, or closes the drawer below the smallest.
4897
+
4898
+ Empty is `1`: the whole panel, and a swipe either closes it or puts it
4899
+ back. */
4900
+ "snap-points"?: (HelixHeadlessDrawer["snapPoints"]) | undefined;
4901
+ /** The fractions of the panel a reader can leave on screen, as a list such as
4902
+ `0.5 1`. The drawer opens at the smallest, and a swipe comes to rest at the
4903
+ nearest, or closes the drawer below the smallest.
4904
+
4905
+ Empty is `1`: the whole panel, and a swipe either closes it or puts it
4906
+ back. */
4907
+ snapPoints?: (HelixHeadlessDrawer["snapPoints"]) | undefined;
4908
+ /** Whether a touch or a pen can swipe the drawer away. `swipe="false"` turns
4909
+ it off, for a panel whose content has its own use for the gesture, such as
4910
+ a map. */
4911
+ swipe?: (HelixHeadlessDrawer["swipe"]) | undefined;
4454
4912
  /** Whether the element starts open. Ignored once `open` is written. */
4455
4913
  "default-open"?: (HelixHeadlessDrawer["defaultOpen"]) | undefined;
4456
4914
  /** Whether the element starts open. Ignored once `open` is written. */
@@ -4603,6 +5061,9 @@ export type HelixHeadlessFileInputElementEvent<E = Event> = TypedEvent<
4603
5061
  /** `helix-before-change` event type */
4604
5062
  export type HelixHeadlessFileInputHelixBeforeChangeElementEvent =
4605
5063
  HelixHeadlessFileInputElementEvent<HelixBeforeChangeEvent>;
5064
+ /** `helix-reject` event type */
5065
+ export type HelixHeadlessFileInputHelixRejectElementEvent =
5066
+ HelixHeadlessFileInputElementEvent<HelixRejectEvent>;
4606
5067
 
4607
5068
  export type HelixHeadlessFileInputVueProps = {
4608
5069
  /** Which files the picker offers and a drop takes, as a native `accept` list.
@@ -4612,12 +5073,31 @@ filter is the only check the platform makes and a drop never meets it. */
4612
5073
  accept?: (HelixHeadlessFileInput["accept"]) | undefined;
4613
5074
  /** Which camera or microphone a mobile picker should offer, if any. */
4614
5075
  capture?: (HelixHeadlessFileInput["capture"]) | undefined;
5076
+ /** Whether the picker chooses a folder, and the field takes every file in
5077
+ it. The platform's `webkitdirectory`. */
5078
+ directory?: (HelixHeadlessFileInput["directory"]) | undefined;
4615
5079
  /** Language tag the sizes are written in.
4616
5080
 
4617
5081
  Absent uses the runtime's own. */
4618
5082
  locale?: (HelixHeadlessFileInput["locale"]) | undefined;
5083
+ /** The most files the field holds, under `multiple`. Files past it are
5084
+ refused. */
5085
+ "max-files"?: (HelixHeadlessFileInput["maxFiles"] | `${number}`) | undefined;
5086
+ /** The most files the field holds, under `multiple`. Files past it are
5087
+ refused. */
5088
+ maxFiles?: (HelixHeadlessFileInput["maxFiles"]) | undefined;
5089
+ /** The most bytes one file may have. A larger one is refused. */
5090
+ "max-file-size"?: (HelixHeadlessFileInput["maxFileSize"] | `${number}`) | undefined;
5091
+ /** The most bytes one file may have. A larger one is refused. */
5092
+ maxFileSize?: (HelixHeadlessFileInput["maxFileSize"]) | undefined;
4619
5093
  /** Whether more than one file can be chosen. */
4620
5094
  multiple?: (HelixHeadlessFileInput["multiple"]) | undefined;
5095
+ /** What a reader hears when files are refused, with `{count}` and `{names}`
5096
+ filled in. */
5097
+ "rejected-text"?: (HelixHeadlessFileInput["rejectedText"]) | undefined;
5098
+ /** What a reader hears when files are refused, with `{count}` and `{names}`
5099
+ filled in. */
5100
+ rejectedText?: (HelixHeadlessFileInput["rejectedText"]) | undefined;
4621
5101
  /** The accessible name of the control that removes a file. `{name}` is
4622
5102
  replaced with the file's name.
4623
5103
 
@@ -4692,6 +5172,9 @@ imperatively later, and nothing is hydrating by then.
4692
5172
 
4693
5173
  Here rather than on each control. */
4694
5174
  name?: (HelixHeadlessFileInput["name"]) | undefined;
5175
+ /** Your own check on each arriving file, which returns why it is refused, or
5176
+ nothing to take it. A property, since a function cannot be an attribute. */
5177
+ validate?: (HelixHeadlessFileInput["validate"]) | undefined;
4695
5178
  };
4696
5179
 
4697
5180
  export type HelixHeadlessFileInputVueEvents = {
@@ -4699,6 +5182,8 @@ export type HelixHeadlessFileInputVueEvents = {
4699
5182
  change: HelixHeadlessFileInputElementEvent;
4700
5183
  /** Fired before the chosen files change, with their names, and cancelable. Canceling it keeps the files the field had, even when the browser has already written a new pick. */
4701
5184
  "helix-before-change": HelixHeadlessFileInputHelixBeforeChangeElementEvent;
5185
+ /** Fired when files arrive and some are left out. `detail.files` lists each with its `reason`: `type`, `size`, `count` or `invalid`, and your `validate` message. */
5186
+ "helix-reject": HelixHeadlessFileInputHelixRejectElementEvent;
4702
5187
  /** Fired after the value changes. */
4703
5188
  input: HelixHeadlessFileInputElementEvent;
4704
5189
  };
@@ -4912,10 +5397,26 @@ an icon. */
4912
5397
  /** The name of the clear button, read by screen readers. The button shows only
4913
5398
  an icon. */
4914
5399
  clearLabel?: (HelixHeadlessFilterInput["clearLabel"]) | undefined;
5400
+ /** Whether the panel narrows itself to the suggestions that hold the term
5401
+ being typed, as React Aria's Autocomplete filters. Off, the panel shows
5402
+ what you slot and you narrow it. */
5403
+ "filter-suggestions"?: (HelixHeadlessFilterInput["filterSuggestions"]) | undefined;
5404
+ /** Whether the panel narrows itself to the suggestions that hold the term
5405
+ being typed, as React Aria's Autocomplete filters. Off, the panel shows
5406
+ what you slot and you narrow it. */
5407
+ filterSuggestions?: (HelixHeadlessFilterInput["filterSuggestions"]) | undefined;
4915
5408
  /** The text shown while the field is empty.
4916
5409
 
4917
5410
  Not a label: it goes when typing starts. */
4918
5411
  placeholder?: (HelixHeadlessFilterInput["placeholder"]) | undefined;
5412
+ /** What a reader hears for one suggestion, with `{count}` filled in. */
5413
+ "suggestion-label"?: (HelixHeadlessFilterInput["suggestionLabel"]) | undefined;
5414
+ /** What a reader hears for one suggestion, with `{count}` filled in. */
5415
+ suggestionLabel?: (HelixHeadlessFilterInput["suggestionLabel"]) | undefined;
5416
+ /** What a reader hears for any other number of suggestions, with `{count}` filled in. */
5417
+ "suggestions-label"?: (HelixHeadlessFilterInput["suggestionsLabel"]) | undefined;
5418
+ /** What a reader hears for any other number of suggestions, with `{count}` filled in. */
5419
+ suggestionsLabel?: (HelixHeadlessFilterInput["suggestionsLabel"]) | undefined;
4919
5420
  /** Whether the element starts open. Ignored once `open` is written. */
4920
5421
  "default-open"?: (HelixHeadlessFilterInput["defaultOpen"]) | undefined;
4921
5422
  /** Whether the element starts open. Ignored once `open` is written. */
@@ -5056,6 +5557,12 @@ Lit's server shim, `textContent`, `children`, `firstChild` and
5056
5557
  it. An element rendered on a server needs the attribute; one rendered in a
5057
5558
  browser may use either. */
5058
5559
  date?: (HelixHeadlessFormatDate["date"]) | undefined;
5560
+ /** The locale's own pattern for the date: `full`, `long`, `medium`, or
5561
+ `short`. Set, it stands in for `weekday`, `day`, `month`, `year` and `era`. */
5562
+ "date-style"?: (HelixHeadlessFormatDate["dateStyle"]) | undefined;
5563
+ /** The locale's own pattern for the date: `full`, `long`, `medium`, or
5564
+ `short`. Set, it stands in for `weekday`, `day`, `month`, `year` and `era`. */
5565
+ dateStyle?: (HelixHeadlessFormatDate["dateStyle"]) | undefined;
5059
5566
  /** How the day of the month is written, where a date is shown. */
5060
5567
  day?: (HelixHeadlessFormatDate["day"]) | undefined;
5061
5568
  /** Shows how long ago the timestamp was, in a compact form such as "3h", in
@@ -5065,8 +5572,22 @@ Reflected, because it is the one property that decides which of two readings
5065
5572
  this is and a stylesheet has a reason to know: a compact reading is a fixed
5066
5573
  few characters and a date is not. */
5067
5574
  elapsed?: (HelixHeadlessFormatDate["elapsed"]) | undefined;
5575
+ /** How the era is written, such as AD, where a date is shown. */
5576
+ era?: (HelixHeadlessFormatDate["era"]) | undefined;
5068
5577
  /** How the hour is written, where a time of day is shown. */
5069
5578
  hour?: (HelixHeadlessFormatDate["hour"]) | undefined;
5579
+ /** The clock a time of day is written on: `h12` or `h11` for twelve hours,
5580
+ `h23` or `h24` for twenty-four.
5581
+
5582
+ Absent is the locale's own, which is right unless your product shows every
5583
+ reader the same clock whatever their language. */
5584
+ "hour-cycle"?: (HelixHeadlessFormatDate["hourCycle"]) | undefined;
5585
+ /** The clock a time of day is written on: `h12` or `h11` for twelve hours,
5586
+ `h23` or `h24` for twenty-four.
5587
+
5588
+ Absent is the locale's own, which is right unless your product shows every
5589
+ reader the same clock whatever their language. */
5590
+ hourCycle?: (HelixHeadlessFormatDate["hourCycle"]) | undefined;
5070
5591
  /** The locale to format the timestamp in.
5071
5592
 
5072
5593
  Empty is the runtime's own. */
@@ -5075,8 +5596,26 @@ Empty is the runtime's own. */
5075
5596
  minute?: (HelixHeadlessFormatDate["minute"]) | undefined;
5076
5597
  /** How the month is written, where a date is shown. */
5077
5598
  month?: (HelixHeadlessFormatDate["month"]) | undefined;
5599
+ /** Whether a `relative` reading may use a word for a number: `auto` says
5600
+ "yesterday" and "now", and `always` says "1 day ago" and "in 0 seconds". */
5601
+ numeric?: (HelixHeadlessFormatDate["numeric"]) | undefined;
5602
+ /** Shows how long ago the timestamp was, or how long until it, in words, in
5603
+ place of the date: `long` ("3 hours ago"), `short` ("3 hr. ago") or
5604
+ `narrow` ("3h ago").
5605
+
5606
+ The reading refreshes as it goes stale, as `elapsed` does, and the whole
5607
+ date is its title. `elapsed` wins where both are set. */
5608
+ relative?: (HelixHeadlessFormatDate["relative"]) | undefined;
5078
5609
  /** How the second is written, where a time of day is shown. */
5079
5610
  second?: (HelixHeadlessFormatDate["second"]) | undefined;
5611
+ /** The locale's own pattern for the time of day: `full`, `long`, `medium`, or
5612
+ `short`. Set, it stands in for `hour`, `minute`, `second` and
5613
+ `time-zone-name`. */
5614
+ "time-style"?: (HelixHeadlessFormatDate["timeStyle"]) | undefined;
5615
+ /** The locale's own pattern for the time of day: `full`, `long`, `medium`, or
5616
+ `short`. Set, it stands in for `hour`, `minute`, `second` and
5617
+ `time-zone-name`. */
5618
+ timeStyle?: (HelixHeadlessFormatDate["timeStyle"]) | undefined;
5080
5619
  /** The time zone to read the timestamp in.
5081
5620
 
5082
5621
  Empty is the runtime's own. */
@@ -5584,6 +6123,22 @@ Lives here rather than only on `IconButton` so the two share one render.
5584
6123
  An icon-only button without it is a control a screen reader announces as
5585
6124
  "button" and nothing else. */
5586
6125
  label?: (HelixHeadlessIconButton["label"]) | undefined;
6126
+ /** Whether the action the button started is still running.
6127
+
6128
+ A pending button keeps focus and stays in the tab order, and refuses every
6129
+ press: a click, Enter and Space, and Enter in a field of its form. The
6130
+ click does not reach your listeners. The inner control carries
6131
+ `aria-busy` and `aria-disabled`, and when the button becomes pending while
6132
+ it has focus, a reader hears `pending-label`. The styled button draws a
6133
+ turning ring over its words.
6134
+
6135
+ `disabled` takes the button out of reach. Use `pending` for the wait after
6136
+ a press, so focus stays where the reader left it. */
6137
+ pending?: (HelixHeadlessIconButton["pending"]) | undefined;
6138
+ /** What a reader hears when the button becomes pending while it has focus. */
6139
+ "pending-label"?: (HelixHeadlessIconButton["pendingLabel"]) | undefined;
6140
+ /** What a reader hears when the button becomes pending while it has focus. */
6141
+ pendingLabel?: (HelixHeadlessIconButton["pendingLabel"]) | undefined;
5587
6142
  /** What activating the button does to its form. */
5588
6143
  type?: (HelixHeadlessIconButton["type"]) | undefined;
5589
6144
  /** The value this button submits under its own `name`, as a native submit
@@ -5706,8 +6261,12 @@ disagreeing with its own name for every reader who meant the left. */
5706
6261
  so it is what markup can carry, and resolving one means an index of the
5707
6262
  whole set that no bundler can shake: 15 kB for a consumer who renders one
5708
6263
  mark. An attribute is the only thing an HTML author can write, and that is
5709
- worth the index; a consumer who would rather not pay it hands over the
5710
- value instead. */
6264
+ worth the index; a consumer who would rather not pay it imports the
6265
+ element from `icon/root` and registers the glyphs it names, or hands over
6266
+ the value instead.
6267
+
6268
+ A name written `prefix:name` asks the library registered under that
6269
+ prefix. */
5711
6270
  name?: (HelixHeadlessIcon["name"]) | undefined;
5712
6271
  /** The icon to draw, as an object you import.
5713
6272
 
@@ -5725,8 +6284,10 @@ for. Set both and this wins, the value being the more specific statement. */
5725
6284
  };
5726
6285
 
5727
6286
  export type HelixHeadlessIconVueEvents = {
5728
- /** `name` matches no icon in the set, so nothing is drawn. */
6287
+ /** `name` matches no registered icon and no library answers it, so nothing is drawn. */
5729
6288
  error: HelixHeadlessIconElementEvent;
6289
+ /** A glyph a library gave later for `name` is drawn. */
6290
+ load: HelixHeadlessIconElementEvent;
5730
6291
  };
5731
6292
 
5732
6293
  /** `HelixHeadlessImage` component event */
@@ -5780,6 +6341,18 @@ ninety-nine pictures. */
5780
6341
  picture worth putting in a component is usually below the fold and the one
5781
6342
  that is not is the exception worth writing down. */
5782
6343
  loading?: (HelixHeadlessImage["loading"]) | undefined;
6344
+ /** How long, in milliseconds, the placeholder waits before it shows.
6345
+
6346
+ Absent or `0` shows it at once. A picture that arrives inside
6347
+ the wait never shows a placeholder at all, so a cached or fast image does
6348
+ not flash one. Radix's `delayMs` on its avatar fallback is the same idea. */
6349
+ "placeholder-delay"?: (HelixHeadlessImage["placeholderDelay"] | `${number}`) | undefined;
6350
+ /** How long, in milliseconds, the placeholder waits before it shows.
6351
+
6352
+ Absent or `0` shows it at once. A picture that arrives inside
6353
+ the wait never shows a placeholder at all, so a cached or fast image does
6354
+ not flash one. Radix's `delayMs` on its avatar fallback is the same idea. */
6355
+ placeholderDelay?: (HelixHeadlessImage["placeholderDelay"]) | undefined;
5783
6356
  /** How much of the referring URL to send with the request. */
5784
6357
  referrerpolicy?: (HelixHeadlessImage["referrerPolicy"]) | undefined;
5785
6358
  /** How much of the referring URL to send with the request. */
@@ -6028,6 +6601,8 @@ export type HelixHeadlessInputVueEvents = {
6028
6601
  change: HelixHeadlessInputElementEvent;
6029
6602
  /** The text is about to change. Cancelable: cancel it to keep the current text. */
6030
6603
  "helix-before-change": HelixHeadlessInputHelixBeforeChangeElementEvent;
6604
+ /** Fired after the clear button has emptied the field, after `input` and `change`. */
6605
+ "helix-clear": HelixHeadlessInputElementEvent;
6031
6606
  /** Fired as the value changes. */
6032
6607
  input: HelixHeadlessInputElementEvent;
6033
6608
  };
@@ -6042,6 +6617,13 @@ export type HelixHeadlessKbdHelixShortcutElementEvent =
6042
6617
  HelixHeadlessKbdElementEvent<HelixShortcutEvent>;
6043
6618
 
6044
6619
  export type HelixHeadlessKbdVueProps = {
6620
+ /** The id of the control the shortcut works, which is given the chord as its
6621
+ `aria-keyshortcuts`.
6622
+
6623
+ Names an element in the same tree, the way `Tooltip.for` does. Separate
6624
+ from `within`, which says where the key listens: a key can describe a
6625
+ shortcut the page binds itself. */
6626
+ for?: (HelixHeadlessKbd["for"]) | undefined;
6045
6627
  /** The key or chord to show, such as `mod+k`, `?`, or `/`.
6046
6628
 
6047
6629
  `mod` is the platform's own command modifier, which is the reason to write
@@ -6070,6 +6652,15 @@ export type HelixHeadlessKbdVueEvents = {
6070
6652
  "helix-shortcut": HelixHeadlessKbdHelixShortcutElementEvent;
6071
6653
  };
6072
6654
 
6655
+ /** `HelixHeadlessLegend` component event */
6656
+ export type HelixHeadlessLegendElementEvent<E = Event> = TypedEvent<
6657
+ HelixHeadlessLegend,
6658
+ E
6659
+ >;
6660
+ /** `helix-before-change` event type */
6661
+ export type HelixHeadlessLegendHelixBeforeChangeElementEvent =
6662
+ HelixHeadlessLegendElementEvent<HelixBeforeChangeEvent>;
6663
+
6073
6664
  export type HelixHeadlessLegendVueProps = {
6074
6665
  /** How the entries are read from the table: `series`, `categories`, or
6075
6666
  `measures`.
@@ -6098,14 +6689,40 @@ shadow root reads a table in that root rather than one in the document.
6098
6689
  **In React this arrives as a property and not as an attribute**, the way
6099
6690
  `Tooltip.for` does, so it does not reflect and nothing styles on it. */
6100
6691
  for?: (HelixHeadlessLegend["for"]) | undefined;
6692
+ /** The series hidden on the table, by name, separated by commas: what
6693
+ `toggles` hides and shows.
6694
+
6695
+ Set it to start with series hidden. Every chart reading the same table
6696
+ draws without them. Commas only, because a column's heading may hold a
6697
+ space. For a ring the names are the rows. */
6698
+ "hidden-series"?: (HelixHeadlessLegend["hiddenSeries"]) | undefined;
6699
+ /** The series hidden on the table, by name, separated by commas: what
6700
+ `toggles` hides and shows.
6701
+
6702
+ Set it to start with series hidden. Every chart reading the same table
6703
+ draws without them. Commas only, because a column's heading may hold a
6704
+ space. For a ring the names are the rows. */
6705
+ hiddenSeries?: (HelixHeadlessLegend["hiddenSeries"]) | undefined;
6101
6706
  /** The name of the list, which a screen reader announces before its entries.
6102
6707
 
6103
6708
  Absent names the list after the table's caption, so a page with several
6104
6709
  charts has a legend list for each that says which chart it keys. */
6105
6710
  label?: (HelixHeadlessLegend["label"]) | undefined;
6711
+ /** Makes each entry a button that hides or shows its series in every chart
6712
+ reading the same table.
6713
+
6714
+ Absent, the legend only displays, which is what it did before this
6715
+ existed. Reflected, because the styled tier draws a button differently
6716
+ from a plain entry. */
6717
+ toggles?: (HelixHeadlessLegend["toggles"]) | undefined;
6106
6718
  };
6107
6719
 
6108
- export type HelixHeadlessLegendVueEvents = {};
6720
+ export type HelixHeadlessLegendVueEvents = {
6721
+ /** Fired once a toggle has hidden or shown a series. */
6722
+ change: HelixHeadlessLegendElementEvent;
6723
+ /** Fired before a toggle hides or shows a series, with the `hidden-series` it would leave. Cancelable. */
6724
+ "helix-before-change": HelixHeadlessLegendHelixBeforeChangeElementEvent;
6725
+ };
6109
6726
 
6110
6727
  export type HelixHeadlessLightboxItemVueProps = {
6111
6728
  /** Whether this item is the one shown.
@@ -6143,6 +6760,19 @@ export type HelixHeadlessLightboxToggleElementEvent =
6143
6760
  HelixHeadlessLightboxElementEvent<ToggleEvent>;
6144
6761
 
6145
6762
  export type HelixHeadlessLightboxVueProps = {
6763
+ /** Draws the viewer's own previous, next and close controls over the picture.
6764
+
6765
+ Off by default, for a viewer whose chrome you compose in the `header` and
6766
+ `footer` slots. The controls hide with the rest of the chrome while the
6767
+ reader is idle, and the previous and next ones say they are unavailable at
6768
+ either end of a set that does not `loop`. */
6769
+ controls?: (HelixHeadlessLightbox["controls"]) | undefined;
6770
+ /** The close control's accessible name. Translate it with the rest of your
6771
+ interface. */
6772
+ "dismiss-label"?: (HelixHeadlessLightbox["dismissLabel"]) | undefined;
6773
+ /** The close control's accessible name. Translate it with the rest of your
6774
+ interface. */
6775
+ dismissLabel?: (HelixHeadlessLightbox["dismissLabel"]) | undefined;
6146
6776
  /** How long the user can be idle before the header and footer hide, in
6147
6777
  milliseconds.
6148
6778
 
@@ -6161,6 +6791,28 @@ keep the chrome up is the consumer's to decide with this. */
6161
6791
  label?: (HelixHeadlessLightbox["label"]) | undefined;
6162
6792
  /** Whether moving past the last item returns to the first. */
6163
6793
  loop?: (HelixHeadlessLightbox["loop"]) | undefined;
6794
+ /** The next control's accessible name. */
6795
+ "next-label"?: (HelixHeadlessLightbox["nextLabel"]) | undefined;
6796
+ /** The next control's accessible name. */
6797
+ nextLabel?: (HelixHeadlessLightbox["nextLabel"]) | undefined;
6798
+ /** The previous control's accessible name. */
6799
+ "previous-label"?: (HelixHeadlessLightbox["previousLabel"]) | undefined;
6800
+ /** The previous control's accessible name. */
6801
+ previousLabel?: (HelixHeadlessLightbox["previousLabel"]) | undefined;
6802
+ /** The name of an item with no `label` of its own, with `{index}` and
6803
+ `{count}` filled in. */
6804
+ "slide-label"?: (HelixHeadlessLightbox["slideLabel"]) | undefined;
6805
+ /** The name of an item with no `label` of its own, with `{index}` and
6806
+ `{count}` filled in. */
6807
+ slideLabel?: (HelixHeadlessLightbox["slideLabel"]) | undefined;
6808
+ /** The word screen readers announce in place of an item's role, set as
6809
+ `aria-roledescription`. Translate it with the rest of your text, or empty
6810
+ it to leave the role as `group`. */
6811
+ "slide-role-label"?: (HelixHeadlessLightbox["slideRoleLabel"]) | undefined;
6812
+ /** The word screen readers announce in place of an item's role, set as
6813
+ `aria-roledescription`. Translate it with the rest of your text, or empty
6814
+ it to leave the role as `group`. */
6815
+ slideRoleLabel?: (HelixHeadlessLightbox["slideRoleLabel"]) | undefined;
6164
6816
  /** The status text that says which item is shown, with `{index}`, `{count}`
6165
6817
  and the item's `{label}` filled in.
6166
6818
 
@@ -6456,6 +7108,22 @@ filtering already does: `filter`, the empty state and the keyboard are all
6456
7108
  this component's. A select, a combobox and a command palette drawing their
6457
7109
  own search boxes would be three copies of one field. */
6458
7110
  filterable?: (HelixHeadlessListbox["filterable"]) | undefined;
7111
+ /** How long typing in the filter field rests before the list is filtered, in
7112
+ milliseconds. `0` filters on every keystroke.
7113
+
7114
+ For a list filtered on a server, where `helix-filter` starts a request: a
7115
+ reader typing a word sends one request for the word, not one for each
7116
+ letter. Enter and the arrow keys filter at once on what is typed, so they
7117
+ act on the list the reader expects. */
7118
+ "filter-delay"?: (HelixHeadlessListbox["filterDelay"] | `${number}`) | undefined;
7119
+ /** How long typing in the filter field rests before the list is filtered, in
7120
+ milliseconds. `0` filters on every keystroke.
7121
+
7122
+ For a list filtered on a server, where `helix-filter` starts a request: a
7123
+ reader typing a word sends one request for the word, not one for each
7124
+ letter. Enter and the arrow keys filter at once on what is typed, so they
7125
+ act on the list the reader expects. */
7126
+ filterDelay?: (HelixHeadlessListbox["filterDelay"]) | undefined;
6459
7127
  /** Placeholder text for the filter field. */
6460
7128
  "filter-label"?: (HelixHeadlessListbox["filterLabel"]) | undefined;
6461
7129
  /** Placeholder text for the filter field. */
@@ -6469,6 +7137,26 @@ a reader can move through the options before closing the panel on one. */
6469
7137
  manual?: (HelixHeadlessListbox["manual"]) | undefined;
6470
7138
  /** Whether more than one option can be chosen. */
6471
7139
  multiple?: (HelixHeadlessListbox["multiple"]) | undefined;
7140
+ /** What a screen reader hears when a filter leaves one option. `{count}` is
7141
+ the count. */
7142
+ "result-label"?: (HelixHeadlessListbox["resultLabel"]) | undefined;
7143
+ /** What a screen reader hears when a filter leaves one option. `{count}` is
7144
+ the count. */
7145
+ resultLabel?: (HelixHeadlessListbox["resultLabel"]) | undefined;
7146
+ /** What a screen reader hears when a filter leaves any other number of
7147
+ options. `{count}` is the count.
7148
+
7149
+ **Two sentences, chosen by `Intl.PluralRules`**, which is Data Table's
7150
+ pair: a language with more forms than two picks the one for its `one` and
7151
+ writes the rest here. */
7152
+ "results-label"?: (HelixHeadlessListbox["resultsLabel"]) | undefined;
7153
+ /** What a screen reader hears when a filter leaves any other number of
7154
+ options. `{count}` is the count.
7155
+
7156
+ **Two sentences, chosen by `Intl.PluralRules`**, which is Data Table's
7157
+ pair: a language with more forms than two picks the one for its `one` and
7158
+ writes the rest here. */
7159
+ resultsLabel?: (HelixHeadlessListbox["resultsLabel"]) | undefined;
6472
7160
  /** Whether the rows are still loading.
6473
7161
 
6474
7162
  Reflected, because a stylesheet needs it: the rows that are already there
@@ -6571,6 +7259,18 @@ export type HelixHeadlessListboxVueEvents = {
6571
7259
  };
6572
7260
 
6573
7261
  export type HelixHeadlessLoaderVueProps = {
7262
+ /** How long the loader waits before it shows, in milliseconds, so work that
7263
+ finishes quickly never flashes one.
7264
+
7265
+ Absent shows it at once. Hidden in the served markup too, so a page that
7266
+ loads quickly never draws it. */
7267
+ delay?: (HelixHeadlessLoader["delay"]) | undefined;
7268
+ /** The id of the region being loaded, which is marked `aria-busy` while the
7269
+ loader is on the page.
7270
+
7271
+ Names an element in the same tree. In React it arrives as a property, the
7272
+ way `Tooltip.for` does. */
7273
+ for?: (HelixHeadlessLoader["for"]) | undefined;
6574
7274
  /** The loader's name, announced by screen readers while the work is in
6575
7275
  progress. */
6576
7276
  label?: (HelixHeadlessLoader["label"]) | undefined;
@@ -7643,7 +8343,10 @@ no reader. */
7643
8343
 
7644
8344
  Absent leaves the range unbanded. */
7645
8345
  high?: (HelixHeadlessMeter["high"]) | undefined;
7646
- /** Accessible name for the reading. */
8346
+ /** Accessible name for the reading.
8347
+
8348
+ A visible label in the `label` slot names it instead, with the words it
8349
+ shows, so the name and the label cannot disagree. */
7647
8350
  label?: (HelixHeadlessMeter["label"]) | undefined;
7648
8351
  /** The locale the percentage is written in, such as `fr` for `72 %`.
7649
8352
 
@@ -7889,6 +8592,12 @@ export type HelixHeadlessNotificationsVueProps = {
7889
8592
  "mark-all-label"?: (HelixHeadlessNotifications["markAllLabel"]) | undefined;
7890
8593
  /** Label for the mark-all control. */
7891
8594
  markAllLabel?: (HelixHeadlessNotifications["markAllLabel"]) | undefined;
8595
+ /** How many notifications there are in all, where the feed holds only some of
8596
+ them, read as each row's `aria-setsize`. `-1` says the count is unknown.
8597
+
8598
+ Unset, the browser counts the rows it can see, which is right for a feed
8599
+ that holds everything. */
8600
+ total?: (HelixHeadlessNotifications["total"]) | undefined;
7892
8601
  /** The text shown and announced when there are no rows and none are loading. */
7893
8602
  "empty-text"?: (HelixHeadlessNotifications["emptyText"]) | undefined;
7894
8603
  /** The text shown and announced when there are no rows and none are loading. */
@@ -7949,6 +8658,22 @@ reach the bubble. Absent is the control's own sentence, in English. */
7949
8658
  "decrement-label"?: (HelixHeadlessNumberInput["decrementLabel"]) | undefined;
7950
8659
  /** The name of the step down button, read by screen readers. */
7951
8660
  decrementLabel?: (HelixHeadlessNumberInput["decrementLabel"]) | undefined;
8661
+ /** `Intl.NumberFormat` options the number is shown with while the field is
8662
+ not being edited: a currency, a percent, a unit, or a number of decimals.
8663
+ Written as JSON in the attribute.
8664
+
8665
+ ```html
8666
+ <helix-number-input format-options='{"style":"currency","currency":"EUR"}'></helix-number-input>
8667
+ ``` */
8668
+ "format-options"?: (HelixHeadlessNumberInput["formatOptions"]) | undefined;
8669
+ /** `Intl.NumberFormat` options the number is shown with while the field is
8670
+ not being edited: a currency, a percent, a unit, or a number of decimals.
8671
+ Written as JSON in the attribute.
8672
+
8673
+ ```html
8674
+ <helix-number-input format-options='{"style":"currency","currency":"EUR"}'></helix-number-input>
8675
+ ``` */
8676
+ formatOptions?: (HelixHeadlessNumberInput["formatOptions"]) | undefined;
7952
8677
  /** The name of the step up button, read by screen readers. */
7953
8678
  "increment-label"?: (HelixHeadlessNumberInput["incrementLabel"]) | undefined;
7954
8679
  /** The name of the step up button, read by screen readers. */
@@ -8000,6 +8725,12 @@ filled in. */
8000
8725
  readonly?: (HelixHeadlessNumberInput["readOnly"]) | undefined;
8001
8726
  /** Prevents editing. The value is still submitted with the form. */
8002
8727
  readOnly?: (HelixHeadlessNumberInput["readOnly"]) | undefined;
8728
+ /** What the field is described as on iOS and iPadOS, where it carries no
8729
+ spinbutton role. See the class description. */
8730
+ "role-description"?: (HelixHeadlessNumberInput["roleDescription"]) | undefined;
8731
+ /** What the field is described as on iOS and iPadOS, where it carries no
8732
+ spinbutton role. See the class description. */
8733
+ roleDescription?: (HelixHeadlessNumberInput["roleDescription"]) | undefined;
8003
8734
  /** Makes the label a grip that changes the value when it is dragged.
8004
8735
 
8005
8736
  The label is what is dragged, so this adds no chrome at all. Still opt-in,
@@ -8032,6 +8763,10 @@ A unit slotted into `end` is drawn beside the number and is not part of
8032
8763
  what the spinbutton announces, so it goes here too. Empty announces the
8033
8764
  number alone. */
8034
8765
  valueText?: (HelixHeadlessNumberInput["valueText"]) | undefined;
8766
+ /** Whether the mouse wheel steps the number while the field has focus, as
8767
+ React Aria's NumberField does unless told not to. Off, the wheel scrolls
8768
+ the page, which is what a reader passing over a form expects. */
8769
+ wheel?: (HelixHeadlessNumberInput["wheel"]) | undefined;
8035
8770
  /** The value the control starts with. A form reset returns it to this value. */
8036
8771
  "default-value"?: (HelixHeadlessNumberInput["defaultValue"]) | undefined;
8037
8772
  /** The value the control starts with. A form reset returns it to this value. */
@@ -8310,6 +9045,24 @@ string is not a fact a selector needs. */
8310
9045
  description?: (HelixHeadlessOption["description"]) | undefined;
8311
9046
  /** Prevents the option from being chosen. */
8312
9047
  disabled?: (HelixHeadlessOption["disabled"]) | undefined;
9048
+ /** Whether following the link downloads what it names. Only meaningful
9049
+ beside an `href`. */
9050
+ download?: (HelixHeadlessOption["download"]) | undefined;
9051
+ /** The URL the option links to. Setting it makes the option a link: choosing
9052
+ it, with a press, Enter or a click, follows the link and selects nothing,
9053
+ as React Aria's items with `href` do. Command, Control and Shift open it
9054
+ where they open a link, in a new tab or a new window.
9055
+
9056
+ `helix-select` is said first with the `href` in it, and canceling it keeps
9057
+ the browser from following, so a client-side router follows it instead.
9058
+
9059
+ **The option stays an option**, and an anchor is never drawn inside it:
9060
+ `role="option"` sits on the host, where a listbox's
9061
+ `aria-activedescendant` can name it, and an `<a>` inside would be exposed
9062
+ as a link within the option and take its name (Menu Item's `href` records
9063
+ the measurement). The link is followed through an anchor made for the
9064
+ moment, which `followLink` describes. */
9065
+ href?: (HelixHeadlessOption["href"]) | undefined;
8313
9066
  /** A shorter name for this choice, for where the row does not fit.
8314
9067
 
8315
9068
  `<option label>`'s own meaning: the text a chooser shows when it has less
@@ -8321,10 +9074,30 @@ simply the accessible name.
8321
9074
  `<option label>` does: written the platform's way, a select listed a row of
8322
9075
  nothing for every choice. */
8323
9076
  label?: (HelixHeadlessOption["label"]) | undefined;
9077
+ /** The link's `rel`. Set it whenever you set `target="_blank"`. */
9078
+ rel?: (HelixHeadlessOption["rel"]) | undefined;
8324
9079
  /** Whether this choice is currently chosen.
8325
9080
 
8326
9081
  Written by the listbox. */
8327
9082
  selected?: (HelixHeadlessOption["selected"]) | undefined;
9083
+ /** Where the link opens, such as `_blank`, for an option with an `href`. */
9084
+ target?: (HelixHeadlessOption["target"]) | undefined;
9085
+ /** The words a reader types to reach this choice, where the row's own words
9086
+ are not them: typeahead, a filter and a combobox match against it, and a
9087
+ select's trigger shows it.
9088
+
9089
+ For a row whose content is a picture, an avatar beside a name and a role,
9090
+ or a name written in another script, as React Aria's `textValue`. Empty
9091
+ reads the row's words, then `label`. */
9092
+ "text-value"?: (HelixHeadlessOption["textValue"]) | undefined;
9093
+ /** The words a reader types to reach this choice, where the row's own words
9094
+ are not them: typeahead, a filter and a combobox match against it, and a
9095
+ select's trigger shows it.
9096
+
9097
+ For a row whose content is a picture, an avatar beside a name and a role,
9098
+ or a name written in another script, as React Aria's `textValue`. Empty
9099
+ reads the row's words, then `label`. */
9100
+ textValue?: (HelixHeadlessOption["textValue"]) | undefined;
8328
9101
  /** The value that identifies the option, and that a form submits. */
8329
9102
  value?: (HelixHeadlessOption["value"]) | undefined;
8330
9103
  /** Whether the markup declares this option selected. A form reset returns to it.
@@ -8356,7 +9129,7 @@ change of its own rather than a property being added. */
8356
9129
  };
8357
9130
 
8358
9131
  export type HelixHeadlessOptionVueEvents = {
8359
- /** The option was chosen. Cancelable: canceling it leaves the selection as it was. */
9132
+ /** The option was chosen. Cancelable: canceling it leaves the selection as it was, and keeps the browser from following an option's `href`. */
8360
9133
  "helix-select": HelixHeadlessOptionHelixSelectElementEvent;
8361
9134
  };
8362
9135
 
@@ -8663,10 +9436,18 @@ that lets a phone offer the code out of a message. Later cells stay `off`
8663
9436
  for the reason in the class comment above, that six cells each offering
8664
9437
  the same code is one offer made six times. */
8665
9438
  autocomplete?: (HelixHeadlessPinInput["autocomplete"]) | undefined;
9439
+ /** Whether the form is submitted once the last box is filled, as Web
9440
+ Awesome's `autosubmit` and Radix's `autoSubmit`. Only for a code the field
9441
+ took: a refused last character submits nothing. */
9442
+ autosubmit?: (HelixHeadlessPinInput["autosubmit"]) | undefined;
8666
9443
  /** Accessible name for one box, with `{index}` and `{length}` filled in. */
8667
9444
  "cell-label"?: (HelixHeadlessPinInput["cellLabel"]) | undefined;
8668
9445
  /** Accessible name for one box, with `{index}` and `{length}` filled in. */
8669
9446
  cellLabel?: (HelixHeadlessPinInput["cellLabel"]) | undefined;
9447
+ /** Separators drawn between the boxes: `#` or `*` for a box and anything
9448
+ else as it is written, so `###-###` draws a dash after the third. The
9449
+ separators are hidden from screen readers and are not part of the value. */
9450
+ format?: (HelixHeadlessPinInput["format"]) | undefined;
8670
9451
  /** How many characters the code has. */
8671
9452
  length?: (HelixHeadlessPinInput["length"]) | undefined;
8672
9453
  /** Whether the characters are hidden, the way a password is. */
@@ -8808,8 +9589,17 @@ export type HelixHeadlessPopoverToggleElementEvent =
8808
9589
  HelixHeadlessPopoverElementEvent<ToggleEvent>;
8809
9590
 
8810
9591
  export type HelixHeadlessPopoverVueProps = {
8811
- /** The panel's name, read by screen readers. */
9592
+ /** Draws a point on the panel's edge facing the trigger.
9593
+
9594
+ Off by default, which is the house style: a panel that opens from its
9595
+ trigger already reads as belonging to it. */
9596
+ arrow?: (HelixHeadlessPopover["arrow"]) | undefined;
9597
+ /** The panel's name, read by screen readers. Left at `Popover`, the first
9598
+ heading in the panel names it instead. */
8812
9599
  label?: (HelixHeadlessPopover["label"]) | undefined;
9600
+ /** Keeps `Tab` inside the panel while it is open, and marks the panel
9601
+ `aria-modal`. A press outside and Escape still close it. */
9602
+ modal?: (HelixHeadlessPopover["modal"]) | undefined;
8813
9603
  /** Space between the trigger and the panel, in pixels. */
8814
9604
  offset?: (HelixHeadlessPopover["offset"]) | undefined;
8815
9605
  /** Preferred side.
@@ -8858,7 +9648,10 @@ Not `Loader`, which is the other thing this could be. A loader says the
8858
9648
  page is busy; a bar says a named piece of work is running, and keeps its
8859
9649
  place in the layout when the answer arrives and it becomes determinate. */
8860
9650
  indeterminate?: (HelixHeadlessProgress["indeterminate"]) | undefined;
8861
- /** Accessible name for what is in progress. */
9651
+ /** Accessible name for what is in progress.
9652
+
9653
+ A visible label in the `label` slot names it instead, with the words it
9654
+ shows, so the name and the label cannot disagree. */
8862
9655
  label?: (HelixHeadlessProgress["label"]) | undefined;
8863
9656
  /** The locale the percentage is written in, such as `fr` for `72 %`.
8864
9657
 
@@ -9003,6 +9796,22 @@ not touch, and React reads that as a hydration mismatch. The absent
9003
9796
  attribute *is* the column, which the stylesheet reads as the base rule, so
9004
9797
  only `horizontal` has to be named. */
9005
9798
  orientation?: (HelixHeadlessRadioGroup["orientation"]) | undefined;
9799
+ /** Whether a reader can see and focus the answer and cannot change it. A
9800
+ read-only group still submits its value.
9801
+
9802
+ React Aria's `isReadOnly`. A press on a radio is refused, and the arrow
9803
+ keys, Home and End leave focus on the answer, so Tab still reaches it and
9804
+ a reader hears it with the group's name. The group says `aria-readonly`.
9805
+ A script can still set `value`. */
9806
+ readonly?: (HelixHeadlessRadioGroup["readOnly"]) | undefined;
9807
+ /** Whether a reader can see and focus the answer and cannot change it. A
9808
+ read-only group still submits its value.
9809
+
9810
+ React Aria's `isReadOnly`. A press on a radio is refused, and the arrow
9811
+ keys, Home and End leave focus on the answer, so Tab still reaches it and
9812
+ a reader hears it with the group's name. The group says `aria-readonly`.
9813
+ A script can still set `value`. */
9814
+ readOnly?: (HelixHeadlessRadioGroup["readOnly"]) | undefined;
9006
9815
  /** The value the control starts with. A form reset returns it to this value. */
9007
9816
  "default-value"?: (HelixHeadlessRadioGroup["defaultValue"]) | undefined;
9008
9817
  /** The value the control starts with. A form reset returns it to this value. */
@@ -9175,6 +9984,10 @@ export type HelixHeadlessRatingHelixBeforeChangeElementEvent =
9175
9984
  HelixHeadlessRatingElementEvent<HelixBeforeChangeEvent>;
9176
9985
 
9177
9986
  export type HelixHeadlessRatingVueProps = {
9987
+ /** Whether a reader can take the rating back to unrated: by pressing the
9988
+ chosen score again, or with Backspace or Delete. Zag's rating group
9989
+ clears the same way. */
9990
+ clearable?: (HelixHeadlessRating["clearable"]) | undefined;
9178
9991
  /** How many marks there are. */
9179
9992
  max?: (HelixHeadlessRating["max"]) | undefined;
9180
9993
  /** The lowest score that can be given. A cleared rating shows this score.
@@ -9361,6 +10174,8 @@ export type HelixHeadlessRatingVueEvents = {
9361
10174
  change: HelixHeadlessRatingElementEvent;
9362
10175
  /** The score is about to change. Cancelable: cancel it to keep the current score. */
9363
10176
  "helix-before-change": HelixHeadlessRatingHelixBeforeChangeElementEvent;
10177
+ /** The rating went back to unrated, under `clearable`. Sent after `input` and `change`. */
10178
+ "helix-clear": HelixHeadlessRatingElementEvent;
9364
10179
  /** The score changed. */
9365
10180
  input: HelixHeadlessRatingElementEvent;
9366
10181
  };
@@ -9543,6 +10358,15 @@ imperatively later, and nothing is hydrating by then.
9543
10358
 
9544
10359
  Here rather than on each control. */
9545
10360
  name?: (HelixHeadlessSelect["name"]) | undefined;
10361
+ /** What the trigger shows for the chosen options: a function given them, in
10362
+ the order they appear, that returns text, an element or a Lit template.
10363
+
10364
+ For a trigger that shows more than the words, an avatar beside a name or a
10365
+ count of a long set, as React Aria's `SelectValue` takes children. The
10366
+ trigger is named by what this draws, so keep the words in it. Nothing
10367
+ chosen still shows `placeholder`. A property only, there being no way to
10368
+ write a function in markup. */
10369
+ valueContent?: (HelixHeadlessSelect["valueContent"]) | undefined;
9546
10370
  /** Which option is chosen, as an index, or `-1` where none is.
9547
10371
 
9548
10372
  Read off the listbox this renders, which owns the options and is where the
@@ -9575,6 +10399,12 @@ profile".
9575
10399
 
9576
10400
  Absent hides the placeholder from screen readers. */
9577
10401
  label?: (HelixHeadlessSkeleton["label"]) | undefined;
10402
+ /** Whether the content inside is still loading, which keeps it inert and
10403
+ draws the placeholder over it.
10404
+
10405
+ Absent shows the content. An empty skeleton is a placeholder whatever
10406
+ this says. Reflected, because the styled tier hides the content on it. */
10407
+ loading?: (HelixHeadlessSkeleton["loading"]) | undefined;
9578
10408
  };
9579
10409
 
9580
10410
  export type HelixHeadlessSkeletonVueEvents = {};
@@ -9606,6 +10436,25 @@ export type HelixHeadlessSliderHelixBeforeChangeElementEvent =
9606
10436
  HelixHeadlessSliderElementEvent<HelixBeforeChangeEvent>;
9607
10437
 
9608
10438
  export type HelixHeadlessSliderVueProps = {
10439
+ /** `Intl.NumberFormat` options the value is written with: a currency, a
10440
+ percent, a unit, or a number of decimals. Written as JSON in the
10441
+ attribute.
10442
+
10443
+ ```html
10444
+ <helix-slider format-options='{"style":"currency","currency":"USD"}'></helix-slider>
10445
+ ``` */
10446
+ "format-options"?: (HelixHeadlessSlider["formatOptions"]) | undefined;
10447
+ /** `Intl.NumberFormat` options the value is written with: a currency, a
10448
+ percent, a unit, or a number of decimals. Written as JSON in the
10449
+ attribute.
10450
+
10451
+ ```html
10452
+ <helix-slider format-options='{"style":"currency","currency":"USD"}'></helix-slider>
10453
+ ``` */
10454
+ formatOptions?: (HelixHeadlessSlider["formatOptions"]) | undefined;
10455
+ /** The locale `format-options` writes the value in, such as `de-DE`. Empty is
10456
+ the reader's own. */
10457
+ locale?: (HelixHeadlessSlider["locale"]) | undefined;
9609
10458
  /** Shows the value at each mark. */
9610
10459
  "marker-labels"?: (HelixHeadlessSlider["markerLabels"]) | undefined;
9611
10460
  /** Shows the value at each mark. */
@@ -9648,6 +10497,12 @@ property, like every other word a control speaks. */
9648
10497
  "minimum-label"?: (HelixHeadlessSlider["minimumLabel"]) | undefined;
9649
10498
  /** The name of a range's lower thumb, read after the slider's label. */
9650
10499
  minimumLabel?: (HelixHeadlessSlider["minimumLabel"]) | undefined;
10500
+ /** How many steps a range's two thumbs stay apart, as Zag's
10501
+ `minStepsBetweenThumbs`. A thumb pushed closer stops there. */
10502
+ "min-steps-between-thumbs"?: (HelixHeadlessSlider["minStepsBetweenThumbs"] | `${number}`) | undefined;
10503
+ /** How many steps a range's two thumbs stay apart, as Zag's
10504
+ `minStepsBetweenThumbs`. A thumb pushed closer stops there. */
10505
+ minStepsBetweenThumbs?: (HelixHeadlessSlider["minStepsBetweenThumbs"]) | undefined;
9651
10506
  /** The direction the track runs. `vertical` stands it on end.
9652
10507
 
9653
10508
  For a level rather than a quantity: a fader, a channel, anything a reader
@@ -9744,6 +10599,10 @@ imperatively later, and nothing is hydrating by then.
9744
10599
 
9745
10600
  Here rather than on each control. */
9746
10601
  name?: (HelixHeadlessSlider["name"]) | undefined;
10602
+ /** Writes a value as text, in place of `format-options`: words for a scale,
10603
+ or anything `Intl.NumberFormat` cannot say. A property, since a function
10604
+ cannot be written in an attribute. */
10605
+ formatter?: (HelixHeadlessSlider["formatter"]) | undefined;
9747
10606
  };
9748
10607
 
9749
10608
  export type HelixHeadlessSliderVueEvents = {
@@ -10221,6 +11080,28 @@ stylesheets. */
10221
11080
  "default-checked"?: (HelixHeadlessSwitch["defaultChecked"]) | undefined;
10222
11081
  /** Whether the control starts checked. A form reset returns it to this state. */
10223
11082
  defaultChecked?: (HelixHeadlessSwitch["defaultChecked"]) | undefined;
11083
+ /** Whether a reader can see and focus the control and cannot change it. A
11084
+ read-only control still submits its value.
11085
+
11086
+ React Aria's `isReadOnly`. A native checkbox has no read-only state, so
11087
+ the press is refused at the inner control, which keeps its box as it
11088
+ was, and the control says `aria-readonly`. A script can still set
11089
+ `checked`, as it can set the value of a read-only text field.
11090
+
11091
+ The attribute is `readonly`, which is the platform's spelling for the
11092
+ text fields. */
11093
+ readonly?: (HelixHeadlessSwitch["readOnly"]) | undefined;
11094
+ /** Whether a reader can see and focus the control and cannot change it. A
11095
+ read-only control still submits its value.
11096
+
11097
+ React Aria's `isReadOnly`. A native checkbox has no read-only state, so
11098
+ the press is refused at the inner control, which keeps its box as it
11099
+ was, and the control says `aria-readonly`. A script can still set
11100
+ `checked`, as it can set the value of a read-only text field.
11101
+
11102
+ The attribute is `readonly`, which is the platform's spelling for the
11103
+ text fields. */
11104
+ readOnly?: (HelixHeadlessSwitch["readOnly"]) | undefined;
10224
11105
  /** */
10225
11106
  "aria-label"?: unknown;
10226
11107
  /** The validation message shown under the control. It replaces the
@@ -10701,6 +11582,47 @@ export type HelixHeadlessTabVueEvents = {
10701
11582
  "helix-select": HelixHeadlessTabHelixSelectElementEvent;
10702
11583
  };
10703
11584
 
11585
+ /** `HelixHeadlessTagGroup` component event */
11586
+ export type HelixHeadlessTagGroupElementEvent<E = Event> = TypedEvent<
11587
+ HelixHeadlessTagGroup,
11588
+ E
11589
+ >;
11590
+ /** `helix-before-change` event type */
11591
+ export type HelixHeadlessTagGroupHelixBeforeChangeElementEvent =
11592
+ HelixHeadlessTagGroupElementEvent<HelixBeforeChangeEvent>;
11593
+ /** `helix-dismiss` event type */
11594
+ export type HelixHeadlessTagGroupHelixDismissElementEvent =
11595
+ HelixHeadlessTagGroupElementEvent<HelixDismissEvent>;
11596
+
11597
+ export type HelixHeadlessTagGroupVueProps = {
11598
+ /** The name of the set, such as "Filters", which a screen reader announces
11599
+ before its tags. */
11600
+ label?: (HelixHeadlessTagGroup["label"]) | undefined;
11601
+ /** How many tags a reader can select: `single`, `multiple`, or none.
11602
+
11603
+ Absent selects nothing, and the tags carry no selected state at all. */
11604
+ "selection-mode"?: (HelixHeadlessTagGroup["selectionMode"]) | undefined;
11605
+ /** How many tags a reader can select: `single`, `multiple`, or none.
11606
+
11607
+ Absent selects nothing, and the tags carry no selected state at all. */
11608
+ selectionMode?: (HelixHeadlessTagGroup["selectionMode"]) | undefined;
11609
+ /** The selected tags' values, separated by commas, since a value may hold a
11610
+ space.
11611
+
11612
+ Set it to start with tags selected. A tag's value is its `value`, or its
11613
+ words where it has none. */
11614
+ value?: (HelixHeadlessTagGroup["value"]) | undefined;
11615
+ };
11616
+
11617
+ export type HelixHeadlessTagGroupVueEvents = {
11618
+ /** Fired once a press has changed which tags are selected. */
11619
+ change: HelixHeadlessTagGroupElementEvent;
11620
+ /** Fired before a press changes which tags are selected, with the `value` it would leave. Cancelable. */
11621
+ "helix-before-change": HelixHeadlessTagGroupHelixBeforeChangeElementEvent;
11622
+ /** A tag's remove button was pressed, or Delete or Backspace on the focused tag. Bubbles from that tag, which is its `target`; remove the tag in response. Cancelable. */
11623
+ "helix-dismiss": HelixHeadlessTagGroupHelixDismissElementEvent;
11624
+ };
11625
+
10704
11626
  /** `HelixHeadlessTag` component event */
10705
11627
  export type HelixHeadlessTagElementEvent<E = Event> = TypedEvent<
10706
11628
  HelixHeadlessTag,
@@ -10711,6 +11633,16 @@ export type HelixHeadlessTagHelixDismissElementEvent =
10711
11633
  HelixHeadlessTagElementEvent<HelixDismissEvent>;
10712
11634
 
10713
11635
  export type HelixHeadlessTagVueProps = {
11636
+ /** Takes the tag out of reach: its link and its remove button stop
11637
+ answering, and in a `Tag.Group` the arrow keys pass over it and it cannot
11638
+ be selected or removed. */
11639
+ disabled?: (HelixHeadlessTag["disabled"]) | undefined;
11640
+ /** Makes the label a link to this address. */
11641
+ href?: (HelixHeadlessTag["href"]) | undefined;
11642
+ /** What the tag stands for in its group's `value`.
11643
+
11644
+ Absent is the tag's own words, its category first. */
11645
+ value?: (HelixHeadlessTag["value"]) | undefined;
10714
11646
  /** Whether the element shows a control that dismisses it. */
10715
11647
  dismissible?: (HelixHeadlessTag["dismissible"]) | undefined;
10716
11648
  /** The dismiss control's label, read by screen readers.
@@ -10727,6 +11659,18 @@ derive one rather than dash-casing it, so this would otherwise be
10727
11659
  reachable only as `dismisslabel`, which nobody would guess and no linter
10728
11660
  would catch. */
10729
11661
  dismissLabel?: (HelixHeadlessTag["dismissLabel"]) | undefined;
11662
+ /** Whether the tag holds its group's tab stop.
11663
+
11664
+ Written by `Tag.Group` on every tag it holds, and unset outside one, which
11665
+ is how a tag knows it is a row. No attribute: it is coordination between
11666
+ elements, the same shape `Toggle.focusable` has. */
11667
+ focusable?: (HelixHeadlessTag["focusable"]) | undefined;
11668
+ /** Whether the tag is selected, in a `Tag.Group` that selects.
11669
+
11670
+ Written by the group from its own `value`, and unset where nothing can be
11671
+ selected, which is what keeps `aria-selected` off a set that does not
11672
+ select. */
11673
+ selected?: (HelixHeadlessTag["selected"]) | undefined;
10730
11674
  };
10731
11675
 
10732
11676
  export type HelixHeadlessTagVueEvents = {
@@ -10785,6 +11729,12 @@ element sends two entries, and that is what this does. */
10785
11729
  maxlength?: (HelixHeadlessTextarea["maxLength"] | `${number}`) | undefined;
10786
11730
  /** The most characters the value can have. */
10787
11731
  maxLength?: (HelixHeadlessTextarea["maxLength"]) | undefined;
11732
+ /** How many lines an `auto-grow` field grows to before it scrolls. Absent,
11733
+ it grows with all of its text. */
11734
+ "max-rows"?: (HelixHeadlessTextarea["maxRows"] | `${number}`) | undefined;
11735
+ /** How many lines an `auto-grow` field grows to before it scrolls. Absent,
11736
+ it grows with all of its text. */
11737
+ maxRows?: (HelixHeadlessTextarea["maxRows"]) | undefined;
10788
11738
  /** The fewest characters the value can have.
10789
11739
 
10790
11740
  Forwarded to the real `<textarea>` rather than checked here, which is what
@@ -10940,6 +11890,16 @@ a typed time, which is then invalid. */
10940
11890
  Handed to the list, which offers them as unavailable, and checked against
10941
11891
  a typed time, which is then invalid. */
10942
11892
  disableTimes?: (HelixHeadlessTimeInput["disableTimes"]) | undefined;
11893
+ /** The clock the times are written on: `h12` for twelve hours with a
11894
+ meridiem, `h23` for twenty-four. Absent is the locale's own.
11895
+
11896
+ Handed to the list. The value is `HH:mm` on twenty-four hours either way. */
11897
+ "hour-cycle"?: (HelixHeadlessTimeInput["hourCycle"]) | undefined;
11898
+ /** The clock the times are written on: `h12` for twelve hours with a
11899
+ meridiem, `h23` for twenty-four. Absent is the locale's own.
11900
+
11901
+ Handed to the list. The value is `HH:mm` on twenty-four hours either way. */
11902
+ hourCycle?: (HelixHeadlessTimeInput["hourCycle"]) | undefined;
10943
11903
  /** Language tag the times are written in.
10944
11904
 
10945
11905
  Absent uses the runtime's own. */
@@ -10991,7 +11951,12 @@ removes rather than as "Remove" said once per time. */
10991
11951
  **The name goes in**, so a row of them is heard as which one each
10992
11952
  removes rather than as "Remove" said once per time. */
10993
11953
  removeLabel?: (HelixHeadlessTimeInput["removeLabel"]) | undefined;
10994
- /** How far apart the offered times are, in minutes. */
11954
+ /** Whether times carry their seconds: the value is `HH:mm:ss`, a typed time
11955
+ may give them, the field writes them, and the list's `step` counts seconds.
11956
+ See Time Picker's `seconds`. */
11957
+ seconds?: (HelixHeadlessTimeInput["seconds"]) | undefined;
11958
+ /** How far apart the offered times are, in minutes, or in seconds with
11959
+ `seconds`. */
10995
11960
  step?: (HelixHeadlessTimeInput["step"]) | undefined;
10996
11961
  /** Whether the field shows the time in the local style or as the value
10997
11962
  itself.
@@ -11032,6 +11997,20 @@ not touch, and React reads that as a hydration mismatch. The absent
11032
11997
  attribute *is* the list, which the stylesheet reads as the base rule, so
11033
11998
  only the departure has to be named. */
11034
11999
  variant?: (HelixHeadlessTimeInput["variant"]) | undefined;
12000
+ /** What a screen reader hears for a segment with nothing in it, which a
12001
+ sighted reader sees as dashes. */
12002
+ "empty-segment-label"?: (HelixHeadlessTimeInput["emptySegmentLabel"]) | undefined;
12003
+ /** What a screen reader hears for a segment with nothing in it, which a
12004
+ sighted reader sees as dashes. */
12005
+ emptySegmentLabel?: (HelixHeadlessTimeInput["emptySegmentLabel"]) | undefined;
12006
+ /** Whether the field is a row of segments, one for each part of the date or
12007
+ time, in place of a line of text.
12008
+
12009
+ Each segment is set with digits or the arrow keys, in the order the
12010
+ locale writes them, so a reader types a date the way they write one and
12011
+ no format has to be read back. The picker still opens from the trigger
12012
+ and with Alt+Down. */
12013
+ segmented?: (HelixHeadlessTimeInput["segmented"]) | undefined;
11035
12014
  /** Whether the value is locked. A read-only control still submits its value.
11036
12015
 
11037
12016
  **Enforced by refusing every request in one place**, which is the seam this
@@ -11244,6 +12223,20 @@ A time not on the step is simply never offered, so it is not an error to
11244
12223
  name one, and naming every time in the list is how the empty state is
11245
12224
  reached honestly rather than by handing over an empty range. */
11246
12225
  disableTimes?: (HelixHeadlessTimePicker["disableTimes"]) | undefined;
12226
+ /** The clock the times are written on: `h12` for twelve hours with a
12227
+ meridiem, `h23` for twenty-four.
12228
+
12229
+ Absent is the locale's own, which is right for a reader's own form. Set it
12230
+ where every reader must see the same clock whatever their language, as a
12231
+ timetable does. The value is `HH:mm` on twenty-four hours either way. */
12232
+ "hour-cycle"?: (HelixHeadlessTimePicker["hourCycle"]) | undefined;
12233
+ /** The clock the times are written on: `h12` for twelve hours with a
12234
+ meridiem, `h23` for twenty-four.
12235
+
12236
+ Absent is the locale's own, which is right for a reader's own form. Set it
12237
+ where every reader must see the same clock whatever their language, as a
12238
+ timetable does. The value is `HH:mm` on twenty-four hours either way. */
12239
+ hourCycle?: (HelixHeadlessTimePicker["hourCycle"]) | undefined;
11247
12240
  /** What the wheel of hours is called, read by screen readers. */
11248
12241
  "hour-label"?: (HelixHeadlessTimePicker["hourLabel"]) | undefined;
11249
12242
  /** What the wheel of hours is called, read by screen readers. */
@@ -11340,7 +12333,20 @@ else set needs. */
11340
12333
  readOnly?: (HelixHeadlessTimePicker["readOnly"]) | undefined;
11341
12334
  /** Stops the form from submitting while no time is chosen. */
11342
12335
  required?: (HelixHeadlessTimePicker["required"]) | undefined;
11343
- /** How far apart the offered times are, in minutes.
12336
+ /** What the wheel of seconds is called, read by screen readers. */
12337
+ "second-label"?: (HelixHeadlessTimePicker["secondLabel"]) | undefined;
12338
+ /** What the wheel of seconds is called, read by screen readers. */
12339
+ secondLabel?: (HelixHeadlessTimePicker["secondLabel"]) | undefined;
12340
+ /** Whether times carry their seconds.
12341
+
12342
+ The value becomes `HH:mm:ss`, each time is written with its seconds, the
12343
+ wheels take a column of seconds, and `step` counts seconds, the unit
12344
+ `<input type="time">` counts in. A list at a step of one second is 86,400
12345
+ rows, so give `seconds` a `step` and bounds that keep it a list, or use
12346
+ the wheels. */
12347
+ seconds?: (HelixHeadlessTimePicker["seconds"]) | undefined;
12348
+ /** How far apart the offered times are, in minutes, or in seconds with
12349
+ `seconds`.
11344
12350
 
11345
12351
  Fifteen, which is four rows an hour and ninety-six in a day: enough that a
11346
12352
  reader scrolls rather than hunts, and few enough that the list is a list.
@@ -11528,7 +12534,11 @@ export type HelixHeadlessToastHelixDismissElementEvent =
11528
12534
  HelixHeadlessToastElementEvent<HelixDismissEvent>;
11529
12535
 
11530
12536
  export type HelixHeadlessToastVueProps = {
11531
- /** Accessible name for the region, such as "Notifications". */
12537
+ /** The key that takes focus to the stack and back, such as `F8` or `Alt+T`:
12538
+ keys joined by `+`, the last one the key. Empty turns it off. */
12539
+ hotkey?: (HelixHeadlessToast["hotkey"]) | undefined;
12540
+ /** Accessible name for the region, with `{hotkey}` filled in. Translate it with
12541
+ the rest of your interface. */
11532
12542
  label?: (HelixHeadlessToast["label"]) | undefined;
11533
12543
  /** Which corner or edge the stack sits at.
11534
12544
 
@@ -11605,6 +12615,21 @@ reader while looking correct to everybody else. Worse, setting both draws
11605
12615
  it twice. One property moves the label the consumer already has to give,
11606
12616
  and cannot be used to remove it. */
11607
12617
  labelPlacement?: (HelixHeadlessToggleGroup["labelPlacement"]) | undefined;
12618
+ /** The direction the items run. `vertical` puts them in a column, and the up
12619
+ and down arrows move between them.
12620
+
12621
+ Optional, so the attribute is absent until a consumer writes it. */
12622
+ orientation?: (HelixHeadlessToggleGroup["orientation"]) | undefined;
12623
+ /** Whether one item is chosen, as a radio group, or several can be pressed,
12624
+ as a toolbar of buttons with `aria-pressed`.
12625
+
12626
+ Optional, so the attribute is absent until a consumer writes it. */
12627
+ "selection-mode"?: (HelixHeadlessToggleGroup["selectionMode"]) | undefined;
12628
+ /** Whether one item is chosen, as a radio group, or several can be pressed,
12629
+ as a toolbar of buttons with `aria-pressed`.
12630
+
12631
+ Optional, so the attribute is absent until a consumer writes it. */
12632
+ selectionMode?: (HelixHeadlessToggleGroup["selectionMode"]) | undefined;
11608
12633
  /** The value the control starts with. A form reset returns it to this value. */
11609
12634
  "default-value"?: (HelixHeadlessToggleGroup["defaultValue"]) | undefined;
11610
12635
  /** The value the control starts with. A form reset returns it to this value. */
@@ -11682,6 +12707,10 @@ work as before once focus is in it.
11682
12707
  No attribute: it is coordination between elements, and a consumer has no
11683
12708
  reason to set it. */
11684
12709
  focusable?: (HelixHeadlessToggleGroup["focusable"]) | undefined;
12710
+ /** The pressed values as a list, under `selection-mode="multiple"`, in the
12711
+ order the items are written. Written, it presses exactly those items.
12712
+ Where one item is chosen, it is that one value, or none. */
12713
+ values?: (HelixHeadlessToggleGroup["values"]) | undefined;
11685
12714
  };
11686
12715
 
11687
12716
  export type HelixHeadlessToggleGroupVueEvents = {
@@ -11752,6 +12781,11 @@ group sits in holds the stop. No attribute: it is coordination between
11752
12781
  elements, and `tabindex` on a host the consumer rendered is the change a
11753
12782
  React consumer's hydration reports and does not patch up. */
11754
12783
  focusable?: (HelixHeadlessToggle["focusable"]) | undefined;
12784
+ /** Whether the item is pressed, in a group where several can be, and
12785
+ `undefined` in a group where one is chosen.
12786
+
12787
+ Written by the group, like `selected`, so no attribute. */
12788
+ pressed?: (HelixHeadlessToggle["pressed"]) | undefined;
11755
12789
  };
11756
12790
 
11757
12791
  export type HelixHeadlessToggleVueEvents = {
@@ -11854,6 +12888,22 @@ worked. */
11854
12888
 
11855
12889
  It moves if that side does not fit. */
11856
12890
  placement?: (HelixHeadlessTooltip["placement"]) | undefined;
12891
+ /** What shows the bubble. Unset, it is a pointer resting on the trigger and
12892
+ keyboard focus. `focus` is keyboard focus alone, for a hint a pointer does
12893
+ not need, such as a shortcut a mouse reader has no use for. */
12894
+ "show-on"?: (HelixHeadlessTooltip["showOn"]) | undefined;
12895
+ /** What shows the bubble. Unset, it is a pointer resting on the trigger and
12896
+ keyboard focus. `focus` is keyboard focus alone, for a hint a pointer does
12897
+ not need, such as a shortcut a mouse reader has no use for. */
12898
+ showOn?: (HelixHeadlessTooltip["showOn"]) | undefined;
12899
+ /** How long after a tooltip hides the next one still shows at once, with no
12900
+ `delay`, in milliseconds. The same skip delay Radix uses. Zero makes every
12901
+ tooltip wait. */
12902
+ "skip-delay"?: (HelixHeadlessTooltip["skipDelay"] | `${number}`) | undefined;
12903
+ /** How long after a tooltip hides the next one still shows at once, with no
12904
+ `delay`, in milliseconds. The same skip delay Radix uses. Zero makes every
12905
+ tooltip wait. */
12906
+ skipDelay?: (HelixHeadlessTooltip["skipDelay"]) | undefined;
11857
12907
  /** The id of a box to keep the bubble inside. Defaults to the viewport.
11858
12908
 
11859
12909
  Resolved the way `for` is, so an id in the same tree, which is what lets a
@@ -11951,6 +13001,14 @@ The shape is `Carousel`'s, which is the nearest thing in the library: a
11951
13001
  "next-label"?: (HelixHeadlessTour["nextLabel"]) | undefined;
11952
13002
  /** Label for the control that goes on. */
11953
13003
  nextLabel?: (HelixHeadlessTour["nextLabel"]) | undefined;
13004
+ /** Draws each stop's place in the run in its panel, as well as saying it. */
13005
+ progress?: (HelixHeadlessTour["progress"]) | undefined;
13006
+ /** Each stop's place in the run, with `{index}` and `{count}` filled in.
13007
+ Translate it with the rest of your text. */
13008
+ "progress-label"?: (HelixHeadlessTour["progressLabel"]) | undefined;
13009
+ /** Each stop's place in the run, with `{index}` and `{count}` filled in.
13010
+ Translate it with the rest of your text. */
13011
+ progressLabel?: (HelixHeadlessTour["progressLabel"]) | undefined;
11954
13012
  /** Label for the control that leaves the tour. */
11955
13013
  "skip-label"?: (HelixHeadlessTour["skipLabel"]) | undefined;
11956
13014
  /** Label for the control that leaves the tour. */
@@ -12025,6 +13083,9 @@ closed tour, a closed tour shows nothing, and nothing can disagree. */
12025
13083
  first?: (HelixHeadlessTourStop["first"]) | undefined;
12026
13084
  /** The id of the element the stop points at. */
12027
13085
  for?: (HelixHeadlessTourStop["for"]) | undefined;
13086
+ /** The panel's name, where neither the `heading` slot nor the content holds a
13087
+ heading. */
13088
+ label?: (HelixHeadlessTourStop["label"]) | undefined;
12028
13089
  /** Whether the stop is the last one. Its next control then shows `doneLabel`. */
12029
13090
  last?: (HelixHeadlessTourStop["last"]) | undefined;
12030
13091
  /** Label for the control that goes on. */
@@ -12037,6 +13098,15 @@ closed tour, a closed tour shows nothing, and nothing can disagree. */
12037
13098
  "skip-label"?: (HelixHeadlessTourStop["skipLabel"]) | undefined;
12038
13099
  /** Label for the control that leaves the tour. */
12039
13100
  skipLabel?: (HelixHeadlessTourStop["skipLabel"]) | undefined;
13101
+ /** What kind of stop this is. Unset, it is a bubble pointing at its target.
13102
+
13103
+ - `dialog`: a panel in the middle of the window, over a backdrop
13104
+ - `floating`: a panel in a corner of the window
13105
+ - `wait`: nothing shown, while the tour waits for the target to be on the page
13106
+
13107
+ Reflected, because the styled tier places a dialog and a floating panel by
13108
+ it, and unset at rest, so no default is written onto the host. */
13109
+ type?: (HelixHeadlessTourStop["type"]) | undefined;
12040
13110
  };
12041
13111
 
12042
13112
  export type HelixHeadlessTourStopVueEvents = {
@@ -12815,6 +13885,10 @@ export type CustomCssProperties = {
12815
13885
  "--date-picker-column-count"?: (string) | undefined;
12816
13886
  /** How thick the ring is drawn, derived from `hole`. */
12817
13887
  "--donut-chart-stroke"?: (string) | undefined;
13888
+ /** How far a swipe, or a snap point, has moved the panel across, in pixels, toward the right. */
13889
+ "--drawer-swipe-x"?: (string) | undefined;
13890
+ /** How far a swipe, or a snap point, has moved the panel down, in pixels. */
13891
+ "--drawer-swipe-y"?: (string) | undefined;
12818
13892
  /** How many rows the strip lays out. The component writes it from the data, and the stylesheet that draws the strip reads it. */
12819
13893
  "--heatmap-rows"?: (string) | undefined;
12820
13894
  /** The tone of the cell it is set on. The component writes it, and the stylesheet that paints the cell reads it. */
@@ -12895,6 +13969,8 @@ export type CustomCssProperties = {
12895
13969
  "--table-template"?: (string) | undefined;
12896
13970
  /** How long this message stays, in milliseconds, for a progress hint. */
12897
13971
  "--toast-duration"?: (string) | undefined;
13972
+ /** How far a swipe has moved the message across, in pixels, toward the right. */
13973
+ "--toast-swipe-x"?: (string) | undefined;
12898
13974
  /** How deep this row sits, counting from one as `aria-level` does, for the indent. */
12899
13975
  "--tree-level"?: (string) | undefined;
12900
13976
  /** The media's own aspect ratio, once it is known. `--video-aspect-ratio` overrides it. */
@@ -12933,7 +14009,7 @@ export interface WcToolkitVueGlobalComponents {
12933
14009
  HelixHeadlessAppHeaderVueProps,
12934
14010
  HelixHeadlessAppHeaderVueEvents
12935
14011
  >;
12936
- /** Shows how a total is made up. Each numeric column of the table is a part, the parts add up to the total at each reading, and the top edge is that total. The thickness of a band is that part's amount. Use 'LineChart' with 'area' to show how each series moved: it fills each series from the floor separately, so the fills overlap. Use this chart to show the composition: it stacks the series. **The value axis always starts at zero**, as in 'BarChart', because a band's thickness is its value. For the same reason there is no streamgraph mode, which moves the baseline. To show how the composition changed, set 'share'. Band edges are straight between readings by default. A smoothed curve through one sum can dip below the curve through the sum beneath it, which draws a part as less than zero. Other curves: - 'curve="smooth"': for a stack read as an overall shape. - 'curve="step"': holds each reading and jumps at the midpoint, so stacked edges stay in order, as with 'straight'. Use it for a quantity that changes at a moment, such as a headcount or a price. 'share' draws each reading as 100 percent, so the top edge is flat and the bands show each part's share. Use it to see which part grew. The default shows whether the total grew. The drawing is 'aria-hidden'. The text summary gives the latest reading's total and each part's share of it, and the table beside the chart has every number. Every numeric column is a part, so leave a total column out of the table the chart reads, or it is counted twice. A negative reading is drawn as zero. */
14012
+ /** Shows how a total is made up. Each numeric column of the table is a part, the parts add up to the total at each reading, and the top edge is that total. The thickness of a band is that part's amount. Use 'LineChart' with 'area' to show how each series moved: it fills each series from the floor separately, so the fills overlap. Use this chart to show the composition: it stacks the series. **The value axis always starts at zero**, as in 'BarChart', because a band's thickness is its value. For the same reason there is no streamgraph mode, which moves the baseline. To show how the composition changed, set 'share'. Band edges are straight between readings by default. A smoothed curve through one sum can dip below the curve through the sum beneath it, which draws a part as less than zero. Other curves: - 'curve="smooth"': for a stack read as an overall shape. - 'curve="step"': holds each reading and jumps at the midpoint, so stacked edges stay in order, as with 'straight'. Use it for a quantity that changes at a moment, such as a headcount or a price. 'share' draws each reading as 100 percent, so the top edge is flat and the bands show each part's share. Use it to see which part grew. The default shows whether the total grew. The drawing is hidden from screen readers. The text summary gives the latest reading's total and each part's share of it, and the table beside the chart has every number. **The plot is read by key.** It takes focus, named by 'label' or the caption. The left and right arrows move from reading to reading, Home and End go to the first and the last, and the up and down arrows move among the series of a reading. The tooltip follows, the 'live' part says the reading in words, and Escape puts the tooltip away. Every numeric column is a part, so leave a total column out of the table the chart reads, or it is counted twice. A negative reading is drawn as zero. */
12937
14013
  "helix-headless-area-chart": DefineCustomElement<
12938
14014
  HelixHeadlessAreaChart,
12939
14015
  HelixHeadlessAreaChartVueProps,
@@ -12951,13 +14027,13 @@ export interface WcToolkitVueGlobalComponents {
12951
14027
  HelixHeadlessAvatarVueProps,
12952
14028
  HelixHeadlessAvatarVueEvents
12953
14029
  >;
12954
- /** Badge wraps the element it decorates and pins an indicator to its corner, so the wrapped element keeps its place in the layout. What the indicator shows depends on 'value': - A 'value' of zero shows no indicator. - No 'value' shows a dot. - Any other value shows the value. Above 'max', the indicator shows '{max}+', so its width stays the same as the count grows. A count is announced from its own text, and 'label' replaces that with a fuller name, such as '4 unread'. A dot needs a 'label'. Without one, the dot is a colored circle that screen readers do not announce. **The count is not part of the wrapped control's name.** It is a status of its own, read when it changes and when a reader moves to it, so focusing a button inside a badge announces the button's name alone. Where the count belongs in that name, write it into the control's own label, such as 'aria-label="Inbox, 8 unread"' on a button that reads "Inbox". The badge cannot add it: a reference from the control to the count would point into the badge's shadow root, which the platform does not allow. */
14030
+ /** Badge wraps the element it decorates and pins an indicator to its corner, so the wrapped element keeps its place in the layout. What the indicator shows depends on 'value': - A 'value' of zero shows no indicator. - No 'value' shows a dot. - Any other value shows the value. Above 'max', the indicator shows '{max}+', so its width stays the same as the count grows. A count is announced from its own text, and 'label' replaces that with a fuller name, such as '4 unread'. A dot needs a 'label'. Without one, the dot is a colored circle that screen readers do not announce. **A badge wrapped around a control is not part of the control's name.** It is a status of its own, read when it changes and when a reader moves to it, so focusing a button inside a badge announces the button's name alone. A reference from the control to the count would point into the badge's shadow root, which the platform does not allow. **Put the badge inside the control to have its count read with the control's name**, as Web Awesome and Shoelace do: '<button>Inbox <helix-badge value="8" label="8 unread"></helix-badge></button>' is the button "Inbox 8 unread", and stays current as the count changes. The styled tier's 'placement="inline"' draws the mark in the line for that case. */
12955
14031
  "helix-headless-badge": DefineCustomElement<
12956
14032
  HelixHeadlessBadge,
12957
14033
  HelixHeadlessBadgeVueProps,
12958
14034
  HelixHeadlessBadgeVueEvents
12959
14035
  >;
12960
- /** Every bar is measured from zero, and no property changes the baseline, because a bar's length is its value. To show the differences between values, use a line chart. The labels are HTML beside the drawing. An '<svg>' that fills its box scales the text inside it: the same 'font-size' renders at 10px in a narrow chart and 43px in a wide one, and SVG has no setting that keeps text at one size the way 'vector-effect' does for strokes. The table is the accessible representation, and the drawing is 'aria-hidden', so screen reader users get the numbers themselves. The 'summary' part names the chart, from 'label' or the table's caption, and gives each series' highest reading. The component writes the custom properties below with numbers it computes, and the stylesheet that draws the chart reads them. Do not set them yourself. */
14036
+ /** Every bar is measured from zero, and no property changes the baseline, because a bar's length is its value. To show the differences between values, use a line chart. The labels are HTML beside the drawing. An '<svg>' that fills its box scales the text inside it: the same 'font-size' renders at 10px in a narrow chart and 43px in a wide one, and SVG has no setting that keeps text at one size the way 'vector-effect' does for strokes. The table is the accessible representation, and the drawing is hidden from screen readers, so they get the numbers themselves. The 'summary' part names the chart, from 'label' or the table's caption, and gives each series' highest reading. **The plot is read by key.** It takes focus, named by 'label' or the caption. The arrows along the categories move from one to the next, which is left and right for columns and up and down for 'orientation="horizontal"'. Home and End go to the first and the last, and the other pair of arrows moves among the series of a category. The tooltip follows, the 'live' part says the reading in words, and Escape puts the tooltip away. The component writes the custom properties below with numbers it computes, and the stylesheet that draws the chart reads them. Do not set them yourself. */
12961
14037
  "helix-headless-bar-chart": DefineCustomElement<
12962
14038
  HelixHeadlessBarChart,
12963
14039
  HelixHeadlessBarChartVueProps,
@@ -12987,13 +14063,13 @@ export interface WcToolkitVueGlobalComponents {
12987
14063
  HelixHeadlessButtonGroupVueProps,
12988
14064
  HelixHeadlessButtonGroupVueEvents
12989
14065
  >;
12990
- /** Renders a real '<button>', so activation, focus, and other browser behavior come from the platform. **It never renders an anchor.** A router renders its own '<a>' to intercept a click, and it cannot render one inside the button's shadow root. For a link that looks like a button, use the base layer recipe on your own anchor: '<Link data-button="solid">' draws the same control. 'delegatesFocus' moves focus to the inner control. It is serialized into the server markup, so the button is reachable by keyboard before any JavaScript loads. The inner control is always 'type="button"', because a '<button type="submit">' inside a shadow root cannot submit a form outside it. To submit, the button calls 'requestSubmit()' on its form, which runs validation, unlike 'submit()'. A 'submit' listener reads 'event.submitter' as 'null', because the platform accepts only a native submit button there. The button's 'name' and 'value' are in the form data, so read them from 'new FormData(form)' to tell two submit buttons apart. As the first submit button in its form, it is the form's default button: Enter in a text field of the form presses it, as it presses a native one. */
14066
+ /** Renders a real '<button>', so activation, focus, and other browser behavior come from the platform. **It never renders an anchor.** A router renders its own '<a>' to intercept a click, and it cannot render one inside the button's shadow root. For a link that looks like a button, use the base layer recipe on your own anchor: '<Link data-button="solid">' draws the same control. 'delegatesFocus' moves focus to the inner control. It is serialized into the server markup, so the button is reachable by keyboard before any JavaScript loads. The inner control is always 'type="button"', because a '<button type="submit">' inside a shadow root cannot submit a form outside it. To submit, the button calls 'requestSubmit()' on its form, which runs validation, unlike 'submit()'. A 'submit' listener reads 'event.submitter' as 'null', because the platform accepts only a native submit button there. The button's 'name' and 'value' are in the form data, so read them from 'new FormData(form)' to tell two submit buttons apart. As the first submit button in its form, it is the form's default button: Enter in a text field of the form presses it, as it presses a native one. Set 'pending' while the action a press started is still running. The button keeps focus and refuses presses, and a reader on it hears 'pending-label'. */
12991
14067
  "helix-headless-button": DefineCustomElement<
12992
14068
  HelixHeadlessButton,
12993
14069
  HelixHeadlessButtonVueProps,
12994
14070
  HelixHeadlessButtonVueEvents
12995
14071
  >;
12996
- /** 'tone' is on the headless tier because it carries meaning. It picks the icon and the icon region's accessible name, so a screen reader announces "Error" for an error callout whether or not the color is seen. Set 'tone-label' to say the name in another language. The icon is the fallback content of a slot. Slot your own icon to replace it, and the default disappears with no extra check. The tone's name stays on the region around it. A callout sets a passage apart inside a document and is read where it sits. For page-level chrome above the masthead that is a live region and can be dismissed, use 'Announcement'. */
14072
+ /** 'tone' is on the headless tier because it carries meaning. It picks the icon and the icon region's accessible name, so a screen reader announces "Error" for an error callout whether or not the color is seen. Set 'tone-label' to say the name in another language. The icon is the fallback content of a slot. Slot your own icon to replace it, and the default disappears with no extra check. The tone's name stays on the region around it. Set 'dismissible' for a note a reader may put away, as Shoelace's 'closable' alert does. The button fires 'helix-dismiss' and the callout stays until a listener removes it, so the page decides whether it comes back. A callout sets a passage apart inside a document and is read where it sits. For page-level chrome above the masthead that is a live region and can be dismissed, use 'Announcement'. */
12997
14073
  "helix-headless-callout": DefineCustomElement<
12998
14074
  HelixHeadlessCallout,
12999
14075
  HelixHeadlessCalloutVueProps,
@@ -13017,7 +14093,7 @@ export interface WcToolkitVueGlobalComponents {
13017
14093
  HelixHeadlessCanvasVueProps,
13018
14094
  HelixHeadlessCanvasVueEvents
13019
14095
  >;
13020
- /** The header, body, and footer regions are slots, because they have no state, behavior, or API of their own. You bring your own markup, so a title can be a real '<h2>'. The host is the surface. The element itself takes the border, the radius, and the grid, so you style 'Card' directly and there is no wrapper part to reach through with '::part'. Name the card with 'aria-label' or 'aria-labelledby'. These are the only names that work with server rendering, because reading a title from the light DOM needs a DOM, and the server has none. */
14096
+ /** The header, body, and footer regions are slots, because they have no state, behavior, or API of their own. You bring your own markup, so a title can be a real '<h2>'. The host is the surface. The element itself takes the border, the radius, and the grid, so you style 'Card' directly and there is no wrapper part to reach through with '::part'. Name the card with 'aria-label' or 'aria-labelledby'. These are the only names that work with server rendering, because reading a title from the light DOM needs a DOM, and the server has none. **A named card is a group**, so a reader entering it hears its name; an unnamed one has no role, since a group with no name only adds "group" to what a reader says. 'header-actions' and 'footer-actions' hold controls at the end of the header's and the footer's line, as Web Awesome's card does. While one holds something, its line is a 'header-row' or 'footer-row' part; otherwise there is no wrapper and every region is a bare slot. A server cannot see slotted content, so served actions sit on their own line until the script runs. */
13021
14097
  "helix-headless-card": DefineCustomElement<
13022
14098
  HelixHeadlessCard,
13023
14099
  HelixHeadlessCardVueProps,
@@ -13047,7 +14123,7 @@ export interface WcToolkitVueGlobalComponents {
13047
14123
  HelixHeadlessChatVueProps,
13048
14124
  HelixHeadlessChatVueEvents
13049
14125
  >;
13050
- /** The host is the group. It has 'role="group"' through internals, and 'label' names it. Without a name, screen readers announce the checkboxes as separate controls. **Each checkbox submits its own value.** Checkboxes are already form-associated, and a native group is several inputs that share a name, so the group adds no form value of its own. It adds the grouping, a shared 'name' that you write once, and one place to read and write the whole set. 'value' is the checked values, separated by commas, in the order the checkboxes are written, read from the boxes themselves. Setting it checks exactly those values and unchecks the rest. A checkbox is a member wherever it sits inside the group, in a row or a grid cell of your own, unless another group inside this one holds it. A field of another kind inside the group, such as an "Other" text field, sends its own 'input' and 'change' past the group. **The group shows the message you set in 'feedback'.** It is form-associated only for validity and never calls 'setFormValue', so the browser does not generate a message for it. */
14126
+ /** The host is the group. It has 'role="group"' through internals, and 'label' names it. Without a name, screen readers announce the checkboxes as separate controls. **Each checkbox submits its own value.** Checkboxes are already form-associated, and a native group is several inputs that share a name, so the group adds no form value of its own. It adds the grouping, a shared 'name' that you write once, and one place to read and write the whole set. 'value' is the checked values, separated by commas, in the order the checkboxes are written, read from the boxes themselves. Setting it checks exactly those values and unchecks the rest. 'select-all' draws a box above the set that checks every enabled box, or unchecks them all once every one is checked. It shows a dash while only some are checked, and changes the set through the same cancelable 'helix-before-change' a box does. A checkbox is a member wherever it sits inside the group, in a row or a grid cell of your own, unless another group inside this one holds it. A field of another kind inside the group, such as an "Other" text field, sends its own 'input' and 'change' past the group. **The group shows the message you set in 'feedback'.** It is form-associated only for validity and never calls 'setFormValue', so the browser does not generate a message for it. */
13051
14127
  "helix-headless-checkbox-group": DefineCustomElement<
13052
14128
  HelixHeadlessCheckboxGroup,
13053
14129
  HelixHeadlessCheckboxGroupVueProps,
@@ -13059,7 +14135,7 @@ export interface WcToolkitVueGlobalComponents {
13059
14135
  HelixHeadlessCheckboxVueProps,
13060
14136
  HelixHeadlessCheckboxVueEvents
13061
14137
  >;
13062
- /** Renders a '<pre><code>' pair: 'pre' keeps the whitespace, and 'code' marks it as code. Long lines scroll inside the block and do not wrap, because a line break can be significant in code. A copy button is on by default. Set 'no-copy' to remove it. The button copies the slotted text, so there is no second copy of the code to keep in sync. For a fragment of code inside a sentence, use 'Code'. Set 'diff' to show a change. Put a unified diff, the output of 'git diff' or 'diff -u', in the same slot, and the block draws the lines it added and removed. The block never computes a diff itself. Line numbers come from the hunk headers and are hidden from the accessibility tree. Changed lines are '<ins>' and '<del>' with the '+' and '-' kept as text, so the change does not depend on color. Each file in the patch is its own block under its own name, and its copy button copies the new version of the file. 'variant="split"' shows the old version beside the new, each removal opposite its replacement. On the server, the slot renders as ordinary code, so a diff first appears as the patch text in a '<pre>'. The client makes the same first render, which keeps hydration clean, and draws the diff once it can read the content. Diff mode is experimental. The rest of the family is stable. */
14138
+ /** Renders a '<pre><code>' pair: 'pre' keeps the whitespace, and 'code' marks it as code. Long lines scroll inside the block and do not wrap, because a line break can be significant in code. A copy button is on by default. Set 'no-copy' to remove it. The button copies the slotted text, so there is no second copy of the code to keep in sync. For a fragment of code inside a sentence, use 'Code'. Set 'line-numbers' to number the lines in a gutter beside the code, hidden from the accessibility tree and left out of a copy. Set 'highlight' to a function that turns the code into highlighted markup, such as one wrapping Shiki or Prism, and the block draws what it returns; the code stays in the slot, so the copy button and the page's own text are the code as written. Set 'diff' to show a change. Put a unified diff, the output of 'git diff' or 'diff -u', in the same slot, and the block draws the lines it added and removed. The block never computes a diff itself. Line numbers come from the hunk headers and are hidden from the accessibility tree. Changed lines are '<ins>' and '<del>' with the '+' and '-' kept as text, so the change does not depend on color. Each file in the patch is its own block under its own name, and its copy button copies the new version of the file. 'variant="split"' shows the old version beside the new, each removal opposite its replacement. On the server, the slot renders as ordinary code, so a diff first appears as the patch text in a '<pre>'. The client makes the same first render, which keeps hydration clean, and draws the diff once it can read the content. Diff mode is experimental. The rest of the family is stable. */
13063
14139
  "helix-headless-code-block": DefineCustomElement<
13064
14140
  HelixHeadlessCodeBlock,
13065
14141
  HelixHeadlessCodeBlockVueProps,
@@ -13071,31 +14147,31 @@ export interface WcToolkitVueGlobalComponents {
13071
14147
  HelixHeadlessCodeVueProps,
13072
14148
  HelixHeadlessCodeVueEvents
13073
14149
  >;
13074
- /** A text field with a button that opens 'ColorPicker' in an overlay. 'ColorPicker' provides the square, the ramps, the eyedropper, and the syntax toggle, and you can also use it on its own, flat on the page. Color Input adds the field, the overlay, and the form value, the same arrangement Date Input has with 'DatePicker'. You can type or paste a color into the field without opening the picker. Color Input is a custom control, unlike '<input type="color">', so you can style the panel to match your interface. The field reads every color syntax, including '#f00', '#ff0000', 'rgb(255 0 0)', 'rgba(255,0,0,.5)', 'rgb(255 0 0 / 50%)', and 'hsl(0 100% 50%)'. It writes colors in the syntax that 'format' names. The field shows the value without reformatting it, because half-typed input does not survive a round trip through a formatter. Date Input does the same with dates. Typing sends 'input' on each keystroke and 'change' when you leave the field, as a text field does, so the message about a color it cannot read waits until you are done. Dragging in the panel sends 'input' as the color moves and 'change' when it settles. The component sets '--color-input-swatch', so do not set it yourself. It holds the resolved color, so the styled tier can paint the swatch without parsing the value. */
14150
+ /** A text field with a button that opens 'ColorPicker' in an overlay. 'ColorPicker' provides the square, the ramps, the eyedropper, and the syntax toggle, and you can also use it on its own, flat on the page. Color Input adds the field, the overlay, and the form value, the same arrangement Date Input has with 'DatePicker'. You can type or paste a color into the field without opening the picker. Color Input is a custom control, unlike '<input type="color">', so you can style the panel to match your interface. The field reads every color syntax, including '#f00', '#ff0000', 'rgb(255 0 0)', 'rgba(255,0,0,.5)', 'rgb(255 0 0 / 50%)', and 'hsl(0 100% 50%)'. It writes colors in the syntax that 'format' names. The field shows the value without reformatting it, because half-typed input does not survive a round trip through a formatter. Date Input does the same with dates. Typing sends 'input' on each keystroke and 'change' when you leave the field, as a text field does, so the message about a color it cannot read waits until you are done. Dragging in the panel sends 'input' as the color moves and 'change' when it settles. The trigger and ArrowDown open the panel with focus in the square. Tab moves between the panel's controls without leaving it, and Escape closes it and returns focus to the field. The component sets '--color-input-swatch', so do not set it yourself. It holds the resolved color, so the styled tier can paint the swatch without parsing the value. */
13075
14151
  "helix-headless-color-input": DefineCustomElement<
13076
14152
  HelixHeadlessColorInput,
13077
14153
  HelixHeadlessColorInputVueProps,
13078
14154
  HelixHeadlessColorInputVueEvents
13079
14155
  >;
13080
- /** The picker on its own, with no field around it, for a settings pane or a toolbar. Color Input shows this element in a panel behind a text field. The saturation and brightness square is two '<input type="range">' elements, laid over the square and made invisible, and the handle is drawn from their values. The keyboard behavior, the announcements, and the touch targets come from the platform, and there is no 'role="application"'. The picker works in HSB and derives the value from it. A value set from outside is read into the model once. Black is 'brightness: 0', which has no hue or saturation, so a model read back from the value would turn red into gray after you drag to the bottom of the square and back. The square is one tab stop. In it, the up and down arrows move brightness and the left and right arrows move saturation, and PageUp and PageDown move brightness by ten. The picker sends 'input' as the color moves and 'change' when a drag, a key, a typed value or a preset settles it, as '<input type="color">' does. */
14156
+ /** The picker on its own, with no field around it, for a settings pane or a toolbar. Color Input shows this element in a panel behind a text field. The saturation and brightness square is two '<input type="range">' elements, laid over the square and made invisible, and the handle is drawn from their values. The keyboard behavior, the announcements, and the touch targets come from the platform, and there is no 'role="application"'. The picker works in HSB and derives the value from it. A value set from outside is read into the model once. Black is 'brightness: 0', which has no hue or saturation, so a model read back from the value would turn red into gray after you drag to the bottom of the square and back. The square is one tab stop. In it, the up and down arrows move brightness and the left and right arrows move saturation, and PageUp and PageDown move brightness by ten. The picker sends 'input' as the color moves and 'change' when a drag, a key, a typed value or a preset settles it, as '<input type="color">' does. A screen reader hears the color's name, such as "vibrant red", after the two numbers on the square and after the number on the hue ramp, and each preset is named by its color. Set 'color-words' to speak the names in another language. */
13081
14157
  "helix-headless-color-picker": DefineCustomElement<
13082
14158
  HelixHeadlessColorPicker,
13083
14159
  HelixHeadlessColorPickerVueProps,
13084
14160
  HelixHeadlessColorPickerVueEvents
13085
14161
  >;
13086
- /** 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. 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. 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. */
14162
+ /** 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. */
13087
14163
  "helix-headless-combobox": DefineCustomElement<
13088
14164
  HelixHeadlessCombobox,
13089
14165
  HelixHeadlessComboboxVueProps,
13090
14166
  HelixHeadlessComboboxVueEvents
13091
14167
  >;
13092
- /** The list is a 'Listbox', which handles filtering, the empty state, the match highlight, 'aria-activedescendant', scrolling an option into view, and moving between options with the keyboard. The palette adds a dialog and a hotkey that opens it. The palette keeps no value. It is not a form control and submits nothing. Choosing an option dispatches 'helix-select' once. To remember the last command, store it yourself. The hotkey listener is on the document, so the hotkey works from anywhere on the page, including inside another control's text field, whether or not the palette is open. 'mod' means Command on a Mac and Control elsewhere, so you write one binding. The filter is cleared when the palette closes, so each opening starts from the full list. Combobox and Select do the same. */
14168
+ /** The list is a 'Listbox', which handles filtering, the empty state, the match highlight, 'aria-activedescendant', scrolling an option into view, and moving between options with the keyboard. The palette adds a dialog and a hotkey that opens it. The palette keeps no value. It is not a form control and submits nothing. Choosing an option dispatches 'helix-select' once. To remember the last command, store it yourself. An option with 'href' is a link to a page, which the browser follows once the palette has closed. The hotkey listener is on the document, so the hotkey works from anywhere on the page, including inside another control's text field, whether or not the palette is open. 'mod' means Command on a Mac and Control elsewhere, so you write one binding. The filter is cleared when the palette closes, so each opening starts from the full list. Combobox and Select do the same. As typing narrows the list, a screen reader hears how many commands are left, such as "3 commands". */
13093
14169
  "helix-headless-command": DefineCustomElement<
13094
14170
  HelixHeadlessCommand,
13095
14171
  HelixHeadlessCommandVueProps,
13096
14172
  HelixHeadlessCommandVueEvents
13097
14173
  >;
13098
- /** Copies text to the clipboard and confirms the copy. The platform gives no feedback for a clipboard write, so without a confirmation a press that copies looks the same as one that fails. The confirmation and the event wait for the write to finish. The browser can refuse a clipboard write, for example on an insecure origin, in a document that is not focused, or after a gesture that does not qualify. A refused write leaves the button unchanged. It replaces Button's render and its press, so it never submits a form or sends a command: 'type', 'command', 'commandfor' and the 'form*' overrides have no effect, and the 'start' and 'end' slots and the 'text' part are not rendered. An 'aria-label' on the element names it before a copy, in place of 'label'. */
14174
+ /** Copies text to the clipboard and confirms the copy. The platform gives no feedback for a clipboard write, so without a confirmation a press that copies looks the same as one that fails. The confirmation and the event wait for the write to finish. The browser can refuse a clipboard write, for example on an insecure origin, in a document that is not focused, or after a gesture that does not qualify. A refused write, or nothing to copy, names the button with 'error-label' for the same moment a copy shows 'copied-label', draws a cross, and sends 'helix-copy-error'. 'from' copies from another element on the page: its text, an attribute written 'id[attribute]', or a property written 'id.property', read at the press. It takes the place of 'value'. It replaces Button's render and its press, so it never submits a form or sends a command: 'type', 'command', 'commandfor' and the 'form*' overrides have no effect, and the 'start' and 'end' slots and the 'text' part are not rendered. An 'aria-label' on the element names it before a copy, in place of 'label'. */
13099
14175
  "helix-headless-copy-button": DefineCustomElement<
13100
14176
  HelixHeadlessCopyButton,
13101
14177
  HelixHeadlessCopyButtonVueProps,
@@ -13107,13 +14183,13 @@ export interface WcToolkitVueGlobalComponents {
13107
14183
  HelixHeadlessDataTableVueProps,
13108
14184
  HelixHeadlessDataTableVueEvents
13109
14185
  >;
13110
- /** The calendar is 'DatePicker', which handles months, ranges, disabled days, the first day of the week, and the grid's keyboard behavior. The date input adds the field, the overlay, and the connection between them. You can type a date as well as pick one. The native '<input type="date">' gives a picker and locale formatting but allows almost no styling, so the field is a text field. Typing sends 'input' on each keystroke and 'change' when you leave the field, as a text field does. A date picked from the calendar sends both. The trigger opens the calendar with focus on the selected day, and Escape closes it and returns focus to the field. Focusing the field opens the calendar too, and Tab out of the field closes it again. */
14186
+ /** The calendar is 'DatePicker', which handles months, ranges, disabled days, the first day of the week, and the grid's keyboard behavior. The date input adds the field, the overlay, and the connection between them. You can type a date as well as pick one. The native '<input type="date">' gives a picker and locale formatting but allows almost no styling, so the field is a text field. Typing sends 'input' on each keystroke and 'change' when you leave the field, as a text field does. A date picked from the calendar sends both. The trigger and ArrowDown open the calendar with focus on the selected day, Tab moves between the calendar's controls without leaving it, and Escape closes it and returns focus to the field. A press into the field opens the calendar too. Tab into the field opens nothing, and Tab out of the field closes the calendar. With 'segmented', the field is a row of segments in place of the text: a month, a day and a year in the order the locale writes them, each set with digits or the arrow keys. Alt+Down opens the calendar from a segment. */
13111
14187
  "helix-headless-date-input": DefineCustomElement<
13112
14188
  HelixHeadlessDateInput,
13113
14189
  HelixHeadlessDateInputVueProps,
13114
14190
  HelixHeadlessDateInputVueEvents
13115
14191
  >;
13116
- /** A grid of days that follows the APG date grid pattern: - The grid is one tab stop. Only the focused cell is in the tab sequence. - Arrow keys move by day and by week. - 'PageUp' and 'PageDown' move by month. - 'Home' and 'End' move to the start and end of the week. **Dates are 'YYYY-MM-DD' strings, and every calculation is in UTC**, because a local-time 'Date' shifts across a time zone or daylight-saving boundary. 'month' sets which month the grid shows, separately from 'value', so paging selects nothing and you can control the view. When unset, it follows the first selected date, then the current month. 'mode' sets how many dates are held. Unset holds one, 'range' holds two and marks the dates between them, and 'multiple' toggles each date. All three read and write the same comma-separated 'value'. The month heading is a live region, so a screen reader hears the new month when Previous or Next is pressed. Neither moves past 'min' or 'max', and the keys stop at them too. A value outside the bounds, on a barred day, or off 'step' reports 'rangeUnderflow', 'rangeOverflow', 'badInput' or 'stepMismatch', so a form does not submit it. */
14192
+ /** A grid of days that follows the APG date grid pattern: - The grid is one tab stop. Only the focused cell is in the tab sequence. - Arrow keys move by day and by week. - 'PageUp' and 'PageDown' move by month. - 'Home' and 'End' move to the start and end of the week. **Dates are 'YYYY-MM-DD' strings, and every calculation is in UTC**, because a local-time 'Date' shifts across a time zone or daylight-saving boundary. 'month' sets which month the grid shows, separately from 'value', so paging selects nothing and you can control the view. When unset, it follows the first selected date, then the current month. 'mode' sets how many dates are held. Unset holds one, 'range' holds two and marks the dates between them, and 'multiple' toggles each date. All three read and write the same comma-separated 'value'. 'max-view' makes the heading a button that steps back to the months of the year, and with 'year' to a page of years, as Zag's date picker does. The arrows, Home, End and the page keys move there, Enter or a press chooses, and Escape goes back to the days. 'isDateUnavailable' and 'dayContent' are properties for a script: a rule that bars dates, and what each day shows in place of its number. The month heading is a live region, so a screen reader hears the new month when Previous or Next is pressed. Neither moves past 'min' or 'max', and the keys stop at them too. A value outside the bounds, on a barred day, or off 'step' reports 'rangeUnderflow', 'rangeOverflow', 'badInput' or 'stepMismatch', so a form does not submit it. */
13117
14193
  "helix-headless-date-picker": DefineCustomElement<
13118
14194
  HelixHeadlessDatePicker,
13119
14195
  HelixHeadlessDatePickerVueProps,
@@ -13131,7 +14207,7 @@ export interface WcToolkitVueGlobalComponents {
13131
14207
  HelixHeadlessDescriptionListVueProps,
13132
14208
  HelixHeadlessDescriptionListVueEvents
13133
14209
  >;
13134
- /** Renders a native '<dialog>' opened with 'showModal()'. The platform provides: - the top layer, so the dialog is above everything whatever the 'z-index' - a backdrop - closing with Escape - an inert page behind the dialog, unreachable by pointer, keyboard, or virtual cursor 'open' calls 'showModal()', and every way the dialog closes goes through 'requestOpen'. A native dialog closes three ways: the property, Escape, and a '<form method="dialog">' submit. Routing all three through 'requestOpen' keeps your state in step, so the dialog never closes while your state still says it is open, which would leave it impossible to reopen. The dialog's name is 'label' when you set it. Otherwise it is the heading in the 'header' slot, or the elements an 'aria-labelledby' on the host names. While it is open, the page behind it does not scroll. */
14210
+ /** Renders a native '<dialog>' opened with 'showModal()'. The platform provides: - the top layer, so the dialog is above everything whatever the 'z-index' - a backdrop - closing with Escape - an inert page behind the dialog, unreachable by pointer, keyboard, or virtual cursor 'open' calls 'showModal()', and every way the dialog closes goes through 'requestOpen'. A native dialog closes three ways: the property, Escape, and a '<form method="dialog">' submit. Routing all three through 'requestOpen' keeps your state in step, so the dialog never closes while your state still says it is open, which would leave it impossible to reopen. The dialog's name is 'label' when you set it. Otherwise it is the heading in the 'header' slot, or the elements an 'aria-labelledby' on the host names. While it is open, the page behind it does not scroll. The dialog is described by the words at the start of its body: the elements in the default slot before the first one that is or holds a control. A question above a form describes the dialog, and the form does not. An 'aria-describedby' on the host replaces it. Set 'alert' for a dialog that interrupts to ask for an answer, such as a confirmation before a deletion. It is an 'alertdialog', which a screen reader announces with its description as it opens. Set 'dismissible' to draw a close control, labeled by 'dismiss-label'. */
13135
14211
  "helix-headless-dialog": DefineCustomElement<
13136
14212
  HelixHeadlessDialog,
13137
14213
  HelixHeadlessDialogVueProps,
@@ -13143,13 +14219,13 @@ export interface WcToolkitVueGlobalComponents {
13143
14219
  HelixHeadlessDividerVueProps,
13144
14220
  HelixHeadlessDividerVueEvents
13145
14221
  >;
13146
- /** A donut chart divides one whole into parts, so the component reads one column. **The first column of numbers is the series, and each row is a slice.** Other Helix charts take one column per series. **Negative values are skipped.** An arc cannot show a negative number, so those rows are left out and the total is the sum of the remaining rows. The ring is 'aria-hidden'. The 'summary' part names the chart, from 'label' or the table's caption, and gives each slice's share, and the table beside the chart has every amount. */
14222
+ /** A donut chart divides one whole into parts, so the component reads one column. **The first column of numbers is the series, and each row is a slice.** Other Helix charts take one column per series. **Negative values are skipped.** An arc cannot show a negative number, so those rows are left out and the total is the sum of the remaining rows. The ring is hidden from screen readers. The 'summary' part names the chart, from 'label' or the table's caption, and gives each slice's share, and the table beside the chart has every amount. **The ring is read by key.** The plot takes focus, named by 'label' or the caption. Every arrow moves from slice to slice, the right and down arrows to the next, and Home and End go to the first and the last. The tooltip follows, the 'live' part says the slice in words, and Escape puts the tooltip away. */
13147
14223
  "helix-headless-donut-chart": DefineCustomElement<
13148
14224
  HelixHeadlessDonutChart,
13149
14225
  HelixHeadlessDonutChartVueProps,
13150
14226
  HelixHeadlessDonutChartVueEvents
13151
14227
  >;
13152
- /** Uses 'MixinControllerOpen', so 'open', 'defaultOpen', and the 'helix-before-open' and 'helix-before-close' events work the same way as on an accordion item. The drawer is modal by default, which means four things: - focus is trapped inside - Escape and a press outside close it - the page behind is covered - the page behind does not scroll A drawer with 'modal="false"' leaves the page usable and still closes on Escape. The panel's name is 'label' when you set it. Otherwise it is the heading in the 'header' slot, or the elements an 'aria-labelledby' on the host names. Content stays mounted when the drawer is closed, so it is in the server markup and can animate. A closed '<dialog>' is already out of the tab order and the accessibility tree, so the drawer does not write 'inert'. The 'role', 'aria-modal', and the scrim also come from the '<dialog>' element. 'drawer-root.ssr.spec.ts' checks that the panel has no hand-written 'inert' or 'role'. Open the drawer declaratively with the platform's invoker attributes: '''html <helix-headless-button commandfor="nav" command="--toggle">Menu</helix-headless-button> <helix-headless-drawer id="nav">…</helix-headless-drawer> ''' */
14228
+ /** Uses 'MixinControllerOpen', so 'open', 'defaultOpen', and the 'helix-before-open' and 'helix-before-close' events work the same way as on an accordion item. The drawer is modal by default, which means four things: - focus is trapped inside - Escape and a press outside close it - the page behind is covered - the page behind does not scroll A drawer with 'modal="false"' leaves the page usable and still closes on Escape, in a browser without 'closedby' as well. **A touch or a pen swipes it away**, toward the edge it came from, resolved against the writing direction. A swipe past halfway, or a quick one, closes it through the same request as every other way out. 'snap-points' lists the fractions of the panel a reader can leave on screen, such as '0.5 1' for a sheet that rests half open: it opens at the smallest, and a swipe settles at the nearest. While a swipe moves the panel, the distance is written on it as '--drawer-swipe-x' and '--drawer-swipe-y'. 'swipe="false"' turns swiping off. The panel's name is 'label' when you set it. Otherwise it is the heading in the 'header' slot, or the elements an 'aria-labelledby' on the host names. Content stays mounted when the drawer is closed, so it is in the server markup and can animate. A closed '<dialog>' is already out of the tab order and the accessibility tree, so the drawer does not write 'inert'. The 'role', 'aria-modal', and the scrim also come from the '<dialog>' element. 'drawer-root.ssr.spec.ts' checks that the panel has no hand-written 'inert' or 'role'. Open the drawer declaratively with the platform's invoker attributes: '''html <helix-headless-button commandfor="nav" command="--toggle">Menu</helix-headless-button> <helix-headless-drawer id="nav">…</helix-headless-drawer> ''' */
13153
14229
  "helix-headless-drawer": DefineCustomElement<
13154
14230
  HelixHeadlessDrawer,
13155
14231
  HelixHeadlessDrawerVueProps,
@@ -13173,7 +14249,7 @@ export interface WcToolkitVueGlobalComponents {
13173
14249
  HelixHeadlessEmptyVueProps,
13174
14250
  HelixHeadlessEmptyVueEvents
13175
14251
  >;
13176
- /** File Input keeps a real '<input type="file">' and makes it invisible. Only a file input opens the file picker: the browser opens it for a click on the input or on a '<label>' that points at it, and a script cannot open it on its own. A custom button would still call '.click()' on a hidden input, and a screen reader would find two controls. The input holds the label, the name, the validity, and the focus, and the visible trigger is a '<label for>'. The label is not focusable. The input is, and Enter and Space on it open the picker. */
14252
+ /** File Input keeps a real '<input type="file">' and makes it invisible. Only a file input opens the file picker: the browser opens it for a click on the input or on a '<label>' that points at it, and a script cannot open it on its own. A custom button would still call '.click()' on a hidden input, and a screen reader would find two controls. The input holds the label, the name, the validity, and the focus, and the visible trigger is a '<label for>'. The label is not focusable. The input is, and Enter and Space on it open the picker. Files arrive from the picker, a drop, or a paste onto the field, and each one is screened: 'accept', 'max-file-size', 'max-files' and your own 'validate' can refuse it. A refused file is left out, 'helix-reject' lists each one with its reason, and a reader hears 'rejected-text' with the names filled in. 'directory' asks the picker for a folder. */
13177
14253
  "helix-headless-file-input": DefineCustomElement<
13178
14254
  HelixHeadlessFileInput,
13179
14255
  HelixHeadlessFileInputVueProps,
@@ -13203,13 +14279,13 @@ export interface WcToolkitVueGlobalComponents {
13203
14279
  HelixHeadlessFilterOperatorVueProps,
13204
14280
  HelixHeadlessFilterOperatorVueEvents
13205
14281
  >;
13206
- /** Tokens are your own elements, slotted in. A filter can be a facet with a prefix, a saved query, or a range, and these belong to your model, so the element does not render tokens from a list of strings. Removing a token is a request the element fires, and you apply it. Combobox works the other way: its tokens show a selection it owns, drawn from the options it was given. 'value' is the typed text. Every keystroke fires 'input' with the text on the element, so a table can narrow as the user types. Tokens are not reported, because they are markup you already hold. Backspace in an empty field fires 'helix-dismiss' on the last token, the same event its remove control fires, so one handler covers the pointer and the keyboard. **Typed filters.** The field parses only the fields you declare. Write 'FilterField' elements, usually inside the 'FilterMenu' slotted into 'start', so the picker and the text share one set. On Enter, the field reads the text against them. 'disposition:refunded,settled' and '-disposition:refunded' fire 'helix-facet' exactly as ticking those values in the picker would, and the parsed text is removed. Everything else stays, so 'refund tuesday disposition:settled' is a filter and a search at once. Helix defines the punctuation and you define every word. 'grammar.ts' has the full rule, so read it before you rely on it. A field with no 'FilterField' in it parses nothing. A field whose values cannot be listed, such as 'assignee:ada', goes directly inside this element, outside the menu. It is not assigned to a slot, so nothing draws it and the menu has no page for it, and the grammar still reads it. **Suggestions.** Slot options into 'suggestions' and the field shows them, moves through them with the arrow keys, and presses one on Enter. The option fires its own 'helix-select', and you decide what choosing it means. Keys before a colon and values after it use the same panel with different contents. 'readFilterText' is exported so you can narrow the panel against partly typed text. The panel opens when it has options and closes when it has none, and a choice does not close it, so after picking a key you see its values next. Use 'selectionStart' and 'setSelectionRange' to write a completion back and put the caret after it, or the next parse reads the wrong term. **State.** Three things have three different owners: - 'value' is the text. The user types, the element applies it, and 'input' reports it. Setting 'value' seeds or corrects the text, and the next keystroke overwrites it, even in React. To control the value, cancel 'helix-before-change' and write the value you want, as with every field in this library. 'default-value' seeds the field. - 'open' is the suggestions panel. Cancel 'helix-before-open' or 'helix-before-close' to control it, and use 'default-open' to seed it. - Tokens are your elements in a slot and hold no state. A token goes when you remove it from your markup after 'helix-dismiss'. A 'FilterChip' naming a declared field works differently, because the picker holds what is ticked and removing the chip alone would leave its value ticked in the hidden menu. Its dismissal is treated as the field being filtered by nothing, so it fires 'helix-facet' like every other change, and the chip goes when the filter goes. */
14282
+ /** Tokens are your own elements, slotted in. A filter can be a facet with a prefix, a saved query, or a range, and these belong to your model, so the element does not render tokens from a list of strings. Removing a token is a request the element fires, and you apply it. Combobox works the other way: its tokens show a selection it owns, drawn from the options it was given. 'value' is the typed text. Every keystroke fires 'input' with the text on the element, so a table can narrow as the user types. A form receives the text under 'name', and then one more entry under 'name' for each token: its 'value' attribute, or for a 'FilterChip', its field and values written 'field:values' as the field reads them typed. Backspace in an empty field fires 'helix-dismiss' on the last token, the same event its remove control fires, so one handler covers the pointer and the keyboard. **Typed filters.** The field parses only the fields you declare. Write 'FilterField' elements, usually inside the 'FilterMenu' slotted into 'start', so the picker and the text share one set. On Enter, the field reads the text against them. 'disposition:refunded,settled' and '-disposition:refunded' fire 'helix-facet' exactly as ticking those values in the picker would, and the parsed text is removed. Everything else stays, so 'refund tuesday disposition:settled' is a filter and a search at once. Helix defines the punctuation and you define every word. 'grammar.ts' has the full rule, so read it before you rely on it. A field with no 'FilterField' in it parses nothing. A field whose values cannot be listed, such as 'assignee:ada', goes directly inside this element, outside the menu. It is not assigned to a slot, so nothing draws it and the menu has no page for it, and the grammar still reads it. **Suggestions.** Slot options into 'suggestions' and the field shows them, moves through them with the arrow keys, and presses one on Enter. The option fires its own 'helix-select', and you decide what choosing it means. Keys before a colon and values after it use the same panel with different contents. 'filter-suggestions' narrows the panel to the options whose words hold the term at the caret, after its colon, ignoring case and accents, and hides the rest. 'readFilterText' is exported so you can narrow it yourself against partly typed text. While the panel is open, a reader hears how many suggestions it offers. The panel opens when it has options and closes when it has none, and a choice does not close it, so after picking a key you see its values next. Use 'selectionStart' and 'setSelectionRange' to write a completion back and put the caret after it, or the next parse reads the wrong term. **State.** Three things have three different owners: - 'value' is the text. The user types, the element applies it, and 'input' reports it. Setting 'value' seeds or corrects the text, and the next keystroke overwrites it, even in React. To control the value, cancel 'helix-before-change' and write the value you want, as with every field in this library. 'default-value' seeds the field. - 'open' is the suggestions panel. Cancel 'helix-before-open' or 'helix-before-close' to control it, and use 'default-open' to seed it. - Tokens are your elements in a slot and hold no state. A token goes when you remove it from your markup after 'helix-dismiss'. A 'FilterChip' naming a declared field works differently, because the picker holds what is ticked and removing the chip alone would leave its value ticked in the hidden menu. Its dismissal is treated as the field being filtered by nothing, so it fires 'helix-facet' like every other change, and the chip goes when the filter goes. */
13207
14283
  "helix-headless-filter-input": DefineCustomElement<
13208
14284
  HelixHeadlessFilterInput,
13209
14285
  HelixHeadlessFilterInputVueProps,
13210
14286
  HelixHeadlessFilterInputVueEvents
13211
14287
  >;
13212
- /** 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. **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. **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. */
14288
+ /** 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. **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. */
13213
14289
  "helix-headless-format-date": DefineCustomElement<
13214
14290
  HelixHeadlessFormatDate,
13215
14291
  HelixHeadlessFormatDateVueProps,
@@ -13221,7 +14297,7 @@ export interface WcToolkitVueGlobalComponents {
13221
14297
  HelixHeadlessGraphVueProps,
13222
14298
  HelixHeadlessGraphVueEvents
13223
14299
  >;
13224
- /** A grid of cells, each colored by a tone. 'rows="1"' makes a status strip, and 'rows="7"' makes a contribution graph. GitHub's contribution graph uses five discrete levels, which a set of tones covers. Color in a heatmap is per cell. In every other Helix chart, color is per series, so ninety differently colored cells would need ninety series. **The data is a real '<table>' named by 'for'**, as in every Helix chart, and the table is the accessible representation. Hide it with 'data-hidden-visually', and screen readers still read it. A cell takes its tone from its own 'data-tone', or from 'thresholds' and 'tones' applied to its value. 'data-tone' wins, so when you already know a day was degraded, you can set the tone directly. **The headless tier does not resolve tone names.** A tone named 'success' writes '--heatmap-tone: var(--heatmap-tone-success)', and the styled tier or your own stylesheet defines that property. The headless tier does not use 'var(--helix-color-*)'. */
14300
+ /** A grid of cells, each colored by a tone. 'rows="1"' makes a status strip, and 'rows="7"' makes a contribution graph. GitHub's contribution graph uses five discrete levels, which a set of tones covers. Color in a heatmap is per cell. In every other Helix chart, color is per series, so ninety differently colored cells would need ninety series. **The data is a real '<table>' named by 'for'**, as in every Helix chart, and the table is the accessible representation. Hide it with 'data-hidden-visually', and screen readers still read it. A cell takes its tone from its own 'data-tone', or from 'thresholds' and 'tones' applied to its value. 'data-tone' wins, so when you already know a day was degraded, you can set the tone directly. **The headless tier does not resolve tone names.** A tone named 'success' writes '--heatmap-tone: var(--heatmap-tone-success)', and the styled tier or your own stylesheet defines that property. The headless tier does not use 'var(--helix-color-*)'. **The strip is read by key.** It takes focus once it has cells. The up and down arrows move a cell, the left and right arrows move a column, which is a week with 'rows="7"', and Home and End go to the first and the last. The tooltip follows, the 'live' part says the cell's row in words, and Escape puts the tooltip away. */
13225
14301
  "helix-headless-heatmap": DefineCustomElement<
13226
14302
  HelixHeadlessHeatmap,
13227
14303
  HelixHeadlessHeatmapVueProps,
@@ -13233,7 +14309,7 @@ export interface WcToolkitVueGlobalComponents {
13233
14309
  HelixHeadlessIconButtonVueProps,
13234
14310
  HelixHeadlessIconButtonVueEvents
13235
14311
  >;
13236
- /** The icons are Phosphor, drawn on a 256 box at stroke-width 16. Each glyph renders its full inner markup, because most icons are several elements, each with its own stroke and fill. The markup is generated at build time from SVG files in this repository and never comes from user input, so rendering it with 'unsafeSVG' is safe. The '<svg>' carries 'fill="currentColor"'. The generator keeps only the inner markup, and Phosphor sets its fill on the root tag that the generator discards. Without it, the 65 solid glyphs fall back to black and disappear on a dark background. Shapes that set their own 'fill' or 'stroke' are unaffected. A name with no match renders nothing, and the element fires 'error', so a typo in a name can be heard. An icon is decorative by default and hidden from assistive technology. Set 'label' only when the icon is the only carrier of meaning, such as in a button with no text. An 'aria-label' on the element works too: the element is then an image with that name. */
14312
+ /** The icons are Phosphor, drawn on a 256 box at stroke-width 16. Each glyph renders its full inner markup, because most icons are several elements, each with its own stroke and fill. The markup is generated at build time from SVG files in this repository and never comes from user input, so rendering it with 'unsafeSVG' is safe. The '<svg>' carries 'fill="currentColor"'. The generator keeps only the inner markup, and Phosphor sets its fill on the root tag that the generator discards. Without it, the 65 solid glyphs fall back to black and disappear on a dark background. Shapes that set their own 'fill' or 'stroke' are unaffected. **A name is looked up in a registry.** The family's entry registers the whole set, so any name in it draws. The element's own entry, '@fusion.dev/helix-headless/icon/root', registers none: a page that imports it and calls 'registerIcons' with the glyphs it names ships those and no others. 'registerIconLibrary' resolves names under a prefix of your own, such as 'lucide:camera', at once or later, and the element fires 'load' when a glyph that came later is drawn. A glyph registered after the element rendered is drawn then. A name with no match renders nothing, and the element fires 'error', so a typo in a name can be heard. An icon is decorative by default and hidden from assistive technology. Set 'label' only when the icon is the only carrier of meaning, such as in a button with no text. An 'aria-label' on the element works too: the element is then an image with that name. */
13237
14313
  "helix-headless-icon": DefineCustomElement<
13238
14314
  HelixHeadlessIcon,
13239
14315
  HelixHeadlessIconVueProps,
@@ -13251,31 +14327,31 @@ export interface WcToolkitVueGlobalComponents {
13251
14327
  HelixHeadlessInputVueProps,
13252
14328
  HelixHeadlessInputVueEvents
13253
14329
  >;
13254
- /** Renders a '<kbd>' element. Each element holds one key, except when you use 'keys'. For a sequence or a chord, write one element per key and put the separator between them as text, such as "then" or "plus". 'keys' renders the right glyphs for the platform. Given 'mod', it renders '⌘K' on Apple devices and 'Ctrl+K' everywhere else. A '⌘K' typed into a template is wrong for anyone on Windows. The element binds the shortcut only when 'within' is set. By default it draws the key and listens for nothing. */
14330
+ /** Renders a '<kbd>' element. Each element holds one key, except when you use 'keys'. For a sequence or a chord, write one element per key and put the separator between them as text, such as "then" or "plus". 'keys' renders the right glyphs for the platform. Given 'mod', it renders '⌘K' on Apple devices and 'Ctrl+K' everywhere else. A '⌘K' typed into a template is wrong for anyone on Windows. The element binds the shortcut only when 'within' is set. By default it draws the key and listens for nothing. **'for' names the control the shortcut works**, and the key writes its chord onto that control's 'aria-keyshortcuts', in the platform's words ('Meta+K' on an Apple keyboard, 'Control+K' elsewhere), so a screen reader announces the shortcut with the control. A chord the page wrote there itself is left alone, and the key takes back only what it added. */
13255
14331
  "helix-headless-kbd": DefineCustomElement<
13256
14332
  HelixHeadlessKbd,
13257
14333
  HelixHeadlessKbdVueProps,
13258
14334
  HelixHeadlessKbdVueEvents
13259
14335
  >;
13260
- /** Renders a legend as a list, separate from any chart, so any chart can use one. Set 'for' to the table the chart reads, and the legend takes its entries from that table, so the two always match. 'entries' sets how the table is read: - 'series': one entry per data column, named by the header row. Use it for a line or bar chart. - 'categories': one entry per body row. Use it for a donut, whose slices are the rows and which has no axis to name them on. - 'measures': drops the first data column. Use it for a scatter. The table is resolved on the client. There is no server pass. */
14336
+ /** Renders a legend as a list, separate from any chart, so any chart can use one. Set 'for' to the table the chart reads, and the legend takes its entries from that table, so the two always match. 'entries' sets how the table is read: - 'series': one entry per data column, named by the header row. Use it for a line or bar chart. - 'categories': one entry per body row. Use it for a donut, whose slices are the rows and which has no axis to name them on. - 'measures': drops the first data column. Use it for a scatter. The table is resolved on the client. There is no server pass. **'toggles' makes each entry a button that hides its series.** Every chart reading the same table draws without a hidden series and fits its scale to the rest, and the series keeps its color. The button says whether its series is shown with 'aria-pressed'. 'hidden-series' holds the hidden names, so a page can start with some hidden or read which are. */
13261
14337
  "helix-headless-legend": DefineCustomElement<
13262
14338
  HelixHeadlessLegend,
13263
14339
  HelixHeadlessLegendVueProps,
13264
14340
  HelixHeadlessLegendVueEvents
13265
14341
  >;
13266
- /** Wraps one piece of content in the lightbox, such as a picture, a video frame, or a chart. The lightbox shows one item at a time, and the root decides which. An item that is not current is hidden and stays in the DOM, as a 'TabPanel' does. Crawlers can read it, it is in the server-rendered markup, and an '<img>' that has decoded does not decode again when you go back to it. */
14342
+ /** Wraps one piece of content in the lightbox, such as a picture, a video frame, or a chart. The lightbox shows one item at a time, and the root decides which. Each item is a 'group' with the role description 'slide', named by its 'label' or, without one, by its place in the set, such as "2 of 5", as the APG carousel pattern names a slide. The lightbox supplies both words, so they are translated on the lightbox. An item that is not current is hidden and stays in the DOM, as a 'TabPanel' does. Crawlers can read it, it is in the server-rendered markup, and an '<img>' that has decoded does not decode again when you go back to it. */
13267
14343
  "helix-headless-lightbox-item": DefineCustomElement<
13268
14344
  HelixHeadlessLightboxItem,
13269
14345
  HelixHeadlessLightboxItemVueProps,
13270
14346
  HelixHeadlessLightboxItemVueEvents
13271
14347
  >;
13272
- /** The frame around content you open, such as a picture, a video frame, or a chart. The lightbox draws no content of its own. It provides the frame, the keyboard behavior, and text that states the current position in the set. The modal behavior comes from a native '<dialog>' opened with 'showModal()', which provides the top layer, a backdrop, Escape to close, and 'inert' on the rest of the document. Every way of closing goes through 'requestOpen', as in 'Dialog' and 'Drawer'. A lightbox shows one item at a time and has no scrolling track, so 'active' holds the current item, as in 'Tabs'. The arrow keys change the item while focus stays in the dialog. The chrome hides when there is no input, through 'IdleController', and comes back on a pointer move, a key press, or a focus. It stays while focus is on a control in the header or the footer, so a keyboard reader is never left on a control that has gone. 'fullscreen' uses 'FullscreenController', as 'Video' does. While the viewer is open, the page behind it does not scroll. */
14348
+ /** The frame around content you open, such as a picture, a video frame, or a chart. The lightbox draws no content of its own. It provides the frame, the keyboard behavior, and text that states the current position in the set. The modal behavior comes from a native '<dialog>' opened with 'showModal()', which provides the top layer, a backdrop, Escape to close, and 'inert' on the rest of the document. Every way of closing goes through 'requestOpen', as in 'Dialog' and 'Drawer'. A lightbox shows one item at a time and has no scrolling track, so 'active' holds the current item, as in 'Tabs'. The arrow keys change the item while focus stays in the dialog. Set 'controls' for the viewer's own previous, next and close controls, named by 'previous-label', 'next-label' and 'dismiss-label'. Without it, compose the chrome yourself in the 'header' and 'footer' slots, with buttons that send '--previous', '--next' and '--close'. Each item is a slide: a 'group' with the role description in 'slide-role-label', named by its 'label' or by 'slide-label'. A touch or a pen swiped across the picture shows the next or the previous item, the way the line of text runs. The chrome hides when there is no input, through 'IdleController', and comes back on a pointer move, a key press, or a focus. It stays while focus is on a control in the header or the footer, so a keyboard reader is never left on a control that has gone. 'fullscreen' uses 'FullscreenController', as 'Video' does. While the viewer is open, the page behind it does not scroll. */
13273
14349
  "helix-headless-lightbox": DefineCustomElement<
13274
14350
  HelixHeadlessLightbox,
13275
14351
  HelixHeadlessLightboxVueProps,
13276
14352
  HelixHeadlessLightboxVueEvents
13277
14353
  >;
13278
- /** A line chart shows the shape of each series: where the readings went. The scale covers the range of the data. Including zero in the range of a series that moves between 980 and 1020 would flatten the line into a rule across the top of the box. 'BarChart' always starts at zero, because a bar's length is its value. Set 'zero' when the distance from zero is the point. Every series shares one scale, as in the bar chart. 'area' fills each series down to the floor on its own, so the fills overlap. For a total made of parts, use 'Area Chart', which stacks the series so the top edge is the total and each band is a share. The labels are HTML beside the drawing, as in 'BarChart'. Text inside an '<svg>' that fills its box scales with the box, so the same 'font-size' can render at 10px in a narrow chart and 43px in a wide one. The table is the accessible representation, and the drawing is 'aria-hidden'. Screen reader users get the numbers. The 'summary' part names the chart, from 'label' or the table's caption, and gives each series' latest reading. */
14354
+ /** A line chart shows the shape of each series: where the readings went. The scale covers the range of the data. Including zero in the range of a series that moves between 980 and 1020 would flatten the line into a rule across the top of the box. 'BarChart' always starts at zero, because a bar's length is its value. Set 'zero' when the distance from zero is the point. Every series shares one scale, as in the bar chart. 'area' fills each series down to the floor on its own, so the fills overlap. For a total made of parts, use 'Area Chart', which stacks the series so the top edge is the total and each band is a share. The labels are HTML beside the drawing, as in 'BarChart'. Text inside an '<svg>' that fills its box scales with the box, so the same 'font-size' can render at 10px in a narrow chart and 43px in a wide one. The table is the accessible representation, and the drawing is hidden from screen readers, who get the numbers. The 'summary' part names the chart, from 'label' or the table's caption, and gives each series' latest reading. **The plot is read by key.** It takes focus, named by 'label' or the caption. The left and right arrows move from reading to reading, Home and End go to the first and the last, and the up and down arrows move among the series of a reading. The tooltip follows, the 'live' part says the reading in words, and Escape puts the tooltip away. */
13279
14355
  "helix-headless-line-chart": DefineCustomElement<
13280
14356
  HelixHeadlessLineChart,
13281
14357
  HelixHeadlessLineChartVueProps,
@@ -13293,13 +14369,13 @@ export interface WcToolkitVueGlobalComponents {
13293
14369
  HelixHeadlessListVueProps,
13294
14370
  HelixHeadlessListVueEvents
13295
14371
  >;
13296
- /** 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, 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. */
14372
+ /** 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. 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'. */
13297
14373
  "helix-headless-listbox": DefineCustomElement<
13298
14374
  HelixHeadlessListbox,
13299
14375
  HelixHeadlessListboxVueProps,
13300
14376
  HelixHeadlessListboxVueEvents
13301
14377
  >;
13302
- /** Draws two concentric circles: a track and a moving arc. The track shows the arc as a proportion of a whole, and costs one element. **The center is a slot, empty by default.** Put your logo there once, where your app wraps the loader. When nothing is slotted, nothing extra is rendered. Slotted content does not rotate. Only the arc moves, so a logo stays readable. The role is set on the host through 'ElementInternals'. A 'role' in the shadow root would leave the host itself without a role in the light DOM, and a 'role' attribute on the host would be missing from React server-rendered markup. */
14378
+ /** Draws two concentric circles: a track and a moving arc. The track shows the arc as a proportion of a whole, and costs one element. **The center is a slot, empty by default.** Put your logo there once, where your app wraps the loader. When nothing is slotted, nothing extra is rendered. Slotted content does not rotate. Only the arc moves, so a logo stays readable. The role is set on the host through 'ElementInternals'. A 'role' in the shadow root would leave the host itself without a role in the light DOM, and a 'role' attribute on the host would be missing from React server-rendered markup. **'for' names the region being loaded**, and the loader sets 'aria-busy="true"' on it for as long as the loader is on the page, so a screen reader waits for the region rather than reading it half filled. Two loaders in one region hold it busy until the last one leaves. **'delay' keeps a quick load from flashing a loader.** The loader stays hidden, and silent, for that many milliseconds, and appears only if the work is still going. */
13303
14379
  "helix-headless-loader": DefineCustomElement<
13304
14380
  HelixHeadlessLoader,
13305
14381
  HelixHeadlessLoaderVueProps,
@@ -13413,13 +14489,13 @@ export interface WcToolkitVueGlobalComponents {
13413
14489
  HelixHeadlessNotificationVueProps,
13414
14490
  HelixHeadlessNotificationVueEvents
13415
14491
  >;
13416
- /** 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. */
14492
+ /** 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. */
13417
14493
  "helix-headless-notifications": DefineCustomElement<
13418
14494
  HelixHeadlessNotifications,
13419
14495
  HelixHeadlessNotificationsVueProps,
13420
14496
  HelixHeadlessNotificationsVueEvents
13421
14497
  >;
13422
- /** A separate family from 'Input''s 'type="number"'. It renders two buttons, binds four keys 'Input' does not, and handles clamping and stepping. The field is 'type="text"' with 'inputmode="decimal"'. Tested in a real browser, 'type="number"' fails in three ways: - Typing '12e' gives a '.value' of '""', so the element cannot see what you typed. A 'type="text"' field keeps '"12e"'. - The mouse wheel over a focused field changes the value, for example from 5 to 4, when you only meant to scroll the page. - 'selectionStart' is 'null', so the caret cannot be managed. 'inputmode="decimal"' keeps the numeric keypad on phones. Validity follows the platform's rules: 'min', 'max', and 'step' are checked and reported through the host's own 'setValidity', under the platform's flag names. Stepping is separate from typing, so a number is not corrected while you type it. */
14498
+ /** A separate family from 'Input''s 'type="number"'. It renders two buttons, binds four keys 'Input' does not, and handles clamping and stepping. The field is 'type="text"' with 'inputmode="decimal"'. Tested in a real browser, 'type="number"' fails in three ways: - Typing '12e' gives a '.value' of '""', so the element cannot see what you typed. A 'type="text"' field keeps '"12e"'. - The mouse wheel over a focused field changes the value, for example from 5 to 4, when you only meant to scroll the page. - 'selectionStart' is 'null', so the caret cannot be managed. 'inputmode="decimal"' keeps the numeric keypad on phones. 'format-options' shows the number with 'Intl.NumberFormat' in 'locale', as a currency, a percent or a unit, while the field is not being edited. Focus shows the number itself, and a typed '$1,200' or '25%' is read back with the same options. The value stays the plain number: '1200', or '0.25' for 25%. The locale's group separators are read in every field, so '1,234' is a number in 'en-US'. On iOS and iPadOS the field is a text field described as a number field, with no 'role="spinbutton"', which VoiceOver reads as a slider you cannot type in. React Aria's NumberField does the same. Validity follows the platform's rules: 'min', 'max', and 'step' are checked and reported through the host's own 'setValidity', under the platform's flag names. Stepping is separate from typing, so a number is not corrected while you type it. */
13423
14499
  "helix-headless-number-input": DefineCustomElement<
13424
14500
  HelixHeadlessNumberInput,
13425
14501
  HelixHeadlessNumberInputVueProps,
@@ -13437,7 +14513,7 @@ export interface WcToolkitVueGlobalComponents {
13437
14513
  HelixHeadlessOptionGroupVueProps,
13438
14514
  HelixHeadlessOptionGroupVueEvents
13439
14515
  >;
13440
- /** Options are their own family, separate from Select, because an option belongs to a listbox and several controls contain one. 'role="option"' requires an owning 'role="listbox"'. A Select is a listbox with a trigger, a Combobox is a listbox with a text input, and a command palette is a listbox in a dialog. 'Radio' is a part of its group, because a radio has only one kind of owner. Selection works the way it does for a radio. Choosing an option dispatches an event, the listbox decides whether the choice stands, and the listbox sets 'selected'. Filtering belongs to the owner, which hides an option with 'hidden'. What counts as a match differs between a select and a command palette. */
14516
+ /** Options are their own family, separate from Select, because an option belongs to a listbox and several controls contain one. 'role="option"' requires an owning 'role="listbox"'. A Select is a listbox with a trigger, a Combobox is a listbox with a text input, and a command palette is a listbox in a dialog. 'Radio' is a part of its group, because a radio has only one kind of owner. Selection works the way it does for a radio. Choosing an option dispatches an event, the listbox decides whether the choice stands, and the listbox sets 'selected'. Filtering belongs to the owner, which hides an option with 'hidden'. What counts as a match differs between a select and a command palette. An option with 'href' is a link: choosing it follows the link and selects nothing, as an entry in a command palette that goes to a page does. */
13441
14517
  "helix-headless-option": DefineCustomElement<
13442
14518
  HelixHeadlessOption,
13443
14519
  HelixHeadlessOptionVueProps,
@@ -13467,13 +14543,13 @@ export interface WcToolkitVueGlobalComponents {
13467
14543
  HelixHeadlessPaginationSummaryVueProps,
13468
14544
  HelixHeadlessPaginationSummaryVueEvents
13469
14545
  >;
13470
- /** Each cell is its own '<input>', so every box has a real focus ring, caret, and tab stop. Input longer than one character is treated as a paste, in any cell. This covers pasting, a browser autofilling an SMS code, and a password manager, which all put the whole code into the focused box. A six-character code that arrives in cell three fills from cell three. The code is one value to a form. The cells are in a shadow root and submit nothing. The host is form-associated and submits the joined string, which also carries validity and responds to a form reset. Only the first cell has 'autocomplete="one-time-code"', because the hint applies to the whole field. The row of cells always runs left to right, with 'dir="ltr"', including in Arabic and Hebrew. The first box is the leftmost, a paste fills to the right, and the right arrow moves to the next box. The label, hint, and feedback follow the page's direction. */
14546
+ /** Each cell is its own '<input>', so every box has a real focus ring, caret, and tab stop. Input longer than one character is treated as a paste, in any cell. This covers pasting, a browser autofilling an SMS code, and a password manager, which all put the whole code into the focused box. A six-character code that arrives in cell three fills from cell three. The code is one value to a form. The cells are in a shadow root and submit nothing. The host is form-associated and submits the joined string, which also carries validity and responds to a form reset. Only the first cell has 'autocomplete="one-time-code"', because the hint applies to the whole field. 'autosubmit' submits the form once the last box is filled, through the form's default button where there is one. 'format' draws separators between the boxes, such as the dash in '###-###', as text a screen reader skips. Delete removes the character in the focused box and pulls the rest of the code back, as Backspace removes the one before it. The row of cells always runs left to right, with 'dir="ltr"', including in Arabic and Hebrew. The first box is the leftmost, a paste fills to the right, and the right arrow moves to the next box. The label, hint, and feedback follow the page's direction. */
13471
14547
  "helix-headless-pin-input": DefineCustomElement<
13472
14548
  HelixHeadlessPinInput,
13473
14549
  HelixHeadlessPinInputVueProps,
13474
14550
  HelixHeadlessPinInputVueEvents
13475
14551
  >;
13476
- /** Popover is the general overlay that the specific ones build on. 'Menu' holds commands, 'Select' holds options, and 'Tooltip' holds a description. Popover holds any content you put in it, so it has no keyboard handling of its own. The trigger is slotted and stays your own element. The popover writes nothing onto it, including 'aria-expanded', 'id', and 'tabindex', because changing your markup after upgrade causes a React hydration mismatch. The panel is in the top layer through the popover API, so it needs no 'z-index', and an ancestor with 'overflow: hidden', 'transform', 'filter', or 'contain' does not clip or move it. It opens on click and from a command. 'command="--show"' and the related commands work as they do on 'Dialog' and 'Drawer', so a button anywhere on the page can open the popover with no script. It closes on Escape, on a press outside it, and when focus moves out of the trigger and the panel to somewhere else on the page. It does not trap focus. An 'aria-labelledby' on the host names the panel in place of 'label'. */
14552
+ /** Popover is the general overlay that the specific ones build on. 'Menu' holds commands, 'Select' holds options, and 'Tooltip' holds a description. Popover holds any content you put in it, so it has no keyboard handling of its own. The trigger is slotted and stays your own element. The popover writes nothing onto it, including 'aria-expanded', 'id', and 'tabindex', because changing your markup after upgrade causes a React hydration mismatch. The panel is in the top layer through the popover API, so it needs no 'z-index', and an ancestor with 'overflow: hidden', 'transform', 'filter', or 'contain' does not clip or move it. It opens on click and from a command. 'command="--show"' and the related commands work as they do on 'Dialog' and 'Drawer', so a button anywhere on the page can open the popover with no script. **Opening moves focus into the panel**, to the first control in it, or to the panel itself where it holds none, and closing from inside gives it back to the trigger. It closes on Escape, on a press outside it, and when focus moves out of the trigger and the panel to somewhere else on the page. 'modal' keeps 'Tab' inside the panel while it is open and says so with 'aria-modal', for a panel that has to be answered before the page goes on. Without it the popover does not trap focus. The panel's name is 'label' when you set it. Otherwise it is the first heading in the panel, or the elements an 'aria-labelledby' on the host names. 'arrow' draws a point on the panel's edge facing the trigger. The side the panel landed on is on the host as ':state(placed-top)' and its kin, and the trigger's width is on the panel as '--floating-anchor-inline-size', for a panel as wide as its trigger: '''css helix-popover::part(popover) { min-inline-size: var(--floating-anchor-inline-size); } ''' */
13477
14553
  "helix-headless-popover": DefineCustomElement<
13478
14554
  HelixHeadlessPopover,
13479
14555
  HelixHeadlessPopoverVueProps,
@@ -13485,7 +14561,7 @@ export interface WcToolkitVueGlobalComponents {
13485
14561
  HelixHeadlessProgressVueProps,
13486
14562
  HelixHeadlessProgressVueEvents
13487
14563
  >;
13488
- /** 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 the name to what the code is for. When you pass no name, the value is the name. Most codes hold a URL, and a URL read aloud gives the destination. 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, and the element fires 'error'. */
14564
+ /** 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 the name to what the code is for. When you pass no name, the value is the name. Most codes hold a URL, and a URL read aloud gives the destination. 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, and the element fires 'error'. 'toSvg()', 'toPng()' and 'download()' give the drawn code as a file of its own, in the colors it is drawn in, for a page that offers it to save or print, as Zag's download trigger does. */
13489
14565
  "helix-headless-qr-code": DefineCustomElement<
13490
14566
  HelixHeadlessQrCode,
13491
14567
  HelixHeadlessQrCodeVueProps,
@@ -13497,7 +14573,7 @@ export interface WcToolkitVueGlobalComponents {
13497
14573
  HelixHeadlessQuoteVueProps,
13498
14574
  HelixHeadlessQuoteVueEvents
13499
14575
  >;
13500
- /** The group is the form control, and the radios are its options. A set of radios submits one answer, so the group owns the 'name', the 'value', and the validity. A radio outside a group is not a control. Checkboxes work the other way: each checkbox submits its own answer. 'MixinField' applies to the group for the same reason. The label, the hint, and the message describe the question, and the question belongs to the set. Selection moves up and state moves down. A radio dispatches an event when it is chosen, the group determines whether the choice stands, and the group writes 'selected' onto every radio. The group is the one source of which radio is on. 'value' is the current answer. 'defaultValue' is what the markup declared: the value until something is chosen, and where a reset returns. The two work like 'checked' and 'defaultChecked'. */
14576
+ /** The group is the form control, and the radios are its options. A set of radios submits one answer, so the group owns the 'name', the 'value', and the validity. A radio outside a group is not a control. Checkboxes work the other way: each checkbox submits its own answer. 'MixinField' applies to the group for the same reason. The label, the hint, and the message describe the question, and the question belongs to the set. Selection moves up and state moves down. A radio dispatches an event when it is chosen, the group determines whether the choice stands, and the group writes 'selected' onto every radio. The group is the one source of which radio is on. 'value' is the current answer. 'defaultValue' is what the markup declared: the value until something is chosen, and where a reset returns. The two work like 'checked' and 'defaultChecked'. A choice sends its events in this order: 'helix-select' from the radio, then, a microtask later and only if nobody refused it, 'helix-before-change' from the group, and once the value has moved, 'input' and 'change'. The microtask is what lets a listener you add to the group after it connected refuse the 'helix-select'. A native radio sends 'input' and 'change' in the same task as the click. */
13501
14577
  "helix-headless-radio-group": DefineCustomElement<
13502
14578
  HelixHeadlessRadioGroup,
13503
14579
  HelixHeadlessRadioGroupVueProps,
@@ -13509,13 +14585,13 @@ export interface WcToolkitVueGlobalComponents {
13509
14585
  HelixHeadlessRadioVueProps,
13510
14586
  HelixHeadlessRadioVueEvents
13511
14587
  >;
13512
- /** Supports half marks, so the value is not always an integer and the press targets are not the marks: five stars at a half step give ten places to press. The pointer handling and 'step' are built around half marks. A partial mark is the full mark, clipped. The filled marks are drawn over the empty marks and cut off partway, so any mark and any fraction work. A read-only rating displays a score, which is the most common use. It is announced as a displayed value and does not look disabled. */
14588
+ /** Supports half marks, so the value is not always an integer and the press targets are not the marks: five stars at a half step give ten places to press. The pointer handling and 'step' are built around half marks. A partial mark is the full mark, clipped. The filled marks are drawn over the empty marks and cut off partway, so any mark and any fraction work. A read-only rating displays a score, which is the most common use. It is announced as a displayed value and does not look disabled. With 'clearable', pressing the chosen score again, or Backspace or Delete on the marks, takes the rating back to unrated and sends 'helix-clear'. */
13513
14589
  "helix-headless-rating": DefineCustomElement<
13514
14590
  HelixHeadlessRating,
13515
14591
  HelixHeadlessRatingVueProps,
13516
14592
  HelixHeadlessRatingVueEvents
13517
14593
  >;
13518
- /** A scatter chart shows how two measures relate. The table's first numeric column is measured across, every other numeric column is measured up, and each row is one point. A table of countries with an income column and a life expectancy column draws one point for each country. Each additional numeric column is another series, in its own color. Both axes are labeled, because both positions are values. The ticks sit at round numbers, and the range extends to them. The summary gives each series' correlation coefficient and its number of points. The table has every number, and the drawing is 'aria-hidden'. Each point is a '<span>' placed by percentage over the drawing, as 'LineChart' places its end points, so points stay round when the drawing stretches. The plot runs left to right in every text direction, as a number line does. The plot, its axes, and the axis names sit in a 'plane' part with 'dir="ltr"'. The axis names carry 'dir="auto"', so a name in Arabic or Hebrew reads in its own direction. The summary and the tooltip bubble follow the page's direction. */
14594
+ /** A scatter chart shows how two measures relate. The table's first numeric column is measured across, every other numeric column is measured up, and each row is one point. A table of countries with an income column and a life expectancy column draws one point for each country. Each additional numeric column is another series, in its own color. Both axes are labeled, because both positions are values. The ticks sit at round numbers, and the range extends to them. The summary gives each series' correlation coefficient and its number of points. The table has every number, and the drawing is hidden from screen readers. **The plot is read by key.** It takes focus, named by 'label' or the caption. The left and right arrows move from row to row in the table's order, Home and End go to the first and the last, and the up and down arrows move among the series of a row. The tooltip sits on that point, the 'live' part says the row in words, and Escape puts the tooltip away. Each point is a '<span>' placed by percentage over the drawing, as 'LineChart' places its end points, so points stay round when the drawing stretches. The plot runs left to right in every text direction, as a number line does. The plot, its axes, and the axis names sit in a 'plane' part with 'dir="ltr"'. The axis names carry 'dir="auto"', so a name in Arabic or Hebrew reads in its own direction. The summary and the tooltip bubble follow the page's direction. */
13519
14595
  "helix-headless-scatter-chart": DefineCustomElement<
13520
14596
  HelixHeadlessScatterChart,
13521
14597
  HelixHeadlessScatterChartVueProps,
@@ -13527,13 +14603,13 @@ export interface WcToolkitVueGlobalComponents {
13527
14603
  HelixHeadlessScrollAreaVueProps,
13528
14604
  HelixHeadlessScrollAreaVueEvents
13529
14605
  >;
13530
- /** 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. 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. */
14606
+ /** 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. */
13531
14607
  "helix-headless-select": DefineCustomElement<
13532
14608
  HelixHeadlessSelect,
13533
14609
  HelixHeadlessSelectVueProps,
13534
14610
  HelixHeadlessSelectVueEvents
13535
14611
  >;
13536
- /** A skeleton is hidden from screen readers unless it has a 'label'. An empty placeholder has nothing to say, and a page of them would be a page of unnamed shapes. Tell a screen reader that a region is loading on the region itself: set 'aria-busy="true"' on it while it loads, and put a 'Loader' or a status message in it. Set 'label' on one skeleton to have it read out by name, such as "Loading profile", when a reader reaches it. The role and the name are set through 'ElementInternals', which writes no attributes. There is no 'shape' property. Whether a placeholder is a line, a block, or a circle is presentation, which belongs to the styled tier. */
14612
+ /** A skeleton is hidden from screen readers unless it has a 'label'. An empty placeholder has nothing to say, and a page of them would be a page of unnamed shapes. Tell a screen reader that a region is loading on the region itself: set 'aria-busy="true"' on it while it loads, and put a 'Loader' or a status message in it. Set 'label' on one skeleton to have it read out by name, such as "Loading profile", when a reader reaches it. The role and the name are set through 'ElementInternals', which writes no attributes. There is no 'shape' property. Whether a placeholder is a line, a block, or a circle is presentation, which belongs to the styled tier. **Put the real content inside and set 'loading', and the skeleton takes its size.** While 'loading' is set the content is inert, the host is 'aria-busy', and the styled tier hides the content and paints the placeholder over its box, so nothing moves when the content arrives. Take 'loading' off and the content is shown as it is. An empty skeleton is a placeholder of its own size, as before. */
13537
14613
  "helix-headless-skeleton": DefineCustomElement<
13538
14614
  HelixHeadlessSkeleton,
13539
14615
  HelixHeadlessSkeletonVueProps,
@@ -13545,7 +14621,7 @@ export interface WcToolkitVueGlobalComponents {
13545
14621
  HelixHeadlessSkipLinkVueProps,
13546
14622
  HelixHeadlessSkipLinkVueEvents
13547
14623
  >;
13548
- /** Renders a native '<input type="range">', so the drag, the arrow keys, Home, End, the page keys, and the touch target come from the platform. A native range has a hit area larger than its thumb, sized for a finger. The value is a string, like every other form control's, and 'MixinControllerValue' holds text. Use 'valueAsNumber' for arithmetic. Marks are drawn by the component. The ticks of a '<datalist>' cannot be styled, and Firefox does not render them for a range. Marks are decoration. 'step' sets where the value can land, and the input enforces it whether or not marks are drawn. 'markers' is a count, so a slider from zero to a hundred does not draw a hundred and one marks by accident. A range with two thumbs is two inputs stacked on one track, because there is no native two-thumb range. Each thumb keeps its own value. 'required' comes with the field mixin and cannot fail. A range is never empty: the platform shows its midpoint when no value is set, and 'willUpdate' seeds that midpoint into 'defaultValue', so the value matches the handle from the first render. HTML does not apply 'required' to a range either, so it is not set on the input. It only adds the marker beside the label. */
14624
+ /** Renders a native '<input type="range">', so the drag, the arrow keys, Home, End, the page keys, and the touch target come from the platform. A native range has a hit area larger than its thumb, sized for a finger. The value is a string, like every other form control's, and 'MixinControllerValue' holds text. Use 'valueAsNumber' for arithmetic. Marks are drawn by the component. The ticks of a '<datalist>' cannot be styled, and Firefox does not render them for a range. Marks are decoration. 'step' sets where the value can land, and the input enforces it whether or not marks are drawn. 'markers' is a count, so a slider from zero to a hundred does not draw a hundred and one marks by accident. A range with two thumbs is two inputs stacked on one track, because there is no native two-thumb range. Each thumb keeps its own value. 'min-steps-between-thumbs' keeps them that many steps apart. 'format-options' writes the value with 'Intl.NumberFormat' in 'locale', as a currency, a percent or a unit, and 'formatter' writes it with a function of your own, such as words for a scale. Either one is what a screen reader hears, what the readout shows and what the marker labels say. 'value-text' still wraps it in a sentence, with the formatted value in its place. 'required' comes with the field mixin and cannot fail. A range is never empty: the platform shows its midpoint when no value is set, and 'willUpdate' seeds that midpoint into 'defaultValue', so the value matches the handle from the first render. HTML does not apply 'required' to a range either, so it is not set on the input. It only adds the marker beside the label. */
13549
14625
  "helix-headless-slider": DefineCustomElement<
13550
14626
  HelixHeadlessSlider,
13551
14627
  HelixHeadlessSliderVueProps,
@@ -13647,25 +14723,31 @@ export interface WcToolkitVueGlobalComponents {
13647
14723
  HelixHeadlessTabVueProps,
13648
14724
  HelixHeadlessTabVueEvents
13649
14725
  >;
13650
- /** A label that people can optionally remove. 'dismissible' is the difference from a badge: a badge shows a state that people cannot change, and a tag names something they can remove. The remove button sends 'helix-dismiss'. The tag does not remove itself, because your code owns the list it is in, so remove it in your handler. A listener can cancel 'helix-dismiss', and 'dismiss()' then returns 'false'. When the handler removes a tag whose remove button has focus, focus moves to the next tag's remove button, or to the previous one's after the last tag. The remove button is named for its tag, such as "Remove Apple", so a list of buttons says which tag each one removes. Write '{label}' in 'dismiss-label' to put the tag's words somewhere else, such as 'dismiss-label="{label} entfernen"'. */
14726
+ /** A part of 'Tag' that holds tags as one control: a grid of rows, one tab stop for the whole set. The arrow keys move between tags, Home and End go to the first and the last, and a typed letter goes to the next tag starting with it. Delete or Backspace removes the focused tag where it is 'dismissible', by sending its 'helix-dismiss': remove it from your list in the handler, and focus moves to the next tag, or the previous one after the last. 'selection-mode' lets a reader select tags, with Space, Enter or a press: 'single' selects one at a time and 'multiple' any number. 'value' holds the selected tags' values, separated by commas, and a change asks with 'helix-before-change' and tells with 'change'. Enter on a tag with an 'href' follows its link. A 'disabled' tag is passed over. Name the set with 'label'. */
14727
+ "helix-headless-tag-group": DefineCustomElement<
14728
+ HelixHeadlessTagGroup,
14729
+ HelixHeadlessTagGroupVueProps,
14730
+ HelixHeadlessTagGroupVueEvents
14731
+ >;
14732
+ /** A label that people can optionally remove. 'dismissible' is the difference from a badge: a badge shows a state that people cannot change, and a tag names something they can remove. The remove button sends 'helix-dismiss'. The tag does not remove itself, because your code owns the list it is in, so remove it in your handler. A listener can cancel 'helix-dismiss', and 'dismiss()' then returns 'false'. When the handler removes a tag whose remove button has focus, focus moves to the next tag's remove button, or to the previous one's after the last tag. The remove button is named for its tag, such as "Remove Apple", so a list of buttons says which tag each one removes. Write '{label}' in 'dismiss-label' to put the tag's words somewhere else, such as 'dismiss-label="{label} entfernen"'. 'href' makes the label a link, and 'disabled' takes the tag out of reach: its link and its remove button stop answering. **In a 'Tag.Group' a tag is a row of a grid.** The group gives it its role, its place in the one tab stop and, where the group selects, whether it is selected. Its remove button leaves the tab order there, Delete and Backspace doing its job from the row. */
13651
14733
  "helix-headless-tag": DefineCustomElement<
13652
14734
  HelixHeadlessTag,
13653
14735
  HelixHeadlessTagVueProps,
13654
14736
  HelixHeadlessTagVueEvents
13655
14737
  >;
13656
- /** Renders a '<textarea>', so the caret, selection, spellcheck, resize handle, and phone keyboard come from the platform. It is in the server markup, so the field works before any script loads. It is a separate element from 'Input' because Enter inserts a line break here. In a single-line field, Enter submits the form. 'rows' sets the starting height, and 'auto-grow' makes the field grow with its content. You can use both: 'rows' sets where an empty field begins. */
14738
+ /** Renders a '<textarea>', so the caret, selection, spellcheck, resize handle, and phone keyboard come from the platform. It is in the server markup, so the field works before any script loads. It is a separate element from 'Input' because Enter inserts a line break here. In a single-line field, Enter submits the form. 'rows' sets the starting height, and 'auto-grow' makes the field grow with its content. You can use both: 'rows' sets where an empty field begins. 'max-rows' stops the growth at that many lines, and the field scrolls past them. */
13657
14739
  "helix-headless-textarea": DefineCustomElement<
13658
14740
  HelixHeadlessTextarea,
13659
14741
  HelixHeadlessTextareaVueProps,
13660
14742
  HelixHeadlessTextareaVueEvents
13661
14743
  >;
13662
- /** The list is a 'TimePicker', which you can also use on its own, for example in a settings pane. This element adds the field, the overlay, and the form association, the same arrangement Date Input has with 'DatePicker' and Color Input has with 'ColorPicker'. You can type a time or pick one. The list offers times at a step, and the field lets you enter any time, such as '09:07'. The value is always 'HH:mm' on a 24-hour clock, because that is what the form submits, what 'min' and 'max' compare against, and what sorts correctly as a string. While idle, the field shows the time in the user's locale format. Once the caret is in the field, it shows the value itself, because a formatted time such as '2:30 PM' cannot be typed back and 'Intl' has no parser for it. Typing sends 'input' on each keystroke and 'change' when you leave the field. In the list, the arrow keys, typed digits and PageUp and PageDown move through the times, and Enter, Space or a click chooses one and closes the panel. With 'variant="wheels"' each wheel moves the time as you turn it, the panel stays open, and Enter or Escape closes it. */
14744
+ /** The list is a 'TimePicker', which you can also use on its own, for example in a settings pane. This element adds the field, the overlay, and the form association, the same arrangement Date Input has with 'DatePicker' and Color Input has with 'ColorPicker'. You can type a time or pick one. The list offers times at a step, and the field lets you enter any time, such as '09:07'. The value is always 'HH:mm' on a 24-hour clock, or 'HH:mm:ss' with 'seconds', because that is what the form submits, what 'min' and 'max' compare against, and what sorts correctly as a string. While idle, the field shows the time in the user's locale format. Once the caret is in the field, it shows the value itself, because a formatted time such as '2:30 PM' cannot be typed back and 'Intl' has no parser for it. Typing sends 'input' on each keystroke and 'change' when you leave the field. The trigger and ArrowDown open the list, and so does a press into the field; Tab into the field opens nothing. In the list, the arrow keys, typed digits and PageUp and PageDown move through the times, and Enter, Space or a click chooses one and closes the panel. With 'variant="wheels"' each wheel moves the time as you turn it, the panel stays open, and Enter or Escape closes it. With 'segmented', the field is a row of segments in place of the text: an hour, a minute, and AM or PM where the clock has them, each set with digits or the arrow keys. Alt+Down opens the list from a segment. */
13663
14745
  "helix-headless-time-input": DefineCustomElement<
13664
14746
  HelixHeadlessTimeInput,
13665
14747
  HelixHeadlessTimeInputVueProps,
13666
14748
  HelixHeadlessTimeInputVueEvents
13667
14749
  >;
13668
- /** Shows the times at each 'step' as a 'Listbox', which provides the keyboard behavior, typeahead, scrolling into view, and announcements for a set of options. 'variant="wheels"' shows a column each for the hour, the minute, and the meridiem. The step keeps the list usable. At the default of 15 minutes a day is 96 rows, which people can scroll or type into. At 1 minute it is 1,440. Use the list for the times your product offers, and Time Input for any time, the same way Date Input separates typing a date from picking one on the calendar. The value is always 'HH:mm' on a 24-hour clock. A form submits that shape, 'min' and 'max' compare against it, and it sorts as a string. Each row's text follows the person's own conventions, from 'Intl'. The chosen row is marked in the served markup. The listbox gets the answer as '.value', and Lit SSR serializes no property binding, so without more the 96 served rows would carry no mark until the listbox upgrades and runs 'place'. Each option also gets 'selected', an attribute binding that does serialize, and 'place' then writes the same answer from the same value. This is the same 'selected' you write on 'Option' elsewhere in Helix, and Date Picker marks its choice in markup for the same reason. The list and the wheels both do this, because each wheel is also a listbox. */
14750
+ /** Shows the times at each 'step' as a 'Listbox', which provides the keyboard behavior, typeahead, scrolling into view, and announcements for a set of options. 'variant="wheels"' shows a column each for the hour, the minute, and the meridiem, and one for the second with 'seconds'. Left and Right move between the wheels, and Tab does too. 'hour-cycle' writes every time on a twelve or a twenty-four hour clock whatever the locale, and 'seconds' holds times to the second. The step keeps the list usable. At the default of 15 minutes a day is 96 rows, which people can scroll or type into. At 1 minute it is 1,440. Use the list for the times your product offers, and Time Input for any time, the same way Date Input separates typing a date from picking one on the calendar. The value is always 'HH:mm' on a 24-hour clock, or 'HH:mm:ss' with 'seconds'. A form submits that shape, 'min' and 'max' compare against it, and it sorts as a string. Each row's text follows the person's own conventions, from 'Intl'. The chosen row is marked in the served markup. The listbox gets the answer as '.value', and Lit SSR serializes no property binding, so without more the 96 served rows would carry no mark until the listbox upgrades and runs 'place'. Each option also gets 'selected', an attribute binding that does serialize, and 'place' then writes the same answer from the same value. This is the same 'selected' you write on 'Option' elsewhere in Helix, and Date Picker marks its choice in markup for the same reason. The list and the wheels both do this, because each wheel is also a listbox. */
13669
14751
  "helix-headless-time-picker": DefineCustomElement<
13670
14752
  HelixHeadlessTimePicker,
13671
14753
  HelixHeadlessTimePickerVueProps,
@@ -13683,25 +14765,25 @@ export interface WcToolkitVueGlobalComponents {
13683
14765
  HelixHeadlessTimelineVueProps,
13684
14766
  HelixHeadlessTimelineVueEvents
13685
14767
  >;
13686
- /** 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. **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. */
14768
+ /** 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. A 'danger' message is its own assertive live region, so it is announced at once; every other one is announced politely by the region. 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. */
13687
14769
  "helix-headless-toast-item": DefineCustomElement<
13688
14770
  HelixHeadlessToastItem,
13689
14771
  HelixHeadlessToastItemVueProps,
13690
14772
  HelixHeadlessToastItemVueEvents
13691
14773
  >;
13692
- /** The region and its items are one family because a live region must be in the document before a message is added to it. Assistive technology often does not announce a region that arrives already holding its message. 'Radio.Group' is part of its family for the same reason. **The region is polite, never assertive.** 'role="alert"' interrupts whatever a screen reader is reading. For something that cannot wait, use a 'Dialog', which stops the page for every user. **The region never creates or removes items.** You render items and remove them. An item requests closing with a cancelable 'helix-dismiss' event. A dismissed item hides itself and stays in the DOM, so your framework's state and the DOM stay in sync. It hides on its own unless you set 'open', which makes the state yours. There is no 'toast.show()'. For a 'toast()' function, write a small one over your app's state, which also lets you render the same messages on the server, in a test, or more than once. **The stack is in the top layer.** The 'region' part is a 'popover="manual"' shown while a message is showing, and shown again above a modal dialog that opened after it. Position the 'region' part, which is the box in the top layer. While a modal 'Dialog', 'Drawer' or 'Lightbox' is open, the browser makes everything outside it inert, the stack included, so a message stays visible and its actions cannot be pressed. Where the browser has 'ariaNotify', a message that arrives then is announced through it. For a message with an action, render a second region inside the dialog. When a message with focus inside it is dismissed, focus moves to the next message, then the one before it, then back to where it was before it entered the stack. */
14774
+ /** The region and its items are one family because a live region must be in the document before a message is added to it. Assistive technology often does not announce a region that arrives already holding its message. 'Radio.Group' is part of its family for the same reason. **The region is a landmark named by 'label', and a polite live region.** A 'danger' message is announced assertively, and every other one politely. Each message is an 'alertdialog' named by its words, so a reader who moves into the stack hears which message they are on. **'hotkey' takes focus to the stack and back**, F8 unless you set it, and 'label' says which key: '{hotkey}' in it is filled in, so the default name is "Notifications (F8)". Pressed while focus is in the stack, it gives focus back to where it was. **The region never creates or removes items.** You render items and remove them. An item requests closing with a cancelable 'helix-dismiss' event. A dismissed item hides itself and stays in the DOM, so your framework's state and the DOM stay in sync. It hides on its own unless you set 'open', which makes the state yours. **'add()' shows a message from script**, for a page with no framework state to render them from: it appends a message of the region's own tier and removes it once it has been dismissed and has finished leaving. Messages you render yourself stay yours, and the region never removes them. A touch or a pen swipes a message away toward the end of the line. **The stack is in the top layer.** The 'region' part is a 'popover="manual"' shown while a message is showing, and shown again above a modal dialog that opened after it. Position the 'region' part, which is the box in the top layer. While a modal 'Dialog', 'Drawer' or 'Lightbox' is open, the browser makes everything outside it inert, the stack included, so a message stays visible and its actions cannot be pressed. Where the browser has 'ariaNotify', a message that arrives then is announced through it. For a message with an action, render a second region inside the dialog. When a message with focus inside it is dismissed, focus moves to the next message, then the one before it, then back to where it was before it entered the stack. */
13693
14775
  "helix-headless-toast": DefineCustomElement<
13694
14776
  HelixHeadlessToast,
13695
14777
  HelixHeadlessToastVueProps,
13696
14778
  HelixHeadlessToastVueEvents
13697
14779
  >;
13698
- /** The indicator is one element that moves to the selected item. A single moving object is easier to follow than a fill that swaps, and it shows where the selection came from. Its size and position are measured from the selected item and written to the indicator as custom properties, because labels have different lengths. Measurement happens on the client, so the server renders the indicator hidden and it fades in once measured. */
14780
+ /** The indicator is one element that moves to the selected item. A single moving object is easier to follow than a fill that swaps, and it shows where the selection came from. Its size and position are measured from the selected item and written to the indicator as custom properties, because labels have different lengths. Measurement happens on the client, so the server renders the indicator hidden and it fades in once measured. 'selection-mode="multiple"' makes the group a toolbar of buttons that each say whether they are pressed with 'aria-pressed', as React Aria's ToggleButtonGroup and Radix's ToggleGroup do. A press presses or releases one item, the arrow keys move focus without pressing, and 'value' is the pressed values, comma separated, which 'values' also gives as a list. The form receives one entry per pressed value. The indicator stays hidden, and each pressed item is marked with ':state(pressed)'. 'orientation="vertical"' runs the items down a column, says so to the accessibility tree, and the up and down arrows move between them. */
13699
14781
  "helix-headless-toggle-group": DefineCustomElement<
13700
14782
  HelixHeadlessToggleGroup,
13701
14783
  HelixHeadlessToggleGroupVueProps,
13702
14784
  HelixHeadlessToggleGroupVueEvents
13703
14785
  >;
13704
- /** Renders a '<button role="radio">' for use as a form control. Do not use it for navigation. For navigation, use links marked with 'aria-current' and styled by the 'data-navigation-item' recipe in the base layer. The recipe has the same look, and links are not announced as choices. */
14786
+ /** Renders a '<button role="radio">' for use as a form control. In a group with 'selection-mode="multiple"' it is a '<button>' that says whether it is pressed with 'aria-pressed'. Do not use it for navigation. For navigation, use links marked with 'aria-current' and styled by the 'data-navigation-item' recipe in the base layer. The recipe has the same look, and links are not announced as choices. */
13705
14787
  "helix-headless-toggle": DefineCustomElement<
13706
14788
  HelixHeadlessToggle,
13707
14789
  HelixHeadlessToggleVueProps,
@@ -13713,19 +14795,19 @@ export interface WcToolkitVueGlobalComponents {
13713
14795
  HelixHeadlessToolbarVueProps,
13714
14796
  HelixHeadlessToolbarVueEvents
13715
14797
  >;
13716
- /** The trigger is slotted and stays your own element. The bubble renders in the top layer through the popover API, so an ancestor with 'overflow: hidden' does not clip it and no 'z-index' is needed. 'FloatingController' positions it and flips it to another side when the preferred side does not fit. Wrapping the trigger is the convenient form. Use it where the trigger already has an accessible name, because the tooltip cannot describe a slotted trigger: an IDREF cannot cross a shadow boundary. To add a description, place the tooltip beside the trigger and name the trigger with 'for': '''html <helix-headless-button id="save" aria-describedby="save-tip">Save</helix-headless-button> <helix-headless-tooltip id="save-tip" for="save" content="Save your work"></helix-headless-tooltip> ''' Write the 'aria-describedby' yourself, pointing at the tooltip host. Setting it at runtime causes a hydration mismatch that React does not fix. With 'for', the tooltip warns once on first open if the attribute is missing. The tooltip shows on hover and on focus. It hides on pointer leave, on blur, on Escape, and when the trigger is activated. The pointer can move from the trigger onto the bubble and the bubble stays. Once one tooltip is showing, moving to another trigger shows its tooltip with no 'delay', and the first one hides. The same holds for 300 milliseconds after a tooltip hides. */
14798
+ /** The trigger is slotted and stays your own element. The bubble renders in the top layer through the popover API, so an ancestor with 'overflow: hidden' does not clip it and no 'z-index' is needed. 'FloatingController' positions it and flips it to another side when the preferred side does not fit. **The tooltip describes its trigger itself, in both forms.** Wrap the trigger, or place the tooltip beside it and name the trigger with 'for': '''html <helix-headless-button id="save">Save</helix-headless-button> <helix-headless-tooltip for="save" content="Save your work"></helix-headless-tooltip> ''' The link is an element reference on the control that takes focus, and it is never written into your markup before a reader has acted. A trigger that is a Helix component is described at once, inside its own shadow root. A plain element in your markup is described when a reader first points at it or focuses it, which is after any hydration, and only where you have written no 'aria-describedby' or 'aria-labelledby' of your own. Write 'aria-describedby' pointing at the tooltip yourself to have the link in the server's markup. Where the browser has no element references, write it yourself; the tooltip warns once on first open if nothing links the two. The tooltip shows on hover and on focus. It hides on pointer leave, on blur, on Escape, and when the trigger is activated. The pointer can move from the trigger onto the bubble and the bubble stays. Once one tooltip is showing, moving to another trigger shows its tooltip with no 'delay', and the first one hides. The same holds for 'skip-delay' milliseconds after a tooltip hides, 300 unless you set it. 'show-on="focus"' shows the tooltip on keyboard focus only, for a hint a pointer does not need. */
13717
14799
  "helix-headless-tooltip": DefineCustomElement<
13718
14800
  HelixHeadlessTooltip,
13719
14801
  HelixHeadlessTooltipVueProps,
13720
14802
  HelixHeadlessTooltipVueEvents
13721
14803
  >;
13722
- /** The root holds the order of the stops: which stop is current, what Next and Back do, and when the tour is finished. Each stop holds its target, and you write all the text. **The spotlight is a shadow.** The scrim is a box the size of the current target with a very large 'box-shadow' spread, and the shadow paints the darkness. A 'clip-path' on a full-screen scrim breaks as soon as an element between the scrim and the viewport is transformed. The root measures the target's position in the browser. Nothing is measured on the server, because a tour starts only on request. 'open', 'default-open', 'helix-before-open', 'helix-before-close' and 'toggle' work as they do on 'Dialog'. Setting 'open' starts the run, and 'skip()' and 'requestOpen(false)' end it early. **Focus follows the run.** Opening moves focus to the first stop's panel, and moving on from a control in a stop moves it to the next one. Ending the tour puts focus back on the element that had it when the tour opened, unless you have moved it somewhere else on the page. A stop does not trap focus, so you can still 'Tab' out to the element it describes. */
14804
+ /** The root holds the order of the stops: which stop is current, what Next and Back do, and when the tour is finished. Each stop holds its target, and you write all the text. **The spotlight is a shadow.** The scrim is a box the size of the current target with a very large 'box-shadow' spread, and the shadow paints the darkness. A 'clip-path' on a full-screen scrim breaks as soon as an element between the scrim and the viewport is transformed. The root measures the target's position in the browser. Nothing is measured on the server, because a tour starts only on request. 'open', 'default-open', 'helix-before-open', 'helix-before-close' and 'toggle' work as they do on 'Dialog'. Setting 'open' starts the run, and 'skip()' and 'requestOpen(false)' end it early. Each stop is told its place in the run, from 'progress-label', such as "2 of 5". It describes the stop's panel, so a screen reader says it at every stop, and 'progress' draws it in the panel as well. A dialog or a floating stop, which has nothing to light, is shown over the 'backdrop' part. At a 'wait' stop the run waits for that stop's target to be on the page, and moves on by itself. **Focus follows the run.** Opening moves focus to the first stop's panel, and moving on from a control in a stop moves it to the next one. Ending the tour puts focus back on the element that had it when the tour opened, unless you have moved it somewhere else on the page. A stop does not trap focus, so you can still 'Tab' out to the element it describes. */
13723
14805
  "helix-headless-tour": DefineCustomElement<
13724
14806
  HelixHeadlessTour,
13725
14807
  HelixHeadlessTourVueProps,
13726
14808
  HelixHeadlessTourVueEvents
13727
14809
  >;
13728
- /** A stop names its target with 'for' and holds the content you put in it. The stop handles three things: - **Placement.** The panel is anchored to the target by the same floating positioning as the other Helix overlays. - **Stacking.** The panel is a popover, so it is in the top layer and shows above dialogs, scrolling regions, and other stacking contexts. - **Visibility.** The stop shows when it is 'current', which the root sets. Put any content in the stop, such as a 'Card', or a heading and a line of text. There are no fixed title or body parts. **The buttons are slot fallback.** With nothing in the 'actions' slot, you get Back, Next, and Skip, already wired. Slot your own 'actions' and drive them with 'next()', 'back()', and 'skip()' on the root. **'for' is an id, as with 'Tooltip'**, so you can point at a target elsewhere on the page from markup. It resolves against the stop's root node, so a stop inside a shadow tree points at a target in that tree. The panel is a 'group', named by the first heading in the stop's content, and only while the stop is shown. 'focus()' moves focus to the panel, which is what the tour does when it opens or moves on. */
14810
+ /** A stop names its target with 'for' and holds the content you put in it. The stop handles three things: - **Placement.** The panel is anchored to the target by the same floating positioning as the other Helix overlays. - **Stacking.** The panel is a popover, so it is in the top layer and shows above dialogs, scrolling regions, and other stacking contexts. - **Visibility.** The stop shows when it is 'current', which the root sets. Put any content in the stop, such as a 'Card', or a heading and a line of text. The 'heading' and 'description' slots are optional places for the title and the line under it, which then name and describe the panel. **A stop has a type.** Without one it is a bubble pointing at its target. 'type="dialog"' is a panel in the middle of the window, over a backdrop, for a welcome or a summary with nothing to point at. 'type="floating"' is a panel in a corner of the window, which the styled tier puts at the end of the line, for a note that points at nothing in particular. 'type="wait"' shows nothing: the tour waits for the element 'for' names to be on the page, such as a menu the reader has to open, and moves on by itself. **The buttons are slot fallback.** With nothing in the 'actions' slot, you get Back, Next, and Skip, already wired. Slot your own 'actions' and drive them with 'next()', 'back()', and 'skip()' on the root. **'for' is an id, as with 'Tooltip'**, so you can point at a target elsewhere on the page from markup. It resolves against the stop's root node, so a stop inside a shadow tree points at a target in that tree. The panel is a 'group', and a 'dialog' for a dialog stop, only while the stop is shown. It is named by the 'heading' slot, then by the first heading in the content, then by 'label', and otherwise by its place in the tour. It is described by the 'description' slot and by its place, such as "2 of 5", so a screen reader says where the reader is at every stop. 'focus()' moves focus to the panel, which is what the tour does when it opens or moves on. */
13729
14811
  "helix-headless-tour-stop": DefineCustomElement<
13730
14812
  HelixHeadlessTourStop,
13731
14813
  HelixHeadlessTourStopVueProps,