@cueplusplus/ui 0.18.2 → 0.19.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 (136) hide show
  1. package/CHANGELOG.md +61 -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 +6 -1
  8. package/dist/brand/motif.d.ts +32 -0
  9. package/dist/brand/motif.js +71 -0
  10. package/dist/brand/particle-mark.d.ts +29 -0
  11. package/dist/brand/particle-mark.js +137 -0
  12. package/dist/brand/ribbon.d.ts +20 -0
  13. package/dist/brand/ribbon.js +54 -0
  14. package/dist/chrome/announcement-bar.d.ts +30 -0
  15. package/dist/chrome/announcement-bar.js +38 -0
  16. package/dist/chrome/app-bar.d.ts +4 -1
  17. package/dist/chrome/app-bar.js +7 -2
  18. package/dist/chrome/app-shell.js +8 -1
  19. package/dist/chrome/band.d.ts +3 -1
  20. package/dist/chrome/band.js +4 -3
  21. package/dist/chrome/hero.d.ts +61 -0
  22. package/dist/chrome/hero.js +108 -0
  23. package/dist/chrome/index.d.ts +6 -1
  24. package/dist/chrome/index.js +6 -1
  25. package/dist/chrome/keyword.d.ts +22 -0
  26. package/dist/chrome/keyword.js +28 -0
  27. package/dist/chrome/logo-strip.d.ts +23 -0
  28. package/dist/chrome/logo-strip.js +43 -0
  29. package/dist/chrome/page-shell.js +13 -1
  30. package/dist/chrome/stat-band.d.ts +32 -0
  31. package/dist/chrome/stat-band.js +39 -0
  32. package/dist/dmx/channel-matrix.js +5 -3
  33. package/dist/dmx/dmx-strip.js +5 -3
  34. package/dist/elements/animated-number.js +4 -1
  35. package/dist/elements/replay.d.ts +1 -1
  36. package/dist/elements/replay.js +5 -2
  37. package/dist/elements/scroll-anchor.js +4 -1
  38. package/dist/index.d.ts +13 -1
  39. package/dist/index.js +14 -2
  40. package/dist/instruments/index.js +1 -1
  41. package/dist/instruments/stat.js +1 -1
  42. package/dist/instruments/terminal-frame.js +5 -2
  43. package/dist/layout/grid.js +4 -2
  44. package/dist/layout/preview.js +4 -188
  45. package/dist/layout/sidebar.js +88 -52
  46. package/dist/overlays/_surface.d.ts +2 -2
  47. package/dist/primitives/button.js +22 -3
  48. package/dist/primitives/chip.js +62 -6
  49. package/dist/styles.css +26 -0
  50. package/dist/system/_scoped-pairing.js +18 -0
  51. package/dist/system/_stage-scope.js +199 -0
  52. package/dist/system/_style-check.js +1 -1
  53. package/dist/system/_style-chip.js +1 -1
  54. package/dist/system/_style-group-label.js +7 -3
  55. package/dist/system/_style-hero-title.js +41 -0
  56. package/dist/system/_style-kbd.js +1 -1
  57. package/dist/system/_style-label-ink.js +12 -5
  58. package/dist/system/_style-menu.js +1 -1
  59. package/dist/system/_style-page-title.js +1 -1
  60. package/dist/system/_style-segmented-control.js +1 -1
  61. package/dist/system/_style-skeleton.js +1 -1
  62. package/dist/system/_style-tab.js +1 -1
  63. package/dist/system/font-scope.d.ts +38 -0
  64. package/dist/system/font-scope.js +69 -0
  65. package/dist/system/index.d.ts +3 -1
  66. package/dist/system/index.js +3 -1
  67. package/dist/system/portal.js +7 -1
  68. package/dist/system/still.d.ts +32 -0
  69. package/dist/system/still.js +47 -0
  70. package/manifest/components/alert-dialog.json +1 -1
  71. package/manifest/components/announcement-bar.json +82 -0
  72. package/manifest/components/app-bar.json +3 -2
  73. package/manifest/components/app-shell.json +3 -0
  74. package/manifest/components/autocomplete.json +1 -0
  75. package/manifest/components/band.json +2 -1
  76. package/manifest/components/bento.json +12 -12
  77. package/manifest/components/button.json +1 -0
  78. package/manifest/components/channel-matrix.json +1 -0
  79. package/manifest/components/chart-tooltip-content.json +1 -0
  80. package/manifest/components/checkbox-group.json +1 -1
  81. package/manifest/components/checkbox.json +1 -1
  82. package/manifest/components/chip.json +1 -0
  83. package/manifest/components/combobox.json +1 -0
  84. package/manifest/components/command-palette.json +1 -0
  85. package/manifest/components/context-menu.json +1 -1
  86. package/manifest/components/density.json +6 -2
  87. package/manifest/components/dialog.json +1 -1
  88. package/manifest/components/dmx-bar.json +1 -1
  89. package/manifest/components/dmx-strip.json +1 -1
  90. package/manifest/components/drawer.json +1 -1
  91. package/manifest/components/dropdown-menu.json +1 -0
  92. package/manifest/components/font-scope.json +81 -0
  93. package/manifest/components/footer.json +0 -1
  94. package/manifest/components/gloss-object.json +81 -0
  95. package/manifest/components/grid.json +6 -6
  96. package/manifest/components/halftone.json +79 -0
  97. package/manifest/components/hero.json +204 -0
  98. package/manifest/components/hover-card.json +1 -1
  99. package/manifest/components/kbd.json +1 -0
  100. package/manifest/components/keyword.json +67 -0
  101. package/manifest/components/ledger.json +4 -4
  102. package/manifest/components/logo-strip.json +93 -0
  103. package/manifest/components/markdown-text.json +2 -2
  104. package/manifest/components/menubar.json +1 -1
  105. package/manifest/components/motif.json +90 -0
  106. package/manifest/components/multi-select.json +1 -0
  107. package/manifest/components/navigation-menu.json +1 -0
  108. package/manifest/components/page-shell.json +5 -0
  109. package/manifest/components/particle-mark.json +75 -0
  110. package/manifest/components/popover.json +1 -1
  111. package/manifest/components/preview.json +9 -4
  112. package/manifest/components/radio-group.json +0 -1
  113. package/manifest/components/radio.json +0 -1
  114. package/manifest/components/ribbon.json +65 -0
  115. package/manifest/components/scrollable-tabs-list.json +1 -0
  116. package/manifest/components/segmented-control.json +1 -0
  117. package/manifest/components/sheet.json +1 -1
  118. package/manifest/components/sidebar.json +1 -0
  119. package/manifest/components/skeleton.json +1 -0
  120. package/manifest/components/stack.json +4 -4
  121. package/manifest/components/stat-band.json +68 -0
  122. package/manifest/components/stat.json +1 -1
  123. package/manifest/components/still-provider.json +60 -0
  124. package/manifest/components/switch.json +0 -1
  125. package/manifest/components/table.json +1 -1
  126. package/manifest/components/tabs.json +1 -0
  127. package/manifest/components/tags-input.json +1 -0
  128. package/manifest/components/theme-configurator.json +1 -0
  129. package/manifest/components/theme-provider.json +9 -4
  130. package/manifest/components/toast.json +1 -0
  131. package/manifest/components/tooltip.json +1 -1
  132. package/manifest/fixtures.json +18 -0
  133. package/manifest/manifest.json +267 -55
  134. package/manifest/tokens.json +91 -3
  135. package/package.json +4 -4
  136. package/dist/system/_paint-ground-pattern.js +0 -30
