@fusion.dev/helix-headless 0.162.1 → 0.164.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 (45) hide show
  1. package/custom-elements.json +1041 -47
  2. package/dist/callout/root/callout-root.d.ts +43 -4
  3. package/dist/callout/root/callout-root.js +58 -2
  4. package/dist/canvas/index.d.ts +1 -1
  5. package/dist/canvas/root/canvas-document.d.ts +33 -0
  6. package/dist/canvas/root/canvas-root.d.ts +50 -2
  7. package/dist/canvas/root/canvas-root.js +98 -3
  8. package/dist/chat/composer/chat-composer.js +1 -1
  9. package/dist/chat/root/chat-root.d.ts +15 -4
  10. package/dist/chat/root/chat-root.js +19 -8
  11. package/dist/code-block/patch.d.ts +42 -0
  12. package/dist/code-block/patch.js +118 -0
  13. package/dist/code-block/root/code-block-root.d.ts +37 -1
  14. package/dist/code-block/root/code-block-root.js +57 -9
  15. package/dist/color-picker/root/color-picker-root.d.ts +7 -3
  16. package/dist/color-picker/root/color-picker-root.js +7 -4
  17. package/dist/combobox/root/combobox-root.d.ts +1 -0
  18. package/dist/combobox/root/combobox-root.js +10 -1
  19. package/dist/data-table/root/data-table-root.d.ts +1 -0
  20. package/dist/data-table/root/data-table-root.js +1 -0
  21. package/dist/element-events.generated.js +7 -1
  22. package/dist/map/root/map-root.d.ts +8 -1
  23. package/dist/map/root/map-root.js +12 -0
  24. package/dist/menu/item/menu-item.d.ts +38 -7
  25. package/dist/menu/item/menu-item.js +20 -9
  26. package/dist/menu/root/menu-root.d.ts +10 -1
  27. package/dist/menu/root/menu-root.js +8 -3
  28. package/dist/object-inspector/root/object-inspector-root.d.ts +23 -0
  29. package/dist/object-inspector/root/object-inspector-root.js +19 -1
  30. package/dist/steps/root/steps-root.d.ts +7 -1
  31. package/dist/steps/root/steps-root.js +6 -1
  32. package/dist/table/grid-controller.d.ts +7 -0
  33. package/dist/table/grid-controller.js +15 -1
  34. package/dist/table/root/table-root.d.ts +10 -0
  35. package/dist/table/root/table-root.js +18 -1
  36. package/dist/video/root/video-root.js +2 -1
  37. package/dist/video-playlist/item/video-playlist-item.d.ts +8 -0
  38. package/dist/video-playlist/item/video-playlist-item.js +7 -0
  39. package/dist/video-playlist/root/video-playlist-root.d.ts +60 -0
  40. package/dist/video-playlist/root/video-playlist-root.js +55 -1
  41. package/lint.json +1 -1
  42. package/package.json +5 -5
  43. package/types/jsx.d.ts +502 -40
  44. package/types/vue.d.ts +126 -14
  45. package/types/words.d.ts +58 -0
@@ -1681,6 +1681,35 @@
1681
1681
  "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
1682
1682
  }
1683
1683
  },
1684
+ {
1685
+ "kind": "field",
1686
+ "name": "present",
1687
+ "type": {
1688
+ "text": "boolean"
1689
+ },
1690
+ "privacy": "protected",
1691
+ "description": "Whether the element is still on the page for a reader, which is what\nthe focus hand-off waits on: connected, for a surface the page removes.\nA surface that hides itself says it is gone once hidden, and calls\n`handFocusOn` then.",
1692
+ "readonly": true,
1693
+ "inheritedFrom": {
1694
+ "name": "MixinDismissible",
1695
+ "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
1696
+ }
1697
+ },
1698
+ {
1699
+ "kind": "method",
1700
+ "name": "handFocusOn",
1701
+ "privacy": "protected",
1702
+ "return": {
1703
+ "type": {
1704
+ "text": "void"
1705
+ }
1706
+ },
1707
+ "description": "Hands focus on now, where a dismissal is waiting for this element to\ngo: for a surface that hides itself, once it has.",
1708
+ "inheritedFrom": {
1709
+ "name": "MixinDismissible",
1710
+ "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
1711
+ }
1712
+ },
1684
1713
  {
1685
1714
  "kind": "method",
1686
1715
  "name": "dismiss",
@@ -12722,7 +12751,7 @@
12722
12751
  "declarations": [
12723
12752
  {
12724
12753
  "kind": "class",
12725
- "description": "`tone` is on the headless tier because it carries meaning. It picks the icon\nand the icon region's accessible name, so a screen reader announces \"Error\"\nfor an error callout whether or not the color is seen. Set `tone-label` to\nsay the name in another language.\n\nThe icon is the fallback content of a slot. Slot your own icon to replace it,\nand the default disappears with no extra check. The tone's name stays on the\nregion around it.\n\nSet `dismissible` for a note a reader may put away, as Shoelace's `closable`\nalert does. The button fires `helix-dismiss` and the callout stays until a\nlistener removes it, so the page decides whether it comes back.\n\nA callout sets a passage apart inside a document and is read where it sits.\nFor page-level chrome above the masthead that is a live region and can be\ndismissed, use `Announcement`.",
12754
+ "description": "`tone` is on the headless tier because it carries meaning. It picks the icon\nand the icon region's accessible name, so a screen reader announces \"Error\"\nfor an error callout whether or not the color is seen. Set `tone-label` to\nsay the name in another language.\n\nThe icon is the fallback content of a slot. Slot your own icon to replace it,\nand the default disappears with no extra check. The tone's name stays on the\nregion around it.\n\nSet `dismissible` for a note a reader may put away, as Shoelace's `closable`\nalert does. The button fires `helix-dismiss`, and unless a listener cancels\nit the callout hides itself: `open` turns false, `:state(exiting)` holds\nwhile its exit animations run, and then it is `hidden`. Remove it in your\nlistener to take it out of the page, or set `open` to show it again, which\nholds `:state(entering)` while it comes back. Focus on its dismiss button\nmoves to the next callout's, or to the tab stop beside it, once it hides.\n\nA callout sets a passage apart inside a document and is read where it sits.\nFor page-level chrome above the masthead that is a live region and can be\ndismissed, use `Announcement`.",
12726
12755
  "name": "HelixHeadlessCallout",
12727
12756
  "cssParts": [
12728
12757
  {
@@ -12796,6 +12825,57 @@
12796
12825
  "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
12797
12826
  }
12798
12827
  },
12828
+ {
12829
+ "kind": "field",
12830
+ "name": "turn",
12831
+ "type": {
12832
+ "text": "number"
12833
+ },
12834
+ "privacy": "private",
12835
+ "default": "0",
12836
+ "description": "Which journey is the latest, so an entrance settling late leaves an exit alone."
12837
+ },
12838
+ {
12839
+ "kind": "field",
12840
+ "name": "present",
12841
+ "type": {
12842
+ "text": "boolean"
12843
+ },
12844
+ "privacy": "protected",
12845
+ "description": "Hidden from a reader once hidden, for the focus hand-off.",
12846
+ "readonly": true,
12847
+ "inheritedFrom": {
12848
+ "name": "MixinDismissible",
12849
+ "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
12850
+ }
12851
+ },
12852
+ {
12853
+ "kind": "method",
12854
+ "name": "dismiss",
12855
+ "return": {
12856
+ "type": {
12857
+ "text": "boolean"
12858
+ }
12859
+ },
12860
+ "description": "Hides the callout once a dismissal stands, unless the page removed it in\nits listener, which is the page's answer and leaves `open` as it was.",
12861
+ "inheritedFrom": {
12862
+ "name": "MixinDismissible",
12863
+ "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
12864
+ },
12865
+ "type": {
12866
+ "text": "dismiss() => boolean"
12867
+ }
12868
+ },
12869
+ {
12870
+ "kind": "field",
12871
+ "name": "open",
12872
+ "type": {
12873
+ "text": "boolean"
12874
+ },
12875
+ "default": "true",
12876
+ "description": "Whether the callout is showing. A dismissal nobody canceled turns it\nfalse and the callout hides itself, and setting it true shows the callout\nagain. Not reflected: open is the resting state, so an `open` attribute\nwould appear on markup a server sent without it.",
12877
+ "attribute": "open"
12878
+ },
12799
12879
  {
12800
12880
  "kind": "field",
12801
12881
  "name": "tone",
@@ -12884,6 +12964,24 @@
12884
12964
  ],
12885
12965
  "description": "The dismiss button's name: `dismissLabel` with the heading's words, or the\ntone's name.\n\nThe heading is read from the children, so a server and a hydrating render\nname the button for the tone, and the update after names it for the\nheading."
12886
12966
  },
12967
+ {
12968
+ "kind": "method",
12969
+ "name": "journey",
12970
+ "privacy": "private",
12971
+ "return": {
12972
+ "type": {
12973
+ "text": "void"
12974
+ }
12975
+ },
12976
+ "description": "The way out after a dismissal, or back in after `open` is set again.\n\n**Hidden only once the exit has run**, since a hidden element draws no\nanimation: `:state(exiting)` holds until every animation on the callout\nhas finished, or two frames where it has none, and then `hidden` takes it\nout of the page and out of the accessibility tree. Shown again at once,\nwith `:state(entering)` while it arrives."
12977
+ },
12978
+ {
12979
+ "kind": "field",
12980
+ "name": "readRegions",
12981
+ "privacy": "private",
12982
+ "readonly": true,
12983
+ "description": "Says which regions hold something, one call apiece so each pairs with its `@cssstate`."
12984
+ },
12887
12985
  {
12888
12986
  "kind": "field",
12889
12987
  "name": "dismissible",
@@ -12930,19 +13028,17 @@
12930
13028
  },
12931
13029
  {
12932
13030
  "kind": "method",
12933
- "name": "dismiss",
13031
+ "name": "handFocusOn",
13032
+ "privacy": "protected",
12934
13033
  "return": {
12935
13034
  "type": {
12936
- "text": "boolean"
13035
+ "text": "void"
12937
13036
  }
12938
13037
  },
12939
- "description": "Fires `helix-dismiss`, and returns `false` if a listener cancels it.",
13038
+ "description": "Hands focus on now, where a dismissal is waiting for this element to\ngo: for a surface that hides itself, once it has.",
12940
13039
  "inheritedFrom": {
12941
13040
  "name": "MixinDismissible",
12942
13041
  "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
12943
- },
12944
- "type": {
12945
- "text": "dismiss() => boolean"
12946
13042
  }
12947
13043
  },
12948
13044
  {
@@ -13378,7 +13474,7 @@
13378
13474
  "type": {
13379
13475
  "text": "HelixDismissEvent"
13380
13476
  },
13381
- "description": "The dismiss button was pressed. The callout does not remove itself, so remove it in response. Cancelable.",
13477
+ "description": "The dismiss button was pressed. Unless a listener cancels it, the callout hides itself, and a listener may remove it instead. Cancelable: cancel it to keep the callout showing.",
13382
13478
  "name": "helix-dismiss",
13383
13479
  "reactProp": "onhelix-dismiss"
13384
13480
  }
@@ -13397,6 +13493,15 @@
13397
13493
  "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
13398
13494
  }
13399
13495
  },
13496
+ {
13497
+ "name": "open",
13498
+ "type": {
13499
+ "text": "boolean"
13500
+ },
13501
+ "default": "true",
13502
+ "description": "Whether the callout is showing. A dismissal nobody canceled turns it\nfalse and the callout hides itself, and setting it true shows the callout\nagain. Not reflected: open is the resting state, so an `open` attribute\nwould appear on markup a server sent without it.",
13503
+ "fieldName": "open"
13504
+ },
13400
13505
  {
13401
13506
  "name": "tone",
13402
13507
  "type": {
@@ -13437,6 +13542,36 @@
13437
13542
  }
13438
13543
  }
13439
13544
  ],
13545
+ "cssStates": [
13546
+ {
13547
+ "description": "While `open` is false: the callout was dismissed, and is leaving or hidden.",
13548
+ "name": "closed"
13549
+ },
13550
+ {
13551
+ "description": "While a callout shown again by `open` runs its entrance animations.",
13552
+ "name": "entering"
13553
+ },
13554
+ {
13555
+ "description": "While a dismissed callout runs its exit animations, before it is hidden.",
13556
+ "name": "exiting"
13557
+ },
13558
+ {
13559
+ "description": "Something is slotted into `heading`.",
13560
+ "name": "has-heading"
13561
+ },
13562
+ {
13563
+ "description": "An icon of your own is slotted into `icon`, in place of the tone's.",
13564
+ "name": "has-icon"
13565
+ },
13566
+ {
13567
+ "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
13568
+ "name": "settled",
13569
+ "inheritedFrom": {
13570
+ "name": "HelixElement",
13571
+ "module": "src/helix-element/helix-element.ts"
13572
+ }
13573
+ }
13574
+ ],
13440
13575
  "mixins": [
13441
13576
  {
13442
13577
  "name": "MixinDismissible",
@@ -13472,16 +13607,6 @@
13472
13607
  },
13473
13608
  "tagName": "helix-headless-callout",
13474
13609
  "customElement": true,
13475
- "cssStates": [
13476
- {
13477
- "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
13478
- "name": "settled",
13479
- "inheritedFrom": {
13480
- "name": "HelixElement",
13481
- "module": "src/helix-element/helix-element.ts"
13482
- }
13483
- }
13484
- ],
13485
13610
  "modulePath": "src/callout/root/callout-root.ts",
13486
13611
  "definitionPath": "src/callout/root/callout-root.ts"
13487
13612
  }
@@ -14410,6 +14535,22 @@
14410
14535
  "module": "./root/canvas-root.js"
14411
14536
  }
14412
14537
  },
