@fusion.dev/helix 0.4.2 → 0.4.4

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.
Files changed (56) hide show
  1. package/custom-elements.json +119 -119
  2. package/dist/aura/root/aura-root.d.ts +10 -31
  3. package/dist/badge/root/badge-root.css.js +3 -3
  4. package/dist/bar-chart/root/bar-chart-root.css.js +7 -9
  5. package/dist/button/root/button-root.d.ts +1 -1
  6. package/dist/button/root/button-root.js +1 -1
  7. package/dist/button-group/root/button-group-root.css.js +3 -3
  8. package/dist/callout/root/callout-root.css.js +1 -2
  9. package/dist/card/root/card-root.css.js +6 -8
  10. package/dist/carousel/root/carousel-root.css.js +2 -2
  11. package/dist/checkbox/root/checkbox-root.css.js +3 -4
  12. package/dist/copy-button/root/copy-button-root.d.ts +1 -1
  13. package/dist/copy-button/root/copy-button-root.js +1 -1
  14. package/dist/date-input/root/date-input-root.css.js +1 -1
  15. package/dist/date-picker/root/date-picker-root.css.js +1 -1
  16. package/dist/divider/root/divider-root.css.js +2 -2
  17. package/dist/drawer/root/drawer-root.css.js +1 -2
  18. package/dist/file-input/root/file-input-root.css.js +1 -1
  19. package/dist/heatmap/root/heatmap-root.css.js +3 -3
  20. package/dist/icon-button/root/icon-button-root.css.js +1 -2
  21. package/dist/icon-button/root/icon-button-root.d.ts +1 -1
  22. package/dist/icon-button/root/icon-button-root.js +1 -1
  23. package/dist/input/root/input-root.css.js +2 -3
  24. package/dist/kbd/root/kbd-root.css.js +4 -4
  25. package/dist/legend/root/legend-root.css.js +1 -2
  26. package/dist/loader/root/loader-root.css.js +2 -2
  27. package/dist/menu/root/menu-root.css.js +4 -4
  28. package/dist/meter/root/meter-root.css.js +9 -16
  29. package/dist/outline/root/outline-root.css.js +1 -1
  30. package/dist/popover/root/popover-root.css.js +1 -1
  31. package/dist/radio/root/radio-root.css.js +1 -2
  32. package/dist/sandbox/preview/sandbox-preview.d.ts +11 -31
  33. package/dist/sandbox/root/sandbox-root.d.ts +11 -32
  34. package/dist/select/root/select-root.css.js +1 -4
  35. package/dist/slider/root/slider-root.css.js +8 -8
  36. package/dist/sparkline/root/sparkline-root.css.js +1 -2
  37. package/dist/speed-dial/root/speed-dial-root.css.js +1 -1
  38. package/dist/steps/root/steps-root.css.js +4 -6
  39. package/dist/steps/step/step.css.js +2 -2
  40. package/dist/switch/root/switch-root.css.js +3 -4
  41. package/dist/tag/root/tag-root.css.js +9 -10
  42. package/dist/time-input/root/time-input-root.css.js +1 -1
  43. package/dist/toast/item/toast-item.css.js +5 -5
  44. package/dist/toast/root/toast-root.css.js +5 -8
  45. package/dist/toggle/group/toggle-group.css.js +9 -10
  46. package/dist/trend/root/trend-root.css.js +1 -1
  47. package/dist/video/root/video-root.css.js +2 -2
  48. package/dist/video-playlist/menu/video-playlist-menu.css.js +1 -2
  49. package/package.json +16 -21
  50. package/{jsx.d.ts → types/jsx.d.ts} +66 -190
  51. package/{vue.d.ts → types/vue.d.ts} +3 -3
  52. package/elements.css +0 -286
  53. package/helix.css +0 -31
  54. /package/dist/{mixins → shared}/mixin-control-surface/mixin-control-surface.d.ts +0 -0
  55. /package/dist/{mixins → shared}/mixin-control-surface/mixin-control-surface.js +0 -0
  56. /package/{svelte.d.ts → types/svelte.d.ts} +0 -0
@@ -1,6 +1,11 @@
1
1
  import { createSheet } from '@fusion.dev/helix-core';
