@fusion.dev/helix 0.50.0 → 0.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13281,7 +13281,7 @@
13281
13281
  }
13282
13282
  },
13283
13283
  {
13284
- "description": "How many slides go across, written onto the track by the component so a sheet divides the track by the same number the positions are counted from. Read it rather than selecting on `per-view`, which cannot be enumerated without a ceiling. See `perView`.",
13284
+ "description": "How many slides go across, written onto the track by the component so a sheet divides the track by the same number the positions are counted from. Read it rather than selecting on `per-view`, which cannot be enumerated without a ceiling. Under `per-view=\"auto\"` the component writes nothing and the sheet declares it instead, so the same name answers in both modes. See `perView`.",
13285
13285
  "name": "--carousel-per-view",
13286
13286
  "inheritedFrom": {
13287
13287
  "name": "HelixHeadlessCarousel",
@@ -13295,6 +13295,14 @@
13295
13295
  "name": "HelixHeadlessCarousel",
13296
13296
  "module": "src/carousel/root/carousel-root.ts"
13297
13297
  }
13298
+ },
13299
+ {
13300
+ "description": "The narrowest a slide may be laid out, which is what `per-view=\"auto\"` fits the track with. A length, since the sheet divides by it. Unset is the whole track, which is one across.",
13301
+ "name": "--carousel-slide-min",
13302
+ "inheritedFrom": {
13303
+ "name": "HelixHeadlessCarousel",
13304
+ "module": "src/carousel/root/carousel-root.ts"
13305
+ }
13298
13306
  }
13299
13307
  ],