14538
+ {
14539
+ "kind": "js",
14540
+ "name": "CanvasRoute",
14541
+ "declaration": {
14542
+ "name": "CanvasRoute",
14543
+ "module": "./root/canvas-root.js"
14544
+ }
14545
+ },
14546
+ {
14547
+ "kind": "js",
14548
+ "name": "CanvasRouteEnds",
14549
+ "declaration": {
14550
+ "name": "CanvasRouteEnds",
14551
+ "module": "./root/canvas-root.js"
14552
+ }
14553
+ },
14413
14554
  {
14414
14555
  "kind": "js",
14415
14556
  "name": "CanvasSide",
@@ -15630,7 +15771,7 @@
15630
15771
  "declarations": [
15631
15772
  {
15632
15773
  "kind": "class",
15633
- "description": "A board of cards and connectors, drawn by Helix. On a canvas every position\nis data that someone placed, so drawing is arithmetic over rectangles with no\nlayout to compute. `Map` takes a slotted map, because another renderer draws\nits tiles.\n\nThe format is [JSON Canvas](https://jsoncanvas.org), an open format. Each\nnode has an `x`, `y`, `width`, `height`, and a type. Each edge names the two\nnodes it joins and the sides it leaves and arrives on. A card belongs to a\ngroup when it sits inside the group's bounds.\n\nThe cards are text in the DOM, so a screen reader can read them. The family\nadds a reading order and states each card's connections as text. `order` sets\nthe reading order:\n- `spatial` bands the cards into rows.\n- `edges` follows the arrows, starting from the cards that nothing points to.\n\n**Cards move by default.** The board writes the new `x` and `y` onto the\ncard, the way an input writes its own value, and dispatches two events:\n- `helix-before-move` for every step. Cancel it to hold the positions in your\n own state and apply them yourself.\n- `helix-move` once the move is finished.\n\nA resize dispatches the same pair with a size. Set `readonly` on the board to\nkeep every card in place, such as on a published board. Set `readonly` on one\ncard or connection to keep only that one in place.\n\nSet `snap` to a length in the document's units, such as `32`, and a card\nthat is moved or resized lands on a multiple of it. Carrying a card, a\ncorner, a connection, or the selection box near the edge of the board moves\nthe board under it, so a card can be taken to a place off screen in one\ndrag. A connection let go within 20 pixels of a card arrives at it. A\ndouble click on the empty board zooms in about that point, and Shift with a\ndouble click zooms out.\n\nKeyboard behavior:\n- One card holds the board's tab stop.\n- The arrow keys move through the cards in reading order. The card you land\n on scrolls into view, and its connections are announced with it.\n- The card you land on is selected. Control or Command with an arrow key,\n Home, or End moves without changing the selection, and Space adds the card\n to the selection or takes it out, so you can select cards that are not\n next to each other.\n- Shift with an arrow key moves the card: by 16 units, or to the next\n multiple of `snap` where it is set. Alt with an arrow key resizes it from\n its bottom right corner the same way.\n- The connections leaving a card are stops of their own, straight after it.\n Enter on one moves to the card it arrives at.\n- What a key changes that a reader cannot see is said: where a card moved\n to, its new size, how many cards are selected, and the zoom. A selected\n card or connection says so when a reader arrives on it.\n- Control or Command with C copies the selected cards, and the connections\n between them, as a JSON Canvas document in text, which another board or\n an app that reads the format takes. A paste is your page's: listen for\n `paste` on the board, read the text with `fromJsonCanvas`, and add the\n cards it holds.\n- Control or Command with Z undoes the last move or resize the board made,\n and with Shift, or Control with Y, makes it again. `undo()` and `redo()`\n do the same from a script. Each asks with `helix-before-move` and tells\n with `helix-move`, as a move does, so a board that holds its positions in\n your state is undone through your state.\n\nEvery drag also works with clicks, as WCAG 2.5.7 requires for a pointer that\ncannot hold a button down. Click a selected card's move handle, a corner, a\ncard's connection point, or the end of a selected connection to pick it up.\nIt follows the pointer with no button held, and the next click puts it down\nwhere a drag would have. On touch, the next tap sets where it lands. Escape,\nor a press outside the board, puts it back. So a finger connects two cards\nwith three taps: the card, one of its points, and the card to connect to.\n\nConnecting and removing dispatch requests, and your code applies them:\n- Drawing from a card's handle to another card, or pressing C on one card and\n Enter on another, dispatches `helix-connect`.\n- Delete on a card or a connection dispatches `helix-remove`. The event names\n every connection that removing the card would leave without an end.\n\nOnce your page removes what Delete asked for, focus moves to the next stop,\nto the one before where it was the last, and to the board where none is\nleft. A focused card your page removes for its own reasons hands focus on\nthe same way, unless the reader has already moved focus somewhere else.\n\nThe board applies a move itself, because the card already exists. A\nconnection is a new element, and React discards an element the board adds to\nits markup on the next render, so you write the connection.\n\nCards and connections are `helix-canvas-node` and `helix-canvas-edge`\nelements, so they are in the served markup whichever renderer wrote them. The\nlibrary fetches nothing, and an array passed to an element is missing from\nthe first paint of a server-rendered React page. `fromJsonCanvas` turns a\nJSON Canvas document into their props, and `toJsonCanvas()` writes a board\nback out.",
15774
+ "description": "A board of cards and connectors, drawn by Helix. On a canvas every position\nis data that someone placed, so drawing is arithmetic over rectangles with no\nlayout to compute. `Map` takes a slotted map, because another renderer draws\nits tiles.\n\nThe format is [JSON Canvas](https://jsoncanvas.org), an open format. Each\nnode has an `x`, `y`, `width`, `height`, and a type. Each edge names the two\nnodes it joins and the sides it leaves and arrives on. A card belongs to a\ngroup when it sits inside the group's bounds.\n\nThe cards are text in the DOM, so a screen reader can read them. The family\nadds a reading order and states each card's connections as text. `order` sets\nthe reading order:\n- `spatial` bands the cards into rows.\n- `edges` follows the arrows, starting from the cards that nothing points to.\n\n**Cards move by default.** The board writes the new `x` and `y` onto the\ncard, the way an input writes its own value, and dispatches two events:\n- `helix-before-move` for every step. Cancel it to hold the positions in your\n own state and apply them yourself.\n- `helix-move` once the move is finished.\n\nA resize dispatches the same pair with a size. Set `readonly` on the board to\nkeep every card in place, such as on a published board. Set `readonly` on one\ncard or connection to keep only that one in place.\n\nSet `snap` to a length in the document's units, such as `32`, and a card\nthat is moved or resized lands on a multiple of it. Carrying a card, a\ncorner, a connection, or the selection box near the edge of the board moves\nthe board under it, so a card can be taken to a place off screen in one\ndrag. A connection let go within 20 pixels of a card arrives at it. A\ndouble click on the empty board zooms in about that point, and Shift with a\ndouble click zooms out.\n\nKeyboard behavior:\n- One card holds the board's tab stop.\n- The arrow keys move through the cards in reading order. The card you land\n on scrolls into view, and its connections are announced with it.\n- The card you land on is selected. Control or Command with an arrow key,\n Home, or End moves without changing the selection, and Space adds the card\n to the selection or takes it out, so you can select cards that are not\n next to each other.\n- Shift with an arrow key moves the card: by 16 units, or to the next\n multiple of `snap` where it is set. Alt with an arrow key resizes it from\n its bottom right corner the same way.\n- The connections leaving a card are stops of their own, straight after it.\n Enter on one moves to the card it arrives at.\n- What a key changes that a reader cannot see is said: where a card moved\n to, its new size, how many cards are selected, and the zoom. A selected\n card or connection says so when a reader arrives on it.\n- Control or Command with C copies the selected cards, and the connections\n between them, as a JSON Canvas document in text, which another board or\n an app that reads the format takes. A paste is your page's: listen for\n `paste` on the board, read the text with `fromJsonCanvas`, and add the\n cards it holds.\n- Control or Command with Z undoes the last move or resize the board made,\n and with Shift, or Control with Y, makes it again. `undo()` and `redo()`\n do the same from a script. Each asks with `helix-before-move` and tells\n with `helix-move`, as a move does, so a board that holds its positions in\n your state is undone through your state.\n\nEvery drag also works with clicks, as WCAG 2.5.7 requires for a pointer that\ncannot hold a button down. Click a selected card's move handle, a corner, a\ncard's connection point, or the end of a selected connection to pick it up.\nIt follows the pointer with no button held, and the next click puts it down\nwhere a drag would have. On touch, the next tap sets where it lands. Escape,\nor a press outside the board, puts it back. So a finger connects two cards\nwith three taps: the card, one of its points, and the card to connect to.\n\nConnecting and removing dispatch requests, and your code applies them:\n- Drawing from a card's handle to another card, or pressing C on one card and\n Enter on another, dispatches `helix-connect`.\n- Delete on a card or a connection dispatches `helix-remove`. The event names\n every connection that removing the card would leave without an end.\n\nOnce your page removes what Delete asked for, focus moves to the next stop,\nto the one before where it was the last, and to the board where none is\nleft. A focused card your page removes for its own reasons hands focus on\nthe same way, unless the reader has already moved focus somewhere else.\n\nThe board applies a move itself, because the card already exists. A\nconnection is a new element, and React discards an element the board adds to\nits markup on the next render, so you write the connection.\n\n**`edgeRoute` draws the connections' lines your own way**: a function from\nwhere a line leaves and arrives, and the sides it does, to its SVG path, for\na route such as one that bends around the cards between. What it returns\nis the line drawn, the line pressed and focused, and the one an arrowhead\nsits at the end of. Nothing back draws the board's own.\n\nAdd `minimap` to `controls` for a picture of the whole board in a corner:\neach card as a box, and a frame around what is on screen. A press or a drag\non it brings that place to the middle of the view. It is for a pointer, and\na screen reader skips it: the arrow keys and `show()` reach every card.\n\nCards and connections are `helix-canvas-node` and `helix-canvas-edge`\nelements, so they are in the served markup whichever renderer wrote them. The\nlibrary fetches nothing, and an array passed to an element is missing from\nthe first paint of a server-rendered React page. `fromJsonCanvas` turns a\nJSON Canvas document into their props, and `toJsonCanvas()` writes a board\nback out.",
15634
15775
  "name": "HelixHeadlessCanvas",
15635
15776
  "cssProperties": [
15636
15777
  {
@@ -15707,6 +15848,18 @@
15707
15848
  "description": "The box a Shift-drag across the empty board draws, which selects the cards it touches.",
15708
15849
  "name": "marquee"
15709
15850
  },
15851
+ {
15852
+ "description": "The picture of the whole board, under `controls=\"minimap\"`.",
15853
+ "name": "minimap"
15854
+ },
15855
+ {
15856
+ "description": "One card in the minimap.",
15857
+ "name": "minimap-node"
15858
+ },
15859
+ {
15860
+ "description": "The frame in the minimap around what is on screen.",
15861
+ "name": "minimap-view"
15862
+ },
15710
15863
  {
15711
15864
  "description": "The button that moves the board down.",
15712
15865
  "name": "pan-down"
@@ -15919,6 +16072,14 @@
15919
16072
  "words": true
15920
16073
  }
15921
16074
  },
16075
+ {
16076
+ "kind": "field",
16077
+ "name": "edgeRoute",
16078
+ "type": {
16079
+ "text": "CanvasRoute | undefined"
16080
+ },
16081
+ "description": "Draws every connection's line: a function from where it leaves and\narrives, and the sides it does, to its SVG path and where its label sits.\n\nAbsent, or returning nothing for a connection, draws the board's own\nroute. A function that throws draws the board's own too, and the error is\nreported to the page as an uncaught one. Set it as a property."
16082
+ },
15922
16083
  {
15923
16084
  "kind": "field",
15924
16085
  "name": "fallbackLabel",
@@ -17118,6 +17279,49 @@
17118
17279
  ],
17119
17280
  "description": "The line a connection is drawn along on the plane, and its middle, where\nboth its cards are on the board; nothing where either is not."
17120
17281
  },
17282
+ {
17283
+ "kind": "method",
17284
+ "name": "draw",
17285
+ "privacy": "private",
17286
+ "return": {
17287
+ "type": {
17288
+ "text": "{ d: string; mid: { x: number; y: number } }"
17289
+ }
17290
+ },
17291
+ "parameters": [
17292
+ {
17293
+ "name": "edge",
17294
+ "type": {
17295
+ "text": "CanvasEdge"
17296
+ }
17297
+ },
17298
+ {
17299
+ "name": "from",
17300
+ "type": {
17301
+ "text": "CanvasNode"
17302
+ }
17303
+ },
17304
+ {
17305
+ "name": "to",
17306
+ "type": {
17307
+ "text": "CanvasNode"
17308
+ }
17309
+ },
17310
+ {
17311
+ "name": "path",
17312
+ "type": {
17313
+ "text": "CanvasPath"
17314
+ }
17315
+ },
17316
+ {
17317
+ "name": "drawnHeads",
17318
+ "type": {
17319
+ "text": "{ start: boolean; end: boolean }"
17320
+ }
17321
+ }
17322
+ ],
17323
+ "description": "One connection's line, by `edgeRoute` where it draws one, and by the board's own where not."
17324
+ },
17121
17325
  {
17122
17326
  "kind": "method",
17123
17327
  "name": "cardOf",
@@ -18411,6 +18615,44 @@
18411
18615
  ],
18412
18616
  "description": "The connection being made, drawn from where it starts to the pointer, or to\nthe card a keyboard reader is on."
18413
18617
  },
18618
+ {
18619
+ "kind": "field",
18620
+ "name": "onScreen",
18621
+ "type": {
18622
+ "text": "{ x: number; y: number; width: number; height: number }"
18623
+ },
18624
+ "privacy": "private",
18625
+ "description": "The part of the document on screen, in its own units.",
18626
+ "readonly": true
18627
+ },
18628
+ {
18629
+ "kind": "field",
18630
+ "name": "minimapArea",
18631
+ "type": {
18632
+ "text": "{ x: number; y: number; width: number; height: number }"
18633
+ },
18634
+ "privacy": "private",
18635
+ "description": "What the minimap shows: every card and what is on screen, with room around them.",
18636
+ "readonly": true
18637
+ },
18638
+ {
18639
+ "kind": "field",
18640
+ "name": "handleMinimapPointer",
18641
+ "privacy": "private",
18642
+ "readonly": true,
18643
+ "description": "A press or a drag on the minimap, which brings the place under it to the\nmiddle of the view.\n\n**The point is read through the picture's own scale**: the area is drawn\nwhole and centered in the box, so the box's spare width or height is split\neither side of it."
18644
+ },
18645
+ {
18646
+ "kind": "method",
18647
+ "name": "renderMinimap",
18648
+ "privacy": "private",
18649
+ "return": {
18650
+ "type": {
18651
+ "text": "TemplateResult | typeof nothing"
18652
+ }
18653
+ },
18654
+ "description": "The minimap, under `controls=\"minimap\"`: each card as a box, and a frame\naround what is on screen.\n\n**A picture for a pointer**, hidden from screen readers and taking no\nfocus, as a map's own overview is: the arrow keys and `show()` already take\na keyboard to any card, and a second way that says nothing a reader can\nuse would be a stop that does nothing."
18655
+ },
18414
18656
  {
18415
18657
  "kind": "field",
18416
18658
  "name": "controls",
@@ -20095,6 +20337,22 @@
20095
20337
  "module": "./canvas-document.js"
20096
20338
  }
20097
20339
  },
20340
+ {
20341
+ "kind": "js",
20342
+ "name": "CanvasRoute",
20343
+ "declaration": {
20344
+ "name": "CanvasRoute",
20345
+ "module": "./canvas-document.js"
20346
+ }
20347
+ },
20348
+ {
20349
+ "kind": "js",
20350
+ "name": "CanvasRouteEnds",
20351
+ "declaration": {
20352
+ "name": "CanvasRouteEnds",
20353
+ "module": "./canvas-document.js"
20354
+ }
20355
+ },
20098
20356
  {
20099
20357
  "kind": "js",
20100
20358
  "name": "CanvasSide",
@@ -25806,7 +26064,35 @@
25806
26064
  }
25807
26065
  }
25808
26066
  ],
25809
- "description": "Moves focus to turn `at`, drawing it first where the transcript is\nwindowed and it is not drawn.\n\n**A turn takes focus only once a reader moves to it**, so the\n`tabindex=\"-1\"` a turn written as a child needs is written then, long\nafter any server's markup has hydrated, and never on a turn nobody moved\nto."
26067
+ "description": "Moves focus to turn `at`, drawing it first where the transcript is\nwindowed and it is not drawn.\n\n**A turn takes focus only once a reader moves to it**, so the `tabindex`\nit needs is written then, long after any server's markup has hydrated,\nand never on a turn nobody moved to."
26068
+ },
26069
+ {
26070
+ "kind": "field",
26071
+ "name": "stop",
26072
+ "type": {
26073
+ "text": "HTMLElement | undefined"
26074
+ },
26075
+ "privacy": "private",
26076
+ "description": "The turn that is a tab stop because a reader moved to it."
26077
+ },
26078
+ {
26079
+ "kind": "method",
26080
+ "name": "visit",
26081
+ "privacy": "private",
26082
+ "return": {
26083
+ "type": {
26084
+ "text": "void"
26085
+ }
26086
+ },
26087
+ "parameters": [
26088
+ {
26089
+ "name": "turn",
26090
+ "type": {
26091
+ "text": "HTMLElement"
26092
+ }
26093
+ }
26094
+ ],
26095
+ "description": "Focuses a turn, making it the transcript's one stop a reader moved to.\n\n**`0`, and never `-1`.** Chromium leaves the whole of a shadow host at a\nnegative `tabindex` out of the Tab order, its own controls and what is\nslotted into it alike, so a turn at `-1` lost its links and its Try again\nonce a reader had paged through it. The stop moves with the reader, and a\n`tabindex` you wrote on a turn is left as it is."
25810
26096
  },
25811
26097
  {
25812
26098
  "kind": "method",
@@ -30545,6 +30831,30 @@
30545
30831
  ],
30546
30832
  "description": "The files in a unified diff, each with its hunks.\n\n**A hunk is read to the counts its header states**, `@@ -12,7 +12,8"
30547
30833
  },
30834
+ {
30835
+ "kind": "function",
30836
+ "name": "changedWords",
30837
+ "return": {
30838
+ "type": {
30839
+ "text": "[DiffPiece[], DiffPiece[]] | undefined"
30840
+ }
30841
+ },
30842
+ "parameters": [
30843
+ {
30844
+ "name": "before",
30845
+ "type": {
30846
+ "text": "string"
30847
+ }
30848
+ },
30849
+ {
30850
+ "name": "after",
30851
+ "type": {
30852
+ "text": "string"
30853
+ }
30854
+ }
30855
+ ],
30856
+ "description": "The runs of two paired lines that the other line does not have, by the\nlongest run of words they share in order.\n\n**Space between two changes is part of the change**, so \"a b\" replaced by\n\"c d\" is one run, with no gap for the eye to bridge. Two lines\nthat share no word share nothing worth marking: the whole line is the\nchange, which its own wash already says, and `undefined` draws it whole."
30857
+ },
30548
30858
  {
30549
30859
  "kind": "function",
30550
30860
  "name": "pairLines",
@@ -30562,6 +30872,30 @@
30562
30872
  }
30563
30873
  ],
30564
30874
  "description": "A hunk's lines paired for a side-by-side view.\n\nContext sits on both sides. A run of removals followed by a run of additions\nis one change, and its lines are paired in order, the longer run's remainder\nstanding opposite nothing: that is what lets the eye read a changed line\nacross rather than hunting for it further down."
30875
+ },
30876
+ {
30877
+ "kind": "function",
30878
+ "name": "foldContext",
30879
+ "return": {
30880
+ "type": {
30881
+ "text": "DiffRun[]"
30882
+ }
30883
+ },
30884
+ "parameters": [
30885
+ {
30886
+ "name": "lines",
30887
+ "type": {
30888
+ "text": "DiffLine[]"
30889
+ }
30890
+ },
30891
+ {
30892
+ "name": "keep",
30893
+ "type": {
30894
+ "text": "number"
30895
+ }
30896
+ }
30897
+ ],
30898
+ "description": "A hunk's lines with each long run of unchanged lines folded, keeping `keep`\nlines on the side of each change, as a code host draws a diff with more\ncontext than a reader needs.\n\nA fold hides two lines or more: a control in place of one line is no\nshorter than the line."
30565
30899
  }
