@cueplusplus/ui 0.16.0 → 0.17.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 (480) hide show
  1. package/CHANGELOG.md +825 -0
  2. package/README.md +1 -1
  3. package/dist/agent-runtime/tool-call-card.js +7 -3
  4. package/dist/brand/_chassis.d.ts +1 -1
  5. package/dist/brand/cue-mark.d.ts +1 -1
  6. package/dist/brand/cue-mark.js +1 -1
  7. package/dist/charts/ramps.js +1 -1
  8. package/dist/chat/agent-pile.js +2 -1
  9. package/dist/chat/ask-box.js +4 -3
  10. package/dist/chat/delegation-card.js +3 -2
  11. package/dist/chat/message-list.js +3 -2
  12. package/dist/chat/message.js +17 -7
  13. package/dist/chrome/_edge-scroller.js +2 -1
  14. package/dist/chrome/_status-bar.js +9 -3
  15. package/dist/chrome/_tabs-scroll.d.ts +1 -1
  16. package/dist/chrome/_tabs-scroll.js +1 -1
  17. package/dist/chrome/app-bar.js +9 -3
  18. package/dist/chrome/app-shell.js +2 -1
  19. package/dist/chrome/band.d.ts +18 -12
  20. package/dist/chrome/band.js +18 -32
  21. package/dist/chrome/eyebrow.d.ts +13 -5
  22. package/dist/chrome/eyebrow.js +18 -7
  23. package/dist/chrome/footer.d.ts +5 -0
  24. package/dist/chrome/footer.js +14 -3
  25. package/dist/chrome/navigation-menu.js +4 -2
  26. package/dist/chrome/page-shell.js +8 -5
  27. package/dist/chrome/panel.d.ts +5 -2
  28. package/dist/chrome/panel.js +8 -4
  29. package/dist/chrome/row.js +6 -3
  30. package/dist/chrome/scroll-area.js +2 -1
  31. package/dist/chrome/section-header.js +13 -4
  32. package/dist/chrome/segmented-control.js +12 -3
  33. package/dist/chrome/status-bar.js +2 -1
  34. package/dist/chrome/tabs.js +11 -3
  35. package/dist/chrome/toolbar.js +2 -1
  36. package/dist/chrome/tree.js +3 -2
  37. package/dist/color/_thumb.js +9 -3
  38. package/dist/color/color-area.js +1 -1
  39. package/dist/color/color-swatch.js +1 -1
  40. package/dist/configurator/_overrides.js +13 -4
  41. package/dist/configurator/configurator.js +4 -1
  42. package/dist/configurator/export-dialog.js +5 -2
  43. package/dist/configurator/panel-sections.js +6 -2
  44. package/dist/configurator/token-editor.js +4 -1
  45. package/dist/date/calendar.js +12 -8
  46. package/dist/dmx/channel-matrix.js +3 -2
  47. package/dist/dmx/dmx-bar.js +1 -1
  48. package/dist/dmx/dmx-strip.js +1 -1
  49. package/dist/dmx/universe-grid.js +3 -2
  50. package/dist/elements/activity-graph.js +3 -3
  51. package/dist/elements/agent-card.js +3 -3
  52. package/dist/elements/approval-card.js +3 -3
  53. package/dist/elements/artifact-card.js +2 -2
  54. package/dist/elements/background-inbox.js +2 -2
  55. package/dist/elements/canvas-split.js +2 -2
  56. package/dist/elements/chart.js +1 -1
  57. package/dist/elements/chat-panel.js +2 -2
  58. package/dist/elements/checkpoint-history.js +2 -2
  59. package/dist/elements/clamp.js +2 -1
  60. package/dist/elements/code-diff.js +1 -1
  61. package/dist/elements/code-runner.js +1 -1
  62. package/dist/elements/command-palette.js +6 -5
  63. package/dist/elements/comparison-card.js +2 -2
  64. package/dist/elements/composer.js +9 -8
  65. package/dist/elements/computer-use.js +1 -1
  66. package/dist/elements/confidence-marker.js +2 -1
  67. package/dist/elements/connection-state.js +1 -1
  68. package/dist/elements/context-breakdown.js +1 -1
  69. package/dist/elements/context-usage.js +1 -1
  70. package/dist/elements/conversation-search.js +4 -3
  71. package/dist/elements/cost-meter.js +1 -1
  72. package/dist/elements/data-table.js +2 -2
  73. package/dist/elements/day-separator.js +1 -1
  74. package/dist/elements/diagram.js +1 -1
  75. package/dist/elements/document-reference.js +3 -3
  76. package/dist/elements/draft-restore.js +1 -1
  77. package/dist/elements/edit-message.js +4 -3
  78. package/dist/elements/elements.css +26 -5
  79. package/dist/elements/elicitation-form.js +3 -3
  80. package/dist/elements/empty-state.js +2 -1
  81. package/dist/elements/error-state.js +1 -1
  82. package/dist/elements/feedback-dialog.js +4 -3
  83. package/dist/elements/file-tree.js +2 -2
  84. package/dist/elements/flow-graph.js +2 -2
  85. package/dist/elements/guardrail-notice.js +3 -3
  86. package/dist/elements/image-generation.js +1 -1
  87. package/dist/elements/inline-citation.js +3 -3
  88. package/dist/elements/job-progress.js +3 -3
  89. package/dist/elements/launcher-bubble.js +2 -2
  90. package/dist/elements/loading-state.js +1 -1
  91. package/dist/elements/map-answer.js +3 -2
  92. package/dist/elements/markdown.js +5 -4
  93. package/dist/elements/math-block.js +1 -1
  94. package/dist/elements/mcp-server-panel.js +3 -3
  95. package/dist/elements/message-attachment.js +4 -4
  96. package/dist/elements/message-pair.js +1 -1
  97. package/dist/elements/message-queue.js +2 -2
  98. package/dist/elements/mobile-composer.js +4 -3
  99. package/dist/elements/model-picker.js +3 -3
  100. package/dist/elements/onboarding.js +2 -2
  101. package/dist/elements/permission-grant.js +2 -2
  102. package/dist/elements/permission-scopes.js +5 -4
  103. package/dist/elements/prompt-library.js +7 -6
  104. package/dist/elements/queue-dock.js +4 -3
  105. package/dist/elements/quota-banner.js +1 -1
  106. package/dist/elements/quote-reply.js +1 -1
  107. package/dist/elements/read-aloud.js +2 -2
  108. package/dist/elements/reasoning-panel.js +2 -1
  109. package/dist/elements/recommendation-card.d.ts +1 -1
  110. package/dist/elements/recommendation-card.js +2 -2
  111. package/dist/elements/regenerate-menu.js +2 -2
  112. package/dist/elements/research-report.js +1 -1
  113. package/dist/elements/retrieval-chunks.js +1 -1
  114. package/dist/elements/revert-dock.js +5 -4
  115. package/dist/elements/reviewable-diff.js +1 -1
  116. package/dist/elements/schedule-card.js +3 -3
  117. package/dist/elements/score-breakdown.js +1 -1
  118. package/dist/elements/scroll-anchor.js +2 -2
  119. package/dist/elements/settings-panel.js +3 -2
  120. package/dist/elements/shared-conversation.js +2 -2
  121. package/dist/elements/sources.js +4 -3
  122. package/dist/elements/speaker-identity.js +1 -1
  123. package/dist/elements/spec-sheet.js +1 -1
  124. package/dist/elements/streaming-text.js +1 -1
  125. package/dist/elements/subagent-list.js +2 -2
  126. package/dist/elements/suggestions.js +1 -1
  127. package/dist/elements/surfaces.d.ts +1 -1
  128. package/dist/elements/surfaces.js +2 -1
  129. package/dist/elements/tail-status.js +1 -1
  130. package/dist/elements/terminal-block.js +1 -1
  131. package/dist/elements/thread-list.js +1 -1
  132. package/dist/elements/thread-search.js +5 -4
  133. package/dist/elements/timeline.js +1 -1
  134. package/dist/elements/todo-list.js +2 -2
  135. package/dist/elements/tool-call.js +4 -3
  136. package/dist/elements/tool-error.js +2 -2
  137. package/dist/elements/tool-group.js +1 -1
  138. package/dist/elements/tool-timeline.js +4 -3
  139. package/dist/elements/trace-waterfall.js +1 -1
  140. package/dist/elements/verdict-row.js +2 -2
  141. package/dist/elements/voice-conversation.js +3 -2
  142. package/dist/elements/web-preview.js +1 -1
  143. package/dist/elements/web-search.js +2 -2
  144. package/dist/elements/work-collapse.js +2 -1
  145. package/dist/flow/node-card.js +3 -2
  146. package/dist/flow/use-flow-theme.js +2 -1
  147. package/dist/forms/_chassis.d.ts +26 -6
  148. package/dist/forms/_chassis.js +33 -8
  149. package/dist/forms/_listbox.js +8 -5
  150. package/dist/forms/checkbox.js +8 -2
  151. package/dist/forms/env-var-input.js +3 -2
  152. package/dist/forms/field.d.ts +2 -1
  153. package/dist/forms/field.js +15 -4
  154. package/dist/forms/file-upload.js +3 -2
  155. package/dist/forms/number-field.js +2 -1
  156. package/dist/forms/password-input.js +4 -2
  157. package/dist/forms/radio-group.js +6 -2
  158. package/dist/forms/rating.js +2 -1
  159. package/dist/forms/scrub-input.js +2 -1
  160. package/dist/forms/search-input.js +2 -1
  161. package/dist/forms/select.js +5 -2
  162. package/dist/forms/slider.js +6 -2
  163. package/dist/forms/switch.js +6 -2
  164. package/dist/forms/textarea.js +2 -1
  165. package/dist/forms/toggle.js +3 -1
  166. package/dist/index.d.ts +2 -2
  167. package/dist/index.js +2 -2
  168. package/dist/instruments/_data-row.js +2 -1
  169. package/dist/instruments/app-window-frame.js +1 -1
  170. package/dist/instruments/code-block.js +8 -2
  171. package/dist/instruments/group-bar.js +1 -1
  172. package/dist/instruments/ledger.js +6 -2
  173. package/dist/instruments/log-viewer.js +4 -3
  174. package/dist/instruments/progress.js +5 -2
  175. package/dist/instruments/seam-grid.js +5 -3
  176. package/dist/instruments/stat.js +10 -3
  177. package/dist/instruments/table.js +28 -10
  178. package/dist/instruments/terminal-frame.js +4 -2
  179. package/dist/instruments/usage-chart.js +1 -1
  180. package/dist/layout/_collapse.js +6 -1
  181. package/dist/layout/bento.js +7 -4
  182. package/dist/layout/breadcrumb.js +7 -3
  183. package/dist/layout/card.js +12 -6
  184. package/dist/layout/carousel.js +3 -2
  185. package/dist/layout/collapsible.js +5 -1
  186. package/dist/layout/container.js +2 -1
  187. package/dist/layout/description-list.js +4 -1
  188. package/dist/layout/frames.js +11 -5
  189. package/dist/layout/item.js +3 -2
  190. package/dist/layout/link.d.ts +16 -0
  191. package/dist/layout/link.js +22 -3
  192. package/dist/layout/pagination.js +2 -1
  193. package/dist/layout/preview.d.ts +32 -12
  194. package/dist/layout/preview.js +149 -40
  195. package/dist/layout/resizable.js +2 -1
  196. package/dist/layout/sidebar.js +11 -3
  197. package/dist/layout/stepper.js +6 -2
  198. package/dist/lib/cn.js +29 -2
  199. package/dist/midi/piano-keyboard.js +3 -2
  200. package/dist/midi/spectrum-visualizer.js +1 -1
  201. package/dist/midi/threshold-rail.js +2 -1
  202. package/dist/midi/timeline-ruler.js +1 -1
  203. package/dist/overlays/_surface.d.ts +72 -12
  204. package/dist/overlays/_surface.js +84 -12
  205. package/dist/overlays/command-palette.js +9 -5
  206. package/dist/overlays/dialog.d.ts +5 -0
  207. package/dist/overlays/dialog.js +6 -1
  208. package/dist/overlays/info-tip.js +2 -1
  209. package/dist/overlays/menubar.js +3 -1
  210. package/dist/overlays/popover.js +2 -1
  211. package/dist/overlays/toast.js +6 -2
  212. package/dist/overlays/tooltip.js +4 -1
  213. package/dist/primitives/button.d.ts +15 -0
  214. package/dist/primitives/button.js +40 -11
  215. package/dist/primitives/chip.d.ts +19 -1
  216. package/dist/primitives/chip.js +39 -17
  217. package/dist/primitives/kbd.d.ts +6 -0
  218. package/dist/primitives/kbd.js +10 -1
  219. package/dist/primitives/skeleton.js +1 -1
  220. package/dist/system/_focus-ring-field.js +29 -0
  221. package/dist/system/_focus-ring.js +125 -0
  222. package/dist/system/_paint-glow.js +22 -3
  223. package/dist/system/_paint-rest-shade.js +32 -0
  224. package/dist/system/_paint-rim.js +22 -4
  225. package/dist/system/_paint-stroke-surface-1.js +1 -1
  226. package/dist/system/_paint-stroke-surface-2.js +14 -1
  227. package/dist/system/_paint-texture.js +5 -2
  228. package/dist/system/_style-app-bar.js +65 -0
  229. package/dist/system/_style-band.js +57 -0
  230. package/dist/system/_style-body-leading.js +21 -0
  231. package/dist/system/_style-body-size.js +30 -0
  232. package/dist/system/_style-body-weight.js +24 -0
  233. package/dist/system/_style-body.js +27 -0
  234. package/dist/system/_style-caption.js +19 -0
  235. package/dist/system/_style-card-pad.js +43 -0
  236. package/dist/system/_style-check.js +33 -0
  237. package/dist/system/_style-chip.js +103 -0
  238. package/dist/system/_style-code.js +13 -0
  239. package/dist/system/_style-collapse.js +14 -0
  240. package/dist/system/_style-control-face.js +29 -0
  241. package/dist/system/_style-control-label.js +22 -0
  242. package/dist/system/_style-control-step.js +22 -0
  243. package/dist/system/_style-control.js +76 -0
  244. package/dist/system/_style-data-face.js +28 -0
  245. package/dist/system/_style-description.js +23 -0
  246. package/dist/system/_style-eyebrow.js +43 -0
  247. package/dist/system/_style-footer-rule.js +47 -0
  248. package/dist/system/_style-gutter.js +17 -0
  249. package/dist/system/_style-help-ink.js +14 -0
  250. package/dist/system/_style-help.js +29 -0
  251. package/dist/system/_style-input-face.js +34 -0
  252. package/dist/system/_style-kbd.js +46 -0
  253. package/dist/system/_style-label-case.js +36 -0
  254. package/dist/system/_style-label-face.js +32 -0
  255. package/dist/system/_style-label-ink.js +29 -0
  256. package/dist/system/_style-label-leading.js +14 -0
  257. package/dist/system/_style-label-size.js +36 -0
  258. package/dist/system/_style-label-tracking.js +45 -0
  259. package/dist/system/_style-label-weight.js +40 -0
  260. package/dist/system/_style-lede.js +49 -0
  261. package/dist/system/_style-link.js +46 -0
  262. package/dist/system/_style-menu.js +30 -0
  263. package/dist/system/_style-nav-item.js +41 -0
  264. package/dist/system/_style-nav-voice.js +43 -0
  265. package/dist/system/_style-option.js +42 -0
  266. package/dist/system/_style-overlay-title.js +35 -0
  267. package/dist/system/_style-page-title.js +48 -0
  268. package/dist/system/_style-popover-pad.js +13 -0
  269. package/dist/system/_style-quiet-ink.js +13 -0
  270. package/dist/system/_style-row-pad.js +13 -0
  271. package/dist/system/_style-seam.js +43 -0
  272. package/dist/system/_style-section-rule.js +26 -0
  273. package/dist/system/_style-segment.js +30 -0
  274. package/dist/system/_style-segmented-control.js +86 -0
  275. package/dist/system/_style-selected.js +36 -0
  276. package/dist/system/_style-stage-marks.js +26 -0
  277. package/dist/system/_style-tab.js +71 -0
  278. package/dist/system/_style-textarea.js +21 -0
  279. package/dist/system/_style-title.js +37 -0
  280. package/dist/system/_style-tooltip.js +17 -0
  281. package/dist/system/density.d.ts +15 -5
  282. package/dist/system/density.js +188 -25
  283. package/dist/system/index.d.ts +2 -2
  284. package/dist/system/index.js +2 -2
  285. package/dist/system/overrides.d.ts +1 -0
  286. package/dist/system/overrides.js +151 -3
  287. package/dist/system/portal.d.ts +3 -2
  288. package/dist/system/portal.js +22 -10
  289. package/dist/system/prepaint.d.ts +21 -5
  290. package/dist/system/prepaint.js +3 -1
  291. package/dist/system/published.d.ts +1 -0
  292. package/dist/system/published.js +131 -0
  293. package/dist/system/theme-provider.d.ts +118 -21
  294. package/dist/system/theme-provider.js +362 -73
  295. package/dist/system/theme-registry.d.ts +2 -1
  296. package/dist/system/theme-registry.js +27 -10
  297. package/dist/system/use-density.js +4 -3
  298. package/dist/system/use-theme.d.ts +5 -2
  299. package/dist/system/use-theme.js +7 -4
  300. package/dist/system/vocabulary.js +2 -2
  301. package/dist/theming/create-theme.js +12 -6
  302. package/dist/theming/serialize.d.ts +34 -2
  303. package/dist/theming/serialize.js +86 -4
  304. package/manifest/components/accordion.json +7 -1
  305. package/manifest/components/agent-pile.json +3 -0
  306. package/manifest/components/alert-dialog.json +29 -3
  307. package/manifest/components/app-bar.json +19 -2
  308. package/manifest/components/app-shell.json +5 -0
  309. package/manifest/components/ask-box.json +3 -1
  310. package/manifest/components/autocomplete.json +38 -1
  311. package/manifest/components/band.json +7 -3
  312. package/manifest/components/bento.json +12 -1
  313. package/manifest/components/breadcrumb.json +8 -1
  314. package/manifest/components/button.json +27 -3
  315. package/manifest/components/calendar.json +7 -0
  316. package/manifest/components/card.json +22 -1
  317. package/manifest/components/carousel.json +4 -1
  318. package/manifest/components/channel-matrix.json +31 -3
  319. package/manifest/components/chart-tooltip-content.json +29 -3
  320. package/manifest/components/chat-empty-state.json +3 -1
  321. package/manifest/components/checkbox-group.json +14 -0
  322. package/manifest/components/checkbox.json +14 -0
  323. package/manifest/components/chip.json +16 -1
  324. package/manifest/components/clamp.json +3 -1
  325. package/manifest/components/code-block.json +10 -1
  326. package/manifest/components/collapsible.json +13 -2
  327. package/manifest/components/color-area.json +4 -2
  328. package/manifest/components/color-field.json +10 -0
  329. package/manifest/components/color-picker.json +10 -0
  330. package/manifest/components/color-slider.json +3 -1
  331. package/manifest/components/colors-section.json +9 -1
  332. package/manifest/components/combobox.json +38 -1
  333. package/manifest/components/command-palette.json +28 -3
  334. package/manifest/components/composer-actions.json +3 -0
  335. package/manifest/components/composer-attach-button.json +3 -0
  336. package/manifest/components/composer-attachment-chip.json +3 -0
  337. package/manifest/components/composer-attachments.json +3 -0
  338. package/manifest/components/composer-bar.json +3 -0
  339. package/manifest/components/composer-command-item.json +3 -0
  340. package/manifest/components/composer-context.json +3 -0
  341. package/manifest/components/composer-input.json +3 -0
  342. package/manifest/components/composer-menu-item.json +3 -0
  343. package/manifest/components/composer-menu.json +3 -0
  344. package/manifest/components/composer-model-item.json +3 -0
  345. package/manifest/components/composer-model-trigger.json +3 -0
  346. package/manifest/components/composer-person-item.json +3 -0
  347. package/manifest/components/composer-send.json +3 -0
  348. package/manifest/components/composer-toolbar.json +3 -0
  349. package/manifest/components/composer-voice-button.json +3 -0
  350. package/manifest/components/composer-voice.json +3 -0
  351. package/manifest/components/composer.json +10 -0
  352. package/manifest/components/confidence-marker.json +3 -1
  353. package/manifest/components/container.json +2 -1
  354. package/manifest/components/context-menu.json +29 -3
  355. package/manifest/components/conversation-search.json +3 -1
  356. package/manifest/components/cue-mark.json +2 -2
  357. package/manifest/components/cue-portal-frame.json +1 -1
  358. package/manifest/components/data-row.json +3 -1
  359. package/manifest/components/data-tree.json +3 -1
  360. package/manifest/components/date-field.json +10 -0
  361. package/manifest/components/date-picker.json +10 -0
  362. package/manifest/components/date-range-picker.json +10 -0
  363. package/manifest/components/delegation-card.json +3 -1
  364. package/manifest/components/density.json +15 -7
  365. package/manifest/components/description-list.json +6 -1
  366. package/manifest/components/dialog.json +30 -3
  367. package/manifest/components/disclosure.json +13 -2
  368. package/manifest/components/dmx-bar.json +28 -3
  369. package/manifest/components/dmx-strip.json +28 -3
  370. package/manifest/components/drawer.json +29 -3
  371. package/manifest/components/dropdown-menu.json +29 -3
  372. package/manifest/components/edit-message.json +3 -1
  373. package/manifest/components/elements-command-palette.json +3 -1
  374. package/manifest/components/elements-composer.json +3 -0
  375. package/manifest/components/empty-state-composer.json +3 -1
  376. package/manifest/components/empty-state-greeting.json +3 -1
  377. package/manifest/components/empty-state-suggestion.json +3 -1
  378. package/manifest/components/empty-state-suggestions.json +3 -1
  379. package/manifest/components/env-var-input.json +10 -1
  380. package/manifest/components/export-dialog.json +6 -1
  381. package/manifest/components/eyebrow.json +13 -2
  382. package/manifest/components/feedback-dialog.json +3 -0
  383. package/manifest/components/field-description.json +14 -0
  384. package/manifest/components/field-error.json +14 -0
  385. package/manifest/components/field-label.json +15 -1
  386. package/manifest/components/field.json +14 -0
  387. package/manifest/components/file-upload.json +3 -0
  388. package/manifest/components/footer.json +14 -1
  389. package/manifest/components/frames.json +14 -1
  390. package/manifest/components/hover-card.json +29 -3
  391. package/manifest/components/info-tip.json +3 -0
  392. package/manifest/components/input-group.json +10 -0
  393. package/manifest/components/input.json +10 -0
  394. package/manifest/components/item.json +3 -1
  395. package/manifest/components/kbd.json +10 -1
  396. package/manifest/components/ledger.json +9 -2
  397. package/manifest/components/link.json +10 -0
  398. package/manifest/components/log-viewer.json +3 -0
  399. package/manifest/components/map-answer.json +3 -1
  400. package/manifest/components/markdown-text.json +3 -0
  401. package/manifest/components/menubar.json +32 -4
  402. package/manifest/components/message-list.json +3 -0
  403. package/manifest/components/message.json +6 -1
  404. package/manifest/components/mobile-composer.json +3 -1
  405. package/manifest/components/multi-select.json +38 -1
  406. package/manifest/components/musical-time-input.json +10 -0
  407. package/manifest/components/navigation-menu.json +32 -3
  408. package/manifest/components/node-card.json +3 -0
  409. package/manifest/components/number-field.json +10 -1
  410. package/manifest/components/otp-field.json +9 -0
  411. package/manifest/components/page-shell.json +14 -0
  412. package/manifest/components/pagination.json +3 -0
  413. package/manifest/components/panel-header.json +10 -0
  414. package/manifest/components/panel.json +11 -1
  415. package/manifest/components/password-input.json +10 -1
  416. package/manifest/components/permission-scopes.json +3 -1
  417. package/manifest/components/piano-keyboard.json +3 -0
  418. package/manifest/components/popover.json +30 -3
  419. package/manifest/components/preset-section.json +9 -1
  420. package/manifest/components/preview.json +24 -10
  421. package/manifest/components/progress.json +6 -1
  422. package/manifest/components/prompt-library.json +3 -1
  423. package/manifest/components/queue-dock.json +3 -1
  424. package/manifest/components/radio-group.json +8 -0
  425. package/manifest/components/radio.json +8 -0
  426. package/manifest/components/rating.json +4 -1
  427. package/manifest/components/reasoning-panel.json +3 -1
  428. package/manifest/components/recommendation-card.json +1 -1
  429. package/manifest/components/resizable.json +4 -1
  430. package/manifest/components/revert-dock.json +3 -1
  431. package/manifest/components/row.json +5 -1
  432. package/manifest/components/scroll-area.json +4 -2
  433. package/manifest/components/scrollable-tabs-list.json +18 -0
  434. package/manifest/components/scrub-input.json +10 -1
  435. package/manifest/components/seam-cell.json +1 -0
  436. package/manifest/components/seam-grid.json +1 -0
  437. package/manifest/components/seam-list.json +5 -1
  438. package/manifest/components/search-input.json +10 -1
  439. package/manifest/components/section-header.json +15 -2
  440. package/manifest/components/segmented-control.json +16 -0
  441. package/manifest/components/select.json +17 -0
  442. package/manifest/components/settings-panel.json +3 -0
  443. package/manifest/components/shape-section.json +9 -1
  444. package/manifest/components/sheet.json +29 -3
  445. package/manifest/components/shimmer-label.json +3 -0
  446. package/manifest/components/sidebar.json +19 -2
  447. package/manifest/components/slider.json +8 -0
  448. package/manifest/components/sources.json +3 -1
  449. package/manifest/components/stat.json +9 -0
  450. package/manifest/components/status-bar.json +4 -0
  451. package/manifest/components/stepper.json +8 -0
  452. package/manifest/components/swap-label.json +3 -0
  453. package/manifest/components/switch.json +8 -0
  454. package/manifest/components/table-scroll-region.json +20 -2
  455. package/manifest/components/table.json +20 -2
  456. package/manifest/components/tabs.json +19 -1
  457. package/manifest/components/tags-input.json +38 -1
  458. package/manifest/components/terminal-frame.json +3 -0
  459. package/manifest/components/textarea.json +12 -0
  460. package/manifest/components/theme-configurator.json +29 -3
  461. package/manifest/components/theme-provider.json +31 -19
  462. package/manifest/components/thread-search.json +3 -1
  463. package/manifest/components/threshold-rail.json +3 -0
  464. package/manifest/components/time-field.json +10 -0
  465. package/manifest/components/toast.json +30 -2
  466. package/manifest/components/toggle.json +4 -0
  467. package/manifest/components/token-editor.json +6 -1
  468. package/manifest/components/tool-call-card.json +9 -2
  469. package/manifest/components/tool-call.json +3 -1
  470. package/manifest/components/tool-timeline.json +3 -1
  471. package/manifest/components/toolbar.json +3 -1
  472. package/manifest/components/tooltip.json +31 -3
  473. package/manifest/components/tree-visibility-toggle.json +3 -0
  474. package/manifest/components/tree.json +3 -0
  475. package/manifest/components/universe-grid.json +3 -0
  476. package/manifest/components/voice-conversation.json +3 -0
  477. package/manifest/components/work-collapse.json +3 -1
  478. package/manifest/manifest.json +204 -184
  479. package/manifest/tokens.json +241 -4
  480. package/package.json +5 -5
