@fusion.dev/helix-headless 0.53.1 → 0.53.3

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 (71) hide show
  1. package/custom-elements.json +184 -193
  2. package/dist/accordion/item/accordion-item.d.ts +13 -13
  3. package/dist/accordion/root/accordion-root.d.ts +1 -1
  4. package/dist/area-chart/root/area-chart-root.js +1 -1
  5. package/dist/avatar/group/avatar-group.d.ts +11 -11
  6. package/dist/bar-chart/root/bar-chart-root.d.ts +1 -1
  7. package/dist/breadcrumbs/breadcrumb/breadcrumb.d.ts +6 -6
  8. package/dist/button/root/button-root.d.ts +1 -1
  9. package/dist/card/root/card-root.d.ts +1 -1
  10. package/dist/carousel/root/carousel-root.d.ts +19 -20
  11. package/dist/chat/composer/chat-composer.d.ts +6 -6
  12. package/dist/chat/root/chat-root.d.ts +9 -9
  13. package/dist/checkbox/root/checkbox-root.d.ts +2 -2
  14. package/dist/checkbox-group/root/checkbox-group-root.d.ts +4 -4
  15. package/dist/code-block/root/code-block-root.d.ts +5 -5
  16. package/dist/color-input/root/color-input-root.d.ts +3 -3
  17. package/dist/color-picker/root/color-picker-root.d.ts +14 -14
  18. package/dist/combobox/root/combobox-root.d.ts +9 -5
  19. package/dist/combobox/root/combobox-root.js +2 -3
  20. package/dist/command/root/command-root.d.ts +6 -7
  21. package/dist/data-table/root/data-table-root.d.ts +42 -41
  22. package/dist/data-table/root/order.d.ts +3 -3
  23. package/dist/date-input/root/date-input-root.d.ts +12 -11
  24. package/dist/dialog/root/dialog-root.d.ts +4 -4
  25. package/dist/donut-chart/root/donut-chart-root.d.ts +1 -1
  26. package/dist/drawer/root/drawer-root.d.ts +5 -5
  27. package/dist/filter-input/menu/filter-menu.d.ts +7 -1
  28. package/dist/filter-input/menu/filter-menu.js +2 -1
  29. package/dist/filter-input/root/filter-input-root.d.ts +13 -14
  30. package/dist/format-date/root/format-date-root.d.ts +6 -5
  31. package/dist/heatmap/root/heatmap-root.d.ts +11 -16
  32. package/dist/image/root/image-root.d.ts +4 -4
  33. package/dist/input/root/input-root.d.ts +7 -7
  34. package/dist/line-chart/root/line-chart-root.d.ts +1 -2
  35. package/dist/list/item/list-item.d.ts +6 -7
  36. package/dist/list/root/list-root.d.ts +4 -4
  37. package/dist/megamenu/root/megamenu-root.d.ts +4 -4
  38. package/dist/notifications/notification/notification.d.ts +10 -10
  39. package/dist/notifications/root/notifications-root.d.ts +1 -1
  40. package/dist/object-inspector/root/object-inspector-root.d.ts +10 -0
  41. package/dist/object-inspector/root/object-inspector-root.js +6 -3
  42. package/dist/option/root/option-root.d.ts +7 -8
  43. package/dist/pagination/root/pagination-root.d.ts +5 -5
  44. package/dist/pagination/size/pagination-size.d.ts +2 -1
  45. package/dist/pin-input/root/pin-input-root.d.ts +4 -4
  46. package/dist/popover/root/popover-root.d.ts +7 -6
  47. package/dist/radio/root/radio-root.d.ts +1 -1
  48. package/dist/speed-dial/root/speed-dial-root.d.ts +8 -9
  49. package/dist/stat/root/stat-root.d.ts +3 -3
  50. package/dist/steps/root/steps-root.d.ts +1 -1
  51. package/dist/steps/step/step.d.ts +5 -5
  52. package/dist/table/column/table-column.d.ts +28 -28
  53. package/dist/table/root/table-root.d.ts +14 -17
  54. package/dist/table/row/table-row.d.ts +4 -4
  55. package/dist/tabs/panel/tab-panel.d.ts +2 -2
  56. package/dist/time-input/root/time-input-root.d.ts +13 -13
  57. package/dist/time-picker/root/time-picker-root.d.ts +8 -8
  58. package/dist/toast/root/toast-root.d.ts +2 -2
  59. package/dist/toggle/root/toggle-root.d.ts +5 -5
  60. package/dist/tooltip/root/tooltip-root.d.ts +2 -2
  61. package/dist/tour/stop/tour-stop.d.ts +3 -3
  62. package/dist/tree/item/tree-item.d.ts +2 -2
  63. package/dist/tree/root/tree-root.d.ts +8 -7
  64. package/dist/tree/root/tree-root.js +1 -1
  65. package/dist/video-playlist/menu/video-playlist-menu.d.ts +7 -1
  66. package/dist/video-playlist/menu/video-playlist-menu.js +4 -2
  67. package/dist/video-playlist/root/video-playlist-root.d.ts +5 -5
  68. package/dist/video-playlist/root/video-playlist-root.js +2 -3
  69. package/package.json +5 -5
  70. package/types/jsx.d.ts +958 -990
  71. package/types/vue.d.ts +229 -244
@@ -156,7 +156,7 @@
156
156
  "text": "boolean"
157
157
  },
158
158
  "default": "false",
159
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
159
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
160
160
  "attribute": "default-open",
161
161
  "inheritedFrom": {
162
162
  "name": "MixinControllerOpen",
@@ -628,7 +628,7 @@
628
628
  "text": "boolean"
629
629
  },
630
630
  "default": "false",
631
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
631
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
632
632
  "fieldName": "defaultOpen",
633
633
  "inheritedFrom": {
634
634
  "name": "MixinControllerOpen",
@@ -705,7 +705,7 @@
705
705
  "declarations": [
706
706
  {
707
707
  "kind": "class",
708
- "description": "Holds the mode and nothing else. The item that was clicked is what\ncoordinates: it walks up to the nearest accordion, reads the mode off it, and\ncloses its peers itself.\n\nCoordination is structural, not a subscription. `helix-before-open` does not bubble\nand is not composed, because overlays nest and an inner one's lifecycle must\nnever read as the outer one's, so an accordion cannot learn that a child\nopened by listening for it.\n\nMembership resolves on demand, so there is no registry to keep in step: an\nitem added a second after render coordinates on its first click.\n\nItems are matched with `instanceof HelixHeadlessAccordionItem`, never by tag\nname. Matching `helix-accordion-item` would tie this tier to the styled one.\n\nThe keyboard listener is the controller's and is attached on connect, so\nnone of it runs on the server, where there is no tree to walk and no events\nto hear.",
708
+ "description": "Holds the mode and nothing else. The item that was clicked is what\ncoordinates: it walks up to the nearest accordion, reads the mode off it, and\ncloses its peers itself.\n\nCoordination is structural, not a subscription. `helix-before-open` does not bubble\nand is not composed, because overlays nest and an inner one's lifecycle must\nnever read as the outer one's, so an accordion cannot learn that a child\nopened by listening for it.\n\nMembership resolves on demand, so there is no registry to keep in step: an\nitem added a second after render coordinates on its first click.\n\nItems are matched with `instanceof HelixHeadlessAccordionItem`, never by tag\nname, so this tier does not learn about the styled one.\n\nThe keyboard listener is the controller's and is attached on connect, so\nnone of it runs on the server, where there is no tree to walk and no events\nto hear.",
709
709
  "name": "HelixHeadlessAccordion",
710
710
  "slots": [
711
711
  {
@@ -3271,7 +3271,7 @@
3271
3271
  "text": "number"
3272
3272
  },
3273
3273
  "default": "12",
3274
- "description": "The largest `max` the styled tier can hide past.\n\nThe fold is `:host([max=\"N\"]) ::slotted(:nth-child(n + N+1))`, one selector\nper value, because `An+B` takes a literal and no custom property can be read\ninto it. So the range is finite and this is where it is written down, in the\ntier that has to agree with it: a count that folds and a stylesheet that does\nnot would put a \"+5\" beside five avatars that are still on screen."
3274
+ "description": "The largest `max` a stylesheet can hide past.\n\nThe fold is `:host([max=\"N\"]) ::slotted(:nth-child(n + N+1))`, one selector\nper value, because `An+B` takes a literal and no custom property can be read\ninto it. So the range is finite, and it is written down beside the count that\nhas to agree with it: a count that folds and a stylesheet that does not would\nput a \"+5\" beside five avatars that are still on screen."
3275
3275
  },
3276
3276
  {
3277
3277
  "kind": "class",
@@ -3306,7 +3306,7 @@
3306
3306
  "type": {
3307
3307
  "text": "number | undefined"
3308
3308
  },
3309
- "description": "How many avatars are shown before the rest become a count.\n\nUnset shows all of them, which is what no limit means and is more useful\nthan refusing to render.\n\n**Reflected, because the fold is a stylesheet rule and nothing else.** The\nstyled tier hides past the limit with `:host([max=\"N\"]) ::slotted(:nth-child(n + N+1))`,\nso the attribute *is* the mechanism: a `max` that reaches this property and\nnever reaches the host matches no rule, and every avatar is drawn beside a\ncount claiming some are hidden. Markup is the safe path and hides the fault;\na script is the broken one, and React takes it for everyone, assigning a\nmatching property rather than an attribute.\n\n**Optional rather than defaulted, per the rule that a reflected property\ntakes no default**: `max = 0` would stamp `max=\"0\"` onto every host that\nnever asked for a limit, including on the server.",
3309
+ "description": "How many avatars are shown before the rest become a count.\n\nUnset shows all of them, which is what no limit means and is more useful\nthan refusing to render.\n\n**Reflected, because the fold is a stylesheet rule and nothing else.** A\nsheet hides past the limit one selector per value, as `FOLDS_UP_TO`\ndescribes, so the attribute *is* the mechanism: a `max` that reaches this\nproperty and never reaches the host matches no rule, and every avatar is\ndrawn beside a count claiming some are hidden. Markup is the safe path and\nhides the fault; a script is the broken one, and React takes it for\neveryone, assigning a matching property rather than an attribute.\n\n**Optional rather than defaulted, per the rule that a reflected property\ntakes no default**: `max = 0` would stamp `max=\"0\"` onto every host that\nnever asked for a limit, including on the server.",
3310
3310
  "attribute": "max",
3311
3311
  "reflects": true
3312
3312
  },
@@ -3678,7 +3678,7 @@
3678
3678
  "type": {
3679
3679
  "text": "number | undefined"
3680
3680
  },
3681
- "description": "How many avatars are shown before the rest become a count.\n\nUnset shows all of them, which is what no limit means and is more useful\nthan refusing to render.\n\n**Reflected, because the fold is a stylesheet rule and nothing else.** The\nstyled tier hides past the limit with `:host([max=\"N\"]) ::slotted(:nth-child(n + N+1))`,\nso the attribute *is* the mechanism: a `max` that reaches this property and\nnever reaches the host matches no rule, and every avatar is drawn beside a\ncount claiming some are hidden. Markup is the safe path and hides the fault;\na script is the broken one, and React takes it for everyone, assigning a\nmatching property rather than an attribute.\n\n**Optional rather than defaulted, per the rule that a reflected property\ntakes no default**: `max = 0` would stamp `max=\"0\"` onto every host that\nnever asked for a limit, including on the server.",
3681
+ "description": "How many avatars are shown before the rest become a count.\n\nUnset shows all of them, which is what no limit means and is more useful\nthan refusing to render.\n\n**Reflected, because the fold is a stylesheet rule and nothing else.** A\nsheet hides past the limit one selector per value, as `FOLDS_UP_TO`\ndescribes, so the attribute *is* the mechanism: a `max` that reaches this\nproperty and never reaches the host matches no rule, and every avatar is\ndrawn beside a count claiming some are hidden. Markup is the safe path and\nhides the fault; a script is the broken one, and React takes it for\neveryone, assigning a matching property rather than an attribute.\n\n**Optional rather than defaulted, per the rule that a reflected property\ntakes no default**: `max = 0` would stamp `max=\"0\"` onto every host that\nnever asked for a limit, including on the server.",
3682
3682
  "fieldName": "max"
3683
3683
  }
3684
3684
  ],
@@ -4839,7 +4839,7 @@
4839
4839
  "name": "--bar-chart-axis"
4840
4840
  },
4841
4841
  {
4842
- "description": "The color of the secondary axis when one series owns it. It resolves a `--helix-color-series-*` token, so on the headless tier alone it names something that is not there. #138.",
4842
+ "description": "The color of the secondary axis, where one series owns it. Written by the component from that series' `--chart-series-*`, so it promises the series color and nothing more: whatever that hook resolves to is what the axis is drawn in.",
4843
4843
  "name": "--bar-chart-secondary"
4844
4844
  },
4845
4845
  {
@@ -6398,7 +6398,7 @@
6398
6398
  "type": {
6399
6399
  "text": "string | undefined"
6400
6400
  },
6401
- "description": "Where the crumb goes, and nothing where it is the current page.\n\n**Optional and reflected, because a stylesheet does select on it.**\n`breadcrumb.css` writes `:host(:not([href])) [part=\"link\"]` to take the\nblock padding off a crumb that is not a link, so the attribute is what\ndecides how tall a crumb is. Unreflected, an `href` set from script reached\nthe property, rendered the anchor, and left the host looking unlinked: the\ncrumb drew at 20px where a markup twin drew at 28.\n\nOptional rather than defaulted, which is the general rule that a reflected\nproperty takes no default: an `href` written onto every host would be a link\nto the current page on every crumb nobody asked to be one.\n\nReading cannot catch this and the picture comparison can. React assigns a\nmatching property instead of an attribute, so every crumb in the React twin\nof `breadcrumbs/links` lost its padding at once.",
6401
+ "description": "Where the crumb goes, and nothing where it is the current page.\n\n**Optional and reflected, because a stylesheet does select on it.** A sheet\nwrites `:host(:not([href])) [part=\"link\"]` to take the block padding off a\ncrumb that is not a link, so the attribute is what decides how tall a crumb\nis. Unreflected, an `href` set from script reached the property, rendered\nthe anchor, and left the host looking unlinked: the crumb drew at 20px\nwhere a markup twin drew at 28.\n\nOptional rather than defaulted, which is the general rule that a reflected\nproperty takes no default: an `href` written onto every host would be a link\nto the current page on every crumb nobody asked to be one.\n\nReading cannot catch this and the picture comparison can. React assigns a\nmatching property instead of an attribute, so every crumb in the React twin\nof `breadcrumbs/links` lost its padding at once.",
6402
6402
  "attribute": "href",
6403
6403
  "reflects": true
6404
6404
  },
@@ -6773,7 +6773,7 @@
6773
6773
  "type": {
6774
6774
  "text": "string | undefined"
6775
6775
  },
6776
- "description": "Where the crumb goes, and nothing where it is the current page.\n\n**Optional and reflected, because a stylesheet does select on it.**\n`breadcrumb.css` writes `:host(:not([href])) [part=\"link\"]` to take the\nblock padding off a crumb that is not a link, so the attribute is what\ndecides how tall a crumb is. Unreflected, an `href` set from script reached\nthe property, rendered the anchor, and left the host looking unlinked: the\ncrumb drew at 20px where a markup twin drew at 28.\n\nOptional rather than defaulted, which is the general rule that a reflected\nproperty takes no default: an `href` written onto every host would be a link\nto the current page on every crumb nobody asked to be one.\n\nReading cannot catch this and the picture comparison can. React assigns a\nmatching property instead of an attribute, so every crumb in the React twin\nof `breadcrumbs/links` lost its padding at once.",
6776
+ "description": "Where the crumb goes, and nothing where it is the current page.\n\n**Optional and reflected, because a stylesheet does select on it.** A sheet\nwrites `:host(:not([href])) [part=\"link\"]` to take the block padding off a\ncrumb that is not a link, so the attribute is what decides how tall a crumb\nis. Unreflected, an `href` set from script reached the property, rendered\nthe anchor, and left the host looking unlinked: the crumb drew at 20px\nwhere a markup twin drew at 28.\n\nOptional rather than defaulted, which is the general rule that a reflected\nproperty takes no default: an `href` written onto every host would be a link\nto the current page on every crumb nobody asked to be one.\n\nReading cannot catch this and the picture comparison can. React assigns a\nmatching property instead of an attribute, so every crumb in the React twin\nof `breadcrumbs/links` lost its padding at once.",
6777
6777
  "fieldName": "href"
6778
6778
  },
6779
6779
  {
@@ -7791,7 +7791,7 @@
7791
7791
  "text": "string"
7792
7792
  },
7793
7793
  "default": "''",
7794
- "description": "What to send when the button is activated, and what to send it to.\n\nThe platform's invoker attributes, forwarded onto the inner `<button>`\nrather than left on the host: only a real button is recognized as an\ninvoker, so `commandfor` written on a custom element resolves nothing and\nthe trigger silently does nothing at all. A wrapper has to hand them down,\nthe same way `label` becomes `aria-label` in there.\n\n```html\n<helix-button commandfor=\"confirm\" command=\"--show\">Delete…</helix-button>\n```\n\n`commandFor` spells its attribute out, because Lit lowercases a property\nname to derive one rather than dash-casing it, and what a consumer writes\nis the platform's `commandfor`.",
7794
+ "description": "What to send when the button is activated, and what to send it to.\n\nThe platform's invoker attributes, forwarded onto the inner `<button>`\nrather than left on the host: only a real button is recognized as an\ninvoker, so `commandfor` written on a custom element resolves nothing and\nthe trigger silently does nothing at all. A wrapper has to hand them down,\nthe same way `label` becomes `aria-label` in there.\n\n```html\n<helix-headless-button commandfor=\"confirm\" command=\"--show\">Delete…</helix-headless-button>\n```\n\n`commandFor` spells its attribute out, because Lit lowercases a property\nname to derive one rather than dash-casing it, and what a consumer writes\nis the platform's `commandfor`.",
7795
7795
  "attribute": "command",
7796
7796
  "helix": {
7797
7797
  "references": [
@@ -8481,7 +8481,7 @@
8481
8481
  "text": "string"
8482
8482
  },
8483
8483
  "default": "''",
8484
- "description": "What to send when the button is activated, and what to send it to.\n\nThe platform's invoker attributes, forwarded onto the inner `<button>`\nrather than left on the host: only a real button is recognized as an\ninvoker, so `commandfor` written on a custom element resolves nothing and\nthe trigger silently does nothing at all. A wrapper has to hand them down,\nthe same way `label` becomes `aria-label` in there.\n\n```html\n<helix-button commandfor=\"confirm\" command=\"--show\">Delete…</helix-button>\n```\n\n`commandFor` spells its attribute out, because Lit lowercases a property\nname to derive one rather than dash-casing it, and what a consumer writes\nis the platform's `commandfor`.",
8484
+ "description": "What to send when the button is activated, and what to send it to.\n\nThe platform's invoker attributes, forwarded onto the inner `<button>`\nrather than left on the host: only a real button is recognized as an\ninvoker, so `commandfor` written on a custom element resolves nothing and\nthe trigger silently does nothing at all. A wrapper has to hand them down,\nthe same way `label` becomes `aria-label` in there.\n\n```html\n<helix-headless-button commandfor=\"confirm\" command=\"--show\">Delete…</helix-headless-button>\n```\n\n`commandFor` spells its attribute out, because Lit lowercases a property\nname to derive one rather than dash-casing it, and what a consumer writes\nis the platform's `commandfor`.",
8485
8485
  "fieldName": "command"
8486
8486
  },
8487
8487
  {
@@ -9153,7 +9153,7 @@
9153
9153
  "declarations": [
9154
9154
  {
9155
9155
  "kind": "class",
9156
- "description": "Regions are slots rather than separate elements, because a header, body, and\nfooter carry no state, no behavior, and no API of their own. Slotting them\ncosts one custom element instead of five and lets the consumer bring their\nown markup, so a title can be a real `<h2>` rather than an emulated one.\n\nThe host is the surface. A wrapper `<div part=\"container\">` would be a second\nbox doing nothing the host cannot: the element itself takes the border, the\nradius, and the grid, and a consumer styles `helix-card` rather than reaching\nthrough `::part`. One node instead of two, on every card on the page.\n\nName the card with `aria-label` or `aria-labelledby`. That is the only\nnaming that survives server rendering: reading a title out of the light DOM\nneeds a DOM, and the server has none.",
9156
+ "description": "Regions are slots rather than separate elements, because a header, body, and\nfooter carry no state, no behavior, and no API of their own. Slotting them\ncosts one custom element instead of five and lets the consumer bring their\nown markup, so a title can be a real `<h2>` rather than an emulated one.\n\nThe host is the surface. A wrapper `<div part=\"container\">` would be a second\nbox doing nothing the host cannot: the element itself takes the border, the\nradius, and the grid, and a consumer styles `Card` rather than reaching\nthrough `::part`. One node instead of two, on every card on the page.\n\nName the card with `aria-label` or `aria-labelledby`. That is the only\nnaming that survives server rendering: reading a title out of the light DOM\nneeds a DOM, and the server has none.",
9157
9157
  "name": "HelixHeadlessCard",
9158
9158
  "slots": [
9159
9159
  {
@@ -9707,7 +9707,7 @@
9707
9707
  "type": {
9708
9708
  "text": "number"
9709
9709
  },
9710
- "description": "The slide in view, counted from zero.\n\nReading gives the real slide, in either mode. Writing sets it, the way a\nscript assigning to a native control does. Which mode the carousel is in is\nread once, at the first update, from whether anything had declared an\n`index` by then: declared, and the consumer owns it and the carousel only\nannounces where it would have gone; not declared, and the carousel owns it\nand `default-index` says where it starts.\n\nThe same contract the four mixins carry, written out here rather than\nextracted, because a slide is addressed by position and every one of those\nmixins is keyed by a name. One consumer is not a mixin: if a second numeric\nstate turns up, this is what it is extracted from.",
9710
+ "description": "The slide in view, counted from zero.\n\nReading gives the real slide. Writing always applies, the way a script\nassigning to a native control does, and is a seed and a correction rather\nthan a claim of ownership: a consumer who wants the decision refuses the\n`helix-select`. `default-index` is where the carousel starts until\nsomething moves it.\n\nThe same contract the four mixins carry, written out here rather than\nextracted, because a slide is addressed by position and every one of those\nmixins is keyed by a name. One consumer is not a mixin: if a second numeric\nstate turns up, this is what it is extracted from.",
9711
9711
  "attribute": "index"
9712
9712
  },
9713
9713
  {
@@ -9814,7 +9814,7 @@
9814
9814
  "type": {
9815
9815
  "text": "number | 'auto' | undefined"
9816
9816
  },
9817
- "description": "How many slides are shown across the track at once. Absent shows one.\n\n**Here rather than on the styled tier, because it decides how many places\nthe track can stop.** From the stylesheet it looks like a width, one rule\nper value setting a custom property that the slides divide the track by.\nBut a carousel showing four of six slides has three positions, not six, and\neverything that counts positions is in this file. Declared up there, `goTo`\nclamps to the last *slide*, so three of the six indicators point at an\noffset the track has already reached: pressing next walks the dots to the\nend while the slides stop moving a third of the way through.\n\n**The number is published to the styles rather than enumerated by them**,\nas `--carousel-per-view` on the track, which is what keeps a width and a\ncount from disagreeing. A sheet can only name a value it wrote a rule for,\nso the styled tier enumerated `per-view=\"2\"` through `5` and called five a\njudgment; above it the pane fell back to one across while this file went on\ncounting positions. Measured in Chromium over eight slides, six across gave\nthree dots, a pane taking the whole track and five slides reachable only by\ndragging. Written from here there is no ceiling to exceed, and a consumer's\nown sheet reads the same declaration the styled one does. `runEnd` publishes\nits correction the same way and for the same reason.\n\n**On the track and not on the host.** A custom property on the host is a\nreflected attribute by another name: it would arrive on upgrade, and a\nconsumer's server markup never had it. Inside the component's own shadow\nroot it serializes with the rest of the template on the server, and the\ntrack's own declaration beats anything a consumer inherits in, so the\nattribute is the one answer to how wide a pane is.\n\nA value the track cannot honor is taken to the nearest one it can, by\n`across`, and both tiers read that rather than this.\n\n**`auto` fits as many as the track can hold**, at `--carousel-slide-min`\napiece, and nothing is written onto the track: the count is the sheet's,\nand the sheet's alone, because it is the one number here CSS can work out\nfor itself. Everything it takes is a length the sheet already has, so the\npanes are laid out at their final width by the first rule that runs, on a\nserver's markup as on the client's, and no script is waited on. That is the\nwhole reason a declared count was ever the only option: a carousel that\nasks how wide its container is can only ask on the client, so the panes go\ndown at one width and move to another when the answer arrives. Written\ninline the count would outrank the sheet that computes it, which is why an\n`auto` track is handed nothing. A count stays for the design that calls for\nexactly three.\n\nThe styled sheet says how it divides, and the headless `auto` example\ncarries the same three lines for a consumer writing their own.\n\n**A value rather than the resting behavior**, which is what the\nresponsiveness policy asks of every axis that a box decides: a splitter\nturns on `orientation=\"auto\"` and a plain one does not turn at all. Fitting\nchanges what the carousel *does*, since how many are across is how many\nplaces the track can stop, so a carousel that had not asked for it would\nfind its position count moving with the window.\n\nNo default, because it reflects. A reflected property with a value writes\nits attribute on upgrade, and the host then carries something a consumer's\nserver markup never had, which React reports as a mismatch. The one-across\ncase is the absent attribute, and the styles read it that way.",
9817
+ "description": "How many slides are shown across the track at once. Absent shows one.\n\n**Here rather than on the styled tier, because it decides how many places\nthe track can stop.** From the stylesheet it looks like a width, one rule\nper value setting a custom property that the slides divide the track by.\nBut a carousel showing four of six slides has three positions, not six, and\neverything that counts positions is in this file. Declared up there, `goTo`\nclamps to the last *slide*, so three of the six indicators point at an\noffset the track has already reached: pressing next walks the dots to the\nend while the slides stop moving a third of the way through.\n\n**The number is published to the styles rather than enumerated by them**,\nas `--carousel-per-view` on the track, which is what keeps a width and a\ncount from disagreeing. A sheet can only name a value it wrote a rule for,\nso a sheet enumerating `per-view=\"2\"` through `5` is a ceiling of five, and\nabove it the pane falls back to one across while this file goes on counting\npositions. Measured in Chromium over eight slides against such a sheet, six\nacross gave three dots, a pane taking the whole track and five slides\nreachable only by dragging. Published from here there is no ceiling to\nexceed, and every sheet reads the same declaration. `runEnd` publishes its\ncorrection the same way and for the same reason.\n\n**On the track and not on the host.** A custom property on the host is a\nreflected attribute by another name: it would arrive on upgrade, and a\nconsumer's server markup never had it. Inside the component's own shadow\nroot it serializes with the rest of the template on the server, and the\ntrack's own declaration beats anything a consumer inherits in, so the\nattribute is the one answer to how wide a pane is.\n\nA value the track cannot honor is taken to the nearest one it can, by\n`across`, and both tiers read that rather than this.\n\n**`auto` fits as many as the track can hold**, at `--carousel-slide-min`\napiece, and nothing is written onto the track: the count is the sheet's,\nand the sheet's alone, because it is the one number here CSS can work out\nfor itself. Everything it takes is a length the sheet already has, so the\npanes are laid out at their final width by the first rule that runs, on a\nserver's markup as on the client's, and no script is waited on. That is the\nwhole reason a declared count was ever the only option: a carousel that\nasks how wide its container is can only ask on the client, so the panes go\ndown at one width and move to another when the answer arrives. Written\ninline the count would outrank the sheet that computes it, which is why an\n`auto` track is handed nothing. A count stays for the design that calls for\nexactly three.\n\nA sheet says how it divides, and the `auto` example here carries the same\nthree lines for a consumer writing their own.\n\n**A value rather than the resting behavior**, which is what the\nresponsiveness policy asks of every axis that a box decides: a splitter\nturns on `orientation=\"auto\"` and a plain one does not turn at all. Fitting\nchanges what the carousel *does*, since how many are across is how many\nplaces the track can stop, so a carousel that had not asked for it would\nfind its position count moving with the window.\n\nNo default, because it reflects. A reflected property with a value writes\nits attribute on upgrade, and the host then carries something a consumer's\nserver markup never had, which React reports as a mismatch. The one-across\ncase is the absent attribute, and the styles read it that way.",
9818
9818
  "attribute": "per-view",
9819
9819
  "reflects": true
9820
9820
  },
@@ -10170,7 +10170,7 @@
10170
10170
  "text": "string | typeof nothing"
10171
10171
  }
10172
10172
  },
10173
- "description": "How far short of a whole pixel the run of slides ends, for the last one.\n\n**The run has to end on a whole pixel, because a right-to-left track cannot\nreach a fraction.** Three across 692 makes the run 450.66 longer than the\ntrack. Chromium measures a right-to-left scroller from its far end and\nfloors that length, so the track stops at -450 where a left-to-right one\nrounds to 451, and two thirds of a pixel of the slide before stays at the\nleading edge. Ending on a whole pixel, the far end is one number both ways\nand the last place rests on it in both, so a swipe to the end stops there\ntoo.\n\n**Here rather than in a stylesheet, because the count is the component's.**\nThe arithmetic wants how many slides there are, and CSS can only ask\n`sibling-count()`, which is Chromium-only, evaluates to 0 through\n`::part()`, and needs a `:last-child` that `::part()` cannot carry either.\nSo the styled tier could correct its run and a consumer writing their own\nseveral-across sheet could not: measured in Chromium at three across, the\nheadless tier rested at 451 against -450 while the styled tier rested at\none number both ways. Published from here, one declaration reading this\ngets both tiers and any consumer to the same place.\n\n**WebKit takes the margin and does not need it**, which is the reason a\ncorrection written in CSS looked like enough. It has no `sibling-count()`\nat all, so nothing reached that engine, and its track rested on one number\nboth ways anyway. Measured with the margin in place, the same widths:\nevery resting place is the number it was without it.\n\n**On the last slide alone, which is what makes that one declaration\nenough.** A sheet writes `margin-inline-end: var(--carousel-run-end, 0px)`\nacross every pane and the fallback answers on all but the last, so nothing\nhas to select a slide by its position in the run.\n\n**A sheet says how wide a pane is and how far apart they sit, and this\nreads both back.** Set neither and the correction is invalid at\ncomputed-value time, which is the fallback rather than a broken margin. The\npercentage resolves where the value is used, on the last pane, so it is the\ntrack's content box and not the track's own containing block: the width the\nrun is actually measured against.\n\nHorizontal only. A vertical track scrolls the other axis, `scrollTop`\ncounts up from zero whatever the writing mode, and there is no far end to\nfloor."
10173
+ "description": "How far short of a whole pixel the run of slides ends, for the last one.\n\n**The run has to end on a whole pixel, because a right-to-left track cannot\nreach a fraction.** Three across 692 makes the run 450.66 longer than the\ntrack. Chromium measures a right-to-left scroller from its far end and\nfloors that length, so the track stops at -450 where a left-to-right one\nrounds to 451, and two thirds of a pixel of the slide before stays at the\nleading edge. Ending on a whole pixel, the far end is one number both ways\nand the last place rests on it in both, so a swipe to the end stops there\ntoo.\n\n**Here rather than in a stylesheet, because the count is the component's.**\nThe arithmetic wants how many slides there are, and CSS can only ask\n`sibling-count()`, which is Chromium-only, evaluates to 0 through\n`::part()`, and needs a `:last-child` that `::part()` cannot carry either.\nSo a sheet shipped beside the component could correct its own run and a\nconsumer writing their own several-across sheet could not: measured in\nChromium at three across, an uncorrected track rested at 451 against -450\nwhere a corrected one rested on one number both ways. Published from here,\none declaration reading this gets every sheet to the same place.\n\n**WebKit takes the margin and does not need it**, which is the reason a\ncorrection written in CSS looked like enough. It has no `sibling-count()`\nat all, so nothing reached that engine, and its track rested on one number\nboth ways anyway. Measured with the margin in place, the same widths:\nevery resting place is the number it was without it.\n\n**On the last slide alone, which is what makes that one declaration\nenough.** A sheet writes `margin-inline-end: var(--carousel-run-end, 0px)`\nacross every pane and the fallback answers on all but the last, so nothing\nhas to select a slide by its position in the run.\n\n**A sheet says how wide a pane is and how far apart they sit, and this\nreads both back.** Set neither and the correction is invalid at\ncomputed-value time, which is the fallback rather than a broken margin. The\npercentage resolves where the value is used, on the last pane, so it is the\ntrack's content box and not the track's own containing block: the width the\nrun is actually measured against.\n\nHorizontal only. A vertical track scrolls the other axis, `scrollTop`\ncounts up from zero whatever the writing mode, and there is no far end to\nfloor."
10174
10174
  },
10175
10175
  {
10176
10176
  "kind": "field",
@@ -10522,7 +10522,7 @@
10522
10522
  "type": {
10523
10523
  "text": "number"
10524
10524
  },
10525
- "description": "The slide in view, counted from zero.\n\nReading gives the real slide, in either mode. Writing sets it, the way a\nscript assigning to a native control does. Which mode the carousel is in is\nread once, at the first update, from whether anything had declared an\n`index` by then: declared, and the consumer owns it and the carousel only\nannounces where it would have gone; not declared, and the carousel owns it\nand `default-index` says where it starts.\n\nThe same contract the four mixins carry, written out here rather than\nextracted, because a slide is addressed by position and every one of those\nmixins is keyed by a name. One consumer is not a mixin: if a second numeric\nstate turns up, this is what it is extracted from.",
10525
+ "description": "The slide in view, counted from zero.\n\nReading gives the real slide. Writing always applies, the way a script\nassigning to a native control does, and is a seed and a correction rather\nthan a claim of ownership: a consumer who wants the decision refuses the\n`helix-select`. `default-index` is where the carousel starts until\nsomething moves it.\n\nThe same contract the four mixins carry, written out here rather than\nextracted, because a slide is addressed by position and every one of those\nmixins is keyed by a name. One consumer is not a mixin: if a second numeric\nstate turns up, this is what it is extracted from.",
10526
10526
  "fieldName": "index"
10527
10527
  },
10528
10528
  {
@@ -10582,7 +10582,7 @@
10582
10582
  "type": {
10583
10583
  "text": "number | 'auto' | undefined"
10584
10584
  },
10585
- "description": "How many slides are shown across the track at once. Absent shows one.\n\n**Here rather than on the styled tier, because it decides how many places\nthe track can stop.** From the stylesheet it looks like a width, one rule\nper value setting a custom property that the slides divide the track by.\nBut a carousel showing four of six slides has three positions, not six, and\neverything that counts positions is in this file. Declared up there, `goTo`\nclamps to the last *slide*, so three of the six indicators point at an\noffset the track has already reached: pressing next walks the dots to the\nend while the slides stop moving a third of the way through.\n\n**The number is published to the styles rather than enumerated by them**,\nas `--carousel-per-view` on the track, which is what keeps a width and a\ncount from disagreeing. A sheet can only name a value it wrote a rule for,\nso the styled tier enumerated `per-view=\"2\"` through `5` and called five a\njudgment; above it the pane fell back to one across while this file went on\ncounting positions. Measured in Chromium over eight slides, six across gave\nthree dots, a pane taking the whole track and five slides reachable only by\ndragging. Written from here there is no ceiling to exceed, and a consumer's\nown sheet reads the same declaration the styled one does. `runEnd` publishes\nits correction the same way and for the same reason.\n\n**On the track and not on the host.** A custom property on the host is a\nreflected attribute by another name: it would arrive on upgrade, and a\nconsumer's server markup never had it. Inside the component's own shadow\nroot it serializes with the rest of the template on the server, and the\ntrack's own declaration beats anything a consumer inherits in, so the\nattribute is the one answer to how wide a pane is.\n\nA value the track cannot honor is taken to the nearest one it can, by\n`across`, and both tiers read that rather than this.\n\n**`auto` fits as many as the track can hold**, at `--carousel-slide-min`\napiece, and nothing is written onto the track: the count is the sheet's,\nand the sheet's alone, because it is the one number here CSS can work out\nfor itself. Everything it takes is a length the sheet already has, so the\npanes are laid out at their final width by the first rule that runs, on a\nserver's markup as on the client's, and no script is waited on. That is the\nwhole reason a declared count was ever the only option: a carousel that\nasks how wide its container is can only ask on the client, so the panes go\ndown at one width and move to another when the answer arrives. Written\ninline the count would outrank the sheet that computes it, which is why an\n`auto` track is handed nothing. A count stays for the design that calls for\nexactly three.\n\nThe styled sheet says how it divides, and the headless `auto` example\ncarries the same three lines for a consumer writing their own.\n\n**A value rather than the resting behavior**, which is what the\nresponsiveness policy asks of every axis that a box decides: a splitter\nturns on `orientation=\"auto\"` and a plain one does not turn at all. Fitting\nchanges what the carousel *does*, since how many are across is how many\nplaces the track can stop, so a carousel that had not asked for it would\nfind its position count moving with the window.\n\nNo default, because it reflects. A reflected property with a value writes\nits attribute on upgrade, and the host then carries something a consumer's\nserver markup never had, which React reports as a mismatch. The one-across\ncase is the absent attribute, and the styles read it that way.",
10585
+ "description": "How many slides are shown across the track at once. Absent shows one.\n\n**Here rather than on the styled tier, because it decides how many places\nthe track can stop.** From the stylesheet it looks like a width, one rule\nper value setting a custom property that the slides divide the track by.\nBut a carousel showing four of six slides has three positions, not six, and\neverything that counts positions is in this file. Declared up there, `goTo`\nclamps to the last *slide*, so three of the six indicators point at an\noffset the track has already reached: pressing next walks the dots to the\nend while the slides stop moving a third of the way through.\n\n**The number is published to the styles rather than enumerated by them**,\nas `--carousel-per-view` on the track, which is what keeps a width and a\ncount from disagreeing. A sheet can only name a value it wrote a rule for,\nso a sheet enumerating `per-view=\"2\"` through `5` is a ceiling of five, and\nabove it the pane falls back to one across while this file goes on counting\npositions. Measured in Chromium over eight slides against such a sheet, six\nacross gave three dots, a pane taking the whole track and five slides\nreachable only by dragging. Published from here there is no ceiling to\nexceed, and every sheet reads the same declaration. `runEnd` publishes its\ncorrection the same way and for the same reason.\n\n**On the track and not on the host.** A custom property on the host is a\nreflected attribute by another name: it would arrive on upgrade, and a\nconsumer's server markup never had it. Inside the component's own shadow\nroot it serializes with the rest of the template on the server, and the\ntrack's own declaration beats anything a consumer inherits in, so the\nattribute is the one answer to how wide a pane is.\n\nA value the track cannot honor is taken to the nearest one it can, by\n`across`, and both tiers read that rather than this.\n\n**`auto` fits as many as the track can hold**, at `--carousel-slide-min`\napiece, and nothing is written onto the track: the count is the sheet's,\nand the sheet's alone, because it is the one number here CSS can work out\nfor itself. Everything it takes is a length the sheet already has, so the\npanes are laid out at their final width by the first rule that runs, on a\nserver's markup as on the client's, and no script is waited on. That is the\nwhole reason a declared count was ever the only option: a carousel that\nasks how wide its container is can only ask on the client, so the panes go\ndown at one width and move to another when the answer arrives. Written\ninline the count would outrank the sheet that computes it, which is why an\n`auto` track is handed nothing. A count stays for the design that calls for\nexactly three.\n\nA sheet says how it divides, and the `auto` example here carries the same\nthree lines for a consumer writing their own.\n\n**A value rather than the resting behavior**, which is what the\nresponsiveness policy asks of every axis that a box decides: a splitter\nturns on `orientation=\"auto\"` and a plain one does not turn at all. Fitting\nchanges what the carousel *does*, since how many are across is how many\nplaces the track can stop, so a carousel that had not asked for it would\nfind its position count moving with the window.\n\nNo default, because it reflects. A reflected property with a value writes\nits attribute on upgrade, and the host then carries something a consumer's\nserver markup never had, which React reports as a mismatch. The one-across\ncase is the absent attribute, and the styles read it that way.",
10586
10586
  "fieldName": "perView"
10587
10587
  }
10588
10588
  ],
