@fusion.dev/helix-headless 0.172.0 → 0.174.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 (41) hide show
  1. package/custom-elements.json +912 -60
  2. package/dist/button-group/root/button-group-root.d.ts +30 -0
  3. package/dist/button-group/root/button-group-root.js +50 -4
  4. package/dist/canvas/root/canvas-root.d.ts +7 -0
  5. package/dist/canvas/root/canvas-root.js +7 -0
  6. package/dist/copy-button/root/copy-button-root.d.ts +43 -3
  7. package/dist/copy-button/root/copy-button-root.js +49 -3
  8. package/dist/element-events.generated.js +2 -0
  9. package/dist/graph/root/graph-root.d.ts +22 -0
  10. package/dist/graph/root/graph-root.js +21 -5
  11. package/dist/list/root/list-root.d.ts +6 -1
  12. package/dist/list/root/list-root.js +3 -2
  13. package/dist/outline/root/outline-root.d.ts +57 -0
  14. package/dist/outline/root/outline-root.js +98 -29
  15. package/dist/speed-dial/root/speed-dial-root.d.ts +14 -0
  16. package/dist/speed-dial/root/speed-dial-root.js +34 -2
  17. package/dist/splitter/root/splitter-root.d.ts +25 -2
  18. package/dist/splitter/root/splitter-root.js +19 -4
  19. package/dist/tag/group/tag-group.d.ts +8 -1
  20. package/dist/tag/group/tag-group.js +8 -0
  21. package/dist/tag/root/tag-root.d.ts +12 -0
  22. package/dist/tag/root/tag-root.js +12 -0
  23. package/dist/time-picker/root/time-picker-root.d.ts +14 -0
  24. package/dist/time-picker/root/time-picker-root.js +8 -1
  25. package/dist/timeline/item/timeline-item.d.ts +5 -1
  26. package/dist/timeline/item/timeline-item.js +9 -0
  27. package/dist/timeline/root/timeline-root.d.ts +23 -0
  28. package/dist/timeline/root/timeline-root.js +17 -3
  29. package/dist/tooltip/root/tooltip-root.d.ts +10 -0
  30. package/dist/tooltip/root/tooltip-root.js +14 -2
  31. package/dist/virtual-list/reorder/index.d.ts +1 -0
  32. package/dist/virtual-list/reorder/index.js +4 -0
  33. package/dist/virtual-list/reorder/virtual-list-reorder.d.ts +86 -0
  34. package/dist/virtual-list/reorder/virtual-list-reorder.js +193 -0
  35. package/dist/virtual-list/root/virtual-list-root.d.ts +49 -11
  36. package/dist/virtual-list/root/virtual-list-root.js +10 -1
  37. package/lint.json +1 -1
  38. package/package.json +5 -5
  39. package/types/jsx.d.ts +568 -18
  40. package/types/vue.d.ts +115 -11
  41. package/types/words.d.ts +14 -0