@@ -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",
@@ -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
+ }
@@ -80,9 +80,9 @@
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
+ }
@@ -53,9 +53,9 @@
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",
@@ -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",
@@ -255,6 +255,7 @@
255
255
  "--cue-style-body-size",
256
256
  "--cue-style-body-weight",
257
257
  "--cue-style-control-face",
258
+ "--cue-style-control-radius",
258
259
  "--cue-style-display-variation",
259
260
  "--cue-style-focus-width",
260
261
  "--cue-style-group-label-ink",
@@ -87,6 +87,7 @@
87
87
  "variants": {},
88
88
  "defaultVariants": {},
89
89
  "tokensUsed": [
90
+ "--cue-border",
90
91
  "--cue-fg",
91
92
  "--cue-fg-muted",
92
93
  "--cue-font-mono",
@@ -100,11 +101,15 @@
100
101
  "--cue-space-7",
101
102
  "--cue-style-body-face",
102
103
  "--cue-style-body-weight",
104
+ "--cue-style-display-case",
103
105
  "--cue-style-display-variation",
106
+ "--cue-style-frame-lines-content",
107
+ "--cue-style-grid-lines-content",
104
108
  "--cue-style-heading-ink",
105
109
  "--cue-style-lede-ink",
106
110
  "--cue-style-lede-leading",
107
111
  "--cue-style-lede-size",
112
+ "--cue-style-page-frame-position",
108
113
  "--cue-style-page-title-face",
109
114
  "--cue-style-page-title-leading",
110
115
  "--cue-style-page-title-size",
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "ParticleMark",
3
+ "slug": "particle-mark",
4
+ "group": "brand",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "A word drawn as a field of dots that drift and settle — a studio site's mark\n(spec 2026-10-02 §3.4). The dots are the accent, read from the canvas's own\ncomputed style, so they follow the Look.\n\n**It costs nothing at rest.** It animates only while its element is displayed,\non screen and in a visible tab, and while {@link useStill} is false (a still\nthumbnail, or a reader who prefers reduced motion). Otherwise it draws one\nstill frame. That frame is redrawn whenever any theme axis changes anywhere above\nit, the system colour scheme flips, a face finishes loading, or it resizes, so a\npaused mark is never left in an old palette. Unmounting disconnects every\nobserver and cancels every frame.\n\nDecorative: hidden from assistive technology.",
9
+ "props": [
10
+ {
11
+ "name": "word",
12
+ "type": "string",
13
+ "required": true,
14
+ "defaultValue": null,
15
+ "description": "The word the dots draw, short: a name or a mark.",
16
+ "control": {
17
+ "kind": "string"
18
+ }
19
+ },
20
+ {
21
+ "name": "seed",
22
+ "type": "number",
23
+ "required": false,
24
+ "defaultValue": "1",
25
+ "description": "Which scatter. Defaults to `1`.",
26
+ "control": {
27
+ "kind": "number"
28
+ }
29
+ }
30
+ ],
31
+ "typeReferences": [
32
+ "React.ComponentPropsWithoutRef<\"canvas\">"
33
+ ],
34
+ "subcomponents": [],
35
+ "parts": [],
36
+ "variants": {},
37
+ "defaultVariants": {},
38
+ "tokensUsed": [
39
+ "--cue-accent"
40
+ ],
41
+ "summary": "A word drawn as drifting dots in the accent, still when it is offscreen, hidden or motion is reduced.",
42
+ "examples": [
43
+ {
44
+ "title": "Usage",
45
+ "code": "<ParticleMark word=\"CUE\" className=\"h-40 w-full\" />",
46
+ "language": "tsx"
47
+ }
48
+ ],
49
+ "status": "stable",
50
+ "url": "/docs/components/particle-mark",
51
+ "mdUrl": "/docs/components/particle-mark.md",
52
+ "jsonUrl": "/r/components/particle-mark.json",
53
+ "whenToUse": [
54
+ "A studio or product site's mark in its hero."
55
+ ],
56
+ "whenNotToUse": [
57
+ "Text a reader must read. It is decorative and hidden from assistive technology.",
58
+ "Many on one page. Each is a canvas; one per page is the intent."
59
+ ],
60
+ "commonMistakes": [
61
+ "Assuming it animates in a thumbnail. Under `StillProvider still`, or with reduced motion, it draws one still frame."
62
+ ],
63
+ "specimens": [
64
+ {
65
+ "title": "ParticleMark",
66
+ "group": "brand",
67
+ "components": [
68
+ "ParticleMark"
69
+ ],
70
+ "code": "<ParticleMark word=\"CUE\" className=\"h-32 w-64\" />",
71
+ "note": "A word drawn as a field of dots in the accent. It costs nothing at rest: off screen, in a hidden tab or held still, it draws one frame and stops.",
72
+ "interaction": "none. Prefer reduced motion and it holds its still frame."
73
+ }
74
+ ]
75
+ }
@@ -176,7 +176,6 @@
176
176
  "--cue-control-sm",
