@fusion.dev/helix-headless 0.160.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 (39) hide show
  1. package/custom-elements.json +1729 -50
  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/element-events.generated.js +4 -0
  13. package/dist/splitter/root/splitter-root.d.ts +15 -0
  14. package/dist/splitter/root/splitter-root.js +16 -2
  15. package/dist/table/grid-controller.d.ts +7 -1
  16. package/dist/table/grid-controller.js +9 -1
  17. package/dist/table/root/table-root.d.ts +122 -0
  18. package/dist/table/root/table-root.js +293 -17
  19. package/dist/table/row/table-row.d.ts +41 -0
  20. package/dist/table/row/table-row.js +56 -2
  21. package/dist/timeline/item/timeline-item.d.ts +47 -10
  22. package/dist/timeline/item/timeline-item.js +36 -4
  23. package/dist/video-playlist/item/video-playlist-item.d.ts +11 -0
  24. package/dist/video-playlist/item/video-playlist-item.js +5 -0
  25. package/dist/video-playlist/menu/video-playlist-menu.d.ts +6 -0
  26. package/dist/video-playlist/menu/video-playlist-menu.js +11 -0
  27. package/dist/video-playlist/root/video-playlist-root.d.ts +59 -5
  28. package/dist/video-playlist/root/video-playlist-root.js +82 -10
  29. package/dist/virtual-list/fill.d.ts +6 -1
  30. package/dist/virtual-list/fill.js +1 -1
  31. package/dist/virtual-list/keys.d.ts +8 -0
  32. package/dist/virtual-list/keys.js +20 -0
  33. package/dist/virtual-list/root/virtual-list-root.d.ts +98 -13
  34. package/dist/virtual-list/root/virtual-list-root.js +195 -20
  35. package/lint.json +1 -1
  36. package/package.json +5 -5
  37. package/types/jsx.d.ts +936 -68
  38. package/types/vue.d.ts +226 -12
  39. package/types/words.d.ts +79 -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,
@@ -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
 
@@ -14117,6 +14174,22 @@ consumer's to set. */
14117
14174
  "corner-label"?: (HelixHeadlessSplitter["cornerLabel"]) | undefined;
14118
14175
  /** The name of the handle where two dividers cross, read by screen readers. */
14119
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;
14120
14193
  /** Which pane starts shut, when `collapsed` is not set. */
14121
14194
  "default-collapsed"?: (HelixHeadlessSplitter["defaultCollapsed"]) | undefined;
14122
14195
  /** Which pane starts shut, when `collapsed` is not set. */
@@ -14772,6 +14845,12 @@ export type HelixHeadlessTableElementEvent<E = Event> = TypedEvent<
14772
14845
  /** `helix-before-reorder` event type */
14773
14846
  export type HelixHeadlessTableHelixBeforeReorderElementEvent =
14774
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>;
14775
14854
  /** `helix-reorder` event type */
14776
14855
  export type HelixHeadlessTableHelixReorderElementEvent =
14777
14856
  HelixHeadlessTableElementEvent<HelixReorderEvent>;
@@ -14787,6 +14866,9 @@ export type HelixHeadlessTableHelixSortElementEvent =
14787
14866
  /** `helix-sorted` event type */
14788
14867
  export type HelixHeadlessTableHelixSortedElementEvent =
14789
14868
  HelixHeadlessTableElementEvent<HelixSortedEvent>;
14869
+ /** `helix-toggle` event type */
14870
+ export type HelixHeadlessTableHelixToggleElementEvent =
14871
+ HelixHeadlessTableElementEvent<HelixToggleEvent>;
14790
14872
 
