@fusion.dev/helix-headless 0.162.0 → 0.163.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 (44) hide show
  1. package/custom-elements.json +342 -15
  2. package/dist/breadcrumbs/root/breadcrumbs-root.d.ts +3 -1
  3. package/dist/breadcrumbs/root/breadcrumbs-root.js +2 -1
  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 +21 -5
  10. package/dist/chat/root/chat-root.js +21 -9
  11. package/dist/checkbox-group/root/checkbox-group-root.d.ts +3 -1
  12. package/dist/checkbox-group/root/checkbox-group-root.js +2 -1
  13. package/dist/combobox/root/combobox-root.d.ts +8 -1
  14. package/dist/combobox/root/combobox-root.js +5 -1
  15. package/dist/list/root/list-root.d.ts +3 -1
  16. package/dist/list/root/list-root.js +2 -1
  17. package/dist/listbox/root/listbox-root.d.ts +2 -1
  18. package/dist/listbox/root/listbox-root.js +2 -1
  19. package/dist/map/root/map-root.d.ts +8 -1
  20. package/dist/map/root/map-root.js +12 -0
  21. package/dist/menu/item/menu-item.d.ts +38 -7
  22. package/dist/menu/item/menu-item.js +20 -9
  23. package/dist/menu/root/menu-root.d.ts +10 -1
  24. package/dist/menu/root/menu-root.js +8 -3
  25. package/dist/notifications/group/notification-group.d.ts +4 -1
  26. package/dist/notifications/group/notification-group.js +5 -3
  27. package/dist/notifications/root/notifications-root.d.ts +7 -2
  28. package/dist/notifications/root/notifications-root.js +2 -1
  29. package/dist/radio/group/radio-group.d.ts +2 -1
  30. package/dist/radio/group/radio-group.js +2 -1
  31. package/dist/select/root/select-root.d.ts +8 -1
  32. package/dist/select/root/select-root.js +5 -1
  33. package/dist/steps/root/steps-root.d.ts +7 -1
  34. package/dist/steps/root/steps-root.js +6 -1
  35. package/dist/tag/group/tag-group.d.ts +3 -1
  36. package/dist/tag/group/tag-group.js +2 -1
  37. package/dist/toggle/group/toggle-group.d.ts +2 -1
  38. package/dist/toggle/group/toggle-group.js +4 -1
  39. package/dist/tree/root/tree-root.d.ts +2 -1
  40. package/dist/tree/root/tree-root.js +4 -1
  41. package/lint.json +1 -1
  42. package/package.json +5 -5
  43. package/types/jsx.d.ts +162 -24
  44. package/types/vue.d.ts +40 -7
@@ -9988,6 +9988,14 @@
9988
9988
  "readonly": true,
9989
9989
  "description": "New crumbs fold again, as a new `items` does."
9990
9990
  },
9991
+ {
9992
+ "kind": "field",
9993
+ "name": "upgradeWatch",
9994
+ "privacy": "protected",
9995
+ "readonly": true,
9996
+ "default": "new UpgradeController(this, this.handleSlotChange)",
9997
+ "description": "Reads a crumb again once it upgrades, so the current one is marked."
9998
+ },
9991
9999
  {
9992
10000
  "kind": "method",
9993
10001
  "name": "renderItems",
@@ -14402,6 +14410,22 @@
14402
14410
  "module": "./root/canvas-root.js"
14403
14411
  }
14404
14412
  },
