@fusion.dev/helix-headless 0.170.0 → 0.172.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 (57) hide show
  1. package/custom-elements.json +1045 -154
  2. package/dist/chat/composer/chat-composer.d.ts +30 -2
  3. package/dist/chat/composer/chat-composer.js +29 -4
  4. package/dist/chat/root/chat-root.d.ts +73 -7
  5. package/dist/chat/root/chat-root.js +90 -5
  6. package/dist/code-block/root/code-block-root.d.ts +20 -2
  7. package/dist/code-block/root/code-block-root.js +29 -8
  8. package/dist/color-input/root/color-input-root.d.ts +15 -1
  9. package/dist/color-input/root/color-input-root.js +19 -1
  10. package/dist/color-picker/root/color-picker-root.d.ts +54 -7
  11. package/dist/color-picker/root/color-picker-root.js +62 -1
  12. package/dist/combobox/root/combobox-root.d.ts +16 -6
  13. package/dist/combobox/root/combobox-root.js +9 -2
  14. package/dist/command/root/command-root.d.ts +16 -1
  15. package/dist/command/root/command-root.js +8 -0
  16. package/dist/data-table/root/data-table-root.d.ts +5 -1
  17. package/dist/data-table/root/data-table-root.js +1 -0
  18. package/dist/dialog/root/dialog-root.js +1 -0
  19. package/dist/drawer/root/drawer-root.d.ts +4 -0
  20. package/dist/drawer/root/drawer-root.js +1 -0
  21. package/dist/element-events.generated.js +1 -0
  22. package/dist/filter-input/chip/filter-chip.d.ts +13 -3
  23. package/dist/filter-input/chip/filter-chip.js +5 -0
  24. package/dist/filter-input/menu/filter-menu.js +0 -1
  25. package/dist/filter-input/root/filter-input-root.d.ts +71 -4
  26. package/dist/filter-input/root/filter-input-root.js +87 -2
  27. package/dist/format-date/root/format-date-root.d.ts +3 -1
  28. package/dist/input/root/input-root.d.ts +6 -0
  29. package/dist/input/root/input-root.js +13 -0
  30. package/dist/lightbox/root/lightbox-root.js +1 -0
  31. package/dist/listbox/root/listbox-root.d.ts +8 -1
  32. package/dist/listbox/root/listbox-root.js +9 -3
  33. package/dist/menu/item/menu-item.d.ts +2 -0
  34. package/dist/menu/item/menu-item.js +2 -0
  35. package/dist/menu/root/menu-root.d.ts +73 -12
  36. package/dist/menu/root/menu-root.js +103 -7
  37. package/dist/number-input/root/number-input-root.d.ts +16 -6
  38. package/dist/number-input/root/number-input-root.js +15 -4
  39. package/dist/popover/root/popover-root.d.ts +59 -6
  40. package/dist/popover/root/popover-root.js +51 -3
  41. package/dist/select/root/select-root.d.ts +2 -2
  42. package/dist/select/root/select-root.js +4 -2
  43. package/dist/steps/root/steps-root.d.ts +32 -8
  44. package/dist/steps/root/steps-root.js +70 -9
  45. package/dist/steps/step/step.d.ts +9 -1
  46. package/dist/steps/step/step.js +5 -0
  47. package/dist/textarea/root/textarea-root.d.ts +8 -0
  48. package/dist/textarea/root/textarea-root.js +16 -0
  49. package/dist/video-playlist/root/video-playlist-root.d.ts +19 -1
  50. package/dist/video-playlist/root/video-playlist-root.js +14 -3
  51. package/dist/virtual-list/root/virtual-list-root.d.ts +8 -0
  52. package/dist/virtual-list/root/virtual-list-root.js +7 -2
  53. package/lint.json +1 -1
  54. package/package.json +5 -5
  55. package/types/jsx.d.ts +800 -144
  56. package/types/vue.d.ts +165 -31
  57. package/types/words.d.ts +20 -2
package/types/jsx.d.ts CHANGED
@@ -4966,6 +4966,10 @@ export type HelixHeadlessChatComposerHelixTypingElementEvent =
4966
4966
  HelixHeadlessChatComposerElementEvent<HelixTypingEvent>;
4967
4967
 
4968
4968
  export type HelixHeadlessChatComposerProps = {
4969
+ /** A message about the draft, shown under the field. While set, the composer
4970
+ is invalid, does not send, and does not submit, as a field's `feedback`
4971
+ does, and the message is announced as it appears. */
4972
+ feedback?: (HelixHeadlessChatComposer["feedback"]) | undefined;
4969
4973
  /** The field's name, read by screen readers. */
4970
4974
  label?: (HelixHeadlessChatComposer["label"]) | undefined;
4971
4975
  /** The most characters a draft can have. The field stops taking more. */
@@ -5054,6 +5058,10 @@ Here rather than on each control. */
5054
5058
  };
5055
5059
 
