@fusion.dev/helix 0.44.0 → 0.46.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.
@@ -95,6 +95,11 @@ export declare class HelixSandbox extends HelixElement {
95
95
  lead: 'source' | 'preview';
96
96
  /**
97
97
  * Whether the panes sit side by side or stacked.
98
+ *
99
+ * Not reflected, for `lead`'s reason above: no rule selects on it. The axis
100
+ * reaches the stylesheet as the inner splitter's own `orientation`, which is
101
+ * where the panes are laid out, and this element's sheet names no host
102
+ * attribute at all.
98
103
  */
99
104
  orientation?: 'horizontal' | 'vertical';
100
105
  /**
@@ -230,7 +235,7 @@ export declare class HelixSandbox extends HelixElement {
230
235
  */
231
236
  private get axis();
232
237
  /**
233
- * Says the panes' divider has settled, so a consumer can keep it.
238
+ * Asks for the panes' divider to settle here, and moves it unless refused.
234
239
  *
235
240
  * When it settles, not while it moves. A drag is a stream of positions and
236
241
  * only the one it ends at is a preference; announcing each would ask whoever
@@ -241,13 +246,25 @@ export declare class HelixSandbox extends HelixElement {
241
246
  * wrote to storage on its own would be deciding for all of them under a key
242
247
  * it chose.
243
248
  *
249
+ * **Through `requestChange`, and never the other way round.** Both of these
250
+ * fired after `split` and `panelSize` had already been written, with the
251
+ * answer dropped, so a consumer calling `preventDefault()` on an event whose
252
+ * own line says refusing it takes the decision changed nothing whatever: the
253
+ * divider stayed where the drag left it and their handler read a value they
254
+ * had just declined. `SandboxSource.edit` two files away already carries the
255
+ * argument, that assigning first turns a `before` event into one that has
256
+ * already happened, and `Splitter`, whose `helix-before-resize` these two were
257
+ * split out of, has always announced through the audited path. Refusing one
258
+ * now leaves `.position` bound to the value this element still holds, so the
259
+ * divider goes back where it was.
260
+ *
244
261
  * **A verb each, rather than one `helix-before-resize` naming which of the two
245
262
  * moved.** Both dividers are this element's, so `composedPath()[0]` is the same
246
263
  * host for either and the event name is the only thing that can separate them.
247
264
  */
248
- private splitSettled;
249
- /** As `splitSettled`, for the panel, whose value is pixels rather than a share. */
250
- private panelSettled;
265
+ private requestSplit;
266
+ /** As `requestSplit`, for the panel, whose value is pixels rather than a share. */
267
+ private requestPanelSize;
251
268
  /**
252
269
  * Answers a divider that has asked to move.
253
270
  *
@@ -261,9 +278,31 @@ export declare class HelixSandbox extends HelixElement {
261
278
  * speaking for itself is one of ours, and only those are stopped: the sandbox
262
279
  * announces `helix-before-split` and `helix-before-panel-resize` in their
263
280
  * place, and a consumer never sees the two splitters inside it.
281
+ *
282
+ * **Refused as well as stopped, which is what "controlled from here" costs.**
283
+ * A splitter nobody refuses applies the move itself and says so in its own
284
+ * docblock, so the sentence above was true only while nothing downstream ever
285
+ * declined: refusing `helix-before-split` left `split` at fifty and the
286
+ * divider drawn at fifty-two, one element holding the arrangement and the
287
+ * other showing it. Refusing the inner request first makes this element the
288
+ * single answer.
289
+ *
290
+ * **And the divider is written back, because a refusal writes nothing.** A
291
+ * splitter draws itself from where the gesture reached until its `position` is
292
+ * assigned, which is the setter's stated job, and a bound property Lit did not
293
+ * change is a property Lit does not write. So the answer is assigned either
294
+ * way, which for an accepted move is the number the binding is about to carry
295
+ * anyway.
264
296
  */
265
297
  private readonly handlePanesChange;
266
298
  private readonly handlePanelChange;
299
+ /**
300
+ * Puts a divider where this element says it is.
301
+ *
302
+ * Typed by what is used rather than by the class, which is the whole of the
303
+ * coupling: a splitter this does not import is one that can be replaced.
304
+ */
305
+ private answer;
267
306
  connectedCallback(): void;
268
307
  /** Watches the body, whose height is what the pane sizes are computed from. */
269
308
  private watchBody;
@@ -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, HelixBeforePanelResizeEvent, HelixBeforeSplitEvent, HelixElement, } from '@fusion.dev/helix-core';
7
+ import { customElement, HelixBeforePanelResizeEvent, HelixBeforeSplitEvent, HelixElement, requestChange, } from '@fusion.dev/helix-core';
8
8
  import '../../splitter/index.js';