14413
+ {
14414
+ "kind": "js",
14415
+ "name": "CanvasRoute",
14416
+ "declaration": {
14417
+ "name": "CanvasRoute",
14418
+ "module": "./root/canvas-root.js"
14419
+ }
14420
+ },
14421
+ {
14422
+ "kind": "js",
14423
+ "name": "CanvasRouteEnds",
14424
+ "declaration": {
14425
+ "name": "CanvasRouteEnds",
14426
+ "module": "./root/canvas-root.js"
14427
+ }
14428
+ },
14405
14429
  {
14406
14430
  "kind": "js",
14407
14431
  "name": "CanvasSide",
@@ -15622,7 +15646,7 @@
15622
15646
  "declarations": [
15623
15647
  {
15624
15648
  "kind": "class",
15625
- "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.",
15649
+ "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.",
15626
15650
  "name": "HelixHeadlessCanvas",
15627
15651
  "cssProperties": [
15628
15652
  {
@@ -15699,6 +15723,18 @@
15699
15723
  "description": "The box a Shift-drag across the empty board draws, which selects the cards it touches.",
15700
15724
  "name": "marquee"
15701
15725
  },
15726
+ {
15727
+ "description": "The picture of the whole board, under `controls=\"minimap\"`.",
15728
+ "name": "minimap"
15729
+ },
15730
+ {
15731
+ "description": "One card in the minimap.",
15732
+ "name": "minimap-node"
15733
+ },
15734
+ {
15735
+ "description": "The frame in the minimap around what is on screen.",
15736
+ "name": "minimap-view"
15737
+ },
15702
15738
  {
15703
15739
  "description": "The button that moves the board down.",
15704
15740
  "name": "pan-down"
@@ -15911,6 +15947,14 @@
15911
15947
  "words": true
15912
15948
  }
15913
15949
  },
15950
+ {
15951
+ "kind": "field",
15952
+ "name": "edgeRoute",
15953
+ "type": {
15954
+ "text": "CanvasRoute | undefined"
15955
+ },
15956
+ "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."
15957
+ },
15914
15958
  {
15915
15959
  "kind": "field",
15916
15960
  "name": "fallbackLabel",
@@ -17110,6 +17154,49 @@
17110
17154
  ],
17111
17155
  "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."
17112
17156
  },
17157
+ {
17158
+ "kind": "method",
17159
+ "name": "draw",
17160
+ "privacy": "private",
17161
+ "return": {
17162
+ "type": {
17163
+ "text": "{ d: string; mid: { x: number; y: number } }"
17164
+ }
17165
+ },
17166
+ "parameters": [
17167
+ {
17168
+ "name": "edge",
17169
+ "type": {
17170
+ "text": "CanvasEdge"
17171
+ }
17172
+ },
17173
+ {
17174
+ "name": "from",
17175
+ "type": {
17176
+ "text": "CanvasNode"
17177
+ }
17178
+ },
17179
+ {
17180
+ "name": "to",
17181
+ "type": {
17182
+ "text": "CanvasNode"
17183
+ }
17184
+ },
17185
+ {
17186
+ "name": "path",
17187
+ "type": {
17188
+ "text": "CanvasPath"
17189
+ }
17190
+ },
17191
+ {
17192
+ "name": "drawnHeads",
17193
+ "type": {
17194
+ "text": "{ start: boolean; end: boolean }"
17195
+ }
17196
+ }
17197
+ ],
17198
+ "description": "One connection's line, by `edgeRoute` where it draws one, and by the board's own where not."
17199
+ },
17113
17200
  {
17114
17201
  "kind": "method",
17115
17202
  "name": "cardOf",
@@ -18403,6 +18490,44 @@
18403
18490
  ],
18404
18491
  "description": "The connection being made, drawn from where it starts to the pointer, or to\nthe card a keyboard reader is on."
18405
18492
  },
18493
+ {
18494
+ "kind": "field",
18495
+ "name": "onScreen",
18496
+ "type": {
18497
+ "text": "{ x: number; y: number; width: number; height: number }"
18498
+ },
18499
+ "privacy": "private",
18500
+ "description": "The part of the document on screen, in its own units.",
18501
+ "readonly": true
18502
+ },
18503
+ {
18504
+ "kind": "field",
18505
+ "name": "minimapArea",
18506
+ "type": {
18507
+ "text": "{ x: number; y: number; width: number; height: number }"
18508
+ },
18509
+ "privacy": "private",
18510
+ "description": "What the minimap shows: every card and what is on screen, with room around them.",
18511
+ "readonly": true
18512
+ },
18513
+ {
18514
+ "kind": "field",
18515
+ "name": "handleMinimapPointer",
18516
+ "privacy": "private",
18517
+ "readonly": true,
18518
+ "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."
18519
+ },
18520
+ {
18521
+ "kind": "method",
18522
+ "name": "renderMinimap",
18523
+ "privacy": "private",
18524
+ "return": {
18525
+ "type": {
18526
+ "text": "TemplateResult | typeof nothing"
18527
+ }
18528
+ },
18529
+ "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."
18530
+ },
18406
18531
  {
18407
18532
  "kind": "field",
18408
18533
  "name": "controls",
@@ -20087,6 +20212,22 @@
20087
20212
  "module": "./canvas-document.js"
20088
20213
  }
20089
20214
  },