30566
30900
  ],
30567
30901
  "exports": [
@@ -30573,6 +30907,14 @@
30573
30907
  "module": "src/code-block/patch.ts"
30574
30908
  }
30575
30909
  },
30910
+ {
30911
+ "kind": "js",
30912
+ "name": "changedWords",
30913
+ "declaration": {
30914
+ "name": "changedWords",
30915
+ "module": "src/code-block/patch.ts"
30916
+ }
30917
+ },
30576
30918
  {
30577
30919
  "kind": "js",
30578
30920
  "name": "pairLines",
@@ -30580,6 +30922,14 @@
30580
30922
  "name": "pairLines",
30581
30923
  "module": "src/code-block/patch.ts"
30582
30924
  }
30925
+ },
30926
+ {
30927
+ "kind": "js",
30928
+ "name": "foldContext",
30929
+ "declaration": {
30930
+ "name": "foldContext",
30931
+ "module": "src/code-block/patch.ts"
30932
+ }
30583
30933
  }
30584
30934
  ]
30585
30935
  },
@@ -30589,7 +30939,7 @@
30589
30939
  "declarations": [
30590
30940
  {
30591
30941
  "kind": "class",
30592
- "description": "Renders a `<pre><code>` pair: `pre` keeps the whitespace, and `code` marks it\nas code. Long lines scroll inside the block and do not wrap, because a line\nbreak can be significant in code.\n\nA copy button is on by default. Set `no-copy` to remove it. The button copies\nthe slotted text, so there is no second copy of the code to keep in sync.\n\nFor a fragment of code inside a sentence, use `Code`.\n\nSet `line-numbers` to number the lines in a gutter beside the code, hidden\nfrom the accessibility tree and left out of a copy. Set `mark-lines` to\nmark lines a reader should look at, such as `2, 4-6`: the block draws a\nband behind each run, placed where the lines are laid out, so it follows a\nhighlighter's markup and lines that wrap. Set `wrap` to wrap long lines\nrather than scroll them; a gutter then numbers each line where it starts.\nSet `wrappable` for a button in the header that turns `wrap` on and off,\npressed while the lines wrap.\n\nThe header holds the name, the `actions` slot, and the copy button. Slot a\ncontrol into `actions`, such as a button that sets `wrap` or one that opens\nthe code in an editor, and the block draws a header for it even with no\nname. `copy-icon` and `copied-icon` replace the copy button's two icons. Set `highlight` to a\nfunction that turns the code into highlighted markup, such as one wrapping\nShiki or Prism, and the block draws what it returns; it is handed the\nblock's `language`, so one function serves every block. The code stays in\nthe slot, so the copy button and the page's own text are the code as\nwritten.\n\nSet `expandable` on a block whose height is capped, such as by\n`--code-block-max-block-size`, and a button under it shows every line and\nthen fewer again, as a docs site's long example does. The button is drawn\nonly while the cap hides something, says whether the block is expanded with\n`aria-expanded`, names the block it opens with `aria-controls`, and the block\ncarries `:state(expanded)` while it is.\n\nSet `diff` to show a change. Put a unified diff, the output of `git diff` or\n`diff -u`, in the same slot, and the block draws the lines it added and\nremoved. The block never computes a diff itself. Line numbers come from the\nhunk headers and are hidden from the accessibility tree. Changed lines are\n`<ins>` and `<del>` with the `+` and `-` kept as text, so the change does not\ndepend on color. Each file in the patch is its own block under its own name,\nand its copy button copies the new version of the file. `variant=\"split\"`\nshows the old version beside the new, each removal opposite its replacement.\n\n**A block that scrolls is a tab stop.** While its lines run past its width or\nits cap, the scroller is a region named for the block, such as \"Code,\napp.ts\", that Tab reaches, so a keyboard scrolls it with the arrow keys in\nevery browser. Chromium and Firefox make a scrolling box focusable on their\nown, and Safari does not. A block that fits is no stop at all.\n\n**The code the block draws is marked untranslated**, `translate=\"no\"` on\nits `<pre>`, so a page translator leaves highlighted lines and a diff as\nwritten. Code in the slot takes its translation mode from the element, which\nwrites nothing onto itself, so set `translate=\"no\"` on the element to keep a\ntranslator off plain code too.\n\nOn the server, the slot renders as ordinary code, so a diff first appears as\nthe patch text in a `<pre>`. The client makes the same first render, which\nkeeps hydration clean, and draws the diff once it can read the content. Diff\nmode is experimental. The rest of the family is stable.",
30942
+ "description": "Renders a `<pre><code>` pair: `pre` keeps the whitespace, and `code` marks it\nas code. Long lines scroll inside the block and do not wrap, because a line\nbreak can be significant in code.\n\nA copy button is on by default. Set `no-copy` to remove it. The button copies\nthe slotted text, so there is no second copy of the code to keep in sync.\n\nFor a fragment of code inside a sentence, use `Code`.\n\nSet `line-numbers` to number the lines in a gutter beside the code, hidden\nfrom the accessibility tree and left out of a copy. Set `mark-lines` to\nmark lines a reader should look at, such as `2, 4-6`: the block draws a\nband behind each run, placed where the lines are laid out, so it follows a\nhighlighter's markup and lines that wrap. Set `wrap` to wrap long lines\nrather than scroll them; a gutter then numbers each line where it starts.\nSet `wrappable` for a button in the header that turns `wrap` on and off,\npressed while the lines wrap.\n\nThe header holds the name, the `actions` slot, and the copy button. Slot a\ncontrol into `actions`, such as a button that sets `wrap` or one that opens\nthe code in an editor, and the block draws a header for it even with no\nname. `copy-icon` and `copied-icon` replace the copy button's two icons. Set `highlight` to a\nfunction that turns the code into highlighted markup, such as one wrapping\nShiki or Prism, and the block draws what it returns; it is handed the\nblock's `language`, so one function serves every block. The code stays in\nthe slot, so the copy button and the page's own text are the code as\nwritten.\n\nSet `expandable` on a block whose height is capped, such as by\n`--code-block-max-block-size`, and a button under it shows every line and\nthen fewer again, as a docs site's long example does. The button is drawn\nonly while the cap hides something, says whether the block is expanded with\n`aria-expanded`, names the block it opens with `aria-controls`, and the block\ncarries `:state(expanded)` while it is.\n\nSet `diff` to show a change. Put a unified diff, the output of `git diff` or\n`diff -u`, in the same slot, and the block draws the lines it added and\nremoved. The block never computes a diff itself. Line numbers come from the\nhunk headers and are hidden from the accessibility tree. Changed lines are\n`<ins>` and `<del>` with the `+` and `-` kept as text, so the change does not\ndepend on color. Where a removed line is paired with the added line that\nreplaced it, the words each does not share with the other are the `changed`\npart, so the eye goes to what changed within the line. Each file in the patch is its own block under its own name,\nand its copy button copies the new version of the file. `variant=\"split\"`\nshows the old version beside the new, each removal opposite its replacement.\n`context-lines` folds each long run of unchanged lines, keeping that many\nbeside each change, behind a button that shows them and hides them again,\nas a code host draws a diff written with more context than a reader needs.\n\n**A block that scrolls is a tab stop.** While its lines run past its width or\nits cap, the scroller is a region named for the block, such as \"Code,\napp.ts\", that Tab reaches, so a keyboard scrolls it with the arrow keys in\nevery browser. Chromium and Firefox make a scrolling box focusable on their\nown, and Safari does not. A block that fits is no stop at all.\n\n**The code the block draws is marked untranslated**, `translate=\"no\"` on\nits `<pre>`, so a page translator leaves highlighted lines and a diff as\nwritten. Code in the slot takes its translation mode from the element, which\nwrites nothing onto itself, so set `translate=\"no\"` on the element to keep a\ntranslator off plain code too.\n\nOn the server, the slot renders as ordinary code, so a diff first appears as\nthe patch text in a `<pre>`. The client makes the same first render, which\nkeeps hydration clean, and draws the diff once it can read the content. Diff\nmode is experimental. The rest of the family is stable.",
30593
30943
  "name": "HelixHeadlessCodeBlock",
30594
30944
  "cssProperties": [
30595
30945
  {
@@ -30622,6 +30972,10 @@
30622
30972
  "description": "The scrolling `<pre>`.",
30623
30973
  "name": "block"
30624
30974
  },
30975
+ {
30976
+ "description": "In a diff, the words of a changed line that the line opposite it does not have, inside its `text`.",
30977
+ "name": "changed"
30978
+ },
30625
30979
  {
30626
30980
  "description": "The `<code>` inside it.",
30627
30981
  "name": "code"
@@ -30706,6 +31060,10 @@
30706
31060
  "description": "In a split diff, the empty row opposite a line the other side does not have.",
30707
31061
  "name": "filler"
30708
31062
  },
31063
+ {
31064
+ "description": "In a diff with `context-lines`, the button that shows a folded run of unchanged lines, and hides it again, saying which with `aria-expanded`.",
31065
+ "name": "fold"
31066
+ },
30709
31067
  {
30710
31068
  "description": "The code, and the copy button beside it where there is no header.",
30711
31069
  "name": "frame"
@@ -30831,6 +31189,15 @@
30831
31189
  "words": true
30832
31190
  }
30833
31191
  },
31192
+ {
31193
+ "kind": "field",
31194
+ "name": "contextLines",
31195
+ "type": {
31196
+ "text": "number | undefined"
31197
+ },
31198
+ "description": "In a diff, how many unchanged lines to keep beside each change. Each\nlonger run of unchanged lines is folded behind a button that shows it.\nUnset shows every line the diff holds.",
31199
+ "attribute": "context-lines"
31200
+ },
30834
31201
  {
30835
31202
  "kind": "field",
30836
31203
  "name": "copiedLabel",
@@ -30904,6 +31271,19 @@
30904
31271
  "words": true
30905
31272
  }
30906
31273
  },
31274
+ {
31275
+ "kind": "field",
31276
+ "name": "hideUnchangedLabel",
31277
+ "type": {
31278
+ "text": "string"
31279
+ },
31280
+ "default": "'{count, plural, one {Hide # unchanged line} other {Hide # unchanged lines}}'",
31281
+ "description": "The words of a button that hides a run of unchanged lines it showed, in a\ndiff with `context-lines`. `{count}` is how many, and each language\nwrites the forms it has.",
31282
+ "attribute": "hide-unchanged-label",
31283
+ "helix": {
31284
+ "words": true
31285
+ }
31286
+ },
30907
31287
  {
30908
31288
  "kind": "field",
30909
31289
  "name": "highlight",
@@ -30964,6 +31344,19 @@
30964
31344
  "attribute": "no-copy",
30965
31345
  "reflects": true
30966
31346
  },
31347
+ {
31348
+ "kind": "field",
31349
+ "name": "showUnchangedLabel",
31350
+ "type": {
31351
+ "text": "string"
31352
+ },
31353
+ "default": "'{count, plural, one {Show # unchanged line} other {Show # unchanged lines}}'",
31354
+ "description": "The words of a button that shows a folded run of unchanged lines, in a\ndiff with `context-lines`. `{count}` is how many.",
31355
+ "attribute": "show-unchanged-label",
31356
+ "helix": {
31357
+ "words": true
31358
+ }
31359
+ },
30967
31360
  {
30968
31361
  "kind": "field",
30969
31362
  "name": "variant",
@@ -31039,6 +31432,68 @@
31039
31432
  "description": "The files in the content, when it is a diff and it can be read yet.",
31040
31433
  "readonly": true
31041
31434
  },
31435
+ {
31436
+ "kind": "field",
31437
+ "name": "unfolded",
31438
+ "privacy": "private",
31439
+ "readonly": true,
31440
+ "default": "new Set<string>()",
31441
+ "description": "The folds a reader opened, by file, hunk and the line each starts at."
31442
+ },
31443
+ {
31444
+ "kind": "method",
31445
+ "name": "runsOf",
31446
+ "privacy": "private",
31447
+ "return": {
31448
+ "type": {
31449
+ "text": "DiffRun[]"
31450
+ }
31451
+ },
31452
+ "parameters": [
31453
+ {
31454
+ "name": "hunk",
31455
+ "type": {
31456
+ "text": "DiffHunk"
31457
+ }
31458
+ }
31459
+ ],
31460
+ "description": "A hunk's lines in runs, folded where `context-lines` asks."
31461
+ },
31462
+ {
31463
+ "kind": "method",
31464
+ "name": "renderFold",
31465
+ "privacy": "private",
31466
+ "return": {
31467
+ "type": {
31468
+ "text": "TemplateResult"
31469
+ }
31470
+ },
31471
+ "parameters": [
31472
+ {
31473
+ "name": "run",
31474
+ "type": {
31475
+ "text": "DiffRun"
31476
+ }
31477
+ },
31478
+ {
31479
+ "name": "key",
31480
+ "type": {
31481
+ "text": "string"
31482
+ }
31483
+ },
31484
+ {
31485
+ "name": "line",
31486
+ "type": {
31487
+ "text": "(one: DiffLine) => TemplateResult"
31488
+ }
31489
+ },
31490
+ {
31491
+ "name": "hidden",
31492
+ "default": "false"
31493
+ }
31494
+ ],
31495
+ "description": "The button over a folded run, and the run once it is open.\n\nA disclosure, so focus stays on the button as the lines appear under it.\nThe new side of a split diff draws the same words hidden from the\naccessibility tree, there to keep the rows level and to answer a press."
31496
+ },
31042
31497
  {
31043
31498
  "kind": "field",
31044
31499
  "name": "text",
@@ -31383,6 +31838,12 @@
31383
31838
  "type": {
31384
31839
  "text": "number"
31385
31840
  }
31841
+ },
31842
+ {
31843
+ "name": "at",
31844
+ "type": {
31845
+ "text": "number"
31846
+ }
31386
31847
  }
31387
31848
  ],
31388
31849
  "description": "The old version beside the new one, row for row.\n\nThe new side's hunk headers are hidden from the accessibility tree, being\nthe old side's text again and there only to keep the rows level."
@@ -31792,6 +32253,14 @@
31792
32253
  "description": "The expand button's words while the block shows every line.",
31793
32254
  "fieldName": "collapseLabel"
31794
32255
  },
