@fusion.dev/helix-headless 0.51.0 → 0.52.1

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.
@@ -2350,7 +2350,7 @@
2350
2350
  "type": {
2351
2351
  "text": "Curve | undefined"
2352
2352
  },
2353
- "description": "How a band's edge gets from one reading to the next.\n\nThree values, and the class doc argues for each: `straight` is absent and\nis the default, `smooth` is for a stack read as a shape and is the one that\ncan draw a part as less than nothing, `step` is for a quantity that changes\nat a moment and is ordered the way `straight` is.\n\nAbsent rather than defaulted because a reflecting property with a default\nwrites its attribute onto every host, including the ones nobody configured.",
2353
+ "description": "How a band's edge gets from one reading to the next.\n\nThree values, and the class doc argues for each: `straight` is absent and\nis the default, `smooth` is for a stack read as a shape and is the one that\ncan draw a part as less than nothing, `step` is for a quantity that changes\nat a moment and is ordered the way `straight` is.\n\nAbsent rather than defaulted because a reflecting property with a default\nwrites its attribute onto every host, including the ones nobody configured.\nThe resting value therefore lives in the render, as `curve ?? 'straight'`.\n\n**`LineChart` and `Sparkline` rest at `smooth` and are not disagreeing.** A\nline claims a position, so the bounded invention a monotone cubic makes is\na reading aid and costs nothing. A band claims an amount, and two sums\nsmoothed independently can cross, so the same aid here draws a part as less\nthan nothing. Same axis, different mark, different resting value.",
2354
2354
  "attribute": "curve",
2355
2355
  "reflects": true
2356
2356
  },
@@ -3136,7 +3136,7 @@
3136
3136
  "type": {
3137
3137
  "text": "Curve | undefined"
3138
3138
  },
3139
- "description": "How a band's edge gets from one reading to the next.\n\nThree values, and the class doc argues for each: `straight` is absent and\nis the default, `smooth` is for a stack read as a shape and is the one that\ncan draw a part as less than nothing, `step` is for a quantity that changes\nat a moment and is ordered the way `straight` is.\n\nAbsent rather than defaulted because a reflecting property with a default\nwrites its attribute onto every host, including the ones nobody configured.",
3139
+ "description": "How a band's edge gets from one reading to the next.\n\nThree values, and the class doc argues for each: `straight` is absent and\nis the default, `smooth` is for a stack read as a shape and is the one that\ncan draw a part as less than nothing, `step` is for a quantity that changes\nat a moment and is ordered the way `straight` is.\n\nAbsent rather than defaulted because a reflecting property with a default\nwrites its attribute onto every host, including the ones nobody configured.\nThe resting value therefore lives in the render, as `curve ?? 'straight'`.\n\n**`LineChart` and `Sparkline` rest at `smooth` and are not disagreeing.** A\nline claims a position, so the bounded invention a monotone cubic makes is\na reading aid and costs nothing. A band claims an amount, and two sums\nsmoothed independently can cross, so the same aid here draws a part as less\nthan nothing. Same axis, different mark, different resting value.",
3140
3140
  "fieldName": "curve"
3141
3141
  },
3142
3142
  {
@@ -9988,7 +9988,7 @@
9988
9988
  }
9989
9989
  }
9990
9990
  ],
9991
- "description": "The leading padding the track keeps for a slide to draw its own edge in.\n\nA styled track carries one so a slide's shadow and focus ring have\nsomewhere to go: a scroll container clips at its padding box, and a slide\nflush against that edge loses whatever it paints outside itself. The\nheadless tier has no stylesheet and so no padding, and this reads zero\nthere, which is why both tiers can share the arithmetic below.\n\nPhysical sides rather than logical, to match the physical `offsetLeft` and\n`offsetTop` it is subtracted from. The bleed is one length on all four\nsides, so the two agree whatever the writing mode; if that stops being\ntrue, this is the method that has to know."
9991
+ "description": "The leading padding the track keeps for a slide to draw its own edge in.\n\nA styled track carries one so a slide's shadow and focus ring have\nsomewhere to go: a scroll container clips at its padding box, and a slide\nflush against that edge loses whatever it paints outside itself. The\nheadless tier has no stylesheet and so no padding, and this reads zero\nthere, which is why both tiers can share the arithmetic below.\n\nPhysical sides rather than logical, to match the physical `offsetLeft` and\n`offsetTop` it is subtracted from.\n\n**The side read is the side the track scrolls on, and not one side standing\nfor four.** They are one length on a track laid out at the defaults and\nstop being one the moment a consumer raises `--carousel-bleed`, which the\nhook exists to invite: a slide on `--helix-shadow-lg` reaches 44px and is\ntold to ask for it. So a horizontal track's room is its inline padding and\na vertical one's is its block padding, and each sheet puts the bleed where\nthe scroller clips. Reading one side for both would have a vertical track\nmeasuring a length nothing on its axis was laid out with."
9992
9992
  },
