@fusion.dev/helix-headless 0.155.0 → 0.157.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 (74) hide show
  1. package/custom-elements.json +2695 -137
  2. package/dist/canvas/node/canvas-node.js +1 -1
  3. package/dist/canvas/root/canvas-root.d.ts +17 -2
  4. package/dist/canvas/root/canvas-root.js +23 -6
  5. package/dist/chat/composer/chat-composer.js +1 -1
  6. package/dist/chat/root/chat-root.d.ts +14 -1
  7. package/dist/chat/root/chat-root.js +14 -4
  8. package/dist/combobox/root/combobox-root.d.ts +10 -0
  9. package/dist/combobox/root/combobox-root.js +18 -3
  10. package/dist/command/root/command-root.d.ts +116 -1
  11. package/dist/command/root/command-root.js +124 -15
  12. package/dist/data-table/root/data-table-root.d.ts +25 -0
  13. package/dist/data-table/root/data-table-root.js +13 -3
  14. package/dist/date-input/root/date-input-root.d.ts +32 -1
  15. package/dist/date-input/root/date-input-root.js +7 -1
  16. package/dist/drilldown/item/drilldown-item.d.ts +49 -1
  17. package/dist/drilldown/item/drilldown-item.js +77 -17
  18. package/dist/drilldown/root/drilldown-root.d.ts +45 -5
  19. package/dist/drilldown/root/drilldown-root.js +51 -5
  20. package/dist/element-events.generated.js +2 -1
  21. package/dist/filter-input/menu/filter-menu.d.ts +1 -0
  22. package/dist/filter-input/menu/filter-menu.js +4 -4
  23. package/dist/graph/root/graph-root.d.ts +13 -0
  24. package/dist/graph/root/graph-root.js +16 -0
  25. package/dist/list/root/list-root.d.ts +74 -1
  26. package/dist/list/root/list-root.js +92 -4
  27. package/dist/list/selection.js +3 -3
  28. package/dist/map/root/map-root.d.ts +6 -0
  29. package/dist/map/root/map-root.js +8 -1
  30. package/dist/megamenu/root/megamenu-root.d.ts +50 -13
  31. package/dist/megamenu/root/megamenu-root.js +44 -6
  32. package/dist/menu/item/menu-item.d.ts +24 -1
  33. package/dist/menu/item/menu-item.js +42 -2
  34. package/dist/menu/root/menu-root.d.ts +120 -9
  35. package/dist/menu/root/menu-root.js +329 -26
  36. package/dist/notifications/root/notifications-root.d.ts +20 -0
  37. package/dist/notifications/root/notifications-root.js +32 -1
  38. package/dist/number-input/root/number-input-root.d.ts +63 -6
  39. package/dist/number-input/root/number-input-root.js +96 -11
  40. package/dist/object-inspector/root/object-inspector-root.d.ts +36 -1
  41. package/dist/object-inspector/root/object-inspector-root.js +26 -2
  42. package/dist/option/root/option-root.d.ts +32 -0
  43. package/dist/option/root/option-root.js +44 -5
  44. package/dist/outline/root/outline-root.d.ts +6 -2
  45. package/dist/outline/root/outline-root.js +7 -3
  46. package/dist/table/root/table-root.d.ts +20 -0
  47. package/dist/table/root/table-root.js +13 -3
  48. package/dist/time-input/root/time-input-root.d.ts +32 -1
  49. package/dist/time-input/root/time-input-root.js +9 -2
  50. package/dist/time-picker/root/time-picker-root.d.ts +63 -1
  51. package/dist/time-picker/root/time-picker-root.js +58 -7
  52. package/dist/timeline/item/timeline-item.d.ts +25 -0
  53. package/dist/timeline/item/timeline-item.js +27 -2
  54. package/dist/toast/item/toast-item.d.ts +26 -0
  55. package/dist/toast/item/toast-item.js +55 -3
  56. package/dist/toast/root/toast-root.d.ts +32 -0
  57. package/dist/toast/root/toast-root.js +47 -2
  58. package/dist/video/root/keys.d.ts +6 -2
  59. package/dist/video/root/keys.js +18 -1
  60. package/dist/video/root/video-root.d.ts +61 -1
  61. package/dist/video/root/video-root.js +79 -11
  62. package/dist/video-playlist/item/video-playlist-item.d.ts +15 -1
  63. package/dist/video-playlist/item/video-playlist-item.js +7 -0
  64. package/dist/video-playlist/menu/video-playlist-menu.d.ts +1 -0
  65. package/dist/video-playlist/menu/video-playlist-menu.js +1 -1
  66. package/dist/video-playlist/root/video-playlist-root.d.ts +43 -4
  67. package/dist/video-playlist/root/video-playlist-root.js +69 -2
  68. package/dist/virtual-list/root/virtual-list-root.d.ts +8 -0
  69. package/dist/virtual-list/root/virtual-list-root.js +3 -0
  70. package/lint.json +1 -1
  71. package/package.json +5 -5
  72. package/types/jsx.d.ts +3346 -266
  73. package/types/vue.d.ts +910 -66
  74. package/types/words.d.ts +124 -0
@@ -15367,8 +15367,14 @@
15367
15367
  "declarations": [
15368
15368
  {
15369
15369
  "kind": "class",
15370
- "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- 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\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.",
15370
+ "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\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.",
15371
15371
  "name": "HelixHeadlessCanvas",
15372
+ "cssProperties": [
15373
+ {
15374
+ "description": "The board's zoom, which the board writes: 1 at the document's own size, 0.5 at half. The cards inherit it, so a card's stylesheet can draw less when the board is far out, such as a border that stays one pixel wide at `calc(1px / var(--canvas-zoom))`.",
15375
+ "name": "--canvas-zoom"
15376
+ }
15377
+ ],
15372
15378
  "cssParts": [
15373
15379
  {
15374
15380
  "description": "The arrowhead at an end of a connection that has one.",
@@ -15769,6 +15775,19 @@
15769
15775
  "words": true
15770
15776
  }
15771
15777
  },
15778
+ {
15779
+ "kind": "field",
15780
+ "name": "roleLabel",
15781
+ "type": {
15782
+ "text": "string"
15783
+ },
15784
+ "default": "'canvas'",
15785
+ "description": "What a screen reader calls the board in place of its role, after its\nname: \"Release plan, canvas\". Said only where the board has a name of its\nown, since the fallback name is the same word. Empty leaves the role.",
15786
+ "attribute": "role-label",
15787
+ "helix": {
15788
+ "words": true
15789
+ }
15790
+ },
15772
15791
  {
15773
15792
  "kind": "field",
15774
15793
  "name": "selected",
@@ -15776,7 +15795,7 @@
15776
15795
  "text": "string"
15777
15796
  },
15778
15797
  "default": "''",
15779
- "description": "The names of the selected cards and connections, comma separated. Empty\nwhen nothing is selected.\n\n**Comma separated, the way `Listbox` writes a multiple value**, so a page\nreads one selection the same way wherever it comes from. A click, or a key\nthat lands on one, selects it alone; Shift, Command or Control with a click\nadds or takes one away, and so does Space; Command or Control with A\nselects everything; Shift and a drag across the empty board selects the\ncards the box touches. A click on the empty board, or Escape, selects\nnothing. Dragging, Shift with an arrow, and Delete act on the whole\nselection.\n\n**Kept apart from focus**, so it stays when focus leaves: a reader who\nselects cards and clicks a button beside the board to act on them has not\ncleared what the button acts on by clicking. A connection with no name is\ncalled by its ends, `from->to`, which is also why a name has to be unique\non its board across cards and connections both, and may not hold a comma.\n\nWritten to select from outside, and read to act on the selection.",
15798
+ "description": "The names of the selected cards and connections, comma separated. Empty\nwhen nothing is selected.\n\n**Comma separated, the way `Listbox` writes a multiple value**, so a page\nreads one selection the same way wherever it comes from. A click, or a key\nthat lands on one, selects it alone; Command or Control with an arrow key\nmoves without selecting; Shift, Command or Control with a click adds or\ntakes one away, and so does Space; Command or Control with A\nselects everything; Shift and a drag across the empty board selects the\ncards the box touches. A click on the empty board, or Escape, selects\nnothing. Dragging, Shift with an arrow, and Delete act on the whole\nselection.\n\n**Kept apart from focus**, so it stays when focus leaves: a reader who\nselects cards and clicks a button beside the board to act on them has not\ncleared what the button acts on by clicking. A connection with no name is\ncalled by its ends, `from->to`, which is also why a name has to be unique\non its board across cards and connections both, and may not hold a comma.\n\nWritten to select from outside, and read to act on the selection.",
15780
15799
  "attribute": "selected"
15781
15800
  },
15782
15801
  {
@@ -17358,6 +17377,16 @@
17358
17377
  "readonly": true,
17359
17378
  "description": "The keys on a card or a connection.\n\n**Only from the stop itself**, not from inside what a card holds: a card may\nhold a link, a field or a chart that answers the arrows itself, and a press\ntaken from under one of those walked the board instead of the chart.\n\n**Arrows walk in reading order rather than in space.** The next card in the\norder is the one a reader who cannot see the board needs, and the spatial\nneighbor is a guess about where they think they are. Right and down go on,\nleft and up go back, Home and End go to the ends, and Escape goes back out\nto the board, where the arrows pan it again.\n\nOn a card, Shift with an arrow moves it, C starts a connection and Delete\nasks for it to go. On a connection, Enter goes to the card it arrives at and\nDelete asks for it to go. While a connection is being made, Enter on a card\nasks for it and Escape stops."
17360
17379
  },
17380
+ {
17381
+ "kind": "field",
17382
+ "name": "walkingApart",
17383
+ "type": {
17384
+ "text": "boolean"
17385
+ },
17386
+ "privacy": "private",
17387
+ "default": "false",
17388
+ "description": "Whether the stop focus is moving to keeps the selection as it is."
17389
+ },
17361
17390
  {
17362
17391
  "kind": "field",
17363
17392
  "name": "handleFocusIn",
@@ -19209,13 +19238,22 @@
19209
19238
  "description": "What screen readers hear after a key resizes a card, with `{name}` for the\ncard and `{width}` and `{height}` for its new size, in the document's\nunits.",
19210
19239
  "fieldName": "resizedLabel"
19211
19240
  },
19241
+ {
19242
+ "name": "role-label",
19243
+ "type": {
19244
+ "text": "string"
19245
+ },
19246
+ "default": "'canvas'",
19247
+ "description": "What a screen reader calls the board in place of its role, after its\nname: \"Release plan, canvas\". Said only where the board has a name of its\nown, since the fallback name is the same word. Empty leaves the role.",
19248
+ "fieldName": "roleLabel"
19249
+ },
19212
19250
  {
19213
19251
  "name": "selected",
19214
19252
  "type": {
19215
19253
  "text": "string"
19216
19254
  },
19217
19255
  "default": "''",
19218
- "description": "The names of the selected cards and connections, comma separated. Empty\nwhen nothing is selected.\n\n**Comma separated, the way `Listbox` writes a multiple value**, so a page\nreads one selection the same way wherever it comes from. A click, or a key\nthat lands on one, selects it alone; Shift, Command or Control with a click\nadds or takes one away, and so does Space; Command or Control with A\nselects everything; Shift and a drag across the empty board selects the\ncards the box touches. A click on the empty board, or Escape, selects\nnothing. Dragging, Shift with an arrow, and Delete act on the whole\nselection.\n\n**Kept apart from focus**, so it stays when focus leaves: a reader who\nselects cards and clicks a button beside the board to act on them has not\ncleared what the button acts on by clicking. A connection with no name is\ncalled by its ends, `from->to`, which is also why a name has to be unique\non its board across cards and connections both, and may not hold a comma.\n\nWritten to select from outside, and read to act on the selection.",
19256
+ "description": "The names of the selected cards and connections, comma separated. Empty\nwhen nothing is selected.\n\n**Comma separated, the way `Listbox` writes a multiple value**, so a page\nreads one selection the same way wherever it comes from. A click, or a key\nthat lands on one, selects it alone; Command or Control with an arrow key\nmoves without selecting; Shift, Command or Control with a click adds or\ntakes one away, and so does Space; Command or Control with A\nselects everything; Shift and a drag across the empty board selects the\ncards the box touches. A click on the empty board, or Escape, selects\nnothing. Dragging, Shift with an arrow, and Delete act on the whole\nselection.\n\n**Kept apart from focus**, so it stays when focus leaves: a reader who\nselects cards and clicks a button beside the board to act on them has not\ncleared what the button acts on by clicking. A connection with no name is\ncalled by its ends, `from->to`, which is also why a name has to be unique\non its board across cards and connections both, and may not hold a comma.\n\nWritten to select from outside, and read to act on the selection.",
19219
19257
  "fieldName": "selected"
19220
19258
  },
19221
19259
  {
@@ -24332,7 +24370,7 @@
24332
24370
  "declarations": [
24333
24371
  {
24334
24372
  "kind": "class",
24335
- "description": "Chat has no positioning, no backdrop, and no trigger, so you can put it in\nany container, such as a page, a sidebar, a modal, or a floating panel.\n\nThe transcript stays pinned to the bottom, including while a streamed answer\ngrows, until the user scrolls more than `threshold` away from it.\n\nWith `history` set to `more`, reaching the top fires `helix-history`. Set\n`loading` while you fetch, then prepend the older turns. The turn the user\nwas reading stays in place on screen.\n\nThe log is `aria-live=\"off\"`. A separate status region announces each new\nturn once, when it has finished arriving. It skips the user's own turns\nunless they failed to send, turns loaded as history, and the turns already\nthere when the transcript opened.\n\nPass the turns as children or as `turns` data. Do not use both. Children\nrender from the server and suit most conversations. `turns` draws a long\ntranscript one window at a time, so the log needs a block size of its own.\n\n**A conversation is built from three elements.** The chat holds the\ntranscript, a `Chat.Message` stands for each turn, and a `Chat.Composer` sits\nin the `composer` slot. When the user sends, `helix-send` reaches the chat:\nadd their turn with `author=\"me\"` and `state=\"sending\"`, then set `state` to\n`sent` or `failed` when your server answers. Add the reply as a turn with\n`state=\"streaming\"`, write its text as it arrives, and set `state` to `sent`\nwhen it is complete. While the user types, the composer sends\n`helix-typing`, which you can pass on to the other side. When the other side\ntypes, set `typing` to their name: the status band draws three dots and\n\"Ada is typing\" (`typing-label`), which a screen reader hears, and clearing\nit takes them away. Anything slotted into `status` is drawn first.\n\nA screen reader names each turn by its author and its time, such as \"You, 2\nminutes ago\". Set `me-label` and `message-label` to say it in your language,\nand give each turn by `them` an `author-label`. A turn with neither an author\nlabel nor a time is named by `turn-label`, \"Message\".\n\nA turn from `turns` is drawn in the chat's shadow root, so style it through\nthe forwarded `message-*` parts. A turn by `me` also gets each part with\n`-mine` added, and the turn's state adds `message-meta-failed`,\n`message-content-sending`, and `message-content-streaming`. To style each\nparticipant differently, give `author-styles` the declarations for each\nauthor, such as `{\"ada\": \"--chat-message-background-color: …\"}`: the message\ndrawn for each of their turns takes them as its `style`, so the message's\ncustom properties change for that author alone. Turns passed as children are\nstyled by their `author`, such as `helix-chat-message[author=\"ada\"]`.",
24373
+ "description": "Chat has no positioning, no backdrop, and no trigger, so you can put it in\nany container, such as a page, a sidebar, a modal, or a floating panel.\n\nThe transcript stays pinned to the bottom, including while a streamed answer\ngrows, until the user scrolls more than `threshold` away from it.\n\nWith `history` set to `more`, reaching the top fires `helix-history`. Set\n`loading` while you fetch, then prepend the older turns. The turn the user\nwas reading stays in place on screen.\n\nThe log is `aria-live=\"off\"`. A separate status region announces each new\nturn once, when it has finished arriving. It skips the user's own turns\nunless they failed to send, turns loaded as history, and the turns already\nthere when the transcript opened. A turn is said with its author first, such\nas \"Ada: It ships today\" (`arrival-label`), where its author can be named.\n\nPass the turns as children or as `turns` data. Do not use both. Children\nrender from the server and suit most conversations. `turns` draws a long\ntranscript one window at a time, so the log needs a block size of its own.\n\n**A conversation is built from three elements.** The chat holds the\ntranscript, a `Chat.Message` stands for each turn, and a `Chat.Composer` sits\nin the `composer` slot. When the user sends, `helix-send` reaches the chat:\nadd their turn with `author=\"me\"` and `state=\"sending\"`, then set `state` to\n`sent` or `failed` when your server answers. Add the reply as a turn with\n`state=\"streaming\"`, write its text as it arrives, and set `state` to `sent`\nwhen it is complete. While the user types, the composer sends\n`helix-typing`, which you can pass on to the other side. When the other side\ntypes, set `typing` to their name: the status band draws three dots and\n\"Ada is typing\" (`typing-label`), which a screen reader hears, and clearing\nit takes them away. Anything slotted into `status` is drawn first.\n\nA screen reader names each turn by its author and its time, such as \"You, 2\nminutes ago\". Set `me-label` and `message-label` to say it in your language,\nand give each turn by `them` an `author-label`. A turn with neither an author\nlabel nor a time is named by `turn-label`, \"Message\".\n\nA turn from `turns` is drawn in the chat's shadow root, so style it through\nthe forwarded `message-*` parts. A turn by `me` also gets each part with\n`-mine` added, and the turn's state adds `message-meta-failed`,\n`message-content-sending`, and `message-content-streaming`. To style each\nparticipant differently, give `author-styles` the declarations for each\nauthor, such as `{\"ada\": \"--chat-message-background-color: …\"}`: the message\ndrawn for each of their turns takes them as its `style`, so the message's\ncustom properties change for that author alone. Turns passed as children are\nstyled by their `author`, such as `helix-chat-message[author=\"ada\"]`.",
24336
24374
  "name": "HelixHeadlessChat",
24337
24375
  "cssParts": [
24338
24376
  {
@@ -24538,6 +24576,19 @@
24538
24576
  "default": "72",
24539
24577
  "description": "How tall a turn is assumed to be before it has been drawn, in pixels."
24540
24578
  },
24579
+ {
24580
+ "kind": "field",
24581
+ "name": "arrivalLabel",
24582
+ "type": {
24583
+ "text": "string"
24584
+ },
24585
+ "default": "'{author}: {text}'",
24586
+ "description": "What a screen reader hears when a turn arrives. `{author}` is who wrote\nit, as its name says it, and `{text}` its words. A turn with no author a\nreader can be told, a turn by `them` with no `author-label`, says its\nwords alone.",
24587
+ "attribute": "arrival-label",
24588
+ "helix": {
24589
+ "words": true
24590
+ }
24591
+ },
24541
24592
  {
24542
24593
  "kind": "field",
24543
24594
  "name": "authorStyles",
@@ -25157,7 +25208,8 @@
25157
25208
  "text": "Heard"
25158
25209
  }
25159
25210
  }
25160
- ]
25211
+ ],
25212
+ "description": "What is said for a turn: a failed one with `failed-turn-label`, and\nanother with `arrival-label` where its author can be named, so a reader\nin a conversation of several knows who spoke."
25161
25213
  },
25162
25214
  {
25163
25215
  "kind": "method",
@@ -25827,6 +25879,15 @@
25827
25879
  }
25828
25880
  ],
25829
25881
  "attributes": [
25882
+ {
25883
+ "name": "arrival-label",
25884
+ "type": {
25885
+ "text": "string"
25886
+ },
25887
+ "default": "'{author}: {text}'",
25888
+ "description": "What a screen reader hears when a turn arrives. `{author}` is who wrote\nit, as its name says it, and `{text}` its words. A turn with no author a\nreader can be told, a turn by `them` with no `author-label`, says its\nwords alone.",
25889
+ "fieldName": "arrivalLabel"
25890
+ },
25830
25891
  {
25831
25892
  "name": "author-styles",
25832
25893
  "type": {
@@ -26506,6 +26567,21 @@
26506
26567
  "module": "src/mixins/mixin-field/mixin-field.ts"
26507
26568
  }
26508
26569
  },
26570
+ {
26571
+ "kind": "field",
26572
+ "name": "namedBy",
26573
+ "type": {
26574
+ "text": "string | null"
26575
+ },
26576
+ "privacy": "protected",
26577
+ "default": "null",
26578
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
26579
+ "attribute": "aria-label",
26580
+ "inheritedFrom": {
26581
+ "name": "MixinField",
26582
+ "module": "src/mixins/mixin-field/mixin-field.ts"
26583
+ }
26584
+ },
26509
26585
  {
26510
26586
  "kind": "field",
26511
26587
  "name": "labeled",
@@ -27671,6 +27747,8 @@
27671
27747
  "text": "string | null"
27672
27748
  },
27673
27749
  "default": "null",
27750
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
27751
+ "fieldName": "namedBy",
27674
27752
  "inheritedFrom": {
27675
27753
  "name": "MixinField",
27676
27754
  "module": "src/mixins/mixin-field/mixin-field.ts"
@@ -28287,6 +28365,21 @@
28287
28365
  "module": "src/mixins/mixin-field/mixin-field.ts"
28288
28366
  }
28289
28367
  },
28368
+ {
28369
+ "kind": "field",
28370
+ "name": "namedBy",
28371
+ "type": {
28372
+ "text": "string | null"
28373
+ },
28374
+ "privacy": "protected",
28375
+ "default": "null",
28376
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
28377
+ "attribute": "aria-label",
28378
+ "inheritedFrom": {
28379
+ "name": "MixinField",
28380
+ "module": "src/mixins/mixin-field/mixin-field.ts"
28381
+ }
28382
+ },
28290
28383
  {
28291
28384
  "kind": "field",
28292
28385
  "name": "labeled",
@@ -29486,6 +29579,8 @@
29486
29579
  "text": "string | null"
29487
29580
  },
29488
29581
  "default": "null",
29582
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
29583
+ "fieldName": "namedBy",
29489
29584
  "inheritedFrom": {
29490
29585
  "name": "MixinField",
29491
29586
  "module": "src/mixins/mixin-field/mixin-field.ts"
@@ -32591,6 +32686,21 @@
32591
32686
  "module": "src/mixins/mixin-field/mixin-field.ts"
32592
32687
  }
32593
32688
  },
32689
+ {
32690
+ "kind": "field",
32691
+ "name": "namedBy",
32692
+ "type": {
32693
+ "text": "string | null"
32694
+ },
32695
+ "privacy": "protected",
32696
+ "default": "null",
32697
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
32698
+ "attribute": "aria-label",
32699
+ "inheritedFrom": {
32700
+ "name": "MixinField",
32701
+ "module": "src/mixins/mixin-field/mixin-field.ts"
32702
+ }
32703
+ },
32594
32704
  {
32595
32705
  "kind": "field",
32596
32706
  "name": "labeled",
@@ -33909,6 +34019,8 @@
33909
34019
  "text": "string | null"
33910
34020
  },
33911
34021
  "default": "null",
34022
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
34023
+ "fieldName": "namedBy",
33912
34024
  "inheritedFrom": {
33913
34025
  "name": "MixinField",
33914
34026
  "module": "src/mixins/mixin-field/mixin-field.ts"
@@ -37226,6 +37338,15 @@
37226
37338
  "description": "How long typing rests before the list is narrowed and `helix-filter` is\nsent, in milliseconds.\n\nFor options filtered on a server, where `helix-filter` starts a request: a\ndelay sends one request for a word instead of one per letter. The arrow\nkeys, Enter and Escape narrow at once on what was typed. `0` narrows on\nevery keystroke. See Listbox's `filter-delay`.",
37227
37339
  "attribute": "filter-delay"
37228
37340
  },
37341
+ {
37342
+ "kind": "field",
37343
+ "name": "formValue",
37344
+ "type": {
37345
+ "text": "'key' | 'text' | undefined"
37346
+ },
37347
+ "description": "What the form receives for each chosen option: `key`, its `value`, or\n`text`, its words, as React Aria's ComboBox `formValue` offers.\n\n`text` is for a server that wants what the reader saw, such as a city's\nname. A value no option carries, typed with `allows-custom-value` or made\nwith `creatable`, is sent as it is either way. Absent is `key`, and the\nhost carries no attribute for it.",
37348
+ "attribute": "form-value"
37349
+ },
37229
37350
  {
37230
37351
  "kind": "field",
37231
37352
  "name": "listLabel",
@@ -38554,6 +38675,21 @@
38554
38675
  "module": "src/mixins/mixin-field/mixin-field.ts"
38555
38676
  }
38556
38677
  },
38678
+ {
38679
+ "kind": "field",
38680
+ "name": "namedBy",
38681
+ "type": {
38682
+ "text": "string | null"
38683
+ },
38684
+ "privacy": "protected",
38685
+ "default": "null",
38686
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
38687
+ "attribute": "aria-label",
38688
+ "inheritedFrom": {
38689
+ "name": "MixinField",
38690
+ "module": "src/mixins/mixin-field/mixin-field.ts"
38691
+ }
38692
+ },
38557
38693
  {
38558
38694
  "kind": "field",
38559
38695
  "name": "labeled",
@@ -39766,6 +39902,14 @@
39766
39902
  "description": "How long typing rests before the list is narrowed and `helix-filter` is\nsent, in milliseconds.\n\nFor options filtered on a server, where `helix-filter` starts a request: a\ndelay sends one request for a word instead of one per letter. The arrow\nkeys, Enter and Escape narrow at once on what was typed. `0` narrows on\nevery keystroke. See Listbox's `filter-delay`.",
39767
39903
  "fieldName": "filterDelay"
39768
39904
  },
