@fusion.dev/helix-headless 0.59.0 → 0.59.2

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.
@@ -88337,7 +88337,7 @@
88337
88337
  "type": {
88338
88338
  "text": "'segmented' | 'underlined' | undefined"
88339
88339
  },
88340
- "description": "How the row reads.\n\nUnset is a raised pill on the selected tab with nothing behind the row,\nwhich is what a set sitting inside other chrome wants. `underlined` is a\nrule under the row and a thicker one under the selected tab, for a set that\nheads a page. `segmented` puts the pill in a framed, sunken track, which\nreads as one control rather than as a row.\n\nA value describes itself rather than naming another component: `segmented`\nand `underlined` are participles reading as a pair, the way `outlined` on\nAccordion does.\n\nReflected and left unset by default, so the host carries nothing a\nconsumer's server markup does not already have.",
88340
+ "description": "How the row reads.\n\nUnset is a raised pill on the selected tab with nothing behind the row,\nwhich is what a set sitting inside other chrome wants. `underlined` is a\nrule under the row and a thicker one under the selected tab, for a set that\nheads a page. `segmented` puts the pill in a framed, sunken track, which\nreads as one control rather than as a row.\n\nA value describes itself rather than naming another component: `segmented`\nand `underlined` are participles reading as a pair, the way `outlined` on\nAccordion does.\n\n**`segmented` is `ToggleGroup`'s track, opted into.** The two draw the same\ngroove, token for token, and the sheets already say so where the height is\nfixed. What differs is polarity, and both are right: a group of toggles is\none control, so its track is the resting state and its `separation` decides\nonly the frame around it, while a row of tabs is a row until something says\notherwise, so the track is a value here rather than the thing a value takes\naway.\n\nReflected and left unset by default, so the host carries nothing a\nconsumer's server markup does not already have.",
88341
88341
  "attribute": "variant",
88342
88342
  "reflects": true
88343
88343
  },
@@ -88870,7 +88870,7 @@
88870
88870
  "type": {
88871
88871
  "text": "'segmented' | 'underlined' | undefined"
88872
88872
  },
88873
- "description": "How the row reads.\n\nUnset is a raised pill on the selected tab with nothing behind the row,\nwhich is what a set sitting inside other chrome wants. `underlined` is a\nrule under the row and a thicker one under the selected tab, for a set that\nheads a page. `segmented` puts the pill in a framed, sunken track, which\nreads as one control rather than as a row.\n\nA value describes itself rather than naming another component: `segmented`\nand `underlined` are participles reading as a pair, the way `outlined` on\nAccordion does.\n\nReflected and left unset by default, so the host carries nothing a\nconsumer's server markup does not already have.",
88873
+ "description": "How the row reads.\n\nUnset is a raised pill on the selected tab with nothing behind the row,\nwhich is what a set sitting inside other chrome wants. `underlined` is a\nrule under the row and a thicker one under the selected tab, for a set that\nheads a page. `segmented` puts the pill in a framed, sunken track, which\nreads as one control rather than as a row.\n\nA value describes itself rather than naming another component: `segmented`\nand `underlined` are participles reading as a pair, the way `outlined` on\nAccordion does.\n\n**`segmented` is `ToggleGroup`'s track, opted into.** The two draw the same\ngroove, token for token, and the sheets already say so where the height is\nfixed. What differs is polarity, and both are right: a group of toggles is\none control, so its track is the resting state and its `separation` decides\nonly the frame around it, while a row of tabs is a row until something says\notherwise, so the track is a value here rather than the thing a value takes\naway.\n\nReflected and left unset by default, so the host carries nothing a\nconsumer's server markup does not already have.",
88874
88874
  "fieldName": "variant"
88875
88875
  },
