@cueplusplus/ui 0.18.2 → 0.20.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.
Files changed (189) hide show
  1. package/CHANGELOG.md +100 -0
  2. package/dist/brand/_motif-seed.js +20 -0
  3. package/dist/brand/gloss-object.d.ts +23 -0
  4. package/dist/brand/gloss-object.js +108 -0
  5. package/dist/brand/halftone.d.ts +23 -0
  6. package/dist/brand/halftone.js +54 -0
  7. package/dist/brand/index.d.ts +8 -1
  8. package/dist/brand/motif.d.ts +32 -0
  9. package/dist/brand/motif.js +71 -0
  10. package/dist/brand/particle-logo.d.ts +50 -0
  11. package/dist/brand/particle-logo.js +437 -0
  12. package/dist/brand/particle-mark.d.ts +29 -0
  13. package/dist/brand/particle-mark.js +137 -0
  14. package/dist/brand/ribbon.d.ts +20 -0
  15. package/dist/brand/ribbon.js +54 -0
  16. package/dist/brand/text-scramble.d.ts +42 -0
  17. package/dist/brand/text-scramble.js +160 -0
  18. package/dist/chat/delegation-card.js +2 -1
  19. package/dist/chat/message.js +12 -13
  20. package/dist/chrome/announcement-bar.d.ts +30 -0
  21. package/dist/chrome/announcement-bar.js +38 -0
  22. package/dist/chrome/app-bar.d.ts +4 -1
  23. package/dist/chrome/app-bar.js +7 -2
  24. package/dist/chrome/app-shell.js +8 -1
  25. package/dist/chrome/band.d.ts +3 -1
  26. package/dist/chrome/band.js +4 -3
  27. package/dist/chrome/hero.d.ts +61 -0
  28. package/dist/chrome/hero.js +108 -0
  29. package/dist/chrome/index.d.ts +6 -1
  30. package/dist/chrome/index.js +6 -1
  31. package/dist/chrome/keyword.d.ts +22 -0
  32. package/dist/chrome/keyword.js +28 -0
  33. package/dist/chrome/logo-strip.d.ts +23 -0
  34. package/dist/chrome/logo-strip.js +43 -0
  35. package/dist/chrome/page-shell.js +13 -1
  36. package/dist/chrome/stat-band.d.ts +32 -0
  37. package/dist/chrome/stat-band.js +39 -0
  38. package/dist/color/color-area.js +2 -1
  39. package/dist/dmx/channel-matrix.js +5 -3
  40. package/dist/dmx/dmx-strip.js +5 -3
  41. package/dist/elements/animated-number.js +4 -1
  42. package/dist/elements/replay.d.ts +1 -1
  43. package/dist/elements/replay.js +5 -2
  44. package/dist/elements/scroll-anchor.js +4 -1
  45. package/dist/forms/_chassis.d.ts +1 -1
  46. package/dist/forms/_chassis.js +2 -2
  47. package/dist/forms/env-var-input.js +2 -1
  48. package/dist/forms/file-upload.js +2 -1
  49. package/dist/index.d.ts +17 -1
  50. package/dist/index.js +18 -2
  51. package/dist/instruments/data-table.js +3 -2
  52. package/dist/instruments/index.js +1 -1
  53. package/dist/instruments/stat.js +1 -1
  54. package/dist/instruments/table.js +1 -1
  55. package/dist/instruments/terminal-frame.js +5 -2
  56. package/dist/layout/grid.js +4 -2
  57. package/dist/layout/index.d.ts +2 -1
  58. package/dist/layout/index.js +2 -1
  59. package/dist/layout/preview.js +4 -188
  60. package/dist/layout/reveal.d.ts +44 -0
  61. package/dist/layout/reveal.js +106 -0
  62. package/dist/layout/sidebar.js +88 -52
  63. package/dist/lib/cn.js +23 -5
  64. package/dist/lib/particle-field-shaders.js +236 -0
  65. package/dist/lib/particle-field.js +210 -0
  66. package/dist/midi/spectrum-visualizer.js +2 -1
  67. package/dist/overlays/_surface.d.ts +2 -2
  68. package/dist/primitives/button.js +22 -3
  69. package/dist/primitives/chip.d.ts +1 -1
  70. package/dist/primitives/chip.js +63 -6
  71. package/dist/styles.css +26 -0
  72. package/dist/system/_scoped-pairing.js +18 -0
  73. package/dist/system/_stage-scope.js +199 -0
  74. package/dist/system/_style-check.js +1 -1
  75. package/dist/system/_style-chip.js +1 -1
  76. package/dist/system/_style-field-chassis.js +14 -1
  77. package/dist/system/_style-group-label.js +7 -3
  78. package/dist/system/_style-hero-title.js +41 -0
  79. package/dist/system/_style-kbd.js +1 -1
  80. package/dist/system/_style-label-ink.js +12 -5
  81. package/dist/system/_style-menu.js +1 -1
  82. package/dist/system/_style-page-title.js +1 -1
  83. package/dist/system/_style-segmented-control.js +1 -1
  84. package/dist/system/_style-skeleton.js +1 -1
  85. package/dist/system/_style-tab.js +1 -1
  86. package/dist/system/font-scope.d.ts +38 -0
  87. package/dist/system/font-scope.js +69 -0
  88. package/dist/system/frame-clock.d.ts +33 -0
  89. package/dist/system/frame-clock.js +55 -0
  90. package/dist/system/index.d.ts +4 -1
  91. package/dist/system/index.js +4 -1
  92. package/dist/system/portal.js +7 -1
  93. package/dist/system/still.d.ts +32 -0
  94. package/dist/system/still.js +60 -0
  95. package/manifest/components/alert-dialog.json +1 -1
  96. package/manifest/components/announcement-bar.json +82 -0
  97. package/manifest/components/app-bar.json +3 -2
  98. package/manifest/components/app-shell.json +3 -0
  99. package/manifest/components/autocomplete.json +2 -0
  100. package/manifest/components/band.json +2 -1
  101. package/manifest/components/bento.json +13 -13
  102. package/manifest/components/button.json +1 -0
  103. package/manifest/components/channel-matrix.json +1 -0
  104. package/manifest/components/chart-tooltip-content.json +1 -0
  105. package/manifest/components/checkbox-group.json +1 -1
  106. package/manifest/components/checkbox.json +1 -1
  107. package/manifest/components/chip.json +1 -0
  108. package/manifest/components/color-area.json +10 -0
  109. package/manifest/components/color-field.json +3 -0
  110. package/manifest/components/color-picker.json +3 -0
  111. package/manifest/components/combobox.json +2 -0
  112. package/manifest/components/command-palette.json +1 -0
  113. package/manifest/components/composer.json +3 -0
  114. package/manifest/components/context-menu.json +1 -1
  115. package/manifest/components/data-table-pagination.json +3 -0
  116. package/manifest/components/data-table-toolbar.json +3 -0
  117. package/manifest/components/date-field.json +3 -0
  118. package/manifest/components/date-picker.json +3 -0
  119. package/manifest/components/date-range-picker.json +3 -0
  120. package/manifest/components/delegation-card.json +6 -0
  121. package/manifest/components/density.json +6 -2
  122. package/manifest/components/dialog.json +1 -1
  123. package/manifest/components/dmx-bar.json +1 -1
  124. package/manifest/components/dmx-strip.json +1 -1
  125. package/manifest/components/drawer.json +1 -1
  126. package/manifest/components/dropdown-menu.json +1 -0
  127. package/manifest/components/env-var-input.json +3 -0
  128. package/manifest/components/file-upload.json +5 -0
  129. package/manifest/components/font-scope.json +82 -0
  130. package/manifest/components/footer.json +0 -1
  131. package/manifest/components/gloss-object.json +81 -0
  132. package/manifest/components/grid.json +6 -6
  133. package/manifest/components/halftone.json +79 -0
  134. package/manifest/components/hero.json +204 -0
  135. package/manifest/components/hover-card.json +1 -1
  136. package/manifest/components/input-group.json +3 -0
  137. package/manifest/components/input.json +3 -0
  138. package/manifest/components/kbd.json +1 -0
  139. package/manifest/components/keyword.json +67 -0
  140. package/manifest/components/ledger.json +5 -5
  141. package/manifest/components/logo-strip.json +93 -0
  142. package/manifest/components/markdown-text.json +3 -3
  143. package/manifest/components/menubar.json +1 -1
  144. package/manifest/components/message.json +8 -0
  145. package/manifest/components/motif.json +90 -0
  146. package/manifest/components/multi-select.json +2 -0
  147. package/manifest/components/musical-time-input.json +3 -0
  148. package/manifest/components/navigation-menu.json +1 -0
  149. package/manifest/components/number-field.json +3 -0
  150. package/manifest/components/otp-field.json +3 -0
  151. package/manifest/components/page-shell.json +5 -0
  152. package/manifest/components/particle-logo.json +140 -0
  153. package/manifest/components/particle-mark.json +75 -0
  154. package/manifest/components/password-input.json +3 -0
  155. package/manifest/components/popover.json +1 -1
  156. package/manifest/components/preview.json +10 -4
  157. package/manifest/components/radio-group.json +0 -1
  158. package/manifest/components/radio.json +0 -1
  159. package/manifest/components/reveal.json +106 -0
  160. package/manifest/components/ribbon.json +65 -0
  161. package/manifest/components/scrollable-tabs-list.json +1 -0
  162. package/manifest/components/scrub-input.json +3 -0
  163. package/manifest/components/search-input.json +3 -0
  164. package/manifest/components/segmented-control.json +1 -0
  165. package/manifest/components/select.json +3 -0
  166. package/manifest/components/sheet.json +1 -1
  167. package/manifest/components/sidebar.json +1 -0
  168. package/manifest/components/skeleton.json +1 -0
  169. package/manifest/components/spectrum-visualizer.json +10 -0
  170. package/manifest/components/stack.json +4 -4
  171. package/manifest/components/stat-band.json +68 -0
  172. package/manifest/components/stat.json +1 -1
  173. package/manifest/components/still-provider.json +60 -0
  174. package/manifest/components/switch.json +0 -1
  175. package/manifest/components/table.json +2 -2
  176. package/manifest/components/tabs.json +1 -0
  177. package/manifest/components/tags-input.json +2 -0
  178. package/manifest/components/text-scramble.json +90 -0
  179. package/manifest/components/textarea.json +3 -0
  180. package/manifest/components/theme-configurator.json +1 -0
  181. package/manifest/components/theme-provider.json +10 -4
  182. package/manifest/components/time-field.json +3 -0
  183. package/manifest/components/toast.json +1 -0
  184. package/manifest/components/tooltip.json +1 -1
  185. package/manifest/fixtures.json +18 -0
  186. package/manifest/manifest.json +368 -80
  187. package/manifest/tokens.json +93 -3
  188. package/package.json +6 -6
  189. package/dist/system/_paint-ground-pattern.js +0 -30
