@cueplusplus/ui 0.12.0 → 0.14.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 (196) hide show
  1. package/CHANGELOG.md +305 -0
  2. package/LICENSE +21 -0
  3. package/NOTICE.md +34 -0
  4. package/README.md +2 -19
  5. package/dist/agent-runtime/tool-call-card.js +2 -2
  6. package/dist/chat/ask-box.js +2 -2
  7. package/dist/chat/composer.js +1 -1
  8. package/dist/chat/message.js +1 -1
  9. package/dist/chrome/_band.js +54 -0
  10. package/dist/chrome/band.d.ts +106 -0
  11. package/dist/chrome/band.js +97 -0
  12. package/dist/chrome/empty-state.js +1 -1
  13. package/dist/chrome/footer.d.ts +13 -0
  14. package/dist/chrome/footer.js +17 -2
  15. package/dist/chrome/index.d.ts +2 -1
  16. package/dist/chrome/index.js +2 -1
  17. package/dist/chrome/navigation-menu.js +1 -1
  18. package/dist/chrome/page-shell.js +4 -4
  19. package/dist/configurator/export-dialog.js +1 -1
  20. package/dist/configurator/panel-sections.js +1 -1
  21. package/dist/elements/agent-card.js +1 -1
  22. package/dist/elements/agent-handoff.js +2 -2
  23. package/dist/elements/canvas-split.js +2 -2
  24. package/dist/elements/chat-panel.js +1 -1
  25. package/dist/elements/code-diff.js +1 -1
  26. package/dist/elements/code-runner.js +2 -2
  27. package/dist/elements/comparison-card.js +1 -1
  28. package/dist/elements/confidence-marker.js +1 -1
  29. package/dist/elements/conversation-search.js +1 -1
  30. package/dist/elements/day-separator.js +1 -1
  31. package/dist/elements/document-reference.js +1 -1
  32. package/dist/elements/edit-message.js +1 -1
  33. package/dist/elements/elicitation-form.js +1 -1
  34. package/dist/elements/guardrail-notice.js +1 -1
  35. package/dist/elements/image-generation.js +1 -1
  36. package/dist/elements/inline-citation.js +2 -2
  37. package/dist/elements/markdown.js +1 -1
  38. package/dist/elements/math-block.js +1 -1
  39. package/dist/elements/message-branches.js +1 -1
  40. package/dist/elements/message-pair.js +1 -1
  41. package/dist/elements/onboarding.js +2 -2
  42. package/dist/elements/prompt-library.js +1 -1
  43. package/dist/elements/quote-reply.js +2 -2
  44. package/dist/elements/read-aloud.js +1 -1
  45. package/dist/elements/reasoning-panel.js +1 -1
  46. package/dist/elements/recommendation-card.js +1 -1
  47. package/dist/elements/research-report.js +1 -1
  48. package/dist/elements/retrieval-chunks.js +1 -1
  49. package/dist/elements/reviewable-diff.js +1 -1
  50. package/dist/elements/score-breakdown.js +1 -1
  51. package/dist/elements/scroll-anchor.js +1 -1
  52. package/dist/elements/settings-panel.js +1 -1
  53. package/dist/elements/shared-conversation.js +1 -1
  54. package/dist/elements/speaker-identity.js +1 -1
  55. package/dist/elements/stopped-run.js +1 -1
  56. package/dist/elements/streaming-text.js +1 -1
  57. package/dist/elements/timeline.js +1 -1
  58. package/dist/elements/tool-error.js +1 -1
  59. package/dist/elements/voice-conversation.js +1 -1
  60. package/dist/forms/textarea.js +1 -1
  61. package/dist/index.d.ts +5 -4
  62. package/dist/index.js +4 -2
  63. package/dist/instruments/code-block.js +1 -1
  64. package/dist/instruments/progress.d.ts +19 -3
  65. package/dist/instruments/progress.js +19 -1
  66. package/dist/instruments/terminal-frame.js +1 -1
  67. package/dist/layout/_collapse.js +1 -1
  68. package/dist/layout/card.js +1 -1
  69. package/dist/layout/container.js +3 -3
  70. package/dist/layout/frames.d.ts +19 -1
  71. package/dist/layout/frames.js +21 -7
  72. package/dist/layout/index.d.ts +2 -2
  73. package/dist/layout/preview.d.ts +29 -9
  74. package/dist/layout/preview.js +38 -17
  75. package/dist/overlays/_surface.d.ts +1 -1
  76. package/dist/overlays/_surface.js +1 -1
  77. package/dist/overlays/toast.js +1 -1
  78. package/dist/overlays/tooltip.js +1 -1
  79. package/dist/primitives/chip.d.ts +1 -1
  80. package/dist/system/density.d.ts +34 -6
  81. package/dist/system/density.js +41 -10
  82. package/dist/system/index.d.ts +2 -1
  83. package/dist/system/index.js +2 -1
  84. package/dist/system/portal.d.ts +8 -7
  85. package/dist/system/portal.js +16 -9
  86. package/dist/system/prepaint.d.ts +25 -5
  87. package/dist/system/prepaint.js +10 -2
  88. package/dist/system/theme-provider.d.ts +86 -7
  89. package/dist/system/theme-provider.js +62 -20
  90. package/dist/system/use-theme.d.ts +9 -2
  91. package/dist/system/use-theme.js +9 -2
  92. package/dist/system/vocabulary.d.ts +2 -1
  93. package/dist/system/vocabulary.js +16 -2
  94. package/manifest/components/accordion.json +1 -0
  95. package/manifest/components/agent-card.json +1 -0
  96. package/manifest/components/agent-handoff.json +1 -0
  97. package/manifest/components/alert-dialog.json +1 -0
  98. package/manifest/components/ask-box.json +1 -0
  99. package/manifest/components/autocomplete.json +1 -0
  100. package/manifest/components/band.json +104 -0
  101. package/manifest/components/canvas-split-body.json +1 -0
  102. package/manifest/components/canvas-split-document.json +1 -0
  103. package/manifest/components/canvas-split-header.json +1 -0
  104. package/manifest/components/canvas-split-line.json +1 -0
  105. package/manifest/components/canvas-split-message.json +1 -0
  106. package/manifest/components/canvas-split-thread.json +1 -0
  107. package/manifest/components/canvas-split.json +1 -0
  108. package/manifest/components/card.json +1 -0
  109. package/manifest/components/channel-matrix.json +1 -0
  110. package/manifest/components/chart-tooltip-content.json +1 -0
  111. package/manifest/components/chat-panel-assistant-message.json +1 -0
  112. package/manifest/components/chat-panel-composer.json +1 -0
  113. package/manifest/components/chat-panel-messages.json +1 -0
  114. package/manifest/components/chat-panel-typing.json +1 -0
  115. package/manifest/components/chat-panel-user-message.json +1 -0
  116. package/manifest/components/chat-panel.json +1 -0
  117. package/manifest/components/code-block.json +1 -0
  118. package/manifest/components/code-diff.json +1 -0
  119. package/manifest/components/code-runner.json +1 -0
  120. package/manifest/components/collapsible.json +1 -0
  121. package/manifest/components/colors-section.json +1 -0
  122. package/manifest/components/combobox.json +1 -0
  123. package/manifest/components/command-palette.json +1 -0
  124. package/manifest/components/comparison-card.json +1 -0
  125. package/manifest/components/composer.json +1 -0
  126. package/manifest/components/confidence-marker.json +1 -0
  127. package/manifest/components/container.json +3 -0
  128. package/manifest/components/context-menu.json +1 -0
  129. package/manifest/components/conversation-search.json +1 -0
  130. package/manifest/components/cue-portal-frame.json +1 -1
  131. package/manifest/components/day-separator.json +1 -0
  132. package/manifest/components/density.json +16 -1
  133. package/manifest/components/dialog.json +1 -0
  134. package/manifest/components/disclosure.json +1 -0
  135. package/manifest/components/dmx-bar.json +1 -0
  136. package/manifest/components/dmx-strip.json +1 -0
  137. package/manifest/components/document-reference.json +1 -0
  138. package/manifest/components/drawer.json +1 -0
  139. package/manifest/components/dropdown-menu.json +1 -0
  140. package/manifest/components/edit-message.json +1 -0
  141. package/manifest/components/elements-timeline.json +1 -0
  142. package/manifest/components/elicitation-form.json +1 -0
  143. package/manifest/components/empty-state.json +1 -0
  144. package/manifest/components/export-dialog.json +1 -0
  145. package/manifest/components/footer.json +3 -2
  146. package/manifest/components/frac.json +1 -0
  147. package/manifest/components/frames.json +14 -0
  148. package/manifest/components/guardrail-notice.json +1 -0
  149. package/manifest/components/hover-card.json +1 -0
  150. package/manifest/components/inline-citation.json +1 -0
  151. package/manifest/components/markdown-text.json +1 -0
  152. package/manifest/components/math-block.json +1 -0
  153. package/manifest/components/menubar.json +1 -0
  154. package/manifest/components/message-branches.json +1 -0
  155. package/manifest/components/message-pair.json +1 -0
  156. package/manifest/components/message.json +1 -0
  157. package/manifest/components/multi-select.json +1 -0
  158. package/manifest/components/navigation-menu.json +1 -0
  159. package/manifest/components/onboarding.json +1 -0
  160. package/manifest/components/page-shell.json +4 -0
  161. package/manifest/components/popover.json +1 -0
  162. package/manifest/components/preset-section.json +1 -0
  163. package/manifest/components/preview.json +17 -2
  164. package/manifest/components/progress.json +2 -2
  165. package/manifest/components/prompt-library.json +1 -0
  166. package/manifest/components/quote-reply.json +1 -0
  167. package/manifest/components/read-aloud.json +1 -0
  168. package/manifest/components/reasoning-panel.json +1 -0
  169. package/manifest/components/recommendation-card.json +1 -0
  170. package/manifest/components/research-report.json +1 -0
  171. package/manifest/components/retrieval-chunks.json +1 -0
  172. package/manifest/components/reviewable-diff.json +1 -0
  173. package/manifest/components/score-breakdown.json +1 -0
  174. package/manifest/components/scroll-anchor.json +1 -0
  175. package/manifest/components/settings-panel.json +1 -0
  176. package/manifest/components/shape-section.json +1 -0
  177. package/manifest/components/shared-conversation.json +1 -0
  178. package/manifest/components/sheet.json +1 -0
  179. package/manifest/components/speaker-identity.json +1 -0
  180. package/manifest/components/stopped-run.json +1 -0
  181. package/manifest/components/streaming-text.json +1 -0
  182. package/manifest/components/sub.json +1 -0
  183. package/manifest/components/sup.json +1 -0
  184. package/manifest/components/tags-input.json +1 -0
  185. package/manifest/components/terminal-frame.json +1 -0
  186. package/manifest/components/textarea.json +1 -0
  187. package/manifest/components/theme-configurator.json +1 -0
  188. package/manifest/components/theme-provider.json +26 -1
  189. package/manifest/components/toast.json +1 -0
  190. package/manifest/components/tool-call-card.json +1 -0
  191. package/manifest/components/tool-error.json +1 -0
  192. package/manifest/components/tooltip.json +1 -0
  193. package/manifest/components/voice-conversation.json +1 -0
  194. package/manifest/manifest.json +133 -105
  195. package/manifest/tokens.json +20 -1
  196. package/package.json +11 -9