88876
88876
  {
@@ -97004,7 +97004,7 @@
97004
97004
  "type": {
97005
97005
  "text": "| 'bottom-center'\n | 'bottom-end'\n | 'bottom-start'\n | 'top-center'\n | 'top-end'\n | 'top-start' | undefined"
97006
97006
  },
97007
- "description": "Which corner or edge the stack sits at.\n\nNamed here rather than on each message, because where a page puts its\ntoasts is a fact about the page: a stack whose members disagreed about\nwhere they were would not be a stack.\n\n**Optional, and bottom-end is the absence of it.** Reflecting *and*\ndefaulting is the pair that writes onto a host: every toast region anybody\nrendered would gain a `placement=\"bottom-end\"` nobody typed, which a React\nconsumer's server markup does not have. A sheet carries the resting\narrangement in its own `:host` rule and the selectors describe only the\ndepartures, which is what `orientation` does.",
97007
+ "description": "Which corner or edge the stack sits at.\n\nNamed here rather than on each message, because where a page puts its\ntoasts is a fact about the page: a stack whose members disagreed about\nwhere they were would not be a stack.\n\n**Six corners in one word, where `Carousel` splits the same question in\ntwo.** That family takes a placement and an alignment, and argues at its own\ndeclaration that one attribute naming both facts multiplies rather than\ncomposing. It is right there and wrong here, and the difference is the\nshape of the product. A carousel's is ragged: its `overlay` belongs to no\nedge at all, and its two groups of chrome move independently, shipping\ndifferent defaults so they do not land on each other, which is what makes\nrewriting one to move the other a real cost. A stack's is two edges by\nthree alignments, every pair real and every pair named this way by every\ntoast a reader has already met. Fusing spells the domain out and loses\nnothing; a stack has one position and takes it once.\n\n**Optional, and bottom-end is the absence of it.** Reflecting *and*\ndefaulting is the pair that writes onto a host: every toast region anybody\nrendered would gain a `placement=\"bottom-end\"` nobody typed, which a React\nconsumer's server markup does not have. A sheet carries the resting\narrangement in its own `:host` rule and the selectors describe only the\ndepartures, which is what `orientation` does.",
97008
97008
  "attribute": "placement",
97009
97009
  "reflects": true
97010
97010
  },
@@ -97358,7 +97358,7 @@
97358
97358
  "type": {
97359
97359
  "text": "| 'bottom-center'\n | 'bottom-end'\n | 'bottom-start'\n | 'top-center'\n | 'top-end'\n | 'top-start' | undefined"
97360
97360
  },
97361
- "description": "Which corner or edge the stack sits at.\n\nNamed here rather than on each message, because where a page puts its\ntoasts is a fact about the page: a stack whose members disagreed about\nwhere they were would not be a stack.\n\n**Optional, and bottom-end is the absence of it.** Reflecting *and*\ndefaulting is the pair that writes onto a host: every toast region anybody\nrendered would gain a `placement=\"bottom-end\"` nobody typed, which a React\nconsumer's server markup does not have. A sheet carries the resting\narrangement in its own `:host` rule and the selectors describe only the\ndepartures, which is what `orientation` does.",
97361
+ "description": "Which corner or edge the stack sits at.\n\nNamed here rather than on each message, because where a page puts its\ntoasts is a fact about the page: a stack whose members disagreed about\nwhere they were would not be a stack.\n\n**Six corners in one word, where `Carousel` splits the same question in\ntwo.** That family takes a placement and an alignment, and argues at its own\ndeclaration that one attribute naming both facts multiplies rather than\ncomposing. It is right there and wrong here, and the difference is the\nshape of the product. A carousel's is ragged: its `overlay` belongs to no\nedge at all, and its two groups of chrome move independently, shipping\ndifferent defaults so they do not land on each other, which is what makes\nrewriting one to move the other a real cost. A stack's is two edges by\nthree alignments, every pair real and every pair named this way by every\ntoast a reader has already met. Fusing spells the domain out and loses\nnothing; a stack has one position and takes it once.\n\n**Optional, and bottom-end is the absence of it.** Reflecting *and*\ndefaulting is the pair that writes onto a host: every toast region anybody\nrendered would gain a `placement=\"bottom-end\"` nobody typed, which a React\nconsumer's server markup does not have. A sheet carries the resting\narrangement in its own `:host` rule and the selectors describe only the\ndepartures, which is what `orientation` does.",
97362
97362
  "fieldName": "placement"
97363
97363
  }
97364
97364
  ],
@@ -107645,7 +107645,8 @@
107645
107645
  "type": {
107646
107646
  "text": "Promise<void>"
107647
107647
  }
107648
- }
107648
+ },
107649
+ "description": "Into picture in picture and back, and quiet about being refused.\n\nCaught rather than `void`ed, the way `FullscreenController` catches its\nown: this is called from a click handler that discards the promise, so a\nrefusal is otherwise an unhandled rejection naming neither the element nor\nthe reason. The roster already declines to draw the button where the\nconsumer refused the feature, which leaves the refusals nothing can see\ncoming, a request without user activation and a window another document is\nalready using."
107649
107650
  },