@@ -166,7 +166,6 @@
166
166
  "--cue-control-sm",
167
167
  "--cue-fg",
168
168
  "--cue-fg-muted",
169
- "--cue-fg-subtle",
170
169
  "--cue-font-mono",
171
170
  "--cue-leading-ui",
172
171
  "--cue-paint-rim-width",
@@ -195,6 +194,7 @@
195
194
  "--cue-style-body-size",
196
195
  "--cue-style-body-weight",
197
196
  "--cue-style-control-face",
197
+ "--cue-style-control-radius",
198
198
  "--cue-style-display-variation",
199
199
  "--cue-style-group-label-ink",
200
200
  "--cue-style-group-label-pad",
@@ -223,6 +223,7 @@
223
223
  "--cue-style-label-weight",
224
224
  "--cue-style-nav-active-ground",
225
225
  "--cue-style-nav-ink",
226
+ "--cue-style-rail-counter-content",
226
227
  "--cue-style-selected-ground",
227
228
  "--cue-style-selected-ink",
228
229
  "--cue-style-selected-weight",
@@ -17,6 +17,7 @@
17
17
  "tokensUsed": [
18
18
  "--cue-radius-control",
19
19
  "--cue-radius-scale",
20
+ "--cue-style-control-radius",
20
21
  "--cue-style-skeleton-radius",
21
22
  "--cue-surface-2"
22
23
  ],