@@ -55,6 +55,7 @@
55
55
  "--cue-fg-muted",
56
56
  "--cue-fg-subtle",
57
57
  "--cue-font-mono",
58
+ "--cue-leading-ui",
58
59
  "--cue-radius-control",
59
60
  "--cue-radius-overlay",
60
61
  "--cue-surface-2",
@@ -86,6 +86,7 @@
86
86
  "--cue-fg",
87
87
  "--cue-fg-muted",
88
88
  "--cue-fg-subtle",
89
+ "--cue-leading-ui",
89
90
  "--cue-radius-control",
90
91
  "--cue-space-1",
91
92
  "--cue-space-2",
@@ -49,6 +49,7 @@
49
49
  "--cue-border-strong",
50
50
  "--cue-fg",
51
51
  "--cue-fg-subtle",
52
+ "--cue-leading-ui",
52
53
  "--cue-radius-overlay",
53
54
  "--cue-text-emphasis"
54
55
  ],
@@ -143,6 +143,7 @@
143
143
  "--cue-fg-muted",
144
144
  "--cue-fg-subtle",
145
145
  "--cue-font-mono",
146
+ "--cue-leading-ui",
146
147
  "--cue-radius-control",
147
148
  "--cue-radius-overlay",
148
149
  "--cue-scrim",