20215
+ {
20216
+ "kind": "js",
20217
+ "name": "CanvasRoute",
20218
+ "declaration": {
20219
+ "name": "CanvasRoute",
20220
+ "module": "./canvas-document.js"
20221
+ }
20222
+ },
20223
+ {
20224
+ "kind": "js",
20225
+ "name": "CanvasRouteEnds",
20226
+ "declaration": {
20227
+ "name": "CanvasRouteEnds",
20228
+ "module": "./canvas-document.js"
20229
+ }
20230
+ },
20090
20231
  {
20091
20232
  "kind": "js",
20092
20233
  "name": "CanvasSide",
@@ -25299,6 +25440,14 @@
25299
25440
  "default": "new ChildrenController(this, () => this.handleSlotChange())",
25300
25441
  "description": "Watches for turns arriving, since a manual slot hears nothing about them.\n\n**A turn that arrives after first paint reaches nothing on its own.**\nSlots are assigned by hand here, so appending a child assigns it to\nnothing, fires no `slotchange`, and schedules no render: the transcript\nwent on showing \"Nothing to show\" over six children it already had, and\nthe one thing a conversation does is grow. Measured with\n`assignedElements()` at zero against `children` at nine. Children only,\nnever a turn's own text, which a streaming turn rewrites every frame."
25301
25442
  },
25443
+ {
25444
+ "kind": "field",
25445
+ "name": "upgradeWatch",
25446
+ "privacy": "protected",
25447
+ "readonly": true,
25448
+ "default": "new UpgradeController(this, () => this.handleSlotChange())",
25449
+ "description": "Hears a message upgrade after it arrived. A message is known by its marker,\nwhich an element that has not upgraded lacks, so it was assigned nowhere."
25450
+ },
25302
25451
  {
25303
25452
  "kind": "field",
25304
25453
  "name": "settling",
@@ -25790,7 +25939,35 @@
25790
25939
  }
25791
25940
  }
25792
25941
  ],
25793
- "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."
25942
+ "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."
25943
+ },
25944
+ {
25945
+ "kind": "field",
25946
+ "name": "stop",
25947
+ "type": {
25948
+ "text": "HTMLElement | undefined"
25949
+ },
25950
+ "privacy": "private",
25951
+ "description": "The turn that is a tab stop because a reader moved to it."
25952
+ },
25953
+ {
25954
+ "kind": "method",
25955
+ "name": "visit",
25956
+ "privacy": "private",
25957
+ "return": {
25958
+ "type": {
25959
+ "text": "void"
25960
+ }
25961
+ },
25962
+ "parameters": [
25963
+ {
25964
+ "name": "turn",
25965
+ "type": {
25966
+ "text": "HTMLElement"
25967
+ }
25968
+ }
25969
+ ],
25970
+ "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."
25794
25971
  },
25795
25972
  {
25796
25973
  "kind": "method",
@@ -26947,6 +27124,14 @@
26947
27124
  "privacy": "private",
26948
27125
  "description": "Watches for boxes arriving inside a wrapper, which no slot reports."
26949
27126
  },
27127
+ {
27128
+ "kind": "field",
27129
+ "name": "upgradeWatch",
27130
+ "privacy": "protected",
27131
+ "readonly": true,
27132
+ "default": "new UpgradeController(this, undefined, { subtree: true })",
27133
+ "description": "Reads a box again once it upgrades, so it takes the group's name and value."
27134
+ },
26950
27135
  {
26951
27136
  "kind": "field",
26952
27137
  "name": "judged",
@@ -38568,6 +38753,14 @@
38568
38753
  "privacy": "private",
38569
38754
  "readonly": true
38570
38755
  },