32256
+ {
32257
+ "name": "context-lines",
32258
+ "type": {
32259
+ "text": "number | undefined"
32260
+ },
32261
+ "description": "In a diff, how many unchanged lines to keep beside each change. Each\nlonger run of unchanged lines is folded behind a button that shows it.\nUnset shows every line the diff holds.",
32262
+ "fieldName": "contextLines"
32263
+ },
31795
32264
  {
31796
32265
  "name": "copied-label",
31797
32266
  "type": {
@@ -31846,6 +32315,15 @@
31846
32315
  "description": "The expand button's words while the cap hides lines.",
31847
32316
  "fieldName": "expandLabel"
31848
32317
  },
32318
+ {
32319
+ "name": "hide-unchanged-label",
32320
+ "type": {
32321
+ "text": "string"
32322
+ },
32323
+ "default": "'{count, plural, one {Hide # unchanged line} other {Hide # unchanged lines}}'",
32324
+ "description": "The words of a button that hides a run of unchanged lines it showed, in a\ndiff with `context-lines`. `{count}` is how many, and each language\nwrites the forms it has.",
32325
+ "fieldName": "hideUnchangedLabel"
32326
+ },
31849
32327
  {
31850
32328
  "name": "label",
31851
32329
  "type": {
@@ -31891,6 +32369,15 @@
31891
32369
  "description": "Whether to leave the copy button off.\n\nNegative, which is not a style choice. A boolean attribute is true whenever\nit is *present*, so a `copyable` defaulting to true could never be turned\noff from markup: `copyable=\"false\"` is the string \"false\", which is\npresent, which is true. Measured, and it is why this is named the other way\nround. The platform already writes booleans like this for the same reason,\n`novalidate` and `nomodule` and `noreferrer` among them.\n\n**Reflected, because the gutter is a stylesheet rule.** A sheet reserves\nthe copy button's width with `:host(:not([no-copy]))`, so the attribute is\nwhat decides whether the block pays for a control. Unreflected, setting it\nfrom script takes the button away (`render` reads the property) and leaves\nthe 40px it stood in reserved.\n\nA false boolean reflects as the attribute's absence, so this costs no\n`no-copy=\"\"` on hosts that never asked for one, and the rule about a\nreflected property taking no default is satisfied by the default being\n`false`.",
31892
32370
  "fieldName": "noCopy"
31893
32371
  },
32372
+ {
32373
+ "name": "show-unchanged-label",
32374
+ "type": {
32375
+ "text": "string"
32376
+ },
32377
+ "default": "'{count, plural, one {Show # unchanged line} other {Show # unchanged lines}}'",
32378
+ "description": "The words of a button that shows a folded run of unchanged lines, in a\ndiff with `context-lines`. `{count}` is how many.",
32379
+ "fieldName": "showUnchangedLabel"
32380
+ },
31894
32381
  {
31895
32382
  "name": "variant",
31896
32383
  "type": {
@@ -35219,7 +35706,7 @@
35219
35706
  "declarations": [
35220
35707
  {
35221
35708
  "kind": "class",
35222
- "description": "The picker on its own, with no field around it, for a settings pane or a\ntoolbar. Color Input shows this element in a panel behind a text field.\n\nThe saturation and brightness square is two `<input type=\"range\">` elements,\nlaid over the square and made invisible, and the handle is drawn from their\nvalues. The keyboard behavior, the announcements, and the touch targets come\nfrom the platform, and there is no `role=\"application\"`.\n\nThe picker works in HSB and derives the value from it. A value set from\noutside is read into the model once. Black is `brightness: 0`, which has no\nhue or saturation, so a model read back from the value would turn red into\ngray after you drag to the bottom of the square and back.\n\nThe square is one tab stop. In it, the up and down arrows move brightness\nand the left and right arrows move saturation, and PageUp and PageDown move\nbrightness by ten. The picker sends `input` as the color moves and `change`\nwhen a drag, a key, a typed value or a preset settles it, as\n`<input type=\"color\">` does.\n\nA screen reader hears the color's name, such as \"vibrant red\", after the two\nnumbers on the square and after the number on the hue ramp, and each preset\nis named by its color. The opacity ramp is heard as a percentage. Set\n`color-words` to speak the names in another language.\n\n`label` names the picker, which is then a group with that name, and the\nsquare's ramps say it before their own, as \"Brand, Saturation\". `hint`\nwrites help under the picker, which the square, the ramps and the value\nfield are described by. Inside Color Input the field carries both.\n\nThe presets are a listbox with the current color selected, and one tab\nstop. The arrow keys move between them, Home and End go to the ends, and\nEnter, Space or a press chooses one.",
35709
+ "description": "The picker on its own, with no field around it, for a settings pane or a\ntoolbar. Color Input shows this element in a panel behind a text field.\n\nThe saturation and brightness square is two `<input type=\"range\">` elements,\nlaid over the square and made invisible, and the handle is drawn from their\nvalues. The keyboard behavior, the announcements, and the touch targets come\nfrom the platform, and there is no `role=\"application\"`.\n\nThe picker works in HSB and derives the value from it. A value set from\noutside is read into the model once. Black is `brightness: 0`, which has no\nhue or saturation, so a model read back from the value would turn red into\ngray after you drag to the bottom of the square and back.\n\nThe square is one tab stop. In it, the up and down arrows move brightness\nand the left and right arrows move saturation, by ten with Shift. PageUp and\nPageDown move brightness by ten, and Home and End move saturation by ten,\nturned on a right-to-left page as the arrows are, as React Aria's ColorArea\ndoes. The picker sends `input` as the color moves and `change`\nwhen a drag, a key, a typed value or a preset settles it, as\n`<input type=\"color\">` does.\n\nA screen reader hears the color's name, such as \"vibrant red\", after the two\nnumbers on the square and after the number on the hue ramp, and each preset\nis named by its color. The opacity ramp is heard as a percentage. Set\n`color-words` to speak the names in another language.\n\n`label` names the picker, which is then a group with that name, and the\nsquare's ramps say it before their own, as \"Brand, Saturation\". `hint`\nwrites help under the picker, which the square, the ramps and the value\nfield are described by. Inside Color Input the field carries both.\n\nThe presets are a listbox with the current color selected, and one tab\nstop. The arrow keys move between them, Home and End go to the ends, and\nEnter, Space or a press chooses one.",
35223
35710
  "name": "HelixHeadlessColorPicker",
35224
35711
  "cssProperties": [
35225
35712
  {
@@ -36127,7 +36614,7 @@
36127
36614
  "name": "handleAreaKeydown",
36128
36615
  "privacy": "private",
36129
36616
  "readonly": true,
36130
- "description": "Moves the square from the keyboard, both axes from either of its inputs.\n\nThe square is two native ranges, and a native range maps every arrow to\nits own one axis: on the saturation input, ArrowUp moved the handle\nsideways. Here the vertical keys move brightness and the horizontal keys\nmove saturation, turned on a right-to-left page as the pointer is, which is\nwhat React Aria's ColorArea does."
36617
+ "description": "Moves the square from the keyboard, both axes from either of its inputs.\n\nThe square is two native ranges, and a native range maps every arrow to\nits own one axis: on the saturation input, ArrowUp moved the handle\nsideways. Here the vertical keys move brightness and the horizontal keys\nmove saturation, turned on a right-to-left page as the pointer is, which is\nwhat React Aria's ColorArea does. Shift makes an arrow a step of ten, and\nHome and End are saturation's steps of ten, as PageUp and PageDown are\nbrightness's."
36131
36618
  },
36132
36619
  {
36133
36620
  "kind": "method",
@@ -37971,7 +38458,7 @@
37971
38458
  "declarations": [
37972
38459
  {
37973
38460
  "kind": "class",
37974
- "description": "The list is a `Listbox`, which handles filtering, the empty state, the\nhighlight, `aria-activedescendant`, and scrolling an option into view. This\nelement handles the field, the panel, and the communication between them.\n\nThe typed text and the value are separate. The text is a filter: it narrows\nthe list and is then discarded. The value is the option you choose, and the\nfield then shows that option's text. The filter clears on close, so a\nreopened combobox starts from the whole list.\n\nFocus stays in the text field. The arrow keys move through the list with the\nlistbox's public `navigate` method. As typing narrows the list, a screen\nreader hears how many options are left, such as \"3 results\". Emptying the\nfield and leaving it clears a single choice.\n\n**Keyboard.**\n\n| Key | What it does |\n|---|---|\n| Down, Up | On a closed field, opens the list on the chosen option, or the first or the last. In the open list, moves the highlight, round from the last option to the first. |\n| Page Down, Page Up | In the open list, moves the highlight by as many options as the list shows at once. |\n| Enter | Chooses the highlighted option. With nothing left in the list, creates what was typed with `creatable`, or takes it with `allows-custom-value`. On a closed field, submits the form. |\n| Escape | Closes the list and puts the chosen words back. On a closed field, a second Escape clears a single choice. |\n| Tab | Closes the list and moves on. |\n| Backspace | With `multiple`, on an empty field, removes the last tag. |\n| Left | With `multiple`, with the caret at the start of the text, moves to the last tag's remove button. Right on a right-to-left page. |\n| Left, Right on a tag | Move between the tags, and past the last back to the text. |\n| Delete, Backspace on a tag | Removes the tag. |\n| Space, Home, End, letters | Edit the text. |\n\n**ARIA.** The input is the `combobox`, named by the label, with\n`aria-expanded`, `aria-controls` naming the list, `aria-autocomplete`\n(`both` with `suggest`, `list` otherwise) and `aria-activedescendant` on\nthe highlighted option. The list is the listbox `Listbox` describes.\n\nOn Apple devices, where VoiceOver does not read the option the field points\nto, the field says it in a live region as the highlight moves, says how many\noptions there are as the list opens, and says a choice once it is made, as\nReact Aria's combobox does there.\n\nSet `autocomplete` to let a browser's autofill choose an option.\n\nWith `multiple`, each chosen option is a tag in the field with its own remove\ncontrol. The text is the field's one tab stop, and the arrow keys reach the\ntags from it. The panel stays open and the filter clears after each choice, so the\nnext choice starts from the whole list.\n\nWith `creatable`, the combobox offers a create row and fires `helix-create`.\nIt does not add the option. The options are your light DOM, and your\nframework would re-render over an element the combobox inserted, so add the\noption in your event handler.",
38461
+ "description": "The list is a `Listbox`, which handles filtering, the empty state, the\nhighlight, `aria-activedescendant`, and scrolling an option into view. This\nelement handles the field, the panel, and the communication between them.\n\nThe typed text and the value are separate. The text is a filter: it narrows\nthe list and is then discarded. The value is the option you choose, and the\nfield then shows that option's text. The filter clears on close, so a\nreopened combobox starts from the whole list.\n\nFocus stays in the text field. The arrow keys move through the list with the\nlistbox's public `navigate` method. As typing narrows the list, a screen\nreader hears how many options are left, such as \"3 results\". Emptying the\nfield and leaving it clears a single choice.\n\n**Keyboard.**\n\n| Key | What it does |\n|---|---|\n| Down, Up | On a closed field, opens the list on the chosen option, or the first or the last. In the open list, moves the highlight, round from the last option to the first. |\n| Alt with Down, Alt with Up | Opens the list without moving the highlight, and closes it, choosing nothing. |\n| Page Down, Page Up | In the open list, moves the highlight by as many options as the list shows at once. |\n| Enter | Chooses the highlighted option. With nothing left in the list, creates what was typed with `creatable`, or takes it with `allows-custom-value`. On a closed field, submits the form. |\n| Escape | Closes the list and puts the chosen words back. On a closed field, a second Escape clears a single choice. |\n| Tab | Closes the list and moves on. |\n| Backspace | With `multiple`, on an empty field, removes the last tag. |\n| Left | With `multiple`, with the caret at the start of the text, moves to the last tag's remove button. Right on a right-to-left page. |\n| Left, Right on a tag | Move between the tags, and past the last back to the text. |\n| Delete, Backspace on a tag | Removes the tag. |\n| Space, Home, End, letters | Edit the text. |\n\n**ARIA.** The input is the `combobox`, named by the label, with\n`aria-expanded`, `aria-controls` naming the list, `aria-autocomplete`\n(`both` with `suggest`, `list` otherwise) and `aria-activedescendant` on\nthe highlighted option. The list is the listbox `Listbox` describes.\n\nOn Apple devices, where VoiceOver does not read the option the field points\nto, the field says it in a live region as the highlight moves, says how many\noptions there are as the list opens, and says a choice once it is made, as\nReact Aria's combobox does there.\n\nSet `autocomplete` to let a browser's autofill choose an option.\n\nWith `multiple`, each chosen option is a tag in the field with its own remove\ncontrol. The text is the field's one tab stop, and the arrow keys reach the\ntags from it. The panel stays open and the filter clears after each choice, so the\nnext choice starts from the whole list.\n\nWith `creatable`, the combobox offers a create row and fires `helix-create`.\nIt does not add the option. The options are your light DOM, and your\nframework would re-render over an element the combobox inserted, so add the\noption in your event handler.",
37975
38462
  "name": "HelixHeadlessCombobox",
37976
38463
  "cssParts": [
37977
38464
  {
@@ -48330,6 +48817,10 @@
48330
48817
  "description": "While `error-text` is set.",
48331
48818
  "name": "error"
48332
48819
  },
48820
+ {
48821
+ "description": "While `loading` is set, as the rows are on their way.",
48822
+ "name": "loading"
48823
+ },
48333
48824
  {
48334
48825
  "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
48335
48826
  "name": "settled",
@@ -65972,6 +66463,35 @@
65972
66463
  "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
65973
66464
  }
65974
66465
  },
66466
+ {
66467
+ "kind": "field",
66468
+ "name": "present",
66469
+ "type": {
66470
+ "text": "boolean"
66471
+ },
66472
+ "privacy": "protected",
66473
+ "description": "Whether the element is still on the page for a reader, which is what\nthe focus hand-off waits on: connected, for a surface the page removes.\nA surface that hides itself says it is gone once hidden, and calls\n`handFocusOn` then.",
66474
+ "readonly": true,
66475
+ "inheritedFrom": {
66476
+ "name": "MixinDismissible",
66477
+ "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
66478
+ }
66479
+ },
66480
+ {
66481
+ "kind": "method",
66482
+ "name": "handFocusOn",
66483
+ "privacy": "protected",
66484
+ "return": {
66485
+ "type": {
66486
+ "text": "void"
66487
+ }
66488
+ },
66489
+ "description": "Hands focus on now, where a dismissal is waiting for this element to\ngo: for a surface that hides itself, once it has.",
66490
+ "inheritedFrom": {
66491
+ "name": "MixinDismissible",
66492
+ "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
66493
+ }
66494
+ },
65975
66495
  {
65976
66496
  "kind": "method",
65977
66497
  "name": "dismiss",
@@ -101285,7 +101805,7 @@
101285
101805
  "declarations": [
101286
101806
  {
101287
101807
  "kind": "class",
101288
- "description": "Wraps a map drawn by MapLibre, Leaflet, or another renderer. The frame adds\na name for the map, a column of controls, and a strip for the map credit.\nHelix does not draw the map itself.\n\nThe controls are one column, and `controls` names which ones: `fullscreen`,\n`layers`, `tilt`, `zoom`, and `compass`, top to bottom. `zoom compass\nfullscreen` by default. The compass's needle points north as the map turns,\nand pressing it turns the map to face north.\n\nAdd `pan` and `rotate` for buttons around the compass that move and turn the\nmap. Dragging is otherwise the only way a pointer moves the map, so add them\nwhere the map has to be usable without dragging, as WCAG 2.2 asks at level\nAA. The arrow keys pan the map and Shift with Left or Right turns it either\nway.\n\nThe pan and zoom buttons and the arrow keys send `helix-map-pan` and\n`helix-map-zoom`. Move your map in response, or connect it with\n`connectMap` from `@fusion.dev/helix-map`, which does this for you.\n\nAdd `tilt` to `controls` for the 3D button, which a map with 3D buildings\nor terrain needs. It is a toggle. Pressed, it tilts the map 50 degrees, and\n`connectMap` raises the buildings and the ground. Pressed again, it makes the\nmap flat, and lays them flat too. Shift with Up or Down tilts the map in\nsteps. Turning and tilting send `helix-map-rotate` and `helix-map-tilt`,\nwhich `connectMap` answers on MapLibre. Leaflet draws maps flat and does not\nrotate.\n\nAdd `layers` to `controls` for a layers button. It opens a menu with a tile\nfor each layer, which sets the layer's `hidden` attribute. Layers with the\nsame `group`, such as a route and its dotted legs, share one tile. A tile\nsends `helix-before-toggle` from the layer first, so you can store the\nchoice or refuse it, and `helix-toggle` from it once `hidden` holds the\nchoice.\n\nImagery, a `helix-map-raster` with `ground`, is a map type and not a tile.\nThe menu opens with a card for each type, Standard, Hybrid, and Satellite,\nwith a picture of the map in it, and `map-type` says which is chosen.\nStandard hides the imagery, Hybrid draws it under the roads and names, and\nSatellite draws it alone. Choosing one sends `helix-before-change` with its\nname, and `change` once `map-type` holds it. `connectMap` does not draw a\nhidden layer, so a layer you write with `hidden` starts turned off.\n\nMarkers, routes, areas, live positions, and points layers go inside the\nframe as child elements.",
101808
+ "description": "Wraps a map drawn by MapLibre, Leaflet, or another renderer. The frame adds\na name for the map, a column of controls, and a strip for the map credit.\nHelix does not draw the map itself.\n\nThe controls are one column, and `controls` names which ones: `fullscreen`,\n`layers`, `tilt`, `zoom`, and `compass`, top to bottom. `zoom compass\nfullscreen` by default. The compass's needle points north as the map turns,\nand pressing it turns the map to face north.\n\nAdd `pan` and `rotate` for buttons around the compass that move and turn the\nmap. Dragging is otherwise the only way a pointer moves the map, so add them\nwhere the map has to be usable without dragging, as WCAG 2.2 asks at level\nAA. The arrow keys pan the map and Shift with Left or Right turns it either\nway.\n\nThe pan and zoom buttons and the arrow keys send `helix-map-pan` and\n`helix-map-zoom`. Move your map in response, or connect it with\n`connectMap` from `@fusion.dev/helix-map`, which does this for you.\n\nAdd `tilt` to `controls` for the 3D button, which a map with 3D buildings\nor terrain needs. It is a toggle. Pressed, it tilts the map 50 degrees, and\n`connectMap` raises the buildings and the ground. Pressed again, it makes the\nmap flat, and lays them flat too. Shift with Up or Down tilts the map in\nsteps. Turning and tilting send `helix-map-rotate` and `helix-map-tilt`,\nwhich `connectMap` answers on MapLibre. Leaflet draws maps flat and does not\nrotate.\n\nAdd `layers` to `controls` for a layers button. It opens a menu with a tile\nfor each layer, which sets the layer's `hidden` attribute. Layers with the\nsame `group`, such as a route and its dotted legs, share one tile. A tile\nsends `helix-before-toggle` from the layer first, so you can store the\nchoice or refuse it, and `helix-toggle` from it once `hidden` holds the\nchoice. Escape closes the menu and returns focus to its button, and the menu\ncloses when focus moves on from it or a press lands outside the map.\n\nImagery, a `helix-map-raster` with `ground`, is a map type and not a tile.\nThe menu opens with a card for each type, Standard, Hybrid, and Satellite,\nwith a picture of the map in it, and `map-type` says which is chosen.\nStandard hides the imagery, Hybrid draws it under the roads and names, and\nSatellite draws it alone. Choosing one sends `helix-before-change` with its\nname, and `change` once `map-type` holds it. `connectMap` does not draw a\nhidden layer, so a layer you write with `hidden` starts turned off.\n\nMarkers, routes, areas, live positions, and points layers go inside the\nframe as child elements.",
101289
101809
  "name": "HelixHeadlessMap",
101290
101810
  "cssProperties": [
101291
101811
  {
@@ -102068,6 +102588,13 @@
102068
102588
  "readonly": true,
102069
102589
  "description": "Closes the layers menu on a press anywhere outside the frame."
102070
102590
  },
102591
+ {
102592
+ "kind": "field",
102593
+ "name": "handleMenuFocusOut",
102594
+ "privacy": "private",
102595
+ "readonly": true,
102596
+ "description": "Closes the layers menu when focus moves on from its button and the menu,\nas a Tab past the last tile does. Focus leaving the page, with nothing\nfocused in its place, leaves the menu as it is."
102597
+ },
102071
102598
  {
102072
102599
  "kind": "field",
102073
102600
  "name": "handleMenuKeydown",
@@ -106768,7 +107295,7 @@
106768
107295
  "declarations": [
106769
107296
  {
106770
107297
  "kind": "class",
106771
- "description": "One element covers three kinds of row, and what you give it decides which:\n- Content in the `submenu` slot makes the row open a submenu page.\n- `checked` makes the row a choice.\n- With neither, the row is a command.\n\nThe role follows the kind. A row with `checked` is `menuitemcheckbox` with\n`aria-checked`, and `exclusive` makes it `menuitemradio`, for a set where\nonly one can be on. A row that opens a page keeps `menuitem` and sets\n`aria-haspopup`.\n\nChoosing a choice row checks or unchecks it before `helix-select` is sent,\nso a listener reads the new `checked`. An `exclusive` row turns on and turns\noff the `exclusive` rows next to it. Cancel `helix-before-toggle` to keep a\nrow as it is and set `checked` yourself.\n\nThe menu sets whether the row's page is showing as a property, never as an\nattribute. An attribute written onto your element after it upgrades causes a\nhydration mismatch.\n\n`shortcut` shows a row's keyboard shortcut after its label, drawn by `Kbd`\nin the platform's glyphs, and gives the row `aria-keyshortcuts`. It binds\nnothing: the shortcut is the page's to bind. Other trailing words, such as a\ncount, go in the `end` slot.\n\nThe row is named by its label alone. Words in `description`, a line under the\nlabel, and in `end` describe it instead, through `aria-describedby`, as\nReact Aria's menu item does with its description: a reader hears \"Copy\",\nthen \"Copies the selection\".\n\nA development build warns when a row has no words to be named by, such as a\nrow holding only an icon with no label.\n\nThe check mark and the caret are the fallbacks of the `check` and `chevron`\nslots, so a mark of your own replaces either by being slotted. Neither is\nread as part of the row's name.",
107298
+ "description": "One element covers three kinds of row, and what you give it decides which:\n- Content in the `submenu` slot makes the row open a submenu page.\n- `checked` makes the row a choice.\n- With neither, the row is a command.\n\nThe role follows the kind. A row with `checkable` or `checked` is\n`menuitemcheckbox` with `aria-checked`, and an `exclusive` row is\n`menuitemradio`, for a set where only one can be on. A row that opens a page\nkeeps `menuitem` and sets `aria-haspopup`.\n\nChoosing a choice row checks or unchecks it before `helix-select` is sent,\nso a listener reads the new `checked`. An `exclusive` row turns on and turns\noff the `exclusive` rows next to it. Cancel `helix-before-toggle` to keep a\nrow as it is and set `checked` yourself.\n\nSpace on a choice row changes it and leaves the menu open, so a reader can\nset several in a row, as the APG's menu does. Enter and a press change it and\nclose the menu. `close-on-select=\"false\"` on the row keeps the menu open after\nany choice of it, and `close-on-select` on the row closes it after a Space as\nwell.\n\nThe menu sets whether the row's page is showing as a property, never as an\nattribute. An attribute written onto your element after it upgrades causes a\nhydration mismatch.\n\n`shortcut` shows a row's keyboard shortcut after its label, drawn by `Kbd`\nin the platform's glyphs, and gives the row `aria-keyshortcuts`. It binds\nnothing: the shortcut is the page's to bind. Other trailing words, such as a\ncount, go in the `end` slot.\n\nThe row is named by its label alone. Words in `description`, a line under the\nlabel, and in `end` describe it instead, through `aria-describedby`, as\nReact Aria's menu item does with its description: a reader hears \"Copy\",\nthen \"Copies the selection\".\n\nA development build warns when a row has no words to be named by, such as a\nrow holding only an icon with no label.\n\nThe check mark and the caret are the fallbacks of the `check` and `chevron`\nslots, so a mark of your own replaces either by being slotted. Neither is\nread as part of the row's name.",
106772
107299
  "name": "HelixHeadlessMenuItem",
106773
107300
  "cssParts": [
106774
107301
  {
@@ -106846,7 +107373,7 @@
106846
107373
  "text": "boolean"
106847
107374
  },
106848
107375
  "default": "false",
106849
- "description": "Whether the row is one of a set of choices.\n\nSeparate from `checked`, and it has to be. A row that is off is still a\nchoice, and `checked` alone cannot say so: an unticked row and a row that\nwas never tickable look identical from here. Announcing only the ticked one\nas a checkbox tells a reader its siblings are commands, which is the one\nthing they are not.\n\n`checked` implies it, so a row that is on never has to say both.\n\nChoosing the row checks or unchecks it, after a `helix-before-toggle` that\nyou can cancel.",
107376
+ "description": "Whether the row is one of a set of choices.\n\nSeparate from `checked`, and it has to be. A row that is off is still a\nchoice, and `checked` alone cannot say so: an unticked row and a row that\nwas never tickable look identical from here. Announcing only the ticked one\nas a checkbox tells a reader its siblings are commands, which is the one\nthing they are not.\n\n`checked` and `exclusive` imply it, so a row that is on, or one of a set,\nnever has to say both.\n\nChoosing the row checks or unchecks it, after a `helix-before-toggle` that\nyou can cancel.",
106850
107377
  "attribute": "checkable",
106851
107378
  "reflects": true
106852
107379
  },
@@ -106860,6 +107387,15 @@
106860
107387
  "description": "Whether the row is checked.\n\nThe row changes it when it is chosen. Not reflected: the attribute is the\nstate you start the row in, and `:state(checked)` carries the current one.",
106861
107388
  "attribute": "checked"
106862
107389
  },
107390
+ {
107391
+ "kind": "field",
107392
+ "name": "closeOnSelect",
107393
+ "type": {
107394
+ "text": "boolean | undefined"
107395
+ },
107396
+ "description": "Whether choosing the row closes the menu.\n\nUnset takes the menu's `close-on-select`, which is on, and keeps the menu\nopen after a Space on a choice row. Write `close-on-select=\"false\"` for a\nrow that changes something the reader is watching, such as a zoom step.",
107397
+ "attribute": "close-on-select"
107398
+ },
106863
107399
  {
106864
107400
  "kind": "field",
106865
107401
  "name": "disabled",
@@ -106888,7 +107424,7 @@
106888
107424
  "text": "boolean"
106889
107425
  },
106890
107426
  "default": "false",
106891
- "description": "Whether only one row in its set can be checked at a time.\n\nThe set is the run of `exclusive` rows next to this one, up to the first\nelement that is not one, such as a divider. Choosing a row in it checks\nthat row and unchecks the others. Choosing the row that is checked leaves\nit checked. `menuitemradio` tells a reader which kind of set they are in,\nwhere `menuitemcheckbox` says every row is independent.\n\nMeaningless without `checkable`, since a row that cannot be ticked is not\none of a set of anything.",
107427
+ "description": "Whether only one row in its set can be checked at a time.\n\nThe set is the run of `exclusive` rows next to this one, up to the first\nelement that is not one, such as a divider. Choosing a row in it checks\nthat row and unchecks the others. Choosing the row that is checked leaves\nit checked. `menuitemradio` tells a reader which kind of set they are in,\nwhere `menuitemcheckbox` says every row is independent.\n\nIt makes the row a choice, so it needs no `checkable` beside it.",
106892
107428
  "attribute": "exclusive",
106893
107429
  "reflects": true
106894
107430
  },
@@ -107146,7 +107682,14 @@
107146
107682
  "type": {
107147
107683
  "text": "void"
107148
107684
  }
107149
- }
107685
+ },
107686
+ "parameters": [
107687
+ {
107688
+ "name": "space",
107689
+ "default": "false"
107690
+ }
107691
+ ],
107692
+ "description": "Chooses the row. `space` is whether a Space chose it, which keeps the menu\nopen on a choice row unless the row says otherwise."
107150
107693
  },
107151
107694
  {
107152
107695
  "kind": "field",
@@ -107154,6 +107697,16 @@
107154
107697
  "privacy": "private",
107155
107698
  "readonly": true
107156
107699
  },
107700
+ {
107701
+ "kind": "field",
107702
+ "name": "spacePressed",
107703
+ "type": {
107704
+ "text": "boolean"
107705
+ },
107706
+ "privacy": "private",
107707
+ "default": "false",
107708
+ "description": "Whether the click on its way is the one a Space on a linked row sent."
107709
+ },
107157
107710
  {
107158
107711
  "kind": "field",
107159
107712
  "name": "handleKeydown",
@@ -107545,7 +108098,7 @@
107545
108098
  "text": "boolean"
107546
108099
  },
107547
108100
  "default": "false",
107548
- "description": "Whether the row is one of a set of choices.\n\nSeparate from `checked`, and it has to be. A row that is off is still a\nchoice, and `checked` alone cannot say so: an unticked row and a row that\nwas never tickable look identical from here. Announcing only the ticked one\nas a checkbox tells a reader its siblings are commands, which is the one\nthing they are not.\n\n`checked` implies it, so a row that is on never has to say both.\n\nChoosing the row checks or unchecks it, after a `helix-before-toggle` that\nyou can cancel.",
108101
+ "description": "Whether the row is one of a set of choices.\n\nSeparate from `checked`, and it has to be. A row that is off is still a\nchoice, and `checked` alone cannot say so: an unticked row and a row that\nwas never tickable look identical from here. Announcing only the ticked one\nas a checkbox tells a reader its siblings are commands, which is the one\nthing they are not.\n\n`checked` and `exclusive` imply it, so a row that is on, or one of a set,\nnever has to say both.\n\nChoosing the row checks or unchecks it, after a `helix-before-toggle` that\nyou can cancel.",
107549
108102
  "fieldName": "checkable"
107550
108103
  },
107551
108104
  {
@@ -107557,6 +108110,14 @@
107557
108110
  "description": "Whether the row is checked.\n\nThe row changes it when it is chosen. Not reflected: the attribute is the\nstate you start the row in, and `:state(checked)` carries the current one.",
107558
108111
  "fieldName": "checked"
107559
108112
  },
108113
+ {
108114
+ "name": "close-on-select",
108115
+ "type": {
108116
+ "text": "boolean | undefined"
108117
+ },
108118
+ "description": "Whether choosing the row closes the menu.\n\nUnset takes the menu's `close-on-select`, which is on, and keeps the menu\nopen after a Space on a choice row. Write `close-on-select=\"false\"` for a\nrow that changes something the reader is watching, such as a zoom step.",
108119
+ "fieldName": "closeOnSelect"
108120
+ },
107560
108121
  {
107561
108122
  "name": "disabled",
107562
108123
  "type": {
@@ -107581,7 +108142,7 @@
107581
108142
  "text": "boolean"
107582
108143
  },
107583
108144
  "default": "false",
107584
- "description": "Whether only one row in its set can be checked at a time.\n\nThe set is the run of `exclusive` rows next to this one, up to the first\nelement that is not one, such as a divider. Choosing a row in it checks\nthat row and unchecks the others. Choosing the row that is checked leaves\nit checked. `menuitemradio` tells a reader which kind of set they are in,\nwhere `menuitemcheckbox` says every row is independent.\n\nMeaningless without `checkable`, since a row that cannot be ticked is not\none of a set of anything.",
108145
+ "description": "Whether only one row in its set can be checked at a time.\n\nThe set is the run of `exclusive` rows next to this one, up to the first\nelement that is not one, such as a divider. Choosing a row in it checks\nthat row and unchecks the others. Choosing the row that is checked leaves\nit checked. `menuitemradio` tells a reader which kind of set they are in,\nwhere `menuitemcheckbox` says every row is independent.\n\nIt makes the row a choice, so it needs no `checkable` beside it.",
107585
108146
  "fieldName": "exclusive"
107586
108147
  },
107587
108148
  {
@@ -107703,7 +108264,7 @@
107703
108264
  "declarations": [
107704
108265
  {
107705
108266
  "kind": "class",
107706
- "description": "The trigger is slotted and stays your own element, as with the tooltip. The\nmenu renders its surface in the top layer with the popover API, so an\nancestor with `overflow: hidden` does not clip it and it needs no `z-index`.\n\nSlot a `helix-button` or `helix-icon-button` as the trigger, and the menu\ntells it that it opens a menu and whether the menu is open, inside its own\nshadow root. On a plain element, such as a `<button>`, the menu writes\n`aria-haspopup=\"menu\"` and `aria-expanded`, from a frame after its own first\nrender, so a server's markup is never changed while a framework hydrates it.\nIt never writes `aria-expanded` where you wrote it yourself.\n\nSubmenus drill down by default. A submenu replaces the panel's content, and a\nback row returns to the previous page. One panel stays inside a narrow\nwindow, and works on touch screens, which have no hover.\n\n**`submenus=\"flyout\"` opens each submenu in a panel of its own beside its\nrow**, as React Aria's `SubmenuTrigger` and Radix's `Sub` do. Resting the\npointer on the row opens it, and a pointer crossing toward the open panel\nover the rows between keeps it open, as Radix's grace area does. Right Arrow\nopens a row's submenu on its first row, and Left Arrow or Escape closes it\nand returns focus to the row, the two arrows swapping on a right-to-left\npage. The row says `aria-expanded`, and the panel is a `menu` named by the\nrow.\n\nThe root holds which page is open, because only one page shows at a time. It\nsets this on items as a property, never as an attribute. An attribute written\nonto your element after it upgrades causes a hydration mismatch.\n\nGroup rows under a heading with `Menu.Section`, which is a `group` named by\nits heading. Between runs of rows, a `<helix-divider>` is a separator a\nscreen reader announces.\n\nKeys: Enter, Space or Down Arrow on the trigger opens the menu on its first\nrow, and Up Arrow on its last. In the menu, Up and Down Arrow move between\nrows, Home and End go to the first and the last, a typed letter moves to\nthe next row whose name starts with it, Enter and Space choose, Right Arrow\nopens a row's submenu and Left Arrow goes back, the two swapping on a\nright-to-left page. Left Arrow on the top page does nothing. Escape closes\nthe menu and returns focus to the trigger. Tab closes it and moves on.\n\nWhile it is open, the surface carries the trigger's width as\n`--floating-anchor-inline-size` and the room left below it as\n`--floating-available-block-size`, as Radix's dropdown menu publishes its\ntrigger's width, for a menu as wide as its trigger:\n`helix-menu::part(surface) { min-inline-size: var(--floating-anchor-inline-size) }`.\n\nWith `context`, the trigger is an area and the menu is its context menu: a\nright-click, a long press, Shift+F10 or the menu key over the area opens it\nat the pointer, or at the area's corner from the keyboard, as Radix's context\nmenu does. A press on the area does not open it, and closing it returns focus\nto where it was. A touch or a pen held still on the area opens it too, on\nevery browser, since iOS sends no `contextmenu` for one.\n\n**A trigger with its own action.** With `open-on=\"long-press\"`, a press on\nthe trigger is the trigger's own, and a press held for half a second opens\nthe menu, as React Aria's `trigger=\"longPress\"` does. Alt+Down or Alt+Up\nopens it from the keyboard, and the trigger is described by\n`long-press-label`, which says so.",
108267
+ "description": "The trigger is slotted and stays your own element, as with the tooltip. The\nmenu renders its surface in the top layer with the popover API, so an\nancestor with `overflow: hidden` does not clip it and it needs no `z-index`.\n\nSlot a `helix-button` or `helix-icon-button` as the trigger, and the menu\ntells it that it opens a menu and whether the menu is open, inside its own\nshadow root. On a plain element, such as a `<button>`, the menu writes\n`aria-haspopup=\"menu\"` and `aria-expanded`, from a frame after its own first\nrender, so a server's markup is never changed while a framework hydrates it.\nIt never writes `aria-expanded` where you wrote it yourself.\n\nSubmenus drill down by default. A submenu replaces the panel's content, and a\nback row returns to the previous page. One panel stays inside a narrow\nwindow, and works on touch screens, which have no hover.\n\n**`submenus=\"flyout\"` opens each submenu in a panel of its own beside its\nrow**, as React Aria's `SubmenuTrigger` and Radix's `Sub` do. Resting the\npointer on the row opens it, and a pointer crossing toward the open panel\nover the rows between keeps it open, as Radix's grace area does. Right Arrow\nopens a row's submenu on its first row, and Left Arrow or Escape closes it\nand returns focus to the row, the two arrows swapping on a right-to-left\npage. The row says `aria-expanded`, and the panel is a `menu` named by the\nrow.\n\nThe root holds which page is open, because only one page shows at a time. It\nsets this on items as a property, never as an attribute. An attribute written\nonto your element after it upgrades causes a hydration mismatch.\n\nGroup rows under a heading with `Menu.Section`, which is a `group` named by\nits heading. Between runs of rows, a `<helix-divider>` is a separator a\nscreen reader announces.\n\nKeys: Enter, Space or Down Arrow on the trigger opens the menu on its first\nrow, and Up Arrow on its last. In the menu, Up and Down Arrow move between\nrows, Home and End go to the first and the last, a typed letter moves to\nthe next row whose name starts with it, Enter and Space choose (Space on a\nchoice row changes it and leaves the menu open), Right Arrow\nopens a row's submenu and Left Arrow goes back, the two swapping on a\nright-to-left page. Left Arrow on the top page does nothing. Escape closes\nthe menu and returns focus to the trigger. Tab closes it and moves on.\n\nWhile it is open, the surface carries the trigger's width as\n`--floating-anchor-inline-size` and the room left below it as\n`--floating-available-block-size`, as Radix's dropdown menu publishes its\ntrigger's width, for a menu as wide as its trigger:\n`helix-menu::part(surface) { min-inline-size: var(--floating-anchor-inline-size) }`.\n\nWith `context`, the trigger is an area and the menu is its context menu: a\nright-click, a long press, Shift+F10 or the menu key over the area opens it\nat the pointer, or at the area's corner from the keyboard, as Radix's context\nmenu does. A press on the area does not open it, and closing it returns focus\nto where it was. A touch or a pen held still on the area opens it too, on\nevery browser, since iOS sends no `contextmenu` for one.\n\n**A trigger with its own action.** With `open-on=\"long-press\"`, a press on\nthe trigger is the trigger's own, and a press held for half a second opens\nthe menu, as React Aria's `trigger=\"longPress\"` does. Alt+Down or Alt+Up\nopens it from the keyboard, and the trigger is described by\n`long-press-label`, which says so.",
107707
108268
  "name": "HelixHeadlessMenu",
107708
108269
  "cssProperties": [
107709
108270
  {
@@ -107787,6 +108348,16 @@
107787
108348
  "words": true
107788
108349
  }
107789
108350
  },
108351
+ {
108352
+ "kind": "field",
108353
+ "name": "closeOnSelect",
108354
+ "type": {
108355
+ "text": "boolean"
108356
+ },
108357
+ "default": "true",
108358
+ "description": "Whether choosing a row closes the menu.\n\nOn by default, and a Space on a choice row leaves the menu open either way.\nWrite `close-on-select=\"false\"` to keep the menu open after every choice, as\nArk UI's `closeOnSelect` does. A row's own `close-on-select` wins over this.",
108359
+ "attribute": "close-on-select"
108360
+ },
107790
108361
  {
107791
108362
  "kind": "field",
107792
108363
  "name": "context",
@@ -109146,6 +109717,15 @@
109146
109717
  "description": "The text of the row that returns from a submenu.",
109147
109718
  "fieldName": "backLabel"
109148
109719
  },
109720
+ {
109721
+ "name": "close-on-select",
109722
+ "type": {
109723
+ "text": "boolean"
109724
+ },
109725
+ "default": "true",
109726
+ "description": "Whether choosing a row closes the menu.\n\nOn by default, and a Space on a choice row leaves the menu open either way.\nWrite `close-on-select=\"false\"` to keep the menu open after every choice, as\nArk UI's `closeOnSelect` does. A row's own `close-on-select` wins over this.",
109727
+ "fieldName": "closeOnSelect"
109728
+ },
109149
109729
  {
109150
109730
  "name": "context",
109151
109731
  "type": {
@@ -112595,6 +113175,35 @@
112595
113175
  "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
112596
113176
  }
112597
113177
  },
113178
+ {
113179
+ "kind": "field",
113180
+ "name": "present",
113181
+ "type": {
113182
+ "text": "boolean"
113183
+ },
113184
+ "privacy": "protected",
113185
+ "description": "Whether the element is still on the page for a reader, which is what\nthe focus hand-off waits on: connected, for a surface the page removes.\nA surface that hides itself says it is gone once hidden, and calls\n`handFocusOn` then.",
113186
+ "readonly": true,
113187
+ "inheritedFrom": {
113188
+ "name": "MixinDismissible",
113189
+ "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
113190
+ }
113191
+ },
113192
+ {
113193
+ "kind": "method",
113194
+ "name": "handFocusOn",
113195
+ "privacy": "protected",
113196
+ "return": {
113197
+ "type": {
113198
+ "text": "void"
113199
+ }
113200
+ },
113201
+ "description": "Hands focus on now, where a dismissal is waiting for this element to\ngo: for a surface that hides itself, once it has.",
113202
+ "inheritedFrom": {
113203
+ "name": "MixinDismissible",
113204
+ "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
113205
+ }
113206
+ },
112598
113207
  {
112599
113208
  "kind": "method",
112600
113209
  "name": "dismiss",
@@ -117105,6 +117714,10 @@
117105
117714
  "description": "The number of entries a branch holds.",
117106
117715
  "name": "count"
117107
117716
  },
117717
+ {
117718
+ "description": "The row shown in the tree while it has no entries to show: no value, or a filter that matched none. It holds the `empty` slot.",
117719
+ "name": "empty"
117720
+ },
117108
117721
  {
117109
117722
  "description": "The tree and the copy button beside it.",
117110
117723
  "name": "frame"
@@ -117170,6 +117783,12 @@
117170
117783
  "name": "value"
117171
117784
  }
117172
117785
  ],
117786
+ "slots": [
117787
+ {
117788
+ "description": "Shown in the tree while it has no entries to show. Defaults to `empty-label`, or `no-matches-label` while a filter matched none.",
117789
+ "name": "empty"
117790
+ }
117791
+ ],
117173
117792
  "members": [
117174
117793
  {
117175
117794
  "kind": "field",
@@ -117226,6 +117845,19 @@
117226
117845
  "description": "How many levels start open.\n\nOne by default: the root is open and everything under it closed, so a\nreader sees the shape of the value before its contents. `0` starts with the\nroot closed; a large number opens everything, which on a big value is the\nwall of text this exists to avoid.",
117227
117846
  "attribute": "default-depth"
117228
117847
  },
117848
+ {
117849
+ "kind": "field",
117850
+ "name": "emptyLabel",
117851
+ "type": {
117852
+ "text": "string"
117853
+ },
117854
+ "default": "'Nothing to show'",
117855
+ "description": "What the tree says while there is no value to show, such as before a\nfetch answers. The `empty` slot replaces it.",
117856
+ "attribute": "empty-label",
117857
+ "helix": {
117858
+ "words": true
117859
+ }
117860
+ },
117229
117861
  {
117230
117862
  "kind": "field",
117231
117863
  "name": "expanded",
@@ -117341,6 +117973,19 @@
117341
117973
  "description": "Hides the copy button.\n\nNegative for the reason Code Block's is: a boolean attribute defaulting to\ntrue could never be turned off from markup.\n\n**It does not reflect, where Code Block's does**, and the difference is what\nthe two sheets need. Code Block reserves the button's width with\n`:host(:not([no-copy]))`, so the attribute has to be there for a consumer\nwho set the property. This button is positioned out of the flow and takes no\nroom, so nothing selects on it, and reflection exists so that a selector can\nreach a value.",
117342
117974
  "attribute": "no-copy"
117343
117975
  },
117976
+ {
117977
+ "kind": "field",
117978
+ "name": "noMatchesLabel",
117979
+ "type": {
117980
+ "text": "string"
117981
+ },
117982
+ "default": "'No matches'",
117983
+ "description": "What the tree says while a filter matched no entry. The `empty` slot\nreplaces it.",
117984
+ "attribute": "no-matches-label",
117985
+ "helix": {
117986
+ "words": true
117987
+ }
117988
+ },
117344
117989
  {
117345
117990
  "kind": "field",
117346
117991
  "name": "renderValue",
@@ -117610,6 +118255,16 @@
117610
118255
  ],
117611
118256
  "description": "Opens the branches around each path, where the value has them."
117612
118257
  },
118258
+ {
118259
+ "kind": "field",
118260
+ "name": "blank",
118261
+ "type": {
118262
+ "text": "boolean"
118263
+ },
118264
+ "privacy": "private",
118265
+ "description": "Whether the tree has no entries to show. Not while a value named by `for`\nis still to be read, as on a server and while hydrating what one sent,\nwhere it says nothing yet about the value.",
118266
+ "readonly": true
118267
+ },
117613
118268
  {
117614
118269
  "kind": "method",
117615
118270
  "name": "counted",
@@ -118410,6 +119065,15 @@
118410
119065
  "description": "How many levels start open.\n\nOne by default: the root is open and everything under it closed, so a\nreader sees the shape of the value before its contents. `0` starts with the\nroot closed; a large number opens everything, which on a big value is the\nwall of text this exists to avoid.",
118411
119066
  "fieldName": "defaultDepth"
118412
119067
  },
119068
+ {
119069
+ "name": "empty-label",
119070
+ "type": {
119071
+ "text": "string"
119072
+ },
119073
+ "default": "'Nothing to show'",
119074
+ "description": "What the tree says while there is no value to show, such as before a\nfetch answers. The `empty` slot replaces it.",
119075
+ "fieldName": "emptyLabel"
119076
+ },
118413
119077
  {
118414
119078
  "name": "filter",
118415
119079
  "type": {
@@ -118498,6 +119162,15 @@
118498
119162
  "description": "Hides the copy button.\n\nNegative for the reason Code Block's is: a boolean attribute defaulting to\ntrue could never be turned off from markup.\n\n**It does not reflect, where Code Block's does**, and the difference is what\nthe two sheets need. Code Block reserves the button's width with\n`:host(:not([no-copy]))`, so the attribute has to be there for a consumer\nwho set the property. This button is positioned out of the flow and takes no\nroom, so nothing selects on it, and reflection exists so that a selector can\nreach a value.",
118499
119163
  "fieldName": "noCopy"
118500
119164
  },
119165
+ {
119166
+ "name": "no-matches-label",
119167
+ "type": {
119168
+ "text": "string"
119169
+ },
119170
+ "default": "'No matches'",
119171
+ "description": "What the tree says while a filter matched no entry. The `empty` slot\nreplaces it.",
119172
+ "fieldName": "noMatchesLabel"
119173
+ },
118501
119174
  {
118502
119175
  "name": "result-label",
118503
119176
  "type": {
@@ -118534,6 +119207,28 @@
118534
119207
  "fieldName": "windowed"
118535
119208
  }
118536
119209
  ],
119210
+ "cssStates": [
119211
+ {
119212
+ "description": "While the tree has no entries to show: no value, or a filter that matched none.",
119213
+ "name": "empty"
119214
+ },
119215
+ {
119216
+ "description": "While `filter` holds text.",
119217
+ "name": "filtered"
119218
+ },
119219
+ {
119220
+ "description": "While `filter` holds text and matched at least one entry.",
119221
+ "name": "matched"
119222
+ },
119223
+ {
119224
+ "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
119225
+ "name": "settled",
119226
+ "inheritedFrom": {
119227
+ "name": "HelixElement",
119228
+ "module": "src/helix-element/helix-element.ts"
119229
+ }
119230
+ }
119231
+ ],
118537
119232
  "superclass": {
118538
119233
  "name": "HelixElement",
118539
119234
  "package": "@fusion.dev/helix-core"
@@ -118566,16 +119261,6 @@
118566
119261
  },
118567
119262
  "tagName": "helix-headless-object-inspector",
118568
119263
  "customElement": true,
118569
- "cssStates": [
118570
- {
118571
- "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
118572
- "name": "settled",
118573
- "inheritedFrom": {
118574
- "name": "HelixElement",
118575
- "module": "src/helix-element/helix-element.ts"
118576
- }
118577
- }
118578
- ],
118579
119264
  "modulePath": "src/object-inspector/root/object-inspector-root.ts",
118580
119265
  "definitionPath": "src/object-inspector/root/object-inspector-root.ts"
118581
119266
  }
@@ -149963,7 +150648,7 @@
149963
150648
  "text": "number"
149964
150649
  },
149965
150650
  "privacy": "private",
149966
- "description": "The index of the stage the reader is on, or `-1`.",
150651
+ "description": "The index of the stage the reader is on, or `-1`.\n\nRead from `active` once anything has set it, because a move writes\n`active` at once and each step's `current` only on the next update: two\ncalls to `next()` in one task then move two stages.",
149967
150652
  "readonly": true
149968
150653
  },
149969
150654
  {
@@ -155018,7 +155703,7 @@
155018
155703
  "declarations": [
155019
155704
  {
155020
155705
  "kind": "class",
155021
- "description": "Lays out the rows on a CSS grid, so every column lines up across rows and\neach row stays a real element that can be styled, hidden, or made\ninteractive. A `<table>` layout aligns columns but limits almost everything\nelse.\n\nA grid of elements has no table structure for assistive technology, so the\nroles are set explicitly: `table`, `row`, `cell`, `columnheader`, and\n`rowheader` for a `header` cell in a row of values. Rows are\n`display: contents`, so their cells become items of the one grid.\n\n**Sorting.** A column with `sortable` and a `field` draws its heading as a\nbutton that sorts the rows by the text of its cells, numbers by their value.\nYour markup is not reordered: the table draws the rows in the sorted order.\n\n1. Each press cycles the column through ascending, descending, and the\n order the rows were written in, which keeps a server's own ranking\n reachable.\n2. `helix-sort` asks first, with `field:direction`, or empty for the written\n order. Refuse it to keep the order, or to sort the rows yourself and set\n `sort`.\n3. `helix-sorted` follows once the order stands, and `sort` holds it.\n4. The heading carries `aria-sort`, and a screen reader hears `sorted-label`\n (\"Sorted by Name, ascending\") or `unsorted-label` from a polite region.\n\nTab reaches each sort button, and Enter or Space presses it.\n\nThe `heading` slot names the table: slot a heading or a line of text into\nit, and the table is named by its words. An `aria-label` or `aria-labelledby` on the\nhost wins over it.\n\n**Selecting.** `selectable` adds a column of checkboxes.\n\n1. Each row is known by its `value`, or by its place among the rows where it\n has none, and `selected` holds the chosen keys, comma separated, the same\n shape `DataTable` uses. `default-selected` is where it starts.\n2. A row's checkbox is named by `select-row-label` (\"Select {row}\") with the\n words of the row's first cell. The checkbox in the heading selects every\n row, and shows a dash while only some are chosen.\n3. `helix-select` asks first, with every key the change would leave.\n Refuse it to keep the selection. `helix-selected` follows once it stands.\n4. A chosen row takes `:state(selected)`, and a screen reader hears\n `selected-label` (\"2 selected\") from a polite region.\n\nTab reaches each checkbox, and Space ticks it. To act on one row, put a\nlink or a button in a cell, or give the row an `href`.\n\n`selection-mode=\"single\"` selects one row at a time: ticking a row lets go\nof the one before, the heading holds no checkbox, and Shift and Control with\nA take in nothing more. `selection-behavior=\"replace\"` makes a press on a\nrow, anywhere but its own controls, select it alone, as a file list does,\nand in a `grid` table the arrow keys carry the selection with them. Control\nor Command with a press adds or takes out the row, and with an arrow moves\nwithout selecting. Shift with a press takes in the rows from the one last\nchosen.\n\n**Nesting rows.** A row with `parent` sits under the row of that key, as\na file sits in a folder. The table then draws a column of disclosure\nbuttons, under a heading named by `expand-column-label`: a row with rows\nunder it has a button named by `expand-row-label` (\"Expand {row}\") that\nsays with `aria-expanded` whether it is open, and the rows under a shut row\nare not drawn. `expanded` holds the open rows' keys, comma separated, and\n`default-expanded` is where it starts. A press asks with\n`helix-before-toggle` and tells with `helix-toggle`, both from the row, so\nyou can refuse it or load the rows on the way. A sort orders the rows\nunder each row among themselves, and in a `grid` table the table is a\n`treegrid` whose rows say their depth.\n\n**Moving rows.** `reorderable` adds a column of grips before the checkboxes,\nunder a heading named by `row-grips-label`.\n\n1. Each row is known by its `value`, or by its place among the rows where it\n has none, as for selecting. Give rows a `value` when they move, so a key\n stays with its row.\n2. A grip is a button named by `move-row-label` (\"Move {row}\") with the\n words of the row's first cell. Drag it to move its row, and the page\n scrolls near an edge. Or press it with Space, Enter, or a click to pick\n the row up, move it with Up, Down, Home, and End, and press it again to\n drop it. A click on another row drops it there, and Escape puts it back.\n3. `helix-before-reorder` asks first, and `helix-reorder` follows with\n `keys`, every row's key in the new order. **You move the rows**: the\n table moves no element of yours, and focus goes back to the moved row's\n grip once you have.\n4. Each step is said in the table's live region, in words you can change:\n `picked-up-label`, `moved-label`, `dropped-label`, and `canceled-label`.\n The grips do nothing while a sort is set.\n\n**A grid.** `grid` makes the table one tab stop that the arrow keys move\nthrough cell by cell, the headings included, as React Aria's table is. The\ntable is then a `grid` and each value a `gridcell`, and the table gives\nevery cell a `tabindex` so focus can rest on it: set `grid` only where the\ncells may carry one.\n\n| Key | What it does |\n|---|---|\n| Right, Left | Moves one cell along the row. Left moves on, on a right-to-left page. |\n| Down, Up | Moves one row, the headings included. |\n| Home, End | Moves to the first or the last cell of the row. |\n| Control with Home or End | Moves to the first or the last cell of the table. |\n| Page Down, Page Up | Moves by the rows that fit in view. |\n| Enter, F2 | Moves into the cell's links and controls. Escape or F2 moves back to the cell, and Tab moves between the controls of one cell. |\n| Enter on a cell of a row with `href` | Follows the row's link. |\n| Enter, Space on a sortable heading | Sorts by the column. |\n| Space on a row, Enter or Space on its checkbox cell | Selects the row, in a `selectable` table. |\n| Enter or Space on a disclosure cell | Shows or hides the rows under the row, in a table whose rows nest. |\n| Enter or Space on a grip cell | Picks the row up, or drops it, in a `reorderable` table. Up, Down, Home, and End move a row picked up, and Escape puts it back. |\n| Down, Up, Page Down, Page Up under `selection-behavior=\"replace\"` | Selects the row it moves to alone. Control or Command with the key moves without selecting. |\n| Shift with Down or Up | Selects the rows it moves across, in a `selectable` table. |\n| Shift with Space | Selects every row from the one last chosen, in a `selectable` table. |\n| Control or Command with A | Selects every row, in a `selectable` table. |\n| A letter or a word | Moves to the next row whose first cell starts with what you typed. |\n| Tab | Leaves the table. |\n\n**Loading more.** `load-more` sends `helix-load-more` once the end of the\ntable comes within a screen of view, in the box that scrolls it or the\npage, once for each number of rows: add rows and it can send it again. Set\n`loading` while you fetch, and the table asks for nothing until it clears.\n\nWhen the rows did not load, set `error-text`, such as \"The orders did not\nload\", and put a button that tries again in the `error` slot. The line shows\nafter the rows in place of the empty and loading lines, the live region says\nit, and the table takes the `error` state. Clear it once you try again.\n\nThe CSS custom properties listed for this component are written by it and\nread by the stylesheet that draws it. Do not set them. Each holds a number\nthe component computes and CSS cannot, so the stylesheet can draw the table\nwithout measuring anything.",
155706
+ "description": "Lays out the rows on a CSS grid, so every column lines up across rows and\neach row stays a real element that can be styled, hidden, or made\ninteractive. A `<table>` layout aligns columns but limits almost everything\nelse.\n\nA grid of elements has no table structure for assistive technology, so the\nroles are set explicitly: `table`, `row`, `cell`, `columnheader`, and\n`rowheader` for a `header` cell in a row of values. Rows are\n`display: contents`, so their cells become items of the one grid.\n\n**Sorting.** A column with `sortable` and a `field` draws its heading as a\nbutton that sorts the rows by the text of its cells, numbers by their value.\nYour markup is not reordered: the table draws the rows in the sorted order.\n\n1. Each press cycles the column through ascending, descending, and the\n order the rows were written in, which keeps a server's own ranking\n reachable.\n2. `helix-sort` asks first, with `field:direction`, or empty for the written\n order. Refuse it to keep the order, or to sort the rows yourself and set\n `sort`.\n3. `helix-sorted` follows once the order stands, and `sort` holds it.\n4. The heading carries `aria-sort`, and a screen reader hears `sorted-label`\n (\"Sorted by Name, ascending\") or `unsorted-label` from a polite region.\n\nTab reaches each sort button, and Enter or Space presses it.\n\nThe `heading` slot names the table: slot a heading or a line of text into\nit, and the table is named by its words. An `aria-label` or `aria-labelledby` on the\nhost wins over it.\n\n**Selecting.** `selectable` adds a column of checkboxes.\n\n1. Each row is known by its `value`, or by its place among the rows where it\n has none, and `selected` holds the chosen keys, comma separated, the same\n shape `DataTable` uses. `default-selected` is where it starts.\n2. A row's checkbox is named by `select-row-label` (\"Select {row}\") with the\n words of the row's first cell. The checkbox in the heading selects every\n row, and shows a dash while only some are chosen.\n3. `helix-select` asks first, with every key the change would leave.\n Refuse it to keep the selection. `helix-selected` follows once it stands.\n4. A chosen row takes `:state(selected)`, and a screen reader hears\n `selected-label` (\"2 selected\") from a polite region.\n\nTab reaches each checkbox, and Space ticks it. To act on one row, put a\nlink or a button in a cell, or give the row an `href`.\n\n`selection-mode=\"single\"` selects one row at a time: ticking a row lets go\nof the one before, the heading holds no checkbox, and Shift and Control with\nA take in nothing more. `selection-behavior=\"replace\"` makes a press on a\nrow, anywhere but its own controls, select it alone, as a file list does,\nand in a `grid` table the arrow keys carry the selection with them. Control\nor Command with a press adds or takes out the row, and with an arrow moves\nwithout selecting. Shift with a press takes in the rows from the one last\nchosen.\n\n**Nesting rows.** A row with `parent` sits under the row of that key, as\na file sits in a folder. The table then draws a column of disclosure\nbuttons, under a heading named by `expand-column-label`: a row with rows\nunder it has a button named by `expand-row-label` (\"Expand {row}\") that\nsays with `aria-expanded` whether it is open, and the rows under a shut row\nare not drawn. `expanded` holds the open rows' keys, comma separated, and\n`default-expanded` is where it starts. A press asks with\n`helix-before-toggle` and tells with `helix-toggle`, both from the row, so\nyou can refuse it or load the rows on the way. A sort orders the rows\nunder each row among themselves, and in a `grid` table the table is a\n`treegrid` whose rows say their depth.\n\n**Moving rows.** `reorderable` adds a column of grips before the checkboxes,\nunder a heading named by `row-grips-label`.\n\n1. Each row is known by its `value`, or by its place among the rows where it\n has none, as for selecting. Give rows a `value` when they move, so a key\n stays with its row.\n2. A grip is a button named by `move-row-label` (\"Move {row}\") with the\n words of the row's first cell. Drag it to move its row, and the page\n scrolls near an edge. Or press it with Space, Enter, or a click to pick\n the row up, move it with Up, Down, Home, and End, and press it again to\n drop it. A click on another row drops it there, and Escape puts it back.\n3. `helix-before-reorder` asks first, and `helix-reorder` follows with\n `keys`, every row's key in the new order. **You move the rows**: the\n table moves no element of yours, and focus goes back to the moved row's\n grip once you have.\n4. Each step is said in the table's live region, in words you can change:\n `picked-up-label`, `moved-label`, `dropped-label`, and `canceled-label`.\n The grips do nothing while a sort is set.\n\n**A grid.** `grid` makes the table one tab stop that the arrow keys move\nthrough cell by cell, the headings included, as React Aria's table is. The\ntable is then a `grid` and each value a `gridcell`, and the table gives\nevery cell a `tabindex` so focus can rest on it: set `grid` only where the\ncells may carry one.\n\n| Key | What it does |\n|---|---|\n| Right, Left | Moves one cell along the row. Left moves on, on a right-to-left page. |\n| Down, Up | Moves one row, the headings included. |\n| Home, End | Moves to the first or the last cell of the row. |\n| Control with Home or End | Moves to the first or the last cell of the table. |\n| Page Down, Page Up | Moves by the rows that fit in view. |\n| Enter, F2 | Moves into the cell's links and controls. Escape or F2 moves back to the cell, and Tab moves between the controls of one cell. |\n| Enter on a cell of a row with `href` | Follows the row's link. |\n| Enter, Space on a sortable heading | Sorts by the column. |\n| Space on a row, Enter or Space on its checkbox cell | Selects the row, in a `selectable` table. |\n| Enter or Space on a disclosure cell | Shows or hides the rows under the row, in a table whose rows nest. |\n| Right on a disclosure cell | Shows the rows under a shut row, and otherwise moves one cell along the row. Left does, on a right-to-left page. |\n| Left on a disclosure cell | Hides the rows under an open row, and moves to the row this one sits under from any other. |\n| Enter or Space on a grip cell | Picks the row up, or drops it, in a `reorderable` table. Up, Down, Home, and End move a row picked up, and Escape puts it back. |\n| Down, Up, Page Down, Page Up under `selection-behavior=\"replace\"` | Selects the row it moves to alone. Control or Command with the key moves without selecting. |\n| Shift with Down or Up | Selects the rows it moves across, in a `selectable` table. |\n| Shift with Space | Selects every row from the one last chosen, in a `selectable` table. |\n| Control or Command with A | Selects every row, in a `selectable` table. |\n| A letter or a word | Moves to the next row whose first cell starts with what you typed. |\n| Tab | Leaves the table. |\n\n**Loading more.** `load-more` sends `helix-load-more` once the end of the\ntable comes within a screen of view, in the box that scrolls it or the\npage, once for each number of rows: add rows and it can send it again. Set\n`loading` while you fetch, and the table asks for nothing until it clears.\n\nWhen the rows did not load, set `error-text`, such as \"The orders did not\nload\", and put a button that tries again in the `error` slot. The line shows\nafter the rows in place of the empty and loading lines, the live region says\nit, and the table takes the `error` state. Clear it once you try again.\n\nThe CSS custom properties listed for this component are written by it and\nread by the stylesheet that draws it. Do not set them. Each holds a number\nthe component computes and CSS cannot, so the stylesheet can draw the table\nwithout measuring anything.",
155022
155707
  "name": "HelixHeadlessTable",
155023
155708
  "cssProperties": [
155024
155709
  {
@@ -155627,7 +156312,7 @@
155627
156312
  "name": "gridKeys",
155628
156313
  "privacy": "private",
155629
156314
  "readonly": true,
155630
- "default": "new TableGridController(this, { activate: (place, event) => this.activate(place, event), arrive: (to, control) => { if (this.replaces && !control) { this.chooseOnly(to) } }, columns: () => this.tableColumns.filter((column) => column.shown), lead: () => this.lead, on: () => this.grid, part: (name) => this.partNamed(name), rows: () => (this.childrenKnown ? this.arrangedRows : []), rowWords: () => this.arrangedRows.map((row) => textOf(row.children[0])), selectAll: () => this.selectable && !this.single && this.requestSelected(new Set([...this.chosen, ...this.enabledKeys])), selectRange: (to, from) => this.selectRange(to, from), })",
156315
+ "default": "new TableGridController(this, { activate: (place, event) => this.activate(place, event), arrive: (to, control) => { if (this.replaces && !control) { this.chooseOnly(to) } }, columns: () => this.tableColumns.filter((column) => column.shown), disclose: (at, forward) => this.disclose(at, forward), lead: () => this.lead, on: () => this.grid, part: (name) => this.partNamed(name), rows: () => (this.childrenKnown ? this.arrangedRows : []), rowWords: () => this.arrangedRows.map((row) => textOf(row.children[0])), selectAll: () => this.selectable && !this.single && this.requestSelected(new Set([...this.chosen, ...this.enabledKeys])), selectRange: (to, from) => this.selectRange(to, from), })",
155631
156316
  "description": "The keyboard of a `grid` table, in `grid-controller.ts`."
155632
156317
  },
155633
156318
  {
@@ -156034,6 +156719,31 @@
156034
156719
  ],
156035
156720
  "description": "One row's checkbox, ticked or not. It becomes the row a range runs from."
156036
156721
  },
156722
+ {
156723
+ "kind": "method",
156724
+ "name": "disclose",
156725
+ "privacy": "private",
156726
+ "return": {
156727
+ "type": {
156728
+ "text": "boolean | number"
156729
+ }
156730
+ },
156731
+ "parameters": [
156732
+ {
156733
+ "name": "at",
156734
+ "type": {
156735
+ "text": "number"
156736
+ }
156737
+ },
156738
+ {
156739
+ "name": "forward",
156740
+ "type": {
156741
+ "text": "boolean"
156742
+ }
156743
+ }
156744
+ ],
156745
+ "description": "Right or Left on a disclosure cell, as on a tree's item and as Data\nTable's row headers do: on to open a shut row, back to shut an open one.\nBack on a row that is shut, or has no rows under it, moves to the row it\nsits under. Anything else moves along the row."
156746
+ },
156037
156747
  {
156038
156748
  "kind": "method",
156039
156749
  "name": "activate",
@@ -157264,6 +157974,10 @@
157264
157974
  "description": "While `error-text` is set.",
157265
157975
  "name": "error"
157266
157976
  },
157977
+ {
157978
+ "description": "While `loading` is set, as the rows are on their way.",
157979
+ "name": "loading"
157980
+ },
157267
157981
  {
157268
157982
  "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
157269
157983
  "name": "settled",
@@ -159809,6 +160523,35 @@
159809
160523
  "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
159810
160524
  }
159811
160525
  },
160526
+ {
160527
+ "kind": "field",
160528
+ "name": "present",
160529
+ "type": {
160530
+ "text": "boolean"
160531
+ },
160532
+ "privacy": "protected",
160533
+ "description": "Whether the element is still on the page for a reader, which is what\nthe focus hand-off waits on: connected, for a surface the page removes.\nA surface that hides itself says it is gone once hidden, and calls\n`handFocusOn` then.",
160534
+ "readonly": true,
160535
+ "inheritedFrom": {
160536
+ "name": "MixinDismissible",
160537
+ "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
160538
+ }
160539
+ },
160540
+ {
160541
+ "kind": "method",
160542
+ "name": "handFocusOn",
160543
+ "privacy": "protected",
160544
+ "return": {
160545
+ "type": {
160546
+ "text": "void"
160547
+ }
160548
+ },
160549
+ "description": "Hands focus on now, where a dismissal is waiting for this element to\ngo: for a surface that hides itself, once it has.",
160550
+ "inheritedFrom": {
160551
+ "name": "MixinDismissible",
160552
+ "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
160553
+ }
160554
+ },
159812
160555
  {
159813
160556
  "kind": "method",
159814
160557
  "name": "stopBeside",
@@ -161621,6 +162364,35 @@
161621
162364
  "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
161622
162365
  }
161623
162366
  },
162367
+ {
162368
+ "kind": "field",
162369
+ "name": "present",
162370
+ "type": {
162371
+ "text": "boolean"
162372
+ },
162373
+ "privacy": "protected",
162374
+ "description": "Whether the element is still on the page for a reader, which is what\nthe focus hand-off waits on: connected, for a surface the page removes.\nA surface that hides itself says it is gone once hidden, and calls\n`handFocusOn` then.",
162375
+ "readonly": true,
162376
+ "inheritedFrom": {
162377
+ "name": "MixinDismissible",
162378
+ "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
162379
+ }
162380
+ },
162381
+ {
162382
+ "kind": "method",
162383
+ "name": "handFocusOn",
162384
+ "privacy": "protected",
162385
+ "return": {
162386
+ "type": {
162387
+ "text": "void"
162388
+ }
162389
+ },
162390
+ "description": "Hands focus on now, where a dismissal is waiting for this element to\ngo: for a surface that hides itself, once it has.",
162391
+ "inheritedFrom": {
162392
+ "name": "MixinDismissible",
162393
+ "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
162394
+ }
162395
+ },
161624
162396
  {
161625
162397
  "kind": "method",
161626
162398
  "name": "dismiss",
@@ -172932,6 +173704,35 @@
172932
173704
  "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
172933
173705
  }
172934
173706
  },
173707
+ {
173708
+ "kind": "field",
173709
+ "name": "present",
173710
+ "type": {
173711
+ "text": "boolean"
173712
+ },
173713
+ "privacy": "protected",
173714
+ "description": "Whether the element is still on the page for a reader, which is what\nthe focus hand-off waits on: connected, for a surface the page removes.\nA surface that hides itself says it is gone once hidden, and calls\n`handFocusOn` then.",
173715
+ "readonly": true,
173716
+ "inheritedFrom": {
173717
+ "name": "MixinDismissible",
173718
+ "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
173719
+ }
173720
+ },
173721
+ {
173722
+ "kind": "method",
173723
+ "name": "handFocusOn",
173724
+ "privacy": "protected",
173725
+ "return": {
173726
+ "type": {
173727
+ "text": "void"
173728
+ }
173729
+ },
173730
+ "description": "Hands focus on now, where a dismissal is waiting for this element to\ngo: for a surface that hides itself, once it has.",
173731
+ "inheritedFrom": {
173732
+ "name": "MixinDismissible",
173733
+ "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
173734
+ }
173735
+ },
172935
173736
  {
172936
173737
  "kind": "method",
172937
173738
  "name": "stopBeside",
@@ -185390,6 +186191,18 @@
185390
186191
  "description": "The entry that is playing.",
185391
186192
  "name": "current"
185392
186193
  },
186194
+ {
186195
+ "description": "The entry a pointer is dragging, in a `reorderable` playlist.",
186196
+ "name": "dragging"
186197
+ },
186198
+ {
186199
+ "description": "The entry the dragged one would land after, which the drop indicator is drawn under.",
186200
+ "name": "drop-after"
186201
+ },
186202
+ {
186203
+ "description": "The entry the dragged one would land before, which the drop indicator is drawn over.",
186204
+ "name": "drop-before"
186205
+ },
185393
186206
  {
185394
186207
  "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
185395
186208
  "name": "settled",
@@ -186262,7 +187075,7 @@
186262
187075
  "declarations": [
186263
187076
  {
186264
187077
  "kind": "class",
186265
- "description": "**You slot the player**, so it keeps your appearance, extra controls,\ncaptions, and poster treatment. `Sandbox` takes its preview and `Menu` its\ntrigger the same way.\n\n**Entries are markup.** React skips properties it would set imperatively\nduring hydration, so an array property on a custom element is missing on the\nfirst paint of a server-rendered page. `using-the-elements.mdx` has the\nmeasurement. Markup also makes each entry a real button with its name inside.\n\n**The playlist does not play media.** It sets `src` on the player and tracks\nwhich entry is current. The current entry moves when:\n\n- an entry is pressed,\n- the player dispatches `helix-next` or `helix-previous`, or\n- the player reaches the end.\n\nOn `ended` the playlist advances and the next clip starts playing, because\nthe user already pressed play once. `no-advance` turns that off, and the\nplaylist stays on the entry that ended. `repeat` decides what happens at the\nend: `one` plays the same entry again, and `all` goes from the last entry\nback to the first. Without it, the playlist stops on the last entry and\nsends `helix-end`. `shuffle` plays the entries in a random order, starting\nfrom the one that is current, and `previous` retraces that order.\n\n**`helix-before-activate` says why the playlist is moving**, in\n`detail.cause`: `press` for an entry or a menu choice, `next` and\n`previous` for the player's controls and the methods, `ended` at the end of\na clip, and `removed` when the current entry leaves the playlist. Cancel an\n`ended` move to show your own \"Up next\" countdown, then call `next()`.\n\n**Removing the current entry moves the playlist on**, to the entry after it,\nor to the one before it when it was the last. A clip that was playing keeps\nplaying in the entry that takes its place.\n\n**The player is named by the current entry**, and the device's own media\ncontrols show the entry as the title. A player you gave a `label` keeps\nyour name, and only the title follows the entry.\n\n**Keyboard.** The entries take one stop in the tab order: the entry you\nlast focused, or the current entry before you have focused one. Enter or\nSpace plays it. The arrow keys move focus to the entry before or after, and\nHome and End to the first and the last, passing over disabled entries. The\ncurrent entry carries `aria-current`. While focus is on the player, the\nplayer's own keys work, and `Video` lists them, and Shift with N or P plays\nthe next or the previous entry. The player's previous and next controls\nmove through the entries in the same order the playlist does.\n\n**What a screen reader hears.** A list named by `label`, with a button for\neach entry. When the playlist moves to another entry, by a press, by the\nplayer's controls, or at the end of a clip, a live region says\n`playing-label`, \"Now playing\" and the entry's name.",
187078
+ "description": "**You slot the player**, so it keeps your appearance, extra controls,\ncaptions, and poster treatment. `Sandbox` takes its preview and `Menu` its\ntrigger the same way.\n\n**Entries are markup.** React skips properties it would set imperatively\nduring hydration, so an array property on a custom element is missing on the\nfirst paint of a server-rendered page. `using-the-elements.mdx` has the\nmeasurement. Markup also makes each entry a real button with its name inside.\n\n**The playlist does not play media.** It sets `src` on the player and tracks\nwhich entry is current. The current entry moves when:\n\n- an entry is pressed,\n- the player dispatches `helix-next` or `helix-previous`, or\n- the player reaches the end.\n\nOn `ended` the playlist advances and the next clip starts playing, because\nthe user already pressed play once. `no-advance` turns that off, and the\nplaylist stays on the entry that ended. `repeat` decides what happens at the\nend: `one` plays the same entry again, and `all` goes from the last entry\nback to the first. Without it, the playlist stops on the last entry and\nsends `helix-end`. `shuffle` plays the entries in a random order, starting\nfrom the one that is current, and `previous` retraces that order.\n\n**`helix-before-activate` says why the playlist is moving**, in\n`detail.cause`: `press` for an entry or a menu choice, `next` and\n`previous` for the player's controls and the methods, `ended` at the end of\na clip, and `removed` when the current entry leaves the playlist. Cancel an\n`ended` move to show your own \"Up next\" countdown, then call `next()`.\n\n**Removing the current entry moves the playlist on**, to the entry after it,\nor to the one before it when it was the last. A clip that was playing keeps\nplaying in the entry that takes its place.\n\n**The player is named by the current entry**, and the device's own media\ncontrols show the entry as the title. A player you gave a `label` keeps\nyour name, and only the title follows the entry.\n\n**Keyboard.** The entries take one stop in the tab order: the entry you\nlast focused, or the current entry before you have focused one. Enter or\nSpace plays it. The arrow keys move focus to the entry before or after, and\nHome and End to the first and the last, passing over disabled entries. The\ncurrent entry carries `aria-current`. While focus is on the player, the\nplayer's own keys work, and `Video` lists them, and Shift with N or P plays\nthe next or the previous entry. The player's previous and next controls\nmove through the entries in the same order the playlist does.\n\n**Moving entries.** `reorderable` lets a reader change the order of the\nqueue:\n\n- Alt with Up or Down moves the focused entry a place, and Alt with Home or\n End moves it to either end, as the APG's rearrangeable listbox does.\n Focus stays on it.\n- A pointer drags an entry, with a drop indicator, and the page scrolls near\n an edge. A press that does not travel still plays the entry.\n- A drop sends `helix-before-reorder`, which you can refuse, and then\n `helix-reorder`, whose `keys` hold every entry's `value` in the new order.\n **You move the entries**: the playlist moves no element of yours, and the\n next entry is the one after the current entry in the order you leave.\n- Each move is said in the live region, in words you can change:\n `moved-label`, `dropped-label`, `canceled-label`, and `picked-up-label`.\n\n**What a screen reader hears.** A list named by `label`, with a button for\neach entry. When the playlist moves to another entry, by a press, by the\nplayer's controls, or at the end of a clip, a live region says\n`playing-label`, \"Now playing\" and the entry's name.",
186266
187079
  "name": "HelixHeadlessVideoPlaylist",
186267
187080
  "cssParts": [
186268
187081
  {
@@ -186307,6 +187120,32 @@
186307
187120
  "default": "'helix-video-playlist'",
186308
187121
  "description": "The key this family's words are registered under, its styled tag:\n`registerWords('de', { 'helix-video-playlist': { label: 'Wiedergabeliste' } })`."
186309
187122
  },
187123
+ {
187124
+ "kind": "field",
187125
+ "name": "canceledLabel",
187126
+ "type": {
187127
+ "text": "string"
187128
+ },
187129
+ "default": "'Canceled'",
187130
+ "description": "What screen readers hear when a move is put back, in a `reorderable`\nplaylist. `{name}` is the entry's words.",
187131
+ "attribute": "canceled-label",
187132
+ "helix": {
187133
+ "words": true
187134
+ }
187135
+ },
187136
+ {
187137
+ "kind": "field",
187138
+ "name": "droppedLabel",
187139
+ "type": {
187140
+ "text": "string"
187141
+ },
187142
+ "default": "'Dropped'",
187143
+ "description": "What screen readers hear when a moved entry is let go, in a `reorderable`\nplaylist. `{name}` is the entry's words.",
187144
+ "attribute": "dropped-label",
187145
+ "helix": {
187146
+ "words": true
187147
+ }
187148
+ },
186310
187149
  {
186311
187150
  "kind": "field",
186312
187151
  "name": "emptyLabel",
@@ -186333,6 +187172,19 @@
186333
187172
  "words": true
186334
187173
  }
186335
187174
  },
187175
+ {
187176
+ "kind": "field",
187177
+ "name": "movedLabel",
187178
+ "type": {
187179
+ "text": "string"
187180
+ },
187181
+ "default": "'{name} moved to position {position} of {count}'",
187182
+ "description": "What screen readers hear each time a key moves an entry, in a\n`reorderable` playlist. `{name}` is the entry's words, `{position}` its\nnew place, counting from 1, and `{count}` the number of entries.",
187183
+ "attribute": "moved-label",
187184
+ "helix": {
187185
+ "words": true
187186
+ }
187187
+ },
186336
187188
  {
186337
187189
  "kind": "field",
186338
187190
  "name": "noAdvance",
@@ -186343,6 +187195,19 @@
186343
187195
  "description": "Stays on an entry when its clip ends, where the playlist would otherwise\nplay the next one. The player's controls, a press, and `next()` still\nmove. `repeat=\"one\"` still plays the entry again.",
186344
187196
  "attribute": "no-advance"
186345
187197
  },
187198
+ {
187199
+ "kind": "field",
187200
+ "name": "pickedUpLabel",
187201
+ "type": {
187202
+ "text": "string"
187203
+ },
187204
+ "default": "'Picked up {name}'",
187205
+ "description": "What screen readers hear when a pointer picks up an entry, in a\n`reorderable` playlist. `{name}` is the entry's words.",
187206
+ "attribute": "picked-up-label",
187207
+ "helix": {
187208
+ "words": true
187209
+ }
187210
+ },
186346
187211
  {
186347
187212
  "kind": "field",
186348
187213
  "name": "playingLabel",
@@ -186356,6 +187221,17 @@
186356
187221
  "words": true
186357
187222
  }
186358
187223
  },
187224
+ {
187225
+ "kind": "field",
187226
+ "name": "reorderable",
187227
+ "type": {
187228
+ "text": "boolean"
187229
+ },
187230
+ "default": "false",
187231
+ "description": "Lets a reader move the entries, with Alt and the arrow keys or by\ndragging one. The playlist moves no entry itself: you move your entries\non `helix-reorder`.",
187232
+ "attribute": "reorderable",
187233
+ "reflects": true
187234
+ },
186359
187235
  {
186360
187236
  "kind": "field",
186361
187237
  "name": "status",
@@ -186364,6 +187240,63 @@
186364
187240
  "default": "new StatusController(this)",
186365
187241
  "description": "The live region, rendered from the first move."
186366
187242
  },
187243
+ {
187244
+ "kind": "method",
187245
+ "name": "entryOf",
187246
+ "privacy": "private",
187247
+ "return": {
187248
+ "type": {
187249
+ "text": "HelixHeadlessVideoPlaylistItem | undefined"
187250
+ }
187251
+ },
187252
+ "parameters": [
187253
+ {
187254
+ "name": "event",
187255
+ "type": {
187256
+ "text": "Event"
187257
+ }
187258
+ }
187259
+ ],
187260
+ "description": "The entry an event passed through, where it may move."
187261
+ },
187262
+ {
187263
+ "kind": "method",
187264
+ "name": "entryFor",
187265
+ "privacy": "private",
187266
+ "return": {
187267
+ "type": {
187268
+ "text": "HelixHeadlessVideoPlaylistItem | undefined"
187269
+ }
187270
+ },
187271
+ "parameters": [
187272
+ {
187273
+ "name": "value",
187274
+ "type": {
187275
+ "text": "string"
187276
+ }
187277
+ }
187278
+ ],
187279
+ "description": "The entry with that value."
187280
+ },
187281
+ {
187282
+ "kind": "field",
187283
+ "name": "reorder",
187284
+ "privacy": "private",
187285
+ "readonly": true,
187286
+ "default": "new ReorderController(this, { axis: 'block', box: (value) => this.entryFor(value)?.getBoundingClientRect(), current: (event) => this.entryOf(event)?.value, grip: (event) => { const entry = this.entryOf(event) return entry ? { element: entry, key: entry.value } : undefined }, holds: false, keys: () => this.items.map((one) => one.value), name: (value) => this.entryFor(value)?.text || value, refocus: (value) => this.entryFor(value)?.focus(), say: (words) => this.status.say(words), })",
187287
+ "description": "Moving the entries, as a listbox moves its options: Alt with the arrows\non the focused entry, or a pointer dragging a whole entry, where a press\nthat does not travel still plays it."
187288
+ },
187289
+ {
187290
+ "kind": "method",
187291
+ "name": "markMoves",
187292
+ "privacy": "private",
187293
+ "return": {
187294
+ "type": {
187295
+ "text": "void"
187296
+ }
187297
+ },
187298
+ "description": "Tells each entry where it stands in a move, which it says through its\nstates for the styled tier to draw: the entry dragged, and the one the\ndrop indicator is before or after."
187299
+ },
186367
187300
  {
186368
187301
  "kind": "field",
186369
187302
  "name": "repeat",
@@ -187122,6 +188055,14 @@
187122
188055
  "name": "helix-before-activate",
187123
188056
  "reactProp": "onhelix-before-activate"
187124
188057
  },
188058
+ {
188059
+ "type": {
188060
+ "text": "HelixBeforeReorderEvent"
188061
+ },
188062
+ "description": "An entry was moved to a new place, in a `reorderable` playlist, with every entry's value in the new order in `detail.keys`. Cancelable: cancel it to keep the entry where it is.",
188063
+ "name": "helix-before-reorder",
188064
+ "reactProp": "onhelix-before-reorder"
188065
+ },
187125
188066
  {
187126
188067
  "type": {
187127
188068
  "text": "HelixEndEvent"
@@ -187129,9 +188070,35 @@
187129
188070
  "description": "The last entry finished playing, and the playlist stopped there. Not sent while `repeat` is set.",
187130
188071
  "name": "helix-end",
187131
188072
  "reactProp": "onhelix-end"
188073
+ },
188074
+ {
188075
+ "type": {
188076
+ "text": "HelixReorderEvent"
188077
+ },
188078
+ "description": "Fired after `helix-before-reorder` when nobody canceled it. Move your entries to the order in `keys`. Cancelable: cancel it to say the move did not happen.",
188079
+ "name": "helix-reorder",
188080
+ "reactProp": "onhelix-reorder"
187132
188081
  }
187133
188082
  ],
187134
188083
  "attributes": [
188084
+ {
188085
+ "name": "canceled-label",
188086
+ "type": {
188087
+ "text": "string"
188088
+ },
188089
+ "default": "'Canceled'",
188090
+ "description": "What screen readers hear when a move is put back, in a `reorderable`\nplaylist. `{name}` is the entry's words.",
188091
+ "fieldName": "canceledLabel"
188092
+ },
188093
+ {
188094
+ "name": "dropped-label",
188095
+ "type": {
188096
+ "text": "string"
188097
+ },
188098
+ "default": "'Dropped'",
188099
+ "description": "What screen readers hear when a moved entry is let go, in a `reorderable`\nplaylist. `{name}` is the entry's words.",
188100
+ "fieldName": "droppedLabel"
188101
+ },
187135
188102
  {
187136
188103
  "name": "empty-label",
187137
188104
  "type": {
@@ -187150,6 +188117,15 @@
187150
188117
  "description": "The list's name, read by screen readers.",
187151
188118
  "fieldName": "label"
187152
188119
  },
188120
+ {
188121
+ "name": "moved-label",
188122
+ "type": {
188123
+ "text": "string"
188124
+ },
188125
+ "default": "'{name} moved to position {position} of {count}'",
188126
+ "description": "What screen readers hear each time a key moves an entry, in a\n`reorderable` playlist. `{name}` is the entry's words, `{position}` its\nnew place, counting from 1, and `{count}` the number of entries.",
188127
+ "fieldName": "movedLabel"
188128
+ },
187153
188129
  {
187154
188130
  "name": "no-advance",
187155
188131
  "type": {
@@ -187159,6 +188135,15 @@
187159
188135
  "description": "Stays on an entry when its clip ends, where the playlist would otherwise\nplay the next one. The player's controls, a press, and `next()` still\nmove. `repeat=\"one\"` still plays the entry again.",
187160
188136
  "fieldName": "noAdvance"
187161
188137
  },
188138
+ {
188139
+ "name": "picked-up-label",
188140
+ "type": {
188141
+ "text": "string"
188142
+ },
188143
+ "default": "'Picked up {name}'",
188144
+ "description": "What screen readers hear when a pointer picks up an entry, in a\n`reorderable` playlist. `{name}` is the entry's words.",
188145
+ "fieldName": "pickedUpLabel"
188146
+ },
187162
188147
  {
187163
188148
  "name": "playing-label",
187164
188149
  "type": {
@@ -187168,6 +188153,15 @@
187168
188153
  "description": "What the live region says when the playlist moves to another entry.\n`{title}` is the entry's name.\n\n**A move a reader did not make is said.** At the end of a clip the\nplaylist starts the next one, and the only other trace of that is the\n`aria-current` on a button the reader is not on.",
187169
188154
  "fieldName": "playingLabel"
187170
188155
  },
188156
+ {
188157
+ "name": "reorderable",
188158
+ "type": {
188159
+ "text": "boolean"
188160
+ },
188161
+ "default": "false",
188162
+ "description": "Lets a reader move the entries, with Alt and the arrow keys or by\ndragging one. The playlist moves no entry itself: you move your entries\non `helix-reorder`.",
188163
+ "fieldName": "reorderable"
188164
+ },
187171
188165
  {
187172
188166
  "name": "repeat",
187173
188167
  "type": {
@@ -192420,6 +193414,6 @@
192420
193414
  ],
192421
193415
  "helix": {
192422
193416
  "package": "@fusion.dev/helix-headless",
192423
- "version": "0.162.1"
193417
+ "version": "0.164.0"
192424
193418
  }
192425
193419
  }