@fusion.dev/helix 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.
@@ -140,7 +140,7 @@
140
140
  "text": "boolean"
141
141
  },
142
142
  "default": "false",
143
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
143
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
144
144
  "attribute": "default-open",
145
145
  "inheritedFrom": {
146
146
  "name": "MixinControllerOpen",
@@ -688,7 +688,7 @@
688
688
  "text": "boolean"
689
689
  },
690
690
  "default": "false",
691
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
691
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
692
692
  "fieldName": "defaultOpen",
693
693
  "inheritedFrom": {
694
694
  "name": "MixinControllerOpen",
@@ -5424,7 +5424,7 @@
5424
5424
  "type": {
5425
5425
  "text": "number | undefined"
5426
5426
  },
5427
- "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.",
5427
+ "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.",
5428
5428
  "attribute": "max",
5429
5429
  "reflects": true,
5430
5430
  "inheritedFrom": {
@@ -5855,7 +5855,7 @@
5855
5855
  "type": {
5856
5856
  "text": "number | undefined"
5857
5857
  },
5858
- "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.",
5858
+ "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.",
5859
5859
  "fieldName": "max",
5860
5860
  "inheritedFrom": {
5861
5861
  "name": "HelixHeadlessAvatarGroup",
@@ -7286,7 +7286,7 @@
7286
7286
  }
7287
7287
  },
7288
7288
  {
7289
- "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.",
7289
+ "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.",
7290
7290
  "name": "--bar-chart-secondary",
7291
7291
  "inheritedFrom": {
7292
7292
  "name": "HelixHeadlessBarChart",
@@ -7370,7 +7370,7 @@
7370
7370
  "type": {
7371
7371
  "text": "'gradient' | undefined"
7372
7372
  },
7373
- "description": "How a column's fill is distributed across it.\n\n`gradient` fades each column toward its base, into the wash the headless\ntier draws whether or not anything points at it.\n\n**A chart-domain axis and deliberately not a library one.** It lives on this\nfamily alone, and here it is a way of encoding data rather than a way of\nexpressing a theme: promoted to the registry it would put an attribute on\neighty-eight components that means nothing on eighty-seven. `wash` because\nthat is what the tier below already calls it, in `--chart-bar-wash` and in\nthe `bar-wash-start` and `bar-wash-end` stops.",
7373
+ "description": "How a column's fill is distributed across it.\n\n`gradient` fades each column toward its base, into the wash the headless\ntier draws whether or not anything points at it.\n\n**A chart-domain axis and deliberately not a library one.** It lives on this\nfamily alone, and here it is a way of encoding data rather than a way of\nexpressing a theme: promoted to the registry it would put an attribute on\nevery component in the library and mean something on one. `wash` because\nthat is what the tier below already calls it, in `--chart-bar-wash` and in\nthe `bar-wash-start` and `bar-wash-end` stops.",
7374
7374
  "attribute": "wash",
7375
7375
  "reflects": true
7376
7376
  },
@@ -8244,7 +8244,7 @@
8244
8244
  "type": {
8245
8245
  "text": "'gradient' | undefined"
8246
8246
  },
8247
- "description": "How a column's fill is distributed across it.\n\n`gradient` fades each column toward its base, into the wash the headless\ntier draws whether or not anything points at it.\n\n**A chart-domain axis and deliberately not a library one.** It lives on this\nfamily alone, and here it is a way of encoding data rather than a way of\nexpressing a theme: promoted to the registry it would put an attribute on\neighty-eight components that means nothing on eighty-seven. `wash` because\nthat is what the tier below already calls it, in `--chart-bar-wash` and in\nthe `bar-wash-start` and `bar-wash-end` stops.",
8247
+ "description": "How a column's fill is distributed across it.\n\n`gradient` fades each column toward its base, into the wash the headless\ntier draws whether or not anything points at it.\n\n**A chart-domain axis and deliberately not a library one.** It lives on this\nfamily alone, and here it is a way of encoding data rather than a way of\nexpressing a theme: promoted to the registry it would put an attribute on\nevery component in the library and mean something on one. `wash` because\nthat is what the tier below already calls it, in `--chart-bar-wash` and in\nthe `bar-wash-start` and `bar-wash-end` stops.",
8248
8248
  "fieldName": "wash"
8249
8249
  },
8250
8250
  {
@@ -9315,7 +9315,7 @@
9315
9315
  "type": {
9316
9316
  "text": "string | undefined"
9317
9317
  },
9318
- "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.",
9318
+ "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.",
9319
9319
  "attribute": "href",
9320
9320
  "reflects": true,
9321
9321
  "inheritedFrom": {
@@ -9728,7 +9728,7 @@
9728
9728
  "type": {
9729
9729
  "text": "string | undefined"
9730
9730
  },
9731
- "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.",
9731
+ "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.",
9732
9732
  "fieldName": "href",
9733
9733
  "inheritedFrom": {
9734
9734
  "name": "HelixHeadlessBreadcrumb",
@@ -10995,7 +10995,7 @@
10995
10995
  "text": "string"
10996
10996
  },
10997
10997
  "default": "''",
10998
- "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`.",
10998
+ "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`.",
10999
10999
  "attribute": "command",
11000
11000
  "helix": {
11001
11001
  "references": [
@@ -11793,7 +11793,7 @@
11793
11793
  "text": "string"
11794
11794
  },
11795
11795
  "default": "''",
11796
- "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`.",
11796
+ "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`.",
11797
11797
  "fieldName": "command",
11798
11798
  "inheritedFrom": {
11799
11799
  "name": "HelixHeadlessButton",
@@ -13380,7 +13380,7 @@
13380
13380
  "type": {
13381
13381
  "text": "number"
13382
13382
  },
13383
- "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.",
13383
+ "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.",
13384
13384
  "attribute": "index",
13385
13385
  "inheritedFrom": {
13386
13386
  "name": "HelixHeadlessCarousel",
@@ -13531,7 +13531,7 @@
13531
13531
  "type": {
13532
13532
  "text": "number | 'auto' | undefined"
13533
13533
  },
13534
- "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.",
13534
+ "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.",
13535
13535
  "attribute": "per-view",
13536
13536
  "reflects": true,
13537
13537
  "inheritedFrom": {
@@ -14019,7 +14019,7 @@
14019
14019
  "text": "string | typeof nothing"
14020
14020
  }
14021
14021
  },
14022
- "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.",
14022
+ "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.",
14023
14023
  "inheritedFrom": {
14024
14024
  "name": "HelixHeadlessCarousel",
14025
14025
  "module": "src/carousel/root/carousel-root.ts"
@@ -14401,7 +14401,7 @@
14401
14401
  "type": {
14402
14402
  "text": "number"
14403
14403
  },
14404
- "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.",
14404
+ "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.",
14405
14405
  "fieldName": "index",
14406
14406
  "inheritedFrom": {
14407
14407
  "name": "HelixHeadlessCarousel",
@@ -14489,7 +14489,7 @@
14489
14489
  "type": {
14490
14490
  "text": "number | 'auto' | undefined"
14491
14491
  },
14492
- "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.",
14492
+ "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.",
14493
14493
  "fieldName": "perView",
14494
14494
  "inheritedFrom": {
14495
14495
  "name": "HelixHeadlessCarousel",
@@ -15027,7 +15027,7 @@
15027
15027
  "name": "handleInput",
15028
15028
  "privacy": "private",
15029
15029
  "readonly": true,
15030
- "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.",
15030
+ "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.",
15031
15031
  "inheritedFrom": {
15032
15032
  "name": "HelixHeadlessChatComposer",
15033
15033
  "module": "src/chat/composer/chat-composer.ts"
@@ -16784,7 +16784,7 @@
16784
16784
  ],
16785
16785
  "slots": [
16786
16786
  {
16787
- "description": "The turns, as `helix-chat-message` children.",
16787
+ "description": "The turns.",
16788
16788
  "name": "",
16789
16789
  "inheritedFrom": {
16790
16790
  "name": "HelixHeadlessChat",
@@ -17082,7 +17082,7 @@
17082
17082
  "type": {
17083
17083
  "text": "boolean"
17084
17084
  },
17085
- "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.",
17085
+ "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.",
17086
17086
  "attribute": "pinned",
17087
17087
  "inheritedFrom": {
17088
17088
  "name": "HelixHeadlessChat",
@@ -18280,7 +18280,7 @@
18280
18280
  "type": {
18281
18281
  "text": "boolean"
18282
18282
  },
18283
- "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.",
18283
+ "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.",
18284
18284
  "fieldName": "pinned",
18285
18285
  "inheritedFrom": {
18286
18286
  "name": "HelixHeadlessChat",
@@ -18757,7 +18757,7 @@
18757
18757
  "name": "handleToggle",
18758
18758
  "privacy": "private",
18759
18759
  "readonly": true,
18760
- "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.",
18760
+ "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.",
18761
18761
  "inheritedFrom": {
18762
18762
  "name": "HelixHeadlessCheckboxGroup",
18763
18763
  "module": "src/checkbox-group/root/checkbox-group-root.ts"
@@ -19668,7 +19668,7 @@
19668
19668
  "text": "boolean"
19669
19669
  },
19670
19670
  "default": "false",
19671
- "description": "Initial checked state for uncontrolled use, where nothing declared one.",
19671
+ "description": "Whether the markup declared it checked, which is where a reset returns to.",
19672
19672
  "attribute": "default-checked",
19673
19673
  "inheritedFrom": {
19674
19674
  "name": "MixinControllerChecked",
@@ -20112,7 +20112,7 @@
20112
20112
  "name": "handleLabelChange",
20113
20113
  "privacy": "private",
20114
20114
  "readonly": true,
20115
- "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.",
20115
+ "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.",
20116
20116
  "inheritedFrom": {
20117
20117
  "name": "HelixHeadlessCheckbox",
20118
20118
  "module": "src/checkbox/root/checkbox-root.ts"
@@ -20641,7 +20641,7 @@
20641
20641
  "text": "boolean"
20642
20642
  },
20643
20643
  "default": "false",
20644
- "description": "Initial checked state for uncontrolled use, where nothing declared one.",
20644
+ "description": "Whether the markup declared it checked, which is where a reset returns to.",
20645
20645
  "fieldName": "defaultChecked",
20646
20646
  "inheritedFrom": {
20647
20647
  "name": "MixinControllerChecked",
@@ -21102,7 +21102,7 @@
21102
21102
  "text": "boolean"
21103
21103
  },
21104
21104
  "default": "false",
21105
- "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`.",
21105
+ "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`.",
21106
21106
  "attribute": "no-copy",
21107
21107
  "reflects": true,
21108
21108
  "inheritedFrom": {
@@ -22016,7 +22016,7 @@
22016
22016
  "text": "boolean"
22017
22017
  },
22018
22018
  "default": "false",
22019
- "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`.",
22019
+ "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`.",
22020
22020
  "fieldName": "noCopy",
22021
22021
  "inheritedFrom": {
22022
22022
  "name": "HelixHeadlessCodeBlock",
@@ -22836,7 +22836,7 @@
22836
22836
  "text": "boolean"
22837
22837
  },
22838
22838
  "default": "false",
22839
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
22839
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
22840
22840
  "attribute": "default-open",
22841
22841
  "inheritedFrom": {
22842
22842
  "name": "MixinControllerOpen",
@@ -23490,7 +23490,7 @@
23490
23490
  "name": "handleSampleStart",
23491
23491
  "privacy": "private",
23492
23492
  "readonly": true,
23493
- "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.",
23493
+ "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.",
23494
23494
  "inheritedFrom": {
23495
23495
  "name": "HelixHeadlessColorInput",
23496
23496
  "module": "src/color-input/root/color-input-root.ts"
@@ -24063,7 +24063,7 @@
24063
24063
  "text": "boolean"
24064
24064
  },
24065
24065
  "default": "false",
24066
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
24066
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
24067
24067
  "fieldName": "defaultOpen",
24068
24068
  "inheritedFrom": {
24069
24069
  "name": "MixinControllerOpen",
@@ -25103,7 +25103,7 @@
25103
25103
  "text": "boolean"
25104
25104
  },
25105
25105
  "default": "false",
25106
- "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.",
25106
+ "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.",
25107
25107
  "attribute": "required",
25108
25108
  "reflects": true,
25109
25109
  "inheritedFrom": {
@@ -25308,7 +25308,7 @@
25308
25308
  "text": "void"
25309
25309
  }
25310
25310
  },
25311
- "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`.",
25311
+ "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`.",
25312
25312
  "inheritedFrom": {
25313
25313
  "name": "HelixHeadlessColorPicker",
25314
25314
  "module": "src/color-picker/root/color-picker-root.ts"
@@ -25477,7 +25477,7 @@
25477
25477
  }
25478
25478
  }
25479
25479
  ],
25480
- "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.",
25480
+ "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.",
25481
25481
  "inheritedFrom": {
25482
25482
  "name": "HelixHeadlessColorPicker",
25483
25483
  "module": "src/color-picker/root/color-picker-root.ts"
@@ -26158,7 +26158,7 @@
26158
26158
  "text": "boolean"
26159
26159
  },
26160
26160
  "default": "false",
26161
- "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.",
26161
+ "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.",
26162
26162
  "fieldName": "required",
26163
26163
  "inheritedFrom": {
26164
26164
  "name": "HelixHeadlessColorPicker",
@@ -26636,7 +26636,7 @@
26636
26636
  "text": "boolean"
26637
26637
  },
26638
26638
  "default": "false",
26639
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
26639
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
26640
26640
  "attribute": "default-open",
26641
26641
  "inheritedFrom": {
26642
26642
  "name": "MixinControllerOpen",
@@ -27775,7 +27775,7 @@
27775
27775
  "name": "handleFieldClick",
27776
27776
  "privacy": "private",
27777
27777
  "readonly": true,
27778
- "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.",
27778
+ "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.",
27779
27779
  "inheritedFrom": {
27780
27780
  "name": "HelixHeadlessCombobox",
27781
27781
  "module": "src/combobox/root/combobox-root.ts"
@@ -28414,7 +28414,7 @@
28414
28414
  "text": "boolean"
28415
28415
  },
28416
28416
  "default": "false",
28417
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
28417
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
28418
28418
  "fieldName": "defaultOpen",
28419
28419
  "inheritedFrom": {
28420
28420
  "name": "MixinControllerOpen",
@@ -28722,7 +28722,7 @@
28722
28722
  ],
28723
28723
  "slots": [
28724
28724
  {
28725
- "description": "The options, which are `helix-option` elements.",
28725
+ "description": "The options.",
28726
28726
  "name": "",
28727
28727
  "inheritedFrom": {
28728
28728
  "name": "HelixHeadlessCombobox",
@@ -29191,7 +29191,7 @@
29191
29191
  "text": "boolean"
29192
29192
  },
29193
29193
  "default": "false",
29194
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
29194
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
29195
29195
  "attribute": "default-open",
29196
29196
  "inheritedFrom": {
29197
29197
  "name": "MixinControllerOpen",
@@ -29803,7 +29803,7 @@
29803
29803
  "text": "boolean"
29804
29804
  },
29805
29805
  "default": "false",
29806
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
29806
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
29807
29807
  "fieldName": "defaultOpen",
29808
29808
  "inheritedFrom": {
29809
29809
  "name": "MixinControllerOpen",
@@ -29865,7 +29865,7 @@
29865
29865
  ],
29866
29866
  "slots": [
29867
29867
  {
29868
- "description": "The commands, which are `helix-option` elements and their groups.",
29868
+ "description": "The commands, and any groups of them.",
29869
29869
  "name": "",
29870
29870
  "inheritedFrom": {
29871
29871
  "name": "HelixHeadlessCommand",
@@ -30350,7 +30350,7 @@
30350
30350
  "text": "string"
30351
30351
  },
30352
30352
  "default": "''",
30353
- "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`.",
30353
+ "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`.",
30354
30354
  "attribute": "command",
30355
30355
  "helix": {
30356
30356
  "references": [
@@ -31170,7 +31170,7 @@
31170
31170
  "text": "string"
31171
31171
  },
31172
31172
  "default": "''",
31173
- "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`.",
31173
+ "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`.",
31174
31174
  "fieldName": "command",
31175
31175
  "inheritedFrom": {
31176
31176
  "name": "HelixHeadlessButton",
@@ -31581,7 +31581,7 @@
31581
31581
  "name": "--data-table-text"
31582
31582
  },
31583
31583
  {
31584
- "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.",
31584
+ "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.",
31585
31585
  "name": "--data-table-cell-align",
31586
31586
  "inheritedFrom": {
31587
31587
  "name": "HelixHeadlessDataTable",
@@ -31589,7 +31589,7 @@
31589
31589
  }
31590
31590
  },
31591
31591
  {
31592
- "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.",
31592
+ "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.",
31593
31593
  "name": "--data-table-template",
31594
31594
  "inheritedFrom": {
31595
31595
  "name": "HelixHeadlessDataTable",
@@ -31897,7 +31897,7 @@
31897
31897
  ],
31898
31898
  "slots": [
31899
31899
  {
31900
- "description": "The columns, declared as `helix-table-column` children.",
31900
+ "description": "The columns, declared rather than drawn.",
31901
31901
  "name": "",
31902
31902
  "inheritedFrom": {
31903
31903
  "name": "HelixHeadlessDataTable",
@@ -32089,7 +32089,7 @@
32089
32089
  },
32090
32090
  "static": true,
32091
32091
  "default": "{ ...HelixElement.shadowRootOptions, slotAssignment: 'manual', }",
32092
- "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.",
32092
+ "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.",
32093
32093
  "inheritedFrom": {
32094
32094
  "name": "HelixHeadlessDataTable",
32095
32095
  "module": "src/data-table/root/data-table-root.ts"
@@ -32347,7 +32347,7 @@
32347
32347
  "type": {
32348
32348
  "text": "number"
32349
32349
  },
32350
- "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.",
32350
+ "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.",
32351
32351
  "attribute": "page-size",
32352
32352
  "inheritedFrom": {
32353
32353
  "name": "HelixHeadlessDataTable",
@@ -33219,7 +33219,7 @@
33219
33219
  }
33220
33220
  }
33221
33221
  ],
33222
- "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.",
33222
+ "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.",
33223
33223
  "inheritedFrom": {
33224
33224
  "name": "HelixHeadlessDataTable",
33225
33225
  "module": "src/data-table/root/data-table-root.ts"
@@ -34177,7 +34177,7 @@
34177
34177
  "type": {
34178
34178
  "text": "number"
34179
34179
  },
34180
- "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.",
34180
+ "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.",
34181
34181
  "fieldName": "pageSize",
34182
34182
  "inheritedFrom": {
34183
34183
  "name": "HelixHeadlessDataTable",
@@ -34678,7 +34678,7 @@
34678
34678
  "text": "boolean"
34679
34679
  },
34680
34680
  "default": "false",
34681
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
34681
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
34682
34682
  "attribute": "default-open",
34683
34683
  "inheritedFrom": {
34684
34684
  "name": "MixinControllerOpen",
@@ -35714,7 +35714,7 @@
35714
35714
  "text": "TemplateResult"
35715
35715
  }
35716
35716
  },
35717
- "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.",
35717
+ "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.",
35718
35718
  "inheritedFrom": {
35719
35719
  "name": "HelixHeadlessDateInput",
35720
35720
  "module": "src/date-input/root/date-input-root.ts"
@@ -36307,7 +36307,7 @@
36307
36307
  "text": "boolean"
36308
36308
  },
36309
36309
  "default": "false",
36310
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
36310
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
36311
36311
  "fieldName": "defaultOpen",
36312
36312
  "inheritedFrom": {
36313
36313
  "name": "MixinControllerOpen",
@@ -40118,7 +40118,7 @@
40118
40118
  "text": "boolean"
40119
40119
  },
40120
40120
  "default": "false",
40121
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
40121
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
40122
40122
  "attribute": "default-open",
40123
40123
  "inheritedFrom": {
40124
40124
  "name": "MixinControllerOpen",
@@ -40406,7 +40406,7 @@
40406
40406
  "text": "void"
40407
40407
  }
40408
40408
  },
40409
- "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.",
40409
+ "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.",
40410
40410
  "inheritedFrom": {
40411
40411
  "name": "HelixHeadlessDialog",
40412
40412
  "module": "src/dialog/root/dialog-root.ts"
@@ -40785,7 +40785,7 @@
40785
40785
  "text": "boolean"
40786
40786
  },
40787
40787
  "default": "false",
40788
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
40788
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
40789
40789
  "fieldName": "defaultOpen",
40790
40790
  "inheritedFrom": {
40791
40791
  "name": "MixinControllerOpen",
@@ -41833,7 +41833,7 @@
41833
41833
  "type": {
41834
41834
  "text": "'large' | 'none' | 'small' | undefined"
41835
41835
  },
41836
- "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.",
41836
+ "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.",
41837
41837
  "attribute": "hole",
41838
41838
  "inheritedFrom": {
41839
41839
  "name": "HelixHeadlessDonutChart",
@@ -42392,7 +42392,7 @@
42392
42392
  "type": {
42393
42393
  "text": "'large' | 'none' | 'small' | undefined"
42394
42394
  },
42395
- "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.",
42395
+ "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.",
42396
42396
  "fieldName": "hole",
42397
42397
  "inheritedFrom": {
42398
42398
  "name": "HelixHeadlessDonutChart",
@@ -42853,7 +42853,7 @@
42853
42853
  "text": "boolean"
42854
42854
  },
42855
42855
  "default": "false",
42856
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
42856
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
42857
42857
  "attribute": "default-open",
42858
42858
  "inheritedFrom": {
42859
42859
  "name": "MixinControllerOpen",
@@ -42998,7 +42998,7 @@
42998
42998
  "type": {
42999
42999
  "text": "'start' | 'end' | 'top' | 'bottom' | undefined"
43000
43000
  },
43001
- "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.",
43001
+ "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.",
43002
43002
  "attribute": "placement",
43003
43003
  "reflects": true,
43004
43004
  "inheritedFrom": {
@@ -43431,7 +43431,7 @@
43431
43431
  "text": "boolean"
43432
43432
  },
43433
43433
  "default": "false",
43434
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
43434
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
43435
43435
  "fieldName": "defaultOpen",
43436
43436
  "inheritedFrom": {
43437
43437
  "name": "MixinControllerOpen",
@@ -43481,7 +43481,7 @@
43481
43481
  "type": {
43482
43482
  "text": "'start' | 'end' | 'top' | 'bottom' | undefined"
43483
43483
  },
43484
- "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.",
43484
+ "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.",
43485
43485
  "fieldName": "placement",
43486
43486
  "inheritedFrom": {
43487
43487
  "name": "HelixHeadlessDrawer",
@@ -48725,7 +48725,7 @@
48725
48725
  "type": {
48726
48726
  "text": "HelixHeadlessFilterField[]"
48727
48727
  },
48728
- "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.",
48728
+ "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.",
48729
48729
  "readonly": true,
48730
48730
  "inheritedFrom": {
48731
48731
  "name": "HelixHeadlessFilterMenu",
@@ -49994,7 +49994,7 @@
49994
49994
  "text": "boolean"
49995
49995
  },
49996
49996
  "default": "false",
49997
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
49997
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
49998
49998
  "attribute": "default-open",
49999
49999
  "inheritedFrom": {
50000
50000
  "name": "MixinControllerOpen",
@@ -51822,7 +51822,7 @@
51822
51822
  "text": "boolean"
51823
51823
  },
51824
51824
  "default": "false",
51825
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
51825
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
51826
51826
  "fieldName": "defaultOpen",
51827
51827
  "inheritedFrom": {
51828
51828
  "name": "MixinControllerOpen",
@@ -52924,7 +52924,7 @@
52924
52924
  "text": "string"
52925
52925
  },
52926
52926
  "default": "''",
52927
- "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.",
52927
+ "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.",
52928
52928
  "attribute": "date",
52929
52929
  "inheritedFrom": {
52930
52930
  "name": "HelixHeadlessFormatDate",
@@ -53554,7 +53554,7 @@
53554
53554
  "text": "string"
53555
53555
  },
53556
53556
  "default": "''",
53557
- "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.",
53557
+ "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.",
53558
53558
  "fieldName": "date",
53559
53559
  "inheritedFrom": {
53560
53560
  "name": "HelixHeadlessFormatDate",
@@ -54314,43 +54314,23 @@
54314
54314
  "cssProperties": [
54315
54315
  {
54316
54316
  "description": "How tall a cell is. A row of a tall thin cell is what a status page draws.",
54317
- "name": "--heatmap-cell-height",
54318
- "inheritedFrom": {
54319
- "name": "HelixHeadlessHeatmap",
54320
- "module": "src/heatmap/root/heatmap-root.ts"
54321
- }
54317
+ "name": "--heatmap-cell-height"
54322
54318
  },
54323
54319
  {
54324
54320
  "description": "How wide a cell is. The strip fits as many as the container allows.",
54325
- "name": "--heatmap-cell-inline-size",
54326
- "inheritedFrom": {
54327
- "name": "HelixHeadlessHeatmap",
54328
- "module": "src/heatmap/root/heatmap-root.ts"
54329
- }
54321
+ "name": "--heatmap-cell-inline-size"
54330
54322
  },
54331
54323
  {
54332
54324
  "description": "How far a cell's corners are rounded.",
54333
- "name": "--heatmap-cell-radius",
54334
- "inheritedFrom": {
54335
- "name": "HelixHeadlessHeatmap",
54336
- "module": "src/heatmap/root/heatmap-root.ts"
54337
- }
54325
+ "name": "--heatmap-cell-radius"
54338
54326
  },
54339
54327
  {
54340
54328
  "description": "The size a cell wants on both axes, where neither is given its own.",
54341
- "name": "--heatmap-cell-size",
54342
- "inheritedFrom": {
54343
- "name": "HelixHeadlessHeatmap",
54344
- "module": "src/heatmap/root/heatmap-root.ts"
54345
- }
54329
+ "name": "--heatmap-cell-size"
54346
54330
  },
54347
54331
  {
54348
54332
  "description": "Space between cells. Zero is a continuous field rather than a grid of tiles.",
54349
- "name": "--heatmap-gap",
54350
- "inheritedFrom": {
54351
- "name": "HelixHeadlessHeatmap",
54352
- "module": "src/heatmap/root/heatmap-root.ts"
54353
- }
54333
+ "name": "--heatmap-gap"
54354
54334
  },
54355
54335
  {
54356
54336
  "description": "The quietest step of the magnitude ramp, reached by `tones=\"1 …\"`.",
@@ -54952,7 +54932,7 @@
54952
54932
  },
54953
54933
  "privacy": "private",
54954
54934
  "default": "undefined",
54955
- "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.",
54935
+ "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.",
54956
54936
  "inheritedFrom": {
54957
54937
  "name": "HelixHeadlessHeatmap",
54958
54938
  "module": "src/heatmap/root/heatmap-root.ts"
@@ -55579,7 +55559,7 @@
55579
55559
  "text": "number"
55580
55560
  },
55581
55561
  "default": "8",
55582
- "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.",
55562
+ "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.",
55583
55563
  "fieldName": "minCell",
55584
55564
  "inheritedFrom": {
55585
55565
  "name": "HelixHeadlessHeatmap",
@@ -55834,7 +55814,7 @@
55834
55814
  "text": "string"
55835
55815
  },
55836
55816
  "default": "''",
55837
- "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`.",
55817
+ "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`.",
55838
55818
  "attribute": "command",
55839
55819
  "helix": {
55840
55820
  "references": [
@@ -56641,7 +56621,7 @@
56641
56621
  "text": "string"
56642
56622
  },
56643
56623
  "default": "''",
56644
- "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`.",
56624
+ "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`.",
56645
56625
  "fieldName": "command",
56646
56626
  "inheritedFrom": {
56647
56627
  "name": "HelixHeadlessButton",
@@ -57612,7 +57592,7 @@
57612
57592
  "text": "'error' | 'loaded' | 'loading'"
57613
57593
  },
57614
57594
  "default": "'loading'",
57615
- "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.",
57595
+ "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.",
57616
57596
  "inheritedFrom": {
57617
57597
  "name": "HelixHeadlessImage",
57618
57598
  "module": "src/image/root/image-root.ts"
@@ -59735,7 +59715,7 @@
59735
59715
  "text": "boolean"
59736
59716
  },
59737
59717
  "default": "false",
59738
- "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`.",
59718
+ "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`.",
59739
59719
  "attribute": "readonly",
59740
59720
  "reflects": true,
59741
59721
  "inheritedFrom": {
@@ -60025,7 +60005,7 @@
60025
60005
  "text": "InputType"
60026
60006
  },
60027
60007
  "default": "'text'",
60028
- "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.",
60008
+ "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.",
60029
60009
  "attribute": "type",
60030
60010
  "inheritedFrom": {
60031
60011
  "name": "HelixHeadlessInput",
@@ -60746,7 +60726,7 @@
60746
60726
  "text": "boolean"
60747
60727
  },
60748
60728
  "default": "false",
60749
- "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`.",
60729
+ "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`.",
60750
60730
  "fieldName": "readOnly",
60751
60731
  "inheritedFrom": {
60752
60732
  "name": "HelixHeadlessInput",
@@ -60785,7 +60765,7 @@
60785
60765
  "text": "InputType"
60786
60766
  },
60787
60767
  "default": "'text'",
60788
- "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.",
60768
+ "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.",
60789
60769
  "fieldName": "type",
60790
60770
  "inheritedFrom": {
60791
60771
  "name": "HelixHeadlessInput",
@@ -62653,7 +62633,7 @@
62653
62633
  "type": {
62654
62634
  "text": "'none' | 'ring' | 'square' | 'triangle' | undefined"
62655
62635
  },
62656
- "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.",
62636
+ "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.",
62657
62637
  "attribute": "terminus",
62658
62638
  "reflects": true,
62659
62639
  "inheritedFrom": {
@@ -63360,7 +63340,7 @@
63360
63340
  "type": {
63361
63341
  "text": "'none' | 'ring' | 'square' | 'triangle' | undefined"
63362
63342
  },
63363
- "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.",
63343
+ "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.",
63364
63344
  "fieldName": "terminus",
63365
63345
  "inheritedFrom": {
63366
63346
  "name": "HelixHeadlessLineChart",
@@ -64404,7 +64384,7 @@
64404
64384
  "type": {
64405
64385
  "text": "'1' | 'a' | 'A' | 'i' | 'I' | undefined"
64406
64386
  },
64407
- "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.",
64387
+ "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.",
64408
64388
  "attribute": "type",
64409
64389
  "reflects": true,
64410
64390
  "inheritedFrom": {
@@ -64785,7 +64765,7 @@
64785
64765
  "type": {
64786
64766
  "text": "'1' | 'a' | 'A' | 'i' | 'I' | undefined"
64787
64767
  },
64788
- "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.",
64768
+ "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.",
64789
64769
  "fieldName": "type",
64790
64770
  "inheritedFrom": {
64791
64771
  "name": "HelixHeadlessList",
@@ -67601,7 +67581,7 @@
67601
67581
  "text": "boolean"
67602
67582
  },
67603
67583
  "default": "false",
67604
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
67584
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
67605
67585
  "attribute": "default-open",
67606
67586
  "inheritedFrom": {
67607
67587
  "name": "MixinControllerOpen",
@@ -67899,7 +67879,7 @@
67899
67879
  "text": "number"
67900
67880
  }
67901
67881
  },
67902
- "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.",
67882
+ "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.",
67903
67883
  "inheritedFrom": {
67904
67884
  "name": "HelixHeadlessMegamenu",
67905
67885
  "module": "src/megamenu/root/megamenu-root.ts"
@@ -68073,7 +68053,7 @@
68073
68053
  "text": "TemplateResult"
68074
68054
  }
68075
68055
  },
68076
- "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.",
68056
+ "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.",
68077
68057
  "inheritedFrom": {
68078
68058
  "name": "HelixHeadlessMegamenu",
68079
68059
  "module": "src/megamenu/root/megamenu-root.ts"
@@ -68472,7 +68452,7 @@
68472
68452
  "text": "boolean"
68473
68453
  },
68474
68454
  "default": "false",
68475
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
68455
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
68476
68456
  "fieldName": "defaultOpen",
68477
68457
  "inheritedFrom": {
68478
68458
  "name": "MixinControllerOpen",
@@ -69819,7 +69799,7 @@
69819
69799
  "text": "boolean"
69820
69800
  },
69821
69801
  "default": "false",
69822
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
69802
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
69823
69803
  "attribute": "default-open",
69824
69804
  "inheritedFrom": {
69825
69805
  "name": "MixinControllerOpen",
@@ -70620,7 +70600,7 @@
70620
70600
  "text": "boolean"
70621
70601
  },
70622
70602
  "default": "false",
70623
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
70603
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
70624
70604
  "fieldName": "defaultOpen",
70625
70605
  "inheritedFrom": {
70626
70606
  "name": "MixinControllerOpen",
@@ -72506,7 +72486,7 @@
72506
72486
  "text": "boolean"
72507
72487
  },
72508
72488
  "default": "false",
72509
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
72489
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
72510
72490
  "attribute": "default-open",
72511
72491
  "inheritedFrom": {
72512
72492
  "name": "MixinControllerOpen",
@@ -73117,7 +73097,7 @@
73117
73097
  "text": "boolean"
73118
73098
  },
73119
73099
  "default": "false",
73120
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
73100
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
73121
73101
  "fieldName": "defaultOpen",
73122
73102
  "inheritedFrom": {
73123
73103
  "name": "MixinControllerOpen",
@@ -73639,7 +73619,7 @@
73639
73619
  "type": {
73640
73620
  "text": "boolean"
73641
73621
  },
73642
- "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.",
73622
+ "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.",
73643
73623
  "attribute": "read",
73644
73624
  "inheritedFrom": {
73645
73625
  "name": "HelixHeadlessNotification",
@@ -74154,7 +74134,7 @@
74154
74134
  "type": {
74155
74135
  "text": "boolean"
74156
74136
  },
74157
- "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.",
74137
+ "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.",
74158
74138
  "fieldName": "read",
74159
74139
  "inheritedFrom": {
74160
74140
  "name": "HelixHeadlessNotification",
@@ -74385,7 +74365,7 @@
74385
74365
  ],
74386
74366
  "slots": [
74387
74367
  {
74388
- "description": "The notifications, as `helix-notification` children.",
74368
+ "description": "The notifications.",
74389
74369
  "name": "",
74390
74370
  "inheritedFrom": {
74391
74371
  "name": "HelixHeadlessNotifications",
@@ -77411,12 +77391,27 @@
77411
77391
  "module": "src/object-inspector/root/object-inspector-root.ts"
77412
77392
  }
77413
77393
  },
77394
+ {
77395
+ "kind": "field",
77396
+ "name": "ESTIMATE",
77397
+ "type": {
77398
+ "text": "number"
77399
+ },
77400
+ "static": true,
77401
+ "readonly": true,
77402
+ "default": "24",
77403
+ "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.",
77404
+ "inheritedFrom": {
77405
+ "name": "HelixHeadlessObjectInspector",
77406
+ "module": "src/object-inspector/root/object-inspector-root.ts"
77407
+ }
77408
+ },
77414
77409
  {
77415
77410
  "kind": "field",
77416
77411
  "name": "virtualize",
77417
77412
  "privacy": "private",
77418
77413
  "readonly": true,
77419
- "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) }), ), })",
77414
+ "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) }), ), })",
77420
77415
  "inheritedFrom": {
77421
77416
  "name": "HelixHeadlessObjectInspector",
77422
77417
  "module": "src/object-inspector/root/object-inspector-root.ts"
@@ -78978,7 +78973,7 @@
78978
78973
  "text": "string"
78979
78974
  },
78980
78975
  "default": "''",
78981
- "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.",
78976
+ "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.",
78982
78977
  "attribute": "alternate",
78983
78978
  "inheritedFrom": {
78984
78979
  "name": "HelixHeadlessOption",
@@ -79005,7 +79000,7 @@
79005
79000
  "type": {
79006
79001
  "text": "boolean"
79007
79002
  },
79008
- "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.",
79003
+ "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.",
79009
79004
  "inheritedFrom": {
79010
79005
  "name": "HelixHeadlessOption",
79011
79006
  "module": "src/option/root/option-root.ts"
@@ -79568,7 +79563,7 @@
79568
79563
  "text": "string"
79569
79564
  },
79570
79565
  "default": "''",
79571
- "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.",
79566
+ "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.",
79572
79567
  "fieldName": "alternate",
79573
79568
  "inheritedFrom": {
79574
79569
  "name": "HelixHeadlessOption",
@@ -85218,7 +85213,7 @@
85218
85213
  "text": "PinType"
85219
85214
  },
85220
85215
  "default": "'numeric'",
85221
- "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.",
85216
+ "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.",
85222
85217
  "attribute": "type",
85223
85218
  "inheritedFrom": {
85224
85219
  "name": "HelixHeadlessPinInput",
@@ -86215,7 +86210,7 @@
86215
86210
  "text": "PinType"
86216
86211
  },
86217
86212
  "default": "'numeric'",
86218
- "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.",
86213
+ "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.",
86219
86214
  "fieldName": "type",
86220
86215
  "inheritedFrom": {
86221
86216
  "name": "HelixHeadlessPinInput",
@@ -86440,7 +86435,7 @@
86440
86435
  "text": "boolean"
86441
86436
  },
86442
86437
  "default": "false",
86443
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
86438
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
86444
86439
  "attribute": "default-open",
86445
86440
  "inheritedFrom": {
86446
86441
  "name": "MixinControllerOpen",
@@ -86573,7 +86568,7 @@
86573
86568
  "name": "panel",
86574
86569
  "privacy": "private",
86575
86570
  "readonly": true,
86576
- "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'), })",
86571
+ "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'), })",
86577
86572
  "inheritedFrom": {
86578
86573
  "name": "HelixHeadlessPopover",
86579
86574
  "module": "src/popover/root/popover-root.ts"
@@ -86586,7 +86581,7 @@
86586
86581
  "text": "HTMLElement | undefined"
86587
86582
  },
86588
86583
  "privacy": "private",
86589
- "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.",
86584
+ "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.",
86590
86585
  "inheritedFrom": {
86591
86586
  "name": "HelixHeadlessPopover",
86592
86587
  "module": "src/popover/root/popover-root.ts"
@@ -87028,7 +87023,7 @@
87028
87023
  "text": "boolean"
87029
87024
  },
87030
87025
  "default": "false",
87031
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
87026
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
87032
87027
  "fieldName": "defaultOpen",
87033
87028
  "inheritedFrom": {
87034
87029
  "name": "MixinControllerOpen",
@@ -90589,7 +90584,7 @@
90589
90584
  "type": {
90590
90585
  "text": "boolean"
90591
90586
  },
90592
- "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.",
90587
+ "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.",
90593
90588
  "inheritedFrom": {
90594
90589
  "name": "HelixHeadlessRadio",
90595
90590
  "module": "src/radio/root/radio-root.ts"
@@ -98588,7 +98583,7 @@
98588
98583
  "text": "boolean"
98589
98584
  },
98590
98585
  "default": "false",
98591
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
98586
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
98592
98587
  "attribute": "default-open",
98593
98588
  "inheritedFrom": {
98594
98589
  "name": "MixinControllerOpen",
@@ -99786,7 +99781,7 @@
99786
99781
  "text": "boolean"
99787
99782
  },
99788
99783
  "default": "false",
99789
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
99784
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
99790
99785
  "fieldName": "defaultOpen",
99791
99786
  "inheritedFrom": {
99792
99787
  "name": "MixinControllerOpen",
@@ -104913,7 +104908,7 @@
104913
104908
  "text": "boolean"
104914
104909
  },
104915
104910
  "default": "false",
104916
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
104911
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
104917
104912
  "attribute": "default-open",
104918
104913
  "inheritedFrom": {
104919
104914
  "name": "MixinControllerOpen",
@@ -105160,7 +105155,7 @@
105160
105155
  "text": "TemplateResult"
105161
105156
  }
105162
105157
  },
105163
- "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.",
105158
+ "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.",
105164
105159
  "inheritedFrom": {
105165
105160
  "name": "HelixHeadlessSpeedDial",
105166
105161
  "module": "src/speed-dial/root/speed-dial-root.ts"
@@ -105547,7 +105542,7 @@
105547
105542
  "text": "boolean"
105548
105543
  },
105549
105544
  "default": "false",
105550
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
105545
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
105551
105546
  "fieldName": "defaultOpen",
105552
105547
  "inheritedFrom": {
105553
105548
  "name": "MixinControllerOpen",
@@ -107822,7 +107817,7 @@
107822
107817
  "type": {
107823
107818
  "text": "'column-reverse' | 'row' | 'row-reverse' | undefined"
107824
107819
  },
107825
- "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.",
107820
+ "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.",
107826
107821
  "attribute": "direction",
107827
107822
  "reflects": true,
107828
107823
  "inheritedFrom": {
@@ -108220,7 +108215,7 @@
108220
108215
  "type": {
108221
108216
  "text": "'column-reverse' | 'row' | 'row-reverse' | undefined"
108222
108217
  },
108223
- "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.",
108218
+ "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.",
108224
108219
  "fieldName": "direction",
108225
108220
  "inheritedFrom": {
108226
108221
  "name": "HelixHeadlessStat",
@@ -108359,7 +108354,7 @@
108359
108354
  "text": "string"
108360
108355
  },
108361
108356
  "default": "''",
108362
- "description": "Initial item for uncontrolled use.\n\nIgnored once `active` is written.",
108357
+ "description": "Which item the markup declared current.\n\nIgnored once `active` is written.",
108363
108358
  "attribute": "default-active",
108364
108359
  "inheritedFrom": {
108365
108360
  "name": "MixinControllerActive",
@@ -108938,7 +108933,7 @@
108938
108933
  "text": "string"
108939
108934
  },
108940
108935
  "default": "''",
108941
- "description": "Initial item for uncontrolled use.\n\nIgnored once `active` is written.",
108936
+ "description": "Which item the markup declared current.\n\nIgnored once `active` is written.",
108942
108937
  "fieldName": "defaultActive",
108943
108938
  "inheritedFrom": {
108944
108939
  "name": "MixinControllerActive",
@@ -109023,7 +109018,7 @@
109023
109018
  ],
109024
109019
  "slots": [
109025
109020
  {
109026
- "description": "The steps, which are `helix-step` elements.",
109021
+ "description": "The steps.",
109027
109022
  "name": "",
109028
109023
  "inheritedFrom": {
109029
109024
  "name": "HelixHeadlessSteps",
@@ -109552,7 +109547,7 @@
109552
109547
  }
109553
109548
  },
109554
109549
  {
109555
- "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.",
109550
+ "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.",
109556
109551
  "name": "content",
109557
109552
  "inheritedFrom": {
109558
109553
  "name": "HelixHeadlessStep",
@@ -109602,7 +109597,7 @@
109602
109597
  }
109603
109598
  },
109604
109599
  {
109605
- "description": "The step's name, which is a `helix-button`.",
109600
+ "description": "The step's name, which is a control.",
109606
109601
  "name": "label",
109607
109602
  "inheritedFrom": {
109608
109603
  "name": "HelixHeadlessStep",
@@ -109833,7 +109828,7 @@
109833
109828
  "text": "boolean"
109834
109829
  },
109835
109830
  "default": "false",
109836
- "description": "Initial checked state for uncontrolled use, where nothing declared one.",
109831
+ "description": "Whether the markup declared it checked, which is where a reset returns to.",
109837
109832
  "attribute": "default-checked",
109838
109833
  "inheritedFrom": {
109839
109834
  "name": "MixinControllerChecked",
@@ -110801,7 +110796,7 @@
110801
110796
  "text": "boolean"
110802
110797
  },
110803
110798
  "default": "false",
110804
- "description": "Initial checked state for uncontrolled use, where nothing declared one.",
110799
+ "description": "Whether the markup declared it checked, which is where a reset returns to.",
110805
110800
  "fieldName": "defaultChecked",
110806
110801
  "inheritedFrom": {
110807
110802
  "name": "MixinControllerChecked",
@@ -111542,7 +111537,7 @@
111542
111537
  "type": {
111543
111538
  "text": "'center' | 'end' | 'start' | undefined"
111544
111539
  },
111545
- "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.",
111540
+ "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.",
111546
111541
  "attribute": "align",
111547
111542
  "reflects": true,
111548
111543
  "inheritedFrom": {
@@ -111626,7 +111621,7 @@
111626
111621
  "text": "string"
111627
111622
  },
111628
111623
  "default": "''",
111629
- "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.",
111624
+ "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.",
111630
111625
  "attribute": "width",
111631
111626
  "inheritedFrom": {
111632
111627
  "name": "HelixHeadlessTableColumn",
@@ -112315,7 +112310,7 @@
112315
112310
  "type": {
112316
112311
  "text": "'center' | 'end' | 'start' | undefined"
112317
112312
  },
112318
- "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.",
112313
+ "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.",
112319
112314
  "fieldName": "align",
112320
112315
  "inheritedFrom": {
112321
112316
  "name": "HelixHeadlessTableColumn",
@@ -112367,7 +112362,7 @@
112367
112362
  "text": "string"
112368
112363
  },
112369
112364
  "default": "''",
112370
- "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.",
112365
+ "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.",
112371
112366
  "fieldName": "width",
112372
112367
  "inheritedFrom": {
112373
112368
  "name": "HelixHeadlessTableColumn",
@@ -112511,7 +112506,7 @@
112511
112506
  "name": "--table-columns"
112512
112507
  },
112513
112508
  {
112514
- "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.",
112509
+ "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.",
112515
112510
  "name": "--table-template",
112516
112511
  "inheritedFrom": {
112517
112512
  "name": "HelixHeadlessTable",
@@ -112715,7 +112710,7 @@
112715
112710
  "text": "string"
112716
112711
  },
112717
112712
  "default": "''",
112718
- "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.",
112713
+ "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.",
112719
112714
  "attribute": "columns",
112720
112715
  "inheritedFrom": {
112721
112716
  "name": "HelixHeadlessTable",
@@ -113256,7 +113251,7 @@
113256
113251
  "text": "string"
113257
113252
  },
113258
113253
  "default": "''",
113259
- "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.",
113254
+ "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.",
113260
113255
  "fieldName": "columns",
113261
113256
  "inheritedFrom": {
113262
113257
  "name": "HelixHeadlessTable",
@@ -114359,7 +114354,7 @@
114359
114354
  "text": "string"
114360
114355
  },
114361
114356
  "default": "''",
114362
- "description": "Initial item for uncontrolled use.\n\nIgnored once `active` is written.",
114357
+ "description": "Which item the markup declared current.\n\nIgnored once `active` is written.",
114363
114358
  "attribute": "default-active",
114364
114359
  "inheritedFrom": {
114365
114360
  "name": "MixinControllerActive",
@@ -114965,7 +114960,7 @@
114965
114960
  "text": "string"
114966
114961
  },
114967
114962
  "default": "''",
114968
- "description": "Initial item for uncontrolled use.\n\nIgnored once `active` is written.",
114963
+ "description": "Which item the markup declared current.\n\nIgnored once `active` is written.",
114969
114964
  "fieldName": "defaultActive",
114970
114965
  "inheritedFrom": {
114971
114966
  "name": "MixinControllerActive",
@@ -118918,7 +118913,7 @@
118918
118913
  "text": "boolean"
118919
118914
  },
118920
118915
  "default": "false",
118921
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
118916
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
118922
118917
  "attribute": "default-open",
118923
118918
  "inheritedFrom": {
118924
118919
  "name": "MixinControllerOpen",
@@ -119637,7 +119632,7 @@
119637
119632
  "type": {
119638
119633
  "text": "'multiple' | 'range' | undefined"
119639
119634
  },
119640
- "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.",
119635
+ "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.",
119641
119636
  "attribute": "mode",
119642
119637
  "reflects": true,
119643
119638
  "inheritedFrom": {
@@ -119842,7 +119837,7 @@
119842
119837
  "type": {
119843
119838
  "text": "'list' | 'wheels' | undefined"
119844
119839
  },
119845
- "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.",
119840
+ "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.",
119846
119841
  "attribute": "variant",
119847
119842
  "reflects": true,
119848
119843
  "inheritedFrom": {
@@ -119897,7 +119892,7 @@
119897
119892
  "text": "TemplateResult"
119898
119893
  }
119899
119894
  },
119900
- "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.",
119895
+ "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.",
119901
119896
  "inheritedFrom": {
119902
119897
  "name": "HelixHeadlessTimeInput",
119903
119898
  "module": "src/time-input/root/time-input-root.ts"
@@ -120485,7 +120480,7 @@
120485
120480
  "text": "boolean"
120486
120481
  },
120487
120482
  "default": "false",
120488
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
120483
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
120489
120484
  "fieldName": "defaultOpen",
120490
120485
  "inheritedFrom": {
120491
120486
  "name": "MixinControllerOpen",
@@ -120678,7 +120673,7 @@
120678
120673
  "type": {
120679
120674
  "text": "'multiple' | 'range' | undefined"
120680
120675
  },
120681
- "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.",
120676
+ "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.",
120682
120677
  "fieldName": "mode",
120683
120678
  "inheritedFrom": {
120684
120679
  "name": "HelixHeadlessTimeInput",
@@ -120742,7 +120737,7 @@
120742
120737
  "type": {
120743
120738
  "text": "'list' | 'wheels' | undefined"
120744
120739
  },
120745
- "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.",
120740
+ "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.",
120746
120741
  "fieldName": "variant",
120747
120742
  "inheritedFrom": {
120748
120743
  "name": "HelixHeadlessTimeInput",
@@ -121604,7 +121599,7 @@
121604
121599
  "type": {
121605
121600
  "text": "'multiple' | 'range' | undefined"
121606
121601
  },
121607
- "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.",
121602
+ "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.",
121608
121603
  "attribute": "mode",
121609
121604
  "reflects": true,
121610
121605
  "inheritedFrom": {
@@ -121928,7 +121923,7 @@
121928
121923
  "text": "Promise<void>"
121929
121924
  }
121930
121925
  },
121931
- "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.",
121926
+ "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.",
121932
121927
  "inheritedFrom": {
121933
121928
  "name": "HelixHeadlessTimePicker",
121934
121929
  "module": "src/time-picker/root/time-picker-root.ts"
@@ -122714,7 +122709,7 @@
122714
122709
  "type": {
122715
122710
  "text": "'multiple' | 'range' | undefined"
122716
122711
  },
122717
- "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.",
122712
+ "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.",
122718
122713
  "fieldName": "mode",
122719
122714
  "inheritedFrom": {
122720
122715
  "name": "HelixHeadlessTimePicker",
@@ -125124,7 +125119,7 @@
125124
125119
  "type": {
125125
125120
  "text": "| 'bottom-center'\n | 'bottom-end'\n | 'bottom-start'\n | 'top-center'\n | 'top-end'\n | 'top-start' | undefined"
125126
125121
  },
125127
- "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.",
125122
+ "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.",
125128
125123
  "attribute": "placement",
125129
125124
  "reflects": true,
125130
125125
  "inheritedFrom": {
@@ -125506,7 +125501,7 @@
125506
125501
  "customElement": true,
125507
125502
  "slots": [
125508
125503
  {
125509
- "description": "The messages, as `helix-toast-item` elements.",
125504
+ "description": "The messages.",
125510
125505
  "name": "",
125511
125506
  "inheritedFrom": {
125512
125507
  "name": "HelixHeadlessToast",
@@ -125543,7 +125538,7 @@
125543
125538
  "type": {
125544
125539
  "text": "| 'bottom-center'\n | 'bottom-end'\n | 'bottom-start'\n | 'top-center'\n | 'top-end'\n | 'top-start' | undefined"
125545
125540
  },
125546
- "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.",
125541
+ "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.",
125547
125542
  "fieldName": "placement",
125548
125543
  "inheritedFrom": {
125549
125544
  "name": "HelixHeadlessToast",
@@ -127105,7 +127100,7 @@
127105
127100
  "type": {
127106
127101
  "text": "boolean"
127107
127102
  },
127108
- "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.",
127103
+ "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.",
127109
127104
  "inheritedFrom": {
127110
127105
  "name": "HelixHeadlessToggle",
127111
127106
  "module": "src/toggle/root/toggle-root.ts"
@@ -128320,7 +128315,7 @@
128320
128315
  "text": "boolean"
128321
128316
  },
128322
128317
  "default": "false",
128323
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
128318
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
128324
128319
  "attribute": "default-open",
128325
128320
  "inheritedFrom": {
128326
128321
  "name": "MixinControllerOpen",
@@ -129219,7 +129214,7 @@
129219
129214
  "text": "boolean"
129220
129215
  },
129221
129216
  "default": "false",
129222
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
129217
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
129223
129218
  "fieldName": "defaultOpen",
129224
129219
  "inheritedFrom": {
129225
129220
  "name": "MixinControllerOpen",
@@ -131769,7 +131764,7 @@
131769
131764
  "text": "boolean"
131770
131765
  },
131771
131766
  "default": "false",
131772
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
131767
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
131773
131768
  "attribute": "default-open",
131774
131769
  "inheritedFrom": {
131775
131770
  "name": "MixinControllerOpen",
@@ -132479,7 +132474,7 @@
132479
132474
  "text": "boolean"
132480
132475
  },
132481
132476
  "default": "false",
132482
- "description": "Initial open state for uncontrolled use, where nothing declared one.",
132477
+ "description": "Whether the markup declared it open. Ignored once `open` is written.",
132483
132478
  "fieldName": "defaultOpen",
132484
132479
  "inheritedFrom": {
132485
132480
  "name": "MixinControllerOpen",
@@ -132866,7 +132861,7 @@
132866
132861
  "text": "string"
132867
132862
  },
132868
132863
  "default": "''",
132869
- "description": "Initial item for uncontrolled use.\n\nIgnored once `active` is written.",
132864
+ "description": "Which item the markup declared current.\n\nIgnored once `active` is written.",
132870
132865
  "attribute": "default-active",
132871
132866
  "inheritedFrom": {
132872
132867
  "name": "MixinControllerActive",
@@ -133005,7 +133000,7 @@
133005
133000
  "text": "HelixHeadlessTreeItem[]"
133006
133001
  },
133007
133002
  "privacy": "private",
133008
- "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.",
133003
+ "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.",
133009
133004
  "readonly": true,
133010
133005
  "inheritedFrom": {
133011
133006
  "name": "HelixHeadlessTree",
@@ -133551,7 +133546,7 @@
133551
133546
  "text": "string"
133552
133547
  },
133553
133548
  "default": "''",
133554
- "description": "Initial item for uncontrolled use.\n\nIgnored once `active` is written.",
133549
+ "description": "Which item the markup declared current.\n\nIgnored once `active` is written.",
133555
133550
  "fieldName": "defaultActive",
133556
133551
  "inheritedFrom": {
133557
133552
  "name": "MixinControllerActive",
@@ -135027,7 +135022,7 @@
135027
135022
  "text": "HelixHeadlessVideoPlaylistItem[]"
135028
135023
  },
135029
135024
  "privacy": "private",
135030
- "description": "The playlist's entries, in the order it holds them.",
135025
+ "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.",
135031
135026
  "readonly": true,
135032
135027
  "inheritedFrom": {
135033
135028
  "name": "HelixHeadlessVideoPlaylistMenu",
@@ -135674,7 +135669,7 @@
135674
135669
  "text": "string"
135675
135670
  },
135676
135671
  "default": "''",
135677
- "description": "Initial item for uncontrolled use.\n\nIgnored once `active` is written.",
135672
+ "description": "Which item the markup declared current.\n\nIgnored once `active` is written.",
135678
135673
  "attribute": "default-active",
135679
135674
  "inheritedFrom": {
135680
135675
  "name": "MixinControllerActive",
@@ -135815,7 +135810,7 @@
135815
135810
  "text": "| (HTMLElement & {\n label: string\n play: () => void\n poster: string\n src: string\n updateComplete?: Promise<unknown>\n })\n | null"
135816
135811
  },
135817
135812
  "privacy": "private",
135818
- "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.",
135813
+ "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.",
135819
135814
  "readonly": true,
135820
135815
  "inheritedFrom": {
135821
135816
  "name": "HelixHeadlessVideoPlaylist",
@@ -136277,7 +136272,7 @@
136277
136272
  "text": "string"
136278
136273
  },
136279
136274
  "default": "''",
136280
- "description": "Initial item for uncontrolled use.\n\nIgnored once `active` is written.",
136275
+ "description": "Which item the markup declared current.\n\nIgnored once `active` is written.",
136281
136276
  "fieldName": "defaultActive",
136282
136277
  "inheritedFrom": {
136283
136278
  "name": "MixinControllerActive",
@@ -136334,7 +136329,7 @@
136334
136329
  }
136335
136330
  },
136336
136331
  {
136337
- "description": "The `helix-video` they play in.",
136332
+ "description": "The player the entries take turns in.",
136338
136333
  "name": "player",
136339
136334
  "inheritedFrom": {
136340
136335
  "name": "HelixHeadlessVideoPlaylist",