@@ -113,10 +113,20 @@
113
113
  "defaultVariants": {},
114
114
  "tokensUsed": [
115
115
  "--cue-border",
116
+ "--cue-border-strong",
117
+ "--cue-danger",
116
118
  "--cue-data-ground",
117
119
  "--cue-font-mono",
118
120
  "--cue-radius-control",
121
+ "--cue-radius-scale",
119
122
  "--cue-space-1",
123
+ "--cue-space-3",
124
+ "--cue-space-4",
125
+ "--cue-space-5",
126
+ "--cue-style-control-radius",
127
+ "--cue-style-field-hover-edge",
128
+ "--cue-style-field-pad",
129
+ "--cue-style-field-radius",
120
130
  "--cue-text-micro"
121
131
  ],
122
132
  "summary": "The FFT, drawn: one bar per frequency band, or one line across all of them.",
@@ -23,7 +23,7 @@
23
23
  },
24
24
  {
25
25
  "name": "gap",
26
- "type": "0 | 4 | 8 | 1 | 2 | 3 | 5 | 6 | 7",
26
+ "type": "0 | 1 | 2 | 4 | 8 | 3 | 5 | 6 | 7",
27
27
  "required": false,
28
28
  "defaultValue": "4",
29
29
  "description": "Which rung of the density space ladder to spend between children. Defaults to `4`.",
@@ -31,14 +31,14 @@
31
31
  "kind": "enum",
32
32
  "members": [
33
33
  0,
34
- 4,
35
- 8,
36
34
  1,
37
35
  2,
38
36
  3,
37
+ 4,
39
38
  5,
40
39
  6,
41
- 7
40
+ 7,
41
+ 8
42
42
  ],
43
43
  "min": 0,
44
44
  "max": 8
@@ -0,0 +1,68 @@
1
+ {
2
+ "name": "StatBand",
3
+ "slug": "stat-band",
4
+ "group": "chrome",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": false,
8
+ "description": "A row of named figures: the KPI band under a report's title.\n\nBuilt from `Stat`, so each figure keeps its caption-over-reading voice and its\ntabular numerals. The style set decides the band's look: `style-stat-divider`\ndraws a rule between figures, and `Stat` reads `style-stat-numeral-ink` for the\nreading's colour. Unset, there is no rule and the reading keeps its ink. A\nwrapped row's first figure draws no rule, so a narrow screen never shows a\ndivider hanging off the left edge.\n\nStatic markup — no `\"use client\"`.",
9
+ "props": [
10
+ {
11
+ "name": "stats",
12
+ "type": "readonly StatBandStat[]",
13
+ "required": true,
14
+ "defaultValue": null,
15
+ "description": "The figures, in reading order. One to six sit in one row; more wrap.",
16
+ "control": {
17
+ "kind": "array",
18
+ "fixture": "sample.stats"
19
+ }
20
+ }
21
+ ],
22
+ "typeReferences": [
23
+ "React.ComponentPropsWithoutRef<\"div\">"
24
+ ],
25
+ "subcomponents": [],
26
+ "parts": [],
27
+ "variants": {},
28
+ "defaultVariants": {},
29
+ "tokensUsed": [
30
+ "--cue-space-5",
31
+ "--cue-style-stat-divider"
32
+ ],
33
+ "summary": "A row of named figures, each a `Stat`: the KPI band under a report's title.",
34
+ "examples": [
35
+ {
36
+ "title": "Usage",
37
+ "code": "<StatBand stats={[{ label: \"SKUs\", value: \"1,091\" }, { label: \"Brands\", value: \"148\" }]} />",
38
+ "language": "tsx"
39
+ }
40
+ ],
41
+ "status": "stable",
42
+ "url": "/docs/components/stat-band",
43
+ "mdUrl": "/docs/components/stat-band.md",
44
+ "jsonUrl": "/r/components/stat-band.json",
45
+ "whenToUse": [
46
+ "Three to six headline figures under a report or dashboard title.",
47
+ "Inside `Hero`'s `stats` slot, where the inverse card draws them on its dark ground."
48
+ ],
49
+ "whenNotToUse": [
50
+ "A table of figures to compare. Use `Table` or `DataTable`.",
51
+ "One figure on its own. Use `Stat`."
52
+ ],
53
+ "commonMistakes": [
54
+ "Drawing dividers by hand. The style set's `style-stat-divider` decides whether figures are ruled, and a wrapped row's first figure drops its rule."
55
+ ],
56
+ "specimens": [
57
+ {
58
+ "title": "StatBand",
59
+ "group": "chrome",
60
+ "components": [
61
+ "StatBand"
62
+ ],
63
+ "code": "<StatBand\n className=\"w-full\"\n stats={Array.from({ length: 7 }, (_, index) => ({\n label: [\"Lines\", \"Brands\", \"Stores\", \"Weeks\", \"Cases\", \"Suppliers\", \"Regions\"][index]!,\n value: [\"1,091\", \"148\", \"812\", \"52\", \"4.2m\", \"63\", \"9\"][index]!,\n }))}\n/>",
64
+ "note": "A row of named figures, built from Stat. The set draws the rule between them and picks the reading's ink; a wrapped row's first figure never hangs a rule off the edge.",
65
+ "interaction": "none. Narrow the window: seven figures wrap without a stray divider."
66
+ }
67
+ ]
68
+ }
@@ -73,7 +73,6 @@
73
73
  "--cue-danger",
74
74
  "--cue-fg",
75
75
  "--cue-fg-muted",
76
- "--cue-fg-subtle",
77
76
  "--cue-font-mono",
78
77
  "--cue-info",
79
78
  "--cue-ok",
@@ -90,6 +89,7 @@
90
89
  "--cue-style-stat-detail-size",
91
90
  "--cue-style-stat-gap",
92
91
  "--cue-style-stat-leading",
92
+ "--cue-style-stat-numeral-ink",
93
93
  "--cue-style-stat-size",
94
94
  "--cue-style-stat-tracking",
95
95
  "--cue-style-stat-weight",
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "StillProvider",
3
+ "slug": "still-provider",
4
+ "group": "system",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "Hold a subtree still (see {@link useStill}). A gallery frame mounts one with\n`still` when it is a thumbnail.",
9
+ "props": [
10
+ {
11
+ "name": "still",
12
+ "type": "boolean",
13
+ "required": true,
14
+ "defaultValue": null,
15
+ "description": "`true` holds everything under it still. Nested providers can only add stillness, never remove it.",
16
+ "control": {
17
+ "kind": "boolean"
18
+ }
19
+ },
20
+ {
21
+ "name": "children",
22
+ "type": "ReactNode",
23
+ "required": false,
24
+ "defaultValue": null,
25
+ "description": "What it holds still. Optional, as `ThemeProvider`'s is: an empty provider renders nothing.",
26
+ "control": {
27
+ "kind": "node",
28
+ "fixture": "children.text"
29
+ }
30
+ }
31
+ ],
32
+ "typeReferences": [],
33
+ "subcomponents": [],
34
+ "parts": [],
35
+ "variants": {},
36
+ "defaultVariants": {},
37
+ "tokensUsed": [],
38
+ "summary": "Holds a subtree still: no motif animates, no replay plays, no live readout loops.",
39
+ "examples": [
40
+ {
41
+ "title": "Usage",
42
+ "code": "<StillProvider still><Page /></StillProvider>",
43
+ "language": "tsx"
44
+ }
45
+ ],
46
+ "status": "stable",
47
+ "url": "/docs/components/still-provider",
48
+ "mdUrl": "/docs/components/still-provider.md",
49
+ "jsonUrl": "/r/components/still-provider.json",
50
+ "whenToUse": [
51
+ "A gallery thumbnail or any preview that must cost nothing at rest.",
52
+ "A screenshot or print view."
53
+ ],
54
+ "whenNotToUse": [
55
+ "Reduced motion for a reader. `useStill` already folds in `prefers-reduced-motion`; the provider is for previews."
56
+ ],
57
+ "commonMistakes": [
58
+ "Expecting a nested `still={false}` to undo an outer one. Stillness only adds."
59
+ ]
60
+ }
@@ -62,7 +62,6 @@
62
62
  "--cue-danger-fg",