13300
13308
  "members": [
@@ -13521,9 +13529,9 @@
13521
13529
  "kind": "field",
13522
13530
  "name": "perView",
13523
13531
  "type": {
13524
- "text": "number | undefined"
13532
+ "text": "number | 'auto' | undefined"
13525
13533
  },
13526
- "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\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 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.",
13527
13535
  "attribute": "per-view",
13528
13536
  "reflects": true,
13529
13537
  "inheritedFrom": {
@@ -13533,12 +13541,40 @@
13533
13541
  },
13534
13542
  {
13535
13543
  "kind": "field",
13536
- "name": "across",
13544
+ "name": "clamped",
13537
13545
  "type": {
13538
13546
  "text": "number"
13539
13547
  },
13540
13548
  "privacy": "private",
13541
- "description": "`perView` as both tiers use it: a whole number of slides, one at least.\n\n**The clamp is here because the arithmetic is here**, and the two readers\nof this number have to be given the same one. A fraction is floored, since\na position is a whole slide along: one and a half across leaves a last\nposition the track runs out before reaching, which is the fault `goTo`\nalready carries a comment about. Zero and a negative divide the track into\nnothing and into a pane facing the wrong way, and a non-numeric attribute\nparses to `NaN`, which `Math.max` propagates: it counted `NaN` positions,\ndrew no indicators at all and left `index` at `NaN`. All of them read as\none across, which is what a carousel with nothing sayable asked for.\n\nNot clamped to the number of slides. Six across four slides is four panes\nat a sixth of the track each and the one place to stand, which is what was\nasked for as nearly as it can be had, and the slide count is a fact the\nserver does not have: clamping to it would draw one width there and another\non upgrade.",
13549
+ "description": "A declared `perView` as both tiers use it: a whole number, one at least.\n\n**The clamp is here because the arithmetic is here**, and the two readers\nof this number have to be given the same one. A fraction is floored, since\na position is a whole slide along: one and a half across leaves a last\nposition the track runs out before reaching, which is the fault `goTo`\nalready carries a comment about. Zero and a negative divide the track into\nnothing and into a pane facing the wrong way, and a non-numeric attribute\nparses to `NaN`, which `Math.max` propagates: it counted `NaN` positions,\ndrew no indicators at all and left `index` at `NaN`. All of them read as\none across, which is what a carousel with nothing sayable asked for.\n\n**A vertical `auto` is one of them.** Fitting divides the room the page\ngave the track, and a vertical track's room is a height the consumer chose\nwith `--carousel-block-size`: there is nothing there to fit against that\nthey did not already decide, so the count is theirs to state. It also\ncannot be had cheaply, the block axis wanting `container-type: size`, which\nlays a track out as empty wherever its height is not definite.\n\nNot clamped to the number of slides. Six across four slides is four panes\nat a sixth of the track each and the one place to stand, which is what was\nasked for as nearly as it can be had, and the slide count is a fact the\nserver does not have: clamping to it would draw one width there and another\non upgrade.",
13550
+ "readonly": true,
13551
+ "inheritedFrom": {
13552
+ "name": "HelixHeadlessCarousel",
13553
+ "module": "src/carousel/root/carousel-root.ts"
13554
+ }
13555
+ },
13556
+ {
13557
+ "kind": "field",
13558
+ "name": "fits",
13559
+ "type": {
13560
+ "text": "boolean"
13561
+ },
13562
+ "privacy": "private",
13563
+ "description": "Whether the track is fitting slides to its own box rather than to a count.",
13564
+ "readonly": true,
13565
+ "inheritedFrom": {
13566
+ "name": "HelixHeadlessCarousel",
13567
+ "module": "src/carousel/root/carousel-root.ts"
13568
+ }
13569
+ },
13570
+ {
13571
+ "kind": "field",
13572
+ "name": "across",
13573
+ "type": {
13574
+ "text": "number | undefined"
13575
+ },
13576
+ "privacy": "private",
13577
+ "description": "How many slides go across, and `undefined` while a fitted track is unlaid.\n\n**Undefined is the honest answer and the indicators read it as one**, which\nis the whole of how a fitted carousel keeps from drawing a run of dots at\none length and correcting it at another. The count a fitted track goes\nacross is whatever its box resolved to, so nothing knows it until there is\na box: not the server, which has no layout, and not the render that draws\nthe panes, layout being what follows a render rather than what precedes it.\nThe dots wait for it, which costs them nothing, because a server serves no\nindicators for any carousel, `slides` being empty there.\n\nMeasured 16 Sep 2026 in Chromium 151.0.7922.34 and WebKit 26.5, recording\nevery run of dots a carousel has from the upgrade on: a fitted one goes\nnone, then five, and never another number; a declared one goes straight to\nsix. What a reader can see is the run missing, never the run wrong.",
13542
13578
  "readonly": true,
13543
13579
  "inheritedFrom": {
13544
13580
  "name": "HelixHeadlessCarousel",
@@ -13551,13 +13587,108 @@
13551
13587
  "type": {
13552
13588
  "text": "number"
13553
13589
  },
13554
- "description": "How many distinct views the track holds, which is what the indicators count.\n\nA window of `perView` slides sliding one at a time over `n` of them stops\n`n - perView + 1` times, so six slides four across is three: 0 to 3, 1 to 4,\n2 to 5. One at minimum, since a carousel showing everything it has still\nhas the one place to be.",
13590
+ "description": "How many distinct views the track holds, which is what the indicators count.\n\nA window of `perView` slides sliding one at a time over `n` of them stops\n`n - perView + 1` times, so six slides four across is three: 0 to 3, 1 to 4,\n2 to 5. One at minimum, since a carousel showing everything it has still\nhas the one place to be.\n\nOne across until a fitted track has been laid out, which is the same answer\na carousel that has never been told anything gives, and the dots are\nwithheld rather than counted from it. See `across`.",
13555
13591
  "readonly": true,
13556
13592
  "inheritedFrom": {
13557
13593
  "name": "HelixHeadlessCarousel",
13558
13594
  "module": "src/carousel/root/carousel-root.ts"
13559
13595
  }
13560
13596
  },
13597
+ {
13598
+ "kind": "method",
13599
+ "name": "measure",
13600
+ "privacy": "private",
13601
+ "return": {
13602
+ "type": {
13603
+ "text": "number | undefined"
13604
+ }
13605
+ },
13606
+ "description": "How many slides the box turned out to hold, from the pane it laid out.\n\n**The measurement asks what happened rather than what was asked for**, and\nthat is why it is the pane's width and not the count in the declaration.\nThe sheet divides the track by `--carousel-per-view`, which under `auto` is\narithmetic rather than a number, and a consumer's own sheet may divide it\nsome other way entirely or grow the panes to fill a track holding\neverything it has. Reading the box back gets the same answer as the\ndeclaration wherever the two agree and the true one wherever they do not,\nso a width and a count cannot disagree in either direction.\n\nThe sheet's own arithmetic run backward, on the lengths that were actually\nused: a gap added to the room, divided by a pane and a gap. Rounded,\nbecause the pane a sheet lays out is a sixty-fourth off its exact share by\ndesign and the quotient lands a ten-thousandth off a whole number.\n\nUndefined where there is nothing to measure, which is a harness rather than\na browser: happy-dom lays nothing out and reports zero for every box, and a\ncount taken from zeros would be a number with no layout behind it.",
13607
+ "inheritedFrom": {
13608
+ "name": "HelixHeadlessCarousel",
13609
+ "module": "src/carousel/root/carousel-root.ts"
13610
+ }
13611
+ },
13612
+ {
13613
+ "kind": "field",
13614
+ "name": "readFit",
13615
+ "privacy": "private",
13616
+ "readonly": true,
13617
+ "description": "Takes the reading, and puts the index back inside what it leaves.\n\n**A fitted carousel's last position moves with the window**, which a\ndeclared one's never does: eight slides at one across has eight places to\nstand and four across has five, so a track widened while the reader sits on\nthe last of them is a track resting somewhere it can no longer be. Through\n`goTo`, so the correction goes out as the same cancelable announcement\nevery other index change does and a consumer holding `index` hears it\nrather than being overwritten.\n\nOnly on a change, so the observer's own re-render cannot feed itself.",
13618
+ "inheritedFrom": {
13619
+ "name": "HelixHeadlessCarousel",
13620
+ "module": "src/carousel/root/carousel-root.ts"
13621
+ }
13622
+ },
13623
+ {
13624
+ "kind": "method",
13625
+ "name": "handed",
13626
+ "privacy": "private",
13627
+ "return": {
13628
+ "type": {
13629
+ "text": "string | typeof nothing"
13630
+ }
13631
+ },
13632
+ "description": "The count handed to the styles, and nothing at all where they work it out.\n\nA declared count is this file's: it decides how many places the track can\nstop, so the number the panes are divided by has to be the number the\npositions were counted from, and writing it on the track inside the\ncomponent's own shadow root is what keeps a sheet from having to enumerate\nthe values it will answer for.\n\nA fitted one is the sheet's, and handing it anything would take it back: an\ninline declaration outranks every rule short of `!important`, so a track\ntold `1` here could never be told three by the rule that fits it. The\nabsence is not a gap either, because the rule that computes the count\ndeclares it on this same element, which beats anything a consumer inherits\nin exactly as the inline one did.",
13633
+ "inheritedFrom": {
13634
+ "name": "HelixHeadlessCarousel",
13635
+ "module": "src/carousel/root/carousel-root.ts"
13636
+ }
13637
+ },
13638
+ {
13639
+ "kind": "field",
13640
+ "name": "fitted",
13641
+ "type": {
13642
+ "text": "number | undefined"
13643
+ },
13644
+ "privacy": "private",
13645
+ "description": "What the box resolved to, and `undefined` until it has been laid out.",
13646
+ "inheritedFrom": {
13647
+ "name": "HelixHeadlessCarousel",
13648
+ "module": "src/carousel/root/carousel-root.ts"
13649
+ }
13650
+ },
13651
+ {
13652
+ "kind": "field",
13653
+ "name": "sizes",
13654
+ "type": {
13655
+ "text": "ResizeObserver | undefined"
13656
+ },
13657
+ "privacy": "private",
13658
+ "description": "Watches the pane a fitted track laid out, while `auto` is what was asked.",
13659
+ "inheritedFrom": {
13660
+ "name": "HelixHeadlessCarousel",
13661
+ "module": "src/carousel/root/carousel-root.ts"
13662
+ }
13663
+ },
13664
+ {
13665
+ "kind": "field",
13666
+ "name": "watched",
13667
+ "type": {
13668
+ "text": "HTMLElement | undefined"
13669
+ },
13670
+ "privacy": "private",
13671
+ "description": "The pane being watched, so a re-rendered run moves the watch with it.",
13672
+ "inheritedFrom": {
13673
+ "name": "HelixHeadlessCarousel",
13674
+ "module": "src/carousel/root/carousel-root.ts"
13675
+ }
13676
+ },
13677
+ {
13678
+ "kind": "method",
13679
+ "name": "watchPane",
13680
+ "privacy": "private",
13681
+ "return": {
13682
+ "type": {
13683
+ "text": "void"
13684
+ }
13685
+ },
13686
+ "description": "Starts or stops watching, according to what the count was asked to be.\n\n**The pane and not the track, because both questions move it.** A narrower\ntrack divides into a narrower pane, and so does a slide arriving or leaving\nwhere the panes grow to fill a track holding everything it has. A watch on\nthe track answers the first and sleeps through the second.\n\n**An observation is delivered after layout and inside the same rendering\nstep**, and the update it asks for is a microtask on the end of it, so the\ndots are added to a frame that has not been painted. Taking the reading\nfrom `updated` instead would be the same arithmetic one Lit warning\nearlier, and the warning is about the right thing: a render that has to\nread layout is a render that has to run twice.\n\nCalled from `connectedCallback`, `firstUpdated` and `updated`, so a\nconsumer switching to `auto` after mount is watched, one switching away\nstops being, and a carousel moved in the DOM is watched again. Observing is\nwhat asks for the first reading, so the watch is rebuilt rather than kept\nacross a mode change.",
13687
+ "inheritedFrom": {
13688
+ "name": "HelixHeadlessCarousel",
13689
+ "module": "src/carousel/root/carousel-root.ts"
13690
+ }
13691
+ },
13561
13692
  {
13562
13693
  "kind": "field",
13563
13694
  "name": "panes",
@@ -14356,9 +14487,9 @@
14356
14487
  {
14357
14488
  "name": "per-view",
14358
14489
  "type": {
14359
- "text": "number | undefined"
14490
+ "text": "number | 'auto' | undefined"
14360
14491
  },
14361
- "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\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 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.",
14362
14493
  "fieldName": "perView",
14363
14494
  "inheritedFrom": {
14364
14495
  "name": "HelixHeadlessCarousel",
@@ -14389,6 +14520,10 @@
14389
14520
  "description": "Slides with controls and indicators, one at a time.",
14390
14521
  "slug": "preview"
14391
14522
  },
14523
+ {
14524
+ "description": "As many slides as the track holds, from a minimum width and no count.",
14525
+ "slug": "auto"
14526
+ },
14392
14527
  {
14393
14528
  "description": "A carousel the page owns, so the slide it shows can be driven from elsewhere.",
14394
14529
  "slug": "controlled"
@@ -93482,7 +93617,7 @@
93482
93617
  "text": "number"
93483
93618
  },
93484
93619
  "default": "0",
93485
- "description": "What the panel's height becomes when it is closed.\n\nZero closes it outright. A panel whose contents include the control that\nreopens it, a row of tabs being the usual one, wants that row left showing,\nand only whoever slotted it knows how tall that is.",
93620
+ "description": "What the panel's height becomes when it is closed.\n\nZero closes it outright. A panel whose contents include the control that\nreopens it, a row of tabs being the usual one, wants that row left showing,\nand only whoever slotted it knows how tall that is.\n\n**A floor rather than a second state**, which is what keeps `panel-size` the\nwhole truth about the panel: a divider driven to the end lands here and\n`panel-size` reads this number, so \"closed\" is something a consumer already\nstores rather than a property they have to learn. The splitter inside has a\n`collapsed` of its own and it is refused, for the reason `handleCollapse`\ngives.",
93486
93621
  "attribute": "panel-collapsed-size"
93487
93622
  },
93488
93623
  {
@@ -93592,6 +93727,16 @@
93592
93727
  "description": "`panel-collapsed-size` in the units the splitter works in.",
93593
93728
  "readonly": true
93594
93729
  },
93730
+ {
93731
+ "kind": "field",
93732
+ "name": "panelFloor",
93733
+ "type": {
93734
+ "text": "number"
93735
+ },
93736
+ "privacy": "private",
93737
+ "description": "The least the panel goes to, in the pixels this element holds it in.\n\nThe same number as `panelSliver` and not the same arithmetic, which is the\npoint of having both: bounding the splitter at `100 - panelSliver` instead\nwould ask a percentage to come back through a string and compare equal to\nthe one the splitter derives, and the collapse it is meant to land on is an\n`>=` on those two floats. Held here, in whole pixels a consumer stated, it\nis exact.",
93738
+ "readonly": true
93739
+ },
93595
93740
  {
93596
93741
  "kind": "method",
93597
93742
  "name": "fromSource",
@@ -93739,6 +93884,13 @@
93739
93884
  "privacy": "private",
93740
93885
  "readonly": true
93741
93886
  },
93887
+ {
93888
+ "kind": "field",
93889
+ "name": "handleCollapse",
93890
+ "privacy": "private",
93891
+ "readonly": true,
93892
+ "description": "Refuses a pane of either splitter declaring itself shut.\n\n**The collapse is a second state, and this element has nowhere to put\none.** A splitter's `collapsed` overrides its `position` and remembers what\nit was open at, and it answers to neither `split` nor `panel-size`. Allowed\nin here, it would leave the arrangement in a state nothing outside this\nelement can see or set: assigning `panel-size` back moves nothing while\n`collapsed` stands, and a consumer who stored the two numbers this element\npublishes and restored a sandbox from them would get it open. That is one\nelement holding the arrangement and the other showing it, which is the state\nthe two requests above were rewritten to end.\n\n**So \"shut\" is spelled in pixels here.** `panel-collapsed-size` is the floor\n`handlePanelChange` holds the panel to, `panel-size` reads it when the\ndivider is at the end, and `helix-before-panel-resize` is where a consumer\nhears about it, in the units they already store. That is the same trade the\nother two make: the sandbox is the single decision point because it refuses\nwhat the splitter asks and re-announces the move in its own vocabulary.\n\n**Stopped as well as refused**, because `start` and `end` name the panes of\na splitter a consumer of this element is not supposed to know about, and the\ntwo events above already say which divider moved. A collapse from something\nslotted into a pane is somebody else's and passes through untouched, which\nis what `target` against `currentTarget` is asking.\n\nReached at all only since Splitter stopped returning on a refused\n`helix-before-resize`. While it did, every collapse in here was unreachable\nand `panel-collapsed-size` was inert with it."
93893
+ },
93742
93894
  {
93743
93895
  "kind": "method",
93744
93896
  "name": "answer",
@@ -94120,7 +94272,7 @@
94120
94272
  "type": {
94121
94273
  "text": "HelixBeforePanelResizeEvent"
94122
94274
  },
94123
- "description": "Fired before the panel's divider is let go, with its height in pixels. Cancelable: refusing it takes the decision and nothing moves.",
94275
+ "description": "Fired before the panel's divider is let go, with its height in pixels, and a panel driven shut arrives as `panel-collapsed-size`, which is the least it goes to. Cancelable: refusing it takes the decision and nothing moves.",
94124
94276
  "name": "helix-before-panel-resize",
94125
94277
  "reactProp": "onhelix-before-panel-resize"
94126
94278
  },
@@ -94202,7 +94354,7 @@
94202
94354
  "text": "number"
94203
94355
  },
94204
94356
  "default": "0",
94205
- "description": "What the panel's height becomes when it is closed.\n\nZero closes it outright. A panel whose contents include the control that\nreopens it, a row of tabs being the usual one, wants that row left showing,\nand only whoever slotted it knows how tall that is.",
94357
+ "description": "What the panel's height becomes when it is closed.\n\nZero closes it outright. A panel whose contents include the control that\nreopens it, a row of tabs being the usual one, wants that row left showing,\nand only whoever slotted it knows how tall that is.\n\n**A floor rather than a second state**, which is what keeps `panel-size` the\nwhole truth about the panel: a divider driven to the end lands here and\n`panel-size` reads this number, so \"closed\" is something a consumer already\nstores rather than a property they have to learn. The splitter inside has a\n`collapsed` of its own and it is refused, for the reason `handleCollapse`\ngives.",
94206
94358
  "fieldName": "panelCollapsedSize"
94207
94359
  },
94208
94360
  {
@@ -106076,7 +106228,7 @@
106076
106228
  }
106077
106229
  }