@@ -10544,7 +10544,7 @@
10544
10544
  "declarations": [
10545
10545
  {
10546
10546
  "kind": "class",
10547
- "description": "Sets `role=\"group\"` on the host through internals, and `label` names the\ngroup. Without a name, a screen reader announces the buttons as separate\ncontrols, and a development build warns once with the kind `missing-name`.\n\nThe group does not manage focus, so each button keeps its own tab stop. For\none tab stop with arrow keys between a mix of controls, the APG toolbar\npattern, use Toolbar.\n\nButtons are slotted, so they stay your own elements and keep their own\nappearance and size.\n\n**Buttons that stay pressed.** With `selection-mode`, each button with a\n`value` is a toggle button: a press presses or releases it. `multiple` lets\nany number be pressed, and each button says so with `aria-pressed`. `single`\nkeeps one pressed at a time: the group is a `radiogroup` and each button a\n`radio` that says so with `aria-checked`, as React Aria's toggle button\ngroup is. A press on the pressed one releases it, unless\n`disallow-empty-selection` keeps one pressed. `value` is the pressed values,\ncomma separated. A press sends a cancelable `helix-before-change` with the\nvalue it would leave, then `change`. A pressed Helix button has\n`:state(pressed)` on its own element.\n\nThe pressed state is written on the control inside each button's shadow\nroot, so the markup you rendered is never changed and a framework hydrating\nit sees what its server sent. That is also why only Helix buttons are\ntoggles: a native `<button>` or a button without a `value` stays a plain\naction button in the group, and a native one without its own\n`aria-pressed` warns once, with the runtime kind `untold-toggle`. The inner\ncontrol also carries\n`--button-group-pressed`, `1` or `0`, for a `::part(button)` rule of yours.\n\nUse Toggle Group instead for a choice that belongs in a form, or one where\nthe arrow keys choose as they move: it is a `radiogroup` of options with a\nform value, `required` and validation. A Button Group in a selection mode is\na set of actions that stay on, such as bold and italic, or a view that a\npress switches, and it submits nothing.\n\n**Keyboard.** In a selection mode the group is one tab stop: the button\nfocus was last on, then the first pressed one, then the first one.\n\n| Key | What it does |\n|---|---|\n| Right, Down | Moves to the next button, from the last back to the first. |\n| Left, Up | Moves to the button before, from the first round to the last. |\n| Home, End | Moves to the first or the last button. |\n| Space, Enter | Presses or releases the focused button. |\n\nLeft and Right swap on a right-to-left page, and a disabled button is\npassed over. Under `multiple` the group is a `toolbar`, with\n`aria-orientation` under `orientation=\"vertical\"`. Inside a toolbar it stays\na named `group`, and the toolbar's own arrow keys walk its buttons, so a\nreader meets one toolbar. Under `single` it is a `radiogroup` either way.",
10547
+ "description": "Sets `role=\"group\"` on the host through internals, and `label` names the\ngroup. Without a name, a screen reader announces the buttons as separate\ncontrols, and a development build warns once with the kind `missing-name`.\n\nThe group does not manage focus, so each button keeps its own tab stop. For\none tab stop with arrow keys between a mix of controls, the APG toolbar\npattern, use Toolbar.\n\nButtons are slotted, so they stay your own elements and keep their own\nappearance and size.\n\n**Buttons that stay pressed.** With `selection-mode`, each button with a\n`value` is a toggle button: a press presses or releases it. `multiple` lets\nany number be pressed, and each button says so with `aria-pressed`. `single`\nkeeps one pressed at a time: the group is a `radiogroup` and each button a\n`radio` that says so with `aria-checked`, as React Aria's toggle button\ngroup is. A press on the pressed one releases it, unless\n`disallow-empty-selection` keeps one pressed. `value` is the pressed values,\ncomma separated. A press sends a cancelable `helix-before-change` with the\nvalue it would leave, then `change`. A pressed Helix button has\n`:state(pressed)` on its own element.\n\nThe pressed state is written on the control inside each button's shadow\nroot, so the markup you rendered is never changed and a framework hydrating\nit sees what its server sent. That is also why only Helix buttons are\ntoggles: a native `<button>` or a button without a `value` stays a plain\naction button in the group, and a native one without its own\n`aria-pressed` warns once, with the runtime kind `untold-toggle`. The inner\ncontrol also carries\n`--button-group-pressed`, `1` or `0`, for a `::part(button)` rule of yours.\n\nUse Toggle Group instead for a choice that belongs in a form, or one where\nthe arrow keys choose as they move: it is a `radiogroup` of options with a\nform value, `required` and validation. A Button Group in a selection mode is\na set of actions that stay on, such as bold and italic, or a view that a\npress switches, and it submits nothing.\n\n**Keyboard.** In a selection mode the group is one tab stop: the button\nfocus was last on, then the first pressed one, then the first one.\n\n| Key | What it does |\n|---|---|\n| Right, Down | Moves to the next button, from the last back to the first. |\n| Left, Up | Moves to the button before, from the first round to the last. |\n| Home, End | Moves to the first or the last button. |\n| Space, Enter | Presses or releases the focused button. |\n\nLeft and Right swap on a right-to-left page, and a disabled button is\npassed over. Under `multiple` the group is a `toolbar`, with\n`aria-orientation` under `orientation=\"vertical\"`. Inside a toolbar it stays\na named `group`, and the toolbar's own arrow keys walk its buttons, so a\nreader meets one toolbar. Under `single` it is a `radiogroup` either way.\n\n**Disabled.** `disabled` on the group disables every button in it, Helix\nand native alike, and says so on the group with `aria-disabled`, as React\nAria's `isDisabled` does. A button disabled on its own stays disabled when\nthe group is enabled again, and a button that leaves the group gets back\nwhat it said for itself.",
10548
10548
  "name": "HelixHeadlessButtonGroup",
10549
10549
  "cssProperties": [
10550
10550
  {
@@ -10559,6 +10559,17 @@
10559
10559
  }
10560
10560
  ],
10561
10561
  "members": [
10562
+ {
10563
+ "kind": "field",
10564
+ "name": "disabled",
10565
+ "type": {
10566
+ "text": "boolean"
10567
+ },
10568
+ "default": "false",
10569
+ "description": "Disables every button in the group, and says so on the group with\n`aria-disabled`. Reflected, so a stylesheet can select on it.",
10570
+ "attribute": "disabled",
10571
+ "reflects": true
10572
+ },
10562
10573
  {
10563
10574
  "kind": "field",
10564
10575
  "name": "disallowEmptySelection",
@@ -10609,6 +10620,14 @@
10609
10620
  "description": "The values of the pressed buttons, comma separated, in a selection mode.\nA button's own `value` names it, so a value holds no comma.\n\nThe attribute is the seed, and a press changes the property, which does\nnot reflect, as a native control's `value` does not.",
10610
10621
  "attribute": "value"
10611
10622
  },
10623
+ {
10624
+ "kind": "field",
10625
+ "name": "values",
10626
+ "type": {
10627
+ "text": "string[]"
10628
+ },
10629
+ "description": "The pressed values as a list, in a selection mode, and an empty list\notherwise. Written, it presses exactly those buttons."
10630
+ },
10612
10631
  {
10613
10632
  "kind": "field",
10614
10633
  "name": "buttons",
@@ -10674,6 +10693,35 @@
10674
10693
  },
10675
10694
  "privacy": "private"
10676
10695
  },
10696
+ {
10697
+ "kind": "field",
10698
+ "name": "members",
10699
+ "type": {
10700
+ "text": "DisableableItem[]"
10701
+ },
10702
+ "privacy": "private",
10703
+ "description": "The children that can be disabled: Helix buttons and native ones alike. Empty on a server.",
10704
+ "readonly": true
10705
+ },
10706
+ {
10707
+ "kind": "field",
10708
+ "name": "held",
10709
+ "privacy": "private",
10710
+ "readonly": true,
10711
+ "default": "new Set<DisableableItem>()",
10712
+ "description": "The members this group has disabled, so one that leaves is given back its own answer."
10713
+ },
10714
+ {
10715
+ "kind": "method",
10716
+ "name": "cascade",
10717
+ "privacy": "private",
10718
+ "return": {
10719
+ "type": {
10720
+ "text": "void"
10721
+ }
10722
+ },
10723
+ "description": "Passes `disabled` down to the members, and gives a member that left\nwhat it said for itself.\n\nA member already disabled is not written to again: the watcher hears\nevery write to a native button's `disabled`, changed or not, and would\nanswer it with this."
10724
+ },
10677
10725
  {
10678
10726
  "kind": "method",
10679
10727
  "name": "sync",
@@ -11140,6 +11188,15 @@
11140
11188
  }
11141
11189
  ],
11142
11190
  "attributes": [
11191
+ {
11192
+ "name": "disabled",
11193
+ "type": {
11194
+ "text": "boolean"
11195
+ },
11196
+ "default": "false",
11197
+ "description": "Disables every button in the group, and says so on the group with\n`aria-disabled`. Reflected, so a stylesheet can select on it.",
11198
+ "fieldName": "disabled"
11199
+ },
11143
11200
  {
11144
11201
  "name": "disallow-empty-selection",
11145
11202
  "type": {
@@ -16090,6 +16147,10 @@
16090
16147
  "description": "Content above the board.",
16091
16148
  "name": "header"
16092
16149
  },
16150
+ {
16151
+ "description": "Content shown while `loading` is set, such as a progress bar while the document arrives.",
16152
+ "name": "loading"
16153
+ },
16093
16154
  {
16094
16155
  "description": "Replaces the glyph inside the pan down button.",
16095
16156
  "name": "pan-down-icon"
@@ -16331,6 +16392,17 @@
16331
16392
  "words": true
16332
16393
  }
16333
16394
  },
16395
+ {
16396
+ "kind": "field",
16397
+ "name": "loading",
16398
+ "type": {
16399
+ "text": "boolean"
16400
+ },
16401
+ "default": "false",
16402
+ "description": "Marks the board as busy while its document arrives: the board is\n`aria-busy`, and the `loading` slot is shown.",
16403
+ "attribute": "loading",
16404
+ "reflects": true
16405
+ },
16334
16406
  {
16335
16407
  "kind": "field",
16336
16408
  "name": "movedLabel",
@@ -20184,6 +20256,15 @@
20184
20256
  "description": "The text read with a card that has connections both ways. `{leadsTo}` is\n`leads-to-label` and `{comesFrom}` is `comes-from-label`, each filled in.",
20185
20257
  "fieldName": "linkedLabel"
20186
20258
  },
20259
+ {
20260
+ "name": "loading",
20261
+ "type": {
20262
+ "text": "boolean"
20263
+ },
20264
+ "default": "false",
20265
+ "description": "Marks the board as busy while its document arrives: the board is\n`aria-busy`, and the `loading` slot is shown.",
20266
+ "fieldName": "loading"
20267
+ },
20187
20268
  {
20188
20269
  "name": "moved-label",
20189
20270
  "type": {
@@ -20549,6 +20630,10 @@
20549
20630
  "description": "The user has been still for `idle-delay` milliseconds. The board's own controls stay; select on it to hide chrome of your own.",
20550
20631
  "name": "idle"
20551
20632
  },
20633
+ {
20634
+ "description": "While `loading` is set.",
20635
+ "name": "loading"
20636
+ },
20552
20637
  {
20553
20638
  "description": "While a press on the board, its cards or its connections is under way.",
20554
20639
  "name": "pressing"
@@ -44237,7 +44322,7 @@
44237
44322
  "declarations": [
44238
44323
  {
44239
44324
  "kind": "class",
44240
- "description": "Copies text to the clipboard and confirms the copy. The platform gives no\nfeedback for a clipboard write, so without a confirmation a press that copies\nlooks the same as one that fails.\n\nThe confirmation and the event wait for the write to finish. The browser can\nrefuse a clipboard write, for example on an insecure origin, in a document\nthat is not focused, or after a gesture that does not qualify. A refused\nwrite, or nothing to copy, names the button with `error-label` for the same\nmoment a copy shows `copied-label`, draws a cross, and sends\n`helix-copy-error`.\n\n`from` copies from another element on the page: its text, an attribute\nwritten `id[attribute]`, or a property written `id.property`, read at the\npress. It takes the place of `value`.\n\nIt replaces Button's render and its press, so it never submits a form or\nsends a command: `type`, `command`, `commandfor` and the `form*` overrides\nhave no effect, and the `start` and `end` slots and the `text` part are not\nrendered. An `aria-label` on the element names it before a copy, in place of\n`label`.\n\n**Keyboard.** Enter and Space copy, as they press a native button.\n\nThe button is named `label`, or the host's `aria-label`, and its name\nchanges to `copied-label` or `error-label` for the moment after a press. The\nsame words are said in a live region, so a screen reader hears the result,\nand the tooltip shows them.",
44325
+ "description": "Copies text to the clipboard and confirms the copy. The platform gives no\nfeedback for a clipboard write, so without a confirmation a press that copies\nlooks the same as one that fails.\n\nThe confirmation and the event wait for the write to finish. The browser can\nrefuse a clipboard write, for example on an insecure origin, in a document\nthat is not focused, or after a gesture that does not qualify. A refused\nwrite, or nothing to copy, names the button with `error-label` for the same\nmoment a copy shows `copied-label`, draws a cross, and sends\n`helix-copy-error`.\n\n`from` copies from another element on the page: its text, an attribute\nwritten `id[attribute]`, or a property written `id.property`, read at the\npress. It takes the place of `value`.\n\nIt replaces Button's render and its press, so it never submits a form or\nsends a command: `type`, `command`, `commandfor` and the `form*` overrides\nhave no effect, and the `start` and `end` slots and the `text` part are not\nrendered. An `aria-label` on the element names it before a copy, in place of\n`label`.\n\n**Keyboard.** Enter and Space copy, as they press a native button.\n\nThe button is named `label`, or the host's `aria-label`, and its name\nchanges to `copied-label` or `error-label` for the moment after a press. The\nsame words are said in a live region, so a screen reader hears the result,\nand the tooltip shows them. The tooltip does not also describe the button,\nsince its words are the button's name.\n\n**The tooltip.** It shows the name on hover and focus and the result after a\npress. `tooltip=\"copy\"` shows it only for the result, and `tooltip=\"none\"`\ndraws none, as Web Awesome's copy button offers. `tooltip-placement` is the\nside it prefers, and it moves to another side where that one does not fit.\n\n**Words on the button.** `show-label` draws the name beside the icon, and\nthe result in its place after a press. The button is as wide as the longest\nof the three, so a press does not resize it.",
44241
44326
  "name": "HelixHeadlessCopyButton",
44242
44327
  "cssParts": [
44243
44328
  {
@@ -44268,6 +44353,14 @@
44268
44353
  "module": "src/button/root/button-root.ts"
44269
44354
  }
44270
44355
  },
44356
+ {
44357
+ "description": "The words beside the icon, under `show-label`. It holds all three, `label`, `copied-label` and `error-label`, with all but the current one hidden.",
44358
+ "name": "text",
44359
+ "inheritedFrom": {
44360
+ "name": "HelixHeadlessButton",
44361
+ "module": "src/button/root/button-root.ts"
44362
+ }
44363
+ },
44271
44364
  {
44272
44365
  "description": "The tooltip bubble, forwarded from the tooltip inside the button.",
44273
44366
  "name": "tooltip"
@@ -44405,6 +44498,36 @@
44405
44498
  "module": "src/button/root/button-root.ts"
44406
44499
  }
44407
44500
  },
44501
+ {
44502
+ "kind": "field",
44503
+ "name": "showLabel",
44504
+ "type": {
44505
+ "text": "boolean"
44506
+ },
44507
+ "default": "false",
44508
+ "description": "Draws the name as words beside the icon, and the result in their place\nafter a press. The button stays as wide as the longest of them.",
44509
+ "attribute": "show-label",
44510
+ "reflects": true
44511
+ },
44512
+ {
44513
+ "kind": "field",
44514
+ "name": "tooltip",
44515
+ "type": {
44516
+ "text": "'copy' | 'full' | 'none' | undefined"
44517
+ },
44518
+ "description": "When the tooltip shows: `full` on hover and focus and after a press,\n`copy` only after a press, to show the result, and `none` never, for a\nbutton whose result shows another way, such as under `show-label`.\n\nUnset is `full`, and the attribute stays absent until you write it.",
44519
+ "attribute": "tooltip"
44520
+ },
44521
+ {
44522
+ "kind": "field",
44523
+ "name": "tooltipPlacement",
44524
+ "type": {
44525
+ "text": "'bottom' | 'bottom-end' | 'bottom-start' | 'left' | 'left-end' | 'left-start' | 'right' | 'right-end' | 'right-start' | 'top' | 'top-end' | 'top-start'"
44526
+ },
44527
+ "default": "'top'",
44528
+ "description": "The side the tooltip prefers. It moves to another side where this one\ndoes not fit.",
44529
+ "attribute": "tooltip-placement"
44530
+ },
44408
44531
  {
44409
44532
  "kind": "field",
44410
44533
  "name": "value",
@@ -44429,6 +44552,16 @@
44429
44552
  "description": "The words for the state it is in, used twice on purpose.\n\nThe tooltip is the visible confirmation and the accessible name is the\nspoken one, and they have to be the same words. A tooltip that changes to\nCopied while the accessible name stays Copy tells a sighted reader it\nworked and leaves a screen reader user pressing a button that never\nacknowledges anything. Changing the name of the focused element is what\nmakes the announcement happen at all.",
44430
44553
  "readonly": true
44431
44554
  },
44555
+ {
44556
+ "kind": "field",
44557
+ "name": "showedResult",
44558
+ "type": {
44559
+ "text": "boolean"
44560
+ },
44561
+ "privacy": "private",
44562
+ "default": "false",
44563
+ "description": "Whether the last render showed a result, so `tooltip=\"copy\"` opens and closes on the change."
44564
+ },
44432
44565
  {
44433
44566
  "kind": "field",
44434
44567
  "name": "clipboard",
@@ -44524,6 +44657,17 @@
44524
44657
  },
44525
44658
  "description": "The mark for a press that put nothing on the clipboard, behind a seam of its own."
44526
44659
  },
44660
+ {
44661
+ "kind": "method",
44662
+ "name": "renderText",
44663
+ "privacy": "protected",
44664
+ "return": {
44665
+ "type": {
44666
+ "text": "TemplateResult | typeof nothing"
44667
+ }
44668
+ },
44669
+ "description": "The words beside the icon, under `show-label`, behind a seam of its own.\n\nAll three are drawn and only the current one shows, so the button is as\nwide as the longest of them and a press does not resize it. Hidden from a\nscreen reader, which hears the same words as the button's name."
44670
+ },
44527
44671
  {
44528
44672
  "kind": "method",
44529
44673
  "name": "renderTooltip",
@@ -45773,6 +45917,32 @@
45773
45917
  "module": "src/button/root/button-root.ts"
45774
45918
  }
45775
45919
  },
45920
+ {
45921
+ "name": "show-label",
45922
+ "type": {
45923
+ "text": "boolean"
45924
+ },
45925
+ "default": "false",
45926
+ "description": "Draws the name as words beside the icon, and the result in their place\nafter a press. The button stays as wide as the longest of them.",
45927
+ "fieldName": "showLabel"
45928
+ },
45929
+ {
45930
+ "name": "tooltip",
45931
+ "type": {
45932
+ "text": "'copy' | 'full' | 'none' | undefined"
45933
+ },
45934
+ "description": "When the tooltip shows: `full` on hover and focus and after a press,\n`copy` only after a press, to show the result, and `none` never, for a\nbutton whose result shows another way, such as under `show-label`.\n\nUnset is `full`, and the attribute stays absent until you write it.",
45935
+ "fieldName": "tooltip"
45936
+ },
45937
+ {
45938
+ "name": "tooltip-placement",
45939
+ "type": {
45940
+ "text": "'bottom' | 'bottom-end' | 'bottom-start' | 'left' | 'left-end' | 'left-start' | 'right' | 'right-end' | 'right-start' | 'top' | 'top-end' | 'top-start'"
45941
+ },
45942
+ "default": "'top'",
45943
+ "description": "The side the tooltip prefers. It moves to another side where this one\ndoes not fit.",
45944
+ "fieldName": "tooltipPlacement"
45945
+ },
45776
45946
  {
45777
45947
  "name": "value",
45778
45948
  "type": {
@@ -74927,6 +75097,10 @@
74927
75097
  "description": "What screen readers hear: how many notes there are when a search or the legend changes it, and which way the drawing went after a key or a control moved it.",
74928
75098
  "name": "live"
74929
75099
  },
75100
+ {
75101
+ "description": "The box in place of the list while `loading` is set and it holds no notes, holding the `loading` slot.",
75102
+ "name": "loading"
75103
+ },
74930
75104
  {
74931
75105
  "description": "One note in the list.",
74932
75106
  "name": "note"
@@ -75029,6 +75203,10 @@
75029
75203
  "description": "Content above the graph.",
75030
75204
  "name": "header"
75031
75205
  },
75206
+ {
75207
+ "description": "What the panel shows while `loading` is set and the list holds no notes. Defaults to `loading-label`.",
75208
+ "name": "loading"
75209
+ },
75032
75210
  {
75033
75211
  "description": "Replaces the glyph inside the pan down button.",
75034
75212
  "name": "pan-down-icon"
@@ -75241,6 +75419,30 @@
75241
75419
  "words": true
75242
75420
  }
75243
75421
  },
75422
+ {
75423
+ "kind": "field",
75424
+ "name": "loading",
75425
+ "type": {
75426
+ "text": "boolean"
75427
+ },
75428
+ "default": "false",
75429
+ "description": "Marks the graph as busy while its notes arrive: the list is `aria-busy`,\nand the panel says so where it holds no notes yet.",
75430
+ "attribute": "loading",
75431
+ "reflects": true
75432
+ },
75433
+ {
75434
+ "kind": "field",
75435
+ "name": "loadingLabel",
75436
+ "type": {
75437
+ "text": "string"
75438
+ },
75439
+ "default": "'Loading notes'",
75440
+ "description": "What the panel says while `loading` is set and the list holds no notes.",
75441
+ "attribute": "loading-label",
75442
+ "helix": {
75443
+ "words": true
75444
+ }
75445
+ },
75244
75446
  {
75245
75447
  "kind": "field",
75246
75448
  "name": "movedDownLabel",
@@ -75313,6 +75515,14 @@
75313
75515
  "attribute": "no-panel",
75314
75516
  "reflects": true
75315
75517
  },
75518
+ {
75519
+ "kind": "field",
75520
+ "name": "noteContent",
75521
+ "type": {
75522
+ "text": "((node: GraphNode) => unknown) | undefined | undefined"
75523
+ },
75524
+ "description": "What each note's row in the list shows in place of its name: a function\ngiven the note that returns text, an element or a Lit template.\n\nFor an icon by its kind, or a date under its name, as React Aria's\n`ListBoxItem` takes children. The row is still named by the note's name,\nwhich typeahead and the search find it by, and described by how it stands\nto the selected note. Return the name with your content where it should\nstill show. A property only, there being no way to write a function in\nmarkup."
75525
+ },
75316
75526
  {
75317
75527
  "kind": "field",
75318
75528
  "name": "notesLabel",
@@ -77333,6 +77543,24 @@
77333
77543
  "description": "How a note that links to the selected one is described, with `{note}`.",
77334
77544
  "fieldName": "linksToLabel"
77335
77545
  },
77546
+ {
77547
+ "name": "loading",
77548
+ "type": {
77549
+ "text": "boolean"
77550
+ },
77551
+ "default": "false",
77552
+ "description": "Marks the graph as busy while its notes arrive: the list is `aria-busy`,\nand the panel says so where it holds no notes yet.",
77553
+ "fieldName": "loading"
77554
+ },
77555
+ {
77556
+ "name": "loading-label",
77557
+ "type": {
77558
+ "text": "string"
77559
+ },
77560
+ "default": "'Loading notes'",
77561
+ "description": "What the panel says while `loading` is set and the list holds no notes.",
77562
+ "fieldName": "loadingLabel"
77563
+ },
77336
77564
  {
77337
77565
  "name": "moved-down-label",
77338
77566
  "type": {
@@ -77651,6 +77879,10 @@
77651
77879
  "description": "The user has been still long enough for the header and footer to fade.",
77652
77880
  "name": "idle"
77653
77881
  },
77882
+ {
77883
+ "description": "While `loading` is set.",
77884
+ "name": "loading"
77885
+ },
77654
77886
  {
77655
77887
  "description": "The drawing shows the selected note's local graph, with `depth`.",
77656
77888
  "name": "local"
@@ -93470,7 +93702,7 @@
93470
93702
  "text": "string"
93471
93703
  },
93472
93704
  "default": "''",
93473
- "description": "The selected rows' values, separated by commas with no spaces, such as `a,c`, in a list that selects.\n\nSet it to start with rows selected. A row's value is its `value`, or its\nwords where it has none.",
93705
+ "description": "The selected rows' values, separated by commas with no spaces, such as `a,c`, in a list that selects.\n\nA press or a key writes it in row order, as Data Table does, whatever\norder the rows were chosen in. Set it to start with rows selected. A row's value is its `value`, or its\nwords where it has none.",
93474
93706
  "attribute": "value"
93475
93707
  },
93476
93708
  {
@@ -93746,7 +93978,7 @@
93746
93978
  }
93747
93979
  }
93748
93980
  ],
93749
- "description": "Selects what a press or a key leaves, asking first. `helix-before-change`\ncarries the `value` it would leave, and `change` follows once it has moved."
93981
+ "description": "Selects what a press or a key leaves, asking first. `helix-before-change`\ncarries the `value` it would leave, and `change` follows once it has moved.\n\nIn row order, as Data Table and Table write theirs, whatever order the\nrows were chosen in: a press on the fourth row and then the first is\n`a,d`."
93750
93982
  },
