@fusion.dev/helix 0.33.3 → 0.33.5

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.
@@ -4025,7 +4025,7 @@
4025
4025
  "declarations": [
4026
4026
  {
4027
4027
  "kind": "class",
4028
- "description": "One fragment shader over a full-screen triangle, with the palette read from\nthe tokens rather than given as colors. A background written with hex values\nis an asset that has to be re-cut when the brand moves; one written against\n`--helix-color-primary` is a consequence of it.\n\n**Every shape ramps through four token stops**, and the token layer inverts\neach: the page's background, `primary-subtle`, `primary`, then a peak. The\npeak is the foreground on a dark page and `primary-active` on a light one,\nbecause mixing a saturated hue toward near-black takes the chroma out of the\npixels carrying most of it. Which way the page runs is read off the ground's\nown luminance rather than asked of the mode, which is a private token.\n\n**No dependency, and no scene graph.** The geometry is three vertices derived\nfrom `gl_VertexID`, so there is no attribute, no buffer and no upload.\n\n**It stops when nobody is looking**, off screen and in a background tab, and\n`prefers-reduced-motion` gets one still frame rather than an empty box. A\ncontext the browser takes back, on a GPU reset or past its cap of about\nsixteen, stops it too, and the gradient shows until the context returns.\n\nStyled only, and with behavior, which the tier split does not otherwise\nallow: the behavior is drawing to a canvas, so there is no structure a\nconsumer could restyle and nothing for a headless twin to hold.",
4028
+ "description": "One fragment shader over a full-screen triangle, with the palette read from\nthe tokens rather than given as colors. A background written with hex values\nis an asset that has to be re-cut when the brand moves; one written against\n`--helix-color-primary` is a consequence of it.\n\n**Every shape ramps through four token stops**, and the token layer inverts\neach: the page's background, `primary-subtle`, `primary`, then a peak. The\npeak is the foreground on a dark page and `primary-active` on a light one,\nbecause mixing a saturated hue toward near-black takes the chroma out of the\npixels carrying most of it. Which way the page runs is read off the ground's\nown luminance rather than asked of the mode, which is a private token.\n\n**No dependency, and no scene graph.** The geometry is three vertices derived\nfrom `gl_VertexID`, so there is no attribute, no buffer and no upload.\n\n**It stops when nobody is looking**, off screen and in a background tab, and\n`prefers-reduced-motion` gets one still frame rather than an empty box. A\ncontext the browser takes back, on a GPU reset or past its cap of about\nsixteen, stops it too, and the gradient shows until the context returns.\n\n**It declines a renderer that draws on the CPU**, which is a headless browser\nand a machine with no usable GPU, and shows the gradient instead. The shader\ncosts about 450ms of first frame per element there against 2ms on a GPU, for\na field drawn from the same tokens the gradient already ramps.\n\nStyled only, and with behavior, which the tier split does not otherwise\nallow: the behavior is drawing to a canvas, so there is no structure a\nconsumer could restyle and nothing for a headless twin to hold.",
4029
4029
  "name": "HelixAura",
4030
4030
  "cssParts": [
4031
4031
  {
@@ -4414,6 +4414,18 @@
4414
4414
  }
4415
4415
  }
4416
4416
  },
4417
+ {
4418
+ "kind": "method",
4419
+ "name": "drawsInSoftware",
4420
+ "privacy": "private",
4421
+ "static": true,
4422
+ "return": {
4423
+ "type": {
4424
+ "text": "boolean"
4425
+ }
4426
+ },
4427
+ "description": "Whether WebGL here is drawn on the CPU, asked before one is drawn into.\n\n**The shader costs what a GPU makes it cheap to ask for.** The note at the\ntop of this file measures it: on Metal the browser shares the compiled\nprogram and each aura after the first draws its opening frame in about 2ms,\nwhile under SwiftShader nothing is shared and each one compiles the pipeline\nagain for about 450ms. Measured again 15 Sep 2026 on a page of 720 pixel\nauras, SwiftShader against the same page with this check in place: the worst\nframe gap went 568ms to 50ms with one aura, 1626ms to 34ms with three and\n3200ms to 42ms with six, and a page of three or six ran at 13 frames a\nsecond before and at the display's own rate after. What that buys is a field\na reader barely sees behind content, against a gradient ramped from the same\ntokens. So the software path takes the fallback.\n\n**The unmasked name is the only one that answers.** `gl.RENDERER` is masked\nto `WebKit WebGL` on Chromium, the same string on SwiftShader and on Metal,\nand `WEBGL_debug_renderer_info` is what lifts the mask.\n\n**An unreadable renderer draws**, which is the safe direction and not the\ntidy one. The extension is optional and is withheld deliberately: Firefox's\n`privacy.resistFingerprinting` and Safari's equivalent both drop it, and a\nbrowser may drop it at any time, since a GPU name is a fingerprinting\nsurface. Treating \"we cannot tell\" as software would take the shader away\nfrom every reader on a machine that hides its hardware, which is a real GPU\nfar more often than not. Treating it as hardware costs a machine that hides\na software renderer the 450ms, which is the cost the component has today.\n\n**A probe context of its own, and given straight back.** Asking the\nelement's own canvas would spend it: `build` below is written around a\ncanvas whose context was force-lost never yielding a working one again, and\nthe probe has to release what it took or a page of auras runs the browser\ninto its cap of about sixteen. One pixel by one, and released through\n`WEBGL_lose_context` the same way `drop` does.\n\n**The same attributes the real context asks for**, because they are part of\nthe question: `powerPreference` can select a different adapter, so a probe\nasking for a high-performance context would name a GPU the drawing one is\nnever given.\n\n**Asked per context rather than once for the page.** The answer is not\nfixed: a GPU process that crashes takes the page down to SwiftShader for\nthe rest of its life, and an aura rebuilding after that should get the\ncurrent answer rather than the one from before. It costs a context creation\nand two calls, measured 15 Sep 2026 at about 2ms under SwiftShader and 2ms\non Metal, against the 450ms and 135ms first draws it stands in front of, and\nit happens once per context rather than once per frame."
4428
+ },
4417
4429
  {
4418
4430
  "kind": "method",
4419
4431
  "name": "build",
@@ -13142,8 +13154,28 @@
13142
13154
  "name": "--carousel-block-size"
13143
13155
  },
13144
13156
  {
13145
- "description": "Space between slides.",
13146
- "name": "--carousel-gap"
13157
+ "description": "Space between slides. A sheet sets it and the component measures the run with it.",
13158
+ "name": "--carousel-gap",
13159
+ "inheritedFrom": {
13160
+ "name": "HelixHeadlessCarousel",
13161
+ "module": "src/carousel/root/carousel-root.ts"
13162
+ }
13163
+ },
13164
+ {
13165
+ "description": "The size one pane is laid out at. A sheet sets it and the component measures the run with it.",
13166
+ "name": "--carousel-pane",
13167
+ "inheritedFrom": {
13168
+ "name": "HelixHeadlessCarousel",
13169
+ "module": "src/carousel/root/carousel-root.ts"
13170
+ }
13171
+ },
13172
+ {
13173
+ "description": "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`.",
13174
+ "name": "--carousel-run-end",
13175
+ "inheritedFrom": {
13176
+ "name": "HelixHeadlessCarousel",
13177
+ "module": "src/carousel/root/carousel-root.ts"
13178
+ }
13147
13179
  }
13148
13180
  ],