@@ -10834,7 +10834,7 @@
10834
10834
  "name": "handleInput",
10835
10835
  "privacy": "private",
10836
10836
  "readonly": true,
10837
- "description": "Records the draft, and stops the textarea speaking in this element's name.\n\n**The stop is not incidental.** `input` is composed by specification, so the\n`<textarea>` in this shadow root sent its own past this host and on through\nwhatever `<helix-chat>` it is slotted into, and neither element declares an\n`input`: a consumer binding one on either received an undeclared event whose\ntarget was a control they cannot reach. What a composer offers is\n`helix-send`, once, when the reader is done."
10837
+ "description": "Records the draft, and stops the textarea speaking in this element's name.\n\n**The stop is not incidental.** `input` is composed by specification, so\nthe `<textarea>` in this shadow root sent its own past this host and on\nthrough whatever `<helix-headless-chat>` it is slotted into, and neither\nelement declares an `input`: a consumer binding one on either received an\nundeclared event whose target was a control they cannot reach. What a\ncomposer offers is `helix-send`, once, when the reader is done."
10838
10838
  },
10839
10839
  {
10840
10840
  "kind": "field",
@@ -12189,7 +12189,7 @@
12189
12189
  ],
12190
12190
  "slots": [
12191
12191
  {
12192
- "description": "The turns, as `helix-chat-message` children.",
12192
+ "description": "The turns.",
12193
12193
  "name": ""
12194
12194
  },
12195
12195
  {
@@ -12281,7 +12281,7 @@
12281
12281
  "type": {
12282
12282
  "text": "boolean"
12283
12283
  },
12284
- "description": "Whether the transcript follows new turns to the bottom.\n\nThe reader's scrolling asks first: `helix-before-pin` is cancelable, so a\nconsumer refusing it takes the decision and assigns their own value.\n`default-pinned` seeds the state this element then owns, and it defaults to\npinned because a conversation opens at its most recent turn.\n\n**Not reflected, and the default is why.** A reflected property that\ndefaults to true writes its attribute on upgrade whether or not the\nconsumer wrote one, so the server serves `<helix-chat label=\"x\">` and the\nclient turns it into `<helix-chat label=\"x\" pinned>`: a hydration mismatch a\nReact consumer reports and does not patch up. Nothing needs the attribute\neither, because the one thing that changes with the pin is the way back, and\nthat is a part inside the shadow tree where a stylesheet can already reach\nit. Measured rather than assumed: `label, pinned` after upgrade against\n`label` from the server.",
12284
+ "description": "Whether the transcript follows new turns to the bottom.\n\nThe reader's scrolling asks first: `helix-before-pin` is cancelable, so a\nconsumer refusing it takes the decision and assigns their own value.\n`default-pinned` seeds the state this element then owns, and it defaults to\npinned because a conversation opens at its most recent turn.\n\n**Not reflected, and the default is why.** A reflected property that\ndefaults to true writes its attribute on upgrade whether or not the\nconsumer wrote one, so the server serves `<helix-headless-chat label=\"x\">`\nand the client turns it into `<helix-headless-chat label=\"x\" pinned>`: a\nhydration mismatch a React consumer reports and does not patch up. Nothing\nneeds the attribute either, because the one thing that changes with the pin\nis the way back, and that is a part inside the shadow tree where a\nstylesheet can already reach it. Measured rather than assumed: `label,\npinned` after upgrade against `label` from the server.",
12285
12285
  "attribute": "pinned"
12286
12286
  },
12287
12287
  {
@@ -13329,7 +13329,7 @@
13329
13329
  "type": {
13330
13330
  "text": "boolean"
13331
13331
  },
13332
- "description": "Whether the transcript follows new turns to the bottom.\n\nThe reader's scrolling asks first: `helix-before-pin` is cancelable, so a\nconsumer refusing it takes the decision and assigns their own value.\n`default-pinned` seeds the state this element then owns, and it defaults to\npinned because a conversation opens at its most recent turn.\n\n**Not reflected, and the default is why.** A reflected property that\ndefaults to true writes its attribute on upgrade whether or not the\nconsumer wrote one, so the server serves `<helix-chat label=\"x\">` and the\nclient turns it into `<helix-chat label=\"x\" pinned>`: a hydration mismatch a\nReact consumer reports and does not patch up. Nothing needs the attribute\neither, because the one thing that changes with the pin is the way back, and\nthat is a part inside the shadow tree where a stylesheet can already reach\nit. Measured rather than assumed: `label, pinned` after upgrade against\n`label` from the server.",
13332
+ "description": "Whether the transcript follows new turns to the bottom.\n\nThe reader's scrolling asks first: `helix-before-pin` is cancelable, so a\nconsumer refusing it takes the decision and assigns their own value.\n`default-pinned` seeds the state this element then owns, and it defaults to\npinned because a conversation opens at its most recent turn.\n\n**Not reflected, and the default is why.** A reflected property that\ndefaults to true writes its attribute on upgrade whether or not the\nconsumer wrote one, so the server serves `<helix-headless-chat label=\"x\">`\nand the client turns it into `<helix-headless-chat label=\"x\" pinned>`: a\nhydration mismatch a React consumer reports and does not patch up. Nothing\nneeds the attribute either, because the one thing that changes with the pin\nis the way back, and that is a part inside the shadow tree where a\nstylesheet can already reach it. Measured rather than assumed: `label,\npinned` after upgrade against `label` from the server.",
13333
13333
  "fieldName": "pinned"
13334
13334
  },
13335
13335
  {
@@ -13574,7 +13574,7 @@
13574
13574
  "name": "handleToggle",
13575
13575
  "privacy": "private",
13576
13576
  "readonly": true,
13577
- "description": "Reads a box's requested change into `value`, and says so once.\n\nThe box is found from the event's target, which does two things. It tells\nthe group which box asked, where the detail carries only the shared name.\nAnd it ignores the group's own dispatch, which lands on this same listener\nbecause the group is what it is dispatched from: without the guard the\ngroup answers itself until the stack gives out.\n\nThe requested state comes from the event rather than from the box. Driving\nthe boxes from `value` makes them controlled, so a controlled box applies\nnothing on its own and reports what it was asked for. Reading `checked`\nhere would read the state it still holds and nothing would ever change."
13577
+ "description": "Reads a box's requested change into `value`, and says so once.\n\nThe box is found from the event's target, which does two things. It tells\nthe group which box asked, where the detail carries only the shared name.\nAnd it ignores the group's own dispatch, which lands on this same listener\nbecause the group is what it is dispatched from: without the guard the\ngroup answers itself until the stack gives out.\n\nThe requested state comes from the event rather than from the box.\n`helix-before-toggle` is dispatched before the box applies, so reading\n`checked` here would read the state it still holds and nothing would ever\nchange."
13578
13578
  },
13579
13579
  {
13580
13580
  "kind": "field",
@@ -14641,7 +14641,7 @@
14641
14641
  "name": "handleLabelChange",
14642
14642
  "privacy": "private",
14643
14643
  "readonly": true,
14644
- "description": "Whether there is a label to leave room for, written to the host.\n\nThe row is a flex line with a gap in it, so a label span rendered empty is\nstill a box and still takes that gap: an unlabelled box came out with eight\npixels of nothing after it. The input answers this by not rendering the\nelement, which cannot work here, because a checkbox is named by its own\ncontent and the property is only that slot's fallback. Gating on the\nproperty would unlabel every `<helix-checkbox>Text</helix-checkbox>` ever\nwritten.\n\nSo the slot is asked instead, the same way `Tooltip` asks its own: with\n`flatten`, because here the fallback counts, being where the property\nrenders. Client only, so a server-rendered unlabelled checkbox carries the\ngap for one frame. That is a control with no accessible name, which has a\nworse problem than its spacing."
14644
+ "description": "Whether there is a label to leave room for, written to the host.\n\nThe row is a flex line with a gap in it, so a label span rendered empty is\nstill a box and still takes that gap: an unlabelled box came out with eight\npixels of nothing after it. The input answers this by not rendering the\nelement, which cannot work here, because a checkbox is named by its own\ncontent and the property is only that slot's fallback. Gating on the\nproperty would unlabel every\n`<helix-headless-checkbox>Text</helix-headless-checkbox>` ever written.\n\nSo the slot is asked instead, the same way `Tooltip` asks its own: with\n`flatten`, because here the fallback counts, being where the property\nrenders. Client only, so a server-rendered unlabelled checkbox carries the\ngap for one frame. That is a control with no accessible name, which has a\nworse problem than its spacing."
14645
14645
  },
14646
14646
  {
14647
14647
  "kind": "method",
@@ -14674,7 +14674,7 @@
14674
14674
  "text": "boolean"
14675
14675
  },
14676
14676
  "default": "false",
14677
- "description": "Initial checked state for uncontrolled use, where nothing declared one.",
14677
+ "description": "Whether the markup declared it checked, which is where a reset returns to.",
14678
14678
  "attribute": "default-checked",
14679
14679
  "inheritedFrom": {
14680
14680
  "name": "MixinControllerChecked",
@@ -15565,7 +15565,7 @@
15565
15565
  "text": "boolean"
15566
15566
  },
15567
15567
  "default": "false",
15568
- "description": "Initial checked state for uncontrolled use, where nothing declared one.",
15568
+ "description": "Whether the markup declared it checked, which is where a reset returns to.",
15569
15569
  "fieldName": "defaultChecked",
15570
15570
  "inheritedFrom": {
15571
15571
  "name": "MixinControllerChecked",
@@ -15980,7 +15980,7 @@
15980
15980
  "text": "boolean"
15981
15981
  },
15982
15982
  "default": "false",
15983
- "description": "Whether to leave the copy button off.\n\nNegative, which is not a style choice. A boolean attribute is true whenever\nit is *present*, so a `copyable` defaulting to true could never be turned\noff from markup: `copyable=\"false\"` is the string \"false\", which is\npresent, which is true. Measured, and it is why this is named the other way\nround. The platform already writes booleans like this for the same reason,\n`novalidate` and `nomodule` and `noreferrer` among them.\n\n**Reflected, because the gutter is a stylesheet rule.** `code-block.css`\nreserves the copy button's width with `:host(:not([no-copy]))`, so the\nattribute is what decides whether the block pays for a control. Unreflected,\nsetting it from script takes the button away (`render` reads the property)\nand leaves the 40px it stood in reserved.\n\nA false boolean reflects as the attribute's absence, so this costs no\n`no-copy=\"\"` on hosts that never asked for one, and the rule about a\nreflected property taking no default is satisfied by the default being\n`false`.",
15983
+ "description": "Whether to leave the copy button off.\n\nNegative, which is not a style choice. A boolean attribute is true whenever\nit is *present*, so a `copyable` defaulting to true could never be turned\noff from markup: `copyable=\"false\"` is the string \"false\", which is\npresent, which is true. Measured, and it is why this is named the other way\nround. The platform already writes booleans like this for the same reason,\n`novalidate` and `nomodule` and `noreferrer` among them.\n\n**Reflected, because the gutter is a stylesheet rule.** A sheet reserves\nthe copy button's width with `:host(:not([no-copy]))`, so the attribute is\nwhat decides whether the block pays for a control. Unreflected, setting it\nfrom script takes the button away (`render` reads the property) and leaves\nthe 40px it stood in reserved.\n\nA false boolean reflects as the attribute's absence, so this costs no\n`no-copy=\"\"` on hosts that never asked for one, and the rule about a\nreflected property taking no default is satisfied by the default being\n`false`.",
15984
15984
  "attribute": "no-copy",
15985
15985
  "reflects": true
15986
15986
  },
@@ -16561,7 +16561,7 @@
16561
16561
  "text": "boolean"
16562
16562
  },
16563
16563
  "default": "false",
16564
- "description": "Whether to leave the copy button off.\n\nNegative, which is not a style choice. A boolean attribute is true whenever\nit is *present*, so a `copyable` defaulting to true could never be turned\noff from markup: `copyable=\"false\"` is the string \"false\", which is\npresent, which is true. Measured, and it is why this is named the other way\nround. The platform already writes booleans like this for the same reason,\n`novalidate` and `nomodule` and `noreferrer` among them.\n\n**Reflected, because the gutter is a stylesheet rule.** `code-block.css`\nreserves the copy button's width with `:host(:not([no-copy]))`, so the\nattribute is what decides whether the block pays for a control. Unreflected,\nsetting it from script takes the button away (`render` reads the property)\nand leaves the 40px it stood in reserved.\n\nA false boolean reflects as the attribute's absence, so this costs no\n`no-copy=\"\"` on hosts that never asked for one, and the rule about a\nreflected property taking no default is satisfied by the default being\n`false`.",
16564
+ "description": "Whether to leave the copy button off.\n\nNegative, which is not a style choice. A boolean attribute is true whenever\nit is *present*, so a `copyable` defaulting to true could never be turned\noff from markup: `copyable=\"false\"` is the string \"false\", which is\npresent, which is true. Measured, and it is why this is named the other way\nround. The platform already writes booleans like this for the same reason,\n`novalidate` and `nomodule` and `noreferrer` among them.\n\n**Reflected, because the gutter is a stylesheet rule.** A sheet reserves\nthe copy button's width with `:host(:not([no-copy]))`, so the attribute is\nwhat decides whether the block pays for a control. Unreflected, setting it\nfrom script takes the button away (`render` reads the property) and leaves\nthe 40px it stood in reserved.\n\nA false boolean reflects as the attribute's absence, so this costs no\n`no-copy=\"\"` on hosts that never asked for one, and the rule about a\nreflected property taking no default is satisfied by the default being\n`false`.",
16565
16565
  "fieldName": "noCopy"
16566
16566
  },
16567
16567
  {
@@ -17076,7 +17076,7 @@
17076
17076
  "declarations": [
17077
17077
  {
17078
17078
  "kind": "class",
17079
- "description": "**The picker is `helix-color-picker`, not a second one written here.** It owns the\nsquare, the ramps, the eyedropper and the syntax toggle, and it is worth\nhaving on its own: a settings pane wants a picker flat on the page with\nnothing to open. This element is the field, the overlay, and the form.\nExactly the arrangement Date Input has with `helix-date-picker`.\n\n**Typed as well as picked, and the typing is the reason this is not\n`<input type=\"color\">`.** The native control gives a free picker and takes\nnearly all styling with it, which is a fair trade until a product needs the\npanel to match everything around it. What is kept from the native one is the\npart worth keeping: a real text field, so a reader who has the hex pastes it\nand never opens anything.\n\n**Every syntax is read; the one `format` names is written.** `#f00`,\n`#ff0000`, `rgb(255 0 0)`, `rgba(255,0,0,.5)`, `rgb(255 0 0 / 50%)` and\n`hsl(0 100% 50%)` are all colors, and a field that refuses one because it\nprefers another is arguing with the person using it. What the field *shows* is\nthe value itself, for the reason Date Input gives about its dates: half-typed\ninput does not survive a round trip through a formatter.\n\nThe custom property below is written by this component and never set by a\nconsumer: it carries a value this element resolved and CSS cannot, which is\nwhat lets a stylesheet on this tier paint the swatch without parsing anything\nitself.",
17079
+ "description": "**The picker is `ColorPicker`, not a second one written here.** It owns the\nsquare, the ramps, the eyedropper and the syntax toggle, and it is worth\nhaving on its own: a settings pane wants a picker flat on the page with\nnothing to open. This element is the field, the overlay, and the form.\nExactly the arrangement Date Input has with `DatePicker`.\n\n**Typed as well as picked, and the typing is the reason this is not\n`<input type=\"color\">`.** The native control gives a free picker and takes\nnearly all styling with it, which is a fair trade until a product needs the\npanel to match everything around it. What is kept from the native one is the\npart worth keeping: a real text field, so a reader who has the hex pastes it\nand never opens anything.\n\n**Every syntax is read; the one `format` names is written.** `#f00`,\n`#ff0000`, `rgb(255 0 0)`, `rgba(255,0,0,.5)`, `rgb(255 0 0 / 50%)` and\n`hsl(0 100% 50%)` are all colors, and a field that refuses one because it\nprefers another is arguing with the person using it. What the field *shows* is\nthe value itself, for the reason Date Input gives about its dates: half-typed\ninput does not survive a round trip through a formatter.\n\nThe custom property below is written by this component and never set by a\nconsumer: it carries a value this element resolved and CSS cannot, which is\nwhat lets a stylesheet on this tier paint the swatch without parsing anything\nitself.",
17080
17080
  "name": "HelixHeadlessColorInput",
17081
17081
  "cssProperties": [
17082
17082
  {
@@ -17403,7 +17403,7 @@
17403
17403
  "name": "handleSampleStart",
17404
17404
  "privacy": "private",
17405
17405
  "readonly": true,
17406
- "description": "The picker is about to take the pointer over, so the panel gets out of the\nway and comes back after.\n\n`helix-color-picker` says what it is doing rather than reaching for a panel it\ncannot know it is in. A floating panel left up during an eyedropper is one\nthe reader cannot dismiss and may well be trying to sample from underneath."
17406
+ "description": "The picker is about to take the pointer over, so the panel gets out of the\nway and comes back after.\n\n`ColorPicker` says what it is doing rather than reaching for a panel it\ncannot know it is in. A floating panel left up during an eyedropper is one\nthe reader cannot dismiss and may well be trying to sample from underneath."
17407
17407
  },
17408
17408
  {
17409
17409
  "kind": "field",
@@ -17616,7 +17616,7 @@
17616
17616
  "text": "boolean"
17617
17617
  },
17618
17618
  "default": "false",
17619
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
17619
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
17620
17620
  "attribute": "default-open",
17621
17621
  "inheritedFrom": {
17622
17622
  "name": "MixinControllerOpen",
@@ -18698,7 +18698,7 @@
18698
18698
  "text": "boolean"
18699
18699
  },
18700
18700
  "default": "false",
18701
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
18701
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
18702
18702
  "fieldName": "defaultOpen",
18703
18703
  "inheritedFrom": {
18704
18704
  "name": "MixinControllerOpen",
@@ -19298,7 +19298,7 @@
19298
19298
  "text": "boolean"
19299
19299
  },
19300
19300
  "default": "false",
19301
- "description": "Whether the form refuses to submit while no color is chosen.\n\n**A color is exactly as requirable as a date**, which is the comparison\nthat settles it: this element extends `HelixFormElement`, carries `name`\nand reports its value, so a consumer writing\n`<helix-color-picker name=\"brand\" required>` inside a form has every reason\nto expect the form to refuse an empty one. Its two siblings in the same\ncomposition position, Date Picker and Time Picker, both check it.\n\nWritten out rather than taken from `MixinField`, for the reason those two\nrecord: the mixin brings a label, a hint and a feedback region, and this is\na panel composed *into* a field that already has all three, so taking it\nwould give one control two of each. What is left is the validity call and\nthe anchor the browser points its bubble at.\n\n**Emptiness is the only fault reported, and bad input deliberately is\nnot.** The value row is typed into a character at a time and every\nkeystroke reaches `requestValue`, so `#0`, `#00` and `#00f` would each be a\nreported fault on the way to `#00ff00`. Date Picker and Time Picker can\nreport bad input because their value moves only on a commit. Color Input\nreports it for this family instead, once, against the field the reader\ntyped into.",
19301
+ "description": "Whether the form refuses to submit while no color is chosen.\n\n**A color is exactly as requirable as a date**, which is the comparison\nthat settles it: this element extends `HelixFormElement`, carries `name`\nand reports its value, so a consumer writing `<helix-headless-color-picker\nname=\"brand\" required>` inside a form has every reason to expect the form\nto refuse an empty one. Its two siblings in the same composition position,\nDate Picker and Time Picker, both check it.\n\nWritten out rather than taken from `MixinField`, for the reason those two\nrecord: the mixin brings a label, a hint and a feedback region, and this is\na panel composed *into* a field that already has all three, so taking it\nwould give one control two of each. What is left is the validity call and\nthe anchor the browser points its bubble at.\n\n**Emptiness is the only fault reported, and bad input deliberately is\nnot.** The value row is typed into a character at a time and every\nkeystroke reaches `requestValue`, so `#0`, `#00` and `#00f` would each be a\nreported fault on the way to `#00ff00`. Date Picker and Time Picker can\nreport bad input because their value moves only on a commit. Color Input\nreports it for this family instead, once, against the field the reader\ntyped into.",
19302
19302
  "attribute": "required",
19303
19303
  "reflects": true
19304
19304
  },
@@ -19464,7 +19464,7 @@
19464
19464
  "text": "void"
19465
19465
  }
19466
19466
  },
19467
- "description": "Reports the color to the form.\n\n**The one thing a form-associated element owes, and this element owed it\nfrom the start without paying.** It extends `HelixFormElement`, takes\n`MixinControllerValue` and carries `name`, so a consumer writing\n`<helix-color-picker name=\"brand\">` inside a form has every reason to\nexpect an entry, and the form carried none: no error, nothing in the\nmarkup to look at, and a field silently missing from the submission. Its\ntwo siblings in the same composition position, Color Input and Slider,\nboth report.\n\n`null` rather than an empty string where there is no color, which is the\ndifference between a control that submits nothing and one that submits a\nblank.\n\nThe verdict goes beside it, because `required` is this element's own claim\nand nothing else can answer it: a picker standing on a page has no field\naround it to check on its behalf. What it is *not* is a second opinion on\neverything else, which is why bad input is left to Color Input. See\n`required`."
19467
+ "description": "Reports the color to the form.\n\n**The one thing a form-associated element owes, and this element owed it\nfrom the start without paying.** It extends `HelixFormElement`, takes\n`MixinControllerValue` and carries `name`, so a consumer writing\n`<helix-headless-color-picker name=\"brand\">` inside a form has every reason\nto expect an entry, and the form carried none: no error, nothing in the\nmarkup to look at, and a field silently missing from the submission. Its\ntwo siblings in the same composition position, Color Input and Slider, both\nreport.\n\n`null` rather than an empty string where there is no color, which is the\ndifference between a control that submits nothing and one that submits a\nblank.\n\nThe verdict goes beside it, because `required` is this element's own claim\nand nothing else can answer it: a picker standing on a page has no field\naround it to check on its behalf. What it is *not* is a second opinion on\neverything else, which is why bad input is left to Color Input. See\n`required`."
19468
19468
  },
19469
19469
  {
19470
19470
  "kind": "method",
@@ -19609,7 +19609,7 @@
19609
19609
  }
19610
19610
  }
19611
19611
  ],
19612
- "description": "A channel's new value, read off the slider that just applied it.\n\n**Both native events, because a slider sends both and at different\nmoments.** It is one of the controls a reader edits continuously, so it\nannounces `input` all the way through a drag and `change` when the drag\nends. Listening only for the commit leaves the picker deaf while a handle\nmoves, and the hue and alpha handles do not move at all.\n\n**Read off the target rather than out of a detail.** Do not bind\n`helix-input` and `helix-change` and take the proposed value out of the\nevent: those are requests, announcing what the slider is *about* to do,\nbefore anything has moved and while a listener may still refuse it. The\nnative pair fires after the slider applied, so the value is on the element\nand cannot disagree with it.\n\nIdempotent, so taking both costs nothing: the same value applied twice is\nthe same color."
19612
+ "description": "A channel's new value, read off the slider that just applied it.\n\n**Both native events, because a slider sends both and at different\nmoments.** It is one of the controls a reader edits continuously, so it\nannounces `input` all the way through a drag and `change` when the drag\nends. Listening only for the commit leaves the picker deaf while a handle\nmoves, and the hue and alpha handles do not move at all.\n\n**Read off the target rather than out of a detail.** Do not bind `Input`\nand `helix-change` and take the proposed value out of the event: those are\nrequests, announcing what the slider is *about* to do, before anything has\nmoved and while a listener may still refuse it. The native pair fires after\nthe slider applied, so the value is on the element and cannot disagree with\nit.\n\nIdempotent, so taking both costs nothing: the same value applied twice is\nthe same color."
19613
19613
  },
19614
19614
  {
19615
19615
  "kind": "method",
@@ -20344,7 +20344,7 @@
20344
20344
  "text": "boolean"
20345
20345
  },
20346
20346
  "default": "false",
