@fusion.dev/helix-headless 0.149.1 → 0.150.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 (35) hide show
  1. package/custom-elements.json +471 -45
  2. package/dist/button/root/button-root.d.ts +5 -0
  3. package/dist/button/root/button-root.js +3 -0
  4. package/dist/color-input/root/color-input-root.d.ts +1 -0
  5. package/dist/color-picker/root/color-picker-root.js +1 -0
  6. package/dist/combobox/root/combobox-root.d.ts +12 -1
  7. package/dist/combobox/root/combobox-root.js +8 -0
  8. package/dist/copy-button/root/copy-button-root.d.ts +4 -3
  9. package/dist/copy-button/root/copy-button-root.js +5 -1
  10. package/dist/date-input/root/date-input-root.d.ts +1 -0
  11. package/dist/element-events.generated.js +1 -1
  12. package/dist/filter-input/chip/filter-chip.d.ts +2 -1
  13. package/dist/filter-input/root/filter-input-root.d.ts +5 -0
  14. package/dist/filter-input/root/filter-input-root.js +7 -0
  15. package/dist/number-input/root/number-input-root.d.ts +6 -0
  16. package/dist/number-input/root/number-input-root.js +14 -3
  17. package/dist/option/root/option-root.d.ts +17 -8
  18. package/dist/option/root/option-root.js +18 -4
  19. package/dist/radio/group/radio-group.d.ts +8 -1
  20. package/dist/radio/group/radio-group.js +15 -1
  21. package/dist/slider/root/slider-root.d.ts +8 -0
  22. package/dist/slider/root/slider-root.js +6 -3
  23. package/dist/tag/group/tag-group.d.ts +22 -1
  24. package/dist/tag/group/tag-group.js +63 -3
  25. package/dist/tag/root/tag-root.d.ts +9 -0
  26. package/dist/tag/root/tag-root.js +5 -1
  27. package/dist/time-input/root/time-input-root.d.ts +1 -0
  28. package/dist/toggle/group/toggle-group.d.ts +6 -0
  29. package/dist/toggle/group/toggle-group.js +16 -1
  30. package/dist/toggle/root/toggle-root.d.ts +21 -3
  31. package/dist/toggle/root/toggle-root.js +22 -5
  32. package/lint.json +1 -1
  33. package/package.json +5 -5
  34. package/types/jsx.d.ts +160 -58
  35. package/types/vue.d.ts +28 -16
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fusion.dev/helix-headless",
3
3
  "description": "Headless component tier. Structure, accessibility, state, and form participation. No styling.",
4
- "version": "0.149.1",
4
+ "version": "0.150.0",
5
5
  "license": "MIT",
6
6
  "author": "Ross Sheppard <ross.sheppard@fusion.dev>",
7
7
  "repository": {
@@ -49,13 +49,13 @@
49
49
  },
50
50
  "bugs": "https://github.com/project-fusion/fusion/issues",
51
51
  "dependencies": {
52
- "@fusion.dev/helix-core": "0.149.1",
53
- "@fusion.dev/helix-icons": "0.149.1",
52
+ "@fusion.dev/helix-core": "0.150.0",
53
+ "@fusion.dev/helix-icons": "0.150.0",
54
54
  "uqr": "^0.1.3"
55
55
  },