107650
107651
  {
107651
107652
  "kind": "field",
@@ -5,7 +5,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  var HelixHeadlessObjectInspector_1;
8
- import { CopyController, customElement, HelixElement, inlineStep, scrollItemIntoView, VirtualizeController, } from '@fusion.dev/helix-core';
8
+ import { CopyController, customElement, elementById, HelixElement, inlineStep, scrollItemIntoView, searchableById, VirtualizeController, } from '@fusion.dev/helix-core';
9
9
  import { caretDown, caretRight } from '@fusion.dev/helix-icons';
10
10
  import { html, nothing } from 'lit';
11
11
  import { property, state } from 'lit/decorators.js';
@@ -146,9 +146,7 @@ let HelixHeadlessObjectInspector = class HelixHeadlessObjectInspector extends He
146
146
  }
147
147
  willUpdate(changed) {
148
148
  super.willUpdate(changed);
149
- if (this.loadedFor !== this.for &&
150
- typeof this.ownerDocument?.getElementById === 'function' &&
151
- !this.hydrating) {
149
+ if (this.loadedFor !== this.for && searchableById(this) && !this.hydrating) {
152
150
  this.loadedFor = this.for;
153
151
  this.load();
154
152
  }
@@ -178,7 +176,7 @@ let HelixHeadlessObjectInspector = class HelixHeadlessObjectInspector extends He
178
176
  }
179
177
  }