63
63
  "--cue-fg",
64
64
  "--cue-fg-muted",
65
- "--cue-fg-subtle",
66
65
  "--cue-focus",
67
66
  "--cue-focus-ring",
68
67
  "--cue-font-mono",
@@ -104,16 +104,16 @@
104
104
  },
105
105
  {
106
106
  "name": "headingLevel",
107
- "type": "4 | 2 | 3 | 5 | 6",
107
+ "type": "2 | 4 | 3 | 5 | 6",
108
108
  "required": false,
109
109
  "defaultValue": null,
110
110
  "description": "Make the label slot a real heading element. Defaults to `undefined` — no\nheading, and the label stays the `<span>` it has always been.\n\n**Set this rather than passing a heading as `label`.** The label slot wraps\nwhatever it is given, so an `<h2>` handed in as `label` lands *inside* a\n`<span>` — which renders, and exposes the heading, and does not validate: a\n`<span>` is phrasing content and may not contain a heading. With this prop\nthe wrapper *is* the heading (`<h2 data-slot=\"table-group-label\">`), so\nthere is nothing to nest.\n\nA heading inside a `<th>` is valid — `<th>` takes flow content — and it is\nuseful: a screen-reader user navigates a long grouped table by heading, and\nwithout one the group names are reachable only by walking the rows. The\n`scope=\"rowgroup\"` association is untouched either way; this adds the\ndivider to the document outline, it does not change what the cell heads.\n\nLevels run `2`–`6` because the outline has to describe the real nesting of\nthe page the table sits in, not the table's own idea of itself — the same\nruling as {@link LedgerTierProps.headingLevel }. There is no `1`: a group\ndivider is never the title of the document.",
111
111
  "control": {
112
112
  "kind": "enum",
113
113
  "members": [
114
- 4,
115
114
  2,
116
115
  3,
116
+ 4,
117
117
  5,
118
118
  6
119
119
  ],
@@ -120,6 +120,7 @@
120
120
  "--cue-space-4",
121
121
  "--cue-space-5",
122
122
  "--cue-style-control-face",
123
+ "--cue-style-control-radius",
123
124
  "--cue-style-focus-width",
124
125
  "--cue-style-group-gap",
125
126
  "--cue-style-segment-edge",
@@ -261,6 +261,7 @@
261
261
  "--cue-style-chip-size",
262
262
  "--cue-style-chip-tracking",
263
263
  "--cue-style-control-face",
264
+ "--cue-style-control-radius",
264
265
  "--cue-style-control-step-size",
265
266
  "--cue-style-disabled-edge",
266
267
  "--cue-style-disabled-fill",
@@ -270,6 +271,7 @@
270
271
  "--cue-style-field-focus-offset",
271
272
  "--cue-style-field-hover-edge",
272
273
  "--cue-style-field-pad",
274
+ "--cue-style-field-radius",
273
275
  "--cue-style-focus-edge",
274
276
  "--cue-style-focus-width",
275
277
  "--cue-style-glyph-ink",
@@ -0,0 +1,90 @@
1
+ {
2
+ "name": "TextScramble",
3
+ "slug": "text-scramble",
4
+ "group": "brand",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "A line that cycles through phrases, scrambling each one in — cueplusplus.com's\n\"what we do\" cycler, ported verbatim (`what-we-do.tsx`; spec\n2026-10-04-cue-site-verbatim §4.2).\n\nEach frame, every character not yet locked shows a random glyph from the\neffect's set; spaces are never scrambled; characters lock left to right. A\nphrase holds for 1.8s once it has revealed, so a long phrase and a slow effect\nstill finish before the next begins: the next starts after\n`length × revealEvery × speed + 1800ms`.\n\n**Reduced motion** shows each phrase whole, one every 2.6s, as the site does.\n**Held still** (a gallery thumbnail, under a still `StillProvider`) shows the\nfirst phrase and schedules nothing, which is this library's departure from the\nsource: a thumbnail costs nothing at rest. The text is written straight into\nthe DOM node, as the source does, so thirty-five frames a second never\nre-render React.",
9
+ "props": [
10
+ {
11
+ "name": "phrases",
12
+ "type": "readonly string[]",
13
+ "required": true,
14
+ "defaultValue": null,
15
+ "description": "The phrases to cycle through, in order, looping. The first is what renders before any script runs.",
16
+ "control": {
17
+ "kind": "array",
18
+ "fixture": "agent.transcript"
19
+ }
20
+ },
21
+ {
22
+ "name": "label",
23
+ "type": "string",
24
+ "required": true,
25
+ "defaultValue": null,
26
+ "description": "What assistive technology reads instead of the animation: one sentence that\nnames the whole cycle. The animated text is hidden from it, because a\nscramble read aloud is noise.",
27
+ "control": {
28
+ "kind": "string"
29
+ }
30
+ },
31
+ {
32
+ "name": "effect",
33
+ "type": "\"matrix\" | \"flap\"",
34
+ "required": false,
35
+ "defaultValue": "matrix",
36
+ "description": "`matrix` (the default): letters, digits and symbols at 28ms a frame, one\ncharacter locking per frame. `flap`: upper-cased, a departure board's\nletters at 55ms a frame, one character locking every two frames.",
37
+ "control": {
38
+ "kind": "enum",
39
+ "members": [
40
+ "matrix",
41
+ "flap"
42
+ ]
43
+ }
44
+ }
45
+ ],
46
+ "typeReferences": [
47
+ "Omit<React.ComponentPropsWithoutRef<\"p\">, \"children\">"
48
+ ],
49
+ "subcomponents": [],
50
+ "parts": [],
51
+ "variants": {},
52
+ "defaultVariants": {},
53
+ "tokensUsed": [],
54
+ "summary": "A line that cycles through phrases, scrambling each one in — matrix glyphs at 28ms a frame, or a departure board's flap — with one sentence for assistive technology.",
55
+ "examples": [
56
+ {
57
+ "title": "Usage",
58
+ "code": "<TextScramble phrases={[\"we build software\", \"we design stages\"]} label=\"We build software and design stages.\" />",
59
+ "language": "tsx"
60
+ }
61
+ ],
62
+ "status": "stable",
63
+ "url": "/docs/components/text-scramble",
64
+ "mdUrl": "/docs/components/text-scramble.md",
65
+ "jsonUrl": "/r/components/text-scramble.json",
66
+ "whenToUse": [
67
+ "A hero's rotating value line: what you do, said several ways, under the headline.",
68
+ "A short status that changes on a slow cycle, where the change itself is part of the voice."
69
+ ],
70
+ "whenNotToUse": [
71
+ "Anything a reader must read at a given moment, such as an error, a price or a count: the text is unreadable while it scrambles.",
72
+ "Long sentences. A phrase holds for 1.8s after it settles, so a long one spends most of its turn scrambling."
73
+ ],
74
+ "commonMistakes": [
75
+ "Leaving `label` as one of the phrases. Assistive technology reads `label` instead of the animation, so it should name the whole cycle in one sentence.",
76
+ "Expecting it to scramble under reduced motion. Each phrase is shown whole, one every 2.6s; held still, the first phrase stays."
77
+ ],
78
+ "specimens": [
79
+ {
80
+ "title": "TextScramble",
81
+ "group": "brand",
82
+ "components": [
83
+ "TextScramble"
84
+ ],
85
+ "code": "<TextScramble\n phrases={[\"we build software // and run on it ourselves\", \"we design stages // in 3D, before they're real\"]}\n label=\"We build software and design stages.\"\n className=\"font-mono text-(length:--cue-text-ui) text-fg-muted\"\n/>",
86
+ "note": "A line that cycles through phrases, scrambling each one in: matrix glyphs at 28ms a frame, or a departure board's flap. Assistive technology reads the label instead.",
87
+ "interaction": "none. Prefer reduced motion and each phrase is shown whole; held still, the first phrase stays."
88
+ }
89
+ ]
90
+ }
@@ -80,11 +80,13 @@
80
80
  "--cue-paint-stroke-to",
81
81
  "--cue-paint-stroke-width",
82
82
  "--cue-radius-control",
83
+ "--cue-radius-scale",
83
84
  "--cue-space-3",
84
85
  "--cue-space-4",
85
86
  "--cue-space-5",
86
87
  "--cue-style-body-weight",
87
88
  "--cue-style-check-edge",
89
+ "--cue-style-control-radius",
88
90
  "--cue-style-control-step-size",
89
91
  "--cue-style-disabled-edge",
90
92
  "--cue-style-disabled-fill",
@@ -93,6 +95,7 @@
93
95
  "--cue-style-field-focus-offset",
94
96
  "--cue-style-field-hover-edge",
95
97
  "--cue-style-field-pad",
98
+ "--cue-style-field-radius",
96
99
  "--cue-style-focus-edge",
97
100
  "--cue-style-focus-width",
98
101
  "--cue-style-input-face",
@@ -155,6 +155,7 @@
155
155
  "--cue-style-body-size",
156
156
  "--cue-style-body-weight",
157
157
  "--cue-style-control-face",
158
+ "--cue-style-control-radius",
158
159
  "--cue-style-display-variation",
159
160
  "--cue-style-group-label-ink",
160
161
  "--cue-style-group-label-pad",
@@ -61,7 +61,7 @@
61
61
  },
62
62
  {
63
63
  "name": "font",
64
- "type": "\"source\" | \"system\" | \"geist\" | \"geist-mono\" | \"inter\" | \"plex\" | \"roboto\" | \"apple\" | \"office\" | \"inter-source\" | \"dm\" | \"calsans\"",
64
+ "type": "\"source\" | \"system\" | \"geist\" | \"geist-mono\" | \"inter\" | \"plex\" | \"roboto\" | \"apple\" | \"office\" | \"inter-source\" | \"dm\" | \"calsans\" | \"fraunces-mono\" | \"jetbrains-mono\"",
65
65
  "required": false,
66
66
  "defaultValue": null,
67
67
  "description": "Initial font pairing.\n\nDefaults to the pairing the active theme's manifest names in\n`fontPairings.default` — §5's rule, the density prop's rule one axis over\n— and to `\"system\"` when it names none: the platform's own faces, nothing\ndownloaded, and the theme keeps whatever monospace it authored.\n\nA pairing that needs delivering is a set of *names*: this library ships no\nfont files, and a pairing nobody delivers falls through its stack to the\nplatform rather than failing. See `FONT_PAIRINGS[font].faces` for the\ncustom properties an app assigns to make one resolve.\n\n**Root-level only.** There is no font island: a nested provider forwards\nthis axis to the root, ignores this prop, and its `setFont` drives the root.\nA page that changed face halfway down is a page with a bug, and a specimen\nthat genuinely wants one — a picker row, a docs page showing all twelve —\nneeds nothing from this library but `data-font` on a `<div>`.",
@@ -79,19 +79,22 @@
79
79
  "office",
80
80
  "inter-source",
81
81
  "dm",
82
- "calsans"
82
+ "calsans",
83
+ "fraunces-mono",
84
+ "jetbrains-mono"
83
85
  ]
84
86
  }
