@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
@@ -0,0 +1,204 @@
1
+ {
2
+ "name": "Hero",
3
+ "slug": "hero",
4
+ "group": "chrome",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": false,
8
+ "description": "The opening of a page: a title, the line under it, what to do next, and art.\n\n**The Look decides the arrangement, not this component.** The grid reads the\nstyle set's hero recipe — `style-hero-columns`, `style-hero-align` and\n`style-hero-media-order` — so the same hero opens centred under one Look, with\nits art beside the words under another, and with the art first under a third,\nwith no prop changed. Unset, it is one column, start-aligned, art after the\nwords.\n\n**No media, one column**, whatever the recipe says: two columns with nothing in\nthe second is half a page of nothing.\n\n`surface=\"inverse\"` is a theme island in dark mode, so every ink inside it —\nthe title, the lede, a button's fill and its focus ring — is the dark palette's,\nand an overlay opened from it inherits that. The island carries\n`data-cue-rescope`, where the token build re-declares the active set's and\npack's inks, so the card is right in the first frame, before hydration.\n\nStatic markup — no `\"use client\"`.",
9
+ "props": [
10
+ {
11
+ "name": "eyebrow",
12
+ "type": "ReactNode",
13
+ "required": false,
14
+ "defaultValue": null,
15
+ "description": "A short line above the title, usually an `Eyebrow`.",
16
+ "control": {
17
+ "kind": "node",
18
+ "fixture": "children.text"
19
+ }
20
+ },
21
+ {
22
+ "name": "title",
23
+ "type": "ReactNode",
24
+ "required": true,
25
+ "defaultValue": null,
26
+ "description": "The title's first line. A hero without a title is a band; use `Band`.",
27
+ "control": {
28
+ "kind": "node",
29
+ "fixture": "children.text"
30
+ }
31
+ },
32
+ {
33
+ "name": "titleSecond",
34
+ "type": "ReactNode",
35
+ "required": false,
36
+ "defaultValue": null,
37
+ "description": "The title's second line, drawn in the style set's second ink: the accent, a\nmuted ink or the keyword gradient, by the Look. Omit it for a one-line title.",
38
+ "control": {
39
+ "kind": "node",
40
+ "fixture": "children.text"
41
+ }
42
+ },
43
+ {
44
+ "name": "level",
45
+ "type": "1 | 2 | 3",
46
+ "required": false,
47
+ "defaultValue": "1",
48
+ "description": "The title's heading level. `1`, the default, is a page's opening; `2` or `3`\nis a hero that opens a section under the page's own `<h1>`, or a preview of\none on a page about something else.",
49
+ "control": {
50
+ "kind": "enum",
51
+ "members": [
52
+ 1,
53
+ 2,
54
+ 3
55
+ ],
56
+ "min": 1,
57
+ "max": 3
58
+ }
59
+ },
60
+ {
61
+ "name": "lede",
62
+ "type": "ReactNode",
63
+ "required": false,
64
+ "defaultValue": null,
65
+ "description": "The sentence under the title.",
66
+ "control": {
67
+ "kind": "node",
68
+ "fixture": "children.text"
69
+ }
70
+ },
71
+ {
72
+ "name": "actions",
73
+ "type": "ReactNode",
74
+ "required": false,
75
+ "defaultValue": null,
76
+ "description": "The calls to action, usually a primary and a secondary `Button`.",
77
+ "control": {
78
+ "kind": "node",
79
+ "fixture": "children.text"
80
+ }
81
+ },
82
+ {
83
+ "name": "media",
84
+ "type": "ReactNode",
85
+ "required": false,
86
+ "defaultValue": null,
87
+ "description": "Art beside or behind the words: a `Motif`, an image, a product shot.",
88
+ "control": {
89
+ "kind": "node",
90
+ "fixture": "children.text"
91
+ }
92
+ },
93
+ {
94
+ "name": "stats",
95
+ "type": "ReactNode",
96
+ "required": false,
97
+ "defaultValue": null,
98
+ "description": "A row of figures under the lede, usually a `StatBand`.",
99
+ "control": {
100
+ "kind": "node",
101
+ "fixture": "children.text"
102
+ }
103
+ },
104
+ {
105
+ "name": "surface",
106
+ "type": "\"page\" | \"inverse\"",
107
+ "required": false,
108
+ "defaultValue": "page",
109
+ "description": "`page` draws the hero on the page's own ground. `inverse` draws it as a dark\ncard on any page — its whole colour scope flipped, controls and focus included —\nwhich is how a report opens on a light page. Defaults to `\"page\"`.",
110
+ "control": {
111
+ "kind": "enum",
112
+ "members": [
113
+ "page",
114
+ "inverse"
115
+ ]
116
+ }
117
+ }
118
+ ],
119
+ "typeReferences": [
120
+ "Omit<React.ComponentPropsWithoutRef<\"section\">, \"title\">"
121
+ ],
122
+ "subcomponents": [],
123
+ "parts": [],
124
+ "variants": {},
125
+ "defaultVariants": {},
126
+ "tokensUsed": [
127
+ "--cue-bg",
128
+ "--cue-fg",
129
+ "--cue-fg-muted",
130
+ "--cue-font-mono",
131
+ "--cue-leading-ui",
132
+ "--cue-radius-surface",
133
+ "--cue-space-3",
134
+ "--cue-space-5",
135
+ "--cue-space-7",
136
+ "--cue-style-body-face",
137
+ "--cue-style-body-weight",
138
+ "--cue-style-display",
139
+ "--cue-style-display-case",
140
+ "--cue-style-display-face",
141
+ "--cue-style-display-variation",
142
+ "--cue-style-display-weight",
143
+ "--cue-style-heading-ink",
144
+ "--cue-style-hero-align",
145
+ "--cue-style-hero-columns",
146
+ "--cue-style-hero-media-order",
147
+ "--cue-style-hero-title-clip-2",
148
+ "--cue-style-hero-title-fill-2",
149
+ "--cue-style-hero-title-ink-2",
150
+ "--cue-style-hero-title-size",
151
+ "--cue-style-hero-title-text-2",
152
+ "--cue-style-leading-display",
153
+ "--cue-style-lede-ink",
154
+ "--cue-style-lede-leading",
155
+ "--cue-style-lede-size",
156
+ "--cue-style-page-title-face",
157
+ "--cue-style-page-title-leading",
158
+ "--cue-style-page-title-size",
159
+ "--cue-style-page-title-tracking",
160
+ "--cue-style-page-title-weight",
161
+ "--cue-style-prose-ink",
162
+ "--cue-style-prose-tracking",
163
+ "--cue-style-tracking-display",
164
+ "--cue-text-title",
165
+ "--cue-text-ui"
166
+ ],
167
+ "summary": "The opening of a page: a title, its second line, what to do next, and art — arranged by the Look.",
168
+ "examples": [
169
+ {
170
+ "title": "Usage",
171
+ "code": "<Hero eyebrow={<Eyebrow>Category report</Eyebrow>} title=\"Snacks & nuts\" titleSecond=\"Range review\"\n lede=\"Every recommendation has a boundary.\" actions={<Button>Open the report</Button>} />",
172
+ "language": "tsx"
173
+ }
174
+ ],
175
+ "status": "stable",
176
+ "url": "/docs/components/hero",
177
+ "mdUrl": "/docs/components/hero.md",
178
+ "jsonUrl": "/r/components/hero.json",
179
+ "whenToUse": [
180
+ "The top of a landing, product or report page, where one statement and one action lead.",
181
+ "A report's opening card: `surface='inverse'` with `stats` draws the dark KPI hero on a light page."
182
+ ],
183
+ "whenNotToUse": [
184
+ "A section further down the page. Use `Band` with a `SectionHeader`; a page has one hero.",
185
+ "An app screen. Apps open on their work, not a statement; use `AppShell` and `PageShell`."
186
+ ],
187
+ "commonMistakes": [
188
+ "Passing layout props to make it centred or two-column. The Look decides that through its style set; a hero that hard-codes it cannot be re-skinned.",
189
+ "Two columns with no `media`: the hero falls back to one column, by design, so supply the art or let it be one column.",
190
+ "Leaving the default `level={1}` on a hero drawn inside a page that already has its own `<h1>` — a preview, a tile, an embedded page. Pass `level={2}`."
191
+ ],
192
+ "specimens": [
193
+ {
194
+ "title": "Hero",
195
+ "group": "chrome",
196
+ "components": [
197
+ "Hero"
198
+ ],
199
+ "code": "<div className=\"grid w-full gap-(--cue-space-7)\">\n <Hero\n eyebrow={<Eyebrow>Category report</Eyebrow>}\n title=\"Snacks and nuts\"\n titleSecond=\"Range review, week 32\"\n lede=\"Every recommendation has a boundary, and every boundary has a reason you can read.\"\n actions={\n <>\n <Button variant=\"primary\">Open the report</Button>\n <Button>Download the deck</Button>\n </>\n }\n media={<div className=\"aspect-[4/3] w-full rounded-(--radius-surface) bg-surface-2\" />}\n />\n <Hero\n surface=\"inverse\"\n eyebrow={<Eyebrow>This week</Eyebrow>}\n title=\"Availability held at 97.4%\"\n lede=\"The dark card is the page's choice, not the Look's: an island in dark mode, drawn in the Look's own dark palette.\"\n stats={\n <StatBand\n stats={[\n { label: \"Lines\", value: \"1,091\" },\n { label: \"Brands\", value: \"148\" },\n { label: \"Delisted\", value: \"37\", note: \"of 1,128\" },\n ]}\n />\n }\n />\n</div>",
200
+ "note": "The opening of a page. The style set decides the arrangement — one column or two, centred or start-aligned, art first or after — so this hero changes shape with the Look while its props stay put. With no media it is one column whatever the set says.",
201
+ "interaction": "none of its own; the actions are ordinary Buttons."
202
+ }
203
+ ]
204
+ }
@@ -146,7 +146,6 @@
146
146
  "--cue-control-sm",