2
2
  export const styles = createSheet(`:host {
3
3
 
4
+ --helix-size-icon: var(--helix-size-icon-sm);
5
+ --helix-size-control: var(--helix-size-control-sm);
6
+
7
+ --_toast-line: calc(var(--helix-text-sm) * var(--helix-leading-normal));
8
+
4
9
  display: grid;
5
10
 
6
11
  grid-template-rows: minmax(0, 1fr);
@@ -12,11 +17,6 @@ margin-block-start var(--helix-duration-normal) var(--helix-easing-standard),
12
17
  opacity var(--helix-duration-fast) var(--helix-easing-standard),
13
18
  translate var(--helix-duration-normal) var(--helix-easing-standard);
14
19
 
15
- --helix-size-icon: var(--helix-size-icon-sm);
16
- --helix-size-control: var(--helix-size-control-sm);
17
-
18
- --_toast-line: calc(var(--helix-text-sm) * var(--helix-leading-normal));
19
-
20
20
  inline-size: var(--toast-inline-size, 22rem);
21
21
  max-inline-size: calc(100vw - var(--helix-space-xl));
22
22
  }
@@ -10,16 +10,15 @@ z-index: var(--helix-layer-toast);
10
10
  }
11
11
 
12
12
  :host(:not([placement])) {
13
- inset-block-end: var(--_toast-inset);
14
-
15
13
  --_toast-enter: var(--helix-space-lg);
14
+ inset-block-end: var(--_toast-inset);
16
15
  }
17
16
 
18
17
  [part="region"] {
19
- display: flex;
20
- flex-direction: column;
21
18
 
22
19
  --_toast-gap: var(--toast-gap, var(--helix-space-xs));
20
+ display: flex;
21
+ flex-direction: column;
23
22
  }
24
23
 
25
24
  ::slotted(*) {
@@ -27,15 +26,13 @@ pointer-events: auto;
27
26
  }
28
27
 
29
28
  :host([placement^="bottom"]) {
30
- inset-block-end: var(--_toast-inset);
31
-
32
29
  --_toast-enter: var(--helix-space-lg);
30
+ inset-block-end: var(--_toast-inset);
33
31
  }
34
32
 
35
33
  :host([placement^="top"]) {
36
- inset-block-start: var(--_toast-inset);
37
-
38
34
  --_toast-enter: calc(var(--helix-space-lg) * -1);
35
+ inset-block-start: var(--_toast-inset);
39
36
  }
40
37
 
41
38
  :host([placement^="top"]) [part="region"] {
@@ -28,6 +28,11 @@ align-items: start;
28
28
  }
29
29
 
30
30
  [part="track"] {
31
+ --_toggle-height: calc(var(--helix-size-control) - var(--helix-space-2xs) * 2);
32
+
33
+ --_toggle-radius: var(--helix-radii-sm);
34
+
35
+ --_indicator-surface: var(--helix-color-surface-raised);
31
36
  display: inline-flex;
32
37
  position: relative;
33
38
 
@@ -36,21 +41,11 @@ flex-wrap: wrap;
36
41
 
37
42
  min-block-size: var(--helix-size-control);
38
43
 
39
- --_toggle-height: calc(var(--helix-size-control) - var(--helix-space-2xs) * 2);
40
-
41
- --_toggle-radius: var(--helix-radii-sm);
42
-
43
44
  padding: var(--helix-space-2xs);
44
-
45
- --_indicator-surface: var(--helix-color-surface-raised);
46
45
  }
47
46
 
48
47
  :host(:not([separation])) [part="track"],
49
48
  :host([separation="outlined"]) [part="track"] {
50
- background-color: var(--helix-color-surface-sunken);
51
- border: var(--helix-border-thin) solid var(--helix-color-border);
52
- border-radius: var(--helix-radii-sm);
53
- padding: var(--helix-space-2xs);
54
49
 
55
50
  --_toggle-radius: calc(var(--helix-radii-sm) - var(--helix-border-thin));
56
51
 
@@ -63,6 +58,10 @@ var(--helix-border-thin) *
63
58
  );
64
59
 
65
60
  --_indicator-surface: var(--helix-color-surface-overlay);
61
+ background-color: var(--helix-color-surface-sunken);
62
+ border: var(--helix-border-thin) solid var(--helix-color-border);
63
+ border-radius: var(--helix-radii-sm);
64
+ padding: var(--helix-space-2xs);
66
65
  }
67
66
 
68
67
  ::slotted(helix-toggle) {
@@ -9,9 +9,9 @@ line-height: var(--helix-leading-tight);
9
9
  }
10
10
 
11
11
  :host {
12
- color: var(--trend-color, var(--_trend-color));
13
12
 
14
13
  --_trend-color: var(--helix-color-foreground-muted);
14
+ color: var(--trend-color, var(--_trend-color));
15
15
  }
16
16
 
17
17
  [part="icon"] {
@@ -82,8 +82,8 @@ opacity: 0;
82
82
  }
83
83
 
84
84
  [part="controls"] :where(a, button) {
85
- all: unset;
86
85
  --icon-size: var(--helix-size-icon-tight);
86
+ all: unset;
87
87
 
88
88
  align-items: center;
89
89
  border-radius: var(--helix-radii-sm);
@@ -239,8 +239,8 @@ display: contents;
239
239
  }
240
240
 
241
241
  [part="start"] {
242
- all: unset;
243
242
  --icon-size: 40%;
243
+ all: unset;
244
244
 
245
245
  align-items: center;
246
246
  aspect-ratio: 1;
@@ -5,9 +5,8 @@ flex: 0 0 auto;
5
5
  }
6
6
 
7
7
  [part="trigger"] {
8
- all: unset;
9
-
10
8
  --icon-size: var(--video-playlist-menu-size, var(--helix-size-icon-tight));
9
+ all: unset;
11
10
 
12
11
  align-items: center;
13
12
  border-radius: var(--helix-radii-sm);
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.4.2",
4
+ "version": "0.4.4",
5
5
  "license": "MIT",
6
6
  "author": "Ross Sheppard <ross.sheppard@fusion.dev>",
7
7
  "repository": {
@@ -22,43 +22,38 @@
22
22
  "default": "./dist/*/index.js"
23
23
  },
24
24
  "./custom-elements.json": "./custom-elements.json",
25
- "./elements.css": "./elements.css",
26
- "./helix.css": "./helix.css",
27
- "./jsx": "./jsx.d.ts",
28
- "./svelte": "./svelte.d.ts",
29
- "./vue": "./vue.d.ts"
25
+ "./jsx": "./types/jsx.d.ts",
26
+ "./svelte": "./types/svelte.d.ts",
27
+ "./vue": "./types/vue.d.ts"
30
28
  },
31
29
  "files": [
32
30
  "custom-elements.json",
33
31
  "dist",
34
- "elements.css",
35
- "helix.css",
36
- "jsx.d.ts",
37
- "svelte.d.ts",
38
- "vue.d.ts"
32
+ "types"
39
33
  ],
40
34
  "customElements": "custom-elements.json",
41
35
  "sideEffects": true,
42
36
  "scripts": {
43
- "analyze": "cem analyze --config custom-elements-manifest.config.ts",
44
- "build": "tsc -p tsconfig.json && tsc -p tsconfig.types.json",
45
- "styles": "build-styles . && build-elements-css .",
46
- "test": "bun run test:pure && bun run test:dom && bun run test:ssr",
37
+ "analyze": "bun --bun cem analyze --config cem.config.ts",
38
+ "build": "bun run element-events && tsc -p tsconfig.build.json && tsc -p tsconfig.types.json",
39
+ "element-events": "build-element-events --package styled",
40
+ "styles": "build-styles .",
41
+ "test": "bun run element-events && bun run test:pure && bun run test:dom && bun run test:ssr",
47
42
  "test:dom": "bun test dom.spec",
48
43
  "test:pure": "bun test pure.spec",
49
44
  "test:ssr": "bun test ssr.spec",
50
- "typecheck": "tsc -p tsconfig.json --noEmit"
45
+ "typecheck": "bun run element-events && tsc -p tsconfig.json --noEmit"
51
46
  },
52
47
  "bugs": "https://github.com/project-fusion/fusion/issues",
53
48
  "dependencies": {
54
- "@fusion.dev/helix-core": "0.4.2",
55
- "@fusion.dev/helix-headless": "0.4.2",
56
- "@fusion.dev/helix-styles": "0.4.2"
49
+ "@fusion.dev/helix-core": "0.4.4",
50
+ "@fusion.dev/helix-headless": "0.4.4",
51
+ "@fusion.dev/helix-styles": "0.4.4"
57
52
  },
58
53
  "devDependencies": {
59
54
  "@custom-elements-manifest/analyzer": "^0.11.0",
60
- "@fusion.dev/helix-cem": "0.4.2",
61
- "@fusion.dev/helix-testing": "0.4.2",
55
+ "@fusion.dev/helix-cem": "0.4.4",
56
+ "@fusion.dev/helix-testing": "0.4.4",
62
57
  "@fusion.dev/scripts": "0.0.0-dev",
63
58
  "@happy-dom/global-registrator": "^20.0.0",
64
59
  "@lit-labs/ssr": "^3.3.0",
@@ -18315,43 +18315,22 @@ export type CustomElements = {
18315
18315
 
18316
18316
  /**
18317
18317
  * One fragment shader over a full-screen triangle, with the palette read from
18318
- * the tokens rather than given as colors. That is the whole reason this belongs
18319
- * in a design system instead of in a page: a background written with hex values
18320
- * is an asset that has to be re-cut when the brand moves, and one written
18321
- * against `--helix-color-primary` is a consequence of it.
18318
+ * the tokens rather than given as colors. A background written with hex values
18319
+ * is an asset that has to be re-cut when the brand moves; one written against
18320
+ * `--helix-color-primary` is a consequence of it.
18322
18321
  *
18323
18322
  * **Every shape ramps through four token stops**, and the token layer inverts
18324
- * each of them: the page's own background, `primary-subtle`, `primary`, and
18325
- * then a peak. The peak is the foreground on a dark page and `primary-active`
18326
- * on a light one, because mixing a saturated hue toward near-black takes the
18327
- * chroma out of exactly the pixels carrying the most of it. Which way the page
18328
- * runs is not asked of the mode, which is a private token: it is read off the
18329
- * ground's own luminance, which the shader already has.
18323
+ * each: the page's background, `primary-subtle`, `primary`, then a peak. The
18324
+ * peak is the foreground on a dark page and `primary-active` on a light one,
18325
+ * because mixing a saturated hue toward near-black takes the chroma out of the
18326
+ * pixels carrying most of it. Which way the page runs is read off the ground's
18327
+ * own luminance rather than asked of the mode, which is a private token.
18330
18328
  *
18331
18329
  * **No dependency, and no scene graph.** The geometry is three vertices derived
18332
- * from `gl_VertexID`, so there is no attribute, no buffer and no upload. The
18333
- * common implementations of this reach for a 3D library to draw one quad, which
18334
- * is a camera and a material system for four vertices that never move.
18330
+ * from `gl_VertexID`, so there is no attribute, no buffer and no upload.
18335
18331
  *
18336
18332
  * **It stops when nobody is looking**, off screen and in a background tab, and
18337
- * `prefers-reduced-motion` gets one still frame rather than an empty box: the
18338
- * composition is the point and the drift is a garnish.
18339
- *
18340
- * **A layer over an interactive aura has to let the pointer through.** The
18341
- * element is hit-testable only when `interactive` is set, because a background
18342
- * that swallows clicks is worse than one that does nothing, but a scrim or an
18343
- * overlay a consumer paints on top will absorb the move before it arrives. Any
18344
- * decorative layer above this wants `pointer-events: none`. It has already
18345
- * caught this repository's own bench once.
18346
- *
18347
- * **The fallback needs no detection.** Where WebGL is refused the canvas never
18348
- * paints and is transparent, and the host carries a gradient of the same tokens
18349
- * underneath. Nothing has to ask whether it worked.
18350
- *
18351
- * Presentation only, so there is no headless tier: the split exists to keep
18352
- * behavior separate from styling, and there is no structure or semantics here
18353
- * to separate. Decorative, so the host is hidden from assistive technology and
18354
- * takes no pointer events.
18333
+ * `prefers-reduced-motion` gets one still frame rather than an empty box.
18355
18334
  *
18356
18335
  * ## Attributes & Properties
18357
18336
  *
@@ -28088,41 +28067,21 @@ export type CustomElements = {
28088
28067
  >;
28089
28068
 
28090
28069
  /**
28091
- * A sandboxed `<iframe>` pointed at `src`, which is a document the consumer
28092
- * provides. That document imports whatever the examples need, listens for a
28093
- * render message, and writes the markup into itself.
28070
+ * A sandboxed `<iframe>` pointed at `src`, a document the consumer provides.
28071
+ * That document imports whatever the examples need, listens for a render
28072
+ * message, and writes the markup into itself.
28094
28073
  *
28095
28074
  * **A frame rather than the page.** Rendering into the page meant an example
28096
- * was styled by whatever surrounded it, which flatters the preview and lies
28097
- * about it: an example that restyles `helix-card` restyled the sandbox too, a
28098
- * script in an example ran against the real document, and a stray
28099
- * `position: fixed` escaped the pane. It also left nothing to capture console
28100
- * output from, and the terminal has to come from somewhere.
28101
- *
28102
- * The cost is that the frame starts empty. Styles and element definitions do
28103
- * not cross into it, because a document has its own stylesheets and a window
28104
- * has its own custom element registry, so `src` has to load them. That is the
28105
- * consumer's document rather than something guessed at here.
28075
+ * was styled by whatever surrounded it: an example restyling `helix-card`
28076
+ * restyled the sandbox too, a script ran against the real document, and a stray
28077
+ * `position: fixed` escaped the pane. The cost is that the frame starts empty,
28078
+ * a document having its own stylesheets and a window its own registry, so `src`
28079
+ * has to load them.
28106
28080
  *
28107
28081
  * **The source is not trusted, and the frame is what makes that safe.**
28108
- * `sandbox="allow-scripts"` and no `allow-same-origin`, so the document runs on
28109
- * an opaque origin: script in an example cannot reach this page, its storage,
28110
- * its cookies, or the editor the source was typed into. Without it they could,
28111
- * measured, through an `onerror` handler on an image that fails to load, which
28112
- * `innerHTML` does not strip the way it refuses a `<script>` tag. That is what
28113
- * lets a sandbox hold markup a reader pasted from somewhere, or one day arrived
28114
- * in a shared link, rather than only what its owner typed.
28115
- *
28116
- * `allow-forms` is granted because examples have forms in them and a submit
28117
- * that silently does nothing is a worse lie than one that navigates a frame
28118
- * nobody is looking at. Top-level navigation, popups and modals are not.
28119
- *
28120
- * **`allow="clipboard-write *; fullscreen *"`, and the stars matter.** Both
28121
- * policies default to `self`, and a frame on an opaque origin is not `self`, so
28122
- * the default denies both: a component that copies to the clipboard and a video
28123
- * offering a fullscreen button each become a control that silently does nothing,
28124
- * a denied request rejecting a promise nobody was watching. Nothing else is
28125
- * granted, and a copy still needs the reader's own gesture.
28082
+ * `sandbox="allow-scripts"` and never `allow-same-origin`: the two together are
28083
+ * the same as no sandbox at all, a document on its own origin being able to
28084
+ * reach up and remove the attribute.
28126
28085
  *
28127
28086
  * ## Attributes & Properties
28128
28087
  *
@@ -28201,41 +28160,20 @@ export type CustomElements = {
28201
28160
  >;
28202
28161
 
28203
28162
  /**
28204
- * Coordination is by event, the same way the accordion does it: a source pane
28205
- * dispatches `helix-before-edit`, which bubbles, and the sandbox hands the value to
28206
- * whatever preview is slotted into it. Neither child knows the other exists, so
28207
- * either can be replaced or used alone.
28163
+ * Coordination is by event: a source pane dispatches `helix-before-edit`, which
28164
+ * bubbles, and the sandbox hands the value to whatever preview is slotted into
28165
+ * it. Neither child knows the other exists, so either can be replaced or used
28166
+ * alone.
28208
28167
  *
28209
28168
  * The event carries the pane's `name`, which is what lets one sandbox hold
28210
- * several panes without the root identifying senders by reference. `html` is
28211
- * the preview's markup and `css` is its stylesheet. A pane named anything else
28212
- * is showing something rather than driving it, and is ignored: the sandbox has
28213
- * a pane rendering the example as JSX, and guessing would have put the text of
28214
- * a React component into the preview.
28215
- *
28216
- * **The dividers are two nested `helix-splitter`s, not a grid this element
28217
- * drags itself.** The pointer handling, the keyboard handling and the corner are
28218
- * all the splitter's, and the corner arrives on its own wherever a nested
28219
- * splitter crosses the one it is in.
28220
- *
28221
- * The panes are the inner splitter and the panel is the outer one, which is the
28222
- * order that makes the panel span the full width: the outer divider runs edge to
28223
- * edge and the inner stops at it.
28224
- *
28225
- * **Both are controlled from here, so `split` and `panel-size` stay the truth.**
28226
- * A splitter that owned its own position would leave this element reporting one
28227
- * arrangement and showing another, and a consumer restoring a saved layout
28228
- * writes to these two properties. Each splitter announces where it wants to go
28229
- * and this answers, which is the same contract a form control has with a
28230
- * framework.
28231
- *
28232
- * **The panel is in pixels here and a percentage in the splitter, and the
28233
- * conversion belongs here.** A terminal wants a number of lines rather than a
28234
- * share of the window, so its height should not change when the window does. A
28235
- * splitter has no business knowing that, so it stays percentage-pure and this
28236
- * element, which does know what is in the panel, holds the box and converts.
28237
- * That is also what keeps a stored `panelSize` from a previous visit meaning
28238
- * what it meant when it was written.
28169
+ * several panes: `html` is the preview's markup and `css` its stylesheet. A
28170
+ * pane named anything else is showing something rather than driving it, and is
28171
+ * ignored.
28172
+ *
28173
+ * **The dividers are two nested `helix-splitter`s**, not a grid this element
28174
+ * drags itself, so the pointer handling, the keyboard handling and the corner
28175
+ * are all the splitter's. The panes are the inner splitter and the panel is the
28176
+ * outer one, which is the order that makes the panel span the full width.
28239
28177
  *
28240
28178
  * ## Attributes & Properties
28241
28179
  *
@@ -33956,43 +33894,22 @@ export type CustomElementsSolidJs = {
33956
33894
 
33957
33895
  /**
33958
33896
  * One fragment shader over a full-screen triangle, with the palette read from
33959
- * the tokens rather than given as colors. That is the whole reason this belongs
33960
- * in a design system instead of in a page: a background written with hex values
33961
- * is an asset that has to be re-cut when the brand moves, and one written
33962
- * against `--helix-color-primary` is a consequence of it.
33897
+ * the tokens rather than given as colors. A background written with hex values
33898
+ * is an asset that has to be re-cut when the brand moves; one written against
33899
+ * `--helix-color-primary` is a consequence of it.
33963
33900
  *
33964
33901
  * **Every shape ramps through four token stops**, and the token layer inverts
33965
- * each of them: the page's own background, `primary-subtle`, `primary`, and
33966
- * then a peak. The peak is the foreground on a dark page and `primary-active`
33967
- * on a light one, because mixing a saturated hue toward near-black takes the
33968
- * chroma out of exactly the pixels carrying the most of it. Which way the page
33969
- * runs is not asked of the mode, which is a private token: it is read off the
33970
- * ground's own luminance, which the shader already has.
33902
+ * each: the page's background, `primary-subtle`, `primary`, then a peak. The
33903
+ * peak is the foreground on a dark page and `primary-active` on a light one,
33904
+ * because mixing a saturated hue toward near-black takes the chroma out of the
33905
+ * pixels carrying most of it. Which way the page runs is read off the ground's
33906
+ * own luminance rather than asked of the mode, which is a private token.
33971
33907
  *
33972
33908
  * **No dependency, and no scene graph.** The geometry is three vertices derived
33973
- * from `gl_VertexID`, so there is no attribute, no buffer and no upload. The
33974
- * common implementations of this reach for a 3D library to draw one quad, which
33975
- * is a camera and a material system for four vertices that never move.
33909
+ * from `gl_VertexID`, so there is no attribute, no buffer and no upload.
33976
33910
  *
33977
33911
  * **It stops when nobody is looking**, off screen and in a background tab, and
33978
- * `prefers-reduced-motion` gets one still frame rather than an empty box: the
33979
- * composition is the point and the drift is a garnish.
33980
- *
33981
- * **A layer over an interactive aura has to let the pointer through.** The
33982
- * element is hit-testable only when `interactive` is set, because a background
33983
- * that swallows clicks is worse than one that does nothing, but a scrim or an
33984
- * overlay a consumer paints on top will absorb the move before it arrives. Any
33985
- * decorative layer above this wants `pointer-events: none`. It has already
33986
- * caught this repository's own bench once.
33987
- *
33988
- * **The fallback needs no detection.** Where WebGL is refused the canvas never
33989
- * paints and is transparent, and the host carries a gradient of the same tokens
33990
- * underneath. Nothing has to ask whether it worked.
33991
- *
33992
- * Presentation only, so there is no headless tier: the split exists to keep
33993
- * behavior separate from styling, and there is no structure or semantics here
33994
- * to separate. Decorative, so the host is hidden from assistive technology and
33995
- * takes no pointer events.
33912
+ * `prefers-reduced-motion` gets one still frame rather than an empty box.
33996
33913
  *
33997
33914
  * ## Attributes & Properties
33998
33915
  *
@@ -43952,41 +43869,21 @@ export type CustomElementsSolidJs = {
43952
43869
  >;
43953
43870
 
43954
43871
  /**
43955
- * A sandboxed `<iframe>` pointed at `src`, which is a document the consumer
43956
- * provides. That document imports whatever the examples need, listens for a
43957
- * render message, and writes the markup into itself.
43872
+ * A sandboxed `<iframe>` pointed at `src`, a document the consumer provides.
43873
+ * That document imports whatever the examples need, listens for a render
43874
+ * message, and writes the markup into itself.
43958
43875
  *
43959
43876
  * **A frame rather than the page.** Rendering into the page meant an example
43960
- * was styled by whatever surrounded it, which flatters the preview and lies
43961
- * about it: an example that restyles `helix-card` restyled the sandbox too, a
43962
- * script in an example ran against the real document, and a stray
43963
- * `position: fixed` escaped the pane. It also left nothing to capture console
43964
- * output from, and the terminal has to come from somewhere.
43965
- *
43966
- * The cost is that the frame starts empty. Styles and element definitions do
43967
- * not cross into it, because a document has its own stylesheets and a window
43968
- * has its own custom element registry, so `src` has to load them. That is the
43969
- * consumer's document rather than something guessed at here.
43877
+ * was styled by whatever surrounded it: an example restyling `helix-card`
43878
+ * restyled the sandbox too, a script ran against the real document, and a stray
43879
+ * `position: fixed` escaped the pane. The cost is that the frame starts empty,
43880
+ * a document having its own stylesheets and a window its own registry, so `src`
43881
+ * has to load them.
43970
43882
  *
43971
43883
  * **The source is not trusted, and the frame is what makes that safe.**
43972
- * `sandbox="allow-scripts"` and no `allow-same-origin`, so the document runs on
43973
- * an opaque origin: script in an example cannot reach this page, its storage,
43974
- * its cookies, or the editor the source was typed into. Without it they could,
43975
- * measured, through an `onerror` handler on an image that fails to load, which
43976
- * `innerHTML` does not strip the way it refuses a `<script>` tag. That is what
43977
- * lets a sandbox hold markup a reader pasted from somewhere, or one day arrived
43978
- * in a shared link, rather than only what its owner typed.
43979
- *
43980
- * `allow-forms` is granted because examples have forms in them and a submit
43981
- * that silently does nothing is a worse lie than one that navigates a frame
43982
- * nobody is looking at. Top-level navigation, popups and modals are not.
43983
- *
43984
- * **`allow="clipboard-write *; fullscreen *"`, and the stars matter.** Both
43985
- * policies default to `self`, and a frame on an opaque origin is not `self`, so
43986
- * the default denies both: a component that copies to the clipboard and a video
43987
- * offering a fullscreen button each become a control that silently does nothing,
43988
- * a denied request rejecting a promise nobody was watching. Nothing else is
43989
- * granted, and a copy still needs the reader's own gesture.
43884
+ * `sandbox="allow-scripts"` and never `allow-same-origin`: the two together are
43885
+ * the same as no sandbox at all, a document on its own origin being able to
43886
+ * reach up and remove the attribute.
43990
43887
  *
43991
43888
  * ## Attributes & Properties
43992
43889
  *
@@ -44068,41 +43965,20 @@ export type CustomElementsSolidJs = {
44068
43965
  >;
44069
43966
 
44070
43967
  /**
44071
- * Coordination is by event, the same way the accordion does it: a source pane
44072
- * dispatches `helix-before-edit`, which bubbles, and the sandbox hands the value to
44073
- * whatever preview is slotted into it. Neither child knows the other exists, so
44074
- * either can be replaced or used alone.
43968
+ * Coordination is by event: a source pane dispatches `helix-before-edit`, which
43969
+ * bubbles, and the sandbox hands the value to whatever preview is slotted into
43970
+ * it. Neither child knows the other exists, so either can be replaced or used
43971
+ * alone.
44075
43972
  *
44076
43973
  * The event carries the pane's `name`, which is what lets one sandbox hold
44077
- * several panes without the root identifying senders by reference. `html` is
44078
- * the preview's markup and `css` is its stylesheet. A pane named anything else
44079
- * is showing something rather than driving it, and is ignored: the sandbox has
44080
- * a pane rendering the example as JSX, and guessing would have put the text of
44081
- * a React component into the preview.
44082
- *
44083
- * **The dividers are two nested `helix-splitter`s, not a grid this element
44084
- * drags itself.** The pointer handling, the keyboard handling and the corner are
44085
- * all the splitter's, and the corner arrives on its own wherever a nested
44086
- * splitter crosses the one it is in.
44087
- *
44088
- * The panes are the inner splitter and the panel is the outer one, which is the
44089
- * order that makes the panel span the full width: the outer divider runs edge to
44090
- * edge and the inner stops at it.
44091
- *
44092
- * **Both are controlled from here, so `split` and `panel-size` stay the truth.**
44093
- * A splitter that owned its own position would leave this element reporting one
44094
- * arrangement and showing another, and a consumer restoring a saved layout
44095
- * writes to these two properties. Each splitter announces where it wants to go
44096
- * and this answers, which is the same contract a form control has with a
44097
- * framework.
44098
- *
44099
- * **The panel is in pixels here and a percentage in the splitter, and the
44100
- * conversion belongs here.** A terminal wants a number of lines rather than a
44101
- * share of the window, so its height should not change when the window does. A
44102
- * splitter has no business knowing that, so it stays percentage-pure and this
44103
- * element, which does know what is in the panel, holds the box and converts.
44104
- * That is also what keeps a stored `panelSize` from a previous visit meaning
44105
- * what it meant when it was written.
43974
+ * several panes: `html` is the preview's markup and `css` its stylesheet. A
43975
+ * pane named anything else is showing something rather than driving it, and is
43976
+ * ignored.
43977
+ *
43978
+ * **The dividers are two nested `helix-splitter`s**, not a grid this element
43979
+ * drags itself, so the pointer handling, the keyboard handling and the corner
43980
+ * are all the splitter's. The panes are the inner splitter and the panel is the
43981
+ * outer one, which is the order that makes the panel span the full width.
44106
43982
  *
44107
43983
  * ## Attributes & Properties
44108
43984
  *
@@ -10110,7 +10110,7 @@ export interface WcToolkitVueGlobalComponents {
10110
10110
  HelixAppHeaderVueProps,
10111
10111
  HelixAppHeaderVueEvents
10112
10112
  >;
10113
- /** One fragment shader over a full-screen triangle, with the palette read from the tokens rather than given as colors. That is the whole reason this belongs in a design system instead of in a page: a background written with hex values is an asset that has to be re-cut when the brand moves, and one written against '--helix-color-primary' is a consequence of it. **Every shape ramps through four token stops**, and the token layer inverts each of them: the page's own background, 'primary-subtle', 'primary', and 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 exactly the pixels carrying the most of it. Which way the page runs is not asked of the mode, which is a private token: it is read off the ground's own luminance, which the shader already has. **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. The common implementations of this reach for a 3D library to draw one quad, which is a camera and a material system for four vertices that never move. **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: the composition is the point and the drift is a garnish. **A layer over an interactive aura has to let the pointer through.** The element is hit-testable only when 'interactive' is set, because a background that swallows clicks is worse than one that does nothing, but a scrim or an overlay a consumer paints on top will absorb the move before it arrives. Any decorative layer above this wants 'pointer-events: none'. It has already caught this repository's own bench once. **The fallback needs no detection.** Where WebGL is refused the canvas never paints and is transparent, and the host carries a gradient of the same tokens underneath. Nothing has to ask whether it worked. Presentation only, so there is no headless tier: the split exists to keep behavior separate from styling, and there is no structure or semantics here to separate. Decorative, so the host is hidden from assistive technology and takes no pointer events. */
10113
+ /** 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. */
10114
10114
  "helix-aura": DefineCustomElement<
10115
10115
  HelixAura,
10116
10116
  HelixAuraVueProps,
@@ -10548,13 +10548,13 @@ export interface WcToolkitVueGlobalComponents {
10548
10548
  HelixRatingVueProps,
10549
10549
  HelixRatingVueEvents
10550
10550
  >;
10551
- /** A sandboxed '<iframe>' pointed at 'src', which is a document the consumer provides. That document imports whatever the examples need, listens for a render message, and writes the markup into itself. **A frame rather than the page.** Rendering into the page meant an example was styled by whatever surrounded it, which flatters the preview and lies about it: an example that restyles 'helix-card' restyled the sandbox too, a script in an example ran against the real document, and a stray 'position: fixed' escaped the pane. It also left nothing to capture console output from, and the terminal has to come from somewhere. The cost is that the frame starts empty. Styles and element definitions do not cross into it, because a document has its own stylesheets and a window has its own custom element registry, so 'src' has to load them. That is the consumer's document rather than something guessed at here. **The source is not trusted, and the frame is what makes that safe.** 'sandbox="allow-scripts"' and no 'allow-same-origin', so the document runs on an opaque origin: script in an example cannot reach this page, its storage, its cookies, or the editor the source was typed into. Without it they could, measured, through an 'onerror' handler on an image that fails to load, which 'innerHTML' does not strip the way it refuses a '<script>' tag. That is what lets a sandbox hold markup a reader pasted from somewhere, or one day arrived in a shared link, rather than only what its owner typed. 'allow-forms' is granted because examples have forms in them and a submit that silently does nothing is a worse lie than one that navigates a frame nobody is looking at. Top-level navigation, popups and modals are not. **'allow="clipboard-write *; fullscreen *"', and the stars matter.** Both policies default to 'self', and a frame on an opaque origin is not 'self', so the default denies both: a component that copies to the clipboard and a video offering a fullscreen button each become a control that silently does nothing, a denied request rejecting a promise nobody was watching. Nothing else is granted, and a copy still needs the reader's own gesture. */
10551
+ /** A sandboxed '<iframe>' pointed at 'src', a document the consumer provides. That document imports whatever the examples need, listens for a render message, and writes the markup into itself. **A frame rather than the page.** Rendering into the page meant an example was styled by whatever surrounded it: an example restyling 'helix-card' restyled the sandbox too, a script ran against the real document, and a stray 'position: fixed' escaped the pane. The cost is that the frame starts empty, a document having its own stylesheets and a window its own registry, so 'src' has to load them. **The source is not trusted, and the frame is what makes that safe.** 'sandbox="allow-scripts"' and never 'allow-same-origin': the two together are the same as no sandbox at all, a document on its own origin being able to reach up and remove the attribute. */
10552
10552
  "helix-sandbox-preview": DefineCustomElement<
10553
10553
  HelixSandboxPreview,
10554
10554
  HelixSandboxPreviewVueProps,
10555
10555
  HelixSandboxPreviewVueEvents
10556
10556
  >;
10557
- /** Coordination is by event, the same way the accordion does it: a source pane dispatches 'helix-before-edit', which bubbles, and the sandbox hands the value to whatever preview is slotted into it. Neither child knows the other exists, so either can be replaced or used alone. The event carries the pane's 'name', which is what lets one sandbox hold several panes without the root identifying senders by reference. 'html' is the preview's markup and 'css' is its stylesheet. A pane named anything else is showing something rather than driving it, and is ignored: the sandbox has a pane rendering the example as JSX, and guessing would have put the text of a React component into the preview. **The dividers are two nested 'helix-splitter's, not a grid this element drags itself.** The pointer handling, the keyboard handling and the corner are all the splitter's, and the corner arrives on its own wherever a nested splitter crosses the one it is in. The panes are the inner splitter and the panel is the outer one, which is the order that makes the panel span the full width: the outer divider runs edge to edge and the inner stops at it. **Both are controlled from here, so 'split' and 'panel-size' stay the truth.** A splitter that owned its own position would leave this element reporting one arrangement and showing another, and a consumer restoring a saved layout writes to these two properties. Each splitter announces where it wants to go and this answers, which is the same contract a form control has with a framework. **The panel is in pixels here and a percentage in the splitter, and the conversion belongs here.** A terminal wants a number of lines rather than a share of the window, so its height should not change when the window does. A splitter has no business knowing that, so it stays percentage-pure and this element, which does know what is in the panel, holds the box and converts. That is also what keeps a stored 'panelSize' from a previous visit meaning what it meant when it was written. */
10557
+ /** Coordination is by event: a source pane dispatches 'helix-before-edit', which bubbles, and the sandbox hands the value to whatever preview is slotted into it. Neither child knows the other exists, so either can be replaced or used alone. The event carries the pane's 'name', which is what lets one sandbox hold several panes: 'html' is the preview's markup and 'css' its stylesheet. A pane named anything else is showing something rather than driving it, and is ignored. **The dividers are two nested 'helix-splitter's**, not a grid this element drags itself, so the pointer handling, the keyboard handling and the corner are all the splitter's. The panes are the inner splitter and the panel is the outer one, which is the order that makes the panel span the full width. */
10558
10558
  "helix-sandbox": DefineCustomElement<
10559
10559
  HelixSandbox,
10560
10560
  HelixSandboxVueProps,