@fusion.dev/helix-headless 0.159.0 → 0.161.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 (61) hide show
  1. package/custom-elements.json +2980 -189
  2. package/dist/canvas/root/canvas-root.d.ts +59 -2
  3. package/dist/canvas/root/canvas-root.js +123 -8
  4. package/dist/chat/message/chat-message.d.ts +8 -0
  5. package/dist/chat/message/chat-message.js +11 -0
  6. package/dist/chat/root/chat-root.d.ts +47 -1
  7. package/dist/chat/root/chat-root.js +130 -4
  8. package/dist/code-block/lines.d.ts +12 -0
  9. package/dist/code-block/lines.js +41 -0
  10. package/dist/code-block/root/code-block-root.d.ts +88 -5
  11. package/dist/code-block/root/code-block-root.js +154 -10
  12. package/dist/date-input/root/date-input-root.d.ts +108 -19
  13. package/dist/date-input/root/date-input-root.js +112 -13
  14. package/dist/date-picker/root/date-picker-root.d.ts +81 -16
  15. package/dist/date-picker/root/date-picker-root.js +140 -36
  16. package/dist/element-events.generated.js +6 -0
  17. package/dist/format-date/fields.js +1 -0
  18. package/dist/format-date/options.d.ts +3 -1
  19. package/dist/format-date/options.js +4 -1
  20. package/dist/format-date/root/format-date-root.d.ts +27 -11
  21. package/dist/format-date/root/format-date-root.js +6 -0
  22. package/dist/listbox/root/listbox-root.js +5 -0
  23. package/dist/notifications/notification/notification.d.ts +1 -0
  24. package/dist/notifications/notification/notification.js +2 -1
  25. package/dist/slider/root/slider-root.d.ts +54 -3
  26. package/dist/slider/root/slider-root.js +124 -2
  27. package/dist/splitter/root/splitter-root.d.ts +15 -0
  28. package/dist/splitter/root/splitter-root.js +16 -2
  29. package/dist/table/grid-controller.d.ts +7 -1
  30. package/dist/table/grid-controller.js +9 -1
  31. package/dist/table/root/table-root.d.ts +122 -0
  32. package/dist/table/root/table-root.js +293 -17
  33. package/dist/table/row/table-row.d.ts +41 -0
  34. package/dist/table/row/table-row.js +56 -2
  35. package/dist/time-input/root/time-input-root.d.ts +55 -7
  36. package/dist/time-input/root/time-input-root.js +70 -10
  37. package/dist/time-picker/root/time-picker-root.d.ts +27 -5
  38. package/dist/time-picker/root/time-picker-root.js +52 -13
  39. package/dist/timeline/item/timeline-item.d.ts +47 -10
  40. package/dist/timeline/item/timeline-item.js +36 -4
  41. package/dist/toggle/group/toggle-group.d.ts +18 -1
  42. package/dist/toggle/group/toggle-group.js +8 -2
  43. package/dist/toggle/root/toggle-root.d.ts +2 -2
  44. package/dist/toggle/root/toggle-root.js +2 -1
  45. package/dist/video-playlist/item/video-playlist-item.d.ts +11 -0
  46. package/dist/video-playlist/item/video-playlist-item.js +5 -0
  47. package/dist/video-playlist/menu/video-playlist-menu.d.ts +6 -0
  48. package/dist/video-playlist/menu/video-playlist-menu.js +11 -0
  49. package/dist/video-playlist/root/video-playlist-root.d.ts +59 -5
  50. package/dist/video-playlist/root/video-playlist-root.js +82 -10
  51. package/dist/virtual-list/fill.d.ts +6 -1
  52. package/dist/virtual-list/fill.js +1 -1
  53. package/dist/virtual-list/keys.d.ts +8 -0
  54. package/dist/virtual-list/keys.js +20 -0
  55. package/dist/virtual-list/root/virtual-list-root.d.ts +98 -13
  56. package/dist/virtual-list/root/virtual-list-root.js +195 -20
  57. package/lint.json +1 -1
  58. package/package.json +5 -5
  59. package/types/jsx.d.ts +1596 -224
  60. package/types/vue.d.ts +404 -49
  61. package/types/words.d.ts +151 -0