56
56
  "devDependencies": {
57
- "@fusion.dev/helix-cem": "0.149.1",
58
- "@fusion.dev/helix-testing": "0.149.1",
57
+ "@fusion.dev/helix-cem": "0.150.0",
58
+ "@fusion.dev/helix-testing": "0.150.0",
59
59
  "@fusion.dev/scripts": "0.0.0-dev",
60
60
  "@happy-dom/global-registrator": "^20.14.5",
61
61
  "@lit-labs/ssr": "^4.1.0",
package/types/jsx.d.ts CHANGED
@@ -20693,14 +20693,10 @@ between them makes a reader parse the punctuation to find where the name
20693
20693
  ends. Matching still reads the label, so what somebody types is matched
20694
20694
  against the name rather than against prose about it.
20695
20695
 
20696
- **A property and not a slot, which is the departure worth explaining.** The
20697
- area rules say a content property is its slot's fallback, and that holds for
20698
- a region always drawn: `Avatar`'s initials, `Tooltip`'s text. This one is
20699
- usually absent, and a wrapped slot generates a box whether or not it is
20700
- filled, so every option without a caption would carry an empty line. The
20701
- detection that would avoid it does not exist, `:host(:has())` being invalid
20702
- and the server having no children to inspect. A property is known at render
20703
- time, so the component can decline to draw the box at all.
20696
+ For a caption richer than a string, slot it into `description`. The
20697
+ property is that slot's fallback inside the `description` part. With no
20698
+ property the slot is drawn bare, which takes no box while it is empty, so
20699
+ an option without a caption carries no empty line.
20704
20700
 
20705
20701
  It does not reflect, per the rule that payload state stays off the host: a
20706
20702
  string is not a fact a selector needs. */
@@ -20788,6 +20784,13 @@ name is the fault `TreeItem` avoids by mirroring to `data-selected`.
20788
20784
  Splitting them means moving what every stylesheet selects on, which is a
20789
20785
  change of its own rather than a property being added. */
20790
20786
  defaultSelected?: (HelixHeadlessOption["defaultSelected"]) | undefined;
20787
+ /** Whether the option says it is selected while the keyboard is on it.
20788
+
20789
+ Written by a control whose list holds suggestions, such as `FilterInput`:
20790
+ nothing there stays chosen, so the row the keyboard is on is the
20791
+ selection, as the APG combobox's list with selection that follows focus
20792
+ says. No attribute: it is coordination between elements. */
20793
+ selectionFollowsActive?: (HelixHeadlessOption["selectionFollowsActive"]) | undefined;
20791
20794
 
20792
20795
  /** The option was chosen. Cancelable: canceling it leaves the selection as it was, and keeps the browser from following an option's `href`. */
20793
20796
  "onhelix-select"?: ((e: HelixHeadlessOptionHelixSelectElementEvent) => void) | undefined;
@@ -20850,14 +20853,10 @@ between them makes a reader parse the punctuation to find where the name
20850
20853
  ends. Matching still reads the label, so what somebody types is matched
20851
20854
  against the name rather than against prose about it.
20852
20855
 
20853
- **A property and not a slot, which is the departure worth explaining.** The
20854
- area rules say a content property is its slot's fallback, and that holds for
20855
- a region always drawn: `Avatar`'s initials, `Tooltip`'s text. This one is
20856
- usually absent, and a wrapped slot generates a box whether or not it is
20857
- filled, so every option without a caption would carry an empty line. The
20858
- detection that would avoid it does not exist, `:host(:has())` being invalid
20859
- and the server having no children to inspect. A property is known at render
20860
- time, so the component can decline to draw the box at all.
20856
+ For a caption richer than a string, slot it into `description`. The
20857
+ property is that slot's fallback inside the `description` part. With no
20858
+ property the slot is drawn bare, which takes no box while it is empty, so
20859
+ an option without a caption carries no empty line.
20861
20860
 
20862
20861
  It does not reflect, per the rule that payload state stays off the host: a
20863
20862
  string is not a fact a selector needs. */
@@ -20945,6 +20944,13 @@ name is the fault `TreeItem` avoids by mirroring to `data-selected`.
20945
20944
  Splitting them means moving what every stylesheet selects on, which is a
20946
20945
  change of its own rather than a property being added. */
20947
20946
  "prop:defaultSelected"?: (HelixHeadlessOption["defaultSelected"]) | undefined;
20947
+ /** Whether the option says it is selected while the keyboard is on it.
20948
+
20949
+ Written by a control whose list holds suggestions, such as `FilterInput`:
20950
+ nothing there stays chosen, so the row the keyboard is on is the
20951
+ selection, as the APG combobox's list with selection that follows focus
20952
+ says. No attribute: it is coordination between elements. */
20953
+ "prop:selectionFollowsActive"?: (HelixHeadlessOption["selectionFollowsActive"]) | undefined;
20948
20954
  /** The option was chosen. Cancelable: canceling it leaves the selection as it was, and keeps the browser from following an option's `href`. */
20949
20955
  "on:helix-select"?: ((e: HelixHeadlessOptionHelixSelectElementEvent) => void) | undefined;
20950
20956
 
@@ -26968,6 +26974,13 @@ Absent is the tag's own words, its category first. */
26968
26974
  value?: (HelixHeadlessTag["value"]) | undefined;
26969
26975
  /** Whether the element shows a control that dismisses it. */
26970
26976
  dismissible?: (HelixHeadlessTag["dismissible"]) | undefined;
26977
+ /** Whether the remove button is a tab stop of its own, outside a `Tag.Group`.
26978
+
26979
+ A field that holds tags as its tokens, such as a `multiple` Combobox,
26980
+ writes `false`: the field's text is its one tab stop, and the arrow keys
26981
+ move from the text to the tags. No attribute: it is coordination between
26982
+ elements, as `focusable` is. */
26983
+ dismissTabStop?: (HelixHeadlessTag["dismissTabStop"]) | undefined;
26971
26984
  /** Whether the tag holds its group's tab stop.
26972
26985
 
26973
26986
  Written by `Tag.Group` on every tag it holds, and unset outside one, which
@@ -27012,6 +27025,13 @@ Absent is the tag's own words, its category first. */
27012
27025
  "prop:value"?: (HelixHeadlessTag["value"]) | undefined;
27013
27026
  /** Whether the element shows a control that dismisses it. */
27014
27027
  "prop:dismissible"?: (HelixHeadlessTag["dismissible"]) | undefined;
27028
+ /** Whether the remove button is a tab stop of its own, outside a `Tag.Group`.
27029
+
27030
+ A field that holds tags as its tokens, such as a `multiple` Combobox,
27031
+ writes `false`: the field's text is its one tab stop, and the arrow keys
27032
+ move from the text to the tags. No attribute: it is coordination between
27033
+ elements, as `focusable` is. */
27034
+ "prop:dismissTabStop"?: (HelixHeadlessTag["dismissTabStop"]) | undefined;
27015
27035
  /** Whether the tag holds its group's tab stop.
27016
27036
 
27017
27037
  Written by `Tag.Group` on every tag it holds, and unset outside one, which
@@ -29400,8 +29420,8 @@ name is the fault `TreeItem` avoids by mirroring to `data-selected`.
29400
29420
  Splitting them means moving what every stylesheet selects on, which is a
29401
29421
  change of its own rather than a property being added. */
29402
29422
  defaultSelected?: (HelixHeadlessToggle["defaultSelected"]) | undefined;
29403
- /** Whether the item holds the group's tab stop. Unset, the chosen item holds
29404
- it.
29423
+ /** Whether the item holds the group's tab stop. Unset, no group holds the
29424
+ item, and it is a toggle button with a tab stop of its own.
29405
29425
 
29406
29426
  Written by the group on every item: `true` for the chosen item, or for the
29407
29427
  first item that can be chosen while there is no selection to carry the
@@ -29416,6 +29436,8 @@ React consumer's hydration reports and does not patch up. */
29416
29436
  Written by the group, like `selected`, so no attribute. */
29417
29437
  pressed?: (HelixHeadlessToggle["pressed"]) | undefined;
29418
29438
 
29439
+ /** Fired after a toggle button on its own is pressed or released. */
29440
+ onchange?: ((e: HelixHeadlessToggleElementEvent) => void) | undefined;
29419
29441
  /** Fired when the item is chosen. Cancelable: call `preventDefault()` to keep the current choice. */
29420
29442
  "onhelix-select"?: ((e: HelixHeadlessToggleHelixSelectElementEvent) => void) | undefined;
29421
29443
  };