177
177
  "--cue-fg",
178
178
  "--cue-fg-muted",
179
- "--cue-fg-subtle",
180
179
  "--cue-font-mono",
181
180
  "--cue-leading-ui",
182
181
  "--cue-paint-rim-width",
@@ -204,6 +203,7 @@
204
203
  "--cue-style-body-size",
205
204
  "--cue-style-body-weight",
206
205
  "--cue-style-control-face",
206
+ "--cue-style-control-radius",
207
207
  "--cue-style-display-variation",
208
208
  "--cue-style-group-label-ink",
209
209
  "--cue-style-group-label-pad",
@@ -72,7 +72,7 @@
72
72
  },
73
73
  {
74
74
  "name": "font",
75
- "type": "\"source\" | \"system\" | \"geist\" | \"geist-mono\" | \"inter\" | \"plex\" | \"roboto\" | \"apple\" | \"office\" | \"inter-source\" | \"dm\" | \"calsans\"",
75
+ "type": "\"source\" | \"system\" | \"geist\" | \"geist-mono\" | \"inter\" | \"plex\" | \"roboto\" | \"apple\" | \"office\" | \"inter-source\" | \"dm\" | \"calsans\" | \"fraunces-mono\"",
76
76
  "required": false,
77
77
  "defaultValue": null,
78
78
  "description": "A font pairing for the stage only, stamped as `data-font` and republished to\nReact, so an overlay opened on the stage wears the stage's pairing rather\nthan the page's, and `useTheme().font` read on the stage reports it. The\nstage also takes `font-sans` when a pairing is named: `data-font` re-declares\nthe family's custom properties, but `font-family` inherits as an already\ncomputed value, so unclassed text on the stage would otherwise keep the\nfamily it resolved above it. Unset, the stage inherits and adds neither.",
@@ -90,19 +90,21 @@
90
90
  "office",
91
91
  "inter-source",
92
92
  "dm",
93
- "calsans"
93
+ "calsans",
94
+ "fraunces-mono"
94
95
  ]