38756
+ {
38757
+ "kind": "field",
38758
+ "name": "upgradeWatch",
38759
+ "privacy": "protected",
38760
+ "readonly": true,
38761
+ "default": "new UpgradeController( this, () => { this.listbox?.requestUpdate() this.requestUpdate() }, { subtree: true }, )",
38762
+ "description": "Hears an option upgrade after it arrived. The options are this element's\nchildren, which the listbox reaches through a slot and does not watch, so\nboth read them again: the listbox to select the one `value` names, and this\nelement for the words in its field."
38763
+ },
38571
38764
  {
38572
38765
  "kind": "field",
38573
38766
  "name": "panel",
@@ -91710,6 +91903,14 @@
91710
91903
  "privacy": "private",
91711
91904
  "readonly": true
91712
91905
  },
91906
+ {
91907
+ "kind": "field",
91908
+ "name": "upgradeWatch",
91909
+ "privacy": "protected",
91910
+ "readonly": true,
91911
+ "default": "new UpgradeController(this, this.handleSlotChange)",
91912
+ "description": "Reads an item again once it upgrades, so it takes the role the list gives its rows."
91913
+ },
91713
91914
  {
91714
91915
  "kind": "field",
91715
91916
  "name": "tier",
@@ -93208,6 +93409,13 @@
93208
93409
  "description": "Every option, in the order they appear.\n\nDescendants rather than children, because a group puts a level between the\nlist and its options and the keyboard has to move through a grouped list\nexactly as it moves through a flat one.",
93209
93410
  "readonly": true
93210
93411
  },