106078
106230
  ],
106079
- "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**The second announcement is conditional on the first, because it is derived\nfrom it.** `shutAt` reads the position the gesture ended on, so a refused\n`helix-before-resize` leaves a collapse computed from a number that was\nrefused. Announced anyway, the refusal produced the outcome it was refusing:\nmeasured on a divider at 40 with a listener calling `preventDefault`, Home\nleft `position` reporting 0 and `collapsed` reporting `start`, because the\ncollapse applied and `position` reads the sliver once a pane is shut. The\nreturn of the first request is what says so, and it was being dropped: a\ncancelable event dispatched as a bare statement with nothing reading the\nanswer, which is the shape the navigation cohort named on `Outline` and left.\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. What a consumer cannot have is a pane that collapses\nout from under a position they said no to.\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.",
106231
+ "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.",
106080
106232
  "inheritedFrom": {
106081
106233
  "name": "HelixHeadlessSplitter",
106082
106234
  "module": "src/splitter/root/splitter-root.ts"
@@ -106879,7 +107031,7 @@
106879
107031
  "type": {
106880
107032
  "text": "HelixBeforeCollapseEvent"
106881
107033
  },
106882
- "description": "Fired before a pane shuts or reopens, and only where the position it is derived from stood. Cancelable: refusing it leaves the pane as it was and the divider where the gesture put it.",
107034
+ "description": "Fired before a pane shuts or reopens, whether or not the resize that reached it was allowed, and carrying its own position: a shut pane sits at `collapsed-size` rather than at the number the resize named. Cancelable: refusing it leaves the pane as it was and the divider where the gesture put it.",
106883
107035
  "name": "helix-before-collapse",
106884
107036
  "reactProp": "onhelix-before-collapse",
106885
107037
  "inheritedFrom": {
@@ -106891,7 +107043,7 @@
106891
107043
  "type": {
106892
107044
  "text": "HelixBeforeResizeEvent"
106893
107045
  },
106894
- "description": "Fired before the divider settles, and only where the gesture moved it: a press that moved nothing, a drag that came back, an arrow with nowhere left to go and a corner that moved the other divider are all silent on this one. Cancelable: refusing it takes the whole of where the gesture ended, so no collapse follows from it either. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own.",
107046
+ "description": "Fired before the divider settles, and only where the gesture moved it: a press that moved nothing, a drag that came back, an arrow with nowhere left to go and a corner that moved the other divider are all silent on this one. Cancelable: refusing it takes the position and leaves the rest of the gesture, so a collapse the gesture reached is still announced and still yours to refuse. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own.",
106895
107047
  "name": "helix-before-resize",
106896
107048
  "reactProp": "onhelix-before-resize",
106897
107049
  "inheritedFrom": {
@@ -194,6 +194,21 @@ scrollbar-width: none;
194
194
  display: none;
195
195
  }
196
196
 
197
+ :host([per-view="auto"]:not([orientation="vertical"])) [part="track"] {
198
+ --carousel-per-view: max(
199
+ 1,
200
+ round(
201
+ down,
202
+ calc(
203
+ (100cqi + var(--_carousel-gap)) /
204
+ (var(--carousel-slide-min, 100cqi) + var(--_carousel-gap))
205
+ ),
206
+ 1
207
+ )
208
+ );
209
+ container-type: inline-size;
210
+ }
211
+
197
212
  :host([orientation="vertical"]) [part="track"] {
198
213
  block-size: var(--carousel-block-size, 20rem);
199
214
  flex-direction: column;
@@ -209,6 +224,10 @@ margin-inline-end: var(--carousel-run-end, 0px);
209
224
  scroll-snap-align: start;
210
225
  }
211
226
 
227
+ :host([per-view="auto"]:not([orientation="vertical"])) [part="slide"] {
228
+ flex-grow: 1;
229
+ }
230
+
212
231
  [part="slide"] ::slotted(*) {
213
232
  flex: 1 1 0;
214
233
  min-block-size: 0;
@@ -33,7 +33,7 @@ import type { CSSResultGroup, PropertyValues, TemplateResult } from 'lit';
33
33
  * @slot toolbar - A bar across the top, spanning both panes.
34
34
  *
35
35
  * @event {HelixBeforeEditEvent} helix-before-edit - Fired before the source is edited, by the source pane and heard here. Cancelable: refusing it takes the decision and nothing moves.
36
- * @event {HelixBeforePanelResizeEvent} helix-before-panel-resize - Fired before the panel's divider is let go, with its height in pixels. Cancelable: refusing it takes the decision and nothing moves.
36
+ * @event {HelixBeforePanelResizeEvent} helix-before-panel-resize - Fired before the panel's divider is let go, with its height in pixels, and a panel driven shut arrives as `panel-collapsed-size`, which is the least it goes to. Cancelable: refusing it takes the decision and nothing moves.
37
37
  * @event {HelixBeforeSplitEvent} helix-before-split - Fired before the panes' divider is let go, with the lead pane's share. Cancelable: refusing it takes the decision and nothing moves.
38
38
  * @event {HelixCaretEvent} helix-caret - Fired when the cursor moves in the source, by the source pane and heard here.
39
39
  * @event {HelixConsoleEvent} helix-console - Relayed from the frame by the preview pane, one per console call.
@@ -108,6 +108,13 @@ export declare class HelixSandbox extends HelixElement {
108
108
  * Zero closes it outright. A panel whose contents include the control that
109
109
  * reopens it, a row of tabs being the usual one, wants that row left showing,
110
110
  * and only whoever slotted it knows how tall that is.
111
+ *
112
+ * **A floor rather than a second state**, which is what keeps `panel-size` the
113
+ * whole truth about the panel: a divider driven to the end lands here and
114
+ * `panel-size` reads this number, so "closed" is something a consumer already
115
+ * stores rather than a property they have to learn. The splitter inside has a
116
+ * `collapsed` of its own and it is refused, for the reason `handleCollapse`
117
+ * gives.
111
118
  */
112
119
  panelCollapsedSize: number;
113
120
  /**
@@ -176,6 +183,17 @@ export declare class HelixSandbox extends HelixElement {
176
183
  private get homePanelPosition();
177
184
  /** `panel-collapsed-size` in the units the splitter works in. */
178
185
  private get panelSliver();
186
+ /**
187
+ * The least the panel goes to, in the pixels this element holds it in.
188
+ *
189
+ * The same number as `panelSliver` and not the same arithmetic, which is the
190
+ * point of having both: bounding the splitter at `100 - panelSliver` instead
191
+ * would ask a percentage to come back through a string and compare equal to
192
+ * the one the splitter derives, and the collapse it is meant to land on is an
193
+ * `>=` on those two floats. Held here, in whole pixels a consumer stated, it
194
+ * is exact.
195
+ */
196
+ private get panelFloor();
179
197
  /**
180
198
  * Whether a change came from inside this sandbox's source region.
181
199
  *
@@ -296,6 +314,37 @@ export declare class HelixSandbox extends HelixElement {
296
314
  */
297
315
  private readonly handlePanesChange;
298
316
  private readonly handlePanelChange;
317
+ /**
318
+ * Refuses a pane of either splitter declaring itself shut.
319
+ *
320
+ * **The collapse is a second state, and this element has nowhere to put
321
+ * one.** A splitter's `collapsed` overrides its `position` and remembers what
322
+ * it was open at, and it answers to neither `split` nor `panel-size`. Allowed
323
+ * in here, it would leave the arrangement in a state nothing outside this
324
+ * element can see or set: assigning `panel-size` back moves nothing while
325
+ * `collapsed` stands, and a consumer who stored the two numbers this element
326
+ * publishes and restored a sandbox from them would get it open. That is one
327
+ * element holding the arrangement and the other showing it, which is the state
328
+ * the two requests above were rewritten to end.
329
+ *
330
+ * **So "shut" is spelled in pixels here.** `panel-collapsed-size` is the floor
331
+ * `handlePanelChange` holds the panel to, `panel-size` reads it when the
332
+ * divider is at the end, and `helix-before-panel-resize` is where a consumer
333
+ * hears about it, in the units they already store. That is the same trade the
334
+ * other two make: the sandbox is the single decision point because it refuses
335
+ * what the splitter asks and re-announces the move in its own vocabulary.
336
+ *
337
+ * **Stopped as well as refused**, because `start` and `end` name the panes of
338
+ * a splitter a consumer of this element is not supposed to know about, and the
339
+ * two events above already say which divider moved. A collapse from something
340
+ * slotted into a pane is somebody else's and passes through untouched, which
341
+ * is what `target` against `currentTarget` is asking.
342
+ *
343
+ * Reached at all only since Splitter stopped returning on a refused
344
+ * `helix-before-resize`. While it did, every collapse in here was unreachable
345
+ * and `panel-collapsed-size` was inert with it.
346
+ */
347
+ private readonly handleCollapse;
299
348
  /**
300
349
  * Puts a divider where this element says it is.
301
350
  *
@@ -83,10 +83,17 @@ let HelixSandbox = class HelixSandbox extends HelixElement {
83
83
  event.stopPropagation();
84
84
  event.preventDefault();
85
85
  if (this.bodyHeight > 0) {
86
- this.requestPanelSize(Math.max(0, ((100 - Number(value)) / 100) * this.bodyHeight));
86
+ this.requestPanelSize(Math.max(this.panelFloor, ((100 - Number(value)) / 100) * this.bodyHeight));
87
87
  }
88
88
  this.answer(event.currentTarget, this.panelPosition);
89
89
  };
90
+ this.handleCollapse = (event) => {
91
+ if (event.target !== event.currentTarget) {
92
+ return;
93
+ }
94
+ event.stopPropagation();
95
+ event.preventDefault();
96
+ };
90
97
  this.readPanel = () => {
91
98
  this.hasPanel = this.querySelector(':scope > [slot="panel"]') !== null;
92
99
  };
@@ -114,6 +121,10 @@ let HelixSandbox = class HelixSandbox extends HelixElement {
114
121
  }
115
122
  return Math.min(100, Math.max(0, (this.panelCollapsedSize / this.bodyHeight) * 100));
116
123
  }
124
+ get panelFloor() {
125
+ const size = Number.isFinite(this.panelCollapsedSize) ? this.panelCollapsedSize : 0;
126
+ return Math.min(this.bodyHeight, Math.max(0, size));
127
+ }
117
128
  fromSource(target) {
118
129
  if (!(target instanceof Node)) {
119
130
  return false;
@@ -219,6 +230,7 @@ let HelixSandbox = class HelixSandbox extends HelixElement {
219
230
  default-position=${this.homePanelPosition}
220
231
  min=${100 - PANEL_MAX * 100}
221
232
  .position=${this.panelPosition}
233
+ @helix-before-collapse=${this.handleCollapse}
222
234
  @helix-before-resize=${this.handlePanelChange}
223
235
  >
224
236
  <helix-splitter
@@ -229,6 +241,7 @@ let HelixSandbox = class HelixSandbox extends HelixElement {
229
241
  label=${this.separatorLabel}
230
242
  orientation=${vertical ? 'vertical' : 'horizontal'}
231
243
  .position=${split}
244
+ @helix-before-collapse=${this.handleCollapse}
232
245
  @helix-before-resize=${this.handlePanesChange}
233
246
  >
234
247
  ${''}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fusion.dev/helix",
3
3
  "description": "Styled component tier. Extends the headless tier with token-driven presentation.",
4
- "version": "0.50.0",
4
+ "version": "0.51.0",
5
5
  "license": "MIT",
6
6
  "author": "Ross Sheppard <ross.sheppard@fusion.dev>",
7
7
  "repository": {
@@ -47,14 +47,14 @@
47
47
  },
48
48
  "bugs": "https://github.com/project-fusion/fusion/issues",
49
49
  "dependencies": {
50
- "@fusion.dev/helix-core": "0.50.0",
51
- "@fusion.dev/helix-headless": "0.50.0",
52
- "@fusion.dev/helix-styles": "0.50.0"
50
+ "@fusion.dev/helix-core": "0.51.0",
51
+ "@fusion.dev/helix-headless": "0.51.0",
52
+ "@fusion.dev/helix-styles": "0.51.0"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@custom-elements-manifest/analyzer": "^0.11.0",
56
- "@fusion.dev/helix-cem": "0.50.0",
57
- "@fusion.dev/helix-testing": "0.50.0",
56
+ "@fusion.dev/helix-cem": "0.51.0",
57
+ "@fusion.dev/helix-testing": "0.51.0",
58
58
  "@fusion.dev/scripts": "0.0.0-dev",
59
59
  "@happy-dom/global-registrator": "^20.0.0",
60
60
  "@lit-labs/ssr": "^4.1.0",
package/types/jsx.d.ts CHANGED
@@ -2838,6 +2838,29 @@ attribute is the one answer to how wide a pane is.
2838
2838
  A value the track cannot honor is taken to the nearest one it can, by
2839
2839
  `across`, and both tiers read that rather than this.
2840
2840
 
2841
+ **`auto` fits as many as the track can hold**, at `--carousel-slide-min`
2842
+ apiece, and nothing is written onto the track: the count is the sheet's,
2843
+ and the sheet's alone, because it is the one number here CSS can work out
2844
+ for itself. Everything it takes is a length the sheet already has, so the
2845
+ panes are laid out at their final width by the first rule that runs, on a
2846
+ server's markup as on the client's, and no script is waited on. That is the
2847
+ whole reason a declared count was ever the only option: a carousel that
2848
+ asks how wide its container is can only ask on the client, so the panes go
2849
+ down at one width and move to another when the answer arrives. Written
2850
+ inline the count would outrank the sheet that computes it, which is why an
2851
+ `auto` track is handed nothing. A count stays for the design that calls for
2852
+ exactly three.
2853
+
2854
+ The styled sheet says how it divides, and the headless `auto` example
2855
+ carries the same three lines for a consumer writing their own.
2856
+
2857
+ **A value rather than the resting behavior**, which is what the
2858
+ responsiveness policy asks of every axis that a box decides: a splitter
2859
+ turns on `orientation="auto"` and a plain one does not turn at all. Fitting
2860
+ changes what the carousel *does*, since how many are across is how many
2861
+ places the track can stop, so a carousel that had not asked for it would
2862
+ find its position count moving with the window.
2863
+
2841
2864
  No default, because it reflects. A reflected property with a value writes
2842
2865
  its attribute on upgrade, and the host then carries something a consumer's
2843
2866
  server markup never had, which React reports as a mismatch. The one-across
@@ -2875,6 +2898,29 @@ attribute is the one answer to how wide a pane is.
2875
2898
  A value the track cannot honor is taken to the nearest one it can, by
2876
2899
  `across`, and both tiers read that rather than this.
2877
2900
 
2901
+ **`auto` fits as many as the track can hold**, at `--carousel-slide-min`
2902
+ apiece, and nothing is written onto the track: the count is the sheet's,
2903
+ and the sheet's alone, because it is the one number here CSS can work out
2904
+ for itself. Everything it takes is a length the sheet already has, so the
2905
+ panes are laid out at their final width by the first rule that runs, on a
2906
+ server's markup as on the client's, and no script is waited on. That is the
2907
+ whole reason a declared count was ever the only option: a carousel that
2908
+ asks how wide its container is can only ask on the client, so the panes go
2909
+ down at one width and move to another when the answer arrives. Written
2910
+ inline the count would outrank the sheet that computes it, which is why an
2911
+ `auto` track is handed nothing. A count stays for the design that calls for
2912
+ exactly three.
2913
+
2914
+ The styled sheet says how it divides, and the headless `auto` example
2915
+ carries the same three lines for a consumer writing their own.
2916
+
2917
+ **A value rather than the resting behavior**, which is what the
2918
+ responsiveness policy asks of every axis that a box decides: a splitter
2919
+ turns on `orientation="auto"` and a plain one does not turn at all. Fitting
2920
+ changes what the carousel *does*, since how many are across is how many
2921
+ places the track can stop, so a carousel that had not asked for it would
2922
+ find its position count moving with the window.
2923
+
2878
2924
  No default, because it reflects. A reflected property with a value writes
2879
2925
  its attribute on upgrade, and the host then carries something a consumer's
2880
2926
  server markup never had, which React reports as a mismatch. The one-across
@@ -3111,6 +3157,29 @@ attribute is the one answer to how wide a pane is.
3111
3157
  A value the track cannot honor is taken to the nearest one it can, by
3112
3158
  `across`, and both tiers read that rather than this.
3113
3159
 
3160
+ **`auto` fits as many as the track can hold**, at `--carousel-slide-min`
3161
+ apiece, and nothing is written onto the track: the count is the sheet's,
3162
+ and the sheet's alone, because it is the one number here CSS can work out
3163
+ for itself. Everything it takes is a length the sheet already has, so the
3164
+ panes are laid out at their final width by the first rule that runs, on a
3165
+ server's markup as on the client's, and no script is waited on. That is the
3166
+ whole reason a declared count was ever the only option: a carousel that
3167
+ asks how wide its container is can only ask on the client, so the panes go
3168
+ down at one width and move to another when the answer arrives. Written
3169
+ inline the count would outrank the sheet that computes it, which is why an
3170
+ `auto` track is handed nothing. A count stays for the design that calls for
3171
+ exactly three.
3172
+
3173
+ The styled sheet says how it divides, and the headless `auto` example
3174
+ carries the same three lines for a consumer writing their own.
3175
+
3176
+ **A value rather than the resting behavior**, which is what the
3177
+ responsiveness policy asks of every axis that a box decides: a splitter
3178
+ turns on `orientation="auto"` and a plain one does not turn at all. Fitting
3179
+ changes what the carousel *does*, since how many are across is how many
3180
+ places the track can stop, so a carousel that had not asked for it would
3181
+ find its position count moving with the window.
3182
+
3114
3183
  No default, because it reflects. A reflected property with a value writes
3115
3184
  its attribute on upgrade, and the host then carries something a consumer's
3116
3185
  server markup never had, which React reports as a mismatch. The one-across
@@ -3148,6 +3217,29 @@ attribute is the one answer to how wide a pane is.
3148
3217
  A value the track cannot honor is taken to the nearest one it can, by
3149
3218
  `across`, and both tiers read that rather than this.
3150
3219
 
3220
+ **`auto` fits as many as the track can hold**, at `--carousel-slide-min`
3221
+ apiece, and nothing is written onto the track: the count is the sheet's,
3222
+ and the sheet's alone, because it is the one number here CSS can work out
3223
+ for itself. Everything it takes is a length the sheet already has, so the
3224
+ panes are laid out at their final width by the first rule that runs, on a
3225
+ server's markup as on the client's, and no script is waited on. That is the
3226
+ whole reason a declared count was ever the only option: a carousel that
3227
+ asks how wide its container is can only ask on the client, so the panes go
3228
+ down at one width and move to another when the answer arrives. Written
3229
+ inline the count would outrank the sheet that computes it, which is why an
3230
+ `auto` track is handed nothing. A count stays for the design that calls for
3231
+ exactly three.
3232
+
3233
+ The styled sheet says how it divides, and the headless `auto` example
3234
+ carries the same three lines for a consumer writing their own.
3235
+
3236
+ **A value rather than the resting behavior**, which is what the
3237
+ responsiveness policy asks of every axis that a box decides: a splitter
3238
+ turns on `orientation="auto"` and a plain one does not turn at all. Fitting
3239
+ changes what the carousel *does*, since how many are across is how many
3240
+ places the track can stop, so a carousel that had not asked for it would
3241
+ find its position count moving with the window.
3242
+
3151
3243
  No default, because it reflects. A reflected property with a value writes
3152
3244
  its attribute on upgrade, and the host then carries something a consumer's
3153
3245
  server markup never had, which React reports as a mismatch. The one-across
@@ -14599,13 +14691,27 @@ attribute at all. */
14599
14691
 
14600
14692
  Zero closes it outright. A panel whose contents include the control that
14601
14693
  reopens it, a row of tabs being the usual one, wants that row left showing,
14602
- and only whoever slotted it knows how tall that is. */
14694
+ and only whoever slotted it knows how tall that is.
14695
+
14696
+ **A floor rather than a second state**, which is what keeps `panel-size` the
14697
+ whole truth about the panel: a divider driven to the end lands here and
14698
+ `panel-size` reads this number, so "closed" is something a consumer already
14699
+ stores rather than a property they have to learn. The splitter inside has a
14700
+ `collapsed` of its own and it is refused, for the reason `handleCollapse`
14701
+ gives. */
14603
14702
  "panel-collapsed-size"?: (HelixSandbox["panelCollapsedSize"] | `${number}`) | undefined;
14604
14703
  /** What the panel's height becomes when it is closed.
14605
14704
 
14606
14705
  Zero closes it outright. A panel whose contents include the control that
14607
14706
  reopens it, a row of tabs being the usual one, wants that row left showing,
14608
- and only whoever slotted it knows how tall that is. */
14707
+ and only whoever slotted it knows how tall that is.
14708
+
14709
+ **A floor rather than a second state**, which is what keeps `panel-size` the
14710
+ whole truth about the panel: a divider driven to the end lands here and
14711
+ `panel-size` reads this number, so "closed" is something a consumer already
14712
+ stores rather than a property they have to learn. The splitter inside has a
14713
+ `collapsed` of its own and it is refused, for the reason `handleCollapse`
14714
+ gives. */
14609
14715
  panelCollapsedSize?: (HelixSandbox["panelCollapsedSize"]) | undefined;
14610
14716
  /** Accessible name for the panel's divider. */
14611
14717
  "panel-label"?: (HelixSandbox["panelLabel"]) | undefined;
@@ -14624,7 +14730,7 @@ and only whoever slotted it knows how tall that is. */
14624
14730
 
14625
14731
  /** Fired before the source is edited, by the source pane and heard here. Cancelable: refusing it takes the decision and nothing moves. */
14626
14732
  "onhelix-before-edit"?: ((e: HelixSandboxHelixBeforeEditElementEvent) => void) | undefined;
14627
- /** Fired before the panel's divider is let go, with its height in pixels. Cancelable: refusing it takes the decision and nothing moves. */
14733
+ /** Fired before the panel's divider is let go, with its height in pixels, and a panel driven shut arrives as `panel-collapsed-size`, which is the least it goes to. Cancelable: refusing it takes the decision and nothing moves. */
14628
14734
  "onhelix-before-panel-resize"?: ((
14629
14735
  e: HelixSandboxHelixBeforePanelResizeElementEvent,
14630
14736
  ) => void) | undefined;
@@ -14704,13 +14810,27 @@ attribute at all. */
14704
14810
 
14705
14811
  Zero closes it outright. A panel whose contents include the control that
14706
14812
  reopens it, a row of tabs being the usual one, wants that row left showing,
14707
- and only whoever slotted it knows how tall that is. */
14813
+ and only whoever slotted it knows how tall that is.
14814
+
14815
+ **A floor rather than a second state**, which is what keeps `panel-size` the
14816
+ whole truth about the panel: a divider driven to the end lands here and
14817
+ `panel-size` reads this number, so "closed" is something a consumer already
14818
+ stores rather than a property they have to learn. The splitter inside has a
14819
+ `collapsed` of its own and it is refused, for the reason `handleCollapse`
14820
+ gives. */
14708
14821
  "attr:panel-collapsed-size"?: (HelixSandbox["panelCollapsedSize"] | `${number}`) | undefined;
14709
14822
  /** What the panel's height becomes when it is closed.
14710
14823
 
14711
14824
  Zero closes it outright. A panel whose contents include the control that
14712
14825
  reopens it, a row of tabs being the usual one, wants that row left showing,
14713
- and only whoever slotted it knows how tall that is. */
14826
+ and only whoever slotted it knows how tall that is.
14827
+
14828
+ **A floor rather than a second state**, which is what keeps `panel-size` the
14829
+ whole truth about the panel: a divider driven to the end lands here and
14830
+ `panel-size` reads this number, so "closed" is something a consumer already
14831
+ stores rather than a property they have to learn. The splitter inside has a
14832
+ `collapsed` of its own and it is refused, for the reason `handleCollapse`
14833
+ gives. */
14714
14834
  "prop:panelCollapsedSize"?: (HelixSandbox["panelCollapsedSize"]) | undefined;
14715
14835
  /** Accessible name for the panel's divider. */
14716
14836
  "attr:panel-label"?: (HelixSandbox["panelLabel"]) | undefined;
@@ -14728,7 +14848,7 @@ and only whoever slotted it knows how tall that is. */
14728
14848
  "prop:split"?: (HelixSandbox["split"]) | undefined;
14729
14849
  /** Fired before the source is edited, by the source pane and heard here. Cancelable: refusing it takes the decision and nothing moves. */
14730
14850
  "on:helix-before-edit"?: ((e: HelixSandboxHelixBeforeEditElementEvent) => void) | undefined;
14731
- /** Fired before the panel's divider is let go, with its height in pixels. Cancelable: refusing it takes the decision and nothing moves. */
14851
+ /** Fired before the panel's divider is let go, with its height in pixels, and a panel driven shut arrives as `panel-collapsed-size`, which is the least it goes to. Cancelable: refusing it takes the decision and nothing moves. */
14732
14852
  "on:helix-before-panel-resize"?: ((
14733
14853
  e: HelixSandboxHelixBeforePanelResizeElementEvent,
14734
14854
  ) => void) | undefined;
@@ -16063,11 +16183,11 @@ has an honest answer. */
16063
16183
  /** How far one arrow press moves it, as a percentage. */
16064
16184
  step?: (HelixSplitter["step"]) | undefined;
16065
16185
 
16066
- /** Fired before a pane shuts or reopens, and only where the position it is derived from stood. Cancelable: refusing it leaves the pane as it was and the divider where the gesture put it. */
16186
+ /** Fired before a pane shuts or reopens, whether or not the resize that reached it was allowed, and carrying its own position: a shut pane sits at `collapsed-size` rather than at the number the resize named. Cancelable: refusing it leaves the pane as it was and the divider where the gesture put it. */
16067
16187
  "onhelix-before-collapse"?: ((
16068
16188
  e: HelixSplitterHelixBeforeCollapseElementEvent,
16069
16189
  ) => void) | undefined;
16070
- /** Fired before the divider settles, and only where the gesture moved it: a press that moved nothing, a drag that came back, an arrow with nowhere left to go and a corner that moved the other divider are all silent on this one. Cancelable: refusing it takes the whole of where the gesture ended, so no collapse follows from it either. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own. */
16190
+ /** Fired before the divider settles, and only where the gesture moved it: a press that moved nothing, a drag that came back, an arrow with nowhere left to go and a corner that moved the other divider are all silent on this one. Cancelable: refusing it takes the position and leaves the rest of the gesture, so a collapse the gesture reached is still announced and still yours to refuse. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own. */
16071
16191
  "onhelix-before-resize"?: ((
16072
16192
  e: HelixSplitterHelixBeforeResizeElementEvent,
16073
16193
  ) => void) | undefined;
@@ -16183,11 +16303,11 @@ has an honest answer. */
16183
16303
  "prop:orientation"?: (HelixSplitter["orientation"]) | undefined;
16184
16304
  /** How far one arrow press moves it, as a percentage. */
16185
16305
  "prop:step"?: (HelixSplitter["step"]) | undefined;
16186
- /** Fired before a pane shuts or reopens, and only where the position it is derived from stood. Cancelable: refusing it leaves the pane as it was and the divider where the gesture put it. */
16306
+ /** Fired before a pane shuts or reopens, whether or not the resize that reached it was allowed, and carrying its own position: a shut pane sits at `collapsed-size` rather than at the number the resize named. Cancelable: refusing it leaves the pane as it was and the divider where the gesture put it. */
16187
16307
  "on:helix-before-collapse"?: ((
16188
16308
  e: HelixSplitterHelixBeforeCollapseElementEvent,
16189
16309
  ) => void) | undefined;
16190
- /** Fired before the divider settles, and only where the gesture moved it: a press that moved nothing, a drag that came back, an arrow with nowhere left to go and a corner that moved the other divider are all silent on this one. Cancelable: refusing it takes the whole of where the gesture ended, so no collapse follows from it either. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own. */
16310
+ /** Fired before the divider settles, and only where the gesture moved it: a press that moved nothing, a drag that came back, an arrow with nowhere left to go and a corner that moved the other divider are all silent on this one. Cancelable: refusing it takes the position and leaves the rest of the gesture, so a collapse the gesture reached is still announced and still yours to refuse. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own. */
16191
16311
  "on:helix-before-resize"?: ((
16192
16312
  e: HelixSplitterHelixBeforeResizeElementEvent,
16193
16313
  ) => void) | undefined;
@@ -23019,6 +23139,29 @@ export type CustomElements = {
23019
23139
  * A value the track cannot honor is taken to the nearest one it can, by
23020
23140
  * `across`, and both tiers read that rather than this.
23021
23141
  *
23142
+ * **`auto` fits as many as the track can hold**, at `--carousel-slide-min`
23143
+ * apiece, and nothing is written onto the track: the count is the sheet's,
23144
+ * and the sheet's alone, because it is the one number here CSS can work out
23145
+ * for itself. Everything it takes is a length the sheet already has, so the
23146
+ * panes are laid out at their final width by the first rule that runs, on a
23147
+ * server's markup as on the client's, and no script is waited on. That is the
23148
+ * whole reason a declared count was ever the only option: a carousel that
23149
+ * asks how wide its container is can only ask on the client, so the panes go
23150
+ * down at one width and move to another when the answer arrives. Written
23151
+ * inline the count would outrank the sheet that computes it, which is why an
23152
+ * `auto` track is handed nothing. A count stays for the design that calls for
23153
+ * exactly three.
23154
+ *
23155
+ * The styled sheet says how it divides, and the headless `auto` example
23156
+ * carries the same three lines for a consumer writing their own.
23157
+ *
23158
+ * **A value rather than the resting behavior**, which is what the
23159
+ * responsiveness policy asks of every axis that a box decides: a splitter
23160
+ * turns on `orientation="auto"` and a plain one does not turn at all. Fitting
23161
+ * changes what the carousel *does*, since how many are across is how many
23162
+ * places the track can stop, so a carousel that had not asked for it would
23163
+ * find its position count moving with the window.
23164
+ *
23022
23165
  * No default, because it reflects. A reflected property with a value writes
23023
23166
  * its attribute on upgrade, and the host then carries something a consumer's
23024
23167
  * server markup never had, which React reports as a mismatch. The one-across
@@ -23028,7 +23171,11 @@ export type CustomElements = {
23028
23171
  * A window of `perView` slides sliding one at a time over `n` of them stops
23029
23172
  * `n - perView + 1` times, so six slides four across is three: 0 to 3, 1 to 4,
23030
23173
  * 2 to 5. One at minimum, since a carousel showing everything it has still
23031
- * has the one place to be. (property only) (readonly)
23174
+ * has the one place to be.
23175
+ *
23176
+ * One across until a fitted track has been laid out, which is the same answer
23177
+ * a carousel that has never been told anything gives, and the dots are
23178
+ * withheld rather than counted from it. See `across`. (property only) (readonly)
23032
23179
  * - `slides`: The slides, in light-DOM order. Empty on the server, which has no tree. (property only) (readonly)
23033
23180
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
23034
23181
  *
@@ -23077,8 +23224,9 @@ export type CustomElements = {
23077
23224
  * - `--carousel-block-size`: Height of a vertical track. (default: `undefined`)
23078
23225
  * - `--carousel-gap`: Space between slides. A sheet sets it and the component measures the run with it. (default: `undefined`)
23079
23226
  * - `--carousel-pane`: The size one pane is laid out at. A sheet sets it and the component measures the run with it. (default: `undefined`)
23080
- * - `--carousel-per-view`: How many slides go across, written onto the track by the component so a sheet divides the track by the same number the positions are counted from. Read it rather than selecting on `per-view`, which cannot be enumerated without a ceiling. See `perView`. (default: `undefined`)
23227
+ * - `--carousel-per-view`: How many slides go across, written onto the track by the component so a sheet divides the track by the same number the positions are counted from. Read it rather than selecting on `per-view`, which cannot be enumerated without a ceiling. Under `per-view="auto"` the component writes nothing and the sheet declares it instead, so the same name answers in both modes. See `perView`. (default: `undefined`)
23081
23228
  * - `--carousel-run-end`: How far short of a whole pixel the run ends, on the last slide alone, for a sheet to take up as `margin-inline-end`. See `runEnd`. (default: `undefined`)
23229
+ * - `--carousel-slide-min`: The narrowest a slide may be laid out, which is what `per-view="auto"` fits the track with. A length, since the sheet divides by it. Unset is the whole track, which is one across. (default: `undefined`)
23082
23230
  *
23083
23231
  * ## CSS Parts
23084
23232
  *
@@ -33869,6 +34017,13 @@ export type CustomElements = {
33869
34017
  * Zero closes it outright. A panel whose contents include the control that
33870
34018
  * reopens it, a row of tabs being the usual one, wants that row left showing,
33871
34019
  * and only whoever slotted it knows how tall that is.
34020
+ *
34021
+ * **A floor rather than a second state**, which is what keeps `panel-size` the
34022
+ * whole truth about the panel: a divider driven to the end lands here and
34023
+ * `panel-size` reads this number, so "closed" is something a consumer already
34024
+ * stores rather than a property they have to learn. The splitter inside has a
34025
+ * `collapsed` of its own and it is refused, for the reason `handleCollapse`
34026
+ * gives.
33872
34027
  * - `panel-label`/`panelLabel`: Accessible name for the panel's divider.
33873
34028
  * - `panel-size`/`panelSize`: Height of the panel, in pixels.
33874
34029
  * - `separator-label`/`separatorLabel`: Accessible name for the divider.
@@ -33899,7 +34054,7 @@ export type CustomElements = {
33899
34054
  * Events that will be emitted by the component.
33900
34055
  *
33901
34056
  * - `helix-before-edit`: Fired before the source is edited, by the source pane and heard here. Cancelable: refusing it takes the decision and nothing moves.
33902
- * - `helix-before-panel-resize`: Fired before the panel's divider is let go, with its height in pixels. Cancelable: refusing it takes the decision and nothing moves.
34057
+ * - `helix-before-panel-resize`: Fired before the panel's divider is let go, with its height in pixels, and a panel driven shut arrives as `panel-collapsed-size`, which is the least it goes to. Cancelable: refusing it takes the decision and nothing moves.
33903
34058
  * - `helix-before-split`: Fired before the panes' divider is let go, with the lead pane's share. Cancelable: refusing it takes the decision and nothing moves.
33904
34059
  * - `helix-caret`: Fired when the cursor moves in the source, by the source pane and heard here.
33905
34060
  * - `helix-console`: Relayed from the frame by the preview pane, one per console call.
@@ -35654,8 +35809,8 @@ export type CustomElements = {
35654
35809
  *
35655
35810
  * Events that will be emitted by the component.
35656
35811
  *
35657
- * - `helix-before-collapse`: Fired before a pane shuts or reopens, and only where the position it is derived from stood. Cancelable: refusing it leaves the pane as it was and the divider where the gesture put it.
35658
- * - `helix-before-resize`: Fired before the divider settles, and only where the gesture moved it: a press that moved nothing, a drag that came back, an arrow with nowhere left to go and a corner that moved the other divider are all silent on this one. Cancelable: refusing it takes the whole of where the gesture ended, so no collapse follows from it either. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own.
35812
+ * - `helix-before-collapse`: Fired before a pane shuts or reopens, whether or not the resize that reached it was allowed, and carrying its own position: a shut pane sits at `collapsed-size` rather than at the number the resize named. Cancelable: refusing it leaves the pane as it was and the divider where the gesture put it.
35813
+ * - `helix-before-resize`: Fired before the divider settles, and only where the gesture moved it: a press that moved nothing, a drag that came back, an arrow with nowhere left to go and a corner that moved the other divider are all silent on this one. Cancelable: refusing it takes the position and leaves the rest of the gesture, so a collapse the gesture reached is still announced and still yours to refuse. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own.
35659
35814
  *
35660
35815
  * ## Slots
35661
35816
  *
@@ -42467,6 +42622,29 @@ export type CustomElementsSolidJs = {
42467
42622
  * A value the track cannot honor is taken to the nearest one it can, by
42468
42623
  * `across`, and both tiers read that rather than this.
42469
42624
  *
42625
+ * **`auto` fits as many as the track can hold**, at `--carousel-slide-min`
42626
+ * apiece, and nothing is written onto the track: the count is the sheet's,
42627
+ * and the sheet's alone, because it is the one number here CSS can work out
42628
+ * for itself. Everything it takes is a length the sheet already has, so the
42629
+ * panes are laid out at their final width by the first rule that runs, on a
42630
+ * server's markup as on the client's, and no script is waited on. That is the
42631
+ * whole reason a declared count was ever the only option: a carousel that
42632
+ * asks how wide its container is can only ask on the client, so the panes go
42633
+ * down at one width and move to another when the answer arrives. Written
42634
+ * inline the count would outrank the sheet that computes it, which is why an
42635
+ * `auto` track is handed nothing. A count stays for the design that calls for
42636
+ * exactly three.
42637
+ *
42638
+ * The styled sheet says how it divides, and the headless `auto` example
42639
+ * carries the same three lines for a consumer writing their own.
42640
+ *
42641
+ * **A value rather than the resting behavior**, which is what the
42642
+ * responsiveness policy asks of every axis that a box decides: a splitter
42643
+ * turns on `orientation="auto"` and a plain one does not turn at all. Fitting
42644
+ * changes what the carousel *does*, since how many are across is how many
42645
+ * places the track can stop, so a carousel that had not asked for it would
42646
+ * find its position count moving with the window.
42647
+ *
42470
42648
  * No default, because it reflects. A reflected property with a value writes
42471
42649
  * its attribute on upgrade, and the host then carries something a consumer's
42472
42650
  * server markup never had, which React reports as a mismatch. The one-across
@@ -42476,7 +42654,11 @@ export type CustomElementsSolidJs = {
42476
42654
  * A window of `perView` slides sliding one at a time over `n` of them stops
42477
42655
  * `n - perView + 1` times, so six slides four across is three: 0 to 3, 1 to 4,
42478
42656
  * 2 to 5. One at minimum, since a carousel showing everything it has still
42479
- * has the one place to be. (property only) (readonly)
42657
+ * has the one place to be.
42658
+ *
42659
+ * One across until a fitted track has been laid out, which is the same answer
42660
+ * a carousel that has never been told anything gives, and the dots are
42661
+ * withheld rather than counted from it. See `across`. (property only) (readonly)
42480
42662
  * - `slides`: The slides, in light-DOM order. Empty on the server, which has no tree. (property only) (readonly)
42481
42663
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
42482
42664
  *
@@ -42525,8 +42707,9 @@ export type CustomElementsSolidJs = {
42525
42707
  * - `--carousel-block-size`: Height of a vertical track. (default: `undefined`)
42526
42708
  * - `--carousel-gap`: Space between slides. A sheet sets it and the component measures the run with it. (default: `undefined`)
42527
42709
  * - `--carousel-pane`: The size one pane is laid out at. A sheet sets it and the component measures the run with it. (default: `undefined`)
42528
- * - `--carousel-per-view`: How many slides go across, written onto the track by the component so a sheet divides the track by the same number the positions are counted from. Read it rather than selecting on `per-view`, which cannot be enumerated without a ceiling. See `perView`. (default: `undefined`)
42710
+ * - `--carousel-per-view`: How many slides go across, written onto the track by the component so a sheet divides the track by the same number the positions are counted from. Read it rather than selecting on `per-view`, which cannot be enumerated without a ceiling. Under `per-view="auto"` the component writes nothing and the sheet declares it instead, so the same name answers in both modes. See `perView`. (default: `undefined`)
42529
42711
  * - `--carousel-run-end`: How far short of a whole pixel the run ends, on the last slide alone, for a sheet to take up as `margin-inline-end`. See `runEnd`. (default: `undefined`)
42712
+ * - `--carousel-slide-min`: The narrowest a slide may be laid out, which is what `per-view="auto"` fits the track with. A length, since the sheet divides by it. Unset is the whole track, which is one across. (default: `undefined`)
42530
42713
  *
42531
42714
  * ## CSS Parts
42532
42715
  *
@@ -53534,6 +53717,13 @@ export type CustomElementsSolidJs = {
53534
53717
  * Zero closes it outright. A panel whose contents include the control that
53535
53718
  * reopens it, a row of tabs being the usual one, wants that row left showing,
53536
53719
  * and only whoever slotted it knows how tall that is.
53720
+ *
53721
+ * **A floor rather than a second state**, which is what keeps `panel-size` the
53722
+ * whole truth about the panel: a divider driven to the end lands here and
53723
+ * `panel-size` reads this number, so "closed" is something a consumer already
53724
+ * stores rather than a property they have to learn. The splitter inside has a
53725
+ * `collapsed` of its own and it is refused, for the reason `handleCollapse`
53726
+ * gives.
53537
53727
  * - `panel-label`/`panelLabel`: Accessible name for the panel's divider.
53538
53728
  * - `panel-size`/`panelSize`: Height of the panel, in pixels.
53539
53729
  * - `separator-label`/`separatorLabel`: Accessible name for the divider.
@@ -53564,7 +53754,7 @@ export type CustomElementsSolidJs = {
53564
53754
  * Events that will be emitted by the component.
53565
53755
  *
53566
53756
  * - `helix-before-edit`: Fired before the source is edited, by the source pane and heard here. Cancelable: refusing it takes the decision and nothing moves.
53567
- * - `helix-before-panel-resize`: Fired before the panel's divider is let go, with its height in pixels. Cancelable: refusing it takes the decision and nothing moves.
53757
+ * - `helix-before-panel-resize`: Fired before the panel's divider is let go, with its height in pixels, and a panel driven shut arrives as `panel-collapsed-size`, which is the least it goes to. Cancelable: refusing it takes the decision and nothing moves.
53568
53758
  * - `helix-before-split`: Fired before the panes' divider is let go, with the lead pane's share. Cancelable: refusing it takes the decision and nothing moves.
53569
53759
  * - `helix-caret`: Fired when the cursor moves in the source, by the source pane and heard here.
53570
53760
  * - `helix-console`: Relayed from the frame by the preview pane, one per console call.
@@ -55361,8 +55551,8 @@ export type CustomElementsSolidJs = {
55361
55551
  *
55362
55552
  * Events that will be emitted by the component.
55363
55553
  *
55364
- * - `helix-before-collapse`: Fired before a pane shuts or reopens, and only where the position it is derived from stood. Cancelable: refusing it leaves the pane as it was and the divider where the gesture put it.
55365
- * - `helix-before-resize`: Fired before the divider settles, and only where the gesture moved it: a press that moved nothing, a drag that came back, an arrow with nowhere left to go and a corner that moved the other divider are all silent on this one. Cancelable: refusing it takes the whole of where the gesture ended, so no collapse follows from it either. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own.
55554
+ * - `helix-before-collapse`: Fired before a pane shuts or reopens, whether or not the resize that reached it was allowed, and carrying its own position: a shut pane sits at `collapsed-size` rather than at the number the resize named. Cancelable: refusing it leaves the pane as it was and the divider where the gesture put it.
55555
+ * - `helix-before-resize`: Fired before the divider settles, and only where the gesture moved it: a press that moved nothing, a drag that came back, an arrow with nowhere left to go and a corner that moved the other divider are all silent on this one. Cancelable: refusing it takes the position and leaves the rest of the gesture, so a collapse the gesture reached is still announced and still yours to refuse. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own.
55366
55556
  *
55367
55557
  * ## Slots
55368
55558
  *
@@ -60010,10 +60200,12 @@ export type CustomCssProperties = {
60010
60200
  "--carousel-gap"?: (string) | undefined;
60011
60201
  /** The size one pane is laid out at. A sheet sets it and the component measures the run with it. */
60012
60202
  "--carousel-pane"?: (string) | undefined;
60013
- /** How many slides go across, written onto the track by the component so a sheet divides the track by the same number the positions are counted from. Read it rather than selecting on `per-view`, which cannot be enumerated without a ceiling. See `perView`. */
60203
+ /** How many slides go across, written onto the track by the component so a sheet divides the track by the same number the positions are counted from. Read it rather than selecting on `per-view`, which cannot be enumerated without a ceiling. Under `per-view="auto"` the component writes nothing and the sheet declares it instead, so the same name answers in both modes. See `perView`. */
60014
60204
  "--carousel-per-view"?: (string) | undefined;
60015
60205
  /** How far short of a whole pixel the run ends, on the last slide alone, for a sheet to take up as `margin-inline-end`. See `runEnd`. */
60016
60206
  "--carousel-run-end"?: (string) | undefined;
60207
+ /** The narrowest a slide may be laid out, which is what `per-view="auto"` fits the track with. A length, since the sheet divides by it. Unset is the whole track, which is one across. */
60208
+ "--carousel-slide-min"?: (string) | undefined;
60017
60209
  /** Fill behind the composer. */
60018
60210
  "--chat-composer-background-color"?: (string) | undefined;
60019
60211
  /** The composer's edge, so a theme can remove it. */
package/types/vue.d.ts CHANGED
@@ -1561,6 +1561,29 @@ attribute is the one answer to how wide a pane is.
1561
1561
  A value the track cannot honor is taken to the nearest one it can, by
1562
1562
  `across`, and both tiers read that rather than this.
1563
1563
 
1564
+ **`auto` fits as many as the track can hold**, at `--carousel-slide-min`
1565
+ apiece, and nothing is written onto the track: the count is the sheet's,
1566
+ and the sheet's alone, because it is the one number here CSS can work out
1567
+ for itself. Everything it takes is a length the sheet already has, so the
1568
+ panes are laid out at their final width by the first rule that runs, on a
1569
+ server's markup as on the client's, and no script is waited on. That is the
1570
+ whole reason a declared count was ever the only option: a carousel that
1571
+ asks how wide its container is can only ask on the client, so the panes go
1572
+ down at one width and move to another when the answer arrives. Written
1573
+ inline the count would outrank the sheet that computes it, which is why an
1574
+ `auto` track is handed nothing. A count stays for the design that calls for
1575
+ exactly three.
1576
+
1577
+ The styled sheet says how it divides, and the headless `auto` example
1578
+ carries the same three lines for a consumer writing their own.
1579
+
1580
+ **A value rather than the resting behavior**, which is what the
1581
+ responsiveness policy asks of every axis that a box decides: a splitter
1582
+ turns on `orientation="auto"` and a plain one does not turn at all. Fitting
1583
+ changes what the carousel *does*, since how many are across is how many
1584
+ places the track can stop, so a carousel that had not asked for it would
1585
+ find its position count moving with the window.
1586
+
1564
1587
  No default, because it reflects. A reflected property with a value writes
1565
1588
  its attribute on upgrade, and the host then carries something a consumer's
1566
1589
  server markup never had, which React reports as a mismatch. The one-across
@@ -1598,6 +1621,29 @@ attribute is the one answer to how wide a pane is.
1598
1621
  A value the track cannot honor is taken to the nearest one it can, by
1599
1622
  `across`, and both tiers read that rather than this.
1600
1623
 
1624
+ **`auto` fits as many as the track can hold**, at `--carousel-slide-min`
1625
+ apiece, and nothing is written onto the track: the count is the sheet's,
1626
+ and the sheet's alone, because it is the one number here CSS can work out
1627
+ for itself. Everything it takes is a length the sheet already has, so the
1628
+ panes are laid out at their final width by the first rule that runs, on a
1629
+ server's markup as on the client's, and no script is waited on. That is the
1630
+ whole reason a declared count was ever the only option: a carousel that
1631
+ asks how wide its container is can only ask on the client, so the panes go
1632
+ down at one width and move to another when the answer arrives. Written
1633
+ inline the count would outrank the sheet that computes it, which is why an
1634
+ `auto` track is handed nothing. A count stays for the design that calls for
1635
+ exactly three.
1636
+
1637
+ The styled sheet says how it divides, and the headless `auto` example
1638
+ carries the same three lines for a consumer writing their own.
1639
+
1640
+ **A value rather than the resting behavior**, which is what the
1641
+ responsiveness policy asks of every axis that a box decides: a splitter
1642
+ turns on `orientation="auto"` and a plain one does not turn at all. Fitting
1643
+ changes what the carousel *does*, since how many are across is how many
1644
+ places the track can stop, so a carousel that had not asked for it would
1645
+ find its position count moving with the window.
1646
+
1601
1647
  No default, because it reflects. A reflected property with a value writes
1602
1648
  its attribute on upgrade, and the host then carries something a consumer's
1603
1649
  server markup never had, which React reports as a mismatch. The one-across
@@ -7517,13 +7563,27 @@ attribute at all. */
7517
7563
 
7518
7564
  Zero closes it outright. A panel whose contents include the control that
7519
7565
  reopens it, a row of tabs being the usual one, wants that row left showing,
7520
- and only whoever slotted it knows how tall that is. */
7566
+ and only whoever slotted it knows how tall that is.
7567
+
7568
+ **A floor rather than a second state**, which is what keeps `panel-size` the
7569
+ whole truth about the panel: a divider driven to the end lands here and
7570
+ `panel-size` reads this number, so "closed" is something a consumer already
7571
+ stores rather than a property they have to learn. The splitter inside has a
7572
+ `collapsed` of its own and it is refused, for the reason `handleCollapse`
7573
+ gives. */
7521
7574
  "panel-collapsed-size"?: (HelixSandbox["panelCollapsedSize"] | `${number}`) | undefined;
7522
7575
  /** What the panel's height becomes when it is closed.
7523
7576
 
7524
7577
  Zero closes it outright. A panel whose contents include the control that
7525
7578
  reopens it, a row of tabs being the usual one, wants that row left showing,
7526
- and only whoever slotted it knows how tall that is. */
7579
+ and only whoever slotted it knows how tall that is.
7580
+
7581
+ **A floor rather than a second state**, which is what keeps `panel-size` the
7582
+ whole truth about the panel: a divider driven to the end lands here and
7583
+ `panel-size` reads this number, so "closed" is something a consumer already
7584
+ stores rather than a property they have to learn. The splitter inside has a
7585
+ `collapsed` of its own and it is refused, for the reason `handleCollapse`
7586
+ gives. */
7527
7587
  panelCollapsedSize?: (HelixSandbox["panelCollapsedSize"]) | undefined;
7528
7588
  /** Accessible name for the panel's divider. */
7529
7589
  "panel-label"?: (HelixSandbox["panelLabel"]) | undefined;
@@ -7544,7 +7604,7 @@ and only whoever slotted it knows how tall that is. */
7544
7604
  export type HelixSandboxVueEvents = {
7545
7605
  /** Fired before the source is edited, by the source pane and heard here. Cancelable: refusing it takes the decision and nothing moves. */
7546
7606
  "helix-before-edit": HelixSandboxHelixBeforeEditElementEvent;
7547
- /** Fired before the panel's divider is let go, with its height in pixels. Cancelable: refusing it takes the decision and nothing moves. */
7607
+ /** Fired before the panel's divider is let go, with its height in pixels, and a panel driven shut arrives as `panel-collapsed-size`, which is the least it goes to. Cancelable: refusing it takes the decision and nothing moves. */
7548
7608
  "helix-before-panel-resize": HelixSandboxHelixBeforePanelResizeElementEvent;
7549
7609
  /** Fired before the panes' divider is let go, with the lead pane's share. Cancelable: refusing it takes the decision and nothing moves. */
7550
7610
  "helix-before-split": HelixSandboxHelixBeforeSplitElementEvent;
@@ -8287,9 +8347,9 @@ has an honest answer. */
8287
8347
  };
8288
8348
 
8289
8349
  export type HelixSplitterVueEvents = {
8290
- /** Fired before a pane shuts or reopens, and only where the position it is derived from stood. Cancelable: refusing it leaves the pane as it was and the divider where the gesture put it. */
8350
+ /** Fired before a pane shuts or reopens, whether or not the resize that reached it was allowed, and carrying its own position: a shut pane sits at `collapsed-size` rather than at the number the resize named. Cancelable: refusing it leaves the pane as it was and the divider where the gesture put it. */
8291
8351
  "helix-before-collapse": HelixSplitterHelixBeforeCollapseElementEvent;
8292
- /** Fired before the divider settles, and only where the gesture moved it: a press that moved nothing, a drag that came back, an arrow with nowhere left to go and a corner that moved the other divider are all silent on this one. Cancelable: refusing it takes the whole of where the gesture ended, so no collapse follows from it either. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own. */
8352
+ /** Fired before the divider settles, and only where the gesture moved it: a press that moved nothing, a drag that came back, an arrow with nowhere left to go and a corner that moved the other divider are all silent on this one. Cancelable: refusing it takes the position and leaves the rest of the gesture, so a collapse the gesture reached is still announced and still yours to refuse. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own. */
8293
8353
  "helix-before-resize": HelixSplitterHelixBeforeResizeElementEvent;
8294
8354
  };
8295
8355
 
@@ -10732,10 +10792,12 @@ export type CustomCssProperties = {
10732
10792
  "--carousel-gap"?: (string) | undefined;
10733
10793
  /** The size one pane is laid out at. A sheet sets it and the component measures the run with it. */
10734
10794
  "--carousel-pane"?: (string) | undefined;
10735
- /** How many slides go across, written onto the track by the component so a sheet divides the track by the same number the positions are counted from. Read it rather than selecting on `per-view`, which cannot be enumerated without a ceiling. See `perView`. */
10795
+ /** How many slides go across, written onto the track by the component so a sheet divides the track by the same number the positions are counted from. Read it rather than selecting on `per-view`, which cannot be enumerated without a ceiling. Under `per-view="auto"` the component writes nothing and the sheet declares it instead, so the same name answers in both modes. See `perView`. */
10736
10796
  "--carousel-per-view"?: (string) | undefined;
10737
10797
  /** How far short of a whole pixel the run ends, on the last slide alone, for a sheet to take up as `margin-inline-end`. See `runEnd`. */
10738
10798
  "--carousel-run-end"?: (string) | undefined;
10799
+ /** The narrowest a slide may be laid out, which is what `per-view="auto"` fits the track with. A length, since the sheet divides by it. Unset is the whole track, which is one across. */
10800
+ "--carousel-slide-min"?: (string) | undefined;
10739
10801
  /** Fill behind the composer. */
10740
10802
  "--chat-composer-background-color"?: (string) | undefined;
10741
10803
  /** The composer's edge, so a theme can remove it. */