95
96
  }
96
97
  },
97
98
  {
98
99
  "name": "styleSet",
99
- "type": "\"console\" | \"editorial\" | \"marketing\" | \"graphite\" | \"tender\" | \"zine\" | \"kiln\" | \"porcelain\"",
100
+ "type": "\"command\" | \"console\" | \"editorial\" | \"marketing\" | \"graphite\" | \"tender\" | \"zine\" | \"kiln\" | \"porcelain\" | \"ledger\" | \"monolith\" | \"prism\"",
100
101
  "required": false,
101
102
  "defaultValue": null,
102
103
  "description": "A style set for the stage only: `console`, `editorial`, `marketing` or\n`graphite`.\n\nUnset, the stage inherits and **no attribute is emitted at all** — the same\nrule the other four follow here — unless the stage names a `theme`, a `mode`\nor a `font`. Then it restates the set in force around it, because a set's\nblock declares values that read those axes (its seam ink and band rule\nread the theme, its control and display faces read the pairing) and a\ncustom property resolves where it is declared: restated, they resolve\nagainst the stage. Unlike `theme`, naming one loads nothing and needs\nnothing: every set is emitted by `@cueplusplus/tokens` into the stylesheet\nevery consumer already imports, so a stage is scoped to\n`[data-style=\"<name>\"]` and the block is on the page by construction.\n\nThe set is republished to React as well as stamped, so a popover opened on\nthe stage follows the stage rather than the page — a portal mounts on\n`<body>` and inherits nothing from the stage's DOM.",
103
104
  "control": {
104
105
  "kind": "enum",
105
106
  "members": [
107
+ "command",
106
108
  "console",
107
109
  "editorial",
108
110
  "marketing",
@@ -110,7 +112,10 @@
110
112
  "tender",
111
113
  "zine",
112
114
  "kiln",
113
- "porcelain"
115
+ "porcelain",
116
+ "ledger",
117
+ "monolith",
118
+ "prism"
114
119
  ]
115
120
  }
116
121
  },