@@ -1,6 +1,10 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
+ import { FOCUS_RING } from "../system/_focus-ring.js";
3
4
  import { cva } from "../lib/cva.js";
5
+ import { CHIP_CASE, CHIP_EDGE, CHIP_FILL, CHIP_HEIGHT, CHIP_PAD, CHIP_RADIUS, CHIP_SIZE, CHIP_SIZE_MICRO, CHIP_TRACKING, CHIP_TRACKING_TAG } from "../system/_style-chip.js";
6
+ import { LABEL_FACE } from "../system/_style-label-face.js";
7
+ import { LABEL_WEIGHT } from "../system/_style-label-weight.js";
4
8
  import * as React from "react";
5
9
  import { jsx } from "react/jsx-runtime";
6
10
  //#region src/primitives/chip.tsx
@@ -27,26 +31,34 @@ import { jsx } from "react/jsx-runtime";
27
31
  * page rather than a container. The rim is therefore a compound of tone and
28
32
  * variant, exactly as the fill is.
29
33
  *
34
+ * **The recipe reads the style set** (spec 2026-09-26-looks-fidelity §3.6,
35
+ * `system/_style-chip.ts`): the six tones' fill and rim are
36
+ * `color-mix(in oklab, var(--cue-<tone>) var(--cue-style-chip-fill, 10%), transparent)`
37
+ * and the same with `--cue-style-chip-edge` at `35%` — exactly `bg-<tone>/10`
38
+ * and `border-<tone>/35` under no set, and a set's own shares inside one. The
39
+ * case, tracking, radius, size and weight read `--cue-style-chip-case`,
40
+ * `-tracking`, `-radius`, `-size` and `--cue-style-label-weight` the same way.
41
+ *
30
42
  * @example