93412
+ {
93413
+ "kind": "field",
93414
+ "name": "upgradeWatch",
93415
+ "privacy": "protected",
93416
+ "readonly": true,
93417
+ "default": "new UpgradeController(this, undefined, { subtree: true })"
93418
+ },
93211
93419
  {
93212
93420
  "kind": "method",
93213
93421
  "name": "among",
@@ -101238,7 +101446,7 @@
101238
101446
  "declarations": [
101239
101447
  {
101240
101448
  "kind": "class",
101241
- "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.",
101449
+ "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.",
101242
101450
  "name": "HelixHeadlessMap",
101243
101451
  "cssProperties": [
101244
101452
  {
@@ -102021,6 +102229,13 @@
102021
102229
  "readonly": true,
102022
102230
  "description": "Closes the layers menu on a press anywhere outside the frame."
102023
102231
  },
102232
+ {
102233
+ "kind": "field",
102234
+ "name": "handleMenuFocusOut",
102235
+ "privacy": "private",
102236
+ "readonly": true,
102237
+ "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."
102238
+ },
102024
102239
  {
102025
102240
  "kind": "field",
102026
102241
  "name": "handleMenuKeydown",
@@ -106721,7 +106936,7 @@
106721
106936
  "declarations": [
106722
106937
  {
106723
106938
  "kind": "class",
106724
- "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.",
106939
+ "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.",
106725
106940
  "name": "HelixHeadlessMenuItem",
106726
106941
  "cssParts": [
106727
106942
  {
@@ -106799,7 +107014,7 @@
106799
107014
  "text": "boolean"
106800
107015
  },
106801
107016
  "default": "false",
106802
- "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.",
107017
+ "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.",
106803
107018
  "attribute": "checkable",
106804
107019
  "reflects": true
106805
107020
  },
@@ -106813,6 +107028,15 @@
106813
107028
  "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.",
106814
107029
  "attribute": "checked"
106815
107030
  },
107031
+ {
107032
+ "kind": "field",
107033
+ "name": "closeOnSelect",
107034
+ "type": {
107035
+ "text": "boolean | undefined"
107036
+ },
107037
+ "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.",
107038
+ "attribute": "close-on-select"
107039
+ },
106816
107040
  {
106817
107041
  "kind": "field",
106818
107042
  "name": "disabled",
@@ -106841,7 +107065,7 @@
106841
107065
  "text": "boolean"
106842
107066
  },
106843
107067
  "default": "false",
106844
- "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.",
107068
+ "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.",
106845
107069
  "attribute": "exclusive",
106846
107070
  "reflects": true
106847
107071
  },
@@ -107099,7 +107323,14 @@
107099
107323
  "type": {
107100
107324
  "text": "void"
107101
107325
  }
107102
- }
107326
+ },
107327
+ "parameters": [
107328
+ {
107329
+ "name": "space",
107330
+ "default": "false"
107331
+ }
107332
+ ],
107333
+ "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."
107103
107334
  },
107104
107335
  {
107105
107336
  "kind": "field",
@@ -107107,6 +107338,16 @@
107107
107338
  "privacy": "private",
107108
107339
  "readonly": true
107109
107340
  },
107341
+ {
107342
+ "kind": "field",
107343
+ "name": "spacePressed",
107344
+ "type": {
107345
+ "text": "boolean"
107346
+ },
107347
+ "privacy": "private",
107348
+ "default": "false",
107349
+ "description": "Whether the click on its way is the one a Space on a linked row sent."
107350
+ },
107110
107351
  {
107111
107352
  "kind": "field",
107112
107353
  "name": "handleKeydown",
@@ -107498,7 +107739,7 @@
107498
107739
  "text": "boolean"
107499
107740
  },
107500
107741
  "default": "false",
107501
- "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.",
107742
+ "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.",
107502
107743
  "fieldName": "checkable"
107503
107744
  },
107504
107745
  {
@@ -107510,6 +107751,14 @@
107510
107751
  "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.",
107511
107752
  "fieldName": "checked"
107512
107753
  },
107754
+ {
107755
+ "name": "close-on-select",
107756
+ "type": {
107757
+ "text": "boolean | undefined"
107758
+ },
107759
+ "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.",
107760
+ "fieldName": "closeOnSelect"
107761
+ },
107513
107762
  {
107514
107763
  "name": "disabled",
107515
107764
  "type": {
@@ -107534,7 +107783,7 @@
107534
107783
  "text": "boolean"
107535
107784
  },
107536
107785
  "default": "false",
107537
- "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.",
107786
+ "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.",
107538
107787
  "fieldName": "exclusive"
107539
107788
  },
107540
107789
  {
@@ -107656,7 +107905,7 @@
107656
107905
  "declarations": [
107657
107906
  {
107658
107907
  "kind": "class",
107659
- "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.",
107908
+ "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.",
107660
107909
  "name": "HelixHeadlessMenu",
107661
107910
  "cssProperties": [
107662
107911
  {
@@ -107740,6 +107989,16 @@
107740
107989
  "words": true
107741
107990
  }
107742
107991
  },
107992
+ {
107993
+ "kind": "field",
107994
+ "name": "closeOnSelect",
107995
+ "type": {
107996
+ "text": "boolean"
107997
+ },
107998
+ "default": "true",
107999
+ "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.",
108000
+ "attribute": "close-on-select"
108001
+ },
107743
108002
  {
107744
108003
  "kind": "field",
107745
108004
  "name": "context",
@@ -109099,6 +109358,15 @@
109099
109358
  "description": "The text of the row that returns from a submenu.",
109100
109359
  "fieldName": "backLabel"
109101
109360
  },
109361
+ {
109362
+ "name": "close-on-select",
109363
+ "type": {
109364
+ "text": "boolean"
109365
+ },
109366
+ "default": "true",
109367
+ "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.",
109368
+ "fieldName": "closeOnSelect"
109369
+ },
109102
109370
  {
109103
109371
  "name": "context",
109104
109372
  "type": {
@@ -111540,13 +111808,27 @@
111540
111808
  },
111541
111809
  "description": "Puts the rows the group is showing into the slot, and the rest nowhere.\n\n**Assignment rather than hiding, which is what makes this work with no\nstylesheet.** A row that is not assigned to a slot renders nothing at all:\nit is out of the layout, out of the tab order and out of the accessibility\ntree, in both tiers, without a rule anywhere. `hidden` would do the first\nthree and `inert` only the last two, and either would put the collapse in a\nplace a headless consumer has to re-implement.\n\nCollapsed keeps the first row rather than none, because a group folded to\nnothing is a heading with a number after it and no reason to believe there\nis anything behind it. The one row is the evidence."
111542
111810
  },
111811
+ {
111812
+ "kind": "field",
111813
+ "name": "recount",
111814
+ "privacy": "private",
111815
+ "readonly": true,
111816
+ "description": "Hears a row arrive after the render. The slot is assigned by hand, so a\nnew row is in no slot and sends no `slotchange` to say it came. The feed\nthe group is in is asked to update as well, since it counts the group's\nrows and does not watch inside the group."
111817
+ },
111543
111818
  {
111544
111819
  "kind": "field",
111545
111820
  "name": "childWatch",
111546
111821
  "privacy": "protected",
111547
111822
  "readonly": true,
111548
- "default": "new ChildrenController(this, () => { this.requestUpdate() ;(this.parentElement as Partial<Pick<HelixElement, 'requestUpdate'>> | null)?.requestUpdate?.() })",
111549
- "description": "Hears a row arrive after the render. The slot is assigned by hand, so a\nnew row is in no slot and sends no `slotchange` to say it came. The feed\nthe group is in is asked to update as well, since it counts the group's\nrows and does not watch inside the group."
111823
+ "default": "new ChildrenController(this, this.recount)"
111824
+ },
111825
+ {
111826
+ "kind": "field",
111827
+ "name": "upgradeWatch",
111828
+ "privacy": "protected",
111829
+ "readonly": true,
111830
+ "default": "new UpgradeController(this, this.recount)",
111831
+ "description": "Hears a row upgrade after it arrived, which neither the slot nor `childWatch` reports."
111550
111832
  },
111551
111833
  {
111552
111834
  "kind": "field",
@@ -113424,6 +113706,14 @@
113424
113706
  "default": "new ChildrenController(this, this.handleSlotChange)",
113425
113707
  "description": "Hears a row arrive after the render. The list slot is assigned by hand, so\na new row is in no slot and sends no `slotchange`: without this it was\ndrawn nowhere and an emptied feed kept saying it was empty. A row added to\na group is the group's to hear, and the group asks the feed to count again."
113426
113708
  },
113709
+ {
113710
+ "kind": "field",
113711
+ "name": "upgradeWatch",
113712
+ "privacy": "protected",
113713
+ "readonly": true,
113714
+ "default": "new UpgradeController(this, this.handleSlotChange)",
113715
+ "description": "Hears a row upgrade after it arrived. A row is known by its marker, which\nan element that has not upgraded lacks, so the row was assigned nowhere."
113716
+ },
113427
113717
  {
113428
113718
  "kind": "field",
113429
113719
  "name": "handleRead",
@@ -113616,7 +113906,7 @@
113616
113906
  "text": "void"
113617
113907
  }
113618
113908
  },
113619
- "description": "Says whether anything in the feed has media, so every item can hold the\ncolumn open whether or not it has one of its own.\n\n**A fact no item can answer for itself**, which is why it is here. An item\nknows about its own media slot and nothing about its neighbors, so a feed\nwhere some rows have an avatar and some do not draws two different left\nedges for its text: measured on a four item feed, the rows without media\nstarted their text 32 pixels to the left of the rows with it. The styled\ntier turns this into a width; this tier ships no stylesheet and is\nunaffected.\n\n**What is asked of each row is its light DOM, not the row.** A notification\npublishes no property for this, and asking one would make the answer depend\non the row having drawn itself; a `[slot=\"media\"]` child is there from the\nmoment the markup is parsed. The rows themselves come from `items`, which\ndoes need them upgraded, and that is the honest limit rather than a claim\nthis had made the other way: a row that upgrades late is counted on the next\nupdate, which its own `slotchange` asks for."
113909
+ "description": "Says whether anything in the feed has media, so every item can hold the\ncolumn open whether or not it has one of its own.\n\n**A fact no item can answer for itself**, which is why it is here. An item\nknows about its own media slot and nothing about its neighbors, so a feed\nwhere some rows have an avatar and some do not draws two different left\nedges for its text: measured on a four item feed, the rows without media\nstarted their text 32 pixels to the left of the rows with it. The styled\ntier turns this into a width; this tier ships no stylesheet and is\nunaffected.\n\n**What is asked of each row is its light DOM, not the row.** A notification\npublishes no property for this, and asking one would make the answer depend\non the row having drawn itself; a `[slot=\"media\"]` child is there from the\nmoment the markup is parsed. The rows themselves come from `items`, which\ndoes need them upgraded, and that is the honest limit rather than a claim\nthis had made the other way: a row that upgrades late is counted on the next\nupdate, which `UpgradeController` asks for when its definition arrives."
113620
113910
  },
113621
113911
  {
113622
113912
  "kind": "method",
@@ -130370,6 +130660,13 @@
130370
130660
  },
130371
130661
  "privacy": "private"
130372
130662
  },
130663
+ {
130664
+ "kind": "field",
130665
+ "name": "upgradeWatch",
130666
+ "privacy": "protected",
130667
+ "readonly": true,
130668
+ "default": "new UpgradeController(this, undefined, { subtree: true })"
130669
+ },
130373
130670
  {
130374
130671
  "kind": "field",
130375
130672
  "name": "handleSelection",
@@ -138065,6 +138362,14 @@
138065
138362
  "description": "The list inside the surface, or nothing where there is no DOM to hold one.\n\nThe optional chain is the server. `renderRoot` is a property Lit's element\nshim does not carry, and this getter is reached from `display`, which is\nread during `render`: without it the select throws on every server render\nand cannot be served at all.\n\nThe other reads of `renderRoot` here are inside callbacks the controllers\ninvoke, and a controller only runs on a connected element, so they cannot\nbe reached from the server and are left plain.",
138066
138363
  "readonly": true
138067
138364
  },
138365
+ {
138366
+ "kind": "field",
138367
+ "name": "upgradeWatch",
138368
+ "privacy": "protected",
138369
+ "readonly": true,
138370
+ "default": "new UpgradeController( this, () => { this.listbox?.requestUpdate() this.requestUpdate() }, { subtree: true }, )",
138371
+ "description": "Hears an option upgrade after it arrived. The options are this element's\nchildren, which the listbox reaches through a slot and does not watch, so\nboth read them again: the listbox to select the one `value` names, and this\nelement for the words on its trigger."
138372
+ },
138068
138373
  {
138069
138374
  "kind": "field",
138070
138375
  "name": "panel",
@@ -149879,7 +150184,7 @@
149879
150184
  "text": "number"
149880
150185
  },
149881
150186
  "privacy": "private",
149882
- "description": "The index of the stage the reader is on, or `-1`.",
150187
+ "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.",
149883
150188
  "readonly": true
149884
150189
  },