20347
- "description": "Whether the form refuses to submit while no color is chosen.\n\n**A color is exactly as requirable as a date**, which is the comparison\nthat settles it: this element extends `HelixFormElement`, carries `name`\nand reports its value, so a consumer writing\n`<helix-color-picker name=\"brand\" required>` inside a form has every reason\nto expect the form to refuse an empty one. Its two siblings in the same\ncomposition position, Date Picker and Time Picker, both check it.\n\nWritten out rather than taken from `MixinField`, for the reason those two\nrecord: the mixin brings a label, a hint and a feedback region, and this is\na panel composed *into* a field that already has all three, so taking it\nwould give one control two of each. What is left is the validity call and\nthe anchor the browser points its bubble at.\n\n**Emptiness is the only fault reported, and bad input deliberately is\nnot.** The value row is typed into a character at a time and every\nkeystroke reaches `requestValue`, so `#0`, `#00` and `#00f` would each be a\nreported fault on the way to `#00ff00`. Date Picker and Time Picker can\nreport bad input because their value moves only on a commit. Color Input\nreports it for this family instead, once, against the field the reader\ntyped into.",
20347
+ "description": "Whether the form refuses to submit while no color is chosen.\n\n**A color is exactly as requirable as a date**, which is the comparison\nthat settles it: this element extends `HelixFormElement`, carries `name`\nand reports its value, so a consumer writing `<helix-headless-color-picker\nname=\"brand\" required>` inside a form has every reason to expect the form\nto refuse an empty one. Its two siblings in the same composition position,\nDate Picker and Time Picker, both check it.\n\nWritten out rather than taken from `MixinField`, for the reason those two\nrecord: the mixin brings a label, a hint and a feedback region, and this is\na panel composed *into* a field that already has all three, so taking it\nwould give one control two of each. What is left is the validity call and\nthe anchor the browser points its bubble at.\n\n**Emptiness is the only fault reported, and bad input deliberately is\nnot.** The value row is typed into a character at a time and every\nkeystroke reaches `requestValue`, so `#0`, `#00` and `#00f` would each be a\nreported fault on the way to `#00ff00`. Date Picker and Time Picker can\nreport bad input because their value moves only on a commit. Color Input\nreports it for this family instead, once, against the field the reader\ntyped into.",
20348
20348
  "fieldName": "required"
20349
20349
  },