147
147
  "--cue-fg",
148
148
  "--cue-fg-muted",
149
- "--cue-fg-subtle",
150
149
  "--cue-font-mono",
151
150
  "--cue-leading-ui",
152
151
  "--cue-paint-rim-width",
@@ -174,6 +173,7 @@
174
173
  "--cue-style-body-size",
175
174
  "--cue-style-body-weight",
176
175
  "--cue-style-control-face",
176
+ "--cue-style-control-radius",
177
177
  "--cue-style-display-variation",
178
178
  "--cue-style-group-label-ink",
179
179
  "--cue-style-group-label-pad",
@@ -87,12 +87,14 @@
87
87
  "--cue-paint-stroke-to",
88
88
  "--cue-paint-stroke-width",
89
89
  "--cue-radius-control",
90
+ "--cue-radius-scale",
90
91
  "--cue-space-2",
91
92
  "--cue-space-3",
92
93
  "--cue-space-4",
93
94
  "--cue-space-5",
94
95
  "--cue-style-body-weight",
95
96
  "--cue-style-check-edge",
97
+ "--cue-style-control-radius",
96
98
  "--cue-style-control-step-size",
97
99
  "--cue-style-disabled-edge",
98
100
  "--cue-style-disabled-fill",
@@ -101,6 +103,7 @@
101
103
  "--cue-style-field-focus-offset",