93751
93983
  {
93752
93984
  "kind": "method",
@@ -94596,7 +94828,7 @@
94596
94828
  "text": "string"
94597
94829
  },
94598
94830
  "default": "''",
94599
- "description": "The selected rows' values, separated by commas with no spaces, such as `a,c`, in a list that selects.\n\nSet it to start with rows selected. A row's value is its `value`, or its\nwords where it has none.",
94831
+ "description": "The selected rows' values, separated by commas with no spaces, such as `a,c`, in a list that selects.\n\nA press or a key writes it in row order, as Data Table does, whatever\norder the rows were chosen in. Set it to start with rows selected. A row's value is its `value`, or its\nwords where it has none.",
94600
94832
  "fieldName": "value"
94601
94833
  }
94602
94834
  ],
@@ -123869,7 +124101,7 @@
123869
124101
  "declarations": [
123870
124102
  {
123871
124103
  "kind": "class",
123872
- "description": "Outline is a table of contents for a document. `Navigation` does the same job\nfor a site.\n\nThe links are your own anchors. A router renders its own `<a>` and cannot\nrender one inside the outline's shadow root, and the hrefs are fragments on\nthe same page.\n\nWrite the anchors flat, with `data-level` for their depth, or nested in\nlists, `<ul><li><a>`. A screen reader hears the levels either way: the\noutline puts a flat run into lists inside list items of its own, nested by\n`data-level`, and leaves the links where they are. A link without\n`data-level` is at the top level.\n\nA heading slotted into `heading` names the navigation, in place of `label`.\n\nIn a contents rail with a scrollbar of its own, `follow` keeps the link of\nthe section in view showing as the reader scrolls the page.\n\n**Keyboard.** The links are your anchors, in the tab order as you wrote\nthem, so the outline adds no keys of its own: Tab moves through the links\nand Enter follows one. Following a link moves focus to its section, so the\nnext Tab goes on from the heading, also with `behavior` set.\n\n**What a screen reader hears.** A navigation landmark named by `label`, \"On\nthis page\", or by the slotted heading. The links are lists, nested by level,\nso a reader hears how many links a level holds and where each one is. The\nlink to the section in view carries `aria-current=\"location\"`, read as\n\"current location\", and it moves as the page scrolls without announcing,\nwhich would interrupt the reading it follows.\n\nThe current section is decided by the headings' positions. An\n`IntersectionObserver` with a band near the top fails both ways: when\nheadings are far apart, none is in the band and no section is marked, and\nwhen they are close together, several are in the band at once.",
124104
+ "description": "Outline is a table of contents for a document. `Navigation` does the same job\nfor a site.\n\nThe links are your own anchors. A router renders its own `<a>` and cannot\nrender one inside the outline's shadow root, and the hrefs are fragments on\nthe same page.\n\nWrite the anchors flat, with `data-level` for their depth, or nested in\nlists, `<ul><li><a>`. A screen reader hears the levels either way: the\noutline puts a flat run into lists inside list items of its own, nested by\n`data-level`, and leaves the links where they are. A link without\n`data-level` is at the top level.\n\nA heading slotted into `heading` names the navigation, in place of `label`.\n\nIn a contents rail with a scrollbar of its own, `follow` keeps the link of\nthe section in view showing as the reader scrolls the page.\n\n**Keyboard.** The links are your anchors, in the tab order as you wrote\nthem, so the outline adds no keys of its own: Tab moves through the links\nand Enter follows one. Following a link moves focus to its section, so the\nnext Tab goes on from the heading, also with `behavior` set.\n\n**What a screen reader hears.** A navigation landmark named by `label`, \"On\nthis page\", or by the slotted heading. The links are lists, nested by level,\nso a reader hears how many links a level holds and where each one is. The\nlink to the section in view carries `aria-current=\"location\"`, read as\n\"current location\", and it moves as the page scrolls without announcing,\nwhich would interrupt the reading it follows.\n\nThe current section is decided by the headings' positions. An\n`IntersectionObserver` with a band near the top fails both ways: when\nheadings are far apart, none is in the band and no section is marked, and\nwhen they are close together, several are in the band at once.\n\n**Several sections at once.** `marks=\"visible\"` marks the link of every\nsection with part of it on screen, from the reading line to the bottom of\nwhat the sections scroll in, as Zag's table of contents marks its active\nids. The mark then runs from the first of those links to the last, and\n`marked` lists their ids in page order.\n\n**Going to a section from code.** `scrollToSection(id)` scrolls to the\nsection as a press on its link does, with `behavior`, and marks its link at\nonce.\n\n**Styling a link by its state.** Each link the outline finds carries\n`data-depth`, its depth in the outline from `1`, nested lists and\n`data-level` alike, and `aria-current=\"location\"` while its section is\nmarked, so `a[aria-current]` and `a[data-depth=\"2\"]` are the hooks for a\nrule of yours.",
123873
124105
  "name": "HelixHeadlessOutline",
123874
124106
  "cssParts": [
123875
124107
  {
@@ -123925,7 +124157,7 @@
123925
124157
  "name": "indicator",
123926
124158
  "privacy": "private",
123927
124159
  "readonly": true,
123928
- "default": "new IndicatorController(this, { active: () => this.links.find((link) => link.hasAttribute('aria-current')), indicator: () => this.partNamed('indicator'), surface: () => this.partNamed('nav'), })"
124160
+ "default": "new IndicatorController(this, { active: () => this.links.find((link) => link.hasAttribute('aria-current')), indicator: () => this.partNamed('indicator'), surface: () => this.partNamed('nav'), through: () => this.links.findLast((link) => link.hasAttribute('aria-current')), })"
123929
124161
  },
123930
124162
  {
123931
124163
  "kind": "field",
@@ -123960,6 +124192,16 @@
123960
124192
  "words": true
123961
124193
  }
123962
124194
  },
124195
+ {
124196
+ "kind": "field",
124197
+ "name": "marks",
124198
+ "type": {
124199
+ "text": "'reading' | 'visible'"
124200
+ },
124201
+ "default": "'reading'",
124202
+ "description": "Which links are marked. `reading` marks the one section being read, the\nlast whose heading has passed the reading line. `visible` marks every\nsection with part of it on screen, and the mark runs across their links.",
124203
+ "attribute": "marks"
124204
+ },
123963
124205
  {
123964
124206
  "kind": "field",
123965
124207
  "name": "offset",
@@ -123979,6 +124221,25 @@
123979
124221
  "description": "The id of the section in view, or empty before anything is measured.\n\nRead-only, and a getter rather than a property for that reason: it is\nderived from where the page is scrolled to, so a consumer setting it would\nbe overwritten by the next thing that crossed the reading line. Every other\nwritable property in this library that a component also writes is state a\nconsumer can own; this one cannot be, and saying so with the type is better\nthan saying it in a sentence nobody reads.",
123980
124222
  "readonly": true
123981
124223
  },
124224
+ {
124225
+ "kind": "field",
124226
+ "name": "marked",
124227
+ "type": {
124228
+ "text": "string[]"
124229
+ },
124230
+ "description": "The ids of the sections whose links are marked, in page order: the one\n`current` names, or under `marks=\"visible\"` every section on screen.\nRead-only, for the reason `current` gives.",
124231
+ "readonly": true
124232
+ },
124233
+ {
124234
+ "kind": "field",
124235
+ "name": "markedIds",
124236
+ "type": {
124237
+ "text": "string[]"
124238
+ },
124239
+ "privacy": "private",
124240
+ "default": "[]",
124241
+ "description": "What `marked` reports, which only `markTo` writes."
124242
+ },
123982
124243
  {
123983
124244
  "kind": "field",
123984
124245
  "name": "reading",
@@ -124057,6 +124318,37 @@
124057
124318
  },
124058
124319
  "description": "Works out which section is being read, and marks its link.\n\nPositional rather than a reading of what intersects, for the reason above.\nThe comparison is against `offset` and not zero, so the reading line is\nwherever the page says the top of the readable area is."
124059
124320
  },
124321
+ {
124322
+ "kind": "method",
124323
+ "name": "onScreen",
124324
+ "privacy": "private",
124325
+ "return": {
124326
+ "type": {
124327
+ "text": "{ link: HTMLAnchorElement; target: Element }[]"
124328
+ }
124329
+ },
124330
+ "parameters": [
124331
+ {
124332
+ "name": "sections",
124333
+ "type": {
124334
+ "text": "{ link: HTMLAnchorElement; target: Element }[]"
124335
+ }
124336
+ },
124337
+ {
124338
+ "name": "origin",
124339
+ "type": {
124340
+ "text": "number"
124341
+ }
124342
+ },
124343
+ {
124344
+ "name": "scroller",
124345
+ "type": {
124346
+ "text": "Element"
124347
+ }
124348
+ }
124349
+ ],
124350
+ "description": "The sections with part of them on screen, under `marks=\"visible\"`: each\nruns from its own target to the next one's, and the last to the end of the\npage."
124351
+ },
124060
124352
  {
124061
124353
  "kind": "method",
124062
124354
  "name": "markTo",
@@ -124068,9 +124360,9 @@
124068
124360
  },
124069
124361
  "parameters": [
124070
124362
  {
124071
- "name": "active",
124363
+ "name": "marked",
124072
124364
  "type": {
124073
- "text": "{ link: HTMLAnchorElement; target: Element } | undefined"
124365
+ "text": "{ link: HTMLAnchorElement; target: Element }[]"
124074
124366
  }
124075
124367
  }
124076
124368
  ],
@@ -124187,6 +124479,52 @@
124187
124479
  "readonly": true,
124188
124480
  "description": "Takes a link's click, but only where `auto` would not have done the job.\n\nLeft the platform's wherever it can be: a modified click is a new tab or a\ndownload and none of this applies, a click something else has already\nhandled is not ours, and `auto` is the whole point of `auto`."
124189
124481
  },
124482
+ {
124483
+ "kind": "method",
124484
+ "name": "scrollToSection",
124485
+ "return": {
124486
+ "type": {
124487
+ "text": "boolean"
124488
+ }
124489
+ },
124490
+ "parameters": [
124491
+ {
124492
+ "name": "id",
124493
+ "type": {
124494
+ "text": "string"
124495
+ }
124496
+ }
124497
+ ],
124498
+ "description": "Scrolls to the section with this id, as a press on its link does, with\n`behavior`, and marks its link at once. The address and focus stay where\nthey are. Returns whether the outline has a link to that section.",
124499
+ "type": {
124500
+ "text": "scrollToSection(id: string) => boolean"
124501
+ }
124502
+ },
124503
+ {
124504
+ "kind": "method",
124505
+ "name": "travel",
124506
+ "privacy": "private",
124507
+ "return": {
124508
+ "type": {
124509
+ "text": "boolean"
124510
+ }
124511
+ },
124512
+ "parameters": [
124513
+ {
124514
+ "name": "section",
124515
+ "type": {
124516
+ "text": "{ link: HTMLAnchorElement; target: Element }"
124517
+ }
124518
+ },
124519
+ {
124520
+ "name": "scroll",
124521
+ "type": {
124522
+ "text": "boolean"
124523
+ }
124524
+ }
124525
+ ],
124526
+ "description": "Marks the section a reader asked for, and holds the mark there until the\npage stops moving. Scrolls to it where `scroll` says this element does\nthe scrolling, and returns whether it did."
124527
+ },
124190
124528
  {
124191
124529
  "kind": "method",
124192
124530
  "name": "watch",
@@ -124205,6 +124543,17 @@
124205
124543
  "readonly": true,
124206
124544
  "description": "The set changed: watch it, and measure it.\n\nBoth, for the reason the tab strip records: the host renders before its\nlinks have anything to point at, so the first measurement finds nothing,\nand without a second one at `slotchange` the mark stays unplaced for the\nlife of the page."
124207
124545
  },
124546
+ {
124547
+ "kind": "method",
124548
+ "name": "writeDepths",
124549
+ "privacy": "private",
124550
+ "return": {
124551
+ "type": {
124552
+ "text": "void"
124553
+ }
124554
+ },
124555
+ "description": "Writes each link's depth in the outline, from 1, as `data-depth`: the\nlist items around it inside the outline, or for a flat run, its place in\nthe lists `data-level` makes of it.\n\nOn the consumer's links, as `aria-current` is, and only after the first\nrender, where a framework has hydrated them."
124556
+ },
124208
124557
  {
124209
124558
  "kind": "method",
124210
124559
  "name": "unland",
@@ -124641,6 +124990,15 @@
124641
124990
  "description": "The navigation's name, read by screen readers. A heading in the `heading`\nslot names it in place of this.",
124642
124991
  "fieldName": "label"
124643
124992
  },
124993
+ {
124994
+ "name": "marks",
124995
+ "type": {
124996
+ "text": "'reading' | 'visible'"
124997
+ },
124998
+ "default": "'reading'",
124999
+ "description": "Which links are marked. `reading` marks the one section being read, the\nlast whose heading has passed the reading line. `visible` marks every\nsection with part of it on screen, and the mark runs across their links.",
125000
+ "fieldName": "marks"
125001
+ },
124644
125002
  {
124645
125003
  "name": "offset",
124646
125004
  "type": {
@@ -149943,7 +150301,44 @@
149943
150301
  "text": "void"
149944
150302
  }
149945
150303
  },