85
87
  },
86
88
  {
87
89
  "name": "styleSet",
88
- "type": "\"console\" | \"editorial\" | \"marketing\" | \"graphite\" | \"tender\" | \"zine\" | \"kiln\" | \"porcelain\"",
90
+ "type": "\"command\" | \"console\" | \"editorial\" | \"marketing\" | \"graphite\" | \"tender\" | \"zine\" | \"kiln\" | \"porcelain\" | \"ledger\" | \"monolith\" | \"prism\"",
89
91
  "required": false,
90
92
  "defaultValue": null,
91
93
  "description": "Page composition for this subtree: `console`, `editorial`, `marketing` or\n`graphite`.\n\n**`styleSet`, not `style`.** This interface already has a\n`style?: React.CSSProperties` a few lines below, applied to the provider\nroot, and a second meaning for that name would be the one collision every\nconsumer of this component would have to think about. The DOM attribute is\n`data-style`, matching the four public axes — `data-cue-*` is this tree's\nprefix for *internal* attributes (`data-cue-theme`, `data-cue-fidelity`), and\na public axis wearing the internal prefix would be the more confusing of the\ntwo mistakes.\n\nUnset, **no attribute is stamped at all**, and that is the promise: an\napplication that has never heard of this axis renders the markup it rendered\nbefore it existed and stores the preference object it stored before it\nexisted. A style set is opt-in page composition, not a fourth thing every\npage has.\n\nLike the other three axes this is an *initial* value the provider then holds\nas state, so `setStyleSet` can drive it; a changed prop is adopted after\nmount. Unlike the font pairing it has an island form, so a nested provider\nthat names a set holds its own rather than handing the axis up to the root.\n\nA nested provider that names **none** holds none: the set around it\ninherits through its element, and `useTheme().styleSet` inside it reports\nthat set **live** — a stored set the root restores after mount, or a later\n`setStyleSet` at the root, reaches it and its portals. If it names a\n`theme` or a `mode`, it also restates that set as `data-style` on its\nelement — still the page's set, followed live, never its own — because a\nset's block declares values that read the theme (a band's rule and\nground), and a custom property resolves where it is declared: restated,\nthey resolve against this island's theme instead of the page's.",
92
94
  "control": {
93
95
  "kind": "enum",
94
96
  "members": [
97
+ "command",
95
98
  "console",
96
99
  "editorial",
97
100
  "marketing",
@@ -99,7 +102,10 @@
99
102
  "tender",
100
103
  "zine",
101
104
  "kiln",
102
- "porcelain"
105
+ "porcelain",
106
+ "ledger",
107
+ "monolith",
108
+ "prism"
103
109
  ]
104
110
  }
105
111
  },