149885
150190
  {
@@ -160781,6 +161086,14 @@
160781
161086
  "privacy": "private",
160782
161087
  "readonly": true
160783
161088
  },
161089
+ {
161090
+ "kind": "field",
161091
+ "name": "upgradeWatch",
161092
+ "privacy": "protected",
161093
+ "readonly": true,
161094
+ "default": "new UpgradeController(this, this.handleSlotchange)",
161095
+ "description": "Reads a tag again once it upgrades, so it takes its role and its place."
161096
+ },
160784
161097
  {
160785
161098
  "kind": "field",
160786
161099
  "name": "handleFocusin",
@@ -174583,6 +174896,13 @@
174583
174896
  },
174584
174897
  "privacy": "private"
174585
174898
  },
174899
+ {
174900
+ "kind": "field",
174901
+ "name": "upgradeWatch",
174902
+ "privacy": "protected",
174903
+ "readonly": true,
174904
+ "default": "new UpgradeController(this, () => this.handleItems(), { subtree: true, })"
174905
+ },
174586
174906
  {
174587
174907
  "kind": "field",
174588
174908
  "name": "handleSelection",
@@ -182498,6 +182818,13 @@
182498
182818
  },
182499
182819
  "privacy": "private"
182500
182820
  },
182821
+ {
182822
+ "kind": "field",
182823
+ "name": "upgradeWatch",
182824
+ "privacy": "protected",
182825
+ "readonly": true,
182826
+ "default": "new UpgradeController(this, () => this.syncItems(), { subtree: true, })"
182827
+ },
182501
182828
  {
182502
182829
  "kind": "field",
182503
182830
  "name": "focused",
@@ -192314,6 +192641,6 @@
192314
192641
  ],
192315
192642
  "helix": {
192316
192643
  "package": "@fusion.dev/helix-headless",
192317
- "version": "0.162.0"
192644
+ "version": "0.163.0"
192318
192645
  }
192319
192646
  }