9
9
  import { html } from 'lit';
10
10
  import { property, state } from 'lit/decorators.js';
@@ -71,8 +71,9 @@ let HelixSandbox = class HelixSandbox extends HelixElement {
71
71
  }
72
72
  const { value } = event.detail;
73
73
  event.stopPropagation();
74
- this.split = Number(value);
75
- this.splitSettled();
74
+ event.preventDefault();
75
+ this.requestSplit(Number(value));
76
+ this.answer(event.currentTarget, this.split);
76
77
  };
77
78
  this.handlePanelChange = (event) => {
78
79
  if (event.target !== event.currentTarget) {
@@ -80,11 +81,11 @@ let HelixSandbox = class HelixSandbox extends HelixElement {
80
81
  }
81
82
  const { value } = event.detail;
82
83
  event.stopPropagation();
83
- if (this.bodyHeight <= 0) {
84
- return;
84
+ event.preventDefault();
85
+ if (this.bodyHeight > 0) {
86
+ this.requestPanelSize(Math.max(0, ((100 - Number(value)) / 100) * this.bodyHeight));
85
87
  }
86
- this.panelSize = Math.max(0, ((100 - Number(value)) / 100) * this.bodyHeight);
87
- this.panelSettled();
88
+ this.answer(event.currentTarget, this.panelPosition);
88
89
  };
89
90
  this.readPanel = () => {
90
91
  this.hasPanel = this.querySelector(':scope > [slot="panel"]') !== null;
@@ -135,11 +136,31 @@ let HelixSandbox = class HelixSandbox extends HelixElement {
135
136
  get axis() {
136
137
  return this.orientation ?? 'horizontal';
137
138
  }
138
- splitSettled() {
139
- this.dispatchEvent(new HelixBeforeSplitEvent({ value: String(this.split) }));
139
+ requestSplit(next) {
140
+ return requestChange({
141
+ apply: (value) => {
142
+ this.split = value;
143
+ },
144
+ event: (value) => new HelixBeforeSplitEvent({ value: String(value) }),
145
+ host: this,
146
+ next,
147
+ });
148
+ }
149
+ requestPanelSize(next) {
150
+ return requestChange({
151
+ apply: (value) => {
152
+ this.panelSize = value;
153
+ },
154
+ event: (value) => new HelixBeforePanelResizeEvent({ value: String(value) }),
155
+ host: this,
156
+ next,
157
+ });
140
158
  }
141
- panelSettled() {
142
- this.dispatchEvent(new HelixBeforePanelResizeEvent({ value: String(this.panelSize) }));
159
+ answer(divider, position) {
160
+ const target = divider;
161
+ if (target && Number.isFinite(position)) {
162
+ target.position = position;
163
+ }
143
164
  }
144
165
  connectedCallback() {
145
166
  super.connectedCallback();
@@ -233,7 +254,7 @@ __decorate([
233
254
  property()
234
255
  ], HelixSandbox.prototype, "lead", void 0);
235
256
  __decorate([
236
- property({ reflect: true })
257
+ property()
237
258
  ], HelixSandbox.prototype, "orientation", void 0);
238
259
  __decorate([
239
260
  property({ attribute: 'panel-collapsed-size', type: Number })
@@ -28,7 +28,7 @@ let HelixSandboxStatusBar = class HelixSandboxStatusBar extends HelixElement {
28
28
  ${position === undefined ? nothing : html `<span part="caret">${position}</span>`}
29
29
  ${language === undefined
30
30
  ? nothing
31
- : html `<span part="language">${LABELS[language] ?? language}</span>`}
31
+ : html `<span part="language">${Object.hasOwn(LABELS, language) ? LABELS[language] : language}</span>`}
32
32
  <slot name="end"></slot>`;
33
33
  }
34
34
  static { this.styles = styles; }
@@ -20,8 +20,9 @@ import type { CSSResultGroup } from 'lit';
20
20
  * region the id its `href` names.
21
21
  *
22
22
  * @since 0.1.0
23
- * @status experimental
23
+ * @status stable
24
24
  * @category navigation
25
+ * @aliases Skip navigation, Skip to content
25
26
  * @documentation https://fusion.dev/helix/components/skip-link
26
27
  *
27
28
  * @cssproperty --skip-link-border-color - Color of the revealed link's edge.
@@ -33,7 +33,7 @@ import type { CSSResultGroup } from 'lit';
33
33
  * cross product, which is the explosion a named ramp exists to prevent.
34
34
  *
35
35
  * @since 0.1.0
36
- * @status experimental
36
+ * @status stable
37
37
  * @category typography
38
38
  * @aliases Paragraph, Copy, Label, Caption, Heading, Title
39
39
  * @documentation https://fusion.dev/helix/components/text
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.44.0",
4
+ "version": "0.46.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.44.0",
51
- "@fusion.dev/helix-headless": "0.44.0",
52
- "@fusion.dev/helix-styles": "0.44.0"
50
+ "@fusion.dev/helix-core": "0.46.0",
51
+ "@fusion.dev/helix-headless": "0.46.0",
52
+ "@fusion.dev/helix-styles": "0.46.0"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@custom-elements-manifest/analyzer": "^0.11.0",
56
- "@fusion.dev/helix-cem": "0.44.0",
57
- "@fusion.dev/helix-testing": "0.44.0",
56
+ "@fusion.dev/helix-cem": "0.46.0",
57
+ "@fusion.dev/helix-testing": "0.46.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
@@ -2826,7 +2826,7 @@ server markup never had, which React reports as a mismatch. The one-across
2826
2826
  case is the absent attribute, and the styles read it that way. */
2827
2827
  perView?: (HelixCarousel["perView"]) | undefined;
2828
2828
 
2829
- /** Fired when the slide in view changes, with its index. Cancelable where the carousel is about to move: refusing a control or an indicator takes the decision and nothing moves. A drag has already moved the track, so that one announces after the fact and refusing it does nothing. See `handleScroll`. */
2829
+ /** Fired before the slide in view changes, with the index being asked for. Cancelable: refusing it takes the decision and nothing moves, including a drag, which is put back on the slide the index still holds. See `handleScroll`. */
2830
2830
  "onhelix-select"?: ((e: HelixCarouselHelixSelectElementEvent) => void) | undefined;
2831
2831
  };
2832
2832
 
@@ -3056,7 +3056,7 @@ its attribute on upgrade, and the host then carries something a consumer's
3056
3056
  server markup never had, which React reports as a mismatch. The one-across
3057
3057
  case is the absent attribute, and the styles read it that way. */
3058
3058
  "prop:perView"?: (HelixCarousel["perView"]) | undefined;
3059
- /** Fired when the slide in view changes, with its index. Cancelable where the carousel is about to move: refusing a control or an indicator takes the decision and nothing moves. A drag has already moved the track, so that one announces after the fact and refusing it does nothing. See `handleScroll`. */
3059
+ /** Fired before the slide in view changes, with the index being asked for. Cancelable: refusing it takes the decision and nothing moves, including a drag, which is put back on the slide the index still holds. See `handleScroll`. */
3060
3060
  "on:helix-select"?: ((e: HelixCarouselHelixSelectElementEvent) => void) | undefined;
3061
3061
 
3062
3062
  /** Set the innerHTML of the element */
@@ -3211,10 +3211,13 @@ Reflected, because every one of the four is a visual state and a stylesheet
3211
3211
  has no other way to know. Absent is a settled message with nothing to
3212
3212
  report, which is what most of a transcript is, and it is the absence of the
3213
3213
  attribute rather than a value of it: there is no initializer, so nothing is
3214
- reflected until something happens. */
3214
+ reflected until something happens.
3215
+
3216
+ **The turn writes this once, on a retry nobody refused**, and `handleRetry`
3217
+ holds the reason. Everything else that moves it is the consumer's. */
3215
3218
  state?: (HelixChatMessage["state"]) | undefined;
3216
3219
 
3217
- /** Fired when the reader asks to send a failed message again, and cancelable. */
3220
+ /** Fired when the reader asks to send a failed message again. Cancelable: a retry that stands puts the turn back on its way, and refusing it leaves the failure and the control offering it exactly where they were. */
3218
3221
  "onhelix-send"?: ((e: HelixChatMessageHelixSendElementEvent) => void) | undefined;
3219
3222
  };
3220
3223
 
@@ -3270,9 +3273,12 @@ Reflected, because every one of the four is a visual state and a stylesheet
3270
3273
  has no other way to know. Absent is a settled message with nothing to
3271
3274
  report, which is what most of a transcript is, and it is the absence of the
3272
3275
  attribute rather than a value of it: there is no initializer, so nothing is
3273
- reflected until something happens. */
3276
+ reflected until something happens.
3277
+
3278
+ **The turn writes this once, on a retry nobody refused**, and `handleRetry`
3279
+ holds the reason. Everything else that moves it is the consumer's. */
3274
3280
  "prop:state"?: (HelixChatMessage["state"]) | undefined;
3275
- /** Fired when the reader asks to send a failed message again, and cancelable. */
3281
+ /** Fired when the reader asks to send a failed message again. Cancelable: a retry that stands puts the turn back on its way, and refusing it leaves the failure and the control offering it exactly where they were. */
3276
3282
  "on:helix-send"?: ((e: HelixChatMessageHelixSendElementEvent) => void) | undefined;
3277
3283
 
3278
3284
  /** Set the innerHTML of the element */
@@ -7558,7 +7564,7 @@ Here rather than on each control. */
7558
7564
 
7559
7565
  /** Announced once the value has moved. */
7560
7566
  onchange?: ((e: HelixFileInputElementEvent) => void) | undefined;
7561
- /** Fired before the chosen files change, with their names. Cancelable: refusing it takes the decision and nothing moves. */
7567
+ /** Fired before the chosen files change, with their names. Cancelable: refusing it takes the decision and the field keeps the files it had, a pick the browser has already written included. */
7562
7568
  "onhelix-before-change"?: ((
7563
7569
  e: HelixFileInputHelixBeforeChangeElementEvent,
7564
7570
  ) => void) | undefined;
@@ -7621,7 +7627,7 @@ Here rather than on each control. */
7621
7627
  "prop:name"?: (HelixFileInput["name"]) | undefined;
7622
7628
  /** Announced once the value has moved. */
7623
7629
  "on:change"?: ((e: HelixFileInputElementEvent) => void) | undefined;
7624
- /** Fired before the chosen files change, with their names. Cancelable: refusing it takes the decision and nothing moves. */
7630
+ /** Fired before the chosen files change, with their names. Cancelable: refusing it takes the decision and the field keeps the files it had, a pick the browser has already written included. */
7625
7631
  "on:helix-before-change"?: ((
7626
7632
  e: HelixFileInputHelixBeforeChangeElementEvent,
7627
7633
  ) => void) | undefined;
@@ -13636,6 +13642,21 @@ name is the fault `TreeItem` avoids by mirroring to `data-selected`.
13636
13642
  Splitting them means moving what every stylesheet selects on, which is a
13637
13643
  change of its own rather than a property being added. */
13638
13644
  defaultSelected?: (HelixRadio["defaultSelected"]) | undefined;
13645
+ /** Whether this choice holds the group's tab stop while nothing is chosen.
13646
+
13647
+ The stop rides on the selection, and an unanswered group has no selection,
13648
+ so without this every choice is `tabindex="-1"` and the keyboard cannot
13649
+ enter the set at all.
13650
+
13651
+ **Written by the group, with no attribute, and it reaches the control
13652
+ rather than the host.** A `tabindex` on the host is two faults at once: it
13653
+ is markup a consumer rendered and their server never sent, which React
13654
+ reports as a mismatch and does not patch up, and it puts the tab stop on
13655
+ the element rather than on the `<button role="radio">` inside it, so a
13656
+ screen reader meets an unnamed box where a native group would have given
13657
+ them an unchecked radio. `Toggle.Root` carries the same property for the
13658
+ same reason. */
13659
+ focusable?: (HelixRadio["focusable"]) | undefined;
13639
13660
 
13640
13661
  /** Fired when this choice is made. Cancelable: refusing it takes the decision and nothing moves. */
13641
13662
  "onhelix-select"?: ((e: HelixRadioHelixSelectElementEvent) => void) | undefined;
@@ -13726,6 +13747,21 @@ name is the fault `TreeItem` avoids by mirroring to `data-selected`.
13726
13747
  Splitting them means moving what every stylesheet selects on, which is a
13727
13748
  change of its own rather than a property being added. */
13728
13749
  "prop:defaultSelected"?: (HelixRadio["defaultSelected"]) | undefined;
13750
+ /** Whether this choice holds the group's tab stop while nothing is chosen.
13751
+
13752
+ The stop rides on the selection, and an unanswered group has no selection,
13753
+ so without this every choice is `tabindex="-1"` and the keyboard cannot
13754
+ enter the set at all.
13755
+
13756
+ **Written by the group, with no attribute, and it reaches the control
13757
+ rather than the host.** A `tabindex` on the host is two faults at once: it
13758
+ is markup a consumer rendered and their server never sent, which React
13759
+ reports as a mismatch and does not patch up, and it puts the tab stop on
13760
+ the element rather than on the `<button role="radio">` inside it, so a
13761
+ screen reader meets an unnamed box where a native group would have given
13762
+ them an unchecked radio. `Toggle.Root` carries the same property for the
13763
+ same reason. */
13764
+ "prop:focusable"?: (HelixRadio["focusable"]) | undefined;
13729
13765
  /** Fired when this choice is made. Cancelable: refusing it takes the decision and nothing moves. */
13730
13766
  "on:helix-select"?: ((e: HelixRadioHelixSelectElementEvent) => void) | undefined;
13731
13767
 
@@ -14066,11 +14102,26 @@ keyed on this attribute, and of the 56 tokens that differ by scheme the
14066
14102
  theme engine emits 19. The other 37 would stay light in a dark preview,
14067
14103
  including every one of the 24 series colors a chart reads. */
14068
14104
  colorMode?: (HelixSandboxPreview["colorMode"]) | undefined;
14069
- /** Writing direction inside the frame. */
14105
+ /** Writing direction inside the frame.
14106
+
14107
+ Not reflected. It is payload for the render message and nothing selects on
14108
+ it, here or anywhere: a frame is a document of its own and what is written
14109
+ on this host reaches nothing inside it, which is the same reason
14110
+ `colorMode` has to be sent rather than set. */
14070
14111
  direction?: (HelixSandboxPreview["direction"]) | undefined;
14071
14112
  /** Accessible name for the frame. */
14072
14113
  label?: (HelixSandboxPreview["label"]) | undefined;
14073
- /** How the example is placed in the frame. */
14114
+ /** How the example is placed in the frame.
14115
+
14116
+ `padded` insets it and leaves it at the top, which is the resting case and
14117
+ what an absent value sends. `centered` gives it a measure and centers that
14118
+ box in the frame. `hug` shrinks the example to its own content and centers
14119
+ what is left, which is the difference that matters for a component whose
14120
+ root is a full-width block. `fullscreen` is the whole frame with no inset.
14121
+
14122
+ Not reflected, for `direction`'s reason: the placement is applied by the
14123
+ document inside the frame, against its own root, so no rule on this side
14124
+ could read it. */
14074
14125
  layout?: (HelixSandboxPreview["layout"]) | undefined;
14075
14126
  /** Markup to render. */
14076
14127
  source?: (HelixSandboxPreview["source"]) | undefined;
@@ -14114,11 +14165,26 @@ keyed on this attribute, and of the 56 tokens that differ by scheme the
14114
14165
  theme engine emits 19. The other 37 would stay light in a dark preview,
14115
14166
  including every one of the 24 series colors a chart reads. */
14116
14167
  "prop:colorMode"?: (HelixSandboxPreview["colorMode"]) | undefined;
14117
- /** Writing direction inside the frame. */
14168
+ /** Writing direction inside the frame.
14169
+
14170
+ Not reflected. It is payload for the render message and nothing selects on
14171
+ it, here or anywhere: a frame is a document of its own and what is written
14172
+ on this host reaches nothing inside it, which is the same reason
14173
+ `colorMode` has to be sent rather than set. */
14118
14174
  "prop:direction"?: (HelixSandboxPreview["direction"]) | undefined;
14119
14175
  /** Accessible name for the frame. */
14120
14176
  "prop:label"?: (HelixSandboxPreview["label"]) | undefined;
14121
- /** How the example is placed in the frame. */
14177
+ /** How the example is placed in the frame.
14178
+
14179
+ `padded` insets it and leaves it at the top, which is the resting case and
14180
+ what an absent value sends. `centered` gives it a measure and centers that
14181
+ box in the frame. `hug` shrinks the example to its own content and centers
14182
+ what is left, which is the difference that matters for a component whose
14183
+ root is a full-width block. `fullscreen` is the whole frame with no inset.
14184
+
14185
+ Not reflected, for `direction`'s reason: the placement is applied by the
14186
+ document inside the frame, against its own root, so no rule on this side
14187
+ could read it. */
14122
14188
  "prop:layout"?: (HelixSandboxPreview["layout"]) | undefined;
14123
14189
  /** Markup to render. */
14124
14190
  "prop:source"?: (HelixSandboxPreview["source"]) | undefined;
@@ -14211,7 +14277,12 @@ names below keeps that true whichever way round they sit.
14211
14277
  `split` follows the lead pane rather than the source, so `split="30"` means
14212
14278
  the same thing in both directions: thirty percent to whatever comes first. */
14213
14279
  lead?: (HelixSandbox["lead"]) | undefined;
14214
- /** Whether the panes sit side by side or stacked. */
14280
+ /** Whether the panes sit side by side or stacked.
14281
+
14282
+ Not reflected, for `lead`'s reason above: no rule selects on it. The axis
14283
+ reaches the stylesheet as the inner splitter's own `orientation`, which is
14284
+ where the panes are laid out, and this element's sheet names no host
14285
+ attribute at all. */
14215
14286
  orientation?: (HelixSandbox["orientation"]) | undefined;
14216
14287
  /** What the panel's height becomes when it is closed.
14217
14288
 
@@ -14311,7 +14382,12 @@ names below keeps that true whichever way round they sit.
14311
14382
  `split` follows the lead pane rather than the source, so `split="30"` means
14312
14383
  the same thing in both directions: thirty percent to whatever comes first. */
14313
14384
  "prop:lead"?: (HelixSandbox["lead"]) | undefined;
14314
- /** Whether the panes sit side by side or stacked. */
14385
+ /** Whether the panes sit side by side or stacked.
14386
+
14387
+ Not reflected, for `lead`'s reason above: no rule selects on it. The axis
14388
+ reaches the stylesheet as the inner splitter's own `orientation`, which is
14389
+ where the panes are laid out, and this element's sheet names no host
14390
+ attribute at all. */
14315
14391
  "prop:orientation"?: (HelixSandbox["orientation"]) | undefined;
14316
14392
  /** What the panel's height becomes when it is closed.
14317
14393
 
@@ -22590,7 +22666,7 @@ export type CustomElements = {
22590
22666
  *
22591
22667
  * Events that will be emitted by the component.
22592
22668
  *
22593
- * - `helix-select`: Fired when the slide in view changes, with its index. Cancelable where the carousel is about to move: refusing a control or an indicator takes the decision and nothing moves. A drag has already moved the track, so that one announces after the fact and refusing it does nothing. See `handleScroll`.
22669
+ * - `helix-select`: Fired before the slide in view changes, with the index being asked for. Cancelable: refusing it takes the decision and nothing moves, including a drag, which is put back on the slide the index still holds. See `handleScroll`.
22594
22670
  *
22595
22671
  * ## Slots
22596
22672
  *
@@ -22793,6 +22869,9 @@ export type CustomElements = {
22793
22869
  * report, which is what most of a transcript is, and it is the absence of the
22794
22870
  * attribute rather than a value of it: there is no initializer, so nothing is
22795
22871
  * reflected until something happens.
22872
+ *
22873
+ * **The turn writes this once, on a retry nobody refused**, and `handleRetry`
22874
+ * holds the reason. Everything else that moves it is the consumer's.
22796
22875
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
22797
22876
  *
22798
22877
  * **Named `whenSettled` because `settled` is taken four times over**, by
@@ -22818,7 +22897,7 @@ export type CustomElements = {
22818
22897
  *
22819
22898
  * Events that will be emitted by the component.
22820
22899
  *
22821
- * - `helix-send`: Fired when the reader asks to send a failed message again, and cancelable.
22900
+ * - `helix-send`: Fired when the reader asks to send a failed message again. Cancelable: a retry that stands puts the turn back on its way, and refusing it leaves the failure and the control offering it exactly where they were.
22822
22901
  *
22823
22902
  * ## Slots
22824
22903
  *
@@ -26750,7 +26829,7 @@ export type CustomElements = {
26750
26829
  * Events that will be emitted by the component.
26751
26830
  *
26752
26831
  * - `change`: Announced once the value has moved.
26753
- * - `helix-before-change`: Fired before the chosen files change, with their names. Cancelable: refusing it takes the decision and nothing moves.
26832
+ * - `helix-before-change`: Fired before the chosen files change, with their names. Cancelable: refusing it takes the decision and the field keeps the files it had, a pick the browser has already written included.
26754
26833
  * - `input`: Announced once the value has moved.
26755
26834
  *
26756
26835
  * ## Slots
@@ -26781,6 +26860,11 @@ export type CustomElements = {
26781
26860
  * picker come back out the same way.
26782
26861
  * - `focus(options?: FocusOptions) => void`: Puts focus on the input, the way a label pointing at one would.
26783
26862
  * - `formResetCallback() => void`: Empties it, which is what a form reset means for a file input.
26863
+ *
26864
+ * Not through `commit`, and that is the point of the split: a reset is the
26865
+ * form's decision and there is nothing here for a listener to refuse. What it
26866
+ * owes is the report and the platform's own announcement, which is what
26867
+ * `settle` is.
26784
26868
  * - `formDisabledCallback(disabled: boolean) => void`: The platform's notice that an ancestor fieldset changed.
26785
26869
  *
26786
26870
  * **The argument is the effective state, and taking it whole is what latched
@@ -32824,6 +32908,20 @@ export type CustomElements = {
32824
32908
  * name is the fault `TreeItem` avoids by mirroring to `data-selected`.
32825
32909
  * Splitting them means moving what every stylesheet selects on, which is a
32826
32910
  * change of its own rather than a property being added. (property only)
32911
+ * - `focusable`: Whether this choice holds the group's tab stop while nothing is chosen.
32912
+ *
32913
+ * The stop rides on the selection, and an unanswered group has no selection,
32914
+ * so without this every choice is `tabindex="-1"` and the keyboard cannot
32915
+ * enter the set at all.
32916
+ *
32917
+ * **Written by the group, with no attribute, and it reaches the control
32918
+ * rather than the host.** A `tabindex` on the host is two faults at once: it
32919
+ * is markup a consumer rendered and their server never sent, which React
32920
+ * reports as a mismatch and does not patch up, and it puts the tab stop on
32921
+ * the element rather than on the `<button role="radio">` inside it, so a
32922
+ * screen reader meets an unnamed box where a native group would have given
32923
+ * them an unchecked radio. `Toggle.Root` carries the same property for the
32924
+ * same reason. (property only)
32827
32925
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
32828
32926
  *
32829
32927
  * **Named `whenSettled` because `settled` is taken four times over**, by
@@ -33158,8 +33256,23 @@ export type CustomElements = {
33158
33256
  * theme engine emits 19. The other 37 would stay light in a dark preview,
33159
33257
  * including every one of the 24 series colors a chart reads.
33160
33258
  * - `direction`: Writing direction inside the frame.
33259
+ *
33260
+ * Not reflected. It is payload for the render message and nothing selects on
33261
+ * it, here or anywhere: a frame is a document of its own and what is written
33262
+ * on this host reaches nothing inside it, which is the same reason
33263
+ * `colorMode` has to be sent rather than set.
33161
33264
  * - `label`: Accessible name for the frame.
33162
33265
  * - `layout`: How the example is placed in the frame.
33266
+ *
33267
+ * `padded` insets it and leaves it at the top, which is the resting case and
33268
+ * what an absent value sends. `centered` gives it a measure and centers that
33269
+ * box in the frame. `hug` shrinks the example to its own content and centers
33270
+ * what is left, which is the difference that matters for a component whose
33271
+ * root is a full-width block. `fullscreen` is the whole frame with no inset.
33272
+ *
33273
+ * Not reflected, for `direction`'s reason: the placement is applied by the
33274
+ * document inside the frame, against its own root, so no rule on this side
33275
+ * could read it.
33163
33276
  * - `source`: Markup to render.
33164
33277
  * - `src`: Document the frame loads, which brings the styles and the elements.
33165
33278
  * - `styles`: Stylesheet applied inside the frame, alongside the markup.
@@ -33275,6 +33388,11 @@ export type CustomElements = {
33275
33388
  * `split` follows the lead pane rather than the source, so `split="30"` means
33276
33389
  * the same thing in both directions: thirty percent to whatever comes first.
33277
33390
  * - `orientation`: Whether the panes sit side by side or stacked.
33391
+ *
33392
+ * Not reflected, for `lead`'s reason above: no rule selects on it. The axis
33393
+ * reaches the stylesheet as the inner splitter's own `orientation`, which is
33394
+ * where the panes are laid out, and this element's sheet names no host
33395
+ * attribute at all.
33278
33396
  * - `panel-collapsed-size`/`panelCollapsedSize`: What the panel's height becomes when it is closed.
33279
33397
  *
33280
33398
  * Zero closes it outright. A panel whose contents include the control that
@@ -41856,7 +41974,7 @@ export type CustomElementsSolidJs = {
41856
41974
  *
41857
41975
  * Events that will be emitted by the component.
41858
41976
  *
41859
- * - `helix-select`: Fired when the slide in view changes, with its index. Cancelable where the carousel is about to move: refusing a control or an indicator takes the decision and nothing moves. A drag has already moved the track, so that one announces after the fact and refusing it does nothing. See `handleScroll`.
41977
+ * - `helix-select`: Fired before the slide in view changes, with the index being asked for. Cancelable: refusing it takes the decision and nothing moves, including a drag, which is put back on the slide the index still holds. See `handleScroll`.
41860
41978
  *
41861
41979
  * ## Slots
41862
41980
  *
@@ -42065,6 +42183,9 @@ export type CustomElementsSolidJs = {
42065
42183
  * report, which is what most of a transcript is, and it is the absence of the
42066
42184
  * attribute rather than a value of it: there is no initializer, so nothing is
42067
42185
  * reflected until something happens.
42186
+ *
42187
+ * **The turn writes this once, on a retry nobody refused**, and `handleRetry`
42188
+ * holds the reason. Everything else that moves it is the consumer's.
42068
42189
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
42069
42190
  *
42070
42191
  * **Named `whenSettled` because `settled` is taken four times over**, by
@@ -42090,7 +42211,7 @@ export type CustomElementsSolidJs = {
42090
42211
  *
42091
42212
  * Events that will be emitted by the component.
42092
42213
  *
42093
- * - `helix-send`: Fired when the reader asks to send a failed message again, and cancelable.
42214
+ * - `helix-send`: Fired when the reader asks to send a failed message again. Cancelable: a retry that stands puts the turn back on its way, and refusing it leaves the failure and the control offering it exactly where they were.
42094
42215
  *
42095
42216
  * ## Slots
42096
42217
  *
@@ -46089,7 +46210,7 @@ export type CustomElementsSolidJs = {
46089
46210
  * Events that will be emitted by the component.
46090
46211
  *
46091
46212
  * - `change`: Announced once the value has moved.
46092
- * - `helix-before-change`: Fired before the chosen files change, with their names. Cancelable: refusing it takes the decision and nothing moves.
46213
+ * - `helix-before-change`: Fired before the chosen files change, with their names. Cancelable: refusing it takes the decision and the field keeps the files it had, a pick the browser has already written included.
46093
46214
  * - `input`: Announced once the value has moved.
46094
46215
  *
46095
46216
  * ## Slots
@@ -46120,6 +46241,11 @@ export type CustomElementsSolidJs = {
46120
46241
  * picker come back out the same way.
46121
46242
  * - `focus(options?: FocusOptions) => void`: Puts focus on the input, the way a label pointing at one would.
46122
46243
  * - `formResetCallback() => void`: Empties it, which is what a form reset means for a file input.
46244
+ *
46245
+ * Not through `commit`, and that is the point of the split: a reset is the
46246
+ * form's decision and there is nothing here for a listener to refuse. What it
46247
+ * owes is the report and the platform's own announcement, which is what
46248
+ * `settle` is.
46123
46249
  * - `formDisabledCallback(disabled: boolean) => void`: The platform's notice that an ancestor fieldset changed.
46124
46250
  *
46125
46251
  * **The argument is the effective state, and taking it whole is what latched
@@ -52296,6 +52422,20 @@ export type CustomElementsSolidJs = {
52296
52422
  * name is the fault `TreeItem` avoids by mirroring to `data-selected`.
52297
52423
  * Splitting them means moving what every stylesheet selects on, which is a
52298
52424
  * change of its own rather than a property being added. (property only)
52425
+ * - `focusable`: Whether this choice holds the group's tab stop while nothing is chosen.
52426
+ *
52427
+ * The stop rides on the selection, and an unanswered group has no selection,
52428
+ * so without this every choice is `tabindex="-1"` and the keyboard cannot
52429
+ * enter the set at all.
52430
+ *
52431
+ * **Written by the group, with no attribute, and it reaches the control
52432
+ * rather than the host.** A `tabindex` on the host is two faults at once: it
52433
+ * is markup a consumer rendered and their server never sent, which React
52434
+ * reports as a mismatch and does not patch up, and it puts the tab stop on
52435
+ * the element rather than on the `<button role="radio">` inside it, so a
52436
+ * screen reader meets an unnamed box where a native group would have given
52437
+ * them an unchecked radio. `Toggle.Root` carries the same property for the
52438
+ * same reason. (property only)
52299
52439
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
52300
52440
  *
52301
52441
  * **Named `whenSettled` because `settled` is taken four times over**, by
@@ -52638,8 +52778,23 @@ export type CustomElementsSolidJs = {
52638
52778
  * theme engine emits 19. The other 37 would stay light in a dark preview,
52639
52779
  * including every one of the 24 series colors a chart reads.
52640
52780
  * - `direction`: Writing direction inside the frame.
52781
+ *
52782
+ * Not reflected. It is payload for the render message and nothing selects on
52783
+ * it, here or anywhere: a frame is a document of its own and what is written
52784
+ * on this host reaches nothing inside it, which is the same reason
52785
+ * `colorMode` has to be sent rather than set.
52641
52786
  * - `label`: Accessible name for the frame.
52642
52787
  * - `layout`: How the example is placed in the frame.
52788
+ *
52789
+ * `padded` insets it and leaves it at the top, which is the resting case and
52790
+ * what an absent value sends. `centered` gives it a measure and centers that
52791
+ * box in the frame. `hug` shrinks the example to its own content and centers
52792
+ * what is left, which is the difference that matters for a component whose
52793
+ * root is a full-width block. `fullscreen` is the whole frame with no inset.
52794
+ *
52795
+ * Not reflected, for `direction`'s reason: the placement is applied by the
52796
+ * document inside the frame, against its own root, so no rule on this side
52797
+ * could read it.
52643
52798
  * - `source`: Markup to render.
52644
52799
  * - `src`: Document the frame loads, which brings the styles and the elements.
52645
52800
  * - `styles`: Stylesheet applied inside the frame, alongside the markup.
@@ -52758,6 +52913,11 @@ export type CustomElementsSolidJs = {
52758
52913
  * `split` follows the lead pane rather than the source, so `split="30"` means
52759
52914
  * the same thing in both directions: thirty percent to whatever comes first.
52760
52915
  * - `orientation`: Whether the panes sit side by side or stacked.
52916
+ *
52917
+ * Not reflected, for `lead`'s reason above: no rule selects on it. The axis
52918
+ * reaches the stylesheet as the inner splitter's own `orientation`, which is
52919
+ * where the panes are laid out, and this element's sheet names no host
52920
+ * attribute at all.
52761
52921
  * - `panel-collapsed-size`/`panelCollapsedSize`: What the panel's height becomes when it is closed.
52762
52922
  *
52763
52923
  * Zero closes it outright. A panel whose contents include the control that