@@ -67,12 +67,14 @@
67
67
  "--cue-paint-stroke-to",
68
68
  "--cue-paint-stroke-width",
69
69
  "--cue-radius-control",
70
+ "--cue-radius-scale",
70
71
  "--cue-space-1",
71
72
  "--cue-space-3",
72
73
  "--cue-space-4",
73
74
  "--cue-space-5",
74
75
  "--cue-style-body-weight",
75
76
  "--cue-style-check-edge",
77
+ "--cue-style-control-radius",
76
78
  "--cue-style-control-step-size",
77
79
  "--cue-style-disabled-edge",
78
80
  "--cue-style-disabled-fill",
@@ -81,6 +83,7 @@
81
83
  "--cue-style-field-focus-offset",
82
84
  "--cue-style-field-hover-edge",
83
85
  "--cue-style-field-pad",
86
+ "--cue-style-field-radius",
84
87
  "--cue-style-focus-edge",
85
88
  "--cue-style-focus-width",
86
89
  "--cue-style-input-face",
@@ -109,6 +109,7 @@
109
109
  "--cue-style-body-size",
110
110
  "--cue-style-body-weight",
111
111
  "--cue-style-control-face",
112
+ "--cue-style-control-radius",
112
113
  "--cue-style-display-variation",
113
114
  "--cue-style-focus-width",