@@ -45,7 +45,6 @@
45
45
  "--cue-border-strong",
46
46
  "--cue-danger",
47
47
  "--cue-fg-muted",
48
- "--cue-fg-subtle",
49
48
  "--cue-focus",
50
49
  "--cue-focus-ring",
51
50
  "--cue-font-mono",
@@ -56,7 +56,6 @@
56
56
  "--cue-border-strong",
57
57
  "--cue-danger",
58
58
  "--cue-fg-muted",
59
- "--cue-fg-subtle",
60
59
  "--cue-focus",
61
60
  "--cue-focus-ring",
62
61
  "--cue-font-mono",
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "Ribbon",
3
+ "slug": "ribbon",
4
+ "group": "brand",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": false,
8
+ "description": "A flowing ribbon of layered bands in the theme's own inks — the payments-page\nmotif (spec 2026-10-02 §3.4). Five bezier bands cross the frame on a diagonal,\neach a gradient from the accent to the foreground's mix, so it reads in every\ntheme and both modes. Decorative: hidden from assistive technology.\n\nStatic markup — no `\"use client\"`.",
9
+ "props": [
10
+ {
11
+ "name": "seed",
12
+ "type": "number",
13
+ "required": false,
14
+ "defaultValue": "1",
15
+ "description": "Which ribbon: the same seed draws the same bands. Defaults to `1`.",
16
+ "control": {
17
+ "kind": "number"
18
+ }
19
+ }
20
+ ],
21
+ "typeReferences": [
22
+ "React.SVGProps<SVGSVGElement>"
23
+ ],
24
+ "subcomponents": [],
25
+ "parts": [],
26
+ "variants": {},
27
+ "defaultVariants": {},
28
+ "tokensUsed": [
29
+ "--cue-accent",
30
+ "--cue-fg"
31
+ ],
32
+ "summary": "A flowing ribbon of layered bands in the theme's inks: the payments-page motif.",
33
+ "examples": [
34
+ {
35
+ "title": "Usage",
36
+ "code": "<Ribbon seed={3} className=\"h-64 w-full\" />",
37
+ "language": "tsx"
38
+ }
39
+ ],
40
+ "status": "stable",
41
+ "url": "/docs/components/ribbon",
42
+ "mdUrl": "/docs/components/ribbon.md",
43
+ "jsonUrl": "/r/components/ribbon.json",
44
+ "whenToUse": [
45
+ "Hero art on a product or payments page, at any size; it stretches to its box."
46
+ ],
47
+ "whenNotToUse": [
48
+ "Content imagery. It is decorative and hidden from assistive technology."
49
+ ],
50
+ "commonMistakes": [
51
+ "Changing its colours with props. It reads the theme's accent and foreground, so it follows the Look."
52
+ ],
53
+ "specimens": [
54
+ {
55
+ "title": "Ribbon",
56
+ "group": "brand",
57
+ "components": [
58
+ "Ribbon"
59
+ ],
60
+ "code": "<Specimens>\n {[1, 2, 3].map((seed) => (\n <Specimen key={seed} label={`seed ${seed}`} wide>\n <Ribbon seed={seed} className=\"h-40 w-64\" />\n </Specimen>\n ))}\n</Specimens>",
61
+ "note": "Layered bezier bands in the theme's own inks. The seed is the picture: the same seed draws the same ribbon on the server and in the browser.",
62
+ "interaction": "none."
63
+ }
64
+ ]
65
+ }
@@ -67,6 +67,7 @@
67
67
  "--cue-space-4",
68
68
  "--cue-space-5",
69
69
  "--cue-style-control-face",
70
+ "--cue-style-control-radius",
70
71
  "--cue-style-focus-width",
71
72
  "--cue-style-group-gap",
72
73
  "--cue-style-segment-edge",
@@ -153,6 +153,7 @@
153
153
  "--cue-space-4",
154
154
  "--cue-space-5",
155
155
  "--cue-style-control-face",
156
+ "--cue-style-control-radius",
156
157
  "--cue-style-focus-width",
157
158
  "--cue-style-segment-edge",
158
159
  "--cue-style-segment-ground",
@@ -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
  ],