149946
- "description": "Tells a slotted trigger what it is doing, since it cannot know.\n\nThe fallback button is rendered by this element and says so in its own\ntemplate. A trigger the consumer slotted is their markup, and the state it\nneeds to announce is state only this element holds: without this, the\narrangement this component recommends, an icon button slotted as the\ntrigger, is a control that opens a menu and never says it has one. A\nconsumer who has to mirror `open` back onto their own trigger is a consumer\nwho will forget, and the failure is silent to everyone who can see the\nscreen.\n\n**Never `setAttribute`.** Writing `aria-expanded` onto the consumer's\nelement is a hydration mismatch React reports and does not patch up,\nmeasured against React 19.2.8. `tellDisclosure` carries the argument and the\nmeasurement: the state travels as a property, into the trigger's own shadow\nroot, where React neither looks nor compares.\n\n`aria-haspopup` goes with it rather than being written separately. An\nattribute the consumer's server never sent is a mismatch whether or not it\nmoves afterwards, measured in both load orders, and a trigger that says it\nis expanded is already saying it has something to expand."
150304
+ "description": "Tells a slotted trigger what it is doing, since it cannot know.\n\nThe fallback button is rendered by this element and says so in its own\ntemplate. A trigger the consumer slotted is their markup, and the state it\nneeds to announce is state only this element holds: without this, the\narrangement this component recommends, an icon button slotted as the\ntrigger, is a control that opens a menu and never says it has one. A\nconsumer who has to mirror `open` back onto their own trigger is a consumer\nwho will forget, and the failure is silent to everyone who can see the\nscreen.\n\n**Never `setAttribute`.** Writing `aria-expanded` onto the consumer's\nelement is a hydration mismatch React reports and does not patch up,\nmeasured against React 19.2.8. `tellDisclosure` carries the argument and the\nmeasurement: the state travels as a property, into the trigger's own shadow\nroot, where React neither looks nor compares.\n\n`aria-haspopup` goes with it rather than being written separately. An\nattribute the consumer's server never sent is a mismatch whether or not it\nmoves afterwards, measured in both load orders, and a trigger that says it\nis expanded is already saying it has something to expand.\n\n**A plain trigger once a reader has reached it.** A `<button>` of yours has\nno shadow root, so it takes `aria-haspopup=\"menu\"` and `aria-expanded` as\nattributes, written only once focus or a pointer has reached it. That is\nafter hydration, which is the only time React compares them. A trigger\nthat carries either attribute itself is yours to keep up to date."
150305
+ },
150306
+ {
150307
+ "kind": "field",
150308
+ "name": "toldPlain",
150309
+ "type": {
150310
+ "text": "Element | undefined"
150311
+ },
150312
+ "privacy": "private",
150313
+ "description": "The plain trigger this dial has written its state on, so it can be taken back."
150314
+ },
150315
+ {
150316
+ "kind": "field",
150317
+ "name": "reached",
150318
+ "type": {
150319
+ "text": "boolean"
150320
+ },
150321
+ "privacy": "private",
150322
+ "default": "false",
150323
+ "description": "Whether a reader has reached the trigger, by focus or a pointer, which is after hydration."
150324
+ },
150325
+ {
150326
+ "kind": "method",
150327
+ "name": "untellPlain",
150328
+ "privacy": "private",
150329
+ "return": {
150330
+ "type": {
150331
+ "text": "void"
150332
+ }
150333
+ },
150334
+ "description": "Takes the state off a plain trigger that is no longer this dial's."
150335
+ },
150336
+ {
150337
+ "kind": "field",
150338
+ "name": "handleReach",
150339
+ "privacy": "private",
150340
+ "readonly": true,
150341
+ "description": "A reader reaching the trigger, which lets a plain one be told its state."
149947
150342
  },