9993
9993
  {
9994
9994
  "kind": "method",
@@ -10594,7 +10594,7 @@
10594
10594
  "helix": {
10595
10595
  "category": "layout",
10596
10596
  "since": "0.1.0",
10597
- "status": "experimental",
10597
+ "status": "stable",
10598
10598
  "documentation": "https://fusion.dev/helix/components/carousel",
10599
10599
  "aliases": [
10600
10600
  "Slider",
@@ -49864,7 +49864,7 @@
49864
49864
  "type": {
49865
49865
  "text": "Curve | undefined"
49866
49866
  },
49867
- "description": "How the line gets from one reading to the next.\n\n**`smooth` is the resting curve.** A curve invents the values between two\nreadings, which is why `straight` still exists, but the invention is\nbounded: the interpolation is monotone cubic, so it never leaves the band\nthe data sets and never introduces a peak or a trough the series does not\nhave. Within that bound the smoothed line is the easier one to follow\nacross a long series, and `straight` becomes the deliberate claim.\n\n**Absent rather than defaulted on the property**, because a reflecting\nproperty with a default writes its attribute onto every host anybody\nrenders, including the ones nobody configured.\n`line-chart-root.ssr.spec.ts` asserts the host carries only what the\nconsumer wrote. The default therefore lives where the path is built, as\n`curve ?? 'smooth'`.\n\n`step` claims the opposite of both, that a reading holds until the next.",
49867
+ "description": "How the line gets from one reading to the next.\n\n**`smooth` is the resting curve.** A curve invents the values between two\nreadings, which is why `straight` still exists, but the invention is\nbounded: the interpolation is monotone cubic, so it never leaves the band\nthe data sets and never introduces a peak or a trough the series does not\nhave. Within that bound the smoothed line is the easier one to follow\nacross a long series, and `straight` becomes the deliberate claim.\n\n**Absent rather than defaulted on the property**, because a reflecting\nproperty with a default writes its attribute onto every host anybody\nrenders, including the ones nobody configured.\n`line-chart-root.ssr.spec.ts` asserts the host carries only what the\nconsumer wrote. The default therefore lives where the path is built, as\n`curve ?? 'smooth'`.\n\n`step` claims the opposite of both, that a reading holds until the next.\n\n**`AreaChart` rests at `straight` and is not disagreeing.** A line claims a\nposition and a stacked band claims an amount: a curve fitted through one\nsum can pass under the curve fitted through the sum beneath it, so a\nsmoothed stack can draw a part as less than nothing. There is no such edge\nhere, which is what lets a line take the reading aid.",
49868
49868
  "attribute": "curve",
49869
49869
  "reflects": true
49870
49870
  },
@@ -50647,7 +50647,7 @@
50647
50647
  "type": {
50648
50648
  "text": "Curve | undefined"
50649
50649
  },
50650
- "description": "How the line gets from one reading to the next.\n\n**`smooth` is the resting curve.** A curve invents the values between two\nreadings, which is why `straight` still exists, but the invention is\nbounded: the interpolation is monotone cubic, so it never leaves the band\nthe data sets and never introduces a peak or a trough the series does not\nhave. Within that bound the smoothed line is the easier one to follow\nacross a long series, and `straight` becomes the deliberate claim.\n\n**Absent rather than defaulted on the property**, because a reflecting\nproperty with a default writes its attribute onto every host anybody\nrenders, including the ones nobody configured.\n`line-chart-root.ssr.spec.ts` asserts the host carries only what the\nconsumer wrote. The default therefore lives where the path is built, as\n`curve ?? 'smooth'`.\n\n`step` claims the opposite of both, that a reading holds until the next.",
50650
+ "description": "How the line gets from one reading to the next.\n\n**`smooth` is the resting curve.** A curve invents the values between two\nreadings, which is why `straight` still exists, but the invention is\nbounded: the interpolation is monotone cubic, so it never leaves the band\nthe data sets and never introduces a peak or a trough the series does not\nhave. Within that bound the smoothed line is the easier one to follow\nacross a long series, and `straight` becomes the deliberate claim.\n\n**Absent rather than defaulted on the property**, because a reflecting\nproperty with a default writes its attribute onto every host anybody\nrenders, including the ones nobody configured.\n`line-chart-root.ssr.spec.ts` asserts the host carries only what the\nconsumer wrote. The default therefore lives where the path is built, as\n`curve ?? 'smooth'`.\n\n`step` claims the opposite of both, that a reading holds until the next.\n\n**`AreaChart` rests at `straight` and is not disagreeing.** A line claims a\nposition and a stacked band claims an amount: a curve fitted through one\nsum can pass under the curve fitted through the sum beneath it, so a\nsmoothed stack can draw a part as less than nothing. There is no such edge\nhere, which is what lets a line take the reading aid.",
50651
50651
  "fieldName": "curve"
50652
50652
  },
50653
50653
  {
@@ -69615,11 +69615,11 @@
69615
69615
  "kind": "field",
69616
69616
  "name": "shape",
69617
69617
  "type": {
69618
- "text": "QrStyle"
69618
+ "text": "QrStyle | undefined"
69619
69619
  },
69620
- "default": "'square'",
69621
- "description": "How the modules are drawn.\n\n`square` is the default and the only one that joins runs of adjacent\nmodules into a single subpath, which is what keeps a thousand modules to a\nhandful of nodes. `rounded` and `dots` draw each module on its own, because\nthe corners are the thing being drawn and a joined run has none in the\nmiddle. That cost is paid only by a code that asks for them.\n\nA scanner reads contrast between cells, not their shape, so all three\nscan. `dots` sits a little under half a module so neighbors do not touch,\nwhich is what makes it read as dots rather than as a softened square code.",
69622
- "attribute": "shape"
69620
+ "description": "How the modules are drawn.\n\n`square` is the resting state and is written by not writing it, per the\nrule that a reflected property takes no default. It is also the only one\nthat joins runs of adjacent modules into a single subpath, which is what\nkeeps a thousand modules to a handful of nodes. `rounded` and `dots` draw\neach module on its own, because the corners are the thing being drawn and a\njoined run has none in the middle. That cost is paid only by a code that\nasks for them.\n\nA scanner reads contrast between cells, not their shape, so all three\nscan. `dots` sits a little under half a module so neighbors do not touch,\nwhich is what makes it read as dots rather than as a softened square code.",
69621
+ "attribute": "shape",
69622
+ "reflects": true
69623
69623
  },
69624
69624
  {
69625
69625
  "kind": "field",
@@ -70007,10 +70007,9 @@
70007
70007
  {
70008
70008
  "name": "shape",
70009
70009
  "type": {
70010
- "text": "QrStyle"
70010
+ "text": "QrStyle | undefined"
70011
70011
  },
70012
- "default": "'square'",
70013
- "description": "How the modules are drawn.\n\n`square` is the default and the only one that joins runs of adjacent\nmodules into a single subpath, which is what keeps a thousand modules to a\nhandful of nodes. `rounded` and `dots` draw each module on its own, because\nthe corners are the thing being drawn and a joined run has none in the\nmiddle. That cost is paid only by a code that asks for them.\n\nA scanner reads contrast between cells, not their shape, so all three\nscan. `dots` sits a little under half a module so neighbors do not touch,\nwhich is what makes it read as dots rather than as a softened square code.",
70012
+ "description": "How the modules are drawn.\n\n`square` is the resting state and is written by not writing it, per the\nrule that a reflected property takes no default. It is also the only one\nthat joins runs of adjacent modules into a single subpath, which is what\nkeeps a thousand modules to a handful of nodes. `rounded` and `dots` draw\neach module on its own, because the corners are the thing being drawn and a\njoined run has none in the middle. That cost is paid only by a code that\nasks for them.\n\nA scanner reads contrast between cells, not their shape, so all three\nscan. `dots` sits a little under half a module so neighbors do not touch,\nwhich is what makes it read as dots rather than as a softened square code.",
70014
70013
  "fieldName": "shape"
70015
70014
  },
70016
70015
  {
@@ -79128,7 +79127,7 @@
79128
79127
  "type": {
79129
79128
  "text": "Curve | undefined"
79130
79129
  },
79131
- "description": "How the line gets from one reading to the next.\n\n**`smooth` is the resting curve.** A straight segment asserts nothing about\nthe values between two readings and a curve invents them, which is why\n`straight` exists. What settles the default the other way is that the\ninvention is bounded: the interpolation is monotone cubic, so it never\nleaves the band the data sets and never introduces a peak or a trough the\nseries does not have. Within that bound the smoothed line is the easier one\nto follow across a long series, which is what the drawing is for. `straight`\nbecomes the claim a consumer makes deliberately rather than the one they get\nby saying nothing.\n\n**The property stays optional and the default lives in the render.** A\nreflecting property with a default writes its attribute onto every host\nanybody renders, including the ones nobody configured, which the SSR specs\nassert against. So the resting state is still the attribute's absence, and\n`curve ?? 'smooth'` is what reads it.\n\n`step` claims the opposite of both, that a reading holds until the next.\nBars ignore it, having no between to interpolate.",
79130
+ "description": "How the line gets from one reading to the next.\n\n**`smooth` is the resting curve.** A straight segment asserts nothing about\nthe values between two readings and a curve invents them, which is why\n`straight` exists. What settles the default the other way is that the\ninvention is bounded: the interpolation is monotone cubic, so it never\nleaves the band the data sets and never introduces a peak or a trough the\nseries does not have. Within that bound the smoothed line is the easier one\nto follow across a long series, which is what the drawing is for. `straight`\nbecomes the claim a consumer makes deliberately rather than the one they get\nby saying nothing.\n\n**The property stays optional and the default lives in the render.** A\nreflecting property with a default writes its attribute onto every host\nanybody renders, including the ones nobody configured, which the SSR specs\nassert against. So the resting state is still the attribute's absence, and\n`curve ?? 'smooth'` is what reads it.\n\n`step` claims the opposite of both, that a reading holds until the next.\nBars ignore it, having no between to interpolate.\n\n**`AreaChart` rests at `straight` and is not disagreeing.** A line claims a\nposition and a stacked band claims an amount: a curve fitted through one\nsum can pass under the curve fitted through the sum beneath it, so a\nsmoothed stack can draw a part as less than nothing. There is no such edge\nhere, which is what lets a line take the reading aid.",
79132
79131
  "attribute": "curve",
79133
79132
  "reflects": true
79134
79133
  },
@@ -79521,7 +79520,7 @@
79521
79520
  "type": {
79522
79521
  "text": "Curve | undefined"
79523
79522
  },
79524
- "description": "How the line gets from one reading to the next.\n\n**`smooth` is the resting curve.** A straight segment asserts nothing about\nthe values between two readings and a curve invents them, which is why\n`straight` exists. What settles the default the other way is that the\ninvention is bounded: the interpolation is monotone cubic, so it never\nleaves the band the data sets and never introduces a peak or a trough the\nseries does not have. Within that bound the smoothed line is the easier one\nto follow across a long series, which is what the drawing is for. `straight`\nbecomes the claim a consumer makes deliberately rather than the one they get\nby saying nothing.\n\n**The property stays optional and the default lives in the render.** A\nreflecting property with a default writes its attribute onto every host\nanybody renders, including the ones nobody configured, which the SSR specs\nassert against. So the resting state is still the attribute's absence, and\n`curve ?? 'smooth'` is what reads it.\n\n`step` claims the opposite of both, that a reading holds until the next.\nBars ignore it, having no between to interpolate.",
79523
+ "description": "How the line gets from one reading to the next.\n\n**`smooth` is the resting curve.** A straight segment asserts nothing about\nthe values between two readings and a curve invents them, which is why\n`straight` exists. What settles the default the other way is that the\ninvention is bounded: the interpolation is monotone cubic, so it never\nleaves the band the data sets and never introduces a peak or a trough the\nseries does not have. Within that bound the smoothed line is the easier one\nto follow across a long series, which is what the drawing is for. `straight`\nbecomes the claim a consumer makes deliberately rather than the one they get\nby saying nothing.\n\n**The property stays optional and the default lives in the render.** A\nreflecting property with a default writes its attribute onto every host\nanybody renders, including the ones nobody configured, which the SSR specs\nassert against. So the resting state is still the attribute's absence, and\n`curve ?? 'smooth'` is what reads it.\n\n`step` claims the opposite of both, that a reading holds until the next.\nBars ignore it, having no between to interpolate.\n\n**`AreaChart` rests at `straight` and is not disagreeing.** A line claims a\nposition and a stacked band claims an amount: a curve fitted through one\nsum can pass under the curve fitted through the sum beneath it, so a\nsmoothed stack can draw a part as less than nothing. There is no such edge\nhere, which is what lets a line take the reading aid.",
79525
79524
  "fieldName": "curve"
79526
79525
  },
79527
79526
  {
@@ -80928,7 +80927,7 @@
80928
80927
  "declarations": [
80929
80928
  {
80930
80929
  "kind": "class",
80931
- "description": "**One axis, and nesting is how you get two.** A splitter inside a splitter\ngives back the cross, and gives the three-pane and four-pane arrangements a\nsingle divider never had.\n\n**Where two of them cross there is a corner, and it moves both.** A splitter\nslotted into a pane of another, at right angles to it, grows a handle at the\ncrossing: `move` under the pointer, both arrow axes on the keyboard, and a\ndrag that carries the two positions at once. It appears at `firstUpdated`\nrather than in the served markup, being an affordance rather than content,\nand a splitter with no corner yet is a splitter with two working dividers.\n\n**The divider is a real `role=\"separator\"` with `aria-valuenow`**, moved by\nthe arrow keys as well as by pointer, with `Home` and `End` taking it to its\nbounds. A drag in progress is a state rather than `:hover`, so both dividers\na corner moves are lit for as long as it moves them.\n\n**It goes where it is put, all the way to either end.** `min` and `max` are\nnothing and everything unless a consumer says otherwise, because a divider\nthat stops short of the edge gives a reader no way to put a pane away.\n\n**A pane can be shut, and that is not the same as a divider at the edge.**\nThe geometry is identical and the knowledge is not: only a shut pane knows\nwhere to open back to. So `collapsed` is a second state rather than a reading\nof the position, and the position it opens to is the one collapsing never\noverwrote. `collapsed-size` keeps a sliver showing where a pane has a tab\nstrip worth leaving, and collapse overrides `min` and `max`, which is what\nthose are for.",
80930
+ "description": "**One axis, and nesting is how you get two.** A splitter inside a splitter\ngives back the cross, and gives the three-pane and four-pane arrangements a\nsingle divider never had.\n\n**Where two of them cross there is a corner, and it moves both.** A splitter\nslotted into a pane of another, at right angles to it, grows a handle at the\ncrossing: `move` under the pointer, both arrow axes on the keyboard, and a\ndrag that carries the two positions at once. It appears at `firstUpdated`\nrather than in the served markup, being an affordance rather than content,\nand a splitter with no corner yet is a splitter with two working dividers.\n\n**The divider is a real `role=\"separator\"` with `aria-valuenow`**, moved by\nthe arrow keys as well as by pointer, with `Home` and `End` taking it to its\nbounds. A drag in progress is a state rather than `:hover`, so both dividers\na corner moves are lit for as long as it moves them.\n\n**It goes where it is put, all the way to either end.** `min` and `max` are\nnothing and everything unless a consumer says otherwise, because a divider\nthat stops short of the edge gives a reader no way to put a pane away.\n\n**A pane can be shut, and that is not the same as a divider at the edge.**\nThe geometry is identical and the knowledge is not: only a shut pane knows\nwhere to open back to. So `collapsed` is a second state rather than a reading\nof the position, and the position it opens to is where the gesture that shut\nit began, whichever gesture that was: a drag takes its reading on the press,\nand every other door takes it in `settle`, nothing having been applied there\nyet. `collapsed-size` keeps a sliver showing where a pane has a tab strip\nworth leaving, and collapse overrides `min` and `max`, which is what those\nare for.",
80932
80931
  "name": "HelixHeadlessSplitter",
80933
80932
  "cssProperties": [
80934
80933
  {
@@ -81149,7 +81148,7 @@
81149
81148
  },
81150
81149
  "privacy": "private",
81151
81150
  "default": "undefined",
81152
- "description": "Where the divider was before the gesture that may be about to shut it.\n\nA drag writes a position on every pointer move, so by the time it reaches\nthe edge the number it started from is gone. Taken once, on the press, and\nwritten back if the gesture ends shut, so the pane opens to where it was\nrather than to the edge it was dragged against."
81151
+ "description": "Where the divider was before the gesture that may be about to shut it.\n\nA drag writes a position on every pointer move, so by the time it reaches\nthe edge the number it started from is gone. Taken once, on the press, and\nwritten back if the gesture ends shut, so the pane opens to where it was\nrather than to the edge it was dragged against.\n\n**A pointer gesture only, because it is the only one that loses it**, and\n`settle` answers for the rest from `began`: a key and a double click apply\nnothing before they settle, so where the divider is at the top of that\nmethod is where it was. Read once and cleared there, exactly as `began` is,\nand for the second reason as well as the first. Left standing it measured\nthe next gesture against the last one's press, so a collapse pressed from\n20 reopened at the 60 a drag had started from an hour earlier."
81153
81152
  },
81154
81153
  {
81155
81154
  "kind": "field",
@@ -81399,7 +81398,7 @@
81399
81398
  }
81400
81399
  }
81401
81400
  ],
81402
- "description": "Says the arrangement has settled, so a consumer can keep it.\n\nThrough the audited path, so a consumer who owns `position` is told what was\nasked for and decides, and one who does not has already had it applied.\n\n**A refused resize ends the resize and not the gesture.** `shutAt` reads the\nposition the gesture ended on, so the collapse is computed from a number the\nconsumer may have declined, and the reading this replaces was that the two\nare therefore one decision: refuse the first and the second cannot stand.\nThat is a reasonable thing to believe about a splitter nobody else owns, and\nit takes \"no\" to mean the gesture is over. What it misses is that a consumer\nwho owns the position refuses in order to *take* the decision, not to end\nit. The sandbox two folders away refuses every `helix-before-resize` from\nthe splitter inside it, re-announces the same move in its own vocabulary and\nwrites the answer back through `position`, which is what makes it the single\ndecision point; returning on its refusal left `panel-collapsed-size` inert\nthere, the shipped `with-a-panel` example measuring a 0px panel against the\n36 its summary promises. So the collapse is reached either way and is\nrefused, or not, on its own.\n\n**Which is honest because the collapse carries its own position.** A shut\npane sits at `collapsed-size`, which is where `position` reads it from once\n`collapsed` is set, and never at the number the resize named: refuse a drag\nto 100 on a splitter with `collapsed-size=\"10\"`, allow the collapse, and the\ndivider is at 90. Nothing writes the refused number either, `requestChange`\napplying nothing when it is refused and the collapse below writing the open\nposition back over whatever a drag had already drawn, so a consumer who says\nno to the position and yes to the collapse gets the pane shut and keeps the\nnumber they had to reopen to. The two coincide only where `collapsed-size`\nis zero, and the states differ even there: a shut pane knows where to open\nback to and a divider parked at the edge does not.\n\nRefusing the collapse alone still leaves the resize, which is the other way\nround and is coherent: the divider goes where the drag put it and the pane\nis not declared shut.\n\n**A gesture that moved nothing announces nothing, and this is the one place\nthat can say so.** A change carrying the position the divider already had\nrewrites a consumer's stored value from a gesture that moved nothing:\nharmless where the value round-trips exactly, and not where it does not,\nwhich is any consumer storing pixels and dividing by a box. The separator's\n`pointerup` held that as an early return of its own and was the only door\nwith one. There are five: the separator's pointer and arrows, the corner's\npointer and arrows, and a double click through `reset`, and `moveTo` is a\nsixth a consumer can open. Measured in Chromium 17 Sep 2026 on the built\nbundle, every door but the guarded one announced a move of zero: a corner\npress with nothing between announced on both splitters, `Home` on a divider\nalready at its minimum announced, and a double click on one already at its\ndefault announced.\n\n**Measured against where the gesture began, and not against `position`.**\n`move` applies as it goes, so by the time a drag settles the position is\nalready the number about to be announced, and comparing those two would\nsilence every drag there is. `began` is the press; a discrete path takes\nnone and compares against the position, which for it is the same thing.\n\n**Per divider rather than per gesture, which is the corner's question.** The\ncorner drives two at once, so \"moved nothing\" cannot mean \"neither moved\":\na drag along one axis moves one of them, and the other would be announcing\na number nobody asked to change. Each settles on its own and guards on its\nown, so the one that moved still announces while the one that did not stays\nquiet. That is also why the guard cannot live in `handleCornerUp`, which\nonly ever sees the pair.\n\n**The collapse counts as movement, because a refusal can leave the two\ndisagreeing.** A consumer who refuses `helix-before-collapse` has a pane at\nthe edge that is not declared shut, and a guard reading the position alone\nwould then never offer the collapse again: `Home` is already at the\nminimum, so every later press is a move of zero."
81401
+ "description": "Says the arrangement has settled, so a consumer can keep it.\n\nThrough the audited path, so a consumer who owns `position` is told what was\nasked for and decides, and one who does not has already had it applied.\n\n**A refused resize ends the resize and not the gesture.** `shutAt` reads the\nposition the gesture ended on, so the collapse is computed from a number the\nconsumer may have declined, and the reading this replaces was that the two\nare therefore one decision: refuse the first and the second cannot stand.\nThat is a reasonable thing to believe about a splitter nobody else owns, and\nit takes \"no\" to mean the gesture is over. What it misses is that a consumer\nwho owns the position refuses in order to *take* the decision, not to end\nit. The sandbox two folders away refuses every `helix-before-resize` from\nthe splitter inside it, re-announces the same move in its own vocabulary and\nwrites the answer back through `position`, which is what makes it the single\ndecision point; returning on its refusal left `panel-collapsed-size` inert\nthere, the shipped `with-a-panel` example measuring a 0px panel against the\n36 it asks for. So the collapse is reached either way and is refused, or\nnot, on its own.\n\n**Which is honest because the collapse carries its own position.** A shut\npane sits at `collapsed-size`, which is where `position` reads it from once\n`collapsed` is set, and never at the number the resize named: refuse a drag\nto 100 on a splitter with `collapsed-size=\"10\"`, allow the collapse, and the\ndivider is at 90. Nothing writes the refused number either, `requestChange`\napplying nothing when it is refused and the collapse below writing the open\nposition back over whatever a drag had already drawn, so a consumer who says\nno to the position and yes to the collapse gets the pane shut and keeps the\nnumber they had to reopen to. The two coincide only where `collapsed-size`\nis zero, and the states differ even there: a shut pane knows where to open\nback to and a divider parked at the edge does not.\n\nRefusing the collapse alone still leaves the resize, which is the other way\nround and is coherent: the divider goes where the drag put it and the pane\nis not declared shut.\n\n**The open position is taken here for every door but the pointer's, which\nis the same split `began` makes and for the same reason.** A drag has\noverwritten the position on the way to the edge, so it reads it on the\npress; a key, a double click and `moveTo` apply nothing until the request\nbelow, so where the divider is at the top of this method is where it was.\nCaptured on the press alone, the class docstring's promise that a shut pane\nknows where to open back to held for a drag and for nothing else: measured\n17 Sep 2026, `Home` on a splitter resting at 60 shut the start pane and\nreopened it at 0, the resize above having written the edge and the collapse\nhaving nothing to put back. Stale, it was worse than absent, `opened` never\nbeing cleared: a press at 60, then a key collapse from 20, reopened at 60.\n\n**A gesture that moved nothing announces nothing, and this is the one place\nthat can say so.** A change carrying the position the divider already had\nrewrites a consumer's stored value from a gesture that moved nothing:\nharmless where the value round-trips exactly, and not where it does not,\nwhich is any consumer storing pixels and dividing by a box. The separator's\n`pointerup` held that as an early return of its own and was the only door\nwith one. There are five: the separator's pointer and arrows, the corner's\npointer and arrows, and a double click through `reset`, and `moveTo` is a\nsixth a consumer can open. Measured in Chromium 17 Sep 2026 on the built\nbundle, every door but the guarded one announced a move of zero: a corner\npress with nothing between announced on both splitters, `Home` on a divider\nalready at its minimum announced, and a double click on one already at its\ndefault announced.\n\n**Measured against where the gesture began, and not against `position`.**\n`move` applies as it goes, so by the time a drag settles the position is\nalready the number about to be announced, and comparing those two would\nsilence every drag there is. `began` is the press; a discrete path takes\nnone and compares against the position, which for it is the same thing.\n\n**Per divider rather than per gesture, which is the corner's question.** The\ncorner drives two at once, so \"moved nothing\" cannot mean \"neither moved\":\na drag along one axis moves one of them, and the other would be announcing\na number nobody asked to change. Each settles on its own and guards on its\nown, so the one that moved still announces while the one that did not stays\nquiet. That is also why the guard cannot live in `handleCornerUp`, which\nonly ever sees the pair.\n\n**The collapse counts as movement, because a refusal can leave the two\ndisagreeing.** A consumer who refuses `helix-before-collapse` has a pane at\nthe edge that is not declared shut, and a guard reading the position alone\nwould then never offer the collapse again: `Home` is already at the\nminimum, so every later press is a move of zero."
81403
81402
  },
81404
81403
  {
81405
81404
  "kind": "field",
@@ -82021,7 +82020,7 @@
82021
82020
  "helix": {
82022
82021
  "category": "layout",
82023
82022
  "since": "0.1.0",
82024
- "status": "experimental",
82023
+ "status": "stable",
82025
82024
  "documentation": "https://fusion.dev/helix/components/splitter",
82026
82025
  "aliases": [
82027
82026
  "SplitPane",
@@ -115,6 +115,13 @@ export declare class HelixHeadlessAreaChart extends HelixHeadlessAreaChart_base
115
115
  *
116
116
  * Absent rather than defaulted because a reflecting property with a default
117
117
  * writes its attribute onto every host, including the ones nobody configured.
118
+ * The resting value therefore lives in the render, as `curve ?? 'straight'`.
119
+ *
120
+ * **`LineChart` and `Sparkline` rest at `smooth` and are not disagreeing.** A
121
+ * line claims a position, so the bounded invention a monotone cubic makes is
122
+ * a reading aid and costs nothing. A band claims an amount, and two sums
123
+ * smoothed independently can cross, so the same aid here draws a part as less
124
+ * than nothing. Same axis, different mark, different resting value.
118
125
  */
119
126
  curve?: Curve;
120
127
  /**
@@ -20,7 +20,7 @@ import { type PropertyValues, type TemplateResult } from 'lit';
20
20
  * performs, and it is first in the tab order.
21
21
  *
22
22
  * @since 0.1.0
23
- * @status experimental
23
+ * @status stable
24
24
  * @category layout
25
25
  * @aliases Slider, Gallery, Slideshow
26
26
  * @documentation https://fusion.dev/helix/components/carousel
@@ -390,9 +390,16 @@ export declare class HelixHeadlessCarousel extends HelixElement {
390
390
  * there, which is why both tiers can share the arithmetic below.
391
391
  *
392
392
  * Physical sides rather than logical, to match the physical `offsetLeft` and
393
- * `offsetTop` it is subtracted from. The bleed is one length on all four
394
- * sides, so the two agree whatever the writing mode; if that stops being
395
- * true, this is the method that has to know.
393
+ * `offsetTop` it is subtracted from.
394
+ *
395
+ * **The side read is the side the track scrolls on, and not one side standing
396
+ * for four.** They are one length on a track laid out at the defaults and
397
+ * stop being one the moment a consumer raises `--carousel-bleed`, which the
398
+ * hook exists to invite: a slide on `--helix-shadow-lg` reaches 44px and is
399
+ * told to ask for it. So a horizontal track's room is its inline padding and
400
+ * a vertical one's is its block padding, and each sheet puts the bleed where
401
+ * the scroller clips. Reading one side for both would have a vertical track
402
+ * measuring a length nothing on its axis was laid out with.
396
403
  */
397
404
  private bleed;
398
405
  /**
@@ -297,15 +297,14 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
297
297
  }
298
298
  updated(changed) {
299
299
  super.updated(changed);
300
- const count = this.slides.length;
301
300
  const drawn = this.renderRoot.querySelectorAll('[part="slide"]').length;
302
301
  if (changed.has('index') || (this.scrolledFor === 0 && drawn > 0)) {
303
302
  this.scrollToIndex();
304
303
  }
305
304
  this.scrolledFor = drawn;
306
305
  this.runTimer();
307
- if (count > 0 && this.index > count - 1) {
308
- this.goTo(count - 1);
306
+ if (this.slides.length > 0 && this.index > this.positions - 1) {
307
+ this.goTo(this.positions - 1);
309
308
  }
310
309
  this.watchPane();
311
310
  this.assign();
@@ -101,6 +101,12 @@ export declare class HelixHeadlessLineChart extends HelixHeadlessLineChart_base
101
101
  * `curve ?? 'smooth'`.
102
102
  *
103
103
  * `step` claims the opposite of both, that a reading holds until the next.
104
+ *
105
+ * **`AreaChart` rests at `straight` and is not disagreeing.** A line claims a
106
+ * position and a stacked band claims an amount: a curve fitted through one
107
+ * sum can pass under the curve fitted through the sum beneath it, so a
108
+ * smoothed stack can draw a part as less than nothing. There is no such edge
109
+ * here, which is what lets a line take the reading aid.
104
110
  */
105
111
  curve?: Curve;
106
112
  /**
@@ -64,17 +64,19 @@ export declare class HelixHeadlessQrCode extends HelixElement {
64
64
  /**
65
65
  * How the modules are drawn.
66
66
  *
67
- * `square` is the default and the only one that joins runs of adjacent
68
- * modules into a single subpath, which is what keeps a thousand modules to a
69
- * handful of nodes. `rounded` and `dots` draw each module on its own, because
70
- * the corners are the thing being drawn and a joined run has none in the
71
- * middle. That cost is paid only by a code that asks for them.
67
+ * `square` is the resting state and is written by not writing it, per the
68
+ * rule that a reflected property takes no default. It is also the only one
69
+ * that joins runs of adjacent modules into a single subpath, which is what
70
+ * keeps a thousand modules to a handful of nodes. `rounded` and `dots` draw
71
+ * each module on its own, because the corners are the thing being drawn and a
72
+ * joined run has none in the middle. That cost is paid only by a code that
73
+ * asks for them.
72
74
  *
73
75
  * A scanner reads contrast between cells, not their shape, so all three
74
76
  * scan. `dots` sits a little under half a module so neighbors do not touch,
75
77
  * which is what makes it read as dots rather than as a softened square code.
76
78
  */
77
- shape: QrStyle;
79
+ shape?: QrStyle;
78
80
  /**
79
81
  * What the code encodes, which is usually a URL.
80
82
  */
@@ -63,7 +63,6 @@ let HelixHeadlessQrCode = class HelixHeadlessQrCode extends HelixElement {
63
63
  constructor() {
64
64
  super(...arguments);
65
65
  this.label = '';
66
- this.shape = 'square';
67
66
  this.value = '';
68
67
  this.logo = false;
69
68
  }
@@ -99,7 +98,7 @@ let HelixHeadlessQrCode = class HelixHeadlessQrCode extends HelixElement {
99
98
  >
100
99
  <path
101
100
  part="modules"
102
- d=${pathFor(result.data, this.shape, 'body')}
101
+ d=${pathFor(result.data, this.shape ?? 'square', 'body')}
103
102
  transform="translate(${quiet} ${quiet})"
104
103
  fill="currentColor"
105
104
  />
@@ -134,7 +133,7 @@ __decorate([
134
133
  property()
135
134
  ], HelixHeadlessQrCode.prototype, "label", void 0);
136
135
  __decorate([
137
- property()
136
+ property({ reflect: true })
138
137
  ], HelixHeadlessQrCode.prototype, "shape", void 0);
139
138
  __decorate([
140
139
  property()
@@ -70,6 +70,12 @@ export declare class HelixHeadlessSparkline extends HelixElement {
70
70
  *
71
71
  * `step` claims the opposite of both, that a reading holds until the next.
72
72
  * Bars ignore it, having no between to interpolate.
73
+ *
74
+ * **`AreaChart` rests at `straight` and is not disagreeing.** A line claims a
75
+ * position and a stacked band claims an amount: a curve fitted through one
76
+ * sum can pass under the curve fitted through the sum beneath it, so a
77
+ * smoothed stack can draw a part as less than nothing. There is no such edge
78
+ * here, which is what lets a line take the reading aid.
73
79
  */
74
80
  curve?: Curve;
75
81
  /**
@@ -27,13 +27,15 @@ import { type PropertyValues, type TemplateResult } from 'lit';
27
27
  * **A pane can be shut, and that is not the same as a divider at the edge.**
28
28
  * The geometry is identical and the knowledge is not: only a shut pane knows
29
29
  * where to open back to. So `collapsed` is a second state rather than a reading
30
- * of the position, and the position it opens to is the one collapsing never
31
- * overwrote. `collapsed-size` keeps a sliver showing where a pane has a tab
32
- * strip worth leaving, and collapse overrides `min` and `max`, which is what
33
- * those are for.
30
+ * of the position, and the position it opens to is where the gesture that shut
31
+ * it began, whichever gesture that was: a drag takes its reading on the press,
32
+ * and every other door takes it in `settle`, nothing having been applied there
33
+ * yet. `collapsed-size` keeps a sliver showing where a pane has a tab strip
34
+ * worth leaving, and collapse overrides `min` and `max`, which is what those
35
+ * are for.
34
36
  *
35
37
  * @since 0.1.0
36
- * @status experimental
38
+ * @status stable
37
39
  * @category layout
38
40
  * @aliases SplitPane, Resizable, SplitView
39
41
  * @documentation https://fusion.dev/helix/components/splitter
@@ -181,6 +183,14 @@ export declare class HelixHeadlessSplitter extends HelixElement {
181
183
  * the edge the number it started from is gone. Taken once, on the press, and
182
184
  * written back if the gesture ends shut, so the pane opens to where it was
183
185
  * rather than to the edge it was dragged against.
186
+ *
187
+ * **A pointer gesture only, because it is the only one that loses it**, and
188
+ * `settle` answers for the rest from `began`: a key and a double click apply
189
+ * nothing before they settle, so where the divider is at the top of that
190
+ * method is where it was. Read once and cleared there, exactly as `began` is,
191
+ * and for the second reason as well as the first. Left standing it measured
192
+ * the next gesture against the last one's press, so a collapse pressed from
193
+ * 20 reopened at the 60 a drag had started from an hour earlier.
184
194
  */
185
195
  private opened;
186
196
  /**
@@ -343,8 +353,8 @@ export declare class HelixHeadlessSplitter extends HelixElement {
343
353
  * writes the answer back through `position`, which is what makes it the single
344
354
  * decision point; returning on its refusal left `panel-collapsed-size` inert
345
355
  * there, the shipped `with-a-panel` example measuring a 0px panel against the
346
- * 36 its summary promises. So the collapse is reached either way and is
347
- * refused, or not, on its own.
356
+ * 36 it asks for. So the collapse is reached either way and is refused, or
357
+ * not, on its own.
348
358
  *
349
359
  * **Which is honest because the collapse carries its own position.** A shut
350
360
  * pane sits at `collapsed-size`, which is where `position` reads it from once
@@ -362,6 +372,18 @@ export declare class HelixHeadlessSplitter extends HelixElement {
362
372
  * round and is coherent: the divider goes where the drag put it and the pane
363
373
  * is not declared shut.
364
374
  *
375
+ * **The open position is taken here for every door but the pointer's, which
376
+ * is the same split `began` makes and for the same reason.** A drag has
377
+ * overwritten the position on the way to the edge, so it reads it on the
378
+ * press; a key, a double click and `moveTo` apply nothing until the request
379
+ * below, so where the divider is at the top of this method is where it was.
380
+ * Captured on the press alone, the class docstring's promise that a shut pane
381
+ * knows where to open back to held for a drag and for nothing else: measured
382
+ * 17 Sep 2026, `Home` on a splitter resting at 60 shut the start pane and
383
+ * reopened it at 0, the resize above having written the edge and the collapse
384
+ * having nothing to put back. Stale, it was worse than absent, `opened` never
385
+ * being cleared: a press at 60, then a key collapse from 20, reopened at 60.
386
+ *
365
387
  * **A gesture that moved nothing announces nothing, and this is the one place
366
388
  * that can say so.** A change carrying the position the divider already had
367
389
  * rewrites a consumer's stored value from a gesture that moved nothing:
@@ -302,6 +302,8 @@ let HelixHeadlessSplitter = HelixHeadlessSplitter_1 = class HelixHeadlessSplitte
302
302
  const shut = this.shutAt(wanted);
303
303
  const began = this.began ?? this.position;
304
304
  this.began = undefined;
305
+ const opened = this.opened ?? (this.collapsed ? undefined : began);
306
+ this.opened = undefined;
305
307
  if (wanted === began && shut === this.collapsed) {
306
308
  return;
307
309
  }
@@ -319,8 +321,8 @@ let HelixHeadlessSplitter = HelixHeadlessSplitter_1 = class HelixHeadlessSplitte
319
321
  requestChange({
320
322
  apply: (value) => {
321
323
  const previous = this.collapsed;
322
- if (value !== '' && this.opened !== undefined) {
323
- this.positionState = this.opened;
324
+ if (value !== '' && opened !== undefined) {
325
+ this.positionState = opened;
324
326
  }
325
327
  this.collapsedState = value === '' ? 'none' : value;
326
328
  this.requestUpdate('collapsed', previous);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fusion.dev/helix-headless",
3
3
  "description": "Headless component tier. Structure, accessibility, state, and form participation. No styling.",
4
- "version": "0.51.0",
4
+ "version": "0.52.1",
5
5
  "license": "MIT",
6
6
  "author": "Ross Sheppard <ross.sheppard@fusion.dev>",
7
7
  "repository": {
@@ -46,14 +46,14 @@
46
46
  },
47
47
  "bugs": "https://github.com/project-fusion/fusion/issues",
48
48
  "dependencies": {
49
- "@fusion.dev/helix-core": "0.51.0",
50
- "@fusion.dev/helix-icons": "0.51.0",
49
+ "@fusion.dev/helix-core": "0.52.1",
50
+ "@fusion.dev/helix-icons": "0.52.1",
51
51
  "uqr": "^0.1.3"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@custom-elements-manifest/analyzer": "^0.11.0",
55
- "@fusion.dev/helix-cem": "0.51.0",
56
- "@fusion.dev/helix-testing": "0.51.0",
55
+ "@fusion.dev/helix-cem": "0.52.1",
56
+ "@fusion.dev/helix-testing": "0.52.1",
57
57
  "@fusion.dev/scripts": "0.0.0-dev",
58
58
  "@happy-dom/global-registrator": "^20.0.0",
59
59
  "@lit-labs/ssr": "^4.1.0",
package/types/jsx.d.ts CHANGED
@@ -756,7 +756,14 @@ can draw a part as less than nothing, `step` is for a quantity that changes
756
756
  at a moment and is ordered the way `straight` is.
757
757
 
758
758
  Absent rather than defaulted because a reflecting property with a default
759
- writes its attribute onto every host, including the ones nobody configured. */
759
+ writes its attribute onto every host, including the ones nobody configured.
760
+ The resting value therefore lives in the render, as `curve ?? 'straight'`.
761
+
762
+ **`LineChart` and `Sparkline` rest at `smooth` and are not disagreeing.** A
763
+ line claims a position, so the bounded invention a monotone cubic makes is
764
+ a reading aid and costs nothing. A band claims an amount, and two sums
765
+ smoothed independently can cross, so the same aid here draws a part as less
766
+ than nothing. Same axis, different mark, different resting value. */
760
767
  curve?: (HelixHeadlessAreaChart["curve"]) | undefined;
761
768
  /** Which rules are drawn across the plot, if any.
762
769
 
@@ -799,7 +806,14 @@ can draw a part as less than nothing, `step` is for a quantity that changes
799
806
  at a moment and is ordered the way `straight` is.
800
807
 
801
808
  Absent rather than defaulted because a reflecting property with a default
802
- writes its attribute onto every host, including the ones nobody configured. */
809
+ writes its attribute onto every host, including the ones nobody configured.
810
+ The resting value therefore lives in the render, as `curve ?? 'straight'`.
811
+
812
+ **`LineChart` and `Sparkline` rest at `smooth` and are not disagreeing.** A
813
+ line claims a position, so the bounded invention a monotone cubic makes is
814
+ a reading aid and costs nothing. A band claims an amount, and two sums
815
+ smoothed independently can cross, so the same aid here draws a part as less
816
+ than nothing. Same axis, different mark, different resting value. */
803
817
  "prop:curve"?: (HelixHeadlessAreaChart["curve"]) | undefined;
804
818
  /** Which rules are drawn across the plot, if any.
805
819
 
@@ -8494,7 +8508,13 @@ renders, including the ones nobody configured.
8494
8508
  consumer wrote. The default therefore lives where the path is built, as
8495
8509
  `curve ?? 'smooth'`.
8496
8510
 
8497
- `step` claims the opposite of both, that a reading holds until the next. */
8511
+ `step` claims the opposite of both, that a reading holds until the next.
8512
+
8513
+ **`AreaChart` rests at `straight` and is not disagreeing.** A line claims a
8514
+ position and a stacked band claims an amount: a curve fitted through one
8515
+ sum can pass under the curve fitted through the sum beneath it, so a
8516
+ smoothed stack can draw a part as less than nothing. There is no such edge
8517
+ here, which is what lets a line take the reading aid. */
8498
8518
  curve?: (HelixHeadlessLineChart["curve"]) | undefined;
8499
8519
  /** Which rules are drawn across the plot, if any.
8500
8520
 
@@ -8599,7 +8619,13 @@ renders, including the ones nobody configured.
8599
8619
  consumer wrote. The default therefore lives where the path is built, as
8600
8620
  `curve ?? 'smooth'`.
8601
8621
 
8602
- `step` claims the opposite of both, that a reading holds until the next. */
8622
+ `step` claims the opposite of both, that a reading holds until the next.
8623
+
8624
+ **`AreaChart` rests at `straight` and is not disagreeing.** A line claims a
8625
+ position and a stacked band claims an amount: a curve fitted through one
8626
+ sum can pass under the curve fitted through the sum beneath it, so a
8627
+ smoothed stack can draw a part as less than nothing. There is no such edge
8628
+ here, which is what lets a line take the reading aid. */
8603
8629
  "prop:curve"?: (HelixHeadlessLineChart["curve"]) | undefined;
8604
8630
  /** Which rules are drawn across the plot, if any.
8605
8631
 
@@ -11780,11 +11806,13 @@ and a URL is a better name than "QR code" for a reader who cannot see it. */
11780
11806
  label?: (HelixHeadlessQrCode["label"]) | undefined;
11781
11807
  /** How the modules are drawn.
11782
11808
 
11783
- `square` is the default and the only one that joins runs of adjacent
11784
- modules into a single subpath, which is what keeps a thousand modules to a
11785
- handful of nodes. `rounded` and `dots` draw each module on its own, because
11786
- the corners are the thing being drawn and a joined run has none in the
11787
- middle. That cost is paid only by a code that asks for them.
11809
+ `square` is the resting state and is written by not writing it, per the
11810
+ rule that a reflected property takes no default. It is also the only one
11811
+ that joins runs of adjacent modules into a single subpath, which is what
11812
+ keeps a thousand modules to a handful of nodes. `rounded` and `dots` draw
11813
+ each module on its own, because the corners are the thing being drawn and a
11814
+ joined run has none in the middle. That cost is paid only by a code that
11815
+ asks for them.
11788
11816
 
11789
11817
  A scanner reads contrast between cells, not their shape, so all three
11790
11818
  scan. `dots` sits a little under half a module so neighbors do not touch,
@@ -11810,11 +11838,13 @@ and a URL is a better name than "QR code" for a reader who cannot see it. */
11810
11838
  "prop:label"?: (HelixHeadlessQrCode["label"]) | undefined;
11811
11839
  /** How the modules are drawn.
11812
11840
 
11813
- `square` is the default and the only one that joins runs of adjacent
11814
- modules into a single subpath, which is what keeps a thousand modules to a
11815
- handful of nodes. `rounded` and `dots` draw each module on its own, because
11816
- the corners are the thing being drawn and a joined run has none in the
11817
- middle. That cost is paid only by a code that asks for them.
11841
+ `square` is the resting state and is written by not writing it, per the
11842
+ rule that a reflected property takes no default. It is also the only one
11843
+ that joins runs of adjacent modules into a single subpath, which is what
11844
+ keeps a thousand modules to a handful of nodes. `rounded` and `dots` draw
11845
+ each module on its own, because the corners are the thing being drawn and a
11846
+ joined run has none in the middle. That cost is paid only by a code that
11847
+ asks for them.
11818
11848
 
11819
11849
  A scanner reads contrast between cells, not their shape, so all three
11820
11850
  scan. `dots` sits a little under half a module so neighbors do not touch,
@@ -13066,7 +13096,13 @@ assert against. So the resting state is still the attribute's absence, and
13066
13096
  `curve ?? 'smooth'` is what reads it.
13067
13097
 
13068
13098
  `step` claims the opposite of both, that a reading holds until the next.
13069
- Bars ignore it, having no between to interpolate. */
13099
+ Bars ignore it, having no between to interpolate.
13100
+
13101
+ **`AreaChart` rests at `straight` and is not disagreeing.** A line claims a
13102
+ position and a stacked band claims an amount: a curve fitted through one
13103
+ sum can pass under the curve fitted through the sum beneath it, so a
13104
+ smoothed stack can draw a part as less than nothing. There is no such edge
13105
+ here, which is what lets a line take the reading aid. */
13070
13106
  curve?: (HelixHeadlessSparkline["curve"]) | undefined;
13071
13107
  /** The id of a table to read instead, when there is one behind the line.
13072
13108
 
@@ -13141,7 +13177,13 @@ assert against. So the resting state is still the attribute's absence, and
13141
13177
  `curve ?? 'smooth'` is what reads it.
13142
13178
 
13143
13179
  `step` claims the opposite of both, that a reading holds until the next.
13144
- Bars ignore it, having no between to interpolate. */
13180
+ Bars ignore it, having no between to interpolate.
13181
+
13182
+ **`AreaChart` rests at `straight` and is not disagreeing.** A line claims a
13183
+ position and a stacked band claims an amount: a curve fitted through one
13184
+ sum can pass under the curve fitted through the sum beneath it, so a
13185
+ smoothed stack can draw a part as less than nothing. There is no such edge
13186
+ here, which is what lets a line take the reading aid. */
13145
13187
  "prop:curve"?: (HelixHeadlessSparkline["curve"]) | undefined;
13146
13188
  /** The id of a table to read instead, when there is one behind the line.
13147
13189
 
@@ -18202,6 +18244,13 @@ export type CustomElements = {
18202
18244
  *
18203
18245
  * Absent rather than defaulted because a reflecting property with a default
18204
18246
  * writes its attribute onto every host, including the ones nobody configured.
18247
+ * The resting value therefore lives in the render, as `curve ?? 'straight'`.
18248
+ *
18249
+ * **`LineChart` and `Sparkline` rest at `smooth` and are not disagreeing.** A
18250
+ * line claims a position, so the bounded invention a monotone cubic makes is
18251
+ * a reading aid and costs nothing. A band claims an amount, and two sums
18252
+ * smoothed independently can cross, so the same aid here draws a part as less
18253
+ * than nothing. Same axis, different mark, different resting value.
18205
18254
  * - `gridlines`: Which rules are drawn across the plot, if any.
18206
18255
  *
18207
18256
  * The same three values `LineChart` takes, with the same fallback: a bare
@@ -25934,6 +25983,12 @@ export type CustomElements = {
25934
25983
  * `curve ?? 'smooth'`.
25935
25984
  *
25936
25985
  * `step` claims the opposite of both, that a reading holds until the next.
25986
+ *
25987
+ * **`AreaChart` rests at `straight` and is not disagreeing.** A line claims a
25988
+ * position and a stacked band claims an amount: a curve fitted through one
25989
+ * sum can pass under the curve fitted through the sum beneath it, so a
25990
+ * smoothed stack can draw a part as less than nothing. There is no such edge
25991
+ * here, which is what lets a line take the reading aid.
25937
25992
  * - `gridlines`: Which rules are drawn across the plot, if any.
25938
25993
  *
25939
25994
  * Absent draws none, which is the honest default rather than a timid one: a
@@ -29288,11 +29343,13 @@ export type CustomElements = {
29288
29343
  * and a URL is a better name than "QR code" for a reader who cannot see it.
29289
29344
  * - `shape`: How the modules are drawn.
29290
29345
  *
29291
- * `square` is the default and the only one that joins runs of adjacent
29292
- * modules into a single subpath, which is what keeps a thousand modules to a
29293
- * handful of nodes. `rounded` and `dots` draw each module on its own, because
29294
- * the corners are the thing being drawn and a joined run has none in the
29295
- * middle. That cost is paid only by a code that asks for them.
29346
+ * `square` is the resting state and is written by not writing it, per the
29347
+ * rule that a reflected property takes no default. It is also the only one
29348
+ * that joins runs of adjacent modules into a single subpath, which is what
29349
+ * keeps a thousand modules to a handful of nodes. `rounded` and `dots` draw
29350
+ * each module on its own, because the corners are the thing being drawn and a
29351
+ * joined run has none in the middle. That cost is paid only by a code that
29352
+ * asks for them.
29296
29353
  *
29297
29354
  * A scanner reads contrast between cells, not their shape, so all three
29298
29355
  * scan. `dots` sits a little under half a module so neighbors do not touch,
@@ -30866,6 +30923,12 @@ export type CustomElements = {
30866
30923
  *
30867
30924
  * `step` claims the opposite of both, that a reading holds until the next.
30868
30925
  * Bars ignore it, having no between to interpolate.
30926
+ *
30927
+ * **`AreaChart` rests at `straight` and is not disagreeing.** A line claims a
30928
+ * position and a stacked band claims an amount: a curve fitted through one
30929
+ * sum can pass under the curve fitted through the sum beneath it, so a
30930
+ * smoothed stack can draw a part as less than nothing. There is no such edge
30931
+ * here, which is what lets a line take the reading aid.
30869
30932
  * - `for`: The id of a table to read instead, when there is one behind the line.
30870
30933
  *
30871
30934
  * The first column of numbers is the series drawn. This wins over `values`,
@@ -31187,10 +31250,12 @@ export type CustomElements = {
31187
31250
  * **A pane can be shut, and that is not the same as a divider at the edge.**
31188
31251
  * The geometry is identical and the knowledge is not: only a shut pane knows
31189
31252
  * where to open back to. So `collapsed` is a second state rather than a reading
31190
- * of the position, and the position it opens to is the one collapsing never
31191
- * overwrote. `collapsed-size` keeps a sliver showing where a pane has a tab
31192
- * strip worth leaving, and collapse overrides `min` and `max`, which is what
31193
- * those are for.
31253
+ * of the position, and the position it opens to is where the gesture that shut
31254
+ * it began, whichever gesture that was: a drag takes its reading on the press,
31255
+ * and every other door takes it in `settle`, nothing having been applied there
31256
+ * yet. `collapsed-size` keeps a sliver showing where a pane has a tab strip
31257
+ * worth leaving, and collapse overrides `min` and `max`, which is what those
31258
+ * are for.
31194
31259
  *
31195
31260
  * ## Attributes & Properties
31196
31261
  *
@@ -36091,6 +36156,13 @@ export type CustomElementsSolidJs = {
36091
36156
  *
36092
36157
  * Absent rather than defaulted because a reflecting property with a default
36093
36158
  * writes its attribute onto every host, including the ones nobody configured.
36159
+ * The resting value therefore lives in the render, as `curve ?? 'straight'`.
36160
+ *
36161
+ * **`LineChart` and `Sparkline` rest at `smooth` and are not disagreeing.** A
36162
+ * line claims a position, so the bounded invention a monotone cubic makes is
36163
+ * a reading aid and costs nothing. A band claims an amount, and two sums
36164
+ * smoothed independently can cross, so the same aid here draws a part as less
36165
+ * than nothing. Same axis, different mark, different resting value.
36094
36166
  * - `gridlines`: Which rules are drawn across the plot, if any.
36095
36167
  *
36096
36168
  * The same three values `LineChart` takes, with the same fallback: a bare
@@ -43930,6 +44002,12 @@ export type CustomElementsSolidJs = {
43930
44002
  * `curve ?? 'smooth'`.
43931
44003
  *
43932
44004
  * `step` claims the opposite of both, that a reading holds until the next.
44005
+ *
44006
+ * **`AreaChart` rests at `straight` and is not disagreeing.** A line claims a
44007
+ * position and a stacked band claims an amount: a curve fitted through one
44008
+ * sum can pass under the curve fitted through the sum beneath it, so a
44009
+ * smoothed stack can draw a part as less than nothing. There is no such edge
44010
+ * here, which is what lets a line take the reading aid.
43933
44011
  * - `gridlines`: Which rules are drawn across the plot, if any.
43934
44012
  *
43935
44013
  * Absent draws none, which is the honest default rather than a timid one: a
@@ -47336,11 +47414,13 @@ export type CustomElementsSolidJs = {
47336
47414
  * and a URL is a better name than "QR code" for a reader who cannot see it.
47337
47415
  * - `shape`: How the modules are drawn.
47338
47416
  *
47339
- * `square` is the default and the only one that joins runs of adjacent
47340
- * modules into a single subpath, which is what keeps a thousand modules to a
47341
- * handful of nodes. `rounded` and `dots` draw each module on its own, because
47342
- * the corners are the thing being drawn and a joined run has none in the
47343
- * middle. That cost is paid only by a code that asks for them.
47417
+ * `square` is the resting state and is written by not writing it, per the
47418
+ * rule that a reflected property takes no default. It is also the only one
47419
+ * that joins runs of adjacent modules into a single subpath, which is what
47420
+ * keeps a thousand modules to a handful of nodes. `rounded` and `dots` draw
47421
+ * each module on its own, because the corners are the thing being drawn and a
47422
+ * joined run has none in the middle. That cost is paid only by a code that
47423
+ * asks for them.
47344
47424
  *
47345
47425
  * A scanner reads contrast between cells, not their shape, so all three
47346
47426
  * scan. `dots` sits a little under half a module so neighbors do not touch,
@@ -48941,6 +49021,12 @@ export type CustomElementsSolidJs = {
48941
49021
  *
48942
49022
  * `step` claims the opposite of both, that a reading holds until the next.
48943
49023
  * Bars ignore it, having no between to interpolate.
49024
+ *
49025
+ * **`AreaChart` rests at `straight` and is not disagreeing.** A line claims a
49026
+ * position and a stacked band claims an amount: a curve fitted through one
49027
+ * sum can pass under the curve fitted through the sum beneath it, so a
49028
+ * smoothed stack can draw a part as less than nothing. There is no such edge
49029
+ * here, which is what lets a line take the reading aid.
48944
49030
  * - `for`: The id of a table to read instead, when there is one behind the line.
48945
49031
  *
48946
49032
  * The first column of numbers is the series drawn. This wins over `values`,
@@ -49269,10 +49355,12 @@ export type CustomElementsSolidJs = {
49269
49355
  * **A pane can be shut, and that is not the same as a divider at the edge.**
49270
49356
  * The geometry is identical and the knowledge is not: only a shut pane knows
49271
49357
  * where to open back to. So `collapsed` is a second state rather than a reading
49272
- * of the position, and the position it opens to is the one collapsing never
49273
- * overwrote. `collapsed-size` keeps a sliver showing where a pane has a tab
49274
- * strip worth leaving, and collapse overrides `min` and `max`, which is what
49275
- * those are for.
49358
+ * of the position, and the position it opens to is where the gesture that shut
49359
+ * it began, whichever gesture that was: a drag takes its reading on the press,
49360
+ * and every other door takes it in `settle`, nothing having been applied there
49361
+ * yet. `collapsed-size` keeps a sliver showing where a pane has a tab strip
49362
+ * worth leaving, and collapse overrides `min` and `max`, which is what those
49363
+ * are for.
49276
49364
  *
49277
49365
  * ## Attributes & Properties
49278
49366
  *
package/types/vue.d.ts CHANGED
@@ -408,7 +408,14 @@ can draw a part as less than nothing, `step` is for a quantity that changes
408
408
  at a moment and is ordered the way `straight` is.
409
409
 
410
410
  Absent rather than defaulted because a reflecting property with a default
411
- writes its attribute onto every host, including the ones nobody configured. */
411
+ writes its attribute onto every host, including the ones nobody configured.
412
+ The resting value therefore lives in the render, as `curve ?? 'straight'`.
413
+
414
+ **`LineChart` and `Sparkline` rest at `smooth` and are not disagreeing.** A
415
+ line claims a position, so the bounded invention a monotone cubic makes is
416
+ a reading aid and costs nothing. A band claims an amount, and two sums
417
+ smoothed independently can cross, so the same aid here draws a part as less
418
+ than nothing. Same axis, different mark, different resting value. */
412
419
  curve?: (HelixHeadlessAreaChart["curve"]) | undefined;
413
420
  /** Which rules are drawn across the plot, if any.
414
421
 
@@ -4360,7 +4367,13 @@ renders, including the ones nobody configured.
4360
4367
  consumer wrote. The default therefore lives where the path is built, as
4361
4368
  `curve ?? 'smooth'`.
4362
4369
 
4363
- `step` claims the opposite of both, that a reading holds until the next. */
4370
+ `step` claims the opposite of both, that a reading holds until the next.
4371
+
4372
+ **`AreaChart` rests at `straight` and is not disagreeing.** A line claims a
4373
+ position and a stacked band claims an amount: a curve fitted through one
4374
+ sum can pass under the curve fitted through the sum beneath it, so a
4375
+ smoothed stack can draw a part as less than nothing. There is no such edge
4376
+ here, which is what lets a line take the reading aid. */
4364
4377
  curve?: (HelixHeadlessLineChart["curve"]) | undefined;
4365
4378
  /** Which rules are drawn across the plot, if any.
4366
4379
 
@@ -6038,11 +6051,13 @@ and a URL is a better name than "QR code" for a reader who cannot see it. */
6038
6051
  label?: (HelixHeadlessQrCode["label"]) | undefined;
6039
6052
  /** How the modules are drawn.
6040
6053
 
6041
- `square` is the default and the only one that joins runs of adjacent
6042
- modules into a single subpath, which is what keeps a thousand modules to a
6043
- handful of nodes. `rounded` and `dots` draw each module on its own, because
6044
- the corners are the thing being drawn and a joined run has none in the
6045
- middle. That cost is paid only by a code that asks for them.
6054
+ `square` is the resting state and is written by not writing it, per the
6055
+ rule that a reflected property takes no default. It is also the only one
6056
+ that joins runs of adjacent modules into a single subpath, which is what
6057
+ keeps a thousand modules to a handful of nodes. `rounded` and `dots` draw
6058
+ each module on its own, because the corners are the thing being drawn and a
6059
+ joined run has none in the middle. That cost is paid only by a code that
6060
+ asks for them.
6046
6061
 
6047
6062
  A scanner reads contrast between cells, not their shape, so all three
6048
6063
  scan. `dots` sits a little under half a module so neighbors do not touch,
@@ -6693,7 +6708,13 @@ assert against. So the resting state is still the attribute's absence, and
6693
6708
  `curve ?? 'smooth'` is what reads it.
6694
6709
 
6695
6710
  `step` claims the opposite of both, that a reading holds until the next.
6696
- Bars ignore it, having no between to interpolate. */
6711
+ Bars ignore it, having no between to interpolate.
6712
+
6713
+ **`AreaChart` rests at `straight` and is not disagreeing.** A line claims a
6714
+ position and a stacked band claims an amount: a curve fitted through one
6715
+ sum can pass under the curve fitted through the sum beneath it, so a
6716
+ smoothed stack can draw a part as less than nothing. There is no such edge
6717
+ here, which is what lets a line take the reading aid. */
6697
6718
  curve?: (HelixHeadlessSparkline["curve"]) | undefined;
6698
6719
  /** The id of a table to read instead, when there is one behind the line.
6699
6720
 
@@ -9793,7 +9814,7 @@ export interface WcToolkitVueGlobalComponents {
9793
9814
  HelixHeadlessSpeedDialVueProps,
9794
9815
  HelixHeadlessSpeedDialVueEvents
9795
9816
  >;
9796
- /** **One axis, and nesting is how you get two.** A splitter inside a splitter gives back the cross, and gives the three-pane and four-pane arrangements a single divider never had. **Where two of them cross there is a corner, and it moves both.** A splitter slotted into a pane of another, at right angles to it, grows a handle at the crossing: 'move' under the pointer, both arrow axes on the keyboard, and a drag that carries the two positions at once. It appears at 'firstUpdated' rather than in the served markup, being an affordance rather than content, and a splitter with no corner yet is a splitter with two working dividers. **The divider is a real 'role="separator"' with 'aria-valuenow'**, moved by the arrow keys as well as by pointer, with 'Home' and 'End' taking it to its bounds. A drag in progress is a state rather than ':hover', so both dividers a corner moves are lit for as long as it moves them. **It goes where it is put, all the way to either end.** 'min' and 'max' are nothing and everything unless a consumer says otherwise, because a divider that stops short of the edge gives a reader no way to put a pane away. **A pane can be shut, and that is not the same as a divider at the edge.** The geometry is identical and the knowledge is not: only a shut pane knows where to open back to. So 'collapsed' is a second state rather than a reading of the position, and the position it opens to is the one collapsing never overwrote. 'collapsed-size' keeps a sliver showing where a pane has a tab strip worth leaving, and collapse overrides 'min' and 'max', which is what those are for. */
9817
+ /** **One axis, and nesting is how you get two.** A splitter inside a splitter gives back the cross, and gives the three-pane and four-pane arrangements a single divider never had. **Where two of them cross there is a corner, and it moves both.** A splitter slotted into a pane of another, at right angles to it, grows a handle at the crossing: 'move' under the pointer, both arrow axes on the keyboard, and a drag that carries the two positions at once. It appears at 'firstUpdated' rather than in the served markup, being an affordance rather than content, and a splitter with no corner yet is a splitter with two working dividers. **The divider is a real 'role="separator"' with 'aria-valuenow'**, moved by the arrow keys as well as by pointer, with 'Home' and 'End' taking it to its bounds. A drag in progress is a state rather than ':hover', so both dividers a corner moves are lit for as long as it moves them. **It goes where it is put, all the way to either end.** 'min' and 'max' are nothing and everything unless a consumer says otherwise, because a divider that stops short of the edge gives a reader no way to put a pane away. **A pane can be shut, and that is not the same as a divider at the edge.** The geometry is identical and the knowledge is not: only a shut pane knows where to open back to. So 'collapsed' is a second state rather than a reading of the position, and the position it opens to is where the gesture that shut it began, whichever gesture that was: a drag takes its reading on the press, and every other door takes it in 'settle', nothing having been applied there yet. 'collapsed-size' keeps a sliver showing where a pane has a tab strip worth leaving, and collapse overrides 'min' and 'max', which is what those are for. */
9797
9818
  "helix-headless-splitter": DefineCustomElement<
9798
9819
  HelixHeadlessSplitter,
9799
9820
  HelixHeadlessSplitterVueProps,