20350
20350
  {
@@ -20497,7 +20497,7 @@
20497
20497
  "declarations": [
20498
20498
  {
20499
20499
  "kind": "class",
20500
- "description": "**The list is `helix-listbox`, and the filtering is its own.** It owns\nnarrowing, the empty state, the highlight, `aria-activedescendant` and\nscrolling an option into view. What is left for this element is the field,\nthe panel and the traffic between them.\n\n**The text and the value are two things.** What a reader types is a filter:\nit narrows the list and is thrown away. The value is whichever option they\nthen choose, and the field is rewritten to that option's words once they\nhave. The filter is cleared on close, so a reopened control does not start\nfrom the last visit's leftovers.\n\n**Focus stays in the field, which is the whole of what a combobox is.** The\narrows move the list without leaving the text, through the listbox's public\n`navigate`. `role=\"combobox\"` is on the input rather than on a wrapper,\nbecause the thing the pattern describes is the text field.\n\n**With `multiple`, the chosen options are tags in the field**, one object per\nanswer, each with its own remove control. The panel stays open while more\nthan one can be chosen and the filter clears on each choice, so the next pick\nstarts from the whole list.\n\n**`creatable` announces, and does not write.** The options are the consumer's\nlight DOM and nothing here puts an element into it: a component that grew the\nconsumer's markup would be one their framework re-renders over. It offers the\nrow and fires the event; adding the option is the consumer's.",
20500
+ "description": "**The list is `Listbox`, and the filtering is its own.** It owns narrowing,\nthe empty state, the highlight, `aria-activedescendant` and scrolling an\noption into view. What is left for this element is the field, the panel and\nthe traffic between them.\n\n**The text and the value are two things.** What a reader types is a filter:\nit narrows the list and is thrown away. The value is whichever option they\nthen choose, and the field is rewritten to that option's words once they\nhave. The filter is cleared on close, so a reopened control does not start\nfrom the last visit's leftovers.\n\n**Focus stays in the field, which is the whole of what a combobox is.** The\narrows move the list without leaving the text, through the listbox's public\n`navigate`. `role=\"combobox\"` is on the input rather than on a wrapper,\nbecause the thing the pattern describes is the text field.\n\n**With `multiple`, the chosen options are tags in the field**, one object per\nanswer, each with its own remove control. The panel stays open while more\nthan one can be chosen and the filter clears on each choice, so the next pick\nstarts from the whole list.\n\n**`creatable` announces, and does not write.** The options are the consumer's\nlight DOM and nothing here puts an element into it: a component that grew the\nconsumer's markup would be one their framework re-renders over. It offers the\nrow and fires the event; adding the option is the consumer's.",
20501
20501
  "name": "HelixHeadlessCombobox",
20502
20502
  "cssParts": [
20503
20503
  {
@@ -20603,7 +20603,7 @@
20603
20603
  ],
20604
20604
  "slots": [
20605
20605
  {
20606
- "description": "The options, which are `helix-option` elements.",
20606
+ "description": "The options.",
20607
20607
  "name": ""
20608
20608
  },
20609
20609
  {
@@ -20955,7 +20955,7 @@
20955
20955
  "name": "handleFieldClick",
20956
20956
  "privacy": "private",
20957
20957
  "readonly": true,
20958
- "description": "Anywhere in the field opens the list, and puts the caret where typing goes.\n\nOn the field rather than on the `<input>`. The caret is a sibling of the\ninput and so is the tag strip, so a handler on the input alone leaves the\none part of the control that visibly says \"this opens\" doing nothing.\nAnything drawn inside the field is the field.\n\nA tag is the exception, because a tag is its own control: its dismiss\nremoves a choice, and opening the list on the way past would leave the\nreader looking at a panel they did not ask for. Read from the composed\npath, since the press lands on a button inside the tag's shadow root and\nthe event has retargeted by the time it arrives here.\n\nIt only ever opens. Closing is Escape, a choice, or leaving, which is what\nthe input already did and what a text field wants: a control that closed\nwhen you clicked into the middle of your own typing would be unusable."
20958
+ "description": "Anywhere in the field opens the list, and puts the caret where typing goes.\n\nOn the field rather than on the `<input>`. The caret is a sibling of the\ninput and so is the tag strip, so a handler on the input alone leaves the\none part of the control that visibly says \"this opens\" doing nothing.\nAnything drawn inside the field is the field.\n\nA tag is the exception, because a tag is its own control: its dismiss\nremoves a choice, and opening the list on the way past would leave the\nreader looking at a panel they did not ask for. Read from the composed\npath, since the press lands on a button inside the tag's shadow root and\nthe event has retargeted by the time it arrives here.\n\nIt only ever opens. Closing is Escape, a choice, or leaving, which is what\nthe input already did and what a text field wants: a control that closed\nwhen you clicked into the middle of your own typing would be unusable.\n\nThe tag is found by identity rather than by tag name. A name matches one\ntier's element and leaves the other's press falling through to the open,\nand a subclass under a third name is missed by both."
20959
20959
  },
20960
20960
  {
20961
20961
  "kind": "method",
@@ -21051,7 +21051,7 @@
21051
21051
  "text": "boolean"
21052
21052
  },
21053
21053
  "default": "false",
21054
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
21054
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
21055
21055
  "attribute": "default-open",
21056
21056
  "inheritedFrom": {
21057
21057
  "name": "MixinControllerOpen",
@@ -22373,7 +22373,7 @@
22373
22373
  "text": "boolean"
22374
22374
  },
22375
22375
  "default": "false",
22376
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
22376
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
22377
22377
  "fieldName": "defaultOpen",
22378
22378
  "inheritedFrom": {
22379
22379
  "name": "MixinControllerOpen",
@@ -22644,7 +22644,7 @@
22644
22644
  "declarations": [
22645
22645
  {
22646
22646
  "kind": "class",
22647
- "description": "**The list is `helix-listbox`, filtering and all.** Listbox already owns\nnarrowing, the empty state, the highlight over what matched,\n`aria-activedescendant`, scrolling an option into view and the keyboard that\nmoves between them. Its own note says a command palette is that list again\nwith something different opening it, and this is that something: a dialog,\nand a key that summons it.\n\n**The value is not kept.** A palette runs a command and forgets it: nothing\nhere is a form control and nothing is submitted, so what it reports is that\nan option was chosen, once, with `helix-select`. A consumer that wants the\nlast command remembered is a consumer with somewhere better to keep it.\n\n**The hotkey is global and the element does not have to be open to hear it.**\nThe listener is on the document, because the point of a palette is that it\nanswers from wherever the reader is, including from inside another control's\ntext field. `mod` is Command on a Mac and Control elsewhere, resolved here so\na consumer writes one thing.\n\nThe filter is emptied as the palette closes, for the reason Combobox and\nSelect both record: a control reopened still narrowed by the last visit's\nsearch is one whose second use starts from the first one's leftovers, and a\npalette is used far more often than either.",
22647
+ "description": "**The list is `Listbox`, filtering and all.** Listbox already owns narrowing,\nthe empty state, the highlight over what matched, `aria-activedescendant`,\nscrolling an option into view and the keyboard that moves between them. Its\nown note says a command palette is that list again with something different\nopening it, and this is that something: a dialog, and a key that summons it.\n\n**The value is not kept.** A palette runs a command and forgets it: nothing\nhere is a form control and nothing is submitted, so what it reports is that\nan option was chosen, once, with `helix-select`. A consumer that wants the\nlast command remembered is a consumer with somewhere better to keep it.\n\n**The hotkey is global and the element does not have to be open to hear it.**\nThe listener is on the document, because the point of a palette is that it\nanswers from wherever the reader is, including from inside another control's\ntext field. `mod` is Command on a Mac and Control elsewhere, resolved here so\na consumer writes one thing.\n\nThe filter is emptied as the palette closes, for the reason Combobox and\nSelect both record: a control reopened still narrowed by the last visit's\nsearch is one whose second use starts from the first one's leftovers, and a\npalette is used far more often than either.",
22648
22648
  "name": "HelixHeadlessCommand",
22649
22649
  "cssParts": [
22650
22650
  {
@@ -22702,7 +22702,7 @@
22702
22702
  ],
22703
22703
  "slots": [
22704
22704
  {
22705
- "description": "The commands, which are `helix-option` elements and their groups.",
22705
+ "description": "The commands, and any groups of them.",
22706
22706
  "name": ""
22707
22707
  },
22708
22708
  {
@@ -22838,7 +22838,7 @@
22838
22838
  "text": "boolean"
22839
22839
  },
22840
22840
  "default": "false",
22841
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
22841
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
22842
22842
  "attribute": "default-open",
22843
22843
  "inheritedFrom": {
22844
22844
  "name": "MixinControllerOpen",
@@ -23338,7 +23338,7 @@
23338
23338
  "text": "boolean"
23339
23339
  },
23340
23340
  "default": "false",
23341
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
23341
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
23342
23342
  "fieldName": "defaultOpen",
23343
23343
  "inheritedFrom": {
23344
23344
  "name": "MixinControllerOpen",
@@ -23676,7 +23676,7 @@
23676
23676
  "text": "string"
23677
23677
  },
23678
23678
  "default": "''",
23679
- "description": "What to send when the button is activated, and what to send it to.\n\nThe platform's invoker attributes, forwarded onto the inner `<button>`\nrather than left on the host: only a real button is recognized as an\ninvoker, so `commandfor` written on a custom element resolves nothing and\nthe trigger silently does nothing at all. A wrapper has to hand them down,\nthe same way `label` becomes `aria-label` in there.\n\n```html\n<helix-button commandfor=\"confirm\" command=\"--show\">Delete…</helix-button>\n```\n\n`commandFor` spells its attribute out, because Lit lowercases a property\nname to derive one rather than dash-casing it, and what a consumer writes\nis the platform's `commandfor`.",
23679
+ "description": "What to send when the button is activated, and what to send it to.\n\nThe platform's invoker attributes, forwarded onto the inner `<button>`\nrather than left on the host: only a real button is recognized as an\ninvoker, so `commandfor` written on a custom element resolves nothing and\nthe trigger silently does nothing at all. A wrapper has to hand them down,\nthe same way `label` becomes `aria-label` in there.\n\n```html\n<helix-headless-button commandfor=\"confirm\" command=\"--show\">Delete…</helix-headless-button>\n```\n\n`commandFor` spells its attribute out, because Lit lowercases a property\nname to derive one rather than dash-casing it, and what a consumer writes\nis the platform's `commandfor`.",
23680
23680
  "attribute": "command",
23681
23681
  "helix": {
23682
23682
  "references": [
@@ -24459,7 +24459,7 @@
24459
24459
  "text": "string"
24460
24460
  },
24461
24461
  "default": "''",
24462
- "description": "What to send when the button is activated, and what to send it to.\n\nThe platform's invoker attributes, forwarded onto the inner `<button>`\nrather than left on the host: only a real button is recognized as an\ninvoker, so `commandfor` written on a custom element resolves nothing and\nthe trigger silently does nothing at all. A wrapper has to hand them down,\nthe same way `label` becomes `aria-label` in there.\n\n```html\n<helix-button commandfor=\"confirm\" command=\"--show\">Delete…</helix-button>\n```\n\n`commandFor` spells its attribute out, because Lit lowercases a property\nname to derive one rather than dash-casing it, and what a consumer writes\nis the platform's `commandfor`.",
24462
+ "description": "What to send when the button is activated, and what to send it to.\n\nThe platform's invoker attributes, forwarded onto the inner `<button>`\nrather than left on the host: only a real button is recognized as an\ninvoker, so `commandfor` written on a custom element resolves nothing and\nthe trigger silently does nothing at all. A wrapper has to hand them down,\nthe same way `label` becomes `aria-label` in there.\n\n```html\n<helix-headless-button commandfor=\"confirm\" command=\"--show\">Delete…</helix-headless-button>\n```\n\n`commandFor` spells its attribute out, because Lit lowercases a property\nname to derive one rather than dash-casing it, and what a consumer writes\nis the platform's `commandfor`.",
24463
24463
  "fieldName": "command",
24464
24464
  "inheritedFrom": {
24465
24465
  "name": "HelixHeadlessButton",
@@ -24745,15 +24745,15 @@
24745
24745
  "declarations": [
24746
24746
  {
24747
24747
  "kind": "class",
24748
- "description": "**The schema is markup and the data is a property.** Columns are declared as\n`helix-table-column` children, because a schema is small and something a\nreader should see in the HTML; rows are handed over as an array, because a\ntable that draws ten thousand elements cannot window them.\n\n```html\n<helix-data-table .rows=${rows} sort=\"name:asc\" page-size=\"20\">\n <helix-table-column field=\"name\" sortable>Name</helix-table-column>\n <helix-table-column field=\"size\" align=\"end\" sortable .cell=${bytes}>Size</helix-table-column>\n</helix-data-table>\n```\n\n`helix-table` takes rows as markup and is the right component for a table of\ntwelve things a person wrote out.\n\n**Sort and filter apply to the whole set, never the page.** Sorting the drawn\nwindow is correct on the first screen and wrong on every other one.\n\n**The cell values do not server-render.** The headings do, and the row\nelements do, but reading a cell needs the columns, and the columns are markup\nchildren Lit SSR does not hand this element. So a crawler sees a table of the\nright shape with nothing in it. That is the cost of the first paragraph: use\n`helix-table` where the served HTML has to carry the values.\n\n**`selectable` adds a column of checkboxes, keyed on `row-key`.** A row is\nselected by its identity rather than its position, so a selection survives a\nsort, a filter and a page. `selected` is the chosen keys, comma separated, the\nshape Listbox uses for a multiple choice, and like `sort` it is controlled\nwhen set and seeded by `default-selected`. The box in the heading selects every\nrow in the result, across pages, and shows a dash while only some are chosen.\nChoosing one of many, rather than several, is opening a row, and that is a\nlink or a button in a cell rather than a selection.\n\n**A reader can size and order 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 order lands\nin `order` as fields, and the consumer's own markup is never rewritten: the\ntable assigns the headings to its header in that order instead.\n\n**`csv()` hands back the result as text**: every row the filter lets through,\nin the order on screen, in the columns on screen. Saving it is the page's\nbusiness, the same as any other file.\n\n**There is no `columns` attribute here, and `helix-table` has one.** The\ndifference is what a column is in each: here it is the schema, so a table\nwithout one has nothing to read a row with, and every column is a place to\nwrite a `width`. A `helix-table` holds cells a consumer wrote and can be\nwritten with no column at all, so its `columns` is where such a table is\nsized from. Written on this element the attribute is inert, which is the trap\nworth knowing when moving between the two. What both take is the CSS hook,\n`--data-table-columns` here and `--table-columns` there.",
24748
+ "description": "**The schema is markup and the data is a property.** Columns are declared as\n`TableColumn` children, because a schema is small and something a reader\nshould see in the HTML; rows are handed over as an array, because a table\nthat draws ten thousand elements cannot window them.\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\" align=\"end\" sortable .cell=${bytes}>Size</helix-headless-table-column>\n</helix-headless-data-table>\n```\n\n`Table` takes rows as markup and is the right component for a table of twelve\nthings a person wrote out.\n\n**Sort and filter apply to the whole set, never the page.** Sorting the drawn\nwindow is correct on the first screen and wrong on every other one.\n\n**The cell values do not server-render.** The headings do, and the row\nelements do, but reading a cell needs the columns, and the columns are markup\nchildren Lit SSR does not hand this element. So a crawler sees a table of the\nright shape with nothing in it. That is the cost of the first paragraph: use\n`Table` where the served HTML has to carry the values.\n\n**`selectable` adds a column of checkboxes, keyed on `row-key`.** A row is\nselected by its identity rather than its position, so a selection survives a\nsort, a filter and a page. `selected` is the chosen keys, comma separated, the\nshape Listbox uses for a multiple choice, and like `sort` writing it applies\nwhile `default-selected` is what the markup declared. The box in the heading\nselects every row in the result, across pages, and shows a dash while only\nsome are chosen.\nChoosing one of many, rather than several, is opening a row, and that is a\nlink or a button in a cell rather than a selection.\n\n**A reader can size and order 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 order lands\nin `order` as fields, and the consumer's own markup is never rewritten: the\ntable assigns the headings to its header in that order instead.\n\n**`csv()` hands back the result as text**: every row the filter lets through,\nin the order on screen, in the columns on screen. Saving it is the page's\nbusiness, the same as any other file.\n\n**There is no `columns` attribute here, and Table has one.** The difference\nis what a column is in each: here it is the schema, so a table without one\nhas nothing to read a row with, and every column is a place to write a\n`width`. A Table holds cells a consumer wrote and can be written with no\ncolumn at all, so its `columns` is where such a table is sized from. Written\non this element the attribute is inert, which is the trap worth knowing when\nmoving between the two.",
24749
24749
  "name": "HelixHeadlessDataTable",
24750
24750
  "cssProperties": [
24751
24751
  {
24752
- "description": "The edge the column a cell sits under is set to, `start`, `center` or `end`, and unset under a column that sets none. Written by the component onto each cell it draws, read by the sheet that paints one; `helix-table` publishes `--table-cell-align` for the same attribute on the cells a consumer wrote, under its own family's name.",
24752
+ "description": "The edge the column a cell sits under is set to, `start`, `center` or `end`, and unset under a column that sets none. Written by the component onto each cell it draws, read by the sheet that paints one; Table publishes `--table-cell-align` for the same attribute on the cells a consumer wrote, under its own family's name.",
24753
24753
  "name": "--data-table-cell-align"
24754
24754
  },
24755
24755
  {
24756
- "description": "The column track list this element worked out from the columns declared in it. Written by the component, read by the sheet that paints: a stylesheet takes it to lay the grid out, and setting it does nothing, because the component writes it inline on the very element that reads it and an inline declaration beats any sheet. `--data-table-columns` is the one to set.",
24756
+ "description": "The column track list this element worked out from the columns declared in it. Written by the component, read by the sheet that paints: a stylesheet takes it to lay the grid out, and setting it does nothing, because the component writes it inline on the very element that reads it and an inline declaration beats any sheet. A column's `width` is the one to set.",
24757
24757
  "name": "--data-table-template"
24758
24758
  }
24759
24759
  ],
@@ -24909,7 +24909,7 @@
24909
24909
  ],
24910
24910
  "slots": [
24911
24911
  {
24912
- "description": "The columns, declared as `helix-table-column` children.",
24912
+ "description": "The columns, declared rather than drawn.",
24913
24913
  "name": ""
24914
24914
  },
24915
24915
  {
@@ -24930,7 +24930,7 @@
24930
24930
  },
24931
24931
  "static": true,
24932
24932
  "default": "{ ...HelixElement.shadowRootOptions, slotAssignment: 'manual', }",
24933
- "description": "Nothing is assigned by name, so the columns can be put in a header row.\n\n`role=\"columnheader\"` under `role=\"grid\"` with no owning row is invalid, and\nthe columns are ordinary children a consumer writes with no `slot`. Manual\nassignment is the only way to wrap them without editing the consumer's\nmarkup, which is a change a React consumer's hydration reports and does not\npatch up. The same arrangement `helix-table` arrived at, for the same reason."
24933
+ "description": "Nothing is assigned by name, so the columns can be put in a header row.\n\n`role=\"columnheader\"` under `role=\"grid\"` with no owning row is invalid,\nand the columns are ordinary children a consumer writes with no `slot`.\nManual assignment is the only way to wrap them without editing the\nconsumer's markup, which is a change a React consumer's hydration reports\nand does not patch up. The same arrangement `Table` arrived at, for the\nsame reason."
24934
24934
  },
24935
24935
  {
24936
24936
  "kind": "field",
@@ -25112,7 +25112,7 @@
25112
25112
  "type": {
25113
25113
  "text": "number"
25114
25114
  },
25115
- "description": "How many rows a page holds. Zero is every row, which is what \"no paging\" means.\n\n**It announces nothing, and that is not an omission.** Nothing in this\nelement ever asks for a different page size: a size selector is\n`helix-pagination-size`, which a consumer puts in the `footer` slot and\nanswers themselves. Routing this through `requestChange` would announce an\nevent the element never has cause to fire.",
25115
+ "description": "How many rows a page holds. Zero is every row, which is what \"no paging\" means.\n\n**It announces nothing, and that is not an omission.** Nothing in this\nelement ever asks for a different page size: a size selector is\n`PaginationSize`, which a consumer puts in the `footer` slot and answers\nthemselves. Routing this through `requestChange` would announce an event\nthe element never has cause to fire.",
25116
25116
  "attribute": "page-size"
25117
25117
  },
25118
25118
  {
@@ -25790,7 +25790,7 @@
25790
25790
  }
25791
25791
  }
25792
25792
  ],
25793
- "description": "One cell, carrying its column's edge as a fact rather than as a decision.\n\n**A fact published rather than a property chosen**, which is what\n`helix-table` does with the same attribute: what lining up *means*, a\n`justify-content` for a value that fits or a `text-align` for one that\nwraps, belongs to whoever draws the cell. Written here as an inline\n`text-align` it was this tier choosing, in the tier that ships no CSS, and a\nconsumer could not overrule it either, an inline declaration beating any\n`::part(cell)` rule they wrote.\n\nOnly the three edges reach it, `align` being a string anybody can write and\nthis being a style attribute: `edgeOf` is that guard, and `helix-table`\nholds the same value to the same three."
25793
+ "description": "One cell, carrying its column's edge as a fact rather than as a decision.\n\n**A fact published rather than a property chosen**, which is what `Table`\ndoes with the same attribute: what lining up *means*, a `justify-content`\nfor a value that fits or a `text-align` for one that wraps, belongs to\nwhoever draws the cell. Written here as an inline `text-align` it was this\ntier choosing, in the tier that ships no CSS, and a consumer could not\noverrule it either, an inline declaration beating any `::part(cell)` rule\nthey wrote.\n\nOnly the three edges reach it, `align` being a string anybody can write and\nthis being a style attribute: `edgeOf` is that guard, and `Table` holds the\nsame value to the same three."
25794
25794
  },
25795
25795
  {
25796
25796
  "kind": "method",
@@ -26691,7 +26691,7 @@
26691
26691
  "type": {
26692
26692
  "text": "number"
26693
26693
  },
26694
- "description": "How many rows a page holds. Zero is every row, which is what \"no paging\" means.\n\n**It announces nothing, and that is not an omission.** Nothing in this\nelement ever asks for a different page size: a size selector is\n`helix-pagination-size`, which a consumer puts in the `footer` slot and\nanswers themselves. Routing this through `requestChange` would announce an\nevent the element never has cause to fire.",
26694
+ "description": "How many rows a page holds. Zero is every row, which is what \"no paging\" means.\n\n**It announces nothing, and that is not an omission.** Nothing in this\nelement ever asks for a different page size: a size selector is\n`PaginationSize`, which a consumer puts in the `footer` slot and answers\nthemselves. Routing this through `requestChange` would announce an event\nthe element never has cause to fire.",
26695
26695
  "fieldName": "pageSize"
26696
26696
  },
26697
26697
  {
@@ -26980,7 +26980,7 @@
26980
26980
  }
26981
26981
  }
26982
26982
  ],
26983
- "description": "One page of rows, clamped.\n\nA page past the end returns the last page rather than nothing, because the\nusual way to be past the end is a bookmarked link after the result shrank, and\nan empty table is a worse answer than the last page of a smaller one. The\nsame clamp `helix-pagination` already applies to what it reports."
26983
+ "description": "One page of rows, clamped.\n\nA page past the end returns the last page rather than nothing, because the\nusual way to be past the end is a bookmarked link after the result shrank,\nand an empty table is a worse answer than the last page of a smaller one. The\nsame clamp `Pagination` already applies to what it reports."
26984
26984
  },
26985
26985
  {
26986
26986
  "kind": "function",
@@ -27131,7 +27131,7 @@
27131
27131
  "declarations": [
27132
27132
  {
27133
27133
  "kind": "class",
27134
- "description": "**The calendar is `helix-date-picker`, not a second one written here.** It\nalready knows about months, ranges, disabled days, the first day of the week\nand every keyboard rule a grid owes a reader. This element is the field, the\noverlay, and the translation between them.\n\n**Typed as well as picked, and the typing is why it is not\n`<input type=\"date\">`.** The native control gives a free picker and a free\nlocale and takes almost all styling with it. What is kept from it is the part\nworth keeping: a real text field.",
27134
+ "description": "**The calendar is `DatePicker`, not a second one written here.** It already\nknows about months, ranges, disabled days, the first day of the week and\nevery keyboard rule a grid owes a reader. This element is the field, the\noverlay, and the translation between them.\n\n**Typed as well as picked, and the typing is why it is not\n`<input type=\"date\">`.** The native control gives a free picker and a free\nlocale and takes almost all styling with it. What is kept from it is the part\nworth keeping: a real text field.",
27135
27135
  "name": "HelixHeadlessDateInput",
27136
27136
  "cssParts": [
27137
27137
  {
@@ -27624,7 +27624,7 @@
27624
27624
  "text": "TemplateResult"
27625
27625
  }
27626
27626
  },
27627
- "description": "The mark on the button that opens the calendar, behind a seam.\n\nSlot fallback, so a consumer replaces it by slotting; and a method, so the\ntier above replaces it by overriding.\n\n**A named import rather than `<helix-icon>`**, which loses on three counts.\n`helix-icon` indexes the whole icon map at runtime, `icons[this.name]`, and\nno bundler can shake a runtime lookup, so every consumer of any component\nthat renders one ships all 50kB of path data; a named import ships one\npath. The import is checked when the package compiles, where a `name`\nstring is checked only by a later name lookup. And `helix-icon` is not\nregistered on the headless tier at all, which registers `helix-headless-icon`,\nso a headless consumer gets an inert unknown element and no mark whatsoever."
27627
+ "description": "The mark on the button that opens the calendar, behind a seam.\n\nSlot fallback, so a consumer replaces it by slotting; and a method, so the\ntier above replaces it by overriding.\n\n**A named import rather than `<helix-headless-icon>`**, which loses on\nthree counts. `Icon` indexes the whole icon map at runtime,\n`icons[this.name]`, and no bundler can shake a runtime lookup, so every\nconsumer of any component that renders one ships all 50kB of path data; a\nnamed import ships one path. The import is checked when the package\ncompiles, where a `name` string is checked only by a later name lookup. And\n`Icon` is not registered on the headless tier at all, which registers\n`helix-headless-icon`, so a headless consumer gets an inert unknown element\nand no mark whatsoever."
27628
27628
  },
27629
27629
  {
27630
27630
  "kind": "field",
@@ -27874,7 +27874,7 @@
27874
27874
  "text": "boolean"
27875
27875
  },
27876
27876
  "default": "false",
27877
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
27877
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
27878
27878
  "attribute": "default-open",
27879
27879
  "inheritedFrom": {
27880
27880
  "name": "MixinControllerOpen",
@@ -29199,7 +29199,7 @@
29199
29199
  "text": "boolean"
29200
29200
  },
29201
29201
  "default": "false",
29202
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
29202
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
29203
29203
  "fieldName": "defaultOpen",
29204
29204
  "inheritedFrom": {
29205
29205
  "name": "MixinControllerOpen",
@@ -32046,7 +32046,7 @@
32046
32046
  "text": "void"
32047
32047
  }
32048
32048
  },
32049
- "description": "Says no to a dismissal, by moving.\n\nA persistent dialog that ignores a press on the backdrop is\nindistinguishable from one that did not notice, and a reader's next move is\nto press again harder. A short swell and settle is the smallest thing that\nreads as \"I heard you, and no\": it is the same gesture a native alert makes\non macOS and the one every reader has already been taught.\n\nAn attribute for the length of the animation rather than a class, cleared\non `animationend`, so the styled tier decides what refusing looks like and\nthis decides only when it happens. Removed first so a second press\nrestarts it: without that, pressing twice does nothing the second time,\nwhich is the impression the whole thing exists to avoid.\n\n**`once: true` is not a release when the event cannot arrive.** Under\n`prefers-reduced-motion: reduce` the styled tier sets `animation: none`, so\nno animation runs, `animationend` never fires, and every refused press left\na listener that could not be removed and an attribute that stayed on. The\ncontroller bounds it to one listener, aborted before the next is added.\n\n**And the attribute is cleared at once when no animation is running**, asked\nof the platform rather than of a media query: this tier does not know what\nrefusing looks like, and the same silence arrives from a consumer's\nstylesheet, from reduced motion, and from no styled tier being loaded at\nall.\n\n**`CSSAnimation` specifically, because `getAnimations` returns transitions\ntoo.** A panel that is still running its entrance transition answers the\nbare `length` check with a truthy number while no animation exists to end,\nso a refusal landing inside that window took the listener branch and waited\nfor an `animationend` that was never coming: the attribute stayed on until\nthe next refused press. That is the same bug this method exists to close,\none window narrower. `getAnimations` flushes pending style itself, so no\nreflow is forced for it."
32049
+ "description": "Says no to a dismissal, by moving.\n\nA persistent dialog that ignores a press on the backdrop is\nindistinguishable from one that did not notice, and a reader's next move is\nto press again harder. A short swell and settle is the smallest thing that\nreads as \"I heard you, and no\": it is the same gesture a native alert makes\non macOS and the one every reader has already been taught.\n\nAn attribute for the length of the animation rather than a class, cleared\non `animationend`, so the styled tier decides what refusing looks like and\nthis decides only when it happens. Removed first so a second press\nrestarts it: without that, pressing twice does nothing the second time,\nwhich is the impression the whole thing exists to avoid.\n\n**`once: true` is not a release when the event cannot arrive.** A sheet\nthat sets `animation: none` under `prefers-reduced-motion: reduce` runs\nnone, so `animationend` never fires, and every refused press left a\nlistener that could not be removed and an attribute that stayed on. The\ncontroller bounds it to one listener, aborted before the next is added.\n\n**And the attribute is cleared at once when no animation is running**, asked\nof the platform rather than of a media query: this tier does not know what\nrefusing looks like, and the same silence arrives from a consumer's\nstylesheet, from reduced motion, and from no styled tier being loaded at\nall.\n\n**`CSSAnimation` specifically, because `getAnimations` returns transitions\ntoo.** A panel that is still running its entrance transition answers the\nbare `length` check with a truthy number while no animation exists to end,\nso a refusal landing inside that window took the listener branch and waited\nfor an `animationend` that was never coming: the attribute stayed on until\nthe next refused press. That is the same bug this method exists to close,\none window narrower. `getAnimations` flushes pending style itself, so no\nreflow is forced for it."
32050
32050
  },
32051
32051
  {
32052
32052
  "kind": "field",
@@ -32077,7 +32077,7 @@
32077
32077
  "text": "boolean"
32078
32078
  },
32079
32079
  "default": "false",
32080
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
32080
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
32081
32081
  "attribute": "default-open",
32082
32082
  "inheritedFrom": {
32083
32083
  "name": "MixinControllerOpen",
@@ -32567,7 +32567,7 @@
32567
32567
  "text": "boolean"
32568
32568
  },
32569
32569
  "default": "false",
32570
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
32570
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
32571
32571
  "fieldName": "defaultOpen",
32572
32572
  "inheritedFrom": {
32573
32573
  "name": "MixinControllerOpen",
@@ -33255,7 +33255,7 @@
33255
33255
  "type": {
33256
33256
  "text": "'large' | 'none' | 'small' | undefined"
33257
33257
  },
33258
- "description": "How much is left open in the middle.\n\nAbsent is a ring with room for a total in it. `small` and `large` move the\nhole without moving the outer edge, so a chart keeps its footprint.\n\n**`none` is a pie**, and it is the same drawing rather than another one:\nthe radius follows the thickness, so the inner edge reaching the center is\nwhat closing the hole means. A pie reads less accurately than a ring, angle\nbeing harder to judge than length, but it is not *misleading* the way a bar\nmeasured from anything but zero is, which is why this is a value here and\nthe bar chart's baseline is not a property at all.\n\n**Geometry rather than a CSS hook.** The dash arithmetic needs the\ncircumference, which needs the radius, and reading a custom property means\n`getComputedStyle`, which is client-only: a server would draw a different\nring than the client. A plot's proportions are markup for the same reason\n`curve` is.\n\n**And so it does not reflect**, which is the same argument read forward. No\nselector on either tier asks about it and none can want to: everything the\nthickness decides is arithmetic done here and published as\n`--donut-chart-stroke`, which is a number a rule can do sums with where the\nword is not. Reflected, it wrote a value onto every host a script had set\nit on for nothing to read. `sweep` beside it is the converse and reflects,\nbecause three rules select on it.",
33258
+ "description": "How much is left open in the middle.\n\nAbsent is a ring with room for a total in it. `small` and `large` move the\nhole without moving the outer edge, so a chart keeps its footprint.\n\n**`none` is a pie**, and it is the same drawing rather than another one:\nthe radius follows the thickness, so the inner edge reaching the center is\nwhat closing the hole means. A pie reads less accurately than a ring, angle\nbeing harder to judge than length, but it is not *misleading* the way a bar\nmeasured from anything but zero is, which is why this is a value here and\nthe bar chart's baseline is not a property at all.\n\n**Geometry rather than a CSS hook.** The dash arithmetic needs the\ncircumference, which needs the radius, and reading a custom property means\n`getComputedStyle`, which is client-only: a server would draw a different\nring than the client. A plot's proportions are markup for the same reason\n`curve` is.\n\n**And so it does not reflect**, which is the same argument read forward. No\nselector on either tier asks about it and none can want to: everything the\nthickness decides is arithmetic done here and published as\n`--donut-chart-stroke`, which is a number a rule can do sums with where the\nword is not. Reflected, it wrote a value onto every host a script had set\nit on for nothing to read. `sweep` beside it is the converse and reflects,\nbecause the styled sheet selects on it.",
33259
33259
  "attribute": "hole"
33260
33260
  },
33261
33261
  {
@@ -33879,7 +33879,7 @@
33879
33879
  "type": {
33880
33880
  "text": "'large' | 'none' | 'small' | undefined"
33881
33881
  },
33882
- "description": "How much is left open in the middle.\n\nAbsent is a ring with room for a total in it. `small` and `large` move the\nhole without moving the outer edge, so a chart keeps its footprint.\n\n**`none` is a pie**, and it is the same drawing rather than another one:\nthe radius follows the thickness, so the inner edge reaching the center is\nwhat closing the hole means. A pie reads less accurately than a ring, angle\nbeing harder to judge than length, but it is not *misleading* the way a bar\nmeasured from anything but zero is, which is why this is a value here and\nthe bar chart's baseline is not a property at all.\n\n**Geometry rather than a CSS hook.** The dash arithmetic needs the\ncircumference, which needs the radius, and reading a custom property means\n`getComputedStyle`, which is client-only: a server would draw a different\nring than the client. A plot's proportions are markup for the same reason\n`curve` is.\n\n**And so it does not reflect**, which is the same argument read forward. No\nselector on either tier asks about it and none can want to: everything the\nthickness decides is arithmetic done here and published as\n`--donut-chart-stroke`, which is a number a rule can do sums with where the\nword is not. Reflected, it wrote a value onto every host a script had set\nit on for nothing to read. `sweep` beside it is the converse and reflects,\nbecause three rules select on it.",
33882
+ "description": "How much is left open in the middle.\n\nAbsent is a ring with room for a total in it. `small` and `large` move the\nhole without moving the outer edge, so a chart keeps its footprint.\n\n**`none` is a pie**, and it is the same drawing rather than another one:\nthe radius follows the thickness, so the inner edge reaching the center is\nwhat closing the hole means. A pie reads less accurately than a ring, angle\nbeing harder to judge than length, but it is not *misleading* the way a bar\nmeasured from anything but zero is, which is why this is a value here and\nthe bar chart's baseline is not a property at all.\n\n**Geometry rather than a CSS hook.** The dash arithmetic needs the\ncircumference, which needs the radius, and reading a custom property means\n`getComputedStyle`, which is client-only: a server would draw a different\nring than the client. A plot's proportions are markup for the same reason\n`curve` is.\n\n**And so it does not reflect**, which is the same argument read forward. No\nselector on either tier asks about it and none can want to: everything the\nthickness decides is arithmetic done here and published as\n`--donut-chart-stroke`, which is a number a rule can do sums with where the\nword is not. Reflected, it wrote a value onto every host a script had set\nit on for nothing to read. `sweep` beside it is the converse and reflects,\nbecause the styled sheet selects on it.",
33883
33883
  "fieldName": "hole"
33884
33884
  },
33885
33885
  {
@@ -34006,7 +34006,7 @@
34006
34006
  "declarations": [
34007
34007
  {
34008
34008
  "kind": "class",
34009
- "description": "Takes `MixinControllerOpen`, so `open`, `defaultOpen` and the\n`helix-before-open` and `helix-before-close` requests behave exactly as they\ndo on an accordion item, and a consumer already knows the API.\n\nModal by default, which is three things together and not one: focus is\ntrapped inside, Escape and an outside press close it, and the page behind is\ncovered. A panel with the look of a modal and none of its behavior is worse\nthan an inline one, because it invites the reader to treat it as blocking.\n\nContent stays mounted when closed, so it is in the server's markup and can\nanimate. A closed `<dialog>` is already out of the tab order and out of the\naccessibility tree, so nothing here writes `inert`. The `role`, the\n`aria-modal` and the scrim come from the element too, and\n`drawer-root.ssr.spec.ts` asserts the panel carries no hand-written `inert`\nand no hand-written `role`.\n\nOpened declaratively with the platform's invoker attributes:\n\n```html\n<helix-button commandfor=\"nav\" command=\"--toggle\">Menu</helix-button>\n<helix-drawer id=\"nav\">…</helix-drawer>\n```",
34009
+ "description": "Takes `MixinControllerOpen`, so `open`, `defaultOpen` and the\n`helix-before-open` and `helix-before-close` requests behave exactly as they\ndo on an accordion item, and a consumer already knows the API.\n\nModal by default, which is three things together and not one: focus is\ntrapped inside, Escape and an outside press close it, and the page behind is\ncovered. A panel with the look of a modal and none of its behavior is worse\nthan an inline one, because it invites the reader to treat it as blocking.\n\nContent stays mounted when closed, so it is in the server's markup and can\nanimate. A closed `<dialog>` is already out of the tab order and out of the\naccessibility tree, so nothing here writes `inert`. The `role`, the\n`aria-modal` and the scrim come from the element too, and\n`drawer-root.ssr.spec.ts` asserts the panel carries no hand-written `inert`\nand no hand-written `role`.\n\nOpened declaratively with the platform's invoker attributes:\n\n```html\n<helix-headless-button commandfor=\"nav\" command=\"--toggle\">Menu</helix-headless-button>\n<helix-headless-drawer id=\"nav\">…</helix-headless-drawer>\n```",
34010
34010
  "name": "HelixHeadlessDrawer",
34011
34011
  "cssParts": [
34012
34012
  {
@@ -34076,7 +34076,7 @@
34076
34076
  "type": {
34077
34077
  "text": "'start' | 'end' | 'top' | 'bottom' | undefined"
34078
34078
  },
34079
- "description": "Which edge the drawer comes from.\n\nUnset is `end`, which the styled tier reads as `:host(:not([placement]))`\nbeside `:host([placement=\"end\"])` rather than as a value written here: a\ndefault assigned to the property would reflect onto every host and put a\n`placement=\"end\"` into markup no consumer wrote.",
34079
+ "description": "Which edge the drawer comes from.\n\nUnset is `end`, and it stays unset rather than being written down: a\ndefault assigned to the property would reflect onto every host and put a\n`placement=\"end\"` into markup no consumer wrote. So what this tier\nguarantees is the absence, and a sheet selects on it.",
34080
34080
  "attribute": "placement",
34081
34081
  "reflects": true
34082
34082
  },
@@ -34149,7 +34149,7 @@
34149
34149
  "text": "boolean"
34150
34150
  },
34151
34151
  "default": "false",
34152
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
34152
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
34153
34153
  "attribute": "default-open",
34154
34154
  "inheritedFrom": {
34155
34155
  "name": "MixinControllerOpen",
@@ -34626,7 +34626,7 @@
34626
34626
  "type": {
34627
34627
  "text": "'start' | 'end' | 'top' | 'bottom' | undefined"
34628
34628
  },
34629
- "description": "Which edge the drawer comes from.\n\nUnset is `end`, which the styled tier reads as `:host(:not([placement]))`\nbeside `:host([placement=\"end\"])` rather than as a value written here: a\ndefault assigned to the property would reflect onto every host and put a\n`placement=\"end\"` into markup no consumer wrote.",
34629
+ "description": "Which edge the drawer comes from.\n\nUnset is `end`, and it stays unset rather than being written down: a\ndefault assigned to the property would reflect onto every host and put a\n`placement=\"end\"` into markup no consumer wrote. So what this tier\nguarantees is the absence, and a sheet selects on it.",
34630
34630
  "fieldName": "placement"
34631
34631
  },
34632
34632
  {
@@ -34647,7 +34647,7 @@
34647
34647
  "text": "boolean"
34648
34648
  },
34649
34649
  "default": "false",
34650
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
34650
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
34651
34651
  "fieldName": "defaultOpen",
34652
34652
  "inheritedFrom": {
34653
34653
  "name": "MixinControllerOpen",
@@ -39205,7 +39205,7 @@
39205
39205
  "type": {
39206
39206
  "text": "HelixHeadlessFilterField[]"
39207
39207
  },
39208
- "description": "The fields declared inside this, in the order they were written.\n\nWhat a render may know of them: none on a server, whose shim has no tree\nand threw here, and none while hydrating what one sent.",
39208
+ "description": "The fields declared inside this, in the order they were written.\n\nWhat a render may know of them: none on a server, whose shim has no tree\nand threw here, and none while hydrating what one sent.\n\nBy identity rather than by tag. A list of names can only hold the tags this\npackage knows about, so it misses any third one, which is what subclassing\na headless element produces, and it is also how a headless package learns a\nstyled tag. `instanceof` answers for every one of them and proves the type\nthe signature claims.",
39209
39209
  "readonly": true
39210
39210
  },
39211
39211
  {
@@ -40179,7 +40179,7 @@
40179
40179
  "declarations": [
40180
40180
  {
40181
40181
  "kind": "class",
40182
- "description": "**The tokens are the consumer's own elements, slotted.** What a filter narrows\nby belongs to the consumer's model rather than to this element: a facet with a\nprefix, a saved query, a range. So they are slotted rather than rendered from\na list of strings, and removing one is a request this element makes rather\nthan a change it applies. Combobox is the other way round, and that is the\ndifference between the two: its tokens are a view of a selection it owns,\ndrawn from options it was handed.\n\n**`value` is the text being typed, not the tokens**, which is what makes this\na field a consumer can listen to. Every keystroke announces `input` with the\ntext on the element, so a table narrows as the reader types. The tokens need\nno reporting back, being markup the consumer already holds.\n\nBackspace on an empty field asks the last token to go, through the same\n`helix-dismiss` its own remove control fires, so a consumer who handled the\npointer has already handled the keyboard.\n\n**It reads what was declared, and nothing that was not.** Write\n`FilterField`s (usually inside the `FilterMenu` slotted into `start`, so the\npicker and the text work off one set), and Enter reads the box against them:\n`disposition:refunded,settled` and `-disposition:refunded` announce\n`helix-facet`, exactly as ticking those values in the picker would, and the\ntext they were read from goes. Everything else stays where it was typed, so\n`refund tuesday disposition:settled` is a filter and a search at once.\n`grammar.ts` carries the whole rule and is worth reading before relying on it;\nthe short version is that Helix owns the punctuation and the consumer owns\nevery word in it. A field with no `FilterField` in it parses nothing, which is\nthe behavior this had before it could.\n\n**A field whose values cannot be listed belongs here rather than in the\npicker.** `assignee:ada` is a filter and nobody wants to enumerate every name\nin the company, but a menu page for it would have nothing on it to press.\nWritten directly inside this element it is read by the grammar and never\noffered as a page: unslotted, so nothing draws it, which is the same trick\n`FilterField` already plays on its own children.\n\n**It can suggest what to type next, and deciding what to suggest is still the\nconsumer's.** Slot `helix-option` elements into `suggestions` and the field\nshows them, moves through them with the arrows, and lets Enter press one; the\noption fires its own `helix-select` and the consumer decides what choosing\nmeant. Keys before a colon and values after it are the same panel with\ndifferent contents, and `readFilterText` is exported for a consumer narrowing\nthat panel against what a reader has half typed.\n\n**The panel opens when there is something in it and closes when there is\nnot**, rather than on a choice. A reader who picks a key wants its values\nnext, and closing on the choice would shut the panel between two renders. Use\n`selectionStart` and `setSelectionRange` to write a completion back and put\nthe caret after it, or the next parse reads the wrong term.\n\n**Three things here have three different owners, and only one of them is a\ncontrolled property.**\n\n`value` is the text, and it is uncontrolled by default: the reader types, the\nelement applies it, and `input` says so. **Writing `value` does not take that\nover.** It is a seed and a correction, so a consumer who sets it and then\nexpects the field to hold still will watch the next keystroke overwrite them.\nOwnership is taken by refusing `helix-before-change` and writing the value\nyou want, which is the same shape every field in this library uses and is\nworth saying out loud here because the property looks like React's.\n`default-value` seeds the field without claiming anything.\n\n`open` is the suggestions panel, and it is the ordinary controlled pair:\nrefuse `helix-before-open` or `helix-before-close` to take the decision, and\n`default-open` to seed it.\n\nThe tokens are neither, because they are not state. They are the consumer's\nown elements in a slot, so there is nothing for this to own and nothing to\nreport back: a token goes when the consumer removes it from their markup,\nhaving been asked by `helix-dismiss`. **A `FilterChip` naming a declared field\nis asked differently**, and it has to be: the picker holds what is ticked, so\na chip that removed itself without telling it left the value ticked in a list\nnobody could see was wrong. That dismissal is answered as the field being\nfiltered by nothing, so it arrives as `helix-facet` like every other change\nand the chip goes because the filter went.",
40182
+ "description": "**The tokens are the consumer's own elements, slotted.** What a filter narrows\nby belongs to the consumer's model rather than to this element: a facet with a\nprefix, a saved query, a range. So they are slotted rather than rendered from\na list of strings, and removing one is a request this element makes rather\nthan a change it applies. Combobox is the other way round, and that is the\ndifference between the two: its tokens are a view of a selection it owns,\ndrawn from options it was handed.\n\n**`value` is the text being typed, not the tokens**, which is what makes this\na field a consumer can listen to. Every keystroke announces `input` with the\ntext on the element, so a table narrows as the reader types. The tokens need\nno reporting back, being markup the consumer already holds.\n\nBackspace on an empty field asks the last token to go, through the same\n`helix-dismiss` its own remove control fires, so a consumer who handled the\npointer has already handled the keyboard.\n\n**It reads what was declared, and nothing that was not.** Write\n`FilterField`s (usually inside the `FilterMenu` slotted into `start`, so the\npicker and the text work off one set), and Enter reads the box against them:\n`disposition:refunded,settled` and `-disposition:refunded` announce\n`helix-facet`, exactly as ticking those values in the picker would, and the\ntext they were read from goes. Everything else stays where it was typed, so\n`refund tuesday disposition:settled` is a filter and a search at once.\n`grammar.ts` carries the whole rule and is worth reading before relying on it;\nthe short version is that Helix owns the punctuation and the consumer owns\nevery word in it. A field with no `FilterField` in it parses nothing, which is\nthe behavior this had before it could.\n\n**A field whose values cannot be listed belongs here rather than in the\npicker.** `assignee:ada` is a filter and nobody wants to enumerate every name\nin the company, but a menu page for it would have nothing on it to press.\nWritten directly inside this element it is read by the grammar and never\noffered as a page: unslotted, so nothing draws it, which is the same trick\n`FilterField` already plays on its own children.\n\n**It can suggest what to type next, and deciding what to suggest is still the\nconsumer's.** Slot options into `suggestions` and the field shows them, moves\nthrough them with the arrows, and lets Enter press one; the option fires its\nown `helix-select` and the consumer decides what choosing meant. Keys before\na colon and values after it are the same panel with different contents, and\n`readFilterText` is exported for a consumer narrowing that panel against what\na reader has half typed.\n\n**The panel opens when there is something in it and closes when there is\nnot**, rather than on a choice. A reader who picks a key wants its values\nnext, and closing on the choice would shut the panel between two renders. Use\n`selectionStart` and `setSelectionRange` to write a completion back and put\nthe caret after it, or the next parse reads the wrong term.\n\n**Three things here have three different owners.**\n\n`value` is the text: the reader types, the element applies it, and `input`\nsays so. **Writing `value` does not take that over.** It is a seed and a\ncorrection, so a consumer who sets it and then expects the field to hold\nstill will watch the next keystroke overwrite them.\nOwnership is taken by refusing `helix-before-change` and writing the value\nyou want, which is the same shape every field in this library uses and is\nworth saying out loud here because the property looks like React's.\n`default-value` seeds the field without claiming anything.\n\n`open` is the suggestions panel, and it is the ordinary pair: refuse\n`helix-before-open` or `helix-before-close` to take the decision, and\n`default-open` to seed it.\n\nThe tokens are neither, because they are not state. They are the consumer's\nown elements in a slot, so there is nothing for this to own and nothing to\nreport back: a token goes when the consumer removes it from their markup,\nhaving been asked by `helix-dismiss`. **A `FilterChip` naming a declared field\nis asked differently**, and it has to be: the picker holds what is ticked, so\na chip that removed itself without telling it left the value ticked in a list\nnobody could see was wrong. That dismissal is answered as the field being\nfiltered by nothing, so it arrives as `helix-facet` like every other change\nand the chip goes because the filter went.",
40183
40183
  "name": "HelixHeadlessFilterInput",
40184
40184
  "cssParts": [
40185
40185
  {
@@ -40715,7 +40715,7 @@
40715
40715
  "text": "boolean"
40716
40716
  },
40717
40717
  "default": "false",
40718
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
40718
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
40719
40719
  "attribute": "default-open",
40720
40720
  "inheritedFrom": {
40721
40721
  "name": "MixinControllerOpen",
@@ -41958,7 +41958,7 @@
41958
41958
  "text": "boolean"
41959
41959
  },
41960
41960
  "default": "false",
41961
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
41961
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
41962
41962
  "fieldName": "defaultOpen",
41963
41963
  "inheritedFrom": {
41964
41964
  "name": "MixinControllerOpen",
@@ -42245,7 +42245,7 @@
42245
42245
  "text": "string"
42246
42246
  },
42247
42247
  "default": "''",
42248
- "description": "The timestamp, as anything `Date` parses.\n\nAn ISO string is what an API sends and what `<time datetime>` takes, so it\nis the shape that needs no translation at either end. Left unset this\nrenders nothing rather than the epoch, which is what parsing an empty string\nwould give.\n\n**The element's own text is read as a fallback, and only in a browser.**\n`<helix-format-date elapsed>2026-08-27T01:00:00Z</helix-format-date>` is the\nspelling that reads best in markup, and it cannot be the only one: measured\nagainst Lit's server shim, `textContent`, `children`, `firstChild` and\n`querySelector` are all `undefined` there, so a server has no way to see it.\nAn element rendered on a server needs the attribute; one rendered in a\nbrowser may use either.",
42248
+ "description": "The timestamp, as anything `Date` parses.\n\nAn ISO string is what an API sends and what `<time datetime>` takes, so it\nis the shape that needs no translation at either end. Left unset this\nrenders nothing rather than the epoch, which is what parsing an empty string\nwould give.\n\n**The element's own text is read as a fallback, and only in a browser.**\n`<helix-headless-format-date\nelapsed>2026-08-27T01:00:00Z</helix-headless-format-date>` is the spelling\nthat reads best in markup, and it cannot be the only one: measured against\nLit's server shim, `textContent`, `children`, `firstChild` and\n`querySelector` are all `undefined` there, so a server has no way to see\nit. An element rendered on a server needs the attribute; one rendered in a\nbrowser may use either.",
42249
42249
  "attribute": "date"
42250
42250
  },
42251
42251
  {
@@ -42772,7 +42772,7 @@
42772
42772
  "text": "string"
42773
42773
  },
42774
42774
  "default": "''",
42775
- "description": "The timestamp, as anything `Date` parses.\n\nAn ISO string is what an API sends and what `<time datetime>` takes, so it\nis the shape that needs no translation at either end. Left unset this\nrenders nothing rather than the epoch, which is what parsing an empty string\nwould give.\n\n**The element's own text is read as a fallback, and only in a browser.**\n`<helix-format-date elapsed>2026-08-27T01:00:00Z</helix-format-date>` is the\nspelling that reads best in markup, and it cannot be the only one: measured\nagainst Lit's server shim, `textContent`, `children`, `firstChild` and\n`querySelector` are all `undefined` there, so a server has no way to see it.\nAn element rendered on a server needs the attribute; one rendered in a\nbrowser may use either.",
42775
+ "description": "The timestamp, as anything `Date` parses.\n\nAn ISO string is what an API sends and what `<time datetime>` takes, so it\nis the shape that needs no translation at either end. Left unset this\nrenders nothing rather than the epoch, which is what parsing an empty string\nwould give.\n\n**The element's own text is read as a fallback, and only in a browser.**\n`<helix-headless-format-date\nelapsed>2026-08-27T01:00:00Z</helix-headless-format-date>` is the spelling\nthat reads best in markup, and it cannot be the only one: measured against\nLit's server shim, `textContent`, `children`, `firstChild` and\n`querySelector` are all `undefined` there, so a server has no way to see\nit. An element rendered on a server needs the attribute; one rendered in a\nbrowser may use either.",
42776
42776
  "fieldName": "date"
42777
42777
  },
42778
42778
  {
@@ -43137,26 +43137,6 @@
43137
43137
  "description": "**One family covers both readings.** `rows=\"1\"` is a status strip, `rows=\"7\"`\nis a contribution graph, and a cell that takes a tone covers both: GitHub's\ncontribution graph is five discrete levels rather than a gradient.\n\n**What it cannot be is a bar chart with flat values**, and the data model is\nwhat closes that: chart color is per *series* everywhere else here, so ninety\ndifferently colored cells would be ninety series.\n\n**The data is a real `<table>` named by `for`**, the convention every chart\nin this library uses, and it is the accessible representation. Hide it with\n`data-hidden-visually` and the reading is still there.\n\nA cell takes its tone from its own `data-tone`, or from `thresholds` and\n`tones` bucketing its value. The cell's own wins, so a page that already\nknows a day was degraded does not encode that as a number to be decoded.\n\n**A tone is a name this tier never resolves.** `tone=\"success\"` writes\n`--heatmap-tone: var(--heatmap-tone-success)` and stops, so what a name is\nworth is the answering tier's to say. Reaching for `var(--helix-color-*)`\nhere is the dependency the tiers exist to prevent.",
43138
43138
  "name": "HelixHeadlessHeatmap",
43139
43139
  "cssProperties": [
43140
- {
43141
- "description": "How tall a cell is. A row of a tall thin cell is what a status page draws.",
43142
- "name": "--heatmap-cell-height"
43143
- },
43144
- {
43145
- "description": "How wide a cell is. The strip fits as many as the container allows.",
43146
- "name": "--heatmap-cell-inline-size"
43147
- },
43148
- {
43149
- "description": "How far a cell's corners are rounded.",
43150
- "name": "--heatmap-cell-radius"
43151
- },
43152
- {
43153
- "description": "The size a cell wants on both axes, where neither is given its own.",
43154
- "name": "--heatmap-cell-size"
43155
- },
43156
- {
43157
- "description": "Space between cells. Zero is a continuous field rather than a grid of tiles.",
43158
- "name": "--heatmap-gap"
43159
- },
43160
43140
  {
43161
43141
  "description": "How many rows the strip lays out. Written by the component from the data, read by the tier that draws it.",
43162
43142
  "name": "--heatmap-rows"
@@ -43350,7 +43330,7 @@
43350
43330
  "text": "number"
43351
43331
  },
43352
43332
  "default": "8",
43353
- "description": "The smallest a cell may get before the strip draws fewer of them, in CSS pixels.\n\n**Set this only to overrule what the strip actually draws.** The arithmetic\nneeds a width in pixels and the width is a length the stylesheet resolves,\nso a number written here that disagrees with the sheet is a promise the\nconsumer has to keep by hand, and the one number a summary is told to trust\nis the one it gets wrong.\n\nThe strip measures itself, so `--heatmap-cell-inline-size` and `--heatmap-gap` are\nenough on their own and these two are the estimate used until the first\nmeasurement lands. Writing the attribute pins the value and stops the\nmeasurement being consulted, which is what a container query or a transition\non the cell size wants, where what is drawn this frame is not what the\narithmetic should plan around.\n\nZero turns the dropping off altogether, which is right for a strip in a\ncontainer that cannot get narrow.",
43333
+ "description": "The smallest a cell may get before the strip draws fewer of them, in CSS pixels.\n\n**Set this only to overrule what the strip actually draws.** The arithmetic\nneeds a width in pixels and the width is a length the stylesheet resolves,\nso a number written here that disagrees with the sheet is a promise the\nconsumer has to keep by hand, and the one number a summary is told to trust\nis the one it gets wrong.\n\nThe strip measures itself, so sizing the cells in a sheet is enough on its\nown and these two are the estimate used until the first measurement lands.\nWriting the attribute pins the value and stops the measurement being\nconsulted, which is what a container query or a transition on the cell size\nwants, where what is drawn this frame is not what the arithmetic should\nplan around.\n\nZero turns the dropping off altogether, which is right for a strip in a\ncontainer that cannot get narrow.",
43354
43334
  "attribute": "min-cell"
43355
43335
  },
43356
43336
  {
@@ -43410,7 +43390,7 @@
43410
43390
  },
43411
43391
  "privacy": "private",
43412
43392
  "default": "undefined",
43413
- "description": "The cell and gap the strip is drawing, in pixels, once it has been read.\n\n**The arithmetic's inputs are a stylesheet's decisions, so the honest way to\nlearn them is to ask the stylesheet.** A cell's size is a length that only\nthe cascade can resolve: it may be a `rem` against a root font size, a\npercentage of a container, or whatever a container query chose this frame.\nEvery one of those is invisible to a number typed into an attribute, and\neach of `--heatmap-cell-inline-size`, `--heatmap-cell-height` and `--heatmap-gap`\nadded one more way for the two to drift apart silently.\n\nReading it back is not styling and does not breach the tier: this asks what\nwas decided rather than deciding, which is the same direction as the facts\nthis component writes out as custom properties, run backwards."
43393
+ "description": "The cell and gap the strip is drawing, in pixels, once it has been read.\n\n**The arithmetic's inputs are a stylesheet's decisions, so the honest way\nto learn them is to ask the stylesheet.** A cell's size is a length that\nonly the cascade can resolve: it may be a `rem` against a root font size, a\npercentage of a container, or whatever a container query chose this frame.\nEvery one of those is invisible to a number typed into an attribute, and\nevery hook a sheet offers for the cell box or the gap is one more way for\nthe two to drift apart silently.\n\nReading it back is not styling and does not breach the tier: this asks what\nwas decided rather than deciding, which is the same direction as the facts\nthis component writes out as custom properties, run backwards."
43414
43394
  },
43415
43395
  {
43416
43396
  "kind": "field",
@@ -44057,7 +44037,7 @@
44057
44037
  "text": "number"
44058
44038
  },
44059
44039
  "default": "8",
44060
- "description": "The smallest a cell may get before the strip draws fewer of them, in CSS pixels.\n\n**Set this only to overrule what the strip actually draws.** The arithmetic\nneeds a width in pixels and the width is a length the stylesheet resolves,\nso a number written here that disagrees with the sheet is a promise the\nconsumer has to keep by hand, and the one number a summary is told to trust\nis the one it gets wrong.\n\nThe strip measures itself, so `--heatmap-cell-inline-size` and `--heatmap-gap` are\nenough on their own and these two are the estimate used until the first\nmeasurement lands. Writing the attribute pins the value and stops the\nmeasurement being consulted, which is what a container query or a transition\non the cell size wants, where what is drawn this frame is not what the\narithmetic should plan around.\n\nZero turns the dropping off altogether, which is right for a strip in a\ncontainer that cannot get narrow.",
44040
+ "description": "The smallest a cell may get before the strip draws fewer of them, in CSS pixels.\n\n**Set this only to overrule what the strip actually draws.** The arithmetic\nneeds a width in pixels and the width is a length the stylesheet resolves,\nso a number written here that disagrees with the sheet is a promise the\nconsumer has to keep by hand, and the one number a summary is told to trust\nis the one it gets wrong.\n\nThe strip measures itself, so sizing the cells in a sheet is enough on its\nown and these two are the estimate used until the first measurement lands.\nWriting the attribute pins the value and stops the measurement being\nconsulted, which is what a container query or a transition on the cell size\nwants, where what is drawn this frame is not what the arithmetic should\nplan around.\n\nZero turns the dropping off altogether, which is right for a strip in a\ncontainer that cannot get narrow.",
44061
44041
  "fieldName": "minCell"
44062
44042
  },
44063
44043
  {
@@ -44275,7 +44255,7 @@
44275
44255
  "text": "string"
44276
44256
  },
44277
44257
  "default": "''",
44278
- "description": "What to send when the button is activated, and what to send it to.\n\nThe platform's invoker attributes, forwarded onto the inner `<button>`\nrather than left on the host: only a real button is recognized as an\ninvoker, so `commandfor` written on a custom element resolves nothing and\nthe trigger silently does nothing at all. A wrapper has to hand them down,\nthe same way `label` becomes `aria-label` in there.\n\n```html\n<helix-button commandfor=\"confirm\" command=\"--show\">Delete…</helix-button>\n```\n\n`commandFor` spells its attribute out, because Lit lowercases a property\nname to derive one rather than dash-casing it, and what a consumer writes\nis the platform's `commandfor`.",
44258
+ "description": "What to send when the button is activated, and what to send it to.\n\nThe platform's invoker attributes, forwarded onto the inner `<button>`\nrather than left on the host: only a real button is recognized as an\ninvoker, so `commandfor` written on a custom element resolves nothing and\nthe trigger silently does nothing at all. A wrapper has to hand them down,\nthe same way `label` becomes `aria-label` in there.\n\n```html\n<helix-headless-button commandfor=\"confirm\" command=\"--show\">Delete…</helix-headless-button>\n```\n\n`commandFor` spells its attribute out, because Lit lowercases a property\nname to derive one rather than dash-casing it, and what a consumer writes\nis the platform's `commandfor`.",
44279
44259
  "fieldName": "command",
44280
44260
  "inheritedFrom": {
44281
44261
  "name": "HelixHeadlessButton",
@@ -44445,7 +44425,7 @@
44445
44425
  "text": "string"
44446
44426
  },
44447
44427
  "default": "''",
44448
- "description": "What to send when the button is activated, and what to send it to.\n\nThe platform's invoker attributes, forwarded onto the inner `<button>`\nrather than left on the host: only a real button is recognized as an\ninvoker, so `commandfor` written on a custom element resolves nothing and\nthe trigger silently does nothing at all. A wrapper has to hand them down,\nthe same way `label` becomes `aria-label` in there.\n\n```html\n<helix-button commandfor=\"confirm\" command=\"--show\">Delete…</helix-button>\n```\n\n`commandFor` spells its attribute out, because Lit lowercases a property\nname to derive one rather than dash-casing it, and what a consumer writes\nis the platform's `commandfor`.",
44428
+ "description": "What to send when the button is activated, and what to send it to.\n\nThe platform's invoker attributes, forwarded onto the inner `<button>`\nrather than left on the host: only a real button is recognized as an\ninvoker, so `commandfor` written on a custom element resolves nothing and\nthe trigger silently does nothing at all. A wrapper has to hand them down,\nthe same way `label` becomes `aria-label` in there.\n\n```html\n<helix-headless-button commandfor=\"confirm\" command=\"--show\">Delete…</helix-headless-button>\n```\n\n`commandFor` spells its attribute out, because Lit lowercases a property\nname to derive one rather than dash-casing it, and what a consumer writes\nis the platform's `commandfor`.",
44449
44429
  "attribute": "command",
44450
44430
  "helix": {
44451
44431
  "references": [
@@ -45856,7 +45836,7 @@
45856
45836
  "text": "'error' | 'loaded' | 'loading'"
45857
45837
  },
45858
45838
  "default": "'loading'",
45859
- "description": "Whether the picture is on its way, here, or never coming.\n\nRead-only to a consumer: it is a report rather than a setting.\n\n**Mirrored to `data-status`, and not reflected as `status`.** It is element\nstate, so reflecting it puts the element's own bookkeeping into the markup\na consumer rendered: React reads the attribute appearing at upgrade as a\nhydration mismatch, and a serialized `<helix-image status=\"loaded\">` pasted\nback declares that a picture has arrived which this element has never\nfetched. The `data-` name is the library's answer to both, being a name a\nre-parse cannot mistake for a declaration, and it is what `data-closed` on\n`Toast.Item` already does. A picture arrives after somebody fetched it,\nwhich puts this on the safe side of hydration: a fact that can be true on\nthe *first* update mirrors to a custom state instead, which is what\n`:state(open)` and `:state(checked)` are.\n\n`loading` writes nothing, because it is where every image starts and the\nresting state of a mirror is the attribute's absence."
45839
+ "description": "Whether the picture is on its way, here, or never coming.\n\nRead-only to a consumer: it is a report rather than a setting.\n\n**Mirrored to `data-status`, and not reflected as `status`.** It is element\nstate, so reflecting it puts the element's own bookkeeping into the markup\na consumer rendered: React reads the attribute appearing at upgrade as a\nhydration mismatch, and a host pasted back carrying `status=\"loaded\"`\ndeclares that a picture has arrived which this element has never fetched.\nThe `data-` name is the library's answer to both, being a name a re-parse\ncannot mistake for a declaration, and it is what `data-closed` on\n`Toast.Item` already does. A picture arrives after somebody fetched it,\nwhich puts this on the safe side of hydration: a fact that can be true on\nthe *first* update mirrors to a custom state instead, which is what\n`:state(open)` and `:state(checked)` are.\n\n`loading` writes nothing, because it is where every image starts and the\nresting state of a mirror is the attribute's absence."
45860
45840
  },
45861
45841
  {
45862
45842
  "kind": "field",
@@ -47391,7 +47371,7 @@
47391
47371
  "text": "boolean"
47392
47372
  },
47393
47373
  "default": "false",
47394
- "description": "Whether the field refuses input while still submitting its value.\n\n**The attribute is `readonly`, which is the platform's spelling.** A\ncamelCase property needs an explicit `attribute`, and dash-casing a word\nHTML writes as one costs what an attribute always costs here: nothing\nwarns. `<helix-input readonly>` is what anybody who has written HTML types;\nagainst `read-only` it parses to no property at all, and the field stays\neditable with no error anywhere. Measured on the dash-cased form, `readOnly`\ncame back `false`.",
47374
+ "description": "Whether the field refuses input while still submitting its value.\n\n**The attribute is `readonly`, which is the platform's spelling.** A\ncamelCase property needs an explicit `attribute`, and dash-casing a word\nHTML writes as one costs what an attribute always costs here: nothing\nwarns. `<helix-headless-input readonly>` is what anybody who has written\nHTML types; against `read-only` it parses to no property at all, and the\nfield stays editable with no error anywhere. Measured on the dash-cased\nform, `readOnly` came back `false`.",
47395
47375
  "attribute": "readonly",
47396
47376
  "reflects": true
47397
47377
  },
@@ -47605,7 +47585,7 @@
47605
47585
  "text": "InputType"
47606
47586
  },
47607
47587
  "default": "'text'",
47608
- "description": "What the field accepts, which decides the keyboard and the validation.\n\n**Not reflected.** Reflection exists so a selector can reach a value, and\nno stylesheet in this repository selects on `type`. Reflecting it writes\n`type=\"text\"` onto every `<helix-input>` ever rendered, an attribute no\nconsumer's markup has, which is the fault the area rules write up under\n`Button`'s `href`, `target` and `rel`.\n\nNothing reads it from the attribute either. The real `<input>` inside takes\nit as a property binding, which is what makes the keyboard and the\nvalidation follow.",
47588
+ "description": "What the field accepts, which decides the keyboard and the validation.\n\n**Not reflected.** Reflection exists so a selector can reach a value, and\nno stylesheet in this repository selects on `type`. Reflecting it writes\n`type=\"text\"` onto every `<helix-headless-input>` ever rendered, an\nattribute no consumer's markup has, which is the fault the area rules write\nup under `Button`'s `href`, `target` and `rel`.\n\nNothing reads it from the attribute either. The real `<input>` inside takes\nit as a property binding, which is what makes the keyboard and the\nvalidation follow.",
47609
47589
  "attribute": "type"
47610
47590
  },
47611
47591
  {
@@ -48544,7 +48524,7 @@
48544
48524
  "text": "boolean"
48545
48525
  },
48546
48526
  "default": "false",
48547
- "description": "Whether the field refuses input while still submitting its value.\n\n**The attribute is `readonly`, which is the platform's spelling.** A\ncamelCase property needs an explicit `attribute`, and dash-casing a word\nHTML writes as one costs what an attribute always costs here: nothing\nwarns. `<helix-input readonly>` is what anybody who has written HTML types;\nagainst `read-only` it parses to no property at all, and the field stays\neditable with no error anywhere. Measured on the dash-cased form, `readOnly`\ncame back `false`.",
48527
+ "description": "Whether the field refuses input while still submitting its value.\n\n**The attribute is `readonly`, which is the platform's spelling.** A\ncamelCase property needs an explicit `attribute`, and dash-casing a word\nHTML writes as one costs what an attribute always costs here: nothing\nwarns. `<helix-headless-input readonly>` is what anybody who has written\nHTML types; against `read-only` it parses to no property at all, and the\nfield stays editable with no error anywhere. Measured on the dash-cased\nform, `readOnly` came back `false`.",
48548
48528
  "fieldName": "readOnly"
48549
48529
  },
48550
48530
  {
@@ -48571,7 +48551,7 @@
48571
48551
  "text": "InputType"
48572
48552
  },
48573
48553
  "default": "'text'",
48574
- "description": "What the field accepts, which decides the keyboard and the validation.\n\n**Not reflected.** Reflection exists so a selector can reach a value, and\nno stylesheet in this repository selects on `type`. Reflecting it writes\n`type=\"text\"` onto every `<helix-input>` ever rendered, an attribute no\nconsumer's markup has, which is the fault the area rules write up under\n`Button`'s `href`, `target` and `rel`.\n\nNothing reads it from the attribute either. The real `<input>` inside takes\nit as a property binding, which is what makes the keyboard and the\nvalidation follow.",
48554
+ "description": "What the field accepts, which decides the keyboard and the validation.\n\n**Not reflected.** Reflection exists so a selector can reach a value, and\nno stylesheet in this repository selects on `type`. Reflecting it writes\n`type=\"text\"` onto every `<helix-headless-input>` ever rendered, an\nattribute no consumer's markup has, which is the fault the area rules write\nup under `Button`'s `href`, `target` and `rel`.\n\nNothing reads it from the attribute either. The real `<input>` inside takes\nit as a property binding, which is what makes the keyboard and the\nvalidation follow.",
48575
48555
  "fieldName": "type"
48576
48556
  },
48577
48557
  {
@@ -49988,7 +49968,7 @@
49988
49968
  "type": {
49989
49969
  "text": "'none' | 'ring' | 'square' | 'triangle' | undefined"
49990
49970
  },
49991
- "description": "The shape of the mark on each series' last reading.\n\nAbsent is a dot, and absent rather than defaulted because a reflecting\nproperty with a default writes its attribute onto a host the consumer\nrendered, which React reports as a hydration mismatch.\n\n**One per series, in a column at the far edge**, because every series here\nshares an x-axis and therefore ends at the same reading. That column is the\nuseful thing: it is where a reader looks for \"and what is it now\", which is\nthe question a sparkline's single mark answers too.\n\n`none` lets the lines stop on their own, which suits a chart read for its\nshape rather than for where it finished. `square` is the same mark with its\ncorners, for a drawing whose neighbors are square, the columns of a table\nbeside it for instance. `ring` lets the ground through, for a chart drawn\nover something busy. `triangle` points along the axis and reads as \"and\nonward\" rather than as a second claim about the data.\n\nThe shapes come from\n`helix/styled/src/shared/chart/terminus.css`, the same sheet `Sparkline` takes, so\nthe set is identical wherever one appears. **Which is why every value is\nnamed here.** `Sparkline` shipped `square` implemented, drawn, asserted and\nundocumented until the cohort before this one; this family reads the same\nfour out of the same sheet and had left two of them unwritten, so the\nfinding arrived twice. A shared vocabulary wants naming at each door into\nit, because a reader arrives at one door and not at the set.\n\n`ring` is the one that asks something of the drawing. It leaves a hole and a\nline ends at the reading, which is the hole's center, so the `<svg>` is\nmasked with one disc per series and every stroke stops at its own ring's\ninner edge. `mask-composite: intersect` is what makes N holes out of N\nlayers; a single `mask-image` would only ever cut the last one.",
49971
+ "description": "The shape of the mark on each series' last reading.\n\nAbsent is a dot, and absent rather than defaulted because a reflecting\nproperty with a default writes its attribute onto a host the consumer\nrendered, which React reports as a hydration mismatch.\n\n**One per series, in a column at the far edge**, because every series here\nshares an x-axis and therefore ends at the same reading. That column is the\nuseful thing: it is where a reader looks for \"and what is it now\", which is\nthe question a sparkline's single mark answers too.\n\n`none` lets the lines stop on their own, which suits a chart read for its\nshape rather than for where it finished. `square` is the same mark with its\ncorners, for a drawing whose neighbors are square, the columns of a table\nbeside it for instance. `ring` lets the ground through, for a chart drawn\nover something busy. `triangle` points along the axis and reads as \"and\nonward\" rather than as a second claim about the data.\n\nThe shapes come from one shared sheet, the same one `Sparkline` takes, so\nthe set is identical wherever one appears. **Which is why every value is\nnamed here.** `Sparkline` shipped `square` implemented, drawn, asserted and\nundocumented until the cohort before this one; this family reads the same\nfour out of the same sheet and had left two of them unwritten, so the\nfinding arrived twice. A shared vocabulary wants naming at each door into\nit, because a reader arrives at one door and not at the set.\n\n`ring` is the one that asks something of the drawing. It leaves a hole and a\nline ends at the reading, which is the hole's center, so the `<svg>` is\nmasked with one disc per series and every stroke stops at its own ring's\ninner edge. `mask-composite: intersect` is what makes N holes out of N\nlayers; a single `mask-image` would only ever cut the last one.",
49992
49972
  "attribute": "terminus",
49993
49973
  "reflects": true
49994
49974
  },
@@ -50748,7 +50728,7 @@
50748
50728
  "type": {
50749
50729
  "text": "'none' | 'ring' | 'square' | 'triangle' | undefined"
50750
50730
  },
50751
- "description": "The shape of the mark on each series' last reading.\n\nAbsent is a dot, and absent rather than defaulted because a reflecting\nproperty with a default writes its attribute onto a host the consumer\nrendered, which React reports as a hydration mismatch.\n\n**One per series, in a column at the far edge**, because every series here\nshares an x-axis and therefore ends at the same reading. That column is the\nuseful thing: it is where a reader looks for \"and what is it now\", which is\nthe question a sparkline's single mark answers too.\n\n`none` lets the lines stop on their own, which suits a chart read for its\nshape rather than for where it finished. `square` is the same mark with its\ncorners, for a drawing whose neighbors are square, the columns of a table\nbeside it for instance. `ring` lets the ground through, for a chart drawn\nover something busy. `triangle` points along the axis and reads as \"and\nonward\" rather than as a second claim about the data.\n\nThe shapes come from\n`helix/styled/src/shared/chart/terminus.css`, the same sheet `Sparkline` takes, so\nthe set is identical wherever one appears. **Which is why every value is\nnamed here.** `Sparkline` shipped `square` implemented, drawn, asserted and\nundocumented until the cohort before this one; this family reads the same\nfour out of the same sheet and had left two of them unwritten, so the\nfinding arrived twice. A shared vocabulary wants naming at each door into\nit, because a reader arrives at one door and not at the set.\n\n`ring` is the one that asks something of the drawing. It leaves a hole and a\nline ends at the reading, which is the hole's center, so the `<svg>` is\nmasked with one disc per series and every stroke stops at its own ring's\ninner edge. `mask-composite: intersect` is what makes N holes out of N\nlayers; a single `mask-image` would only ever cut the last one.",
50731
+ "description": "The shape of the mark on each series' last reading.\n\nAbsent is a dot, and absent rather than defaulted because a reflecting\nproperty with a default writes its attribute onto a host the consumer\nrendered, which React reports as a hydration mismatch.\n\n**One per series, in a column at the far edge**, because every series here\nshares an x-axis and therefore ends at the same reading. That column is the\nuseful thing: it is where a reader looks for \"and what is it now\", which is\nthe question a sparkline's single mark answers too.\n\n`none` lets the lines stop on their own, which suits a chart read for its\nshape rather than for where it finished. `square` is the same mark with its\ncorners, for a drawing whose neighbors are square, the columns of a table\nbeside it for instance. `ring` lets the ground through, for a chart drawn\nover something busy. `triangle` points along the axis and reads as \"and\nonward\" rather than as a second claim about the data.\n\nThe shapes come from one shared sheet, the same one `Sparkline` takes, so\nthe set is identical wherever one appears. **Which is why every value is\nnamed here.** `Sparkline` shipped `square` implemented, drawn, asserted and\nundocumented until the cohort before this one; this family reads the same\nfour out of the same sheet and had left two of them unwritten, so the\nfinding arrived twice. A shared vocabulary wants naming at each door into\nit, because a reader arrives at one door and not at the set.\n\n`ring` is the one that asks something of the drawing. It leaves a hole and a\nline ends at the reading, which is the hole's center, so the `<svg>` is\nmasked with one disc per series and every stroke stops at its own ring's\ninner edge. `mask-composite: intersect` is what makes N holes out of N\nlayers; a single `mask-image` would only ever cut the last one.",
50752
50732
  "fieldName": "terminus"
50753
50733
  },
50754
50734
  {
@@ -50950,7 +50930,7 @@
50950
50930
  "text": "TemplateResult | typeof nothing"
50951
50931
  }
50952
50932
  },
50953
- "description": "The cell before the row's content, which this tier leaves empty.\n\nA railed list puts its number at the block's own start edge, in a track of\nits own ahead of the words, and the native `::marker` cannot reach there:\n`outside` hangs the marker just clear of the row's content box, which is\nbeside the words rather than at the edge of the block. A number that has to\nsit in a track has to be a box in that track.\n\n**The box belongs to the styled tier, which is why this returns `nothing`.**\nRendering it here puts an unstyled empty box in front of every headless row,\nand a row styled with `display: flex` and a `gap` draws that gap beside the\nempty child: measured on this tier's own example, which is exactly such a\nrow, 1384 pixels moved and every label sat half a rem further in. The styled\nrow's own comment records the same fault about a column gap beside a\nzero-width column.\n\nA tier that ships no CSS cannot make a box it renders cost nothing, so it\ndoes not render one. `marker=\"rail\"` is a styled-tier attribute for the same\nreason: *that* a list is numbered is a fact about the content and *where the\nnumbers are drawn* is not. A headless consumer wanting a rail writes the\ncell they were going to style anyway.\n\n`protected` rather than `private`, so the tier above can reach it."
50933
+ "description": "The cell before the row's content, which this tier leaves empty.\n\nA railed list puts its number at the block's own start edge, in a track of\nits own ahead of the words, and the native `::marker` cannot reach there:\n`outside` hangs the marker just clear of the row's content box, which is\nbeside the words rather than at the edge of the block. A number that has to\nsit in a track has to be a box in that track.\n\n**The box belongs to the styled tier, which is why this returns\n`nothing`.** Rendering it here puts an unstyled empty box in front of every\nheadless row, and a row styled with `display: flex` and a `gap` draws that\ngap beside the empty child: measured on this tier's own example, which is\nexactly such a row, 1384 pixels moved and every label sat half a rem\nfurther in.\n\nA tier that ships no CSS cannot make a box it renders cost nothing, so it\ndoes not render one. `marker=\"rail\"` is a styled-tier attribute for the same\nreason: *that* a list is numbered is a fact about the content and *where the\nnumbers are drawn* is not. A headless consumer wanting a rail writes the\ncell they were going to style anyway.\n\n`protected` rather than `private`, so the tier above can reach it."
50954
50934
  },
50955
50935
  {
50956
50936
  "kind": "field",
@@ -51399,7 +51379,7 @@
51399
51379
  "type": {
51400
51380
  "text": "'1' | 'a' | 'A' | 'i' | 'I' | undefined"
51401
51381
  },
51402
- "description": "Which markers an ordered list draws, in `<ol type>`'s own five values.\n\nReflected, because this is one of the things a stylesheet selects on and\nthe styled tier maps each to a `list-style-type`. The platform's spellings\nrather than the CSS ones, so `<helix-list kind=\"ordered\" type=\"i\">` is what\na consumer would have written on an `<ol>`.\n\n**`start` and `reversed` are both absent and neither can be done here.**\nThis renders no `<ol>`: the rows are slotted and numbered by the CSS\n`list-item` counter, and that counter is not author-resettable. Measured in\nChrome 148, `counter-reset: list-item 4` moves nothing on a `<div>`, on a\n`<ul>`, or even on a real `<ol>`, while `<ol start=\"5\">` does and a *named*\ncounter with explicit `::before` content does. So the markers would have to\nbe rebuilt out of generated content to gain a start, which is a different\ncomponent. `type` is only `list-style-type` and works.",
51382
+ "description": "Which markers an ordered list draws, in `<ol type>`'s own five values.\n\nReflected, because this is one of the things a stylesheet selects on, each\nvalue mapping to a `list-style-type`. The platform's spellings rather than\nthe CSS ones, so `<helix-headless-list kind=\"ordered\" type=\"i\">` is what a\nconsumer would have written on an `<ol>`.\n\n**`start` and `reversed` are both absent and neither can be done here.**\nThis renders no `<ol>`: the rows are slotted and numbered by the CSS\n`list-item` counter, and that counter is not author-resettable. Measured in\nChrome 148, `counter-reset: list-item 4` moves nothing on a `<div>`, on a\n`<ul>`, or even on a real `<ol>`, while `<ol start=\"5\">` does and a *named*\ncounter with explicit `::before` content does. So the markers would have to\nbe rebuilt out of generated content to gain a start, which is a different\ncomponent. `type` is only `list-style-type` and works.",
51403
51383
  "attribute": "type",
51404
51384
  "reflects": true
51405
51385
  },
@@ -51751,7 +51731,7 @@
51751
51731
  "type": {
51752
51732
  "text": "'1' | 'a' | 'A' | 'i' | 'I' | undefined"
51753
51733
  },
51754
- "description": "Which markers an ordered list draws, in `<ol type>`'s own five values.\n\nReflected, because this is one of the things a stylesheet selects on and\nthe styled tier maps each to a `list-style-type`. The platform's spellings\nrather than the CSS ones, so `<helix-list kind=\"ordered\" type=\"i\">` is what\na consumer would have written on an `<ol>`.\n\n**`start` and `reversed` are both absent and neither can be done here.**\nThis renders no `<ol>`: the rows are slotted and numbered by the CSS\n`list-item` counter, and that counter is not author-resettable. Measured in\nChrome 148, `counter-reset: list-item 4` moves nothing on a `<div>`, on a\n`<ul>`, or even on a real `<ol>`, while `<ol start=\"5\">` does and a *named*\ncounter with explicit `::before` content does. So the markers would have to\nbe rebuilt out of generated content to gain a start, which is a different\ncomponent. `type` is only `list-style-type` and works.",
51734
+ "description": "Which markers an ordered list draws, in `<ol type>`'s own five values.\n\nReflected, because this is one of the things a stylesheet selects on, each\nvalue mapping to a `list-style-type`. The platform's spellings rather than\nthe CSS ones, so `<helix-headless-list kind=\"ordered\" type=\"i\">` is what a\nconsumer would have written on an `<ol>`.\n\n**`start` and `reversed` are both absent and neither can be done here.**\nThis renders no `<ol>`: the rows are slotted and numbered by the CSS\n`list-item` counter, and that counter is not author-resettable. Measured in\nChrome 148, `counter-reset: list-item 4` moves nothing on a `<div>`, on a\n`<ul>`, or even on a real `<ol>`, while `<ol start=\"5\">` does and a *named*\ncounter with explicit `::before` content does. So the markers would have to\nbe rebuilt out of generated content to gain a start, which is a different\ncomponent. `type` is only `list-style-type` and works.",
51755
51735
  "fieldName": "type"
51756
51736
  }
51757
51737
  ],
@@ -54242,7 +54222,7 @@
54242
54222
  "text": "number"
54243
54223
  }