39905
+ {
39906
+ "name": "form-value",
39907
+ "type": {
39908
+ "text": "'key' | 'text' | undefined"
39909
+ },
39910
+ "description": "What the form receives for each chosen option: `key`, its `value`, or\n`text`, its words, as React Aria's ComboBox `formValue` offers.\n\n`text` is for a server that wants what the reader saw, such as a city's\nname. A value no option carries, typed with `allows-custom-value` or made\nwith `creatable`, is sent as it is either way. Absent is `key`, and the\nhost carries no attribute for it.",
39911
+ "fieldName": "formValue"
39912
+ },
39769
39913
  {
39770
39914
  "name": "list-label",
39771
39915
  "type": {
@@ -40033,6 +40177,8 @@
40033
40177
  "text": "string | null"
40034
40178
  },
40035
40179
  "default": "null",
40180
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
40181
+ "fieldName": "namedBy",
40036
40182
  "inheritedFrom": {
40037
40183
  "name": "MixinField",
40038
40184
  "module": "src/mixins/mixin-field/mixin-field.ts"
@@ -40245,7 +40391,7 @@
40245
40391
  "declarations": [
40246
40392
  {
40247
40393
  "kind": "class",
40248
- "description": "The list is a `Listbox`, which handles filtering, the empty state, the match\nhighlight, `aria-activedescendant`, scrolling an option into view, and moving\nbetween options with the keyboard. The palette adds a dialog and a hotkey\nthat opens it.\n\nThe palette keeps no value. It is not a form control and submits nothing.\nChoosing an option dispatches `helix-select` once. To remember the last\ncommand, store it yourself. An option with `href` is a link to a page, which\nthe browser follows once the palette has closed.\n\nThe hotkey listener is on the document, so the hotkey works from anywhere on\nthe page, including inside another control's text field, whether or not the\npalette is open. `mod` means Command on a Mac and Control elsewhere, so you\nwrite one binding.\n\nThe filter is cleared when the palette closes, so each opening starts from\nthe full list. Combobox and Select do the same. As typing narrows the list, a\nscreen reader hears how many commands are left, such as \"3 commands\".",
40394
+ "description": "The list is a `Listbox`, which handles filtering, the empty state, the match\nhighlight, `aria-activedescendant`, scrolling an option into view, and moving\nbetween options with the keyboard. The palette adds a dialog and a hotkey\nthat opens it.\n\nThe palette keeps no value. It is not a form control and submits nothing.\nChoosing an option dispatches `helix-select` once. To remember the last\ncommand, store it yourself. An option with `href` is a link to a page, which\nthe browser follows once the palette has closed.\n\nThe hotkey listener is on the document, so the hotkey works from anywhere on\nthe page, including inside another control's text field, whether or not the\npalette is open. `mod` means Command on a Mac and Control elsewhere, so you\nwrite one binding.\n\nWith `inline`, the palette is drawn in the page with no dialog, as a search\nover a list that is always shown.\n\n**Pages.** A command can open a page of commands of its own, as a palette\noffers \"Change theme\" and then the themes. Give the option `opens` with a\nname, and slot the page's commands as `page:` and that name:\n\n```html\n<helix-command>\n <helix-option value=\"theme\" opens=\"theme\">Change theme</helix-option>\n <helix-option value=\"dark\" slot=\"page:theme\">Dark</helix-option>\n <helix-option value=\"light\" slot=\"page:theme\">Light</helix-option>\n</helix-command>\n```\n\nChoosing the opener says `helix-select` with its value, and canceling it\nkeeps the page that is shown. The list then shows the page, named by the\nopener's words, and Backspace in an empty filter goes back. `page` says\nwhich page is shown.\n\nThe filter is cleared when the palette closes, so each opening starts from\nthe full list. Combobox and Select do the same. As typing narrows the list, a\nscreen reader hears how many commands are left, such as \"3 commands\".\n\n**Keyboard.** Focus goes to the filter field as the palette opens, and the\nhighlight moves through the commands while you type.\n\n| Key | What it does |\n|---|---|\n| `hotkey`, Command or Control with K by default | Opens the palette from anywhere on the page, or closes it. With `inline`, puts focus in its filter field. |\n| Down, Up | Moves the highlight to the next or the previous command, round from the last to the first. |\n| Page Down, Page Up | Moves the highlight by as many commands as the list shows at once. |\n| Home, End, Left, Right | Move the caret in the filter field. |\n| Enter | Runs the highlighted command, or follows it where it is a link, and closes the palette. On a command with `opens`, shows its page. |\n| Command or Control with Enter | Takes the highlighted command's `alternate` destination, where it has one. |\n| Backspace | In an empty filter on a page, goes back to the page before. |\n| Escape | Clears the filter. With the filter empty, closes the palette and puts focus back where it was. |\n| Tab | Stays in the palette, which is modal. With `inline`, moves on through the page. |\n\n**ARIA.** The palette is a modal `dialog` named by `label`, or with\n`inline` no dialog at all. Inside it the filter field is a `combobox` with\n`aria-activedescendant` on the highlighted command, and the commands are a\n`listbox` of `option`s. How many commands typing left, the empty text and\nthe loading text are said in a polite live region.",
40249
40395
  "name": "HelixHeadlessCommand",
40250
40396
  "cssParts": [
40251
40397
  {
@@ -40342,10 +40488,18 @@
40342
40488
  "description": "What the palette shows while `load-error` is set, for content richer than its text.",
40343
40489
  "name": "error"
40344
40490
  },
40491
+ {
40492
+ "description": "Replaces the magnifying glass in the filter field.",
40493
+ "name": "filter-icon"
40494
+ },
40345
40495
  {
40346
40496
  "description": "Content under the list, such as the keys that work in the palette.",
40347
40497
  "name": "footer"
40348
40498
  },
40499
+ {
40500
+ "description": "Content above the filter field, such as a title or the scope being searched. A heading here does not rename the palette, which `label` names.",
40501
+ "name": "header"
40502
+ },
40349
40503
  {
40350
40504
  "description": "What the palette shows while the commands load, for content richer than `loading-text`.",
40351
40505
  "name": "loading"
@@ -40399,6 +40553,26 @@
40399
40553
  "description": "The key that opens the palette, written as `mod+k`, `shift+p`, or `k`,\nin Kbd's chord spelling: `mod` is Command or Control, `ctrl`, `cmd`,\n`alt` and `shift` the keys they name.\n\nEmpty turns it off, for a consumer who opens the palette from a button or\nfrom their own shortcut handler. There is no list of defaults to fight\nwith: one key, said once.",
40400
40554
  "attribute": "hotkey"
40401
40555
  },
40556
+ {
40557
+ "kind": "field",
40558
+ "name": "inline",
40559
+ "type": {
40560
+ "text": "boolean"
40561
+ },
40562
+ "default": "false",
40563
+ "description": "Draws the palette in the page, where it stands, with no dialog: a search\nover a list of commands, as React Aria's Autocomplete is drawn.\n\nThe list is always shown, and `hotkey` puts focus in its filter field.\nChoosing a command says `helix-select` and leaves the list where it is,\nand `open`, `toggle` and the dialog's parts do nothing.",
40564
+ "attribute": "inline",
40565
+ "reflects": true
40566
+ },
40567
+ {
40568
+ "kind": "field",
40569
+ "name": "items",
40570
+ "type": {
40571
+ "text": "readonly DataOptionItem[] | undefined"
40572
+ },
40573
+ "default": "undefined",
40574
+ "description": "The commands as data, for a palette too long to draw whole: each a value,\nwhich is also its words, or a record with a `value`, a `label` and\n`disabled`. Handed to the list, which draws only the commands in sight and\nreads no children while it is set. See Listbox's `items`.\n\nChoosing one says `helix-select` with its value, as a child option does.\nA command that is a link, or that has an `alternate`, is an option you\nwrite as a child."
40575
+ },
40402
40576
  {
40403
40577
  "kind": "field",
40404
40578
  "name": "label",
@@ -40455,6 +40629,26 @@
40455
40629
  "description": "The text shown when typing hides every one of the commands, where there are\nsome. Absent, `empty-text` shows. See Listbox's `no-results-text`.",
40456
40630
  "attribute": "no-results-text"
40457
40631
  },
40632
+ {
40633
+ "kind": "field",
40634
+ "name": "page",
40635
+ "type": {
40636
+ "text": "string"
40637
+ },
40638
+ "default": "''",
40639
+ "description": "The page of commands shown, by name: empty for the commands you write\nwith no `slot`, or a name for the commands slotted as `page:` and the\nname, such as `slot=\"page:theme\"`.\n\nAn option with `opens` set to a name goes to that page when it is chosen,\nin place of running, and Backspace in an empty filter goes back to the\npage before. Closing the palette goes back to the first page. Set it to\nopen the palette on a page of your choosing.",
40640
+ "attribute": "page"
40641
+ },
40642
+ {
40643
+ "kind": "field",
40644
+ "name": "trail",
40645
+ "type": {
40646
+ "text": "string[]"
40647
+ },
40648
+ "privacy": "private",
40649
+ "default": "[]",
40650
+ "description": "The pages gone through to reach this one, which Backspace walks back."
40651
+ },
40458
40652
  {
40459
40653
  "kind": "field",
40460
40654
  "name": "placeholder",
@@ -40516,6 +40710,16 @@
40516
40710
  "readonly": true,
40517
40711
  "description": "Answers the hotkey from wherever the reader is.\n\nOn the document rather than on this element, which is never the thing with\nfocus: a palette that only answered when it already had focus would be a\npalette nobody could open.\n\n`preventDefault` because every key worth using is already the browser's.\nCommand-K focuses the address bar in some browsers and opens a search in\nothers, and a palette that opened underneath one of those would be a\npalette the reader never sees."
40518
40712
  },
40713
+ {
40714
+ "kind": "field",
40715
+ "name": "searchField",
40716
+ "type": {
40717
+ "text": "HTMLInputElement | null"
40718
+ },
40719
+ "privacy": "private",
40720
+ "description": "The list's filter field, where a reader types.",
40721
+ "readonly": true
40722
+ },
40519
40723
  {
40520
40724
  "kind": "field",
40521
40725
  "name": "handleChange",
@@ -40523,6 +40727,48 @@
40523
40727
  "readonly": true,
40524
40728
  "description": "Takes what the list announced and says it under this element's name.\n\nThe listbox says `helix-before-change`, which is the right word for a control that\nholds a value and the wrong one for a palette: nothing here changed, a\ncommand ran. It is stopped and re-announced rather than relayed, so a\nconsumer hears one event naming the element they put on the page.\n\n**And refused, so the list keeps no answer.** A listbox holding what was\nchosen hears the same row chosen again as no change and says nothing, so\nthe command a reader ran last, which on a site is the page they are on,\ncould not be run again: Enter did nothing and the palette stayed open."
40525
40729
  },
40730
+ {
40731
+ "kind": "method",
40732
+ "name": "goTo",
40733
+ "privacy": "private",
40734
+ "return": {
40735
+ "type": {
40736
+ "text": "void"
40737
+ }
40738
+ },
40739
+ "parameters": [
40740
+ {
40741
+ "name": "trail",
40742
+ "type": {
40743
+ "text": "string[]"
40744
+ }
40745
+ },
40746
+ {
40747
+ "name": "page",
40748
+ "type": {
40749
+ "text": "string"
40750
+ }
40751
+ }
40752
+ ],
40753
+ "description": "Shows a page of commands, with the trail that leads back from it. The\nfilter starts empty, as it does on opening, and the field keeps focus."
40754
+ },
40755
+ {
40756
+ "kind": "field",
40757
+ "name": "handleBack",
40758
+ "privacy": "private",
40759
+ "readonly": true,
40760
+ "description": "Backspace in an empty filter, on a page, goes back to the page before."
40761
+ },
40762
+ {
40763
+ "kind": "field",
40764
+ "name": "listName",
40765
+ "type": {
40766
+ "text": "string"
40767
+ },
40768
+ "privacy": "private",
40769
+ "description": "The list's name: the palette's, or on a page, the words of the command\nthat opens it.",
40770
+ "readonly": true
40771
+ },
40526
40772
  {
40527
40773
  "kind": "field",
40528
40774
  "name": "activeOption",
@@ -40546,6 +40792,43 @@
40546
40792
  "privacy": "private",
40547
40793
  "readonly": true
40548
40794
  },
40795
+ {
40796
+ "kind": "method",
40797
+ "name": "markStatus",
40798
+ "privacy": "private",
40799
+ "return": {
40800
+ "type": {
40801
+ "text": "void"
40802
+ }
40803
+ },
40804
+ "description": "The list's loading, error and empty states on the host too, so a page\nstyles the whole palette from them, as Combobox does. Read once the list\nhas drawn its filter, since `hidden` is what the filter writes onto a\ncommand."
40805
+ },
40806
+ {
40807
+ "kind": "field",
40808
+ "name": "handleFilter",
40809
+ "privacy": "private",
40810
+ "readonly": true,
40811
+ "description": "After the list has filtered on what was typed. The event comes before the\nfilter is applied, so the list's update is waited for a turn later."
40812
+ },
40813
+ {
40814
+ "kind": "method",
40815
+ "name": "fills",
40816
+ "privacy": "private",
40817
+ "return": {
40818
+ "type": {
40819
+ "text": "boolean"
40820
+ }
40821
+ },
40822
+ "parameters": [
40823
+ {
40824
+ "name": "name",
40825
+ "type": {
40826
+ "text": "string"
40827
+ }
40828
+ }
40829
+ ],
40830
+ "description": "Whether a child fills the named slot, so it is handed on to the dialog or the list."
40831
+ },
40549
40832
  {
40550
40833
  "kind": "method",
40551
40834
  "name": "renderDialog",
@@ -40557,6 +40840,36 @@
40557
40840
  },
40558
40841
  "description": "The surface the palette opens in, behind a seam the styled tier can move.\n\nA method rather than a fragment inline, so a tier above can render its own,\nwrap this one, pass it a property the base does not know about, or leave it\nout, without reimplementing the whole template to do any of them. The tag is\ninterpolated rather than written, so `tier` resolves it: this renders the\nheadless element, and a styled subclass that sets `tier` renders the styled one\nfrom the same template."
40559
40842
  },
40843
+ {
40844
+ "kind": "method",
40845
+ "name": "renderListbox",
40846
+ "privacy": "protected",
40847
+ "return": {
40848
+ "type": {
40849
+ "text": "TemplateResult"
40850
+ }
40851
+ },
40852
+ "description": "The filterable list of commands, which the dialog holds, or the page with\n`inline`, behind a seam the styled tier can move."
40853
+ },
40854
+ {
40855
+ "kind": "method",
40856
+ "name": "renderFooter",
40857
+ "privacy": "private",
40858
+ "return": {
40859
+ "type": {
40860
+ "text": "TemplateResult"
40861
+ }
40862
+ },
40863
+ "parameters": [
40864
+ {
40865
+ "name": "slot",
40866
+ "type": {
40867
+ "text": "string | typeof nothing"
40868
+ }
40869
+ }
40870
+ ],
40871
+ "description": "The row under the list, in the dialog's footer or, `inline`, under the list itself."
40872
+ },
40560
40873
  {
40561
40874
  "kind": "field",
40562
40875
  "name": "defaultOpen",
@@ -41099,6 +41412,15 @@
41099
41412
  "description": "The key that opens the palette, written as `mod+k`, `shift+p`, or `k`,\nin Kbd's chord spelling: `mod` is Command or Control, `ctrl`, `cmd`,\n`alt` and `shift` the keys they name.\n\nEmpty turns it off, for a consumer who opens the palette from a button or\nfrom their own shortcut handler. There is no list of defaults to fight\nwith: one key, said once.",
41100
41413
  "fieldName": "hotkey"
41101
41414
  },
41415
+ {
41416
+ "name": "inline",
41417
+ "type": {
41418
+ "text": "boolean"
41419
+ },
41420
+ "default": "false",
41421
+ "description": "Draws the palette in the page, where it stands, with no dialog: a search\nover a list of commands, as React Aria's Autocomplete is drawn.\n\nThe list is always shown, and `hotkey` puts focus in its filter field.\nChoosing a command says `helix-select` and leaves the list where it is,\nand `open`, `toggle` and the dialog's parts do nothing.",
41422
+ "fieldName": "inline"
41423
+ },
41102
41424
  {
41103
41425
  "name": "label",
41104
41426
  "type": {
@@ -41143,6 +41465,15 @@
41143
41465
  "description": "The text shown when typing hides every one of the commands, where there are\nsome. Absent, `empty-text` shows. See Listbox's `no-results-text`.",
41144
41466
  "fieldName": "noResultsText"
41145
41467
  },
41468
+ {
41469
+ "name": "page",
41470
+ "type": {
41471
+ "text": "string"
41472
+ },
41473
+ "default": "''",
41474
+ "description": "The page of commands shown, by name: empty for the commands you write\nwith no `slot`, or a name for the commands slotted as `page:` and the\nname, such as `slot=\"page:theme\"`.\n\nAn option with `opens` set to a name goes to that page when it is chosen,\nin place of running, and Backspace in an empty filter goes back to the\npage before. Closing the palette goes back to the first page. Set it to\nopen the palette on a page of your choosing.",
41475
+ "fieldName": "page"
41476
+ },
41146
41477
  {
41147
41478
  "name": "placeholder",
41148
41479
  "type": {
@@ -41196,6 +41527,22 @@
41196
41527
  }
41197
41528
  ],
41198
41529
  "cssStates": [
41530
+ {
41531
+ "description": "The list shows no commands: there are none, or typing hid every one.",
41532
+ "name": "empty"
41533
+ },
41534
+ {
41535
+ "description": "While `load-error` is set.",
41536
+ "name": "error"
41537
+ },
41538
+ {
41539
+ "description": "While `loading` is set.",
41540
+ "name": "loading"
41541
+ },
41542
+ {
41543
+ "description": "Typing hid every one of the commands, where there are some.",
41544
+ "name": "no-results"
41545
+ },
41199
41546
  {
41200
41547
  "description": "While the palette is open.",
41201
41548
  "name": "open"
@@ -43156,7 +43503,7 @@
43156
43503
  "declarations": [
43157
43504
  {
43158
43505
  "kind": "class",
43159
- "description": "Declare the columns as `TableColumn` children and pass the rows as an array.\nThe schema stays readable in the HTML, and the rows can be windowed, which\nten thousand row elements cannot be.\n\n```html\n<helix-headless-data-table .rows=${rows} sort=\"name:asc\" page-size=\"20\">\n <helix-headless-table-column field=\"name\" sortable>Name</helix-headless-table-column>\n <helix-headless-table-column field=\"size\" text-align=\"end\" sortable .cell=${bytes}>Size</helix-headless-table-column>\n</helix-headless-data-table>\n```\n\nFor a short table written out by hand, use `Table`, which takes rows as\nmarkup.\n\nSort and filter apply to the whole set, including the rows on other pages.\n\n**The cell values do not server-render.** The headings and the row elements\ndo. Reading a cell needs the columns, and Lit SSR does not pass the column\nchildren to this element, so a crawler sees an empty table of the right\nshape. Use `Table` when the served HTML has to carry the values.\n\n`selectable` adds a column of checkboxes, keyed on `row-key`:\n\n- A row is selected by its key, so the selection survives a sort, a filter,\n and a page change.\n- `selected` holds the chosen keys, comma separated, the same shape `Listbox`\n uses for a multiple choice. As with `sort`, writing it applies the\n selection, and `default-selected` holds what the markup declared.\n- The checkbox in the heading selects every row in the result, across pages,\n and shows a dash while only some are chosen.\n- Shift with a press on a checkbox selects every row between it and the row\n last chosen.\n- `selection-behavior=\"replace\"` makes a press or a move select the row\n alone, as a file list does. Control or Command with a press adds or takes\n out one row, and Shift with a press selects every row from the one last\n chosen.\n\nTo act on a single row, such as opening it, put a link or a button in a cell.\n\n**Keyboard.** The grid is one tab stop, and the arrow keys move between its\ncells, the headings included.\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 heading row and the `load-more` row 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 grid. |\n| Page Down, Page Up | Moves by the rows that fit in view. |\n| Enter, F2 | Moves into the cell's controls. Escape moves back to the cell, and Tab moves between the controls of one cell. |\n| Enter, Space on a sortable heading | Sorts by the column. |\n| Enter, Space on the `load-more` row | Sends `helix-load-more`. |\n| Space on a row | Selects the row, in a `selectable` table. Under `selection-behavior=\"replace\"`, selects it alone, and Control or Command with Space adds or takes out the row. |\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| Right on a row header in a tree grid | Opens a closed row, and moves one cell along an open one. |\n| Left on a row header in a tree grid | Closes an open row, and moves to the parent of a closed one. |\n| A letter or a word | Moves to the next row whose row header starts with what you typed. |\n\n`selected` and `expanded` hold their keys in the order of the rows, as do\n`helix-select`, `helix-selected` and `helix-expand`.\n\nEach row is named by its row header, the column marked `row-header`, or the\nfirst column with a `field` where none is. A screen reader says it as a reader\nmoves between rows.\n\n**Rows that hold rows.** `child-field` names the field that holds a row's\nchild rows, and the grid becomes a tree grid. The row header column draws a\nmark that a press opens and closes a row by, and `expanded` holds the keys of the open\nrows, which `row-key` names. Right on a closed row's header opens it, Left on\nan open one closes it, and Left on a child moves to its parent. A sort orders\nthe rows under each parent, and a search shows the rows that lead to each\nmatch, open.\n\n`load-more` adds a row after the last one with a button that sends\n`helix-load-more`. A `windowed` table also sends it by itself once a reader\nscrolls within one screen of the end, once for each number of rows. Add the\nnext rows to `rows`, and set `loading` while they are on their way.\n\nThe controls inside the cells leave the tab order, so Tab moves past the\nwhole grid. A windowed table keeps the row holding focus drawn while the\nrest scroll away.\n\nPeople can resize and reorder the columns. `resizable` on a column puts a\nseparator on its edge. `reorderable` on the table puts a grip on each heading\nthat has a `field`, moved by dragging or with the arrow keys. The new order\nis written to `order` as a list of fields. Your markup is not rewritten: the\ntable assigns the headings to its header in that order.\n\n**`reorderable-rows` lets people move rows.** A column of grips leads each\nrow, named by `move-row-label`. Drag a grip to move its row, and the table\nscrolls near an edge. Or press Space or Enter on a grip, or click it, to pick\nup its row, move it with Down and Up, Home and End, and press Space or Enter\nagain to drop it. A click on another row drops it there, and Escape puts it\nback. The table says each step in its `live` region. A drop sends\n`helix-before-reorder`, which you can refuse, and then `helix-reorder` with\n`kind` set to `row`, whose `keys` hold every key of `rows` in the new order.\n**You move the rows**: set `rows` to the new order, and the table draws it.\nSet `row-key`, so a row is known by its key once it has moved. The grips do\nnothing while a `sort` is set, since the sort decides the order, and a tree\ngrid draws none.\n\n`csv()` returns the result as text: every row that passes the filter, in the\norder and the columns on screen. Saving the file is up to you.\n\n`DataTable` has no `columns` attribute. Each `TableColumn` is part of the\nschema, so you size a column with its own `width`. `Table` has `columns`\nbecause its cells are markup you write and it can have no columns at all.\nWritten on `DataTable`, `columns` has no effect, so watch for it when you\nmove a table from `Table` to `DataTable`.",
43506
+ "description": "Declare the columns as `TableColumn` children and pass the rows as an array.\nThe schema stays readable in the HTML, and the rows can be windowed, which\nten thousand row elements cannot be.\n\n```html\n<helix-headless-data-table .rows=${rows} sort=\"name:asc\" page-size=\"20\">\n <helix-headless-table-column field=\"name\" sortable>Name</helix-headless-table-column>\n <helix-headless-table-column field=\"size\" text-align=\"end\" sortable .cell=${bytes}>Size</helix-headless-table-column>\n</helix-headless-data-table>\n```\n\nFor a short table written out by hand, use `Table`, which takes rows as\nmarkup.\n\nSort and filter apply to the whole set, including the rows on other pages.\n\n**The cell values do not server-render.** The headings and the row elements\ndo. Reading a cell needs the columns, and Lit SSR does not pass the column\nchildren to this element, so a crawler sees an empty table of the right\nshape. Use `Table` when the served HTML has to carry the values.\n\n`selectable` adds a column of checkboxes, keyed on `row-key`:\n\n- A row is selected by its key, so the selection survives a sort, a filter,\n and a page change.\n- `selected` holds the chosen keys, comma separated, the same shape `Listbox`\n uses for a multiple choice. As with `sort`, writing it applies the\n selection, and `default-selected` holds what the markup declared.\n- The checkbox in the heading selects every row in the result, across pages,\n and shows a dash while only some are chosen.\n- Shift with a press on a checkbox selects every row between it and the row\n last chosen.\n- `selection-behavior=\"replace\"` makes a press or a move select the row\n alone, as a file list does. Control or Command with a press adds or takes\n out one row, and Shift with a press selects every row from the one last\n chosen.\n\nTo act on a single row, such as opening it, put a link or a button in a cell.\n\n**Keyboard.** The grid is one tab stop, and the arrow keys move between its\ncells, the headings included.\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 heading row and the `load-more` row 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 grid. |\n| Page Down, Page Up | Moves by the rows that fit in view. |\n| Enter, F2 | Moves into the cell's controls. Escape moves back to the cell, and Tab moves between the controls of one cell. |\n| Enter, Space on a sortable heading | Sorts by the column. |\n| Enter, Space on the `load-more` row | Sends `helix-load-more`. |\n| Space on a row | Selects the row, in a `selectable` table. Under `selection-behavior=\"replace\"`, selects it alone, and Control or Command with Space adds or takes out the row. |\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| Right on a row header in a tree grid | Opens a closed row, and moves one cell along an open one. |\n| Left on a row header in a tree grid | Closes an open row, and moves to the parent of a closed one. |\n| A letter or a word | Moves to the next row whose row header starts with what you typed. |\n\n`selected` and `expanded` hold their keys in the order of the rows, as do\n`helix-select`, `helix-selected` and `helix-expand`.\n\nEach row is named by its row header, the column marked `row-header`, or the\nfirst column with a `field` where none is. A screen reader says it as a reader\nmoves between rows.\n\n**Rows that hold rows.** `child-field` names the field that holds a row's\nchild rows, and the grid becomes a tree grid. The row header column draws a\nmark that a press opens and closes a row by, and `expanded` holds the keys of the open\nrows, which `row-key` names. Right on a closed row's header opens it, Left on\nan open one closes it, and Left on a child moves to its parent. A sort orders\nthe rows under each parent, and a search shows the rows that lead to each\nmatch, open.\n\n`load-more` adds a row after the last one with a button that sends\n`helix-load-more`. A `windowed` table also sends it by itself once a reader\nscrolls within one screen of the end, once for each number of rows. Add the\nnext rows to `rows`, and set `loading` while they are on their way.\n\nWhen a fetch fails, set `error-text`, such as \"The files did not load\", and\nput a button that tries again in the `error` slot. The line shows after the\nrows in place of the empty and loading lines, the live region says it, and\nthe table takes the `error` state. Clear it once you try again.\n\nThe controls inside the cells leave the tab order, so Tab moves past the\nwhole grid. A windowed table keeps the row holding focus drawn while the\nrest scroll away.\n\nPeople can resize and reorder the columns. `resizable` on a column puts a\nseparator on its edge. `reorderable` on the table puts a grip on each heading\nthat has a `field`, moved by dragging or with the arrow keys. The new order\nis written to `order` as a list of fields. Your markup is not rewritten: the\ntable assigns the headings to its header in that order.\n\n**`reorderable-rows` lets people move rows.** A column of grips leads each\nrow, named by `move-row-label`. Drag a grip to move its row, and the table\nscrolls near an edge. Or press Space or Enter on a grip, or click it, to pick\nup its row, move it with Down and Up, Home and End, and press Space or Enter\nagain to drop it. A click on another row drops it there, and Escape puts it\nback. The table says each step in its `live` region. A drop sends\n`helix-before-reorder`, which you can refuse, and then `helix-reorder` with\n`kind` set to `row`, whose `keys` hold every key of `rows` in the new order.\n**You move the rows**: set `rows` to the new order, and the table draws it.\nSet `row-key`, so a row is known by its key once it has moved. The grips do\nnothing while a `sort` is set, since the sort decides the order, and a tree\ngrid draws none.\n\n`csv()` returns the result as text: every row that passes the filter, in the\norder and the columns on screen. Saving the file is up to you.\n\n`DataTable` has no `columns` attribute. Each `TableColumn` is part of the\nschema, so you size a column with its own `width`. `Table` has `columns`\nbecause its cells are markup you write and it can have no columns at all.\nWritten on `DataTable`, `columns` has no effect, so watch for it when you\nmove a table from `Table` to `DataTable`.",
43160
43507
  "name": "HelixHeadlessDataTable",
43161
43508
  "cssProperties": [
43162
43509
  {
@@ -43245,6 +43592,10 @@
43245
43592
  "description": "Shown when there are no rows, because none arrived or the filter matches none. While rows are loading, the `loading` part is shown in its place.",
43246
43593
  "name": "empty"
43247
43594
  },
43595
+ {
43596
+ "description": "Shown after the rows while `error-text` is set, in place of the empty and loading lines.",
43597
+ "name": "error"
43598
+ },
43248
43599
  {
43249
43600
  "description": "The region below the grid.",
43250
43601
  "name": "footer"
@@ -43399,6 +43750,10 @@
43399
43750
  "description": "Content shown when there are no rows to show and none are loading, such as a picture and a link. Falls back to `empty-text`, which the live region still says.",
43400
43751
  "name": "empty"
43401
43752
  },
43753
+ {
43754
+ "description": "Content shown while `error-text` is set, such as a button that tries again. Falls back to `error-text`, which the live region still says.",
43755
+ "name": "error"
43756
+ },
43402
43757
  {
43403
43758
  "description": "Content below the grid. It replaces the built-in pagination.",
43404
43759
  "name": "footer"
@@ -43583,6 +43938,16 @@
43583
43938
  "words": true
43584
43939
  }
43585
43940
  },
43941
+ {
43942
+ "kind": "field",
43943
+ "name": "errorText",
43944
+ "type": {
43945
+ "text": "string"
43946
+ },
43947
+ "default": "''",
43948
+ "description": "The text shown and announced when the rows could not load, such as \"The\nfiles did not load\". Set it when a fetch fails, and clear it once you try\nagain. Empty, the default, shows nothing.\n\nWhile it is set, a line after the rows shows it, or your own content in the\n`error` slot, in place of the empty and loading lines, and the live region\nsays it.",
43949
+ "attribute": "error-text"
43950
+ },
43586
43951
  {
43587
43952
  "kind": "field",
43588
43953
  "name": "estimate",
@@ -45506,6 +45871,17 @@
45506
45871
  ],
45507
45872
  "description": "The row after the last one, holding the button that asks for more rows.\n\nA row of the grid, one cell spanning every column, so the arrows reach it\nafter the last row and Enter or Space on it asks."
45508
45873
  },
45874
+ {
45875
+ "kind": "method",
45876
+ "name": "renderError",
45877
+ "privacy": "private",
45878
+ "return": {
45879
+ "type": {
45880
+ "text": "TemplateResult"
45881
+ }
45882
+ },
45883
+ "description": "The line shown while `error-text` is set: a row holding one cell, as the\nempty and loading lines are, since a grid holds rows and nothing else."
45884
+ },
45509
45885
  {
45510
45886
  "kind": "field",
45511
45887
  "name": "notePress",
@@ -46612,6 +46988,15 @@
46612
46988
  "description": "What screen readers hear when a row is dropped, with `reorderable-rows`.",
46613
46989
  "fieldName": "droppedLabel"
46614
46990
  },
46991
+ {
46992
+ "name": "error-text",
46993
+ "type": {
46994
+ "text": "string"
46995
+ },
46996
+ "default": "''",
46997
+ "description": "The text shown and announced when the rows could not load, such as \"The\nfiles did not load\". Set it when a fetch fails, and clear it once you try\nagain. Empty, the default, shows nothing.\n\nWhile it is set, a line after the rows shows it, or your own content in the\n`error` slot, in place of the empty and loading lines, and the live region\nsays it.",
46998
+ "fieldName": "errorText"
46999
+ },
46615
47000
  {
46616
47001
  "name": "estimate",
46617
47002
  "type": {
@@ -46976,6 +47361,24 @@
46976
47361
  }
46977
47362
  }
46978
47363
  ],
47364
+ "cssStates": [
47365
+ {
47366
+ "description": "While there are no rows to show and none are loading.",
47367
+ "name": "empty"
47368
+ },
47369
+ {
47370
+ "description": "While `error-text` is set.",
47371
+ "name": "error"
47372
+ },
47373
+ {
47374
+ "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
47375
+ "name": "settled",
47376
+ "inheritedFrom": {
47377
+ "name": "HelixElement",
47378
+ "module": "src/helix-element/helix-element.ts"
47379
+ }
47380
+ }
47381
+ ],
46979
47382
  "mixins": [
46980
47383
  {
46981
47384
  "name": "MixinCollection",
@@ -47015,16 +47418,6 @@
47015
47418
  },
47016
47419
  "tagName": "helix-headless-data-table",
47017
47420
  "customElement": true,
47018
- "cssStates": [
47019
- {
47020
- "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
47021
- "name": "settled",
47022
- "inheritedFrom": {
47023
- "name": "HelixElement",
47024
- "module": "src/helix-element/helix-element.ts"
47025
- }
47026
- }
47027
- ],
47028
47421
  "modulePath": "src/data-table/root/data-table-root.ts",
47029
47422
  "definitionPath": "src/data-table/root/data-table-root.ts"
47030
47423
  }
@@ -47147,7 +47540,7 @@
47147
47540
  "declarations": [
47148
47541
  {
47149
47542
  "kind": "class",
47150
- "description": "The calendar is `DatePicker`, which handles months, ranges, disabled days,\nthe first day of the week, and the grid's keyboard behavior. The date input\nadds the field, the overlay, and the connection between them.\n\nYou can type a date as well as pick one. The native `<input type=\"date\">`\ngives a picker and locale formatting but allows almost no styling, so the\nfield is a text field. Typing sends `input` on each keystroke and `change`\nwhen you leave the field, as a text field does. A date picked from the\ncalendar sends both.\n\nThe trigger and ArrowDown open the calendar with focus on the selected day,\nTab moves between the calendar's controls without leaving it, and Escape\ncloses it and returns focus to the field. A press into the field opens the\ncalendar too. Tab into the field opens nothing, and Tab out of the field\ncloses the calendar.\n\nWith `segmented`, the field is a row of segments in place of the text: a\nmonth, a day and a year in the order the locale writes them, each set with\ndigits or the arrow keys. Alt+Down opens the calendar from a segment.",
47543
+ "description": "The calendar is `DatePicker`, which handles months, ranges, disabled days,\nthe first day of the week, and the grid's keyboard behavior. The date input\nadds the field, the overlay, and the connection between them.\n\nYou can type a date as well as pick one. The native `<input type=\"date\">`\ngives a picker and locale formatting but allows almost no styling, so the\nfield is a text field. Typing sends `input` on each keystroke and `change`\nwhen you leave the field, as a text field does. A date picked from the\ncalendar sends both.\n\nThe trigger and ArrowDown open the calendar with focus on the selected day,\nTab moves between the calendar's controls without leaving it, and Escape\ncloses it and returns focus to the field. A press into the field opens the\ncalendar too. Tab into the field opens nothing, and Tab out of the field\ncloses the calendar.\n\nWith `segmented`, the field is a row of segments in place of the text: a\nmonth, a day and a year in the order the locale writes them, each set with\ndigits or the arrow keys. Alt+Down opens the calendar from a segment.\n\nText that is not a date gives the form an empty value, as a native date\nfield does, and `value` keeps the text so it can be corrected.\n\n**Keyboard.** The field is one tab stop, or each segment is with\n`segmented`, and the trigger is one more.\n\n| Key | What it does |\n|---|---|\n| Down | In the text field, opens the calendar with focus on the chosen day. |\n| Alt with Down | Opens the calendar, from the text field or a segment. |\n| Enter | In the text field, takes the typed date and submits the form, as a native field does. |\n| Escape | Closes the calendar and puts focus back in the field. |\n| Tab | In the open calendar, moves between its controls. Out of the field, closes it. |\n| Up, Down on a segment | Steps the segment by one, round from its last value to its first. |\n| Page Up, Page Down on a segment | Steps by a page: a week of days, two months, or five years. |\n| Home, End on a segment | Goes to the segment's first or last value. |\n| Digits on a segment | Fill it, and move to the next once it can take no more. |\n| Backspace, Delete on a segment | Empty the segment. |\n| Left, Right on a segment | Move to the previous or the next segment, along the line of text. |\n\nIn the calendar, the keys are `DatePicker`'s: the arrows move by a day or a\nweek, Page Up and Page Down by a month, with Shift by a year, and Home and\nEnd to the start and the end of the week.",
47151
47544
  "name": "HelixHeadlessDateInput",
47152
47545
  "cssParts": [
47153
47546
  {
@@ -47356,6 +47749,10 @@
47356
47749
  }
47357
47750
  ],
47358
47751
  "slots": [
47752
+ {
47753
+ "description": "Content after the date, before the trigger, such as a clear button.",
47754
+ "name": "end"
47755
+ },
47359
47756
  {
47360
47757
  "description": "The error message under the field.",
47361
47758
  "name": "feedback"
@@ -47384,6 +47781,10 @@
47384
47781
  "description": "The icon on the calendar's previous month control.",
47385
47782
  "name": "previous-icon"
47386
47783
  },
47784
+ {
47785
+ "description": "Content before the date, such as an icon.",
47786
+ "name": "start"
47787
+ },
47387
47788
  {
47388
47789
  "description": "The icon on the button that opens the calendar.",
47389
47790
  "name": "trigger"
@@ -47966,7 +48367,7 @@
47966
48367
  "text": "readonly string[] | undefined"
47967
48368
  },
47968
48369
  "privacy": "protected",
47969
- "description": "Each date, where `mode` holds several, sent one entry each.",
48370
+ "description": "Each date, where `mode` holds several, sent one entry each.\n\nOne date that is text and no date, such as `August 5`, is sent as an empty\nentry, as a native date field sends a date it cannot read.",
47970
48371
  "readonly": true,
47971
48372
  "inheritedFrom": {
47972
48373
  "name": "MixinPickerField",
@@ -49314,6 +49715,21 @@
49314
49715
  "module": "src/mixins/mixin-field/mixin-field.ts"
49315
49716
  }
49316
49717
  },
49718
+ {
49719
+ "kind": "field",
49720
+ "name": "namedBy",
49721
+ "type": {
49722
+ "text": "string | null"
49723
+ },
49724
+ "privacy": "protected",
49725
+ "default": "null",
49726
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
49727
+ "attribute": "aria-label",
49728
+ "inheritedFrom": {
49729
+ "name": "MixinField",
49730
+ "module": "src/mixins/mixin-field/mixin-field.ts"
49731
+ }
49732
+ },
49317
49733
  {
49318
49734
  "kind": "field",
49319
49735
  "name": "labeled",
@@ -50913,6 +51329,8 @@
50913
51329
  "text": "string | null"
50914
51330
  },
50915
51331
  "default": "null",
51332
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
51333
+ "fieldName": "namedBy",
50916
51334
  "inheritedFrom": {
50917
51335
  "name": "MixinField",
50918
51336
  "module": "src/mixins/mixin-field/mixin-field.ts"
@@ -59094,11 +59512,11 @@
59094
59512
  "declarations": [
59095
59513
  {
59096
59514
  "kind": "class",
59097
- "description": "A row that opens a page contains that page: the page's rows are this row's\nown children, assigned to the `page` slot. There are no ids to wire, and\nmoving a row moves its page with it.\n\nWhat the item renders depends on the stack:\n\n- On the page that is showing, it renders its row.\n- When its own page is showing, it renders only that page's rows. Its row\n belongs to the page above.\n- When a page further down its own is showing, it renders its page's slot\n alone, so the rows below reach the page.\n- Otherwise it renders nothing. The rows stay in the light DOM untouched, so\n there is no state to keep.\n\nChoosing a row dispatches an event, and the stack decides whether that drills\nin or runs a command.\n\nA row that opens a page shows a caret after its text and sets\n`aria-haspopup`, the same way `Menu` marks a row with a submenu. The server\nrender leaves both out, because the server cannot see the children.\n\nThe row is named by its label alone. Words in `description`, a line under\nthe label, and in `end` describe it instead, through `aria-describedby`, as\n`Menu.Item` does: a reader hears \"Theme\", then \"Dark\".",
59515
+ "description": "A row that opens a page contains that page: the page's rows are this row's\nown children, assigned to the `page` slot. There are no ids to wire, and\nmoving a row moves its page with it.\n\nWhat the item renders depends on the stack:\n\n- On the page that is showing, it renders its row.\n- When its own page is showing, it renders only that page's rows. Its row\n belongs to the page above.\n- When a page further down its own is showing, it renders its page's slot\n alone, so the rows below reach the page.\n- Otherwise it renders nothing. The rows stay in the light DOM untouched, so\n there is no state to keep.\n\nChoosing a row dispatches an event, and the stack decides whether that drills\nin or runs a command.\n\nA row that opens a page shows a caret after its text and sets\n`aria-haspopup`, the same way `Menu` marks a row with a submenu. The server\nrender leaves both out, because the server cannot see the children.\n\n**A row with an `href` is a link.** The row itself renders as an `<a>`\ncarrying `menuitem`, as `Menu.Item` does, so a middle click, a modified\nclick and the status bar keep working. Enter follows it, and Space does too.\nChoosing it fires `helix-select` first: cancel the event and the link is not\nfollowed, so a router can take the navigation. A row that opens a page, or a\ndisabled row, renders no link.\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 row is named by its label alone. Words in `description`, a line under\nthe label, and in `end` describe it instead, through `aria-describedby`, as\n`Menu.Item` does: a reader hears \"Theme\", then \"Dark\".",
59098
59516
  "name": "HelixHeadlessDrilldownItem",
59099
59517
  "cssParts": [
59100
59518
  {
59101
- "description": "The row itself.",
59519
+ "description": "The row itself, which is an `<a>` where `href` is set.",
59102
59520
  "name": "item"
59103
59521
  },
59104
59522
  {
@@ -59148,6 +59566,16 @@
59148
59566
  "attribute": "disabled",
59149
59567
  "reflects": true
59150
59568
  },
59569
+ {
59570
+ "kind": "field",
59571
+ "name": "download",
59572
+ "type": {
59573
+ "text": "boolean"
59574
+ },
59575
+ "default": "false",
59576
+ "description": "Whether the link downloads the file when the row is chosen. Only\nmeaningful beside an `href`, and only for a file served from this origin.",
59577
+ "attribute": "download"
59578
+ },
59151
59579
  {
59152
59580
  "kind": "field",
59153
59581
  "name": "focusable",
@@ -59157,6 +59585,36 @@
59157
59585
  "default": "false",
59158
59586
  "description": "Whether this row holds the region's tab stop. Set by the drill-down.\n\nA drill-down keeps one stop and moves within it on the arrows, so every\nother row is at `-1`. Leave it off every row, including the first, and\nnothing in the region is tab-reachable: the keyboard cannot get in without\nfirst clicking something with a pointer.\n\nNo attribute, the same as `Button`'s: this is coordination between\nelements, and writing `tabindex` onto a host the consumer rendered is a\nchange a React consumer's hydration reports and does not patch up. The stop\nlands inside this shadow root instead."
59159
59587
  },
59588
+ {
59589
+ "kind": "field",
59590
+ "name": "href",
59591
+ "type": {
59592
+ "text": "string"
59593
+ },
59594
+ "default": "''",
59595
+ "description": "The URL the row links to. Setting it renders the row as a link, unless the\nrow opens a page or is disabled.",
59596
+ "attribute": "href"
59597
+ },
59598
+ {
59599
+ "kind": "field",
59600
+ "name": "rel",
59601
+ "type": {
59602
+ "text": "string"
59603
+ },
59604
+ "default": "''",
59605
+ "description": "The link's `rel`. Set it whenever you set `target=\"_blank\"`.",
59606
+ "attribute": "rel"
59607
+ },
59608
+ {
59609
+ "kind": "field",
59610
+ "name": "target",
59611
+ "type": {
59612
+ "text": "string"
59613
+ },
59614
+ "default": "''",
59615
+ "description": "Where the link opens, for rows that should open outside the current page.",
59616
+ "attribute": "target"
59617
+ },
59160
59618
  {
59161
59619
  "kind": "field",
59162
59620
  "name": "value",
@@ -59265,6 +59723,41 @@
59265
59723
  "text": "select() => void"
59266
59724
  }
59267
59725
  },
59726
+ {
59727
+ "kind": "method",
59728
+ "name": "choose",
59729
+ "privacy": "private",
59730
+ "return": {
59731
+ "type": {
59732
+ "text": "boolean"
59733
+ }
59734
+ },
59735
+ "description": "Fires `helix-select`, and returns whether the choice stood."
59736
+ },
59737
+ {
59738
+ "kind": "field",
59739
+ "name": "handleClick",
59740
+ "privacy": "private",
59741
+ "readonly": true,
59742
+ "description": "A press on the row. On a link, a refused `helix-select` stops the link\nfrom being followed, so a router can take the navigation."
59743
+ },
59744
+ {
59745
+ "kind": "field",
59746
+ "name": "handleLinkKeydown",
59747
+ "privacy": "private",
59748
+ "readonly": true,
59749
+ "description": "Space on a link presses it, which an anchor does not do on its own. Enter\nis the anchor's, which fires a click and follows the link."
59750
+ },
59751
+ {
59752
+ "kind": "field",
59753
+ "name": "linked",
59754
+ "type": {
59755
+ "text": "boolean"
59756
+ },
59757
+ "privacy": "private",
59758
+ "description": "Whether the row renders as a link.",
59759
+ "readonly": true
59760
+ },
59268
59761
  {
59269
59762
  "kind": "method",
59270
59763
  "name": "renderMark",
@@ -59636,6 +60129,42 @@
59636
60129
  "description": "Whether the row can be reached at all.",
59637
60130
  "fieldName": "disabled"
59638
60131
  },
60132
+ {
60133
+ "name": "download",
60134
+ "type": {
60135
+ "text": "boolean"
60136
+ },
60137
+ "default": "false",
60138
+ "description": "Whether the link downloads the file when the row is chosen. Only\nmeaningful beside an `href`, and only for a file served from this origin.",
60139
+ "fieldName": "download"
60140
+ },
60141
+ {
60142
+ "name": "href",
60143
+ "type": {
60144
+ "text": "string"
60145
+ },
60146
+ "default": "''",
60147
+ "description": "The URL the row links to. Setting it renders the row as a link, unless the\nrow opens a page or is disabled.",
60148
+ "fieldName": "href"
60149
+ },
60150
+ {
60151
+ "name": "rel",
60152
+ "type": {
60153
+ "text": "string"
60154
+ },
60155
+ "default": "''",
60156
+ "description": "The link's `rel`. Set it whenever you set `target=\"_blank\"`.",
60157
+ "fieldName": "rel"
60158
+ },
60159
+ {
60160
+ "name": "target",
60161
+ "type": {
60162
+ "text": "string"
60163
+ },
60164
+ "default": "''",
60165
+ "description": "Where the link opens, for rows that should open outside the current page.",
60166
+ "fieldName": "target"
60167
+ },
59639
60168
  {
59640
60169
  "name": "value",
59641
60170
  "type": {
@@ -59704,7 +60233,7 @@
59704
60233
  "declarations": [
59705
60234
  {
59706
60235
  "kind": "class",
59707
- "description": "One panel whose content changes as you move between pages. Use it where there\nis no room for a second column, such as on a phone, or on a touch screen with\nno hover to open one.\n\nIt is a region that stays where you put it, such as inside a drawer, a\nsidebar, or a settings panel. A `Menu` opens from a trigger and closes when\nyou are done. `Menu` can drill into pages too, through the same controller.\n\nRows are places to go and commands to run. Nothing here is form-associated\nand nothing is submitted. To choose a value, use a `Listbox`.\n\nA row that opens a page contains that page, so the stack holds one reference\nand reads the rest from the DOM. The behavior lives in `DrilldownController`,\nwhich `Menu` shares.\n\nAfter each move the host carries `data-direction`, `forward` into a page or\n`back` out of one, and records `:state(forward)` or `:state(back)`, so a\nstylesheet can slide the new page in from the side the reader is going. Both\nare written again on every move, so an animation keyed on them runs for each\npage, two moves the same way included. The styled tier slides the page and\nswaps it at once under `prefers-reduced-motion`.\n\nKeys, on a row: Up and Down Arrow move between the rows, Home and End go to\nthe first and the last, and a typed letter moves to the next row whose name\nstarts with it. Enter, Space, or Right Arrow opens a row's page, and Left\nArrow or Escape goes back, the two arrows swapping on a right-to-left page.\n\nThe rows of the page showing are a `menu`, named by `label` on the top page\nand by the page's title below it. The back button and the title sit above\nthe menu. Disabled rows stay reachable with the arrow keys, and typing a\nletter moves to the next row whose name starts with it.",
60236
+ "description": "One panel whose content changes as you move between pages. Use it where there\nis no room for a second column, such as on a phone, or on a touch screen with\nno hover to open one.\n\nIt is a region that stays where you put it, such as inside a drawer, a\nsidebar, or a settings panel. A `Menu` opens from a trigger and closes when\nyou are done. `Menu` can drill into pages too, through the same controller.\n\nRows are places to go and commands to run. Nothing here is form-associated\nand nothing is submitted. To choose a value, use a `Listbox`.\n\nA row that opens a page contains that page, so the stack holds one reference\nand reads the rest from the DOM. The behavior lives in `DrilldownController`,\nwhich `Menu` shares.\n\n**`page` is the page showing**, as the `value` of the row that opens it,\nand empty on the top page. Set it to show a page, such as one a link to a\nsettings screen names. A reader's move updates it, and `helix-navigate`\ncomes first, so you can refuse the move or take it yourself.\n\nAfter each move the host carries `data-direction`, `forward` into a page or\n`back` out of one, and records `:state(forward)` or `:state(back)`, so a\nstylesheet can slide the new page in from the side the reader is going. Both\nare written again on every move, so an animation keyed on them runs for each\npage, two moves the same way included. The styled tier slides the page and\nswaps it at once under `prefers-reduced-motion`.\n\n**Keyboard.** The drilldown is one tab stop, on the row last focused.\n\n| Key | What it does |\n|---|---|\n| Down Arrow, Up Arrow | Moves to the next or the previous row. |\n| Home, End | Moves to the first or the last row. |\n| A letter | Moves to the next row whose name starts with it. |\n| Enter, Space | Chooses the row: opens its page, follows its link, or sends `helix-select`. |\n| Right Arrow | Opens the row's page. Left Arrow on a right-to-left page. |\n| Left Arrow, Escape | Goes back one page, with focus on the row that opened it. Right Arrow on a right-to-left page. |\n\nThe rows of the page showing are a `menu`, named by `label` on the top page\nand by the page's title below it.\n\n**`navigation` makes it a site's navigation.** The host is a `navigation`\nlandmark named by `label`, each page is a list, and each row is a list item\nholding a link or a button, as the APG's disclosure navigation is built,\nso a reader meets places to go in place of a menu of commands. The keys stay\nthe same. The back button and the title sit above\nthe menu. Disabled rows stay reachable with the arrow keys, and typing a\nletter moves to the next row whose name starts with it.",
59708
60237
  "name": "HelixHeadlessDrilldown",
59709
60238
  "cssParts": [
59710
60239
  {
@@ -59791,6 +60320,26 @@
59791
60320
  "words": true
59792
60321
  }
59793
60322
  },
60323
+ {
60324
+ "kind": "field",
60325
+ "name": "navigation",
60326
+ "type": {
60327
+ "text": "boolean"
60328
+ },
60329
+ "default": "false",
60330
+ "description": "Whether the drilldown is a site's navigation: a `navigation` landmark\nnamed by `label`, whose pages are lists of links. Without it, each page is\na `menu`.",
60331
+ "attribute": "navigation"
60332
+ },
60333
+ {
60334
+ "kind": "field",
60335
+ "name": "page",
60336
+ "type": {
60337
+ "text": "string"
60338
+ },
60339
+ "default": "''",
60340
+ "description": "The page showing, as the `value` of the row that opens it. Empty is the\ntop page. Setting it shows that page, and a value no row with a page has\nshows the top page.",
60341
+ "attribute": "page"
60342
+ },
59794
60343
  {
59795
60344
  "kind": "field",
59796
60345
  "name": "direction",
@@ -59854,6 +60403,44 @@
59854
60403
  },
59855
60404
  "description": "Puts the region's one tab stop on the first row of the page showing.\n\nOne row holds the stop and the arrows move within, which is the roving\npattern the toolbar uses and the one a `menu` wants. Every row at `-1` is\na region the keyboard cannot get into at all without a pointer first.\n\nCalled after every update, because the set changes with the page: drilling\nin replaces the rows outright, and the stop has to land on rows that are\nactually showing."
59856
60405
  },
60406
+ {
60407
+ "kind": "method",
60408
+ "name": "navigate",
60409
+ "privacy": "private",
60410
+ "return": {
60411
+ "type": {
60412
+ "text": "boolean"
60413
+ }
60414
+ },
60415
+ "parameters": [
60416
+ {
60417
+ "name": "to",
60418
+ "type": {
60419
+ "text": "HelixHeadlessDrilldownItem | null"
60420
+ }
60421
+ }
60422
+ ],
60423
+ "description": "Asks before a reader's move to a page, the row's or the top one, and\nreturns whether the move may go ahead."
60424
+ },
60425
+ {
60426
+ "kind": "method",
60427
+ "name": "holderOf",
60428
+ "privacy": "private",
60429
+ "return": {
60430
+ "type": {
60431
+ "text": "HelixHeadlessDrilldownItem | null"
60432
+ }
60433
+ },
60434
+ "parameters": [
60435
+ {
60436
+ "name": "row",
60437
+ "type": {
60438
+ "text": "HelixHeadlessDrilldownItem"
60439
+ }
60440
+ }
60441
+ ],
60442
+ "description": "The row whose page holds a row, or null for the top page."
60443
+ },
59857
60444
  {
59858
60445
  "kind": "method",
59859
60446
  "name": "enter",
@@ -59886,6 +60473,25 @@
59886
60473
  "text": "back() => boolean"
59887
60474
  }
59888
60475
  },
60476
+ {
60477
+ "kind": "method",
60478
+ "name": "showPage",
60479
+ "privacy": "private",
60480
+ "return": {
60481
+ "type": {
60482
+ "text": "void"
60483
+ }
60484
+ },
60485
+ "parameters": [
60486
+ {
60487
+ "name": "value",
60488
+ "type": {
60489
+ "text": "string"
60490
+ }
60491
+ }
60492
+ ],
60493
+ "description": "Shows the page of the row with a value, or the top page where no row with a page has it."
60494
+ },
59889
60495
  {
59890
60496
  "kind": "field",
59891
60497
  "name": "handleFocusIn",
@@ -60506,6 +61112,14 @@
60506
61112
  }
60507
61113
  ],
60508
61114
  "events": [
61115
+ {
61116
+ "type": {
61117
+ "text": "HelixNavigateEvent"
61118
+ },
61119
+ "description": "Fired before a reader moves into a page or back out of one. `detail.value` is the `value` of the row whose page is about to show, empty for the top page. Cancelable: cancel it to stay on the page showing.",
61120
+ "name": "helix-navigate",
61121
+ "reactProp": "onhelix-navigate"
61122
+ },
60509
61123
  {
60510
61124
  "type": {
60511
61125
  "text": "HelixSelectEvent"
@@ -60534,6 +61148,24 @@
60534
61148
  "description": "The text of the back button.",
60535
61149
  "fieldName": "backLabel"
60536
61150
  },
61151
+ {
61152
+ "name": "navigation",
61153
+ "type": {
61154
+ "text": "boolean"
61155
+ },
61156
+ "default": "false",
61157
+ "description": "Whether the drilldown is a site's navigation: a `navigation` landmark\nnamed by `label`, whose pages are lists of links. Without it, each page is\na `menu`.",
61158
+ "fieldName": "navigation"
61159
+ },
61160
+ {
61161
+ "name": "page",
61162
+ "type": {
61163
+ "text": "string"
61164
+ },
61165
+ "default": "''",
61166
+ "description": "The page showing, as the `value` of the row that opens it. Empty is the\ntop page. Setting it shows that page, and a value no row with a page has\nshows the top page.",
61167
+ "fieldName": "page"
61168
+ },
60537
61169
  {
60538
61170
  "name": "empty-text",
60539
61171
  "type": {
@@ -62087,6 +62719,21 @@
62087
62719
  "module": "src/mixins/mixin-field/mixin-field.ts"
62088
62720
  }
62089
62721
  },
62722
+ {
62723
+ "kind": "field",
62724
+ "name": "namedBy",
62725
+ "type": {
62726
+ "text": "string | null"
62727
+ },
62728
+ "privacy": "protected",
62729
+ "default": "null",
62730
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
62731
+ "attribute": "aria-label",
62732
+ "inheritedFrom": {
62733
+ "name": "MixinField",
62734
+ "module": "src/mixins/mixin-field/mixin-field.ts"
62735
+ }
62736
+ },
62090
62737
  {
62091
62738
  "kind": "field",
62092
62739
  "name": "labeled",
@@ -63331,6 +63978,8 @@
63331
63978
  "text": "string | null"
63332
63979
  },
63333
63980
  "default": "null",
63981
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
63982
+ "fieldName": "namedBy",
63334
63983
  "inheritedFrom": {
63335
63984
  "name": "MixinField",
63336
63985
  "module": "src/mixins/mixin-field/mixin-field.ts"
@@ -65076,6 +65725,10 @@
65076
65725
  "description": "The leading column.",
65077
65726
  "name": "entry-start"
65078
65727
  },
65728
+ {
65729
+ "description": "The panel a row's submenu opens in beside it. The filter menu's rows have none.",
65730
+ "name": "entry-surface"
65731
+ },
65079
65732
  {
65080
65733
  "description": "The menu the fields are offered in.",
65081
65734
  "name": "menu"
@@ -67412,6 +68065,21 @@
67412
68065
  "module": "src/mixins/mixin-field/mixin-field.ts"
67413
68066
  }
67414
68067
  },
68068
+ {
68069
+ "kind": "field",
68070
+ "name": "namedBy",
68071
+ "type": {
68072
+ "text": "string | null"
68073
+ },
68074
+ "privacy": "protected",
68075
+ "default": "null",
68076
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
68077
+ "attribute": "aria-label",
68078
+ "inheritedFrom": {
68079
+ "name": "MixinField",
68080
+ "module": "src/mixins/mixin-field/mixin-field.ts"
68081
+ }
68082
+ },
67415
68083
  {
67416
68084
  "kind": "field",
67417
68085
  "name": "labeled",
@@ -68745,6 +69413,8 @@
68745
69413
  "text": "string | null"
68746
69414
  },
68747
69415
  "default": "null",
69416
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
69417
+ "fieldName": "namedBy",
68748
69418
  "inheritedFrom": {
68749
69419
  "name": "MixinField",
68750
69420
  "module": "src/mixins/mixin-field/mixin-field.ts"
@@ -70551,6 +71221,10 @@
70551
71221
  "description": "How many notes the list holds, which a search narrows, at the end of the search bar.",
70552
71222
  "name": "count"
70553
71223
  },
71224
+ {
71225
+ "description": "The box in place of the list when it holds no notes, holding the `empty` slot.",
71226
+ "name": "empty"
71227
+ },
70554
71228
  {
70555
71229
  "description": "The icon beside the search field.",
70556
71230
  "name": "filter-icon"
@@ -70685,6 +71359,10 @@
70685
71359
  "description": "The renderer's box, which the drawing is made in.",
70686
71360
  "name": ""
70687
71361
  },
71362
+ {
71363
+ "description": "What the panel shows when the list holds no notes. Defaults to `empty-label`.",
71364
+ "name": "empty"
71365
+ },
70688
71366
  {
70689
71367
  "description": "The icon in the search field. Defaults to a magnifying glass.",
70690
71368
  "name": "filter-icon"
@@ -70797,6 +71475,19 @@
70797
71475
  "description": "How many links from the selected note to show, for its local graph. Unset\nshows every note. The list holds what the drawing shows.",
70798
71476
  "attribute": "depth"
70799
71477
  },
71478
+ {
71479
+ "kind": "field",
71480
+ "name": "emptyLabel",
71481
+ "type": {
71482
+ "text": "string"
71483
+ },
71484
+ "default": "'No notes'",
71485
+ "description": "What the panel shows when the list holds no notes: the graph has none, or\na search or the legend hid them all. A slotted `empty` replaces it.",
71486
+ "attribute": "empty-label",
71487
+ "helix": {
71488
+ "words": true
71489
+ }
71490
+ },
70800
71491
  {
70801
71492
  "kind": "field",
70802
71493
  "name": "fallbackLabel",
@@ -70985,6 +71676,19 @@
70985
71676
  "words": true
70986
71677
  }
70987
71678
  },
71679
+ {
71680
+ "kind": "field",
71681
+ "name": "roleLabel",
71682
+ "type": {
71683
+ "text": "string"
71684
+ },
71685
+ "default": "'graph'",
71686
+ "description": "What a screen reader calls the graph in place of its role, after its\nname: \"Research notes, graph\". Said only where the graph has a name of its\nown, since the fallback name is the same word. Empty leaves the role.",
71687
+ "attribute": "role-label",
71688
+ "helix": {
71689
+ "words": true
71690
+ }
71691
+ },
70988
71692
  {
70989
71693
  "kind": "field",
70990
71694
  "name": "searchLabel",
@@ -72900,6 +73604,15 @@
72900
73604
  "description": "How many links from the selected note to show, for its local graph. Unset\nshows every note. The list holds what the drawing shows.",
72901
73605
  "fieldName": "depth"
72902
73606
  },
73607
+ {
73608
+ "name": "empty-label",
73609
+ "type": {
73610
+ "text": "string"
73611
+ },
73612
+ "default": "'No notes'",
73613
+ "description": "What the panel shows when the list holds no notes: the graph has none, or\na search or the legend hid them all. A slotted `empty` replaces it.",
73614
+ "fieldName": "emptyLabel"
73615
+ },
72903
73616
  {
72904
73617
  "name": "fallback-label",
72905
73618
  "type": {
@@ -73017,6 +73730,15 @@
73017
73730
  "description": "The list's name, read by screen readers, and the name of the button that opens it with `no-panel`.",
73018
73731
  "fieldName": "notesLabel"
73019
73732
  },
73733
+ {
73734
+ "name": "role-label",
73735
+ "type": {
73736
+ "text": "string"
73737
+ },
73738
+ "default": "'graph'",
73739
+ "description": "What a screen reader calls the graph in place of its role, after its\nname: \"Research notes, graph\". Said only where the graph has a name of its\nown, since the fallback name is the same word. Empty leaves the role.",
73740
+ "fieldName": "roleLabel"
73741
+ },
73020
73742
  {
73021
73743
  "name": "search-label",
73022
73744
  "type": {
@@ -80294,6 +81016,21 @@
80294
81016
  "module": "src/mixins/mixin-field/mixin-field.ts"
80295
81017
  }
80296
81018
  },
81019
+ {
81020
+ "kind": "field",
81021
+ "name": "namedBy",
81022
+ "type": {
81023
+ "text": "string | null"
81024
+ },
81025
+ "privacy": "protected",
81026
+ "default": "null",
81027
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
81028
+ "attribute": "aria-label",
81029
+ "inheritedFrom": {
81030
+ "name": "MixinField",
81031
+ "module": "src/mixins/mixin-field/mixin-field.ts"
81032
+ }
81033
+ },
80297
81034
  {
80298
81035
  "kind": "field",
80299
81036
  "name": "labeled",
@@ -81591,6 +82328,8 @@
81591
82328
  "text": "string | null"
81592
82329
  },
81593
82330
  "default": "null",
82331
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
82332
+ "fieldName": "namedBy",
81594
82333
  "inheritedFrom": {
81595
82334
  "name": "MixinField",
81596
82335
  "module": "src/mixins/mixin-field/mixin-field.ts"
@@ -88559,7 +89298,7 @@
88559
89298
  "declarations": [
88560
89299
  {
88561
89300
  "kind": "class",
88562
- "description": "Sets `role=\"list\"` on the host, so a screen reader counts the rows and\nannounces each one's position, such as \"1 of 7\".\n\n**`selection-mode` makes the list interactive**, in the way of a grid list:\na grid of rows that is one tab stop. `single` selects one row at a time and\n`multiple` any number, and `value` holds the selected rows' values,\nseparated by commas. A change asks with `helix-before-change` and tells\nwith `change`. `none` selects nothing, so a press acts on the row. A\n`disabled` row is passed over. Each row is named by its label and described\nby its description, so the words of the controls in `end` are not read as\npart of its name.\n\n`selection-behavior` says what a press does to the rows already selected.\n`toggle`, the default, adds or takes out the row. `replace` selects the row\nalone, as a file list does, and the arrow keys carry the selection with\nthem. Control or Command with a press then adds or takes out one row.\n\n| Key | What it does |\n|---|---|\n| Down, Up | Moves to the next or the previous row. Under `replace`, selects it. |\n| Home, End | Moves to the first or the last row. Under `replace`, selects it. |\n| Page Down, Page Up | Moves a box's height of rows, so the row at one edge lands at the other. Under `replace`, selects the row it lands on. |\n| A letter or a word | Moves to the next row whose words start with what you typed. |\n| Left, Right | Moves between the row and the controls in its `end` slot. |\n| Space | Selects the row, or lets it go. |\n| Shift with Down, Up, Home, End, Page Down, Page Up or Space | Selects every row from the last one pressed, in `multiple`. |\n| Control or Command with Down, Up, Home, End, Page Down or Page Up | Moves without selecting, under `replace`. |\n| Control or Command with A | Selects every row, in `multiple`. |\n| Escape | Lets go of every selected row, asking first, and keeps the key from the dialog or menu around the list. With nothing selected, the key goes on to them. |\n| Enter | Acts on the row: follows its link, or sends `helix-action` from it. |\n\nA press with Shift selects every row from the last one pressed, and a press\nwith Control or Command adds or takes out one row under `replace`.\n\n**Leave `selection-mode` unset for a list a reader reads**, and set it for\none a reader chooses from or acts on. The rows of an interactive list are\ngrid rows, which hold controls as a list box option cannot. Give a control\nin `end` `tabindex=\"-1\"` to leave it to the arrow keys and out of the tab\norder.\n\n**`reorderable` lets you move rows.** Each row gets a grip after its `end`\nslot, named by `move-label`. Drag a grip to move its row, and the list\nscrolls near an edge. Or press a grip with Space, Enter, or a click to pick\nup its row, move it with the arrow keys, and press the grip again to drop\nit. A click on another row drops it there, and Escape puts it back. The list\nsays each step in its `live` region. A drop sends `helix-before-reorder`,\nwhich you can refuse, and then `helix-reorder`, whose `keys` hold every\nrow's value in the new order. **You move the rows**: the list moves no\nelement of yours, so your framework keeps the order it rendered.\n\n| Key, on a held row's grip | What it does |\n|---|---|\n| Down, Up | Moves the row one place. |\n| Home, End | Moves the row to the top or the bottom. |\n| Space, Enter | Drops the row. |\n| Escape | Puts the row back where it was. |\n\n`start` and `reversed` number an ordered list as `<ol>` does. The list\nwrites where the numbers start and which way they run as `--list-first` and\n`--list-step` on its slot, which the styled tier counts from. Reversed with\nno `start` counts down from the number of rows, which a server cannot know,\nso served markup counts from one until the list runs.",
89301
+ "description": "Sets `role=\"list\"` on the host, so a screen reader counts the rows and\nannounces each one's position, such as \"1 of 7\".\n\n**`selection-mode` makes the list interactive**, in the way of a grid list:\na grid of rows that is one tab stop. `single` selects one row at a time and\n`multiple` any number, and `value` holds the selected rows' values,\nseparated by commas. A change asks with `helix-before-change` and tells\nwith `change`. `none` selects nothing, so a press acts on the row. A\n`disabled` row is passed over. Each row is named by its label and described\nby its description, so the words of the controls in `end` are not read as\npart of its name.\n\n`selection-behavior` says what a press does to the rows already selected.\n`toggle`, the default, adds or takes out the row. `replace` selects the row\nalone, as a file list does, and the arrow keys carry the selection with\nthem. Control or Command with a press then adds or takes out one row.\n\n| Key | What it does |\n|---|---|\n| Down, Up | Moves to the next or the previous row. Under `replace`, selects it. |\n| Home, End | Moves to the first or the last row. Under `replace`, selects it. |\n| Page Down, Page Up | Moves a box's height of rows, so the row at one edge lands at the other. Under `replace`, selects the row it lands on. |\n| A letter or a word | Moves to the next row whose words start with what you typed. |\n| Left, Right | Moves between the row and the controls in its `end` slot. |\n| Space | Selects the row, or lets it go. |\n| Shift with Down, Up, Home, End, Page Down, Page Up or Space | Selects every row from the last one pressed, in `multiple`. |\n| Control or Command with Down, Up, Home, End, Page Down or Page Up | Moves without selecting, under `replace`. |\n| Control or Command with A | Selects every row, in `multiple`. |\n| Escape | Lets go of every selected row, asking first, and keeps the key from the dialog or menu around the list. With nothing selected, the key goes on to them. |\n| Enter | Acts on the row: follows its link, or sends `helix-action` from it. |\n\nA press with Shift selects every row from the last one pressed, and a press\nwith Control or Command adds or takes out one row under `replace`.\n\n**Leave `selection-mode` unset for a list a reader reads**, and set it for\none a reader chooses from or acts on. The rows of an interactive list are\ngrid rows, which hold controls as a list box option cannot. Give a control\nin `end` `tabindex=\"-1\"` to leave it to the arrow keys and out of the tab\norder.\n\n**`reorderable` lets you move rows.** Each row gets a grip after its `end`\nslot, named by `move-label`. Drag a grip to move its row, and the list\nscrolls near an edge. Or press a grip with Space, Enter, or a click to pick\nup its row, move it with the arrow keys, and press the grip again to drop\nit. A click on another row drops it there, and Escape puts it back. The list\nsays each step in its `live` region. A drop sends `helix-before-reorder`,\nwhich you can refuse, and then `helix-reorder`, whose `keys` hold every\nrow's value in the new order. **You move the rows**: the list moves no\nelement of yours, so your framework keeps the order it rendered.\n\n| Key, on a held row's grip | What it does |\n|---|---|\n| Down, Up | Moves the row one place. |\n| Home, End | Moves the row to the top or the bottom. |\n| Space, Enter | Drops the row. |\n| Escape | Puts the row back where it was. |\n\n`start` and `reversed` number an ordered list as `<ol>` does. The list\nwrites where the numbers start and which way they run as `--list-first` and\n`--list-step` on its slot, which the styled tier counts from. Reversed with\nno `start` counts down from the number of rows, which a server cannot know,\nso served markup counts from one until the list runs.\n\n**An empty list.** Set `empty-label`, or put your own content in the `empty`\nslot, for a row shown while the list has no rows and none are loading, such\nas \"No files yet\" and a link to add one. Without either, an empty list shows\nnothing. The list takes the `empty` state while it has no rows, whatever it\nshows.\n\n**Loading more.** `load-more` sends `helix-load-more` once the end of the\nlist comes within a screen of view, in the box that scrolls it or the page,\nonce for each number of rows: add rows and it can send it again. While you\nfetch, set `loading`: the list is busy, and a row after the last says\n\"Loading more\" (`loading-label`, or your own content in the `loading`\nslot). The list asks for nothing while `loading` is set.\n\nAn interactive list with no name is reported once in a development build,\nsince a screen reader announces it as a grid and nothing more. Name it with\n`label` or `aria-label`.",
88563
89302
  "name": "HelixHeadlessList",
88564
89303
  "cssProperties": [
88565
89304
  {
@@ -88576,15 +89315,31 @@
88576
89315
  "description": "A copy of the row a pointer drags, which follows the pointer in the top layer until the row is let go, in a `reorderable` list. Hidden from assistive technology.",
88577
89316
  "name": "drag-preview"
88578
89317
  },
89318
+ {
89319
+ "description": "The row shown while the list has no rows and none are loading, where `empty-label` or the `empty` slot gives it content. A grid row with one cell in a list that selects.",
89320
+ "name": "empty"
89321
+ },
88579
89322
  {
88580
89323
  "description": "The region that says each step of a move to screen readers, in a `reorderable` list. Drawn from the first move. Visually hidden in the styled tier.",
88581
89324
  "name": "live"
89325
+ },
89326
+ {
89327
+ "description": "The row after the last while `loading` is set. A grid row with one cell in a list that selects.",
89328
+ "name": "loading"
88582
89329
  }
88583
89330
  ],
88584
89331
  "slots": [
88585
89332
  {
88586
89333
  "description": "The rows.",
88587
89334
  "name": ""
89335
+ },
89336
+ {
89337
+ "description": "Content for the row shown while the list has no rows and none are loading. Falls back to `empty-label`.",
89338
+ "name": "empty"
89339
+ },
89340
+ {
89341
+ "description": "Content for the row after the last while `loading` is set. Falls back to `loading-label`.",
89342
+ "name": "loading"
88588
89343
  }
88589
89344
  ],
88590
89345
  "members": [
@@ -88624,6 +89379,16 @@
88624
89379
  "words": true
88625
89380
  }
88626
89381
  },
89382
+ {
89383
+ "kind": "field",
89384
+ "name": "emptyLabel",
89385
+ "type": {
89386
+ "text": "string"
89387
+ },
89388
+ "default": "''",
89389
+ "description": "The text of the row shown while the list has no rows, where the `empty`\nslot is empty. Empty, the default, shows no row.",
89390
+ "attribute": "empty-label"
89391
+ },
88627
89392
  {
88628
89393
  "kind": "field",
88629
89394
  "name": "kind",
@@ -88644,6 +89409,39 @@
88644
89409
  "description": "The list's name, read by screen readers.",
88645
89410
  "attribute": "label"
88646
89411
  },
89412
+ {
89413
+ "kind": "field",
89414
+ "name": "loading",
89415
+ "type": {
89416
+ "text": "boolean"
89417
+ },
89418
+ "default": "false",
89419
+ "description": "Marks the list as busy fetching more rows, and draws a row after the last\nthat says so. The list asks for no more while it is set.",
89420
+ "attribute": "loading"
89421
+ },
89422
+ {
89423
+ "kind": "field",
89424
+ "name": "loadingLabel",
89425
+ "type": {
89426
+ "text": "string"
89427
+ },
89428
+ "default": "'Loading more'",
89429
+ "description": "The text of the row drawn while `loading` is set, where the `loading` slot is empty.",
89430
+ "attribute": "loading-label",
89431
+ "helix": {
89432
+ "words": true
89433
+ }
89434
+ },
89435
+ {
89436
+ "kind": "field",
89437
+ "name": "loadMore",
89438
+ "type": {
89439
+ "text": "boolean"
89440
+ },
89441
+ "default": "false",
89442
+ "description": "Sends `helix-load-more` once the end of the list comes within a screen of\nview, so you can add the next rows as a reader nears them.",
89443
+ "attribute": "load-more"
89444
+ },
88647
89445
  {
88648
89446
  "kind": "field",
88649
89447
  "name": "movedLabel",
@@ -88748,7 +89546,7 @@
88748
89546
  "text": "string"
88749
89547
  },
88750
89548
  "default": "''",
88751
- "description": "The selected rows' values, separated by commas, in a list that selects.\n\nSet it to start with rows selected. A row's value is its `value`, or its\nwords where it has none.",
89549
+ "description": "The selected rows' values, separated by commas with no spaces, such as `a,c`, in a list that selects.\n\nSet it to start with rows selected. A row's value is its `value`, or its\nwords where it has none.",
88752
89550
  "attribute": "value"
88753
89551
  },
88754
89552
  {
@@ -89190,6 +89988,93 @@
89190
89988
  "description": "Where the numbers start and which way they run, as custom properties on\nthe slot the rows inherit from, or nothing where they count up from one.",
89191
89989
  "readonly": true
89192
89990
  },
89991
+ {
89992
+ "kind": "method",
89993
+ "name": "drawEmpty",
89994
+ "privacy": "private",
89995
+ "return": {
89996
+ "type": {
89997
+ "text": "TemplateResult | typeof nothing"
89998
+ }
89999
+ },
90000
+ "description": "The row shown while the list has no rows: a list item, or a grid row with\none cell in a list that selects. Drawn only once the children are known,\nso a server and a hydrating render never claim an empty list, and hidden\nwhile it has neither `empty-label` nor content in the `empty` slot."
90001
+ },
90002
+ {
90003
+ "kind": "method",
90004
+ "name": "drawLoading",
90005
+ "privacy": "private",
90006
+ "return": {
90007
+ "type": {
90008
+ "text": "TemplateResult | typeof nothing"
90009
+ }
90010
+ },
90011
+ "description": "The row after the last while `loading` is set: a list item, or a grid row\nwith one cell in a list that selects. It is not one of the rows, so it\ncarries no value and a key never lands on it."
90012
+ },
90013
+ {
90014
+ "kind": "field",
90015
+ "name": "endWatcher",
90016
+ "type": {
90017
+ "text": "IntersectionObserver | undefined"
90018
+ },
90019
+ "privacy": "private",
90020
+ "description": "Watches the end of a `load-more` list coming near the box that scrolls it."
90021
+ },
90022
+ {
90023
+ "kind": "field",
90024
+ "name": "watchedEnd",
90025
+ "type": {
90026
+ "text": "Element | undefined"
90027
+ },
90028
+ "privacy": "private",
90029
+ "description": "The end being watched, so a new one is watched again."
90030
+ },
90031
+ {
90032
+ "kind": "field",
90033
+ "name": "endInView",
90034
+ "type": {
90035
+ "text": "boolean"
90036
+ },
90037
+ "privacy": "private",
90038
+ "default": "false",
90039
+ "description": "Whether the end of the list was in reach when last measured."
90040
+ },
90041
+ {
90042
+ "kind": "field",
90043
+ "name": "askedAt",
90044
+ "type": {
90045
+ "text": "number | undefined"
90046
+ },
90047
+ "privacy": "private",
90048
+ "description": "The number of rows `helix-load-more` was last sent for."
90049
+ },
90050
+ {
90051
+ "kind": "method",
90052
+ "name": "watchEnd",
90053
+ "privacy": "private",
90054
+ "return": {
90055
+ "type": {
90056
+ "text": "void"
90057
+ }
90058
+ },
90059
+ "description": "Starts or stops watching the end of the list. The box it is measured\nagainst is the one that scrolls the list, or the page, and a screen of\nroom is added below it, so the next rows are asked for before a reader\nreaches the last."
90060
+ },
90061
+ {
90062
+ "kind": "method",
90063
+ "name": "askForMore",
90064
+ "privacy": "private",
90065
+ "return": {
90066
+ "type": {
90067
+ "text": "void"
90068
+ }
90069
+ },
90070
+ "description": "Sends `helix-load-more`, once for each number of rows, and never while loading."
90071
+ },
90072
+ {
90073
+ "kind": "field",
90074
+ "name": "handleEmptyChange",
90075
+ "privacy": "private",
90076
+ "readonly": true
90077
+ },
89193
90078
  {
89194
90079
  "kind": "field",
89195
90080
  "name": "handleSlotChange",
@@ -89569,6 +90454,14 @@
89569
90454
  "name": "helix-before-reorder",
89570
90455
  "reactProp": "onhelix-before-reorder"
89571
90456
  },
90457
+ {
90458
+ "type": {
90459
+ "text": "HelixLoadMoreEvent"
90460
+ },
90461
+ "description": "Fired, in a list with `load-more`, when the end of the list comes within a screen of view, once for each number of rows.",
90462
+ "name": "helix-load-more",
90463
+ "reactProp": "onhelix-load-more"
90464
+ },
89572
90465
  {
89573
90466
  "type": {
89574
90467
  "text": "HelixReorderEvent"
@@ -89597,6 +90490,15 @@
89597
90490
  "description": "What screen readers hear when a row is dropped, in a `reorderable` list.",
89598
90491
  "fieldName": "droppedLabel"
89599
90492
  },
90493
+ {
90494
+ "name": "empty-label",
90495
+ "type": {
90496
+ "text": "string"
90497
+ },
90498
+ "default": "''",
90499
+ "description": "The text of the row shown while the list has no rows, where the `empty`\nslot is empty. Empty, the default, shows no row.",
90500
+ "fieldName": "emptyLabel"
90501
+ },
89600
90502
  {
89601
90503
  "name": "kind",
89602
90504
  "type": {
@@ -89614,6 +90516,33 @@
89614
90516
  "description": "The list's name, read by screen readers.",
89615
90517
  "fieldName": "label"
89616
90518
  },
90519
+ {
90520
+ "name": "loading",
90521
+ "type": {
90522
+ "text": "boolean"
90523
+ },
90524
+ "default": "false",
90525
+ "description": "Marks the list as busy fetching more rows, and draws a row after the last\nthat says so. The list asks for no more while it is set.",
90526
+ "fieldName": "loading"
90527
+ },
90528
+ {
90529
+ "name": "loading-label",
90530
+ "type": {
90531
+ "text": "string"
90532
+ },
90533
+ "default": "'Loading more'",
90534
+ "description": "The text of the row drawn while `loading` is set, where the `loading` slot is empty.",
90535
+ "fieldName": "loadingLabel"
90536
+ },
90537
+ {
90538
+ "name": "load-more",
90539
+ "type": {
90540
+ "text": "boolean"
90541
+ },
90542
+ "default": "false",
90543
+ "description": "Sends `helix-load-more` once the end of the list comes within a screen of\nview, so you can add the next rows as a reader nears them.",
90544
+ "fieldName": "loadMore"
90545
+ },
89617
90546
  {
89618
90547
  "name": "moved-label",
89619
90548
  "type": {
@@ -89698,10 +90627,28 @@
89698
90627
  "text": "string"
89699
90628
  },
89700
90629
  "default": "''",
89701
- "description": "The selected rows' values, separated by commas, in a list that selects.\n\nSet it to start with rows selected. A row's value is its `value`, or its\nwords where it has none.",
90630
+ "description": "The selected rows' values, separated by commas with no spaces, such as `a,c`, in a list that selects.\n\nSet it to start with rows selected. A row's value is its `value`, or its\nwords where it has none.",
89702
90631
  "fieldName": "value"
89703
90632
  }
89704
90633
  ],
90634
+ "cssStates": [
90635
+ {
90636
+ "description": "While the list has no rows.",
90637
+ "name": "empty"
90638
+ },
90639
+ {
90640
+ "description": "While `loading` is set.",
90641
+ "name": "loading"
90642
+ },
90643
+ {
90644
+ "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
90645
+ "name": "settled",
90646
+ "inheritedFrom": {
90647
+ "name": "HelixElement",
90648
+ "module": "src/helix-element/helix-element.ts"
90649
+ }
90650
+ }
90651
+ ],
89705
90652
  "superclass": {
89706
90653
  "name": "HelixElement",
89707
90654
  "package": "@fusion.dev/helix-core"
@@ -89730,16 +90677,6 @@
89730
90677
  },
89731
90678
  "tagName": "helix-headless-list",
89732
90679
  "customElement": true,
89733
- "cssStates": [
89734
- {
89735
- "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
89736
- "name": "settled",
89737
- "inheritedFrom": {
89738
- "name": "HelixElement",
89739
- "module": "src/helix-element/helix-element.ts"
89740
- }
89741
- }
89742
- ],
89743
90680
  "modulePath": "src/list/root/list-root.ts",
89744
90681
  "definitionPath": "src/list/root/list-root.ts"
89745
90682
  }
@@ -91419,6 +92356,21 @@
91419
92356
  "module": "src/mixins/mixin-field/mixin-field.ts"
91420
92357
  }
91421
92358
  },
92359
+ {
92360
+ "kind": "field",
92361
+ "name": "namedBy",
92362
+ "type": {
92363
+ "text": "string | null"
92364
+ },
92365
+ "privacy": "protected",
92366
+ "default": "null",
92367
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
92368
+ "attribute": "aria-label",
92369
+ "inheritedFrom": {
92370
+ "name": "MixinField",
92371
+ "module": "src/mixins/mixin-field/mixin-field.ts"
92372
+ }
92373
+ },
91422
92374
  {
91423
92375
  "kind": "field",
91424
92376
  "name": "labeled",
@@ -92785,6 +93737,8 @@
92785
93737
  "text": "string | null"
92786
93738
  },
92787
93739
  "default": "null",
93740
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
93741
+ "fieldName": "namedBy",
92788
93742
  "inheritedFrom": {
92789
93743
  "name": "MixinField",
92790
93744
  "module": "src/mixins/mixin-field/mixin-field.ts"
@@ -99093,6 +100047,19 @@
99093
100047
  "description": "How far the map is tilted, in degrees from looking straight down.\n`connectMap` keeps it current, and the 3D button is pressed while it is\nabove `0`.",
99094
100048
  "attribute": "pitch"
99095
100049
  },
100050
+ {
100051
+ "kind": "field",
100052
+ "name": "roleLabel",
100053
+ "type": {
100054
+ "text": "string"
100055
+ },
100056
+ "default": "'map'",
100057
+ "description": "What a screen reader calls the map in place of its role, after its\nname: \"Edinburgh, map\". Said only where the map has a name of its\nown, since the fallback name is the same word. Empty leaves the role.",
100058
+ "attribute": "role-label",
100059
+ "helix": {
100060
+ "words": true
100061
+ }
100062
+ },
99096
100063
  {
99097
100064
  "kind": "field",
99098
100065
  "name": "rotateLeftLabel",
@@ -101188,6 +102155,15 @@
101188
102155
  "description": "How far the map is tilted, in degrees from looking straight down.\n`connectMap` keeps it current, and the 3D button is pressed while it is\nabove `0`.",
101189
102156
  "fieldName": "pitch"
101190
102157
  },
102158
+ {
102159
+ "name": "role-label",
102160
+ "type": {
102161
+ "text": "string"
102162
+ },
102163
+ "default": "'map'",
102164
+ "description": "What a screen reader calls the map in place of its role, after its\nname: \"Edinburgh, map\". Said only where the map has a name of its\nown, since the fallback name is the same word. Empty leaves the role.",
102165
+ "fieldName": "roleLabel"
102166
+ },
101191
102167
  {
101192
102168
  "name": "rotate-left-label",
101193
102169
  "type": {
@@ -102918,7 +103894,7 @@
102918
103894
  "declarations": [
102919
103895
  {
102920
103896
  "kind": "class",
102921
- "description": "A disclosure: a button that shows and hides a region of your own links. It\ndoes not use `role=\"menu\"` or `menuitem`, which are for application commands.\nThose roles take over the arrow keys, announce \"menu\" to someone looking for\nnavigation, and put every link inside a role that is not a link. As a\ndisclosure, middle clicks, modified clicks, and the status bar keep working.\nUse `Menu` for a row of commands.\n\nIt renders no links. A router renders its own anchors and cannot render them\ninside this shadow root, so the panel is a slot for the lists and headings\nyou write.\n\nIt opens on hover by default, and a press always opens it too. `open-on` sets\nwhich. Hover is the default because in a navigation bar people expect to move\nalong the row and see each section.\n\nWhen one panel opens in place of another, each says which way the reader\nmoved, as Radix's `data-motion` does. Moving toward the end of the bar, the\none opening is `:state(from-end)` and the one closing is `:state(to-start)`;\nmoving back, they are `:state(from-start)` and `:state(to-end)`. A\nstylesheet slides them on that. Start and end follow the reading direction,\nso on a right-to-left page the end is on the left. A panel that opens or\ncloses on its own carries none of the four. A press on another megamenu's\ntrigger hands over the same way as hovering it.\n\nWhile a panel is open its surface carries its own size, as\n`--megamenu-surface-inline-size` and `--megamenu-surface-block-size`, and a\npanel that took over from another also carries that one's size, as\n`--megamenu-from-inline-size` and `--megamenu-from-block-size`. Radix's\nnavigation menu publishes the same pair from its shared viewport, so a\nstylesheet can grow or shrink one panel into the next.\n\nThe panel's default slot is the `columns` part and draws no box, so a sheet\ncan give the columns one of their own. While a panel is open, an\n`indicator` slot is rendered beside its trigger, as Radix's indicator\nmarks the open one: slot a mark of your own, such as a bar or an arrow\npointing at the panel, and it shows only while the panel is open. The styled\ntier rests it on the trigger's bottom edge.\n\nLeft and Right Arrow move between the triggers of the megamenus beside this\none, and Home and End go to the first and the last, as Radix's navigation\nmenu does. In a `Navigation`, which holds them in a slot, the arrows are the\nnavigation's, and move between its destinations under its `arrows`. Down Arrow on the trigger of an open panel moves\nfocus to the panel's first link, Escape closes the panel and returns focus\nto its trigger, and Tab moves through the panel's links and closes it on the\nway out. The trigger says `aria-expanded`, and the panel is a group named by\n`label`.",
103897
+ "description": "A disclosure: a button that shows and hides a region of your own links. It\ndoes not use `role=\"menu\"` or `menuitem`, which are for application commands.\nThose roles take over the arrow keys, announce \"menu\" to someone looking for\nnavigation, and put every link inside a role that is not a link. As a\ndisclosure, middle clicks, modified clicks, and the status bar keep working.\nUse `Menu` for a row of commands.\n\nIt renders no links. A router renders its own anchors and cannot render them\ninside this shadow root, so the panel is a slot for the lists and headings\nyou write.\n\nIt opens on hover by default, and a press always opens it too. `open-on` sets\nwhich. Hover is the default because in a navigation bar people expect to move\nalong the row and see each section. A pointer resting on the trigger opens\nthe panel after `open-delay`, and leaving closes it after `close-delay`. Moving\nfrom one open panel's trigger to another's opens the next at once, as Radix's\n`skipDelayDuration` does.\n\nWhen one panel opens in place of another, each says which way the reader\nmoved, as Radix's `data-motion` does. Moving toward the end of the bar, the\none opening is `:state(from-end)` and the one closing is `:state(to-start)`;\nmoving back, they are `:state(from-start)` and `:state(to-end)`. A\nstylesheet slides them on that. Start and end follow the reading direction,\nso on a right-to-left page the end is on the left. A panel that opens or\ncloses on its own carries none of the four. A press on another megamenu's\ntrigger hands over the same way as hovering it.\n\nWhile a panel is open its surface carries its own size, as\n`--megamenu-surface-inline-size` and `--megamenu-surface-block-size`, and a\npanel that took over from another also carries that one's size, as\n`--megamenu-from-inline-size` and `--megamenu-from-block-size`. Radix's\nnavigation menu publishes the same pair from its shared viewport, so a\nstylesheet can grow or shrink one panel into the next.\n\nWhile a link in the panel carries `aria-current=\"page\"`, the host has\n`:state(current)`, so the trigger of the section holding the page you are\non can say so, as Radix's navigation menu marks its active link.\n\nThe panel's default slot is the `columns` part and draws no box, so a sheet\ncan give the columns one of their own. While a panel is open, an\n`indicator` slot is rendered beside its trigger, as Radix's indicator\nmarks the open one: slot a mark of your own, such as a bar or an arrow\npointing at the panel, and it shows only while the panel is open. The styled\ntier rests it on the trigger's bottom edge.\n\nLeft and Right Arrow move between the triggers of the megamenus beside this\none, and Home and End go to the first and the last, as Radix's navigation\nmenu does. In a `Navigation`, which holds them in a slot, the arrows are the\nnavigation's, and move between its destinations under its `arrows`. Down Arrow on the trigger of an open panel moves\nfocus to the panel's first link, Escape closes the panel and returns focus\nto its trigger, and Tab moves through the panel's links and closes it on the\nway out. The trigger says `aria-expanded`, and the panel is a group named by\n`label`.\n\nA Helix trigger, such as `helix-button`, is told whether the panel is open\ninside its own shadow root. On a plain element, such as a `<button>`, the\nmegamenu writes `aria-expanded`, from a frame after its own first render, so\na server's markup is never changed while a framework hydrates it. It never\nwrites it where you wrote `aria-expanded` yourself.",
102922
103898
  "name": "HelixHeadlessMegamenu",
102923
103899
  "cssProperties": [
102924
103900
  {
@@ -102994,6 +103970,16 @@
102994
103970
  "description": "The page width, in pixels, below which a card panel is shown as a band. At\nzero, it never is.\n\nA card is a panel hung off one word, and there is no room to hang anything\noff a word on a phone: the columns do not shrink past\n`--megamenu-column-size`, so four of them stay four of them and the panel\nruns off the side of the screen rather than reflowing. Below this it takes\nthe whole width and its columns stack, which is the only arrangement that\nfits.\n\n**In script rather than a media query, and only once.** Whether the panel is\na band is not a question of paint: a band is not placed against the trigger,\nso the controller has to be told not to measure, and that decision is here\nwhatever the stylesheet says. Writing the width in both places would be one\nnumber in two languages, drifting the first time either moved. This records\n`:state(narrow)` on the host and the stylesheet arranges itself off that.\n\n**A custom state and never `data-narrow`, which is what it was.** The width\nis read in `connectedCallback`, so on a phone this is true on the very first\nupdate: an attribute written there is markup a consumer's server never sent,\nwhich React reports as a mismatch and answers by rebuilding the subtree. The\nnarrow exception the server specs describe covers a mirror that can only\nbecome true long after hydration, and a viewport measured before the first\npaint is the opposite case. See `MixinControllerOpen` on `open`.",
102995
103971
  "attribute": "band-below"
102996
103972
  },
103973
+ {
103974
+ "kind": "field",
103975
+ "name": "closeDelay",
103976
+ "type": {
103977
+ "text": "number"
103978
+ },
103979
+ "default": "220",
103980
+ "description": "How long a pointer leaving the trigger and the panel waits before the panel\ncloses, in milliseconds. The pointer needs the time to cross from the\ntrigger to the panel.",
103981
+ "attribute": "close-delay"
103982
+ },
102997
103983
  {
102998
103984
  "kind": "field",
102999
103985
  "name": "label",
@@ -103004,6 +103990,16 @@
103004
103990
  "description": "The section's name, used for the default trigger and the panel.",
103005
103991
  "attribute": "label"
103006
103992
  },
103993
+ {
103994
+ "kind": "field",
103995
+ "name": "openDelay",
103996
+ "type": {
103997
+ "text": "number"
103998
+ },
103999
+ "default": "120",
104000
+ "description": "How long a pointer rests on the trigger before the panel opens, in\nmilliseconds, under `open-on=\"hover\"`. A pointer crossing the bar on its\nway somewhere else opens nothing.",
104001
+ "attribute": "open-delay"
104002
+ },
103007
104003
  {
103008
104004
  "kind": "field",
103009
104005
  "name": "openOn",
@@ -103014,6 +104010,16 @@
103014
104010
  "description": "Whether hovering over the trigger opens the panel (`hover`), or only a press\ndoes (`click`).\n\nA press always works. This says whether a mouse also opens it by resting on\nthe trigger, and it is the default because that is what a navigation bar\ndoes. `click` is for a trigger that does something else as well, or a panel\nheavy enough that opening it on the way past is rude.",
103015
104011
  "attribute": "open-on"
103016
104012
  },
104013
+ {
104014
+ "kind": "field",
104015
+ "name": "placement",
104016
+ "type": {
104017
+ "text": "'bottom' | 'bottom-end' | 'bottom-start' | 'left' | 'left-end' | 'left-start' | 'right' | 'right-end' | 'right-start' | 'top' | 'top-end' | 'top-start'"
104018
+ },
104019
+ "default": "'bottom-start'",
104020
+ "description": "The side of the trigger a card panel opens on, when there is room. It\nmoves if that side does not fit. A band ignores it, since a band spans the\npage under its bar.",
104021
+ "attribute": "placement"
104022
+ },
103017
104023
  {
103018
104024
  "kind": "field",
103019
104025
  "name": "variant",
@@ -103072,7 +104078,7 @@
103072
104078
  "name": "panel",
103073
104079
  "privacy": "protected",
103074
104080
  "readonly": true,
103075
- "default": "new PopoverController(this, { anchor: () => this.trigger, /* The host, not the panel. A press on the trigger is a press on this element, and counting it as outside would close the panel on the way to the click that toggles it. `Menu` says the same about its own. Every other megamenu too: a press on one of them opens it, and opening it closes this one with a direction. */ boundary: () => [...HelixHeadlessMegamenu.bar.connected], onDismiss: () => this.close(), open: () => this.open, place: () => !this.banded, placement: () => 'bottom-start', surface: () => this.partNamed('surface'), })"
104081
+ "default": "new PopoverController(this, { anchor: () => this.trigger, /* The host, not the panel. A press on the trigger is a press on this element, and counting it as outside would close the panel on the way to the click that toggles it. `Menu` says the same about its own. Every other megamenu too: a press on one of them opens it, and opening it closes this one with a direction. */ boundary: () => [...HelixHeadlessMegamenu.bar.connected], onDismiss: () => this.close(), open: () => this.open, place: () => !this.banded, placement: () => this.placement, surface: () => this.partNamed('surface'), })"
103076
104082
  },
103077
104083
  {
103078
104084
  "kind": "method",
@@ -103083,7 +104089,26 @@
103083
104089
  "text": "void"
103084
104090
  }
103085
104091
  },
103086
- "description": "Tells a slotted trigger the disclosure state, by property. See `tellDisclosure`."
104092
+ "description": "Tells a slotted trigger the disclosure state.\n\nA Helix trigger by property, through `tellDisclosure`. A plain element,\nwhich has no shadow root to keep the state out of the markup, by\n`aria-expanded`, from a frame after the first render, as `Popover` writes\nit. One that already carries `aria-expanded` is the consumer's to keep."
104093
+ },
104094
+ {
104095
+ "kind": "field",
104096
+ "name": "settledOnce",
104097
+ "type": {
104098
+ "text": "boolean"
104099
+ },
104100
+ "privacy": "private",
104101
+ "default": "false",
104102
+ "description": "Whether a frame has passed since the first render, after which a plain trigger may be told."
104103
+ },
104104
+ {
104105
+ "kind": "field",
104106
+ "name": "told",
104107
+ "type": {
104108
+ "text": "Element | undefined"
104109
+ },
104110
+ "privacy": "private",
104111
+ "description": "The plain trigger this megamenu writes `aria-expanded` on."
103087
104112
  },
103088
104113
  {
103089
104114
  "kind": "field",
@@ -103120,6 +104145,26 @@
103120
104145
  "readonly": true,
103121
104146
  "description": "Down Arrow on the trigger of an open panel moves focus to the panel's first\nlink or control, as Radix's navigation menu does."
103122
104147
  },
104148
+ {
104149
+ "kind": "field",
104150
+ "name": "currentWatch",
104151
+ "type": {
104152
+ "text": "MutationObserver | undefined"
104153
+ },
104154
+ "privacy": "private",
104155
+ "description": "Watches the panel's links for the one that is the page you are on."
104156
+ },
104157
+ {
104158
+ "kind": "method",
104159
+ "name": "markCurrent",
104160
+ "privacy": "private",
104161
+ "return": {
104162
+ "type": {
104163
+ "text": "void"
104164
+ }
104165
+ },
104166
+ "description": "Records whether a link in the panel is the page you are on."
104167
+ },
103123
104168
  {
103124
104169
  "kind": "method",
103125
104170
  "name": "close",
@@ -103153,29 +104198,6 @@
103153
104198
  },
103154
104199
  "description": "The bottom edge of the bar this hangs from.\n\nThe trigger's own bottom is the obvious answer and is the wrong one: a\nheader is taller than the word inside it, so a band starting at the word\nstarts partway up the header, over its lower padding and its border.\nMeasured: trigger bottom 44, header bottom 57, thirteen pixels of header\nwith a band drawn across it.\n\n**The first ancestor as wide as the window, which is a fact and not a tag\nname.** A band spans the viewport, so what it should hang from is whatever\nelse does: that is what makes something a bar. Asking for `AppHeader` by\nname would make this element know about that one, which is the coupling\n`Menu` is careful not to have with `Drilldown`, and would leave a consumer\nwho wrote their own header with a band across it.\n\n`body` ends the walk. It is as wide as the window and is not a bar, and its\nbottom is the foot of the page: without the guard a megamenu on a plain page\nwould put its band down there. Nothing found means nothing to hang from, and\nthe trigger is the honest answer again."
103155
104200
  },
103156
- {
103157
- "kind": "field",
103158
- "name": "OPEN_DELAY",
103159
- "type": {
103160
- "text": "number"
103161
- },
103162
- "privacy": "private",
103163
- "static": true,
103164
- "readonly": true,
103165
- "default": "120",
103166
- "description": "How long a pointer has to mean it, in milliseconds.\n\nOpening is the shorter wait: too long and the panel feels stuck, too short\nand crossing the bar opens things. Closing is longer because the pointer\nhas to get from the trigger to the panel, and the straight line between\nthem is not the line anybody moves along."
103167
- },
103168
- {
103169
- "kind": "field",
103170
- "name": "CLOSE_DELAY",
103171
- "type": {
103172
- "text": "number"
103173
- },
103174
- "privacy": "private",
103175
- "static": true,
103176
- "readonly": true,
103177
- "default": "220"
103178
- },
103179
104201
  {
103180
104202
  "kind": "field",
103181
104203
  "name": "timer",
@@ -103841,6 +104863,15 @@
103841
104863
  "description": "The page width, in pixels, below which a card panel is shown as a band. At\nzero, it never is.\n\nA card is a panel hung off one word, and there is no room to hang anything\noff a word on a phone: the columns do not shrink past\n`--megamenu-column-size`, so four of them stay four of them and the panel\nruns off the side of the screen rather than reflowing. Below this it takes\nthe whole width and its columns stack, which is the only arrangement that\nfits.\n\n**In script rather than a media query, and only once.** Whether the panel is\na band is not a question of paint: a band is not placed against the trigger,\nso the controller has to be told not to measure, and that decision is here\nwhatever the stylesheet says. Writing the width in both places would be one\nnumber in two languages, drifting the first time either moved. This records\n`:state(narrow)` on the host and the stylesheet arranges itself off that.\n\n**A custom state and never `data-narrow`, which is what it was.** The width\nis read in `connectedCallback`, so on a phone this is true on the very first\nupdate: an attribute written there is markup a consumer's server never sent,\nwhich React reports as a mismatch and answers by rebuilding the subtree. The\nnarrow exception the server specs describe covers a mirror that can only\nbecome true long after hydration, and a viewport measured before the first\npaint is the opposite case. See `MixinControllerOpen` on `open`.",
103842
104864
  "fieldName": "bandBelow"
103843
104865
  },
104866
+ {
104867
+ "name": "close-delay",
104868
+ "type": {
104869
+ "text": "number"
104870
+ },
104871
+ "default": "220",
104872
+ "description": "How long a pointer leaving the trigger and the panel waits before the panel\ncloses, in milliseconds. The pointer needs the time to cross from the\ntrigger to the panel.",
104873
+ "fieldName": "closeDelay"
104874
+ },
103844
104875
  {
103845
104876
  "name": "label",
103846
104877
  "type": {
@@ -103850,6 +104881,15 @@
103850
104881
  "description": "The section's name, used for the default trigger and the panel.",
103851
104882
  "fieldName": "label"
103852
104883
  },
104884
+ {
104885
+ "name": "open-delay",
104886
+ "type": {
104887
+ "text": "number"
104888
+ },
104889
+ "default": "120",
104890
+ "description": "How long a pointer rests on the trigger before the panel opens, in\nmilliseconds, under `open-on=\"hover\"`. A pointer crossing the bar on its\nway somewhere else opens nothing.",
104891
+ "fieldName": "openDelay"
104892
+ },
103853
104893
  {
103854
104894
  "name": "open-on",
103855
104895
  "type": {
@@ -103859,6 +104899,15 @@
103859
104899
  "description": "Whether hovering over the trigger opens the panel (`hover`), or only a press\ndoes (`click`).\n\nA press always works. This says whether a mouse also opens it by resting on\nthe trigger, and it is the default because that is what a navigation bar\ndoes. `click` is for a trigger that does something else as well, or a panel\nheavy enough that opening it on the way past is rude.",
103860
104900
  "fieldName": "openOn"
103861
104901
  },
104902
+ {
104903
+ "name": "placement",
104904
+ "type": {
104905
+ "text": "'bottom' | 'bottom-end' | 'bottom-start' | 'left' | 'left-end' | 'left-start' | 'right' | 'right-end' | 'right-start' | 'top' | 'top-end' | 'top-start'"
104906
+ },
104907
+ "default": "'bottom-start'",
104908
+ "description": "The side of the trigger a card panel opens on, when there is room. It\nmoves if that side does not fit. A band ignores it, since a band spans the\npage under its bar.",
104909
+ "fieldName": "placement"
104910
+ },
103862
104911
  {
103863
104912
  "name": "variant",
103864
104913
  "type": {
@@ -103894,6 +104943,10 @@
103894
104943
  }
103895
104944
  ],
103896
104945
  "cssStates": [
104946
+ {
104947
+ "description": "A link in the panel carries `aria-current=\"page\"`, so the trigger can show the section you are in.",
104948
+ "name": "current"
104949
+ },
103897
104950
  {
103898
104951
  "description": "The panel opened in place of one earlier in the bar, so it can enter from the end side.",
103899
104952
  "name": "from-end"
@@ -104023,7 +105076,7 @@
104023
105076
  "declarations": [
104024
105077
  {
104025
105078
  "kind": "class",
104026
- "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\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.",
105079
+ "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.",
104027
105080
  "name": "HelixHeadlessMenuItem",
104028
105081
  "cssParts": [
104029
105082
  {
@@ -104057,6 +105110,10 @@
104057
105110
  {
104058
105111
  "description": "The leading column that holds the `start` slot. It is always rendered.",
104059
105112
  "name": "start"
105113
+ },
105114
+ {
105115
+ "description": "The panel a submenu opens in beside the row, under the menu's `submenus=\"flyout\"`.",
105116
+ "name": "surface"
104060
105117
  }
104061
105118
  ],
104062
105119
  "slots": [
@@ -104328,6 +105385,14 @@
104328
105385
  "text": "focusItem() => void"
104329
105386
  }
104330
105387
  },
105388
+ {
105389
+ "kind": "field",
105390
+ "name": "flyoutPanel",
105391
+ "privacy": "protected",
105392
+ "readonly": true,
105393
+ "default": "new PopoverController(this, { anchor: () => this.partNamed('item'), boundary: () => this, onDismiss: () => {}, open: () => this.flyout && this.expanded && this.onPage && this.submenu, placement: () => (isRtl(this) ? 'left-start' : 'right-start'), surface: () => (this.flyout ? this.partNamed('surface') : null), })",
105394
+ "description": "The panel a flyout submenu opens in, beside the row and in the top layer.\nThe menu around it says when, and answers a press outside and Escape, so\nits own dismissal does nothing."
105395
+ },
104331
105396
  {
104332
105397
  "kind": "method",
104333
105398
  "name": "select",
@@ -104878,6 +105943,14 @@
104878
105943
  "description": "The row is checked.",
104879
105944
  "name": "checked"
104880
105945
  },
105946
+ {
105947
+ "description": "Under `submenus=\"flyout\"`, a row in this row's submenu can be ticked or opens a submenu, so the submenu keeps its trailing column.",
105948
+ "name": "submenu-mark"
105949
+ },
105950
+ {
105951
+ "description": "Under `submenus=\"flyout\"`, a row in this row's submenu has content before its label, so the submenu keeps its leading column.",
105952
+ "name": "submenu-start"
105953
+ },
104881
105954
  {
104882
105955
  "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
104883
105956
  "name": "settled",
@@ -104938,7 +106011,7 @@
104938
106011
  "declarations": [
104939
106012
  {
104940
106013
  "kind": "class",
104941
- "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. A plain\n`<button>` can only be told by writing attributes onto your markup, which\nthe menu does not do, so give it `aria-haspopup=\"menu\"` and set its\n`aria-expanded` from the `toggle` event.\n\nSubmenus drill down. A submenu replaces the panel's content, and a back row\nreturns to the previous page. One panel avoids the diagonal pointer path that\nside-by-side panels need, stays inside a narrow window, and works on touch\nscreens, which have no hover.\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, and Escape closes the menu and returns focus to the\ntrigger. 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.",
106014
+ "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, and Escape closes the menu and returns focus to the\ntrigger. 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.",
104942
106015
  "name": "HelixHeadlessMenu",
104943
106016
  "cssProperties": [
104944
106017
  {
@@ -105043,6 +106116,116 @@
105043
106116
  "description": "Accessible name for the surface.\n\nEmpty by default, which names the surface by its trigger, so a menu opened\nfrom \"Actions\" is announced as \"Actions\". An `aria-label` or\n`aria-labelledby` on the host names it too, and wins over both.",
105044
106117
  "attribute": "label"
105045
106118
  },
106119
+ {
106120
+ "kind": "field",
106121
+ "name": "flies",
106122
+ "type": {
106123
+ "text": "boolean"
106124
+ },
106125
+ "privacy": "private",
106126
+ "description": "Whether submenus open beside their rows.",
106127
+ "readonly": true
106128
+ },
106129
+ {
106130
+ "kind": "field",
106131
+ "name": "topRows",
106132
+ "type": {
106133
+ "text": "HelixHeadlessMenuItem[]"
106134
+ },
106135
+ "privacy": "private",
106136
+ "description": "The rows of the top page, read through each section.",
106137
+ "readonly": true
106138
+ },
106139
+ {
106140
+ "kind": "method",
106141
+ "name": "rowsOf",
106142
+ "privacy": "private",
106143
+ "return": {
106144
+ "type": {
106145
+ "text": "HelixHeadlessMenuItem[]"
106146
+ }
106147
+ },
106148
+ "parameters": [
106149
+ {
106150
+ "name": "holder",
106151
+ "type": {
106152
+ "text": "HelixHeadlessMenuItem | null"
106153
+ }
106154
+ }
106155
+ ],
106156
+ "description": "The rows of a submenu, or of the top page for null."
106157
+ },
106158
+ {
106159
+ "kind": "method",
106160
+ "name": "holderOf",
106161
+ "privacy": "private",
106162
+ "return": {
106163
+ "type": {
106164
+ "text": "HelixHeadlessMenuItem | null"
106165
+ }
106166
+ },
106167
+ "parameters": [
106168
+ {
106169
+ "name": "row",
106170
+ "type": {
106171
+ "text": "HelixHeadlessMenuItem"
106172
+ }
106173
+ }
106174
+ ],
106175
+ "description": "The row whose submenu holds a row, or null for a row of the top page."
106176
+ },
106177
+ {
106178
+ "kind": "field",
106179
+ "name": "openPages",
106180
+ "type": {
106181
+ "text": "(HelixHeadlessMenuItem | null)[]"
106182
+ },
106183
+ "privacy": "private",
106184
+ "description": "The submenus open, from the top page down to the deepest.",
106185
+ "readonly": true
106186
+ },
106187
+ {
106188
+ "kind": "field",
106189
+ "name": "keyPage",
106190
+ "type": {
106191
+ "text": "HelixHeadlessMenuItem | null"
106192
+ },
106193
+ "privacy": "private",
106194
+ "description": "The submenu the keys move in under `flyout`: the one holding the row with\nfocus, or the deepest open one.",
106195
+ "readonly": true
106196
+ },
106197
+ {
106198
+ "kind": "method",
106199
+ "name": "openPage",
106200
+ "privacy": "private",
106201
+ "return": {
106202
+ "type": {
106203
+ "text": "void"
106204
+ }
106205
+ },
106206
+ "parameters": [
106207
+ {
106208
+ "name": "holder",
106209
+ "type": {
106210
+ "text": "HelixHeadlessMenuItem | null"
106211
+ }
106212
+ }
106213
+ ],
106214
+ "description": "Opens a submenu and closes the ones below it, or closes them all for null."
106215
+ },
106216
+ {
106217
+ "kind": "field",
106218
+ "name": "longPressLabel",
106219
+ "type": {
106220
+ "text": "string"
106221
+ },
106222
+ "default": "'Long press or press Alt+Down to show the menu'",
106223
+ "description": "The description a trigger gives under `open-on=\"long-press\"`, saying how\nto open the menu. Translate it with the rest of your interface.",
106224
+ "attribute": "long-press-label",
106225
+ "helix": {
106226
+ "words": true
106227
+ }
106228
+ },
105046
106229
  {
105047
106230
  "kind": "field",
105048
106231
  "name": "offset",
@@ -105053,6 +106236,43 @@
105053
106236
  "description": "Space between the trigger and the surface, in pixels.",
105054
106237
  "attribute": "offset"
105055
106238
  },
106239
+ {
106240
+ "kind": "field",
106241
+ "name": "pressHeld",
106242
+ "type": {
106243
+ "text": "boolean"
106244
+ },
106245
+ "privacy": "private",
106246
+ "description": "Whether the trigger opens the menu only on a held press.",
106247
+ "readonly": true
106248
+ },
106249
+ {
106250
+ "kind": "field",
106251
+ "name": "longPress",
106252
+ "privacy": "private",
106253
+ "readonly": true,
106254
+ "default": "new LongPress(this, { onLongPress: () => { if (this.context) { const at = this.heldAt if (at) { this.openContextAt(at) } return } if (!this.open) { this.show() } }, })",
106255
+ "description": "Watches the trigger for a held press: under `open-on=\"long-press\"`, and\nfor a touch or a pen on a context menu's area."
106256
+ },
106257
+ {
106258
+ "kind": "field",
106259
+ "name": "heldAt",
106260
+ "type": {
106261
+ "text": "{ x: number; y: number } | undefined"
106262
+ },
106263
+ "privacy": "private",
106264
+ "description": "Where a held press on a context menu's area is, to open the menu there."
106265
+ },
106266
+ {
106267
+ "kind": "field",
106268
+ "name": "openOn",
106269
+ "type": {
106270
+ "text": "'click' | 'long-press'"
106271
+ },
106272
+ "default": "'click'",
106273
+ "description": "What opens the menu from its trigger. `long-press` leaves a press to the\ntrigger's own action and opens the menu on a press held for half a second,\nor on Alt+Down or Alt+Up.",
106274
+ "attribute": "open-on"
106275
+ },
105056
106276
  {
105057
106277
  "kind": "field",
105058
106278
  "name": "placement",
@@ -105063,6 +106283,16 @@
105063
106283
  "description": "The side the menu opens on, when there is room.\n\nIt moves if that side does not fit.",
105064
106284
  "attribute": "placement"
105065
106285
  },
106286
+ {
106287
+ "kind": "field",
106288
+ "name": "submenus",
106289
+ "type": {
106290
+ "text": "'drill' | 'flyout'"
106291
+ },
106292
+ "default": "'drill'",
106293
+ "description": "How a submenu opens. `drill` shows it in place of the page showing, with\na way back. `flyout` opens it in a panel of its own beside its row.",
106294
+ "attribute": "submenus"
106295
+ },
105066
106296
  {
105067
106297
  "kind": "field",
105068
106298
  "name": "drilldown",
@@ -105123,6 +106353,25 @@
105123
106353
  },
105124
106354
  "description": "Tells a slotted trigger the disclosure state, by property.\n\nA control that opens a menu has to say so. By property rather than by\nattribute, which is the class note's rule about items applied one level up:\nan attribute written onto a consumer's element after it upgrades is a\nhydration mismatch waiting to happen."
105125
106355
  },
106356
+ {
106357
+ "kind": "field",
106358
+ "name": "settledOnce",
106359
+ "type": {
106360
+ "text": "boolean"
106361
+ },
106362
+ "privacy": "private",
106363
+ "default": "false",
106364
+ "description": "Whether a frame has passed since the first render, after which a plain trigger may be told."
106365
+ },
106366
+ {
106367
+ "kind": "field",
106368
+ "name": "told",
106369
+ "type": {
106370
+ "text": "Element | undefined"
106371
+ },
106372
+ "privacy": "private",
106373
+ "description": "The plain trigger this menu writes `aria-expanded` on."
106374
+ },
105126
106375
  {
105127
106376
  "kind": "field",
105128
106377
  "name": "trigger",
@@ -105195,6 +106444,25 @@
105195
106444
  "readonly": true,
105196
106445
  "description": "Opens a context menu where the reader asked for it: at the pointer, or at\nthe area's corner where the keyboard asked and the event has no position."
105197
106446
  },
106447
+ {
106448
+ "kind": "method",
106449
+ "name": "openContextAt",
106450
+ "privacy": "private",
106451
+ "return": {
106452
+ "type": {
106453
+ "text": "void"
106454
+ }
106455
+ },
106456
+ "parameters": [
106457
+ {
106458
+ "name": "point",
106459
+ "type": {
106460
+ "text": "{ x: number; y: number }"
106461
+ }
106462
+ }
106463
+ ],
106464
+ "description": "Opens a context menu at a point in the viewport, or moves an open one there."
106465
+ },
105198
106466
  {
105199
106467
  "kind": "method",
105200
106468
  "name": "enter",
@@ -105269,6 +106537,160 @@
105269
106537
  "privacy": "private",
105270
106538
  "readonly": true
105271
106539
  },
106540
+ {
106541
+ "kind": "method",
106542
+ "name": "fromTrigger",
106543
+ "privacy": "private",
106544
+ "return": {
106545
+ "type": {
106546
+ "text": "boolean"
106547
+ }
106548
+ },
106549
+ "parameters": [
106550
+ {
106551
+ "name": "event",
106552
+ "type": {
106553
+ "text": "Event"
106554
+ }
106555
+ }
106556
+ ],
106557
+ "description": "Whether an event came from the slotted trigger, or the area of a context menu."
106558
+ },
106559
+ {
106560
+ "kind": "field",
106561
+ "name": "handlePointerDown",
106562
+ "privacy": "private",
106563
+ "readonly": true,
106564
+ "description": "A press on the trigger starting: the start of a held one under\n`open-on=\"long-press\"`, or a touch or a pen held on a context menu's area."
106565
+ },
106566
+ {
106567
+ "kind": "field",
106568
+ "name": "handlePointerMove",
106569
+ "privacy": "private",
106570
+ "readonly": true
106571
+ },
106572
+ {
106573
+ "kind": "field",
106574
+ "name": "handlePointerUp",
106575
+ "privacy": "private",
106576
+ "readonly": true
106577
+ },
106578
+ {
106579
+ "kind": "field",
106580
+ "name": "handlePointerCancel",
106581
+ "privacy": "private",
106582
+ "readonly": true
106583
+ },
106584
+ {
106585
+ "kind": "field",
106586
+ "name": "handleHeldClick",
106587
+ "privacy": "private",
106588
+ "readonly": true,
106589
+ "description": "Takes the click a held press ends in, ahead of the trigger's own\nlisteners, so a press that opened the menu does not also do the trigger's\naction. In capture, on the host, which is above a slotted trigger."
106590
+ },
106591
+ {
106592
+ "kind": "field",
106593
+ "name": "described",
106594
+ "type": {
106595
+ "text": "Element | undefined"
106596
+ },
106597
+ "privacy": "private",
106598
+ "description": "The control the menu has described, so the description can be taken back."
106599
+ },
106600
+ {
106601
+ "kind": "method",
106602
+ "name": "describeTrigger",
106603
+ "privacy": "private",
106604
+ "return": {
106605
+ "type": {
106606
+ "text": "void"
106607
+ }
106608
+ },
106609
+ "parameters": [
106610
+ {
106611
+ "name": "light",
106612
+ "default": "false"
106613
+ }
106614
+ ],
106615
+ "description": "Describes the trigger by `long-press-label` under `open-on=\"long-press\"`,\nor takes it back, by the host, which carries the words as its label, as\n`SpeedDial` does. On the consumer's own element only once a reader has\nreached it, which is after hydration."
106616
+ },
106617
+ {
106618
+ "kind": "field",
106619
+ "name": "handleTriggerFocusIn",
106620
+ "privacy": "private",
106621
+ "readonly": true,
106622
+ "description": "A reader reaching the trigger, which is late enough to describe a plain one."
106623
+ },
106624
+ {
106625
+ "kind": "field",
106626
+ "name": "hovered",
106627
+ "type": {
106628
+ "text": "HelixHeadlessMenuItem | undefined"
106629
+ },
106630
+ "privacy": "private",
106631
+ "description": "The row the pointer last rested on, under `flyout`."
106632
+ },
106633
+ {
106634
+ "kind": "field",
106635
+ "name": "hoverTimer",
106636
+ "type": {
106637
+ "text": "ReturnType<typeof setTimeout> | undefined"
106638
+ },
106639
+ "privacy": "private",
106640
+ "description": "The wait before a rested-on row opens or closes a submenu."
106641
+ },
106642
+ {
106643
+ "kind": "field",
106644
+ "name": "grace",
106645
+ "type": {
106646
+ "text": "{ points: [number, number][]; until: number } | undefined"
106647
+ },
106648
+ "privacy": "private",
106649
+ "description": "The triangle from where the pointer left a row with an open submenu to the\nnear edge of that submenu, and until when it holds."
106650
+ },
106651
+ {
106652
+ "kind": "method",
106653
+ "name": "stopHover",
106654
+ "privacy": "private",
106655
+ "return": {
106656
+ "type": {
106657
+ "text": "void"
106658
+ }
106659
+ }
106660
+ },
106661
+ {
106662
+ "kind": "field",
106663
+ "name": "handleHover",
106664
+ "privacy": "private",
106665
+ "readonly": true,
106666
+ "description": "A mouse resting on a row, under `flyout`: focus follows it, and after a\nmoment the row's submenu opens, or the submenus below the row's own page\nclose. Not while the pointer is crossing toward an open submenu."
106667
+ },
106668
+ {
106669
+ "kind": "field",
106670
+ "name": "handleRowOut",
106671
+ "privacy": "private",
106672
+ "readonly": true,
106673
+ "description": "The pointer leaving a row whose submenu is open, which starts the grace area."
106674
+ },
106675
+ {
106676
+ "kind": "method",
106677
+ "name": "inGrace",
106678
+ "privacy": "private",
106679
+ "return": {
106680
+ "type": {
106681
+ "text": "boolean"
106682
+ }
106683
+ },
106684
+ "parameters": [
106685
+ {
106686
+ "name": "event",
106687
+ "type": {
106688
+ "text": "PointerEvent"
106689
+ }
106690
+ }
106691
+ ],
106692
+ "description": "Whether the pointer is inside the grace area, while it holds."
106693
+ },
105272
106694
  {
105273
106695
  "kind": "method",
105274
106696
  "name": "nameSurface",
@@ -106050,6 +107472,15 @@
106050
107472
  "description": "Accessible name for the surface.\n\nEmpty by default, which names the surface by its trigger, so a menu opened\nfrom \"Actions\" is announced as \"Actions\". An `aria-label` or\n`aria-labelledby` on the host names it too, and wins over both.",
106051
107473
  "fieldName": "label"
106052
107474
  },
107475
+ {
107476
+ "name": "long-press-label",
107477
+ "type": {
107478
+ "text": "string"
107479
+ },
107480
+ "default": "'Long press or press Alt+Down to show the menu'",
107481
+ "description": "The description a trigger gives under `open-on=\"long-press\"`, saying how\nto open the menu. Translate it with the rest of your interface.",
107482
+ "fieldName": "longPressLabel"
107483
+ },
106053
107484
  {
106054
107485
  "name": "offset",
106055
107486
  "type": {
@@ -106059,6 +107490,15 @@
106059
107490
  "description": "Space between the trigger and the surface, in pixels.",
106060
107491
  "fieldName": "offset"
106061
107492
  },
107493
+ {
107494
+ "name": "open-on",
107495
+ "type": {
107496
+ "text": "'click' | 'long-press'"
107497
+ },
107498
+ "default": "'click'",
107499
+ "description": "What opens the menu from its trigger. `long-press` leaves a press to the\ntrigger's own action and opens the menu on a press held for half a second,\nor on Alt+Down or Alt+Up.",
107500
+ "fieldName": "openOn"
107501
+ },
106062
107502
  {
106063
107503
  "name": "placement",
106064
107504
  "type": {
@@ -106068,6 +107508,15 @@
106068
107508
  "description": "The side the menu opens on, when there is room.\n\nIt moves if that side does not fit.",
106069
107509
  "fieldName": "placement"
106070
107510
  },
107511
+ {
107512
+ "name": "submenus",
107513
+ "type": {
107514
+ "text": "'drill' | 'flyout'"
107515
+ },
107516
+ "default": "'drill'",
107517
+ "description": "How a submenu opens. `drill` shows it in place of the page showing, with\na way back. `flyout` opens it in a panel of its own beside its row.",
107518
+ "fieldName": "submenus"
107519
+ },
106071
107520
  {
106072
107521
  "name": "empty-text",
106073
107522
  "type": {
@@ -110035,7 +111484,7 @@
110035
111484
  "declarations": [
110036
111485
  {
110037
111486
  "kind": "class",
110038
- "description": "Notifications are slotted children. Each one is your own markup, with an\navatar, a link, or a button in it. Feeds usually hold tens of items, so\nwriting them out lets an item hold anything.\n\nThe list does not virtualize. Windowing needs the list to own the data, and\nhere you own it, so N notifications are N elements. For a feed of thousands,\nuse a data table with a custom cell.\n\nRead state is reported to you. Marking read goes from the root to the item\nand from the item to you, so a canceled `helix-read` changes nothing, and if\nyou own `read`, nothing changes until you set it. `unread` is derived from\nthe items and written to an attribute, so a stylesheet and a badge can both\nuse it without counting.\n\n**The feed is one `Tab` stop for its rows.** Each row takes focus itself and\nis read by its label. `ArrowDown` and `ArrowUp` move to the next and the\nprevious row, `Home` and `End` to the first and the last, and `PageDown` and\n`PageUp` move a row on or back from anywhere inside one, as in the APG feed\npattern. The controls inside a row stay in the `Tab` order. Set `total` when\nthe feed holds one page of a longer list, and each row says its place in the\nwhole of it.\n\n**Keyboard.**\n\n| Key | What it does |\n|---|---|\n| Down, Up | On a row, moves to the next or the previous row. |\n| Home, End | On a row, moves to the first or the last row. |\n| Page Down, Page Up | From anywhere in a row, moves to the next or the previous row. |\n| Control+End | From anywhere in the feed, moves to the first control after it on the page. |\n| Control+Home | From anywhere in the feed, moves to the nearest control before it on the page. |\n| Tab | Moves through the controls in a row, and on out of the feed. |\n\n**`load-more` adds a button after the list** that sends `helix-load-more`,\nfor a feed that holds one page of a longer list. Append the next page, set\n`loading` while it is on its way, and take `load-more` off once there is\nnothing more. While the feed is loading the button stays, so focus stays on\nit, and it is `aria-disabled` and sends nothing.\n\n**`load-error` says a page could not be fetched**, such as \"Could not load\nnotifications\": it shows under the rows there are, in the `error` part, in\nplace of the empty and loading lines, and a screen reader hears it. Clear it\nwhen you ask again.",
111487
+ "description": "Notifications are slotted children. Each one is your own markup, with an\navatar, a link, or a button in it. Feeds usually hold tens of items, so\nwriting them out lets an item hold anything.\n\nThe list does not virtualize. Windowing needs the list to own the data, and\nhere you own it, so N notifications are N elements. For a feed of thousands,\nuse a data table with a custom cell.\n\nRead state is reported to you. Marking read goes from the root to the item\nand from the item to you, so a canceled `helix-read` changes nothing, and if\nyou own `read`, nothing changes until you set it. `unread` is derived from\nthe items and written to an attribute, so a stylesheet and a badge can both\nuse it without counting.\n\n**The feed is one `Tab` stop for its rows.** Each row takes focus itself and\nis read by its label. `ArrowDown` and `ArrowUp` move to the next and the\nprevious row, `Home` and `End` to the first and the last, and `PageDown` and\n`PageUp` move a row on or back from anywhere inside one, as in the APG feed\npattern. The controls inside a row stay in the `Tab` order. Set `total` when\nthe feed holds one page of a longer list, and each row says its place in the\nwhole of it.\n\n**Keyboard.**\n\n| Key | What it does |\n|---|---|\n| Down, Up | On a row, moves to the next or the previous row. |\n| Home, End | On a row, moves to the first or the last row. |\n| Page Down, Page Up | From anywhere in a row, moves to the next or the previous row. |\n| Control+End | From anywhere in the feed, moves to the first control after it on the page. |\n| Control+Home | From anywhere in the feed, moves to the nearest control before it on the page. |\n| Tab | Moves through the controls in a row, and on out of the feed. |\n\n**A notification that arrives says so.** Unread rows added above the rows\nthere were are counted in the live region,\n\"1 new notification\", in `arrived-label`. Rows that arrive while `loading`\nis set say nothing, so set it while a page is on its way.\n\n**`load-more` adds a button after the list** that sends `helix-load-more`,\nfor a feed that holds one page of a longer list. Append the next page, set\n`loading` while it is on its way, and take `load-more` off once there is\nnothing more. While the feed is loading the button stays, so focus stays on\nit, and it is `aria-disabled` and sends nothing.\n\n**`load-error` says a page could not be fetched**, such as \"Could not load\nnotifications\": it shows under the rows there are, in the `error` part, in\nplace of the empty and loading lines, and a screen reader hears it. Clear it\nwhen you ask again.",
110039
111488
  "name": "HelixHeadlessNotifications",
110040
111489
  "cssParts": [
110041
111490
  {
@@ -110126,6 +111575,19 @@
110126
111575
  "module": "src/mixins/mixin-collection/mixin-collection.ts"
110127
111576
  }
110128
111577
  },
111578
+ {
111579
+ "kind": "field",
111580
+ "name": "arrivedLabel",
111581
+ "type": {
111582
+ "text": "string"
111583
+ },
111584
+ "default": "'{count, plural, one {# new notification} other {# new notifications}}'",
111585
+ "description": "What the feed says when unread notifications arrive, with `{count}` the\nnumber of them. Empty it to say nothing.",
111586
+ "attribute": "arrived-label",
111587
+ "helix": {
111588
+ "words": true
111589
+ }
111590
+ },
110129
111591
  {
110130
111592
  "kind": "field",
110131
111593
  "name": "fallbackLabel",
@@ -110396,6 +111858,34 @@
110396
111858
  },
110397
111859
  "description": "Tells each row whether it is the stop, and where it sits in the feed.\n\nThrough each row's own properties, written once it has hydrated, so a\nserver's markup stays the server's: every row is a stop until this runs."
110398
111860
  },
111861
+ {
111862
+ "kind": "field",
111863
+ "name": "seen",
111864
+ "type": {
111865
+ "text": "WeakSet<Element> | undefined"
111866
+ },
111867
+ "privacy": "private",
111868
+ "description": "The rows the feed has met, so a row that arrives later is told apart."
111869
+ },
111870
+ {
111871
+ "kind": "field",
111872
+ "name": "hush",
111873
+ "privacy": "private",
111874
+ "readonly": true,
111875
+ "default": "new DelayController(this, { renders: false })",
111876
+ "description": "Empties the arrival a moment after it is said, so the next one is news."
111877
+ },
111878
+ {
111879
+ "kind": "method",
111880
+ "name": "noteArrivals",
111881
+ "privacy": "private",
111882
+ "return": {
111883
+ "type": {
111884
+ "text": "void"
111885
+ }
111886
+ },
111887
+ "description": "Counts the unread rows that arrived above the rows there were, and says\nhow many. Rows that fill an empty feed are a page, which says nothing. The rows there are at the first update are\nthe feed's to begin with, and say nothing."
111888
+ },
110399
111889
  {
110400
111890
  "kind": "method",
110401
111891
  "name": "renderStatus",
@@ -111010,6 +112500,15 @@
111010
112500
  }
111011
112501
  ],
111012
112502
  "attributes": [
112503
+ {
112504
+ "name": "arrived-label",
112505
+ "type": {
112506
+ "text": "string"
112507
+ },
112508
+ "default": "'{count, plural, one {# new notification} other {# new notifications}}'",
112509
+ "description": "What the feed says when unread notifications arrive, with `{count}` the\nnumber of them. Empty it to say nothing.",
112510
+ "fieldName": "arrivedLabel"
112511
+ },
111013
112512
  {
111014
112513
  "name": "fallback-label",
111015
112514
  "type": {
@@ -111317,7 +112816,7 @@
111317
112816
  "declarations": [
111318
112817
  {
111319
112818
  "kind": "class",
111320
- "description": "A separate family from `Input`'s `type=\"number\"`. It renders two buttons,\nbinds four keys `Input` does not, and handles clamping and stepping.\n\nThe field is `type=\"text\"` with `inputmode=\"decimal\"`. Tested in a real\nbrowser, `type=\"number\"` fails in three ways:\n- Typing `12e` gives a `.value` of `\"\"`, so the element cannot see what you\n typed. A `type=\"text\"` field keeps `\"12e\"`.\n- The mouse wheel over a focused field changes the value, for example from 5\n to 4, when you only meant to scroll the page.\n- `selectionStart` is `null`, so the caret cannot be managed.\n\n`inputmode=\"decimal\"` keeps the numeric keypad on phones.\n\n`format-options` shows the number with `Intl.NumberFormat` in `locale`, as a\ncurrency, a percent or a unit, while the field is not being edited. Focus\nshows the number itself, and a typed `$1,200` or `25%` is read back with the\nsame options. The value stays the plain number: `1200`, or `0.25` for 25%.\nThe locale's group separators are read in every field, so `1,234` is a\nnumber in `en-US`.\n\nOn iOS and iPadOS the field is a plain text field, with no\n`role=\"spinbutton\"`, which VoiceOver reads as a slider you cannot type in,\nand no role description, so VoiceOver says the field is required. React\nAria's NumberField does the same.\n\nValidity follows the platform's rules: `min`, `max`, and `step` are checked\nand reported through the host's own `setValidity`, under the platform's flag\nnames.\n\nStepping is separate from typing, so a number is not corrected while you type\nit.\n\n**Keyboard.** The field is one tab stop, and the stepper buttons are not in\nthe tab order.\n\n| Key | What it does |\n|---|---|\n| Up, Down | Steps the value up or down by `step`. |\n| Page Up, Page Down | Steps by `large-step` steps, ten by default. |\n| Home, End | Goes to `min` or `max`, where there is one. Without one, moves the caret. |\n| Enter | Commits the typed number and submits the form, as a native field does. |\n\nThe field has `role=\"spinbutton\"` with `aria-valuenow`, `aria-valuemin`,\n`aria-valuemax`, and the formatted text in `aria-valuetext`.",
112819
+ "description": "A separate family from `Input`'s `type=\"number\"`. It renders two buttons,\nbinds four keys `Input` does not, and handles clamping and stepping.\n\nThe field is `type=\"text\"` with `inputmode=\"decimal\"`. Tested in a real\nbrowser, `type=\"number\"` fails in three ways:\n- Typing `12e` gives a `.value` of `\"\"`, so the element cannot see what you\n typed. A `type=\"text\"` field keeps `\"12e\"`.\n- The mouse wheel over a focused field changes the value, for example from 5\n to 4, when you only meant to scroll the page.\n- `selectionStart` is `null`, so the caret cannot be managed.\n\n`inputmode=\"decimal\"` keeps the numeric keypad on phones.\n\n`format-options` shows the number with `Intl.NumberFormat` in `locale`, as a\ncurrency, a percent or a unit, while the field is not being edited. Focus\nshows the number itself, and a typed `$1,200` or `25%` is read back with the\nsame options. The value stays the plain number: `1200`, or `0.25` for 25%.\nThe locale's group separators are read in every field, so `1,234` is a\nnumber in `en-US`.\n\nThe field and its two buttons sit in a `role=\"group\"`, and the field carries\n`role-label`, \"number field\" in English, as its `aria-roledescription`, as\nReact Aria's NumberField does. On iOS and iPadOS the field is a plain text\nfield, with no `role=\"spinbutton\"`, which VoiceOver reads as a slider you\ncannot type in, and no role description, so VoiceOver says the field is\nrequired. React Aria's NumberField does the same.\n\nValidity follows the platform's rules: `min`, `max`, and `step` are checked\nand reported through the host's own `setValidity`, under the platform's flag\nnames.\n\nStepping is separate from typing, so a number is not corrected while you type\nit. While you type, the form holds the number the text reads as, so a field\nshowing `$2,500.50` gives the form 2500.5, and text that is not a number\ngives it nothing, as a native number field does.\n\nHolding a stepper button down steps once, then again after 400 milliseconds,\nthen every 60 milliseconds until you let go, as React Aria's NumberField does.\n\n**Keyboard.** The field is one tab stop, and the stepper buttons are not in\nthe tab order.\n\n| Key | What it does |\n|---|---|\n| Up, Down | Steps the value up or down by `step`. |\n| Page Up, Page Down | Steps by `large-step` steps, ten by default. |\n| Home, End | Goes to `min` or `max`, where there is one. Without one, moves the caret. |\n| Enter | Commits the typed number and submits the form, as a native field does. |\n\nThe field has `role=\"spinbutton\"` with `aria-valuenow`, `aria-valuemin`,\n`aria-valuemax`, and the formatted text in `aria-valuetext`.",
111321
112820
  "name": "HelixHeadlessNumberInput",
111322
112821
  "cssParts": [
111323
112822
  {
@@ -111337,7 +112836,7 @@
111337
112836
  "name": "feedback"
111338
112837
  },
111339
112838
  {
111340
- "description": "The box that holds the whole control.",
112839
+ "description": "The box that holds the whole control, a `role=\"group\"` around the field and its buttons.",
111341
112840
  "name": "field"
111342
112841
  },
111343
112842
  {
@@ -111358,6 +112857,10 @@
111358
112857
  }
111359
112858
  ],
111360
112859
  "slots": [
112860
+ {
112861
+ "description": "Replaces the icon on the step down button.",
112862
+ "name": "decrement-icon"
112863
+ },
111361
112864
  {
111362
112865
  "description": "Content after the number, such as a unit.",
111363
112866
  "name": "end"
@@ -111370,6 +112873,10 @@
111370
112873
  "description": "Help under the control, for content richer than the `hint` text.",
111371
112874
  "name": "hint"
111372
112875
  },
112876
+ {
112877
+ "description": "Replaces the icon on the step up button.",
112878
+ "name": "increment-icon"
112879
+ },
111373
112880
  {
111374
112881
  "description": "The label, for content richer than the `label` text.",
111375
112882
  "name": "label"
@@ -111554,6 +113061,19 @@
111554
113061
  "attribute": "readonly",
111555
113062
  "reflects": true
111556
113063
  },
113064
+ {
113065
+ "kind": "field",
113066
+ "name": "roleLabel",
113067
+ "type": {
113068
+ "text": "string"
113069
+ },
113070
+ "default": "'number field'",
113071
+ "description": "The words screen readers announce for the field's role, set as its\n`aria-roledescription`. Translate it with the rest of your text, or empty\nit to leave the role as `spinbutton`.\n\nNever written on iOS and iPadOS, where a role description stops VoiceOver\nsaying that the field is required.",
113072
+ "attribute": "role-label",
113073
+ "helix": {
113074
+ "words": true
113075
+ }
113076
+ },
111557
113077
  {
111558
113078
  "kind": "field",
111559
113079
  "name": "scrub",
@@ -111828,6 +113348,45 @@
111828
113348
  "text": "stepDown(large = false) => void"
111829
113349
  }
111830
113350
  },
113351
+ {
113352
+ "kind": "field",
113353
+ "name": "repeat",
113354
+ "type": {
113355
+ "text": "ReturnType<typeof setTimeout> | undefined"
113356
+ },
113357
+ "privacy": "private",
113358
+ "description": "The timer of a held stepper button."
113359
+ },
113360
+ {
113361
+ "kind": "field",
113362
+ "name": "pressStepped",
113363
+ "type": {
113364
+ "text": "boolean"
113365
+ },
113366
+ "privacy": "private",
113367
+ "default": "false",
113368
+ "description": "Whether a pointer press stepped already, so the click that ends it does not step again."
113369
+ },
113370
+ {
113371
+ "kind": "field",
113372
+ "name": "handleStepperDown",
113373
+ "privacy": "private",
113374
+ "readonly": true,
113375
+ "description": "A stepper button pressed with a pointer steps at once, and again while it\nis held.\n\nCaptured, so letting go outside the button still ends the hold. A click\nwith no press before it, from a screen reader or a script, steps once in\n`handleStepperClick`."
113376
+ },
113377
+ {
113378
+ "kind": "field",
113379
+ "name": "stopRepeat",
113380
+ "privacy": "private",
113381
+ "readonly": true,
113382
+ "description": "Ends a hold. The click that follows a release arrives in the same task,\nso the press is forgotten after it."
113383
+ },
113384
+ {
113385
+ "kind": "field",
113386
+ "name": "handleStepperClick",
113387
+ "privacy": "private",
113388
+ "readonly": true
113389
+ },
111831
113390
  {
111832
113391
  "kind": "method",
111833
113392
  "name": "renderLabel",
@@ -111941,6 +113500,25 @@
111941
113500
  "readonly": true,
111942
113501
  "description": "The four keys a spinner answers, which `Input` does not bind.\n\n`Home` and `End` only where there is a bound to go to: without one they are\nthe text field's own keys and moving the caret to the start of the number is\nwhat a reader pressing them meant."
111943
113502
  },
113503
+ {
113504
+ "kind": "method",
113505
+ "name": "submitted",
113506
+ "privacy": "private",
113507
+ "return": {
113508
+ "type": {
113509
+ "text": "string"
113510
+ }
113511
+ },
113512
+ "parameters": [
113513
+ {
113514
+ "name": "parsed",
113515
+ "type": {
113516
+ "text": "number | null"
113517
+ }
113518
+ }
113519
+ ],
113520
+ "description": "What the form holds for the field: the number the text reads as.\n\nThe text as written where it is already a plain number, so a value of\n`0.50` is sent as written. A number written in the locale or the format,\n`$2,500.50` or `1.234,5`, is sent as the number, 2500.5 or 1234.5, so a\nform read while the field still has focus gets what a submit would. Text\nthat is not a number is sent as empty, as a native number field sends it.\nThe text itself is the state the browser restores."
113521
+ },
111944
113522
  {
111945
113523
  "kind": "method",
111946
113524
  "name": "sync",
@@ -112007,6 +113585,28 @@
112007
113585
  "readonly": true,
112008
113586
  "description": "Enter submits the form, as it does in a native text field.\n\nOn `keypress`, where the platform runs its own implicit submission, so a\nconsumer who prevents the `keydown` for Enter stops this too.\n\n**Settled first**, as blur settles it. The typed text is read as a number,\n`change` announces it, and the form value is written before the form is\nsubmitted, so a field showing `$2,500.50` submits 2500.5."
112009
113587
  },
113588
+ {
113589
+ "kind": "method",
113590
+ "name": "renderDecrementIcon",
113591
+ "privacy": "protected",
113592
+ "return": {
113593
+ "type": {
113594
+ "text": "TemplateResult"
113595
+ }
113596
+ },
113597
+ "description": "The step down button's icon, as the `decrement-icon` slot's fallback, so an\nicon of your own replaces it by being slotted, and a tier above by\noverriding this."
113598
+ },
113599
+ {
113600
+ "kind": "method",
113601
+ "name": "renderIncrementIcon",
113602
+ "privacy": "protected",
113603
+ "return": {
113604
+ "type": {
113605
+ "text": "TemplateResult"
113606
+ }
113607
+ },
113608
+ "description": "The step up button's icon, behind the same seam as `renderDecrementIcon`."
113609
+ },
112010
113610
  {
112011
113611
  "kind": "field",
112012
113612
  "name": "valueAsNumber",
@@ -112180,6 +113780,21 @@
112180
113780
  "module": "src/mixins/mixin-field/mixin-field.ts"
112181
113781
  }
112182
113782
  },
113783
+ {
113784
+ "kind": "field",
113785
+ "name": "namedBy",
113786
+ "type": {
113787
+ "text": "string | null"
113788
+ },
113789
+ "privacy": "protected",
113790
+ "default": "null",
113791
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
113792
+ "attribute": "aria-label",
113793
+ "inheritedFrom": {
113794
+ "name": "MixinField",
113795
+ "module": "src/mixins/mixin-field/mixin-field.ts"
113796
+ }
113797
+ },
112183
113798
  {
112184
113799
  "kind": "field",
112185
113800
  "name": "labeled",
@@ -113385,6 +115000,15 @@
113385
115000
  "description": "Prevents editing. The value is still submitted with the form.",
113386
115001
  "fieldName": "readOnly"
113387
115002
  },
115003
+ {
115004
+ "name": "role-label",
115005
+ "type": {
115006
+ "text": "string"
115007
+ },
115008
+ "default": "'number field'",
115009
+ "description": "The words screen readers announce for the field's role, set as its\n`aria-roledescription`. Translate it with the rest of your text, or empty\nit to leave the role as `spinbutton`.\n\nNever written on iOS and iPadOS, where a role description stops VoiceOver\nsaying that the field is required.",
115010
+ "fieldName": "roleLabel"
115011
+ },
113388
115012
  {
113389
115013
  "name": "scrub",
113390
115014
  "type": {
@@ -113460,6 +115084,8 @@
113460
115084
  "text": "string | null"
113461
115085
  },
113462
115086
  "default": "null",
115087
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
115088
+ "fieldName": "namedBy",
113463
115089
  "inheritedFrom": {
113464
115090
  "name": "MixinField",
113465
115091
  "module": "src/mixins/mixin-field/mixin-field.ts"
@@ -113656,7 +115282,7 @@
113656
115282
  "declarations": [
113657
115283
  {
113658
115284
  "kind": "class",
113659
- "description": "Object Inspector shows a structured value, such as an API response, a config,\nor a raw record, as a read-only tree with each entry's type visible.\n\nPass the object to `value`, or name a `<script type=\"application/json\">` by\nid with `for`, the same source `VirtualList` and the charts read. JSON text\nworks with server rendering and with React hydration, which skips object\nproperties. `value` wins when both are set.\n\n**Keyboard.** The tree is one tab stop, and focus moves from row to row.\n\n| Key | What it does |\n|---|---|\n| Down, Up | Moves to the next or the previous row. |\n| Right | Opens a closed branch, or moves into an open one. Left on a right-to-left page. |\n| Left | Closes an open branch, or moves to the parent. Right on a right-to-left page. |\n| Home, End | Moves to the first or the last row. |\n| Page Down, Page Up | Moves a box's height of rows, so the row at one edge lands at the other. |\n| Enter, Space | Opens or closes a branch. |\n| `*` | Opens every branch beside the active row. |\n| A letter or a word | Moves to the next row whose key starts with what you typed. |\n| Command+C, Control+C | Copies the active row, where no text is selected. |\n\nThe tree is a `treegrid`, as React Aria's Tree is: each entry is a `row` with\none cell, and carries its real level, position, and set size, including in a\nwindowed tree. Nothing in it is chosen, so no row carries `aria-selected`,\nand a focused row is not announced as selected.\n\nA reader opening or closing a branch sends `helix-before-open` or\n`helix-before-close`, which you can cancel, and then `toggle` with\n`newState` and `oldState`, as `<details>` does. The branch is the active\nrow, and `expanded` holds every open branch. `*` asks once for all the\nbranches it opens. A script writing `expanded` or `active` sends nothing.\n\n`active` is the active row's path, written the way a JSON Pointer writes it:\nthe empty string for the root and `/meta/tags/0` for an entry under it.\nMoving to another row sends `helix-before-activate`, which you can cancel,\nand then `helix-activate`, both with the path. Writing `active` moves there\nand opens the branches around it, and sends nothing. `expanded` holds the\nopen branches by path, and writing it opens those and closes the rest. A row\nthat closes around the active one hands it to the nearest open branch.\n\n`filter` narrows the tree to the entries whose key or value holds the text,\nignoring case, and the branches that lead to them, which it opens. A matched\nbranch keeps everything under it. Each matched row carries `row-match`, and\na screen reader hears how many entries matched from `results-label`.\n`filterable` adds a field that sets it: typing sends\n`helix-filter`, which you can cancel, and then `helix-filtered`, and Down\nmoves from the field to the tree.\n\nA new `value` keeps the branches a reader opened or closed, and the active\nrow, where the new value still has them. A branch the old value did not have\nopens to `default-depth`.\n\nThe copy button copies the active row, a branch as JSON and a string as its\ntext. So do Command+C and Control+C while the tree has focus and no text is\nselected. The button sits beside the tree, because assistive technology\ncannot reliably reach a button inside a tree item.\n\n`windowed` draws only the rows in view, for values with thousands of entries.\nThe box needs a height for windowing to work. The styled tier sets one, and\nin the headless tier you set it yourself.",
115285
+ "description": "Object Inspector shows a structured value, such as an API response, a config,\nor a raw record, as a read-only tree with each entry's type visible.\n\nPass the object to `value`, or name a `<script type=\"application/json\">` by\nid with `for`, the same source `VirtualList` and the charts read. JSON text\nworks with server rendering and with React hydration, which skips object\nproperties. `value` wins when both are set.\n\n**Keyboard.** The tree is one tab stop, and focus moves from row to row.\n\n| Key | What it does |\n|---|---|\n| Down, Up | Moves to the next or the previous row. |\n| Right | Opens a closed branch, or moves into an open one. Left on a right-to-left page. |\n| Left | Closes an open branch, or moves to the parent. Right on a right-to-left page. |\n| Home, End | Moves to the first or the last row. |\n| Page Down, Page Up | Moves a box's height of rows, so the row at one edge lands at the other. |\n| Enter, Space | Opens or closes a branch. |\n| `*` | Opens every branch beside the active row. |\n| A letter or a word | Moves to the next row whose key starts with what you typed. |\n| Command+C, Control+C | Copies the active row, where no text is selected. |\n\nThe tree is a `treegrid`, as React Aria's Tree is: each entry is a `row` with\none cell, and carries its real level, position, and set size, including in a\nwindowed tree. Nothing in it is chosen, so no row carries `aria-selected`,\nand a focused row is not announced as selected.\n\nA reader opening or closing a branch sends `helix-before-open` or\n`helix-before-close`, which you can cancel, and then `toggle` with\n`newState` and `oldState`, as `<details>` does. The branch is the active\nrow, and `expanded` holds every open branch. `*` asks once for all the\nbranches it opens. A script writing `expanded` or `active` sends nothing.\n\n`active` is the active row's path, written the way a JSON Pointer writes it:\nthe empty string for the root and `/meta/tags/0` for an entry under it.\nMoving to another row sends `helix-before-activate`, which you can cancel,\nand then `helix-activate`, both with the path. Writing `active` moves there\nand opens the branches around it, and sends nothing. `expanded` holds the\nopen branches by path, and writing it opens those and closes the rest. A row\nthat closes around the active one hands it to the nearest open branch.\n\n`filter` narrows the tree to the entries whose key or value holds the text,\nignoring case, and the branches that lead to them, which it opens. A matched\nbranch keeps everything under it. Each matched row carries `row-match`, and\na screen reader hears how many entries matched from `results-label`.\n`filterable` adds a field that sets it: typing sends\n`helix-filter`, which you can cancel, and then `helix-filtered`, and Down\nmoves from the field to the tree.\n\nA new `value` keeps the branches a reader opened or closed, and the active\nrow, where the new value still has them. A branch the old value did not have\nopens to `default-depth`.\n\nThe copy button copies the active row, a branch as JSON and a string as its\ntext. So do Command+C and Control+C while the tree has focus and no text is\nselected. The button sits beside the tree, because assistive technology\ncannot reliably reach a button inside a tree item.\n\n**Your own drawing of a value.** `renderValue` is a function from a value and\nits entry, its path, key, depth and type, to what Lit renders, such as a\nlink for a URL or a swatch for a color. Return `undefined` to draw the value\nas the inspector does. What you draw sits in the `value` part, after the\nkey. Filtering and copying still read the value itself.\n\n`windowed` draws only the rows in view, for values with thousands of entries.\nThe box needs a height for windowing to work. The styled tier sets one, and\nin the headless tier you set it yourself.",
113660
115286
  "name": "HelixHeadlessObjectInspector",
113661
115287
  "cssProperties": [
113662
115288
  {
@@ -113804,6 +115430,10 @@
113804
115430
  {
113805
115431
  "description": "The tree grid that holds the rows.",
113806
115432
  "name": "tree"
115433
+ },
115434
+ {
115435
+ "description": "What `renderValue` drew for an entry, in place of its own drawing.",
115436
+ "name": "value"
113807
115437
  }
113808
115438
  ],
113809
115439
  "members": [
@@ -113977,6 +115607,14 @@
113977
115607
  "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.",
113978
115608
  "attribute": "no-copy"
113979
115609
  },
115610
+ {
115611
+ "kind": "field",
115612
+ "name": "renderValue",
115613
+ "type": {
115614
+ "text": "ObjectInspectorRenderer | undefined"
115615
+ },
115616
+ "description": "Draws an entry's value your way, given the value and its entry. Set it as\na property.\n\nIt returns what Lit renders: a template from `html`, a string, or a DOM\nnode. `undefined` draws the value as the inspector does, so a function can\ndraw some entries and leave the rest, such as only the strings under\n`/links`."
115617
+ },
113980
115618
  {
113981
115619
  "kind": "field",
113982
115620
  "name": "resultLabel",
@@ -114493,7 +116131,7 @@
114493
116131
  },
114494
116132
  {
114495
116133
  "kind": "method",
114496
- "name": "renderValue",
116134
+ "name": "drawValue",
114497
116135
  "privacy": "private",
114498
116136
  "return": {
114499
116137
  "type": {
@@ -116084,7 +117722,7 @@
116084
117722
  },
116085
117723
  {
116086
117724
  "kind": "class",
116087
- "description": "Options are their own family, separate from Select, because an option belongs\nto a listbox and several controls contain one. `role=\"option\"` requires an\nowning `role=\"listbox\"`. A Select is a listbox with a trigger, a Combobox is\na listbox with a text input, and a command palette is a listbox in a dialog.\n`Radio` is a part of its group, because a radio has only one kind of owner.\n\nSelection works the way it does for a radio. Choosing an option dispatches an\nevent, the listbox decides whether the choice stands, and the listbox sets\n`selected`.\n\nFiltering belongs to the owner, which hides an option with `hidden`. What\ncounts as a match differs between a select and a command palette.\n\nAn option with `href` is a link: choosing it follows the link and selects\nnothing, as an entry in a command palette that goes to a page does.",
117725
+ "description": "Options are their own family, separate from Select, because an option belongs\nto a listbox and several controls contain one. `role=\"option\"` requires an\nowning `role=\"listbox\"`. A Select is a listbox with a trigger, a Combobox is\na listbox with a text input, and a command palette is a listbox in a dialog.\n`Radio` is a part of its group, because a radio has only one kind of owner.\n\nSelection works the way it does for a radio. Choosing an option dispatches an\nevent, the listbox decides whether the choice stands, and the listbox sets\n`selected`.\n\nFiltering belongs to the owner, which hides an option with `hidden`. What\ncounts as a match differs between a select and a command palette.\n\nAn option with `href` is a link: choosing it follows the link and selects\nnothing, as an entry in a command palette that goes to a page does.\n\nThe option's name is its label alone, as React Aria's `slot=\"label\"` makes\nit: what is in `start` and `end`, an avatar's initials or a shortcut, is\ndrawn and not read as part of the name. The description is read as the\noption's description. A name you give with `aria-label` or\n`aria-labelledby` wins over both.",
116088
117726
  "name": "HelixHeadlessOption",
116089
117727
  "cssParts": [
116090
117728
  {
@@ -116224,6 +117862,16 @@
116224
117862
  "description": "A shorter name for this choice, for where the row does not fit.\n\n`<option label>`'s own meaning: the text a chooser shows when it has less\nroom than the row does, which is what a select's closed trigger has. Empty\nmeans the row's own content, which is the common case and is why this is not\nsimply the accessible name.\n\n**An option with a label and nothing in it shows the label**, as\n`<option label>` does: written the platform's way, a select listed a row of\nnothing for every choice.",
116225
117863
  "attribute": "label"
116226
117864
  },
117865
+ {
117866
+ "kind": "field",
117867
+ "name": "opens",
117868
+ "type": {
117869
+ "text": "string"
117870
+ },
117871
+ "default": "''",
117872
+ "description": "The page of commands this option opens, by name, where choosing it would\notherwise run it.\n\nDeclared here and acted on by whatever owns the list, as `alternate` is.\n`Command` is the only owner that reads it: choosing the option shows the\ncommands slotted as `page:` and the name, such as `slot=\"page:theme\"`,\nand Backspace in an empty filter goes back. Empty is an option that opens\nnothing, which is nearly every option.",
117873
+ "attribute": "opens"
117874
+ },
116227
117875
  {
116228
117876
  "kind": "field",
116229
117877
  "name": "rel",
@@ -116314,6 +117962,31 @@
116314
117962
  "text": "select(modifiers?: LinkModifiers) => void"
116315
117963
  }
116316
117964
  },
117965
+ {
117966
+ "kind": "field",
117967
+ "name": "handlePointerEnter",
117968
+ "privacy": "private",
117969
+ "readonly": true,
117970
+ "description": "A hover from a mouse or a pen, which a touch does not make."
117971
+ },
117972
+ {
117973
+ "kind": "field",
117974
+ "name": "handlePointerLeave",
117975
+ "privacy": "private",
117976
+ "readonly": true
117977
+ },
117978
+ {
117979
+ "kind": "field",
117980
+ "name": "handlePointerDown",
117981
+ "privacy": "private",
117982
+ "readonly": true
117983
+ },
117984
+ {
117985
+ "kind": "field",
117986
+ "name": "handlePointerUp",
117987
+ "privacy": "private",
117988
+ "readonly": true
117989
+ },
116317
117990
  {
116318
117991
  "kind": "field",
116319
117992
  "name": "tier",
@@ -116736,6 +118409,15 @@
116736
118409
  "description": "A shorter name for this choice, for where the row does not fit.\n\n`<option label>`'s own meaning: the text a chooser shows when it has less\nroom than the row does, which is what a select's closed trigger has. Empty\nmeans the row's own content, which is the common case and is why this is not\nsimply the accessible name.\n\n**An option with a label and nothing in it shows the label**, as\n`<option label>` does: written the platform's way, a select listed a row of\nnothing for every choice.",
116737
118410
  "fieldName": "label"
116738
118411
  },
118412
+ {
118413
+ "name": "opens",
118414
+ "type": {
118415
+ "text": "string"
118416
+ },
118417
+ "default": "''",
118418
+ "description": "The page of commands this option opens, by name, where choosing it would\notherwise run it.\n\nDeclared here and acted on by whatever owns the list, as `alternate` is.\n`Command` is the only owner that reads it: choosing the option shows the\ncommands slotted as `page:` and the name, such as `slot=\"page:theme\"`,\nand Backspace in an empty filter goes back. Empty is an option that opens\nnothing, which is nearly every option.",
118419
+ "fieldName": "opens"
118420
+ },
116739
118421
  {
116740
118422
  "name": "rel",
116741
118423
  "type": {
@@ -116795,6 +118477,14 @@
116795
118477
  "description": "An icon is slotted into `indicator`.",
116796
118478
  "name": "has-indicator"
116797
118479
  },
118480
+ {
118481
+ "description": "While a mouse or a pen is over the option. A touch sets no hover, as React Aria's `data-hovered` does not.",
118482
+ "name": "hovered"
118483
+ },
118484
+ {
118485
+ "description": "While a pointer presses the option, from the press to the release.",
118486
+ "name": "pressed"
118487
+ },
116798
118488
  {
116799
118489
  "description": "While the option is chosen.",
116800
118490
  "name": "selected"
@@ -117356,7 +119046,7 @@
117356
119046
  "name": "heading"
117357
119047
  },
117358
119048
  {
117359
- "description": "The mark that moves to the section in view.",
119049
+ "description": "The mark that moves to the link of the section in view. It carries that link's place and size as `--indicator-x`, `--indicator-y`, `--indicator-inline-size` and `--indicator-block-size`, and `data-placed` once it has been placed, for a mark you draw and animate yourself.",
117360
119050
  "name": "indicator"
117361
119051
  },
117362
119052
  {
@@ -117372,6 +119062,10 @@
117372
119062
  {
117373
119063
  "description": "A heading above the links, such as \"On this page\". It names the navigation.",
117374
119064
  "name": "heading"
119065
+ },
119066
+ {
119067
+ "description": "A mark of your own, drawn inside the `indicator` part, where `--indicator-x`, `--indicator-y`, `--indicator-inline-size` and `--indicator-block-size` reach it.",
119068
+ "name": "indicator"
117375
119069
  }
117376
119070
  ],
117377
119071
  "members": [
@@ -117498,7 +119192,7 @@
117498
119192
  "text": "Element[]"
117499
119193
  },
117500
119194
  "privacy": "private",
117501
- "description": "The children that are the content, which is all of them but the heading.",
119195
+ "description": "The children that are the content, which is all of them but the heading and the mark.",
117502
119196
  "readonly": true
117503
119197
  },
117504
119198
  {
@@ -122043,6 +123737,21 @@
122043
123737
  "module": "src/mixins/mixin-field/mixin-field.ts"
122044
123738
  }
122045
123739
  },
123740
+ {
123741
+ "kind": "field",
123742
+ "name": "namedBy",
123743
+ "type": {
123744
+ "text": "string | null"
123745
+ },
123746
+ "privacy": "protected",
123747
+ "default": "null",
123748
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
123749
+ "attribute": "aria-label",
123750
+ "inheritedFrom": {
123751
+ "name": "MixinField",
123752
+ "module": "src/mixins/mixin-field/mixin-field.ts"
123753
+ }
123754
+ },
122046
123755
  {
122047
123756
  "kind": "field",
122048
123757
  "name": "labeled",
@@ -123297,6 +125006,8 @@
123297
125006
  "text": "string | null"
123298
125007
  },
123299
125008
  "default": "null",
125009
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
125010
+ "fieldName": "namedBy",
123300
125011
  "inheritedFrom": {
123301
125012
  "name": "MixinField",
123302
125013
  "module": "src/mixins/mixin-field/mixin-field.ts"
@@ -127259,6 +128970,21 @@
127259
128970
  "module": "src/mixins/mixin-field/mixin-field.ts"
127260
128971
  }
127261
128972
  },
128973
+ {
128974
+ "kind": "field",
128975
+ "name": "namedBy",
128976
+ "type": {
128977
+ "text": "string | null"
128978
+ },
128979
+ "privacy": "protected",
128980
+ "default": "null",
128981
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
128982
+ "attribute": "aria-label",
128983
+ "inheritedFrom": {
128984
+ "name": "MixinField",
128985
+ "module": "src/mixins/mixin-field/mixin-field.ts"
128986
+ }
128987
+ },
127262
128988
  {
127263
128989
  "kind": "field",
127264
128990
  "name": "labeled",
@@ -128434,6 +130160,8 @@
128434
130160
  "text": "string | null"
128435
130161
  },
128436
130162
  "default": "null",
130163
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
130164
+ "fieldName": "namedBy",
128437
130165
  "inheritedFrom": {
128438
130166
  "name": "MixinField",
128439
130167
  "module": "src/mixins/mixin-field/mixin-field.ts"
@@ -129955,6 +131683,21 @@
129955
131683
  "module": "src/mixins/mixin-field/mixin-field.ts"
129956
131684
  }
129957
131685
  },
131686
+ {
131687
+ "kind": "field",
131688
+ "name": "namedBy",
131689
+ "type": {
131690
+ "text": "string | null"
131691
+ },
131692
+ "privacy": "protected",
131693
+ "default": "null",
131694
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
131695
+ "attribute": "aria-label",
131696
+ "inheritedFrom": {
131697
+ "name": "MixinField",
131698
+ "module": "src/mixins/mixin-field/mixin-field.ts"
131699
+ }
131700
+ },
129958
131701
  {
129959
131702
  "kind": "field",
129960
131703
  "name": "labeled",
@@ -131207,6 +132950,8 @@
131207
132950
  "text": "string | null"
131208
132951
  },
131209
132952
  "default": "null",
132953
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
132954
+ "fieldName": "namedBy",
131210
132955
  "inheritedFrom": {
131211
132956
  "name": "MixinField",
131212
132957
  "module": "src/mixins/mixin-field/mixin-field.ts"
@@ -135233,6 +136978,21 @@
135233
136978
  "module": "src/mixins/mixin-field/mixin-field.ts"
135234
136979
  }
135235
136980
  },
136981
+ {
136982
+ "kind": "field",
136983
+ "name": "namedBy",
136984
+ "type": {
136985
+ "text": "string | null"
136986
+ },
136987
+ "privacy": "protected",
136988
+ "default": "null",
136989
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
136990
+ "attribute": "aria-label",
136991
+ "inheritedFrom": {
136992
+ "name": "MixinField",
136993
+ "module": "src/mixins/mixin-field/mixin-field.ts"
136994
+ }
136995
+ },
135236
136996
  {
135237
136997
  "kind": "field",
135238
136998
  "name": "labeled",
@@ -136521,6 +138281,8 @@
136521
138281
  "text": "string | null"
136522
138282
  },
136523
138283
  "default": "null",
138284
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
138285
+ "fieldName": "namedBy",
136524
138286
  "inheritedFrom": {
136525
138287
  "name": "MixinField",
136526
138288
  "module": "src/mixins/mixin-field/mixin-field.ts"
@@ -138589,6 +140351,21 @@
138589
140351
  "module": "src/mixins/mixin-field/mixin-field.ts"
138590
140352
  }
138591
140353
  },
140354
+ {
140355
+ "kind": "field",
140356
+ "name": "namedBy",
140357
+ "type": {
140358
+ "text": "string | null"
140359
+ },
140360
+ "privacy": "protected",
140361
+ "default": "null",
140362
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
140363
+ "attribute": "aria-label",
140364
+ "inheritedFrom": {
140365
+ "name": "MixinField",
140366
+ "module": "src/mixins/mixin-field/mixin-field.ts"
140367
+ }
140368
+ },
138592
140369
  {
138593
140370
  "kind": "field",
138594
140371
  "name": "labeled",
@@ -139921,6 +141698,8 @@
139921
141698
  "text": "string | null"
139922
141699
  },
139923
141700
  "default": "null",
141701
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
141702
+ "fieldName": "namedBy",
139924
141703
  "inheritedFrom": {
139925
141704
  "name": "MixinField",
139926
141705
  "module": "src/mixins/mixin-field/mixin-field.ts"
@@ -148080,6 +149859,21 @@
148080
149859
  "module": "src/mixins/mixin-field/mixin-field.ts"
148081
149860
  }
148082
149861
  },
149862
+ {
149863
+ "kind": "field",
149864
+ "name": "namedBy",
149865
+ "type": {
149866
+ "text": "string | null"
149867
+ },
149868
+ "privacy": "protected",
149869
+ "default": "null",
149870
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
149871
+ "attribute": "aria-label",
149872
+ "inheritedFrom": {
149873
+ "name": "MixinField",
149874
+ "module": "src/mixins/mixin-field/mixin-field.ts"
149875
+ }
149876
+ },
148083
149877
  {
148084
149878
  "kind": "field",
148085
149879
  "name": "labeled",
@@ -149270,6 +151064,8 @@
149270
151064
  "text": "string | null"
149271
151065
  },
149272
151066
  "default": "null",
151067
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
151068
+ "fieldName": "namedBy",
149273
151069
  "inheritedFrom": {
149274
151070
  "name": "MixinField",
149275
151071
  "module": "src/mixins/mixin-field/mixin-field.ts"
@@ -151251,7 +153047,7 @@
151251
153047
  "declarations": [
151252
153048
  {
151253
153049
  "kind": "class",
151254
- "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**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 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| 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\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.",
153050
+ "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**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 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| 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\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.",
151255
153051
  "name": "HelixHeadlessTable",
151256
153052
  "cssProperties": [
151257
153053
  {
@@ -151312,6 +153108,10 @@
151312
153108
  "description": "The text shown when there are no rows.",
151313
153109
  "name": "empty"
151314
153110
  },
153111
+ {
153112
+ "description": "The line shown after the rows while `error-text` is set, in place of the empty and loading text.",
153113
+ "name": "error"
153114
+ },
151315
153115
  {
151316
153116
  "description": "An empty box after the rows, in a `grid` table. Tab focuses it on its way out of the table, so the key leaves from the end.",
151317
153117
  "name": "grid-end"
@@ -151354,6 +153154,10 @@
151354
153154
  "description": "Content shown when there are no rows and none are loading, such as a picture and a link. Falls back to `empty-text`, which the live region still says.",
151355
153155
  "name": "empty"
151356
153156
  },
153157
+ {
153158
+ "description": "Content shown while `error-text` is set, such as a button that tries again. Falls back to `error-text`, which the live region still says.",
153159
+ "name": "error"
153160
+ },
151357
153161
  {
151358
153162
  "description": "Words that name the table, shown above it, such as a heading.",
151359
153163
  "name": "heading"
@@ -151474,6 +153278,16 @@
151474
153278
  "words": true
151475
153279
  }
151476
153280
  },
153281
+ {
153282
+ "kind": "field",
153283
+ "name": "errorText",
153284
+ "type": {
153285
+ "text": "string"
153286
+ },
153287
+ "default": "''",
153288
+ "description": "The text shown and announced when the rows could not load. Set it when a\nfetch fails, and clear it once you try again. Empty, the default, shows\nnothing.\n\nWhile it is set, a line after the rows shows it, or your own content in the\n`error` slot, in place of the empty and loading lines, and the live region\nsays it.",
153289
+ "attribute": "error-text"
153290
+ },
151477
153291
  {
151478
153292
  "kind": "field",
151479
153293
  "name": "fallbackLabel",
@@ -152900,6 +154714,15 @@
152900
154714
  "description": "What screen readers hear when a held row is dropped, in a `reorderable` table.",
152901
154715
  "fieldName": "droppedLabel"
152902
154716
  },
154717
+ {
154718
+ "name": "error-text",
154719
+ "type": {
154720
+ "text": "string"
154721
+ },
154722
+ "default": "''",
154723
+ "description": "The text shown and announced when the rows could not load. Set it when a\nfetch fails, and clear it once you try again. Empty, the default, shows\nnothing.\n\nWhile it is set, a line after the rows shows it, or your own content in the\n`error` slot, in place of the empty and loading lines, and the live region\nsays it.",
154724
+ "fieldName": "errorText"
154725
+ },
152903
154726
  {
152904
154727
  "name": "fallback-label",
152905
154728
  "type": {
@@ -153082,6 +154905,24 @@
153082
154905
  }
153083
154906
  }
153084
154907
  ],
154908
+ "cssStates": [
154909
+ {
154910
+ "description": "While there are no rows and none are loading.",
154911
+ "name": "empty"
154912
+ },
154913
+ {
154914
+ "description": "While `error-text` is set.",
154915
+ "name": "error"
154916
+ },
154917
+ {
154918
+ "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
154919
+ "name": "settled",
154920
+ "inheritedFrom": {
154921
+ "name": "HelixElement",
154922
+ "module": "src/helix-element/helix-element.ts"
154923
+ }
154924
+ }
154925
+ ],
153085
154926
  "mixins": [
153086
154927
  {
153087
154928
  "name": "MixinCollection",
@@ -153118,16 +154959,6 @@
153118
154959
  },
153119
154960
  "tagName": "helix-headless-table",
153120
154961
  "customElement": true,
153121
- "cssStates": [
153122
- {
153123
- "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
153124
- "name": "settled",
153125
- "inheritedFrom": {
153126
- "name": "HelixElement",
153127
- "module": "src/helix-element/helix-element.ts"
153128
- }
153129
- }
153130
- ],
153131
154962
  "modulePath": "src/table/root/table-root.ts",
153132
154963
  "definitionPath": "src/table/root/table-root.ts"
153133
154964
  }
@@ -158531,6 +160362,21 @@
158531
160362
  "module": "src/mixins/mixin-field/mixin-field.ts"
158532
160363
  }
158533
160364
  },
160365
+ {
160366
+ "kind": "field",
160367
+ "name": "namedBy",
160368
+ "type": {
160369
+ "text": "string | null"
160370
+ },
160371
+ "privacy": "protected",
160372
+ "default": "null",
160373
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
160374
+ "attribute": "aria-label",
160375
+ "inheritedFrom": {
160376
+ "name": "MixinField",
160377
+ "module": "src/mixins/mixin-field/mixin-field.ts"
160378
+ }
160379
+ },
158534
160380
  {
158535
160381
  "kind": "field",
158536
160382
  "name": "labeled",
@@ -159790,6 +161636,8 @@
159790
161636
  "text": "string | null"
159791
161637
  },
159792
161638
  "default": "null",
161639
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
161640
+ "fieldName": "namedBy",
159793
161641
  "inheritedFrom": {
159794
161642
  "name": "MixinField",
159795
161643
  "module": "src/mixins/mixin-field/mixin-field.ts"
@@ -159985,7 +161833,7 @@
159985
161833
  "declarations": [
159986
161834
  {
159987
161835
  "kind": "class",
159988
- "description": "The list is a `TimePicker`, which you can also use on its own, for example in\na settings pane. This element adds the field, the overlay, and the form\nassociation, the same arrangement Date Input has with `DatePicker` and Color\nInput has with `ColorPicker`.\n\nYou can type a time or pick one. The list offers times at a step, and the\nfield lets you enter any time, such as `09:07`.\n\nThe value is always `HH:mm` on a 24-hour clock, or `HH:mm:ss` with\n`seconds`, because that is what the form\nsubmits, what `min` and `max` compare against, and what sorts correctly as a\nstring. While idle, the field shows the time in the user's locale format.\nOnce the caret is in the field, it shows the value itself, because a\nformatted time such as `2:30 PM` cannot be typed back and `Intl` has no\nparser for it.\n\nTyping sends `input` on each keystroke and `change` when you leave the\nfield. The trigger and ArrowDown open the list, and so does a press into the\nfield; Tab into the field opens nothing. In the list, the arrow keys, typed digits and PageUp and PageDown\nmove through the times, and Enter, Space or a click chooses one and closes\nthe panel. With `variant=\"wheels\"` each wheel moves the time as you turn it,\nthe panel stays open, and Enter or Escape closes it.\n\nWith `segmented`, the field is a row of segments in place of the text: an\nhour, a minute, and AM or PM where the clock has them, each set with digits\nor the arrow keys. Alt+Down opens the list from a segment.",
161836
+ "description": "The list is a `TimePicker`, which you can also use on its own, for example in\na settings pane. This element adds the field, the overlay, and the form\nassociation, the same arrangement Date Input has with `DatePicker` and Color\nInput has with `ColorPicker`.\n\nYou can type a time or pick one. The list offers times at a step, and the\nfield lets you enter any time, such as `09:07`.\n\nThe value is always `HH:mm` on a 24-hour clock, or `HH:mm:ss` with\n`seconds`, because that is what the form\nsubmits, what `min` and `max` compare against, and what sorts correctly as a\nstring. While idle, the field shows the time in the user's locale format.\nOnce the caret is in the field, it shows the value itself, because a\nformatted time such as `2:30 PM` cannot be typed back and `Intl` has no\nparser for it.\n\nTyping sends `input` on each keystroke and `change` when you leave the\nfield. The trigger and ArrowDown open the list, and so does a press into the\nfield; Tab into the field opens nothing. In the list, the arrow keys, typed digits and PageUp and PageDown\nmove through the times, and Enter, Space or a click chooses one and closes\nthe panel. With `variant=\"wheels\"` each wheel moves the time as you turn it,\nthe panel stays open, and Enter or Escape closes it.\n\nWith `segmented`, the field is a row of segments in place of the text: an\nhour, a minute, and AM or PM where the clock has them, each set with digits\nor the arrow keys. Alt+Down opens the list from a segment.\n\nText that is not a time gives the form an empty value, as a native time\nfield does, and `value` keeps the text so it can be corrected.\n\n**Keyboard.** The field is one tab stop, or each segment is with\n`segmented`, and the trigger is one more.\n\n| Key | What it does |\n|---|---|\n| Down | In the text field, opens the list on the chosen time. |\n| Alt with Down | Opens the list, from the text field or a segment. |\n| Enter | In the text field, takes the typed time and submits the form, as a native field does. In the list, chooses the highlighted time. |\n| Escape | Closes the list and puts focus back in the field. |\n| Up, Down on a segment | Steps the segment by one, round from its last value to its first. |\n| Page Up, Page Down on a segment | Steps by a page: two hours, or fifteen minutes or seconds. |\n| Home, End on a segment | Goes to the segment's first or last value. |\n| Digits on a segment | Fill it, and move to the next once it can take no more. |\n| A letter on the half of the day | Picks the half whose name starts with it, such as A for AM. |\n| Backspace, Delete on a segment | Empty the segment. |\n| Left, Right on a segment | Move to the previous or the next segment, along the line of text. |\n\nIn the list, the keys are `TimePicker`'s.",
159989
161837
  "name": "HelixHeadlessTimeInput",
159990
161838
  "cssParts": [
159991
161839
  {
@@ -160076,6 +161924,14 @@
160076
161924
  "description": "The picker's own message, under the times, while the picker's `feedback` is set.",
160077
161925
  "name": "picker-feedback"
160078
161926
  },
161927
+ {
161928
+ "description": "The picker's hint, which Time Input never sets: help under the field is the field's own `hint`.",
161929
+ "name": "picker-hint"
161930
+ },
161931
+ {
161932
+ "description": "The picker's visible label, which Time Input never draws: the field's `label` names it.",
161933
+ "name": "picker-label"
161934
+ },
160079
161935
  {
160080
161936
  "description": "The listbox holding the times, in `list`.",
160081
161937
  "name": "picker-list"
@@ -160222,6 +162078,10 @@
160222
162078
  }
160223
162079
  ],
160224
162080
  "slots": [
162081
+ {
162082
+ "description": "Content after the time, before the trigger, such as a clear button.",
162083
+ "name": "end"
162084
+ },
160225
162085
  {
160226
162086
  "description": "The message that says what is wrong with the value.",
160227
162087
  "name": "feedback"
@@ -160242,6 +162102,10 @@
160242
162102
  "description": "Content in the panel above the times, such as a heading or a shortcut.",
160243
162103
  "name": "panel-header"
160244
162104
  },
162105
+ {
162106
+ "description": "Content before the time, such as an icon.",
162107
+ "name": "start"
162108
+ },
160245
162109
  {
160246
162110
  "description": "The icon on the field that shows a list opens.",
160247
162111
  "name": "trigger"
@@ -160682,7 +162546,7 @@
160682
162546
  "text": "readonly string[] | undefined"
160683
162547
  },
160684
162548
  "privacy": "protected",
160685
- "description": "Each time, where `mode` holds several, sent one entry each.",
162549
+ "description": "Each time, where `mode` holds several, sent one entry each.\n\nOne time that is text and no time, such as `2:45 P`, is sent as an empty\nentry, as a native time field sends a time it cannot read.",
160686
162550
  "readonly": true,
160687
162551
  "inheritedFrom": {
160688
162552
  "name": "MixinPickerField",
@@ -161998,6 +163862,21 @@
161998
163862
  "module": "src/mixins/mixin-field/mixin-field.ts"
161999
163863
  }
162000
163864
  },
163865
+ {
163866
+ "kind": "field",
163867
+ "name": "namedBy",
163868
+ "type": {
163869
+ "text": "string | null"
163870
+ },
163871
+ "privacy": "protected",
163872
+ "default": "null",
163873
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
163874
+ "attribute": "aria-label",
163875
+ "inheritedFrom": {
163876
+ "name": "MixinField",
163877
+ "module": "src/mixins/mixin-field/mixin-field.ts"
163878
+ }
163879
+ },
162001
163880
  {
162002
163881
  "kind": "field",
162003
163882
  "name": "labeled",
@@ -163490,6 +165369,8 @@
163490
165369
  "text": "string | null"
163491
165370
  },
163492
165371
  "default": "null",
165372
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
165373
+ "fieldName": "namedBy",
163493
165374
  "inheritedFrom": {
163494
165375
  "name": "MixinField",
163495
165376
  "module": "src/mixins/mixin-field/mixin-field.ts"
@@ -163709,7 +165590,7 @@
163709
165590
  "declarations": [
163710
165591
  {
163711
165592
  "kind": "class",
163712
- "description": "Shows the times at each `step` as a `Listbox`, which provides the keyboard\nbehavior, typeahead, scrolling into view, and announcements for a set of\noptions. `variant=\"wheels\"` shows a column each for the hour, the minute, and\nthe meridiem, and one for the second with `seconds`. Left and Right move\nbetween the wheels, and Tab does too.\n\n`hour-cycle` writes every time on a twelve or a twenty-four hour clock\nwhatever the locale, and `seconds` holds times to the second.\n\nThe step keeps the list usable. At the default of 15 minutes a day is 96\nrows, which people can scroll or type into. At 1 minute it is 1,440. Use the\nlist for the times your product offers, and Time Input for any time, the same\nway Date Input separates typing a date from picking one on the calendar.\n\nThe value is always `HH:mm` on a 24-hour clock, or `HH:mm:ss` with\n`seconds`. A form submits that shape,\n`min` and `max` compare against it, and it sorts as a string. Each row's text\nfollows the person's own conventions, from `Intl`.\n\nThe chosen row is marked in the served markup. The listbox gets the answer as\n`.value`, and Lit SSR serializes no property binding, so without more the 96\nserved rows would carry no mark until the listbox upgrades and runs `place`.\nEach option also gets `selected`, an attribute binding that does serialize,\nand `place` then writes the same answer from the same value. This is the same\n`selected` you write on `Option` elsewhere in Helix, and Date Picker marks\nits choice in markup for the same reason. The list and the wheels both do\nthis, because each wheel is also a listbox.",
165593
+ "description": "Shows the times at each `step` as a `Listbox`, which provides the keyboard\nbehavior, typeahead, scrolling into view, and announcements for a set of\noptions. `variant=\"wheels\"` shows a column each for the hour, the minute, and\nthe meridiem, and one for the second with `seconds`. Left and Right move\nbetween the wheels, and Tab does too.\n\n`hour-cycle` writes every time on a twelve or a twenty-four hour clock\nwhatever the locale, and `seconds` holds times to the second.\n\nThe step keeps the list usable. At the default of 15 minutes a day is 96\nrows, which people can scroll or type into. At 1 minute it is 1,440. Use the\nlist for the times your product offers, and Time Input for any time, the same\nway Date Input separates typing a date from picking one on the calendar.\n\nThe value is always `HH:mm` on a 24-hour clock, or `HH:mm:ss` with\n`seconds`. A form submits that shape,\n`min` and `max` compare against it, and it sorts as a string. Each row's text\nfollows the person's own conventions, from `Intl`.\n\nThe chosen row is marked in the served markup. The listbox gets the answer as\n`.value`, and Lit SSR serializes no property binding, so without more the 96\nserved rows would carry no mark until the listbox upgrades and runs `place`.\nEach option also gets `selected`, an attribute binding that does serialize,\nand `place` then writes the same answer from the same value. This is the same\n`selected` you write on `Option` elsewhere in Helix, and Date Picker marks\nits choice in markup for the same reason. The list and the wheels both do\nthis, because each wheel is also a listbox.\n\n**Keyboard.** The list is one tab stop, and each wheel is one.\n\n| Key | What it does |\n|---|---|\n| Down, Up | Moves to the next or the previous time, or in a wheel to the next or the previous hour, minute, second, or half of the day. |\n| Home, End | Moves to the first or the last time, or the first or the last in a wheel. |\n| Page Down, Page Up | Moves by as many times as the list shows at once. |\n| Digits | Moves to the next time that starts with what you typed, such as `9` for 9:00. |\n| Enter, Space | Chooses the highlighted time. Moving chooses too, except under `manual` or with a `mode`. With a `mode`, Space adds or removes the time. |\n| Right, Left | In the wheels, moves to the next or the previous wheel, mirrored right to left. |\n| Tab | Moves to the next wheel, then out of the picker. |\n\n**ARIA.** The list is a `listbox` named by `label`, a slotted label, the\nhost's `aria-label` or its `aria-labelledby`. A development build warns\nwhere all four are empty. The list is described by the hint, or by the\nmessage in `feedback` in its place, and carries `aria-multiselectable` with\na `mode` and `aria-invalid` while `feedback` says what is wrong. The wheels\nare a `group` with that name, holding one `listbox` per wheel, named \"Hour\",\n\"Minute\", \"Second\" and \"AM/PM\" in the page's language, and each described\nthe same way.",
163713
165594
  "name": "HelixHeadlessTimePicker",
163714
165595
  "cssParts": [
163715
165596
  {
@@ -163772,6 +165653,14 @@
163772
165653
  "description": "The message under the times, while `feedback` is set.",
163773
165654
  "name": "feedback"
163774
165655
  },
165656
+ {
165657
+ "description": "Help under the times, shown while there is no message in `feedback`.",
165658
+ "name": "hint"
165659
+ },
165660
+ {
165661
+ "description": "The visible label above the times, drawn while a label is slotted.",
165662
+ "name": "label"
165663
+ },
163775
165664
  {
163776
165665
  "description": "The listbox holding the times, in `list`.",
163777
165666
  "name": "list"
@@ -163857,6 +165746,20 @@
163857
165746
  "name": "option-text"
163858
165747
  }
163859
165748
  ],
165749
+ "slots": [
165750
+ {
165751
+ "description": "What the list shows when no time falls between `min` and `max`, for content richer than `empty-text`.",
165752
+ "name": "empty"
165753
+ },
165754
+ {
165755
+ "description": "Help under the times, for content richer than the `hint` text.",
165756
+ "name": "hint"
165757
+ },
165758
+ {
165759
+ "description": "A visible label above the times, which names the list, for content richer than the `label` text.",
165760
+ "name": "label"
165761
+ }
165762
+ ],
163860
165763
  "members": [
163861
165764
  {
163862
165765
  "kind": "field",
@@ -163891,6 +165794,29 @@
163891
165794
  "description": "Times that cannot be chosen, as `HH:mm`, separated by commas or spaces.\n\nThe counterpart to Date Picker's `disable-dates`, and it exists for the same\nshape of problem: `min` and `max` take away a span, and what a booking\nusually has to take away is a scatter. A morning with 09:30 and 11:00\nalready gone is not two bounds.\n\nA time not on the step is simply never offered, so it is not an error to\nname one, and naming every time in the list is how the empty state is\nreached honestly rather than by handing over an empty range.",
163892
165795
  "attribute": "disable-times"
163893
165796
  },
165797
+ {
165798
+ "kind": "field",
165799
+ "name": "emptyText",
165800
+ "type": {
165801
+ "text": "string"
165802
+ },
165803
+ "default": "'No times to choose from'",
165804
+ "description": "What the list says when no time falls between `min` and `max`.\n\nThe fallback of the `empty` slot.",
165805
+ "attribute": "empty-text",
165806
+ "helix": {
165807
+ "words": true
165808
+ }
165809
+ },
165810
+ {
165811
+ "kind": "field",
165812
+ "name": "hint",
165813
+ "type": {
165814
+ "text": "string"
165815
+ },
165816
+ "default": "''",
165817
+ "description": "Help under the times, such as the hours a shop is open, read by screen\nreaders as the list's description. A message in `feedback` replaces it.\n\nThe fallback of the `hint` slot.",
165818
+ "attribute": "hint"
165819
+ },
163894
165820
  {
163895
165821
  "kind": "field",
163896
165822
  "name": "hourCycle",
@@ -163916,7 +165842,7 @@
163916
165842
  "text": "string"
163917
165843
  },
163918
165844
  "default": "'Time'",
163919
- "description": "Accessible name for the list, which has no visible one of its own.\n\nAn `aria-label` or `aria-labelledby` on the host names the list instead.",
165845
+ "description": "Accessible name for the list, which has no visible one of its own.\n\nAn `aria-label` or `aria-labelledby` on the host names the list instead,\nand so does a label slotted into `label`, which is also drawn above it.",
163920
165846
  "attribute": "label",
163921
165847
  "helix": {
163922
165848
  "words": true
@@ -164467,6 +166393,75 @@
164467
166393
  "description": "The list's name: the host's `aria-labelledby` read out, then its\n`aria-label`, then `label`, through core's `hostWords`, which Select reads\nits list's name through too.\n\nRead out as words, because the list is inside two shadow roots and an id on\nthe page reaches neither. Measured before this: `<helix-time-picker\naria-label=\"Slot\">` was a listbox named \"Time\".",
164468
166394
  "readonly": true
164469
166395
  },
166396
+ {
166397
+ "kind": "field",
166398
+ "name": "hintSlotted",
166399
+ "type": {
166400
+ "text": "boolean"
166401
+ },
166402
+ "privacy": "private",
166403
+ "default": "false",
166404
+ "description": "Whether a hint is slotted, which draws the `hint` part around it."
166405
+ },
166406
+ {
166407
+ "kind": "field",
166408
+ "name": "hinted",
166409
+ "type": {
166410
+ "text": "boolean"
166411
+ },
166412
+ "privacy": "private",
166413
+ "description": "Whether the hint shows: there is one, and no message stands in its place.",
166414
+ "readonly": true
166415
+ },
166416
+ {
166417
+ "kind": "field",
166418
+ "name": "describedBy",
166419
+ "type": {
166420
+ "text": "string | typeof nothing"
166421
+ },
166422
+ "privacy": "private",
166423
+ "description": "The ids that describe each list: the hint, or the message in its place.",
166424
+ "readonly": true
166425
+ },
166426
+ {
166427
+ "kind": "method",
166428
+ "name": "renderHint",
166429
+ "privacy": "private",
166430
+ "return": {
166431
+ "type": {
166432
+ "text": "TemplateResult"
166433
+ }
166434
+ },
166435
+ "description": "The hint under the times, or a bare slot while there is none to show,\nhidden while a message stands in its place, so a slotted hint goes too."
166436
+ },
166437
+ {
166438
+ "kind": "field",
166439
+ "name": "labelSlotted",
166440
+ "type": {
166441
+ "text": "boolean"
166442
+ },
166443
+ "privacy": "private",
166444
+ "default": "false",
166445
+ "description": "Whether a label is slotted, which draws the `label` part around it."
166446
+ },
166447
+ {
166448
+ "kind": "field",
166449
+ "name": "handleLabelSlot",
166450
+ "privacy": "private",
166451
+ "readonly": true,
166452
+ "description": "Reads the `label` slot, and the list's name again with it."
166453
+ },
166454
+ {
166455
+ "kind": "method",
166456
+ "name": "renderSlottedLabel",
166457
+ "privacy": "private",
166458
+ "return": {
166459
+ "type": {
166460
+ "text": "TemplateResult"
166461
+ }
166462
+ },
166463
+ "description": "The slotted label, in the `label` part, above the times. A bare slot while\nnothing is slotted, which draws no box."
166464
+ },
164470
166465
  {
164471
166466
  "kind": "field",
164472
166467
  "name": "naming",
@@ -165588,6 +167583,24 @@
165588
167583
  "description": "Times that cannot be chosen, as `HH:mm`, separated by commas or spaces.\n\nThe counterpart to Date Picker's `disable-dates`, and it exists for the same\nshape of problem: `min` and `max` take away a span, and what a booking\nusually has to take away is a scatter. A morning with 09:30 and 11:00\nalready gone is not two bounds.\n\nA time not on the step is simply never offered, so it is not an error to\nname one, and naming every time in the list is how the empty state is\nreached honestly rather than by handing over an empty range.",
165589
167584
  "fieldName": "disableTimes"
165590
167585
  },
167586
+ {
167587
+ "name": "empty-text",
167588
+ "type": {
167589
+ "text": "string"
167590
+ },
167591
+ "default": "'No times to choose from'",
167592
+ "description": "What the list says when no time falls between `min` and `max`.\n\nThe fallback of the `empty` slot.",
167593
+ "fieldName": "emptyText"
167594
+ },
167595
+ {
167596
+ "name": "hint",
167597
+ "type": {
167598
+ "text": "string"
167599
+ },
167600
+ "default": "''",
167601
+ "description": "Help under the times, such as the hours a shop is open, read by screen\nreaders as the list's description. A message in `feedback` replaces it.\n\nThe fallback of the `hint` slot.",
167602
+ "fieldName": "hint"
167603
+ },
165591
167604
  {
165592
167605
  "name": "hour-cycle",
165593
167606
  "type": {
@@ -165610,7 +167623,7 @@
165610
167623
  "text": "string"
165611
167624
  },
165612
167625
  "default": "'Time'",
165613
- "description": "Accessible name for the list, which has no visible one of its own.\n\nAn `aria-label` or `aria-labelledby` on the host names the list instead.",
167626
+ "description": "Accessible name for the list, which has no visible one of its own.\n\nAn `aria-label` or `aria-labelledby` on the host names the list instead,\nand so does a label slotted into `label`, which is also drawn above it.",
165614
167627
  "fieldName": "label"
165615
167628
  },
165616
167629
  {
@@ -166468,7 +168481,7 @@
166468
168481
  "declarations": [
166469
168482
  {
166470
168483
  "kind": "class",
166471
- "description": "Given `datetime`, the label you write is wrapped in a `<time>` element, so a\nmachine-readable value such as \"2026-08-19\" travels with a label such as\n\"yesterday\". Without `datetime`, the label is a `<span>`.\n\nEach entry draws the connector line that arrives at it and hides it when it\nis the first entry, using `:host(:first-child)`. This needs no index, no\ncounting parent, and no script. `Steps` and `Breadcrumbs` work the same way.\n\n`tone` sets the kind of event and is the only thing that colors the mark. It\nuses the same values as `Announcement`.",
168484
+ "description": "Given `datetime`, the label you write is wrapped in a `<time>` element, so a\nmachine-readable value such as \"2026-08-19\" travels with a label such as\n\"yesterday\". Without `datetime`, the label is a `<span>`.\n\n**`relative` writes the time for you** as how long ago it was, such as \"3\nhours ago\", from `datetime`, where the `time` slot is empty. The words move\non as they go stale, \"3 hours ago\" becoming \"4 hours ago\", with one wakeup\nshared by every reading on the page, as `FormatDate` keeps its own. They are\nin the language of the page, or of the nearest `lang`.\n\nEach entry draws the connector line that arrives at it and hides it when it\nis the first entry, using `:host(:first-child)`. This needs no index, no\ncounting parent, and no script. `Steps` and `Breadcrumbs` work the same way.\n\n`tone` sets the kind of event and is the only thing that colors the mark. It\nuses the same values as `Announcement`.",
166472
168485
  "name": "HelixHeadlessTimelineItem",
166473
168486
  "cssParts": [
166474
168487
  {
@@ -166517,6 +168530,68 @@
166517
168530
  "description": "When it happened, in machine-readable form. Setting it wraps the time in a\n`<time>` element.\n\nWhatever `<time>` accepts, which is a date, a time, both, a duration or a\nweek. Unset, the label is written as it was given and nothing claims to\nknow what instant it names.",
166518
168531
  "attribute": "datetime"
166519
168532
  },
168533
+ {
168534
+ "kind": "field",
168535
+ "name": "relative",
168536
+ "type": {
168537
+ "text": "'long' | 'narrow' | 'short' | undefined"
168538
+ },
168539
+ "description": "Writes the time as how long ago it was, or how long until it, from\n`datetime`, where the `time` slot is empty: `long` (\"3 hours ago\"),\n`short` (\"3 hr. ago\") or `narrow` (\"3h ago\"). Set with no value, it is\n`long`. The words move on as they go stale.",
168540
+ "attribute": "relative"
168541
+ },
168542
+ {
168543
+ "kind": "field",
168544
+ "name": "clock",
168545
+ "privacy": "private",
168546
+ "readonly": true,
168547
+ "default": "new RelativeClockController(this, { expires: (now) => { const moment = this.moment return moment ? this.readingAt(moment, now).next : undefined }, })",
168548
+ "description": "The time the reading is drawn against, moved on when the words go stale."
168549
+ },
168550
+ {
168551
+ "kind": "field",
168552
+ "name": "reading",
168553
+ "type": {
168554
+ "text": "string"
168555
+ },
168556
+ "privacy": "private",
168557
+ "default": "''",
168558
+ "description": "What the `time` slot shows where nothing is slotted: the reading under\n`relative`, read against the clock before each render, and nothing\notherwise."
168559
+ },
168560
+ {
168561
+ "kind": "field",
168562
+ "name": "moment",
168563
+ "type": {
168564
+ "text": "Date | undefined"
168565
+ },
168566
+ "privacy": "private",
168567
+ "description": "The instant `datetime` names, where `relative` asks for a reading of it.",
168568
+ "readonly": true
168569
+ },
168570
+ {
168571
+ "kind": "method",
168572
+ "name": "readingAt",
168573
+ "privacy": "private",
168574
+ "return": {
168575
+ "type": {
168576
+ "text": "Relative"
168577
+ }
168578
+ },
168579
+ "parameters": [
168580
+ {
168581
+ "name": "moment",
168582
+ "type": {
168583
+ "text": "Date"
168584
+ }
168585
+ },
168586
+ {
168587
+ "name": "now",
168588
+ "type": {
168589
+ "text": "Date"
168590
+ }
168591
+ }
168592
+ ],
168593
+ "description": "What the reading says at `now`, and when it stops being true."
168594
+ },
166520
168595
  {
166521
168596
  "kind": "field",
166522
168597
  "name": "tone",
@@ -166888,6 +168963,14 @@
166888
168963
  "description": "When it happened, in machine-readable form. Setting it wraps the time in a\n`<time>` element.\n\nWhatever `<time>` accepts, which is a date, a time, both, a duration or a\nweek. Unset, the label is written as it was given and nothing claims to\nknow what instant it names.",
166889
168964
  "fieldName": "datetime"
166890
168965
  },
168966
+ {
168967
+ "name": "relative",
168968
+ "type": {
168969
+ "text": "'long' | 'narrow' | 'short' | undefined"
168970
+ },
168971
+ "description": "Writes the time as how long ago it was, or how long until it, from\n`datetime`, where the `time` slot is empty: `long` (\"3 hours ago\"),\n`short` (\"3 hr. ago\") or `narrow` (\"3h ago\"). Set with no value, it is\n`long`. The words move on as they go stale.",
168972
+ "fieldName": "relative"
168973
+ },
166891
168974
  {
166892
168975
  "name": "tone",
166893
168976
  "type": {
@@ -167419,7 +169502,7 @@
167419
169502
  "declarations": [
167420
169503
  {
167421
169504
  "kind": "class",
167422
- "description": "Each message is an element because it has a timeout, a tone, a dismiss\ncontrol, and a lifetime that pauses.\n\n**Each item runs its own timer.** A timer held by the region would restart\nwith each new message, and the last of three messages would stay for nine\nseconds. It pauses while the pointer or focus is on the message, and while\nthe page is hidden, so a message is not spent in a background tab.\n\n**Each message is an `alertdialog` named by its words**, which is how a reader\nwho moves into the stack hears which message they are on. Give it a\n`heading` and a `description`, and the heading names it and the description\ndescribes it, for a message with a title and a line of detail. The region\nsays each message once as it arrives, a `danger` one assertively, so a\nmessage is never a live region of its own.\n\nA touch or a pen swipes a message toward the end of the line, and past\nhalfway, or quickly, dismisses it through the same `helix-dismiss` as its\ncontrol. While it moves, the distance is on the `item` part as\n`--toast-swipe-x`.\n\n**Messages are inverted by default.** The item flips `color-scheme`, so a new\nmessage stands out from the page without using a color that carries meaning.",
169505
+ "description": "Each message is an element because it has a timeout, a tone, a dismiss\ncontrol, and a lifetime that pauses.\n\n**Each item runs its own timer.** A timer held by the region would restart\nwith each new message, and the last of three messages would stay for nine\nseconds. It pauses while the pointer or focus is on the message, and while\nthe page is hidden, so a message is not spent in a background tab.\n\n**Each message is an `alertdialog` named by its words**, which is how a reader\nwho moves into the stack hears which message they are on. Give it a\n`heading` and a `description`, and the heading names it and the description\ndescribes it, for a message with a title and a line of detail. The region\nsays each message once as it arrives, a `danger` one assertively, so a\nmessage is never a live region of its own.\n\nA touch or a pen swipes a message toward the end of the line, and past\nhalfway, or quickly, dismisses it through the same `helix-dismiss` as its\ncontrol. While it moves, the distance is on the `item` part as\n`--toast-swipe-x`.\n\n**Escape dismisses the message holding focus**, through the same\n`helix-dismiss`, and focus moves to the next message.\n\n**Messages are inverted by default.** The item flips `color-scheme`, so a new\nmessage stands out from the page without using a color that carries meaning.",
167423
169506
  "name": "HelixHeadlessToastItem",
167424
169507
  "cssProperties": [
167425
169508
  {
@@ -167563,7 +169646,7 @@
167563
169646
  "name": "countdown",
167564
169647
  "privacy": "private",
167565
169648
  "readonly": true,
167566
- "default": "new CountdownController(this, { done: () => { this.dismiss() }, holdWhileHidden: true, paused: (paused) => { this.toggleAttribute('data-paused', paused) }, })",
169649
+ "default": "new CountdownController(this, { done: () => { this.dismiss() }, holdWhileHidden: true, paused: (paused) => { this.toggleAttribute('data-paused', paused) this.toggleState('paused', paused) }, })",
167567
169650
  "description": "The dismiss timer, which pauses while a reader is on the message, and\nwhile the page is hidden, and continues from what was left. A message that\narrives in a background tab waits for the reader to come back, as React\nAria's toast queue does.\n\nPaused is said on the host so the indicator can freeze with the clock. A\n`data-` attribute rather than a property, because it is written after\nupgrade from a pointer moving: nothing declares it and no server rendered\nit, which is the same reason `Carousel` names its slides from here."
167568
169651
  },
167569
169652
  {
@@ -167576,6 +169659,54 @@
167576
169659
  "attribute": "tone",
167577
169660
  "reflects": true
167578
169661
  },
169662
+ {
169663
+ "kind": "field",
169664
+ "name": "waiting",
169665
+ "type": {
169666
+ "text": "boolean"
169667
+ },
169668
+ "default": "false",
169669
+ "description": "Whether the region holds the message back, because more messages are\nshowing than its `max-visible`. The region sets it. A waiting message is\nhidden, its timer has not started, and it is said once it shows."
169670
+ },
169671
+ {
169672
+ "kind": "field",
169673
+ "name": "started",
169674
+ "type": {
169675
+ "text": "boolean"
169676
+ },
169677
+ "privacy": "private",
169678
+ "default": "false",
169679
+ "description": "Whether the dismiss timer has started, which it does once the message first shows."
169680
+ },
169681
+ {
169682
+ "kind": "field",
169683
+ "name": "holding",
169684
+ "type": {
169685
+ "text": "boolean"
169686
+ },
169687
+ "privacy": "private",
169688
+ "default": "false",
169689
+ "description": "Whether the timer is held for `waiting`, so the hold is let go once."
169690
+ },
169691
+ {
169692
+ "kind": "method",
169693
+ "name": "wait",
169694
+ "privacy": "private",
169695
+ "return": {
169696
+ "type": {
169697
+ "text": "void"
169698
+ }
169699
+ },
169700
+ "parameters": [
169701
+ {
169702
+ "name": "waiting",
169703
+ "type": {
169704
+ "text": "boolean"
169705
+ }
169706
+ }
169707
+ ],
169708
+ "description": "Starts the timer when the message first shows, and holds it while it waits again."
169709
+ },
167579
169710
  {
167580
169711
  "kind": "field",
167581
169712
  "name": "openState",
@@ -167641,6 +169772,13 @@
167641
169772
  "privacy": "private",
167642
169773
  "readonly": true
167643
169774
  },
169775
+ {
169776
+ "kind": "field",
169777
+ "name": "handleKeydown",
169778
+ "privacy": "private",
169779
+ "readonly": true,
169780
+ "description": "Escape dismisses the message holding focus, as Radix's toast does. Taken\nonly when the dismissal goes ahead, so a refused one leaves the key to\nthe page."
169781
+ },
167644
169782
  {
167645
169783
  "kind": "method",
167646
169784
  "name": "assigned",
@@ -168248,6 +170386,28 @@
168248
170386
  }
168249
170387
  }
168250
170388
  ],
170389
+ "cssStates": [
170390
+ {
170391
+ "description": "The message has been dismissed and is hidden, or leaving.",
170392
+ "name": "closed"
170393
+ },
170394
+ {
170395
+ "description": "The dismiss timer is paused, while a pointer or focus is on the message, or while the page is hidden.",
170396
+ "name": "paused"
170397
+ },
170398
+ {
170399
+ "description": "The region holds the message back, past its `max-visible`, until a message before it goes.",
170400
+ "name": "waiting"
170401
+ },
170402
+ {
170403
+ "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
170404
+ "name": "settled",
170405
+ "inheritedFrom": {
170406
+ "name": "HelixElement",
170407
+ "module": "src/helix-element/helix-element.ts"
170408
+ }
170409
+ }
170410
+ ],
168251
170411
  "mixins": [
168252
170412
  {
168253
170413
  "name": "MixinDismissible",
@@ -168269,16 +170429,6 @@
168269
170429
  },
168270
170430
  "tagName": "helix-headless-toast-item",
168271
170431
  "customElement": true,
168272
- "cssStates": [
168273
- {
168274
- "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
168275
- "name": "settled",
168276
- "inheritedFrom": {
168277
- "name": "HelixElement",
168278
- "module": "src/helix-element/helix-element.ts"
168279
- }
168280
- }
168281
- ],
168282
170432
  "modulePath": "src/toast/item/toast-item.ts",
168283
170433
  "definitionPath": "src/toast/item/toast-item.ts"
168284
170434
  }
@@ -168308,7 +170458,7 @@
168308
170458
  "declarations": [
168309
170459
  {
168310
170460
  "kind": "class",
168311
- "description": "The region and its items are one family because a live region must be in the\ndocument before a message is added to it. Assistive technology often does not\nannounce a region that arrives already holding its message. `Radio.Group` is\npart of its family for the same reason.\n\n**The region is a landmark named by `label`, and it says each message once\nas it arrives**: a `danger` message assertively, and every other one\npolitely. It says the word for the tone, the heading, the description and\nthe text, and not the actions, through two live regions of its own, the\n`live` parts, which it empties again a moment later. The stack itself is not\na live region, so a message is never said twice, and changing the words of a\nmessage already showing says nothing. Each message is an `alertdialog` named\nby its words, so a reader who moves into the stack hears which message they\nare on.\n\n**`hotkey` takes focus to the stack and back**, F8 unless you set it, and\n`label` says which key: `{hotkey}` in it is filled in, so the default name\nis \"Notifications (F8)\". Pressed while focus is in the stack, it gives focus\nback to where it was.\n\n**The region never creates or removes items.** You render items and remove\nthem. An item requests closing with a cancelable `helix-dismiss` event. A\ndismissed item hides itself and stays in the DOM, so your framework's state\nand the DOM stay in sync. It hides on its own unless you set `open`, which\nmakes the state yours.\n\n**`add()` shows a message from script**, for a page with no framework state\nto render them from: it appends a message of the region's own tier and\nremoves it once it has been dismissed and has finished leaving. Messages\nyou render yourself stay yours, and the region never removes them. A touch\nor a pen swipes a message away toward the end of the line.\n\n**The stack is in the top layer.** The `region` part is a `popover=\"manual\"`\nshown while a message is showing, and shown again above a modal dialog that\nopened after it. Position the `region` part, which is the box in the top\nlayer. While a modal `Dialog`, `Drawer` or `Lightbox` is open, the browser\nmakes everything outside it inert, the stack included, so a message stays\nvisible and its actions cannot be pressed. Where the browser has\n`ariaNotify`, a message that arrives then is announced through it. For a\nmessage with an action, render a second region inside the dialog.\n\nWhen a message with focus inside it is dismissed, focus moves to the next\nmessage, then the one before it, then back to where it was before it entered\nthe stack.",
170461
+ "description": "The region and its items are one family because a live region must be in the\ndocument before a message is added to it. Assistive technology often does not\nannounce a region that arrives already holding its message. `Radio.Group` is\npart of its family for the same reason.\n\n**The region is a landmark named by `label`, and it says each message once\nas it arrives**: a `danger` message assertively, and every other one\npolitely. It says the word for the tone, the heading, the description and\nthe text, and not the actions, through two live regions of its own, the\n`live` parts, which it empties again a moment later. The stack itself is not\na live region, so a message is never said twice, and changing the words of a\nmessage already showing says nothing. Each message is an `alertdialog` named\nby its words, so a reader who moves into the stack hears which message they\nare on.\n\n**`hotkey` takes focus to the stack and back**, F8 unless you set it, and\n`label` says which key: `{hotkey}` in it is filled in, so the default name\nis \"Notifications (F8)\". Pressed while focus is in the stack, it gives focus\nback to where it was.\n\n**The region never creates or removes items.** You render items and remove\nthem. An item requests closing with a cancelable `helix-dismiss` event. A\ndismissed item hides itself and stays in the DOM, so your framework's state\nand the DOM stay in sync. It hides on its own unless you set `open`, which\nmakes the state yours.\n\n**`add()` shows a message from script**, for a page with no framework state\nto render them from: it appends a message of the region's own tier and\nremoves it once it has been dismissed and has finished leaving. Messages\nyou render yourself stay yours, and the region never removes them. A touch\nor a pen swipes a message away toward the end of the line.\n\n**The stack is in the top layer.** The `region` part is a `popover=\"manual\"`\nshown while a message is showing, and shown again above a modal dialog that\nopened after it. Position the `region` part, which is the box in the top\nlayer. While a modal `Dialog`, `Drawer` or `Lightbox` is open, the browser\nmakes everything outside it inert, the stack included, so a message stays\nvisible and its actions cannot be pressed. Where the browser has\n`ariaNotify`, a message that arrives then is announced through it. For a\nmessage with an action, render a second region inside the dialog.\n\nWhen a message with focus inside it is dismissed, focus moves to the next\nmessage, then the one before it, then back to where it was before it entered\nthe stack.\n\n**`max-visible` limits how many messages show at once**, as Zag's `max`\ndoes. The messages after that many, in document order, wait: each is hidden,\nits timer has not started, and the region says it once it shows, when a\nmessage before it goes. A waiting message has `:state(waiting)`.\n\n**Keyboard.**\n\n| Key | What it does |\n|---|---|\n| F8, or your `hotkey` | Moves focus to the first control in the stack, and back to where it was when pressed in the stack. |\n| Tab, Shift+Tab | Moves between the controls of the messages. |\n| Escape | Dismisses the message holding focus. Focus moves to the next message, then the one before it, then back to where it was. |",
168312
170462
  "name": "HelixHeadlessToast",
168313
170463
  "cssParts": [
168314
170464
  {
@@ -168360,6 +170510,15 @@
168360
170510
  "words": true
168361
170511
  }
168362
170512
  },
170513
+ {
170514
+ "kind": "field",
170515
+ "name": "maxVisible",
170516
+ "type": {
170517
+ "text": "number | undefined"
170518
+ },
170519
+ "description": "How many messages show at once. The messages after that many wait, hidden\nand with their timers stopped, until a message before them goes. Unset,\nevery message shows.",
170520
+ "attribute": "max-visible"
170521
+ },
168363
170522
  {
168364
170523
  "kind": "field",
168365
170524
  "name": "placement",
@@ -168545,6 +170704,36 @@
168545
170704
  "description": "The messages that are showing, in order.",
168546
170705
  "readonly": true
168547
170706
  },
170707
+ {
170708
+ "kind": "field",
170709
+ "name": "held",
170710
+ "privacy": "private",
170711
+ "readonly": true,
170712
+ "default": "new WeakSet<Element>()",
170713
+ "description": "The messages `max-visible` holds back."
170714
+ },
170715
+ {
170716
+ "kind": "method",
170717
+ "name": "queue",
170718
+ "privacy": "private",
170719
+ "return": {
170720
+ "type": {
170721
+ "text": "HTMLElement[]"
170722
+ }
170723
+ },
170724
+ "description": "Holds back the messages past `max-visible`, and returns the ones it has\njust let go. A message that has been dismissed takes no place in the line."
170725
+ },
170726
+ {
170727
+ "kind": "method",
170728
+ "name": "restack",
170729
+ "privacy": "private",
170730
+ "return": {
170731
+ "type": {
170732
+ "text": "void"
170733
+ }
170734
+ },
170735
+ "description": "Lets go of the messages past `max-visible` that now have room, raises the\nstack and says them, once each has shown."
170736
+ },
168548
170737
  {
168549
170738
  "kind": "field",
168550
170739
  "name": "region",
@@ -169006,6 +171195,14 @@
169006
171195
  "description": "Accessible name for the region, with `{hotkey}` filled in. Translate it with\nthe rest of your interface.",
169007
171196
  "fieldName": "label"
169008
171197
  },
171198
+ {
171199
+ "name": "max-visible",
171200
+ "type": {
171201
+ "text": "number | undefined"
171202
+ },
171203
+ "description": "How many messages show at once. The messages after that many wait, hidden\nand with their timers stopped, until a message before them goes. Unset,\nevery message shows.",
171204
+ "fieldName": "maxVisible"
171205
+ },
169009
171206
  {
169010
171207
  "name": "placement",
169011
171208
  "type": {
@@ -169599,6 +171796,21 @@
169599
171796
  "module": "src/mixins/mixin-field/mixin-field.ts"
169600
171797
  }
169601
171798
  },
171799
+ {
171800
+ "kind": "field",
171801
+ "name": "namedBy",
171802
+ "type": {
171803
+ "text": "string | null"
171804
+ },
171805
+ "privacy": "protected",
171806
+ "default": "null",
171807
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
171808
+ "attribute": "aria-label",
171809
+ "inheritedFrom": {
171810
+ "name": "MixinField",
171811
+ "module": "src/mixins/mixin-field/mixin-field.ts"
171812
+ }
171813
+ },
169602
171814
  {
169603
171815
  "kind": "field",
169604
171816
  "name": "labeled",
@@ -170781,6 +172993,8 @@
170781
172993
  "text": "string | null"
170782
172994
  },
170783
172995
  "default": "null",
172996
+ "description": "The name a screen reader says for the field where it shows no label, as\nthe platform's `aria-label`. It is drawn as a label and clipped, so it\nnames the control inside, and a new one renders at once.\n\n**An `aria-label` is read when the field renders, and nothing else would\nrender it again.** It is the platform's attribute and no property of this\nelement's, so writing a new one scheduled no update and the label kept\nthe old words. Data Table meets this on every column move: each row's\ncheckbox is named by the first column, so reordering renames every one.\n\nA reactive property on the attribute, which is the one way Lit observes\none. Overriding `observedAttributes` in a mixin compiled `this` to the\nmixin's own class, so every field observed only this mixin's attributes\nand dropped its own. Not reflected: the attribute is the consumer's.",
172997
+ "fieldName": "namedBy",
170784
172998
  "inheritedFrom": {
170785
172999
  "name": "MixinField",
170786
173000
  "module": "src/mixins/mixin-field/mixin-field.ts"
@@ -179489,6 +181703,28 @@
179489
181703
  "description": "The entry's name: its own text, without the content in its named slots.\n\n`textContent` takes the whole subtree: a row with a duration in `meta`\nreads as \"His Girl Friday0:06\", and that string reaches the player and the\nlock screen. Only the nodes the consumer left unslotted are the name;\nanything named is a column beside it.\n\nLight DOM rather than `assignedNodes`, so it answers on the server too,\nwhere there is no slot to ask. `Option.text` reads its own the same way.",
179490
181704
  "readonly": true
179491
181705
  },
181706
+ {
181707
+ "kind": "method",
181708
+ "name": "focus",
181709
+ "return": {
181710
+ "type": {
181711
+ "text": "void"
181712
+ }
181713
+ },
181714
+ "parameters": [
181715
+ {
181716
+ "name": "options",
181717
+ "optional": true,
181718
+ "type": {
181719
+ "text": "FocusOptions"
181720
+ }
181721
+ }
181722
+ ],
181723
+ "description": "Focuses the entry's button, which is where the playlist's arrow keys send\nfocus. The host itself takes no focus.",
181724
+ "type": {
181725
+ "text": "focus(options?: FocusOptions) => void"
181726
+ }
181727
+ },
179492
181728
  {
179493
181729
  "kind": "field",
179494
181730
  "name": "choose",
@@ -179894,6 +182130,20 @@
179894
182130
  "fieldName": "value"
179895
182131
  }
179896
182132
  ],
182133
+ "cssStates": [
182134
+ {
182135
+ "description": "The entry that is playing.",
182136
+ "name": "current"
182137
+ },
182138
+ {
182139
+ "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
182140
+ "name": "settled",
182141
+ "inheritedFrom": {
182142
+ "name": "HelixElement",
182143
+ "module": "src/helix-element/helix-element.ts"
182144
+ }
182145
+ }
182146
+ ],
179897
182147
  "superclass": {
179898
182148
  "name": "HelixElement",
179899
182149
  "package": "@fusion.dev/helix-core"
@@ -179910,16 +182160,6 @@
179910
182160
  },
179911
182161
  "tagName": "helix-headless-video-playlist-item",
179912
182162
  "customElement": true,
179913
- "cssStates": [
179914
- {
179915
- "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
179916
- "name": "settled",
179917
- "inheritedFrom": {
179918
- "name": "HelixElement",
179919
- "module": "src/helix-element/helix-element.ts"
179920
- }
179921
- }
179922
- ],
179923
182163
  "modulePath": "src/video-playlist/item/video-playlist-item.ts",
179924
182164
  "definitionPath": "src/video-playlist/item/video-playlist-item.ts"
179925
182165
  }
@@ -179988,6 +182228,10 @@
179988
182228
  "description": "The column at the start of an entry. It is a slot and is always present.",
179989
182229
  "name": "entry-start"
179990
182230
  },
182231
+ {
182232
+ "description": "The panel an entry's submenu opens in beside it. The playlist's entries have none.",
182233
+ "name": "entry-surface"
182234
+ },
179991
182235
  {
179992
182236
  "description": "The menu that holds the entries.",
179993
182237
  "name": "menu"
@@ -180744,13 +182988,17 @@
180744
182988
  "declarations": [
180745
182989
  {
180746
182990
  "kind": "class",
180747
- "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. `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**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.** Each entry is a button in the tab order, and Enter or Space\nplays it. The current entry carries `aria-current`. While focus is on the\nplayer, the player's own keys work, and `Video` lists them. Its previous\nand next controls move through the entries in the same order the playlist\ndoes.",
182991
+ "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. `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**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.** Each entry is a button in the tab order, and Enter or Space\nplays it. The arrow keys move focus to the entry before or after, and Home\nand 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.",
180748
182992
  "name": "HelixHeadlessVideoPlaylist",
180749
182993
  "cssParts": [
180750
182994
  {
180751
182995
  "description": "The list of entries.",
180752
182996
  "name": "items"
180753
182997
  },
182998
+ {
182999
+ "description": "A live region that says which entry plays after the playlist moves.",
183000
+ "name": "live"
183001
+ },
180754
183002
  {
180755
183003
  "description": "The region that holds the player.",
180756
183004
  "name": "player"
@@ -180790,6 +183038,27 @@
180790
183038
  "words": true
180791
183039
  }
180792
183040
  },
183041
+ {
183042
+ "kind": "field",
183043
+ "name": "playingLabel",
183044
+ "type": {
183045
+ "text": "string"
183046
+ },
183047
+ "default": "'Now playing {title}'",
183048
+ "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.",
183049
+ "attribute": "playing-label",
183050
+ "helix": {
183051
+ "words": true
183052
+ }
183053
+ },
183054
+ {
183055
+ "kind": "field",
183056
+ "name": "status",
183057
+ "privacy": "private",
183058
+ "readonly": true,
183059
+ "default": "new StatusController(this)",
183060
+ "description": "The live region, rendered from the first move."
183061
+ },
180793
183062
  {
180794
183063
  "kind": "field",
180795
183064
  "name": "repeat",
@@ -180938,6 +183207,39 @@
180938
183207
  "privacy": "private",
180939
183208
  "readonly": true
180940
183209
  },
183210
+ {
183211
+ "kind": "field",
183212
+ "name": "handleKeydown",
183213
+ "privacy": "private",
183214
+ "readonly": true,
183215
+ "description": "The arrow keys, Home and End on an entry move focus to another one.\n\n**The entries the keys reach are the enabled ones**, because a disabled\nbutton cannot take focus and a key that landed on one would leave focus\nwhere it was. Up and Left go back, Down and Right go on, and Left and\nRight swap on a right-to-left page, so a list laid out in a row moves the\nway it reads."
183216
+ },
183217
+ {
183218
+ "kind": "field",
183219
+ "name": "handlePlay",
183220
+ "privacy": "private",
183221
+ "readonly": true,
183222
+ "description": "The player playing again, after the end or anywhere, means the list has not ended."
183223
+ },
183224
+ {
183225
+ "kind": "method",
183226
+ "name": "takePlayerKey",
183227
+ "privacy": "private",
183228
+ "return": {
183229
+ "type": {
183230
+ "text": "boolean"
183231
+ }
183232
+ },
183233
+ "parameters": [
183234
+ {
183235
+ "name": "event",
183236
+ "type": {
183237
+ "text": "KeyboardEvent"
183238
+ }
183239
+ }
183240
+ ],
183241
+ "description": "Shift with N plays the next entry and Shift with P the previous one, while\nfocus is on the player, the keys a reader knows from the common players.\nNot inside a field the player holds, where they are letters."
183242
+ },
180941
183243
  {
180942
183244
  "kind": "field",
180943
183245
  "name": "handleNext",
@@ -181451,6 +183753,15 @@
181451
183753
  "description": "The list's name, read by screen readers.",
181452
183754
  "fieldName": "label"
181453
183755
  },
183756
+ {
183757
+ "name": "playing-label",
183758
+ "type": {
183759
+ "text": "string"
183760
+ },
183761
+ "default": "'Now playing {title}'",
183762
+ "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.",
183763
+ "fieldName": "playingLabel"
183764
+ },
181454
183765
  {
181455
183766
  "name": "repeat",
181456
183767
  "type": {
@@ -181494,6 +183805,20 @@
181494
183805
  }
181495
183806
  }
181496
183807
  ],
183808
+ "cssStates": [
183809
+ {
183810
+ "description": "The last entry finished and the playlist stopped there, until an entry plays again.",
183811
+ "name": "ended"
183812
+ },
183813
+ {
183814
+ "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
183815
+ "name": "settled",
183816
+ "inheritedFrom": {
183817
+ "name": "HelixElement",
183818
+ "module": "src/helix-element/helix-element.ts"
183819
+ }
183820
+ }
183821
+ ],
181497
183822
  "mixins": [
181498
183823
  {
181499
183824
  "name": "MixinControllerActive",
@@ -181528,16 +183853,6 @@
181528
183853
  },
181529
183854
  "tagName": "helix-headless-video-playlist",
181530
183855
  "customElement": true,
181531
- "cssStates": [
181532
- {
181533
- "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
181534
- "name": "settled",
181535
- "inheritedFrom": {
181536
- "name": "HelixElement",
181537
- "module": "src/helix-element/helix-element.ts"
181538
- }
181539
- }
181540
- ],
181541
183856
  "modulePath": "src/video-playlist/root/video-playlist-root.ts",
181542
183857
  "definitionPath": "src/video-playlist/root/video-playlist-root.ts"
181543
183858
  }
@@ -181816,6 +184131,15 @@
181816
184131
  "kind": "javascript-module",
181817
184132
  "path": "src/video/root/keys.ts",
181818
184133
  "declarations": [
184134
+ {
184135
+ "kind": "variable",
184136
+ "name": "PLAYER_KEYS",
184137
+ "type": {
184138
+ "text": "string"
184139
+ },
184140
+ "default": "'Space K ArrowLeft ArrowRight Shift+ArrowLeft Shift+ArrowRight J L ArrowUp ArrowDown M F C Home End 0 1 2 3 4 5 6 7 8 9'",
184141
+ "description": "The keys `takeKey` answers, as `aria-keyshortcuts` names them."
184142
+ },
181819
184143
  {
181820
184144
  "kind": "function",
181821
184145
  "name": "takeKey",
@@ -181848,6 +184172,14 @@
181848
184172
  }
181849
184173
  ],
181850
184174
  "exports": [
184175
+ {
184176
+ "kind": "js",
184177
+ "name": "PLAYER_KEYS",
184178
+ "declaration": {
184179
+ "name": "PLAYER_KEYS",
184180
+ "module": "src/video/root/keys.ts"
184181
+ }
184182
+ },
181851
184183
  {
181852
184184
  "kind": "js",
181853
184185
  "name": "takeKey",
@@ -181864,7 +184196,7 @@
181864
184196
  "declarations": [
181865
184197
  {
181866
184198
  "kind": "class",
181867
- "description": "The picture is a native `<video>`, so decoding, buffering, captions, Picture\nin Picture, AirPlay, and codecs come from the platform. The component\nreplaces the control bar, because the native bar cannot be styled.\n\nThe scrubber and the volume are `<input type=\"range\">` elements, so arrow\nkeys, Home and End, touch targets, and screen reader announcements work as\nthey do natively.\n\nWhen you set `controls`, the browser's control bar is used, the Helix bar is\nnot drawn, and the keys below are not bound, so a key press does not seek\ntwice.\n\n**Keyboard.** The keys match other players, and they are bound on the\nelement only, so they work while focus is on the player.\n\n| Key | What it does |\n|---|---|\n| Space, `k` | Plays or pauses. Space on a button presses the button. |\n| Right, Left | Moves 5 seconds forward or back. |\n| Shift with Right or Left | Moves 10 seconds forward or back. |\n| `l`, `j` | Moves 10 seconds forward or back, as the skip buttons do. |\n| Up, Down | Raises or lowers the volume by a tenth. |\n| `m` | Mutes or unmutes. |\n| `f` | Enters or leaves fullscreen. |\n| Tab | Moves through the controls on the bar. |\n\nOn the scrubber and the volume slider, the arrow keys, Page Up, Page Down,\nHome, and End move the slider, as on any range input.\n\n`<source>` and `<track>` children are copied into the video. A media element\nselects resources from its own child nodes, and a slot is one node, so\nslotted sources would give the video no text tracks, no current source, and a\n`readyState` of zero, and it would not play. They are copied so your light\nDOM stays intact, and are copied again whenever the slot changes.\n\nThe player sends every media event of its inner video under the same name,\nwithout bubbling, as a `<video>` sends it. Listen on the player as you would\non a video: `timeupdate`, `volumechange`, `loadedmetadata`, `error`, and the\nrest.",
184199
+ "description": "The picture is a native `<video>`, so decoding, buffering, captions, Picture\nin Picture, AirPlay, and codecs come from the platform. The component\nreplaces the control bar, because the native bar cannot be styled.\n\nThe scrubber and the volume are `<input type=\"range\">` elements, so arrow\nkeys, Home and End, touch targets, and screen reader announcements work as\nthey do natively.\n\nWhen you set `controls`, the browser's control bar is used, the Helix bar is\nnot drawn, and the keys below are not bound, so a key press does not seek\ntwice.\n\n**Keyboard.** The keys match other players, and they are bound on the\nelement only, so they work while focus is on the player.\n\n| Key | What it does |\n|---|---|\n| Space, `k` | Plays or pauses. Space on a button presses the button. |\n| Right, Left | Moves 5 seconds forward or back. |\n| Shift with Right or Left | Moves 10 seconds forward or back. |\n| `l`, `j` | Moves 10 seconds forward or back, as the skip buttons do. |\n| Up, Down | Raises or lowers the volume by a tenth. |\n| `m` | Mutes or unmutes. |\n| `f` | Enters or leaves fullscreen. |\n| `c` | Turns captions on or off. |\n| Home, End | Goes to the start or the end. |\n| `0` to `9` | Goes to that tenth of the video: `5` is the middle. |\n| Tab | Moves through the controls on the bar. |\n\nA key with Control, Command, or Alt held is left to the browser. The\nplayer lists its keys in `aria-keyshortcuts`, and a live region says what a\nkey changed that is not on the focused control: playing or paused, muted,\nthe volume, captions on or off, and where the video is after a seek.\n\nOn the scrubber and the volume slider, the arrow keys, Page Up, Page Down,\nHome, and End move the slider, as on any range input.\n\n`<source>` and `<track>` children are copied into the video. A media element\nselects resources from its own child nodes, and a slot is one node, so\nslotted sources would give the video no text tracks, no current source, and a\n`readyState` of zero, and it would not play. They are copied so your light\nDOM stays intact, and are copied again whenever the slot changes.\n\nThe player sends every media event of its inner video under the same name,\nwithout bubbling, as a `<video>` sends it. Listen on the player as you would\non a video: `timeupdate`, `volumechange`, `loadedmetadata`, `error`, and the\nrest.",
181868
184200
  "name": "HelixHeadlessVideo",
181869
184201
  "cssProperties": [
181870
184202
  {
@@ -181969,6 +184301,10 @@
181969
184301
  "description": "The leading column that holds the `start` slot. It is always rendered.",
181970
184302
  "name": "entry-start"
181971
184303
  },
184304
+ {
184305
+ "description": "The panel a row's submenu opens in beside it. The player's rows have none.",
184306
+ "name": "entry-surface"
184307
+ },
181972
184308
  {
181973
184309
  "description": "The message shown when the source cannot be played.",
181974
184310
  "name": "failure"
@@ -181986,7 +184322,7 @@
181986
184322
  "name": "header"
181987
184323
  },
181988
184324
  {
181989
- "description": "A live region that repeats the loading text, so screen readers announce it when it changes. Visually hidden in the styled tier.",
184325
+ "description": "A live region that says the loading text, and what a key changed, such as the volume. Visually hidden in the styled tier.",
181990
184326
  "name": "live"
181991
184327
  },
181992
184328
  {
@@ -182210,6 +184546,19 @@
182210
184546
  "attribute": "autoplay",
182211
184547
  "reflects": true
182212
184548
  },
184549
+ {
184550
+ "kind": "field",
184551
+ "name": "captionsHiddenLabel",
184552
+ "type": {
184553
+ "text": "string"
184554
+ },
184555
+ "default": "'Captions off'",
184556
+ "description": "What the live region says when `c` turns captions off.",
184557
+ "attribute": "captions-hidden-label",
184558
+ "helix": {
184559
+ "words": true
184560
+ }
184561
+ },
182213
184562
  {
182214
184563
  "kind": "field",
182215
184564
  "name": "captionsLabel",
@@ -182236,6 +184585,19 @@
182236
184585
  "words": true
182237
184586
  }
182238
184587
  },
184588
+ {
184589
+ "kind": "field",
184590
+ "name": "captionsShownLabel",
184591
+ "type": {
184592
+ "text": "string"
184593
+ },
184594
+ "default": "'Captions on'",
184595
+ "description": "What the live region says when `c` turns captions on.",
184596
+ "attribute": "captions-shown-label",
184597
+ "helix": {
184598
+ "words": true
184599
+ }
184600
+ },
182239
184601
  {
182240
184602
  "kind": "field",
182241
184603
  "name": "controls",
@@ -182419,6 +184781,19 @@
182419
184781
  "words": true
182420
184782
  }
182421
184783
  },
184784
+ {
184785
+ "kind": "field",
184786
+ "name": "mutedLabel",
184787
+ "type": {
184788
+ "text": "string"
184789
+ },
184790
+ "default": "'Muted'",
184791
+ "description": "What the live region says when a key mutes the video.",
184792
+ "attribute": "muted-label",
184793
+ "helix": {
184794
+ "words": true
184795
+ }
184796
+ },
182422
184797
  {
182423
184798
  "kind": "field",
182424
184799
  "name": "muteLabel",
@@ -182455,6 +184830,19 @@
182455
184830
  "description": "Controls to place in a menu behind one button, named the same way as\n`extra-controls`.\n\n**Named rather than measured, and the reason is that a width cannot answer\nthis.** A media query asks about the window, and the bar's problem is its\nown width: a video in a 320px sidebar on a desktop is cramped and a\nfull-bleed hero on a phone is not. A container query asks the right\nquestion and still cannot answer it, because how many controls there are is\nthe consumer's, so the threshold is not a width but a width per control,\nwhich is a guess. And a control that moves between the bar and a hidden\nmenu as the layout shifts is a control the reader has to find twice.\n\nSo the consumer says where the fold is, which they can, having already\nnamed the controls in order. A name in both lists is drawn once, on the\nbar: two of the same control is worse than either placement.",
182456
184831
  "attribute": "overflow-controls"
182457
184832
  },
184833
+ {
184834
+ "kind": "field",
184835
+ "name": "pausedLabel",
184836
+ "type": {
184837
+ "text": "string"
184838
+ },
184839
+ "default": "'Paused'",
184840
+ "description": "What the live region says when a key pauses the video.",
184841
+ "attribute": "paused-label",
184842
+ "helix": {
184843
+ "words": true
184844
+ }
184845
+ },
182458
184846
  {
182459
184847
  "kind": "field",
182460
184848
  "name": "pauseLabel",
@@ -182507,6 +184895,19 @@
182507
184895
  "words": true
182508
184896
  }
182509
184897
  },
184898
+ {
184899
+ "kind": "field",
184900
+ "name": "playingLabel",
184901
+ "type": {
184902
+ "text": "string"
184903
+ },
184904
+ "default": "'Playing'",
184905
+ "description": "What the live region says when a key plays the video.",
184906
+ "attribute": "playing-label",
184907
+ "helix": {
184908
+ "words": true
184909
+ }
184910
+ },
182510
184911
  {
182511
184912
  "kind": "field",
182512
184913
  "name": "playLabel",
@@ -182670,6 +185071,32 @@
182670
185071
  "words": true
182671
185072
  }
182672
185073
  },
185074
+ {
185075
+ "kind": "field",
185076
+ "name": "unmutedLabel",
185077
+ "type": {
185078
+ "text": "string"
185079
+ },
185080
+ "default": "'Unmuted'",
185081
+ "description": "What the live region says when a key unmutes the video.",
185082
+ "attribute": "unmuted-label",
185083
+ "helix": {
185084
+ "words": true
185085
+ }
185086
+ },
185087
+ {
185088
+ "kind": "field",
185089
+ "name": "volumeChangedLabel",
185090
+ "type": {
185091
+ "text": "string"
185092
+ },
185093
+ "default": "'Volume {percent} percent'",
185094
+ "description": "What the live region says when a key changes the volume. `{percent}` is the\nvolume from 0 to 100, written in the locale.",
185095
+ "attribute": "volume-changed-label",
185096
+ "helix": {
185097
+ "words": true
185098
+ }
185099
+ },
182673
185100
  {
182674
185101
  "kind": "field",
182675
185102
  "name": "volumeLabel",
@@ -183342,6 +185769,66 @@
183342
185769
  "readonly": true,
183343
185770
  "description": "The keys every player uses, bound to this element rather than the document.\n\nA video is not a command palette: its keys belong to it while a reader is\non it, and a page with two videos on it would otherwise have both answering\nthe same press.\n\nA taken press is stopped here rather than in the table, because what the\ndefault would have been is the element's business: the table says what the\nkey means and this says that nothing else gets it."
183344
185771
  },
185772
+ {
185773
+ "kind": "method",
185774
+ "name": "sayKey",
185775
+ "privacy": "private",
185776
+ "return": {
185777
+ "type": {
185778
+ "text": "void"
185779
+ }
185780
+ },
185781
+ "parameters": [
185782
+ {
185783
+ "name": "key",
185784
+ "type": {
185785
+ "text": "string"
185786
+ }
185787
+ },
185788
+ {
185789
+ "name": "paused",
185790
+ "type": {
185791
+ "text": "boolean"
185792
+ }
185793
+ },
185794
+ {
185795
+ "name": "video",
185796
+ "type": {
185797
+ "text": "HTMLVideoElement"
185798
+ }
185799
+ }
185800
+ ],
185801
+ "description": "What a reader hears after a key, which changed something they may not be\nlooking at: the focus is on the player or a control, and the bar may be\nhidden.\n\n**Said from the video's state after the press**, except for playing,\nwhich starts on a promise: whether the video was paused before the press\nsays which way it went. Nothing for fullscreen, which a reader sees and a\nscreen reader reports as the window changing, nor for `c` where there are\nno captions to turn on."
185802
+ },
185803
+ {
185804
+ "kind": "field",
185805
+ "name": "said",
185806
+ "type": {
185807
+ "text": "string"
185808
+ },
185809
+ "privacy": "private",
185810
+ "default": "''",
185811
+ "description": "What the live region says after a key, until the video waits for data,\nwhich it says over this."
185812
+ },
185813
+ {
185814
+ "kind": "method",
185815
+ "name": "say",
185816
+ "privacy": "private",
185817
+ "return": {
185818
+ "type": {
185819
+ "text": "void"
185820
+ }
185821
+ },
185822
+ "parameters": [
185823
+ {
185824
+ "name": "words",
185825
+ "type": {
185826
+ "text": "string"
185827
+ }
185828
+ }
185829
+ ],
185830
+ "description": "Puts words in the live region. The same words twice differ by a space no\nreader hears, since a region whose text does not change is not read again."
185831
+ },
183345
185832
  {
183346
185833
  "kind": "field",
183347
185834
  "name": "captions",
@@ -183998,6 +186485,15 @@
183998
186485
  "description": "Whether the video starts playing on its own. Browsers allow this only while\nit is muted.\n\nForwarded to the video, which decides. Whether an unprompted play is\npermitted is the browser's policy, and what follows a refused autoplay is a\npaused player showing its start control, which is the correct thing to be\nlooking at.",
183999
186486
  "fieldName": "autoplay"
184000
186487
  },
186488
+ {
186489
+ "name": "captions-hidden-label",
186490
+ "type": {
186491
+ "text": "string"
186492
+ },
186493
+ "default": "'Captions off'",
186494
+ "description": "What the live region says when `c` turns captions off.",
186495
+ "fieldName": "captionsHiddenLabel"
186496
+ },
184001
186497
  {
184002
186498
  "name": "captions-label",
184003
186499
  "type": {
@@ -184016,6 +186512,15 @@
184016
186512
  "description": "The name of the row that turns captions off, when the video has several\ntracks.",
184017
186513
  "fieldName": "captionsOffLabel"
184018
186514
  },
186515
+ {
186516
+ "name": "captions-shown-label",
186517
+ "type": {
186518
+ "text": "string"
186519
+ },
186520
+ "default": "'Captions on'",
186521
+ "description": "What the live region says when `c` turns captions on.",
186522
+ "fieldName": "captionsShownLabel"
186523
+ },
184019
186524
  {
184020
186525
  "name": "controls",
184021
186526
  "type": {
@@ -184160,6 +186665,15 @@
184160
186665
  "description": "What the button that opens `overflow-controls` is called.",
184161
186666
  "fieldName": "moreLabel"
184162
186667
  },
186668
+ {
186669
+ "name": "muted-label",
186670
+ "type": {
186671
+ "text": "string"
186672
+ },
186673
+ "default": "'Muted'",
186674
+ "description": "What the live region says when a key mutes the video.",
186675
+ "fieldName": "mutedLabel"
186676
+ },
184163
186677
  {
184164
186678
  "name": "mute-label",
184165
186679
  "type": {
@@ -184187,6 +186701,15 @@
184187
186701
  "description": "Controls to place in a menu behind one button, named the same way as\n`extra-controls`.\n\n**Named rather than measured, and the reason is that a width cannot answer\nthis.** A media query asks about the window, and the bar's problem is its\nown width: a video in a 320px sidebar on a desktop is cramped and a\nfull-bleed hero on a phone is not. A container query asks the right\nquestion and still cannot answer it, because how many controls there are is\nthe consumer's, so the threshold is not a width but a width per control,\nwhich is a guess. And a control that moves between the bar and a hidden\nmenu as the layout shifts is a control the reader has to find twice.\n\nSo the consumer says where the fold is, which they can, having already\nnamed the controls in order. A name in both lists is drawn once, on the\nbar: two of the same control is worse than either placement.",
184188
186702
  "fieldName": "overflowControls"
184189
186703
  },
186704
+ {
186705
+ "name": "paused-label",
186706
+ "type": {
186707
+ "text": "string"
186708
+ },
186709
+ "default": "'Paused'",
186710
+ "description": "What the live region says when a key pauses the video.",
186711
+ "fieldName": "pausedLabel"
186712
+ },
184190
186713
  {
184191
186714
  "name": "pause-label",
184192
186715
  "type": {
@@ -184223,6 +186746,15 @@
184223
186746
  "description": "The name of the player when `label` is not set. The player is a group, and\nthis is what a screen reader calls it on arriving.",
184224
186747
  "fieldName": "playerLabel"
184225
186748
  },
186749
+ {
186750
+ "name": "playing-label",
186751
+ "type": {
186752
+ "text": "string"
186753
+ },
186754
+ "default": "'Playing'",
186755
+ "description": "What the live region says when a key plays the video.",
186756
+ "fieldName": "playingLabel"
186757
+ },
184226
186758
  {
184227
186759
  "name": "play-label",
184228
186760
  "type": {
@@ -184348,6 +186880,24 @@
184348
186880
  "description": "How the scrubber reads out where the video is, with `{position}` and\n`{duration}` filled in.",
184349
186881
  "fieldName": "timeLabel"
184350
186882
  },
186883
+ {
186884
+ "name": "unmuted-label",
186885
+ "type": {
186886
+ "text": "string"
186887
+ },
186888
+ "default": "'Unmuted'",
186889
+ "description": "What the live region says when a key unmutes the video.",
186890
+ "fieldName": "unmutedLabel"
186891
+ },
186892
+ {
186893
+ "name": "volume-changed-label",
186894
+ "type": {
186895
+ "text": "string"
186896
+ },
186897
+ "default": "'Volume {percent} percent'",
186898
+ "description": "What the live region says when a key changes the volume. `{percent}` is the\nvolume from 0 to 100, written in the locale.",
186899
+ "fieldName": "volumeChangedLabel"
186900
+ },
184351
186901
  {
184352
186902
  "name": "volume-label",
184353
186903
  "type": {
@@ -184841,7 +187391,7 @@
184841
187391
  "declarations": [
184842
187392
  {
184843
187393
  "kind": "class",
184844
- "description": "The items arrive as data, in one of two ways:\n\n- `items` takes an array. A framework sets it as a property, and React\n hydration keeps it.\n- `for` names a `<script type=\"application/json\">` that holds an array, which\n a server sends as markup.\n\nEach item is drawn into a row in one of two ways:\n\n- `renderItem` is a function from an item and its index to the row's\n content: a Lit template, a string, or a DOM node.\n- A `<template>` child defines one row. `data-field=\"name\"` fills an element\n with the item's `name` as text, and `data-field-href=\"url\"` writes the\n item's `url` into `href`, the same for any attribute. A field may be a path\n of keys, such as `author.name`.\n\nRows are your markup in the light DOM, so your stylesheet styles them.\n\n**A grid.** `columns` lays the items out that many to a line, as a grid of\nequal columns, and windows the set a line at a time, as React Aria's grid\nlayout does. Each item draws one element, a cell of the grid, and\n`estimate` is the height of a line. Space the items with padding inside\neach one, which the list measures with the line.\n\n**Keyboard.** The list is one tab stop.\n\n| Key | What it does |\n|---|---|\n| Down, Up | Moves to the next or the previous item, or in a grid to the item in the same column on the next or the previous line. |\n| Right, Left | In a grid, moves to the next or the previous item along the line, the other way round on a right-to-left page. |\n| Home, End | Moves to the first or the last item. |\n| Page Down, Page Up | Moves by the number of items, or of lines in a grid, on screen. |\n| A letter or a word | Moves to the next item whose text starts with what you typed. |\n| Tab | Moves into the focused row's own links and buttons, then out of the list. |\n\nAn item that is not drawn is scrolled into view and focused, so a keyboard\nreaches the whole set. When the row holding the tab stop scrolls away, the\nstop moves to the first row on screen. Typing matches each item's\n`text-field`, which is the first `data-field` of the row template by default,\nor the item itself when it is a string or a number.\n\nEach row says its place in the whole set with `aria-posinset` and\n`aria-setsize`, so a screen reader says \"4,000 of 10,000\". The row holding\nfocus stays drawn when it scrolls out.\n\n**Selecting.** `selection-mode` makes the list a list box a reader chooses\nfrom: `single` selects one item and `multiple` any number. Space or a press\nselects an item, Shift with Space, an arrow, Home, End or a press takes in\nthe items from the last one chosen, and Control or Command with A selects\nthem all, in `multiple`. `value` holds the chosen items' keys, separated by\ncommas, in the order of the set: `key-field` names each item's key, and a\nstring or a number item is its own key. A change asks with\n`helix-before-change` and tells with `change`. Each row is an `option`\nmarked `aria-selected`, so a row's own links and buttons are not reached\nthere: keep those to a list without `selection-mode`.\n\n**Loading more.** `helix-range-change` fires as the items on screen change,\nand `range` holds them. `helix-load-more` fires once a reader is within one\nscreen of the end, once for each length of the set: add to `items` and it can\nfire again. While you fetch, set `loading`: the list is busy, and a row after\nthe last item says \"Loading more\" (`loading-label`, or your own content in\nthe `loading` slot). `scrollToIndex` takes a reader to an item.\n\n**An empty list.** Set `empty-label`, or put your own content in the `empty`\nslot, for a row shown when there are no items and none are loading, such as\n\"No messages yet\" and a link to write one. Without either, an empty list\nshows nothing, since a list whose items have not arrived yet has not said\nit has none.\n\n**Row height.** Rows are placed by `estimate` until they are drawn. Then the\nlist reads the drawn rows' height once and places every row by it, so a\nwrong estimate still reaches the last item. Set `measured` for rows of\ndifferent heights. Once the list draws rows of different heights, such as\nrows that wrap on a narrow screen, it places each row by its own height\nwhether `measured` is set or not.\n\nThe list follows its source. A new `items` array, an edit to the script's\ntext, or a script replaced under the same id draws the new rows. A row that\nstays in view keeps its element as the list scrolls.\n\nThe viewport scrolls on this tier. It carries `data-scroller`, and `core`\nships `[data-scroller] { overflow: auto }` into every shadow root, so\n`scrollTop` works with no stylesheet. You still need to set a block size.",
187394
+ "description": "The items arrive as data, in one of two ways:\n\n- `items` takes an array. A framework sets it as a property, and React\n hydration keeps it.\n- `for` names a `<script type=\"application/json\">` that holds an array, which\n a server sends as markup.\n\nEach item is drawn into a row in one of two ways:\n\n- `renderItem` is a function from an item and its index to the row's\n content: a Lit template, a string, or a DOM node.\n- A `<template>` child defines one row. `data-field=\"name\"` fills an element\n with the item's `name` as text, and `data-field-href=\"url\"` writes the\n item's `url` into `href`, the same for any attribute. A field may be a path\n of keys, such as `author.name`.\n\nRows are your markup in the light DOM, so your stylesheet styles them.\n\n**A grid.** `columns` lays the items out that many to a line, as a grid of\nequal columns, and windows the set a line at a time, as React Aria's grid\nlayout does. Each item draws one element, a cell of the grid, and\n`estimate` is the height of a line. Space the items with padding inside\neach one, which the list measures with the line.\n\n**Keyboard.** The list is one tab stop.\n\n| Key | What it does |\n|---|---|\n| Down, Up | Moves to the next or the previous item, or in a grid to the item in the same column on the next or the previous line. |\n| Right, Left | In a grid, moves to the next or the previous item along the line, the other way round on a right-to-left page. |\n| Home, End | Moves to the first or the last item. |\n| Page Down, Page Up | Moves by the number of items, or of lines in a grid, on screen. |\n| A letter or a word | Moves to the next item whose text starts with what you typed. |\n| Tab | Moves into the focused row's own links and buttons, then out of the list. |\n\nAn item that is not drawn is scrolled into view and focused, so a keyboard\nreaches the whole set. When the row holding the tab stop scrolls away, the\nstop moves to the first row on screen. Typing matches each item's\n`text-field`, which is the first `data-field` of the row template by default,\nor the item itself when it is a string or a number.\n\nEach row says its place in the whole set with `aria-posinset` and\n`aria-setsize`, so a screen reader says \"4,000 of 10,000\". The row holding\nfocus stays drawn when it scrolls out.\n\n**Selecting.** `selection-mode` makes the list a list box a reader chooses\nfrom: `single` selects one item and `multiple` any number. Space or a press\nselects an item, Shift with Space, an arrow, Home, End or a press takes in\nthe items from the last one chosen, and Control or Command with A selects\nthem all, in `multiple`. `value` holds the chosen items' keys, separated by\ncommas, in the order of the set: `key-field` names each item's key, and a\nstring or a number item is its own key. A change asks with\n`helix-before-change` and tells with `change`. Each row is an `option`\nmarked `aria-selected`, so a row's own links and buttons are not reached\nthere: keep those to a list without `selection-mode`.\n\n**Loading more.** `helix-range-change` fires as the items on screen change,\nand `range` holds them. `helix-load-more` fires once a reader is within one\nscreen of the end, once for each length of the set: add to `items` and it can\nfire again. While you fetch, set `loading`: the list is busy, and a row after\nthe last item says \"Loading more\" (`loading-label`, or your own content in\nthe `loading` slot). `scrollToIndex` takes a reader to an item.\n\n**An empty list.** Set `empty-label`, or put your own content in the `empty`\nslot, for a row shown when there are no items and none are loading, such as\n\"No messages yet\" and a link to write one. Without either, an empty list\nshows nothing, since a list whose items have not arrived yet has not said\nit has none.\n\nThe list takes the `empty` state while it has read its items and holds none,\nand the `loading` state while `loading` is set, so your stylesheet can\nchange the box around it for either. A list with no name is reported once\nin a development build. Name it with `label` or `aria-label`.\n\n**Row height.** Rows are placed by `estimate` until they are drawn. Then the\nlist reads the drawn rows' height once and places every row by it, so a\nwrong estimate still reaches the last item. Set `measured` for rows of\ndifferent heights. Once the list draws rows of different heights, such as\nrows that wrap on a narrow screen, it places each row by its own height\nwhether `measured` is set or not.\n\nThe list follows its source. A new `items` array, an edit to the script's\ntext, or a script replaced under the same id draws the new rows. A row that\nstays in view keeps its element as the list scrolls.\n\nThe viewport scrolls on this tier. It carries `data-scroller`, and `core`\nships `[data-scroller] { overflow: auto }` into every shadow root, so\n`scrollTop` works with no stylesheet. You still need to set a block size.",
184845
187395
  "name": "HelixHeadlessVirtualList",
184846
187396
  "cssParts": [
184847
187397
  {
@@ -185135,7 +187685,7 @@
185135
187685
  "name": "aria",
185136
187686
  "privacy": "protected",
185137
187687
  "readonly": true,
185138
- "default": "new AriaForwardController(this, { label: true, target: () => this.partNamed('viewport'), })",
187688
+ "default": "new AriaForwardController(this, { label: true, target: () => this.partNamed('viewport'), /* A list with no name is announced as a list and nothing more, and only a window of its rows is there to say what it holds. Development builds only. */ unnamed: 'Give it a `label`, or an `aria-label` that says what the items are.', })",
185139
187689
  "description": "Carries a host `aria-label` and `aria-labelledby` to the element with the `list` role."
185140
187690
  },
185141
187691
  {
@@ -186111,6 +188661,24 @@
186111
188661
  "fieldName": "value"
186112
188662
  }
186113
188663
  ],
188664
+ "cssStates": [
188665
+ {
188666
+ "description": "While the list has read its items and holds none.",
188667
+ "name": "empty"
188668
+ },
188669
+ {
188670
+ "description": "While `loading` is set.",
188671
+ "name": "loading"
188672
+ },
188673
+ {
188674
+ "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
188675
+ "name": "settled",
188676
+ "inheritedFrom": {
188677
+ "name": "HelixElement",
188678
+ "module": "src/helix-element/helix-element.ts"
188679
+ }
188680
+ }
188681
+ ],
186114
188682
  "superclass": {
186115
188683
  "name": "HelixElement",
186116
188684
  "package": "@fusion.dev/helix-core"
@@ -186134,16 +188702,6 @@
186134
188702
  },
186135
188703
  "tagName": "helix-headless-virtual-list",
186136
188704
  "customElement": true,
186137
- "cssStates": [
186138
- {
186139
- "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
186140
- "name": "settled",
186141
- "inheritedFrom": {
186142
- "name": "HelixElement",
186143
- "module": "src/helix-element/helix-element.ts"
186144
- }
186145
- }
186146
- ],
186147
188705
  "modulePath": "src/virtual-list/root/virtual-list-root.ts",
186148
188706
  "definitionPath": "src/virtual-list/root/virtual-list-root.ts"
186149
188707
  }
@@ -186170,6 +188728,6 @@
186170
188728
  ],
186171
188729
  "helix": {
186172
188730
  "package": "@fusion.dev/helix-headless",
186173
- "version": "0.155.0"
188731
+ "version": "0.157.0"
186174
188732
  }
186175
188733
  }