@@ -52,6 +52,7 @@
52
52
  "tokensUsed": [
53
53
  "--cue-fg",
54
54
  "--cue-fg-subtle",
55
+ "--cue-leading-ui",
55
56
  "--cue-text-body"
56
57
  ],
57
58
  "summary": "Navigate between regenerated versions of the same answer without losing your place.",
@@ -74,6 +74,7 @@
74
74
  "defaultVariants": {},
75
75
  "tokensUsed": [
76
76
  "--cue-fg",
77
+ "--cue-leading-ui",
77
78
  "--cue-radius-overlay",
78
79
  "--cue-stream",
79
80
  "--cue-text-body"
@@ -111,6 +111,7 @@
111
111
  "--cue-fg",
112
112
  "--cue-fg-subtle",
113
113
  "--cue-font-mono",
114
+ "--cue-leading-ui",
114
115
  "--cue-radius-control",
115
116
  "--cue-radius-overlay",
116
117
  "--cue-space-2",
@@ -211,6 +211,7 @@
211
211
  "--cue-focus",
212
212
  "--cue-font-mono",
213
213
  "--cue-icon-sm",
214
+ "--cue-leading-ui",
214
215
  "--cue-radius-control",
215
216
  "--cue-radius-overlay",
216
217
  "--cue-scrim",
@@ -228,6 +228,7 @@
228
228
  "--cue-fg-subtle",
229
229
  "--cue-font-mono",
230
230
  "--cue-icon-sm",
231
+ "--cue-leading-ui",
231
232
  "--cue-radius-control",
232
233
  "--cue-radius-overlay",
233
234
  "--cue-scrim",
@@ -63,6 +63,7 @@
63
63
  "--cue-fg",
64
64
  "--cue-fg-muted",
65
65
  "--cue-fg-subtle",
66
+ "--cue-leading-ui",
66
67
  "--cue-radius-overlay",
67
68
  "--cue-radius-surface",
68
69
  "--cue-surface-2",
@@ -90,6 +90,10 @@
90
90
  "--cue-fg",
91
91
  "--cue-fg-muted",
92
92
  "--cue-font-mono",
93
+ "--cue-leading-ui",
94
+ "--cue-measure-broad",
95
+ "--cue-measure-narrow",
96
+ "--cue-measure-wide",
93
97
  "--cue-space-2",
94
98
  "--cue-space-4",
95
99
  "--cue-space-6",
@@ -178,6 +178,7 @@
178
178
  "--cue-fg-muted",
179
179
  "--cue-fg-subtle",
180
180
  "--cue-font-mono",
181
+ "--cue-leading-ui",
181
182
  "--cue-radius-control",
182
183
  "--cue-radius-overlay",
183
184
  "--cue-scrim",
@@ -55,6 +55,7 @@
55
55
  "--cue-fg-subtle",
56
56
  "--cue-font-mono",
57
57
  "--cue-font-sans",
58
+ "--cue-leading-ui",
58
59
  "--cue-radius-control",
59
60
  "--cue-space-1",
60
61
  "--cue-space-2",
@@ -5,7 +5,7 @@
5
5
  "importPath": "@cueplusplus/ui",
6
6
  "peerDependencies": [],
7
7
  "clientOnly": true,
8
- "description": "A card for one component: a stage that is its own theme island, a slot for\ntools at the top right, and a footer.\n\n**Two presentations, one stage.** `\"panel\"`, the default and what every\nexisting caller gets, is that card: a border, a fill, a dot grid under the\nspecimen, and the tools floating over the stage's top right. `\"frame\"` is a\ndesign-canvas frame — no card, no border, no fill; the name, the count and\nthe tools sit in a row *above* the stage rather than over it, four crosshairs\nmark the stage's outer corners, and the stage paints nothing by default, so\nwhatever canvas the frame sits on shows through. Everything below holds in\nboth.\n\n**The stage is the island; the chrome is not.** `theme`, `mode`, `density`\nand `font` land on the stage element only, and the stage republishes the\ntheme and density contexts so an overlay opened on it follows it. The tools,\nthe footer, the grips and anything they open stay in the scope around the\nPreview — a `terminal` preview's own controls do not turn cyan. With none of\nthe four set, the stage carries no attribute and costs what a `<div>` costs.\nA stage `theme` with no `mode` repeats the page's mode beside it.\n\n**`resizable` is handles of its own**, both axes by default: an edge grip per\naxis that is a keyboard-operable `separator` valued in pixels, and a corner\ngrip for the pointer. Double-click resets an axis. The width never outgrows\nthe frame: its bound in force is the frame's own width, observed live, when\nthat is under `maxWidth`. Not `Resizable`, which is split panes on an\noptional peer.\n\nProps, not a compound: one stage and its slots, each saying what it is.",
8
+ "description": "A card for one component: a stage that is its own theme island, a slot for\ntools at the top right, and a footer.\n\n**Two presentations, one stage.** `\"panel\"`, the default and what every\nexisting caller gets, is that card: a border, a fill, a dot grid under the\nspecimen, and the tools floating over the stage's top right. `\"frame\"` is a\ndesign-canvas frame — no card, no border, no fill; the name, the count and\nthe tools sit in a row *above* the stage rather than over it, four crosshairs\nmark the stage's outer corners, and the stage paints nothing by default, so\nwhatever canvas the frame sits on shows through. Everything below holds in\nboth.\n\n**The stage is the island; the chrome is not.** `theme`, `mode`, `density`,\n`font` and `styleSet` land on the stage element only, and the stage\nrepublishes the theme, density and style-set contexts so an overlay opened on\nit follows it. The tools, the footer, the grips and anything they open stay\nin the scope around the Preview — a `terminal` preview's own controls do not\nturn cyan. With none of the five set, the stage carries no attribute and\ncosts what a `<div>` costs. A stage `theme` with no `mode` repeats the page's\nmode beside it.\n\n**`resizable` is handles of its own**, both axes by default: an edge grip per\naxis that is a keyboard-operable `separator` valued in pixels, and a corner\ngrip for the pointer. Double-click resets an axis. The width never outgrows\nthe frame: its bound in force is the frame's own width, observed live, when\nthat is under `maxWidth`. Not `Resizable`, which is split panes on an\noptional peer.\n\nProps, not a compound: one stage and its slots, each saying what it is.",
9
9
  "props": [
10
10
  {
11
11
  "name": "children",
@@ -90,6 +90,21 @@
90
90
  ]
91
91
  }
92
92
  },