114
115
  "--cue-style-group-label-ink",
@@ -145,7 +145,6 @@
145
145
  "--cue-control-sm",
146
146
  "--cue-fg",
147
147
  "--cue-fg-muted",
148
- "--cue-fg-subtle",
149
148
  "--cue-font-mono",
150
149
  "--cue-leading-ui",
151
150
  "--cue-paint-rim-width",
@@ -172,6 +171,7 @@
172
171
  "--cue-style-body-size",
173
172
  "--cue-style-body-weight",
174
173
  "--cue-style-control-face",
174
+ "--cue-style-control-radius",
175
175
  "--cue-style-display-variation",
176
176
  "--cue-style-group-label-ink",
177
177
  "--cue-style-group-label-pad",
@@ -37,6 +37,16 @@
37
37
  "kind": "node",
38
38
  "label": "Three toggles"
39
39
  },
40
+ {
41
+ "id": "media.motif",
42
+ "kind": "node",
43
+ "label": "A seeded motif"
44
+ },
45
+ {
46
+ "id": "media.stats",
47
+ "kind": "node",
48
+ "label": "A band of four figures"
49
+ },
40
50
  {
41
51
  "id": "bento.tiles",
42
52
  "kind": "node",
@@ -119,6 +129,14 @@
119
129
  "kind": "array",
120
130
  "label": "5 cue rows"
121
131
  },
132
+ {
133
+ "id": "sample.stats",
134
+ "kind": "array",
135
+ "label": "4 named figures",
136
+ "accepts": [
137
+ "readonly StatBandStat[]"
138
+ ]
139
+ },
122
140
  {
123
141
  "id": "sample.blend-modes",
124
142
  "kind": "array",