102
104
  "--cue-style-field-hover-edge",
103
105
  "--cue-style-field-pad",
106
+ "--cue-style-field-radius",
104
107
  "--cue-style-focus-edge",
105
108
  "--cue-style-focus-width",
106
109
  "--cue-style-glyph-ink",
@@ -84,11 +84,13 @@
84
84
  "--cue-paint-stroke-to",
85
85
  "--cue-paint-stroke-width",
86
86
  "--cue-radius-control",
87
+ "--cue-radius-scale",
87
88
  "--cue-space-3",
88
89
  "--cue-space-4",
89
90
  "--cue-space-5",
90
91
  "--cue-style-body-weight",
91
92
  "--cue-style-check-edge",
93
+ "--cue-style-control-radius",
92
94
  "--cue-style-control-step-size",
93
95
  "--cue-style-disabled-edge",
94
96
  "--cue-style-disabled-fill",
@@ -97,6 +99,7 @@
97
99
  "--cue-style-field-focus-offset",
98
100
  "--cue-style-field-hover-edge",
99
101
  "--cue-style-field-pad",
102
+ "--cue-style-field-radius",
100
103
  "--cue-style-focus-edge",
101
104
  "--cue-style-focus-width",
102
105
  "--cue-style-input-face",
@@ -24,6 +24,7 @@
24
24
  "--cue-space-2",