93
+ {
94
+ "name": "styleSet",
95
+ "type": "\"console\" | \"editorial\" | \"marketing\"",
96
+ "required": false,
97
+ "defaultValue": null,
98
+ "description": "A style set for the stage only: `console`, `editorial` or `marketing`.\n\nUnset, the stage inherits and **no attribute is emitted at all** — the same\nrule the other four follow here. Unlike `theme`, naming one loads nothing\nand needs nothing: the three sets are emitted by `@cueplusplus/tokens` into\nthe stylesheet every 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.",
99
+ "control": {
100
+ "kind": "enum",
101
+ "members": [
102
+ "console",
103
+ "editorial",
104
+ "marketing"
105
+ ]
106
+ }
107
+ },
93
108
  {
94
109
  "name": "resizable",
95
110
  "type": "boolean | PreviewResizeOptions",
@@ -237,7 +252,7 @@
237
252
  },
238
253
  {
239
254
  "title": "Usage",
240
- "code": "<Preview label=\"Button preview\" tools={<IconButton aria-label=\"Configure Button\" icon={Wrench} />}>\n <Button variant=\"primary\">Take cue</Button>\n</Preview>\n<Preview label=\"Chip preview\" theme=\"terminal\" density=\"compact\" resizable>\n <Chip tone=\"accent\">Standby</Chip>\n</Preview>\n<Preview label=\"Button\" presentation=\"frame\" count={3}>\n <Button variant=\"primary\">Take cue</Button>\n</Preview>",
255
+ "code": "<Preview label=\"Button preview\" tools={<IconButton aria-label=\"Configure Button\" icon={Wrench} />}>\n <Button variant=\"primary\">Take cue</Button>\n</Preview>\n<Preview label=\"Chip preview\" theme=\"terminal\" density=\"compact\" resizable>\n <Chip tone=\"accent\">Standby</Chip>\n</Preview>\n<Preview label=\"Button\" presentation=\"frame\" count={3}>\n <Button variant=\"primary\">Take cue</Button>\n</Preview>\n<Preview label=\"Editorial band\" styleSet=\"editorial\" presentation=\"frame\">\n <Container className=\"max-w-(--cue-measure-prose)\">…</Container>\n</Preview>",
241
256
  "language": "tsx"
242
257
  }