54244
54224
  },
54245
- "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 `helix-app-header`\nby name 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."
54225
+ "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."
54246
54226
  },
54247
54227
  {
54248
54228
  "kind": "field",
@@ -54364,7 +54344,7 @@
54364
54344
  "text": "TemplateResult"
54365
54345
  }
54366
54346
  },
54367
- "description": "The control that opens it, behind a seam the styled tier can move.\n\nThe same case `SpeedDial` records: a bare `<button>` is what this tier can\nwrite, `helix-button` lives a tier above, and a render method is how a tier\nthat has one reaches this without reimplementing the panel below it."
54347
+ "description": "The control that opens it, behind a seam the styled tier can move.\n\nThe same case `SpeedDial` records: a bare `<button>` is what this tier can\nwrite, `Button` lives a tier above, and a render method is how a tier that\nhas one reaches this without reimplementing the panel below it."
54368
54348
  },
54369
54349
  {
54370
54350
  "kind": "field",
@@ -54386,7 +54366,7 @@
54386
54366
  "text": "boolean"
54387
54367
  },
54388
54368
  "default": "false",
54389
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
54369
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
54390
54370
  "attribute": "default-open",
54391
54371
  "inheritedFrom": {
54392
54372
  "name": "MixinControllerOpen",
@@ -54877,7 +54857,7 @@
54877
54857
  "text": "boolean"
54878
54858
  },
54879
54859
  "default": "false",
54880
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
54860
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
54881
54861
  "fieldName": "defaultOpen",
54882
54862
  "inheritedFrom": {
54883
54863
  "name": "MixinControllerOpen",
@@ -56142,7 +56122,7 @@
56142
56122
  "text": "boolean"
56143
56123
  },
56144
56124
  "default": "false",
56145
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
56125
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
56146
56126
  "attribute": "default-open",
56147
56127
  "inheritedFrom": {
56148
56128
  "name": "MixinControllerOpen",
@@ -56681,7 +56661,7 @@
56681
56661
  "text": "boolean"
56682
56662
  },
56683
56663
  "default": "false",
56684
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
56664
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
56685
56665
  "fieldName": "defaultOpen",
56686
56666
  "inheritedFrom": {
56687
56667
  "name": "MixinControllerOpen",
@@ -58187,7 +58167,7 @@
58187
58167
  "text": "boolean"
58188
58168
  },
58189
58169
  "default": "false",
58190
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
58170
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
58191
58171
  "attribute": "default-open",
58192
58172
  "inheritedFrom": {
58193
58173
  "name": "MixinControllerOpen",
@@ -58661,7 +58641,7 @@
58661
58641
  "text": "boolean"
58662
58642
  },
58663
58643
  "default": "false",
58664
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
58644
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
58665
58645
  "fieldName": "defaultOpen",