13149
13181
  "members": [
@@ -13714,6 +13746,21 @@
13714
13746
  "module": "src/carousel/root/carousel-root.ts"
13715
13747
  }
13716
13748
  },
13749
+ {
13750
+ "kind": "method",
13751
+ "name": "runEnd",
13752
+ "privacy": "private",
13753
+ "return": {
13754
+ "type": {
13755
+ "text": "string | typeof nothing"
13756
+ }
13757
+ },
13758
+ "description": "How far short of a whole pixel the run of slides ends, for the last one.\n\n**The run has to end on a whole pixel, because a right-to-left track cannot\nreach a fraction.** Three across 692 makes the run 450.66 longer than the\ntrack. Chromium measures a right-to-left scroller from its far end and\nfloors that length, so the track stops at -450 where a left-to-right one\nrounds to 451, and two thirds of a pixel of the slide before stays at the\nleading edge. Ending on a whole pixel, the far end is one number both ways\nand the last place rests on it in both, so a swipe to the end stops there\ntoo.\n\n**Here rather than in a stylesheet, because the count is the component's.**\nThe arithmetic wants how many slides there are, and CSS can only ask\n`sibling-count()`, which is Chromium-only, evaluates to 0 through\n`::part()`, and needs a `:last-child` that `::part()` cannot carry either.\nSo the styled tier could correct its run and a consumer writing their own\nseveral-across sheet could not: measured in Chromium at three across, the\nheadless tier rested at 451 against -450 while the styled tier rested at\none number both ways. Published from here, one declaration reading this\ngets both tiers and any consumer to the same place.\n\n**WebKit takes the margin and does not need it**, which is the reason a\ncorrection written in CSS looked like enough. It has no `sibling-count()`\nat all, so nothing reached that engine, and its track rested on one number\nboth ways anyway. Measured with the margin in place, the same widths:\nevery resting place is the number it was without it.\n\n**On the last slide alone, which is what makes that one declaration\nenough.** A sheet writes `margin-inline-end: var(--carousel-run-end, 0px)`\nacross every pane and the fallback answers on all but the last, so nothing\nhas to select a slide by its position in the run.\n\n**A sheet says how wide a pane is and how far apart they sit, and this\nreads both back.** Set neither and the correction is invalid at\ncomputed-value time, which is the fallback rather than a broken margin. The\npercentage resolves where the value is used, on the last pane, so it is the\ntrack's content box and not the track's own containing block: the width the\nrun is actually measured against.\n\nHorizontal only. A vertical track scrolls the other axis, `scrollTop`\ncounts up from zero whatever the writing mode, and there is no far end to\nfloor.",
13759
+ "inheritedFrom": {
13760
+ "name": "HelixHeadlessCarousel",
13761
+ "module": "src/carousel/root/carousel-root.ts"
13762
+ }
13763
+ },
13717
13764
  {
13718
13765
  "kind": "field",
13719
13766
  "name": "tier",
@@ -24,6 +24,11 @@ import type { CSSResultGroup, PropertyValues, TemplateResult } from 'lit';
24
24
  * context the browser takes back, on a GPU reset or past its cap of about
25
25
  * sixteen, stops it too, and the gradient shows until the context returns.
26
26
  *
27
+ * **It declines a renderer that draws on the CPU**, which is a headless browser
28
+ * and a machine with no usable GPU, and shows the gradient instead. The shader
29
+ * costs about 450ms of first frame per element there against 2ms on a GPU, for
30
+ * a field drawn from the same tokens the gradient already ramps.
31
+ *
27
32
  * Styled only, and with behavior, which the tier split does not otherwise
28
33
  * allow: the behavior is drawing to a canvas, so there is no structure a
29
34
  * consumer could restyle and nothing for a headless twin to hold.
@@ -274,6 +279,55 @@ export declare class HelixAura extends HelixElement {
274
279
  protected render(): TemplateResult;
275
280
  protected firstUpdated(changed: PropertyValues): void;
276
281
  private start;
282
+ /**
283
+ * Whether WebGL here is drawn on the CPU, asked before one is drawn into.
284
+ *
285
+ * **The shader costs what a GPU makes it cheap to ask for.** The note at the
286
+ * top of this file measures it: on Metal the browser shares the compiled
287
+ * program and each aura after the first draws its opening frame in about 2ms,
288
+ * while under SwiftShader nothing is shared and each one compiles the pipeline
289
+ * again for about 450ms. Measured again 15 Sep 2026 on a page of 720 pixel
290
+ * auras, SwiftShader against the same page with this check in place: the worst
291
+ * frame gap went 568ms to 50ms with one aura, 1626ms to 34ms with three and
292
+ * 3200ms to 42ms with six, and a page of three or six ran at 13 frames a
293
+ * second before and at the display's own rate after. What that buys is a field
294
+ * a reader barely sees behind content, against a gradient ramped from the same
295
+ * tokens. So the software path takes the fallback.
296
+ *
297
+ * **The unmasked name is the only one that answers.** `gl.RENDERER` is masked
298
+ * to `WebKit WebGL` on Chromium, the same string on SwiftShader and on Metal,
299
+ * and `WEBGL_debug_renderer_info` is what lifts the mask.
300
+ *
301
+ * **An unreadable renderer draws**, which is the safe direction and not the
302
+ * tidy one. The extension is optional and is withheld deliberately: Firefox's
303
+ * `privacy.resistFingerprinting` and Safari's equivalent both drop it, and a
304
+ * browser may drop it at any time, since a GPU name is a fingerprinting
305
+ * surface. Treating "we cannot tell" as software would take the shader away
306
+ * from every reader on a machine that hides its hardware, which is a real GPU
307
+ * far more often than not. Treating it as hardware costs a machine that hides
308
+ * a software renderer the 450ms, which is the cost the component has today.
309
+ *
310
+ * **A probe context of its own, and given straight back.** Asking the
311
+ * element's own canvas would spend it: `build` below is written around a
312
+ * canvas whose context was force-lost never yielding a working one again, and
313
+ * the probe has to release what it took or a page of auras runs the browser
314
+ * into its cap of about sixteen. One pixel by one, and released through
315
+ * `WEBGL_lose_context` the same way `drop` does.
316
+ *
317
+ * **The same attributes the real context asks for**, because they are part of
318
+ * the question: `powerPreference` can select a different adapter, so a probe
319
+ * asking for a high-performance context would name a GPU the drawing one is
320
+ * never given.
321
+ *
322
+ * **Asked per context rather than once for the page.** The answer is not
323
+ * fixed: a GPU process that crashes takes the page down to SwiftShader for
324
+ * the rest of its life, and an aura rebuilding after that should get the
325
+ * current answer rather than the one from before. It costs a context creation
326
+ * and two calls, measured 15 Sep 2026 at about 2ms under SwiftShader and 2ms
327
+ * on Metal, against the 450ms and 135ms first draws it stands in front of, and
328
+ * it happens once per context rather than once per frame.
329
+ */
330
+ private static drawsInSoftware;
277
331
  /**
278
332
  * The context and the program, from whatever canvas can still give one.
279
333
  *
@@ -14,6 +14,7 @@ import { styles } from './aura-root.css.js';
14
14
  const MAX_CANVAS_EDGE = 4096;
15
15
  const MAX_CANVAS_PIXELS = 4_194_304;
16
16
  const OPENING_PATIENCE = 500;
17
+ const SOFTWARE_RENDERER = /swiftshader|llvmpipe|softpipe|software rasterizer|basic render/i;
17
18
  let HelixAura = class HelixAura extends HelixElement {
18
19
  constructor() {
19
20
  super(...arguments);
@@ -208,11 +209,27 @@ let HelixAura = class HelixAura extends HelixElement {
208
209
  this.open();
209
210
  }
210
211
  }
212
+ static drawsInSoftware() {
213
+ const probe = document.createElement('canvas');
214
+ probe.width = 1;
215
+ probe.height = 1;
216
+ const gl = probe.getContext('webgl2', HelixAura_1.CONTEXT);
217
+ if (!gl) {
218
+ return false;
219
+ }
220
+ const debug = gl.getExtension('WEBGL_debug_renderer_info');
221
+ const name = debug ? gl.getParameter(debug.UNMASKED_RENDERER_WEBGL) : null;
222
+ gl.getExtension('WEBGL_lose_context')?.loseContext();
223
+ return typeof name === 'string' && SOFTWARE_RENDERER.test(name);
224
+ }
211
225
  build() {
212
226
  let canvas = this.renderRoot.querySelector('canvas');
213
227
  if (!canvas) {
214
228
  return false;
215
229
  }
230
+ if (HelixAura_1.drawsInSoftware()) {
231
+ return false;
232
+ }
216
233
  let gl = canvas.getContext('webgl2', HelixAura_1.CONTEXT);
217
234
  if (gl?.isContextLost()) {
218
235
  const fresh = document.createElement('canvas');
@@ -2,13 +2,13 @@ import { createSheet } from '@fusion.dev/helix-core';
2
2
  export const styles = createSheet(`:host {
3
3
  --_carousel-bleed: var(--carousel-bleed, var(--helix-space-md));
4
4
  --_carousel-gap: var(--carousel-gap, var(--helix-space-md));
5
-
6
- --_carousel-pane: calc(round(var(--_carousel-share) - 0.015625px, 0.03125px) + 0.015625px);
7
5
  --_carousel-per-view: 1;
8
6
  --_carousel-share: calc(
9
7
  (100% - (var(--_carousel-per-view) - 1) * var(--_carousel-gap)) /
10
8
  var(--_carousel-per-view)
11
9
  );
10
+
11
+ --carousel-pane: calc(round(var(--_carousel-share) - 0.015625px, 0.03125px) + 0.015625px);
12
12
  }
13
13
 
14
14
  :host {
@@ -179,6 +179,8 @@ inline-size: 1em;
179
179
  }
180
180
 
181
181
  [part="track"] {
182
+
183
+ --carousel-gap: var(--_carousel-gap);
182
184
  display: flex;
183
185
  gap: var(--_carousel-gap);
184
186
  overflow-x: auto;
@@ -204,21 +206,11 @@ scroll-snap-type: y mandatory;
204
206
 
205
207
  [part="slide"] {
206
208
  display: flex;
207
- flex: 0 0 var(--_carousel-pane);
209
+ flex: 0 0 var(--carousel-pane);
210
+ margin-inline-end: var(--carousel-run-end, 0px);
208
211
  scroll-snap-align: start;
209
212
  }
210
213
 
211
- :host(:not([orientation="vertical"])) [part="slide"]:last-child {
212
- --_carousel-overrun: calc(
213
- sibling-count() *
214
- (var(--_carousel-pane) + var(--_carousel-gap)) -
215
- var(--_carousel-gap) -
216
- 100%
217
- );
218
- --_carousel-run-end: calc(round(var(--_carousel-overrun), 1px) - var(--_carousel-overrun));
219
- margin-inline-end: var(--_carousel-run-end);
220
- }
221
-
222
214
  [part="slide"] ::slotted(*) {
223
215
  flex: 1 1 0;
224
216
  min-block-size: 0;
@@ -22,7 +22,6 @@ import type { CSSResultGroup } from 'lit';
22
22
  * focus ring is not clipped by it. Defaults to enough for `--helix-shadow-md`, which reaches
23
23
  * 16px below the box it is on; a slide on `--helix-shadow-lg` reaches 44px and wants more.
24
24
  * @cssproperty --carousel-block-size - Height of a vertical track.
25
- * @cssproperty --carousel-gap - Space between slides.
26
25
  */
27
26
  export declare class HelixCarousel extends HelixHeadlessCarousel {
28
27
  /**
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.33.3",
4
+ "version": "0.33.5",
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.33.3",
51
- "@fusion.dev/helix-headless": "0.33.3",
52
- "@fusion.dev/helix-styles": "0.33.3"
50
+ "@fusion.dev/helix-core": "0.33.5",
51
+ "@fusion.dev/helix-headless": "0.33.5",
52
+ "@fusion.dev/helix-styles": "0.33.5"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@custom-elements-manifest/analyzer": "^0.11.0",
56
- "@fusion.dev/helix-cem": "0.33.3",
57
- "@fusion.dev/helix-testing": "0.33.3",
56
+ "@fusion.dev/helix-cem": "0.33.5",
57
+ "@fusion.dev/helix-testing": "0.33.5",
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
@@ -20395,6 +20395,11 @@ export type CustomElements = {
20395
20395
  * context the browser takes back, on a GPU reset or past its cap of about
20396
20396
  * sixteen, stops it too, and the gradient shows until the context returns.
20397
20397
  *
20398
+ * **It declines a renderer that draws on the CPU**, which is a headless browser
20399
+ * and a machine with no usable GPU, and shows the gradient instead. The shader
20400
+ * costs about 450ms of first frame per element there against 2ms on a GPU, for
20401
+ * a field drawn from the same tokens the gradient already ramps.
20402
+ *
20398
20403
  * Styled only, and with behavior, which the tier split does not otherwise
20399
20404
  * allow: the behavior is drawing to a canvas, so there is no structure a
20400
20405
  * consumer could restyle and nothing for a headless twin to hold.
@@ -22036,7 +22041,9 @@ export type CustomElements = {
22036
22041
  *
22037
22042
  * - `--carousel-bleed`: Room inside the scroller so a slide's own shadow, border or focus ring is not clipped by it. Defaults to enough for `--helix-shadow-md`, which reaches 16px below the box it is on; a slide on `--helix-shadow-lg` reaches 44px and wants more. (default: `undefined`)
22038
22043
  * - `--carousel-block-size`: Height of a vertical track. (default: `undefined`)
22039
- * - `--carousel-gap`: Space between slides. (default: `undefined`)
22044
+ * - `--carousel-gap`: Space between slides. A sheet sets it and the component measures the run with it. (default: `undefined`)
22045
+ * - `--carousel-pane`: The size one pane is laid out at. A sheet sets it and the component measures the run with it. (default: `undefined`)
22046
+ * - `--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`)
22040
22047
  *
22041
22048
  * ## CSS Parts
22042
22049
  *
@@ -39175,6 +39182,11 @@ export type CustomElementsSolidJs = {
39175
39182
  * context the browser takes back, on a GPU reset or past its cap of about
39176
39183
  * sixteen, stops it too, and the gradient shows until the context returns.
39177
39184
  *
39185
+ * **It declines a renderer that draws on the CPU**, which is a headless browser
39186
+ * and a machine with no usable GPU, and shows the gradient instead. The shader
39187
+ * costs about 450ms of first frame per element there against 2ms on a GPU, for
39188
+ * a field drawn from the same tokens the gradient already ramps.
39189
+ *
39178
39190
  * Styled only, and with behavior, which the tier split does not otherwise
39179
39191
  * allow: the behavior is drawing to a canvas, so there is no structure a
39180
39192
  * consumer could restyle and nothing for a headless twin to hold.
@@ -40852,7 +40864,9 @@ export type CustomElementsSolidJs = {
40852
40864
  *
40853
40865
  * - `--carousel-bleed`: Room inside the scroller so a slide's own shadow, border or focus ring is not clipped by it. Defaults to enough for `--helix-shadow-md`, which reaches 16px below the box it is on; a slide on `--helix-shadow-lg` reaches 44px and wants more. (default: `undefined`)
40854
40866
  * - `--carousel-block-size`: Height of a vertical track. (default: `undefined`)
40855
- * - `--carousel-gap`: Space between slides. (default: `undefined`)
40867
+ * - `--carousel-gap`: Space between slides. A sheet sets it and the component measures the run with it. (default: `undefined`)
40868
+ * - `--carousel-pane`: The size one pane is laid out at. A sheet sets it and the component measures the run with it. (default: `undefined`)
40869
+ * - `--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`)
40856
40870
  *
40857
40871
  * ## CSS Parts
40858
40872
  *
@@ -57845,8 +57859,12 @@ export type CustomCssProperties = {
57845
57859
  "--carousel-bleed"?: (string) | undefined;
57846
57860
  /** Height of a vertical track. */
57847
57861
  "--carousel-block-size"?: (string) | undefined;
57848
- /** Space between slides. */
57862
+ /** Space between slides. A sheet sets it and the component measures the run with it. */
57849
57863
  "--carousel-gap"?: (string) | undefined;
57864
+ /** The size one pane is laid out at. A sheet sets it and the component measures the run with it. */
57865
+ "--carousel-pane"?: (string) | undefined;
57866
+ /** 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`. */
57867
+ "--carousel-run-end"?: (string) | undefined;
57850
57868
  /** Fill behind the composer. */
57851
57869
  "--chat-composer-background-color"?: (string) | undefined;
57852
57870
  /** The composer's edge, so a theme can remove it. */
package/types/vue.d.ts CHANGED
@@ -10277,8 +10277,12 @@ export type CustomCssProperties = {
10277
10277
  "--carousel-bleed"?: (string) | undefined;
10278
10278
  /** Height of a vertical track. */
10279
10279
  "--carousel-block-size"?: (string) | undefined;
10280
- /** Space between slides. */
10280
+ /** Space between slides. A sheet sets it and the component measures the run with it. */
10281
10281
  "--carousel-gap"?: (string) | undefined;
10282
+ /** The size one pane is laid out at. A sheet sets it and the component measures the run with it. */
10283
+ "--carousel-pane"?: (string) | undefined;
10284
+ /** 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`. */
10285
+ "--carousel-run-end"?: (string) | undefined;
10282
10286
  /** Fill behind the composer. */
10283
10287
  "--chat-composer-background-color"?: (string) | undefined;
10284
10288
  /** The composer's edge, so a theme can remove it. */
@@ -11197,7 +11201,7 @@ export interface WcToolkitVueGlobalComponents {
11197
11201
  HelixAreaChartVueProps,
11198
11202
  HelixAreaChartVueEvents
11199
11203
  >;
11200
- /** One fragment shader over a full-screen triangle, with the palette read from the tokens rather than given as colors. A background written with hex values is an asset that has to be re-cut when the brand moves; one written against '--helix-color-primary' is a consequence of it. **Every shape ramps through four token stops**, and the token layer inverts each: the page's background, 'primary-subtle', 'primary', then a peak. The peak is the foreground on a dark page and 'primary-active' on a light one, because mixing a saturated hue toward near-black takes the chroma out of the pixels carrying most of it. Which way the page runs is read off the ground's own luminance rather than asked of the mode, which is a private token. **No dependency, and no scene graph.** The geometry is three vertices derived from 'gl_VertexID', so there is no attribute, no buffer and no upload. **It stops when nobody is looking**, off screen and in a background tab, and 'prefers-reduced-motion' gets one still frame rather than an empty box. A context the browser takes back, on a GPU reset or past its cap of about sixteen, stops it too, and the gradient shows until the context returns. Styled only, and with behavior, which the tier split does not otherwise allow: the behavior is drawing to a canvas, so there is no structure a consumer could restyle and nothing for a headless twin to hold. */
11204
+ /** One fragment shader over a full-screen triangle, with the palette read from the tokens rather than given as colors. A background written with hex values is an asset that has to be re-cut when the brand moves; one written against '--helix-color-primary' is a consequence of it. **Every shape ramps through four token stops**, and the token layer inverts each: the page's background, 'primary-subtle', 'primary', then a peak. The peak is the foreground on a dark page and 'primary-active' on a light one, because mixing a saturated hue toward near-black takes the chroma out of the pixels carrying most of it. Which way the page runs is read off the ground's own luminance rather than asked of the mode, which is a private token. **No dependency, and no scene graph.** The geometry is three vertices derived from 'gl_VertexID', so there is no attribute, no buffer and no upload. **It stops when nobody is looking**, off screen and in a background tab, and 'prefers-reduced-motion' gets one still frame rather than an empty box. A context the browser takes back, on a GPU reset or past its cap of about sixteen, stops it too, and the gradient shows until the context returns. **It declines a renderer that draws on the CPU**, which is a headless browser and a machine with no usable GPU, and shows the gradient instead. The shader costs about 450ms of first frame per element there against 2ms on a GPU, for a field drawn from the same tokens the gradient already ramps. Styled only, and with behavior, which the tier split does not otherwise allow: the behavior is drawing to a canvas, so there is no structure a consumer could restyle and nothing for a headless twin to hold. */
11201
11205
  "helix-aura": DefineCustomElement<
11202
11206
  HelixAura,
11203
11207
  HelixAuraVueProps,