25
25
  "--cue-style-chip-size",
26
26
  "--cue-style-control-face",
27
+ "--cue-style-control-radius",
27
28
  "--cue-style-kbd-edge",
28
29
  "--cue-style-kbd-fill",
29
30
  "--cue-style-kbd-height",
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "Keyword",
3
+ "slug": "keyword",
4
+ "group": "chrome",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": false,
8
+ "description": "A word in a title filled with the Look's keyword gradient.\n\nReads `style-keyword-fill`, a gradient of the theme's own inks, through\n`background-clip: text`. Where the browser cannot clip a background to text, or\nin forced colours, it is the accent instead, so the word is never transparent.\nUnset, the fill is the accent itself.\n\nStatic markup — no `\"use client\"`.",
9
+ "props": [
10
+ {
11
+ "name": "children",
12
+ "type": "ReactNode",
13
+ "required": true,
14
+ "defaultValue": null,
15
+ "description": "The words to mark: one word or a short phrase in a title.",
16
+ "control": {
17
+ "kind": "node",
18
+ "fixture": "children.text"
19
+ }
20
+ }
21
+ ],
22
+ "typeReferences": [
23
+ "React.ComponentPropsWithoutRef<\"span\">"
24
+ ],
25
+ "subcomponents": [],
26
+ "parts": [],
27
+ "variants": {},
28
+ "defaultVariants": {},
29
+ "tokensUsed": [
30
+ "--cue-accent",
31
+ "--cue-style-keyword-fill"
32
+ ],
33
+ "summary": "A word in a title filled with the Look's keyword gradient, with a solid accent fallback.",
34
+ "examples": [
35
+ {
36
+ "title": "Usage",
37
+ "code": "<h1>The world's first <Keyword>predictive</Keyword> retail system.</h1>",
38
+ "language": "tsx"
39
+ }
40
+ ],
41
+ "status": "stable",
42
+ "url": "/docs/components/keyword",
43
+ "mdUrl": "/docs/components/keyword.md",
44
+ "jsonUrl": "/r/components/keyword.json",
45
+ "whenToUse": [
46
+ "One word or a short phrase a marketing title leans on: “the world's first *predictive* system”."
47
+ ],
48
+ "whenNotToUse": [
49
+ "Whole sentences or body copy. A gradient across running text is hard to read.",
50
+ "Links or emphasis in prose. Use `Link` or `<strong>`."
51
+ ],
52
+ "commonMistakes": [
53
+ "Assuming the gradient shows everywhere. Without `background-clip: text`, and in forced colours, it is the accent; the word is never transparent."
54
+ ],
55
+ "specimens": [
56
+ {
57
+ "title": "Keyword",
58
+ "group": "chrome",
59
+ "components": [
60
+ "Keyword"
61
+ ],
62
+ "code": "<p className=\"m-0 text-(length:--cue-text-title) font-semibold text-fg\">\n Payments <Keyword>infrastructure</Keyword> for the internet\n</p>",
63
+ "note": "An inline word filled with the set's keyword gradient. Where text cannot be a background clip it is the accent, and in forced colours it is the system's text colour.",
64
+ "interaction": "none."
65
+ }
66
+ ]
67
+ }
@@ -73,16 +73,16 @@
73
73
  },