package/types/vue.d.ts CHANGED
@@ -199,6 +199,7 @@ import type {
199
199
  HelixHistoryEvent,
200
200
  HelixPinEvent,
201
201
  HelixBeforeToggleEvent,
202
+ HelixToggleEvent,
202
203
  HelixCopyEvent,
203
204
  HelixSampleEndEvent,
204
205
  HelixSampleStartEvent,
@@ -215,6 +216,7 @@ import type {
215
216
  HelixSelectedEvent,
216
217
  HelixSortEvent,
217
218
  HelixSortedEvent,
219
+ HelixClearEvent,
218
220
  HelixRejectEvent,
219
221
  HelixFacetEvent,
220
222
  HelixBeforeActivateEvent,
@@ -226,7 +228,6 @@ import type {
226
228
  HelixGraphSignalEvent,
227
229
  HelixGraphZoomEvent,
228
230
  HelixResizeEvent,
229
- HelixClearEvent,
230
231
  HelixShortcutEvent,
231
232
  HelixActionEvent,
232
233
  HelixMapPartChangeEvent,
@@ -236,7 +237,6 @@ import type {
236
237
  HelixMapRotateEvent,
237
238
  HelixMapTiltEvent,
238
239
  HelixMapZoomEvent,
239
- HelixToggleEvent,
240
240
  HelixBandEvent,
241
241
  HelixReadEvent,
242
242
  HelixCompleteEvent,
@@ -1826,6 +1826,10 @@ what the controls drive rather than the mechanism. */
1826
1826
  /** The name of the group of controls, read by screen readers, which names
1827
1827
  what the controls drive rather than the mechanism. */
1828
1828
  controlsLabel?: (HelixHeadlessCanvas["controlsLabel"]) | undefined;
1829
+ /** What screen readers hear after a copy, with `{count}` for the cards copied. */
1830
+ "copied-label"?: (HelixHeadlessCanvas["copiedLabel"]) | undefined;
1831
+ /** What screen readers hear after a copy, with `{count}` for the cards copied. */
1832
+ copiedLabel?: (HelixHeadlessCanvas["copiedLabel"]) | undefined;
1829
1833
  /** The board's name where `label` is empty. */
1830
1834
  "fallback-label"?: (HelixHeadlessCanvas["fallbackLabel"]) | undefined;
1831
1835
  /** The board's name where `label` is empty. */
@@ -1913,6 +1917,10 @@ walk the cards. */
1913
1917
  /** The text announced when a connection's end is picked up, with `{from}` and
1914
1918
  `{to}`. */
1915
1919
  reconnectingLabel?: (HelixHeadlessCanvas["reconnectingLabel"]) | undefined;
1920
+ /** What screen readers hear after a move or a resize is made again. */
1921
+ "redone-label"?: (HelixHeadlessCanvas["redoneLabel"]) | undefined;
1922
+ /** What screen readers hear after a move or a resize is made again. */
1923
+ redoneLabel?: (HelixHeadlessCanvas["redoneLabel"]) | undefined;
1916
1924
  /** What screen readers hear after a key resizes a card, with `{name}` for the
1917
1925
  card and `{width}` and `{height}` for its new size, in the document's
1918
1926
  units. */
@@ -2015,6 +2023,10 @@ told the same. A tone left out is not read. */
2015
2023
  "two-finger-hint-label"?: (HelixHeadlessCanvas["twoFingerHintLabel"]) | undefined;
2016
2024
  /** The hint shown when one finger swipes over the board with `gestures="cooperative"`. */
2017
2025
  twoFingerHintLabel?: (HelixHeadlessCanvas["twoFingerHintLabel"]) | undefined;
2026
+ /** What screen readers hear after a move or a resize is undone. */
2027
+ "undone-label"?: (HelixHeadlessCanvas["undoneLabel"]) | undefined;
2028
+ /** What screen readers hear after a move or a resize is undone. */
2029
+ undoneLabel?: (HelixHeadlessCanvas["undoneLabel"]) | undefined;
2018
2030
  /** The line shown while the board, with `gestures="activate"`, has the gestures. */
2019
2031
  "using-label"?: (HelixHeadlessCanvas["usingLabel"]) | undefined;
2020
2032
  /** The line shown while the board, with `gestures="activate"`, has the gestures. */
@@ -2798,6 +2810,10 @@ is the way back, and that is a part inside the shadow tree where a
2798
2810
  stylesheet can already reach it. Measured rather than assumed: `label,
2799
2811
  pinned` after upgrade against `label` from the server. */
2800
2812
  pinned?: (HelixHeadlessChat["pinned"]) | undefined;
2813
+ /** The words on the button that returns to the newest turn, where `resume` is empty. */
2814
+ "resume-label"?: (HelixHeadlessChat["resumeLabel"]) | undefined;
2815
+ /** The words on the button that returns to the newest turn, where `resume` is empty. */
2816
+ resumeLabel?: (HelixHeadlessChat["resumeLabel"]) | undefined;
2801
2817
  /** How near the bottom still counts as being at it, in pixels.
2802
2818
 
2803
2819
  A hook rather than a constant, because the right number depends on how tall
@@ -3117,6 +3133,18 @@ export type HelixHeadlessCheckboxVueEvents = {
3117
3133
  input: HelixHeadlessCheckboxElementEvent;
3118
3134
  };
3119
3135
 
3136
+ /** `HelixHeadlessCodeBlock` component event */
3137
+ export type HelixHeadlessCodeBlockElementEvent<E = Event> = TypedEvent<
3138
+ HelixHeadlessCodeBlock,
3139
+ E
3140
+ >;
3141
+ /** `helix-before-toggle` event type */
3142
+ export type HelixHeadlessCodeBlockHelixBeforeToggleElementEvent =
3143
+ HelixHeadlessCodeBlockElementEvent<HelixBeforeToggleEvent>;
3144
+ /** `helix-toggle` event type */
3145
+ export type HelixHeadlessCodeBlockHelixToggleElementEvent =
3146
+ HelixHeadlessCodeBlockElementEvent<HelixToggleEvent>;
3147
+
3120
3148
  export type HelixHeadlessCodeBlockVueProps = {
3121
3149
  /** The name of a block that scrolls, which is a tab stop while it does.
3122
3150
 
@@ -3203,6 +3231,14 @@ copy, which takes the code alone. Reflected, because the stylesheet lays
3203
3231
  the gutter out beside the code. A diff numbers its lines from its hunks
3204
3232
  whether or not this is set. */
3205
3233
  lineNumbers?: (HelixHeadlessCodeBlock["lineNumbers"]) | undefined;
3234
+ /** The lines to mark, as numbers and ranges counted from 1, such as `2, 4-6`.
3235
+ Each run is drawn as a band behind its lines. Not for a diff, which marks
3236
+ its own changes. */
3237
+ "mark-lines"?: (HelixHeadlessCodeBlock["markLines"]) | undefined;
3238
+ /** The lines to mark, as numbers and ranges counted from 1, such as `2, 4-6`.
3239
+ Each run is drawn as a band behind its lines. Not for a diff, which marks
3240
+ its own changes. */
3241
+ markLines?: (HelixHeadlessCodeBlock["markLines"]) | undefined;
3206
3242
  /** Whether to leave the copy button off.
3207
3243
 
3208
3244
  Negative, which is not a style choice. A boolean attribute is true whenever
@@ -3249,6 +3285,22 @@ Absent is unified, each removal above its replacement, which fits any
3249
3285
  width. `split` sets the old version beside the new one. Optional rather
3250
3286
  than defaulted, so the host carries no attribute the consumer did not write. */
3251
3287
  variant?: (HelixHeadlessCodeBlock["variant"]) | undefined;
3288
+ /** Whether long lines wrap. Without it they scroll.
3289
+
3290
+ Off by default, so long lines scroll, because a line break can be
3291
+ significant in code and a wrapped line reads as two. For prose-like code,
3292
+ such as a long command or a log line, a wrap reads better than a scroll.
3293
+ With `line-numbers`, each number stands beside the line it numbers
3294
+ however many rows that line takes. Reflected, because the stylesheet
3295
+ wraps the lines. */
3296
+ wrap?: (HelixHeadlessCodeBlock["wrap"]) | undefined;
3297
+ /** The wrap button's name, which it keeps whether it is pressed or not. */
3298
+ "wrap-label"?: (HelixHeadlessCodeBlock["wrapLabel"]) | undefined;
3299
+ /** The wrap button's name, which it keeps whether it is pressed or not. */
3300
+ wrapLabel?: (HelixHeadlessCodeBlock["wrapLabel"]) | undefined;
3301
+ /** Whether the header has a button that wraps the lines and unwraps them. The
3302
+ block draws a header for it even with no name. */
3303
+ wrappable?: (HelixHeadlessCodeBlock["wrappable"]) | undefined;
3252
3304
  /** Turns the code into highlighted markup, which the block draws in place of
3253
3305
  the plain text.
3254
3306
 
@@ -3273,7 +3325,12 @@ read, nor for a diff. */
3273
3325
  highlight?: (HelixHeadlessCodeBlock["highlight"]) | undefined;
3274
3326
  };
3275
3327
 
3276
- export type HelixHeadlessCodeBlockVueEvents = {};
3328
+ export type HelixHeadlessCodeBlockVueEvents = {
3329
+ /** The wrap button was pressed, with the `wrap` it asks for in `detail.checked`. Cancelable: cancel it to keep the lines as they are. */
3330
+ "helix-before-toggle": HelixHeadlessCodeBlockHelixBeforeToggleElementEvent;
3331
+ /** Fired after the wrap button changed `wrap`, with the new value in `detail.checked`. */
3332
+ "helix-toggle": HelixHeadlessCodeBlockHelixToggleElementEvent;
3333
+ };
3277
3334
 
3278
3335
  export type HelixHeadlessCodeVueProps = {};
3279
3336
 
@@ -5078,37 +5135,56 @@ export type HelixHeadlessDateInputHelixBeforeCloseElementEvent =
5078
5135
  /** `helix-before-open` event type */
5079
5136
  export type HelixHeadlessDateInputHelixBeforeOpenElementEvent =
5080
5137
  HelixHeadlessDateInputElementEvent<HelixBeforeOpenEvent>;
5138
+ /** `helix-clear` event type */
5139
+ export type HelixHeadlessDateInputHelixClearElementEvent =
5140
+ HelixHeadlessDateInputElementEvent<HelixClearEvent>;
5081
5141
  /** `toggle` event type */
5082
5142
  export type HelixHeadlessDateInputToggleElementEvent =
5083
5143
  HelixHeadlessDateInputElementEvent<ToggleEvent>;
5084
5144
 
5085
5145
  export type HelixHeadlessDateInputVueProps = {
5086
- /** What the browser may autofill here, as one of the platform's own tokens.
5146
+ /** What the browser may autofill here, as one of the platform's own tokens,
5147
+ such as `bday`.
5087
5148
 
5088
5149
  Empty leaves the attribute off, which is the browser's default and is what
5089
5150
  lets autofill work at all: hardcoding `off` here means a birthday or a
5090
- postal code can never be filled in for a reader. */
5151
+ postal code can never be filled in for a reader. With `segmented`, a
5152
+ hidden native date input carries it, since no browser fills the segments. */
5091
5153
  autocomplete?: (HelixHeadlessDateInput["autocomplete"]) | undefined;
5092
- /** The calendar the written date and the calendar's days are in: `gregory`,
5093
- `buddhist`, `japanese`, `roc`, or `iso8601`.
5094
-
5095
- Absent is the locale's own where it is one of the five, and `gregory` for
5096
- every other, as Date Picker's `calendar` is. The value is `YYYY-MM-DD` in
5097
- every calendar, and a focused field is ISO in every calendar. In
5098
- `segmented`, the segments are the Gregorian day, month, and year, in the
5099
- order the locale writes them, or ISO order for `iso8601`. */
5154
+ /** The calendar the written date, the segments, and the calendar's days are
5155
+ in: `gregory`, `buddhist`, `japanese`, `roc`, or `iso8601`, or a calendar
5156
+ with months of its own that Date Picker's `calendar` names, such as
5157
+ `persian`, `hebrew`, `islamic-umalqura`, `ethiopic`, or `chinese`.
5158
+
5159
+ Absent is the locale's own where its months are the Gregorian months, and
5160
+ `gregory` for every other, as Date Picker's `calendar` is. The value is
5161
+ `YYYY-MM-DD` in every calendar, and a focused text field is ISO in every
5162
+ calendar. In `segmented`, the segments are the day, month, and year as
5163
+ the calendar counts them, in the order the locale writes them: Mehr 14,
5164
+ 1405 is month 7 and day 14 of 1405 under `persian`. Under the five with
5165
+ Gregorian months they are the Gregorian day, month, and year, or ISO order
5166
+ for `iso8601`. */
5100
5167
  calendar?: (HelixHeadlessDateInput["calendar"]) | undefined;
5101
5168
  /** The name of the calendar's grid of days, read by screen readers. */
5102
5169
  "calendar-label"?: (HelixHeadlessDateInput["calendarLabel"]) | undefined;
5103
5170
  /** The name of the calendar's grid of days, read by screen readers. */
5104
5171
  calendarLabel?: (HelixHeadlessDateInput["calendarLabel"]) | undefined;
5172
+ /** Whether the field shows a button that empties it, as Input's `clearable`
5173
+ does. Shown only while the field holds something to clear and is neither
5174
+ disabled nor read-only. */
5175
+ clearable?: (HelixHeadlessDateInput["clearable"]) | undefined;
5176
+ /** The accessible name of the clear button, which shows only an icon. */
5177
+ "clear-label"?: (HelixHeadlessDateInput["clearLabel"]) | undefined;
5178
+ /** The accessible name of the clear button, which shows only an icon. */
5179
+ clearLabel?: (HelixHeadlessDateInput["clearLabel"]) | undefined;
5105
5180
  /** How a date is written in the field: `short` through `full`, or ISO.
5106
5181
 
5107
5182
  **The field renders when it is idle and holds the value when it is being
5108
5183
  edited.** A written date is a rendering, and a document being edited must
5109
5184
  not be a rendering of something else: `Intl.DateTimeFormat` formats and does
5110
- not parse, so `4 August 2026` cannot be typed back, and writing a parser per
5111
- locale is how a field ends up rejecting what it just displayed.
5185
+ not parse, so a rendering such as `Tuesday, August 4, 2026` is no text to
5186
+ edit. The field does read a date typed in the locale's order and digits as
5187
+ you leave it, which covers what a reader types.
5112
5188
 
5113
5189
  The way out is not to choose between the two but to separate them in time.
5114
5190
  Idle, the field shows `4 August 2026`, which is what a date is for reading.
@@ -5130,8 +5206,9 @@ submits and what `min` and `max` compare against. */
5130
5206
  **The field renders when it is idle and holds the value when it is being
5131
5207
  edited.** A written date is a rendering, and a document being edited must
5132
5208
  not be a rendering of something else: `Intl.DateTimeFormat` formats and does
5133
- not parse, so `4 August 2026` cannot be typed back, and writing a parser per
5134
- locale is how a field ends up rejecting what it just displayed.
5209
+ not parse, so a rendering such as `Tuesday, August 4, 2026` is no text to
5210
+ edit. The field does read a date typed in the locale's order and digits as
5211
+ you leave it, which covers what a reader types.
5135
5212
 
5136
5213
  The way out is not to choose between the two but to separate them in time.
5137
5214
  Idle, the field shows `4 August 2026`, which is what a date is for reading.
@@ -5269,6 +5346,14 @@ the date.
5269
5346
  **The name goes in**, so a row of them is heard as which one each
5270
5347
  removes rather than as "Remove" said once per date. */
5271
5348
  removeLabel?: (HelixHeadlessDateInput["removeLabel"]) | undefined;
5349
+ /** What a screen reader hears about the dates chosen in the calendar, with
5350
+ `{kind}`, `{start}`, `{end}` and `{count}` filled in as Date Picker's
5351
+ `selection-label` says. */
5352
+ "selection-label"?: (HelixHeadlessDateInput["selectionLabel"]) | undefined;
5353
+ /** What a screen reader hears about the dates chosen in the calendar, with
5354
+ `{kind}`, `{start}`, `{end}` and `{count}` filled in as Date Picker's
5355
+ `selection-label` says. */
5356
+ selectionLabel?: (HelixHeadlessDateInput["selectionLabel"]) | undefined;
5272
5357
  /** How far apart the selectable dates are, in days.
5273
5358
 
5274
5359
  `<input type="date" step>`'s own unit, handed to the calendar this renders
@@ -5280,6 +5365,14 @@ platform's base. */
5280
5365
  "step-mismatch-message"?: (HelixHeadlessDateInput["stepMismatchMessage"]) | undefined;
5281
5366
  /** The message shown when a date is not on `step`. */
5282
5367
  stepMismatchMessage?: (HelixHeadlessDateInput["stepMismatchMessage"]) | undefined;
5368
+ /** The time zone today is read in, such as `America/New_York`, handed to the
5369
+ calendar: the day marked today, and the month an empty field opens on.
5370
+ Empty is the reader's own. Dates are plain `YYYY-MM-DD` and carry no zone. */
5371
+ "time-zone"?: (HelixHeadlessDateInput["timeZone"]) | undefined;
5372
+ /** The time zone today is read in, such as `America/New_York`, handed to the
5373
+ calendar: the day marked today, and the month an empty field opens on.
5374
+ Empty is the reader's own. Dates are plain `YYYY-MM-DD` and carry no zone. */
5375
+ timeZone?: (HelixHeadlessDateInput["timeZone"]) | undefined;
5283
5376
  /** The name of the button that opens the calendar, read by screen readers. */
5284
5377
  "trigger-label"?: (HelixHeadlessDateInput["triggerLabel"]) | undefined;
5285
5378
  /** The name of the button that opens the calendar, read by screen readers. */
@@ -5288,6 +5381,12 @@ platform's base. */
5288
5381
  "unavailable-message"?: (HelixHeadlessDateInput["unavailableMessage"]) | undefined;
5289
5382
  /** The message shown when `disable-dates` or `disable-days` bars a date. */
5290
5383
  unavailableMessage?: (HelixHeadlessDateInput["unavailableMessage"]) | undefined;
5384
+ /** The message for text that is no date, where `bad-input-message` is not
5385
+ set. `{mode}` is `single`, `range`, or `multiple`. */
5386
+ "unreadable-message"?: (HelixHeadlessDateInput["unreadableMessage"]) | undefined;
5387
+ /** The message for text that is no date, where `bad-input-message` is not
5388
+ set. `{mode}` is `single`, `range`, or `multiple`. */
5389
+ unreadableMessage?: (HelixHeadlessDateInput["unreadableMessage"]) | undefined;
5291
5390
  /** The name of the calendar's heading where it shows a page of years, with
5292
5391
  `{heading}` filled in. */
5293
5392
  "year-view-label"?: (HelixHeadlessDateInput["yearViewLabel"]) | undefined;
@@ -5316,6 +5415,18 @@ are not, where `bad-input-message` is not set. `{kind}` is `date` or
5316
5415
  are not, where `bad-input-message` is not set. `{kind}` is `date` or
5317
5416
  `time`. */
5318
5417
  incompleteMessage?: (HelixHeadlessDateInput["incompleteMessage"]) | undefined;
5418
+ /** What a screen reader hears before the segments of a range's second date
5419
+ or time, after each segment's own name. */
5420
+ "range-end-label"?: (HelixHeadlessDateInput["rangeEndLabel"]) | undefined;
5421
+ /** What a screen reader hears before the segments of a range's second date
5422
+ or time, after each segment's own name. */
5423
+ rangeEndLabel?: (HelixHeadlessDateInput["rangeEndLabel"]) | undefined;
5424
+ /** What a screen reader hears before the segments of a range's first date
5425
+ or time, after each segment's own name: "month, Start, Stay". */
5426
+ "range-start-label"?: (HelixHeadlessDateInput["rangeStartLabel"]) | undefined;
5427
+ /** What a screen reader hears before the segments of a range's first date
5428
+ or time, after each segment's own name: "month, Start, Stay". */
5429
+ rangeStartLabel?: (HelixHeadlessDateInput["rangeStartLabel"]) | undefined;
5319
5430
  /** Whether the field is a row of segments, one for each part of the date or
5320
5431
  time, in place of a line of text.
5321
5432
 
@@ -5539,6 +5650,8 @@ export type HelixHeadlessDateInputVueEvents = {
5539
5650
  "helix-before-close": HelixHeadlessDateInputHelixBeforeCloseElementEvent;
5540
5651
  /** Fired before the calendar opens. Cancelable: call `preventDefault()` to keep it closed. */
5541
5652
  "helix-before-open": HelixHeadlessDateInputHelixBeforeOpenElementEvent;
5653
+ /** Fired after the clear button has emptied the field, after `input` and `change`. */
5654
+ "helix-clear": HelixHeadlessDateInputHelixClearElementEvent;
5542
5655
  /** Fired after the value changes. */
5543
5656
  input: HelixHeadlessDateInputElementEvent;
5544
5657
  /** Fired when the calendar opens or closes, with `newState` and `oldState`. */
@@ -5582,14 +5695,16 @@ it is one of the five, such as `buddhist` for `th-TH` or `japanese` for
5582
5695
  `ja-JP-u-ca-japanese`, and `gregory` for every other, such as `persian`
5583
5696
  for `fa-IR`.
5584
5697
 
5585
- `persian`, `hebrew`, `islamic-umalqura`, `islamic-civil`, `ethiopic`,
5586
- `coptic`, and `indian` draw a calendar with months of its own, as React
5587
- Aria's calendars do: each grid is one of that calendar's months, the
5588
- Hebrew leap month and Ethiopia's five-day thirteenth month included, and
5589
- Previous, Next and the page keys move by those months. `month` and
5698
+ `persian`, `hebrew`, `islamic`, `islamic-umalqura`, `islamic-civil`,
5699
+ `islamic-tbla`, `islamic-rgsa`, `ethiopic`, `ethioaa`, `coptic`,
5700
+ `indian`, `chinese`, and `dangi` draw a calendar with months of its own,
5701
+ as React Aria's calendars do: each grid is one of that calendar's months,
5702
+ the Hebrew and Chinese leap months and Ethiopia's five-day thirteenth
5703
+ month included, and Previous, Next and the page keys move by those
5704
+ months. With `max-view`, the months view shows that calendar's year, of
5705
+ twelve or thirteen months, and the years view its years. `month` and
5590
5706
  `helix-navigate` then name a month by its first day, `YYYY-MM-DD`. The
5591
- heading stays text, as the months and years views are drawn in Gregorian
5592
- months only. The value is `YYYY-MM-DD` in every calendar. */
5707
+ value is `YYYY-MM-DD` in every calendar. */
5593
5708
  calendar?: (HelixHeadlessDatePicker["calendar"]) | undefined;
5594
5709
  /** The month to open on when `month` is not set. */
5595
5710
  "default-month"?: (HelixHeadlessDatePicker["defaultMonth"]) | undefined;
@@ -5736,6 +5851,18 @@ else set needs. */
5736
5851
  readOnly?: (HelixHeadlessDatePicker["readOnly"]) | undefined;
5737
5852
  /** Stops the form from submitting while no date is chosen. */
5738
5853
  required?: (HelixHeadlessDatePicker["required"]) | undefined;
5854
+ /** What a screen reader hears about the chosen dates: the grid's
5855
+ description, said again whenever the dates change. `{kind}` is `date`,
5856
+ `start` while a range holds one end, `range`, or `dates` for `multiple`.
5857
+ `{start}` and `{end}` are dates written in `locale`, and `{count}` is how
5858
+ many dates are chosen. */
5859
+ "selection-label"?: (HelixHeadlessDatePicker["selectionLabel"]) | undefined;
5860
+ /** What a screen reader hears about the chosen dates: the grid's
5861
+ description, said again whenever the dates change. `{kind}` is `date`,
5862
+ `start` while a range holds one end, `range`, or `dates` for `multiple`.
5863
+ `{start}` and `{end}` are dates written in `locale`, and `{count}` is how
5864
+ many dates are chosen. */
5865
+ selectionLabel?: (HelixHeadlessDatePicker["selectionLabel"]) | undefined;
5739
5866
  /** How far apart the selectable dates are, in days.
5740
5867
 
5741
5868
  `<input type="date" step>`'s own unit, counted from `min` where there is
@@ -7080,12 +7207,14 @@ export type HelixHeadlessFilterInputVueEvents = {
7080
7207
 
7081
7208
  export type HelixHeadlessFormatDateVueProps = {
7082
7209
  /** The calendar a date is written in: `gregory`, `buddhist`, `japanese`,
7083
- `roc`, or `iso8601`, the calendars Date Picker and Date Input draw.
7084
-
7085
- Absent is the locale's own where it is one of the five, such as
7086
- `buddhist` for `th-TH`, and `gregory` for every other, such as `persian`
7087
- for `fa-IR`, so a date written here reads as the same date a Date Picker
7088
- beside it shows. */
7210
+ `roc`, or `iso8601`, or a calendar with months of its own, such as
7211
+ `persian`, `hebrew`, `islamic-umalqura`, `ethiopic`, or `chinese`: every
7212
+ calendar Date Picker and Date Input draw.
7213
+
7214
+ Absent is the locale's own where its months are the Gregorian months,
7215
+ such as `buddhist` for `th-TH`, and `gregory` for every other, such as
7216
+ `persian` for `fa-IR`, so a date written here reads as the same date a
7217
+ Date Picker beside it shows. Write `calendar="persian"` for Mehr 14, 1405. */
7089
7218
  calendar?: (HelixHeadlessFormatDate["calendar"]) | undefined;
7090
7219
  /** The timestamp, in any format `Date` can parse.
7091
7220
 
@@ -7111,6 +7240,14 @@ browser may use either. */
7111
7240
  dateStyle?: (HelixHeadlessFormatDate["dateStyle"]) | undefined;
7112
7241
  /** How the day of the month is written, where a date is shown. */
7113
7242
  day?: (HelixHeadlessFormatDate["day"]) | undefined;
7243
+ /** Writes the part of the day in words, such as "in the morning" or "at
7244
+ night", in its `long`, `short`, or `narrow` form, where `hour` is on a
7245
+ twelve-hour clock. */
7246
+ "day-period"?: (HelixHeadlessFormatDate["dayPeriod"]) | undefined;
7247
+ /** Writes the part of the day in words, such as "in the morning" or "at
7248
+ night", in its `long`, `short`, or `narrow` form, where `hour` is on a
7249
+ twelve-hour clock. */
7250
+ dayPeriod?: (HelixHeadlessFormatDate["dayPeriod"]) | undefined;
7114
7251
  /** Shows how long ago the timestamp was, in a compact form such as "3h", in
7115
7252
  place of the date.
7116
7253
 
@@ -7128,6 +7265,12 @@ Off by default, which draws the date as one run of text, as Shoelace and
7128
7265
  Web Awesome do. An `elapsed` or `relative` reading is one phrase either
7129
7266
  way. */
7130
7267
  fields?: (HelixHeadlessFormatDate["fields"]) | undefined;
7268
+ /** How many digits of a fraction of a second to write after `second`: 1, 2,
7269
+ or 3, as in 09:41:07.250. */
7270
+ "fractional-second-digits"?: (HelixHeadlessFormatDate["fractionalSecondDigits"]) | undefined;
7271
+ /** How many digits of a fraction of a second to write after `second`: 1, 2,
7272
+ or 3, as in 09:41:07.250. */
7273
+ fractionalSecondDigits?: (HelixHeadlessFormatDate["fractionalSecondDigits"]) | undefined;
7131
7274
  /** Draws an `elapsed` or `relative` reading once and leaves it, where it
7132
7275
  would otherwise move on as it goes stale.
7133
7276
 
@@ -7190,9 +7333,13 @@ Empty is the runtime's own. */
7190
7333
 
7191
7334
  Empty is the runtime's own. */
7192
7335
  timeZone?: (HelixHeadlessFormatDate["timeZone"]) | undefined;
7193
- /** Shows the name of the time zone, in its `long` or `short` form. */
7336
+ /** Shows the name of the time zone: `long` or `short`, as Pacific Daylight
7337
+ Time or PDT, `longOffset` or `shortOffset`, as GMT-07:00 or GMT-7, or
7338
+ `longGeneric` or `shortGeneric`, as Pacific Time or PT. */
7194
7339
  "time-zone-name"?: (HelixHeadlessFormatDate["timeZoneName"]) | undefined;
7195
- /** Shows the name of the time zone, in its `long` or `short` form. */
7340
+ /** Shows the name of the time zone: `long` or `short`, as Pacific Daylight
7341
+ Time or PDT, `longOffset` or `shortOffset`, as GMT-07:00 or GMT-7, or
7342
+ `longGeneric` or `shortGeneric`, as Pacific Time or PT. */
7196
7343
  timeZoneName?: (HelixHeadlessFormatDate["timeZoneName"]) | undefined;
7197
7344
  /** How the weekday is written, where one is shown. */
7198
7345
  weekday?: (HelixHeadlessFormatDate["weekday"]) | undefined;
@@ -13527,6 +13674,14 @@ rather than a thumb sitting on nothing. */
13527
13674
  middle of the track, or `end` at `max`. Absent is `start`. A range fills
13528
13675
  between its thumbs and ignores it. */
13529
13676
  origin?: (HelixHeadlessSlider["origin"]) | undefined;
13677
+ /** How far Page Up and Page Down move a thumb, in the slider's own units, as
13678
+ React Aria's `pageSize` and Zag's `largeStep` do. Absent leaves the keys
13679
+ to the platform, which moves a tenth of the track. */
13680
+ "page-step"?: (HelixHeadlessSlider["pageStep"] | `${number}`) | undefined;
13681
+ /** How far Page Up and Page Down move a thumb, in the slider's own units, as
13682
+ React Aria's `pageSize` and Zag's `largeStep` do. Absent leaves the keys
13683
+ to the platform, which moves a tenth of the track. */
13684
+ pageStep?: (HelixHeadlessSlider["pageStep"]) | undefined;
13530
13685
  /** Adds a second thumb, so the value is a pair.
13531
13686
 
13532
13687
  The pair is one string, `"10,50"`, which is what `value` and
@@ -14019,6 +14174,22 @@ consumer's to set. */
14019
14174
  "corner-label"?: (HelixHeadlessSplitter["cornerLabel"]) | undefined;
14020
14175
  /** The name of the handle where two dividers cross, read by screen readers. */
14021
14176
  cornerLabel?: (HelixHeadlessSplitter["cornerLabel"]) | undefined;
14177
+ /** What the handle where two dividers cross says it is set to, both dividers
14178
+ at once: `{across}` is where the divider that runs down stands, and
14179
+ `{down}` where the one that runs across stands, each a percentage.
14180
+
14181
+ **Both, because the handle moves both**, and a number names one: the
14182
+ handle's `aria-valuenow` is the divider its `aria-orientation` names, and
14183
+ these words are the whole of where it is. */
14184
+ "corner-value-label"?: (HelixHeadlessSplitter["cornerValueLabel"]) | undefined;
14185
+ /** What the handle where two dividers cross says it is set to, both dividers
14186
+ at once: `{across}` is where the divider that runs down stands, and
14187
+ `{down}` where the one that runs across stands, each a percentage.
14188
+
14189
+ **Both, because the handle moves both**, and a number names one: the
14190
+ handle's `aria-valuenow` is the divider its `aria-orientation` names, and
14191
+ these words are the whole of where it is. */
14192
+ cornerValueLabel?: (HelixHeadlessSplitter["cornerValueLabel"]) | undefined;
14022
14193
  /** Which pane starts shut, when `collapsed` is not set. */
14023
14194
  "default-collapsed"?: (HelixHeadlessSplitter["defaultCollapsed"]) | undefined;
14024
14195
  /** Which pane starts shut, when `collapsed` is not set. */
@@ -14674,6 +14845,12 @@ export type HelixHeadlessTableElementEvent<E = Event> = TypedEvent<
14674
14845
  /** `helix-before-reorder` event type */
14675
14846
  export type HelixHeadlessTableHelixBeforeReorderElementEvent =
14676
14847
  HelixHeadlessTableElementEvent<HelixBeforeReorderEvent>;
14848
+ /** `helix-before-toggle` event type */
14849
+ export type HelixHeadlessTableHelixBeforeToggleElementEvent =
14850
+ HelixHeadlessTableElementEvent<HelixBeforeToggleEvent>;
14851
+ /** `helix-load-more` event type */
14852
+ export type HelixHeadlessTableHelixLoadMoreElementEvent =
14853
+ HelixHeadlessTableElementEvent<HelixLoadMoreEvent>;
14677
14854
  /** `helix-reorder` event type */
14678
14855
  export type HelixHeadlessTableHelixReorderElementEvent =
14679
14856
  HelixHeadlessTableElementEvent<HelixReorderEvent>;
@@ -14689,6 +14866,9 @@ export type HelixHeadlessTableHelixSortElementEvent =
14689
14866
  /** `helix-sorted` event type */
14690
14867
  export type HelixHeadlessTableHelixSortedElementEvent =
14691
14868
  HelixHeadlessTableElementEvent<HelixSortedEvent>;
14869
+ /** `helix-toggle` event type */
14870
+ export type HelixHeadlessTableHelixToggleElementEvent =
14871
+ HelixHeadlessTableElementEvent<HelixToggleEvent>;
14692
14872
 
14693
14873
  export type HelixHeadlessTableVueProps = {
14694
14874
  /** The word for an ascending sort, in a `sorted-label` that writes `{order}`. */
@@ -14730,6 +14910,12 @@ and a list here would be a second way to say what that says. This table's
14730
14910
  cells are markup, and a table written as rows of cells with no column
14731
14911
  declared in it has nowhere else to be sized from. */
14732
14912
  columns?: (HelixHeadlessTable["columns"]) | undefined;
14913
+ /** The keys of the rows whose rows are shown at the start, separated by
14914
+ commas. Used until `expanded` is set. */
14915
+ "default-expanded"?: (HelixHeadlessTable["defaultExpanded"]) | undefined;
14916
+ /** The keys of the rows whose rows are shown at the start, separated by
14917
+ commas. Used until `expanded` is set. */
14918
+ defaultExpanded?: (HelixHeadlessTable["defaultExpanded"]) | undefined;
14733
14919
  /** The keys selected at the start, separated by commas. Used until `selected`
14734
14920
  is set. */
14735
14921
  "default-selected"?: (HelixHeadlessTable["defaultSelected"]) | undefined;
@@ -14764,6 +14950,18 @@ While it is set, a line after the rows shows it, or your own content in the
14764
14950
  `error` slot, in place of the empty and loading lines, and the live region
14765
14951
  says it. */
14766
14952
  errorText?: (HelixHeadlessTable["errorText"]) | undefined;
14953
+ /** The name of the heading over the disclosure buttons. */
14954
+ "expand-column-label"?: (HelixHeadlessTable["expandColumnLabel"]) | undefined;
14955
+ /** The name of the heading over the disclosure buttons. */
14956
+ expandColumnLabel?: (HelixHeadlessTable["expandColumnLabel"]) | undefined;
14957
+ /** The keys of the rows whose rows are shown, separated by commas, in a table
14958
+ whose rows nest. A press on a row's disclosure button asks first, and
14959
+ `default-expanded` seeds what this element then owns. */
14960
+ expanded?: (HelixHeadlessTable["expanded"]) | undefined;
14961
+ /** The name of a row's disclosure button. `{row}` is the words of the row's first cell. */
14962
+ "expand-row-label"?: (HelixHeadlessTable["expandRowLabel"]) | undefined;
14963
+ /** The name of a row's disclosure button. `{row}` is the words of the row's first cell. */
14964
+ expandRowLabel?: (HelixHeadlessTable["expandRowLabel"]) | undefined;
14767
14965
  /** The table's name where neither `label` nor an `aria-label` or
14768
14966
  `aria-labelledby` on the host gives it one. */
14769
14967
  "fallback-label"?: (HelixHeadlessTable["fallbackLabel"]) | undefined;
@@ -14783,6 +14981,12 @@ cells, which is the one way a cell of your markup can take focus. */
14783
14981
  An `aria-label` or `aria-labelledby` on the host names the table too, and
14784
14982
  wins over this. */
14785
14983
  label?: (HelixHeadlessTable["label"]) | undefined;
14984
+ /** Sends `helix-load-more` once the end of the table comes within a screen
14985
+ of view, so you can add the next rows as a reader nears them. */
14986
+ "load-more"?: (HelixHeadlessTable["loadMore"]) | undefined;
14987
+ /** Sends `helix-load-more` once the end of the table comes within a screen
14988
+ of view, so you can add the next rows as a reader nears them. */
14989
+ loadMore?: (HelixHeadlessTable["loadMore"]) | undefined;
14786
14990
  /** What screen readers hear each time a key moves a held row, in a
14787
14991
  `reorderable` table. `{name}` is the row's words, `{position}` the place it
14788
14992
  would go, counting from 1, and `{count}` the number of rows. */
@@ -14817,6 +15021,12 @@ table moves no row itself: you move your rows on `helix-reorder`. */
14817
15021
  "select-all-label"?: (HelixHeadlessTable["selectAllLabel"]) | undefined;
14818
15022
  /** The name of the checkbox in the heading that selects every row. */
14819
15023
  selectAllLabel?: (HelixHeadlessTable["selectAllLabel"]) | undefined;
15024
+ /** The name of the heading over the checkboxes under
15025
+ `selection-mode="single"`, where it holds no checkbox of its own. */
15026
+ "select-column-label"?: (HelixHeadlessTable["selectColumnLabel"]) | undefined;
15027
+ /** The name of the heading over the checkboxes under
15028
+ `selection-mode="single"`, where it holds no checkbox of its own. */
15029
+ selectColumnLabel?: (HelixHeadlessTable["selectColumnLabel"]) | undefined;
14820
15030
  /** The keys of the selected rows, separated by commas.
14821
15031
 
14822
15032
  A reader's press fires `helix-select` first, and refusing it leaves the
@@ -14833,6 +15043,20 @@ rows are chosen, written in the locale, and a language that needs plural
14833
15043
  forms writes them: `{count, plural, one {# wybrany} few {# wybrane} many
14834
15044
  {# wybranych} other {# wybranego}}`. */
14835
15045
  selectedLabel?: (HelixHeadlessTable["selectedLabel"]) | undefined;
15046
+ /** What a press on a row, or in a `grid` table a key that moves to one, does
15047
+ to the rows already selected: `toggle`, the default, leaves them to the
15048
+ checkboxes, and `replace` selects the row alone. */
15049
+ "selection-behavior"?: (HelixHeadlessTable["selectionBehavior"]) | undefined;
15050
+ /** What a press on a row, or in a `grid` table a key that moves to one, does
15051
+ to the rows already selected: `toggle`, the default, leaves them to the
15052
+ checkboxes, and `replace` selects the row alone. */
15053
+ selectionBehavior?: (HelixHeadlessTable["selectionBehavior"]) | undefined;
15054
+ /** How many rows a `selectable` table selects: `multiple`, the default, or
15055
+ `single`, one at a time. */
15056
+ "selection-mode"?: (HelixHeadlessTable["selectionMode"]) | undefined;
15057
+ /** How many rows a `selectable` table selects: `multiple`, the default, or
15058
+ `single`, one at a time. */
15059
+ selectionMode?: (HelixHeadlessTable["selectionMode"]) | undefined;
14836
15060
  /** The name of a row's checkbox. `{row}` is replaced with the words of the
14837
15061
  row's first cell. */
14838
15062
  "select-row-label"?: (HelixHeadlessTable["selectRowLabel"]) | undefined;
@@ -14880,6 +15104,10 @@ say that without the component knowing what a row looks like. */
14880
15104
  export type HelixHeadlessTableVueEvents = {
14881
15105
  /** Fired when a row is dropped at a new place, in a `reorderable` table, with every row's key in the new order. Cancelable: cancel it to keep the row where it is. */
14882
15106
  "helix-before-reorder": HelixHeadlessTableHelixBeforeReorderElementEvent;
15107
+ /** Fired from a row when its disclosure button is pressed, with whether it would be open in `detail.checked`. Cancelable: cancel it to keep the row as it is. */
15108
+ "helix-before-toggle": HelixHeadlessTableHelixBeforeToggleElementEvent;
15109
+ /** Fired, in a table with `load-more`, when the end of the table comes within a screen of view, once for each number of rows. */
15110
+ "helix-load-more": HelixHeadlessTableHelixLoadMoreElementEvent;
14883
15111
  /** Fired after `helix-before-reorder` when nobody canceled it. Move your rows to the order in `keys`. Cancelable: cancel it to say the move did not happen. */
14884
15112
  "helix-reorder": HelixHeadlessTableHelixReorderElementEvent;
14885
15113
  /** The selection is about to change. The event carries every selected key, separated by commas. Cancelable: cancel it to keep the current selection. */
@@ -14890,6 +15118,8 @@ export type HelixHeadlessTableVueEvents = {
14890
15118
  "helix-sort": HelixHeadlessTableHelixSortElementEvent;
14891
15119
  /** Fired after the sort order changes, with the new order. */
14892
15120
  "helix-sorted": HelixHeadlessTableHelixSortedElementEvent;
15121
+ /** Fired from a row once the rows under it are shown or hidden, with whether it is open in `detail.checked`. */
15122
+ "helix-toggle": HelixHeadlessTableHelixToggleElementEvent;
14893
15123
  };
14894
15124
 
14895
15125
  export type HelixHeadlessTableRowVueProps = {
@@ -14903,6 +15133,10 @@ reached. */
14903
15133
  /** The URL a press on the row follows, which makes the whole row a link.
14904
15134
  Empty, the default, leaves presses to the row's cells. */
14905
15135
  href?: (HelixHeadlessTableRow["href"]) | undefined;
15136
+ /** The key of the row this one sits under, in a table whose rows nest: that
15137
+ row's `value`, or its place among the rows where it has none. Empty, the
15138
+ default, is a row at the top. */
15139
+ parent?: (HelixHeadlessTableRow["parent"]) | undefined;
14906
15140
  /** The `rel` of the row's link. You set it yourself, as on an anchor. */
14907
15141
  rel?: (HelixHeadlessTableRow["rel"]) | undefined;
14908
15142
  /** Where the row's link opens, such as `_blank`. */
@@ -15463,6 +15697,9 @@ export type HelixHeadlessTimeInputHelixBeforeCloseElementEvent =
15463
15697
  /** `helix-before-open` event type */
15464
15698
  export type HelixHeadlessTimeInputHelixBeforeOpenElementEvent =
15465
15699
  HelixHeadlessTimeInputElementEvent<HelixBeforeOpenEvent>;
15700
+ /** `helix-clear` event type */
15701
+ export type HelixHeadlessTimeInputHelixClearElementEvent =
15702
+ HelixHeadlessTimeInputElementEvent<HelixClearEvent>;
15466
15703
  /** `toggle` event type */
15467
15704
  export type HelixHeadlessTimeInputToggleElementEvent =
15468
15705
  HelixHeadlessTimeInputElementEvent<ToggleEvent>;
@@ -15473,6 +15710,14 @@ export type HelixHeadlessTimeInputVueProps = {
15473
15710
  Empty leaves the attribute off, which is the browser's default and is what
15474
15711
  lets autofill work at all. */
15475
15712
  autocomplete?: (HelixHeadlessTimeInput["autocomplete"]) | undefined;
15713
+ /** Whether the field shows a button that empties it, as Input's `clearable`
15714
+ does. Shown only while the field holds something to clear and is neither
15715
+ disabled nor read-only. */
15716
+ clearable?: (HelixHeadlessTimeInput["clearable"]) | undefined;
15717
+ /** The accessible name of the clear button, which shows only an icon. */
15718
+ "clear-label"?: (HelixHeadlessTimeInput["clearLabel"]) | undefined;
15719
+ /** The accessible name of the clear button, which shows only an icon. */
15720
+ clearLabel?: (HelixHeadlessTimeInput["clearLabel"]) | undefined;
15476
15721
  /** Times that cannot be chosen, as `HH:mm`, separated by commas or spaces.
15477
15722
 
15478
15723
  Handed to the list, which offers them as unavailable, and checked against
@@ -15576,6 +15821,12 @@ never something this element would refuse to read back. */
15576
15821
  "unavailable-message"?: (HelixHeadlessTimeInput["unavailableMessage"]) | undefined;
15577
15822
  /** The message shown when `disable-times` bars a time. */
15578
15823
  unavailableMessage?: (HelixHeadlessTimeInput["unavailableMessage"]) | undefined;
15824
+ /** The message for text that is no time, where `bad-input-message` is not
15825
+ set. `{mode}` is `single`, `range`, or `multiple`, and `{shape}` is `HH:mm`, or `HH:mm:ss` with `seconds`. */
15826
+ "unreadable-message"?: (HelixHeadlessTimeInput["unreadableMessage"]) | undefined;
15827
+ /** The message for text that is no time, where `bad-input-message` is not
15828
+ set. `{mode}` is `single`, `range`, or `multiple`, and `{shape}` is `HH:mm`, or `HH:mm:ss` with `seconds`. */
15829
+ unreadableMessage?: (HelixHeadlessTimeInput["unreadableMessage"]) | undefined;
15579
15830
  /** Whether the panel shows one list of times or a column for each part of the
15580
15831
  time.
15581
15832
 
@@ -15613,6 +15864,18 @@ are not, where `bad-input-message` is not set. `{kind}` is `date` or
15613
15864
  are not, where `bad-input-message` is not set. `{kind}` is `date` or
15614
15865
  `time`. */
15615
15866
  incompleteMessage?: (HelixHeadlessTimeInput["incompleteMessage"]) | undefined;
15867
+ /** What a screen reader hears before the segments of a range's second date
15868
+ or time, after each segment's own name. */
15869
+ "range-end-label"?: (HelixHeadlessTimeInput["rangeEndLabel"]) | undefined;
15870
+ /** What a screen reader hears before the segments of a range's second date
15871
+ or time, after each segment's own name. */
15872
+ rangeEndLabel?: (HelixHeadlessTimeInput["rangeEndLabel"]) | undefined;
15873
+ /** What a screen reader hears before the segments of a range's first date
15874
+ or time, after each segment's own name: "month, Start, Stay". */
15875
+ "range-start-label"?: (HelixHeadlessTimeInput["rangeStartLabel"]) | undefined;
15876
+ /** What a screen reader hears before the segments of a range's first date
15877
+ or time, after each segment's own name: "month, Start, Stay". */
15878
+ rangeStartLabel?: (HelixHeadlessTimeInput["rangeStartLabel"]) | undefined;
15616
15879
  /** Whether the field is a row of segments, one for each part of the date or
15617
15880
  time, in place of a line of text.
15618
15881
 
@@ -15825,6 +16088,8 @@ export type HelixHeadlessTimeInputVueEvents = {
15825
16088
  "helix-before-close": HelixHeadlessTimeInputHelixBeforeCloseElementEvent;
15826
16089
  /** Fired before the list opens. Cancelable: canceling it keeps the list closed and leaves the decision to you. */
15827
16090
  "helix-before-open": HelixHeadlessTimeInputHelixBeforeOpenElementEvent;
16091
+ /** Fired after the clear button has emptied the field, after `input` and `change`. */
16092
+ "helix-clear": HelixHeadlessTimeInputHelixClearElementEvent;
15828
16093
  /** Fired after the value changes. */
15829
16094
  input: HelixHeadlessTimeInputElementEvent;
15830
16095
  /** Fired after the list opens or closes, with `newState` and `oldState`. */
@@ -16175,13 +16440,35 @@ Whatever `<time>` accepts, which is a date, a time, both, a duration or a
16175
16440
  week. Unset, the label is written as it was given and nothing claims to
16176
16441
  know what instant it names. */
16177
16442
  datetime?: (HelixHeadlessTimelineItem["datetime"]) | undefined;
16443
+ /** Marks an event that has not happened yet, such as one that is scheduled.
16444
+ The mark is the open circle, and a screen reader hears `pending-label`. */
16445
+ pending?: (HelixHeadlessTimelineItem["pending"]) | undefined;
16446
+ /** What a screen reader hears for an entry that is `pending`. */
16447
+ "pending-label"?: (HelixHeadlessTimelineItem["pendingLabel"]) | undefined;
16448
+ /** What a screen reader hears for an entry that is `pending`. */
16449
+ pendingLabel?: (HelixHeadlessTimelineItem["pendingLabel"]) | undefined;
16178
16450
  /** Writes the time as how long ago it was, or how long until it, from
16179
16451
  `datetime`, where the `time` slot is empty: `long` ("3 hours ago"),
16180
16452
  `short` ("3 hr. ago") or `narrow` ("3h ago"). Set with no value, it is
16181
16453
  `long`. The words move on as they go stale. */
16182
16454
  relative?: (HelixHeadlessTimelineItem["relative"]) | undefined;
16183
- /** The kind of event. It sets the color of the mark and nothing else. */
16455
+ /** The kind of event. It sets the color of the mark, and a screen reader
16456
+ hears it as the word `tone-labels` gives it. */
16184
16457
  tone?: (HelixHeadlessTimelineItem["tone"]) | undefined;
16458
+ /** What a screen reader is told this entry's tone is, such as "Failed".
16459
+ Absent is the tone's word in `tone-labels`. */
16460
+ "tone-label"?: (HelixHeadlessTimelineItem["toneLabel"]) | undefined;
16461
+ /** What a screen reader is told this entry's tone is, such as "Failed".
16462
+ Absent is the tone's word in `tone-labels`. */
16463
+ toneLabel?: (HelixHeadlessTimelineItem["toneLabel"]) | undefined;
16464
+ /** What a screen reader is told each tone is, by the tone's name, written as
16465
+ JSON in the attribute: `tone-labels='{"danger":"Failed"}'`. A tone with no
16466
+ word is not read, which is `neutral` and `primary` in English. */
16467
+ "tone-labels"?: (HelixHeadlessTimelineItem["toneLabels"]) | undefined;
16468
+ /** What a screen reader is told each tone is, by the tone's name, written as
16469
+ JSON in the attribute: `tone-labels='{"danger":"Failed"}'`. A tone with no
16470
+ word is not read, which is `neutral` and `primary` in English. */
16471
+ toneLabels?: (HelixHeadlessTimelineItem["toneLabels"]) | undefined;
16185
16472
  };
16186
16473
 
16187
16474
  export type HelixHeadlessTimelineItemVueEvents = {};
@@ -16337,6 +16624,18 @@ export type HelixHeadlessToggleGroupHelixSelectElementEvent =
16337
16624
  HelixHeadlessToggleGroupElementEvent<HelixSelectEvent>;
16338
16625
 
16339
16626
  export type HelixHeadlessToggleGroupVueProps = {
16627
+ /** Whether a press on the chosen item, or Space or Enter on it, takes it
16628
+ back so nothing is chosen, as React Aria's `ToggleButtonGroup` and
16629
+ Radix's `ToggleGroup` do in a single group. Absent, a single group always
16630
+ keeps its choice once it has one, as a radio group does. A multiple group
16631
+ releases a pressed item either way. */
16632
+ "allow-empty-selection"?: (HelixHeadlessToggleGroup["allowEmptySelection"]) | undefined;
16633
+ /** Whether a press on the chosen item, or Space or Enter on it, takes it
16634
+ back so nothing is chosen, as React Aria's `ToggleButtonGroup` and
16635
+ Radix's `ToggleGroup` do in a single group. Absent, a single group always
16636
+ keeps its choice once it has one, as a radio group does. A multiple group
16637
+ releases a pressed item either way. */
16638
+ allowEmptySelection?: (HelixHeadlessToggleGroup["allowEmptySelection"]) | undefined;
16340
16639
  /** Where the group's label sits. `start` puts it on the track's line.
16341
16640
 
16342
16641
  Absent is above, which is what a field looks like and what almost every
@@ -17344,6 +17643,13 @@ Written by the playlist rather than by the entry, the way an option's
17344
17643
  selection is: an entry that made itself current would be a second answer to
17345
17644
  which one is playing. */
17346
17645
  current?: (HelixHeadlessVideoPlaylistItem["current"]) | undefined;
17646
+ /** Whether the entry holds the playlist's tab stop. Unset, every entry is in
17647
+ the tab order, which is what a server renders.
17648
+
17649
+ **Written by the playlist, with no attribute, and it reaches the button.**
17650
+ The playlist gives the stop to the entry a reader last focused, or to the
17651
+ current one, and the arrow keys reach the rest. */
17652
+ focusable?: (HelixHeadlessVideoPlaylistItem["focusable"]) | undefined;
17347
17653
  };
17348
17654
 
17349
17655
  export type HelixHeadlessVideoPlaylistItemVueEvents = {
@@ -17394,8 +17700,20 @@ export type HelixHeadlessVideoPlaylistHelixEndElementEvent =
17394
17700
  HelixHeadlessVideoPlaylistElementEvent<HelixEndEvent>;
17395
17701
 
17396
17702
  export type HelixHeadlessVideoPlaylistVueProps = {
17703
+ /** What the playlist says while it has no entries. The `empty` slot replaces it. */
17704
+ "empty-label"?: (HelixHeadlessVideoPlaylist["emptyLabel"]) | undefined;
17705
+ /** What the playlist says while it has no entries. The `empty` slot replaces it. */
17706
+ emptyLabel?: (HelixHeadlessVideoPlaylist["emptyLabel"]) | undefined;
17397
17707
  /** The list's name, read by screen readers. */
17398
17708
  label?: (HelixHeadlessVideoPlaylist["label"]) | undefined;
17709
+ /** Stays on an entry when its clip ends, where the playlist would otherwise
17710
+ play the next one. The player's controls, a press, and `next()` still
17711
+ move. `repeat="one"` still plays the entry again. */
17712
+ "no-advance"?: (HelixHeadlessVideoPlaylist["noAdvance"]) | undefined;
17713
+ /** Stays on an entry when its clip ends, where the playlist would otherwise
17714
+ play the next one. The player's controls, a press, and `next()` still
17715
+ move. `repeat="one"` still plays the entry again. */
17716
+ noAdvance?: (HelixHeadlessVideoPlaylist["noAdvance"]) | undefined;
17399
17717
  /** What the live region says when the playlist moves to another entry.
17400
17718
  `{title}` is the entry's name.
17401
17719
 
@@ -17444,7 +17762,7 @@ Ignored once `active` is written. */
17444
17762
  export type HelixHeadlessVideoPlaylistVueEvents = {
17445
17763
  /** The current entry changed. The playlist already holds the new entry when this is sent, and `detail.previous` is the entry it left. `currentEntry` is the entry itself, with its `src`, `poster` and name. */
17446
17764
  "helix-activate": HelixHeadlessVideoPlaylistHelixActivateElementEvent;
17447
- /** The current entry is about to change. Cancelable: cancel it to keep the current entry. */
17765
+ /** The current entry is about to change, and `detail.cause` says why: `press`, `next`, `previous`, `ended`, or `removed`. Cancelable: cancel it to keep the current entry. */
17448
17766
  "helix-before-activate": HelixHeadlessVideoPlaylistHelixBeforeActivateElementEvent;
17449
17767
  /** The last entry finished playing, and the playlist stopped there. Not sent while `repeat` is set. */
17450
17768
  "helix-end": HelixHeadlessVideoPlaylistHelixEndElementEvent;
@@ -17951,6 +18269,12 @@ export type HelixHeadlessVirtualListVueProps = {
17951
18269
  items out as a grid of that many equal columns, windowed a line at a
17952
18270
  time, with Left and Right moving along a line. */
17953
18271
  columns?: (HelixHeadlessVirtualList["columns"]) | undefined;
18272
+ /** The keys of the items a reader cannot choose or move to, separated by
18273
+ commas, as `value` writes keys. Their rows carry `aria-disabled`. */
18274
+ "disabled-keys"?: (HelixHeadlessVirtualList["disabledKeys"]) | undefined;
18275
+ /** The keys of the items a reader cannot choose or move to, separated by
18276
+ commas, as `value` writes keys. Their rows carry `aria-disabled`. */
18277
+ disabledKeys?: (HelixHeadlessVirtualList["disabledKeys"]) | undefined;
17954
18278
  /** The text of the row shown when there are no items and none are loading,
17955
18279
  where the `empty` slot is empty. Empty, the default, shows no row. */
17956
18280
  "empty-label"?: (HelixHeadlessVirtualList["emptyLabel"]) | undefined;
@@ -17965,6 +18289,11 @@ right whenever the rows really are one height and is the cheaper of the two. */
17965
18289
  /** The id of the script element that holds the items as JSON. `items` wins
17966
18290
  where both are set. */
17967
18291
  for?: (HelixHeadlessVirtualList["for"]) | undefined;
18292
+ /** The space between two rows, and between two columns in a grid, in
18293
+ pixels. The list counts it in each row's place, so a gap does not walk
18294
+ the rows away from the scroll position the way a margin on each row
18295
+ would. */
18296
+ gap?: (HelixHeadlessVirtualList["gap"]) | undefined;
17968
18297
  /** The field of each item that is its key in `value`, as a key or a path of
17969
18298
  keys. Empty reads a string or a number item as its own key, and any
17970
18299
  other item by its place in the set. */
@@ -18000,6 +18329,22 @@ disagree with itself; measuring is what a set of genuinely different
18000
18329
  heights needs and costs a read of each row as it renders. A list of
18001
18330
  one-line rows should leave this alone. */
18002
18331
  measured?: (HelixHeadlessVirtualList["measured"]) | undefined;
18332
+ /** The narrowest a column of a grid may be, in pixels. Set, the list lays
18333
+ out as many columns as fit the box at that width, at least one, and
18334
+ follows the box as it resizes, which `columns` then does not decide. */
18335
+ "min-column-width"?: (HelixHeadlessVirtualList["minColumnWidth"] | `${number}`) | undefined;
18336
+ /** The narrowest a column of a grid may be, in pixels. Set, the list lays
18337
+ out as many columns as fit the box at that width, at least one, and
18338
+ follows the box as it resizes, which `columns` then does not decide. */
18339
+ minColumnWidth?: (HelixHeadlessVirtualList["minColumnWidth"]) | undefined;
18340
+ /** What a press does to the items already chosen: `toggle` adds or takes out
18341
+ the item, and `replace` selects it alone and lets the arrow keys carry the
18342
+ selection, with Control or Command adding or taking out one item. */
18343
+ "selection-behavior"?: (HelixHeadlessVirtualList["selectionBehavior"]) | undefined;
18344
+ /** What a press does to the items already chosen: `toggle` adds or takes out
18345
+ the item, and `replace` selects it alone and lets the arrow keys carry the
18346
+ selection, with Control or Command adding or taking out one item. */
18347
+ selectionBehavior?: (HelixHeadlessVirtualList["selectionBehavior"]) | undefined;
18003
18348
  /** Makes the list a list box a reader chooses from: `single` selects one
18004
18349
  item, and `multiple` any number. Unset is a list a reader reads. */
18005
18350
  "selection-mode"?: (HelixHeadlessVirtualList["selectionMode"]) | undefined;
@@ -18072,6 +18417,14 @@ export type CustomCssProperties = {
18072
18417
  "--carousel-run-end"?: (string) | undefined;
18073
18418
  /** The narrowest a slide may be. `per-view="auto"` uses it to fit slides into the track. It must be a length, because the stylesheet divides by it. When unset, it is the whole track, which shows one slide across. */
18074
18419
  "--carousel-slide-min"?: (string) | undefined;
18420
+ /** Written by the block on each `number` in a `wrap` block with `line-numbers`: how tall the line it numbers is laid out. Do not set it. */
18421
+ "--code-block-line-size"?: (string) | undefined;
18422
+ /** Written by the block on each `mark`: how wide the code is, scrolled part included. Do not set it. */
18423
+ "--code-block-mark-inline-size"?: (string) | undefined;
18424
+ /** Written by the block on each `mark`: how tall its run of lines is. Do not set it. */
18425
+ "--code-block-mark-size"?: (string) | undefined;
18426
+ /** Written by the block on each `mark`: how far down the code its run of lines starts. Do not set it. */
18427
+ "--code-block-mark-start"?: (string) | undefined;
18075
18428
  /** The chosen color, painted over the checkerboard that shows transparency. */
18076
18429
  "--color-input-swatch"?: (string) | undefined;
18077
18430
  /** The chosen brightness, 0 to 100, as a percentage. */
@@ -18208,6 +18561,8 @@ export type CustomCssProperties = {
18208
18561
  "--table-cell-align"?: (string) | undefined;
18209
18562
  /** The column track list the table works out from its columns. The component writes it inline on the element that reads it, so setting it has no effect. Set `columns` to change the tracks. */
18210
18563
  "--table-template"?: (string) | undefined;
18564
+ /** Written by the row on its `expand` cell: how deep the row sits, from 1. Do not set it. */
18565
+ "--table-row-level"?: (string) | undefined;
18211
18566
  /** How long this message stays, in milliseconds, for a progress hint. */
18212
18567
  "--toast-duration"?: (string) | undefined;
18213
18568
  /** How far a swipe has moved the message across, in pixels, toward the right. */
@@ -18338,7 +18693,7 @@ export interface WcToolkitVueGlobalComponents {
18338
18693
  HelixHeadlessCanvasNodeVueProps,
18339
18694
  HelixHeadlessCanvasNodeVueEvents
18340
18695
  >;
18341
- /** A board of cards and connectors, drawn by Helix. On a canvas every position is data that someone placed, so drawing is arithmetic over rectangles with no layout to compute. 'Map' takes a slotted map, because another renderer draws its tiles. The format is [JSON Canvas](https://jsoncanvas.org), an open format. Each node has an 'x', 'y', 'width', 'height', and a type. Each edge names the two nodes it joins and the sides it leaves and arrives on. A card belongs to a group when it sits inside the group's bounds. The cards are text in the DOM, so a screen reader can read them. The family adds a reading order and states each card's connections as text. 'order' sets the reading order: - 'spatial' bands the cards into rows. - 'edges' follows the arrows, starting from the cards that nothing points to. **Cards move by default.** The board writes the new 'x' and 'y' onto the card, the way an input writes its own value, and dispatches two events: - 'helix-before-move' for every step. Cancel it to hold the positions in your own state and apply them yourself. - 'helix-move' once the move is finished. A resize dispatches the same pair with a size. Set 'readonly' on the board to keep every card in place, such as on a published board. Set 'readonly' on one card or connection to keep only that one in place. Set 'snap' to a length in the document's units, such as '32', and a card that is moved or resized lands on a multiple of it. Carrying a card, a corner, a connection, or the selection box near the edge of the board moves the board under it, so a card can be taken to a place off screen in one drag. A connection let go within 20 pixels of a card arrives at it. A double click on the empty board zooms in about that point, and Shift with a double click zooms out. Keyboard behavior: - One card holds the board's tab stop. - The arrow keys move through the cards in reading order. The card you land on scrolls into view, and its connections are announced with it. - The card you land on is selected. Control or Command with an arrow key, Home, or End moves without changing the selection, and Space adds the card to the selection or takes it out, so you can select cards that are not next to each other. - Shift with an arrow key moves the card: by 16 units, or to the next multiple of 'snap' where it is set. Alt with an arrow key resizes it from its bottom right corner the same way. - The connections leaving a card are stops of their own, straight after it. Enter on one moves to the card it arrives at. - What a key changes that a reader cannot see is said: where a card moved to, its new size, how many cards are selected, and the zoom. A selected card or connection says so when a reader arrives on it. Every drag also works with clicks, as WCAG 2.5.7 requires for a pointer that cannot hold a button down. Click a selected card's move handle, a corner, a card's connection point, or the end of a selected connection to pick it up. It follows the pointer with no button held, and the next click puts it down where a drag would have. On touch, the next tap sets where it lands. Escape, or a press outside the board, puts it back. So a finger connects two cards with three taps: the card, one of its points, and the card to connect to. Connecting and removing dispatch requests, and your code applies them: - Drawing from a card's handle to another card, or pressing C on one card and Enter on another, dispatches 'helix-connect'. - Delete on a card or a connection dispatches 'helix-remove'. The event names every connection that removing the card would leave without an end. Once your page removes what Delete asked for, focus moves to the next stop, to the one before where it was the last, and to the board where none is left. A focused card your page removes for its own reasons hands focus on the same way, unless the reader has already moved focus somewhere else. The board applies a move itself, because the card already exists. A connection is a new element, and React discards an element the board adds to its markup on the next render, so you write the connection. Cards and connections are 'helix-canvas-node' and 'helix-canvas-edge' elements, so they are in the served markup whichever renderer wrote them. The library fetches nothing, and an array passed to an element is missing from the first paint of a server-rendered React page. 'fromJsonCanvas' turns a JSON Canvas document into their props, and 'toJsonCanvas()' writes a board back out. */
18696
+ /** A board of cards and connectors, drawn by Helix. On a canvas every position is data that someone placed, so drawing is arithmetic over rectangles with no layout to compute. 'Map' takes a slotted map, because another renderer draws its tiles. The format is [JSON Canvas](https://jsoncanvas.org), an open format. Each node has an 'x', 'y', 'width', 'height', and a type. Each edge names the two nodes it joins and the sides it leaves and arrives on. A card belongs to a group when it sits inside the group's bounds. The cards are text in the DOM, so a screen reader can read them. The family adds a reading order and states each card's connections as text. 'order' sets the reading order: - 'spatial' bands the cards into rows. - 'edges' follows the arrows, starting from the cards that nothing points to. **Cards move by default.** The board writes the new 'x' and 'y' onto the card, the way an input writes its own value, and dispatches two events: - 'helix-before-move' for every step. Cancel it to hold the positions in your own state and apply them yourself. - 'helix-move' once the move is finished. A resize dispatches the same pair with a size. Set 'readonly' on the board to keep every card in place, such as on a published board. Set 'readonly' on one card or connection to keep only that one in place. Set 'snap' to a length in the document's units, such as '32', and a card that is moved or resized lands on a multiple of it. Carrying a card, a corner, a connection, or the selection box near the edge of the board moves the board under it, so a card can be taken to a place off screen in one drag. A connection let go within 20 pixels of a card arrives at it. A double click on the empty board zooms in about that point, and Shift with a double click zooms out. Keyboard behavior: - One card holds the board's tab stop. - The arrow keys move through the cards in reading order. The card you land on scrolls into view, and its connections are announced with it. - The card you land on is selected. Control or Command with an arrow key, Home, or End moves without changing the selection, and Space adds the card to the selection or takes it out, so you can select cards that are not next to each other. - Shift with an arrow key moves the card: by 16 units, or to the next multiple of 'snap' where it is set. Alt with an arrow key resizes it from its bottom right corner the same way. - The connections leaving a card are stops of their own, straight after it. Enter on one moves to the card it arrives at. - What a key changes that a reader cannot see is said: where a card moved to, its new size, how many cards are selected, and the zoom. A selected card or connection says so when a reader arrives on it. - Control or Command with C copies the selected cards, and the connections between them, as a JSON Canvas document in text, which another board or an app that reads the format takes. A paste is your page's: listen for 'paste' on the board, read the text with 'fromJsonCanvas', and add the cards it holds. - Control or Command with Z undoes the last move or resize the board made, and with Shift, or Control with Y, makes it again. 'undo()' and 'redo()' do the same from a script. Each asks with 'helix-before-move' and tells with 'helix-move', as a move does, so a board that holds its positions in your state is undone through your state. Every drag also works with clicks, as WCAG 2.5.7 requires for a pointer that cannot hold a button down. Click a selected card's move handle, a corner, a card's connection point, or the end of a selected connection to pick it up. It follows the pointer with no button held, and the next click puts it down where a drag would have. On touch, the next tap sets where it lands. Escape, or a press outside the board, puts it back. So a finger connects two cards with three taps: the card, one of its points, and the card to connect to. Connecting and removing dispatch requests, and your code applies them: - Drawing from a card's handle to another card, or pressing C on one card and Enter on another, dispatches 'helix-connect'. - Delete on a card or a connection dispatches 'helix-remove'. The event names every connection that removing the card would leave without an end. Once your page removes what Delete asked for, focus moves to the next stop, to the one before where it was the last, and to the board where none is left. A focused card your page removes for its own reasons hands focus on the same way, unless the reader has already moved focus somewhere else. The board applies a move itself, because the card already exists. A connection is a new element, and React discards an element the board adds to its markup on the next render, so you write the connection. Cards and connections are 'helix-canvas-node' and 'helix-canvas-edge' elements, so they are in the served markup whichever renderer wrote them. The library fetches nothing, and an array passed to an element is missing from the first paint of a server-rendered React page. 'fromJsonCanvas' turns a JSON Canvas document into their props, and 'toJsonCanvas()' writes a board back out. */
18342
18697
  "helix-headless-canvas": DefineCustomElement<
18343
18698
  HelixHeadlessCanvas,
18344
18699
  HelixHeadlessCanvasVueProps,
@@ -18368,7 +18723,7 @@ export interface WcToolkitVueGlobalComponents {
18368
18723
  HelixHeadlessChatMessageVueProps,
18369
18724
  HelixHeadlessChatMessageVueEvents
18370
18725
  >;
18371
- /** Chat has no positioning, no backdrop, and no trigger, so you can put it in any container, such as a page, a sidebar, a modal, or a floating panel. The transcript stays pinned to the bottom, including while a streamed answer grows, until the user scrolls more than 'threshold' away from it. With 'history' set to 'more', reaching the top fires 'helix-history'. Set 'loading' while you fetch, then prepend the older turns. The turn the user was reading stays in place on screen. The log is 'aria-live="off"'. A separate status region announces each new turn once, when it has finished arriving. It skips the user's own turns unless they failed to send, turns loaded as history, and the turns already there when the transcript opened. A turn is said with its author first, such as "Ada: It ships today" ('arrival-label'), where its author can be named. Pass the turns as children or as 'turns' data. Do not use both. Children render from the server and suit most conversations. 'turns' draws a long transcript one window at a time, so the log needs a block size of its own. **A conversation is built from three elements.** The chat holds the transcript, a 'Chat.Message' stands for each turn, and a 'Chat.Composer' sits in the 'composer' slot. When the user sends, 'helix-send' reaches the chat: add their turn with 'author="me"' and 'state="sending"', then set 'state' to 'sent' or 'failed' when your server answers. Add the reply as a turn with 'state="streaming"', write its text as it arrives, and set 'state' to 'sent' when it is complete. While the user types, the composer sends 'helix-typing', which you can pass on to the other side. When the other side types, set 'typing' to their name: the status band draws three dots and "Ada is typing" ('typing-label'), which a screen reader hears, and clearing it takes them away. Anything slotted into 'status' is drawn first. A screen reader names each turn by its author and its time, such as "You, 2 minutes ago". Set 'me-label' and 'message-label' to say it in your language, and give each turn by 'them' an 'author-label'. A turn with neither an author label nor a time is named by 'turn-label', "Message". A turn from 'turns' is drawn in the chat's shadow root, so style it through the forwarded 'message-*' parts. A turn by 'me' also gets each part with '-mine' added, and the turn's state adds 'message-meta-failed', 'message-content-sending', and 'message-content-streaming'. To style each participant differently, give 'author-styles' the declarations for each author, such as '{"ada": "--chat-message-background-color: …"}': the message drawn for each of their turns takes them as its 'style', so the message's custom properties change for that author alone. Turns passed as children are styled by their 'author', such as 'helix-chat-message[author="ada"]'. */
18726
+ /** Chat has no positioning, no backdrop, and no trigger, so you can put it in any container, such as a page, a sidebar, a modal, or a floating panel. The transcript stays pinned to the bottom, including while a streamed answer grows, until the user scrolls more than 'threshold' away from it. With 'history' set to 'more', reaching the top fires 'helix-history'. Set 'loading' while you fetch, then prepend the older turns. The turn the user was reading stays in place on screen. The log is 'aria-live="off"'. A separate status region announces each new turn once, when it has finished arriving. It skips the user's own turns unless they failed to send, turns loaded as history, and the turns already there when the transcript opened. A turn is said with its author first, such as "Ada: It ships today" ('arrival-label'), where its author can be named. Pass the turns as children or as 'turns' data. Do not use both. Children render from the server and suit most conversations. 'turns' draws a long transcript one window at a time, so the log needs a block size of its own. **A conversation is built from three elements.** The chat holds the transcript, a 'Chat.Message' stands for each turn, and a 'Chat.Composer' sits in the 'composer' slot. When the user sends, 'helix-send' reaches the chat: add their turn with 'author="me"' and 'state="sending"', then set 'state' to 'sent' or 'failed' when your server answers. Add the reply as a turn with 'state="streaming"', write its text as it arrives, and set 'state' to 'sent' when it is complete. While the user types, the composer sends 'helix-typing', which you can pass on to the other side. When the other side types, set 'typing' to their name: the status band draws three dots and "Ada is typing" ('typing-label'), which a screen reader hears, and clearing it takes them away. Anything slotted into 'status' is drawn first. **Keyboard.** The transcript moves between turns the way a feed does. Each turn says its place, such as "3 of 40", windowed or not. | Key | What it does | |---|---| | Page Down, Page Up | On a turn or inside one, moves focus to the next or the previous turn. On the transcript itself, moves focus to the turn at the top of the view. | | Control with End | Moves focus to the composer. | | Control with Home | Moves focus to the first control above the transcript, or to the transcript. | While you are scrolled away from the newest turn, the 'resume' region shows a button that takes you back, named by 'resume-label', "Jump to latest". Slot your own control into 'resume' to replace it. A screen reader names each turn by its author and its time, such as "You, 2 minutes ago". Set 'me-label' and 'message-label' to say it in your language, and give each turn by 'them' an 'author-label'. A turn with neither an author label nor a time is named by 'turn-label', "Message". A turn from 'turns' is drawn in the chat's shadow root, so style it through the forwarded 'message-*' parts. A turn by 'me' also gets each part with '-mine' added, and the turn's state adds 'message-meta-failed', 'message-content-sending', and 'message-content-streaming'. To style each participant differently, give 'author-styles' the declarations for each author, such as '{"ada": "--chat-message-background-color: …"}': the message drawn for each of their turns takes them as its 'style', so the message's custom properties change for that author alone. Turns passed as children are styled by their 'author', such as 'helix-chat-message[author="ada"]'. */
18372
18727
  "helix-headless-chat": DefineCustomElement<
18373
18728
  HelixHeadlessChat,
18374
18729
  HelixHeadlessChatVueProps,
@@ -18386,7 +18741,7 @@ export interface WcToolkitVueGlobalComponents {
18386
18741
  HelixHeadlessCheckboxVueProps,
18387
18742
  HelixHeadlessCheckboxVueEvents
18388
18743
  >;
18389
- /** 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; it is handed the block's 'language', so one function serves every block. The code stays in the slot, so the copy button and the page's own text are the code as written. Set 'expandable' on a block whose height is capped, such as by '--code-block-max-block-size', and a button under it shows every line and then fewer again, as a docs site's long example does. The button is drawn only while the cap hides something, says whether the block is expanded with 'aria-expanded', names the block it opens with 'aria-controls', and the block carries ':state(expanded)' while it is. 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. **A block that scrolls is a tab stop.** While its lines run past its width or its cap, the scroller is a region named for the block, such as "Code, app.ts", that Tab reaches, so a keyboard scrolls it with the arrow keys in every browser. Chromium and Firefox make a scrolling box focusable on their own, and Safari does not. A block that fits is no stop at all. **The code the block draws is marked untranslated**, 'translate="no"' on its '<pre>', so a page translator leaves highlighted lines and a diff as written. Code in the slot takes its translation mode from the element, which writes nothing onto itself, so set 'translate="no"' on the element to keep a translator off plain code too. 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. */
18744
+ /** 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 'mark-lines' to mark lines a reader should look at, such as '2, 4-6': the block draws a band behind each run, placed where the lines are laid out, so it follows a highlighter's markup and lines that wrap. Set 'wrap' to wrap long lines rather than scroll them; a gutter then numbers each line where it starts. Set 'wrappable' for a button in the header that turns 'wrap' on and off, pressed while the lines wrap. The header holds the name, the 'actions' slot, and the copy button. Slot a control into 'actions', such as a button that sets 'wrap' or one that opens the code in an editor, and the block draws a header for it even with no name. 'copy-icon' and 'copied-icon' replace the copy button's two icons. 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; it is handed the block's 'language', so one function serves every block. The code stays in the slot, so the copy button and the page's own text are the code as written. Set 'expandable' on a block whose height is capped, such as by '--code-block-max-block-size', and a button under it shows every line and then fewer again, as a docs site's long example does. The button is drawn only while the cap hides something, says whether the block is expanded with 'aria-expanded', names the block it opens with 'aria-controls', and the block carries ':state(expanded)' while it is. 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. **A block that scrolls is a tab stop.** While its lines run past its width or its cap, the scroller is a region named for the block, such as "Code, app.ts", that Tab reaches, so a keyboard scrolls it with the arrow keys in every browser. Chromium and Firefox make a scrolling box focusable on their own, and Safari does not. A block that fits is no stop at all. **The code the block draws is marked untranslated**, 'translate="no"' on its '<pre>', so a page translator leaves highlighted lines and a diff as written. Code in the slot takes its translation mode from the element, which writes nothing onto itself, so set 'translate="no"' on the element to keep a translator off plain code too. 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. */
18390
18745
  "helix-headless-code-block": DefineCustomElement<
18391
18746
  HelixHeadlessCodeBlock,
18392
18747
  HelixHeadlessCodeBlockVueProps,
@@ -18434,13 +18789,13 @@ export interface WcToolkitVueGlobalComponents {
18434
18789
  HelixHeadlessDataTableVueProps,
18435
18790
  HelixHeadlessDataTableVueEvents
18436
18791
  >;
18437
- /** 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. Text that is not a date gives the form an empty value, as a native date field does, and 'value' keeps the text so it can be corrected. **Keyboard.** The field is one tab stop, or each segment is with 'segmented', and the trigger is one more. | Key | What it does | |---|---| | Down | In the text field, opens the calendar with focus on the chosen day. | | Alt with Down | Opens the calendar, from the text field or a segment. | | Enter | In the text field, takes the typed date and submits the form, as a native field does. | | Escape | Closes the calendar and puts focus back in the field. | | Tab | In the open calendar, moves between its controls. Out of the field, closes it. | | Up, Down on a segment | Steps the segment by one, round from its last value to its first. | | Page Up, Page Down on a segment | Steps by a page: a week of days, two months, or five years. | | Home, End on a segment | Goes to the segment's first or last value. | | Digits on a segment | Fill it, and move to the next once it can take no more. | | Backspace, Delete on a segment | Empty the segment. | | Left, Right on a segment | Move to the previous or the next segment, along the line of text. | In the calendar, the keys are 'DatePicker''s: the arrows move by a day or a week, Page Up and Page Down by a month, with Shift by a year, and Home and End to the start and the end of the week. */
18792
+ /** 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 field reads ISO, '2026-08-04', and a date written in the order, the digits, and the month names of 'locale', '8/4/2026' or 'Aug 4, 2026' in 'en-US' and '4.8.2026' in 'de-DE', which becomes the value as you leave the field. 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. The text field is a 'combobox' with 'aria-haspopup="dialog"', 'aria-expanded', and 'aria-controls', as in the APG date picker combobox, since Down opens the calendar from it. 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. A 'range' is two rows with a dash between them, the start and the end, as React Aria's DateRangePicker draws them, and 'multiple' keeps the text. Text that is not a date gives the form an empty value, as a native date field does, and 'value' keeps the text so it can be corrected. **Keyboard.** The field is one tab stop, or each segment is with 'segmented', and the trigger is one more. | Key | What it does | |---|---| | Down | In the text field, opens the calendar with focus on the chosen day. | | Alt with Down | Opens the calendar, from the text field or a segment. | | Enter | In the text field, takes the typed date and submits the form, as a native field does. | | Escape | Closes the calendar and puts focus back in the field. | | Tab | In the open calendar, moves between its controls. Out of the field, closes it. | | Up, Down on a segment | Steps the segment by one, round from its last value to its first. | | Page Up, Page Down on a segment | Steps by a page: a week of days, two months, or five years. | | Home, End on a segment | Goes to the segment's first or last value. | | Digits on a segment | Fill it, and move to the next once it can take no more. | | Backspace, Delete on a segment | Empty the segment. | | Left, Right on a segment | Move to the previous or the next segment, along the line of text. | In the calendar, the keys are 'DatePicker''s: the arrows move by a day or a week, Page Up and Page Down by a month, with Shift by a year, and Home and End to the start and the end of the week. */
18438
18793
  "helix-headless-date-input": DefineCustomElement<
18439
18794
  HelixHeadlessDateInput,
18440
18795
  HelixHeadlessDateInputVueProps,
18441
18796
  HelixHeadlessDateInputVueEvents
18442
18797
  >;
18443
- /** 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. **The days are the Gregorian calendar's**, written in 'calendar': the locale's own where its months are the Gregorian months, as 'th-TH' writes 2569 for 2026, and 'gregory' where they are not, as for 'fa-IR'. '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. */
18798
+ /** 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. **The months are the ones 'calendar' counts**: the Gregorian months for the locale's own calendar where its months are the Gregorian months, as 'th-TH' writes 2569 for 2026, and 'gregory' where they are not, as for 'fa-IR' with no 'calendar'. Name a calendar with months of its own, such as 'persian', and every view counts its days, months, and years from 'Intl'. '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'. With a 'mode', the grid carries 'aria-multiselectable'. While a range holds one end, the grid draws the range to the day under the pointer or the focus, marking those cells 'data-range-preview'. The chosen date, range, or count of dates is the grid's description, in a region screen readers announce when it changes, as React Aria's calendars do. 'selection-label' words it. '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. */
18444
18799
  "helix-headless-date-picker": DefineCustomElement<
18445
18800
  HelixHeadlessDatePicker,
18446
18801
  HelixHeadlessDatePickerVueProps,
@@ -18536,7 +18891,7 @@ export interface WcToolkitVueGlobalComponents {
18536
18891
  HelixHeadlessFilterInputVueProps,
18537
18892
  HelixHeadlessFilterInputVueEvents
18538
18893
  >;
18539
- /** Formats a date with 'Intl' where it is shown, so you do not write the same 'Intl' call and options in your own code. **'elapsed' shows compact relative time for a feed**, such as "42m", "3h", or "1d". After six days it shows a date. In en-US, 'Intl.NumberFormat' narrow renders both 'minute' and 'month' as 'm', so a compact "3m" could mean three minutes or three months. 'elapsedTime' in 'helix/core' does the measurement. **'relative' shows the same reading in words**, such as "3 hours ago" at 'long', "3 hr. ago" at 'short' and "3h ago" at 'narrow', the styles 'sl-relative-time' offers. 'numeric="always"' says "1 day ago" where the default says "yesterday". **'date-style' and 'time-style' take each locale's own pattern**, such as "Tuesday, August 4, 2026" at 'full', and stand in for the separate fields, which 'Intl' refuses beside them. 'hour-cycle' sets a twelve or twenty-four hour clock either way. **The text refreshes on one timer shared by the page.** Each element schedules an update for when its current reading expires, and an element showing a date schedules none, so a long feed left open costs almost nothing. 'frozen' draws the reading once and leaves it. **'fields' draws each field of a date as a part of its own**, such as 'day', 'month' and 'year', so a stylesheet can set the year in a lighter ink or the weekday in capitals with '::part()'. The text between the fields is the locale's own and has no part. An 'elapsed' or 'relative' reading is one phrase, with no parts inside it. **The output is always '<time datetime>'**, so copy and paste and scripts parsing the page get the exact instant, whatever the visible text says. A screen reader reads the text, so an 'elapsed' reading is named in full, such as "3 hours ago", and carries the whole date as its title. **A date with no time, such as '2026-08-04', is that day everywhere.** It is formatted in UTC unless 'time-zone' says otherwise, as Date Input and Date Picker format their dates, so a reader west of UTC sees August 4 and not August 3. **A date is written in a calendar Date Picker draws**: the locale's own where its months are the Gregorian months, as 'th-TH' writes 2569 for 2026, and 'gregory' where they are not, as for 'fa-IR'. 'calendar' picks one of the five. */
18894
+ /** Formats a date with 'Intl' where it is shown, so you do not write the same 'Intl' call and options in your own code. **'elapsed' shows compact relative time for a feed**, such as "42m", "3h", or "1d". After six days it shows a date. In en-US, 'Intl.NumberFormat' narrow renders both 'minute' and 'month' as 'm', so a compact "3m" could mean three minutes or three months. 'elapsedTime' in 'helix/core' does the measurement. **'relative' shows the same reading in words**, such as "3 hours ago" at 'long', "3 hr. ago" at 'short' and "3h ago" at 'narrow', the styles 'sl-relative-time' offers. 'numeric="always"' says "1 day ago" where the default says "yesterday". **'date-style' and 'time-style' take each locale's own pattern**, such as "Tuesday, August 4, 2026" at 'full', and stand in for the separate fields, which 'Intl' refuses beside them. 'hour-cycle' sets a twelve or twenty-four hour clock either way. **The text refreshes on one timer shared by the page.** Each element schedules an update for when its current reading expires, and an element showing a date schedules none, so a long feed left open costs almost nothing. 'frozen' draws the reading once and leaves it. **'fields' draws each field of a date as a part of its own**, such as 'day', 'month' and 'year', so a stylesheet can set the year in a lighter ink or the weekday in capitals with '::part()'. The text between the fields is the locale's own and has no part. An 'elapsed' or 'relative' reading is one phrase, with no parts inside it. **The output is always '<time datetime>'**, so copy and paste and scripts parsing the page get the exact instant, whatever the visible text says. A screen reader reads the text, so an 'elapsed' reading is named in full, such as "3 hours ago", and carries the whole date as its title. **A date with no time, such as '2026-08-04', is that day everywhere.** It is formatted in UTC unless 'time-zone' says otherwise, as Date Input and Date Picker format their dates, so a reader west of UTC sees August 4 and not August 3. **A date is written in a calendar Date Picker draws**: the locale's own where its months are the Gregorian months, as 'th-TH' writes 2569 for 2026, and 'gregory' where they are not, as for 'fa-IR'. 'calendar' picks any of them, 'persian' and 'hebrew' included. */
18540
18895
  "helix-headless-format-date": DefineCustomElement<
18541
18896
  HelixHeadlessFormatDate,
18542
18897
  HelixHeadlessFormatDateVueProps,
@@ -18884,7 +19239,7 @@ export interface WcToolkitVueGlobalComponents {
18884
19239
  HelixHeadlessSkipLinkVueProps,
18885
19240
  HelixHeadlessSkipLinkVueEvents
18886
19241
  >;
18887
- /** 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, and a named range submits one entry per thumb under its name, the lowest first. A range given more than two values, such as 'default-value="20,50,80"', has a thumb for each, as React Aria's slider takes any number of thumbs: each stops at its neighbors, and the ones between the first and the last are named by 'thumb-label'. 'min-steps-between-thumbs' keeps them that many steps apart, and the readout joins the two as 'range-text' writes them. 'origin' sets where a single thumb's fill starts: at 'min', at the middle of the track, or at 'max'. A balance or an offset from zero fills from the middle, as Zag's slider 'origin' does. The fill's ends are published as '--slider-from' and '--slider-to'. '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. **Keyboard.** Each thumb is one tab stop, and its keys are the native range's. | Key | What it does | |---|---| | Right, Up | Moves the thumb up by 'step'. | | Left, Down | Moves the thumb down by 'step'. | | Page Up, Page Down | Moves the thumb by a larger step. | | Home, End | Moves the thumb to its lowest or highest value. | Under 'readonly' none of these move the thumb, and Tab still reaches it. Each thumb is an '<input type="range">' with 'aria-valuetext' where the value is formatted or worded. A range's thumbs say they stop at each other with 'aria-valuemin' and 'aria-valuemax'. */
19242
+ /** 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, and a named range submits one entry per thumb under its name, the lowest first. A range given more than two values, such as 'default-value="20,50,80"', has a thumb for each, as React Aria's slider takes any number of thumbs: each stops at its neighbors, and the ones between the first and the last are named by 'thumb-label'. 'min-steps-between-thumbs' keeps them that many steps apart, and the readout joins the two as 'range-text' writes them. A press on a range's track takes the nearest thumb to the point pressed, and moving the pointer drags it, as React Aria's and Web Awesome's sliders do. The thumb takes focus, and 'change' is sent as the press ends. 'origin' sets where a single thumb's fill starts: at 'min', at the middle of the track, or at 'max'. A balance or an offset from zero fills from the middle, as Zag's slider 'origin' does. The fill's ends are published as '--slider-from' and '--slider-to'. '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. **Keyboard.** Each thumb is one tab stop, and its keys are the native range's. | Key | What it does | |---|---| | Right, Up | Moves the thumb up by 'step'. | | Left, Down | Moves the thumb down by 'step'. | | Page Up, Page Down | Moves the thumb by 'page-step', or by the platform's larger step where it is not set. | | Home, End | Moves the thumb to its lowest or highest value. | Under 'readonly' none of these move the thumb, and Tab still reaches it. Each thumb is an '<input type="range">' with 'aria-valuetext' where the value is formatted or worded. A range's thumbs say they stop at each other with 'aria-valuemin' and 'aria-valuemax'. */
18888
19243
  "helix-headless-slider": DefineCustomElement<
18889
19244
  HelixHeadlessSlider,
18890
19245
  HelixHeadlessSliderVueProps,
@@ -18962,13 +19317,13 @@ export interface WcToolkitVueGlobalComponents {
18962
19317
  HelixHeadlessTableColumnVueProps,
18963
19318
  HelixHeadlessTableColumnVueEvents
18964
19319
  >;
18965
- /** Lays out the rows on a CSS grid, so every column lines up across rows and each row stays a real element that can be styled, hidden, or made interactive. A '<table>' layout aligns columns but limits almost everything else. A grid of elements has no table structure for assistive technology, so the roles are set explicitly: 'table', 'row', 'cell', 'columnheader', and 'rowheader' for a 'header' cell in a row of values. Rows are 'display: contents', so their cells become items of the one grid. **Sorting.** A column with 'sortable' and a 'field' draws its heading as a button that sorts the rows by the text of its cells, numbers by their value. Your markup is not reordered: the table draws the rows in the sorted order. 1. Each press cycles the column through ascending, descending, and the order the rows were written in, which keeps a server's own ranking reachable. 2. 'helix-sort' asks first, with 'field:direction', or empty for the written order. Refuse it to keep the order, or to sort the rows yourself and set 'sort'. 3. 'helix-sorted' follows once the order stands, and 'sort' holds it. 4. The heading carries 'aria-sort', and a screen reader hears 'sorted-label' ("Sorted by Name, ascending") or 'unsorted-label' from a polite region. Tab reaches each sort button, and Enter or Space presses it. The 'heading' slot names the table: slot a heading or a line of text into it, and the table is named by its words. An 'aria-label' or 'aria-labelledby' on the host wins over it. **Selecting.** 'selectable' adds a column of checkboxes. 1. Each row is known by its 'value', or by its place among the rows where it has none, and 'selected' holds the chosen keys, comma separated, the same shape 'DataTable' uses. 'default-selected' is where it starts. 2. A row's checkbox is named by 'select-row-label' ("Select {row}") with the words of the row's first cell. The checkbox in the heading selects every row, and shows a dash while only some are chosen. 3. 'helix-select' asks first, with every key the change would leave. Refuse it to keep the selection. 'helix-selected' follows once it stands. 4. A chosen row takes ':state(selected)', and a screen reader hears 'selected-label' ("2 selected") from a polite region. Tab reaches each checkbox, and Space ticks it. To act on one row, put a link or a button in a cell, or give the row an 'href'. **Moving rows.** 'reorderable' adds a column of grips before the checkboxes, under a heading named by 'row-grips-label'. 1. Each row is known by its 'value', or by its place among the rows where it has none, as for selecting. Give rows a 'value' when they move, so a key stays with its row. 2. A grip is a button named by 'move-row-label' ("Move {row}") with the words of the row's first cell. Drag it to move its row, and the page scrolls near an edge. Or press it with Space, Enter, or a click to pick the row up, move it with Up, Down, Home, and End, and press it again to drop it. A click on another row drops it there, and Escape puts it back. 3. 'helix-before-reorder' asks first, and 'helix-reorder' follows with 'keys', every row's key in the new order. **You move the rows**: the table moves no element of yours, and focus goes back to the moved row's grip once you have. 4. Each step is said in the table's live region, in words you can change: 'picked-up-label', 'moved-label', 'dropped-label', and 'canceled-label'. The grips do nothing while a sort is set. **A grid.** 'grid' makes the table one tab stop that the arrow keys move through cell by cell, the headings included, as React Aria's table is. The table is then a 'grid' and each value a 'gridcell', and the table gives every cell a 'tabindex' so focus can rest on it: set 'grid' only where the cells may carry one. | Key | What it does | |---|---| | Right, Left | Moves one cell along the row. Left moves on, on a right-to-left page. | | Down, Up | Moves one row, the headings included. | | Home, End | Moves to the first or the last cell of the row. | | Control with Home or End | Moves to the first or the last cell of the table. | | Page Down, Page Up | Moves by the rows that fit in view. | | Enter, F2 | Moves into the cell's links and controls. Escape or F2 moves back to the cell, and Tab moves between the controls of one cell. | | Enter on a cell of a row with 'href' | Follows the row's link. | | Enter, Space on a sortable heading | Sorts by the column. | | Space on a row, Enter or Space on its checkbox cell | Selects the row, in a 'selectable' table. | | Enter or Space on a grip cell | Picks the row up, or drops it, in a 'reorderable' table. Up, Down, Home, and End move a row picked up, and Escape puts it back. | | Shift with Down or Up | Selects the rows it moves across, in a 'selectable' table. | | Shift with Space | Selects every row from the one last chosen, in a 'selectable' table. | | Control or Command with A | Selects every row, in a 'selectable' table. | | A letter or a word | Moves to the next row whose first cell starts with what you typed. | | Tab | Leaves the table. | When the rows did not load, set 'error-text', such as "The orders did not load", and put a button that tries again in the 'error' slot. The line shows after the rows in place of the empty and loading lines, the live region says it, and the table takes the 'error' state. Clear it once you try again. The CSS custom properties listed for this component are written by it and read by the stylesheet that draws it. Do not set them. Each holds a number the component computes and CSS cannot, so the stylesheet can draw the table without measuring anything. */
19320
+ /** Lays out the rows on a CSS grid, so every column lines up across rows and each row stays a real element that can be styled, hidden, or made interactive. A '<table>' layout aligns columns but limits almost everything else. A grid of elements has no table structure for assistive technology, so the roles are set explicitly: 'table', 'row', 'cell', 'columnheader', and 'rowheader' for a 'header' cell in a row of values. Rows are 'display: contents', so their cells become items of the one grid. **Sorting.** A column with 'sortable' and a 'field' draws its heading as a button that sorts the rows by the text of its cells, numbers by their value. Your markup is not reordered: the table draws the rows in the sorted order. 1. Each press cycles the column through ascending, descending, and the order the rows were written in, which keeps a server's own ranking reachable. 2. 'helix-sort' asks first, with 'field:direction', or empty for the written order. Refuse it to keep the order, or to sort the rows yourself and set 'sort'. 3. 'helix-sorted' follows once the order stands, and 'sort' holds it. 4. The heading carries 'aria-sort', and a screen reader hears 'sorted-label' ("Sorted by Name, ascending") or 'unsorted-label' from a polite region. Tab reaches each sort button, and Enter or Space presses it. The 'heading' slot names the table: slot a heading or a line of text into it, and the table is named by its words. An 'aria-label' or 'aria-labelledby' on the host wins over it. **Selecting.** 'selectable' adds a column of checkboxes. 1. Each row is known by its 'value', or by its place among the rows where it has none, and 'selected' holds the chosen keys, comma separated, the same shape 'DataTable' uses. 'default-selected' is where it starts. 2. A row's checkbox is named by 'select-row-label' ("Select {row}") with the words of the row's first cell. The checkbox in the heading selects every row, and shows a dash while only some are chosen. 3. 'helix-select' asks first, with every key the change would leave. Refuse it to keep the selection. 'helix-selected' follows once it stands. 4. A chosen row takes ':state(selected)', and a screen reader hears 'selected-label' ("2 selected") from a polite region. Tab reaches each checkbox, and Space ticks it. To act on one row, put a link or a button in a cell, or give the row an 'href'. 'selection-mode="single"' selects one row at a time: ticking a row lets go of the one before, the heading holds no checkbox, and Shift and Control with A take in nothing more. 'selection-behavior="replace"' makes a press on a row, anywhere but its own controls, select it alone, as a file list does, and in a 'grid' table the arrow keys carry the selection with them. Control or Command with a press adds or takes out the row, and with an arrow moves without selecting. Shift with a press takes in the rows from the one last chosen. **Nesting rows.** A row with 'parent' sits under the row of that key, as a file sits in a folder. The table then draws a column of disclosure buttons, under a heading named by 'expand-column-label': a row with rows under it has a button named by 'expand-row-label' ("Expand {row}") that says with 'aria-expanded' whether it is open, and the rows under a shut row are not drawn. 'expanded' holds the open rows' keys, comma separated, and 'default-expanded' is where it starts. A press asks with 'helix-before-toggle' and tells with 'helix-toggle', both from the row, so you can refuse it or load the rows on the way. A sort orders the rows under each row among themselves, and in a 'grid' table the table is a 'treegrid' whose rows say their depth. **Moving rows.** 'reorderable' adds a column of grips before the checkboxes, under a heading named by 'row-grips-label'. 1. Each row is known by its 'value', or by its place among the rows where it has none, as for selecting. Give rows a 'value' when they move, so a key stays with its row. 2. A grip is a button named by 'move-row-label' ("Move {row}") with the words of the row's first cell. Drag it to move its row, and the page scrolls near an edge. Or press it with Space, Enter, or a click to pick the row up, move it with Up, Down, Home, and End, and press it again to drop it. A click on another row drops it there, and Escape puts it back. 3. 'helix-before-reorder' asks first, and 'helix-reorder' follows with 'keys', every row's key in the new order. **You move the rows**: the table moves no element of yours, and focus goes back to the moved row's grip once you have. 4. Each step is said in the table's live region, in words you can change: 'picked-up-label', 'moved-label', 'dropped-label', and 'canceled-label'. The grips do nothing while a sort is set. **A grid.** 'grid' makes the table one tab stop that the arrow keys move through cell by cell, the headings included, as React Aria's table is. The table is then a 'grid' and each value a 'gridcell', and the table gives every cell a 'tabindex' so focus can rest on it: set 'grid' only where the cells may carry one. | Key | What it does | |---|---| | Right, Left | Moves one cell along the row. Left moves on, on a right-to-left page. | | Down, Up | Moves one row, the headings included. | | Home, End | Moves to the first or the last cell of the row. | | Control with Home or End | Moves to the first or the last cell of the table. | | Page Down, Page Up | Moves by the rows that fit in view. | | Enter, F2 | Moves into the cell's links and controls. Escape or F2 moves back to the cell, and Tab moves between the controls of one cell. | | Enter on a cell of a row with 'href' | Follows the row's link. | | Enter, Space on a sortable heading | Sorts by the column. | | Space on a row, Enter or Space on its checkbox cell | Selects the row, in a 'selectable' table. | | Enter or Space on a disclosure cell | Shows or hides the rows under the row, in a table whose rows nest. | | Enter or Space on a grip cell | Picks the row up, or drops it, in a 'reorderable' table. Up, Down, Home, and End move a row picked up, and Escape puts it back. | | Down, Up, Page Down, Page Up under 'selection-behavior="replace"' | Selects the row it moves to alone. Control or Command with the key moves without selecting. | | Shift with Down or Up | Selects the rows it moves across, in a 'selectable' table. | | Shift with Space | Selects every row from the one last chosen, in a 'selectable' table. | | Control or Command with A | Selects every row, in a 'selectable' table. | | A letter or a word | Moves to the next row whose first cell starts with what you typed. | | Tab | Leaves the table. | **Loading more.** 'load-more' sends 'helix-load-more' once the end of the table comes within a screen of view, in the box that scrolls it or the page, once for each number of rows: add rows and it can send it again. Set 'loading' while you fetch, and the table asks for nothing until it clears. When the rows did not load, set 'error-text', such as "The orders did not load", and put a button that tries again in the 'error' slot. The line shows after the rows in place of the empty and loading lines, the live region says it, and the table takes the 'error' state. Clear it once you try again. The CSS custom properties listed for this component are written by it and read by the stylesheet that draws it. Do not set them. Each holds a number the component computes and CSS cannot, so the stylesheet can draw the table without measuring anything. */
18966
19321
  "helix-headless-table": DefineCustomElement<
18967
19322
  HelixHeadlessTable,
18968
19323
  HelixHeadlessTableVueProps,
18969
19324
  HelixHeadlessTableVueEvents
18970
19325
  >;
18971
- /** The row renders its cells straight through and lays out none of them, so a stylesheet can place them in the table's grid and every column lines up across rows. The row still exists as an element, so you can style it, hide it, or make it interactive. In a 'selectable' table the row draws a checkbox cell before its own cells, and 'value' is the key the table's 'selected' lists it by. 'disabled' keeps the row out of the selection and out of its link. In a 'reorderable' table the row draws a grip cell before those, holding a button named by the table's 'move-row-label', and 'value' is the key 'helix-reorder' lists it by. The table says which row is moving and where the drop indicator is, with the 'dragging', 'drop-before', and 'drop-after' states. **'href' makes the whole row a link**, as a row action does in React Aria's table: a press anywhere on the row follows it, except on a link or a control of the row's own, and Control, Command or Shift open it the way they open a link. A drag that selects text follows nothing. A row in a table is not a stop of its own, so put the same link in a cell, usually the row header, which is what the keyboard and a screen reader reach. In a 'grid' table, Enter on any cell of the row follows it as well. */
19326
+ /** The row renders its cells straight through and lays out none of them, so a stylesheet can place them in the table's grid and every column lines up across rows. The row still exists as an element, so you can style it, hide it, or make it interactive. In a 'selectable' table the row draws a checkbox cell before its own cells, and 'value' is the key the table's 'selected' lists it by. 'disabled' keeps the row out of the selection and out of its link. In a 'reorderable' table the row draws a grip cell before those, holding a button named by the table's 'move-row-label', and 'value' is the key 'helix-reorder' lists it by. The table says which row is moving and where the drop indicator is, with the 'dragging', 'drop-before', and 'drop-after' states. **'parent' nests the row under another**, by that row's key. The table then draws a column of disclosure buttons: a row with rows under it has one, named by the table's 'expand-row-label' and saying whether it is open with 'aria-expanded', and its rows are drawn only while it is open. The cell is indented by the row's depth through '--table-row-level'. **'href' makes the whole row a link**, as a row action does in React Aria's table: a press anywhere on the row follows it, except on a link or a control of the row's own, and Control, Command or Shift open it the way they open a link. A drag that selects text follows nothing. A row in a table is not a stop of its own, so put the same link in a cell, usually the row header, which is what the keyboard and a screen reader reach. In a 'grid' table, Enter on any cell of the row follows it as well. */
18972
19327
  "helix-headless-table-row": DefineCustomElement<
18973
19328
  HelixHeadlessTableRow,
18974
19329
  HelixHeadlessTableRowVueProps,
@@ -19010,13 +19365,13 @@ export interface WcToolkitVueGlobalComponents {
19010
19365
  HelixHeadlessTextareaVueProps,
19011
19366
  HelixHeadlessTextareaVueEvents
19012
19367
  >;
19013
- /** 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. Text that is not a time gives the form an empty value, as a native time field does, and 'value' keeps the text so it can be corrected. **Keyboard.** The field is one tab stop, or each segment is with 'segmented', and the trigger is one more. | Key | What it does | |---|---| | Down | In the text field, opens the list on the chosen time. | | Alt with Down | Opens the list, from the text field or a segment. | | Enter | In the text field, takes the typed time and submits the form, as a native field does. In the list, chooses the highlighted time. | | Escape | Closes the list and puts focus back in the field. | | Up, Down on a segment | Steps the segment by one, round from its last value to its first. | | Page Up, Page Down on a segment | Steps by a page: two hours, or fifteen minutes or seconds. | | Home, End on a segment | Goes to the segment's first or last value. | | Digits on a segment | Fill it, and move to the next once it can take no more. | | A letter on the half of the day | Picks the half whose name starts with it, such as A for AM. | | Backspace, Delete on a segment | Empty the segment. | | Left, Right on a segment | Move to the previous or the next segment, along the line of text. | In the list, the keys are 'TimePicker''s. */
19368
+ /** 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. You can type '14:30', or a time as you write one, such as '2:30 PM', '2.30pm', or '14h30', and the field reads it as you leave it, with AM and PM in the locale's words. 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. The text field is a 'combobox' with 'aria-haspopup="dialog"', 'aria-expanded', and 'aria-controls', since Down opens the list from it. 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. A 'range' is two rows with a dash between them, the start and the end, and 'multiple' keeps the text. Text that is not a time gives the form an empty value, as a native time field does, and 'value' keeps the text so it can be corrected. **Keyboard.** The field is one tab stop, or each segment is with 'segmented', and the trigger is one more. | Key | What it does | |---|---| | Down | In the text field, opens the list on the chosen time. | | Alt with Down | Opens the list, from the text field or a segment. | | Enter | In the text field, takes the typed time and submits the form, as a native field does. In the list, chooses the highlighted time. | | Escape | Closes the list and puts focus back in the field. | | Up, Down on a segment | Steps the segment by one, round from its last value to its first. | | Page Up, Page Down on a segment | Steps by a page: two hours, or fifteen minutes or seconds. | | Home, End on a segment | Goes to the segment's first or last value. | | Digits on a segment | Fill it, and move to the next once it can take no more. | | A letter on the half of the day | Picks the half whose name starts with it, such as A for AM. | | Backspace, Delete on a segment | Empty the segment. | | Left, Right on a segment | Move to the previous or the next segment, along the line of text. | In the list, the keys are 'TimePicker''s. */
19014
19369
  "helix-headless-time-input": DefineCustomElement<
19015
19370
  HelixHeadlessTimeInput,
19016
19371
  HelixHeadlessTimeInputVueProps,
19017
19372
  HelixHeadlessTimeInputVueEvents
19018
19373
  >;
19019
- /** 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. **Keyboard.** The list is one tab stop, and each wheel is one. | Key | What it does | |---|---| | Down, Up | Moves to the next or the previous time, or in a wheel to the next or the previous hour, minute, second, or half of the day. | | Home, End | Moves to the first or the last time, or the first or the last in a wheel. | | Page Down, Page Up | Moves by as many times as the list shows at once. | | Digits | Moves to the next time that starts with what you typed, such as '9' for 9:00. | | Enter, Space | Chooses the highlighted time. Moving chooses too, except under 'manual' or with a 'mode'. With a 'mode', Space adds or removes the time. | | Right, Left | In the wheels, moves to the next or the previous wheel, mirrored right to left. | | Tab | Moves to the next wheel, then out of the picker. | **ARIA.** The list is a 'listbox' named by 'label', a slotted label, the host's 'aria-label' or its 'aria-labelledby'. A development build warns where all four are empty. The list is described by the hint, or by the message in 'feedback' in its place, and carries 'aria-multiselectable' with a 'mode' and 'aria-invalid' while 'feedback' says what is wrong. The wheels are a 'group' with that name, holding one 'listbox' per wheel, named "Hour", "Minute", "Second" and "AM/PM" in the page's language, and each described the same way. */
19374
+ /** 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. **Keyboard.** The list is one tab stop, and each wheel is one. | Key | What it does | |---|---| | Down, Up | Moves to the next or the previous time, or in a wheel to the next or the previous hour, minute, second, or half of the day. | | Home, End | Moves to the first or the last time, or the first or the last in a wheel. | | Page Down, Page Up | Moves by as many times as the list shows at once. | | Digits | Moves to the next time that starts with what you typed, such as '9' for 9:00. | | Enter, Space | Chooses the highlighted time. Moving chooses too, except under 'manual' or with a 'mode'. With a 'mode', Space adds or removes the time. | | Right, Left | In the wheels, moves to the next or the previous wheel, mirrored right to left. | | Tab | Moves to the next wheel, then out of the picker. | **ARIA.** The list is a 'listbox' named by 'label', a slotted label, the host's 'aria-label' or its 'aria-labelledby'. A development build warns where all four are empty. The list is described by the hint, or by the message in 'feedback' in its place, and carries 'aria-multiselectable' with a 'mode'. It carries 'aria-invalid' while 'feedback' says what is wrong, while it holds a time outside 'min' and 'max' or one the picker does not offer, and, for a 'required' picker with no time, once the reader has chosen one or a form has refused the picker. The wheels are a 'group' with that name, holding one 'listbox' per wheel, named "Hour", "Minute", "Second" and "AM/PM" in the page's language, and each described the same way. */
19020
19375
  "helix-headless-time-picker": DefineCustomElement<
19021
19376
  HelixHeadlessTimePicker,
19022
19377
  HelixHeadlessTimePickerVueProps,
@@ -19028,7 +19383,7 @@ export interface WcToolkitVueGlobalComponents {
19028
19383
  HelixHeadlessTimelineGroupVueProps,
19029
19384
  HelixHeadlessTimelineGroupVueEvents
19030
19385
  >;
19031
- /** Given 'datetime', the label you write is wrapped in a '<time>' element, so a machine-readable value such as "2026-08-19" travels with a label such as "yesterday". Without 'datetime', the label is a '<span>'. **'relative' writes the time for you** as how long ago it was, such as "3 hours ago", from 'datetime', where the 'time' slot is empty. The words move on as they go stale, "3 hours ago" becoming "4 hours ago", with one wakeup shared by every reading on the page, as 'FormatDate' keeps its own. They are in the language of the page, or of the nearest 'lang'. Each entry draws the connector line that arrives at it and hides it when it is the first entry, using ':host(:first-child)'. This needs no index, no counting parent, and no script. 'Steps' and 'Breadcrumbs' work the same way. 'tone' sets the kind of event and is the only thing that colors the mark. It uses the same values as 'Announcement'. */
19386
+ /** Given 'datetime', the label you write is wrapped in a '<time>' element, so a machine-readable value such as "2026-08-19" travels with a label such as "yesterday". Without 'datetime', the label is a '<span>'. **'relative' writes the time for you** as how long ago it was, such as "3 hours ago", from 'datetime', where the 'time' slot is empty. The words move on as they go stale, "3 hours ago" becoming "4 hours ago", with one wakeup shared by every reading on the page, as 'FormatDate' keeps its own. They are in the language of the page, or of the nearest 'lang'. Each entry draws the connector line that arrives at it and hides it when it is the first entry, using ':host(:first-child)'. This needs no index, no counting parent, and no script. 'Steps' and 'Breadcrumbs' work the same way. 'tone' sets the kind of event and is the only thing that colors the mark. It uses the same values as 'Announcement'. **A screen reader hears the tone as a word**, from 'tone-labels': the mark is an image named "Error", "Information", "Success" or "Warning", so the color is not the only place the meaning is. 'neutral' and 'primary' say nothing unless you name them. **'pending' marks an event that has not happened yet**, such as one that is scheduled. The mark is the open circle, and a screen reader hears 'pending-label', "Scheduled", with the tone's word. */
19032
19387
  "helix-headless-timeline-item": DefineCustomElement<
19033
19388
  HelixHeadlessTimelineItem,
19034
19389
  HelixHeadlessTimelineItemVueProps,
@@ -19052,7 +19407,7 @@ export interface WcToolkitVueGlobalComponents {
19052
19407
  HelixHeadlessToastVueProps,
19053
19408
  HelixHeadlessToastVueEvents
19054
19409
  >;
19055
- /** 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. Use 'values' where an item's value holds a comma. The form receives one entry per pressed value, and a page the browser brings back presses the same items again. The indicator stays hidden, and each pressed item is marked with ':state(pressed)'. Inside a toolbar it is a named group of that toolbar's controls instead, so a reader meets one toolbar. 'orientation="vertical"' runs the items down a column, says so to the accessibility tree, and the up and down arrows move between them. **Keyboard.** The group is one tab stop: the chosen item, or the first that can be chosen, as in a radio group, and in a multiple group the item focus was last on. | Key | What it does | |---|---| | Right, Down | Moves to the next item, from the last back to the first. In a single group, chooses it. | | Left, Up | Moves to the item before, from the first round to the last. In a single group, chooses it. | | Home, End | Moves to the first or the last item. In a single group, chooses it. | | Space, Enter | Chooses the focused item, or presses or releases it in a multiple group. | Left and Right swap on a right-to-left page, and a disabled item is passed over. A single group is a 'radiogroup' of items with 'role="radio"' and 'aria-checked'. A multiple group is a 'toolbar' of buttons with 'aria-pressed', or a 'group' inside a toolbar. The group is named by 'label' and carries 'aria-orientation' under 'orientation'. */
19410
+ /** 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. Use 'values' where an item's value holds a comma. The form receives one entry per pressed value, and a page the browser brings back presses the same items again. The indicator stays hidden, and each pressed item is marked with ':state(pressed)'. Inside a toolbar it is a named group of that toolbar's controls instead, so a reader meets one toolbar. 'orientation="vertical"' runs the items down a column, says so to the accessibility tree, and the up and down arrows move between them. **Keyboard.** The group is one tab stop: the chosen item, or the first that can be chosen, as in a radio group, and in a multiple group the item focus was last on. | Key | What it does | |---|---| | Right, Down | Moves to the next item, from the last back to the first. In a single group, chooses it. | | Left, Up | Moves to the item before, from the first round to the last. In a single group, chooses it. | | Home, End | Moves to the first or the last item. In a single group, chooses it. | | Space, Enter | Chooses the focused item, or presses or releases it in a multiple group. With 'allow-empty-selection', takes back the chosen item. | Left and Right swap on a right-to-left page, and a disabled item is passed over. A single group is a 'radiogroup' of items with 'role="radio"' and 'aria-checked'. A multiple group is a 'toolbar' of buttons with 'aria-pressed', or a 'group' inside a toolbar. The group is named by 'label' and carries 'aria-orientation' under 'orientation'. */
19056
19411
  "helix-headless-toggle-group": DefineCustomElement<
19057
19412
  HelixHeadlessToggleGroup,
19058
19413
  HelixHeadlessToggleGroupVueProps,
@@ -19118,7 +19473,7 @@ export interface WcToolkitVueGlobalComponents {
19118
19473
  HelixHeadlessVideoPlaylistMenuVueProps,
19119
19474
  HelixHeadlessVideoPlaylistMenuVueEvents
19120
19475
  >;
19121
- /** **You slot the player**, so it keeps your appearance, extra controls, captions, and poster treatment. 'Sandbox' takes its preview and 'Menu' its trigger the same way. **Entries are markup.** React skips properties it would set imperatively during hydration, so an array property on a custom element is missing on the first paint of a server-rendered page. 'using-the-elements.mdx' has the measurement. Markup also makes each entry a real button with its name inside. **The playlist does not play media.** It sets 'src' on the player and tracks which entry is current. The current entry moves when: - an entry is pressed, - the player dispatches 'helix-next' or 'helix-previous', or - the player reaches the end. On 'ended' the playlist advances and the next clip starts playing, because the user already pressed play once. 'repeat' decides what happens at the end: 'one' plays the same entry again, and 'all' goes from the last entry back to the first. Without it, the playlist stops on the last entry and sends 'helix-end'. 'shuffle' plays the entries in a random order, starting from the one that is current, and 'previous' retraces that order. **The player is named by the current entry**, and the device's own media controls show the entry as the title. A player you gave a 'label' keeps your name, and only the title follows the entry. **Keyboard.** Each entry is a button in the tab order, and Enter or Space plays it. The arrow keys move focus to the entry before or after, and Home and End to the first and the last, passing over disabled entries. The current entry carries 'aria-current'. While focus is on the player, the player's own keys work, and 'Video' lists them, and Shift with N or P plays the next or the previous entry. The player's previous and next controls move through the entries in the same order the playlist does. **What a screen reader hears.** A list named by 'label', with a button for each entry. When the playlist moves to another entry, by a press, by the player's controls, or at the end of a clip, a live region says 'playing-label', "Now playing" and the entry's name. */
19476
+ /** **You slot the player**, so it keeps your appearance, extra controls, captions, and poster treatment. 'Sandbox' takes its preview and 'Menu' its trigger the same way. **Entries are markup.** React skips properties it would set imperatively during hydration, so an array property on a custom element is missing on the first paint of a server-rendered page. 'using-the-elements.mdx' has the measurement. Markup also makes each entry a real button with its name inside. **The playlist does not play media.** It sets 'src' on the player and tracks which entry is current. The current entry moves when: - an entry is pressed, - the player dispatches 'helix-next' or 'helix-previous', or - the player reaches the end. On 'ended' the playlist advances and the next clip starts playing, because the user already pressed play once. 'no-advance' turns that off, and the playlist stays on the entry that ended. 'repeat' decides what happens at the end: 'one' plays the same entry again, and 'all' goes from the last entry back to the first. Without it, the playlist stops on the last entry and sends 'helix-end'. 'shuffle' plays the entries in a random order, starting from the one that is current, and 'previous' retraces that order. **'helix-before-activate' says why the playlist is moving**, in 'detail.cause': 'press' for an entry or a menu choice, 'next' and 'previous' for the player's controls and the methods, 'ended' at the end of a clip, and 'removed' when the current entry leaves the playlist. Cancel an 'ended' move to show your own "Up next" countdown, then call 'next()'. **Removing the current entry moves the playlist on**, to the entry after it, or to the one before it when it was the last. A clip that was playing keeps playing in the entry that takes its place. **The player is named by the current entry**, and the device's own media controls show the entry as the title. A player you gave a 'label' keeps your name, and only the title follows the entry. **Keyboard.** The entries take one stop in the tab order: the entry you last focused, or the current entry before you have focused one. Enter or Space plays it. The arrow keys move focus to the entry before or after, and Home and End to the first and the last, passing over disabled entries. The current entry carries 'aria-current'. While focus is on the player, the player's own keys work, and 'Video' lists them, and Shift with N or P plays the next or the previous entry. The player's previous and next controls move through the entries in the same order the playlist does. **What a screen reader hears.** A list named by 'label', with a button for each entry. When the playlist moves to another entry, by a press, by the player's controls, or at the end of a clip, a live region says 'playing-label', "Now playing" and the entry's name. */
19122
19477
  "helix-headless-video-playlist": DefineCustomElement<
19123
19478
  HelixHeadlessVideoPlaylist,
19124
19479
  HelixHeadlessVideoPlaylistVueProps,
@@ -19130,7 +19485,7 @@ export interface WcToolkitVueGlobalComponents {
19130
19485
  HelixHeadlessVideoVueProps,
19131
19486
  HelixHeadlessVideoVueEvents
19132
19487
  >;
19133
- /** The items arrive as data, in one of two ways: - 'items' takes an array. A framework sets it as a property, and React hydration keeps it. - 'for' names a '<script type="application/json">' that holds an array, which a server sends as markup. Each item is drawn into a row in one of two ways: - 'renderItem' is a function from an item and its index to the row's content: a Lit template, a string, or a DOM node. - A '<template>' child defines one row. 'data-field="name"' fills an element with the item's 'name' as text, and 'data-field-href="url"' writes the item's 'url' into 'href', the same for any attribute. A field may be a path of keys, such as 'author.name'. Rows are your markup in the light DOM, so your stylesheet styles them. **A grid.** 'columns' lays the items out that many to a line, as a grid of equal columns, and windows the set a line at a time, as React Aria's grid layout does. Each item draws one element, a cell of the grid, and 'estimate' is the height of a line. Space the items with padding inside each one, which the list measures with the line. **Keyboard.** The list is one tab stop. | Key | What it does | |---|---| | Down, Up | Moves to the next or the previous item, or in a grid to the item in the same column on the next or the previous line. | | Right, Left | In a grid, moves to the next or the previous item along the line, the other way round on a right-to-left page. | | Home, End | Moves to the first or the last item. | | Page Down, Page Up | Moves by the number of items, or of lines in a grid, on screen. | | A letter or a word | Moves to the next item whose text starts with what you typed. | | Tab | Moves into the focused row's own links and buttons, then out of the list. | An item that is not drawn is scrolled into view and focused, so a keyboard reaches the whole set. When the row holding the tab stop scrolls away, the stop moves to the first row on screen. Typing matches each item's 'text-field', which is the first 'data-field' of the row template by default, or the item itself when it is a string or a number. Each row says its place in the whole set with 'aria-posinset' and 'aria-setsize', so a screen reader says "4,000 of 10,000". The row holding focus stays drawn when it scrolls out. **Selecting.** 'selection-mode' makes the list a list box a reader chooses from: 'single' selects one item and 'multiple' any number. Space or a press selects an item, Shift with Space, an arrow, Home, End or a press takes in the items from the last one chosen, and Control or Command with A selects them all, in 'multiple'. 'value' holds the chosen items' keys, separated by commas, in the order of the set: 'key-field' names each item's key, and a string or a number item is its own key. A change asks with 'helix-before-change' and tells with 'change'. Each row is an 'option' marked 'aria-selected', so a row's own links and buttons are not reached there: keep those to a list without 'selection-mode'. **Loading more.** 'helix-range-change' fires as the items on screen change, and 'range' holds them. 'helix-load-more' fires once a reader is within one screen of the end, once for each length of the set: add to 'items' and it can fire again. While you fetch, set 'loading': the list is busy, and a row after the last item says "Loading more" ('loading-label', or your own content in the 'loading' slot). 'scrollToIndex' takes a reader to an item. **An empty list.** Set 'empty-label', or put your own content in the 'empty' slot, for a row shown when there are no items and none are loading, such as "No messages yet" and a link to write one. Without either, an empty list shows nothing, since a list whose items have not arrived yet has not said it has none. The list takes the 'empty' state while it has read its items and holds none, and the 'loading' state while 'loading' is set, so your stylesheet can change the box around it for either. A list with no name is reported once in a development build. Name it with 'label' or 'aria-label'. **Row height.** Rows are placed by 'estimate' until they are drawn. Then the list reads the drawn rows' height once and places every row by it, so a wrong estimate still reaches the last item. Set 'measured' for rows of different heights. Once the list draws rows of different heights, such as rows that wrap on a narrow screen, it places each row by its own height whether 'measured' is set or not. The list follows its source. A new 'items' array, an edit to the script's text, or a script replaced under the same id draws the new rows. A row that stays in view keeps its element as the list scrolls. The viewport scrolls on this tier. It carries 'data-scroller', and 'core' ships '[data-scroller] { overflow: auto }' into every shadow root, so 'scrollTop' works with no stylesheet. You still need to set a block size. */
19488
+ /** The items arrive as data, in one of two ways: - 'items' takes an array. A framework sets it as a property, and React hydration keeps it. - 'for' names a '<script type="application/json">' that holds an array, which a server sends as markup. Each item is drawn into a row in one of two ways: - 'renderItem' is a function from an item and its index to the row's content: a Lit template, a string, or a DOM node. - A '<template>' child defines one row. 'data-field="name"' fills an element with the item's 'name' as text, and 'data-field-href="url"' writes the item's 'url' into 'href', the same for any attribute. A field may be a path of keys, such as 'author.name'. Rows are your markup in the light DOM, so your stylesheet styles them. **A grid.** 'columns' lays the items out that many to a line, as a grid of equal columns, and windows the set a line at a time, as React Aria's grid layout does. Each item draws one element, a cell of the grid, and 'estimate' is the height of a line. 'min-column-width' lays out as many columns as fit the box instead, as React Aria's grid layout does with its smallest item size, and follows the box as it resizes. 'gap' spaces the rows, and the columns of a grid, by a number of pixels the list counts in each row's place. **Keyboard.** The list is one tab stop. | Key | What it does | |---|---| | Down, Up | Moves to the next or the previous item, or in a grid to the item in the same column on the next or the previous line. | | Right, Left | In a grid, moves to the next or the previous item along the line, the other way round on a right-to-left page. | | Home, End | Moves to the first or the last item. | | Page Down, Page Up | Moves by the number of items, or of lines in a grid, on screen. | | A letter or a word | Moves to the next item whose text starts with what you typed. | | Escape | Lets go of every chosen item, in a list with 'selection-mode'. | | Tab | Moves into the focused row's own links and buttons, then out of the list. | An item that is not drawn is scrolled into view and focused, so a keyboard reaches the whole set. When the row holding the tab stop scrolls away, the stop moves to the first row on screen. Typing matches each item's 'text-field', which is the first 'data-field' of the row template by default, or the item itself when it is a string or a number. Each row says its place in the whole set with 'aria-posinset' and 'aria-setsize', so a screen reader says "4,000 of 10,000". The row holding focus stays drawn when it scrolls out. **Selecting.** 'selection-mode' makes the list a list box a reader chooses from: 'single' selects one item and 'multiple' any number. Space or a press selects an item, Shift with Space, an arrow, Home, End or a press takes in the items from the last one chosen, and Control or Command with A selects them all, in 'multiple'. Escape lets go of every chosen item, and keeps the key from the dialog or menu around the list while there was something to let go of. 'value' holds the chosen items' keys, separated by commas, in the order of the set: 'key-field' names each item's key, and a string or a number item is its own key. A change asks with 'helix-before-change' and tells with 'change'. Each row is an 'option' marked 'aria-selected', so a row's own links and buttons are not reached there: keep those to a list without 'selection-mode'. 'selection-behavior="replace"' selects the item pressed alone, as a file list does, and the arrow keys carry the selection with them. Control or Command with a press or with Space adds or takes out one item, and with an arrow moves without selecting. **Disabled items.** 'disabled-keys' names items by their keys, separated by commas. Their rows carry 'aria-disabled', the keys and typing pass over them, and a press, Space, or Control with A does not select them. **Loading more.** 'helix-range-change' fires as the items on screen change, and 'range' holds them. 'helix-load-more' fires once a reader is within one screen of the end, once for each length of the set: add to 'items' and it can fire again. While you fetch, set 'loading': the list is busy, and a row after the last item says "Loading more" ('loading-label', or your own content in the 'loading' slot). 'scrollToIndex' takes a reader to an item. **An empty list.** Set 'empty-label', or put your own content in the 'empty' slot, for a row shown when there are no items and none are loading, such as "No messages yet" and a link to write one. Without either, an empty list shows nothing, since a list whose items have not arrived yet has not said it has none. The list takes the 'empty' state while it has read its items and holds none, and the 'loading' state while 'loading' is set, so your stylesheet can change the box around it for either. A list with no name is reported once in a development build. Name it with 'label' or 'aria-label'. **Row height.** Rows are placed by 'estimate' until they are drawn. Then the list reads the drawn rows' height once and places every row by it, so a wrong estimate still reaches the last item. Set 'measured' for rows of different heights. Once the list draws rows of different heights, such as rows that wrap on a narrow screen, it places each row by its own height whether 'measured' is set or not. The list follows its source. A new 'items' array, an edit to the script's text, or a script replaced under the same id draws the new rows. A row that stays in view keeps its element as the list scrolls. The viewport scrolls on this tier. It carries 'data-scroller', and 'core' ships '[data-scroller] { overflow: auto }' into every shadow root, so 'scrollTop' works with no stylesheet. You still need to set a block size. */
19134
19489
  "helix-headless-virtual-list": DefineCustomElement<
19135
19490
  HelixHeadlessVirtualList,
19136
19491
  HelixHeadlessVirtualListVueProps,