149948
150343
  {
149949
150344
  "kind": "field",
@@ -150653,7 +151048,7 @@
150653
151048
  "declarations": [
150654
151049
  {
150655
151050
  "kind": "class",
150656
- "description": "A splitter has one axis. Nest splitters to get two axes and three-pane or\nfour-pane layouts.\n\nWhen a splitter is slotted into a pane of another at a right angle, a corner\nhandle appears where the dividers cross. It shows the `move` cursor, responds\nto both arrow axes, and a drag moves both dividers at once. The corner is\nadded at `firstUpdated` and is not in the server markup. Before it appears,\nboth dividers work on their own.\n\nThe divider has `role=\"separator\"` and `aria-valuenow`, with\n`aria-valuetext` saying the start pane's share as a percentage in the\nnearest `lang`, or in the reader's locale where no `lang` is set, and `aria-controls` names the start pane. Drag it with a pointer or move it with the arrow keys,\npress `Home` or `End` to move it to its bounds, and press `Enter` to collapse\nthe start pane and open it again. A drag in progress is tracked as a state, so both dividers a\ncorner moves stay lit for as long as they move.\n\nBy default, `min` and `max` let the divider reach either edge, so you can\ndrag a pane fully closed. Set them to limit the range.\n\nA pane can be collapsed, which is a separate state from a divider at the\nedge. `collapsed` names the shut pane, `start` or `end`, and the pane opens\nback to the position where the collapsing gesture began. A drag records that position\non press, and every other way of collapsing records it in `settle`.\n`collapsed-size` keeps a sliver of the pane visible, such as a tab strip.\nCollapsing overrides `min` and `max`.\n\nSet `primary` to the pane that keeps its size when the splitter's own size\nchanges, such as a sidebar beside a window being resized. The other pane\ntakes all of the change, as Web Awesome's split panel does. Without it,\nboth panes keep their share.\n\n**Three or more panes along one axis are splitters nested on that axis**, a\nsplitter in the `end` pane of another for three columns. The nested one\nkeeps the pane on its far side the size it was while the outer divider\nmoves, so a divider resizes only the two panes beside it, as Zag's splitter\ndoes with any number of panels. Where the whole row is resized, every pane\nkeeps its share, unless `primary` says otherwise.\n\n**Keyboard.** The divider is one tab stop.\n\n| Key | What it does |\n|---|---|\n| Left, Right | Moves a side-by-side divider by `step`. On a right-to-left page, Left moves it toward the end. |\n| Up, Down | Moves a stacked divider by `step`. |\n| Home, End | Moves the divider to its bounds. |\n| Enter | Collapses the start pane, and opens it again. |\n| F6 | Moves focus from one pane to the first control in the other, and from the divider to the start pane. |",
151051
+ "description": "A splitter has one axis. Nest splitters to get two axes and three-pane or\nfour-pane layouts.\n\nWhen a splitter is slotted into a pane of another at a right angle, a corner\nhandle appears where the dividers cross. It shows the `move` cursor, responds\nto both arrow axes, and a drag moves both dividers at once. The corner is\nadded at `firstUpdated` and is not in the server markup. Before it appears,\nboth dividers work on their own.\n\nThe divider has `role=\"separator\"` and `aria-valuenow`, with\n`aria-valuetext` saying the start pane's share as a percentage in the\nnearest `lang`, or in the reader's locale where no `lang` is set, and `aria-controls` names the start pane. Drag it with a pointer or move it with the arrow keys,\npress `Home` or `End` to move it to its bounds, and press `Enter` to collapse\nthe start pane and open it again. A drag in progress is tracked as a state, so both dividers a\ncorner moves stay lit for as long as they move.\n\nBy default, `min` and `max` let the divider reach either edge, so you can\ndrag a pane fully closed. Set them to limit the range.\n\nA pane can be collapsed, which is a separate state from a divider at the\nedge. `collapsed` names the shut pane, `start` or `end`, and the pane opens\nback to the position where the collapsing gesture began. A drag records that position\non press, and every other way of collapsing records it in `settle`.\n`collapsed-size` keeps a sliver of the pane visible, such as a tab strip.\nCollapsing overrides `min` and `max`. `collapsible` says which panes can be\ncollapsed at all, as Zag's panels each say.\n\n`min` is the least the start pane keeps and `end-min` the least the end pane\nkeeps, each a percentage or a CSS length such as `16rem`.\n\nSet `primary` to the pane that keeps its size when the splitter's own size\nchanges, such as a sidebar beside a window being resized. The other pane\ntakes all of the change, as Web Awesome's split panel does. Without it,\nboth panes keep their share.\n\n**Three or more panes along one axis are splitters nested on that axis**, a\nsplitter in the `end` pane of another for three columns. The nested one\nkeeps the pane on its far side the size it was while the outer divider\nmoves, so a divider resizes only the two panes beside it, as Zag's splitter\ndoes with any number of panels. Where the whole row is resized, every pane\nkeeps its share, unless `primary` says otherwise.\n\n**Keyboard.** The divider is one tab stop.\n\n| Key | What it does |\n|---|---|\n| Left, Right | Moves a side-by-side divider by `step`. On a right-to-left page, Left moves it toward the end. |\n| Up, Down | Moves a stacked divider by `step`. |\n| Home, End | Moves the divider to its bounds. |\n| Enter | Collapses the start pane, or the end pane where `collapsible=\"end\"`, and opens it again. |\n| F6 | Moves focus from one pane to the first control in the other, and from the divider to the start pane. |",
150657
151052
  "name": "HelixHeadlessSplitter",
150658
151053
  "cssProperties": [
150659
151054
  {
@@ -150740,6 +151135,15 @@
150740
151135
  "description": "How much of a shut pane is still shown, as a percentage.\n\nZero by default, which is a pane fully gone. A tab strip or a title bar\nthat should survive its own collapse says how much of itself to keep, and\nonly whoever put it there knows that, which is the same reason `min` is a\nconsumer's to set.",
150741
151136
  "attribute": "collapsed-size"
150742
151137
  },
151138
+ {
151139
+ "kind": "field",
151140
+ "name": "collapsible",
151141
+ "type": {
151142
+ "text": "'both' | 'end' | 'none' | 'start' | undefined"
151143
+ },
151144
+ "description": "Which panes can be collapsed, as Zag's panels each take `collapsible`:\n`start`, `end`, `both`, or `none`. A pane that cannot be collapsed stops\nat the edge without shutting. `Enter` collapses the end pane where only\nthe end pane can be collapsed, and the start pane otherwise.\n\nUnset is `both`, and the attribute stays absent until you write it.",
151145
+ "attribute": "collapsible"
151146
+ },
150743
151147
  {
150744
151148
  "kind": "field",
150745
151149
  "name": "cornerLabel",
@@ -150785,6 +151189,16 @@
150785
151189
  "description": "Where the divider starts, when `position` is not set.",
150786
151190
  "attribute": "default-position"
150787
151191
  },
151192
+ {
151193
+ "kind": "field",
151194
+ "name": "endMin",
151195
+ "type": {
151196
+ "text": "number | string"
151197
+ },
151198
+ "default": "0",
151199
+ "description": "The least the end pane keeps, in the units `min` takes: a percentage, or\na CSS length such as `16rem` resolved against the splitter's box. The\ndivider stops that far from the end, whatever `max` allows, so `min` and\n`end-min` hold a minimum for each pane, as Zag's panels each take\n`minSize`.",
151200
+ "attribute": "end-min"
151201
+ },
150788
151202
  {
150789
151203
  "kind": "field",
150790
151204
  "name": "label",
@@ -151210,6 +151624,25 @@
151210
151624
  ],
151211
151625
  "description": "The collapse a settled position amounts to, if any, so a pane dragged shut\nand a pane shut by a consumer's button are the same state.\n\nNo separate threshold. Landing on the collapsed size *is* the gesture, and\n`clamp` puts every overshoot exactly on the bound, so the default of zero\nlatches on any drag that runs off the end."
151212
151626
  },
151627
+ {
151628
+ "kind": "method",
151629
+ "name": "canCollapse",
151630
+ "privacy": "private",
151631
+ "return": {
151632
+ "type": {
151633
+ "text": "boolean"
151634
+ }
151635
+ },
151636
+ "parameters": [
151637
+ {
151638
+ "name": "pane",
151639
+ "type": {
151640
+ "text": "'end' | 'start'"
151641
+ }
151642
+ }
151643
+ ],
151644
+ "description": "Whether `collapsible` lets this pane be collapsed."
151645
+ },
151213
151646
  {
151214
151647
  "kind": "method",
151215
151648
  "name": "clamp",
@@ -151900,6 +152333,14 @@
151900
152333
  "description": "How much of a shut pane is still shown, as a percentage.\n\nZero by default, which is a pane fully gone. A tab strip or a title bar\nthat should survive its own collapse says how much of itself to keep, and\nonly whoever put it there knows that, which is the same reason `min` is a\nconsumer's to set.",
151901
152334
  "fieldName": "collapsedSize"
151902
152335
  },
152336
+ {
152337
+ "name": "collapsible",
152338
+ "type": {
152339
+ "text": "'both' | 'end' | 'none' | 'start' | undefined"
152340
+ },
152341
+ "description": "Which panes can be collapsed, as Zag's panels each take `collapsible`:\n`start`, `end`, `both`, or `none`. A pane that cannot be collapsed stops\nat the edge without shutting. `Enter` collapses the end pane where only\nthe end pane can be collapsed, and the start pane otherwise.\n\nUnset is `both`, and the attribute stays absent until you write it.",
152342
+ "fieldName": "collapsible"
152343
+ },
151903
152344
  {
151904
152345
  "name": "corner-label",
151905
152346
  "type": {
@@ -151935,6 +152376,15 @@
151935
152376
  "description": "Where the divider starts, when `position` is not set.",
151936
152377
  "fieldName": "defaultPosition"
151937
152378
  },
152379
+ {
152380
+ "name": "end-min",
152381
+ "type": {
152382
+ "text": "number | string"
152383
+ },
152384
+ "default": "0",
152385
+ "description": "The least the end pane keeps, in the units `min` takes: a percentage, or\na CSS length such as `16rem` resolved against the splitter's box. The\ndivider stops that far from the end, whatever `max` allows, so `min` and\n`end-min` hold a minimum for each pane, as Zag's panels each take\n`minSize`.",
152386
+ "fieldName": "endMin"
152387
+ },
151938
152388
  {
151939
152389
  "name": "label",
151940
152390
  "type": {
@@ -164293,7 +164743,7 @@
164293
164743
  "declarations": [
164294
164744
  {
164295
164745
  "kind": "class",
164296
- "description": "A part of `Tag` that holds tags as one control: a grid of rows, one tab stop\nfor the whole set. The arrow keys move between tags, Home and End go to the\nfirst and the last, and a typed letter goes to the next tag starting with\nit. Delete or Backspace removes the focused tag where it is `dismissible`,\nby sending its `helix-dismiss`: remove it from your list in the handler, and\nfocus moves to the next tag, or the previous one after the last.\n\n`selection-mode` lets a reader select tags, with Space, Enter or a press:\n`single` selects one at a time and `multiple` any number. In `multiple`,\nShift with an arrow, Home or End selects the range from the tag last\npressed to the tag focus moves to, Shift with a press or Space selects the\nrange to that tag, and Control or Command with A selects every tag that is\nnot disabled. `selection-behavior=\"replace\"` selects the tag a reader\npresses or moves to alone, as a file list does, and Control or Command\nwith a press or Space adds or takes out one tag. `disallow-empty-selection`\nkeeps one tag selected once one is. `value` holds the\nselected tags' values, separated by commas, and a change asks with\n`helix-before-change` and tells with `change`. Enter on a tag with an\n`href` follows its link. A `disabled` tag is passed over. A selected tag\nthat is removed leaves `value`, which then sends `change`.\n\nName the set with `label`. Each tag is named by its words alone, without\nits remove button. `value` takes an array of values on the property as\nwell, as React sets `value={['Apple']}`; a press writes it back as a\nstring.\n\n**Removing the last tag keeps focus in the group.** With no tags left the\nset is a `group`, and focus moves to its `empty` part,\nwhich holds the `empty` slot: put words there such as \"No filters\" for a\nreader to hear. With nothing slotted it says `empty-label`, \"No tags\".\nWhere only disabled tags are left, the first of them holds the tab stop and\ntakes focus, so the reader stays in the set.",
164746
+ "description": "A part of `Tag` that holds tags as one control: a grid of rows, one tab stop\nfor the whole set. The arrow keys move between tags, Home and End go to the\nfirst and the last, and a typed letter goes to the next tag starting with\nit. Delete or Backspace removes the focused tag where it is `dismissible`,\nby sending its `helix-dismiss`: remove it from your list in the handler, and\nfocus moves to the next tag, or the previous one after the last.\n\n`selection-mode` lets a reader select tags, with Space, Enter or a press:\n`single` selects one at a time and `multiple` any number. In `multiple`,\nShift with an arrow, Home or End selects the range from the tag last\npressed to the tag focus moves to, Shift with a press or Space selects the\nrange to that tag, and Control or Command with A selects every tag that is\nnot disabled. `selection-behavior=\"replace\"` selects the tag a reader\npresses or moves to alone, as a file list does, and Control or Command\nwith a press or Space adds or takes out one tag. `disallow-empty-selection`\nkeeps one tag selected once one is, and Escape lets go of the selection\notherwise. `value` holds the\nselected tags' values, separated by commas, and a change asks with\n`helix-before-change` and tells with `change`. Enter on a tag with an\n`href` follows its link. A `disabled` tag is passed over. A selected tag\nthat is removed leaves `value`, which then sends `change`.\n\nName the set with `label`. Each tag is named by its words alone, without\nits remove button. `value` takes an array of values on the property as\nwell, as React sets `value={['Apple']}`; a press writes it back as a\nstring.\n\n**Removing the last tag keeps focus in the group.** With no tags left the\nset is a `group`, and focus moves to its `empty` part,\nwhich holds the `empty` slot: put words there such as \"No filters\" for a\nreader to hear. With nothing slotted it says `empty-label`, \"No tags\".\nWhere only disabled tags are left, the first of them holds the tab stop and\ntakes focus, so the reader stays in the set.\n\n**Typing new tags.** A field where people type tags and press Enter to add\neach one is Combobox with `multiple` and `allows-custom-value`, or\n`creatable` to ask first with `helix-create`. It draws each value as a tag,\nBackspace on the empty field removes the last one, and the arrow keys move\nbetween them.",
164297
164747
  "name": "HelixHeadlessTagGroup",
164298
164748
  "cssParts": [
164299
164749
  {
@@ -165206,7 +165656,7 @@
165206
165656
  "declarations": [
165207
165657
  {
165208
165658
  "kind": "class",
165209
- "description": "A label that people can optionally remove. `dismissible` is the difference\nfrom a badge: a badge shows a state that people cannot change, and a tag\nnames something they can remove.\n\nThe remove button sends `helix-dismiss`. The tag does not remove itself,\nbecause your code owns the list it is in, so remove it in your handler. A\nlistener can cancel `helix-dismiss`, and `dismiss()` then returns `false`.\nWhen the handler removes a tag whose remove button has focus, focus moves to\nthe next tag's remove button, or to the previous one's after the last tag.\n\nThe remove button is named for its tag, such as \"Remove Apple\", so a list of\nbuttons says which tag each one removes. Write `{label}` in `dismiss-label`\nto put the tag's words somewhere else, such as `dismiss-label=\"{label}\nentfernen\"`.\n\n`href` makes the label a link, and `disabled` takes the tag out of reach: its\nlink and its remove button stop answering.\n\n**In a `Tag.Group` a tag is a row of a grid.** The group gives it its role,\nits place in the one tab stop and, where the group selects, whether it is\nselected. Its remove button leaves the tab order there, Delete and Backspace\ndoing its job from the row.",
165659
+ "description": "A label that people can optionally remove. `dismissible` is the difference\nfrom a badge: a badge shows a state that people cannot change, and a tag\nnames something they can remove.\n\nThe remove button sends `helix-dismiss`. The tag does not remove itself,\nbecause your code owns the list it is in, so remove it in your handler. A\nlistener can cancel `helix-dismiss`, and `dismiss()` then returns `false`.\nWhen the handler removes a tag whose remove button has focus, focus moves to\nthe next tag's remove button, or to the previous one's after the last tag.\n\nThe remove button is named for its tag, such as \"Remove Apple\", so a list of\nbuttons says which tag each one removes. Write `{label}` in `dismiss-label`\nto put the tag's words somewhere else, such as `dismiss-label=\"{label}\nentfernen\"`.\n\n`href` makes the label a link, and `disabled` takes the tag out of reach: its\nlink and its remove button stop answering.\n\n**In a `Tag.Group` a tag is a row of a grid.** The group gives it its role,\nits place in the one tab stop and, where the group selects, whether it is\nselected. Its remove button leaves the tab order there, Delete and Backspace\ndoing its job from the row.\n\n**Styling a tag by what is happening to it.** `:state(selected)` while it is\nselected, `:state(focus-visible)` while its cell shows keyboard focus,\n`[disabled]` while it is out of reach, and the host's own `:hover` and\n`:active` under the pointer, as React Aria's `data-hovered` and\n`data-pressed` are.",
165210
165660
  "name": "HelixHeadlessTag",
165211
165661
  "cssParts": [
165212
165662
  {
@@ -165383,6 +165833,13 @@
165383
165833
  "description": "The remove button's name: `dismissLabel` with the tag's own words.\n\n**Named for its tag**, because a set of tags each named \"Remove\" is a list\nof buttons that says nothing about which tag each one takes away. The\nwords are the tag's slotted text, its category first, and `{label}` in\n`dismissLabel` says where they go. Without it they follow the verb, unless\nthe label already holds them, which is what a page naming each button by\nhand wrote.\n\nRead from the children, so empty on a server and while hydrating, where\nthe name is the verb alone until the update after.",
165384
165834
  "readonly": true
165385
165835
  },
165836
+ {
165837
+ "kind": "field",
165838
+ "name": "handleCellFocus",
165839
+ "privacy": "private",
165840
+ "readonly": true,
165841
+ "description": "Says whether the cell shows keyboard focus, as `:focus-visible` does, so a\nsheet outside can draw the ring on the tag by the host."
165842
+ },
165386
165843
  {
165387
165844
  "kind": "method",
165388
165845
  "name": "renderLabel",
@@ -165975,6 +166432,10 @@
165975
166432
  }
165976
166433
  ],
165977
166434
  "cssStates": [
166435
+ {
166436
+ "description": "The tag's cell has keyboard focus that the browser shows, in a `Tag.Group`.",
166437
+ "name": "focus-visible"
166438
+ },
165978
166439
  {
165979
166440
  "description": "The tag is selected in a `Tag.Group` that selects.",
165980
166441
  "name": "selected"
@@ -173320,6 +173781,14 @@
173320
173781
  "words": true
173321
173782
  }
173322
173783
  },
173784
+ {
173785
+ "kind": "field",
173786
+ "name": "timeContent",
173787
+ "type": {
173788
+ "text": "((time: string, written: string) => unknown) | undefined | undefined"
173789
+ },
173790
+ "description": "What each time in the list shows: a function given the time as `HH:mm`,\nor `HH:mm:ss` with `seconds`, and the time as the row writes it, that\nreturns text, an element or a Lit template.\n\nFor the seats left at a time, or a caption under it, as React Aria's\n`ListBoxItem` takes children. Content with `slot=\"start\"`, `slot=\"end\"`\nor `slot=\"description\"` goes to that slot of the row, and a description\nis read after the time. The row is still named by the written time, and\ntypeahead still finds it by that. Return the written time with your\ncontent where it should still show. A property only, there being no way\nto write a function in markup. The wheels draw their own figures."
173791
+ },
173323
173792
  {
173324
173793
  "kind": "field",
173325
173794
  "name": "unavailableMessage",
@@ -175619,7 +176088,7 @@
175619
176088
  "declarations": [
175620
176089
  {
175621
176090
  "kind": "class",
175622
- "description": "Given `datetime`, the label you write is wrapped in a `<time>` element, so a\nmachine-readable value such as \"2026-08-19\" travels with a label such as\n\"yesterday\". Without `datetime`, the label is a `<span>`.\n\n**`relative` writes the time for you** as how long ago it was, such as \"3\nhours ago\", from `datetime`, where the `time` slot is empty. The words move\non as they go stale, \"3 hours ago\" becoming \"4 hours ago\", with one wakeup\nshared by every reading on the page, as `FormatDate` keeps its own. They are\nin the language of the page, or of the nearest `lang`.\n\nEach entry draws the connector line that arrives at it and hides it when it\nis the first entry, using `:host(:first-child)`. This needs no index, no\ncounting parent, and no script. `Steps` and `Breadcrumbs` work the same way.\n\n`tone` sets the kind of event and is the only thing that colors the mark. It\nuses the same values as `Announcement`. **A screen reader hears the tone as\na word**, from `tone-labels`: the mark is an image named \"Error\",\n\"Information\", \"Success\" or \"Warning\", so the color is not the only place\nthe meaning is. `neutral` and `primary` say nothing unless you name them.\n\n**`pending` marks an event that has not happened yet**, such as one that is\nscheduled. The mark is the open circle, and a screen reader hears\n`pending-label`, \"Scheduled\", with the tone's word.",
176091
+ "description": "Given `datetime`, the label you write is wrapped in a `<time>` element, so a\nmachine-readable value such as \"2026-08-19\" travels with a label such as\n\"yesterday\". Without `datetime`, the label is a `<span>`.\n\n**`relative` writes the time for you** as how long ago it was, such as \"3\nhours ago\", from `datetime`, where the `time` slot is empty. The words move\non as they go stale, \"3 hours ago\" becoming \"4 hours ago\", with one wakeup\nshared by every reading on the page, as `FormatDate` keeps its own. They are\nin the language of the page, or of the nearest `lang`. The whole date and\ntime is the reading's `title`, so a pointer resting on \"3 hours ago\" shows\nwhen it was, and a screen reader reads it as the description.\n\nEach entry draws the connector line that arrives at it and hides it when it\nis the first entry, using `:host(:first-child)`. This needs no index, no\ncounting parent, and no script. `Steps` and `Breadcrumbs` work the same way.\n\n`tone` sets the kind of event and is the only thing that colors the mark. It\nuses the same values as `Announcement`. **A screen reader hears the tone as\na word**, from `tone-labels`: the mark is an image named \"Error\",\n\"Information\", \"Success\" or \"Warning\", so the color is not the only place\nthe meaning is. `neutral` and `primary` say nothing unless you name them.\n\n**`pending` marks an event that has not happened yet**, such as one that is\nscheduled. The mark is the open circle, and a screen reader hears\n`pending-label`, \"Scheduled\", with the tone's word.",
175623
176092
  "name": "HelixHeadlessTimelineItem",
175624
176093
  "cssParts": [
175625
176094
  {
@@ -175707,6 +176176,16 @@
175707
176176
  "default": "''",
175708
176177
  "description": "What the `time` slot shows where nothing is slotted: the reading under\n`relative`, read against the clock before each render, and nothing\notherwise."
175709
176178
  },
176179
+ {
176180
+ "kind": "field",
176181
+ "name": "whole",
176182
+ "type": {
176183
+ "text": "string"
176184
+ },
176185
+ "privacy": "private",
176186
+ "default": "''",
176187
+ "description": "The whole date and time `datetime` names, the reading's title under `relative`."
176188
+ },
175710
176189
  {
175711
176190
  "kind": "field",
175712
176191
  "name": "moment",
@@ -176281,15 +176760,35 @@
176281
176760
  "declarations": [
176282
176761
  {
176283
176762
  "kind": "class",
176284
- "description": "A timeline is a record of events that happened or are scheduled. Each entry\ncarries a time, and no entry is current or complete. For a process you move\nthrough, with a current stage and `active` and `complete` states, use\n`Steps`.\n\nEach entry draws the connector line that arrives at it and hides it when it\nis first, using `:host(:first-child)`. This resolves at layout with no\nscript, so the server markup is correct before anything runs.\n\nThe host has `role=\"list\"`, because the entries are your elements in the\nlight DOM. `Steps` does the same.\n\n**Group entries by date with `Timeline.Group`**, which puts a heading such as\n\"Today\" over its entries. The group is an entry of the timeline, and its\nentries are a list of their own named by the heading.\n\n**The reading order is the order you write the entries in**, in every layout\nthe styled tier draws: down the page, either side of a line down the middle,\nor across the page. Inside each entry the time is read before what happened.\nWrite the entries in the order the events happened, oldest or newest first,\nand the layout only moves where they are drawn.",
176763
+ "description": "A timeline is a record of events that happened or are scheduled. Each entry\ncarries a time, and no entry is current or complete. For a process you move\nthrough, with a current stage and `active` and `complete` states, use\n`Steps`.\n\nEach entry draws the connector line that arrives at it and hides it when it\nis first, using `:host(:first-child)`. This resolves at layout with no\nscript, so the server markup is correct before anything runs.\n\nThe host has `role=\"list\"`, because the entries are your elements in the\nlight DOM. `Steps` does the same.\n\n**Group entries by date with `Timeline.Group`**, which puts a heading such as\n\"Today\" over its entries. The group is an entry of the timeline, and its\nentries are a list of their own named by the heading.\n\n**The reading order is the order you write the entries in**, in every layout\nthe styled tier draws: down the page, either side of a line down the middle,\nor across the page. Inside each entry the time is read before what happened.\nWrite the entries in the order the events happened, oldest or newest first,\nand the layout only moves where they are drawn.\n\n**A feed that loads more entries sets `loading` while it fetches.** The\ntimeline is busy, and an entry after the last says \"Loading more\"\n(`loading-label`, or your own content in the `loading` slot). Put a button\nthat asks for more after the timeline, and move focus to the first new\nentry when they arrive.",
176285
176764
  "name": "HelixHeadlessTimeline",
176765
+ "cssParts": [
176766
+ {
176767
+ "description": "The entry after the last while `loading` is set.",
176768
+ "name": "loading"
176769
+ }
176770
+ ],
176286
176771
  "slots": [
176287
176772
  {
176288
176773
  "description": "The entries, and any groups of them.",
176289
176774
  "name": ""
176775
+ },
176776
+ {
176777
+ "description": "Content for the entry after the last while `loading` is set. Falls back to `loading-label`.",
176778
+ "name": "loading"
176290
176779
  }
176291
176780
  ],
176292
176781
  "members": [
176782
+ {
176783
+ "kind": "field",
176784
+ "name": "words",
176785
+ "type": {
176786
+ "text": "string"
176787
+ },
176788
+ "static": true,
176789
+ "default": "'helix-timeline'",
176790
+ "description": "The key this family's words are registered under, its styled tag:\n`registerWords('de', { 'helix-timeline': { loadingLabel: 'Wird geladen' } })`."
176791
+ },
176293
176792
  {
176294
176793
  "kind": "field",
176295
176794
  "name": "label",
@@ -176300,6 +176799,30 @@
176300
176799
  "description": "Accessible name for the timeline, for people who reach it out of context.",
176301
176800
  "attribute": "label"
176302
176801
  },
176802
+ {
176803
+ "kind": "field",
176804
+ "name": "loading",
176805
+ "type": {
176806
+ "text": "boolean"
176807
+ },
176808
+ "default": "false",
176809
+ "description": "Marks the timeline as busy fetching more entries, and draws an entry\nafter the last that says so.",
176810
+ "attribute": "loading",
176811
+ "reflects": true
176812
+ },
176813
+ {
176814
+ "kind": "field",
176815
+ "name": "loadingLabel",
176816
+ "type": {
176817
+ "text": "string"
176818
+ },
176819
+ "default": "'Loading more'",
176820
+ "description": "The text of the entry drawn while `loading` is set, where the `loading` slot is empty.",
176821
+ "attribute": "loading-label",
176822
+ "helix": {
176823
+ "words": true
176824
+ }
176825
+ },
176303
176826
  {
176304
176827
  "kind": "field",
176305
176828
  "name": "tier",
@@ -176649,6 +177172,38 @@
176649
177172
  "default": "''",
176650
177173
  "description": "Accessible name for the timeline, for people who reach it out of context.",
176651
177174
  "fieldName": "label"
177175
+ },
177176
+ {
177177
+ "name": "loading",
177178
+ "type": {
177179
+ "text": "boolean"
177180
+ },
177181
+ "default": "false",
177182
+ "description": "Marks the timeline as busy fetching more entries, and draws an entry\nafter the last that says so.",
177183
+ "fieldName": "loading"
177184
+ },
177185
+ {
177186
+ "name": "loading-label",
177187
+ "type": {
177188
+ "text": "string"
177189
+ },
177190
+ "default": "'Loading more'",
177191
+ "description": "The text of the entry drawn while `loading` is set, where the `loading` slot is empty.",
177192
+ "fieldName": "loadingLabel"
177193
+ }
177194
+ ],
177195
+ "cssStates": [
177196
+ {
177197
+ "description": "While `loading` is set.",
177198
+ "name": "loading"
177199
+ },
177200
+ {
177201
+ "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
177202
+ "name": "settled",
177203
+ "inheritedFrom": {
177204
+ "name": "HelixElement",
177205
+ "module": "src/helix-element/helix-element.ts"
177206
+ }
176652
177207
  }
176653
177208
  ],
176654
177209
  "superclass": {
@@ -176681,16 +177236,6 @@
176681
177236
  },
176682
177237
  "tagName": "helix-headless-timeline",
176683
177238
  "customElement": true,
176684
- "cssStates": [
176685
- {
176686
- "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
176687
- "name": "settled",
176688
- "inheritedFrom": {
176689
- "name": "HelixElement",
176690
- "module": "src/helix-element/helix-element.ts"
176691
- }
176692
- }
176693
- ],
176694
177239
  "modulePath": "src/timeline/root/timeline-root.ts",
176695
177240
  "definitionPath": "src/timeline/root/timeline-root.ts"
176696
177241
  }
@@ -181999,7 +182544,7 @@
181999
182544
  "declarations": [
182000
182545
  {
182001
182546
  "kind": "class",
182002
- "description": "The trigger stays your own element. The bubble renders in the\ntop layer through the popover API, so an ancestor with `overflow: hidden`\ndoes not clip it and no `z-index` is needed. `FloatingController` positions\nit and flips it to another side when the preferred side does not fit.\n\n**Place the tooltip beside its trigger, name the trigger with `for`, and\nname the tooltip in the trigger's `aria-describedby`.** The description is\nthen in your own markup, so it is in the server's HTML and in the\naccessibility tree at rest, in every browser, before anyone points at the\ntrigger or focuses it:\n\n```html\n<helix-headless-button aria-describedby=\"save-tip\" id=\"save\">Save</helix-headless-button>\n<helix-headless-tooltip content=\"Save your work\" for=\"save\" id=\"save-tip\"></helix-headless-tooltip>\n```\n\nWithout the attribute, the tooltip links itself through an element reference\non the control that takes focus, and it never writes into your markup before\nyou act, so hydration stays intact. A trigger that is a Helix component is\ndescribed at once, inside its own shadow root. A plain element in your\nmarkup is described when you first point at it or focus it, so a screen\nreader in reading mode meets it with no description until then. Where the\nbrowser has no element references, nothing links the two, and the tooltip\nwarns once on first open. The tooltip can also wrap its trigger, which\ndescribes a Helix component and leaves a plain element undescribed. In the\n`for` form the tooltip itself is out of the accessibility tree while its\nbubble is down, so you meet its words once, as the trigger's description.\n\nThe tooltip shows on hover and on focus. It hides on pointer leave, on blur,\non Escape, and when the trigger is activated. The pointer can move from the\ntrigger onto the bubble and the bubble stays, unless you set\n`hoverable=\"false\"`. `delay` is how long the pointer rests before it shows,\nand `delay-out` how long it stays once the pointer leaves.\n\nOnce one tooltip is showing, moving to another trigger shows its tooltip\nwith no `delay`, and the first one hides. The same holds for `skip-delay`\nmilliseconds after a tooltip hides, 300 unless you set it. `show-on=\"focus\"`\nshows the tooltip on keyboard focus only, for a hint a pointer does not need.",
182547
+ "description": "The trigger stays your own element. The bubble renders in the\ntop layer through the popover API, so an ancestor with `overflow: hidden`\ndoes not clip it and no `z-index` is needed. `FloatingController` positions\nit and flips it to another side when the preferred side does not fit.\n\n**Place the tooltip beside its trigger, name the trigger with `for`, and\nname the tooltip in the trigger's `aria-describedby`.** The description is\nthen in your own markup, so it is in the server's HTML and in the\naccessibility tree at rest, in every browser, before anyone points at the\ntrigger or focuses it:\n\n```html\n<helix-headless-button aria-describedby=\"save-tip\" id=\"save\">Save</helix-headless-button>\n<helix-headless-tooltip content=\"Save your work\" for=\"save\" id=\"save-tip\"></helix-headless-tooltip>\n```\n\nWithout the attribute, the tooltip links itself through an element reference\non the control that takes focus, and it never writes into your markup before\nyou act, so hydration stays intact. A trigger that is a Helix component is\ndescribed at once, inside its own shadow root. A plain element in your\nmarkup is described when you first point at it or focus it, so a screen\nreader in reading mode meets it with no description until then. Where the\nbrowser has no element references, nothing links the two, and the tooltip\nwarns once on first open. The tooltip can also wrap its trigger, which\ndescribes a Helix component and leaves a plain element undescribed. In the\n`for` form the tooltip itself is out of the accessibility tree while its\nbubble is down, so you meet its words once, as the trigger's description.\nA trigger whose name is already the tooltip's words, such as an icon button\nnamed Settings under a tooltip reading Settings, is not described by them\nagain.\n\nThe tooltip shows on hover and on focus. It hides on pointer leave, on blur,\non Escape, and when the trigger is activated. The pointer can move from the\ntrigger onto the bubble and the bubble stays, unless you set\n`hoverable=\"false\"`. `delay` is how long the pointer rests before it shows,\nand `delay-out` how long it stays once the pointer leaves.\n\nOnce one tooltip is showing, moving to another trigger shows its tooltip\nwith no `delay`, and the first one hides. The same holds for `skip-delay`\nmilliseconds after a tooltip hides, 300 unless you set it. `show-on=\"focus\"`\nshows the tooltip on keyboard focus only, for a hint a pointer does not need.",
182003
182548
  "name": "HelixHeadlessTooltip",
182004
182549
  "cssParts": [
182005
182550
  {
@@ -182433,6 +182978,16 @@
182433
182978
  ],
182434
182979
  "description": "Describes the control that takes the trigger's focus by this tooltip.\n\n`light` says a reader has just acted, which is what allows a write onto a\nplain element in the consumer's markup. See `linkDescription`."
182435
182980
  },
182981
+ {
182982
+ "kind": "field",
182983
+ "name": "describes",
182984
+ "type": {
182985
+ "text": "boolean"
182986
+ },
182987
+ "privacy": "private",
182988
+ "description": "Whether the bubble's words add anything to the trigger: they are not\nempty, and they are not the trigger's own name, such as an icon button\nnamed Settings under a tooltip reading Settings, which a screen reader\nread as \"Settings, Settings\".",
182989
+ "readonly": true
182990
+ },
182436
182991
  {
182437
182992
  "kind": "field",
182438
182993
  "name": "linkOnArrival",
@@ -195396,13 +195951,295 @@
195396
195951
  }
195397
195952
  ]
195398
195953
  },
195954
+ {
195955
+ "kind": "javascript-module",
195956
+ "path": "src/virtual-list/reorder/index.ts",
195957
+ "declarations": [],
195958
+ "exports": [
195959
+ {
195960
+ "kind": "js",
195961
+ "name": "reorderVirtualList",
195962
+ "declaration": {
195963
+ "name": "reorderVirtualList",
195964
+ "module": "./virtual-list-reorder.js"
195965
+ }
195966
+ },
195967
+ {
195968
+ "kind": "js",
195969
+ "name": "VirtualListReorderController",
195970
+ "declaration": {
195971
+ "name": "VirtualListReorderController",
195972
+ "module": "./virtual-list-reorder.js"
195973
+ }
195974
+ }
195975
+ ]
195976
+ },
195977
+ {
195978
+ "kind": "javascript-module",
195979
+ "path": "src/virtual-list/reorder/virtual-list-reorder.ts",
195980
+ "declarations": [
195981
+ {
195982
+ "kind": "class",
195983
+ "description": "Moves the items of a `reorderable` virtual list, by pointer and by keyboard,\nand says each move in a region screen readers announce.\n\n**Its own entry**, `@fusion.dev/helix-headless/virtual-list/reorder`, so a\nlist that never moves items carries none of this. Importing the entry gives\nevery virtual list one, and `reorderable` turns it on.\n\n- **Alt with Up or Down** moves the item the keys are on a place at once,\n and Alt with Home or End to either end, as the APG's rearrangeable\n listbox does. Across, Alt with Left or Right does, mirrored right to left.\n The keys stay on the item that moved.\n- **A pointer** drags a whole row, with no grip: a press that travels is a\n drag, and one that does not is still a press. The list scrolls near an\n edge.\n- **The page moves the items.** A drop sends `helix-before-reorder` and then\n `helix-reorder` with every key in the new order.\n\nA row being dragged carries `data-dragging`, and the row a drop would land\nbeside `data-drop-before` or `data-drop-after`. While a pointer drags a row,\na copy of it follows the pointer in the list's `drag-preview` part. The\nstyled tier's entry hands in the sheet that draws those, which the list\nadopts while it reorders.",
195984
+ "name": "VirtualListReorderController",
195985
+ "members": [
195986
+ {
195987
+ "kind": "field",
195988
+ "name": "host",
195989
+ "type": {
195990
+ "text": "HelixHeadlessVirtualList"
195991
+ },
195992
+ "privacy": "private",
195993
+ "readonly": true,
195994
+ "default": "host"
195995
+ },
195996
+ {
195997
+ "kind": "field",
195998
+ "name": "sheet",
195999
+ "type": {
196000
+ "text": "CSSResult | undefined"
196001
+ },
196002
+ "description": "The sheet the list adopts while it reorders, from the styled tier.",
196003
+ "default": "sheet"
196004
+ },
196005
+ {
196006
+ "kind": "field",
196007
+ "name": "marked",
196008
+ "privacy": "private",
196009
+ "default": "new Set<HTMLElement>()",
196010
+ "description": "The rows marked last, so a mark that moves is taken off where it was."
196011
+ },
196012
+ {
196013
+ "kind": "field",
196014
+ "name": "live",
196015
+ "type": {
196016
+ "text": "HTMLElement | undefined"
196017
+ },
196018
+ "privacy": "private",
196019
+ "description": "The region each move is said in, drawn while the list reorders."
196020
+ },
196021
+ {
196022
+ "kind": "field",
196023
+ "name": "reorder",
196024
+ "type": {
196025
+ "text": "ReorderController"
196026
+ },
196027
+ "privacy": "private",
196028
+ "readonly": true,
196029
+ "default": "new ReorderController(host, { get axis() { return host.orientation === 'horizontal' ? 'inline' : 'block' }, box: (key) => this.rowFor(key)?.getBoundingClientRect(), current: () => { const row = this.rows.find((one) => one.hasAttribute('data-active')) return row && !row.hasAttribute('data-disabled') ? this.keyOf(row) : undefined }, enabled: () => this.enabled, grip: (event) => { const row = this.rowOf(event) const key = row && !row.hasAttribute('data-disabled') ? this.keyOf(row) : undefined return row && key !== undefined ? { element: row, key } : undefined }, holds: false, keys: () => host.keys(), name: (key) => this.names.get(key) || key, preview: (key) => this.rowFor(key), say: (words) => { if (this.live) { this.live.textContent = words } }, scroller: () => host.renderRoot?.querySelector<HTMLElement>('[part=\"viewport\"]') ?? null, })"
196030
+ },
196031
+ {
196032
+ "kind": "field",
196033
+ "name": "enabled",
196034
+ "type": {
196035
+ "text": "boolean"
196036
+ },
196037
+ "privacy": "private",
196038
+ "description": "Whether the list moves its items now: one column, without sections.",
196039
+ "readonly": true
196040
+ },
196041
+ {
196042
+ "kind": "field",
196043
+ "name": "names",
196044
+ "privacy": "private",
196045
+ "default": "new Map<string, string>()",
196046
+ "description": "The words of each drawn row by its item's key, as they were when the list\nlast drew. A move is said after the page has moved the items and before\nthe rows are drawn again, so a row's own words then belong to another item."
196047
+ },
196048
+ {
196049
+ "kind": "method",
196050
+ "name": "hostUpdated",
196051
+ "return": {
196052
+ "type": {
196053
+ "text": "void"
196054
+ }
196055
+ }
196056
+ },
196057
+ {
196058
+ "kind": "method",
196059
+ "name": "hostConnected",
196060
+ "return": {
196061
+ "type": {
196062
+ "text": "void"
196063
+ }
196064
+ }
196065
+ },
196066
+ {
196067
+ "kind": "method",
196068
+ "name": "hostDisconnected",
196069
+ "return": {
196070
+ "type": {
196071
+ "text": "void"
196072
+ }
196073
+ }
196074
+ },
196075
+ {
196076
+ "kind": "field",
196077
+ "name": "rows",
196078
+ "type": {
196079
+ "text": "HTMLElement[]"
196080
+ },
196081
+ "privacy": "private",
196082
+ "description": "The rows the list draws now.",
196083
+ "readonly": true
196084
+ },
196085
+ {
196086
+ "kind": "method",
196087
+ "name": "keyOf",
196088
+ "privacy": "private",
196089
+ "return": {
196090
+ "type": {
196091
+ "text": "string | undefined"
196092
+ }
196093
+ },
196094
+ "parameters": [
196095
+ {
196096
+ "name": "row",
196097
+ "type": {
196098
+ "text": "HTMLElement"
196099
+ }
196100
+ }
196101
+ ],
196102
+ "description": "The key of the item a row draws."
196103
+ },
196104
+ {
196105
+ "kind": "method",
196106
+ "name": "rowFor",
196107
+ "privacy": "private",
196108
+ "return": {
196109
+ "type": {
196110
+ "text": "HTMLElement | undefined"
196111
+ }
196112
+ },
196113
+ "parameters": [
196114
+ {
196115
+ "name": "key",
196116
+ "type": {
196117
+ "text": "string"
196118
+ }
196119
+ }
196120
+ ],
196121
+ "description": "The row that draws the item with that key, where one is drawn."
196122
+ },
196123
+ {
196124
+ "kind": "method",
196125
+ "name": "rowOf",
196126
+ "privacy": "private",
196127
+ "return": {
196128
+ "type": {
196129
+ "text": "HTMLElement | undefined"
196130
+ }
196131
+ },
196132
+ "parameters": [
196133
+ {
196134
+ "name": "event",
196135
+ "type": {
196136
+ "text": "Event"
196137
+ }
196138
+ }
196139
+ ],
196140
+ "description": "The row an event passed through."
196141
+ },
196142
+ {
196143
+ "kind": "field",
196144
+ "name": "waiting",
196145
+ "type": {
196146
+ "text": "number | undefined"
196147
+ },
196148
+ "privacy": "private",
196149
+ "description": "The place an item moved by a key goes to, until the page has moved it."
196150
+ },
196151
+ {
196152
+ "kind": "field",
196153
+ "name": "handleReorder",
196154
+ "privacy": "private",
196155
+ "readonly": true,
196156
+ "description": "Keeps the keys on the item that moved. The page moves the items as it\nhears this, and the rows are drawn again in place, so the row that had\nfocus now draws another item. Focus goes to the item's new row once the\nlist has drawn it."
196157
+ },
196158
+ {
196159
+ "kind": "method",
196160
+ "name": "draw",
196161
+ "privacy": "private",
196162
+ "return": {
196163
+ "type": {
196164
+ "text": "void"
196165
+ }
196166
+ },
196167
+ "parameters": [
196168
+ {
196169
+ "name": "on",
196170
+ "type": {
196171
+ "text": "boolean"
196172
+ }
196173
+ }
196174
+ ],
196175
+ "description": "Draws the list's `drag-preview` part and its region for the words while it\nreorders, and takes them away after. The list's own template draws\nneither."
196176
+ },
196177
+ {
196178
+ "kind": "method",
196179
+ "name": "mark",
196180
+ "privacy": "private",
196181
+ "return": {
196182
+ "type": {
196183
+ "text": "void"
196184
+ }
196185
+ },
196186
+ "description": "Puts each row's mark in a move on it, and the styled tier's sheet on the list."
196187
+ }
196188
+ ],
196189
+ "helix": {}
196190
+ },
196191
+ {
196192
+ "kind": "function",
196193
+ "name": "reorderVirtualList",
196194
+ "return": {
196195
+ "type": {
196196
+ "text": "void"
196197
+ }
196198
+ },
196199
+ "parameters": [
196200
+ {
196201
+ "name": "element",
196202
+ "type": {
196203
+ "text": "typeof HelixHeadlessVirtualList"
196204
+ }
196205
+ },
196206
+ {
196207
+ "name": "sheet",
196208
+ "optional": true,
196209
+ "type": {
196210
+ "text": "CSSResult"
196211
+ }
196212
+ }
196213
+ ],
196214
+ "description": "Gives every virtual list of a class a `VirtualListReorderController`, and\nthe class the words it says, as properties that read and write their\nattributes: `movedLabel`, `canceledLabel`, `droppedLabel`, and\n`pickedUpLabel`.\n\nThe entries call it for their own tier's class: the headless entry for\n`HelixHeadlessVirtualList`, and the styled one for `HelixVirtualList`, with\nthe sheet that draws a move. **Lists already on the page are given one\ntoo**, so a page that imports the list and then this entry has its lists\nreorder."
196215
+ }
196216
+ ],
196217
+ "exports": [
196218
+ {
196219
+ "kind": "js",
196220
+ "name": "VirtualListReorderController",
196221
+ "declaration": {
196222
+ "name": "VirtualListReorderController",
196223
+ "module": "src/virtual-list/reorder/virtual-list-reorder.ts"
196224
+ }
196225
+ },
196226
+ {
196227
+ "kind": "js",
196228
+ "name": "reorderVirtualList",
196229
+ "declaration": {
196230
+ "name": "reorderVirtualList",
196231
+ "module": "src/virtual-list/reorder/virtual-list-reorder.ts"
196232
+ }
196233
+ }
196234
+ ]
196235
+ },
195399
196236
  {
195400
196237
  "kind": "javascript-module",
195401
196238
  "path": "src/virtual-list/root/virtual-list-root.ts",
195402
196239
  "declarations": [
195403
196240
  {
195404
196241
  "kind": "class",
195405
- "description": "The items arrive as data, in one of two ways:\n\n- `items` takes an array. A framework sets it as a property, and React\n hydration keeps it.\n- `for` names a `<script type=\"application/json\">` that holds an array, which\n a server sends as markup.\n\nEach item is drawn into a row in one of two ways:\n\n- `renderItem` is a function from an item and its index to the row's\n content: a Lit template, a string, or a DOM node.\n- A `<template>` child defines one row. `data-field=\"name\"` fills an element\n with the item's `name` as text, and `data-field-href=\"url\"` writes the\n item's `url` into `href`, the same for any attribute. A field may be a path\n of keys, such as `author.name`.\n\nRows are your markup in the light DOM, so your stylesheet styles them.\n\n**A grid.** `columns` lays the items out that many to a line, as a grid of\nequal columns, and windows the set a line at a time, as React Aria's grid\nlayout does. Each item draws one element, a cell of the grid, and\n`estimate` is the height of a line. `min-column-width` lays out as many\ncolumns as fit the box instead, as React Aria's grid layout does with its\nsmallest item size, and follows the box as it resizes. `gap` spaces the rows, and the columns\nof a grid, by a number of pixels the list counts in each row's place.\n\n**Across.** `orientation=\"horizontal\"` lays the items out along a line and\nscrolls it sideways, as a strip of cards does, windowed the same way:\n`estimate` is then an item's width, and the box needs an inline size.\n\n**Sections.** `section-field` names the field of each item that says which\nsection it is in, and the list draws a header before each section's items,\nas React Aria's list box sections do. Each section is an element with the\n`group` role, named by its header, which is its first child and carries\n`data-header`, so your stylesheet styles it, such as with `position:\nsticky`. A section starts wherever the field changes, so give the items in\norder. The window counts the headers with the items, and a section the\nwindow starts inside is drawn with its header. `renderSection` draws a\nheader of your own.\n\n**Keyboard.** The list is one tab stop.\n\n| Key | What it does |\n|---|---|\n| Down, Up | Moves to the next or the previous item, or in a grid to the item in the same column on the next or the previous line. |\n| Right, Left | In a grid, moves to the next or the previous item along the line, the other way round on a right-to-left page. In a list that runs across, moves to the next or the previous item the same way, and Down and Up are left to the row. |\n| Home, End | Moves to the first or the last item. |\n| Page Down, Page Up | Moves by the number of items, or of lines in a grid, on screen. |\n| A letter or a word | Moves to the next item whose text starts with what you typed. |\n| Escape | Lets go of every chosen item, in a list with `selection-mode`. |\n| Tab | Moves into the focused row's own links and buttons, then out of the list. |\n\nAn item that is not drawn is scrolled into view and focused, so a keyboard\nreaches the whole set. When the row holding the tab stop scrolls away, the\nstop moves to the first row on screen. Typing matches each item's\n`text-field`, which is the first `data-field` of the row template by default,\nor the item itself when it is a string or a number.\n\nEach row says its place in the whole set with `aria-posinset` and\n`aria-setsize`, so a screen reader says \"4,000 of 10,000\". The row holding\nfocus stays drawn when it scrolls out.\n\n**Selecting.** `selection-mode` makes the list a list box a reader chooses\nfrom: `single` selects one item and `multiple` any number. Space or a press\nselects an item, Shift with Space, an arrow, Home, End or a press takes in\nthe items from the last one chosen, and Control or Command with A selects\nthem all, in `multiple`. Escape lets go of every chosen item, and keeps the\nkey from the dialog or menu around the list while there was something to\nlet go of. `value` holds the chosen items' keys, separated by commas, in\nthe order of the set: `key-field` names each item's key, and a string or a\nnumber item is its own key. A change asks with `helix-before-change` and\ntells with `change`. Each row is an `option` marked `aria-selected`, so a\nrow's own links and buttons are not reached there: keep those to a list\nwithout `selection-mode`.\n\n`selection-behavior=\"replace\"` selects the item pressed alone, as a file\nlist does, and the arrow keys carry the selection with them. Control or\nCommand with a press or with Space adds or takes out one item, and with an\narrow moves without selecting.\n\n**Disabled items.** `disabled-keys` names items by their keys, separated by\ncommas. Their rows carry `aria-disabled`, the keys and typing pass over\nthem, and a press, Space, or Control with A does not select them.\n\n**Rows a stylesheet can tell apart.** A chosen row carries `data-selected`,\na disabled one `data-disabled`, as React Aria's rows do, and the row the\nkeys are on, which holds the tab stop, `data-active`, whether or not the\nlist has focus.\n\n**Loading more.** `helix-range-change` fires as the items on screen change,\nand `range` holds them. `helix-load-more` fires once a reader is within one\nscreen of the end, once for each length of the set: add to `items` and it can\nfire again. While you fetch, set `loading`: the list is busy, and a row after\nthe last item says \"Loading more\" (`loading-label`, or your own content in\nthe `loading` slot). `scrollToIndex` takes a reader to an item.\n\n**An empty list.** Set `empty-label`, or put your own content in the `empty`\nslot, for a row shown when there are no items and none are loading, such as\n\"No messages yet\" and a link to write one. Without either, an empty list\nshows nothing, since a list whose items have not arrived yet has not said\nit has none.\n\nThe list takes the `empty` state while it has read its items and holds none,\nand the `loading` state while `loading` is set, so your stylesheet can\nchange the box around it for either. A list with no name is reported once\nin a development build. Name it with `label` or `aria-label`.\n\n**Row height.** Rows are placed by `estimate` until they are drawn. Then the\nlist reads the drawn rows' height once and places every row by it, so a\nwrong estimate still reaches the last item. Set `measured` for rows of\ndifferent heights. Once the list draws rows of different heights, such as\nrows that wrap on a narrow screen, it places each row by its own height\nwhether `measured` is set or not.\n\nThe list follows its source. A new `items` array, an edit to the script's\ntext, or a script replaced under the same id draws the new rows. A row that\nstays in view keeps its element as the list scrolls.\n\nThe viewport scrolls on this tier. It carries `data-scroller`, and `core`\nships `[data-scroller] { overflow: auto }` into every shadow root, so\n`scrollTop` works with no stylesheet. You still need to set a block size.",
196242
+ "description": "The items arrive as data, in one of two ways:\n\n- `items` takes an array. A framework sets it as a property, and React\n hydration keeps it.\n- `for` names a `<script type=\"application/json\">` that holds an array, which\n a server sends as markup.\n\nEach item is drawn into a row in one of two ways:\n\n- `renderItem` is a function from an item and its index to the row's\n content: a Lit template, a string, or a DOM node.\n- A `<template>` child defines one row. `data-field=\"name\"` fills an element\n with the item's `name` as text, and `data-field-href=\"url\"` writes the\n item's `url` into `href`, the same for any attribute. A field may be a path\n of keys, such as `author.name`.\n\nRows are your markup in the light DOM, so your stylesheet styles them.\n\n**A grid.** `columns` lays the items out that many to a line, as a grid of\nequal columns, and windows the set a line at a time, as React Aria's grid\nlayout does. Each item draws one element, a cell of the grid, and\n`estimate` is the height of a line. `min-column-width` lays out as many\ncolumns as fit the box instead, as React Aria's grid layout does with its\nsmallest item size, and follows the box as it resizes. `gap` spaces the rows, and the columns\nof a grid, by a number of pixels the list counts in each row's place.\n\n**Across.** `orientation=\"horizontal\"` lays the items out along a line and\nscrolls it sideways, as a strip of cards does, windowed the same way:\n`estimate` is then an item's width, and the box needs an inline size.\n\n**Sections.** `section-field` names the field of each item that says which\nsection it is in, and the list draws a header before each section's items,\nas React Aria's list box sections do. Each section is an element with the\n`group` role, named by its header, which is its first child and carries\n`data-header`, so your stylesheet styles it, such as with `position:\nsticky`. A section starts wherever the field changes, so give the items in\norder. The window counts the headers with the items, and a section the\nwindow starts inside is drawn with its header. `renderSection` draws a\nheader of your own.\n\n**Keyboard.** The list is one tab stop.\n\n| Key | What it does |\n|---|---|\n| Down, Up | Moves to the next or the previous item, or in a grid to the item in the same column on the next or the previous line. |\n| Right, Left | In a grid, moves to the next or the previous item along the line, the other way round on a right-to-left page. In a list that runs across, moves to the next or the previous item the same way, and Down and Up are left to the row. |\n| Home, End | Moves to the first or the last item. |\n| Page Down, Page Up | Moves by the number of items, or of lines in a grid, on screen. |\n| A letter or a word | Moves to the next item whose text starts with what you typed. |\n| Escape | Lets go of every chosen item, in a list with `selection-mode`. |\n| Alt with Up or Down | In a `reorderable` list, moves the item a place. Alt with Home or End moves it to either end. |\n| Tab | Moves into the focused row's own links and buttons, then out of the list. |\n\nAn item that is not drawn is scrolled into view and focused, so a keyboard\nreaches the whole set. The row a reader last focused keeps the tab stop and\nstays drawn when it scrolls away, so Tab and Shift+Tab come back to it, as\nReact Aria's collections do. In a list nobody has focused yet, the stop\nmoves to the first row on screen. Typing matches each item's\n`text-field`, which is the first `data-field` of the row template by default,\nor the item itself when it is a string or a number.\n\nEach row says its place in the whole set with `aria-posinset` and\n`aria-setsize`, so a screen reader says \"4,000 of 10,000\". The row holding\nfocus stays drawn when it scrolls out.\n\n**Selecting.** `selection-mode` makes the list a list box a reader chooses\nfrom: `single` selects one item and `multiple` any number. Space or a press\nselects an item, Shift with Space, an arrow, Home, End or a press takes in\nthe items from the last one chosen, and Control or Command with A selects\nthem all, in `multiple`. Escape lets go of every chosen item, and keeps the\nkey from the dialog or menu around the list while there was something to\nlet go of. `value` holds the chosen items' keys, separated by commas, in\nthe order of the set: `key-field` names each item's key, and a string or a\nnumber item is its own key. A change asks with `helix-before-change` and\ntells with `change`. Each row is an `option` marked `aria-selected`, so a\nrow's own links and buttons are not reached there: keep those to a list\nwithout `selection-mode`.\n\n`selection-behavior=\"replace\"` selects the item pressed alone, as a file\nlist does, and the arrow keys carry the selection with them. Control or\nCommand with a press or with Space adds or takes out one item, and with an\narrow moves without selecting.\n\n**Disabled items.** `disabled-keys` names items by their keys, separated by\ncommas. Their rows carry `aria-disabled`, the keys and typing pass over\nthem, and a press, Space, or Control with A does not select them.\n\n**Rows a stylesheet can tell apart.** A chosen row carries `data-selected`,\na disabled one `data-disabled`, as React Aria's rows do, and the row the\nkeys are on, which holds the tab stop, `data-active`, whether or not the\nlist has focus.\n\n**Loading more.** `helix-range-change` fires as the items on screen change,\nand `range` holds them. `helix-load-more` fires once a reader is within one\nscreen of the end, once for each length of the set: add to `items` and it can\nfire again. While you fetch, set `loading`: the list is busy, and a row after\nthe last item says \"Loading more\" (`loading-label`, or your own content in\nthe `loading` slot). `scrollToIndex` takes a reader to an item.\n\n**Moving items** is a separate import, `@fusion.dev/helix/virtual-list/reorder`,\nas React Aria's drag and drop is. With it imported, `reorderable` lets a\nreader move items in a list of one column without sections:\n\n- Alt with Up or Down moves the item the keys are on a place, and Alt with\n Home or End to either end, as the APG's rearrangeable listbox does.\n- A pointer drags a whole row. A press that does not travel is still a\n press. The list scrolls near an edge, and an item far down a long set is\n reached by dragging to the edge.\n- A drop sends `helix-before-reorder`, which you can refuse, and then\n `helix-reorder`, whose `keys` hold every item's key in the new order.\n **You move the items**: set `items` to them in that order. The keys stay\n on the item that moved.\n- Each move is said in a region screen readers announce. The row being\n dragged carries `data-dragging`, and the row a drop would land beside\n `data-drop-before` or `data-drop-after`.\n\n**An empty list.** Set `empty-label`, or put your own content in the `empty`\nslot, for a row shown when there are no items and none are loading, such as\n\"No messages yet\" and a link to write one. Without either, an empty list\nshows nothing, since a list whose items have not arrived yet has not said\nit has none.\n\nThe list takes the `empty` state while it has read its items and holds none,\nand the `loading` state while `loading` is set, so your stylesheet can\nchange the box around it for either. A list with no name is reported once\nin a development build. Name it with `label` or `aria-label`.\n\n**Row height.** Rows are placed by `estimate` until they are drawn. Then the\nlist reads the drawn rows' height once and places every row by it, so a\nwrong estimate still reaches the last item. Set `measured` for rows of\ndifferent heights. Once the list draws rows of different heights, such as\nrows that wrap on a narrow screen, it places each row by its own height\nwhether `measured` is set or not.\n\nThe list follows its source. A new `items` array, an edit to the script's\ntext, or a script replaced under the same id draws the new rows. A row that\nstays in view keeps its element as the list scrolls.\n\nThe viewport scrolls on this tier. It carries `data-scroller`, and `core`\nships `[data-scroller] { overflow: auto }` into every shadow root, so\n`scrollTop` works with no stylesheet. You still need to set a block size.",
195406
196243
  "name": "HelixHeadlessVirtualList",
195407
196244
  "cssParts": [
195408
196245
  {
@@ -195608,6 +196445,16 @@
195608
196445
  },
195609
196446
  "description": "Draws each section's header, given its name and its place among the\nsections, for a list given `section-field`. Set it as a property. Where\nit is unset, the header is the name as text."
195610
196447
  },
196448
+ {
196449
+ "kind": "field",
196450
+ "name": "reorderable",
196451
+ "type": {
196452
+ "text": "boolean"
196453
+ },
196454
+ "default": "false",
196455
+ "description": "Lets a reader move items, once `@fusion.dev/helix/virtual-list/reorder`\n(or `@fusion.dev/helix-headless/virtual-list/reorder`) is imported: Alt\nwith an arrow moves the row the keys are on, and a pointer drags a row.\nThe list moves no item itself: you move your `items` on `helix-reorder`.\nWithout that import it does nothing, so a list that never moves items\ncarries none of the code. A list of one column, without sections.",
196456
+ "attribute": "reorderable"
196457
+ },
195611
196458
  {
195612
196459
  "kind": "field",
195613
196460
  "name": "sectionField",
@@ -196189,17 +197036,6 @@
196189
197036
  ],
196190
197037
  "description": "The key of item `at` in `value`. See `keyField`."
196191
197038
  },
196192
- {
196193
- "kind": "method",
196194
- "name": "keys",
196195
- "privacy": "private",
196196
- "return": {
196197
- "type": {
196198
- "text": "string[]"
196199
- }
196200
- },
196201
- "description": "Every item's key, in the order of the set."
196202
- },
196203
197039
  {
196204
197040
  "kind": "field",
196205
197041
  "name": "chosen",
@@ -196282,25 +197118,6 @@
196282
197118
  "readonly": true,
196283
197119
  "description": "A press on a row selects it, in a list with `selection-mode`, except on a\ncontrol of its own. Shift takes in a range."
196284
197120
  },
196285
- {
196286
- "kind": "method",
196287
- "name": "focusIndex",
196288
- "privacy": "private",
196289
- "return": {
196290
- "type": {
196291
- "text": "Promise<void>"
196292
- }
196293
- },
196294
- "parameters": [
196295
- {
196296
- "name": "index",
196297
- "type": {
196298
- "text": "number"
196299
- }
196300
- }
196301
- ],
196302
- "description": "Focuses the row for item `index`, scrolling it into view and drawing it\nfirst when it is not drawn."
196303
- },
196304
197121
  {
196305
197122
  "kind": "field",
196306
197123
  "name": "handleFocusOut",
@@ -196335,6 +197152,16 @@
196335
197152
  "privacy": "private",
196336
197153
  "description": "The item a key is moving focus to, drawn until it has it."
196337
197154
  },
197155
+ {
197156
+ "kind": "field",
197157
+ "name": "visited",
197158
+ "type": {
197159
+ "text": "boolean"
197160
+ },
197161
+ "privacy": "private",
197162
+ "default": "false",
197163
+ "description": "Whether a reader has focused a row, after which their row keeps the tab stop."
197164
+ },
196338
197165
  {
196339
197166
  "kind": "method",
196340
197167
  "name": "keptIndex",
@@ -196344,7 +197171,7 @@
196344
197171
  "text": "number | undefined"
196345
197172
  }
196346
197173
  },
196347
- "description": "The item drawn outside the window to keep focus, or to take it, if there is one."
197174
+ "description": "The item drawn outside the window to keep focus, to take it, or to take\nit back: the row a reader last focused stays drawn after focus leaves the\nlist, so Shift+Tab returns to it."
196348
197175
  },
196349
197176
  {
196350
197177
  "kind": "method",
@@ -196467,7 +197294,7 @@
196467
197294
  "text": "void"
196468
197295
  }
196469
197296
  },
196470
- "description": "Puts the windowed rows into the light DOM, and takes the rest out.\n\n**A row that stays in the window keeps its element.** Clearing and\ncloning every row on every move replaced the node a reader had focused,\nso a link in a row lost focus to the body on any scroll, even with its row\nstill on screen. Rows are keyed by item: the ones leaving go, the ones\narriving are drawn in their place, and the ones staying are not moved.\n\n**The row holding focus is drawn outside the window too**, beside it on the\nside it belongs, and the spacer on that side gives up its room.\n\n**One row holds the tab stop**, the one the reader last focused while it is\ndrawn, and the first row on screen once it is not. Its own links and\nbuttons are in the tab order, and those of every other row wait."
197297
+ "description": "Puts the windowed rows into the light DOM, and takes the rest out.\n\n**A row that stays in the window keeps its element.** Clearing and\ncloning every row on every move replaced the node a reader had focused,\nso a link in a row lost focus to the body on any scroll, even with its row\nstill on screen. Rows are keyed by item: the ones leaving go, the ones\narriving are drawn in their place, and the ones staying are not moved.\n\n**The row holding focus is drawn outside the window too**, beside it on the\nside it belongs, and the spacer on that side gives up its room.\n\n**One row holds the tab stop**, the one the reader last focused, which\nstays drawn outside the window, and the first row on screen in a list\nnobody has focused yet. Its own links and buttons are in the tab order,\nand those of every other row wait."
196471
197298
  },
196472
197299
  {
196473
197300
  "kind": "field",
@@ -196899,6 +197726,14 @@
196899
197726
  "name": "helix-before-change",
196900
197727
  "reactProp": "onhelix-before-change"
196901
197728
  },
197729
+ {
197730
+ "type": {
197731
+ "text": "HelixBeforeReorderEvent"
197732
+ },
197733
+ "description": "Fired when an item is dropped at a new place, in a `reorderable` list with `@fusion.dev/helix/virtual-list/reorder` imported, with every key in the new order. Cancelable: cancel it to keep the item where it is.",
197734
+ "name": "helix-before-reorder",
197735
+ "reactProp": "onhelix-before-reorder"
197736
+ },
196902
197737
  {
196903
197738
  "type": {
196904
197739
  "text": "HelixLoadMoreEvent"
@@ -196914,6 +197749,14 @@
196914
197749
  "description": "Fired when the items on screen change, with the new `first` and `last`, which `range` also holds.",
196915
197750
  "name": "helix-range-change",
196916
197751
  "reactProp": "onhelix-range-change"
197752
+ },
197753
+ {
197754
+ "type": {
197755
+ "text": "HelixReorderEvent"
197756
+ },
197757
+ "description": "Fired after `helix-before-reorder` when nobody canceled it. Set `items` to the order in `keys`. Cancelable: cancel it to say the move did not happen.",
197758
+ "name": "helix-reorder",
197759
+ "reactProp": "onhelix-reorder"
196917
197760
  }
196918
197761
  ],
196919
197762
  "attributes": [
@@ -197034,6 +197877,15 @@
197034
197877
  "description": "Which way the list runs. `horizontal` lays the items out along a line\nand scrolls it sideways: Left and Right move between items, the other\nway round on a right-to-left page, and `estimate` is an item's width. A\ngrid always runs down.",
197035
197878
  "fieldName": "orientation"
197036
197879
  },
197880
+ {
197881
+ "name": "reorderable",
197882
+ "type": {
197883
+ "text": "boolean"
197884
+ },
197885
+ "default": "false",
197886
+ "description": "Lets a reader move items, once `@fusion.dev/helix/virtual-list/reorder`\n(or `@fusion.dev/helix-headless/virtual-list/reorder`) is imported: Alt\nwith an arrow moves the row the keys are on, and a pointer drags a row.\nThe list moves no item itself: you move your `items` on `helix-reorder`.\nWithout that import it does nothing, so a list that never moves items\ncarries none of the code. A list of one column, without sections.",
197887
+ "fieldName": "reorderable"
197888
+ },
197037
197889
  {
197038
197890
  "name": "section-field",
197039
197891
  "type": {
@@ -197324,6 +198176,6 @@
197324
198176
  ],
197325
198177
  "helix": {
197326
198178
  "package": "@fusion.dev/helix-headless",
197327
- "version": "0.172.0"
198179
+ "version": "0.174.0"
197328
198180
  }
197329
198181
  }