58666
58646
  "inheritedFrom": {
58667
58647
  "name": "MixinControllerOpen",
@@ -58769,7 +58749,7 @@
58769
58749
  "declarations": [
58770
58750
  {
58771
58751
  "kind": "class",
58772
- "description": "A notification is a toast that did not go away. `helix-toast` is deliberately\nthe opposite of this: a live region whose items carry a `duration` and whose\nroot never creates or destroys anything. What makes this its own family is the\nstate each item carries rather than the arrangement it sits in: read and\nunread, a timestamp that has to stay correct, and an action a reader can take\nlater.\n\n**The row is a label, a caption under it, and one trailing column that holds\neither the time or the controls.** A feed is scanned rather than read, so the\nthing that happened gets the first line on its own and everything qualifying\nit goes under. The time and the controls occupy the same place because a\nreader wants exactly one of them at a time: the time while they are scanning,\nand what they can do about it once they have stopped on a row.\n\n**The timestamp is `helix-format-date`**, which is where the reading, the\n`<time datetime>` and the shared timer now live. It was implemented here, and\na component that formats a date is not a fact about notifications: Chat wanted\nthe same thing and had its own copy of half of it.\n\n**Read state is reported, not invented.** Marking something read is usually a\nround trip, and a component that flips its own state and then hears the\nrequest failed has told the reader something untrue. `helix-read` is\ncancelable, and a `read` set by the consumer makes this element defer entirely.",
58752
+ "description": "A notification is a toast that did not go away. `Toast` is deliberately the\nopposite of this: a live region whose items carry a `duration` and whose root\nnever creates or destroys anything. What makes this its own family is the\nstate each item carries rather than the arrangement it sits in: read and\nunread, a timestamp that has to stay correct, and an action a reader can take\nlater.\n\n**The row is a label, a caption under it, and one trailing column that holds\neither the time or the controls.** A feed is scanned rather than read, so the\nthing that happened gets the first line on its own and everything qualifying\nit goes under. The time and the controls occupy the same place because a\nreader wants exactly one of them at a time: the time while they are scanning,\nand what they can do about it once they have stopped on a row.\n\n**The timestamp is `FormatDate`**, which is where the reading, the `<time\ndatetime>` and the shared timer now live. It was implemented here, and a\ncomponent that formats a date is not a fact about notifications: Chat wanted\nthe same thing and had its own copy of half of it.\n\n**Read state is reported, not invented.** Marking something read is usually a\nround trip, and a component that flips its own state and then hears the\nrequest failed has told the reader something untrue. `helix-read` is\ncancelable, and a `read` set by the consumer makes this element defer entirely.",
58773
58753
  "name": "HelixHeadlessNotification",
58774
58754
  "cssParts": [
58775
58755
  {
@@ -58856,7 +58836,7 @@
58856
58836
  "type": {
58857
58837
  "text": "boolean"
58858
58838
  },
58859
- "description": "Whether the reader has seen it.\n\nSet it and this element defers: a reader's click fires `helix-read` and\nchanges nothing until a new value arrives. `default-read` seeds a state\nthis element then owns.\n\n**Not reflected.** Unread is a visual state, which is why the four mixins\nmirror theirs, but the mirror may not be the property's own attribute:\n`<helix-notification default-read>` comes back from a server without `read`\nand would gain it on the first update, which React reports as a hydration\nmismatch, and which a copy of the serialized element re-parses as a\ndeclaration. `:state(read)` is what the stylesheet reads.\n`hydration.dom.spec.ts` holds it.",
58839
+ "description": "Whether the reader has seen it.\n\nSet it and this element defers: a reader's click fires `helix-read` and\nchanges nothing until a new value arrives. `default-read` seeds a state\nthis element then owns.\n\n**Not reflected.** Unread is a visual state, which is why the four mixins\nmirror theirs, but the mirror may not be the property's own attribute:\n`<helix-headless-notification default-read>` comes back from a server\nwithout `read` and would gain it on the first update, which React reports\nas a hydration mismatch, and which a copy of the serialized element\nre-parses as a declaration. `:state(read)` is what the stylesheet reads.\n`hydration.dom.spec.ts` holds it.",
58860
58840
  "attribute": "read"
58861
58841
  },
58862
58842
  {
@@ -59382,7 +59362,7 @@
59382
59362
  "type": {
59383
59363
  "text": "boolean"
59384
59364
  },
59385
- "description": "Whether the reader has seen it.\n\nSet it and this element defers: a reader's click fires `helix-read` and\nchanges nothing until a new value arrives. `default-read` seeds a state\nthis element then owns.\n\n**Not reflected.** Unread is a visual state, which is why the four mixins\nmirror theirs, but the mirror may not be the property's own attribute:\n`<helix-notification default-read>` comes back from a server without `read`\nand would gain it on the first update, which React reports as a hydration\nmismatch, and which a copy of the serialized element re-parses as a\ndeclaration. `:state(read)` is what the stylesheet reads.\n`hydration.dom.spec.ts` holds it.",
59365
+ "description": "Whether the reader has seen it.\n\nSet it and this element defers: a reader's click fires `helix-read` and\nchanges nothing until a new value arrives. `default-read` seeds a state\nthis element then owns.\n\n**Not reflected.** Unread is a visual state, which is why the four mixins\nmirror theirs, but the mirror may not be the property's own attribute:\n`<helix-headless-notification default-read>` comes back from a server\nwithout `read` and would gain it on the first update, which React reports\nas a hydration mismatch, and which a copy of the serialized element\nre-parses as a declaration. `:state(read)` is what the stylesheet reads.\n`hydration.dom.spec.ts` holds it.",
59386
59366
  "fieldName": "read"
59387
59367
  },
59388
59368
  {
@@ -59537,7 +59517,7 @@
59537
59517
  ],
59538
59518
  "slots": [
59539
59519
  {
59540
- "description": "The notifications, as `helix-notification` children.",
59520
+ "description": "The notifications.",
59541
59521
  "name": ""
59542
59522
  },
59543
59523
  {
@@ -62183,12 +62163,23 @@
62183
62163
  "default": "false",
62184
62164
  "description": "Set by a keyboard move, so the next render brings the active row into view."
62185
62165
  },
62166
+ {
62167
+ "kind": "field",
62168
+ "name": "ESTIMATE",
62169
+ "type": {
62170
+ "text": "number"
62171
+ },
62172
+ "static": true,
62173
+ "readonly": true,
62174
+ "default": "24",
62175
+ "description": "How tall a row is taken to be before it has been drawn, in pixels.\n\nA constant rather than the property `VirtualList` and `DataTable` carry:\nevery row here is one line of the same text at this family's own leading,\nso there is nothing for a consumer to tell it. `reveal` falls back to this\nwhen a drawn row measures zero, and the two have to be the same number or a\nkeyboard move scrolls by a different row than the window counted with."
62176
+ },
62186
62177
  {
62187
62178
  "kind": "field",
62188
62179
  "name": "virtualize",
62189
62180
  "privacy": "private",
62190
62181
  "readonly": true,
62191
- "default": "new VirtualizeController(this, { container: () => (this.windowed ? this.partNamed('tree') : null), count: () => this.rows.length, estimate: () => 24, measured: () => this.windowed, rows: () => [...(this.renderRoot?.querySelectorAll<HTMLElement>('[part~=\"row\"]') ?? [])].map( (element) => ({ element, index: Number(element.dataset.index) }), ), })"
62182
+ "default": "new VirtualizeController(this, { container: () => (this.windowed ? this.partNamed('tree') : null), count: () => this.rows.length, estimate: () => HelixHeadlessObjectInspector.ESTIMATE, measured: () => this.windowed, rows: () => [...(this.renderRoot?.querySelectorAll<HTMLElement>('[part~=\"row\"]') ?? [])].map( (element) => ({ element, index: Number(element.dataset.index) }), ), })"
62192
62183
  },
62193
62184
  {
62194
62185
  "kind": "field",
@@ -63406,7 +63397,7 @@
63406
63397
  "text": "string"
63407
63398
  },
63408
63399
  "default": "''",
63409
- "description": "A second destination for this row, taken with the modifier held.\n\n**An attribute rather than a second row, which is the whole point.** A\npalette of eighty-eight components that offered each of them a reference\npage and a sandbox as separate entries would be a palette of a hundred and\nseventy-six, and one earns its keep by getting a reader to one thing in\nthree keystrokes. The row already carries the first destination, so the\nsecond belongs beside it.\n\nDeclared here and acted on by whatever owns the list, the same division\nselection already uses: an option says what it is and the listbox decides\nwhat happens. `Command` is the only owner that reads it today, because a\nselect has one destination by definition.\n\nAbsent is a row with one destination, which is nearly every row.",
63400
+ "description": "A second destination for this row, taken with the modifier held.\n\n**An attribute rather than a second row, which is the whole point.** A\npalette that offered every component a reference page and a sandbox as\nseparate entries would be twice as long, and one earns its keep by getting\na reader to one thing in three keystrokes. The row already carries the\nfirst destination, so the second belongs beside it.\n\nDeclared here and acted on by whatever owns the list, the same division\nselection already uses: an option says what it is and the listbox decides\nwhat happens. `Command` is the only owner that reads it today, because a\nselect has one destination by definition.\n\nAbsent is a row with one destination, which is nearly every row.",
63410
63401
  "attribute": "alternate"
63411
63402
  },
63412
63403
  {
@@ -63425,7 +63416,7 @@
63425
63416
  "type": {
63426
63417
  "text": "boolean"
63427
63418
  },
63428
- "description": "Whether the markup declared this one chosen, which is what a reset returns to.\n\n`<option selected>` reflects to `defaultSelected` and `option.selected` is\nlive state that does not reflect, and those are two different facts. This\nelement has one `selected` doing both jobs, so the declaration is the\nattribute and the state is the property.\n\n**The attribute, read when it is asked for, and never a snapshot taken in\nthe constructor.** A field initializer runs there, and an element the HTML\nparser created has none of its attributes yet at that moment: measured on\nthis element, on `Radio` and on `Toggle`, `<helix-option value=\"a\"\nselected>` reported `defaultSelected` as `false` both from parsed markup\nand from `createElement` followed by `setAttribute`, which is every way a\nconsumer writes one. The snapshot could only ever be true for an element\nalready in the document when `customElements.define` ran.\n\nNothing overwrites it either, which is what makes reading it late correct\nrather than merely later: `selected` does not reflect, for the reason\n`willUpdate` records, so the listbox's writes never reach the attribute and\nwhat it says is what the markup said.\n\n**The deeper half is not this.** State reflecting under the declaration's\nname is the fault `TreeItem` avoids by mirroring to `data-selected`.\nSplitting them means moving what every stylesheet selects on, which is a\nchange of its own rather than a property being added."
63419
+ "description": "Whether the markup declared this one chosen, which is what a reset returns to.\n\n`<option selected>` reflects to `defaultSelected` and `option.selected` is\nlive state that does not reflect, and those are two different facts. This\nelement has one `selected` doing both jobs, so the declaration is the\nattribute and the state is the property.\n\n**The attribute, read when it is asked for, and never a snapshot taken in\nthe constructor.** A field initializer runs there, and an element the HTML\nparser created has none of its attributes yet at that moment: measured on\nthis element, on `Radio` and on `Toggle`, `<helix-headless-option value=\"a\"\nselected>` reported `defaultSelected` as `false` both from parsed markup\nand from `createElement` followed by `setAttribute`, which is every way a\nconsumer writes one. The snapshot could only ever be true for an element\nalready in the document when `customElements.define` ran.\n\nNothing overwrites it either, which is what makes reading it late correct\nrather than merely later: `selected` does not reflect, for the reason\n`willUpdate` records, so the listbox's writes never reach the attribute and\nwhat it says is what the markup said.\n\n**The deeper half is not this.** State reflecting under the declaration's\nname is the fault `TreeItem` avoids by mirroring to `data-selected`.\nSplitting them means moving what every stylesheet selects on, which is a\nchange of its own rather than a property being added."
63429
63420
  },
63430
63421
  {
63431
63422
  "kind": "field",
@@ -63850,7 +63841,7 @@
63850
63841
  "text": "string"
63851
63842
  },
63852
63843
  "default": "''",
63853
- "description": "A second destination for this row, taken with the modifier held.\n\n**An attribute rather than a second row, which is the whole point.** A\npalette of eighty-eight components that offered each of them a reference\npage and a sandbox as separate entries would be a palette of a hundred and\nseventy-six, and one earns its keep by getting a reader to one thing in\nthree keystrokes. The row already carries the first destination, so the\nsecond belongs beside it.\n\nDeclared here and acted on by whatever owns the list, the same division\nselection already uses: an option says what it is and the listbox decides\nwhat happens. `Command` is the only owner that reads it today, because a\nselect has one destination by definition.\n\nAbsent is a row with one destination, which is nearly every row.",
63844
+ "description": "A second destination for this row, taken with the modifier held.\n\n**An attribute rather than a second row, which is the whole point.** A\npalette that offered every component a reference page and a sandbox as\nseparate entries would be twice as long, and one earns its keep by getting\na reader to one thing in three keystrokes. The row already carries the\nfirst destination, so the second belongs beside it.\n\nDeclared here and acted on by whatever owns the list, the same division\nselection already uses: an option says what it is and the listbox decides\nwhat happens. `Command` is the only owner that reads it today, because a\nselect has one destination by definition.\n\nAbsent is a row with one destination, which is nearly every row.",
63854
63845
  "fieldName": "alternate"
63855
63846
  },
63856
63847
  {
@@ -64696,7 +64687,7 @@
64696
64687
  "declarations": [
64697
64688
  {
64698
64689
  "kind": "class",
64699
- "description": "**The component is the truncation.** Given a page and a total it works out\nwhich numbers to show and where the runs break, so this is data-driven rather\nthan composed: `<helix-pagination page=\"4\" pages=\"12\">` rather than twelve\nslotted children a consumer keeps in step with their own query.\n\n**The width does not change as you page.** The run around the current page is\n`siblings` either side, and grows to absorb a gap slot at a boundary, so the\ncontrol holds the same number of slots from the first page to the last.\nAnything that lets the count vary moves the buttons under the pointer between\none click and the next.\n\n**A gap is only drawn where it hides more than one page, and a gap is a\ncontrol.** It goes to the middle of the run it stands over, which is the\nbinary-search step: any page in a set of any size is a handful of presses.\n\n**`href` is what makes these links.** Set it and every page renders an `<a>`\nwith `{page}` filled in, so the output is crawlable, a middle click opens a\ntab, and the address bar is the state. Left unset they are buttons, which is\nright for a table paging in place. Either way the click announces\n`helix-navigate` first, and `preventDefault()` stops the navigation as well\nas the change, which is how a router takes over.\n\n**`helix-navigate` and not `helix-change`.** Moving to page four chooses\nnothing; it moves the view over a result that has not changed.\n\n**The count and the page-size control are their own elements.**\n`Pagination.Summary` and `Pagination.Size` sit beside this one, because a\nslot can only offer one place: at one end of one row, in one order.",
64690
+ "description": "**The component is the truncation.** Given a page and a total it works out\nwhich numbers to show and where the runs break, so this is data-driven rather\nthan composed: `<helix-headless-pagination page=\"4\" pages=\"12\">` rather than\ntwelve slotted children a consumer keeps in step with their own query.\n\n**The width does not change as you page.** The run around the current page is\n`siblings` either side, and grows to absorb a gap slot at a boundary, so the\ncontrol holds the same number of slots from the first page to the last.\nAnything that lets the count vary moves the buttons under the pointer between\none click and the next.\n\n**A gap is only drawn where it hides more than one page, and a gap is a\ncontrol.** It goes to the middle of the run it stands over, which is the\nbinary-search step: any page in a set of any size is a handful of presses.\n\n**`href` is what makes these links.** Set it and every page renders an `<a>`\nwith `{page}` filled in, so the output is crawlable, a middle click opens a\ntab, and the address bar is the state. Left unset they are buttons, which is\nright for a table paging in place. Either way the click announces\n`helix-navigate` first, and `preventDefault()` stops the navigation as well\nas the change, which is how a router takes over.\n\n**`helix-navigate` and not `helix-change`.** Moving to page four chooses\nnothing; it moves the view over a result that has not changed.\n\n**The count and the page-size control are their own elements.**\n`Pagination.Summary` and `Pagination.Size` sit beside this one, because a\nslot can only offer one place: at one end of one row, in one order.",
64700
64691
  "name": "HelixHeadlessPagination",
64701
64692
  "cssParts": [
64702
64693
  {
@@ -65757,7 +65748,7 @@
65757
65748
  "declarations": [
65758
65749
  {
65759
65750
  "kind": "class",
65760
- "description": "Its own element beside `Pagination` rather than a slot inside it, for the\nreason `Pagination.Summary` is: a footer's direction and order are the\nconsumer's, and a control that can only sit at one end of one row has taken\nthat decision for them.\n\n**`Select`, not a native `<select>`.** Two dropdowns identical closed and\ndifferent open meet each other in the same footer as a table's filters. The\ncaret is `Select`'s rather than a color literal baked into a data URI,\nbecause a background image cannot read `currentColor`, and the label is a\nreal `<label for>` against the trigger's own id.\n\n**The label sits on the row, not above it.** `Select`'s host is a column, and\nan outer-tree rule beats a `:host` rule, so turning it into a row needs no\nproperty on `Select` and nothing written into the consumer's markup.\n\n**An empty `sizes` renders nothing**, rather than falling back to the\nbuilt-in list, which would be a component overruling a consumer who said\n\"none\". Same rule as `Pagination` over a single page, and reported the same\nway, through `ElementInternals.states` rather than an attribute the server\nnever wrote.\n\n`value` is the controlled property and `default-value` seeds one this owns.\nChanging it announces `helix-before-change`; re-querying and moving back to\npage one is the consumer's, because only they know whether the reader's\nposition should survive it.",
65751
+ "description": "Its own element beside `Pagination` rather than a slot inside it, for the\nreason `Pagination.Summary` is: a footer's direction and order are the\nconsumer's, and a control that can only sit at one end of one row has taken\nthat decision for them.\n\n**`Select`, not a native `<select>`.** Two dropdowns identical closed and\ndifferent open meet each other in the same footer as a table's filters. The\ncaret is `Select`'s rather than a color literal baked into a data URI,\nbecause a background image cannot read `currentColor`, and the label is a\nreal `<label for>` against the trigger's own id.\n\n**The label sits on the row, not above it.** `Select`'s host is a column, and\nan outer-tree rule beats a `:host` rule, so turning it into a row needs no\nproperty on `Select` and nothing written into the consumer's markup.\n\n**An empty `sizes` renders nothing**, rather than falling back to the\nbuilt-in list, which would be a component overruling a consumer who said\n\"none\". Same rule as `Pagination` over a single page, and reported the same\nway, through `ElementInternals.states` rather than an attribute the server\nnever wrote.\n\n`value` is the size the control holds and `default-value` is what the markup\ndeclared.\nChanging it announces `helix-before-change`; re-querying and moving back to\npage one is the consumer's, because only they know whether the reader's\nposition should survive it.",
65761
65752
  "name": "HelixHeadlessPaginationSize",
65762
65753
  "cssParts": [
65763
65754
  {
@@ -67039,7 +67030,7 @@
67039
67030
  "text": "PinType"
67040
67031
  },
67041
67032
  "default": "'numeric'",
67042
- "description": "What a box accepts, which decides the keyboard a phone offers.\n\n`numeric` and `alphanumeric` also refuse anything else on the way in,\nbecause a code that is digits is digits: letting a letter into a box a\nreader cannot submit is a mistake they have to find and undo themselves.\n`text` refuses nothing and only trims, so it is the mode for a code with a\nhyphen in it.\n\n**`alphanumeric` is ASCII letters and digits**, which is narrower than the\nword is in general and is the right narrowness here. A code of this kind\ncomes off a keypad, an SMS or an authenticator, and none of them emit `é`;\na filter that accepted it would let through a character the service on the\nother end is going to reject. A consumer whose codes really do carry\nmarked letters wants `text`, which judges nothing.\n\n**Not reflected**: nothing selects on it, so reflecting only writes\n`type=\"numeric\"` onto every `<helix-pin-input>` ever rendered, an attribute\nno consumer's markup had. The area rules carry the sentence \"reflect only\nwhat CSS selects on\". The real inputs take it as a binding, which is what\nmakes the keyboard follow.",
67033
+ "description": "What a box accepts, which decides the keyboard a phone offers.\n\n`numeric` and `alphanumeric` also refuse anything else on the way in,\nbecause a code that is digits is digits: letting a letter into a box a\nreader cannot submit is a mistake they have to find and undo themselves.\n`text` refuses nothing and only trims, so it is the mode for a code with a\nhyphen in it.\n\n**`alphanumeric` is ASCII letters and digits**, which is narrower than the\nword is in general and is the right narrowness here. A code of this kind\ncomes off a keypad, an SMS or an authenticator, and none of them emit `é`;\na filter that accepted it would let through a character the service on the\nother end is going to reject. A consumer whose codes really do carry\nmarked letters wants `text`, which judges nothing.\n\n**Not reflected**: nothing selects on it, so reflecting only writes\n`type=\"numeric\"` onto every `<helix-headless-pin-input>` ever rendered, an\nattribute no consumer's markup had. The area rules carry the sentence\n\"reflect only what CSS selects on\". The real inputs take it as a binding,\nwhich is what makes the keyboard follow.",
67043
67034
  "attribute": "type"
67044
67035
  },
67045
67036
  {
@@ -68190,7 +68181,7 @@
68190
68181
  "text": "PinType"
68191
68182
  },
68192
68183
  "default": "'numeric'",
68193
- "description": "What a box accepts, which decides the keyboard a phone offers.\n\n`numeric` and `alphanumeric` also refuse anything else on the way in,\nbecause a code that is digits is digits: letting a letter into a box a\nreader cannot submit is a mistake they have to find and undo themselves.\n`text` refuses nothing and only trims, so it is the mode for a code with a\nhyphen in it.\n\n**`alphanumeric` is ASCII letters and digits**, which is narrower than the\nword is in general and is the right narrowness here. A code of this kind\ncomes off a keypad, an SMS or an authenticator, and none of them emit `é`;\na filter that accepted it would let through a character the service on the\nother end is going to reject. A consumer whose codes really do carry\nmarked letters wants `text`, which judges nothing.\n\n**Not reflected**: nothing selects on it, so reflecting only writes\n`type=\"numeric\"` onto every `<helix-pin-input>` ever rendered, an attribute\nno consumer's markup had. The area rules carry the sentence \"reflect only\nwhat CSS selects on\". The real inputs take it as a binding, which is what\nmakes the keyboard follow.",
68184
+ "description": "What a box accepts, which decides the keyboard a phone offers.\n\n`numeric` and `alphanumeric` also refuse anything else on the way in,\nbecause a code that is digits is digits: letting a letter into a box a\nreader cannot submit is a mistake they have to find and undo themselves.\n`text` refuses nothing and only trims, so it is the mode for a code with a\nhyphen in it.\n\n**`alphanumeric` is ASCII letters and digits**, which is narrower than the\nword is in general and is the right narrowness here. A code of this kind\ncomes off a keypad, an SMS or an authenticator, and none of them emit `é`;\na filter that accepted it would let through a character the service on the\nother end is going to reject. A consumer whose codes really do carry\nmarked letters wants `text`, which judges nothing.\n\n**Not reflected**: nothing selects on it, so reflecting only writes\n`type=\"numeric\"` onto every `<helix-headless-pin-input>` ever rendered, an\nattribute no consumer's markup had. The area rules carry the sentence\n\"reflect only what CSS selects on\". The real inputs take it as a binding,\nwhich is what makes the keyboard follow.",
68194
68185
  "fieldName": "type"
68195
68186
  },
68196
68187
  {
@@ -68454,7 +68445,7 @@
68454
68445
  "name": "panel",
68455
68446
  "privacy": "private",
68456
68447
  "readonly": true,
68457
- "default": "new PopoverController(this, { anchor: () => this.trigger, /* The host *and* whatever invoked it, never the panel alone. An outside press is measured against this, and the styled host is `display: contents` with no box of its own, so a boundary of the panel alone would close on the very press that opened it. A `--toggle` button outside the host is part of the control by any reading a reader would give it: pressing it while the panel is open should close it once, not close it on `pointerdown` and reopen it on the `click` that follows. */ boundary: (): (HTMLElement | undefined)[] => [this, this.invoker], offset: () => this.offset, onDismiss: () => this.hide(), open: () => this.open, placement: () => this.placement, surface: () => this.partNamed('popover'), })"
68448
+ "default": "new PopoverController(this, { anchor: () => this.trigger, /* The host *and* whatever invoked it, never the panel alone. An outside press is measured against this, and the host is not a box to rely on, a sheet being free to give it none, so a boundary of the panel alone would close on the very press that opened it. A `--toggle` button outside the host is part of the control by any reading a reader would give it: pressing it while the panel is open should close it once, not close it on `pointerdown` and reopen it on the `click` that follows. */ boundary: (): (HTMLElement | undefined)[] => [this, this.invoker], offset: () => this.offset, onDismiss: () => this.hide(), open: () => this.open, placement: () => this.placement, surface: () => this.partNamed('popover'), })"
68458
68449
  },
68459
68450
  {
68460
68451
  "kind": "field",
@@ -68463,7 +68454,7 @@
68463
68454
  "text": "HTMLElement | undefined"
68464
68455
  },
68465
68456
  "privacy": "private",
68466
- "description": "The invoker that last opened the panel, when a command did.\n\nKept because the `source` a command hands the handlers is needed twice\nover. It is the anchor: the styled host is a boxless `display: contents`\nelement, so a popover opened by a command outside it would otherwise open\nagainst the window origin. And the outside-press dismissal has to know the\ninvoker is part of the control, the press firing on `pointerdown` and the\ncommand arriving on the `click` after it, or a `--toggle` button outside\nthe host closes the panel and immediately reopens it, for ever."
68457
+ "description": "The invoker that last opened the panel, when a command did.\n\nKept because the `source` a command hands the handlers is needed twice\nover. It is the anchor: the host is not a box to position against, a sheet\nbeing free to give it none, so a popover opened by a command outside it\nwould otherwise open against the window origin. And the outside-press\ndismissal has to know the invoker is part of the control, the press firing\non `pointerdown` and the command arriving on the `click` after it, or a\n`--toggle` button outside the host closes the panel and immediately reopens\nit, for ever."
68467
68458
  },
68468
68459
  {
68469
68460
  "kind": "field",
@@ -68545,7 +68536,7 @@
68545
68536
  "text": "boolean"
68546
68537
  },
68547
68538
  "default": "false",
68548
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
68539
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
68549
68540
  "attribute": "default-open",
68550
68541
  "inheritedFrom": {
68551
68542
  "name": "MixinControllerOpen",
@@ -69028,7 +69019,7 @@
69028
69019
  "text": "boolean"
69029
69020
  },
69030
69021
  "default": "false",
69031
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
69022
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
69032
69023
  "fieldName": "defaultOpen",
69033
69024
  "inheritedFrom": {
69034
69025
  "name": "MixinControllerOpen",
@@ -71915,7 +71906,7 @@
71915
71906
  "type": {
71916
71907
  "text": "boolean"
71917
71908
  },
71918
- "description": "Whether the markup declared this one chosen, which is what a reset returns to.\n\n`<option selected>` reflects to `defaultSelected` and `option.selected` is\nlive state that does not reflect, and those are two different facts. This\nelement has one `selected` doing both jobs, so the declaration is the\nattribute and the state is the property.\n\n**The attribute, read when it is asked for, and never a snapshot taken in\nthe constructor.** A field initializer runs there, and an element the HTML\nparser created has none of its attributes yet at that moment: measured on\nthis element, on `Option` and on `Toggle`, `<helix-radio value=\"a\"\nselected>` reported `defaultSelected` as `false` both from parsed markup\nand from `createElement` followed by `setAttribute`, which is every way a\nconsumer writes one. The snapshot could only ever be true for an element\nalready in the document when `customElements.define` ran.\n\nNothing overwrites it either, which is what makes reading it late correct\nrather than merely later: `selected` does not reflect, for the reason\n`willUpdate` records, so the group's writes never reach the attribute and\nwhat it says is what the markup said.\n\n**The deeper half is not this.** State reflecting under the declaration's\nname is the fault `TreeItem` avoids by mirroring to `data-selected`.\nSplitting them means moving what every stylesheet selects on, which is a\nchange of its own rather than a property being added."
71909
+ "description": "Whether the markup declared this one chosen, which is what a reset returns to.\n\n`<option selected>` reflects to `defaultSelected` and `option.selected` is\nlive state that does not reflect, and those are two different facts. This\nelement has one `selected` doing both jobs, so the declaration is the\nattribute and the state is the property.\n\n**The attribute, read when it is asked for, and never a snapshot taken in\nthe constructor.** A field initializer runs there, and an element the HTML\nparser created has none of its attributes yet at that moment: measured on\nthis element, on `Option` and on `Toggle`, `<helix-headless-radio value=\"a\"\nselected>` reported `defaultSelected` as `false` both from parsed markup\nand from `createElement` followed by `setAttribute`, which is every way a\nconsumer writes one. The snapshot could only ever be true for an element\nalready in the document when `customElements.define` ran.\n\nNothing overwrites it either, which is what makes reading it late correct\nrather than merely later: `selected` does not reflect, for the reason\n`willUpdate` records, so the group's writes never reach the attribute and\nwhat it says is what the markup said.\n\n**The deeper half is not this.** State reflecting under the declaration's\nname is the fault `TreeItem` avoids by mirroring to `data-selected`.\nSplitting them means moving what every stylesheet selects on, which is a\nchange of its own rather than a property being added."
71919
71910
  },
71920
71911
  {
71921
71912
  "kind": "field",
@@ -75709,7 +75700,7 @@
75709
75700
  "text": "boolean"
75710
75701
  },
75711
75702
  "default": "false",
75712
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
75703
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
75713
75704
  "attribute": "default-open",
75714
75705
  "inheritedFrom": {
75715
75706
  "name": "MixinControllerOpen",
@@ -76775,7 +76766,7 @@
76775
76766
  "text": "boolean"
76776
76767
  },
76777
76768
  "default": "false",
76778
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
76769
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
76779
76770
  "fieldName": "defaultOpen",
76780
76771
  "inheritedFrom": {
76781
76772
  "name": "MixinControllerOpen",
@@ -80435,7 +80426,7 @@
80435
80426
  "declarations": [
80436
80427
  {
80437
80428
  "kind": "class",
80438
- "description": "**A menu, and deliberately not a new one.** Its rows are commands, which is\nwhat `role=\"menu\"` and `menuitem` exist for, so this takes them and takes the\nbehavior with them: the arrow keys are `KeyboardNavigationController`, the\npanel is `PopoverController`, and open and closed is `MixinControllerOpen`.\n`Menu` is built from the same pieces. What is not shared is what actually\ndiffers: a dial has no submenus, no headers, no checkable rows and no long\nlist to type ahead through, and shipping it as an appearance of `Menu` would\nmean defining what a dial with a submenu in it does.\n\n**The trigger is a control the consumer slots**, and the floating action\nbutton is the usual one: `helix-icon-button` with `shape=\"circle\"` and\n`raised`. There is no `helix-fab`, because it would re-declare `emphasis`,\n`tone`, `label` and a size around a control that already has all four. A\nround raised button is a shape, and where it sits is `data-dock` in the base\nlayer.\n\n**Nothing is reserved from the keyboard.** A menu that drills has to keep the\nhorizontal pair for going in and coming back; a dial goes nowhere, so all four\narrows move through the actions and a reader who guesses either axis is\nanswered. That is the controller's own house position, and this is a component\nwith no reason to argue with it.",
80429
+ "description": "**A menu, and deliberately not a new one.** Its rows are commands, which is\nwhat `role=\"menu\"` and `menuitem` exist for, so this takes them and takes the\nbehavior with them: the arrow keys are `KeyboardNavigationController`, the\npanel is `PopoverController`, and open and closed is `MixinControllerOpen`.\n`Menu` is built from the same pieces. What is not shared is what actually\ndiffers: a dial has no submenus, no headers, no checkable rows and no long\nlist to type ahead through, and shipping it as an appearance of `Menu` would\nmean defining what a dial with a submenu in it does.\n\n**The trigger is a control the consumer slots**, and the floating action\nbutton is the usual one: `IconButton` with `shape=\"circle\"` and `raised`.\nThere is no `helix-fab`, because it would re-declare `emphasis`, `tone`,\n`label` and a size around a control that already has all four. A round raised\nbutton is a shape, and where it sits is `data-dock` in the base layer.\n\n**Nothing is reserved from the keyboard.** A menu that drills has to keep the\nhorizontal pair for going in and coming back; a dial goes nowhere, so all four\narrows move through the actions and a reader who guesses either axis is\nanswered. That is the controller's own house position, and this is a component\nwith no reason to argue with it.",
80439
80430
  "name": "HelixHeadlessSpeedDial",
80440
80431
  "cssParts": [
80441
80432
  {
@@ -80571,7 +80562,7 @@
80571
80562
  "text": "TemplateResult"
80572
80563
  }
80573
80564
  },
80574
- "description": "The control that opens it, behind a seam the styled tier can move.\n\n**This is the case the tier rule blocks and a render method unblocks.** A\nbare `<button>` is what the headless tier can write: it must not reach for\n`helix-button`, which lives a tier above and would make `headless` depend\non `styled`. So the base draws the plain control and a tier that has buttons\nof its own overrides this to use one. Written inline, the only way\nto change it would be to reimplement the template, panel and all."
80565
+ "description": "The control that opens it, behind a seam the styled tier can move.\n\n**This is the case the tier rule blocks and a render method unblocks.** A\nbare `<button>` is what the headless tier can write: it must not reach for\n`Button`, which lives a tier above and would make `headless` depend on\n`styled`. So the base draws the plain control and a tier that has buttons\nof its own overrides this to use one. Written inline, the only way to\nchange it would be to reimplement the template, panel and all."
80575
80566
  },
80576
80567
  {
80577
80568
  "kind": "field",
@@ -80593,7 +80584,7 @@
80593
80584
  "text": "boolean"
80594
80585
  },
80595
80586
  "default": "false",
80596
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
80587
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
80597
80588
  "attribute": "default-open",
80598
80589
  "inheritedFrom": {
80599
80590
  "name": "MixinControllerOpen",
@@ -81084,7 +81075,7 @@
81084
81075
  "text": "boolean"
81085
81076
  },
81086
81077
  "default": "false",
81087
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
81078
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
81088
81079
  "fieldName": "defaultOpen",
81089
81080
  "inheritedFrom": {
81090
81081
  "name": "MixinControllerOpen",
@@ -82797,7 +82788,7 @@
82797
82788
  "type": {
82798
82789
  "text": "'column-reverse' | 'row' | 'row-reverse' | undefined"
82799
82790
  },
82800
- "description": "Which way the label and the value are arranged.\n\nAbsent is a column, the label over the number, which is how a figure is read\non a dashboard: the words say what is coming and the number answers.\n`column-reverse` puts the number first, which is right where the number is\nthe headline and the label is a caption under it.\n\nThe row directions set them side by side, for a figure in a line of text or\na narrow strip where a stacked pair would be two lines of almost nothing.\n\nA property rather than a `helix-flex` around it, because the unit has to\nstay on the value's baseline whichever way the pair goes, and only this\nelement knows which of its children the unit belongs to.\n\n**Optional rather than defaulted to `column`, which is not a style\npreference.** A reflecting property with a default writes its attribute onto\nthe host the moment the element upgrades, and the host is markup the\nconsumer rendered: React compares what it rendered against what is there and\nreports a hydration mismatch. The absent attribute is the column, which the\nstylesheet reads as the base case, and the server spec asserts the host\ncarries nothing nobody wrote.",
82791
+ "description": "Which way the label and the value are arranged.\n\nAbsent is a column, the label over the number, which is how a figure is read\non a dashboard: the words say what is coming and the number answers.\n`column-reverse` puts the number first, which is right where the number is\nthe headline and the label is a caption under it.\n\nThe row directions set them side by side, for a figure in a line of text or\na narrow strip where a stacked pair would be two lines of almost nothing.\n\nA property rather than a `Flex` around it, because the unit has to stay on\nthe value's baseline whichever way the pair goes, and only this element\nknows which of its children the unit belongs to.\n\n**Optional rather than defaulted to `column`, which is not a style\npreference.** A reflecting property with a default writes its attribute onto\nthe host the moment the element upgrades, and the host is markup the\nconsumer rendered: React compares what it rendered against what is there and\nreports a hydration mismatch. The absent attribute is the column, which the\nstylesheet reads as the base case, and the server spec asserts the host\ncarries nothing nobody wrote.",
82801
82792
  "attribute": "direction",
82802
82793
  "reflects": true
82803
82794
  },
@@ -83132,7 +83123,7 @@
83132
83123
  "type": {
83133
83124
  "text": "'column-reverse' | 'row' | 'row-reverse' | undefined"
83134
83125
  },
83135
- "description": "Which way the label and the value are arranged.\n\nAbsent is a column, the label over the number, which is how a figure is read\non a dashboard: the words say what is coming and the number answers.\n`column-reverse` puts the number first, which is right where the number is\nthe headline and the label is a caption under it.\n\nThe row directions set them side by side, for a figure in a line of text or\na narrow strip where a stacked pair would be two lines of almost nothing.\n\nA property rather than a `helix-flex` around it, because the unit has to\nstay on the value's baseline whichever way the pair goes, and only this\nelement knows which of its children the unit belongs to.\n\n**Optional rather than defaulted to `column`, which is not a style\npreference.** A reflecting property with a default writes its attribute onto\nthe host the moment the element upgrades, and the host is markup the\nconsumer rendered: React compares what it rendered against what is there and\nreports a hydration mismatch. The absent attribute is the column, which the\nstylesheet reads as the base case, and the server spec asserts the host\ncarries nothing nobody wrote.",
83126
+ "description": "Which way the label and the value are arranged.\n\nAbsent is a column, the label over the number, which is how a figure is read\non a dashboard: the words say what is coming and the number answers.\n`column-reverse` puts the number first, which is right where the number is\nthe headline and the label is a caption under it.\n\nThe row directions set them side by side, for a figure in a line of text or\na narrow strip where a stacked pair would be two lines of almost nothing.\n\nA property rather than a `Flex` around it, because the unit has to stay on\nthe value's baseline whichever way the pair goes, and only this element\nknows which of its children the unit belongs to.\n\n**Optional rather than defaulted to `column`, which is not a style\npreference.** A reflecting property with a default writes its attribute onto\nthe host the moment the element upgrades, and the host is markup the\nconsumer rendered: React compares what it rendered against what is there and\nreports a hydration mismatch. The absent attribute is the column, which the\nstylesheet reads as the base case, and the server spec asserts the host\ncarries nothing nobody wrote.",
83136
83127
  "fieldName": "direction"
83137
83128
  }
83138
83129
  ],
@@ -83231,7 +83222,7 @@
83231
83222
  "name": "HelixHeadlessSteps",
83232
83223
  "slots": [
83233
83224
  {
83234
- "description": "The steps, which are `helix-step` elements.",
83225
+ "description": "The steps.",
83235
83226
  "name": ""
83236
83227
  }
83237
83228
  ],
@@ -83319,7 +83310,7 @@
83319
83310
  "text": "string"
83320
83311
  },
83321
83312
  "default": "''",
83322
- "description": "Initial item for uncontrolled use.\n\nIgnored once `active` is written.",
83313
+ "description": "Which item the markup declared current.\n\nIgnored once `active` is written.",
83323
83314
  "attribute": "default-active",
83324
83315
  "inheritedFrom": {
83325
83316
  "name": "MixinControllerActive",
@@ -83806,7 +83797,7 @@
83806
83797
  "text": "string"
83807
83798
  },
83808
83799
  "default": "''",
83809
- "description": "Initial item for uncontrolled use.\n\nIgnored once `active` is written.",
83800
+ "description": "Which item the markup declared current.\n\nIgnored once `active` is written.",
83810
83801
  "fieldName": "defaultActive",
83811
83802
  "inheritedFrom": {
83812
83803
  "name": "MixinControllerActive",
@@ -83887,7 +83878,7 @@
83887
83878
  "declarations": [
83888
83879
  {
83889
83880
  "kind": "class",
83890
- "description": "**The name is a button, and only the name.** The marker is `aria-hidden`\ndecoration, so wrapping it would add hit area and no meaning. It is\n`helix-button` rather than a `<button>` this element resets: the hover wash,\nthe focus ring and the disabled treatment are decisions the button carries.\n\n**It says nothing about where a reader may go.** Every step is pressable and\nannounces itself with `helix-select`; refusing the ones ahead is `disabled`,\nwhich the consumer sets, because only they know whether a form can be\nskipped.\n\n**The marker is a slot whose fallback is the state.** A finished stage shows\na check, the current one a target, one not yet reached an empty ring. Exactly\none is rendered, chosen from the step's own two booleans, rather than three\nwith two hidden in CSS: the accessibility tree would otherwise carry marks\nthat are not there.",
83881
+ "description": "**The name is a button, and only the name.** The marker is `aria-hidden`\ndecoration, so wrapping it would add hit area and no meaning. It is `Button`\nrather than a `<button>` this element resets: the hover wash, the focus ring\nand the disabled treatment are decisions the button carries.\n\n**It says nothing about where a reader may go.** Every step is pressable and\nannounces itself with `helix-select`; refusing the ones ahead is `disabled`,\nwhich the consumer sets, because only they know whether a form can be\nskipped.\n\n**The marker is a slot whose fallback is the state.** A finished stage shows\na check, the current one a target, one not yet reached an empty ring. Exactly\none is rendered, chosen from the step's own two booleans, rather than three\nwith two hidden in CSS: the accessibility tree would otherwise carry marks\nthat are not there.",
83891
83882
  "name": "HelixHeadlessStep",
83892
83883
  "cssParts": [
83893
83884
  {
@@ -83903,7 +83894,7 @@
83903
83894
  "name": "description"
83904
83895
  },
83905
83896
  {
83906
- "description": "The step's name, which is a `helix-button`.",
83897
+ "description": "The step's name, which is a control.",
83907
83898
  "name": "label"
83908
83899
  },
83909
83900
  {
@@ -83933,7 +83924,7 @@
83933
83924
  "name": ""
83934
83925
  },
83935
83926
  {
83936
- "description": "What the stage holds. Always rendered here, a tier with no stylesheet having nothing to fold it with; the styled tier opens it on the current step down a column, and a row has no space under a step to open it into.",
83927
+ "description": "What the stage holds. Always rendered here, a tier with no stylesheet having nothing to fold it with, so whether it is folded away is the sheet's answer and not this tier's.",
83937
83928
  "name": "content"
83938
83929
  },
83939
83930
  {
@@ -84586,7 +84577,7 @@
84586
84577
  "text": "boolean"
84587
84578
  },
84588
84579
  "default": "false",
84589
- "description": "Initial checked state for uncontrolled use, where nothing declared one.",
84580
+ "description": "Whether the markup declared it checked, which is where a reset returns to.",
84590
84581
  "attribute": "default-checked",
84591
84582
  "inheritedFrom": {
84592
84583
  "name": "MixinControllerChecked",
@@ -85468,7 +85459,7 @@
85468
85459
  "text": "boolean"
85469
85460
  },
85470
85461
  "default": "false",
85471
- "description": "Initial checked state for uncontrolled use, where nothing declared one.",
85462
+ "description": "Whether the markup declared it checked, which is where a reset returns to.",
85472
85463
  "fieldName": "defaultChecked",
85473
85464
  "inheritedFrom": {
85474
85465
  "name": "MixinControllerChecked",
@@ -86096,11 +86087,11 @@
86096
86087
  }
86097
86088
  }
86098
86089
  ],
86099
- "description": "The edge a column names, where it names one of the three.\n\n**`align` is a string anybody can write**, the union on the property being a\ncompile-time claim and nothing else, and both tables put the value straight\ninto CSS: `helix-table` into a rule in each row's shadow root, `helix-data-table`\ninto the cell it draws. One guard, here with the property, rather than one in\neach table and only one of them written."
86090
+ "description": "The edge a column names, where it names one of the three.\n\n**`align` is a string anybody can write**, the union on the property being a\ncompile-time claim and nothing else, and both tables put the value straight\ninto CSS: `Table` into a rule in each row's shadow root, `DataTable` into the\ncell it draws. One guard, here with the property, rather than one in each\ntable and only one of them written."
86100
86091
  },
86101
86092
  {
86102
86093
  "kind": "class",
86103
- "description": "**The column is the source of both its heading and its track.** Add one and\nthe table has another track; remove one and it does not. That is what ties\nthe two together, and a table-level track list on its own does not: a list\nthat is accidentally the headings is invalid CSS a grid ignores in silence,\ndrawing the whole table as one column. `helix-table`'s `columns` is dealt out\na track at a time against the columns declared under it, so a heading among\nthe widths costs its own column a width and no more, and a list longer or\nshorter than the columns is trimmed or shared rather than being a second\ncount of them. A column's own `width` wins over the track in its place.\n\n**It is also where every per-column fact goes**, which is the reason\n`helix-data-table` needs no column config object. `field` names the key the\ncell reads, `sortable` says a reader may reorder by it, `align` says which\nedge the values line up against, and `cell` takes a function for anything the\nfield alone cannot express. The schema is markup and the data is a property:\na schema is small, declarative, and something a reader should be able to see\nin the HTML, and data is large and windowed.\n\n**The same element serves both tables**, the markup one and the data one. It\nis identified by a flag rather than by `instanceof`, so a `helix-table-column`\nworks inside either without the two roots sharing anything else.\n\n**It generates no box of its own**, the same as a row: the heading is a grid\nitem of the table, so it lines up with the cells under it rather than sitting\nin a wrapper that has to be kept the same width.\n\n**`hidden` takes the column out of the grid**, its heading and its track\nboth, so the columns after it keep their own widths and every row keeps its\ncells under their headings. `hidden=\"until-found\"` keeps its track, the\nheading being left drawn, as every Helix element leaves one with that value.\n`helix-data-table` draws the cells, so it leaves out the ones under a hidden\ncolumn. A `helix-table`'s cells are markup the consumer wrote, so hide them\nwith the column, as removing a column means removing its cells: a row with a\ncell more than the table has tracks wraps into the next.\n\n**A heading that does something holds a control that does it.** The host is\nthe column header, and a header is not focusable, so a sortable heading is a\n`<button>` inside it: the pattern for a sortable table, and the only way a\nreader on a keyboard reaches the sort at all. A column a reader may resize\ncarries a `separator` on its end edge, moved by dragging it or with the arrow\nkeys, and a column in a table that lets a reader reorder its columns carries\na grip the table moves.",
86094
+ "description": "**The column is the source of both its heading and its track.** Add one and\nthe table has another track; remove one and it does not. That is what ties\nthe two together, and a table-level track list on its own does not: a list\nthat is accidentally the headings is invalid CSS a grid ignores in silence,\ndrawing the whole table as one column. `Table`'s `columns` is dealt out a\ntrack at a time against the columns declared under it, so a heading among the\nwidths costs its own column a width and no more, and a list longer or shorter\nthan the columns is trimmed or shared rather than being a second count of\nthem. A column's own `width` wins over the track in its place.\n\n**It is also where every per-column fact goes**, which is the reason\n`DataTable` needs no column config object. `field` names the key the cell\nreads, `sortable` says a reader may reorder by it, `align` says which edge\nthe values line up against, and `cell` takes a function for anything the\nfield alone cannot express. The schema is markup and the data is a property:\na schema is small, declarative, and something a reader should be able to see\nin the HTML, and data is large and windowed.\n\n**The same element serves both tables**, the markup one and the data one. It\nis identified by a flag rather than by `instanceof`, so a `TableColumn` works\ninside either without the two roots sharing anything else.\n\n**It generates no box of its own**, the same as a row: the heading is a grid\nitem of the table, so it lines up with the cells under it rather than sitting\nin a wrapper that has to be kept the same width.\n\n**`hidden` takes the column out of the grid**, its heading and its track\nboth, so the columns after it keep their own widths and every row keeps its\ncells under their headings. `hidden=\"until-found\"` keeps its track, the\nheading being left drawn, as every Helix element leaves one with that value.\n`DataTable` draws the cells, so it leaves out the ones under a hidden column.\nA `Table`'s cells are markup the consumer wrote, so hide them with the\ncolumn, as removing a column means removing its cells: a row with a cell more\nthan the table has tracks wraps into the next.\n\n**A heading that does something holds a control that does it.** The host is\nthe column header, and a header is not focusable, so a sortable heading is a\n`<button>` inside it: the pattern for a sortable table, and the only way a\nreader on a keyboard reaches the sort at all. A column a reader may resize\ncarries a `separator` on its end edge, moved by dragging it or with the arrow\nkeys, and a column in a table that lets a reader reorder its columns carries\na grip the table moves.",
86104
86095
  "name": "HelixHeadlessTableColumn",
86105
86096
  "cssParts": [
86106
86097
  {
@@ -86137,7 +86128,7 @@
86137
86128
  "type": {
86138
86129
  "text": "'center' | 'end' | 'start' | undefined"
86139
86130
  },
86140
- "description": "Which edge the values line up against.\n\n`end` is what a column of numbers wants, so digits of the same magnitude sit\nabove each other. Left unset the cell inherits the table's own alignment,\nwhich is `start` for text in either writing direction. `helix-data-table`\naligns the cells it draws. A `helix-table`'s cells are markup the consumer\nwrote, so the table writes nothing onto them: it publishes the edge to each\ncell under this column as `--table-cell-align`, which `@fusion.dev/helix`\nreads. The heading is this element's own, and `@fusion.dev/helix` sets it to\nthe same edge in either table. `end` is the inline end, so in a\nright-to-left table it is the left.\n\n**Reflected, because the heading is drawn by a stylesheet and has no other\nway to learn it.** Set as a property, which is how React sets it, an\nunreflected `align` left no attribute to select on, so the heading stayed at\nthe start over a column of digits set to the end. It is the author's\ndeclaration and nothing moves it afterwards, so an attribute cannot come to\ndisagree with the element, which is the reason `open` records a custom\nstate instead. No default, so an unset column writes nothing onto its host.",
86131
+ "description": "Which edge the values line up against.\n\n`end` is what a column of numbers wants, so digits of the same magnitude\nsit above each other. Left unset the cell inherits the table's own\nalignment, which is `start` for text in either writing direction.\n`DataTable` aligns the cells it draws. A `Table`'s cells are markup the\nconsumer wrote, so the table writes nothing onto them: it publishes the\nedge to each cell under this column as `--table-cell-align`, which\n`@fusion.dev/helix` reads. The heading is this element's own, and\n`@fusion.dev/helix` sets it to the same edge in either table. `end` is the\ninline end, so in a right-to-left table it is the left.\n\n**Reflected, because the heading is drawn by a stylesheet and has no other\nway to learn it.** Set as a property, which is how React sets it, an\nunreflected `align` left no attribute to select on, so the heading stayed at\nthe start over a column of digits set to the end. It is the author's\ndeclaration and nothing moves it afterwards, so an attribute cannot come to\ndisagree with the element, which is the reason `open` records a custom\nstate instead. No default, so an unset column writes nothing onto its host.",
86141
86132
  "attribute": "align",
86142
86133
  "reflects": true
86143
86134
  },
@@ -86197,7 +86188,7 @@
86197
86188
  "text": "string"
86198
86189
  },
86199
86190
  "default": "''",
86200
- "description": "The track this column takes, as CSS.\n\nA single track value, so anything valid in `grid-template-columns` works:\n`16rem`, `auto`, `minmax(0, 2fr)`. Left unset the column takes the track\nin its place in a `helix-table`'s `columns`, where that table sets one, and\notherwise shares what is left over equally, as `minmax(max-content, 1fr)`.\nSet here, it wins over that list, which is what lets a reader resize a\ncolumn in a table that set one.\n\n**The floor is `max-content`, never `0` and never `min-content`.** A zero\nfloor lets a track shrink under its own content: at 375 the columns squeeze\nto 75px and `eu-central-1` wraps across lines, which reads as corrupt data\nrather than as a table that ran out of room. A `min-content` floor still\nbreaks it, a hyphen being a wrap opportunity.\n\nThe overflow has somewhere to go: `@fusion.dev/helix` scrolls the table's\nown box, so a long value pushes past the container and the table scrolls\ninstead of the value being destroyed. Measured at 375: tracks of 192, 89 and\n102 against a 343 box, so the table scrolls 384 and the page does not move.\n\nThe cost is that a column of prose asks for its longest paragraph on one\nline, so a column holding sentences rather than values wants\n`width=\"minmax(0, 1fr)\"` to opt back into wrapping. A headless consumer owns\nthe overflow either way, that being paint, and gets the honest track list.",
86191
+ "description": "The track this column takes, as CSS.\n\nA single track value, so anything valid in `grid-template-columns` works:\n`16rem`, `auto`, `minmax(0, 2fr)`. Left unset the column takes the track in\nits place in a `Table`'s `columns`, where that table sets one, and\notherwise shares what is left over equally, as `minmax(max-content, 1fr)`.\nSet here, it wins over that list, which is what lets a reader resize a\ncolumn in a table that set one.\n\n**The floor is `max-content`, never `0` and never `min-content`.** A zero\nfloor lets a track shrink under its own content: at 375 the columns squeeze\nto 75px and `eu-central-1` wraps across lines, which reads as corrupt data\nrather than as a table that ran out of room. A `min-content` floor still\nbreaks it, a hyphen being a wrap opportunity.\n\nThe overflow has somewhere to go: `@fusion.dev/helix` scrolls the table's\nown box, so a long value pushes past the container and the table scrolls\ninstead of the value being destroyed. Measured at 375: tracks of 192, 89 and\n102 against a 343 box, so the table scrolls 384 and the page does not move.\n\nThe cost is that a column of prose asks for its longest paragraph on one\nline, so a column holding sentences rather than values wants\n`width=\"minmax(0, 1fr)\"` to opt back into wrapping. A headless consumer owns\nthe overflow either way, that being paint, and gets the honest track list.",
86201
86192
  "attribute": "width"
86202
86193
  },
86203
86194
  {
@@ -86745,7 +86736,7 @@
86745
86736
  "type": {
86746
86737
  "text": "'center' | 'end' | 'start' | undefined"
86747
86738
  },
86748
- "description": "Which edge the values line up against.\n\n`end` is what a column of numbers wants, so digits of the same magnitude sit\nabove each other. Left unset the cell inherits the table's own alignment,\nwhich is `start` for text in either writing direction. `helix-data-table`\naligns the cells it draws. A `helix-table`'s cells are markup the consumer\nwrote, so the table writes nothing onto them: it publishes the edge to each\ncell under this column as `--table-cell-align`, which `@fusion.dev/helix`\nreads. The heading is this element's own, and `@fusion.dev/helix` sets it to\nthe same edge in either table. `end` is the inline end, so in a\nright-to-left table it is the left.\n\n**Reflected, because the heading is drawn by a stylesheet and has no other\nway to learn it.** Set as a property, which is how React sets it, an\nunreflected `align` left no attribute to select on, so the heading stayed at\nthe start over a column of digits set to the end. It is the author's\ndeclaration and nothing moves it afterwards, so an attribute cannot come to\ndisagree with the element, which is the reason `open` records a custom\nstate instead. No default, so an unset column writes nothing onto its host.",
86739
+ "description": "Which edge the values line up against.\n\n`end` is what a column of numbers wants, so digits of the same magnitude\nsit above each other. Left unset the cell inherits the table's own\nalignment, which is `start` for text in either writing direction.\n`DataTable` aligns the cells it draws. A `Table`'s cells are markup the\nconsumer wrote, so the table writes nothing onto them: it publishes the\nedge to each cell under this column as `--table-cell-align`, which\n`@fusion.dev/helix` reads. The heading is this element's own, and\n`@fusion.dev/helix` sets it to the same edge in either table. `end` is the\ninline end, so in a right-to-left table it is the left.\n\n**Reflected, because the heading is drawn by a stylesheet and has no other\nway to learn it.** Set as a property, which is how React sets it, an\nunreflected `align` left no attribute to select on, so the heading stayed at\nthe start over a column of digits set to the end. It is the author's\ndeclaration and nothing moves it afterwards, so an attribute cannot come to\ndisagree with the element, which is the reason `open` records a custom\nstate instead. No default, so an unset column writes nothing onto its host.",
86749
86740
  "fieldName": "align"
86750
86741
  },
86751
86742
  {
@@ -86781,7 +86772,7 @@
86781
86772
  "text": "string"
86782
86773
  },
86783
86774
  "default": "''",
86784
- "description": "The track this column takes, as CSS.\n\nA single track value, so anything valid in `grid-template-columns` works:\n`16rem`, `auto`, `minmax(0, 2fr)`. Left unset the column takes the track\nin its place in a `helix-table`'s `columns`, where that table sets one, and\notherwise shares what is left over equally, as `minmax(max-content, 1fr)`.\nSet here, it wins over that list, which is what lets a reader resize a\ncolumn in a table that set one.\n\n**The floor is `max-content`, never `0` and never `min-content`.** A zero\nfloor lets a track shrink under its own content: at 375 the columns squeeze\nto 75px and `eu-central-1` wraps across lines, which reads as corrupt data\nrather than as a table that ran out of room. A `min-content` floor still\nbreaks it, a hyphen being a wrap opportunity.\n\nThe overflow has somewhere to go: `@fusion.dev/helix` scrolls the table's\nown box, so a long value pushes past the container and the table scrolls\ninstead of the value being destroyed. Measured at 375: tracks of 192, 89 and\n102 against a 343 box, so the table scrolls 384 and the page does not move.\n\nThe cost is that a column of prose asks for its longest paragraph on one\nline, so a column holding sentences rather than values wants\n`width=\"minmax(0, 1fr)\"` to opt back into wrapping. A headless consumer owns\nthe overflow either way, that being paint, and gets the honest track list.",
86775
+ "description": "The track this column takes, as CSS.\n\nA single track value, so anything valid in `grid-template-columns` works:\n`16rem`, `auto`, `minmax(0, 2fr)`. Left unset the column takes the track in\nits place in a `Table`'s `columns`, where that table sets one, and\notherwise shares what is left over equally, as `minmax(max-content, 1fr)`.\nSet here, it wins over that list, which is what lets a reader resize a\ncolumn in a table that set one.\n\n**The floor is `max-content`, never `0` and never `min-content`.** A zero\nfloor lets a track shrink under its own content: at 375 the columns squeeze\nto 75px and `eu-central-1` wraps across lines, which reads as corrupt data\nrather than as a table that ran out of room. A `min-content` floor still\nbreaks it, a hyphen being a wrap opportunity.\n\nThe overflow has somewhere to go: `@fusion.dev/helix` scrolls the table's\nown box, so a long value pushes past the container and the table scrolls\ninstead of the value being destroyed. Measured at 375: tracks of 192, 89 and\n102 against a 343 box, so the table scrolls 384 and the page does not move.\n\nThe cost is that a column of prose asks for its longest paragraph on one\nline, so a column holding sentences rather than values wants\n`width=\"minmax(0, 1fr)\"` to opt back into wrapping. A headless consumer owns\nthe overflow either way, that being paint, and gets the honest track list.",
86785
86776
  "fieldName": "width"
86786
86777
  }
86787
86778
  ],
@@ -86910,7 +86901,7 @@
86910
86901
  "name": "HelixHeadlessTable",
86911
86902
  "cssProperties": [
86912
86903
  {
86913
- "description": "The column track list this element worked out from the columns declared in it. Written by the component, read by the sheet that paints: a stylesheet takes it to lay the grid out, and setting it does nothing, because the component writes it inline on the very element that reads it and an inline declaration beats any sheet. `--table-columns` is the one to set.",
86904
+ "description": "The column track list this element worked out from the columns declared in it. Written by the component, read by the sheet that paints: a stylesheet takes it to lay the grid out, and setting it does nothing, because the component writes it inline on the very element that reads it and an inline declaration beats any sheet. `columns` is the one to set.",
86914
86905
  "name": "--table-template"
86915
86906
  }
86916
86907
  ],
@@ -86946,7 +86937,7 @@
86946
86937
  "text": "string"
86947
86938
  },
86948
86939
  "default": "''",
86949
- "description": "The column widths as one track list, written once on the table.\n\nWith `helix-table-column` children, each track sizes the column in its\nplace, a hidden column counted, so hiding one takes its track with it and\nthe rest keep theirs. The columns decide how many tracks there are and this\nlist only how wide: a track past the last column is dropped, and a column\npast the last track shares what is left. With no columns declared it is\nthe whole track list. Tracks count as the grid counts them, so\n`minmax(0, 1fr)` is one and `repeat(2, 8rem)` is two, and one the grid\nwould refuse leaves its column at the default rather than taking the table\ndown to one column.\n\n**A column's own `width` wins over its track here.** The width is written\non the column it sizes, which is the more particular statement, and it is\nwhere a resize lands: a reader dragging a column's edge writes `width`, so\nwere this list to win, the drag would move the separator and leave the\ntrack where the list put it. This is the table's default for its columns,\nand each column may say otherwise.\n\n**It is also the only track list a server can send.** The shim has no tree\nto walk, so a render there knows of no columns and this attribute is the\nwhole answer: a table given one lays its grid out in the first paint, and a\ntable sized only by its columns is one track wide until it upgrades.\n\n**`helix-data-table` has none of this, and should not.** Its columns are\nits schema rather than an option, so there is always a column to write a\n`width` on and a list here would be a second way to say what that says.\nThis table's cells are markup, and a table written as rows of cells with no\n`helix-table-column` in it has nowhere else to be sized from. Both families\ntake the same CSS hook, `--table-columns` and `--data-table-columns`, which\nwins over whichever list the element worked out.",
86940
+ "description": "The column widths as one track list, written once on the table.\n\nWith `TableColumn` children, each track sizes the column in its place, a\nhidden column counted, so hiding one takes its track with it and the rest\nkeep theirs. The columns decide how many tracks there are and this list\nonly how wide: a track past the last column is dropped, and a column past\nthe last track shares what is left. With no columns declared it is the\nwhole track list. Tracks count as the grid counts them, so `minmax(0, 1fr)`\nis one and `repeat(2, 8rem)` is two, and one the grid would refuse leaves\nits column at the default rather than taking the table down to one column.\n\n**A column's own `width` wins over its track here.** The width is written\non the column it sizes, which is the more particular statement, and it is\nwhere a resize lands: a reader dragging a column's edge writes `width`, so\nwere this list to win, the drag would move the separator and leave the\ntrack where the list put it. This is the table's default for its columns,\nand each column may say otherwise.\n\n**It is also the only track list a server can send.** The shim has no tree\nto walk, so a render there knows of no columns and this attribute is the\nwhole answer: a table given one lays its grid out in the first paint, and a\ntable sized only by its columns is one track wide until it upgrades.\n\n**Data Table has none of this, and should not.** Its columns are its schema\nrather than an option, so there is always a column to write a `width` on\nand a list here would be a second way to say what that says. This table's\ncells are markup, and a table written as rows of cells with no column\ndeclared in it has nowhere else to be sized from.",
86950
86941
  "attribute": "columns"
86951
86942
  },
86952
86943
  {
@@ -87521,7 +87512,7 @@
87521
87512
  "text": "string"
87522
87513
  },
87523
87514
  "default": "''",
87524
- "description": "The column widths as one track list, written once on the table.\n\nWith `helix-table-column` children, each track sizes the column in its\nplace, a hidden column counted, so hiding one takes its track with it and\nthe rest keep theirs. The columns decide how many tracks there are and this\nlist only how wide: a track past the last column is dropped, and a column\npast the last track shares what is left. With no columns declared it is\nthe whole track list. Tracks count as the grid counts them, so\n`minmax(0, 1fr)` is one and `repeat(2, 8rem)` is two, and one the grid\nwould refuse leaves its column at the default rather than taking the table\ndown to one column.\n\n**A column's own `width` wins over its track here.** The width is written\non the column it sizes, which is the more particular statement, and it is\nwhere a resize lands: a reader dragging a column's edge writes `width`, so\nwere this list to win, the drag would move the separator and leave the\ntrack where the list put it. This is the table's default for its columns,\nand each column may say otherwise.\n\n**It is also the only track list a server can send.** The shim has no tree\nto walk, so a render there knows of no columns and this attribute is the\nwhole answer: a table given one lays its grid out in the first paint, and a\ntable sized only by its columns is one track wide until it upgrades.\n\n**`helix-data-table` has none of this, and should not.** Its columns are\nits schema rather than an option, so there is always a column to write a\n`width` on and a list here would be a second way to say what that says.\nThis table's cells are markup, and a table written as rows of cells with no\n`helix-table-column` in it has nowhere else to be sized from. Both families\ntake the same CSS hook, `--table-columns` and `--data-table-columns`, which\nwins over whichever list the element worked out.",
87515
+ "description": "The column widths as one track list, written once on the table.\n\nWith `TableColumn` children, each track sizes the column in its place, a\nhidden column counted, so hiding one takes its track with it and the rest\nkeep theirs. The columns decide how many tracks there are and this list\nonly how wide: a track past the last column is dropped, and a column past\nthe last track shares what is left. With no columns declared it is the\nwhole track list. Tracks count as the grid counts them, so `minmax(0, 1fr)`\nis one and `repeat(2, 8rem)` is two, and one the grid would refuse leaves\nits column at the default rather than taking the table down to one column.\n\n**A column's own `width` wins over its track here.** The width is written\non the column it sizes, which is the more particular statement, and it is\nwhere a resize lands: a reader dragging a column's edge writes `width`, so\nwere this list to win, the drag would move the separator and leave the\ntrack where the list put it. This is the table's default for its columns,\nand each column may say otherwise.\n\n**It is also the only track list a server can send.** The shim has no tree\nto walk, so a render there knows of no columns and this attribute is the\nwhole answer: a table given one lays its grid out in the first paint, and a\ntable sized only by its columns is one track wide until it upgrades.\n\n**Data Table has none of this, and should not.** Its columns are its schema\nrather than an option, so there is always a column to write a `width` on\nand a list here would be a second way to say what that says. This table's\ncells are markup, and a table written as rows of cells with no column\ndeclared in it has nowhere else to be sized from.",
87525
87516
  "fieldName": "columns"
87526
87517
  },
87527
87518
  {
@@ -87645,7 +87636,7 @@
87645
87636
  "declarations": [
87646
87637
  {
87647
87638
  "kind": "class",
87648
- "description": "`display: contents` in the styled tier, so the row's cells become items of\nthe table's own grid and every column lines up across every row. The row\nstill exists as an element, which is what a `<table>` gives away when its\ncells are laid out by the table algorithm.",
87639
+ "description": "The row renders its cells straight through and lays out none of them, so a\nsheet can take them into the table's own grid and every column lines up\nacross every row. The row still exists as an element, which is what a\n`<table>` gives away when its cells are laid out by the table algorithm.",
87649
87640
  "name": "HelixHeadlessTableRow",
87650
87641
  "slots": [
87651
87642
  {
@@ -88662,7 +88653,7 @@
88662
88653
  "text": "string"
88663
88654
  },
88664
88655
  "default": "''",
88665
- "description": "Initial item for uncontrolled use.\n\nIgnored once `active` is written.",
88656
+ "description": "Which item the markup declared current.\n\nIgnored once `active` is written.",
88666
88657
  "attribute": "default-active",
88667
88658
  "inheritedFrom": {
88668
88659
  "name": "MixinControllerActive",
@@ -89150,7 +89141,7 @@
89150
89141
  "text": "string"
89151
89142
  },
89152
89143
  "default": "''",
89153
- "description": "Initial item for uncontrolled use.\n\nIgnored once `active` is written.",
89144
+ "description": "Which item the markup declared current.\n\nIgnored once `active` is written.",
89154
89145
  "fieldName": "defaultActive",
89155
89146
  "inheritedFrom": {
89156
89147
  "name": "MixinControllerActive",
@@ -91827,7 +91818,7 @@
91827
91818
  "declarations": [
91828
91819
  {
91829
91820
  "kind": "class",
91830
- "description": "**The list is `helix-time-picker`, not a second one written here.** It is worth\nhaving on its own, flat in a settings pane with nothing to open, and this\nelement is the field, the overlay and the form. Exactly the arrangement Input\nDate has with `helix-date-picker` and Color Input with `helix-color-picker`.\n\n**Typed as well as picked, and that is the division the list depends on.** A\nlist at a step offers the times a product actually has, and the field is how a\nreader says `09:07`. Neither is a worse version of the other: without the\nfield a step is a cage, and without the list every common time is typed out.\n\n**The value is `HH:mm` on a twenty-four hour clock, always**, because that is\nwhat a form submits, what `min` and `max` compare against, and what sorts as a\nstring. What the field *shows* is the reader's own convention while it is\nidle, and the value itself once the caret is in it: the same separation Input\nDate draws, and for the same reason, which is that `2:30 PM` cannot be typed\nback and `Intl` has no parser to make it so.",
91821
+ "description": "**The list is `TimePicker`, not a second one written here.** It is worth\nhaving on its own, flat in a settings pane with nothing to open, and this\nelement is the field, the overlay and the form. Exactly the arrangement Input\nDate has with `DatePicker` and Color Input with `ColorPicker`.\n\n**Typed as well as picked, and that is the division the list depends on.** A\nlist at a step offers the times a product actually has, and the field is how a\nreader says `09:07`. Neither is a worse version of the other: without the\nfield a step is a cage, and without the list every common time is typed out.\n\n**The value is `HH:mm` on a twenty-four hour clock, always**, because that is\nwhat a form submits, what `min` and `max` compare against, and what sorts as a\nstring. What the field *shows* is the reader's own convention while it is\nidle, and the value itself once the caret is in it: the same separation Input\nDate draws, and for the same reason, which is that `2:30 PM` cannot be typed\nback and `Intl` has no parser to make it so.",
91831
91822
  "name": "HelixHeadlessTimeInput",
91832
91823
  "cssParts": [
91833
91824
  {
@@ -92083,7 +92074,7 @@
92083
92074
  "type": {
92084
92075
  "text": "'multiple' | 'range' | undefined"
92085
92076
  },
92086
- "description": "How many times can be held at once.\n\nAbsent is one. `range` holds a start and an end, `multiple` holds any\nnumber, and both are carried as one comma-separated value, which is what a\nform submits. `helix-time-picker` carries the longer note on the interaction and on\nwhy a wheel cannot do either.",
92077
+ "description": "How many times can be held at once.\n\nAbsent is one. `range` holds a start and an end, `multiple` holds any\nnumber, and both are carried as one comma-separated value, which is what a\nform submits. `TimePicker` carries the longer note on the interaction and\non why a wheel cannot do either.",
92087
92078
  "attribute": "mode",
92088
92079
  "reflects": true
92089
92080
  },
@@ -92257,7 +92248,7 @@
92257
92248
  "type": {
92258
92249
  "text": "'list' | 'wheels' | undefined"
92259
92250
  },
92260
- "description": "Whether the panel is one list of times or a column each.\n\n`list` offers whole times, which is what a product with slots or opening\nhours has. `wheels` splits them into an hour, a minute and a meridiem where\nthe locale uses one, which is the only way to reach `23:45` without\nscrolling most of a day. `helix-time-picker` carries the longer note on the trade.\n\n**Optional rather than defaulted, which is not a style preference.** A\nreflecting property with a default writes its attribute onto every host the\nmoment the element upgrades, including the ones a consumer rendered and did\nnot touch, and React reads that as a hydration mismatch. The absent\nattribute *is* the list, which the stylesheet reads as the base rule, so\nonly the departure has to be named.",
92251
+ "description": "Whether the panel is one list of times or a column each.\n\n`list` offers whole times, which is what a product with slots or opening\nhours has. `wheels` splits them into an hour, a minute and a meridiem where\nthe locale uses one, which is the only way to reach `23:45` without\nscrolling most of a day. `TimePicker` carries the longer note on the trade.\n\n**Optional rather than defaulted, which is not a style preference.** A\nreflecting property with a default writes its attribute onto every host the\nmoment the element upgrades, including the ones a consumer rendered and did\nnot touch, and React reads that as a hydration mismatch. The absent\nattribute *is* the list, which the stylesheet reads as the base rule, so\nonly the departure has to be named.",
92261
92252
  "attribute": "variant",
92262
92253
  "reflects": true
92263
92254
  },
@@ -92300,7 +92291,7 @@
92300
92291
  "text": "TemplateResult"
92301
92292
  }
92302
92293
  },
92303
- "description": "The mark on the button that opens the clock, behind a seam.\n\nSlot fallback, so a consumer replaces it by slotting; and a method, so the\ntier above replaces it by overriding.\n\n**A named import rather than `<helix-icon>`**, on three counts.\n`helix-icon` indexes the whole icon map at runtime, `icons[this.name]`, and\nno bundler can shake a runtime lookup, so every consumer of any component\nthat renders one ships all 50kB of path data; a named import ships one\npath. The import is checked when the package compiles, where a `name`\nstring is checked only by a later name lookup. And `helix-icon` is not\nregistered on the headless tier at all, which registers `helix-headless-icon`,\nso a headless consumer gets an inert unknown element and no mark whatsoever."
92294
+ "description": "The mark on the button that opens the clock, behind a seam.\n\nSlot fallback, so a consumer replaces it by slotting; and a method, so the\ntier above replaces it by overriding.\n\n**A named import rather than `<helix-headless-icon>`**, on three counts.\n`Icon` indexes the whole icon map at runtime, `icons[this.name]`, and no\nbundler can shake a runtime lookup, so every consumer of any component that\nrenders one ships all 50kB of path data; a named import ships one path. The\nimport is checked when the package compiles, where a `name` string is\nchecked only by a later name lookup. And `Icon` is not registered on the\nheadless tier at all, which registers `helix-headless-icon`, so a headless\nconsumer gets an inert unknown element and no mark whatsoever."
92304
92295
  },
92305
92296
  {
92306
92297
  "kind": "field",
@@ -92573,7 +92564,7 @@
92573
92564
  "text": "boolean"
92574
92565
  },
92575
92566
  "default": "false",
92576
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
92567
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
92577
92568
  "attribute": "default-open",
92578
92569
  "inheritedFrom": {
92579
92570
  "name": "MixinControllerOpen",
@@ -93792,7 +93783,7 @@
93792
93783
  "type": {
93793
93784
  "text": "'multiple' | 'range' | undefined"
93794
93785
  },
93795
- "description": "How many times can be held at once.\n\nAbsent is one. `range` holds a start and an end, `multiple` holds any\nnumber, and both are carried as one comma-separated value, which is what a\nform submits. `helix-time-picker` carries the longer note on the interaction and on\nwhy a wheel cannot do either.",
93786
+ "description": "How many times can be held at once.\n\nAbsent is one. `range` holds a start and an end, `multiple` holds any\nnumber, and both are carried as one comma-separated value, which is what a\nform submits. `TimePicker` carries the longer note on the interaction and\non why a wheel cannot do either.",
93796
93787
  "fieldName": "mode"
93797
93788
  },
93798
93789
  {
@@ -93836,7 +93827,7 @@
93836
93827
  "type": {
93837
93828
  "text": "'list' | 'wheels' | undefined"
93838
93829
  },
93839
- "description": "Whether the panel is one list of times or a column each.\n\n`list` offers whole times, which is what a product with slots or opening\nhours has. `wheels` splits them into an hour, a minute and a meridiem where\nthe locale uses one, which is the only way to reach `23:45` without\nscrolling most of a day. `helix-time-picker` carries the longer note on the trade.\n\n**Optional rather than defaulted, which is not a style preference.** A\nreflecting property with a default writes its attribute onto every host the\nmoment the element upgrades, including the ones a consumer rendered and did\nnot touch, and React reads that as a hydration mismatch. The absent\nattribute *is* the list, which the stylesheet reads as the base rule, so\nonly the departure has to be named.",
93830
+ "description": "Whether the panel is one list of times or a column each.\n\n`list` offers whole times, which is what a product with slots or opening\nhours has. `wheels` splits them into an hour, a minute and a meridiem where\nthe locale uses one, which is the only way to reach `23:45` without\nscrolling most of a day. `TimePicker` carries the longer note on the trade.\n\n**Optional rather than defaulted, which is not a style preference.** A\nreflecting property with a default writes its attribute onto every host the\nmoment the element upgrades, including the ones a consumer rendered and did\nnot touch, and React reads that as a hydration mismatch. The absent\nattribute *is* the list, which the stylesheet reads as the base rule, so\nonly the departure has to be named.",
93840
93831
  "fieldName": "variant"
93841
93832
  },
93842
93833
  {
@@ -93870,7 +93861,7 @@
93870
93861
  "text": "boolean"
93871
93862
  },
93872
93863
  "default": "false",
93873
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
93864
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
93874
93865
  "fieldName": "defaultOpen",
93875
93866
  "inheritedFrom": {
93876
93867
  "name": "MixinControllerOpen",
@@ -94227,7 +94218,7 @@
94227
94218
  },
94228
94219
  {
94229
94220
  "kind": "class",
94230
- "description": "**A list rather than three wheels**, and the reason is what a list already\nis. `helix-listbox` brings the keyboard, the typeahead, the scroll into view\nand the announcement of a set of options, and a time at a step is a set of\noptions. Three little wheels for hours, minutes and a meridiem are three\ncontrols to build, three to test, and a tab stop each for something a reader\nanswers once.\n\n**A step is what makes it a list at all.** Fifteen minutes is ninety-six rows,\nwhich a reader scrolls or types into; one minute is one thousand four hundred\nand forty, which is a listbox in name only. So the list is for the times a\nproduct actually offers, and arbitrary times are the field's job in Input\nTime, the same division Date Input draws between typing a date and using the\ncalendar.\n\n**The value is `HH:mm` on a twenty-four hour clock, always.** That is what a\nform submits and what `min` and `max` compare against, and it sorts as a\nstring, which is the whole reason the shape is that one. What each row *says*\nis the reader's own convention, from `Intl`.\n\n**The chosen row is marked in the markup, not worked out on upgrade.** The\nlistbox is handed the answer as `.value`, and lit-ssr serializes no property\nbinding, so a served `value=\"09:30\"` shipped ninety-six rows with nothing on\nany of them saying which one it was: the mark arrived when the listbox\nupgraded and ran `place`. So each option is given `selected` as well, which\nis an attribute binding and does serve, and which the listbox then agrees\nwith rather than fights, `place` writing the same answer from the same value.\n`selected` is the declaration a consumer writes on `Option` anywhere else in\nthe library, and Date Picker expresses its own choice as markup for the same\nreason: a picker whose answer is invisible until a script runs is a picker\nwhose answer is not served at all. Both readings do it, the list and the\nwheels, a wheel being a listbox like the list is.",
94221
+ "description": "**A list rather than three wheels**, and the reason is what a list already\nis. `Listbox` brings the keyboard, the typeahead, the scroll into view and\nthe announcement of a set of options, and a time at a step is a set of\noptions. Three little wheels for hours, minutes and a meridiem are three\ncontrols to build, three to test, and a tab stop each for something a reader\nanswers once.\n\n**A step is what makes it a list at all.** Fifteen minutes is ninety-six rows,\nwhich a reader scrolls or types into; one minute is one thousand four hundred\nand forty, which is a listbox in name only. So the list is for the times a\nproduct actually offers, and arbitrary times are the field's job in Input\nTime, the same division Date Input draws between typing a date and using the\ncalendar.\n\n**The value is `HH:mm` on a twenty-four hour clock, always.** That is what a\nform submits and what `min` and `max` compare against, and it sorts as a\nstring, which is the whole reason the shape is that one. What each row *says*\nis the reader's own convention, from `Intl`.\n\n**The chosen row is marked in the markup, not worked out on upgrade.** The\nlistbox is handed the answer as `.value`, and lit-ssr serializes no property\nbinding, so a served `value=\"09:30\"` shipped ninety-six rows with nothing on\nany of them saying which one it was: the mark arrived when the listbox\nupgraded and ran `place`. So each option is given `selected` as well, which\nis an attribute binding and does serve, and which the listbox then agrees\nwith rather than fights, `place` writing the same answer from the same value.\n`selected` is the declaration a consumer writes on `Option` anywhere else in\nthe library, and Date Picker expresses its own choice as markup for the same\nreason: a picker whose answer is invisible until a script runs is a picker\nwhose answer is not served at all. Both readings do it, the list and the\nwheels, a wheel being a listbox like the list is.",
94231
94222
  "name": "HelixHeadlessTimePicker",
94232
94223
  "cssParts": [
94233
94224
  {
@@ -94423,7 +94414,7 @@
94423
94414
  "type": {
94424
94415
  "text": "'multiple' | 'range' | undefined"
94425
94416
  },
94426
- "description": "How many times can be held at once.\n\nAbsent is one. `range` holds a start and an end with everything between\nthem shown as part of the answer, `multiple` holds any number, and both are\ncarried as one comma-separated value: the same shape `helix-date-picker` uses,\nbecause it is the same question asked of a different unit.\n\n**A range is two picks, and a third starts over.** That is the calendar's\nbehavior and a reader who has met one has met both. The alternative, a\nseparate \"from\" and \"to\" control, is two answers to what a product asks as\none, and it makes the between part impossible to show.\n\n**Neither works on wheels and the variant falls back.** A range on\nwheels is two sets of wheels, which is two controls; a multiple is a set,\nand a wheel has exactly one value by construction. Rather than draw\nsomething that cannot say what it holds, `wheels` renders as a list\nwhenever a mode is set.",
94417
+ "description": "How many times can be held at once.\n\nAbsent is one. `range` holds a start and an end with everything between\nthem shown as part of the answer, `multiple` holds any number, and both are\ncarried as one comma-separated value: the same shape `DatePicker` uses,\nbecause it is the same question asked of a different unit.\n\n**A range is two picks, and a third starts over.** That is the calendar's\nbehavior and a reader who has met one has met both. The alternative, a\nseparate \"from\" and \"to\" control, is two answers to what a product asks as\none, and it makes the between part impossible to show.\n\n**Neither works on wheels and the variant falls back.** A range on\nwheels is two sets of wheels, which is two controls; a multiple is a set,\nand a wheel has exactly one value by construction. Rather than draw\nsomething that cannot say what it holds, `wheels` renders as a list\nwhenever a mode is set.",
94427
94418
  "attribute": "mode",
94428
94419
  "reflects": true
94429
94420
  },
@@ -94692,7 +94683,7 @@
94692
94683
  "text": "Promise<void>"
94693
94684
  }
94694
94685
  },
94695
- "description": "Reveals once the wheels, or the list and its rows, have rendered themselves.\n\n`updated` is this element's own moment, and each wheel is a `helix-listbox`\nthat was created during this very render: its first update has been\nscheduled and has not run, so it has no rows and no height and `reveal`\nmeasures zero and gives up. Measured on a standalone picker, every column\nsat at `scrollTop: 0` with the answer nine rows down, which reads as a wheel\nshowing the wrong time rather than as one that failed to scroll.\n\nWhatever opens a panel calls `reveal` again afterwards, for the separate\nreason that method documents. Flat on a page there is no panel and no\nsecond call.\n\nSafe to run on every update: the listbox stops as soon as the chosen row is\nwithin a pixel of center, so a call with nothing to do costs two rect reads\nand changes nothing. It cannot fight a reader mid-scroll either, since\nscrolling a wheel changes no property and so schedules no update."
94686
+ "description": "Reveals once the wheels, or the list and its rows, have rendered themselves.\n\n`updated` is this element's own moment, and each wheel is a `Listbox` that\nwas created during this very render: its first update has been scheduled\nand has not run, so it has no rows and no height and `reveal` measures zero\nand gives up. Measured on a standalone picker, every column sat at\n`scrollTop: 0` with the answer nine rows down, which reads as a wheel\nshowing the wrong time rather than as one that failed to scroll.\n\nWhatever opens a panel calls `reveal` again afterwards, for the separate\nreason that method documents. Flat on a page there is no panel and no\nsecond call.\n\nSafe to run on every update: the listbox stops as soon as the chosen row is\nwithin a pixel of center, so a call with nothing to do costs two rect reads\nand changes nothing. It cannot fight a reader mid-scroll either, since\nscrolling a wheel changes no property and so schedules no update."
94696
94687
  },
94697
94688
  {
94698
94689
  "kind": "field",
@@ -95493,7 +95484,7 @@
95493
95484
  "type": {
95494
95485
  "text": "'multiple' | 'range' | undefined"
95495
95486
  },
95496
- "description": "How many times can be held at once.\n\nAbsent is one. `range` holds a start and an end with everything between\nthem shown as part of the answer, `multiple` holds any number, and both are\ncarried as one comma-separated value: the same shape `helix-date-picker` uses,\nbecause it is the same question asked of a different unit.\n\n**A range is two picks, and a third starts over.** That is the calendar's\nbehavior and a reader who has met one has met both. The alternative, a\nseparate \"from\" and \"to\" control, is two answers to what a product asks as\none, and it makes the between part impossible to show.\n\n**Neither works on wheels and the variant falls back.** A range on\nwheels is two sets of wheels, which is two controls; a multiple is a set,\nand a wheel has exactly one value by construction. Rather than draw\nsomething that cannot say what it holds, `wheels` renders as a list\nwhenever a mode is set.",
95487
+ "description": "How many times can be held at once.\n\nAbsent is one. `range` holds a start and an end with everything between\nthem shown as part of the answer, `multiple` holds any number, and both are\ncarried as one comma-separated value: the same shape `DatePicker` uses,\nbecause it is the same question asked of a different unit.\n\n**A range is two picks, and a third starts over.** That is the calendar's\nbehavior and a reader who has met one has met both. The alternative, a\nseparate \"from\" and \"to\" control, is two answers to what a product asks as\none, and it makes the between part impossible to show.\n\n**Neither works on wheels and the variant falls back.** A range on\nwheels is two sets of wheels, which is two controls; a multiple is a set,\nand a wheel has exactly one value by construction. Rather than draw\nsomething that cannot say what it holds, `wheels` renders as a list\nwhenever a mode is set.",
95497
95488
  "fieldName": "mode"
95498
95489
  },
95499
95490
  {
@@ -97357,7 +97348,7 @@
97357
97348
  ],
97358
97349
  "slots": [
97359
97350
  {
97360
- "description": "The messages, as `helix-toast-item` elements.",
97351
+ "description": "The messages.",
97361
97352
  "name": ""
97362
97353
  }
97363
97354
  ],
@@ -97378,7 +97369,7 @@
97378
97369
  "type": {
97379
97370
  "text": "| 'bottom-center'\n | 'bottom-end'\n | 'bottom-start'\n | 'top-center'\n | 'top-end'\n | 'top-start' | undefined"
97380
97371
  },
97381
- "description": "Which corner or edge the stack sits at.\n\nNamed here rather than on each message, because where a page puts its\ntoasts is a fact about the page: a stack whose members disagreed about\nwhere they were would not be a stack.\n\n**Optional, and bottom-end is the absence of it.** Reflecting *and*\ndefaulting is the pair that writes onto a host: every toast region anybody\nrendered would gain a `placement=\"bottom-end\"` nobody typed, which a React\nconsumer's server markup does not have. The styled sheet carries the resting\narrangement in its own `:host` rule and the selectors describe only the\ndepartures, which is what `orientation` does.",
97372
+ "description": "Which corner or edge the stack sits at.\n\nNamed here rather than on each message, because where a page puts its\ntoasts is a fact about the page: a stack whose members disagreed about\nwhere they were would not be a stack.\n\n**Optional, and bottom-end is the absence of it.** Reflecting *and*\ndefaulting is the pair that writes onto a host: every toast region anybody\nrendered would gain a `placement=\"bottom-end\"` nobody typed, which a React\nconsumer's server markup does not have. A sheet carries the resting\narrangement in its own `:host` rule and the selectors describe only the\ndepartures, which is what `orientation` does.",
97382
97373
  "attribute": "placement",
97383
97374
  "reflects": true
97384
97375
  },
@@ -97732,7 +97723,7 @@
97732
97723
  "type": {
97733
97724
  "text": "| 'bottom-center'\n | 'bottom-end'\n | 'bottom-start'\n | 'top-center'\n | 'top-end'\n | 'top-start' | undefined"
97734
97725
  },
97735
- "description": "Which corner or edge the stack sits at.\n\nNamed here rather than on each message, because where a page puts its\ntoasts is a fact about the page: a stack whose members disagreed about\nwhere they were would not be a stack.\n\n**Optional, and bottom-end is the absence of it.** Reflecting *and*\ndefaulting is the pair that writes onto a host: every toast region anybody\nrendered would gain a `placement=\"bottom-end\"` nobody typed, which a React\nconsumer's server markup does not have. The styled sheet carries the resting\narrangement in its own `:host` rule and the selectors describe only the\ndepartures, which is what `orientation` does.",
97726
+ "description": "Which corner or edge the stack sits at.\n\nNamed here rather than on each message, because where a page puts its\ntoasts is a fact about the page: a stack whose members disagreed about\nwhere they were would not be a stack.\n\n**Optional, and bottom-end is the absence of it.** Reflecting *and*\ndefaulting is the pair that writes onto a host: every toast region anybody\nrendered would gain a `placement=\"bottom-end\"` nobody typed, which a React\nconsumer's server markup does not have. A sheet carries the resting\narrangement in its own `:host` rule and the selectors describe only the\ndepartures, which is what `orientation` does.",
97736
97727
  "fieldName": "placement"
97737
97728
  }
97738
97729
  ],
@@ -99050,7 +99041,7 @@
99050
99041
  "type": {
99051
99042
  "text": "boolean"
99052
99043
  },
99053
- "description": "Whether the markup declared this one chosen, which is what a reset returns to.\n\n`<option selected>` reflects to `defaultSelected` and `option.selected` is\nlive state that does not reflect, and those are two different facts. This\nelement has one `selected` doing both jobs, so the declaration is the\nattribute and the state is the property.\n\n**The attribute, read when it is asked for, and never a snapshot taken in\nthe constructor.** A field initializer runs there, and an element the HTML\nparser created has none of its attributes yet at that moment: measured on\nthis element, on `Option` and on `Radio`, `<helix-toggle value=\"light\"\nselected>` reported `defaultSelected` as `false` both from parsed markup\nand from `createElement` followed by `setAttribute`, which is every way a\nconsumer writes one. The snapshot could only ever be true for an element\nalready in the document when `customElements.define` ran.\n\nNothing overwrites it either, which is what makes reading it late correct\nrather than merely later: `selected` does not reflect, for the reason\n`willUpdate` records, so the group's writes never reach the attribute and\nwhat it says is what the markup said.\n\n**The deeper half is not this.** State reflecting under the declaration's\nname is the fault `TreeItem` avoids by mirroring to `data-selected`.\nSplitting them means moving what every stylesheet selects on, which is a\nchange of its own rather than a property being added."
99044
+ "description": "Whether the markup declared this one chosen, which is what a reset returns to.\n\n`<option selected>` reflects to `defaultSelected` and `option.selected` is\nlive state that does not reflect, and those are two different facts. This\nelement has one `selected` doing both jobs, so the declaration is the\nattribute and the state is the property.\n\n**The attribute, read when it is asked for, and never a snapshot taken in\nthe constructor.** A field initializer runs there, and an element the HTML\nparser created has none of its attributes yet at that moment: measured on\nthis element, on `Option` and on `Radio`, `<helix-headless-toggle\nvalue=\"light\" selected>` reported `defaultSelected` as `false` both from\nparsed markup and from `createElement` followed by `setAttribute`, which is\nevery way a consumer writes one. The snapshot could only ever be true for\nan element already in the document when `customElements.define` ran.\n\nNothing overwrites it either, which is what makes reading it late correct\nrather than merely later: `selected` does not reflect, for the reason\n`willUpdate` records, so the group's writes never reach the attribute and\nwhat it says is what the markup said.\n\n**The deeper half is not this.** State reflecting under the declaration's\nname is the fault `TreeItem` avoids by mirroring to `data-selected`.\nSplitting them means moving what every stylesheet selects on, which is a\nchange of its own rather than a property being added."
99054
99045
  },
99055
99046
  {
99056
99047
  "kind": "field",
@@ -100161,7 +100152,7 @@
100161
100152
  "declarations": [
100162
100153
  {
100163
100154
  "kind": "class",
100164
- "description": "The trigger is slotted and stays the consumer's own element. The bubble is\nrendered here, in the top layer through the popover API, so it clears any\nancestor with `overflow: hidden` without a `z-index` anywhere. Position comes\nfrom `FloatingController`, which flips to another side when the preferred one\ndoes not fit.\n\n**Two forms, and they are not equivalent for a screen reader.** Wrapping is\nthe convenience form and is right where the bubble decorates a control that\nalready says what it is: nothing here can describe a slotted trigger, an\nIDREF being unable to cross a shadow boundary.\n\n`for` is the form that works. The tooltip sits *beside* the trigger in the\nconsumer's own tree and names it by id, so an IDREF between them is legal in\nthe ordinary way:\n\n```html\n<helix-button id=\"save\" aria-describedby=\"save-tip\">Save</helix-button>\n<helix-tooltip id=\"save-tip\" for=\"save\" content=\"Save your work\"></helix-tooltip>\n```\n\nThe reference points at *this host*, not at the bubble in its shadow root:\nthe description is computed from the flat tree, which descends into shadow\ncontent on its own.\n\n**The consumer writes that `aria-describedby`, and nothing here writes it for\nthem.** Setting it at runtime is a hydration mismatch React will not patch\nup. `for` audits itself on first open and warns once where it is missing.\n\nIt shows on hover and on focus, and hides on leave, on blur, on Escape, and\nonce the trigger has been activated: the hint is spent when the control has\nbeen used.",
100155
+ "description": "The trigger is slotted and stays the consumer's own element. The bubble is\nrendered here, in the top layer through the popover API, so it clears any\nancestor with `overflow: hidden` without a `z-index` anywhere. Position comes\nfrom `FloatingController`, which flips to another side when the preferred one\ndoes not fit.\n\n**Two forms, and they are not equivalent for a screen reader.** Wrapping is\nthe convenience form and is right where the bubble decorates a control that\nalready says what it is: nothing here can describe a slotted trigger, an\nIDREF being unable to cross a shadow boundary.\n\n`for` is the form that works. The tooltip sits *beside* the trigger in the\nconsumer's own tree and names it by id, so an IDREF between them is legal in\nthe ordinary way:\n\n```html\n<helix-headless-button id=\"save\" aria-describedby=\"save-tip\">Save</helix-headless-button>\n<helix-headless-tooltip id=\"save-tip\" for=\"save\" content=\"Save your work\"></helix-headless-tooltip>\n```\n\nThe reference points at *this host*, not at the bubble in its shadow root:\nthe description is computed from the flat tree, which descends into shadow\ncontent on its own.\n\n**The consumer writes that `aria-describedby`, and nothing here writes it for\nthem.** Setting it at runtime is a hydration mismatch React will not patch\nup. `for` audits itself on first open and warns once where it is missing.\n\nIt shows on hover and on focus, and hides on leave, on blur, on Escape, and\nonce the trigger has been activated: the hint is spent when the control has\nbeen used.",
100165
100156
  "name": "HelixHeadlessTooltip",
100166
100157
  "cssParts": [
100167
100158
  {
@@ -100561,7 +100552,7 @@
100561
100552
  "text": "boolean"
100562
100553
  },
100563
100554
  "default": "false",
100564
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
100555
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
100565
100556
  "attribute": "default-open",
100566
100557
  "inheritedFrom": {
100567
100558
  "name": "MixinControllerOpen",
@@ -101098,7 +101089,7 @@
101098
101089
  "text": "boolean"
101099
101090
  },
101100
101091
  "default": "false",
101101
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
101092
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
101102
101093
  "fieldName": "defaultOpen",
101103
101094
  "inheritedFrom": {
101104
101095
  "name": "MixinControllerOpen",
@@ -102037,7 +102028,7 @@
102037
102028
  "declarations": [
102038
102029
  {
102039
102030
  "kind": "class",
102040
- "description": "A stop names a target with `for` and holds whatever the consumer puts in it.\nIt owns no content of its own, which is the whole shape of this family: the\ntour abstracts the three things that are genuinely hard, and the words are\nthe consumer's.\n\nWhat it does own:\n\n- **Where the panel goes.** Anchored to the target through the same floating\n pass every other overlay here uses.\n- **That it is on top.** A popover, so it is in the top layer. A tour points\n at things inside dialogs, inside scrollers, inside anything with a stacking\n context, and a panel in the ordinary flow loses to all three.\n- **When it shows.** Which is `current`, and which the root decides.\n\nWhat it does not own is the heading, the paragraph, the picture and the\nlayout. Slot a `helix-card`, or a heading and a line of prose, or anything\nelse. Fixed `title` and `body` parts would be a component deciding what a\ntour is allowed to say.\n\n**The buttons are slot fallback, so the common case costs nothing and the\nuncommon one is possible.** Write nothing and get Back, Next and Skip already\nwired. Slot `actions` and they are yours, driven by `next()`, `back()` and\n`skip()` on the root, which are public for exactly that.\n\n**`for` is an id, the same as `Tooltip`'s.** The target is elsewhere on the\npage, and an id is the one reference a consumer can write in markup without\nholding an element. Resolved against the root node, so a stop inside a shadow\ntree points at a target in that tree.",
102031
+ "description": "A stop names a target with `for` and holds whatever the consumer puts in it.\nIt owns no content of its own, which is the whole shape of this family: the\ntour abstracts the three things that are genuinely hard, and the words are\nthe consumer's.\n\nWhat it does own:\n\n- **Where the panel goes.** Anchored to the target through the same floating\n pass every other overlay here uses.\n- **That it is on top.** A popover, so it is in the top layer. A tour points\n at things inside dialogs, inside scrollers, inside anything with a stacking\n context, and a panel in the ordinary flow loses to all three.\n- **When it shows.** Which is `current`, and which the root decides.\n\nWhat it does not own is the heading, the paragraph, the picture and the\nlayout. Slot a `Card`, or a heading and a line of prose, or anything else.\nFixed `title` and `body` parts would be a component deciding what a tour is\nallowed to say.\n\n**The buttons are slot fallback, so the common case costs nothing and the\nuncommon one is possible.** Write nothing and get Back, Next and Skip already\nwired. Slot `actions` and they are yours, driven by `next()`, `back()` and\n`skip()` on the root, which are public for exactly that.\n\n**`for` is an id, the same as `Tooltip`'s.** The target is elsewhere on the\npage, and an id is the one reference a consumer can write in markup without\nholding an element. Resolved against the root node, so a stop inside a shadow\ntree points at a target in that tree.",
102041
102032
  "name": "HelixHeadlessTourStop",
102042
102033
  "cssParts": [
102043
102034
  {
@@ -102987,7 +102978,7 @@
102987
102978
  "text": "boolean"
102988
102979
  },
102989
102980
  "default": "false",
102990
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
102981
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
102991
102982
  "attribute": "default-open",
102992
102983
  "inheritedFrom": {
102993
102984
  "name": "MixinControllerOpen",
@@ -103496,7 +103487,7 @@
103496
103487
  "text": "boolean"
103497
103488
  },
103498
103489
  "default": "false",
103499
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
103490
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
103500
103491
  "fieldName": "defaultOpen",
103501
103492
  "inheritedFrom": {
103502
103493
  "name": "MixinControllerOpen",
@@ -103635,7 +103626,7 @@
103635
103626
  "text": "HelixHeadlessTreeItem[]"
103636
103627
  },
103637
103628
  "privacy": "private",
103638
- "description": "Every item, in the order a reader moving down would meet them.\n\nSelected by tag, never by `'*'` and a filter: this is the array a single\narrow press rebuilds, and `'*'` makes it every descendant element in the\ntree, labels and icons and whatever a consumer slotted into a row included.\n\nThe two tag names rather than `instanceof` on everything: a styled\n`helix-tree-item` extends the base, so both names are needed, and the\n`instanceof` stays as the type guard because a consumer can write either\ntag and neither selector proves what the element is.",
103629
+ "description": "Every item, in the order a reader moving down would meet them.\n\n**By identity rather than by tag**, which is the same reason Splitter\nwrites out at `findOuter`: a tag list names one tier's element from the\nother's package, and misses any third tag, which is exactly what\nsubclassing an item produces. The item then never enters the array a single\narrow press rebuilds, so it is silently unreachable from the keyboard.\n\n`'*'` and a filter rather than a tag: the walk is one native pass and the\n`instanceof` is what narrows it, so the labels, icons and whatever a\nconsumer slotted into a row are gone by the time the array exists.",
103639
103630
  "readonly": true
103640
103631
  },
103641
103632
  {
@@ -103884,7 +103875,7 @@
103884
103875
  "text": "string"
103885
103876
  },
103886
103877
  "default": "''",
103887
- "description": "Initial item for uncontrolled use.\n\nIgnored once `active` is written.",
103878
+ "description": "Which item the markup declared current.\n\nIgnored once `active` is written.",
103888
103879
  "attribute": "default-active",
103889
103880
  "inheritedFrom": {
103890
103881
  "name": "MixinControllerActive",
@@ -104402,7 +104393,7 @@
104402
104393
  "text": "string"
104403
104394
  },
104404
104395
  "default": "''",
104405
- "description": "Initial item for uncontrolled use.\n\nIgnored once `active` is written.",
104396
+ "description": "Which item the markup declared current.\n\nIgnored once `active` is written.",
104406
104397
  "fieldName": "defaultActive",
104407
104398
  "inheritedFrom": {
104408
104399
  "name": "MixinControllerActive",
@@ -105656,7 +105647,7 @@
105656
105647
  "text": "HelixHeadlessVideoPlaylistItem[]"
105657
105648
  },
105658
105649
  "privacy": "private",
105659
- "description": "The playlist's entries, in the order it holds them.",
105650
+ "description": "The playlist's entries, in the order it holds them.\n\nBy identity rather than by tag, the same reason the playlist itself reads\nthem that way: a tag list names one tier's element from the other's package\nand misses any third one.",
105660
105651
  "readonly": true
105661
105652
  },
105662
105653
  {
@@ -106126,7 +106117,7 @@
106126
106117
  "name": ""
106127
106118
  },
106128
106119
  {
106129
- "description": "The `helix-video` they play in.",
106120
+ "description": "The player the entries take turns in.",
106130
106121
  "name": "player"
106131
106122
  }
106132
106123
  ],
@@ -106168,7 +106159,7 @@
106168
106159
  "text": "| (HTMLElement & {\n label: string\n play: () => void\n poster: string\n src: string\n updateComplete?: Promise<unknown>\n })\n | null"
106169
106160
  },
106170
106161
  "privacy": "private",
106171
- "description": "The player, whichever tag the consumer slotted.\n\nAsked of the slot rather than matched by tag name: the headless tier's\nplayer is `helix-headless-video` and the styled tier's is `helix-video`, and\na consumer bringing a third under either name should still be driven. What\nis needed of it is `src`, which is the whole of the contract.",
106162
+ "description": "The player, whichever tag the consumer slotted.\n\nAsked of the slot rather than matched by tag name: each tier registers its\nown player under its own name, and a consumer bringing a third should still\nbe driven. What is needed of it is `src`, which is the whole of the\ncontract.",
106172
106163
  "readonly": true
106173
106164
  },
106174
106165
  {
@@ -106234,7 +106225,7 @@
106234
106225
  "text": "string"
106235
106226
  },
106236
106227
  "default": "''",
106237
- "description": "Initial item for uncontrolled use.\n\nIgnored once `active` is written.",
106228
+ "description": "Which item the markup declared current.\n\nIgnored once `active` is written.",
106238
106229
  "attribute": "default-active",
106239
106230
  "inheritedFrom": {
106240
106231
  "name": "MixinControllerActive",
@@ -106697,7 +106688,7 @@
106697
106688
  "text": "string"
106698
106689
  },
106699
106690
  "default": "''",
106700
- "description": "Initial item for uncontrolled use.\n\nIgnored once `active` is written.",
106691
+ "description": "Which item the markup declared current.\n\nIgnored once `active` is written.",
106701
106692
  "fieldName": "defaultActive",
106702
106693
  "inheritedFrom": {
106703
106694
  "name": "MixinControllerActive",