14791
14873
  export type HelixHeadlessTableVueProps = {
14792
14874
  /** The word for an ascending sort, in a `sorted-label` that writes `{order}`. */
@@ -14828,6 +14910,12 @@ and a list here would be a second way to say what that says. This table's
14828
14910
  cells are markup, and a table written as rows of cells with no column
14829
14911
  declared in it has nowhere else to be sized from. */
14830
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;
14831
14919
  /** The keys selected at the start, separated by commas. Used until `selected`
14832
14920
  is set. */
14833
14921
  "default-selected"?: (HelixHeadlessTable["defaultSelected"]) | undefined;
@@ -14862,6 +14950,18 @@ While it is set, a line after the rows shows it, or your own content in the
14862
14950
  `error` slot, in place of the empty and loading lines, and the live region
14863
14951
  says it. */
14864
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;
14865
14965
  /** The table's name where neither `label` nor an `aria-label` or
14866
14966
  `aria-labelledby` on the host gives it one. */
14867
14967
  "fallback-label"?: (HelixHeadlessTable["fallbackLabel"]) | undefined;
@@ -14881,6 +14981,12 @@ cells, which is the one way a cell of your markup can take focus. */
14881
14981
  An `aria-label` or `aria-labelledby` on the host names the table too, and
14882
14982
  wins over this. */
14883
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;
14884
14990
  /** What screen readers hear each time a key moves a held row, in a
14885
14991
  `reorderable` table. `{name}` is the row's words, `{position}` the place it
14886
14992
  would go, counting from 1, and `{count}` the number of rows. */
@@ -14915,6 +15021,12 @@ table moves no row itself: you move your rows on `helix-reorder`. */
14915
15021
  "select-all-label"?: (HelixHeadlessTable["selectAllLabel"]) | undefined;
14916
15022
  /** The name of the checkbox in the heading that selects every row. */
14917
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;
14918
15030
  /** The keys of the selected rows, separated by commas.
14919
15031
 
14920
15032
  A reader's press fires `helix-select` first, and refusing it leaves the
@@ -14931,6 +15043,20 @@ rows are chosen, written in the locale, and a language that needs plural
14931
15043
  forms writes them: `{count, plural, one {# wybrany} few {# wybrane} many
14932
15044
  {# wybranych} other {# wybranego}}`. */
14933
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;
14934
15060
  /** The name of a row's checkbox. `{row}` is replaced with the words of the
14935
15061
  row's first cell. */
14936
15062
  "select-row-label"?: (HelixHeadlessTable["selectRowLabel"]) | undefined;
@@ -14978,6 +15104,10 @@ say that without the component knowing what a row looks like. */
14978
15104
  export type HelixHeadlessTableVueEvents = {
14979
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. */
14980
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;
14981
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. */
14982
15112
  "helix-reorder": HelixHeadlessTableHelixReorderElementEvent;
14983
15113
  /** The selection is about to change. The event carries every selected key, separated by commas. Cancelable: cancel it to keep the current selection. */
@@ -14988,6 +15118,8 @@ export type HelixHeadlessTableVueEvents = {
14988
15118
  "helix-sort": HelixHeadlessTableHelixSortElementEvent;
14989
15119
  /** Fired after the sort order changes, with the new order. */
14990
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;
14991
15123
  };
14992
15124
 
14993
15125
  export type HelixHeadlessTableRowVueProps = {
@@ -15001,6 +15133,10 @@ reached. */
15001
15133
  /** The URL a press on the row follows, which makes the whole row a link.
15002
15134
  Empty, the default, leaves presses to the row's cells. */
15003
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;
15004
15140
  /** The `rel` of the row's link. You set it yourself, as on an anchor. */
15005
15141
  rel?: (HelixHeadlessTableRow["rel"]) | undefined;
15006
15142
  /** Where the row's link opens, such as `_blank`. */
@@ -16304,13 +16440,35 @@ Whatever `<time>` accepts, which is a date, a time, both, a duration or a
16304
16440
  week. Unset, the label is written as it was given and nothing claims to
16305
16441
  know what instant it names. */
16306
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;
16307
16450
  /** Writes the time as how long ago it was, or how long until it, from
16308
16451
  `datetime`, where the `time` slot is empty: `long` ("3 hours ago"),
16309
16452
  `short` ("3 hr. ago") or `narrow` ("3h ago"). Set with no value, it is
16310
16453
  `long`. The words move on as they go stale. */
16311
16454
  relative?: (HelixHeadlessTimelineItem["relative"]) | undefined;
16312
- /** 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. */
16313
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;
16314
16472
  };
16315
16473
 
16316
16474
  export type HelixHeadlessTimelineItemVueEvents = {};
@@ -17485,6 +17643,13 @@ Written by the playlist rather than by the entry, the way an option's
17485
17643
  selection is: an entry that made itself current would be a second answer to
17486
17644
  which one is playing. */
17487
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;
17488
17653
  };
17489
17654
 
17490
17655
  export type HelixHeadlessVideoPlaylistItemVueEvents = {
@@ -17535,8 +17700,20 @@ export type HelixHeadlessVideoPlaylistHelixEndElementEvent =
17535
17700
  HelixHeadlessVideoPlaylistElementEvent<HelixEndEvent>;
17536
17701
 
17537
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;
17538
17707
  /** The list's name, read by screen readers. */
17539
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;
17540
17717
  /** What the live region says when the playlist moves to another entry.
17541
17718
  `{title}` is the entry's name.
17542
17719
 
@@ -17585,7 +17762,7 @@ Ignored once `active` is written. */
17585
17762
  export type HelixHeadlessVideoPlaylistVueEvents = {
17586
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. */
17587
17764
  "helix-activate": HelixHeadlessVideoPlaylistHelixActivateElementEvent;
17588
- /** 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. */
17589
17766
  "helix-before-activate": HelixHeadlessVideoPlaylistHelixBeforeActivateElementEvent;
17590
17767
  /** The last entry finished playing, and the playlist stopped there. Not sent while `repeat` is set. */
17591
17768
  "helix-end": HelixHeadlessVideoPlaylistHelixEndElementEvent;
@@ -18092,6 +18269,12 @@ export type HelixHeadlessVirtualListVueProps = {
18092
18269
  items out as a grid of that many equal columns, windowed a line at a
18093
18270
  time, with Left and Right moving along a line. */
18094
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;
18095
18278
  /** The text of the row shown when there are no items and none are loading,
18096
18279
  where the `empty` slot is empty. Empty, the default, shows no row. */
18097
18280
  "empty-label"?: (HelixHeadlessVirtualList["emptyLabel"]) | undefined;
@@ -18106,6 +18289,11 @@ right whenever the rows really are one height and is the cheaper of the two. */
18106
18289
  /** The id of the script element that holds the items as JSON. `items` wins
18107
18290
  where both are set. */
18108
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;
18109
18297
  /** The field of each item that is its key in `value`, as a key or a path of
18110
18298
  keys. Empty reads a string or a number item as its own key, and any
18111
18299
  other item by its place in the set. */
@@ -18141,6 +18329,22 @@ disagree with itself; measuring is what a set of genuinely different
18141
18329
  heights needs and costs a read of each row as it renders. A list of
18142
18330
  one-line rows should leave this alone. */
18143
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;
18144
18348
  /** Makes the list a list box a reader chooses from: `single` selects one
18145
18349
  item, and `multiple` any number. Unset is a list a reader reads. */
18146
18350
  "selection-mode"?: (HelixHeadlessVirtualList["selectionMode"]) | undefined;
@@ -18213,6 +18417,14 @@ export type CustomCssProperties = {
18213
18417
  "--carousel-run-end"?: (string) | undefined;
18214
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. */
18215
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;
18216
18428
  /** The chosen color, painted over the checkerboard that shows transparency. */
18217
18429
  "--color-input-swatch"?: (string) | undefined;
18218
18430
  /** The chosen brightness, 0 to 100, as a percentage. */
@@ -18349,6 +18561,8 @@ export type CustomCssProperties = {
18349
18561
  "--table-cell-align"?: (string) | undefined;
18350
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. */
18351
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;
18352
18566
  /** How long this message stays, in milliseconds, for a progress hint. */
18353
18567
  "--toast-duration"?: (string) | undefined;
18354
18568
  /** How far a swipe has moved the message across, in pixels, toward the right. */
@@ -18479,7 +18693,7 @@ export interface WcToolkitVueGlobalComponents {
18479
18693
  HelixHeadlessCanvasNodeVueProps,
18480
18694
  HelixHeadlessCanvasNodeVueEvents
18481
18695
  >;
18482
- /** 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. */
18483
18697
  "helix-headless-canvas": DefineCustomElement<
18484
18698
  HelixHeadlessCanvas,
18485
18699
  HelixHeadlessCanvasVueProps,
@@ -18509,7 +18723,7 @@ export interface WcToolkitVueGlobalComponents {
18509
18723
  HelixHeadlessChatMessageVueProps,
18510
18724
  HelixHeadlessChatMessageVueEvents
18511
18725
  >;
18512
- /** 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"]'. */
18513
18727
  "helix-headless-chat": DefineCustomElement<
18514
18728
  HelixHeadlessChat,
18515
18729
  HelixHeadlessChatVueProps,
@@ -18527,7 +18741,7 @@ export interface WcToolkitVueGlobalComponents {
18527
18741
  HelixHeadlessCheckboxVueProps,
18528
18742
  HelixHeadlessCheckboxVueEvents
18529
18743
  >;
18530
- /** 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. */
18531
18745
  "helix-headless-code-block": DefineCustomElement<
18532
18746
  HelixHeadlessCodeBlock,
18533
18747
  HelixHeadlessCodeBlockVueProps,
@@ -19103,13 +19317,13 @@ export interface WcToolkitVueGlobalComponents {
19103
19317
  HelixHeadlessTableColumnVueProps,
19104
19318
  HelixHeadlessTableColumnVueEvents
19105
19319
  >;
19106
- /** 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. */
19107
19321
  "helix-headless-table": DefineCustomElement<
19108
19322
  HelixHeadlessTable,
19109
19323
  HelixHeadlessTableVueProps,
19110
19324
  HelixHeadlessTableVueEvents
19111
19325
  >;
19112
- /** 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. */
19113
19327
  "helix-headless-table-row": DefineCustomElement<
19114
19328
  HelixHeadlessTableRow,
19115
19329
  HelixHeadlessTableRowVueProps,
@@ -19169,7 +19383,7 @@ export interface WcToolkitVueGlobalComponents {
19169
19383
  HelixHeadlessTimelineGroupVueProps,
19170
19384
  HelixHeadlessTimelineGroupVueEvents
19171
19385
  >;
19172
- /** 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. */
19173
19387
  "helix-headless-timeline-item": DefineCustomElement<
19174
19388
  HelixHeadlessTimelineItem,
19175
19389
  HelixHeadlessTimelineItemVueProps,
@@ -19259,7 +19473,7 @@ export interface WcToolkitVueGlobalComponents {
19259
19473
  HelixHeadlessVideoPlaylistMenuVueProps,
19260
19474
  HelixHeadlessVideoPlaylistMenuVueEvents
19261
19475
  >;
19262
- /** **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. */
19263
19477
  "helix-headless-video-playlist": DefineCustomElement<
19264
19478
  HelixHeadlessVideoPlaylist,
19265
19479
  HelixHeadlessVideoPlaylistVueProps,
@@ -19271,7 +19485,7 @@ export interface WcToolkitVueGlobalComponents {
19271
19485
  HelixHeadlessVideoVueProps,
19272
19486
  HelixHeadlessVideoVueEvents
19273
19487
  >;
19274
- /** 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. */
19275
19489
  "helix-headless-virtual-list": DefineCustomElement<
19276
19490
  HelixHeadlessVirtualList,
19277
19491
  HelixHeadlessVirtualListVueProps,