@@ -29458,8 +29480,8 @@ name is the fault `TreeItem` avoids by mirroring to `data-selected`.
29458
29480
  Splitting them means moving what every stylesheet selects on, which is a
29459
29481
  change of its own rather than a property being added. */
29460
29482
  "prop:defaultSelected"?: (HelixHeadlessToggle["defaultSelected"]) | undefined;
29461
- /** Whether the item holds the group's tab stop. Unset, the chosen item holds
29462
- it.
29483
+ /** Whether the item holds the group's tab stop. Unset, no group holds the
29484
+ item, and it is a toggle button with a tab stop of its own.
29463
29485
 
29464
29486
  Written by the group on every item: `true` for the chosen item, or for the
29465
29487
  first item that can be chosen while there is no selection to carry the
@@ -29473,6 +29495,8 @@ React consumer's hydration reports and does not patch up. */
29473
29495
 
29474
29496
  Written by the group, like `selected`, so no attribute. */
29475
29497
  "prop:pressed"?: (HelixHeadlessToggle["pressed"]) | undefined;
29498
+ /** Fired after a toggle button on its own is pressed or released. */
29499
+ "on:change"?: ((e: HelixHeadlessToggleElementEvent) => void) | undefined;
29476
29500
  /** Fired when the item is chosen. Cancelable: call `preventDefault()` to keep the current choice. */
29477
29501
  "on:helix-select"?: ((e: HelixHeadlessToggleHelixSelectElementEvent) => void) | undefined;
29478
29502
 