74
74
  {
75
75
  "name": "headingLevel",
76
- "type": "4 | 2 | 3",
76
+ "type": "2 | 4 | 3",
77
77
  "required": false,
78
78
  "defaultValue": "2",
79
79
  "description": "Which heading element the tier's name is. Defaults to `2`.\n\nThe outline is the navigation: a screen-reader user moves through a long\nledger by heading, so the levels have to describe the real nesting of the\npage the ledger sits in, not the ledger's own idea of itself.",
80
80
  "control": {
81
81
  "kind": "enum",
82
82
  "members": [
83
- 4,
84
83
  2,
85
- 3
84
+ 3,
85
+ 4
86
86
  ],
87
87
  "min": 2,
88
88
  "max": 4
@@ -170,8 +170,8 @@
170
170
  "control": {
171
171
  "kind": "enum",
172
172
  "members": [
173
- 4,
174
- 3
173
+ 3,
174
+ 4
175
175
  ],
176
176
  "min": 3,
177
177
  "max": 4
@@ -0,0 +1,93 @@
1
+ {
2
+ "name": "LogoStrip",
3
+ "slug": "logo-strip",
4
+ "group": "chrome",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": false,
8
+ "description": "A row of names under a caption: the \"trusted by\" strip of a product page.\n\nText wordmarks only, set in the display face at a muted ink, never an image: a\nreal company's mark is a trademark that is not this library's to draw, and a\ngallery page's names are fictional. The row wraps, and centres when it does.\n\nStatic markup — no `\"use client\"`.",
9
+ "props": [
10
+ {
11
+ "name": "names",
12
+ "type": "readonly string[]",
13
+ "required": true,
14
+ "defaultValue": null,
15
+ "description": "The names, as text. A real company's logo is never drawn here.",
16
+ "control": {
17
+ "kind": "array",
18
+ "fixture": "agent.transcript"
19
+ }
20
+ },
21
+ {
22
+ "name": "caption",
23
+ "type": "ReactNode",
24
+ "required": false,
25
+ "defaultValue": null,
26
+ "description": "The line above the row, e.g. \"Trusted by teams at\".",
27
+ "control": {
28
+ "kind": "node",
29
+ "fixture": "children.text"
30
+ }
31
+ }
32
+ ],
33
+ "typeReferences": [
34
+ "React.ComponentPropsWithoutRef<\"div\">"
35
+ ],
36
+ "subcomponents": [],
37
+ "parts": [],
38
+ "variants": {},
39
+ "defaultVariants": {},
40
+ "tokensUsed": [
41
+ "--cue-fg-muted",
42
+ "--cue-font-mono",
43
+ "--cue-font-sans",
44
+ "--cue-space-4",
45
+ "--cue-space-7",
46
+ "--cue-style-label-case",
47
+ "--cue-style-label-face",
48
+ "--cue-style-label-ink",
49
+ "--cue-style-label-size",
50
+ "--cue-style-label-tracking",
51
+ "--cue-text-label",
52
+ "--cue-text-micro",
53
+ "--cue-text-title",
54
+ "--cue-tracking-caps",
55
+ "--cue-tracking-caps-loose",
56
+ "--cue-tracking-caps-tight"
57
+ ],
58
+ "summary": "A caption and a row of names: the “trusted by” strip of a product page, in text.",
59
+ "examples": [
60
+ {
61
+ "title": "Usage",
62
+ "code": "<LogoStrip caption=\"Trusted by teams at\" names={[\"Northwind\", \"Halcyon\", \"Kestrel\"]} />",
63
+ "language": "tsx"
64
+ }
65
+ ],
66
+ "status": "stable",
67
+ "url": "/docs/components/logo-strip",
68
+ "mdUrl": "/docs/components/logo-strip.md",
69
+ "jsonUrl": "/r/components/logo-strip.json",
70
+ "whenToUse": [
71
+ "Under a landing hero, to say who uses the product.",
72
+ "A row of partner or customer names on a marketing page."
73
+ ],
74
+ "whenNotToUse": [
75
+ "Real company logos. This draws text wordmarks only; a real mark is a trademark that is not ours to draw.",
76
+ "Navigation or links. The names are not interactive."
77
+ ],
78
+ "commonMistakes": [
79
+ "Using real client names on a gallery or demo page. Gallery pages are fictional."
80
+ ],
81
+ "specimens": [
82
+ {
83
+ "title": "LogoStrip",
84
+ "group": "chrome",
85
+ "components": [
86
+ "LogoStrip"
87
+ ],
88
+ "code": "<LogoStrip caption=\"Trusted by teams at\" names={[\"Northwind\", \"Contoso\", \"Fabrikam\", \"Tailspin\", \"Litware\"]} />",
89
+ "note": "A row of wordmarks, drawn as text. A real brand's logo is never drawn here; a page that has the right to one passes its own art.",
90
+ "interaction": "none."
91
+ }
92
+ ]
93
+ }
@@ -46,16 +46,16 @@
46
46
  },
47
47
  {
48
48
  "name": "headingLevel",
49
- "type": "4 | 2 | 3",
49
+ "type": "2 | 4 | 3",
50
50
  "required": false,
51
51
  "defaultValue": "2",
52
52
  "description": "The heading level `#` renders at; `##` and below follow it, clamped at\n`h6`. Defaults to `2`, because model output is a passage inside a page\nthat already owns its `h1`.",
53
53
  "control": {
54
54
  "kind": "enum",
55
55
  "members": [
56
- 4,
57
56
  2,
58
- 3
57
+ 3,
58
+ 4
59
59
  ],
60
60
  "min": 2,
61
61
  "max": 4
@@ -140,7 +140,6 @@
140
140
  "--cue-control-sm",
141
141
  "--cue-fg",
142
142
  "--cue-fg-muted",
143
- "--cue-fg-subtle",
144
143
  "--cue-focus",
145
144
  "--cue-focus-ring",
146
145
  "--cue-font-mono",
@@ -169,6 +168,7 @@
169
168
  "--cue-style-body-size",
170
169
  "--cue-style-body-weight",
171
170
  "--cue-style-control-face",
171
+ "--cue-style-control-radius",
172
172
  "--cue-style-display-variation",
173
173
  "--cue-style-focus-width",
174
174
  "--cue-style-group-label-ink",
@@ -108,15 +108,23 @@
108
108
  "--cue-accent",
109
109
  "--cue-accent-fg",
110
110
  "--cue-border",
111
+ "--cue-border-strong",
112
+ "--cue-danger",
111
113
  "--cue-fg",
112
114
  "--cue-fg-subtle",
113
115
  "--cue-font-mono",
114
116
  "--cue-leading-ui",
115
117
  "--cue-radius-control",
116
118
  "--cue-radius-overlay",
119
+ "--cue-radius-scale",
117
120
  "--cue-space-2",
118
121
  "--cue-space-3",
119
122
  "--cue-space-4",
123
+ "--cue-space-5",
124
+ "--cue-style-control-radius",
125
+ "--cue-style-field-hover-edge",
126
+ "--cue-style-field-pad",
127
+ "--cue-style-field-radius",
120
128
  "--cue-style-label-case",
121
129
  "--cue-style-label-face",
122
130
  "--cue-style-label-tracking",
@@ -0,0 +1,90 @@
1
+ {
2
+ "name": "Motif",
3
+ "slug": "motif",
4
+ "group": "brand",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": false,
8
+ "description": "The art a Look draws in a hero: a ribbon, a halftone, a gloss object or a\nparticle word, whichever the style set chooses (spec 2026-10-02 §3.4).\n\n**The Look chooses, at the CSS layer.** Every offered variant is rendered, each\nin a wrapper whose `display` is the set's `style-motif-*` token, `none` unless\nthe set turns it on. So switching the Look switches the art with no re-render,\nthe server and the browser draw the same markup, and the paint pack `none` stays\nempty. A Look that turns none on draws nothing here and takes no room: the\ncontainer's own `display` is `style-motif-shown`, which the build derives as\n`block` for a set that shows a motif and which is `none` everywhere else. The\nparticle variant animates only while it is the one displayed.\n\nStatic markup — no `\"use client\"`; the particle variant is its own client island.",
9
+ "props": [
10
+ {
11
+ "name": "variants",
12
+ "type": "readonly MotifVariant[]",
13
+ "required": false,
14
+ "defaultValue": "[\"ribbon\", \"halftone\", \"gloss\", \"particles\"]",
15
+ "description": "The variants this page offers. The Look shows at most one of them. Defaults to all four.",
16
+ "control": {
17
+ "kind": "array"
18
+ }
19
+ },
20
+ {
21
+ "name": "seed",
22
+ "type": "number",
23
+ "required": false,
24
+ "defaultValue": "1",
25
+ "description": "The same seed draws the same picture, on the server and in the browser. Defaults to `1`.",
26
+ "control": {
27
+ "kind": "number"
28
+ }
29
+ },
30
+ {
31
+ "name": "word",
32
+ "type": "string",
33
+ "required": false,
34
+ "defaultValue": "CUE",
35
+ "description": "The word the particle variant draws. Defaults to `\"CUE\"`.",
36
+ "control": {
37
+ "kind": "string"
38
+ }
39
+ }
40
+ ],
41
+ "typeReferences": [
42
+ "React.ComponentPropsWithoutRef<\"div\">"
43
+ ],
44
+ "subcomponents": [],
45
+ "parts": [],
46
+ "variants": {},
47
+ "defaultVariants": {},
48
+ "tokensUsed": [
49
+ "--cue-style-motif-gloss",
50
+ "--cue-style-motif-halftone",
51
+ "--cue-style-motif-particles",
52
+ "--cue-style-motif-ribbon",
53
+ "--cue-style-motif-shown"
54
+ ],
55
+ "summary": "The art a Look draws in a hero — a ribbon, a halftone, a gloss object or a particle word — chosen by the style set.",
56
+ "examples": [
57
+ {
58
+ "title": "Usage",
59
+ "code": "<Hero title=\"Payments infrastructure\" media={<Motif seed={2} />} />",
60
+ "language": "tsx"
61
+ }
62
+ ],
63
+ "status": "stable",
64
+ "url": "/docs/components/motif",
65
+ "mdUrl": "/docs/components/motif.md",
66
+ "jsonUrl": "/r/components/motif.json",
67
+ "whenToUse": [
68
+ "`Hero`'s `media` slot on a landing page, so each Look brings its own art.",
69
+ "Any decorative panel whose art should follow the Look."
70
+ ],
71
+ "whenNotToUse": [
72
+ "Meaningful imagery: a chart, a product shot, a diagram. A motif is decoration and is hidden from assistive technology.",
73
+ "A specific motif regardless of Look. Use `Ribbon`, `Halftone`, `GlossObject` or `ParticleMark` directly."
74
+ ],
75
+ "commonMistakes": [
76
+ "Expecting it to draw under every Look. A set that turns no motif on draws nothing here, which is that Look's choice."
77
+ ],
78
+ "specimens": [
79
+ {
80
+ "title": "Motif",
81
+ "group": "brand",
82
+ "components": [
83
+ "Motif"
84
+ ],
85
+ "code": "<Specimens>\n {Object.entries(MOTIF_TOKENS).map(([variant, token]) => (\n <Specimen key={variant} label={variant} wide>\n <div className=\"w-64\" style={{ [token]: \"block\", \"--cue-style-motif-shown\": \"block\" } as React.CSSProperties}>\n <Motif seed={3} word=\"CUE\" />\n </div>\n </Specimen>\n ))}\n</Specimens>",
86
+ "note": "The art a Look draws in a hero. Every offered variant is in the markup, each hidden until the style set turns its token on, so switching the Look switches the art with no re-render. Each specimen below sets one token inline to show what a set would.",
87
+ "interaction": "none. The particle variant animates only while it is shown, on screen, in a visible tab, and not held still."
88
+ }
89
+ ]
90
+ }
@@ -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",
@@ -115,12 +115,14 @@
115
115
  "--cue-paint-stroke-to",
116
116
  "--cue-paint-stroke-width",
117
117
  "--cue-radius-control",
118
+ "--cue-radius-scale",
118
119
  "--cue-space-2",
119
120
  "--cue-space-3",
120
121
  "--cue-space-4",
121
122
  "--cue-space-5",
122
123
  "--cue-style-body-weight",
123
124
  "--cue-style-check-edge",
125
+ "--cue-style-control-radius",
124
126
  "--cue-style-control-step-size",
125
127
  "--cue-style-disabled-edge",
126
128
  "--cue-style-disabled-fill",
@@ -129,6 +131,7 @@
129
131
  "--cue-style-field-focus-offset",
130
132
  "--cue-style-field-hover-edge",
131
133
  "--cue-style-field-pad",
134
+ "--cue-style-field-radius",
132
135
  "--cue-style-focus-edge",
133
136
  "--cue-style-focus-width",
134
137
  "--cue-style-input-face",