5056
5060
  export type HelixHeadlessChatComposerSolidJsProps = {
5061
+ /** A message about the draft, shown under the field. While set, the composer
5062
+ is invalid, does not send, and does not submit, as a field's `feedback`
5063
+ does, and the message is announced as it appears. */
5064
+ "prop:feedback"?: (HelixHeadlessChatComposer["feedback"]) | undefined;
5057
5065
  /** The field's name, read by screen readers. */
5058
5066
  "prop:label"?: (HelixHeadlessChatComposer["label"]) | undefined;
5059
5067
  /** The most characters a draft can have. The field stops taking more. */
@@ -6148,6 +6156,12 @@ export type HelixHeadlessCodeBlockHelixToggleElementEvent =
6148
6156
  HelixHeadlessCodeBlockElementEvent<HelixToggleEvent>;
6149
6157
 
6150
6158
  export type HelixHeadlessCodeBlockProps = {
6159
+ /** The lines to mark as inserted, as numbers and ranges counted from 1, such
6160
+ as `3-4`. Drawn as `mark-lines` is, in the added color. Not for a diff. */
6161
+ "added-lines"?: (HelixHeadlessCodeBlock["addedLines"]) | undefined;
6162
+ /** The lines to mark as inserted, as numbers and ranges counted from 1, such
6163
+ as `3-4`. Drawn as `mark-lines` is, in the added color. Not for a diff. */
6164
+ addedLines?: (HelixHeadlessCodeBlock["addedLines"]) | undefined;
6151
6165
  /** The name of a block that scrolls, which is a tab stop while it does.
6152
6166
 
6153
6167
  Where the block has a name, the scroller says it too, such as "Code,
@@ -6306,6 +6320,12 @@ A false boolean reflects as the attribute's absence, so this costs no
6306
6320
  reflected property taking no default is satisfied by the default being
6307
6321
  `false`. */
6308
6322
  noCopy?: (HelixHeadlessCodeBlock["noCopy"]) | undefined;
6323
+ /** The lines to mark as deleted, as numbers and ranges counted from 1. Drawn
6324
+ as `mark-lines` is, in the removed color. Not for a diff. */
6325
+ "removed-lines"?: (HelixHeadlessCodeBlock["removedLines"]) | undefined;
6326
+ /** The lines to mark as deleted, as numbers and ranges counted from 1. Drawn
6327
+ as `mark-lines` is, in the removed color. Not for a diff. */
6328
+ removedLines?: (HelixHeadlessCodeBlock["removedLines"]) | undefined;
6309
6329
  /** The words of a button that shows a folded run of unchanged lines, in a
6310
6330
  diff with `context-lines`. `{count}` is how many. */
6311
6331
  "show-unchanged-label"?: (HelixHeadlessCodeBlock["showUnchangedLabel"]) | undefined;
@@ -6378,6 +6398,12 @@ read, nor for a diff. */
6378
6398
  };
6379
6399
 
6380
6400
  export type HelixHeadlessCodeBlockSolidJsProps = {
6401
+ /** The lines to mark as inserted, as numbers and ranges counted from 1, such
6402
+ as `3-4`. Drawn as `mark-lines` is, in the added color. Not for a diff. */
6403
+ "attr:added-lines"?: (HelixHeadlessCodeBlock["addedLines"]) | undefined;
6404
+ /** The lines to mark as inserted, as numbers and ranges counted from 1, such
6405
+ as `3-4`. Drawn as `mark-lines` is, in the added color. Not for a diff. */
6406
+ "prop:addedLines"?: (HelixHeadlessCodeBlock["addedLines"]) | undefined;
6381
6407
  /** The name of a block that scrolls, which is a tab stop while it does.
6382
6408
 
6383
6409
  Where the block has a name, the scroller says it too, such as "Code,
@@ -6536,6 +6562,12 @@ A false boolean reflects as the attribute's absence, so this costs no
6536
6562
  reflected property taking no default is satisfied by the default being
6537
6563
  `false`. */
6538
6564
  "prop:noCopy"?: (HelixHeadlessCodeBlock["noCopy"]) | undefined;
6565
+ /** The lines to mark as deleted, as numbers and ranges counted from 1. Drawn
6566
+ as `mark-lines` is, in the removed color. Not for a diff. */
6567
+ "attr:removed-lines"?: (HelixHeadlessCodeBlock["removedLines"]) | undefined;
6568
+ /** The lines to mark as deleted, as numbers and ranges counted from 1. Drawn
6569
+ as `mark-lines` is, in the removed color. Not for a diff. */
6570
+ "prop:removedLines"?: (HelixHeadlessCodeBlock["removedLines"]) | undefined;
6539
6571
  /** The words of a button that shows a folded run of unchanged lines, in a
6540
6572
  diff with `context-lines`. `{count}` is how many. */
6541
6573
  "attr:show-unchanged-label"?: (HelixHeadlessCodeBlock["showUnchangedLabel"]) | undefined;
@@ -7404,10 +7436,11 @@ would give one control two of each. What is left is the validity call and
7404
7436
  the anchor the browser points its bubble at.
7405
7437
 
7406
7438
  **Text that is not a color is bad input**, so a form does not submit
7407
- `#00` from a half-typed value. The picker draws no message of its own, so
7408
- reporting it as each keystroke arrives shows nothing until the form asks;
7409
- Color Input shows its own message against the field the reader typed
7410
- into. */
7439
+ `#00` from a half-typed value. The picker marks it, and says
7440
+ `badInputMessage` under itself, once the reader leaves the value field or
7441
+ presses Enter, and a missing color once the reader has committed one or a
7442
+ form has refused the picker. Color Input shows its own message against the
7443
+ field the reader typed into. */
7411
7444
  required?: (HelixHeadlessColorPicker["required"]) | undefined;
7412
7445
  /** What the square's horizontal ramp is called. */
7413
7446
  "saturation-label"?: (HelixHeadlessColorPicker["saturationLabel"]) | undefined;
@@ -7784,10 +7817,11 @@ would give one control two of each. What is left is the validity call and
7784
7817
  the anchor the browser points its bubble at.
7785
7818
 
7786
7819
  **Text that is not a color is bad input**, so a form does not submit
7787
- `#00` from a half-typed value. The picker draws no message of its own, so
7788
- reporting it as each keystroke arrives shows nothing until the form asks;
7789
- Color Input shows its own message against the field the reader typed
7790
- into. */
7820
+ `#00` from a half-typed value. The picker marks it, and says
7821
+ `badInputMessage` under itself, once the reader leaves the value field or
7822
+ presses Enter, and a missing color once the reader has committed one or a
7823
+ form has refused the picker. Color Input shows its own message against the
7824
+ field the reader typed into. */
7791
7825
  "prop:required"?: (HelixHeadlessColorPicker["required"]) | undefined;
7792
7826
  /** What the square's horizontal ramp is called. */
7793
7827
  "attr:saturation-label"?: (HelixHeadlessColorPicker["saturationLabel"]) | undefined;
@@ -8063,12 +8097,13 @@ language. */
8063
8097
  locale?: (HelixHeadlessCombobox["locale"]) | undefined;
8064
8098
  /** Whether more than one option can be chosen.
8065
8099
 
8066
- The list already does the work: `value` comes apart on commas, a press
8067
- toggles rather than replaces, and the arrows move without choosing. What
8068
- this adds is the tags, and keeping the panel open between picks.
8100
+ The list already does the work: `value` is the chosen values joined with
8101
+ commas, a press toggles rather than replaces, and the arrows move without
8102
+ choosing. What this adds is the tags, and keeping the panel open between
8103
+ picks.
8069
8104
 
8070
- A comma is therefore not available inside an option's value, which is the
8071
- listbox's contract and not this element's to change.
8105
+ An option's value may hold a comma, and it is read as one value, as
8106
+ `Select` and `Listbox` read it. So may an answer the reader created.
8072
8107
 
8073
8108
  **The list is told, and the field is not.** `aria-multiselectable` belongs
8074
8109
  to `listbox`, `grid`, `tree` and `tablist`, and `combobox` dropped it in
@@ -8428,12 +8463,13 @@ language. */
8428
8463
  "prop:locale"?: (HelixHeadlessCombobox["locale"]) | undefined;
8429
8464
  /** Whether more than one option can be chosen.
8430
8465
 
8431
- The list already does the work: `value` comes apart on commas, a press
8432
- toggles rather than replaces, and the arrows move without choosing. What
8433
- this adds is the tags, and keeping the panel open between picks.
8466
+ The list already does the work: `value` is the chosen values joined with
8467
+ commas, a press toggles rather than replaces, and the arrows move without
8468
+ choosing. What this adds is the tags, and keeping the panel open between
8469
+ picks.
8434
8470
 
8435
- A comma is therefore not available inside an option's value, which is the
8436
- listbox's contract and not this element's to change.
8471
+ An option's value may hold a comma, and it is read as one value, as
8472
+ `Select` and `Listbox` read it. So may an answer the reader created.
8437
8473
 
8438
8474
  **The list is told, and the field is not.** `aria-multiselectable` belongs
8439
8475
  to `listbox`, `grid`, `tree` and `tablist`, and `combobox` dropped it in
@@ -8718,6 +8754,18 @@ so a palette filtered on a server sends one `helix-filter` for a word.
8718
8754
  so a palette filtered on a server sends one `helix-filter` for a word.
8719
8755
  `0` filters on every keystroke. See Listbox's `filter-delay`. */
8720
8756
  filterDelay?: (HelixHeadlessCommand["filterDelay"]) | undefined;
8757
+ /** Where Home and End go from the filter field.
8758
+
8759
+ Absent, they move the caret, as APG's combobox has them. `list` moves the
8760
+ highlight to the first or the last command, as React Aria's Autocomplete
8761
+ does, and Shift with either still selects the text. */
8762
+ "home-end"?: (HelixHeadlessCommand["homeEnd"]) | undefined;
8763
+ /** Where Home and End go from the filter field.
8764
+
8765
+ Absent, they move the caret, as APG's combobox has them. `list` moves the
8766
+ highlight to the first or the last command, as React Aria's Autocomplete
8767
+ does, and Shift with either still selects the text. */
8768
+ homeEnd?: (HelixHeadlessCommand["homeEnd"]) | undefined;
8721
8769
  /** The key that opens the palette, written as `mod+k`, `shift+p`, or `k`,
8722
8770
  in Kbd's chord spelling: `mod` is Command or Control, `ctrl`, `cmd`,
8723
8771
  `alt` and `shift` the keys they name.
@@ -8735,6 +8783,10 @@ and `open`, `toggle` and the dialog's parts do nothing. */
8735
8783
  inline?: (HelixHeadlessCommand["inline"]) | undefined;
8736
8784
  /** Accessible name for the overlay, which has no visible heading. */
8737
8785
  label?: (HelixHeadlessCommand["label"]) | undefined;
8786
+ /** How the commands are laid out, as Listbox's `layout`: `grid` draws them in
8787
+ rows and columns, for a palette of icons or emoji, and the arrow keys
8788
+ follow the rows and the columns. Absent is one command under another. */
8789
+ layout?: (HelixHeadlessCommand["layout"]) | undefined;
8738
8790
  /** What the list says when its commands could not be loaded, such as after a
8739
8791
  request to a server fails. Empty, null or no attribute is no error, so
8740
8792
  removing the attribute clears it. Passed to the list, which shows it
@@ -8854,6 +8906,18 @@ so a palette filtered on a server sends one `helix-filter` for a word.
8854
8906
  so a palette filtered on a server sends one `helix-filter` for a word.
8855
8907
  `0` filters on every keystroke. See Listbox's `filter-delay`. */
8856
8908
  "prop:filterDelay"?: (HelixHeadlessCommand["filterDelay"]) | undefined;
8909
+ /** Where Home and End go from the filter field.
8910
+
8911
+ Absent, they move the caret, as APG's combobox has them. `list` moves the
8912
+ highlight to the first or the last command, as React Aria's Autocomplete
8913
+ does, and Shift with either still selects the text. */
8914
+ "attr:home-end"?: (HelixHeadlessCommand["homeEnd"]) | undefined;
8915
+ /** Where Home and End go from the filter field.
8916
+
8917
+ Absent, they move the caret, as APG's combobox has them. `list` moves the
8918
+ highlight to the first or the last command, as React Aria's Autocomplete
8919
+ does, and Shift with either still selects the text. */
8920
+ "prop:homeEnd"?: (HelixHeadlessCommand["homeEnd"]) | undefined;
8857
8921
  /** The key that opens the palette, written as `mod+k`, `shift+p`, or `k`,
8858
8922
  in Kbd's chord spelling: `mod` is Command or Control, `ctrl`, `cmd`,
8859
8923
  `alt` and `shift` the keys they name.
@@ -8871,6 +8935,10 @@ and `open`, `toggle` and the dialog's parts do nothing. */
8871
8935
  "prop:inline"?: (HelixHeadlessCommand["inline"]) | undefined;
8872
8936
  /** Accessible name for the overlay, which has no visible heading. */
8873
8937
  "prop:label"?: (HelixHeadlessCommand["label"]) | undefined;
8938
+ /** How the commands are laid out, as Listbox's `layout`: `grid` draws them in
8939
+ rows and columns, for a palette of icons or emoji, and the arrow keys
8940
+ follow the rows and the columns. Absent is one command under another. */
8941
+ "prop:layout"?: (HelixHeadlessCommand["layout"]) | undefined;
8874
8942
  /** What the list says when its commands could not be loaded, such as after a
8875
8943
  request to a server fails. Empty, null or no attribute is no error, so
8876
8944
  removing the attribute clears it. Passed to the list, which shows it
@@ -9633,7 +9701,11 @@ thousand rows, where the page is a reasonable fetch and a poor render.
9633
9701
 
9634
9702
  Off by default. Windowing costs a scroll listener, a measurement per row
9635
9703
  drawn, and a `block-size` on the scrolling box, and a table of twenty rows
9636
- should pay none of them. */
9704
+ should pay none of them.
9705
+
9706
+ While windowed, the `table` part scrolls on this tier: it carries
9707
+ `data-scroller`, and `core` ships `[data-scroller] { overflow: auto }` into
9708
+ every shadow root. You still need to give it a block size. */
9637
9709
  windowed?: (HelixHeadlessDataTable["windowed"]) | undefined;
9638
9710
  /** The text shown and announced when there are no rows and none are loading. */
9639
9711
  "empty-text"?: (HelixHeadlessDataTable["emptyText"]) | undefined;
@@ -10062,7 +10134,11 @@ thousand rows, where the page is a reasonable fetch and a poor render.
10062
10134
 
10063
10135
  Off by default. Windowing costs a scroll listener, a measurement per row
10064
10136
  drawn, and a `block-size` on the scrolling box, and a table of twenty rows
10065
- should pay none of them. */
10137
+ should pay none of them.
10138
+
10139
+ While windowed, the `table` part scrolls on this tier: it carries
10140
+ `data-scroller`, and `core` ships `[data-scroller] { overflow: auto }` into
10141
+ every shadow root. You still need to give it a block size. */
10066
10142
  "prop:windowed"?: (HelixHeadlessDataTable["windowed"]) | undefined;
10067
10143
  /** The text shown and announced when there are no rows and none are loading. */
10068
10144
  "attr:empty-text"?: (HelixHeadlessDataTable["emptyText"]) | undefined;
@@ -13542,6 +13618,13 @@ makes an unusual filter look unusual. */
13542
13618
  operatorLabel?: (HelixHeadlessFilterChip["operatorLabel"]) | undefined;
13543
13619
  /** Whether the element shows a control that dismisses it. */
13544
13620
  dismissible?: (HelixHeadlessFilterChip["dismissible"]) | undefined;
13621
+ /** Whether the remove button is a tab stop of its own.
13622
+
13623
+ `FilterInput` writes `false` on the chips in its `tags` slot: the field's
13624
+ text is its one tab stop, and the arrow keys move from the text to the
13625
+ chips, as in a `multiple` Combobox. No attribute: it is coordination
13626
+ between elements, as `Tag.dismissTabStop` is. */
13627
+ dismissTabStop?: (HelixHeadlessFilterChip["dismissTabStop"]) | undefined;
13545
13628
 
13546
13629
  /** Fired when the user asks to remove the filter. Cancelable: call `preventDefault()` to keep the chip. */
13547
13630
  "onhelix-dismiss"?: ((
@@ -13612,6 +13695,13 @@ makes an unusual filter look unusual. */
13612
13695
  "prop:operatorLabel"?: (HelixHeadlessFilterChip["operatorLabel"]) | undefined;
13613
13696
  /** Whether the element shows a control that dismisses it. */
13614
13697
  "prop:dismissible"?: (HelixHeadlessFilterChip["dismissible"]) | undefined;
13698
+ /** Whether the remove button is a tab stop of its own.
13699
+
13700
+ `FilterInput` writes `false` on the chips in its `tags` slot: the field's
13701
+ text is its one tab stop, and the arrow keys move from the text to the
13702
+ chips, as in a `multiple` Combobox. No attribute: it is coordination
13703
+ between elements, as `Tag.dismissTabStop` is. */
13704
+ "prop:dismissTabStop"?: (HelixHeadlessFilterChip["dismissTabStop"]) | undefined;
13615
13705
  /** Fired when the user asks to remove the filter. Cancelable: call `preventDefault()` to keep the chip. */
13616
13706
  "on:helix-dismiss"?: ((
13617
13707
  e: HelixHeadlessFilterChipHelixDismissElementEvent,
@@ -13822,6 +13912,18 @@ export type HelixHeadlessFilterInputToggleElementEvent =
13822
13912
  HelixHeadlessFilterInputElementEvent<ToggleEvent>;
13823
13913
 
13824
13914
  export type HelixHeadlessFilterInputProps = {
13915
+ /** Whether the field keeps a `FilterChip` for each filter in its `tags` slot,
13916
+ from the `helix-facet` events it hears.
13917
+
13918
+ Off, you build the chips, which is what you do when your own model holds
13919
+ the filters. On, a filter typed, picked, or changed adds or updates the
13920
+ chip for its field, one with no values takes it away (unless its
13921
+ comparison takes none, such as "is empty"), and removing the chip clears
13922
+ the filter. A `helix-facet` you cancel changes no chip.
13923
+
13924
+ The chips are elements the field adds to its own children, so leave this
13925
+ off where a framework renders those children and would remove them. */
13926
+ chips?: (HelixHeadlessFilterInput["chips"]) | undefined;
13825
13927
  /** Shows a button that empties the field.
13826
13928
 
13827
13929
  The text only. The tokens are the consumer's markup and this element is not
@@ -13843,6 +13945,29 @@ what you slot and you narrow it. */
13843
13945
  being typed, as React Aria's Autocomplete filters. Off, the panel shows
13844
13946
  what you slot and you narrow it. */
13845
13947
  filterSuggestions?: (HelixHeadlessFilterInput["filterSuggestions"]) | undefined;
13948
+ /** Whether the suggestions are still loading, such as while a request for the
13949
+ values of a typed key is out.
13950
+
13951
+ The panel opens on `loading-text`, or the `loading` slot, while the field
13952
+ has focus, and a screen reader hears it. Slot the options and clear this
13953
+ when they arrive. */
13954
+ loading?: (HelixHeadlessFilterInput["loading"]) | undefined;
13955
+ /** Text the panel shows while the suggestions load. */
13956
+ "loading-text"?: (HelixHeadlessFilterInput["loadingText"]) | undefined;
13957
+ /** Text the panel shows while the suggestions load. */
13958
+ loadingText?: (HelixHeadlessFilterInput["loadingText"]) | undefined;
13959
+ /** Text the panel shows when `filter-suggestions` hides every suggestion, such
13960
+ as "No matching filters".
13961
+
13962
+ Empty, or no `no-results` slot, and the panel closes instead, as it does
13963
+ when it has nothing to offer. */
13964
+ "no-results-text"?: (HelixHeadlessFilterInput["noResultsText"]) | undefined;
13965
+ /** Text the panel shows when `filter-suggestions` hides every suggestion, such
13966
+ as "No matching filters".
13967
+
13968
+ Empty, or no `no-results` slot, and the panel closes instead, as it does
13969
+ when it has nothing to offer. */
13970
+ noResultsText?: (HelixHeadlessFilterInput["noResultsText"]) | undefined;
13846
13971
  /** The text shown while the field is empty.
13847
13972
 
13848
13973
  Not a label: it goes when typing starts. */
@@ -14037,6 +14162,18 @@ Here rather than on each control. */
14037
14162
  };
14038
14163
 
14039
14164
  export type HelixHeadlessFilterInputSolidJsProps = {
14165
+ /** Whether the field keeps a `FilterChip` for each filter in its `tags` slot,
14166
+ from the `helix-facet` events it hears.
14167
+
14168
+ Off, you build the chips, which is what you do when your own model holds
14169
+ the filters. On, a filter typed, picked, or changed adds or updates the
14170
+ chip for its field, one with no values takes it away (unless its
14171
+ comparison takes none, such as "is empty"), and removing the chip clears
14172
+ the filter. A `helix-facet` you cancel changes no chip.
14173
+
14174
+ The chips are elements the field adds to its own children, so leave this
14175
+ off where a framework renders those children and would remove them. */
14176
+ "prop:chips"?: (HelixHeadlessFilterInput["chips"]) | undefined;
14040
14177
  /** Shows a button that empties the field.
14041
14178
 
14042
14179
  The text only. The tokens are the consumer's markup and this element is not
@@ -14058,6 +14195,29 @@ what you slot and you narrow it. */
14058
14195
  being typed, as React Aria's Autocomplete filters. Off, the panel shows
14059
14196
  what you slot and you narrow it. */
14060
14197
  "prop:filterSuggestions"?: (HelixHeadlessFilterInput["filterSuggestions"]) | undefined;
14198
+ /** Whether the suggestions are still loading, such as while a request for the
14199
+ values of a typed key is out.
14200
+
14201
+ The panel opens on `loading-text`, or the `loading` slot, while the field
14202
+ has focus, and a screen reader hears it. Slot the options and clear this
14203
+ when they arrive. */
14204
+ "prop:loading"?: (HelixHeadlessFilterInput["loading"]) | undefined;
14205
+ /** Text the panel shows while the suggestions load. */
14206
+ "attr:loading-text"?: (HelixHeadlessFilterInput["loadingText"]) | undefined;
14207
+ /** Text the panel shows while the suggestions load. */
14208
+ "prop:loadingText"?: (HelixHeadlessFilterInput["loadingText"]) | undefined;
14209
+ /** Text the panel shows when `filter-suggestions` hides every suggestion, such
14210
+ as "No matching filters".
14211
+
14212
+ Empty, or no `no-results` slot, and the panel closes instead, as it does
14213
+ when it has nothing to offer. */
14214
+ "attr:no-results-text"?: (HelixHeadlessFilterInput["noResultsText"]) | undefined;
14215
+ /** Text the panel shows when `filter-suggestions` hides every suggestion, such
14216
+ as "No matching filters".
14217
+
14218
+ Empty, or no `no-results` slot, and the panel closes instead, as it does
14219
+ when it has nothing to offer. */
14220
+ "prop:noResultsText"?: (HelixHeadlessFilterInput["noResultsText"]) | undefined;
14061
14221
  /** The text shown while the field is empty.
14062
14222
 
14063
14223
  Not a label: it goes when typing starts. */
@@ -21044,6 +21204,14 @@ or on Alt+Down or Alt+Up. */
21044
21204
 
21045
21205
  It moves if that side does not fit. */
21046
21206
  placement?: (HelixHeadlessMenu["placement"]) | undefined;
21207
+ /** What a screen reader hears when the filter narrows the rows. `{count}` is
21208
+ how many rows are left, written in the locale, and each language writes
21209
+ the forms it has, as Listbox's `results-label` does. */
21210
+ "results-label"?: (HelixHeadlessMenu["resultsLabel"]) | undefined;
21211
+ /** What a screen reader hears when the filter narrows the rows. `{count}` is
21212
+ how many rows are left, written in the locale, and each language writes
21213
+ the forms it has, as Listbox's `results-label` does. */
21214
+ resultsLabel?: (HelixHeadlessMenu["resultsLabel"]) | undefined;
21047
21215
  /** How a submenu opens. `drill` shows it in place of the page showing, with
21048
21216
  a way back. `flyout` opens it in a panel of its own beside its row. */
21049
21217
  submenus?: (HelixHeadlessMenu["submenus"]) | undefined;
@@ -21085,7 +21253,17 @@ Aria's `Autocomplete` takes `filter`. See Listbox's `filterMatch`.
21085
21253
  Absent, a row is kept where its words hold the filter, in any case. A
21086
21254
  property only, there being no way to write a function in markup. */
21087
21255
  filterMatch?: (HelixHeadlessMenu["filterMatch"]) | undefined;
21256
+ /** The values of the choice rows that are checked, anywhere in the menu, in
21257
+ document order.
21088
21258
 
21259
+ Set it to check exactly those rows and uncheck every other choice row, as
21260
+ React Aria's `selectedKeys` controls a menu's selection from one place.
21261
+ Each row keeps its own `checked` too, which this reads and writes. `change`
21262
+ is sent on the menu when a reader's choice changes it. */
21263
+ checkedValues?: (HelixHeadlessMenu["checkedValues"]) | undefined;
21264
+
21265
+ /** A reader's choice checked or unchecked rows. Read `checkedValues` for the rows that are checked now. */
21266
+ onchange?: ((e: HelixHeadlessMenuElementEvent) => void) | undefined;
21089
21267
  /** The menu is about to close. Cancelable: cancel it to keep it open. */
21090
21268
  "onhelix-before-close"?: ((
21091
21269
  e: HelixHeadlessMenuHelixBeforeCloseElementEvent,
@@ -21164,6 +21342,14 @@ or on Alt+Down or Alt+Up. */
21164
21342
 
21165
21343
  It moves if that side does not fit. */
21166
21344
  "prop:placement"?: (HelixHeadlessMenu["placement"]) | undefined;
21345
+ /** What a screen reader hears when the filter narrows the rows. `{count}` is
21346
+ how many rows are left, written in the locale, and each language writes
21347
+ the forms it has, as Listbox's `results-label` does. */
21348
+ "attr:results-label"?: (HelixHeadlessMenu["resultsLabel"]) | undefined;
21349
+ /** What a screen reader hears when the filter narrows the rows. `{count}` is
21350
+ how many rows are left, written in the locale, and each language writes
21351
+ the forms it has, as Listbox's `results-label` does. */
21352
+ "prop:resultsLabel"?: (HelixHeadlessMenu["resultsLabel"]) | undefined;
21167
21353
  /** How a submenu opens. `drill` shows it in place of the page showing, with
21168
21354
  a way back. `flyout` opens it in a panel of its own beside its row. */
21169
21355
  "prop:submenus"?: (HelixHeadlessMenu["submenus"]) | undefined;
@@ -21205,6 +21391,16 @@ Aria's `Autocomplete` takes `filter`. See Listbox's `filterMatch`.
21205
21391
  Absent, a row is kept where its words hold the filter, in any case. A
21206
21392
  property only, there being no way to write a function in markup. */
21207
21393
  "prop:filterMatch"?: (HelixHeadlessMenu["filterMatch"]) | undefined;
21394
+ /** The values of the choice rows that are checked, anywhere in the menu, in
21395
+ document order.
21396
+
21397
+ Set it to check exactly those rows and uncheck every other choice row, as
21398
+ React Aria's `selectedKeys` controls a menu's selection from one place.
21399
+ Each row keeps its own `checked` too, which this reads and writes. `change`
21400
+ is sent on the menu when a reader's choice changes it. */
21401
+ "prop:checkedValues"?: (HelixHeadlessMenu["checkedValues"]) | undefined;
21402
+ /** A reader's choice checked or unchecked rows. Read `checkedValues` for the rows that are checked now. */
21403
+ "on:change"?: ((e: HelixHeadlessMenuElementEvent) => void) | undefined;
21208
21404
  /** The menu is about to close. Cancelable: cancel it to keep it open. */
21209
21405
  "on:helix-before-close"?: ((
21210
21406
  e: HelixHeadlessMenuHelixBeforeCloseElementEvent,
@@ -22150,9 +22346,13 @@ speaks it: `feedback` replaces the message under the field and does not
22150
22346
  reach the bubble. Unset is the sentence registered for the page's
22151
22347
  language, then the English. */
22152
22348
  badInputMessage?: (HelixHeadlessNumberInput["badInputMessage"]) | undefined;
22153
- /** The name of the step down button, read by screen readers. */
22349
+ /** The name of the step down button, read by screen readers. The field's
22350
+ label follows it, so a reader hears "Decrease Quantity", as React Aria
22351
+ names its steppers. */
22154
22352
  "decrement-label"?: (HelixHeadlessNumberInput["decrementLabel"]) | undefined;
22155
- /** The name of the step down button, read by screen readers. */
22353
+ /** The name of the step down button, read by screen readers. The field's
22354
+ label follows it, so a reader hears "Decrease Quantity", as React Aria
22355
+ names its steppers. */
22156
22356
  decrementLabel?: (HelixHeadlessNumberInput["decrementLabel"]) | undefined;
22157
22357
  /** `Intl.NumberFormat` options the number is shown with while the field is
22158
22358
  not being edited: a currency, a percent, a unit, or a number of decimals.
@@ -22170,9 +22370,13 @@ Written as JSON in the attribute.
22170
22370
  <helix-number-input format-options='{"style":"currency","currency":"EUR"}'></helix-number-input>
22171
22371
  ``` */
22172
22372
  formatOptions?: (HelixHeadlessNumberInput["formatOptions"]) | undefined;
22173
- /** The name of the step up button, read by screen readers. */
22373
+ /** The name of the step up button, read by screen readers. The field's
22374
+ label follows it, so a reader hears "Increase Quantity", as React Aria
22375
+ names its steppers. */
22174
22376
  "increment-label"?: (HelixHeadlessNumberInput["incrementLabel"]) | undefined;
22175
- /** The name of the step up button, read by screen readers. */
22377
+ /** The name of the step up button, read by screen readers. The field's
22378
+ label follows it, so a reader hears "Increase Quantity", as React Aria
22379
+ names its steppers. */
22176
22380
  incrementLabel?: (HelixHeadlessNumberInput["incrementLabel"]) | undefined;
22177
22381
  /** How many steps `PageUp` and `PageDown` move.
22178
22382
 
@@ -22429,9 +22633,13 @@ speaks it: `feedback` replaces the message under the field and does not
22429
22633
  reach the bubble. Unset is the sentence registered for the page's
22430
22634
  language, then the English. */
22431
22635
  "prop:badInputMessage"?: (HelixHeadlessNumberInput["badInputMessage"]) | undefined;
22432
- /** The name of the step down button, read by screen readers. */
22636
+ /** The name of the step down button, read by screen readers. The field's
22637
+ label follows it, so a reader hears "Decrease Quantity", as React Aria
22638
+ names its steppers. */
22433
22639
  "attr:decrement-label"?: (HelixHeadlessNumberInput["decrementLabel"]) | undefined;
22434
- /** The name of the step down button, read by screen readers. */
22640
+ /** The name of the step down button, read by screen readers. The field's
22641
+ label follows it, so a reader hears "Decrease Quantity", as React Aria
22642
+ names its steppers. */
22435
22643
  "prop:decrementLabel"?: (HelixHeadlessNumberInput["decrementLabel"]) | undefined;
22436
22644
  /** `Intl.NumberFormat` options the number is shown with while the field is
22437
22645
  not being edited: a currency, a percent, a unit, or a number of decimals.
@@ -22449,9 +22657,13 @@ Written as JSON in the attribute.
22449
22657
  <helix-number-input format-options='{"style":"currency","currency":"EUR"}'></helix-number-input>
22450
22658
  ``` */
22451
22659
  "prop:formatOptions"?: (HelixHeadlessNumberInput["formatOptions"]) | undefined;
22452
- /** The name of the step up button, read by screen readers. */
22660
+ /** The name of the step up button, read by screen readers. The field's
22661
+ label follows it, so a reader hears "Increase Quantity", as React Aria
22662
+ names its steppers. */
22453
22663
  "attr:increment-label"?: (HelixHeadlessNumberInput["incrementLabel"]) | undefined;
22454
- /** The name of the step up button, read by screen readers. */
22664
+ /** The name of the step up button, read by screen readers. The field's
22665
+ label follows it, so a reader hears "Increase Quantity", as React Aria
22666
+ names its steppers. */
22455
22667
  "prop:incrementLabel"?: (HelixHeadlessNumberInput["incrementLabel"]) | undefined;
22456
22668
  /** How many steps `PageUp` and `PageDown` move.
22457
22669
 
@@ -24510,17 +24722,42 @@ export type HelixHeadlessPopoverToggleElementEvent =
24510
24722
  HelixHeadlessPopoverElementEvent<ToggleEvent>;
24511
24723
 
24512
24724
  export type HelixHeadlessPopoverProps = {
24725
+ /** The element the panel opens against, where that is not the trigger: its
24726
+ `id` in the same document or shadow root, or the element itself. Left
24727
+ empty, the panel opens against the trigger, or against the button whose
24728
+ command opened it. */
24729
+ anchor?: (HelixHeadlessPopover["anchor"]) | undefined;
24513
24730
  /** Draws a point on the panel's edge facing the trigger.
24514
24731
 
24515
24732
  Off by default, which is the house style: a panel that opens from its
24516
24733
  trigger already reads as belonging to it. */
24517
24734
  arrow?: (HelixHeadlessPopover["arrow"]) | undefined;
24735
+ /** How close to the window's edges the panel may come, in pixels, when it
24736
+ slides, shrinks or moves to the other side to fit. Left unset, it slides
24737
+ and shrinks to 8 pixels from an edge and moves to the other side only
24738
+ once it would cross one. */
24739
+ "container-padding"?: (HelixHeadlessPopover["containerPadding"] | `${number}`) | undefined;
24740
+ /** How close to the window's edges the panel may come, in pixels, when it
24741
+ slides, shrinks or moves to the other side to fit. Left unset, it slides
24742
+ and shrinks to 8 pixels from an edge and moves to the other side only
24743
+ once it would cross one. */
24744
+ containerPadding?: (HelixHeadlessPopover["containerPadding"]) | undefined;
24745
+ /** How far to slide the panel along the side it is on, in pixels: to the
24746
+ right on the top or the bottom, and down on the left or the right. */
24747
+ "cross-offset"?: (HelixHeadlessPopover["crossOffset"] | `${number}`) | undefined;
24748
+ /** How far to slide the panel along the side it is on, in pixels: to the
24749
+ right on the top or the bottom, and down on the left or the right. */
24750
+ crossOffset?: (HelixHeadlessPopover["crossOffset"]) | undefined;
24518
24751
  /** The panel's name where nothing else names it: no `label`, no heading in
24519
24752
  the panel, and no `aria-labelledby` on the host. */
24520
24753
  "fallback-label"?: (HelixHeadlessPopover["fallbackLabel"]) | undefined;
24521
24754
  /** The panel's name where nothing else names it: no `label`, no heading in
24522
24755
  the panel, and no `aria-labelledby` on the host. */
24523
24756
  fallbackLabel?: (HelixHeadlessPopover["fallbackLabel"]) | undefined;
24757
+ /** Whether the panel moves to the other side of the trigger when its own
24758
+ side has no room. On by default. Write `flip="false"` to keep it on its
24759
+ side, where it shrinks to fit, as React Aria's `shouldFlip` turns off. */
24760
+ flip?: (HelixHeadlessPopover["flip"]) | undefined;
24524
24761
  /** The panel's name, read by screen readers. Left empty, the first heading in
24525
24762
  the panel names it, and then `fallback-label`. */
24526
24763
  label?: (HelixHeadlessPopover["label"]) | undefined;
@@ -24565,17 +24802,42 @@ the resolved state for stylesheets, which is what the mirror is for. */
24565
24802
  };
24566
24803
 
24567
24804
  export type HelixHeadlessPopoverSolidJsProps = {
24805
+ /** The element the panel opens against, where that is not the trigger: its
24806
+ `id` in the same document or shadow root, or the element itself. Left
24807
+ empty, the panel opens against the trigger, or against the button whose
24808
+ command opened it. */
24809
+ "prop:anchor"?: (HelixHeadlessPopover["anchor"]) | undefined;
24568
24810
  /** Draws a point on the panel's edge facing the trigger.
24569
24811
 
24570
24812
  Off by default, which is the house style: a panel that opens from its
24571
24813
  trigger already reads as belonging to it. */
24572
24814
  "prop:arrow"?: (HelixHeadlessPopover["arrow"]) | undefined;
24815
+ /** How close to the window's edges the panel may come, in pixels, when it
24816
+ slides, shrinks or moves to the other side to fit. Left unset, it slides
24817
+ and shrinks to 8 pixels from an edge and moves to the other side only
24818
+ once it would cross one. */
24819
+ "attr:container-padding"?: (HelixHeadlessPopover["containerPadding"] | `${number}`) | undefined;
24820
+ /** How close to the window's edges the panel may come, in pixels, when it
24821
+ slides, shrinks or moves to the other side to fit. Left unset, it slides
24822
+ and shrinks to 8 pixels from an edge and moves to the other side only
24823
+ once it would cross one. */
24824
+ "prop:containerPadding"?: (HelixHeadlessPopover["containerPadding"]) | undefined;
24825
+ /** How far to slide the panel along the side it is on, in pixels: to the
24826
+ right on the top or the bottom, and down on the left or the right. */
24827
+ "attr:cross-offset"?: (HelixHeadlessPopover["crossOffset"] | `${number}`) | undefined;
24828
+ /** How far to slide the panel along the side it is on, in pixels: to the
24829
+ right on the top or the bottom, and down on the left or the right. */
24830
+ "prop:crossOffset"?: (HelixHeadlessPopover["crossOffset"]) | undefined;
24573
24831
  /** The panel's name where nothing else names it: no `label`, no heading in
24574
24832
  the panel, and no `aria-labelledby` on the host. */
24575
24833
  "attr:fallback-label"?: (HelixHeadlessPopover["fallbackLabel"]) | undefined;
24576
24834
  /** The panel's name where nothing else names it: no `label`, no heading in
24577
24835
  the panel, and no `aria-labelledby` on the host. */
24578
24836
  "prop:fallbackLabel"?: (HelixHeadlessPopover["fallbackLabel"]) | undefined;
24837
+ /** Whether the panel moves to the other side of the trigger when its own
24838
+ side has no room. On by default. Write `flip="false"` to keep it on its
24839
+ side, where it shrinks to fit, as React Aria's `shouldFlip` turns off. */
24840
+ "prop:flip"?: (HelixHeadlessPopover["flip"]) | undefined;
24579
24841
  /** The panel's name, read by screen readers. Left empty, the first heading in
24580
24842
  the panel names it, and then `fallback-label`. */
24581
24843
  "prop:label"?: (HelixHeadlessPopover["label"]) | undefined;
@@ -28426,7 +28688,8 @@ export type HelixHeadlessStepsHelixSelectElementEvent =
28426
28688
 
28427
28689
  export type HelixHeadlessStepsProps = {
28428
28690
  /** Whether the arrow keys move focus between the stages' names, along the
28429
- way the steps run. Off by default, so the arrows keep scrolling the page. */
28691
+ way the steps run, and the names are one tab stop. Off by default, so the
28692
+ arrows keep scrolling the page. */
28430
28693
  arrows?: (HelixHeadlessSteps["arrows"]) | undefined;
28431
28694
  /** What marks a stage `complete`.
28432
28695
 
@@ -28510,7 +28773,8 @@ there. Not asked of an `optional` stage, nor for a move back. */
28510
28773
 
28511
28774
  export type HelixHeadlessStepsSolidJsProps = {
28512
28775
  /** Whether the arrow keys move focus between the stages' names, along the
28513
- way the steps run. Off by default, so the arrows keep scrolling the page. */
28776
+ way the steps run, and the names are one tab stop. Off by default, so the
28777
+ arrows keep scrolling the page. */
28514
28778
  "prop:arrows"?: (HelixHeadlessSteps["arrows"]) | undefined;
28515
28779
  /** What marks a stage `complete`.
28516
28780
 
@@ -28633,7 +28897,9 @@ with the page. */
28633
28897
  /** Whether a reader may pass the stage without finishing it, in a sequence
28634
28898
  with `linear`. Ark UI's skippable step. */
28635
28899
  optional?: (HelixHeadlessStep["optional"]) | undefined;
28636
- /** The value the step sends in `helix-select`. */
28900
+ /** The value the step sends in `helix-select`, and what names the step in its
28901
+ sequence's `active`. Without one, the sequence names the step by its place,
28902
+ counted from 1. */
28637
28903
  value?: (HelixHeadlessStep["value"]) | undefined;
28638
28904
 
28639
28905
  /** Fired when the step is pressed. Cancelable: cancel it to keep the current step. */
@@ -28666,7 +28932,9 @@ with the page. */
28666
28932
  /** Whether a reader may pass the stage without finishing it, in a sequence
28667
28933
  with `linear`. Ark UI's skippable step. */
28668
28934
  "prop:optional"?: (HelixHeadlessStep["optional"]) | undefined;
28669
- /** The value the step sends in `helix-select`. */
28935
+ /** The value the step sends in `helix-select`, and what names the step in its
28936
+ sequence's `active`. Without one, the sequence names the step by its place,
28937
+ counted from 1. */
28670
28938
  "prop:value"?: (HelixHeadlessStep["value"]) | undefined;
28671
28939
  /** Fired when the step is pressed. Cancelable: cancel it to keep the current step. */
28672
28940
  "on:helix-select"?: ((e: HelixHeadlessStepHelixSelectElementEvent) => void) | undefined;
@@ -40168,7 +40436,13 @@ export type CustomElements = {
40168
40436
  * field taking more. A draft that fails them does not send, and the composer
40169
40437
  * takes `:state(invalid)` and `aria-invalid` once the reader has tried to send
40170
40438
  * it, the form was submitted, or the reader edited the field and left it.
40171
- * Tabbing past an empty composer marks nothing.
40439
+ * Sending an empty required composer counts as trying. Tabbing past an empty
40440
+ * composer marks nothing.
40441
+ *
40442
+ * **`feedback` is a message of your own about the draft**, such as one your
40443
+ * server sent back. While it is set, the composer is invalid at once, does
40444
+ * not send or submit, shows the message under the field, and a screen reader
40445
+ * hears it as it appears. Clear it to let the draft go.
40172
40446
  *
40173
40447
  * **`typing` says whether the user is writing**, and `helix-typing` is sent
40174
40448
  * each time it changes: when they start, and when they send or stop for
@@ -40179,6 +40453,9 @@ export type CustomElements = {
40179
40453
  *
40180
40454
  * Component attributes and properties that can be applied to the element or by using JavaScript.
40181
40455
  *
40456
+ * - `feedback`: A message about the draft, shown under the field. While set, the composer
40457
+ * is invalid, does not send, and does not submit, as a field's `feedback`
40458
+ * does, and the message is announced as it appears.
40182
40459
  * - `label`: The field's name, read by screen readers.
40183
40460
  * - `maxlength`/`maxLength`: The most characters a draft can have. The field stops taking more.
40184
40461
  * - `minlength`/`minLength`: The fewest characters a draft can have, once the reader has written in
@@ -40327,6 +40604,7 @@ export type CustomElements = {
40327
40604
  *
40328
40605
  * - `composer`: The whole composer.
40329
40606
  * - `end`: The box around the `end` slot.
40607
+ * - `feedback`: The `feedback` message, under the field while it is set.
40330
40608
  * - `field`: The text field.
40331
40609
  * - `mark`: The icon inside the send button.
40332
40610
  * - `send`: The send button.
@@ -40337,7 +40615,7 @@ export type CustomElements = {
40337
40615
  *
40338
40616
  * These can be used to apply styling when a component is in a given state.
40339
40617
  *
40340
- * - `invalid`: The draft fails `required`, `minlength`, `maxlength`, or a custom error, and the reader has tried to send or submit it, or edited the field and left it.
40618
+ * - `invalid`: The draft fails `required`, `minlength`, `maxlength`, or a custom error, and the reader has tried to send or submit it, or edited the field and left it. Or `feedback` is set.
40341
40619
  * - `settled`: Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.
40342
40620
  */
40343
40621
  "helix-headless-chat-composer": Partial<
@@ -40471,16 +40749,31 @@ export type CustomElements = {
40471
40749
  * `loading` while you fetch, then prepend the older turns. The turn the user
40472
40750
  * was reading stays in place on screen.
40473
40751
  *
40752
+ * The transcript is a `log`, the role for content added in order where the
40753
+ * newest matters most, and it answers the APG feed's keys. The `feed` role
40754
+ * reads its articles as a list from the top, with no newest end to stay
40755
+ * pinned to, so the log keeps the role a conversation has. While `loading` is
40756
+ * set or older turns load, the log carries `aria-busy`, as the APG asks of a
40757
+ * feed.
40758
+ *
40474
40759
  * The log is `aria-live="off"`. A separate status region announces each new
40475
40760
  * turn once, when it has finished arriving. It skips the user's own turns
40476
40761
  * unless they failed to send, turns loaded as history, and the turns already
40477
40762
  * there when the transcript opened. A turn is said with its author first, such
40478
40763
  * as "Ada: It ships today" (`arrival-label`), where its author can be named.
40479
40764
  *
40480
- * Pass the turns as children or as `turns` data. Do not use both. Children
40481
- * render from the server and suit most conversations. `turns` draws a long
40765
+ * Pass the turns as children or as `turns` data. Do not use both: a chat given
40766
+ * both draws every turn from `turns` and then the children, and says so once
40767
+ * in the console. Children render from the server and suit most
40768
+ * conversations. `turns` draws a long
40482
40769
  * transcript one window at a time, so the log needs a block size of its own.
40483
40770
  *
40771
+ * The log scrolls on this tier. It carries `data-scroller`, and `core` ships
40772
+ * `[data-scroller] { overflow: auto }` into every shadow root, so pinning,
40773
+ * history and the window work with no stylesheet. You still need to give the
40774
+ * log a block size, such as `helix-headless-chat::part(log) { block-size:
40775
+ * 20rem }`.
40776
+ *
40484
40777
  * **A conversation is built from three elements.** The chat holds the
40485
40778
  * transcript, a `Chat.Message` stands for each turn, and a `Chat.Composer` sits
40486
40779
  * in the `composer` slot. When the user sends, `helix-send` reaches the chat:
@@ -40494,7 +40787,12 @@ export type CustomElements = {
40494
40787
  * it takes them away. Anything slotted into `status` is drawn first.
40495
40788
  *
40496
40789
  * **Keyboard.** The transcript moves between turns the way a feed does. Each
40497
- * turn says its place, such as "3 of 40", windowed or not.
40790
+ * turn says its place, such as "3 of 40", windowed or not. The transcript is
40791
+ * a tab stop while it holds a turn, and the turn a reader moved to is one
40792
+ * too. Moving to an older turn unpins a transcript that scrolls and scrolls
40793
+ * the turn into view, and moving to the newest pins it again. When the turn
40794
+ * holding focus is removed, focus moves to the turn that took its place, or to
40795
+ * the one before it where it was the last.
40498
40796
  *
40499
40797
  * | Key | What it does |
40500
40798
  * |---|---|
@@ -40673,7 +40971,7 @@ export type CustomElements = {
40673
40971
  * - `indicator`: The three dots before the words that say who is typing, which the styled tier animates as a message's are. Hidden from screen readers.
40674
40972
  * - `live`: The region where screen readers announce each turn once it has arrived.
40675
40973
  * - `loading`: Shown while the history loads.
40676
- * - `log`: The transcript, which scrolls.
40974
+ * - `log`: The transcript, which scrolls. On this tier, it needs only a block size.
40677
40975
  * - `message`: The message drawn for a turn from `turns`, forwarded whole.
40678
40976
  * - `message-actions`: The controls on a turn from `turns`, beside its time.
40679
40977
  * - `message-avatar`: The avatar box of a turn from `turns`.
@@ -40705,6 +41003,10 @@ export type CustomElements = {
40705
41003
  *
40706
41004
  * These can be used to apply styling when a component is in a given state.
40707
41005
  *
41006
+ * - `empty`: The conversation has no turns.
41007
+ * - `loading`: Older turns are loading: `history` is `loading`.
41008
+ * - `pinned`: The transcript follows its newest turn.
41009
+ * - `typing`: `typing` names someone on the other side.
40708
41010
  * - `settled`: Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.
40709
41011
  */
40710
41012
  "helix-headless-chat": Partial<
@@ -41209,7 +41511,11 @@ export type CustomElements = {
41209
41511
  * from the accessibility tree and left out of a copy. Set `mark-lines` to
41210
41512
  * mark lines a reader should look at, such as `2, 4-6`: the block draws a
41211
41513
  * band behind each run, placed where the lines are laid out, so it follows a
41212
- * highlighter's markup and lines that wrap. Set `wrap` to wrap long lines
41514
+ * highlighter's markup and lines that wrap. `added-lines` and
41515
+ * `removed-lines` mark lines the same way as inserted and deleted, as
41516
+ * Expressive Code's `ins` and `del` do, in code that is not a diff. The bands
41517
+ * are drawn and hidden from screen readers, so say in the text around the
41518
+ * block what a marked line means. Set `wrap` to wrap long lines
41213
41519
  * rather than scroll them; a gutter then numbers each line where it starts.
41214
41520
  * Set `wrappable` for a button in the header that turns `wrap` on and off,
41215
41521
  * pressed while the lines wrap.
@@ -41278,6 +41584,8 @@ export type CustomElements = {
41278
41584
  *
41279
41585
  * Component attributes and properties that can be applied to the element or by using JavaScript.
41280
41586
  *
41587
+ * - `added-lines`/`addedLines`: The lines to mark as inserted, as numbers and ranges counted from 1, such
41588
+ * as `3-4`. Drawn as `mark-lines` is, in the added color. Not for a diff.
41281
41589
  * - `code-label`/`codeLabel`: The name of a block that scrolls, which is a tab stop while it does.
41282
41590
  *
41283
41591
  * Where the block has a name, the scroller says it too, such as "Code,
@@ -41354,6 +41662,8 @@ export type CustomElements = {
41354
41662
  * `no-copy=""` on hosts that never asked for one, and the rule about a
41355
41663
  * reflected property taking no default is satisfied by the default being
41356
41664
  * `false`.
41665
+ * - `removed-lines`/`removedLines`: The lines to mark as deleted, as numbers and ranges counted from 1. Drawn
41666
+ * as `mark-lines` is, in the removed color. Not for a diff.
41357
41667
  * - `show-unchanged-label`/`showUnchangedLabel`: The words of a button that shows a folded run of unchanged lines, in a
41358
41668
  * diff with `context-lines`. `{count}` is how many.
41359
41669
  * - `variant`: How a diff's two versions are arranged. It has no effect without `diff`.
@@ -41433,6 +41743,8 @@ export type CustomElements = {
41433
41743
  * - `actions`: Controls for the block, in the header before the copy button.
41434
41744
  * - `copied-icon`: The copy button's icon after a copy. Defaults to a check mark.
41435
41745
  * - `copy-icon`: The copy button's icon before a copy. Defaults to a clipboard.
41746
+ * - `expand-icon`: An icon on the button that shows every line of a capped block, before its words.
41747
+ * - `label`: The block's name in the header, such as a file icon beside the file name. Replaces `label` and `language` there, and draws the header.
41436
41748
  *
41437
41749
  * ## CSS Custom Properties
41438
41750
  *
@@ -41480,7 +41792,9 @@ export type CustomElements = {
41480
41792
  * - `header`: The bar that holds the name and the copy button, shown when there is a name.
41481
41793
  * - `hunk`: In a diff, a `@@` line saying where the lines under it are.
41482
41794
  * - `label`: The block's name: its `label`, or its `language` where it has no label.
41483
- * - `mark`: The band behind a run of lines `mark-lines` names. The block writes where the run is laid out into `--code-block-mark-start`, `--code-block-mark-size`, and `--code-block-mark-inline-size` on it. Hidden from the accessibility tree.
41795
+ * - `mark`: The band behind a run of lines `mark-lines`, `added-lines` or `removed-lines` names. The block writes where the run is laid out into `--code-block-mark-start`, `--code-block-mark-size`, and `--code-block-mark-inline-size` on it. Hidden from the accessibility tree.
41796
+ * - `mark-added`: The band behind a run of lines `added-lines` names. Applied with `mark`.
41797
+ * - `mark-removed`: The band behind a run of lines `removed-lines` names. Applied with `mark`.
41484
41798
  * - `marker`: In a diff, the `+`, `-`, or space that starts a line.
41485
41799
  * - `new`: In a split diff, the new version's `<pre>`.
41486
41800
  * - `number`: In a diff, a line number. In a `wrap` block with `line-numbers`, one line's number in the gutter, which the block makes as tall as the line it numbers through `--code-block-line-size`.
@@ -41591,7 +41905,8 @@ export type CustomElements = {
41591
41905
  *
41592
41906
  * The trigger and ArrowDown open the panel with focus in the square. Tab moves
41593
41907
  * between the panel's controls without leaving it, and Escape closes it and
41594
- * returns focus to the field.
41908
+ * returns focus to the control that opened it: the trigger after a press, and
41909
+ * the field after ArrowDown.
41595
41910
  *
41596
41911
  * The component sets `--color-input-swatch`, so do not set it yourself. It
41597
41912
  * holds the resolved color, so the styled tier can paint the swatch without
@@ -42087,10 +42402,11 @@ export type CustomElements = {
42087
42402
  * the anchor the browser points its bubble at.
42088
42403
  *
42089
42404
  * **Text that is not a color is bad input**, so a form does not submit
42090
- * `#00` from a half-typed value. The picker draws no message of its own, so
42091
- * reporting it as each keystroke arrives shows nothing until the form asks;
42092
- * Color Input shows its own message against the field the reader typed
42093
- * into.
42405
+ * `#00` from a half-typed value. The picker marks it, and says
42406
+ * `badInputMessage` under itself, once the reader leaves the value field or
42407
+ * presses Enter, and a missing color once the reader has committed one or a
42408
+ * form has refused the picker. Color Input shows its own message against the
42409
+ * field the reader typed into.
42094
42410
  * - `saturation-label`/`saturationLabel`: What the square's horizontal ramp is called.
42095
42411
  * - `square-text`/`squareText`: What a screen reader hears for the square's place, the color's two
42096
42412
  * numbers and its name, on whichever of its two inputs it is on.
@@ -42209,14 +42525,10 @@ export type CustomElements = {
42209
42525
  *
42210
42526
  * Methods that can be called to access component functionality.
42211
42527
  *
42528
+ * - `formResetCallback() => void`: A reset ends any typing and takes back text that was not a color, so the
42529
+ * field shows the color the reset put back.
42212
42530
  * - `requestValue(next: string) => boolean`: Blocks every change while `readOnly` is set.
42213
42531
  * - `focus(options?: FocusOptions) => void`: Moves focus to the square.
42214
- * - `formResetCallback() => void`: Returns the control to its `defaultValue`, or to its `value` attribute
42215
- * where there is no `default-value`.
42216
- *
42217
- * Both halves are dropped, the consumer's and the control's, because a
42218
- * reset means the form is as it was served. Clearing only the internal one
42219
- * would leave a control that had been written to stuck at that value.
42220
42532
  * - `formStateRestoreCallback(state: string | File | FormData | null) => void`: Restores the value when the browser brings a form back.
42221
42533
  *
42222
42534
  * Falling back to what the markup declared rather than to empty, because
@@ -42297,7 +42609,7 @@ export type CustomElements = {
42297
42609
  * - `eyedropper-live`: The live region of the button inside `eyedropper`, which says its pending label.
42298
42610
  * - `eyedropper-spinner`: The ring the eyedropper button turns while it is pending.
42299
42611
  * - `eyedropper-text`: The words on the button inside `eyedropper`, trimmed to their capitals and baseline.
42300
- * - `feedback`: The message under the picker, while `feedback` is set.
42612
+ * - `feedback`: The message under the picker: `feedback`, or what is wrong with the answer once the picker is marked invalid.
42301
42613
  * - `field`: One channel's number field with its label, in `channel-fields`.
42302
42614
  * - `field-input`: The number input in a channel's field.
42303
42615
  * - `field-label`: The name above a channel's number input.
@@ -42455,12 +42767,13 @@ export type CustomElements = {
42455
42767
  * language.
42456
42768
  * - `multiple`: Whether more than one option can be chosen.
42457
42769
  *
42458
- * The list already does the work: `value` comes apart on commas, a press
42459
- * toggles rather than replaces, and the arrows move without choosing. What
42460
- * this adds is the tags, and keeping the panel open between picks.
42770
+ * The list already does the work: `value` is the chosen values joined with
42771
+ * commas, a press toggles rather than replaces, and the arrows move without
42772
+ * choosing. What this adds is the tags, and keeping the panel open between
42773
+ * picks.
42461
42774
  *
42462
- * A comma is therefore not available inside an option's value, which is the
42463
- * listbox's contract and not this element's to change.
42775
+ * An option's value may hold a comma, and it is read as one value, as
42776
+ * `Select` and `Listbox` read it. So may an answer the reader created.
42464
42777
  *
42465
42778
  * **The list is told, and the field is not.** `aria-multiselectable` belongs
42466
42779
  * to `listbox`, `grid`, `tree` and `tablist`, and `combobox` dropped it in
@@ -42801,7 +43114,8 @@ export type CustomElements = {
42801
43114
  * | `hotkey`, Command or Control with K by default | Opens the palette from anywhere on the page, or closes it. With `inline`, puts focus in its filter field. |
42802
43115
  * | Down, Up | Moves the highlight to the next or the previous command, round from the last to the first. |
42803
43116
  * | Page Down, Page Up | Moves the highlight by as many commands as the list shows at once. |
42804
- * | Home, End, Left, Right | Move the caret in the filter field. |
43117
+ * | Home, End | Move the caret in the filter field. With `home-end="list"`, move the highlight to the first or the last command. |
43118
+ * | Left, Right | Move the caret in the filter field. |
42805
43119
  * | Enter | Runs the highlighted command, or follows it where it is a link, and closes the palette. On a command with `opens`, shows its page. |
42806
43120
  * | Command or Control with Enter | Takes the highlighted command's `alternate` destination, where it has one. |
42807
43121
  * | Backspace | In an empty filter on a page, goes back to the page before. |
@@ -42823,6 +43137,11 @@ export type CustomElements = {
42823
43137
  * - `filter-delay`/`filterDelay`: How long typing rests before the commands are filtered, in milliseconds,
42824
43138
  * so a palette filtered on a server sends one `helix-filter` for a word.
42825
43139
  * `0` filters on every keystroke. See Listbox's `filter-delay`.
43140
+ * - `home-end`/`homeEnd`: Where Home and End go from the filter field.
43141
+ *
43142
+ * Absent, they move the caret, as APG's combobox has them. `list` moves the
43143
+ * highlight to the first or the last command, as React Aria's Autocomplete
43144
+ * does, and Shift with either still selects the text.
42826
43145
  * - `hotkey`: The key that opens the palette, written as `mod+k`, `shift+p`, or `k`,
42827
43146
  * in Kbd's chord spelling: `mod` is Command or Control, `ctrl`, `cmd`,
42828
43147
  * `alt` and `shift` the keys they name.
@@ -42837,6 +43156,9 @@ export type CustomElements = {
42837
43156
  * Choosing a command says `helix-select` and leaves the list where it is,
42838
43157
  * and `open`, `toggle` and the dialog's parts do nothing.
42839
43158
  * - `label`: Accessible name for the overlay, which has no visible heading.
43159
+ * - `layout`: How the commands are laid out, as Listbox's `layout`: `grid` draws them in
43160
+ * rows and columns, for a palette of icons or emoji, and the arrow keys
43161
+ * follow the rows and the columns. Absent is one command under another.
42840
43162
  * - `load-error`/`loadError`: What the list says when its commands could not be loaded, such as after a
42841
43163
  * request to a server fails. Empty, null or no attribute is no error, so
42842
43164
  * removing the attribute clears it. Passed to the list, which shows it
@@ -43538,6 +43860,10 @@ export type CustomElements = {
43538
43860
  * Off by default. Windowing costs a scroll listener, a measurement per row
43539
43861
  * drawn, and a `block-size` on the scrolling box, and a table of twenty rows
43540
43862
  * should pay none of them.
43863
+ *
43864
+ * While windowed, the `table` part scrolls on this tier: it carries
43865
+ * `data-scroller`, and `core` ships `[data-scroller] { overflow: auto }` into
43866
+ * every shadow root. You still need to give it a block size.
43541
43867
  * - `empty-text`/`emptyText`: The text shown and announced when there are no rows and none are loading.
43542
43868
  * - `loading`: Whether the rows are still loading.
43543
43869
  *
@@ -43700,7 +44026,7 @@ export type CustomElements = {
43700
44026
  * - `select`: The cell that holds a row's checkbox.
43701
44027
  * - `select-all`: The heading that holds the checkbox that selects every row.
43702
44028
  * - `select-selected`: Added to `select` in a selected row.
43703
- * - `table`: The grid.
44029
+ * - `table`: The grid. While `windowed`, the box that scrolls, which needs only a block size on this tier.
43704
44030
  * - `toggle`: The mark in a row header that a press opens and closes its row by, in a tree grid.
43705
44031
  * - `toggle-mark`: The caret in `toggle`. It points along the line while the row is closed and down while it is open.
43706
44032
  * - `toggle-open`: Added to `toggle` while its row is open.
@@ -45436,6 +45762,10 @@ export type CustomElements = {
45436
45762
  * <helix-headless-drawer id="nav">…</helix-headless-drawer>
45437
45763
  * ```
45438
45764
  *
45765
+ * From its first press, a button that opens the drawer this way says whether
45766
+ * the drawer is open: a Helix button through `expanded`, and any other
45767
+ * element with `aria-expanded`.
45768
+ *
45439
45769
  * ## Attributes & Properties
45440
45770
  *
45441
45771
  * Component attributes and properties that can be applied to the element or by using JavaScript.
@@ -46326,9 +46656,10 @@ export type CustomElements = {
46326
46656
  * press. `requestChange` documents the pattern.
46327
46657
  *
46328
46658
  * **Keyboard.** The remove button is a tab stop of its own, and Enter or Space
46329
- * on it asks to remove the filter. In a `FilterInput`, Backspace in the empty
46330
- * field asks to remove the last chip, the arrow keys move between the field
46331
- * and the chips, and Delete or Backspace on a chip asks to remove it.
46659
+ * on it asks to remove the filter. In a `FilterInput`, the field's text is the
46660
+ * one tab stop: Backspace in the empty field asks to remove the last chip, the
46661
+ * arrow keys move between the field and the chips, and Delete or Backspace on
46662
+ * a chip asks to remove it.
46332
46663
  *
46333
46664
  * The remove button is named `dismiss-label` followed by the chip's words,
46334
46665
  * such as "Remove filter Status is not open", so a row of chips says which
@@ -46384,6 +46715,12 @@ export type CustomElements = {
46384
46715
  * reads. The moment somebody picks a different comparison it appears, which
46385
46716
  * makes an unusual filter look unusual.
46386
46717
  * - `dismissible`: Whether the element shows a control that dismisses it.
46718
+ * - `dismissTabStop`: Whether the remove button is a tab stop of its own.
46719
+ *
46720
+ * `FilterInput` writes `false` on the chips in its `tags` slot: the field's
46721
+ * text is its one tab stop, and the arrow keys move from the text to the
46722
+ * chips, as in a `multiple` Combobox. No attribute: it is coordination
46723
+ * between elements, as `Tag.dismissTabStop` is. (property only)
46387
46724
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
46388
46725
  *
46389
46726
  * **Named `whenSettled` because `settled` is taken four times over**, by
@@ -46851,8 +47188,9 @@ export type CustomElements = {
46851
47188
  * first colon, reads a leading `-` as the negation, and reads a word in
46852
47189
  * brackets before the colon as the comparison.
46853
47190
  *
46854
- * **Keyboard.** Focus stays in the text. The text names the highlighted
46855
- * suggestion as its `aria-activedescendant`.
47191
+ * **Keyboard.** Focus stays in the text, which is the field's one tab stop. The
47192
+ * text names the highlighted suggestion as its `aria-activedescendant`, and the
47193
+ * arrow keys reach the tokens.
46856
47194
  *
46857
47195
  * | Key | What it does |
46858
47196
  * |---|---|
@@ -46910,12 +47248,24 @@ export type CustomElements = {
46910
47248
  * and removing the chip alone would leave its value ticked in the hidden
46911
47249
  * menu. Its dismissal is treated as the field being filtered by nothing, so
46912
47250
  * it fires `helix-facet` like every other change, and the chip goes when the
46913
- * filter goes.
47251
+ * filter goes. Set `chips` and the field adds, updates, and removes those
47252
+ * chips itself, from every `helix-facet` you do not cancel.
46914
47253
  *
46915
47254
  * ## Attributes & Properties
46916
47255
  *
46917
47256
  * Component attributes and properties that can be applied to the element or by using JavaScript.
46918
47257
  *
47258
+ * - `chips`: Whether the field keeps a `FilterChip` for each filter in its `tags` slot,
47259
+ * from the `helix-facet` events it hears.
47260
+ *
47261
+ * Off, you build the chips, which is what you do when your own model holds
47262
+ * the filters. On, a filter typed, picked, or changed adds or updates the
47263
+ * chip for its field, one with no values takes it away (unless its
47264
+ * comparison takes none, such as "is empty"), and removing the chip clears
47265
+ * the filter. A `helix-facet` you cancel changes no chip.
47266
+ *
47267
+ * The chips are elements the field adds to its own children, so leave this
47268
+ * off where a framework renders those children and would remove them.
46919
47269
  * - `clearable`: Shows a button that empties the field.
46920
47270
  *
46921
47271
  * The text only. The tokens are the consumer's markup and this element is not
@@ -46927,6 +47277,18 @@ export type CustomElements = {
46927
47277
  * - `filter-suggestions`/`filterSuggestions`: Whether the panel narrows itself to the suggestions that hold the term
46928
47278
  * being typed, as React Aria's Autocomplete filters. Off, the panel shows
46929
47279
  * what you slot and you narrow it.
47280
+ * - `loading`: Whether the suggestions are still loading, such as while a request for the
47281
+ * values of a typed key is out.
47282
+ *
47283
+ * The panel opens on `loading-text`, or the `loading` slot, while the field
47284
+ * has focus, and a screen reader hears it. Slot the options and clear this
47285
+ * when they arrive.
47286
+ * - `loading-text`/`loadingText`: Text the panel shows while the suggestions load.
47287
+ * - `no-results-text`/`noResultsText`: Text the panel shows when `filter-suggestions` hides every suggestion, such
47288
+ * as "No matching filters".
47289
+ *
47290
+ * Empty, or no `no-results` slot, and the panel closes instead, as it does
47291
+ * when it has nothing to offer.
46930
47292
  * - `placeholder`: The text shown while the field is empty.
46931
47293
  *
46932
47294
  * Not a label: it goes when typing starts.
@@ -47088,6 +47450,8 @@ export type CustomElements = {
47088
47450
  * - `feedback`: The message that says what is wrong, for content richer than a string. It shows while there is a message.
47089
47451
  * - `hint`: Help under the control, for content richer than the `hint` text.
47090
47452
  * - `label`: The label, for content richer than the `label` text.
47453
+ * - `loading`: What the panel shows while `loading` is set, for content richer than `loading-text`.
47454
+ * - `no-results`: What the panel shows when `filter-suggestions` hides every suggestion, for content richer than `no-results-text`.
47091
47455
  * - `start`: Content before the text, such as a search icon.
47092
47456
  * - `suggestions`: Suggestions for what to type next, as `Option`s and `Option.Group`s.
47093
47457
  * - `tags`: The active filters, as `FilterChip`s or `Tag`s.
@@ -47171,12 +47535,14 @@ export type CustomElements = {
47171
47535
  *
47172
47536
  * - `clear`: The button that empties the field.
47173
47537
  * - `control`: The input itself.
47538
+ * - `empty`: Shown in the panel when `filter-suggestions` hides every suggestion.
47174
47539
  * - `feedback`: The error message under the field.
47175
47540
  * - `field`: The box that holds everything.
47176
47541
  * - `hint`: The help text under the field, shown while there is no error.
47177
47542
  * - `label`: The label above the field.
47178
47543
  * - `lead`: The box before the text that holds the `start` slot.
47179
47544
  * - `live`: The live region that says how many suggestions the open panel offers. It is rendered from the first time the panel opens with suggestions.
47545
+ * - `loading`: Shown in the panel while the suggestions load.
47180
47546
  * - `rest`: The count of tokens that did not fit. It is a `<button>` with `expandable` and a `<span>` without it.
47181
47547
  * - `surface`: The floating panel the suggestions sit in.
47182
47548
  * - `tags`: The row the tokens sit in.
@@ -47186,6 +47552,8 @@ export type CustomElements = {
47186
47552
  * These can be used to apply styling when a component is in a given state.
47187
47553
  *
47188
47554
  * - `invalid`: The field has an error to show, from the browser's validation or from your `feedback`.
47555
+ * - `loading`: While `loading` is set.
47556
+ * - `no-results`: `filter-suggestions` hid every suggestion, and `no-results-text` or the `no-results` slot says so.
47189
47557
  * - `open`: The suggestions are open.
47190
47558
  * - `settled`: Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.
47191
47559
  */
@@ -47207,7 +47575,9 @@ export type CustomElements = {
47207
47575
  * **`relative` shows the same reading in words**, such as "3 hours ago" at
47208
47576
  * `long`, "3 hr. ago" at `short` and "3h ago" at `narrow`, the styles
47209
47577
  * `sl-relative-time` offers. `numeric="always"` says "1 day ago" where the
47210
- * default says "yesterday".
47578
+ * default says "yesterday". Both readings round the count, as
47579
+ * `sl-relative-time` does: 100 seconds ago is "2 minutes ago", and 59.6
47580
+ * minutes is "1 hour".
47211
47581
  *
47212
47582
  * **`date-style` and `time-style` take each locale's own pattern**, such as
47213
47583
  * "Tuesday, August 4, 2026" at `full`, and stand in for the separate fields,
@@ -48855,6 +49225,9 @@ export type CustomElements = {
48855
49225
  *
48856
49226
  * Methods that can be called to access component functionality.
48857
49227
  *
49228
+ * - `setRangeText(replacement: string, start?: number, end?: number, selectMode?: SelectionMode) => void`: Replaces a range of the text, as the native method does: the selection
49229
+ * where `start` and `end` are left out, and `selectMode` says what is
49230
+ * selected after. It sends no event, as the native method sends none.
48858
49231
  * - `setSelectionRange(start: number, end: number, direction?: SelectionDirection) => void`: Selects the range from `start` to `end` in one call, which setting
48859
49232
  * `selectionStart` and `selectionEnd` one at a time cannot always do.
48860
49233
  *
@@ -52318,6 +52691,8 @@ export type CustomElements = {
52318
52691
  * These can be used to apply styling when a component is in a given state.
52319
52692
  *
52320
52693
  * - `checked`: The row is checked.
52694
+ * - `disabled`: The row is disabled.
52695
+ * - `expanded`: Under `submenus="flyout"`, the row's submenu is open beside it.
52321
52696
  * - `highlighted`: In a menu with `filterable`, the arrow keys or the pointer reached the row while focus stays in the filter field.
52322
52697
  * - `submenu-mark`: Under `submenus="flyout"`, a row in this row's submenu can be ticked or opens a submenu, so the submenu keeps its trailing column.
52323
52698
  * - `submenu-start`: Under `submenus="flyout"`, a row in this row's submenu has content before its label, so the submenu keeps its leading column.
@@ -52341,7 +52716,9 @@ export type CustomElements = {
52341
52716
  *
52342
52717
  * Submenus drill down by default. A submenu replaces the panel's content, and a
52343
52718
  * back row returns to the previous page. One panel stays inside a narrow
52344
- * window, and works on touch screens, which have no hover.
52719
+ * window, and works on touch screens, which have no hover. Focus follows a
52720
+ * mouse resting on a row in either mode, and a drilled page is a `menu` named
52721
+ * by the row that opened it.
52345
52722
  *
52346
52723
  * **`submenus="flyout"` opens each submenu in a panel of its own beside its
52347
52724
  * row**, as React Aria's `SubmenuTrigger` and Radix's `Sub` do. Resting the
@@ -52375,6 +52752,11 @@ export type CustomElements = {
52375
52752
  * trigger's width, for a menu as wide as its trigger:
52376
52753
  * `helix-menu::part(surface) { min-inline-size: var(--floating-anchor-inline-size) }`.
52377
52754
  *
52755
+ * **The choices in one place.** `checkedValues` holds the values of the rows
52756
+ * that are checked, anywhere in the menu, and setting it checks exactly
52757
+ * those rows, as React Aria's `selectedKeys` does. `change` is sent on the
52758
+ * menu when a reader's choice changes it.
52759
+ *
52378
52760
  * With `context`, the trigger is an area and the menu is its context menu: a
52379
52761
  * right-click, a long press, Shift+F10 or the menu key over the area opens it
52380
52762
  * at the pointer, or at the area's corner from the keyboard, as Radix's context
@@ -52397,7 +52779,8 @@ export type CustomElements = {
52397
52779
  * field: Up and Down Arrow move the highlight through the rows that are left,
52398
52780
  * Enter chooses the highlighted row, Right Arrow opens its submenu, Left Arrow
52399
52781
  * on a submenu goes back, and Escape clears the filter and then closes the
52400
- * menu. Home, End and the other keys move the caret and type. The field names
52782
+ * menu. A screen reader hears how many rows the filter keeps
52783
+ * (`results-label`). Home, End and the other keys move the caret and type. The field names
52401
52784
  * the highlighted row with `aria-activedescendant`, and the rows are a `menu`
52402
52785
  * after the field. Cancel `helix-filter` to keep every row
52403
52786
  * showing and narrow the rows yourself, such as by replacing them with rows
@@ -52437,6 +52820,9 @@ export type CustomElements = {
52437
52820
  * - `placement`: The side the menu opens on, when there is room.
52438
52821
  *
52439
52822
  * It moves if that side does not fit.
52823
+ * - `results-label`/`resultsLabel`: What a screen reader hears when the filter narrows the rows. `{count}` is
52824
+ * how many rows are left, written in the locale, and each language writes
52825
+ * the forms it has, as Listbox's `results-label` does.
52440
52826
  * - `submenus`: How a submenu opens. `drill` shows it in place of the page showing, with
52441
52827
  * a way back. `flyout` opens it in a panel of its own beside its row.
52442
52828
  * - `empty-text`/`emptyText`: The text shown and announced when there are no rows and none are loading.
@@ -52465,6 +52851,13 @@ export type CustomElements = {
52465
52851
  *
52466
52852
  * Absent, a row is kept where its words hold the filter, in any case. A
52467
52853
  * property only, there being no way to write a function in markup. (property only)
52854
+ * - `checkedValues`: The values of the choice rows that are checked, anywhere in the menu, in
52855
+ * document order.
52856
+ *
52857
+ * Set it to check exactly those rows and uncheck every other choice row, as
52858
+ * React Aria's `selectedKeys` controls a menu's selection from one place.
52859
+ * Each row keeps its own `checked` too, which this reads and writes. `change`
52860
+ * is sent on the menu when a reader's choice changes it. (property only)
52468
52861
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
52469
52862
  *
52470
52863
  * **Named `whenSettled` because `settled` is taken four times over**, by
@@ -52490,6 +52883,7 @@ export type CustomElements = {
52490
52883
  *
52491
52884
  * Events that will be emitted by the component.
52492
52885
  *
52886
+ * - `change`: A reader's choice checked or unchecked rows. Read `checkedValues` for the rows that are checked now.
52493
52887
  * - `helix-before-close`: The menu is about to close. Cancelable: cancel it to keep it open.
52494
52888
  * - `helix-before-open`: The menu is about to open. Cancelable: cancel it to keep it closed.
52495
52889
  * - `helix-filter`: The text in the filter field changed, with the new text in `detail.value`. Cancelable: cancel it to keep every row showing and narrow the rows yourself.
@@ -52501,6 +52895,8 @@ export type CustomElements = {
52501
52895
  * Areas where markup can be added to the component.
52502
52896
  *
52503
52897
  * - `(default)`: The items.
52898
+ * - `empty`: What the menu shows when it has no items, for content richer than `empty-text`.
52899
+ * - `loading`: What the menu shows while its items load, for content richer than `loading-text`.
52504
52900
  * - `no-results`: What the menu shows when the filter keeps no rows, for content richer than `no-results-text`.
52505
52901
  * - `trigger`: The control that opens the menu, or with `context` the area a context menu opens over.
52506
52902
  *
@@ -52546,6 +52942,8 @@ export type CustomElements = {
52546
52942
  * These can be used to apply styling when a component is in a given state.
52547
52943
  *
52548
52944
  * - `drilled`: A submenu's page is showing, so content that is not a row can hide with the top page.
52945
+ * - `entering`: From the moment the panel shows until its entrance has finished.
52946
+ * - `exiting`: From the moment the panel hides until its exit has finished.
52549
52947
  * - `mark`: A row on the current page has a checkbox or a link, so every row keeps the trailing column.
52550
52948
  * - `open`: While the menu is open.
52551
52949
  * - `placed-bottom`: While the open panel sits below its trigger.
@@ -53525,7 +53923,9 @@ export type CustomElements = {
53525
53923
  * speaks it: `feedback` replaces the message under the field and does not
53526
53924
  * reach the bubble. Unset is the sentence registered for the page's
53527
53925
  * language, then the English.
53528
- * - `decrement-label`/`decrementLabel`: The name of the step down button, read by screen readers.
53926
+ * - `decrement-label`/`decrementLabel`: The name of the step down button, read by screen readers. The field's
53927
+ * label follows it, so a reader hears "Decrease Quantity", as React Aria
53928
+ * names its steppers.
53529
53929
  * - `format-options`/`formatOptions`: `Intl.NumberFormat` options the number is shown with while the field is
53530
53930
  * not being edited: a currency, a percent, a unit, or a number of decimals.
53531
53931
  * Written as JSON in the attribute.
@@ -53533,7 +53933,9 @@ export type CustomElements = {
53533
53933
  * ```html
53534
53934
  * <helix-number-input format-options='{"style":"currency","currency":"EUR"}'></helix-number-input>
53535
53935
  * ```
53536
- * - `increment-label`/`incrementLabel`: The name of the step up button, read by screen readers.
53936
+ * - `increment-label`/`incrementLabel`: The name of the step up button, read by screen readers. The field's
53937
+ * label follows it, so a reader hears "Increase Quantity", as React Aria
53938
+ * names its steppers.
53537
53939
  * - `large-step`/`largeStep`: How many steps `PageUp` and `PageDown` move.
53538
53940
  *
53539
53941
  * Ten steps, which is the convention every spinner on the platform follows,
@@ -53715,8 +54117,10 @@ export type CustomElements = {
53715
54117
  *
53716
54118
  * Methods that can be called to access component functionality.
53717
54119
  *
53718
- * - `stepUp(large = false) => void`: Steps the value up, by `largeStep` steps when `large` is set.
53719
- * - `stepDown(large = false) => void`: Steps the value down, by `largeStep` steps when `large` is set.
54120
+ * - `stepUp(count: number | boolean = 1) => void`: Steps the value up by `step`, `count` times, as the native method and
54121
+ * `Input.stepUp` do. `true` takes `largeStep` steps, as `PageUp` does.
54122
+ * - `stepDown(count: number | boolean = 1) => void`: Steps the value down by `step`, `count` times. `true` takes `largeStep`
54123
+ * steps, as `PageDown` does.
53720
54124
  *
53721
54125
  * The same path a press of the down arrow takes, so a consumer driving this
53722
54126
  * from their own control gets the clamping and the announcement rather than
@@ -55354,7 +55758,9 @@ export type CustomElements = {
55354
55758
  *
55355
55759
  * It opens on click and from a command. `command="--show"` and the related
55356
55760
  * commands work as they do on `Dialog` and `Drawer`, so a button anywhere on
55357
- * the page can open the popover with no script.
55761
+ * the page can open the popover with no script. From its first press, a
55762
+ * button that opens it this way says whether the popover is open: a Helix
55763
+ * button through `expanded`, and any other element with `aria-expanded`.
55358
55764
  *
55359
55765
  * **Opening moves focus into the panel**, to the first control in it, or to the
55360
55766
  * panel itself where it holds none, and closing from inside gives it back to
@@ -55364,8 +55770,12 @@ export type CustomElements = {
55364
55770
  * `modal` keeps `Tab` inside the panel while it is open and says so with
55365
55771
  * `aria-modal`, for a panel that has to be answered before the page goes on.
55366
55772
  * The rest of the page is hidden from screen readers with `aria-hidden` while
55367
- * it is open, so the virtual cursor stays in the panel too. Without it the
55368
- * popover does not trap focus.
55773
+ * it is open, so the virtual cursor stays in the panel too, and the page does
55774
+ * not scroll behind it. Without it the popover does not trap focus.
55775
+ *
55776
+ * A press outside closes the panel and leaves focus where the press put it.
55777
+ * Where it put focus nowhere, as a press on text or on the page's background
55778
+ * does, focus goes back to the trigger.
55369
55779
  *
55370
55780
  * The panel's name is `label` when you set it. Otherwise it is the first
55371
55781
  * heading in the panel, or the elements an `aria-labelledby` on the host names.
@@ -55381,10 +55791,17 @@ export type CustomElements = {
55381
55791
  * | Escape | Closes the panel and puts focus back on the trigger. |
55382
55792
  * | Tab, Shift+Tab | Moves through the controls in the panel. Leaving the panel and the trigger closes it. With `modal`, moves from the last control round to the first and from the first round to the last. |
55383
55793
  *
55794
+ * The panel opens against the trigger, or against the element `anchor` names,
55795
+ * such as a field beside the button that opens it. `offset` moves it away from
55796
+ * that element, `cross-offset` slides it along the side it is on,
55797
+ * `container-padding` keeps it that far from the window's edges, and
55798
+ * `flip="false"` keeps it on its side where the other side has more room.
55799
+ *
55384
55800
  * `arrow` draws a point on the panel's edge facing the trigger. The side the
55385
- * panel landed on is on the host as `:state(placed-top)` and its kin, and the
55386
- * trigger's width is on the panel as `--floating-anchor-inline-size`, for a
55387
- * panel as wide as its trigger:
55801
+ * panel landed on is on the host as `:state(placed-top)` and its kin, its
55802
+ * alignment along that side as `:state(aligned-start)` or
55803
+ * `:state(aligned-end)`, and the trigger's width is on the panel as
55804
+ * `--floating-anchor-inline-size`, for a panel as wide as its trigger:
55388
55805
  *
55389
55806
  * ```css
55390
55807
  * helix-popover::part(popover) {
@@ -55396,12 +55813,25 @@ export type CustomElements = {
55396
55813
  *
55397
55814
  * Component attributes and properties that can be applied to the element or by using JavaScript.
55398
55815
  *
55816
+ * - `anchor`: The element the panel opens against, where that is not the trigger: its
55817
+ * `id` in the same document or shadow root, or the element itself. Left
55818
+ * empty, the panel opens against the trigger, or against the button whose
55819
+ * command opened it.
55399
55820
  * - `arrow`: Draws a point on the panel's edge facing the trigger.
55400
55821
  *
55401
55822
  * Off by default, which is the house style: a panel that opens from its
55402
55823
  * trigger already reads as belonging to it.
55824
+ * - `container-padding`/`containerPadding`: How close to the window's edges the panel may come, in pixels, when it
55825
+ * slides, shrinks or moves to the other side to fit. Left unset, it slides
55826
+ * and shrinks to 8 pixels from an edge and moves to the other side only
55827
+ * once it would cross one.
55828
+ * - `cross-offset`/`crossOffset`: How far to slide the panel along the side it is on, in pixels: to the
55829
+ * right on the top or the bottom, and down on the left or the right.
55403
55830
  * - `fallback-label`/`fallbackLabel`: The panel's name where nothing else names it: no `label`, no heading in
55404
55831
  * the panel, and no `aria-labelledby` on the host.
55832
+ * - `flip`: Whether the panel moves to the other side of the trigger when its own
55833
+ * side has no room. On by default. Write `flip="false"` to keep it on its
55834
+ * side, where it shrinks to fit, as React Aria's `shouldFlip` turns off.
55405
55835
  * - `label`: The panel's name, read by screen readers. Left empty, the first heading in
55406
55836
  * the panel names it, and then `fallback-label`.
55407
55837
  * - `modal`: Keeps `Tab` inside the panel while it is open, marks the panel
@@ -55499,6 +55929,8 @@ export type CustomElements = {
55499
55929
  *
55500
55930
  * These can be used to apply styling when a component is in a given state.
55501
55931
  *
55932
+ * - `aligned-end`: While the panel is aligned to the end of the side it sits on.
55933
+ * - `aligned-start`: While the panel is aligned to the start of the side it sits on.
55502
55934
  * - `entering`: From the moment the panel shows until its entrance has finished.
55503
55935
  * - `exiting`: From the moment the panel hides until its exit has finished.
55504
55936
  * - `open`: While the popover is open.
@@ -57094,7 +57526,7 @@ export type CustomElements = {
57094
57526
  * | Down, Enter, Space | Opens the list on the chosen option, or the first. |
57095
57527
  * | Up | Opens the list on the chosen option, or the last. |
57096
57528
  * | Home, End | Opens the list on the first or the last option. |
57097
- * | Left, Right | Chooses the option before or after the chosen one without opening, as React Aria's Select does, in either direction of text. |
57529
+ * | Left, Right | Chooses the option before or after the chosen one without opening, as React Aria's Select does. On a right-to-left page Left chooses the one after. |
57098
57530
  * | A letter or a word | Chooses the option whose words start with what you typed, as a native `<select>` does. With `multiple`, opens the list on it. |
57099
57531
  *
57100
57532
  * In the open list, which is a `Listbox`:
@@ -58910,12 +59342,21 @@ export type CustomElements = {
58910
59342
  * sequence is correct in the server's markup, where the root cannot count its
58911
59343
  * slotted children.
58912
59344
  *
59345
+ * `active` names a step by its `value`. A step with no `value` is named by its
59346
+ * place, counted from 1, so a sequence written without values moves as one
59347
+ * written with them, and `helix-activate` says `1`, `2` and so on. Give every
59348
+ * step a value or none, because a value of `2` and the second place are one
59349
+ * name.
59350
+ *
58913
59351
  * `linear` keeps a reader from passing a stage they have not finished, as Ark
58914
59352
  * UI's linear steps do: a stage ahead is out of reach, and its button disabled,
58915
59353
  * until every stage before it is `complete` or `optional`. Going back is always
58916
59354
  * allowed. `next()` and `previous()` move one stage either way, under the
58917
59355
  * same rules, for your own buttons. `reset()` goes back to the first stage and
58918
- * clears every stage's `complete`, as Ark UI's `resetStep` does.
59356
+ * clears every stage's `complete`, as Ark UI's `resetStep` does. A button
59357
+ * anywhere on the page calls them with no script, as Ark UI's previous and
59358
+ * next triggers do: give it `commandfor` with the sequence's `id`, and
59359
+ * `command="--previous"`, `"--next"` or `"--reset"`.
58919
59360
  *
58920
59361
  * `completion="passed"` marks a stage `complete` once a reader moves past it,
58921
59362
  * as Ark UI counts a stage before the current one as completed. Going back
@@ -58942,18 +59383,21 @@ export type CustomElements = {
58942
59383
  * button is described by its `complete-label`.
58943
59384
  *
58944
59385
  * **Keyboard.** Each stage's name is a button and its own tab stop, and Enter
58945
- * or Space goes to the stage. Set `arrows` and the arrow keys move focus
58946
- * between the names as well, as Ark UI's steps do: Left and Right along a row,
58947
- * Up and Down a column, Home and End to the first and the last. The arrows
58948
- * pass over a disabled stage and one a linear sequence holds out of reach,
58949
- * and they move focus without going to the stage.
59386
+ * or Space goes to the stage. Set `arrows` and the names are one tab stop, the
59387
+ * current stage's, and the arrow keys move focus between them: Left and Right
59388
+ * along a row, Up and Down a column, Home and End to the first and the last.
59389
+ * The stop follows focus, so Tab leaves the sequence and Shift+Tab comes back
59390
+ * to the name the reader left. The arrows pass over a disabled stage and one a
59391
+ * linear sequence holds out of reach, and they move focus without going to the
59392
+ * stage.
58950
59393
  *
58951
59394
  * ## Attributes & Properties
58952
59395
  *
58953
59396
  * Component attributes and properties that can be applied to the element or by using JavaScript.
58954
59397
  *
58955
59398
  * - `arrows`: Whether the arrow keys move focus between the stages' names, along the
58956
- * way the steps run. Off by default, so the arrows keep scrolling the page.
59399
+ * way the steps run, and the names are one tab stop. Off by default, so the
59400
+ * arrows keep scrolling the page.
58957
59401
  * - `completion`: What marks a stage `complete`.
58958
59402
  *
58959
59403
  * Absent, you do: each step's `complete` is yours, because a reader who
@@ -59124,7 +59568,9 @@ export type CustomElements = {
59124
59568
  * - `disabled`: Whether the stage is disabled, so the user cannot go to it.
59125
59569
  * - `optional`: Whether a reader may pass the stage without finishing it, in a sequence
59126
59570
  * with `linear`. Ark UI's skippable step.
59127
- * - `value`: The value the step sends in `helix-select`.
59571
+ * - `value`: The value the step sends in `helix-select`, and what names the step in its
59572
+ * sequence's `active`. Without one, the sequence names the step by its place,
59573
+ * counted from 1.
59128
59574
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
59129
59575
  *
59130
59576
  * **Named `whenSettled` because `settled` is taken four times over**, by
@@ -61061,6 +61507,10 @@ export type CustomElements = {
61061
61507
  * along, so the two writes a consumer would make in sequence do not compose
61062
61508
  * into the range they asked for. The platform has this method for that reason
61063
61509
  * and so does this.
61510
+ * - `setRangeText(replacement: string, start?: number, end?: number, selectMode?: SelectionMode) => void`: Replaces a range of the text, as the native method does: the selection
61511
+ * where `start` and `end` are left out, and `selectMode` says what is
61512
+ * selected after. It sends no event, as the native method sends none.
61513
+ * - `select() => void`: Selects everything in the field.
61064
61514
  * - `focus(options?: FocusOptions) => void`: Puts the caret in the field, as a label pointing at it would.
61065
61515
  * - `requestValue(next: string) => boolean`: Requests a new value, and returns whether the change was applied.
61066
61516
  *
@@ -64515,6 +64965,12 @@ export type CustomElements = {
64515
64965
  * captions, and poster treatment. `Sandbox` takes its preview and `Menu` its
64516
64966
  * trigger the same way.
64517
64967
  *
64968
+ * **The player is a `Video` or a plain `<video>`.** Either takes `src` and
64969
+ * `poster` from the entry, is named by it, plays on, and answers Shift with N
64970
+ * or P while focused. A plain `<video>` has no previous and next controls
64971
+ * that send `helix-previous` or `helix-next`, so its moves are the entries,
64972
+ * the menu, and your own buttons calling `previous()` and `next()`.
64973
+ *
64518
64974
  * **Entries are markup.** React skips properties it would set imperatively
64519
64975
  * during hydration, so an array property on a custom element is missing on the
64520
64976
  * first paint of a server-rendered page. `using-the-elements.mdx` has the
@@ -64547,7 +65003,8 @@ export type CustomElements = {
64547
65003
  *
64548
65004
  * **The player is named by the current entry**, and the device's own media
64549
65005
  * controls show the entry as the title. A player you gave a `label` keeps
64550
- * your name, and only the title follows the entry.
65006
+ * your name, and only the title follows the entry. A plain `<video>` is
65007
+ * named through `aria-label`, unless you wrote one.
64551
65008
  *
64552
65009
  * **Keyboard.** The entries take one stop in the tab order: the entry you
64553
65010
  * last focused, or the current entry before you have focused one. Enter or
@@ -65238,6 +65695,11 @@ export type CustomElements = {
65238
65695
  * commas. Their rows carry `aria-disabled`, the keys and typing pass over
65239
65696
  * them, and a press, Space, or Control with A does not select them.
65240
65697
  *
65698
+ * **Rows a stylesheet can tell apart.** A chosen row carries `data-selected`,
65699
+ * a disabled one `data-disabled`, as React Aria's rows do, and the row the
65700
+ * keys are on, which holds the tab stop, `data-active`, whether or not the
65701
+ * list has focus.
65702
+ *
65241
65703
  * **Loading more.** `helix-range-change` fires as the items on screen change,
65242
65704
  * and `range` holds them. `helix-load-more` fires once a reader is within one
65243
65705
  * screen of the end, once for each length of the set: add to `items` and it can
@@ -69172,7 +69634,13 @@ export type CustomElementsSolidJs = {
69172
69634
  * field taking more. A draft that fails them does not send, and the composer
69173
69635
  * takes `:state(invalid)` and `aria-invalid` once the reader has tried to send
69174
69636
  * it, the form was submitted, or the reader edited the field and left it.
69175
- * Tabbing past an empty composer marks nothing.
69637
+ * Sending an empty required composer counts as trying. Tabbing past an empty
69638
+ * composer marks nothing.
69639
+ *
69640
+ * **`feedback` is a message of your own about the draft**, such as one your
69641
+ * server sent back. While it is set, the composer is invalid at once, does
69642
+ * not send or submit, shows the message under the field, and a screen reader
69643
+ * hears it as it appears. Clear it to let the draft go.
69176
69644
  *
69177
69645
  * **`typing` says whether the user is writing**, and `helix-typing` is sent
69178
69646
  * each time it changes: when they start, and when they send or stop for
@@ -69183,6 +69651,9 @@ export type CustomElementsSolidJs = {
69183
69651
  *
69184
69652
  * Component attributes and properties that can be applied to the element or by using JavaScript.
69185
69653
  *
69654
+ * - `feedback`: A message about the draft, shown under the field. While set, the composer
69655
+ * is invalid, does not send, and does not submit, as a field's `feedback`
69656
+ * does, and the message is announced as it appears.
69186
69657
  * - `label`: The field's name, read by screen readers.
69187
69658
  * - `maxlength`/`maxLength`: The most characters a draft can have. The field stops taking more.
69188
69659
  * - `minlength`/`minLength`: The fewest characters a draft can have, once the reader has written in
@@ -69331,6 +69802,7 @@ export type CustomElementsSolidJs = {
69331
69802
  *
69332
69803
  * - `composer`: The whole composer.
69333
69804
  * - `end`: The box around the `end` slot.
69805
+ * - `feedback`: The `feedback` message, under the field while it is set.
69334
69806
  * - `field`: The text field.
69335
69807
  * - `mark`: The icon inside the send button.
69336
69808
  * - `send`: The send button.
@@ -69341,7 +69813,7 @@ export type CustomElementsSolidJs = {
69341
69813
  *
69342
69814
  * These can be used to apply styling when a component is in a given state.
69343
69815
  *
69344
- * - `invalid`: The draft fails `required`, `minlength`, `maxlength`, or a custom error, and the reader has tried to send or submit it, or edited the field and left it.
69816
+ * - `invalid`: The draft fails `required`, `minlength`, `maxlength`, or a custom error, and the reader has tried to send or submit it, or edited the field and left it. Or `feedback` is set.
69345
69817
  * - `settled`: Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.
69346
69818
  */
69347
69819
  "helix-headless-chat-composer": Partial<
@@ -69477,16 +69949,31 @@ export type CustomElementsSolidJs = {
69477
69949
  * `loading` while you fetch, then prepend the older turns. The turn the user
69478
69950
  * was reading stays in place on screen.
69479
69951
  *
69952
+ * The transcript is a `log`, the role for content added in order where the
69953
+ * newest matters most, and it answers the APG feed's keys. The `feed` role
69954
+ * reads its articles as a list from the top, with no newest end to stay
69955
+ * pinned to, so the log keeps the role a conversation has. While `loading` is
69956
+ * set or older turns load, the log carries `aria-busy`, as the APG asks of a
69957
+ * feed.
69958
+ *
69480
69959
  * The log is `aria-live="off"`. A separate status region announces each new
69481
69960
  * turn once, when it has finished arriving. It skips the user's own turns
69482
69961
  * unless they failed to send, turns loaded as history, and the turns already
69483
69962
  * there when the transcript opened. A turn is said with its author first, such
69484
69963
  * as "Ada: It ships today" (`arrival-label`), where its author can be named.
69485
69964
  *
69486
- * Pass the turns as children or as `turns` data. Do not use both. Children
69487
- * render from the server and suit most conversations. `turns` draws a long
69965
+ * Pass the turns as children or as `turns` data. Do not use both: a chat given
69966
+ * both draws every turn from `turns` and then the children, and says so once
69967
+ * in the console. Children render from the server and suit most
69968
+ * conversations. `turns` draws a long
69488
69969
  * transcript one window at a time, so the log needs a block size of its own.
69489
69970
  *
69971
+ * The log scrolls on this tier. It carries `data-scroller`, and `core` ships
69972
+ * `[data-scroller] { overflow: auto }` into every shadow root, so pinning,
69973
+ * history and the window work with no stylesheet. You still need to give the
69974
+ * log a block size, such as `helix-headless-chat::part(log) { block-size:
69975
+ * 20rem }`.
69976
+ *
69490
69977
  * **A conversation is built from three elements.** The chat holds the
69491
69978
  * transcript, a `Chat.Message` stands for each turn, and a `Chat.Composer` sits
69492
69979
  * in the `composer` slot. When the user sends, `helix-send` reaches the chat:
@@ -69500,7 +69987,12 @@ export type CustomElementsSolidJs = {
69500
69987
  * it takes them away. Anything slotted into `status` is drawn first.
69501
69988
  *
69502
69989
  * **Keyboard.** The transcript moves between turns the way a feed does. Each
69503
- * turn says its place, such as "3 of 40", windowed or not.
69990
+ * turn says its place, such as "3 of 40", windowed or not. The transcript is
69991
+ * a tab stop while it holds a turn, and the turn a reader moved to is one
69992
+ * too. Moving to an older turn unpins a transcript that scrolls and scrolls
69993
+ * the turn into view, and moving to the newest pins it again. When the turn
69994
+ * holding focus is removed, focus moves to the turn that took its place, or to
69995
+ * the one before it where it was the last.
69504
69996
  *
69505
69997
  * | Key | What it does |
69506
69998
  * |---|---|
@@ -69679,7 +70171,7 @@ export type CustomElementsSolidJs = {
69679
70171
  * - `indicator`: The three dots before the words that say who is typing, which the styled tier animates as a message's are. Hidden from screen readers.
69680
70172
  * - `live`: The region where screen readers announce each turn once it has arrived.
69681
70173
  * - `loading`: Shown while the history loads.
69682
- * - `log`: The transcript, which scrolls.
70174
+ * - `log`: The transcript, which scrolls. On this tier, it needs only a block size.
69683
70175
  * - `message`: The message drawn for a turn from `turns`, forwarded whole.
69684
70176
  * - `message-actions`: The controls on a turn from `turns`, beside its time.
69685
70177
  * - `message-avatar`: The avatar box of a turn from `turns`.
@@ -69711,6 +70203,10 @@ export type CustomElementsSolidJs = {
69711
70203
  *
69712
70204
  * These can be used to apply styling when a component is in a given state.
69713
70205
  *
70206
+ * - `empty`: The conversation has no turns.
70207
+ * - `loading`: Older turns are loading: `history` is `loading`.
70208
+ * - `pinned`: The transcript follows its newest turn.
70209
+ * - `typing`: `typing` names someone on the other side.
69714
70210
  * - `settled`: Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.
69715
70211
  */
69716
70212
  "helix-headless-chat": Partial<
@@ -70222,7 +70718,11 @@ export type CustomElementsSolidJs = {
70222
70718
  * from the accessibility tree and left out of a copy. Set `mark-lines` to
70223
70719
  * mark lines a reader should look at, such as `2, 4-6`: the block draws a
70224
70720
  * band behind each run, placed where the lines are laid out, so it follows a
70225
- * highlighter's markup and lines that wrap. Set `wrap` to wrap long lines
70721
+ * highlighter's markup and lines that wrap. `added-lines` and
70722
+ * `removed-lines` mark lines the same way as inserted and deleted, as
70723
+ * Expressive Code's `ins` and `del` do, in code that is not a diff. The bands
70724
+ * are drawn and hidden from screen readers, so say in the text around the
70725
+ * block what a marked line means. Set `wrap` to wrap long lines
70226
70726
  * rather than scroll them; a gutter then numbers each line where it starts.
70227
70727
  * Set `wrappable` for a button in the header that turns `wrap` on and off,
70228
70728
  * pressed while the lines wrap.
@@ -70291,6 +70791,8 @@ export type CustomElementsSolidJs = {
70291
70791
  *
70292
70792
  * Component attributes and properties that can be applied to the element or by using JavaScript.
70293
70793
  *
70794
+ * - `added-lines`/`addedLines`: The lines to mark as inserted, as numbers and ranges counted from 1, such
70795
+ * as `3-4`. Drawn as `mark-lines` is, in the added color. Not for a diff.
70294
70796
  * - `code-label`/`codeLabel`: The name of a block that scrolls, which is a tab stop while it does.
70295
70797
  *
70296
70798
  * Where the block has a name, the scroller says it too, such as "Code,
@@ -70367,6 +70869,8 @@ export type CustomElementsSolidJs = {
70367
70869
  * `no-copy=""` on hosts that never asked for one, and the rule about a
70368
70870
  * reflected property taking no default is satisfied by the default being
70369
70871
  * `false`.
70872
+ * - `removed-lines`/`removedLines`: The lines to mark as deleted, as numbers and ranges counted from 1. Drawn
70873
+ * as `mark-lines` is, in the removed color. Not for a diff.
70370
70874
  * - `show-unchanged-label`/`showUnchangedLabel`: The words of a button that shows a folded run of unchanged lines, in a
70371
70875
  * diff with `context-lines`. `{count}` is how many.
70372
70876
  * - `variant`: How a diff's two versions are arranged. It has no effect without `diff`.
@@ -70446,6 +70950,8 @@ export type CustomElementsSolidJs = {
70446
70950
  * - `actions`: Controls for the block, in the header before the copy button.
70447
70951
  * - `copied-icon`: The copy button's icon after a copy. Defaults to a check mark.
70448
70952
  * - `copy-icon`: The copy button's icon before a copy. Defaults to a clipboard.
70953
+ * - `expand-icon`: An icon on the button that shows every line of a capped block, before its words.
70954
+ * - `label`: The block's name in the header, such as a file icon beside the file name. Replaces `label` and `language` there, and draws the header.
70449
70955
  *
70450
70956
  * ## CSS Custom Properties
70451
70957
  *
@@ -70493,7 +70999,9 @@ export type CustomElementsSolidJs = {
70493
70999
  * - `header`: The bar that holds the name and the copy button, shown when there is a name.
70494
71000
  * - `hunk`: In a diff, a `@@` line saying where the lines under it are.
70495
71001
  * - `label`: The block's name: its `label`, or its `language` where it has no label.
70496
- * - `mark`: The band behind a run of lines `mark-lines` names. The block writes where the run is laid out into `--code-block-mark-start`, `--code-block-mark-size`, and `--code-block-mark-inline-size` on it. Hidden from the accessibility tree.
71002
+ * - `mark`: The band behind a run of lines `mark-lines`, `added-lines` or `removed-lines` names. The block writes where the run is laid out into `--code-block-mark-start`, `--code-block-mark-size`, and `--code-block-mark-inline-size` on it. Hidden from the accessibility tree.
71003
+ * - `mark-added`: The band behind a run of lines `added-lines` names. Applied with `mark`.
71004
+ * - `mark-removed`: The band behind a run of lines `removed-lines` names. Applied with `mark`.
70497
71005
  * - `marker`: In a diff, the `+`, `-`, or space that starts a line.
70498
71006
  * - `new`: In a split diff, the new version's `<pre>`.
70499
71007
  * - `number`: In a diff, a line number. In a `wrap` block with `line-numbers`, one line's number in the gutter, which the block makes as tall as the line it numbers through `--code-block-line-size`.
@@ -70610,7 +71118,8 @@ export type CustomElementsSolidJs = {
70610
71118
  *
70611
71119
  * The trigger and ArrowDown open the panel with focus in the square. Tab moves
70612
71120
  * between the panel's controls without leaving it, and Escape closes it and
70613
- * returns focus to the field.
71121
+ * returns focus to the control that opened it: the trigger after a press, and
71122
+ * the field after ArrowDown.
70614
71123
  *
70615
71124
  * The component sets `--color-input-swatch`, so do not set it yourself. It
70616
71125
  * holds the resolved color, so the styled tier can paint the swatch without
@@ -71107,10 +71616,11 @@ export type CustomElementsSolidJs = {
71107
71616
  * the anchor the browser points its bubble at.
71108
71617
  *
71109
71618
  * **Text that is not a color is bad input**, so a form does not submit
71110
- * `#00` from a half-typed value. The picker draws no message of its own, so
71111
- * reporting it as each keystroke arrives shows nothing until the form asks;
71112
- * Color Input shows its own message against the field the reader typed
71113
- * into.
71619
+ * `#00` from a half-typed value. The picker marks it, and says
71620
+ * `badInputMessage` under itself, once the reader leaves the value field or
71621
+ * presses Enter, and a missing color once the reader has committed one or a
71622
+ * form has refused the picker. Color Input shows its own message against the
71623
+ * field the reader typed into.
71114
71624
  * - `saturation-label`/`saturationLabel`: What the square's horizontal ramp is called.
71115
71625
  * - `square-text`/`squareText`: What a screen reader hears for the square's place, the color's two
71116
71626
  * numbers and its name, on whichever of its two inputs it is on.
@@ -71229,14 +71739,10 @@ export type CustomElementsSolidJs = {
71229
71739
  *
71230
71740
  * Methods that can be called to access component functionality.
71231
71741
  *
71742
+ * - `formResetCallback() => void`: A reset ends any typing and takes back text that was not a color, so the
71743
+ * field shows the color the reset put back.
71232
71744
  * - `requestValue(next: string) => boolean`: Blocks every change while `readOnly` is set.
71233
71745
  * - `focus(options?: FocusOptions) => void`: Moves focus to the square.
71234
- * - `formResetCallback() => void`: Returns the control to its `defaultValue`, or to its `value` attribute
71235
- * where there is no `default-value`.
71236
- *
71237
- * Both halves are dropped, the consumer's and the control's, because a
71238
- * reset means the form is as it was served. Clearing only the internal one
71239
- * would leave a control that had been written to stuck at that value.
71240
71746
  * - `formStateRestoreCallback(state: string | File | FormData | null) => void`: Restores the value when the browser brings a form back.
71241
71747
  *
71242
71748
  * Falling back to what the markup declared rather than to empty, because
@@ -71317,7 +71823,7 @@ export type CustomElementsSolidJs = {
71317
71823
  * - `eyedropper-live`: The live region of the button inside `eyedropper`, which says its pending label.
71318
71824
  * - `eyedropper-spinner`: The ring the eyedropper button turns while it is pending.
71319
71825
  * - `eyedropper-text`: The words on the button inside `eyedropper`, trimmed to their capitals and baseline.
71320
- * - `feedback`: The message under the picker, while `feedback` is set.
71826
+ * - `feedback`: The message under the picker: `feedback`, or what is wrong with the answer once the picker is marked invalid.
71321
71827
  * - `field`: One channel's number field with its label, in `channel-fields`.
71322
71828
  * - `field-input`: The number input in a channel's field.
71323
71829
  * - `field-label`: The name above a channel's number input.
@@ -71476,12 +71982,13 @@ export type CustomElementsSolidJs = {
71476
71982
  * language.
71477
71983
  * - `multiple`: Whether more than one option can be chosen.
71478
71984
  *
71479
- * The list already does the work: `value` comes apart on commas, a press
71480
- * toggles rather than replaces, and the arrows move without choosing. What
71481
- * this adds is the tags, and keeping the panel open between picks.
71985
+ * The list already does the work: `value` is the chosen values joined with
71986
+ * commas, a press toggles rather than replaces, and the arrows move without
71987
+ * choosing. What this adds is the tags, and keeping the panel open between
71988
+ * picks.
71482
71989
  *
71483
- * A comma is therefore not available inside an option's value, which is the
71484
- * listbox's contract and not this element's to change.
71990
+ * An option's value may hold a comma, and it is read as one value, as
71991
+ * `Select` and `Listbox` read it. So may an answer the reader created.
71485
71992
  *
71486
71993
  * **The list is told, and the field is not.** `aria-multiselectable` belongs
71487
71994
  * to `listbox`, `grid`, `tree` and `tablist`, and `combobox` dropped it in
@@ -71825,7 +72332,8 @@ export type CustomElementsSolidJs = {
71825
72332
  * | `hotkey`, Command or Control with K by default | Opens the palette from anywhere on the page, or closes it. With `inline`, puts focus in its filter field. |
71826
72333
  * | Down, Up | Moves the highlight to the next or the previous command, round from the last to the first. |
71827
72334
  * | Page Down, Page Up | Moves the highlight by as many commands as the list shows at once. |
71828
- * | Home, End, Left, Right | Move the caret in the filter field. |
72335
+ * | Home, End | Move the caret in the filter field. With `home-end="list"`, move the highlight to the first or the last command. |
72336
+ * | Left, Right | Move the caret in the filter field. |
71829
72337
  * | Enter | Runs the highlighted command, or follows it where it is a link, and closes the palette. On a command with `opens`, shows its page. |
71830
72338
  * | Command or Control with Enter | Takes the highlighted command's `alternate` destination, where it has one. |
71831
72339
  * | Backspace | In an empty filter on a page, goes back to the page before. |
@@ -71847,6 +72355,11 @@ export type CustomElementsSolidJs = {
71847
72355
  * - `filter-delay`/`filterDelay`: How long typing rests before the commands are filtered, in milliseconds,
71848
72356
  * so a palette filtered on a server sends one `helix-filter` for a word.
71849
72357
  * `0` filters on every keystroke. See Listbox's `filter-delay`.
72358
+ * - `home-end`/`homeEnd`: Where Home and End go from the filter field.
72359
+ *
72360
+ * Absent, they move the caret, as APG's combobox has them. `list` moves the
72361
+ * highlight to the first or the last command, as React Aria's Autocomplete
72362
+ * does, and Shift with either still selects the text.
71850
72363
  * - `hotkey`: The key that opens the palette, written as `mod+k`, `shift+p`, or `k`,
71851
72364
  * in Kbd's chord spelling: `mod` is Command or Control, `ctrl`, `cmd`,
71852
72365
  * `alt` and `shift` the keys they name.
@@ -71861,6 +72374,9 @@ export type CustomElementsSolidJs = {
71861
72374
  * Choosing a command says `helix-select` and leaves the list where it is,
71862
72375
  * and `open`, `toggle` and the dialog's parts do nothing.
71863
72376
  * - `label`: Accessible name for the overlay, which has no visible heading.
72377
+ * - `layout`: How the commands are laid out, as Listbox's `layout`: `grid` draws them in
72378
+ * rows and columns, for a palette of icons or emoji, and the arrow keys
72379
+ * follow the rows and the columns. Absent is one command under another.
71864
72380
  * - `load-error`/`loadError`: What the list says when its commands could not be loaded, such as after a
71865
72381
  * request to a server fails. Empty, null or no attribute is no error, so
71866
72382
  * removing the attribute clears it. Passed to the list, which shows it
@@ -72566,6 +73082,10 @@ export type CustomElementsSolidJs = {
72566
73082
  * Off by default. Windowing costs a scroll listener, a measurement per row
72567
73083
  * drawn, and a `block-size` on the scrolling box, and a table of twenty rows
72568
73084
  * should pay none of them.
73085
+ *
73086
+ * While windowed, the `table` part scrolls on this tier: it carries
73087
+ * `data-scroller`, and `core` ships `[data-scroller] { overflow: auto }` into
73088
+ * every shadow root. You still need to give it a block size.
72569
73089
  * - `empty-text`/`emptyText`: The text shown and announced when there are no rows and none are loading.
72570
73090
  * - `loading`: Whether the rows are still loading.
72571
73091
  *
@@ -72728,7 +73248,7 @@ export type CustomElementsSolidJs = {
72728
73248
  * - `select`: The cell that holds a row's checkbox.
72729
73249
  * - `select-all`: The heading that holds the checkbox that selects every row.
72730
73250
  * - `select-selected`: Added to `select` in a selected row.
72731
- * - `table`: The grid.
73251
+ * - `table`: The grid. While `windowed`, the box that scrolls, which needs only a block size on this tier.
72732
73252
  * - `toggle`: The mark in a row header that a press opens and closes its row by, in a tree grid.
72733
73253
  * - `toggle-mark`: The caret in `toggle`. It points along the line while the row is closed and down while it is open.
72734
73254
  * - `toggle-open`: Added to `toggle` while its row is open.
@@ -74480,6 +75000,10 @@ export type CustomElementsSolidJs = {
74480
75000
  * <helix-headless-drawer id="nav">…</helix-headless-drawer>
74481
75001
  * ```
74482
75002
  *
75003
+ * From its first press, a button that opens the drawer this way says whether
75004
+ * the drawer is open: a Helix button through `expanded`, and any other
75005
+ * element with `aria-expanded`.
75006
+ *
74483
75007
  * ## Attributes & Properties
74484
75008
  *
74485
75009
  * Component attributes and properties that can be applied to the element or by using JavaScript.
@@ -75383,9 +75907,10 @@ export type CustomElementsSolidJs = {
75383
75907
  * press. `requestChange` documents the pattern.
75384
75908
  *
75385
75909
  * **Keyboard.** The remove button is a tab stop of its own, and Enter or Space
75386
- * on it asks to remove the filter. In a `FilterInput`, Backspace in the empty
75387
- * field asks to remove the last chip, the arrow keys move between the field
75388
- * and the chips, and Delete or Backspace on a chip asks to remove it.
75910
+ * on it asks to remove the filter. In a `FilterInput`, the field's text is the
75911
+ * one tab stop: Backspace in the empty field asks to remove the last chip, the
75912
+ * arrow keys move between the field and the chips, and Delete or Backspace on
75913
+ * a chip asks to remove it.
75389
75914
  *
75390
75915
  * The remove button is named `dismiss-label` followed by the chip's words,
75391
75916
  * such as "Remove filter Status is not open", so a row of chips says which
@@ -75441,6 +75966,12 @@ export type CustomElementsSolidJs = {
75441
75966
  * reads. The moment somebody picks a different comparison it appears, which
75442
75967
  * makes an unusual filter look unusual.
75443
75968
  * - `dismissible`: Whether the element shows a control that dismisses it.
75969
+ * - `dismissTabStop`: Whether the remove button is a tab stop of its own.
75970
+ *
75971
+ * `FilterInput` writes `false` on the chips in its `tags` slot: the field's
75972
+ * text is its one tab stop, and the arrow keys move from the text to the
75973
+ * chips, as in a `multiple` Combobox. No attribute: it is coordination
75974
+ * between elements, as `Tag.dismissTabStop` is. (property only)
75444
75975
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
75445
75976
  *
75446
75977
  * **Named `whenSettled` because `settled` is taken four times over**, by
@@ -75912,8 +76443,9 @@ export type CustomElementsSolidJs = {
75912
76443
  * first colon, reads a leading `-` as the negation, and reads a word in
75913
76444
  * brackets before the colon as the comparison.
75914
76445
  *
75915
- * **Keyboard.** Focus stays in the text. The text names the highlighted
75916
- * suggestion as its `aria-activedescendant`.
76446
+ * **Keyboard.** Focus stays in the text, which is the field's one tab stop. The
76447
+ * text names the highlighted suggestion as its `aria-activedescendant`, and the
76448
+ * arrow keys reach the tokens.
75917
76449
  *
75918
76450
  * | Key | What it does |
75919
76451
  * |---|---|
@@ -75971,12 +76503,24 @@ export type CustomElementsSolidJs = {
75971
76503
  * and removing the chip alone would leave its value ticked in the hidden
75972
76504
  * menu. Its dismissal is treated as the field being filtered by nothing, so
75973
76505
  * it fires `helix-facet` like every other change, and the chip goes when the
75974
- * filter goes.
76506
+ * filter goes. Set `chips` and the field adds, updates, and removes those
76507
+ * chips itself, from every `helix-facet` you do not cancel.
75975
76508
  *
75976
76509
  * ## Attributes & Properties
75977
76510
  *
75978
76511
  * Component attributes and properties that can be applied to the element or by using JavaScript.
75979
76512
  *
76513
+ * - `chips`: Whether the field keeps a `FilterChip` for each filter in its `tags` slot,
76514
+ * from the `helix-facet` events it hears.
76515
+ *
76516
+ * Off, you build the chips, which is what you do when your own model holds
76517
+ * the filters. On, a filter typed, picked, or changed adds or updates the
76518
+ * chip for its field, one with no values takes it away (unless its
76519
+ * comparison takes none, such as "is empty"), and removing the chip clears
76520
+ * the filter. A `helix-facet` you cancel changes no chip.
76521
+ *
76522
+ * The chips are elements the field adds to its own children, so leave this
76523
+ * off where a framework renders those children and would remove them.
75980
76524
  * - `clearable`: Shows a button that empties the field.
75981
76525
  *
75982
76526
  * The text only. The tokens are the consumer's markup and this element is not
@@ -75988,6 +76532,18 @@ export type CustomElementsSolidJs = {
75988
76532
  * - `filter-suggestions`/`filterSuggestions`: Whether the panel narrows itself to the suggestions that hold the term
75989
76533
  * being typed, as React Aria's Autocomplete filters. Off, the panel shows
75990
76534
  * what you slot and you narrow it.
76535
+ * - `loading`: Whether the suggestions are still loading, such as while a request for the
76536
+ * values of a typed key is out.
76537
+ *
76538
+ * The panel opens on `loading-text`, or the `loading` slot, while the field
76539
+ * has focus, and a screen reader hears it. Slot the options and clear this
76540
+ * when they arrive.
76541
+ * - `loading-text`/`loadingText`: Text the panel shows while the suggestions load.
76542
+ * - `no-results-text`/`noResultsText`: Text the panel shows when `filter-suggestions` hides every suggestion, such
76543
+ * as "No matching filters".
76544
+ *
76545
+ * Empty, or no `no-results` slot, and the panel closes instead, as it does
76546
+ * when it has nothing to offer.
75991
76547
  * - `placeholder`: The text shown while the field is empty.
75992
76548
  *
75993
76549
  * Not a label: it goes when typing starts.
@@ -76149,6 +76705,8 @@ export type CustomElementsSolidJs = {
76149
76705
  * - `feedback`: The message that says what is wrong, for content richer than a string. It shows while there is a message.
76150
76706
  * - `hint`: Help under the control, for content richer than the `hint` text.
76151
76707
  * - `label`: The label, for content richer than the `label` text.
76708
+ * - `loading`: What the panel shows while `loading` is set, for content richer than `loading-text`.
76709
+ * - `no-results`: What the panel shows when `filter-suggestions` hides every suggestion, for content richer than `no-results-text`.
76152
76710
  * - `start`: Content before the text, such as a search icon.
76153
76711
  * - `suggestions`: Suggestions for what to type next, as `Option`s and `Option.Group`s.
76154
76712
  * - `tags`: The active filters, as `FilterChip`s or `Tag`s.
@@ -76232,12 +76790,14 @@ export type CustomElementsSolidJs = {
76232
76790
  *
76233
76791
  * - `clear`: The button that empties the field.
76234
76792
  * - `control`: The input itself.
76793
+ * - `empty`: Shown in the panel when `filter-suggestions` hides every suggestion.
76235
76794
  * - `feedback`: The error message under the field.
76236
76795
  * - `field`: The box that holds everything.
76237
76796
  * - `hint`: The help text under the field, shown while there is no error.
76238
76797
  * - `label`: The label above the field.
76239
76798
  * - `lead`: The box before the text that holds the `start` slot.
76240
76799
  * - `live`: The live region that says how many suggestions the open panel offers. It is rendered from the first time the panel opens with suggestions.
76800
+ * - `loading`: Shown in the panel while the suggestions load.
76241
76801
  * - `rest`: The count of tokens that did not fit. It is a `<button>` with `expandable` and a `<span>` without it.
76242
76802
  * - `surface`: The floating panel the suggestions sit in.
76243
76803
  * - `tags`: The row the tokens sit in.
@@ -76247,6 +76807,8 @@ export type CustomElementsSolidJs = {
76247
76807
  * These can be used to apply styling when a component is in a given state.
76248
76808
  *
76249
76809
  * - `invalid`: The field has an error to show, from the browser's validation or from your `feedback`.
76810
+ * - `loading`: While `loading` is set.
76811
+ * - `no-results`: `filter-suggestions` hid every suggestion, and `no-results-text` or the `no-results` slot says so.
76250
76812
  * - `open`: The suggestions are open.
76251
76813
  * - `settled`: Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.
76252
76814
  */
@@ -76269,7 +76831,9 @@ export type CustomElementsSolidJs = {
76269
76831
  * **`relative` shows the same reading in words**, such as "3 hours ago" at
76270
76832
  * `long`, "3 hr. ago" at `short` and "3h ago" at `narrow`, the styles
76271
76833
  * `sl-relative-time` offers. `numeric="always"` says "1 day ago" where the
76272
- * default says "yesterday".
76834
+ * default says "yesterday". Both readings round the count, as
76835
+ * `sl-relative-time` does: 100 seconds ago is "2 minutes ago", and 59.6
76836
+ * minutes is "1 hour".
76273
76837
  *
76274
76838
  * **`date-style` and `time-style` take each locale's own pattern**, such as
76275
76839
  * "Tuesday, August 4, 2026" at `full`, and stand in for the separate fields,
@@ -77931,6 +78495,9 @@ export type CustomElementsSolidJs = {
77931
78495
  *
77932
78496
  * Methods that can be called to access component functionality.
77933
78497
  *
78498
+ * - `setRangeText(replacement: string, start?: number, end?: number, selectMode?: SelectionMode) => void`: Replaces a range of the text, as the native method does: the selection
78499
+ * where `start` and `end` are left out, and `selectMode` says what is
78500
+ * selected after. It sends no event, as the native method sends none.
77934
78501
  * - `setSelectionRange(start: number, end: number, direction?: SelectionDirection) => void`: Selects the range from `start` to `end` in one call, which setting
77935
78502
  * `selectionStart` and `selectionEnd` one at a time cannot always do.
77936
78503
  *
@@ -81448,6 +82015,8 @@ export type CustomElementsSolidJs = {
81448
82015
  * These can be used to apply styling when a component is in a given state.
81449
82016
  *
81450
82017
  * - `checked`: The row is checked.
82018
+ * - `disabled`: The row is disabled.
82019
+ * - `expanded`: Under `submenus="flyout"`, the row's submenu is open beside it.
81451
82020
  * - `highlighted`: In a menu with `filterable`, the arrow keys or the pointer reached the row while focus stays in the filter field.
81452
82021
  * - `submenu-mark`: Under `submenus="flyout"`, a row in this row's submenu can be ticked or opens a submenu, so the submenu keeps its trailing column.
81453
82022
  * - `submenu-start`: Under `submenus="flyout"`, a row in this row's submenu has content before its label, so the submenu keeps its leading column.
@@ -81474,7 +82043,9 @@ export type CustomElementsSolidJs = {
81474
82043
  *
81475
82044
  * Submenus drill down by default. A submenu replaces the panel's content, and a
81476
82045
  * back row returns to the previous page. One panel stays inside a narrow
81477
- * window, and works on touch screens, which have no hover.
82046
+ * window, and works on touch screens, which have no hover. Focus follows a
82047
+ * mouse resting on a row in either mode, and a drilled page is a `menu` named
82048
+ * by the row that opened it.
81478
82049
  *
81479
82050
  * **`submenus="flyout"` opens each submenu in a panel of its own beside its
81480
82051
  * row**, as React Aria's `SubmenuTrigger` and Radix's `Sub` do. Resting the
@@ -81508,6 +82079,11 @@ export type CustomElementsSolidJs = {
81508
82079
  * trigger's width, for a menu as wide as its trigger:
81509
82080
  * `helix-menu::part(surface) { min-inline-size: var(--floating-anchor-inline-size) }`.
81510
82081
  *
82082
+ * **The choices in one place.** `checkedValues` holds the values of the rows
82083
+ * that are checked, anywhere in the menu, and setting it checks exactly
82084
+ * those rows, as React Aria's `selectedKeys` does. `change` is sent on the
82085
+ * menu when a reader's choice changes it.
82086
+ *
81511
82087
  * With `context`, the trigger is an area and the menu is its context menu: a
81512
82088
  * right-click, a long press, Shift+F10 or the menu key over the area opens it
81513
82089
  * at the pointer, or at the area's corner from the keyboard, as Radix's context
@@ -81530,7 +82106,8 @@ export type CustomElementsSolidJs = {
81530
82106
  * field: Up and Down Arrow move the highlight through the rows that are left,
81531
82107
  * Enter chooses the highlighted row, Right Arrow opens its submenu, Left Arrow
81532
82108
  * on a submenu goes back, and Escape clears the filter and then closes the
81533
- * menu. Home, End and the other keys move the caret and type. The field names
82109
+ * menu. A screen reader hears how many rows the filter keeps
82110
+ * (`results-label`). Home, End and the other keys move the caret and type. The field names
81534
82111
  * the highlighted row with `aria-activedescendant`, and the rows are a `menu`
81535
82112
  * after the field. Cancel `helix-filter` to keep every row
81536
82113
  * showing and narrow the rows yourself, such as by replacing them with rows
@@ -81570,6 +82147,9 @@ export type CustomElementsSolidJs = {
81570
82147
  * - `placement`: The side the menu opens on, when there is room.
81571
82148
  *
81572
82149
  * It moves if that side does not fit.
82150
+ * - `results-label`/`resultsLabel`: What a screen reader hears when the filter narrows the rows. `{count}` is
82151
+ * how many rows are left, written in the locale, and each language writes
82152
+ * the forms it has, as Listbox's `results-label` does.
81573
82153
  * - `submenus`: How a submenu opens. `drill` shows it in place of the page showing, with
81574
82154
  * a way back. `flyout` opens it in a panel of its own beside its row.
81575
82155
  * - `empty-text`/`emptyText`: The text shown and announced when there are no rows and none are loading.
@@ -81598,6 +82178,13 @@ export type CustomElementsSolidJs = {
81598
82178
  *
81599
82179
  * Absent, a row is kept where its words hold the filter, in any case. A
81600
82180
  * property only, there being no way to write a function in markup. (property only)
82181
+ * - `checkedValues`: The values of the choice rows that are checked, anywhere in the menu, in
82182
+ * document order.
82183
+ *
82184
+ * Set it to check exactly those rows and uncheck every other choice row, as
82185
+ * React Aria's `selectedKeys` controls a menu's selection from one place.
82186
+ * Each row keeps its own `checked` too, which this reads and writes. `change`
82187
+ * is sent on the menu when a reader's choice changes it. (property only)
81601
82188
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
81602
82189
  *
81603
82190
  * **Named `whenSettled` because `settled` is taken four times over**, by
@@ -81623,6 +82210,7 @@ export type CustomElementsSolidJs = {
81623
82210
  *
81624
82211
  * Events that will be emitted by the component.
81625
82212
  *
82213
+ * - `change`: A reader's choice checked or unchecked rows. Read `checkedValues` for the rows that are checked now.
81626
82214
  * - `helix-before-close`: The menu is about to close. Cancelable: cancel it to keep it open.
81627
82215
  * - `helix-before-open`: The menu is about to open. Cancelable: cancel it to keep it closed.
81628
82216
  * - `helix-filter`: The text in the filter field changed, with the new text in `detail.value`. Cancelable: cancel it to keep every row showing and narrow the rows yourself.
@@ -81634,6 +82222,8 @@ export type CustomElementsSolidJs = {
81634
82222
  * Areas where markup can be added to the component.
81635
82223
  *
81636
82224
  * - `(default)`: The items.
82225
+ * - `empty`: What the menu shows when it has no items, for content richer than `empty-text`.
82226
+ * - `loading`: What the menu shows while its items load, for content richer than `loading-text`.
81637
82227
  * - `no-results`: What the menu shows when the filter keeps no rows, for content richer than `no-results-text`.
81638
82228
  * - `trigger`: The control that opens the menu, or with `context` the area a context menu opens over.
81639
82229
  *
@@ -81679,6 +82269,8 @@ export type CustomElementsSolidJs = {
81679
82269
  * These can be used to apply styling when a component is in a given state.
81680
82270
  *
81681
82271
  * - `drilled`: A submenu's page is showing, so content that is not a row can hide with the top page.
82272
+ * - `entering`: From the moment the panel shows until its entrance has finished.
82273
+ * - `exiting`: From the moment the panel hides until its exit has finished.
81682
82274
  * - `mark`: A row on the current page has a checkbox or a link, so every row keeps the trailing column.
81683
82275
  * - `open`: While the menu is open.
81684
82276
  * - `placed-bottom`: While the open panel sits below its trigger.
@@ -82669,7 +83261,9 @@ export type CustomElementsSolidJs = {
82669
83261
  * speaks it: `feedback` replaces the message under the field and does not
82670
83262
  * reach the bubble. Unset is the sentence registered for the page's
82671
83263
  * language, then the English.
82672
- * - `decrement-label`/`decrementLabel`: The name of the step down button, read by screen readers.
83264
+ * - `decrement-label`/`decrementLabel`: The name of the step down button, read by screen readers. The field's
83265
+ * label follows it, so a reader hears "Decrease Quantity", as React Aria
83266
+ * names its steppers.
82673
83267
  * - `format-options`/`formatOptions`: `Intl.NumberFormat` options the number is shown with while the field is
82674
83268
  * not being edited: a currency, a percent, a unit, or a number of decimals.
82675
83269
  * Written as JSON in the attribute.
@@ -82677,7 +83271,9 @@ export type CustomElementsSolidJs = {
82677
83271
  * ```html
82678
83272
  * <helix-number-input format-options='{"style":"currency","currency":"EUR"}'></helix-number-input>
82679
83273
  * ```
82680
- * - `increment-label`/`incrementLabel`: The name of the step up button, read by screen readers.
83274
+ * - `increment-label`/`incrementLabel`: The name of the step up button, read by screen readers. The field's
83275
+ * label follows it, so a reader hears "Increase Quantity", as React Aria
83276
+ * names its steppers.
82681
83277
  * - `large-step`/`largeStep`: How many steps `PageUp` and `PageDown` move.
82682
83278
  *
82683
83279
  * Ten steps, which is the convention every spinner on the platform follows,
@@ -82859,8 +83455,10 @@ export type CustomElementsSolidJs = {
82859
83455
  *
82860
83456
  * Methods that can be called to access component functionality.
82861
83457
  *
82862
- * - `stepUp(large = false) => void`: Steps the value up, by `largeStep` steps when `large` is set.
82863
- * - `stepDown(large = false) => void`: Steps the value down, by `largeStep` steps when `large` is set.
83458
+ * - `stepUp(count: number | boolean = 1) => void`: Steps the value up by `step`, `count` times, as the native method and
83459
+ * `Input.stepUp` do. `true` takes `largeStep` steps, as `PageUp` does.
83460
+ * - `stepDown(count: number | boolean = 1) => void`: Steps the value down by `step`, `count` times. `true` takes `largeStep`
83461
+ * steps, as `PageDown` does.
82864
83462
  *
82865
83463
  * The same path a press of the down arrow takes, so a consumer driving this
82866
83464
  * from their own control gets the clamping and the announcement rather than
@@ -84514,7 +85112,9 @@ export type CustomElementsSolidJs = {
84514
85112
  *
84515
85113
  * It opens on click and from a command. `command="--show"` and the related
84516
85114
  * commands work as they do on `Dialog` and `Drawer`, so a button anywhere on
84517
- * the page can open the popover with no script.
85115
+ * the page can open the popover with no script. From its first press, a
85116
+ * button that opens it this way says whether the popover is open: a Helix
85117
+ * button through `expanded`, and any other element with `aria-expanded`.
84518
85118
  *
84519
85119
  * **Opening moves focus into the panel**, to the first control in it, or to the
84520
85120
  * panel itself where it holds none, and closing from inside gives it back to
@@ -84524,8 +85124,12 @@ export type CustomElementsSolidJs = {
84524
85124
  * `modal` keeps `Tab` inside the panel while it is open and says so with
84525
85125
  * `aria-modal`, for a panel that has to be answered before the page goes on.
84526
85126
  * The rest of the page is hidden from screen readers with `aria-hidden` while
84527
- * it is open, so the virtual cursor stays in the panel too. Without it the
84528
- * popover does not trap focus.
85127
+ * it is open, so the virtual cursor stays in the panel too, and the page does
85128
+ * not scroll behind it. Without it the popover does not trap focus.
85129
+ *
85130
+ * A press outside closes the panel and leaves focus where the press put it.
85131
+ * Where it put focus nowhere, as a press on text or on the page's background
85132
+ * does, focus goes back to the trigger.
84529
85133
  *
84530
85134
  * The panel's name is `label` when you set it. Otherwise it is the first
84531
85135
  * heading in the panel, or the elements an `aria-labelledby` on the host names.
@@ -84541,10 +85145,17 @@ export type CustomElementsSolidJs = {
84541
85145
  * | Escape | Closes the panel and puts focus back on the trigger. |
84542
85146
  * | Tab, Shift+Tab | Moves through the controls in the panel. Leaving the panel and the trigger closes it. With `modal`, moves from the last control round to the first and from the first round to the last. |
84543
85147
  *
85148
+ * The panel opens against the trigger, or against the element `anchor` names,
85149
+ * such as a field beside the button that opens it. `offset` moves it away from
85150
+ * that element, `cross-offset` slides it along the side it is on,
85151
+ * `container-padding` keeps it that far from the window's edges, and
85152
+ * `flip="false"` keeps it on its side where the other side has more room.
85153
+ *
84544
85154
  * `arrow` draws a point on the panel's edge facing the trigger. The side the
84545
- * panel landed on is on the host as `:state(placed-top)` and its kin, and the
84546
- * trigger's width is on the panel as `--floating-anchor-inline-size`, for a
84547
- * panel as wide as its trigger:
85155
+ * panel landed on is on the host as `:state(placed-top)` and its kin, its
85156
+ * alignment along that side as `:state(aligned-start)` or
85157
+ * `:state(aligned-end)`, and the trigger's width is on the panel as
85158
+ * `--floating-anchor-inline-size`, for a panel as wide as its trigger:
84548
85159
  *
84549
85160
  * ```css
84550
85161
  * helix-popover::part(popover) {
@@ -84556,12 +85167,25 @@ export type CustomElementsSolidJs = {
84556
85167
  *
84557
85168
  * Component attributes and properties that can be applied to the element or by using JavaScript.
84558
85169
  *
85170
+ * - `anchor`: The element the panel opens against, where that is not the trigger: its
85171
+ * `id` in the same document or shadow root, or the element itself. Left
85172
+ * empty, the panel opens against the trigger, or against the button whose
85173
+ * command opened it.
84559
85174
  * - `arrow`: Draws a point on the panel's edge facing the trigger.
84560
85175
  *
84561
85176
  * Off by default, which is the house style: a panel that opens from its
84562
85177
  * trigger already reads as belonging to it.
85178
+ * - `container-padding`/`containerPadding`: How close to the window's edges the panel may come, in pixels, when it
85179
+ * slides, shrinks or moves to the other side to fit. Left unset, it slides
85180
+ * and shrinks to 8 pixels from an edge and moves to the other side only
85181
+ * once it would cross one.
85182
+ * - `cross-offset`/`crossOffset`: How far to slide the panel along the side it is on, in pixels: to the
85183
+ * right on the top or the bottom, and down on the left or the right.
84563
85184
  * - `fallback-label`/`fallbackLabel`: The panel's name where nothing else names it: no `label`, no heading in
84564
85185
  * the panel, and no `aria-labelledby` on the host.
85186
+ * - `flip`: Whether the panel moves to the other side of the trigger when its own
85187
+ * side has no room. On by default. Write `flip="false"` to keep it on its
85188
+ * side, where it shrinks to fit, as React Aria's `shouldFlip` turns off.
84565
85189
  * - `label`: The panel's name, read by screen readers. Left empty, the first heading in
84566
85190
  * the panel names it, and then `fallback-label`.
84567
85191
  * - `modal`: Keeps `Tab` inside the panel while it is open, marks the panel
@@ -84659,6 +85283,8 @@ export type CustomElementsSolidJs = {
84659
85283
  *
84660
85284
  * These can be used to apply styling when a component is in a given state.
84661
85285
  *
85286
+ * - `aligned-end`: While the panel is aligned to the end of the side it sits on.
85287
+ * - `aligned-start`: While the panel is aligned to the start of the side it sits on.
84662
85288
  * - `entering`: From the moment the panel shows until its entrance has finished.
84663
85289
  * - `exiting`: From the moment the panel hides until its exit has finished.
84664
85290
  * - `open`: While the popover is open.
@@ -86275,7 +86901,7 @@ export type CustomElementsSolidJs = {
86275
86901
  * | Down, Enter, Space | Opens the list on the chosen option, or the first. |
86276
86902
  * | Up | Opens the list on the chosen option, or the last. |
86277
86903
  * | Home, End | Opens the list on the first or the last option. |
86278
- * | Left, Right | Chooses the option before or after the chosen one without opening, as React Aria's Select does, in either direction of text. |
86904
+ * | Left, Right | Chooses the option before or after the chosen one without opening, as React Aria's Select does. On a right-to-left page Left chooses the one after. |
86279
86905
  * | A letter or a word | Chooses the option whose words start with what you typed, as a native `<select>` does. With `multiple`, opens the list on it. |
86280
86906
  *
86281
86907
  * In the open list, which is a `Listbox`:
@@ -88120,12 +88746,21 @@ export type CustomElementsSolidJs = {
88120
88746
  * sequence is correct in the server's markup, where the root cannot count its
88121
88747
  * slotted children.
88122
88748
  *
88749
+ * `active` names a step by its `value`. A step with no `value` is named by its
88750
+ * place, counted from 1, so a sequence written without values moves as one
88751
+ * written with them, and `helix-activate` says `1`, `2` and so on. Give every
88752
+ * step a value or none, because a value of `2` and the second place are one
88753
+ * name.
88754
+ *
88123
88755
  * `linear` keeps a reader from passing a stage they have not finished, as Ark
88124
88756
  * UI's linear steps do: a stage ahead is out of reach, and its button disabled,
88125
88757
  * until every stage before it is `complete` or `optional`. Going back is always
88126
88758
  * allowed. `next()` and `previous()` move one stage either way, under the
88127
88759
  * same rules, for your own buttons. `reset()` goes back to the first stage and
88128
- * clears every stage's `complete`, as Ark UI's `resetStep` does.
88760
+ * clears every stage's `complete`, as Ark UI's `resetStep` does. A button
88761
+ * anywhere on the page calls them with no script, as Ark UI's previous and
88762
+ * next triggers do: give it `commandfor` with the sequence's `id`, and
88763
+ * `command="--previous"`, `"--next"` or `"--reset"`.
88129
88764
  *
88130
88765
  * `completion="passed"` marks a stage `complete` once a reader moves past it,
88131
88766
  * as Ark UI counts a stage before the current one as completed. Going back
@@ -88152,18 +88787,21 @@ export type CustomElementsSolidJs = {
88152
88787
  * button is described by its `complete-label`.
88153
88788
  *
88154
88789
  * **Keyboard.** Each stage's name is a button and its own tab stop, and Enter
88155
- * or Space goes to the stage. Set `arrows` and the arrow keys move focus
88156
- * between the names as well, as Ark UI's steps do: Left and Right along a row,
88157
- * Up and Down a column, Home and End to the first and the last. The arrows
88158
- * pass over a disabled stage and one a linear sequence holds out of reach,
88159
- * and they move focus without going to the stage.
88790
+ * or Space goes to the stage. Set `arrows` and the names are one tab stop, the
88791
+ * current stage's, and the arrow keys move focus between them: Left and Right
88792
+ * along a row, Up and Down a column, Home and End to the first and the last.
88793
+ * The stop follows focus, so Tab leaves the sequence and Shift+Tab comes back
88794
+ * to the name the reader left. The arrows pass over a disabled stage and one a
88795
+ * linear sequence holds out of reach, and they move focus without going to the
88796
+ * stage.
88160
88797
  *
88161
88798
  * ## Attributes & Properties
88162
88799
  *
88163
88800
  * Component attributes and properties that can be applied to the element or by using JavaScript.
88164
88801
  *
88165
88802
  * - `arrows`: Whether the arrow keys move focus between the stages' names, along the
88166
- * way the steps run. Off by default, so the arrows keep scrolling the page.
88803
+ * way the steps run, and the names are one tab stop. Off by default, so the
88804
+ * arrows keep scrolling the page.
88167
88805
  * - `completion`: What marks a stage `complete`.
88168
88806
  *
88169
88807
  * Absent, you do: each step's `complete` is yours, because a reader who
@@ -88337,7 +88975,9 @@ export type CustomElementsSolidJs = {
88337
88975
  * - `disabled`: Whether the stage is disabled, so the user cannot go to it.
88338
88976
  * - `optional`: Whether a reader may pass the stage without finishing it, in a sequence
88339
88977
  * with `linear`. Ark UI's skippable step.
88340
- * - `value`: The value the step sends in `helix-select`.
88978
+ * - `value`: The value the step sends in `helix-select`, and what names the step in its
88979
+ * sequence's `active`. Without one, the sequence names the step by its place,
88980
+ * counted from 1.
88341
88981
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
88342
88982
  *
88343
88983
  * **Named `whenSettled` because `settled` is taken four times over**, by
@@ -90305,6 +90945,10 @@ export type CustomElementsSolidJs = {
90305
90945
  * along, so the two writes a consumer would make in sequence do not compose
90306
90946
  * into the range they asked for. The platform has this method for that reason
90307
90947
  * and so does this.
90948
+ * - `setRangeText(replacement: string, start?: number, end?: number, selectMode?: SelectionMode) => void`: Replaces a range of the text, as the native method does: the selection
90949
+ * where `start` and `end` are left out, and `selectMode` says what is
90950
+ * selected after. It sends no event, as the native method sends none.
90951
+ * - `select() => void`: Selects everything in the field.
90308
90952
  * - `focus(options?: FocusOptions) => void`: Puts the caret in the field, as a label pointing at it would.
90309
90953
  * - `requestValue(next: string) => boolean`: Requests a new value, and returns whether the change was applied.
90310
90954
  *
@@ -93804,6 +94448,12 @@ export type CustomElementsSolidJs = {
93804
94448
  * captions, and poster treatment. `Sandbox` takes its preview and `Menu` its
93805
94449
  * trigger the same way.
93806
94450
  *
94451
+ * **The player is a `Video` or a plain `<video>`.** Either takes `src` and
94452
+ * `poster` from the entry, is named by it, plays on, and answers Shift with N
94453
+ * or P while focused. A plain `<video>` has no previous and next controls
94454
+ * that send `helix-previous` or `helix-next`, so its moves are the entries,
94455
+ * the menu, and your own buttons calling `previous()` and `next()`.
94456
+ *
93807
94457
  * **Entries are markup.** React skips properties it would set imperatively
93808
94458
  * during hydration, so an array property on a custom element is missing on the
93809
94459
  * first paint of a server-rendered page. `using-the-elements.mdx` has the
@@ -93836,7 +94486,8 @@ export type CustomElementsSolidJs = {
93836
94486
  *
93837
94487
  * **The player is named by the current entry**, and the device's own media
93838
94488
  * controls show the entry as the title. A player you gave a `label` keeps
93839
- * your name, and only the title follows the entry.
94489
+ * your name, and only the title follows the entry. A plain `<video>` is
94490
+ * named through `aria-label`, unless you wrote one.
93840
94491
  *
93841
94492
  * **Keyboard.** The entries take one stop in the tab order: the entry you
93842
94493
  * last focused, or the current entry before you have focused one. Enter or
@@ -94531,6 +95182,11 @@ export type CustomElementsSolidJs = {
94531
95182
  * commas. Their rows carry `aria-disabled`, the keys and typing pass over
94532
95183
  * them, and a press, Space, or Control with A does not select them.
94533
95184
  *
95185
+ * **Rows a stylesheet can tell apart.** A chosen row carries `data-selected`,
95186
+ * a disabled one `data-disabled`, as React Aria's rows do, and the row the
95187
+ * keys are on, which holds the tab stop, `data-active`, whether or not the
95188
+ * list has focus.
95189
+ *
94534
95190
  * **Loading more.** `helix-range-change` fires as the items on screen change,
94535
95191
  * and `range` holds them. `helix-load-more` fires once a reader is within one
94536
95192
  * screen of the end, once for each length of the set: add to `items` and it can