@@ -36909,6 +36933,7 @@ export type CustomElements = {
36909
36933
  * - `end`: Content at the trailing end, before the trigger.
36910
36934
  * - `feedback`: The message that says what is wrong with the value.
36911
36935
  * - `hint`: Help text under the field.
36936
+ * - `label`: The label, for content richer than the `label` text.
36912
36937
  * - `panel-footer`: Content in the panel under the picker, such as a note or an action.
36913
36938
  * - `panel-header`: Content in the panel above the picker, such as a heading or a shortcut.
36914
36939
  * - `start`: Content at the leading end of the field, inside its border.
@@ -37455,6 +37480,9 @@ export type CustomElements = {
37455
37480
  * | Escape | Closes the list and puts the chosen words back. On a closed field, a second Escape clears a single choice. |
37456
37481
  * | Tab | Closes the list and moves on. |
37457
37482
  * | Backspace | With `multiple`, on an empty field, removes the last tag. |
37483
+ * | Left | With `multiple`, with the caret at the start of the text, moves to the last tag's remove button. Right on a right-to-left page. |
37484
+ * | Left, Right on a tag | Move between the tags, and past the last back to the text. |
37485
+ * | Delete, Backspace on a tag | Removes the tag. |
37458
37486
  * | Space, Home, End, letters | Edit the text. |
37459
37487
  *
37460
37488
  * **ARIA.** The input is the `combobox`, named by the label, with
@@ -37470,7 +37498,8 @@ export type CustomElements = {
37470
37498
  * Set `autocomplete` to let a browser's autofill choose an option.
37471
37499
  *
37472
37500
  * With `multiple`, each chosen option is a tag in the field with its own remove
37473
- * control. The panel stays open and the filter clears after each choice, so the
37501
+ * control. The text is the field's one tab stop, and the arrow keys reach the
37502
+ * tags from it. The panel stays open and the filter clears after each choice, so the
37474
37503
  * next choice starts from the whole list.
37475
37504
  *
37476
37505
  * With `creatable`, the combobox offers a create row and fires `helix-create`.
@@ -38006,8 +38035,9 @@ export type CustomElements = {
38006
38035
  * **Keyboard.** Enter and Space copy, as they press a native button.
38007
38036
  *
38008
38037
  * The button is named `label`, or the host's `aria-label`, and its name
38009
- * changes to `copied-label` or `error-label` for the moment after a press,
38010
- * which is what a screen reader on it hears. The tooltip shows the same words.
38038
+ * changes to `copied-label` or `error-label` for the moment after a press. The
38039
+ * same words are said in a live region, so a screen reader hears the result,
38040
+ * and the tooltip shows them.
38011
38041
  *
38012
38042
  * ## Attributes & Properties
38013
38043
  *
@@ -38188,7 +38218,7 @@ export type CustomElements = {
38188
38218
  * Custom selectors for styling elements within the component.
38189
38219
  *
38190
38220
  * - `button`: The inner button.
38191
- * - `live`: The live region that says `pending-label` when the button becomes pending under focus. It is rendered from the first time the button is pending.
38221
+ * - `live`: The live region that says `copied-label` or `error-label` after a press, and `pending-label` when the button becomes pending under focus. It is rendered from the first time it says anything.
38192
38222
  * - `mark`: The clipboard icon, and the confirmation icon that replaces it.
38193
38223
  * - `spinner`: The ring a pending button turns, an empty element the styled button draws over the icon. It is rendered only while the button is pending.
38194
38224
  * - `tooltip`: The tooltip bubble, forwarded from the tooltip inside the button.
@@ -38961,6 +38991,7 @@ export type CustomElements = {
38961
38991
  *
38962
38992
  * - `feedback`: The error message under the field.
38963
38993
  * - `hint`: The help text under the field.
38994
+ * - `label`: The label, for content richer than the `label` text.
38964
38995
  * - `next-icon`: The icon on the calendar's next month control.
38965
38996
  * - `panel-footer`: Content in the panel under the calendar, such as a note or an action.
38966
38997
  * - `panel-header`: Content in the panel above the calendar, such as a heading or a shortcut.
@@ -41029,7 +41060,8 @@ export type CustomElements = {
41029
41060
  *
41030
41061
  * **Keyboard.** The remove button is a tab stop of its own, and Enter or Space
41031
41062
  * on it asks to remove the filter. In a `FilterInput`, Backspace in the empty
41032
- * field asks to remove the last chip.
41063
+ * field asks to remove the last chip, the arrow keys move between the field
41064
+ * and the chips, and Delete or Backspace on a chip asks to remove it.
41033
41065
  *
41034
41066
  * The remove button is named `dismiss-label` followed by the chip's words,
41035
41067
  * such as "Remove filter Status is not open", so a row of chips says which
@@ -41560,6 +41592,9 @@ export type CustomElements = {
41560
41592
  * | Home, End | Highlights the first or the last suggestion while the panel is open. |
41561
41593
  * | Escape | Closes the panel and stops there, so a dialog around the field stays open. |
41562
41594
  * | Backspace | In an empty field, asks the last token to go. |
41595
+ * | Left | With the caret at the start of the text, moves to the last token's remove button. Right on a right-to-left page. |
41596
+ * | Left, Right on a token | Move between the tokens, and past the last back to the text. |
41597
+ * | Delete, Backspace on a token | Asks the token to go. |
41563
41598
  *
41564
41599
  * **Typed filters.** The field parses only the fields you declare. Write
41565
41600
  * `FilterField` elements, usually inside the `FilterMenu` slotted into `start`,
@@ -48375,14 +48410,10 @@ export type CustomElements = {
48375
48410
  * ends. Matching still reads the label, so what somebody types is matched
48376
48411
  * against the name rather than against prose about it.
48377
48412
  *
48378
- * **A property and not a slot, which is the departure worth explaining.** The
48379
- * area rules say a content property is its slot's fallback, and that holds for
48380
- * a region always drawn: `Avatar`'s initials, `Tooltip`'s text. This one is
48381
- * usually absent, and a wrapped slot generates a box whether or not it is
48382
- * filled, so every option without a caption would carry an empty line. The
48383
- * detection that would avoid it does not exist, `:host(:has())` being invalid
48384
- * and the server having no children to inspect. A property is known at render
48385
- * time, so the component can decline to draw the box at all.
48413
+ * For a caption richer than a string, slot it into `description`. The
48414
+ * property is that slot's fallback inside the `description` part. With no
48415
+ * property the slot is drawn bare, which takes no box while it is empty, so
48416
+ * an option without a caption carries no empty line.
48386
48417
  *
48387
48418
  * It does not reflect, per the rule that payload state stays off the host: a
48388
48419
  * string is not a fact a selector needs.
@@ -48451,6 +48482,12 @@ export type CustomElements = {
48451
48482
  * name is the fault `TreeItem` avoids by mirroring to `data-selected`.
48452
48483
  * Splitting them means moving what every stylesheet selects on, which is a
48453
48484
  * change of its own rather than a property being added. (property only)
48485
+ * - `selectionFollowsActive`: Whether the option says it is selected while the keyboard is on it.
48486
+ *
48487
+ * Written by a control whose list holds suggestions, such as `FilterInput`:
48488
+ * nothing there stays chosen, so the row the keyboard is on is the
48489
+ * selection, as the APG combobox's list with selection that follows focus
48490
+ * says. No attribute: it is coordination between elements. (property only)
48454
48491
  * - `text`: The option's text, which a listbox matches typed text against.
48455
48492
  *
48456
48493
  * Read from the rendered content rather than required as a property, because
@@ -48523,7 +48560,9 @@ export type CustomElements = {
48523
48560
  * Areas where markup can be added to the component.
48524
48561
  *
48525
48562
  * - `(default)`: The option's label.
48563
+ * - `description`: A second line under the label, for content richer than the `description` text.
48526
48564
  * - `end`: Content after the label, such as a shortcut or a count.
48565
+ * - `indicator`: An icon shown while the option is chosen, in place of the check the styled option draws.
48527
48566
  * - `start`: Content before the label, such as an icon or an avatar.
48528
48567
  *
48529
48568
  * ## Methods
@@ -48551,6 +48590,8 @@ export type CustomElements = {
48551
48590
  * These can be used to apply styling when a component is in a given state.
48552
48591
  *
48553
48592
  * - `active`: While the keyboard is on the option, which is the option `aria-activedescendant` names.
48593
+ * - `disabled`: While the option cannot be chosen.
48594
+ * - `has-indicator`: An icon is slotted into `indicator`.
48554
48595
  * - `selected`: While the option is chosen.
48555
48596
  * - `settled`: Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.
48556
48597
  */
@@ -50114,7 +50155,11 @@ export type CustomElements = {
50114
50155
  *
50115
50156
  * No attribute: it is coordination between elements, and a consumer has no
50116
50157
  * reason to set it. (property only)
50117
- * - `items`: The radios, in light-DOM order. Client only: the server has no tree. (property only) (readonly)
50158
+ * - `items`: The radios, in light-DOM order. Client only: the server has no tree.
50159
+ *
50160
+ * Descendants, as `Checkbox.Group` reads its boxes, so a radio inside a
50161
+ * layout wrapper of yours is one of the group's. A radio held by a group
50162
+ * nested inside this one is that group's. (property only) (readonly)
50118
50163
  * - `validity`: Whether the control meets its constraints, and why not. (property only) (readonly)
50119
50164
  * - `validationMessage`: The message the browser would show for the control, or an empty string. (property only) (readonly)
50120
50165
  * - `willValidate`: Whether the control is checked when its form is submitted. (property only) (readonly)
@@ -54231,7 +54276,10 @@ export type CustomElements = {
54231
54276
  * focus moves to the next tag, or the previous one after the last.
54232
54277
  *
54233
54278
  * `selection-mode` lets a reader select tags, with Space, Enter or a press:
54234
- * `single` selects one at a time and `multiple` any number. `value` holds the
54279
+ * `single` selects one at a time and `multiple` any number. In `multiple`,
54280
+ * Shift with an arrow, Home or End selects the range from the tag last
54281
+ * pressed to the tag focus moves to, and Control or Command with A selects
54282
+ * every tag that is not disabled. `value` holds the
54235
54283
  * selected tags' values, separated by commas, and a change asks with
54236
54284
  * `helix-before-change` and tells with `change`. Enter on a tag with an
54237
54285
  * `href` follows its link. A `disabled` tag is passed over. A selected tag
@@ -54246,6 +54294,8 @@ export type CustomElements = {
54246
54294
  * set is a `group`, and focus moves to its `empty` part,
54247
54295
  * which holds the `empty` slot: put words there such as "No filters" for a
54248
54296
  * reader to hear. With nothing slotted it says `empty-label`, "No tags".
54297
+ * Where only disabled tags are left, the first of them holds the tab stop and
54298
+ * takes focus, so the reader stays in the set.
54249
54299
  *
54250
54300
  * ## Attributes & Properties
54251
54301
  *
@@ -54358,6 +54408,12 @@ export type CustomElements = {
54358
54408
  *
54359
54409
  * Absent is the tag's own words, its category first.
54360
54410
  * - `dismissible`: Whether the element shows a control that dismisses it.
54411
+ * - `dismissTabStop`: Whether the remove button is a tab stop of its own, outside a `Tag.Group`.
54412
+ *
54413
+ * A field that holds tags as its tokens, such as a `multiple` Combobox,
54414
+ * writes `false`: the field's text is its one tab stop, and the arrow keys
54415
+ * move from the text to the tags. No attribute: it is coordination between
54416
+ * elements, as `focusable` is. (property only)
54361
54417
  * - `focusable`: Whether the tag holds its group's tab stop.
54362
54418
  *
54363
54419
  * Written by `Tag.Group` on every tag it holds, and unset outside one, which
@@ -54964,6 +55020,7 @@ export type CustomElements = {
54964
55020
  *
54965
55021
  * - `feedback`: The message that says what is wrong with the value.
54966
55022
  * - `hint`: Help under the field.
55023
+ * - `label`: The label, for content richer than the `label` text.
54967
55024
  * - `panel-footer`: Content in the panel under the times, such as a note or an action.
54968
55025
  * - `panel-header`: Content in the panel above the times, such as a heading or a shortcut.
54969
55026
  * - `trigger`: The icon on the field that shows a list opens.
@@ -56252,6 +56309,11 @@ export type CustomElements = {
56252
56309
  * `selection-mode="multiple"` it is a `<button>` that says whether it is
56253
56310
  * pressed with `aria-pressed`.
56254
56311
  *
56312
+ * **On its own, outside a `Toggle.Group`, it is a toggle button**, as React
56313
+ * Aria's `ToggleButton`: a `<button>` with `aria-pressed`. A press, Enter or
56314
+ * Space sends `helix-select`, which you can cancel, then flips `selected` and
56315
+ * sends `change`. Write `selected` in the markup to start it pressed.
56316
+ *
56255
56317
  * Do not use it for navigation. For navigation, use links marked with
56256
56318
  * `aria-current` and styled by the `data-navigation-item` recipe in the base
56257
56319
  * layer. The recipe has the same look, and links are not announced as choices.
@@ -56293,8 +56355,8 @@ export type CustomElements = {
56293
56355
  * name is the fault `TreeItem` avoids by mirroring to `data-selected`.
56294
56356
  * Splitting them means moving what every stylesheet selects on, which is a
56295
56357
  * change of its own rather than a property being added. (property only)
56296
- * - `focusable`: Whether the item holds the group's tab stop. Unset, the chosen item holds
56297
- * it.
56358
+ * - `focusable`: Whether the item holds the group's tab stop. Unset, no group holds the
56359
+ * item, and it is a toggle button with a tab stop of its own.
56298
56360
  *
56299
56361
  * Written by the group on every item: `true` for the chosen item, or for the
56300
56362
  * first item that can be chosen while there is no selection to carry the
@@ -56331,6 +56393,7 @@ export type CustomElements = {
56331
56393
  *
56332
56394
  * Events that will be emitted by the component.
56333
56395
  *
56396
+ * - `change`: Fired after a toggle button on its own is pressed or released.
56334
56397
  * - `helix-select`: Fired when the item is chosen. Cancelable: call `preventDefault()` to keep the current choice.
56335
56398
  *
56336
56399
  * ## Slots
@@ -56343,13 +56406,13 @@ export type CustomElements = {
56343
56406
  *
56344
56407
  * Methods that can be called to access component functionality.
56345
56408
  *
56409
+ * - `select() => boolean`: Chooses the item in its group, or, on its own, flips `selected` once
56410
+ * `helix-select` stands and sends `change`.
56346
56411
  * - `focusItem() => void`: Moves focus to the item's control, for the set's arrow keys.
56347
56412
  *
56348
56413
  * The set drives the keys and cannot reach the control itself, which is
56349
56414
  * inside this shadow root, so the intent is a method and the internals stay
56350
56415
  * the item's.
56351
- * - `select() => boolean`: Selects the item and fires `helix-select`. Returns `false` if the item is
56352
- * disabled or a listener cancels the event.
56353
56416
  *
56354
56417
  * ## CSS Parts
56355
56418
  *
@@ -63340,6 +63403,7 @@ export type CustomElementsSolidJs = {
63340
63403
  * - `end`: Content at the trailing end, before the trigger.
63341
63404
  * - `feedback`: The message that says what is wrong with the value.
63342
63405
  * - `hint`: Help text under the field.
63406
+ * - `label`: The label, for content richer than the `label` text.
63343
63407
  * - `panel-footer`: Content in the panel under the picker, such as a note or an action.
63344
63408
  * - `panel-header`: Content in the panel above the picker, such as a heading or a shortcut.
63345
63409
  * - `start`: Content at the leading end of the field, inside its border.
@@ -63888,6 +63952,9 @@ export type CustomElementsSolidJs = {
63888
63952
  * | Escape | Closes the list and puts the chosen words back. On a closed field, a second Escape clears a single choice. |
63889
63953
  * | Tab | Closes the list and moves on. |
63890
63954
  * | Backspace | With `multiple`, on an empty field, removes the last tag. |
63955
+ * | Left | With `multiple`, with the caret at the start of the text, moves to the last tag's remove button. Right on a right-to-left page. |
63956
+ * | Left, Right on a tag | Move between the tags, and past the last back to the text. |
63957
+ * | Delete, Backspace on a tag | Removes the tag. |
63891
63958
  * | Space, Home, End, letters | Edit the text. |
63892
63959
  *
63893
63960
  * **ARIA.** The input is the `combobox`, named by the label, with
@@ -63903,7 +63970,8 @@ export type CustomElementsSolidJs = {
63903
63970
  * Set `autocomplete` to let a browser's autofill choose an option.
63904
63971
  *
63905
63972
  * With `multiple`, each chosen option is a tag in the field with its own remove
63906
- * control. The panel stays open and the filter clears after each choice, so the
63973
+ * control. The text is the field's one tab stop, and the arrow keys reach the
63974
+ * tags from it. The panel stays open and the filter clears after each choice, so the
63907
63975
  * next choice starts from the whole list.
63908
63976
  *
63909
63977
  * With `creatable`, the combobox offers a create row and fires `helix-create`.
@@ -64445,8 +64513,9 @@ export type CustomElementsSolidJs = {
64445
64513
  * **Keyboard.** Enter and Space copy, as they press a native button.
64446
64514
  *
64447
64515
  * The button is named `label`, or the host's `aria-label`, and its name
64448
- * changes to `copied-label` or `error-label` for the moment after a press,
64449
- * which is what a screen reader on it hears. The tooltip shows the same words.
64516
+ * changes to `copied-label` or `error-label` for the moment after a press. The
64517
+ * same words are said in a live region, so a screen reader hears the result,
64518
+ * and the tooltip shows them.
64450
64519
  *
64451
64520
  * ## Attributes & Properties
64452
64521
  *
@@ -64627,7 +64696,7 @@ export type CustomElementsSolidJs = {
64627
64696
  * Custom selectors for styling elements within the component.
64628
64697
  *
64629
64698
  * - `button`: The inner button.
64630
- * - `live`: The live region that says `pending-label` when the button becomes pending under focus. It is rendered from the first time the button is pending.
64699
+ * - `live`: The live region that says `copied-label` or `error-label` after a press, and `pending-label` when the button becomes pending under focus. It is rendered from the first time it says anything.
64631
64700
  * - `mark`: The clipboard icon, and the confirmation icon that replaces it.
64632
64701
  * - `spinner`: The ring a pending button turns, an empty element the styled button draws over the icon. It is rendered only while the button is pending.
64633
64702
  * - `tooltip`: The tooltip bubble, forwarded from the tooltip inside the button.
@@ -65404,6 +65473,7 @@ export type CustomElementsSolidJs = {
65404
65473
  *
65405
65474
  * - `feedback`: The error message under the field.
65406
65475
  * - `hint`: The help text under the field.
65476
+ * - `label`: The label, for content richer than the `label` text.
65407
65477
  * - `next-icon`: The icon on the calendar's next month control.
65408
65478
  * - `panel-footer`: Content in the panel under the calendar, such as a note or an action.
65409
65479
  * - `panel-header`: Content in the panel above the calendar, such as a heading or a shortcut.
@@ -67498,7 +67568,8 @@ export type CustomElementsSolidJs = {
67498
67568
  *
67499
67569
  * **Keyboard.** The remove button is a tab stop of its own, and Enter or Space
67500
67570
  * on it asks to remove the filter. In a `FilterInput`, Backspace in the empty
67501
- * field asks to remove the last chip.
67571
+ * field asks to remove the last chip, the arrow keys move between the field
67572
+ * and the chips, and Delete or Backspace on a chip asks to remove it.
67502
67573
  *
67503
67574
  * The remove button is named `dismiss-label` followed by the chip's words,
67504
67575
  * such as "Remove filter Status is not open", so a row of chips says which
@@ -68033,6 +68104,9 @@ export type CustomElementsSolidJs = {
68033
68104
  * | Home, End | Highlights the first or the last suggestion while the panel is open. |
68034
68105
  * | Escape | Closes the panel and stops there, so a dialog around the field stays open. |
68035
68106
  * | Backspace | In an empty field, asks the last token to go. |
68107
+ * | Left | With the caret at the start of the text, moves to the last token's remove button. Right on a right-to-left page. |
68108
+ * | Left, Right on a token | Move between the tokens, and past the last back to the text. |
68109
+ * | Delete, Backspace on a token | Asks the token to go. |
68036
68110
  *
68037
68111
  * **Typed filters.** The field parses only the fields you declare. Write
68038
68112
  * `FilterField` elements, usually inside the `FilterMenu` slotted into `start`,
@@ -74934,14 +75008,10 @@ export type CustomElementsSolidJs = {
74934
75008
  * ends. Matching still reads the label, so what somebody types is matched
74935
75009
  * against the name rather than against prose about it.
74936
75010
  *
74937
- * **A property and not a slot, which is the departure worth explaining.** The
74938
- * area rules say a content property is its slot's fallback, and that holds for
74939
- * a region always drawn: `Avatar`'s initials, `Tooltip`'s text. This one is
74940
- * usually absent, and a wrapped slot generates a box whether or not it is
74941
- * filled, so every option without a caption would carry an empty line. The
74942
- * detection that would avoid it does not exist, `:host(:has())` being invalid
74943
- * and the server having no children to inspect. A property is known at render
74944
- * time, so the component can decline to draw the box at all.
75011
+ * For a caption richer than a string, slot it into `description`. The
75012
+ * property is that slot's fallback inside the `description` part. With no
75013
+ * property the slot is drawn bare, which takes no box while it is empty, so
75014
+ * an option without a caption carries no empty line.
74945
75015
  *
74946
75016
  * It does not reflect, per the rule that payload state stays off the host: a
74947
75017
  * string is not a fact a selector needs.
@@ -75010,6 +75080,12 @@ export type CustomElementsSolidJs = {
75010
75080
  * name is the fault `TreeItem` avoids by mirroring to `data-selected`.
75011
75081
  * Splitting them means moving what every stylesheet selects on, which is a
75012
75082
  * change of its own rather than a property being added. (property only)
75083
+ * - `selectionFollowsActive`: Whether the option says it is selected while the keyboard is on it.
75084
+ *
75085
+ * Written by a control whose list holds suggestions, such as `FilterInput`:
75086
+ * nothing there stays chosen, so the row the keyboard is on is the
75087
+ * selection, as the APG combobox's list with selection that follows focus
75088
+ * says. No attribute: it is coordination between elements. (property only)
75013
75089
  * - `text`: The option's text, which a listbox matches typed text against.
75014
75090
  *
75015
75091
  * Read from the rendered content rather than required as a property, because
@@ -75082,7 +75158,9 @@ export type CustomElementsSolidJs = {
75082
75158
  * Areas where markup can be added to the component.
75083
75159
  *
75084
75160
  * - `(default)`: The option's label.
75161
+ * - `description`: A second line under the label, for content richer than the `description` text.
75085
75162
  * - `end`: Content after the label, such as a shortcut or a count.
75163
+ * - `indicator`: An icon shown while the option is chosen, in place of the check the styled option draws.
75086
75164
  * - `start`: Content before the label, such as an icon or an avatar.
75087
75165
  *
75088
75166
  * ## Methods
@@ -75110,6 +75188,8 @@ export type CustomElementsSolidJs = {
75110
75188
  * These can be used to apply styling when a component is in a given state.
75111
75189
  *
75112
75190
  * - `active`: While the keyboard is on the option, which is the option `aria-activedescendant` names.
75191
+ * - `disabled`: While the option cannot be chosen.
75192
+ * - `has-indicator`: An icon is slotted into `indicator`.
75113
75193
  * - `selected`: While the option is chosen.
75114
75194
  * - `settled`: Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.
75115
75195
  */
@@ -76698,7 +76778,11 @@ export type CustomElementsSolidJs = {
76698
76778
  *
76699
76779
  * No attribute: it is coordination between elements, and a consumer has no
76700
76780
  * reason to set it. (property only)
76701
- * - `items`: The radios, in light-DOM order. Client only: the server has no tree. (property only) (readonly)
76781
+ * - `items`: The radios, in light-DOM order. Client only: the server has no tree.
76782
+ *
76783
+ * Descendants, as `Checkbox.Group` reads its boxes, so a radio inside a
76784
+ * layout wrapper of yours is one of the group's. A radio held by a group
76785
+ * nested inside this one is that group's. (property only) (readonly)
76702
76786
  * - `validity`: Whether the control meets its constraints, and why not. (property only) (readonly)
76703
76787
  * - `validationMessage`: The message the browser would show for the control, or an empty string. (property only) (readonly)
76704
76788
  * - `willValidate`: Whether the control is checked when its form is submitted. (property only) (readonly)
@@ -80881,7 +80965,10 @@ export type CustomElementsSolidJs = {
80881
80965
  * focus moves to the next tag, or the previous one after the last.
80882
80966
  *
80883
80967
  * `selection-mode` lets a reader select tags, with Space, Enter or a press:
80884
- * `single` selects one at a time and `multiple` any number. `value` holds the
80968
+ * `single` selects one at a time and `multiple` any number. In `multiple`,
80969
+ * Shift with an arrow, Home or End selects the range from the tag last
80970
+ * pressed to the tag focus moves to, and Control or Command with A selects
80971
+ * every tag that is not disabled. `value` holds the
80885
80972
  * selected tags' values, separated by commas, and a change asks with
80886
80973
  * `helix-before-change` and tells with `change`. Enter on a tag with an
80887
80974
  * `href` follows its link. A `disabled` tag is passed over. A selected tag
@@ -80896,6 +80983,8 @@ export type CustomElementsSolidJs = {
80896
80983
  * set is a `group`, and focus moves to its `empty` part,
80897
80984
  * which holds the `empty` slot: put words there such as "No filters" for a
80898
80985
  * reader to hear. With nothing slotted it says `empty-label`, "No tags".
80986
+ * Where only disabled tags are left, the first of them holds the tab stop and
80987
+ * takes focus, so the reader stays in the set.
80899
80988
  *
80900
80989
  * ## Attributes & Properties
80901
80990
  *
@@ -81011,6 +81100,12 @@ export type CustomElementsSolidJs = {
81011
81100
  *
81012
81101
  * Absent is the tag's own words, its category first.
81013
81102
  * - `dismissible`: Whether the element shows a control that dismisses it.
81103
+ * - `dismissTabStop`: Whether the remove button is a tab stop of its own, outside a `Tag.Group`.
81104
+ *
81105
+ * A field that holds tags as its tokens, such as a `multiple` Combobox,
81106
+ * writes `false`: the field's text is its one tab stop, and the arrow keys
81107
+ * move from the text to the tags. No attribute: it is coordination between
81108
+ * elements, as `focusable` is. (property only)
81014
81109
  * - `focusable`: Whether the tag holds its group's tab stop.
81015
81110
  *
81016
81111
  * Written by `Tag.Group` on every tag it holds, and unset outside one, which
@@ -81623,6 +81718,7 @@ export type CustomElementsSolidJs = {
81623
81718
  *
81624
81719
  * - `feedback`: The message that says what is wrong with the value.
81625
81720
  * - `hint`: Help under the field.
81721
+ * - `label`: The label, for content richer than the `label` text.
81626
81722
  * - `panel-footer`: Content in the panel under the times, such as a note or an action.
81627
81723
  * - `panel-header`: Content in the panel above the times, such as a heading or a shortcut.
81628
81724
  * - `trigger`: The icon on the field that shows a list opens.
@@ -82927,6 +83023,11 @@ export type CustomElementsSolidJs = {
82927
83023
  * `selection-mode="multiple"` it is a `<button>` that says whether it is
82928
83024
  * pressed with `aria-pressed`.
82929
83025
  *
83026
+ * **On its own, outside a `Toggle.Group`, it is a toggle button**, as React
83027
+ * Aria's `ToggleButton`: a `<button>` with `aria-pressed`. A press, Enter or
83028
+ * Space sends `helix-select`, which you can cancel, then flips `selected` and
83029
+ * sends `change`. Write `selected` in the markup to start it pressed.
83030
+ *
82930
83031
  * Do not use it for navigation. For navigation, use links marked with
82931
83032
  * `aria-current` and styled by the `data-navigation-item` recipe in the base
82932
83033
  * layer. The recipe has the same look, and links are not announced as choices.
@@ -82968,8 +83069,8 @@ export type CustomElementsSolidJs = {
82968
83069
  * name is the fault `TreeItem` avoids by mirroring to `data-selected`.
82969
83070
  * Splitting them means moving what every stylesheet selects on, which is a
82970
83071
  * change of its own rather than a property being added. (property only)
82971
- * - `focusable`: Whether the item holds the group's tab stop. Unset, the chosen item holds
82972
- * it.
83072
+ * - `focusable`: Whether the item holds the group's tab stop. Unset, no group holds the
83073
+ * item, and it is a toggle button with a tab stop of its own.
82973
83074
  *
82974
83075
  * Written by the group on every item: `true` for the chosen item, or for the
82975
83076
  * first item that can be chosen while there is no selection to carry the
@@ -83006,6 +83107,7 @@ export type CustomElementsSolidJs = {
83006
83107
  *
83007
83108
  * Events that will be emitted by the component.
83008
83109
  *
83110
+ * - `change`: Fired after a toggle button on its own is pressed or released.
83009
83111
  * - `helix-select`: Fired when the item is chosen. Cancelable: call `preventDefault()` to keep the current choice.
83010
83112
  *
83011
83113
  * ## Slots
@@ -83018,13 +83120,13 @@ export type CustomElementsSolidJs = {
83018
83120
  *
83019
83121
  * Methods that can be called to access component functionality.
83020
83122
  *
83123
+ * - `select() => boolean`: Chooses the item in its group, or, on its own, flips `selected` once
83124
+ * `helix-select` stands and sends `change`.
83021
83125
  * - `focusItem() => void`: Moves focus to the item's control, for the set's arrow keys.
83022
83126
  *
83023
83127
  * The set drives the keys and cannot reach the control itself, which is
83024
83128
  * inside this shadow root, so the intent is a method and the internals stay
83025
83129
  * the item's.
83026
- * - `select() => boolean`: Selects the item and fires `helix-select`. Returns `false` if the item is
83027
- * disabled or a listener cancels the event.
83028
83130
  *
83029
83131
  * ## CSS Parts
83030
83132
  *