243
258
  ],
@@ -5,14 +5,14 @@
5
5
  "importPath": "@cueplusplus/ui",
6
6
  "peerDependencies": [],
7
7
  "clientOnly": false,
8
- "description": "Determinate work, drawn as a filling rule.\n\nWraps Base UI's `Progress`, so `role=\"progressbar\"`, the value formatting and\nthe completion status are the primitive's; this layer adds the console skin:\na sunk `surface-3` track, an accent fill and a 120ms linear width transition\n— linear because a progress bar that eases is lying about its rate.\n\nPassing `value={null}` makes it indeterminate: the fill collapses and the\ntrack pulses instead, which says \"working, size unknown\" without inventing a\nnumber. The pulse stills under `prefers-reduced-motion`.\n\nUse `Meter` instead for a *level* (how full something is); a progress bar is\nfor a *task* (how far along something is).\n\nStatic markup — no `\"use client\"`.",
8
+ "description": "Determinate work, drawn as a filling rule.\n\nWraps Base UI's `Progress`, so `role=\"progressbar\"`, the value formatting and\nthe completion status are the primitive's; this layer adds the console skin:\na sunk `surface-3` track, an accent fill and a 120ms linear width transition\n— linear because a progress bar that eases is lying about its rate.\n\nPassing `value={null}` makes it indeterminate: the fill collapses and the\ntrack pulses instead, which says \"working, size unknown\" without inventing a\nnumber. The pulse stills under `prefers-reduced-motion`.\n\nUse `Meter` instead for a *level* (how full something is); a progress bar is\nfor a *task* (how far along something is).\n\n**Named in the markup, not on hydration.** Base UI names the bar from the\ncaption by having `Progress.Label` report its id to the root, and it reports\nit from a `useIsoLayoutEffect` (`@base-ui/react/utils/useRegisteredLabelId`),\nwhich the root keeps in `useState`. A render that runs no effects — SSR\nbefore hydration, `renderToStaticMarkup`, a page that never hydrates — emitted\nthe caption with its id and a `role=\"progressbar\"` that pointed at nothing, so\nthe delivered HTML had a progressbar with no accessible name. Both ends are\ngiven the same `useId` here instead, so the first render is already correct\nand Base UI's effect later resolves the label to the id it was handed.\n\nStatic markup — no `\"use client\"`. `useId` is the one hook it calls, and it\nis one a Server Component may call: React's Flight server implements `useId`\nin its hooks dispatcher, where the hooks a Server Component may not call are\n`unsupportedHook`.",
9
9
  "props": [
10
10
  {
11
11
  "name": "label",
12
12
  "type": "ReactNode",
13
13
  "required": false,
14
14
  "defaultValue": null,
15
- "description": "Caption above the bar. Rendered as Base UI's `Progress.Label`, so it also\nbecomes the bar's accessible name — pass one, or an `aria-label`.",
15
+ "description": "Caption above the bar, and the bar's accessible name: this layer points the\n`role=\"progressbar\"` at it with `aria-labelledby` **at render**, so the name\nis in the markup a server sends. Pass one, or an `aria-label` — a root that\nalready carries `aria-label` or `aria-labelledby` keeps the name it was\ngiven.",
16
16
  "control": {
17
17
  "kind": "node",
18
18
  "fixture": "children.text"
@@ -86,6 +86,7 @@
86
86
  "--cue-bg",
87
87
  "--cue-fg-muted",
88
88
  "--cue-fg-subtle",
89
+ "--cue-leading-ui",
89
90
  "--cue-radius-control",
90
91
  "--cue-radius-overlay",
91
92
  "--cue-radius-surface",
@@ -94,6 +94,7 @@
94
94
  "--cue-fg",
95
95
  "--cue-fg-muted",
96
96
  "--cue-fg-subtle",
97
+ "--cue-leading-ui",
97
98
  "--cue-radius-control",
98
99
  "--cue-stream",
99
100
  "--cue-surface-2",
@@ -104,6 +104,7 @@
104
104
  "--cue-fg",
105
105
  "--cue-fg-muted",
106
106
  "--cue-fg-subtle",
107
+ "--cue-leading-ui",
107
108
  "--cue-radius-control",
108
109
  "--cue-radius-overlay",
109
110
  "--cue-stream",
@@ -102,6 +102,7 @@
102
102
  "--cue-fg",
103
103
  "--cue-fg-muted",
104
104
  "--cue-fg-subtle",
105
+ "--cue-leading-ui",
105
106
  "--cue-stream",
106
107
  "--cue-surface-3",
107
108
  "--cue-text-body"
@@ -98,6 +98,7 @@
98
98
  "--cue-fg",
99
99
  "--cue-fg-muted",
100
100
  "--cue-fg-subtle",
101
+ "--cue-leading-ui",
101
102
  "--cue-ok",
102
103
  "--cue-radius-overlay",
103
104
  "--cue-surface-2",
@@ -52,6 +52,7 @@
52
52
  "--cue-border",
53
53
  "--cue-fg-muted",
54
54
  "--cue-fg-subtle",
55
+ "--cue-leading-ui",
55
56
  "--cue-radius-overlay",
56
57
  "--cue-stream",
57
58
  "--cue-surface-3",
@@ -62,6 +62,7 @@
62
62
  "--cue-fg",
63
63
  "--cue-fg-muted",
64
64
  "--cue-fg-subtle",
65
+ "--cue-leading-ui",
65
66
  "--cue-ok",
66
67
  "--cue-radius-overlay",
67
68
  "--cue-stream",
@@ -78,6 +78,7 @@
78
78
  "--cue-fg-muted",
79
79
  "--cue-fg-subtle",
80
80
  "--cue-font-mono",
81
+ "--cue-leading-ui",
81
82
  "--cue-ok",
82
83
  "--cue-radius-overlay",
83
84
  "--cue-surface-2",
@@ -70,6 +70,7 @@
70
70
  "--cue-danger",
71
71
  "--cue-fg-muted",
72
72
  "--cue-fg-subtle",
73
+ "--cue-leading-ui",
73
74
  "--cue-ok",
74
75
  "--cue-radius-overlay",
75
76
  "--cue-stream",
@@ -51,6 +51,7 @@
51
51
  "defaultVariants": {},
52
52
  "tokensUsed": [
53
53
  "--cue-fg-muted",
54
+ "--cue-leading-ui",
54
55
  "--cue-radius-overlay",
55
56
  "--cue-surface-1",
56
57
  "--cue-text-ui"
@@ -117,6 +117,7 @@
117
117
  "--cue-fg",
118
118
  "--cue-fg-muted",
119
119
  "--cue-fg-subtle",
120
+ "--cue-leading-ui",
120
121
  "--cue-radius-overlay",
121
122
  "--cue-radius-surface",
122
123
  "--cue-surface-3",
@@ -45,6 +45,7 @@
45
45
  "--cue-fg-subtle",
46
46
  "--cue-font-mono",
47
47
  "--cue-font-sans",
48
+ "--cue-leading-ui",
48
49
  "--cue-radius-control",
49
50
  "--cue-space-1",
50
51
  "--cue-space-2",
@@ -73,6 +73,7 @@
73
73
  "--cue-border",
74
74
  "--cue-fg-muted",
75
75
  "--cue-fg-subtle",
76
+ "--cue-leading-ui",
76
77
  "--cue-radius-overlay",
77
78
  "--cue-surface-1",
78
79
  "--cue-text-body",
@@ -168,6 +168,7 @@
168
168
  "--cue-fg-muted",
169
169
  "--cue-fg-subtle",
170
170
  "--cue-font-mono",
171
+ "--cue-leading-ui",
171
172
  "--cue-radius-control",
172
173
  "--cue-radius-overlay",
173
174
  "--cue-scrim",
@@ -31,6 +31,7 @@
31
31
  "tokensUsed": [
32
32
  "--cue-fg-muted",
33
33
  "--cue-fg-subtle",
34
+ "--cue-leading-ui",
34
35
  "--cue-radius-surface",
35
36
  "--cue-stream",
36
37
  "--cue-surface-1",
@@ -63,6 +63,7 @@
63
63
  "tokensUsed": [
64
64
  "--cue-fg",
65
65
  "--cue-fg-muted",
66
+ "--cue-leading-ui",
66
67
  "--cue-surface-2",
67
68
  "--cue-surface-3",
68
69
  "--cue-text-body",
@@ -48,6 +48,7 @@
48
48
  "defaultVariants": {},
49
49
  "tokensUsed": [
50
50
  "--cue-font-mono",
51
+ "--cue-leading-ui",
51
52
  "--cue-radius-control",
52
53
  "--cue-stream",
53
54
  "--cue-surface-2",
@@ -16,6 +16,7 @@
16
16
  "--cue-border-strong",
17
17
  "--cue-fg",
18
18
  "--cue-fg-subtle",
19
+ "--cue-leading-ui",
19
20
  "--cue-radius-overlay",
20
21
  "--cue-text-emphasis"
21
22
  ],
@@ -16,6 +16,7 @@
16
16
  "--cue-border-strong",
17
17
  "--cue-fg",
18
18
  "--cue-fg-subtle",
19
+ "--cue-leading-ui",
19
20
  "--cue-radius-overlay",
20
21
  "--cue-text-emphasis"
21
22
  ],
@@ -211,6 +211,7 @@
211
211
  "--cue-focus",
212
212
  "--cue-font-mono",
213
213
  "--cue-icon-sm",
214
+ "--cue-leading-ui",
214
215
  "--cue-radius-control",
215
216
  "--cue-radius-overlay",
216
217
  "--cue-scrim",
@@ -107,6 +107,7 @@
107
107
  "--cue-fg-subtle",
108
108
  "--cue-font-mono",
109
109
  "--cue-info",
110
+ "--cue-leading-ui",
110
111
  "--cue-ok",
111
112
  "--cue-pad-row-x",
112
113
  "--cue-radius-surface",
@@ -66,6 +66,7 @@
66
66
  "--cue-fg-subtle",
67
67
  "--cue-focus",
68
68
  "--cue-font-mono",
69
+ "--cue-leading-ui",
69
70
  "--cue-radius-control",
70
71
  "--cue-space-3",
71
72
  "--cue-space-4",
@@ -128,6 +128,7 @@
128
128
  "--cue-font-mono",
129
129
  "--cue-font-sans",
130
130
  "--cue-icon-sm",
131
+ "--cue-leading-ui",
131
132
  "--cue-radius-control",
132
133
  "--cue-radius-overlay",
133
134
  "--cue-scrim",
@@ -5,7 +5,7 @@
5
5
  "importPath": "@cueplusplus/ui",
6
6
  "peerDependencies": [],
7
7
  "clientOnly": true,
8
- "description": "Root of the theme system: stamps `data-theme`, `data-density` and `data-mode`\nso the token layer resolves, puts `data-font` on `<html>`, publishes\n`--cue-font-scale`, owns the persisted user preference, and publishes the\nregistry the three axis hooks read.\n\nRendering: `<div data-cue-root data-theme data-density data-mode style={{ colorScheme, --cue-font-scale }}>`\n(or the single child when `asChild`). The `theme`/`density`/`font`/`mode` props are\n*initial* values — the provider holds the state so `setTheme` and friends can\ndrive it — but a changed prop is adopted after mount, so a controlling parent\nstill works.\n\nThe font pairing is the one axis that never lands on this element: it has no\nisland form, `<html>` is its only home, and restating it here would shadow the\npre-paint stamp for the whole page on the first frame. See the `stamp` object\nbelow.\n\nPersistence and the pre-paint contract: setters write\n`{ theme, density, font, mode }` to `localStorage[storageKey]`, which is exactly what\n{@link prepaintScript } reads to stamp `<html>` before the first paint. The\noutermost provider keeps `<html>` in sync while the app runs (and restores the\nprevious stamp on unmount) so the page ground, UA scrollbars and form controls\nfollow the theme; nested providers never touch `<html>`, and never own the\nfont pairing — `useTheme().font` and `setFont` inside one are the root's.",
8
+ "description": "Root of the theme system: stamps `data-theme`, `data-density` and `data-mode`\nso the token layer resolves, puts `data-font` on `<html>`, publishes\n`--cue-font-scale`, owns the persisted user preference, and publishes the\nregistry the three axis hooks read.\n\nRendering: `<div data-cue-root data-theme data-density data-mode style={{ colorScheme, --cue-font-scale }}>`\n(or the single child when `asChild`), plus `data-style` when — and only when —\na style set is in force. The `theme`/`density`/`font`/`mode`/`styleSet` props are\n*initial* values — the provider holds the state so `setTheme` and friends can\ndrive it — but a changed prop is adopted after mount, so a controlling parent\nstill works.\n\nThe font pairing is the one axis that never lands on this element: it has no\nisland form, `<html>` is its only home, and restating it here would shadow the\npre-paint stamp for the whole page on the first frame. See the `stamp` object\nbelow.\n\nPersistence and the pre-paint contract: setters write\n`{ theme, density, font, mode }` to `localStorage[storageKey]`, plus a `style`\nkey holding the style set when there is one — omitted entirely when there is\nnot, so an application that never touches that axis writes the same four-key\nobject it always wrote. That is exactly what\n{@link prepaintScript } reads to stamp `<html>` before the first paint. The\noutermost provider keeps `<html>` in sync while the app runs (and restores the\nprevious stamp on unmount) so the page ground, UA scrollbars and form controls\nfollow the theme; nested providers never touch `<html>`, and never own the\nfont pairing — `useTheme().font` and `setFont` inside one are the root's.",
9
9
  "props": [
10
10
  {
11
11
  "name": "themes",
@@ -79,6 +79,21 @@
79
79
  ]
80
80
  }
81
81
  },
82
+ {
83
+ "name": "styleSet",
84
+ "type": "\"console\" | \"editorial\" | \"marketing\"",
85
+ "required": false,
86
+ "defaultValue": null,
87
+ "description": "Page composition for this subtree: `console`, `editorial` or `marketing`.\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\nholds its own rather than handing the axis up to the root.",
88
+ "control": {
89
+ "kind": "enum",
90
+ "members": [
91
+ "console",
92
+ "editorial",
93
+ "marketing"
94
+ ]
95
+ }
96
+ },
82
97
  {
83
98
  "name": "fontScale",
84
99
  "type": "number",
@@ -129,6 +144,16 @@
129
144
  "kind": "boolean"
130
145
  }
131
146
  },
147
+ {
148
+ "name": "nonce",
149
+ "type": "string",
150
+ "required": false,
151
+ "defaultValue": null,
152
+ "description": "The Content-Security-Policy nonce for the density override layer.\n\nWhen `overrides.densities` is set this provider emits one `<style>`\nelement (see {@link ThemeProviderProps.overrides}). Under a policy of\n`style-src-elem 'self' 'nonce-<per-request>'` the browser refuses that\nelement on every page load, because an element React renders on the client\ncannot pick up a server nonce by itself. Pass the request's nonce here and\nit is set on the element.\n\nNothing else in this library emits a `<style>` element, and\n`prepaintScript()` returns a *string* the application renders in a\n`<script>` of its own — so the application already controls that element's\nnonce, and this prop is the whole of what a strict policy needs from here.\n\n**A nonce cannot rescue a style ATTRIBUTE**, and this provider always sets\none on its root: `color-scheme` and `--cue-font-scale`, plus the font\nfamilies and overrides where they are given. CSP has no nonce form for\n`style-src-attr` — it is `'unsafe-inline'` or `'none'` — so an application\nserving `style-src-attr 'none'` loses those declarations, silently. That is\na policy decision rather than something this prop can change.",
153
+ "control": {
154
+ "kind": "string"
155
+ }
156
+ },
132
157
  {
133
158
  "name": "asChild",
134
159
  "type": "boolean",
@@ -79,6 +79,7 @@
79
79
  "--cue-icon-md",
80
80
  "--cue-icon-sm",
81
81
  "--cue-info",
82
+ "--cue-leading-ui",
82
83
  "--cue-ok",
83
84
  "--cue-radius-control",
84
85
  "--cue-radius-overlay",
@@ -203,6 +203,7 @@
203
203
  "--cue-fg-subtle",
204
204
  "--cue-font-mono",
205
205
  "--cue-icon-sm",
206
+ "--cue-leading-ui",
206
207
  "--cue-ok",
207
208
  "--cue-radius-control",
208
209
  "--cue-space-2",
@@ -105,6 +105,7 @@
105
105
  "--cue-fg-muted",
106
106
  "--cue-fg-subtle",
107
107
  "--cue-font-mono",
108
+ "--cue-leading-ui",
108
109
  "--cue-radius-overlay",
109
110
  "--cue-radius-surface",
110
111
  "--cue-surface-2",
@@ -147,6 +147,7 @@
147
147
  "--cue-fg-muted",
148
148
  "--cue-fg-subtle",
149
149
  "--cue-font-mono",
150
+ "--cue-leading-ui",
150
151
  "--cue-radius-control",
151
152
  "--cue-radius-overlay",
152
153
  "--cue-scrim",
@@ -104,6 +104,7 @@
104
104
  "--cue-fg",
105
105
  "--cue-fg-muted",
106
106
  "--cue-fg-subtle",
107
+ "--cue-leading-ui",
107
108
  "--cue-radius-overlay",
108
109
  "--cue-stream",
109
110
  "--cue-surface-1",