31
43
  * <span className={chipVariants({ tone: "danger", variant: "outline" })}>fault</span>
32
44
  * @example
33
45
  * <span className={chipVariants({ variant: "tag" })}>mcp</span>
34
46
  */
35
- const chipVariants = cva("inline-flex h-chip select-none items-center justify-center gap-(--cue-space-2) whitespace-nowrap rounded-(--radius-control) border font-mono leading-none uppercase outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent", {
47
+ const chipVariants = cva(`inline-flex ${CHIP_HEIGHT} select-none items-center justify-center gap-(--cue-space-2) whitespace-nowrap ${CHIP_RADIUS} border ${LABEL_FACE} ${LABEL_WEIGHT} leading-none ${CHIP_CASE} outline-none ${FOCUS_RING}`, {
36
48
  variants: {
37
49
  tone: {
38
50
  neutral: "text-fg-muted",
39
- accent: "border-accent/35 text-accent",
40
- ok: "border-ok/35 text-ok",
41
- busy: "border-busy/35 text-busy",
42
- warn: "border-warn/35 text-warn",
43
- danger: "border-danger/35 text-danger",
44
- info: "border-info/35 text-info"
51
+ accent: `${CHIP_EDGE.accent} text-accent`,
52
+ ok: `${CHIP_EDGE.ok} text-ok`,
53
+ busy: `${CHIP_EDGE.busy} text-busy`,
54
+ warn: `${CHIP_EDGE.warn} text-warn`,
55
+ danger: `${CHIP_EDGE.danger} text-danger`,
56
+ info: `${CHIP_EDGE.info} text-info`
45
57
  },
46
58
  variant: {
47
- tinted: "px-(--cue-space-3) text-(length:--cue-text-label) tracking-(--cue-tracking-caps)",
48
- outline: "bg-transparent px-(--cue-space-3) text-(length:--cue-text-label) tracking-(--cue-tracking-caps)",
49
- tag: "bg-transparent px-(--cue-space-2) text-(length:--cue-text-micro) tracking-[0.06em]"
59
+ tinted: `${CHIP_PAD} ${CHIP_SIZE} ${CHIP_TRACKING}`,
60
+ outline: `bg-transparent ${CHIP_PAD} ${CHIP_SIZE} ${CHIP_TRACKING}`,
61
+ tag: `bg-transparent px-(--cue-space-2) ${CHIP_SIZE_MICRO} ${CHIP_TRACKING_TAG}`
50
62
  },
51
63
  interactive: {
52
64
  true: "cursor-pointer disabled:pointer-events-none disabled:opacity-40",
@@ -72,32 +84,32 @@ const chipVariants = cva("inline-flex h-chip select-none items-center justify-ce
72
84
  {
73
85
  tone: "accent",
74
86
  variant: "tinted",
75
- class: "bg-accent/10"
87
+ class: CHIP_FILL.accent
76
88
  },
77
89
  {
78
90
  tone: "ok",
79
91
  variant: "tinted",
80
- class: "bg-ok/10"
92
+ class: CHIP_FILL.ok
81
93
  },
82
94
  {
83
95
  tone: "busy",
84
96
  variant: "tinted",
85
- class: "bg-busy/10"
97
+ class: CHIP_FILL.busy
86
98
  },
87
99
  {
88
100
  tone: "warn",
89
101
  variant: "tinted",
90
- class: "bg-warn/10"
102
+ class: CHIP_FILL.warn
91
103
  },
92
104
  {
93
105
  tone: "danger",
94
106
  variant: "tinted",
95
- class: "bg-danger/10"
107
+ class: CHIP_FILL.danger
96
108
  },
97
109
  {
98
110
  tone: "info",
99
111
  variant: "tinted",
100
- class: "bg-info/10"
112
+ class: CHIP_FILL.info
101
113
  },
102
114
  {
103
115
  tone: "neutral",
@@ -191,7 +203,17 @@ const chipVariants = cva("inline-flex h-chip select-none items-center justify-ce
191
203
  }
192
204
  });
193
205
  /**
194
- * A compact status/label pill: mono, uppercase, wide-tracked, one line tall.
206
+ * A compact status/label pill: mono, uppercase, wide-tracked, one line tall —
207
+ * by default, the style set's choice inside one.
208
+ *
209
+ * A chip speaks in the label voice: it reads the label face
210
+ * (`--cue-style-label-face`) and its own case (`--cue-style-chip-case`, which
211
+ * falls back to the label case), so under a sans, sentence-case Look its text
212
+ * is sans and sentence case like the captions around it. This reverses the
213
+ * earlier ruling that a tag's text is the value being shown and stays mono
214
+ * (spec 2026-09-26-looks-fidelity F-15): under a sans Look a mono uppercase
215
+ * chip was the most visible console voice left on the page. A consumer that
216
+ * wants a chip mono under every set passes `className="font-mono uppercase"`.
195
217
  *
196
218
  * `tone` uses the shared status vocabulary (`ok | busy | warn | danger | info`)
197
219
  * plus `neutral` and `accent`, so a chip, a `StatusDot` and a `Meter` always
@@ -9,6 +9,12 @@ type KbdProps = React.ComponentPropsWithoutRef<"kbd">;
9
9
  * chip height so a `Kbd` and a `Chip` line up on the same row, and set in the
10
10
  * micro type step because shortcut hints are reference material, not content.
11
11
  *
12
+ * A key label is a control's voice, so it wears the control face
13
+ * (`--cue-style-control-face`, mono by default) rather than a fixed mono
14
+ * (spec 2026-09-26-looks-fidelity F-16), and a style set can move its rim
15
+ * (`--cue-style-kbd-edge`), its size (`--cue-style-chip-size`, shared with the
16
+ * chip it sits beside) and its weight (`--cue-style-label-weight`).
17
+ *
12
18
  * @example
13
19
  * <span>Press <Kbd>⌘</Kbd><Kbd>K</Kbd> to search</span>
14
20
  */
@@ -1,4 +1,7 @@
1
1
  import { cn } from "../lib/cn.js";
2
+ import { CONTROL_FACE } from "../system/_style-control-face.js";
3
+ import { LABEL_WEIGHT } from "../system/_style-label-weight.js";
4
+ import { KBD_BOX, KBD_EDGE, KBD_SIZE } from "../system/_style-kbd.js";
2
5
  import * as React from "react";
3
6
  import { jsx } from "react/jsx-runtime";
4
7
  //#region src/primitives/kbd.tsx
@@ -9,13 +12,19 @@ import { jsx } from "react/jsx-runtime";
9
12
  * chip height so a `Kbd` and a `Chip` line up on the same row, and set in the
10
13
  * micro type step because shortcut hints are reference material, not content.
11
14
  *
15
+ * A key label is a control's voice, so it wears the control face
16
+ * (`--cue-style-control-face`, mono by default) rather than a fixed mono
17
+ * (spec 2026-09-26-looks-fidelity F-16), and a style set can move its rim
18
+ * (`--cue-style-kbd-edge`), its size (`--cue-style-chip-size`, shared with the
19
+ * chip it sits beside) and its weight (`--cue-style-label-weight`).
20
+ *
12
21
  * @example
13
22
  * <span>Press <Kbd>⌘</Kbd><Kbd>K</Kbd> to search</span>
14
23
  */
15
24
  const Kbd = React.forwardRef(function Kbd({ className, children, ...elementProps }, ref) {
16
25
  return /* @__PURE__ */ jsx("kbd", {
17
26
  ref,
18
- className: cn("inline-flex h-chip min-w-chip select-none items-center justify-center rounded-(--radius-control) border border-border bg-surface-2 px-(--cue-space-2) font-mono text-(length:--cue-text-micro) leading-none text-fg-muted", className),
27
+ className: cn(`inline-flex ${KBD_BOX} select-none items-center justify-center border bg-surface-2 text-fg-muted`, KBD_EDGE, CONTROL_FACE, KBD_SIZE, "leading-none", LABEL_WEIGHT, className),
19
28
  ...elementProps,
20
29
  children
21
30
  });
@@ -19,7 +19,7 @@ const Skeleton = React.forwardRef(function Skeleton({ className, ...elementProps
19
19
  return /* @__PURE__ */ jsx("div", {
20
20
  ref,
21
21
  "aria-hidden": "true",
22
- className: cn("animate-pulse rounded-(--radius-control) bg-surface-2 motion-reduce:animate-none", className),
22
+ className: cn("animate-pulse rounded-control bg-surface-2 motion-reduce:animate-none", className),
23
23
  ...elementProps
24
24
  });
25
25
  });
@@ -0,0 +1,29 @@
1
+ //#region src/system/_focus-ring-field.ts
2
+ /**
3
+ * `FOCUS_RING_INSET` (`_focus-ring.ts`) with its offset read from the style set: the
4
+ * recessed field chassis's ring (`forms/_chassis.ts`), and nothing else.
5
+ *
6
+ * Plan V.2, T25: Tender's field ring sits flush on the rim (`0px`) where every
7
+ * other site of the inset shape keeps its `-1px`, so the offset is a name of
8
+ * its own — `style-field-focus-offset`, falling back to the `-1px`
9
+ * `FOCUS_RING_INSET` draws — and not `style-focus-offset`, which is the
10
+ * button chassis's (kiln pulls that to `-1px`, and a field that followed it
11
+ * would move with the buttons). `FOCUS_RING_INSET` keeps its fixed offset
12
+ * for its ten other consumers.
13
+ *
14
+ * Its own module, not a constant in `_focus-ring.ts`: docgen attributes a
15
+ * token to a component by the file its class string lives in, and every
16
+ * focusable component imports that module.
17
+ *
18
+ * @internal Not part of the public API.
19
+ */
20
+ const FOCUS_RING_FIELD = "focus-visible:outline-solid focus-visible:outline-[length:var(--cue-style-focus-width,var(--cue-focus-ring))] focus-visible:outline-(--cue-focus) focus-visible:outline-offset-[var(--cue-style-field-focus-offset,-1px)]";
21
+ /**
22
+ * `FOCUS_RING_GROUP_INSET` with {@link FOCUS_RING_FIELD}'s offset: the
23
+ * grouped field's ring reads `style-field-focus-offset` as the field it wraps
24
+ * does (plan V.2, T25), so a grouped field and a plain one keep one focus
25
+ * geometry under every Look.
26
+ */
27
+ const FOCUS_RING_GROUP_FIELD = "has-focus-visible:outline-solid has-focus-visible:outline-[length:var(--cue-style-focus-width,var(--cue-focus-ring))] has-focus-visible:outline-(--cue-focus) has-focus-visible:outline-offset-[var(--cue-style-field-focus-offset,-1px)]";
28
+ //#endregion
29
+ export { FOCUS_RING_FIELD, FOCUS_RING_GROUP_FIELD };
@@ -0,0 +1,125 @@
1
+ //#region src/system/_focus-ring.ts
2
+ /**
3
+ * The one focus ring this library draws, in one place.
4
+ *
5
+ * Spec 2026-09-26-looks-fidelity §3.12 (F-9). Before this module existed, 80
6
+ * files each spelt out `focus-visible:outline-2 focus-visible:outline-solid
7
+ * focus-visible:outline-offset-<n> focus-visible:outline-accent` by hand — a
8
+ * fixed 2px ring in the theme's **brand** colour. That is the wrong role:
9
+ * `--cue-accent` is not contrast-gated as an indicator, `--cue-focus` is (WCAG
10
+ * 1.4.11, advisory 3:1 on five grounds — `forms/_chassis.ts` carries the long
11
+ * form), and three shipped presets (hivehub.light, luma.light, venu.light)
12
+ * already had to split the two apart because the accent alone reads under
13
+ * 3:1 there. Every site but `forms/_chassis.ts` kept pointing at the
14
+ * un-gated role anyway, which is the defect this module closes.
15
+ *
16
+ * **This is a deliberate, library-wide colour change**, not a no-op: the
17
+ * ring's colour moves wherever a theme's `focus` differs from its `accent` —
18
+ * graphite and kiln and porcelain in both modes, tender dark, and hivehub,
19
+ * luma and venu in light (ten of the thirty theme blocks this system ships).
20
+ * `tests/browser/form-focus.spec.ts` and `form-focus-theme-blocks.spec.ts`
21
+ * measure the ring's resolved colour against `--cue-focus` in every one of
22
+ * the thirty.
23
+ *
24
+ * **Width is a style-set knob, colour is not.** `--cue-style-focus-width`
25
+ * lets a Look draw a heavier ring (tender: 3px) without a second module; no
26
+ * style name touches the ink, because the ink's job is the contrast floor,
27
+ * not the Look's voice. The fallback is `--cue-focus-ring`, the frozen 2px
28
+ * this system drew before any style set existed.
29
+ *
30
+ * **Offset is not one of the constants below.** Every site but the button
31
+ * chassis keeps the exact offset it already painted — `FOCUS_RING` (1px,
32
+ * floating clear of the edge), `FOCUS_RING_INSET` (-1px, flush with it),
33
+ * `FOCUS_RING_INSET_2` (-2px, flush one rung further in) and
34
+ * `FOCUS_RING_OFFSET_2` (2px, floating two clear) between them cover every
35
+ * offset this library drew before this file existed but one: `buttonChassis`
36
+ * reads `--cue-style-focus-offset` directly (kiln pulls it to -1px), so
37
+ * `FOCUS_RING_PAINT` — the width-and-colour half with no offset of its own —
38
+ * is exported for that one call site to finish.
39
+ *
40
+ * **Every export is a complete, literal string, not built from parts at
41
+ * runtime.** A first draft of this file built each one from a shared
42
+ * `ring(modifier, offset)` helper — the exact same characters, byte for byte,
43
+ * as what is written out below. It compiled, every jsdom suite that reads
44
+ * class strings off a render stayed green, and every rendered `className`
45
+ * carried the right text — and in a real browser the ring's `outline-offset`
46
+ * computed `0px` on all eighty sites regardless of which constant they used.
47
+ * `@tailwindcss/oxide` finds a utility by scanning source *text* for a
48
+ * complete candidate, and never evaluates the template literal that would
49
+ * assemble `"focus-visible" + ":" + "-outline-offset-1"` at runtime — so a
50
+ * class no file spells out in one contiguous string is a class the compiler
51
+ * never generates, however many test suites confirm the DOM carries its
52
+ * name. `tests/browser/form-focus.spec.ts` is what caught it, on a full
53
+ * `pnpm test:browser` run rather than on any file run alone, which is the
54
+ * argument for never letting this module drift back to the helper.
55
+ *
56
+ * **Its own module**, for the reason `_paint-glow.ts` gives at length:
57
+ * `@repo/docgen` attributes a token to a component by the file its class
58
+ * string lives in, following only `_`-prefixed imports. One ring, spent from
59
+ * one file, so a component that draws it is credited with reading
60
+ * `--cue-focus` and not with reading nothing.
61
+ *
62
+ * `outline-solid` is load-bearing in every export below, not decoration: in
63
+ * Tailwind v4 an outline's *style* is a separate custom property from its
64
+ * width, `outline-none` (the resting state every one of these sites also
65
+ * carries) sets that property to `none`, and only `<modifier>:outline-solid`
66
+ * restores it at ring time. `buttonChassis`'s own note says why at more
67
+ * length; `test/focus-ring.test.ts` is what keeps it paired here.
68
+ *
69
+ * @internal Not part of the public API.
70
+ */
71
+ /**
72
+ * The ring's width and colour, with no offset of its own.
73
+ *
74
+ * Exported only for `primitives/button.tsx`, whose offset is itself a
75
+ * style-set knob (`--cue-style-focus-offset`) rather than one of the four
76
+ * fixed shapes below. Every other site imports one of those instead.
77
+ */
78
+ const FOCUS_RING_PAINT = "focus-visible:outline-solid focus-visible:outline-[length:var(--cue-style-focus-width,var(--cue-focus-ring))] focus-visible:outline-(--cue-focus)";
79
+ /**
80
+ * A ring floating one pixel clear of the control's own edge
81
+ * (`outline-offset-1`).
82
+ *
83
+ * The shape most of this system's non-recessed controls drew already —
84
+ * `Button`'s siblings that do not ride `buttonChassis` itself, `Chip`,
85
+ * `Tabs`' own trigger, `AppBar.Link` and the rest of the plain chrome.
86
+ */
87
+ const FOCUS_RING = "focus-visible:outline-solid focus-visible:outline-[length:var(--cue-style-focus-width,var(--cue-focus-ring))] focus-visible:outline-(--cue-focus) focus-visible:outline-offset-1";
88
+ /**
89
+ * A ring pulled back flush with the control's own edge, one pixel in
90
+ * (`-outline-offset-1`).
91
+ *
92
+ * The recessed-chassis shape: an outline at this offset spans from one pixel
93
+ * inside the border box to one pixel outside it, so it covers the rim it is
94
+ * drawn over instead of floating clear of it — `forms/_chassis.ts`'s long
95
+ * comment is the argument in full, and that file's own ring is exactly this
96
+ * constant.
97
+ */
98
+ const FOCUS_RING_INSET = "focus-visible:outline-solid focus-visible:outline-[length:var(--cue-style-focus-width,var(--cue-focus-ring))] focus-visible:outline-(--cue-focus) focus-visible:-outline-offset-1";
99
+ /**
100
+ * A ring pulled back two pixels (`-outline-offset-2`) — for a control whose
101
+ * own rim sits one ring further in than {@link FOCUS_RING_INSET}'s, such as
102
+ * `SegmentedControl`'s pressed item inside its track.
103
+ */
104
+ const FOCUS_RING_INSET_2 = "focus-visible:outline-solid focus-visible:outline-[length:var(--cue-style-focus-width,var(--cue-focus-ring))] focus-visible:outline-(--cue-focus) focus-visible:-outline-offset-2";
105
+ /**
106
+ * A ring floating two pixels clear (`outline-offset-2`) — the wider-gap
107
+ * counterpart to {@link FOCUS_RING} for a control with more room around it,
108
+ * such as a `Tabs` list item or a card-level link.
109
+ */
110
+ const FOCUS_RING_OFFSET_2 = "focus-visible:outline-solid focus-visible:outline-[length:var(--cue-style-focus-width,var(--cue-focus-ring))] focus-visible:outline-(--cue-focus) focus-visible:outline-offset-2";
111
+ /**
112
+ * The one ring in this module drawn from a `data-*` attribute instead of a
113
+ * pseudo-class, floating two pixels clear (`outline-offset-2`).
114
+ *
115
+ * `color/_thumb.ts`'s draggable colour puck sits on Base UI's `ColorArea` and
116
+ * `ColorSlider`, which stamp `data-focus-visible` on the thumb rather than
117
+ * leaving `:focus-visible` to match it directly — so the thumb reads it as
118
+ * `data-[focus-visible]:`, the one modifier spelling this module exists to
119
+ * unify away from and cannot: `test/focus-ring.test.ts`'s WCAG guard has to
120
+ * see this exact string too, which is why it is spelled out here rather than
121
+ * composed at the call site.
122
+ */
123
+ const FOCUS_RING_DATA_OFFSET_2 = "data-[focus-visible]:outline-solid data-[focus-visible]:outline-[length:var(--cue-style-focus-width,var(--cue-focus-ring))] data-[focus-visible]:outline-(--cue-focus) data-[focus-visible]:outline-offset-2";
124
+ //#endregion
125
+ export { FOCUS_RING, FOCUS_RING_DATA_OFFSET_2, FOCUS_RING_INSET, FOCUS_RING_INSET_2, FOCUS_RING_OFFSET_2, FOCUS_RING_PAINT };
@@ -22,11 +22,30 @@
22
22
  * the elevation rungs and the stroke recipe carry theirs.
23
23
  *
24
24
  * **Nothing wearing this may also carry a `shadow-` literal**: `twMerge` keeps
25
- * one of two `shadow-` utilities on the same element. `buttonTones` carries none
26
- * on any tone, which is what makes the adoption additive.
25
+ * one of two `shadow-` utilities on the same element. The two tones that wear a
26
+ * halo, `primary` and `danger`, carry no other, which is what makes the
27
+ * adoption additive. The `outline` tone does carry one — `REST_SHADE_CLASS`,
28
+ * the resting shade (fidelity plan R3) — so it must not also take
29
+ * `GLOW_CLASSES`: one of the two would be dropped in silence. A halo there
30
+ * would compose both into one `shadow-[…]` list instead.
27
31
  *
28
32
  * @internal Not part of the public API.
29
33
  */
30
34
  const GLOW_CLASSES = "shadow-[0_0_var(--cue-paint-glow-blur)_var(--cue-paint-glow-ink,transparent),0_0_var(--cue-paint-glow-blur-far)_var(--cue-paint-glow-ink,transparent)] hover:shadow-[0_0_var(--cue-paint-glow-blur)_var(--cue-paint-glow-ink-hover,transparent),0_0_var(--cue-paint-glow-blur-far)_var(--cue-paint-glow-ink-hover,transparent)]";
35
+ /**
36
+ * The danger variant of {@link GLOW_CLASSES} (spec §3.10, P0.6): the same two
37
+ * offsetless stops, at the same two blur radii, tinted by the danger tone's
38
+ * own ink — `paint-danger-glow-ink` — rather than by the halo's. One ink, not
39
+ * a rest/hover pair: no pack authors a danger-glow HOVER ink, so `buttonTones`'
40
+ * `danger` reads one value at both states, exactly as it reads `bg-danger`
41
+ * without a separate hover fill.
42
+ *
43
+ * `transparent` by default, on every shipped pack but glaze, which is what
44
+ * keeps this additive: `buttonTones.danger` carries no `shadow-` literal
45
+ * today, so adopting this changes nothing until a pack tints the ink.
46
+ *
47
+ * @internal Not part of the public API.
48
+ */
49
+ const GLOW_DANGER_CLASSES = "shadow-[0_0_var(--cue-paint-glow-blur)_var(--cue-paint-danger-glow-ink,transparent),0_0_var(--cue-paint-glow-blur-far)_var(--cue-paint-danger-glow-ink,transparent)]";
31
50
  //#endregion
32
- export { GLOW_CLASSES };
51
+ export { GLOW_CLASSES, GLOW_DANGER_CLASSES };
@@ -0,0 +1,32 @@
1
+ //#region src/system/_paint-rest-shade.ts
2
+ /**
3
+ * {@link REST_SHADE} as a utility of its own, for a site that has no shadow
4
+ * list to compose it into: the recessed input chassis (`forms/_chassis.ts`,
5
+ * whose stroke recipe paints a border and a ground and no shadow), the
6
+ * outline button tone and the checkbox box (fidelity plan R3).
7
+ *
8
+ * **Spelt out, character for character**, rather than built from
9
+ * `REST_SHADE` with its spaces turned to underscores: `@tailwindcss/oxide`
10
+ * finds a utility by scanning source text for a complete candidate and never
11
+ * evaluates a template literal, so a class assembled at runtime is a class no
12
+ * stylesheet contains (`_focus-ring.ts` records the time that shipped).
13
+ * `test/system/style-controls.test.tsx` holds the two spellings together.
14
+ *
15
+ * **Labelled `shadow:`**, which Tailwind compiles exactly as it compiles the
16
+ * unlabelled value. The label is for `twMerge`, which knows a shadow only by
17
+ * two plain lengths after the `[` — this value's second is a `calc()` — and
18
+ * without the label files the class as a shadow COLOUR: a caller's
19
+ * `className="shadow-lg"` would then survive beside it rather than replace
20
+ * it, and a caller's `shadow-red-500` would delete it. Labelled, a caller's
21
+ * shadow replaces it and a caller's shadow colour tints it, as with any
22
+ * Tailwind shadow.
23
+ *
24
+ * **A site that already carries a `shadow-` utility must not take this**:
25
+ * `twMerge` keeps one of two `shadow-` utilities on the same element. It
26
+ * composes `REST_SHADE` into its own list instead.
27
+ *
28
+ * @internal Not part of the public API.
29
+ */
30
+ const REST_SHADE_CLASS = "shadow-[shadow:0_calc(2px*var(--cue-paint-shadow-scale))_calc(4px*var(--cue-paint-shadow-scale))_var(--cue-paint-rest-shade,transparent)]";
31
+ //#endregion
32
+ export { REST_SHADE_CLASS };
@@ -12,9 +12,12 @@
12
12
  * entirely and repaints outlines in the user's own highlight colour, so a ring
13
13
  * drawn as a shadow vanishes for exactly the people who most need it — and a
14
14
  * form control's ring is a focus indicator. `forms/chassis.test.ts` asserts
15
- * `controlSurface` contains no `shadow` at all, and it is right to.
16
- * §22's inventory lists `_chassis.ts:101` as a rim site; it is wrong, and the
17
- * guard predates it.
15
+ * that the one shadow `controlSurface` carries is the resting shade
16
+ * (`REST_SHADE_CLASS`, fidelity plan R3) and that nothing else in it is a
17
+ * shadow or a ring, and it is right to: the shade is decorative and
18
+ * unconditional, no part of the focus indicator, so losing it to
19
+ * `forced-colors` loses nothing a person needs. §22's inventory lists
20
+ * `_chassis.ts:101` as a rim site; it is wrong, and the guard predates it.
18
21
  *
19
22
  * A panel's or a card's rim is decorative, so the same loss is cosmetic there.
20
23
  *
@@ -34,8 +37,23 @@
34
37
  * At the defaults `--cue-paint-rim-width` is `0px` and the ink is
35
38
  * `transparent`, so the ring is a no-op twice over.
36
39
  *
40
+ * **The resting shade rides in the same list** (spec 2026-09-26-looks-fidelity
41
+ * §3.10, `paint-rest-shade`; plan R5). A card and a panel are the two surfaces
42
+ * that spend this ring, and they are two of `REST_SHADE`'s readers: a pack that
43
+ * sets them down on the page with a one-stop contact shadow (glaze, rows P21
44
+ * and P25) tints `--cue-paint-rest-shade`, and every other pack leaves it
45
+ * `transparent`. It is composed here, as the second layer of this one utility,
46
+ * and not beside it, for the reason above — `twMerge` keeps one of two
47
+ * `shadow-` utilities. It is spelt out rather than interpolated from
48
+ * `_paint-rest-shade.ts`, because Tailwind scans the shipped `dist/` for whole
49
+ * class strings and a template literal is not one; `test/system/
50
+ * paint-rim-pattern.test.ts` holds the two spellings to each other. A
51
+ * transparent layer paints nothing, so under every pack but a tinted one this
52
+ * is still the ring alone (`tests/browser/paint-elevation-noop.spec.ts`, by
53
+ * pixels, under all ten).
54
+ *
37
55
  * @internal Not part of the public API.
38
56
  */
39
- const RIM_INSET = "shadow-[inset_0_0_0_var(--cue-paint-rim-width)_var(--cue-paint-rim-ink,transparent)]";
57
+ const RIM_INSET = "shadow-[inset_0_0_0_var(--cue-paint-rim-width)_var(--cue-paint-rim-ink,transparent),0_calc(2px*var(--cue-paint-shadow-scale))_calc(4px*var(--cue-paint-shadow-scale))_var(--cue-paint-rest-shade,transparent)]";
40
58
  //#endregion
41
59
  export { RIM_INSET };
@@ -14,6 +14,6 @@
14
14
  *
15
15
  * @internal Not part of the public API.
16
16
  */
17
- const STROKE_SURFACE_1 = "border-transparent border-(length:--cue-paint-stroke-width) bg-[linear-gradient(var(--cue-surface-1),var(--cue-surface-1)),linear-gradient(var(--cue-paint-stroke-angle),var(--cue-paint-stroke-from,var(--cue-border)),var(--cue-paint-stroke-to,var(--cue-border)))] bg-origin-border [background-clip:padding-box,border-box]";
17
+ const STROKE_SURFACE_1 = "border-transparent border-(length:--cue-paint-stroke-width) bg-[linear-gradient(var(--cue-surface-1),var(--cue-surface-1)),linear-gradient(var(--cue-paint-stroke-angle),var(--cue-paint-stroke-raised-from,var(--cue-paint-stroke-from,var(--cue-border))),var(--cue-paint-stroke-raised-to,var(--cue-paint-stroke-to,var(--cue-border))))] bg-origin-border [background-clip:padding-box,border-box]";
18
18
  //#endregion
19
19
  export { STROKE_SURFACE_1 };
@@ -17,11 +17,24 @@
17
17
  * theme did not choose for them. Caught by the manifest, which showed 22
18
18
  * components losing `--cue-border-overlay` the moment this fill was adopted.
19
19
  *
20
+ * **Round 2 (spec §3.10, P0.6): the stroke stops read the overlay's own ink,
21
+ * `paint-stroke-overlay-from`/`-to`, not `paint-stroke-from`/`-to` any more.**
22
+ * Every shipped pack still restates its stroke pair here too — `none`'s pair
23
+ * is `var(--cue-border-overlay)`, closing F-10's gap (under `none`, an overlay's
24
+ * edge used to differ from what a page with no pack draws) — so the fallback
25
+ * stays load-bearing only for a THIRD-PARTY pack that has not yet declared the
26
+ * two new names.
27
+ *
28
+ * **The fill reads `style-overlay-ground` (spec §3.11), not a bare
29
+ * `--cue-surface-2` literal.** A style set may pick one of five opaque grounds
30
+ * for an overlay's fill, the same way `band-ground` works one axis over; no
31
+ * set does yet, so the fallback keeps this a no-op everywhere.
32
+ *
20
33
  * The recipe itself, and why its off state is a flat gradient rather than
21
34
  * `none`, is documented once in `./_paint`.
22
35
  *
23
36
  * @internal Not part of the public API.
24
37
  */
25
- const STROKE_SURFACE_2 = "border-transparent border-(length:--cue-paint-stroke-width) bg-[linear-gradient(var(--cue-surface-2),var(--cue-surface-2)),linear-gradient(var(--cue-paint-stroke-angle),var(--cue-paint-stroke-from,var(--cue-border-overlay)),var(--cue-paint-stroke-to,var(--cue-border-overlay)))] bg-origin-border [background-clip:padding-box,border-box]";
38
+ const STROKE_SURFACE_2 = "border-transparent border-(length:--cue-paint-stroke-width) bg-[linear-gradient(var(--cue-style-overlay-ground,var(--cue-surface-2)),var(--cue-style-overlay-ground,var(--cue-surface-2))),linear-gradient(var(--cue-paint-stroke-angle),var(--cue-paint-stroke-overlay-from,var(--cue-border-overlay)),var(--cue-paint-stroke-overlay-to,var(--cue-border-overlay)))] bg-origin-border [background-clip:padding-box,border-box]";
26
39
  //#endregion
27
40
  export { STROKE_SURFACE_2 };
@@ -33,8 +33,11 @@
33
33
  * already decided. Found in review.
34
34
  *
35
35
  * **Nothing else in the library may take this pseudo-element on the same
36
- * element.** §6.5 note 2 is about that, and it is why the host was checked
37
- * before adopting: neither `Band` nor `AppShell` uses `::before` today.
36
+ * element.** §6.5 note 2 is about that, and it is why each host is checked
37
+ * before adopting: neither `Band` nor `AppShell.Root` used `::before` for
38
+ * anything else at the point each one took this class string (spec 2026-09-26
39
+ * R-14 added the second host, so a pack's texture also covers the page ground
40
+ * a console shell paints and not only `<Band separation="ground">`).
38
41
  *
39
42
  * **No ink here, so no fallback rule to keep.** Every name this spends is a
40
43
  * declared pack name with a `:root` default — `texture` is `none`,
@@ -0,0 +1,65 @@
1
+ //#region src/system/_style-app-bar.ts
2
+ /**
3
+ * What `AppBar` reads from the style set beyond the navigation voice: the
4
+ * bar's height, its rule's ink and line style, and its inline inset, and a
5
+ * link's padding, hover ground, hover ink and muted ink.
6
+ *
7
+ * Spec 2026-09-26-looks-fidelity §3.7, §3.8, §3.11 and §10.4 (plan R4 and its
8
+ * Graphite addition). The site header serves every Look, so a Look's taller
9
+ * bar (tender, zine, kiln, porcelain), its lighter or absent rule (zine,
10
+ * kiln), its wider inset (graphite) or its padded, tinted links (zine,
11
+ * porcelain) cannot be a class on the header: it would move Classic too
12
+ * (F-18). Each is a style-set name read here.
13
+ *
14
+ * **Every fallback is the class it replaced, spelt out**, for the reason
15
+ * `_style-control-face.ts` gives, so under no set and under every set that
16
+ * declines a name the bar renders exactly what it did:
17
+ *
18
+ * - `h-(--cue-chrome-toolbar)`, `border-border` and `px-(--cue-space-5)` on
19
+ * the bar;
20
+ * - no padding and no ground on a link (`0`, `transparent`) — the link keeps
21
+ * `Link`'s own `rounded-control`, which a padded, tinted link now shows;
22
+ * - `hover:text-accent`, which `AppBar.Link` inherited from `Link`, read here
23
+ * through `style-hover-ink` as spec §3.7 names this reader;
24
+ * - `text-fg-muted` for the `muted` register, read through `style-quiet-ink`
25
+ * (spec §3.7: `fg-muted` for AppBar.Link `muted`).
26
+ *
27
+ * **The hover ground yields to a caller's own ground.** It is the one
28
+ * declaration here the link never had: `Link` sets no background in any state,
29
+ * so `<AppBar.Link className="bg-surface-2">` kept its ground under the pointer.
30
+ * A plain `hover:bg-[…]` is `(0,2,0)` and would paint over it; this is written
31
+ * `[@media(hover:hover)]:[:where(&:hover)]:`, which is `hover:` — the same
32
+ * media query, the same state — at zero specificity, so any class a caller
33
+ * passes for the ground still wins, hovered or not. The hover INK replaced
34
+ * `Link`'s own `hover:text-accent` and keeps its standing, as that did.
35
+ *
36
+ * `style-appbar-inset` entered the contract in the fidelity plan's L5.1:
37
+ * `graphite` declares it (40px, 24px on a phone; G38), and under every other
38
+ * set the bar renders its fallback.
39
+ *
40
+ * **The rule's line style fills Tailwind's own slot** (`style-chrome-rule-style`,
41
+ * round 5 of plan V.2: `zine` dashes it, Z17). The bar's `border-b` writes
42
+ * `border-bottom-style: var(--tw-border-style)`, a slot Tailwind registers as
43
+ * `@property` with `inherits: false` and `initial-value: solid` — which is the
44
+ * solid rule the bar always drew. Filling that slot keeps the one declaration,
45
+ * for the reason `_paint-glass.ts` fills `--tw-backdrop-blur`: a raw
46
+ * `[border-bottom-style:…]` would be a second, competing declaration, and
47
+ * Tailwind emits it after `border-dashed`, so it would beat a caller's own
48
+ * `border-dotted`. Through the slot a caller's style class still wins, because
49
+ * it writes `border-style` itself, after `border-b`. The fallback is the
50
+ * slot's own initial value, and `test/system/style-navigation.test.tsx` asks
51
+ * the compiler for both the slot and that value rather than remembering them.
52
+ *
53
+ * **Its own module**, for the docgen reason `_style-nav-voice.ts` gives: only
54
+ * `AppBar` reads these names, so only `AppBar` is credited with them.
55
+ *
56
+ * @internal Not part of the public API.
57
+ */
58
+ /** The bar itself: height, bottom rule's ink and line style, and inline inset. */
59
+ const APP_BAR_CHROME = "h-[var(--cue-style-appbar-height,var(--cue-chrome-toolbar))] border-[color:var(--cue-style-chrome-rule,var(--cue-border))] [--tw-border-style:var(--cue-style-chrome-rule-style,solid)] px-[var(--cue-style-appbar-inset,var(--cue-space-5))]";
60
+ /** One link's box and hover: padding, hover ground, hover ink. */
61
+ const APP_BAR_LINK = "p-[var(--cue-style-nav-pad,0)] [@media(hover:hover)]:[:where(&:hover)]:bg-[color:var(--cue-style-nav-hover-ground,transparent)] hover:text-[color:var(--cue-style-hover-ink,var(--cue-accent))]";
62
+ /** The `muted` register's ink. */
63
+ const APP_BAR_QUIET_INK = "text-[color:var(--cue-style-quiet-ink,var(--cue-fg-muted))]";
64
+ //#endregion
65
+ export { APP_BAR_CHROME, APP_BAR_LINK, APP_BAR_QUIET_INK };
@@ -0,0 +1,57 @@
1
+ //#region src/system/_style-band.ts
2
+ /**
3
+ * The two `Band`-only readers of the band's proportions: the broad column's
4
+ * measure, and the rhythm's two halves.
5
+ *
6
+ * **Why neither is in `chrome/_band.ts`.** `Footer` spends that file's
7
+ * `bandClasses("rule")` too, and `@repo/docgen` reads a `_`-prefixed module
8
+ * whole and publishes every `--cue-*` in it as a token each importer paints.
9
+ * `Footer` cannot render either reader below — its `width` is a
10
+ * `ContainerWidth` whose `broad` goes straight to `Container`, and the docs site
11
+ * renders it on every page, where Graphite's 160/80 halves would have moved
12
+ * every footer on a surface the fidelity round never measured (spec §10.4). So
13
+ * they live here, imported by `band.tsx` alone.
14
+ *
15
+ * @internal Not part of the public API.
16
+ */
17
+ /**
18
+ * The `width="broad"` column's measure — spec §3.11, `style-band-width` (T38).
19
+ *
20
+ * `--cue-measure-broad` stays `:root`-only (a set that moved it would move
21
+ * every `Container` and `PageShell` at the broad rung); the band column reads a
22
+ * name of its own instead, a rem length from 40 to 100rem.
23
+ *
24
+ * **The fallback is the old class, spelt out.** `Container`'s broad rung is
25
+ * `max-w-(--cue-measure-broad)`, and this computes the same `max-width` when
26
+ * `--cue-style-band-width` is unset, which it is under no set and under every
27
+ * shipped set today.
28
+ *
29
+ * @internal
30
+ */
31
+ const BAND_BROAD_WIDTH = "max-w-[var(--cue-style-band-width,var(--cue-measure-broad))]";
32
+ /**
33
+ * The rhythm's halves — spec §10.4, `band-y-top` and `band-y-bottom` (G46).
34
+ *
35
+ * `--cue-band-y` is one symmetric value, and Graphite's source draws every band
36
+ * 160px above and 80px below (88/32 on a phone), which no value of it reaches.
37
+ * The halves keep `band-y`'s spelling rather than the `style-` prefix: they are
38
+ * its halves (the paint-axis spec's §9.1 named them so).
39
+ *
40
+ * **Composed after `bandClasses(separation)`, and both stay in the class
41
+ * list.** `tailwind-merge` drops an earlier `py-` only for a later `py-`, so
42
+ * `bandClasses`'s `py-(--cue-band-y)` survives beside these; they win by
43
+ * Tailwind 4's property order, which emits `padding-block` before
44
+ * `padding-top` and `padding-bottom`. A consumer's later `py-0`
45
+ * (`home-band.tsx`) drops these two as well, so a band that zeroes its rhythm
46
+ * still does.
47
+ *
48
+ * **The fallback is the old value, spelt out.** Each half falls back to
49
+ * `var(--cue-band-y)`, which is what `py-(--cue-band-y)` drew on that side. The
50
+ * two names enter the contract with Graphite's round (plan L5.1); until then no
51
+ * set declares them, and each half renders `band-y`.
52
+ *
53
+ * @internal
54
+ */
55
+ const BAND_Y_HALVES = "pt-[var(--cue-band-y-top,var(--cue-band-y))] pb-[var(--cue-band-y-bottom,var(--cue-band-y))]";
56
+ //#endregion
57
+ export { BAND_BROAD_WIDTH, BAND_Y_HALVES };
@@ -0,0 +1,21 @@
1
+ //#region src/system/_style-body-leading.ts
2
+ /**
3
+ * Body copy's leading where a component sets it itself: an overlay's
4
+ * description, a field's help and a tooltip (plan V.2, P42, P48, P129).
5
+ * Porcelain's body copy sits on a 1.38 leading at every size.
6
+ *
7
+ * | constant | reads | fallback |
8
+ * |------------------------|----------------------|--------------------------|
9
+ * | `BODY_LEADING` | `style-body-leading` | `var(--cue-leading-ui)` |
10
+ * | `BODY_LEADING_INHERIT` | `style-body-leading` | `inherit` |
11
+ *
12
+ * **Optional** (spec §3.0). Its own module for docgen's reason
13
+ * (`_style-body-size.ts`).
14
+ *
15
+ * @internal Not part of the public API.
16
+ */
17
+ const BODY_LEADING = "leading-[var(--cue-style-body-leading,var(--cue-leading-ui))]";
18
+ /** @see BODY_LEADING — for a site that set none and inherited its box's. */
19
+ const BODY_LEADING_INHERIT = "leading-[var(--cue-style-body-leading,inherit)]";
20
+ //#endregion
21
+ export { BODY_LEADING, BODY_LEADING_INHERIT };