180
178
  load() {
181
- const text = this.for === '' ? '' : (this.ownerDocument.getElementById(this.for)?.textContent ?? '');
179
+ const text = this.for === '' ? '' : (elementById(this, this.for)?.textContent ?? '');
182
180
  try {
183
181
  this.read = text.trim() === '' ? undefined : JSON.parse(text);
184
182
  }
@@ -60,6 +60,14 @@ export declare class HelixHeadlessTabs extends HelixHeadlessTabs_base {
60
60
  * and `underlined` are participles reading as a pair, the way `outlined` on
61
61
  * Accordion does.
62
62
  *
63
+ * **`segmented` is `ToggleGroup`'s track, opted into.** The two draw the same
64
+ * groove, token for token, and the sheets already say so where the height is
65
+ * fixed. What differs is polarity, and both are right: a group of toggles is
66
+ * one control, so its track is the resting state and its `separation` decides
67
+ * only the frame around it, while a row of tabs is a row until something says
68
+ * otherwise, so the track is a value here rather than the thing a value takes
69
+ * away.
70
+ *
63
71
  * Reflected and left unset by default, so the host carries nothing a
64
72
  * consumer's server markup does not already have.
65
73
  */
@@ -52,6 +52,18 @@ export declare class HelixHeadlessToast extends HelixElement {
52
52
  * toasts is a fact about the page: a stack whose members disagreed about
53
53
  * where they were would not be a stack.
54
54
  *
55
+ * **Six corners in one word, where `Carousel` splits the same question in
56
+ * two.** That family takes a placement and an alignment, and argues at its own
57
+ * declaration that one attribute naming both facts multiplies rather than
58
+ * composing. It is right there and wrong here, and the difference is the
59
+ * shape of the product. A carousel's is ragged: its `overlay` belongs to no
60
+ * edge at all, and its two groups of chrome move independently, shipping
61
+ * different defaults so they do not land on each other, which is what makes
62
+ * rewriting one to move the other a real cost. A stack's is two edges by
63
+ * three alignments, every pair real and every pair named this way by every
64
+ * toast a reader has already met. Fusing spells the domain out and loses
65
+ * nothing; a stack has one position and takes it once.
66
+ *
55
67
  * **Optional, and bottom-end is the absence of it.** Reflecting *and*
56
68
  * defaulting is the pair that writes onto a host: every toast region anybody
57
69
  * rendered would gain a `placement="bottom-end"` nobody typed, which a React
@@ -13,6 +13,8 @@ export interface Conditions {
13
13
  hydrating: boolean;
14
14
  /** Whether anything on the network has offered to play this. */
15
15
  remote: boolean;
16
+ /** Whether the consumer has refused picture in picture on the element. */
17
+ refusedPip: boolean;
16
18
  /** Whether a file is named, which is what a download needs. */
17
19
  source: boolean;
18
20
  }
@@ -1,7 +1,10 @@
1
1
  import { writtenList } from '@fusion.dev/helix-core';
2
2
  export const offers = (one, player) => {
3
3
  if (one === 'pip') {
4
- return !player.hydrating && typeof document !== 'undefined' && document.pictureInPictureEnabled;
4
+ return (!player.hydrating &&
5
+ !player.refusedPip &&
6
+ typeof document !== 'undefined' &&
7
+ document.pictureInPictureEnabled);
5
8
  }
6
9
  if (one === 'remote') {
7
10
  return player.remote;
@@ -510,6 +510,17 @@ export declare class HelixHeadlessVideo extends HelixElement {
510
510
  private skip;
511
511
  /** Steps through the speeds offered, which is what one button can do. */
512
512
  private cycleSpeed;
513
+ /**
514
+ * Into picture in picture and back, and quiet about being refused.
515
+ *
516
+ * Caught rather than `void`ed, the way `FullscreenController` catches its
517
+ * own: this is called from a click handler that discards the promise, so a
518
+ * refusal is otherwise an unhandled rejection naming neither the element nor
519
+ * the reason. The roster already declines to draw the button where the
520
+ * consumer refused the feature, which leaves the refusals nothing can see
521
+ * coming, a request without user activation and a window another document is
522
+ * already using.
523
+ */
513
524
  private togglePip;
514
525
  /**
515
526
  * A press on the picture plays or pauses it.
@@ -174,7 +174,12 @@ let HelixHeadlessVideo = class HelixHeadlessVideo extends HelixElement {
174
174
  this.captions = [];
175
175
  }
176
176
  get conditions() {
177
- return { hydrating: this.hydrating, remote: this.remoteAvailable, source: this.src !== '' };
177
+ return {
178
+ hydrating: this.hydrating,
179
+ refusedPip: this.disablePictureInPicture,
180
+ remote: this.remoteAvailable,
181
+ source: this.src !== '',
182
+ };
178
183
  }
179
184
  get extras() {
180
185
  return barControls(this.extraControls, this.conditions);
@@ -347,11 +352,16 @@ let HelixHeadlessVideo = class HelixHeadlessVideo extends HelixElement {
347
352
  if (!video) {
348
353
  return;
349
354
  }
350
- if (document.pictureInPictureElement === video) {
351
- await document.exitPictureInPicture();
352
- return;
355
+ try {
356
+ if (document.pictureInPictureElement === video) {
357
+ await document.exitPictureInPicture();
358
+ return;
359
+ }
360
+ await video.requestPictureInPicture();
361
+ }
362
+ catch (error) {
363
+ console.warn(`<${this.localName}> could not enter picture in picture. A press has to come from the reader, and one window holds it at a time.`, error);
353
364
  }
354
- await video.requestPictureInPicture();
355
365
  }
356
366
  willUpdate(changed) {
357
367
  super.willUpdate(changed);
@@ -83,9 +83,15 @@ export declare class HelixHeadlessVirtualList extends HelixElement {
83
83
  /**
84
84
  * Reads the source named by `for`, before the render that draws it.
85
85
  *
86
+ * **Resolved through `getRootNode()`, so a list inside another component's
87
+ * shadow root names a source in that root rather than in the page.** Read
88
+ * against `ownerDocument` it looked in the document whatever tree it was in,
89
+ * and found nothing from inside an app shell or a sandbox, which is
90
+ * indistinguishable here from the miss this tolerates on purpose.
91
+ *
86
92
  * Not on the server, per the server rules: the shim has attributes and no
87
- * tree, so `getElementById` is undefined there. Nor while hydrating what a
88
- * server sent, which it drew with nothing read. A source that is missing or
93
+ * tree to look an id up in. Nor while hydrating what a server sent, which it
94
+ * drew with nothing read. A source that is missing or
89
95
  * not an array leaves the list empty rather than throwing, because a consumer
90
96
  * whose data has not arrived yet is the ordinary case and an empty list says
91
97
  * so by itself.
@@ -4,7 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { customElement, HelixElement, VirtualizeController } from '@fusion.dev/helix-core';
7
+ import { customElement, elementById, HelixElement, searchableById, VirtualizeController, } from '@fusion.dev/helix-core';
8
8
  import { html } from 'lit';
9
9
  import { property, state } from 'lit/decorators.js';
10
10
  let HelixHeadlessVirtualList = class HelixHeadlessVirtualList extends HelixElement {
@@ -31,9 +31,7 @@ let HelixHeadlessVirtualList = class HelixHeadlessVirtualList extends HelixEleme
31
31
  }
32
32
  willUpdate(changed) {
33
33
  super.willUpdate(changed);
34
- if (this.readFor !== this.for &&
35
- typeof this.ownerDocument?.getElementById === 'function' &&
36
- !this.hydrating) {
34
+ if (this.readFor !== this.for && searchableById(this) && !this.hydrating) {
37
35
  this.readFor = this.for;
38
36
  this.read();
39
37
  }
@@ -48,7 +46,7 @@ let HelixHeadlessVirtualList = class HelixHeadlessVirtualList extends HelixEleme
48
46
  this.place();
49
47
  }
50
48
  read() {
51
- const source = this.for === '' ? null : this.ownerDocument.getElementById(this.for);
49
+ const source = this.for === '' ? null : elementById(this, this.for);
52
50
  const text = source?.textContent ?? '';
53
51
  if (text.trim() === '') {
54
52
  this.rows = [];
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fusion.dev/helix-headless",
3
3
  "description": "Headless component tier. Structure, accessibility, state, and form participation. No styling.",
4
- "version": "0.59.0",
4
+ "version": "0.59.2",
5
5
  "license": "MIT",
6
6
  "author": "Ross Sheppard <ross.sheppard@fusion.dev>",
7
7
  "repository": {
@@ -46,14 +46,14 @@
46
46
  },
47
47
  "bugs": "https://github.com/project-fusion/fusion/issues",
48
48
  "dependencies": {
49
- "@fusion.dev/helix-core": "0.59.0",
50
- "@fusion.dev/helix-icons": "0.59.0",
49
+ "@fusion.dev/helix-core": "0.59.2",
50
+ "@fusion.dev/helix-icons": "0.59.2",
51
51
  "uqr": "^0.1.3"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@custom-elements-manifest/analyzer": "^0.11.0",
55
- "@fusion.dev/helix-cem": "0.59.0",
56
- "@fusion.dev/helix-testing": "0.59.0",
55
+ "@fusion.dev/helix-cem": "0.59.2",
56
+ "@fusion.dev/helix-testing": "0.59.2",
57
57
  "@fusion.dev/scripts": "0.0.0-dev",
58
58
  "@happy-dom/global-registrator": "^20.0.0",
59
59
  "@lit-labs/ssr": "^4.1.0",
package/types/jsx.d.ts CHANGED
@@ -14521,6 +14521,14 @@ A value describes itself rather than naming another component: `segmented`
14521
14521
  and `underlined` are participles reading as a pair, the way `outlined` on
14522
14522
  Accordion does.
14523
14523
 
14524
+ **`segmented` is `ToggleGroup`'s track, opted into.** The two draw the same
14525
+ groove, token for token, and the sheets already say so where the height is
14526
+ fixed. What differs is polarity, and both are right: a group of toggles is
14527
+ one control, so its track is the resting state and its `separation` decides
14528
+ only the frame around it, while a row of tabs is a row until something says
14529
+ otherwise, so the track is a value here rather than the thing a value takes
14530
+ away.
14531
+
14524
14532
  Reflected and left unset by default, so the host carries nothing a
14525
14533
  consumer's server markup does not already have. */
14526
14534
  variant?: (HelixHeadlessTabs["variant"]) | undefined;
@@ -14573,6 +14581,14 @@ A value describes itself rather than naming another component: `segmented`
14573
14581
  and `underlined` are participles reading as a pair, the way `outlined` on
14574
14582
  Accordion does.
14575
14583
 
14584
+ **`segmented` is `ToggleGroup`'s track, opted into.** The two draw the same
14585
+ groove, token for token, and the sheets already say so where the height is
14586
+ fixed. What differs is polarity, and both are right: a group of toggles is
14587
+ one control, so its track is the resting state and its `separation` decides
14588
+ only the frame around it, while a row of tabs is a row until something says
14589
+ otherwise, so the track is a value here rather than the thing a value takes
14590
+ away.
14591
+
14576
14592
  Reflected and left unset by default, so the host carries nothing a
14577
14593
  consumer's server markup does not already have. */
14578
14594
  "prop:variant"?: (HelixHeadlessTabs["variant"]) | undefined;
@@ -15920,6 +15936,18 @@ Named here rather than on each message, because where a page puts its
15920
15936
  toasts is a fact about the page: a stack whose members disagreed about
15921
15937
  where they were would not be a stack.
15922
15938
 
15939
+ **Six corners in one word, where `Carousel` splits the same question in
15940
+ two.** That family takes a placement and an alignment, and argues at its own
15941
+ declaration that one attribute naming both facts multiplies rather than
15942
+ composing. It is right there and wrong here, and the difference is the
15943
+ shape of the product. A carousel's is ragged: its `overlay` belongs to no
15944
+ edge at all, and its two groups of chrome move independently, shipping
15945
+ different defaults so they do not land on each other, which is what makes
15946
+ rewriting one to move the other a real cost. A stack's is two edges by
15947
+ three alignments, every pair real and every pair named this way by every
15948
+ toast a reader has already met. Fusing spells the domain out and loses
15949
+ nothing; a stack has one position and takes it once.
15950
+
15923
15951
  **Optional, and bottom-end is the absence of it.** Reflecting *and*
15924
15952
  defaulting is the pair that writes onto a host: every toast region anybody
15925
15953
  rendered would gain a `placement="bottom-end"` nobody typed, which a React
@@ -15941,6 +15969,18 @@ Named here rather than on each message, because where a page puts its
15941
15969
  toasts is a fact about the page: a stack whose members disagreed about
15942
15970
  where they were would not be a stack.
15943
15971
 
15972
+ **Six corners in one word, where `Carousel` splits the same question in
15973
+ two.** That family takes a placement and an alignment, and argues at its own
15974
+ declaration that one attribute naming both facts multiplies rather than
15975
+ composing. It is right there and wrong here, and the difference is the
15976
+ shape of the product. A carousel's is ragged: its `overlay` belongs to no
15977
+ edge at all, and its two groups of chrome move independently, shipping
15978
+ different defaults so they do not land on each other, which is what makes
15979
+ rewriting one to move the other a real cost. A stack's is two edges by
15980
+ three alignments, every pair real and every pair named this way by every
15981
+ toast a reader has already met. Fusing spells the domain out and loses
15982
+ nothing; a stack has one position and takes it once.
15983
+
15944
15984
  **Optional, and bottom-end is the absence of it.** Reflecting *and*
15945
15985
  defaulting is the pair that writes onto a host: every toast region anybody
15946
15986
  rendered would gain a `placement="bottom-end"` nobody typed, which a React
@@ -32596,6 +32636,14 @@ export type CustomElements = {
32596
32636
  * and `underlined` are participles reading as a pair, the way `outlined` on
32597
32637
  * Accordion does.
32598
32638
  *
32639
+ * **`segmented` is `ToggleGroup`'s track, opted into.** The two draw the same
32640
+ * groove, token for token, and the sheets already say so where the height is
32641
+ * fixed. What differs is polarity, and both are right: a group of toggles is
32642
+ * one control, so its track is the resting state and its `separation` decides
32643
+ * only the frame around it, while a row of tabs is a row until something says
32644
+ * otherwise, so the track is a value here rather than the thing a value takes
32645
+ * away.
32646
+ *
32599
32647
  * Reflected and left unset by default, so the host carries nothing a
32600
32648
  * consumer's server markup does not already have.
32601
32649
  * - `active`: Which item is current, by its `value`.
@@ -33956,6 +34004,18 @@ export type CustomElements = {
33956
34004
  * toasts is a fact about the page: a stack whose members disagreed about
33957
34005
  * where they were would not be a stack.
33958
34006
  *
34007
+ * **Six corners in one word, where `Carousel` splits the same question in
34008
+ * two.** That family takes a placement and an alignment, and argues at its own
34009
+ * declaration that one attribute naming both facts multiplies rather than
34010
+ * composing. It is right there and wrong here, and the difference is the
34011
+ * shape of the product. A carousel's is ragged: its `overlay` belongs to no
34012
+ * edge at all, and its two groups of chrome move independently, shipping
34013
+ * different defaults so they do not land on each other, which is what makes
34014
+ * rewriting one to move the other a real cost. A stack's is two edges by
34015
+ * three alignments, every pair real and every pair named this way by every
34016
+ * toast a reader has already met. Fusing spells the domain out and loses
34017
+ * nothing; a stack has one position and takes it once.
34018
+ *
33959
34019
  * **Optional, and bottom-end is the absence of it.** Reflecting *and*
33960
34020
  * defaulting is the pair that writes onto a host: every toast region anybody
33961
34021
  * rendered would gain a `placement="bottom-end"` nobody typed, which a React
@@ -50781,6 +50841,14 @@ export type CustomElementsSolidJs = {
50781
50841
  * and `underlined` are participles reading as a pair, the way `outlined` on
50782
50842
  * Accordion does.
50783
50843
  *
50844
+ * **`segmented` is `ToggleGroup`'s track, opted into.** The two draw the same
50845
+ * groove, token for token, and the sheets already say so where the height is
50846
+ * fixed. What differs is polarity, and both are right: a group of toggles is
50847
+ * one control, so its track is the resting state and its `separation` decides
50848
+ * only the frame around it, while a row of tabs is a row until something says
50849
+ * otherwise, so the track is a value here rather than the thing a value takes
50850
+ * away.
50851
+ *
50784
50852
  * Reflected and left unset by default, so the host carries nothing a
50785
50853
  * consumer's server markup does not already have.
50786
50854
  * - `active`: Which item is current, by its `value`.
@@ -52164,6 +52232,18 @@ export type CustomElementsSolidJs = {
52164
52232
  * toasts is a fact about the page: a stack whose members disagreed about
52165
52233
  * where they were would not be a stack.
52166
52234
  *
52235
+ * **Six corners in one word, where `Carousel` splits the same question in
52236
+ * two.** That family takes a placement and an alignment, and argues at its own
52237
+ * declaration that one attribute naming both facts multiplies rather than
52238
+ * composing. It is right there and wrong here, and the difference is the
52239
+ * shape of the product. A carousel's is ragged: its `overlay` belongs to no
52240
+ * edge at all, and its two groups of chrome move independently, shipping
52241
+ * different defaults so they do not land on each other, which is what makes
52242
+ * rewriting one to move the other a real cost. A stack's is two edges by
52243
+ * three alignments, every pair real and every pair named this way by every
52244
+ * toast a reader has already met. Fusing spells the domain out and loses
52245
+ * nothing; a stack has one position and takes it once.
52246
+ *
52167
52247
  * **Optional, and bottom-end is the absence of it.** Reflecting *and*
52168
52248
  * defaulting is the pair that writes onto a host: every toast region anybody
52169
52249
  * rendered would gain a `placement="bottom-end"` nobody typed, which a React
package/types/vue.d.ts CHANGED
@@ -7444,6 +7444,14 @@ A value describes itself rather than naming another component: `segmented`
7444
7444
  and `underlined` are participles reading as a pair, the way `outlined` on
7445
7445
  Accordion does.
7446
7446
 
7447
+ **`segmented` is `ToggleGroup`'s track, opted into.** The two draw the same
7448
+ groove, token for token, and the sheets already say so where the height is
7449
+ fixed. What differs is polarity, and both are right: a group of toggles is
7450
+ one control, so its track is the resting state and its `separation` decides
7451
+ only the frame around it, while a row of tabs is a row until something says
7452
+ otherwise, so the track is a value here rather than the thing a value takes
7453
+ away.
7454
+
7447
7455
  Reflected and left unset by default, so the host carries nothing a
7448
7456
  consumer's server markup does not already have. */
7449
7457
  variant?: (HelixHeadlessTabs["variant"]) | undefined;
@@ -8157,6 +8165,18 @@ Named here rather than on each message, because where a page puts its
8157
8165
  toasts is a fact about the page: a stack whose members disagreed about
8158
8166
  where they were would not be a stack.
8159
8167
 
8168
+ **Six corners in one word, where `Carousel` splits the same question in
8169
+ two.** That family takes a placement and an alignment, and argues at its own
8170
+ declaration that one attribute naming both facts multiplies rather than
8171
+ composing. It is right there and wrong here, and the difference is the
8172
+ shape of the product. A carousel's is ragged: its `overlay` belongs to no
8173
+ edge at all, and its two groups of chrome move independently, shipping
8174
+ different defaults so they do not land on each other, which is what makes
8175
+ rewriting one to move the other a real cost. A stack's is two edges by
8176
+ three alignments, every pair real and every pair named this way by every
8177
+ toast a reader has already met. Fusing spells the domain out and loses
8178
+ nothing; a stack has one position and takes it once.
8179
+
8160
8180
  **Optional, and bottom-end is the absence of it.** Reflecting *and*
8161
8181
  defaulting is the pair that writes onto a host: every toast region anybody
8162
8182
  rendered would gain a `placement="bottom-end"` nobody typed, which a React