@cueplusplus/ui 0.15.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 (508) hide show
  1. package/CHANGELOG.md +1083 -0
  2. package/README.md +26 -0
  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 +4 -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 +17 -1
  16. package/dist/chrome/_tabs-scroll.js +20 -3
  17. package/dist/chrome/app-bar.js +10 -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 +19 -31
  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 +9 -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-field.d.ts +2 -1
  40. package/dist/color/color-picker.d.ts +2 -1
  41. package/dist/color/color-swatch.js +1 -1
  42. package/dist/configurator/_overrides.js +13 -4
  43. package/dist/configurator/configurator.js +4 -1
  44. package/dist/configurator/export-dialog.js +5 -2
  45. package/dist/configurator/panel-sections.js +6 -2
  46. package/dist/configurator/token-editor.js +4 -1
  47. package/dist/date/calendar.js +12 -8
  48. package/dist/date/date-field.d.ts +2 -1
  49. package/dist/date/date-picker.d.ts +2 -1
  50. package/dist/date/date-range-picker.d.ts +2 -1
  51. package/dist/date/time-field.d.ts +2 -1
  52. package/dist/dmx/channel-matrix.js +3 -2
  53. package/dist/dmx/dmx-bar.js +1 -1
  54. package/dist/dmx/dmx-strip.js +1 -1
  55. package/dist/dmx/universe-grid.js +3 -2
  56. package/dist/elements/activity-graph.js +3 -3
  57. package/dist/elements/agent-card.js +3 -3
  58. package/dist/elements/approval-card.js +3 -3
  59. package/dist/elements/artifact-card.js +2 -2
  60. package/dist/elements/background-inbox.js +2 -2
  61. package/dist/elements/canvas-split.js +2 -2
  62. package/dist/elements/chart.js +1 -1
  63. package/dist/elements/chat-panel.js +2 -2
  64. package/dist/elements/checkpoint-history.js +2 -2
  65. package/dist/elements/clamp.js +2 -1
  66. package/dist/elements/code-diff.js +1 -1
  67. package/dist/elements/code-runner.js +1 -1
  68. package/dist/elements/command-palette.js +6 -5
  69. package/dist/elements/comparison-card.js +2 -2
  70. package/dist/elements/composer.js +9 -8
  71. package/dist/elements/computer-use.js +1 -1
  72. package/dist/elements/confidence-marker.js +2 -1
  73. package/dist/elements/connection-state.js +1 -1
  74. package/dist/elements/context-breakdown.js +1 -1
  75. package/dist/elements/context-usage.js +1 -1
  76. package/dist/elements/conversation-search.js +4 -3
  77. package/dist/elements/cost-meter.js +1 -1
  78. package/dist/elements/data-table.js +2 -2
  79. package/dist/elements/day-separator.js +1 -1
  80. package/dist/elements/diagram.js +1 -1
  81. package/dist/elements/document-reference.js +3 -3
  82. package/dist/elements/draft-restore.js +1 -1
  83. package/dist/elements/edit-message.js +4 -3
  84. package/dist/elements/elements.css +26 -5
  85. package/dist/elements/elicitation-form.js +3 -3
  86. package/dist/elements/empty-state.js +2 -1
  87. package/dist/elements/error-state.js +1 -1
  88. package/dist/elements/feedback-dialog.js +4 -3
  89. package/dist/elements/file-tree.js +2 -2
  90. package/dist/elements/flow-graph.js +2 -2
  91. package/dist/elements/guardrail-notice.js +3 -3
  92. package/dist/elements/image-generation.js +1 -1
  93. package/dist/elements/inline-citation.js +3 -3
  94. package/dist/elements/job-progress.js +3 -3
  95. package/dist/elements/launcher-bubble.js +2 -2
  96. package/dist/elements/loading-state.js +1 -1
  97. package/dist/elements/map-answer.js +3 -2
  98. package/dist/elements/markdown.js +5 -4
  99. package/dist/elements/math-block.js +1 -1
  100. package/dist/elements/mcp-server-panel.js +3 -3
  101. package/dist/elements/message-attachment.js +4 -4
  102. package/dist/elements/message-pair.js +1 -1
  103. package/dist/elements/message-queue.js +2 -2
  104. package/dist/elements/mobile-composer.js +4 -3
  105. package/dist/elements/model-picker.js +3 -3
  106. package/dist/elements/onboarding.js +2 -2
  107. package/dist/elements/permission-grant.js +2 -2
  108. package/dist/elements/permission-scopes.js +5 -4
  109. package/dist/elements/prompt-library.js +7 -6
  110. package/dist/elements/queue-dock.js +4 -3
  111. package/dist/elements/quota-banner.js +1 -1
  112. package/dist/elements/quote-reply.js +1 -1
  113. package/dist/elements/read-aloud.js +2 -2
  114. package/dist/elements/reasoning-panel.js +2 -1
  115. package/dist/elements/recommendation-card.d.ts +1 -1
  116. package/dist/elements/recommendation-card.js +2 -2
  117. package/dist/elements/regenerate-menu.js +2 -2
  118. package/dist/elements/research-report.js +1 -1
  119. package/dist/elements/retrieval-chunks.js +1 -1
  120. package/dist/elements/revert-dock.js +5 -4
  121. package/dist/elements/reviewable-diff.js +1 -1
  122. package/dist/elements/schedule-card.js +3 -3
  123. package/dist/elements/score-breakdown.js +1 -1
  124. package/dist/elements/scroll-anchor.js +2 -2
  125. package/dist/elements/settings-panel.js +3 -2
  126. package/dist/elements/shared-conversation.js +2 -2
  127. package/dist/elements/sources.js +4 -3
  128. package/dist/elements/speaker-identity.js +1 -1
  129. package/dist/elements/spec-sheet.js +1 -1
  130. package/dist/elements/streaming-text.js +1 -1
  131. package/dist/elements/subagent-list.js +2 -2
  132. package/dist/elements/suggestions.js +1 -1
  133. package/dist/elements/surfaces.d.ts +1 -1
  134. package/dist/elements/surfaces.js +2 -1
  135. package/dist/elements/tail-status.js +1 -1
  136. package/dist/elements/terminal-block.js +1 -1
  137. package/dist/elements/thread-list.js +1 -1
  138. package/dist/elements/thread-search.js +5 -4
  139. package/dist/elements/timeline.js +1 -1
  140. package/dist/elements/todo-list.js +2 -2
  141. package/dist/elements/tool-call.js +4 -3
  142. package/dist/elements/tool-error.js +2 -2
  143. package/dist/elements/tool-group.js +1 -1
  144. package/dist/elements/tool-timeline.js +4 -3
  145. package/dist/elements/trace-waterfall.js +1 -1
  146. package/dist/elements/verdict-row.js +2 -2
  147. package/dist/elements/voice-conversation.js +3 -2
  148. package/dist/elements/web-preview.js +1 -1
  149. package/dist/elements/web-search.js +2 -2
  150. package/dist/elements/work-collapse.js +2 -1
  151. package/dist/flow/node-card.js +3 -2
  152. package/dist/flow/use-flow-theme.js +2 -1
  153. package/dist/forms/_chassis-size.d.ts +22 -0
  154. package/dist/forms/_chassis.d.ts +28 -15
  155. package/dist/forms/_chassis.js +34 -8
  156. package/dist/forms/_listbox.js +8 -5
  157. package/dist/forms/autocomplete.d.ts +2 -1
  158. package/dist/forms/checkbox.js +8 -2
  159. package/dist/forms/combobox.d.ts +2 -1
  160. package/dist/forms/env-var-input.d.ts +2 -1
  161. package/dist/forms/env-var-input.js +3 -2
  162. package/dist/forms/field.d.ts +2 -1
  163. package/dist/forms/field.js +15 -4
  164. package/dist/forms/file-upload.js +3 -2
  165. package/dist/forms/index.d.ts +2 -1
  166. package/dist/forms/input-group.d.ts +2 -1
  167. package/dist/forms/input.d.ts +2 -1
  168. package/dist/forms/multi-select.d.ts +2 -1
  169. package/dist/forms/number-field.js +2 -1
  170. package/dist/forms/otp-field.d.ts +2 -1
  171. package/dist/forms/password-input.d.ts +2 -1
  172. package/dist/forms/password-input.js +4 -2
  173. package/dist/forms/radio-group.js +6 -2
  174. package/dist/forms/rating.js +2 -1
  175. package/dist/forms/scrub-input.d.ts +2 -1
  176. package/dist/forms/scrub-input.js +2 -1
  177. package/dist/forms/search-input.d.ts +2 -1
  178. package/dist/forms/search-input.js +2 -1
  179. package/dist/forms/select.d.ts +2 -1
  180. package/dist/forms/select.js +6 -2
  181. package/dist/forms/slider.js +6 -2
  182. package/dist/forms/switch.js +6 -2
  183. package/dist/forms/tags-input.d.ts +2 -1
  184. package/dist/forms/textarea.js +2 -1
  185. package/dist/forms/toggle-group.d.ts +1 -1
  186. package/dist/forms/toggle.d.ts +1 -1
  187. package/dist/forms/toggle.js +3 -1
  188. package/dist/index.d.ts +4 -3
  189. package/dist/index.js +2 -2
  190. package/dist/instruments/_data-row.js +2 -1
  191. package/dist/instruments/app-window-frame.js +1 -1
  192. package/dist/instruments/code-block.js +8 -2
  193. package/dist/instruments/group-bar.js +1 -1
  194. package/dist/instruments/ledger.js +6 -2
  195. package/dist/instruments/log-viewer.js +5 -3
  196. package/dist/instruments/progress.js +5 -2
  197. package/dist/instruments/seam-grid.js +5 -3
  198. package/dist/instruments/stat.js +10 -3
  199. package/dist/instruments/table.js +28 -10
  200. package/dist/instruments/terminal-frame.js +4 -2
  201. package/dist/instruments/usage-chart.js +1 -1
  202. package/dist/layout/_collapse.js +6 -1
  203. package/dist/layout/bento.js +7 -4
  204. package/dist/layout/breadcrumb.js +7 -3
  205. package/dist/layout/card.js +14 -6
  206. package/dist/layout/carousel.js +3 -2
  207. package/dist/layout/collapsible.js +5 -1
  208. package/dist/layout/container.js +2 -1
  209. package/dist/layout/description-list.js +4 -1
  210. package/dist/layout/frames.js +11 -5
  211. package/dist/layout/item.js +3 -2
  212. package/dist/layout/link.d.ts +16 -0
  213. package/dist/layout/link.js +22 -3
  214. package/dist/layout/pagination.js +2 -1
  215. package/dist/layout/preview.d.ts +32 -12
  216. package/dist/layout/preview.js +149 -40
  217. package/dist/layout/resizable.js +2 -1
  218. package/dist/layout/sidebar.js +11 -3
  219. package/dist/layout/stepper.js +6 -2
  220. package/dist/lib/cn.js +29 -2
  221. package/dist/midi/musical-time-input.d.ts +2 -1
  222. package/dist/midi/piano-keyboard.js +3 -2
  223. package/dist/midi/spectrum-visualizer.js +1 -1
  224. package/dist/midi/threshold-rail.js +2 -1
  225. package/dist/midi/timeline-ruler.js +1 -1
  226. package/dist/overlays/_surface.d.ts +72 -12
  227. package/dist/overlays/_surface.js +86 -12
  228. package/dist/overlays/command-palette.js +9 -5
  229. package/dist/overlays/dialog.d.ts +5 -0
  230. package/dist/overlays/dialog.js +6 -1
  231. package/dist/overlays/info-tip.js +2 -1
  232. package/dist/overlays/menubar.js +3 -1
  233. package/dist/overlays/popover.js +2 -1
  234. package/dist/overlays/toast.js +6 -2
  235. package/dist/overlays/tooltip.js +4 -1
  236. package/dist/primitives/button.d.ts +15 -0
  237. package/dist/primitives/button.js +40 -10
  238. package/dist/primitives/chip.d.ts +20 -2
  239. package/dist/primitives/chip.js +39 -17
  240. package/dist/primitives/kbd.d.ts +6 -0
  241. package/dist/primitives/kbd.js +10 -1
  242. package/dist/primitives/skeleton.js +1 -1
  243. package/dist/system/_focus-ring-field.js +29 -0
  244. package/dist/system/_focus-ring.js +125 -0
  245. package/dist/system/_paint-elevation.js +9 -0
  246. package/dist/system/_paint-glass.js +46 -0
  247. package/dist/system/_paint-glow.js +51 -0
  248. package/dist/system/_paint-ground-pattern.js +30 -0
  249. package/dist/system/_paint-rest-shade.js +32 -0
  250. package/dist/system/_paint-rim.js +59 -0
  251. package/dist/system/_paint-stroke-sunken.js +19 -0
  252. package/dist/system/_paint-stroke-surface-1.js +19 -0
  253. package/dist/system/_paint-stroke-surface-2.js +40 -0
  254. package/dist/system/_paint-texture.js +56 -0
  255. package/dist/system/_style-app-bar.js +65 -0
  256. package/dist/system/_style-band.js +57 -0
  257. package/dist/system/_style-body-leading.js +21 -0
  258. package/dist/system/_style-body-size.js +30 -0
  259. package/dist/system/_style-body-weight.js +24 -0
  260. package/dist/system/_style-body.js +27 -0
  261. package/dist/system/_style-caption.js +19 -0
  262. package/dist/system/_style-card-pad.js +43 -0
  263. package/dist/system/_style-check.js +33 -0
  264. package/dist/system/_style-chip.js +103 -0
  265. package/dist/system/_style-code.js +13 -0
  266. package/dist/system/_style-collapse.js +14 -0
  267. package/dist/system/_style-control-face.js +29 -0
  268. package/dist/system/_style-control-label.js +22 -0
  269. package/dist/system/_style-control-step.js +22 -0
  270. package/dist/system/_style-control.js +76 -0
  271. package/dist/system/_style-data-face.js +28 -0
  272. package/dist/system/_style-description.js +23 -0
  273. package/dist/system/_style-eyebrow.js +43 -0
  274. package/dist/system/_style-footer-rule.js +47 -0
  275. package/dist/system/_style-gutter.js +17 -0
  276. package/dist/system/_style-help-ink.js +14 -0
  277. package/dist/system/_style-help.js +29 -0
  278. package/dist/system/_style-input-face.js +34 -0
  279. package/dist/system/_style-kbd.js +46 -0
  280. package/dist/system/_style-label-case.js +36 -0
  281. package/dist/system/_style-label-face.js +32 -0
  282. package/dist/system/_style-label-ink.js +29 -0
  283. package/dist/system/_style-label-leading.js +14 -0
  284. package/dist/system/_style-label-size.js +36 -0
  285. package/dist/system/_style-label-tracking.js +45 -0
  286. package/dist/system/_style-label-weight.js +40 -0
  287. package/dist/system/_style-lede.js +49 -0
  288. package/dist/system/_style-link.js +46 -0
  289. package/dist/system/_style-menu.js +30 -0
  290. package/dist/system/_style-nav-item.js +41 -0
  291. package/dist/system/_style-nav-voice.js +43 -0
  292. package/dist/system/_style-option.js +42 -0
  293. package/dist/system/_style-overlay-title.js +35 -0
  294. package/dist/system/_style-page-title.js +48 -0
  295. package/dist/system/_style-popover-pad.js +13 -0
  296. package/dist/system/_style-quiet-ink.js +13 -0
  297. package/dist/system/_style-row-pad.js +13 -0
  298. package/dist/system/_style-seam.js +43 -0
  299. package/dist/system/_style-section-rule.js +26 -0
  300. package/dist/system/_style-segment.js +30 -0
  301. package/dist/system/_style-segmented-control.js +86 -0
  302. package/dist/system/_style-selected.js +36 -0
  303. package/dist/system/_style-stage-marks.js +26 -0
  304. package/dist/system/_style-tab.js +71 -0
  305. package/dist/system/_style-textarea.js +21 -0
  306. package/dist/system/_style-title.js +37 -0
  307. package/dist/system/_style-tooltip.js +17 -0
  308. package/dist/system/density.d.ts +15 -5
  309. package/dist/system/density.js +188 -25
  310. package/dist/system/index.d.ts +2 -2
  311. package/dist/system/index.js +2 -2
  312. package/dist/system/overrides.d.ts +1 -0
  313. package/dist/system/overrides.js +151 -3
  314. package/dist/system/portal.d.ts +3 -2
  315. package/dist/system/portal.js +22 -10
  316. package/dist/system/prepaint.d.ts +21 -5
  317. package/dist/system/prepaint.js +3 -1
  318. package/dist/system/published.d.ts +1 -0
  319. package/dist/system/published.js +131 -0
  320. package/dist/system/theme-provider.d.ts +168 -60
  321. package/dist/system/theme-provider.js +375 -79
  322. package/dist/system/theme-registry.d.ts +2 -1
  323. package/dist/system/theme-registry.js +27 -10
  324. package/dist/system/use-density.js +4 -3
  325. package/dist/system/use-theme.d.ts +5 -2
  326. package/dist/system/use-theme.js +7 -4
  327. package/dist/system/vocabulary.js +2 -2
  328. package/dist/theming/create-theme.js +12 -6
  329. package/dist/theming/serialize.d.ts +34 -2
  330. package/dist/theming/serialize.js +86 -4
  331. package/manifest/components/accordion.json +7 -1
  332. package/manifest/components/agent-pile.json +3 -0
  333. package/manifest/components/alert-dialog.json +38 -1
  334. package/manifest/components/app-bar.json +23 -2
  335. package/manifest/components/app-shell.json +5 -0
  336. package/manifest/components/ask-box.json +3 -1
  337. package/manifest/components/autocomplete.json +49 -1
  338. package/manifest/components/band.json +14 -3
  339. package/manifest/components/bento.json +12 -1
  340. package/manifest/components/breadcrumb.json +8 -1
  341. package/manifest/components/button.json +31 -3
  342. package/manifest/components/calendar.json +7 -0
  343. package/manifest/components/card.json +28 -1
  344. package/manifest/components/carousel.json +4 -1
  345. package/manifest/components/channel-matrix.json +40 -1
  346. package/manifest/components/chart-tooltip-content.json +38 -1
  347. package/manifest/components/chat-empty-state.json +3 -1
  348. package/manifest/components/checkbox-group.json +14 -0
  349. package/manifest/components/checkbox.json +14 -0
  350. package/manifest/components/chip.json +16 -1
  351. package/manifest/components/clamp.json +3 -1
  352. package/manifest/components/code-block.json +10 -1
  353. package/manifest/components/collapsible.json +13 -2
  354. package/manifest/components/color-area.json +4 -2
  355. package/manifest/components/color-field.json +14 -0
  356. package/manifest/components/color-picker.json +14 -0
  357. package/manifest/components/color-slider.json +3 -1
  358. package/manifest/components/colors-section.json +9 -1
  359. package/manifest/components/combobox.json +49 -1
  360. package/manifest/components/command-palette.json +37 -1
  361. package/manifest/components/composer-actions.json +3 -0
  362. package/manifest/components/composer-attach-button.json +3 -0
  363. package/manifest/components/composer-attachment-chip.json +3 -0
  364. package/manifest/components/composer-attachments.json +3 -0
  365. package/manifest/components/composer-bar.json +3 -0
  366. package/manifest/components/composer-command-item.json +3 -0
  367. package/manifest/components/composer-context.json +3 -0
  368. package/manifest/components/composer-input.json +3 -0
  369. package/manifest/components/composer-menu-item.json +3 -0
  370. package/manifest/components/composer-menu.json +3 -0
  371. package/manifest/components/composer-model-item.json +3 -0
  372. package/manifest/components/composer-model-trigger.json +3 -0
  373. package/manifest/components/composer-person-item.json +3 -0
  374. package/manifest/components/composer-send.json +3 -0
  375. package/manifest/components/composer-toolbar.json +3 -0
  376. package/manifest/components/composer-voice-button.json +3 -0
  377. package/manifest/components/composer-voice.json +3 -0
  378. package/manifest/components/composer.json +14 -0
  379. package/manifest/components/confidence-marker.json +3 -1
  380. package/manifest/components/container.json +2 -1
  381. package/manifest/components/context-menu.json +38 -1
  382. package/manifest/components/conversation-search.json +3 -1
  383. package/manifest/components/cue-mark.json +2 -2
  384. package/manifest/components/cue-portal-frame.json +1 -1
  385. package/manifest/components/data-row.json +3 -1
  386. package/manifest/components/data-tree.json +3 -1
  387. package/manifest/components/date-field.json +14 -0
  388. package/manifest/components/date-picker.json +14 -0
  389. package/manifest/components/date-range-picker.json +14 -0
  390. package/manifest/components/delegation-card.json +3 -1
  391. package/manifest/components/density.json +21 -7
  392. package/manifest/components/description-list.json +6 -1
  393. package/manifest/components/dialog.json +39 -1
  394. package/manifest/components/disclosure.json +13 -2
  395. package/manifest/components/dmx-bar.json +37 -1
  396. package/manifest/components/dmx-strip.json +37 -1
  397. package/manifest/components/drawer.json +38 -1
  398. package/manifest/components/dropdown-menu.json +38 -1
  399. package/manifest/components/edit-message.json +3 -1
  400. package/manifest/components/elements-command-palette.json +3 -1
  401. package/manifest/components/elements-composer.json +3 -0
  402. package/manifest/components/empty-state-composer.json +3 -1
  403. package/manifest/components/empty-state-greeting.json +3 -1
  404. package/manifest/components/empty-state-suggestion.json +3 -1
  405. package/manifest/components/empty-state-suggestions.json +3 -1
  406. package/manifest/components/env-var-input.json +14 -1
  407. package/manifest/components/export-dialog.json +6 -1
  408. package/manifest/components/eyebrow.json +13 -2
  409. package/manifest/components/feedback-dialog.json +3 -0
  410. package/manifest/components/field-description.json +14 -0
  411. package/manifest/components/field-error.json +14 -0
  412. package/manifest/components/field-label.json +15 -1
  413. package/manifest/components/field.json +14 -0
  414. package/manifest/components/file-upload.json +3 -0
  415. package/manifest/components/footer.json +14 -1
  416. package/manifest/components/frames.json +14 -1
  417. package/manifest/components/hover-card.json +38 -1
  418. package/manifest/components/info-tip.json +3 -0
  419. package/manifest/components/input-group.json +14 -0
  420. package/manifest/components/input.json +14 -0
  421. package/manifest/components/item.json +3 -1
  422. package/manifest/components/kbd.json +10 -1
  423. package/manifest/components/ledger.json +9 -2
  424. package/manifest/components/link.json +10 -0
  425. package/manifest/components/log-viewer.json +10 -0
  426. package/manifest/components/map-answer.json +3 -1
  427. package/manifest/components/markdown-text.json +3 -0
  428. package/manifest/components/menubar.json +41 -2
  429. package/manifest/components/message-list.json +10 -0
  430. package/manifest/components/message.json +6 -1
  431. package/manifest/components/mobile-composer.json +3 -1
  432. package/manifest/components/multi-select.json +49 -1
  433. package/manifest/components/musical-time-input.json +14 -0
  434. package/manifest/components/navigation-menu.json +41 -1
  435. package/manifest/components/node-card.json +3 -0
  436. package/manifest/components/number-field.json +14 -1
  437. package/manifest/components/otp-field.json +13 -0
  438. package/manifest/components/page-shell.json +14 -0
  439. package/manifest/components/pagination.json +3 -0
  440. package/manifest/components/panel-header.json +12 -0
  441. package/manifest/components/panel.json +13 -1
  442. package/manifest/components/password-input.json +14 -1
  443. package/manifest/components/permission-scopes.json +3 -1
  444. package/manifest/components/piano-keyboard.json +3 -0
  445. package/manifest/components/popover.json +39 -1
  446. package/manifest/components/preset-section.json +9 -1
  447. package/manifest/components/preview.json +30 -10
  448. package/manifest/components/progress.json +6 -1
  449. package/manifest/components/prompt-library.json +3 -1
  450. package/manifest/components/queue-dock.json +3 -1
  451. package/manifest/components/radio-group.json +8 -0
  452. package/manifest/components/radio.json +8 -0
  453. package/manifest/components/rating.json +4 -1
  454. package/manifest/components/reasoning-panel.json +3 -1
  455. package/manifest/components/recommendation-card.json +1 -1
  456. package/manifest/components/resizable.json +4 -1
  457. package/manifest/components/revert-dock.json +3 -1
  458. package/manifest/components/row.json +5 -1
  459. package/manifest/components/scroll-area.json +4 -2
  460. package/manifest/components/scrollable-tabs-list.json +19 -0
  461. package/manifest/components/scrub-input.json +14 -1
  462. package/manifest/components/seam-cell.json +1 -0
  463. package/manifest/components/seam-grid.json +1 -0
  464. package/manifest/components/seam-list.json +5 -1
  465. package/manifest/components/search-input.json +14 -1
  466. package/manifest/components/section-header.json +15 -2
  467. package/manifest/components/segmented-control.json +17 -0
  468. package/manifest/components/select.json +28 -0
  469. package/manifest/components/settings-panel.json +3 -0
  470. package/manifest/components/shape-section.json +9 -1
  471. package/manifest/components/sheet.json +38 -1
  472. package/manifest/components/shimmer-label.json +3 -0
  473. package/manifest/components/sidebar.json +19 -2
  474. package/manifest/components/slider.json +8 -0
  475. package/manifest/components/sources.json +3 -1
  476. package/manifest/components/stat.json +9 -0
  477. package/manifest/components/status-bar.json +4 -0
  478. package/manifest/components/stepper.json +8 -0
  479. package/manifest/components/swap-label.json +3 -0
  480. package/manifest/components/switch.json +8 -0
  481. package/manifest/components/table-scroll-region.json +20 -2
  482. package/manifest/components/table.json +20 -2
  483. package/manifest/components/tabs.json +20 -1
  484. package/manifest/components/tags-input.json +49 -1
  485. package/manifest/components/terminal-frame.json +3 -0
  486. package/manifest/components/textarea.json +16 -0
  487. package/manifest/components/theme-configurator.json +38 -1
  488. package/manifest/components/theme-provider.json +37 -19
  489. package/manifest/components/thread-search.json +3 -1
  490. package/manifest/components/threshold-rail.json +3 -0
  491. package/manifest/components/time-field.json +14 -0
  492. package/manifest/components/toast.json +39 -0
  493. package/manifest/components/toggle-group.json +1 -19
  494. package/manifest/components/toggle.json +3 -5
  495. package/manifest/components/token-editor.json +6 -1
  496. package/manifest/components/tool-call-card.json +9 -2
  497. package/manifest/components/tool-call.json +3 -1
  498. package/manifest/components/tool-timeline.json +3 -1
  499. package/manifest/components/toolbar.json +4 -1
  500. package/manifest/components/tooltip.json +40 -1
  501. package/manifest/components/tree-visibility-toggle.json +3 -0
  502. package/manifest/components/tree.json +3 -0
  503. package/manifest/components/universe-grid.json +3 -0
  504. package/manifest/components/voice-conversation.json +3 -0
  505. package/manifest/components/work-collapse.json +3 -1
  506. package/manifest/manifest.json +205 -185
  507. package/manifest/tokens.json +260 -4
  508. package/package.json +6 -6
@@ -0,0 +1,43 @@
1
+ //#region src/system/_style-nav-voice.ts
2
+ /**
3
+ * The voice a navigation link speaks in — face, case, tracking, size and
4
+ * weight — each the style set's choice, each falling back to what its reader
5
+ * rendered before this existed.
6
+ *
7
+ * Spec 2026-09-26-looks-fidelity §3.8 (plan R4). `AppBar.Link` and `Footer`'s
8
+ * column both said `font-mono text-(length:--cue-text-ui)` and nothing more,
9
+ * so a Look whose header links are sans (tender, kiln, porcelain), uppercase
10
+ * and tracked (zine) or medium (porcelain) could only say so with a class at
11
+ * every call site, which a Look does not follow.
12
+ *
13
+ * **The fallbacks are the old classes, spelt out**, for the reason
14
+ * `_style-control-face.ts` gives: none of these names is declared on `:root`,
15
+ * and every set that declines one resets it to `initial` on the shared
16
+ * `[data-style]` block (spec §3.0), so a reader resolves its own fallback at
17
+ * itself. `font-mono` compiled to `var(--cue-font-mono)` and
18
+ * `text-(length:--cue-text-ui)` to `var(--cue-text-ui)`. Case, tracking and
19
+ * weight were inherited, and computed `none`, `normal` and `400` at both
20
+ * readers under every shipped set — spec §3.8's three fallbacks.
21
+ *
22
+ * **Weight is written `font-[number:…]`.** A bare `font-[var(…)]` is read as a
23
+ * family (plan §R1), and the `number` label makes it a weight to Tailwind —
24
+ * which emits exactly what `font-medium` emits, `--tw-font-weight` included —
25
+ * and to `tailwind-merge`, so a caller's `className="font-medium"` replaces it
26
+ * through `cn()`. Spelt as an arbitrary `[font-weight:…]` property it survived
27
+ * the merge beside the caller's class and won the cascade, because Tailwind
28
+ * emits it after `font-medium`: `<AppBar.Link className="font-medium">` drew
29
+ * 400. Case is an arbitrary property for the reason `_style-label-case.ts`
30
+ * gives — no case utility takes a value — and nothing merges it with a
31
+ * caller's `uppercase`, but Tailwind emits it before `uppercase`,
32
+ * `normal-case` and the rest, so the caller's case still wins the cascade.
33
+ *
34
+ * **Its own module**, because `@repo/docgen` credits a component with every
35
+ * `--cue-*` in each `_`-prefixed file it imports (`_style-control-face.ts`'s
36
+ * note). `Footer` reads this voice and none of `AppBar.Link`'s own names, which
37
+ * live in `_style-app-bar.ts`.
38
+ *
39
+ * @internal Not part of the public API.
40
+ */
41
+ const NAV_VOICE = "font-[family-name:var(--cue-style-nav-face,var(--cue-font-mono))] [text-transform:var(--cue-style-nav-case,none)] tracking-[var(--cue-style-nav-tracking,normal)] text-[length:var(--cue-style-nav-size,var(--cue-text-ui))] font-[number:var(--cue-style-nav-weight,400)]";
42
+ //#endregion
43
+ export { NAV_VOICE };
@@ -0,0 +1,42 @@
1
+ //#region src/system/_style-option.ts
2
+ /**
3
+ * One row of a list a control opens: `Select`'s items and the filterable
4
+ * lists' (`Combobox`, `Autocomplete`, `MultiSelect`, `TagsInput`).
5
+ *
6
+ * Plan V.2 (T112, P112, P127). The two shared one class string —
7
+ * `text-fg-muted … data-[highlighted]:bg-accent-soft … data-[selected]:text-accent`
8
+ * — which no Look could reach, so a select under Tender drew a lilac selected
9
+ * row on a lilac highlight where the source draws navy on a 5% wash, and under
10
+ * Porcelain a square muted row where the source draws a rounded `fg` one.
11
+ *
12
+ * | part | reads | fallback |
13
+ * |-----------------|-----------------------------------------------|------------------------------|
14
+ * | idle ink | `style-option-ink` | `var(--cue-fg-muted)` |
15
+ * | highlight | `style-menu-highlight`, as a menu row's does | `var(--cue-accent-soft)` |
16
+ * | selected ink | `style-option-selected-ink` | `var(--cue-accent)` |
17
+ * | idle weight | `style-body-weight`, on an unselected row | `inherit` |
18
+ * | corner | `style-menu-item-radius` | `0px` |
19
+ *
20
+ * **Its own two inks**, not `style-quiet-ink` and `style-selected-ink`. The
21
+ * quiet ink is a ghost button's and a menu row's; Tender's is `fg`, and its
22
+ * select rows measure a 55% share of `fg` into `fg-muted`. The selected ink is
23
+ * the sidebar's active item's and a table's selected row's; Tender's option
24
+ * ink is navy where its sidebar keeps the lilac accent. Porcelain's rows,
25
+ * which do measure `fg`, declare the option ink as `var(--cue-fg)`.
26
+ *
27
+ * **The weight goes on the unselected row only**, at zero specificity
28
+ * (`[:where(&:not([data-selected]))]:`): Tender's body copy is 300 and its
29
+ * selected row keeps the 400 it inherits, and a caller's `font-*` class on a
30
+ * row still beats both, as it beat nothing before.
31
+ *
32
+ * `data-[highlighted]:text-fg` stays a class: every Look's highlighted row is
33
+ * `fg`. The weight is spelt out whole rather than composed from
34
+ * `_style-body-weight.ts`: a variant prefixed onto an interpolated constant is
35
+ * a class that appears in no source file, and a consumer's Tailwind, which
36
+ * scans this package's build for candidates, would never generate it.
37
+ *
38
+ * @internal Not part of the public API.
39
+ */
40
+ const OPTION_ROW = "rounded-[var(--cue-style-menu-item-radius,0px)] text-[color:var(--cue-style-option-ink,var(--cue-fg-muted))] [:where(&:not([data-selected]))]:font-[number:var(--cue-style-body-weight,inherit)] data-[highlighted]:bg-[color:var(--cue-style-menu-highlight,var(--cue-accent-soft))] data-[highlighted]:text-fg data-[selected]:text-[color:var(--cue-style-option-selected-ink,var(--cue-accent))]";
41
+ //#endregion
42
+ export { OPTION_ROW };
@@ -0,0 +1,35 @@
1
+ //#region src/system/_style-overlay-title.ts
2
+ /**
3
+ * The heading line of a dialog, an alert dialog, a drawer, a sheet or a popover:
4
+ * the title voice's face, weight, ink and variation, at its own size.
5
+ *
6
+ * Spec 2026-09-26-looks-fidelity §3.3, plan R1. `overlayTitleClasses` spelt
7
+ * `font-mono text-(length:--cue-text-emphasis) font-medium text-fg`. It reads
8
+ * `style-title-face` and `style-title-weight` because a Look's dialog title is
9
+ * its card title's face and weight, but `style-overlay-title-size` rather than
10
+ * `style-title-size`, because the one Look that sizes it measured them apart
11
+ * (Porcelain: a 20px dialog title over 16px card titles, P42). It reads no
12
+ * tracking and no leading: no Look measured either on an overlay.
13
+ *
14
+ * | property | reads | fallback (the class it replaced) |
15
+ * |-------------------------|----------------------------|----------------------------------|
16
+ * | font-family | `style-title-face` | `var(--cue-font-mono)` (`font-mono`) |
17
+ * | font-size | `style-overlay-title-size` | `var(--cue-text-emphasis)` |
18
+ * | font-weight | `style-title-weight` | `500` (`font-medium`) |
19
+ * | font-variation-settings | `style-display-variation` | `normal` |
20
+ * | color | `style-heading-ink` | `var(--cue-fg)` (`text-fg`) |
21
+ *
22
+ * `style-display-variation` is here although the plan's R1 list for this site
23
+ * leaves it out: the spec (§3.1) names "the title-voice readers" as its readers,
24
+ * and §3.3 names this title as one of them.
25
+ *
26
+ * **Every name is optional** (spec §3.0), so under every shipped set each
27
+ * `var()` resolves its fallback at the title. A module of its own and not an
28
+ * import of `_style-title.ts`, which would publish that file's size, tracking and
29
+ * leading as tokens every overlay paints.
30
+ *
31
+ * @internal Not part of the public API.
32
+ */
33
+ const OVERLAY_TITLE_VOICE = "font-[family-name:var(--cue-style-title-face,var(--cue-font-mono))] text-[length:var(--cue-style-overlay-title-size,var(--cue-text-emphasis))] leading-[var(--cue-style-overlay-title-leading,inherit)] font-[number:var(--cue-style-title-weight,500)] [font-variation-settings:var(--cue-style-display-variation,normal)] text-[color:var(--cue-style-heading-ink,var(--cue-fg))]";
34
+ //#endregion
35
+ export { OVERLAY_TITLE_VOICE };
@@ -0,0 +1,48 @@
1
+ //#region src/system/_style-page-title.ts
2
+ /**
3
+ * The `PageShell` h1's voice: mono, `text-title`, weight 500, at the page's own
4
+ * tracking and leading, in `fg`, until a style set says otherwise.
5
+ *
6
+ * Spec 2026-09-26-looks-fidelity §3.2 (and §3.1 for the ink and the variation),
7
+ * plan R1. The page title and a card's title are separate voices, because three
8
+ * Looks measure them apart: Porcelain 36px against 16px, Kiln 64px against 32px,
9
+ * Zine a display face against a sans. So the h1 reads its own five
10
+ * `style-page-title-*` names rather than the title voice's
11
+ * (`_style-title.ts`), and shares only the two names every heading shares:
12
+ * `style-heading-ink` and `style-display-variation`.
13
+ *
14
+ * | property | reads | fallback (the class it replaced) |
15
+ * |-------------------------|--------------------------------|----------------------------------|
16
+ * | font-family | `style-page-title-face` | `var(--cue-font-mono)` (`font-mono`) |
17
+ * | font-size | `style-page-title-size` | `var(--cue-text-title)` |
18
+ * | font-weight | `style-page-title-weight` | `500` (`font-medium`) |
19
+ * | letter-spacing | `style-page-title-tracking` | `normal` |
20
+ * | line-height | `style-page-title-leading` | `inherit` |
21
+ * | font-variation-settings | `style-display-variation` | `normal` |
22
+ * | color | `style-heading-ink` | `var(--cue-fg)` (`text-fg`) |
23
+ *
24
+ * **Every name is optional** (spec §3.0): none is declared on `:root`, `console`
25
+ * declines each, and every shipped set leaves them at the shared
26
+ * `[data-style] { …: initial }` reset, so each `var()` resolves its fallback at
27
+ * the h1 itself — the value the old class computed there, under every set and in
28
+ * every density island.
29
+ *
30
+ * **Weight is `font-[number:…]`**, the typed form: a bare `font-[var(…)]` is
31
+ * read as a family by `tailwind-merge`, and the arbitrary property
32
+ * `[font-weight:…]` is in no `tailwind-merge` group at all, so a caller's
33
+ * `font-bold` would no longer replace it — and it sorts after `font-bold` in the
34
+ * built stylesheet, so it would win. `number:` keeps both Tailwind and
35
+ * `tailwind-merge` reading a weight.
36
+ *
37
+ * **Size before leading**, because `tailwind-merge` drops a `leading-*` that
38
+ * precedes a font size in the same list.
39
+ *
40
+ * **Its own module**, because `@repo/docgen` attributes a token to a component by
41
+ * the file its class string lives in, following only `_`-prefixed imports:
42
+ * every name here is one the page title spends, and nothing else imports it.
43
+ *
44
+ * @internal Not part of the public API.
45
+ */
46
+ const PAGE_TITLE_VOICE = "font-[family-name:var(--cue-style-page-title-face,var(--cue-font-mono))] text-[length:var(--cue-style-page-title-size,var(--cue-text-title))] font-[number:var(--cue-style-page-title-weight,500)] tracking-[var(--cue-style-page-title-tracking,normal)] leading-[var(--cue-style-page-title-leading,inherit)] [font-variation-settings:var(--cue-style-display-variation,normal)] text-[color:var(--cue-style-heading-ink,var(--cue-fg))] [overflow-wrap:anywhere]";
47
+ //#endregion
48
+ export { PAGE_TITLE_VOICE };
@@ -0,0 +1,13 @@
1
+ //#region src/system/_style-popover-pad.ts
2
+ /**
3
+ * The popover's padding (plan V.2, P131): the `space-4` rung times
4
+ * `style-popover-pad`, `1` under a set that has none. Porcelain's popover is
5
+ * 16px in.
6
+ *
7
+ * **Optional** (spec §3.0). Its own module for docgen's reason.
8
+ *
9
+ * @internal Not part of the public API.
10
+ */
11
+ const POPOVER_PAD = "p-[calc(var(--cue-space-4)*var(--cue-style-popover-pad,1))]";
12
+ //#endregion
13
+ export { POPOVER_PAD };
@@ -0,0 +1,13 @@
1
+ //#region src/system/_style-quiet-ink.ts
2
+ /**
3
+ * The quiet ink, for a site that reads it without the rest of the control
4
+ * vocabulary: the disclosure trigger (plan V.2, P125) — `style-quiet-ink`,
5
+ * falling back to the `fg-muted` it drew. The same class `_style-control.ts`
6
+ * spells as `GHOST_INK`, restated in a module of its own so docgen does not
7
+ * publish every button name as a token of an accordion.
8
+ *
9
+ * @internal Not part of the public API.
10
+ */
11
+ const QUIET_INK = "text-[color:var(--cue-style-quiet-ink,var(--cue-fg-muted))]";
12
+ //#endregion
13
+ export { QUIET_INK };
@@ -0,0 +1,13 @@
1
+ //#region src/system/_style-row-pad.ts
2
+ /**
3
+ * A table row's block padding (plan V.2, P121): the `pad-row-y` rung times
4
+ * `style-row-pad`, `1` under a set that has none. Porcelain's table rows are
5
+ * 40px, half again its rung's padding.
6
+ *
7
+ * **Optional** (spec §3.0). Its own module for docgen's reason.
8
+ *
9
+ * @internal Not part of the public API.
10
+ */
11
+ const ROW_PAD_Y = "py-[calc(var(--cue-pad-row-y)*var(--cue-style-row-pad,1))]";
12
+ //#endregion
13
+ export { ROW_PAD_Y };
@@ -0,0 +1,43 @@
1
+ //#region src/system/_style-seam.ts
2
+ /**
3
+ * The seam idiom's ink: the colour that shows through a 1px gap and becomes the
4
+ * hairline between two filled cells.
5
+ *
6
+ * Spec 2026-09-26 R-8. `SeamGrid`, `SeamList` and `<Card seam>` each hard-coded
7
+ * `bg-border` for it, so a style set could say how its bands are ruled
8
+ * (`--cue-band-rule-color`) and had no way to say that the line INSIDE a
9
+ * component is lighter than a box edge — which is what every site in the
10
+ * 2026-09-22 corpus that draws seams does (agent-native's seam is its subtle
11
+ * line, not its default border). `--cue-style-seam-color` is that statement.
12
+ *
13
+ * **The fallback is the old class, spelt out.** `bg-border` compiles to
14
+ * `background-color: var(--cue-border)`, and `--cue-style-seam-color` is on no
15
+ * `:root` — a `:root` `var(--cue-border)` would be substituted at `<html>` and
16
+ * freeze the page's border into every theme island. Under no set this resolves
17
+ * at the grid itself, exactly as `bg-border` did.
18
+ *
19
+ * @internal Not part of the public API.
20
+ */
21
+ const SEAM_INK = "bg-[color:var(--cue-style-seam-color,var(--cue-border))]";
22
+ /**
23
+ * The rim a bordered seam container draws around its cells, in the seam's ink.
24
+ *
25
+ * The rim is part of the idiom rather than an unrelated border: `SeamGrid`'s
26
+ * `bordered` is "a hairline rim around the whole grid as well as between the
27
+ * cells", and a rim in the box-edge colour around seams in a lighter one reads
28
+ * as a box drawn around a grid — the one thing the idiom exists not to be.
29
+ *
30
+ * **`bg-clip-padding` is what keeps a translucent seam honest.** The container's
31
+ * own background is the seam, and by default it paints under the border too; an
32
+ * opaque ink hides that, but a share over transparency — graphite's
33
+ * `color-mix(in oklch, var(--cue-border) 60%, transparent)` — would lay the rim
34
+ * over a second copy of itself and draw it darker than the seams it encloses.
35
+ * Under an opaque ink, which is every set but graphite and every page under no
36
+ * set, the clip changes nothing a reader can see: the border covers exactly the
37
+ * area it removes the background from.
38
+ *
39
+ * @internal Not part of the public API.
40
+ */
41
+ const SEAM_RIM = "border-[color:var(--cue-style-seam-color,var(--cue-border))] bg-clip-padding";
42
+ //#endregion
43
+ export { SEAM_INK, SEAM_RIM };
@@ -0,0 +1,26 @@
1
+ //#region src/system/_style-section-rule.ts
2
+ /**
3
+ * The ink of a rule that divides a section: `SectionHeader`'s hairline and the
4
+ * rule over `Footer`'s fine print.
5
+ *
6
+ * Spec 2026-09-26-looks-fidelity §3.11 (plan R4). Both drew `var(--cue-border)`
7
+ * through `bg-border` and `border-border`, and a Look that sets its sections
8
+ * apart by space alone (kiln) had no way to take the line away without taking
9
+ * the box edges with it. `--cue-style-section-rule` says it, and these read it.
10
+ *
11
+ * **The fallbacks are the old classes, spelt out**, for the reason
12
+ * `_style-control-face.ts` gives. Two exports because the two readers paint
13
+ * the same ink through two properties: the header's rule is a `h-px` block
14
+ * with a ground, the footer's is a top border.
15
+ *
16
+ * **Its own module**, for the docgen reason `_style-nav-voice.ts` gives: both
17
+ * readers read exactly this one name.
18
+ *
19
+ * @internal Not part of the public API.
20
+ */
21
+ /** A rule drawn as a filled hairline block (`SectionHeader`). */
22
+ const SECTION_RULE_FILL = "bg-[color:var(--cue-style-section-rule,var(--cue-border))]";
23
+ /** A rule drawn as a border (`Footer`'s fine print); the element sets which side. */
24
+ const SECTION_RULE_EDGE = "border-[color:var(--cue-style-section-rule,var(--cue-border))]";
25
+ //#endregion
26
+ export { SECTION_RULE_EDGE, SECTION_RULE_FILL };
@@ -0,0 +1,30 @@
1
+ //#region src/system/_style-segment.ts
2
+ /**
3
+ * The segment family's shared half: the ink of a choice that is not the
4
+ * current one — read by `SegmentedControl` and `Tabs` alike.
5
+ *
6
+ * Spec 2026-09-26-looks-fidelity §3.8 and §3.10 (plan R4). Both components
7
+ * mark the current choice their own way — a tinted segment, an underlined
8
+ * tab — and two Looks draw both as one object: a filled track with the choice
9
+ * raised on it as a pill with an edge and a resting shade (kiln, porcelain).
10
+ * The segment names say it, in both components at once. Where each component
11
+ * draws the track, and what it reads for its current choice, has a fallback of
12
+ * its own, so it lives with that component: `SegmentedControl`'s frame and
13
+ * pressed segment in `_style-segmented-control.ts`, the `Tabs` list and active
14
+ * tab in `_style-tab.ts`.
15
+ *
16
+ * **The fallback is the class it replaced**, for the reason
17
+ * `_style-control-face.ts` gives: an idle choice was `text-fg-muted`.
18
+ *
19
+ * **Its own module, holding only what both read**, because `@repo/docgen`
20
+ * credits a component with every `--cue-*` in each `_`-prefixed file it
21
+ * imports (`_style-nav-voice.ts`'s note). When the pressed segment's constants
22
+ * lived here, `Tabs` was published as a user of `--cue-accent-soft`, the
23
+ * pressed segment's fallback, which no tab paints.
24
+ *
25
+ * @internal Not part of the public API.
26
+ */
27
+ /** A choice that is not the current one. */
28
+ const SEGMENT_IDLE_INK = "text-[color:var(--cue-style-segment-idle-ink,var(--cue-fg-muted))]";
29
+ //#endregion
30
+ export { SEGMENT_IDLE_INK };
@@ -0,0 +1,86 @@
1
+ //#region src/system/_style-segmented-control.ts
2
+ /**
3
+ * What `SegmentedControl` reads from the style set: the track its segments sit
4
+ * in, and the pressed segment's ground, ink, weight, edge, resting shade and
5
+ * corners.
6
+ *
7
+ * Spec 2026-09-26-looks-fidelity §3.8 and §3.10 (plan R4). The shared half of
8
+ * the segment family — the track and the idle ink — is `_style-segment.ts`,
9
+ * whose docblock tells the family's story; the active tab's counterpart is in
10
+ * `_style-tab.ts`.
11
+ *
12
+ * **The track is the frame.** Spec §3.8 names "the list" as the reader of
13
+ * `style-segment-track` and `style-segment-inset`, and R4 first read them on
14
+ * the `ToggleGroup` inside the frame. That box has no corners and sits inside
15
+ * the frame's own ground, border and padding, so a Look's track (kiln's
16
+ * `surface-3`, porcelain's tint inset 2px) drew a square box within a rounded
17
+ * `surface-1` rim instead of a rounded track with the pill on it. The frame is
18
+ * the rounded object — `rounded-control`, the rim, the ground, the inset — so
19
+ * it reads both names, with its own classes as the fallbacks:
20
+ * `var(--cue-surface-1)` and `var(--cue-space-1)`. The list reads nothing.
21
+ * The overflow chevrons sit in the frame's padding over the segments, so their
22
+ * ground follows the track too, laid over an opaque `surface-1` so a
23
+ * translucent track (porcelain's) still hides the segments scrolled beneath.
24
+ *
25
+ * **Every fallback is the class it replaced**, for the reason
26
+ * `_style-control-face.ts` gives:
27
+ *
28
+ * - the frame: `bg-surface-1` and `p-(--cue-space-1)`; the chevrons:
29
+ * `bg-surface-1`, under a transparent layer;
30
+ * - the ground and ink: `bg-accent-soft` and `text-accent`;
31
+ * - weight `400`, which the segment inherited and computed under every
32
+ * shipped set;
33
+ * - the edge: `transparent`, drawn as an inset ring so it never moves layout;
34
+ * - the resting shade: `paint-rest-shade`, `transparent` under every pack but
35
+ * glaze;
36
+ * - the corners: `rounded-control`'s own value (below).
37
+ *
38
+ * **The edge and the rest shade are one `shadow-[…]` list**, and it is written
39
+ * out in full rather than built from `REST_SHADE`: Tailwind finds a class by
40
+ * scanning source text, so a class assembled at runtime is a class it never
41
+ * generates (`_focus-ring.ts` records the failure). `test/system/style-navigation.test.tsx`
42
+ * holds the literal to `REST_SHADE`, spaces as underscores. A transparent
43
+ * layer paints nothing, so the list is a rendered no-op until a Look names an
44
+ * edge or a pack a shade.
45
+ *
46
+ * **What the segment never had yields to a caller's class.** The ground and
47
+ * ink replaced `data-[pressed]:bg-accent-soft` and `data-[pressed]:text-accent`
48
+ * and keep the standing those classes had. The weight and the shadow are
49
+ * declarations the segment had in no state, so a caller's
50
+ * `itemClassName="font-medium shadow-sm"` applied to the pressed segment as to
51
+ * the others. A `data-[pressed]:` utility is `(0,2,0)` and would beat such a
52
+ * class on the pressed segment alone, so these are written
53
+ * `[:where(&[data-pressed])]:` — the same state at zero specificity — and a
54
+ * caller's class wins in every state again. The weight is `font-[number:…]`
55
+ * for `_style-nav-voice.ts`'s reason.
56
+ *
57
+ * **The segment's radius nests in the track's inset**:
58
+ * `radius-control` less `style-segment-inset`, so a pill inset 2px into its
59
+ * track keeps concentric corners. Its fallback is `0px`, not the frame's
60
+ * `space-1`: at `0px` it is `rounded-control`'s own value, which is what the
61
+ * segment drew, and one name's readers keep their own fallbacks (spec §3.0).
62
+ * Only a set that names an inset nests the corners.
63
+ *
64
+ * **Its own module**, for the docgen reason `_style-segment.ts` gives: the
65
+ * frame, the `accent-soft` fallback and the nested radius are this
66
+ * component's alone.
67
+ *
68
+ * @internal Not part of the public API.
69
+ */
70
+ /** The frame, which is the track: its ground and its inset. */
71
+ const SEGMENTED_TRACK = "bg-[color:var(--cue-style-segment-track,var(--cue-surface-1))] p-[var(--cue-style-segment-inset,var(--cue-space-1))]";
72
+ /** The overflow chevrons' ground: the track's colour over an opaque `surface-1`. */
73
+ const SEGMENTED_CHEVRON_GROUND = "bg-surface-1 bg-[image:linear-gradient(var(--cue-style-segment-track,transparent),var(--cue-style-segment-track,transparent))]";
74
+ /** A segment's corners, nested inside the track's inset. */
75
+ const SEGMENT_RADIUS = "rounded-[calc(var(--cue-radius-control)*var(--cue-radius-scale)-var(--cue-style-segment-inset,0px))]";
76
+ /** `SegmentedControl`'s pressed segment. */
77
+ const SEGMENT_PRESSED = "data-[pressed]:bg-[color:var(--cue-style-segment-ground,var(--cue-accent-soft))] data-[pressed]:text-[color:var(--cue-style-segment-ink,var(--cue-accent))] [:where(&[data-pressed])]:font-[number:var(--cue-style-segment-weight,400)] [:where(&[data-pressed])]:shadow-[inset_0_0_0_var(--cue-border-width)_var(--cue-style-segment-edge,transparent),0_calc(2px*var(--cue-paint-shadow-scale))_calc(4px*var(--cue-paint-shadow-scale))_var(--cue-paint-rest-shade,transparent)]";
78
+ /**
79
+ * The frame's rim (plan V.2, K129): `style-segment-rim`, falling back to the
80
+ * `border-border` the frame drew. Kiln's source draws its segmented track with
81
+ * no rim at all — a `surface-3` ground and nothing around it — and the frame's
82
+ * border was the one part of the control no name reached.
83
+ */
84
+ const SEGMENTED_RIM = "border-[color:var(--cue-style-segment-rim,var(--cue-border))]";
85
+ //#endregion
86
+ export { SEGMENTED_CHEVRON_GROUND, SEGMENTED_RIM, SEGMENTED_TRACK, SEGMENT_PRESSED, SEGMENT_RADIUS };
@@ -0,0 +1,36 @@
1
+ //#region src/system/_style-selected.ts
2
+ /**
3
+ * The ground and ink of a selected table row.
4
+ *
5
+ * Spec 2026-09-26-looks-fidelity §3.8 (plan R4). `Table.Row` said
6
+ * `data-[selected]:bg-accent-soft` and set no ink of its own. Spec §3.8 names
7
+ * this row as a reader of both `style-selected-ground` and
8
+ * `style-selected-ink`, and the two travel together for a reason a Look makes
9
+ * concrete: kiln's selection is inverted, `var(--cue-fg)` behind
10
+ * `var(--cue-bg)`, and a row that took the ground without the ink would set
11
+ * the table's `fg` text on an `fg` ground.
12
+ *
13
+ * **Each fallback is this reader's own value**, which is not the sidebar's
14
+ * (spec §3.0: readers of one name keep their own fallbacks). The ground was
15
+ * `var(--cue-accent-soft)`. The ink was inherited from the table's `text-fg`,
16
+ * so its fallback is `currentColor`, which on `color` computes exactly the
17
+ * inherited value — under no set and every set that declines the name, the
18
+ * row renders what it did.
19
+ *
20
+ * **The ink yields to a caller's own ink.** The row set no colour, so
21
+ * `<Table.Row selected className="text-fg-muted">` stayed muted when selected.
22
+ * A `data-[selected]:` ink is `(0,2,0)` and would beat that class, and
23
+ * `currentColor` on `color` takes the PARENT's colour, not the row's own class;
24
+ * so the ink is written `[:where(&[data-selected])]:` — the same state at zero
25
+ * specificity — and a caller's ink class wins again. The ground replaced
26
+ * `data-[selected]:bg-accent-soft` and keeps its standing, as that did.
27
+ *
28
+ * **Its own module**, for the docgen reason `_style-nav-voice.ts` gives: the
29
+ * table reads neither `style-nav-active-ground` nor `style-selected-weight`,
30
+ * so it does not share `_style-nav-item.ts`.
31
+ *
32
+ * @internal Not part of the public API.
33
+ */
34
+ const SELECTED_ROW = "data-[selected]:bg-[color:var(--cue-style-selected-ground,var(--cue-accent-soft))] [:where(&[data-selected])]:text-[color:var(--cue-style-selected-ink,currentColor)]";
35
+ //#endregion
36
+ export { SELECTED_ROW };
@@ -0,0 +1,26 @@
1
+ //#region src/system/_style-stage-marks.ts
2
+ /**
3
+ * Whether a preview frame draws its registration marks — spec
4
+ * 2026-09-26-looks-fidelity §3.11, `style-stage-marks` (row P52).
5
+ *
6
+ * The four crosshairs at a frame's stage corners are this library's own
7
+ * furniture, and four of the measured Looks' sources draw nothing there. A
8
+ * mark is decoration, so a set says `none` and the marks go; `inline` keeps
9
+ * them.
10
+ *
11
+ * **The fallback is the old value, spelt out.** A mark is an absolutely
12
+ * positioned `<span>`, which the engine blockifies: `inline` computes
13
+ * `display: block`, exactly what the span computed with no `display` class at
14
+ * all. `--cue-style-stage-marks` is on no `:root` (contract round 2's optional
15
+ * names are reset to `initial` under every `[data-style]` that declines them),
16
+ * so under no set and every shipped set today the marks draw as they did.
17
+ *
18
+ * **Its own module**, because `@repo/docgen` attributes a token to a component
19
+ * by the file its class string lives in, following only `_`-prefixed imports.
20
+ * `Preview` is this file's only reader.
21
+ *
22
+ * @internal Not part of the public API.
23
+ */
24
+ const STAGE_MARKS = "[display:var(--cue-style-stage-marks,inline)]";
25
+ //#endregion
26
+ export { STAGE_MARKS };
@@ -0,0 +1,71 @@
1
+ //#region src/system/_style-tab.ts
2
+ /**
3
+ * The `Tabs` list's rule and track, and the active tab: its underline, and its
4
+ * ground, ink, weight and shadow when a Look raises it as a segment.
5
+ *
6
+ * Spec 2026-09-26-looks-fidelity §3.8 (plan R4). The list hung its tabs off a
7
+ * 1px `border-b`, and the active tab laid an accent `::after` over it. A Look
8
+ * that draws its tabs as a segmented track (kiln, porcelain) has neither, and
9
+ * `style-tab-rule` and `style-tab-underline` take them away.
10
+ *
11
+ * **The fallbacks are the classes they replace**: `border-b` is 1px wide, and
12
+ * the underline was the accent, `var(--cue-accent)`. The width utility keeps
13
+ * `border-b`'s solid style, so it replaces it whole.
14
+ *
15
+ * **The list is the track.** `Tabs` has no frame, so the list reads
16
+ * `style-segment-track` and `style-segment-inset`, and falls back to what it
17
+ * had: no ground and no padding (`transparent`, `0px`). Its corners are
18
+ * square, and stay so: a radius on the list would curl the ends of its 1px
19
+ * rule under every set. A Look that draws its tabs on a track (kiln,
20
+ * porcelain) takes the rule away and owes the track its corners; spec §3.8
21
+ * leaves how to the Look lanes.
22
+ *
23
+ * **The active tab**, raised as a segment by a Look that draws its tabs on a
24
+ * track: its ground, ink, weight, edge and resting shade, read through the
25
+ * segment names (`_style-segment.ts` tells the family's story). The ink
26
+ * replaced `data-[active]:text-accent` and keeps that class's standing. The
27
+ * ground falls back to none (`transparent`, spec §3.8): a tab is marked by its
28
+ * underline. The ground, the weight (`400`, inherited and computed under every
29
+ * shipped set) and the shadow (a `transparent` inset edge and the paint axis's
30
+ * resting shade, one list written out for the reason
31
+ * `_style-segmented-control.ts` gives) are declarations the tab had in no
32
+ * state, so they are written `[:where(&[data-active])]:` — the active state at
33
+ * zero specificity — and a caller's `className="font-medium bg-surface-2
34
+ * shadow-sm"` still applies to the active tab as to the others.
35
+ *
36
+ * **Its own module**, for the docgen reason `_style-nav-voice.ts` gives:
37
+ * `SegmentedControl` shares `_style-segment.ts` with the tabs, and reads
38
+ * none of these.
39
+ *
40
+ * @internal Not part of the public API.
41
+ */
42
+ /** The list behind the tabs, which is the track: its ground and its inset. */
43
+ const TAB_TRACK = "bg-[color:var(--cue-style-segment-track,transparent)] p-[var(--cue-style-segment-inset,0px)] rounded-[var(--cue-style-tab-radius,0px)]";
44
+ /**
45
+ * A tab's corners and its resting weight (plan V.2, P41).
46
+ *
47
+ * Under a set that names `style-tab-radius` the list above is a rounded track
48
+ * and every tab a pill inside it, rounded on all four corners at the track's
49
+ * radius less the inset, as a pressed segment nests inside its frame. Under a
50
+ * set that does not, a tab keeps the `rounded-t-control` it drew: its top two
51
+ * corners at the control corner, its bottom two square on the list's rule.
52
+ * Both are one expression per edge, so neither needs a class the other lacks:
53
+ *
54
+ * - top: `tab-radius`, else the control corner **plus** the inset, less the
55
+ * inset — which is the control corner exactly, whether or not the set names
56
+ * an inset (Porcelain names one, 2px, before it names a tab radius);
57
+ * - bottom: `tab-radius`, else the inset, less the inset — `0px`.
58
+ *
59
+ * The weight is the segment weight on every tab, not only the active one —
60
+ * Porcelain's idle tabs are 500 too — falling back to 400. A caller's
61
+ * `font-*` class on a tab replaces it through `tailwind-merge`.
62
+ */
63
+ const TAB_SHAPE = "rounded-t-[calc(var(--cue-style-tab-radius,calc(var(--cue-radius-control)*var(--cue-radius-scale)+var(--cue-style-segment-inset,0px)))-var(--cue-style-segment-inset,0px))] rounded-b-[calc(var(--cue-style-tab-radius,var(--cue-style-segment-inset,0px))-var(--cue-style-segment-inset,0px))] font-[number:var(--cue-style-segment-weight,400)]";
64
+ /** The list's bottom rule, as a width. */
65
+ const TAB_RULE = "border-b-[length:var(--cue-style-tab-rule,1px)]";
66
+ /** The active tab's underline ink, on its `::after`. */
67
+ const TAB_UNDERLINE = "data-[active]:after:bg-[color:var(--cue-style-tab-underline,var(--cue-accent))]";
68
+ /** The `Tabs` active tab. Its ground falls back to none: a tab is marked by its underline. */
69
+ const TAB_ACTIVE = "[:where(&[data-active])]:bg-[color:var(--cue-style-segment-ground,transparent)] data-[active]:text-[color:var(--cue-style-segment-ink,var(--cue-accent))] [:where(&[data-active])]:font-[number:var(--cue-style-segment-weight,400)] [:where(&[data-active])]:shadow-[inset_0_0_0_var(--cue-border-width)_var(--cue-style-segment-edge,transparent),0_calc(2px*var(--cue-paint-shadow-scale))_calc(4px*var(--cue-paint-shadow-scale))_var(--cue-paint-rest-shade,transparent)]";
70
+ //#endregion
71
+ export { TAB_ACTIVE, TAB_RULE, TAB_SHAPE, TAB_TRACK, TAB_UNDERLINE };
@@ -0,0 +1,21 @@
1
+ //#region src/system/_style-textarea.ts
2
+ /**
3
+ * A textarea's leading and block padding (plan V.2, P139):
4
+ * `style-input-leading`, falling back to the `leading-ui` it drew, and the
5
+ * `space-3` rung times `style-textarea-pad`, `1` under a set that has none.
6
+ * Porcelain's textarea sets 1.45 and 5.5px.
7
+ *
8
+ * The padding is a name of its own and not `style-control-pad`, the button's
9
+ * inline proportion: Tender, Zine and Kiln declare that one (1.5, 1.625,
10
+ * 0.75), and a textarea that read it would move in every one of them where
11
+ * no row measured it.
12
+ *
13
+ * **Optional** (spec §3.0). Its own module for docgen's reason.
14
+ *
15
+ * @internal Not part of the public API.
16
+ */
17
+ const TEXTAREA_LEADING = "leading-[var(--cue-style-input-leading,var(--cue-leading-ui))]";
18
+ /** @see TEXTAREA_LEADING */
19
+ const TEXTAREA_PAD_Y = "py-[calc(var(--cue-space-3)*var(--cue-style-textarea-pad,1))]";
20
+ //#endregion
21
+ export { TEXTAREA_LEADING, TEXTAREA_PAD_Y };
@@ -0,0 +1,37 @@
1
+ //#region src/system/_style-title.ts
2
+ /**
3
+ * The title voice: a `Card`, `Panel` or `Bento` tile's name — mono,
4
+ * `text-emphasis`, weight 500, in `fg`, until a style set says otherwise.
5
+ *
6
+ * Spec 2026-09-26-looks-fidelity §3.3 (and §3.1 for the ink and the variation),
7
+ * plan R1. `CardTitle`, `PanelHeader`'s title and `Bento.Tile`'s title each
8
+ * spelt `font-mono text-(length:--cue-text-emphasis) font-medium text-fg`, so a
9
+ * Look could not move a card's name without a per-call-site class — and every
10
+ * Look the fidelity round measured draws it differently (Tender 26px at 300,
11
+ * Kiln 32px at 400, Porcelain 16px at 700, three of the four in sans).
12
+ *
13
+ * | property | reads | fallback (the class it replaced) |
14
+ * |-------------------------|---------------------------|----------------------------------|
15
+ * | font-family | `style-title-face` | `var(--cue-font-mono)` (`font-mono`) |
16
+ * | font-size | `style-title-size` | `var(--cue-text-emphasis)` |
17
+ * | font-weight | `style-title-weight` | `500` (`font-medium`) |
18
+ * | letter-spacing | `style-title-tracking` | `normal` |
19
+ * | line-height | `style-title-leading` | `inherit` |
20
+ * | font-variation-settings | `style-display-variation` | `normal` |
21
+ * | color | `style-heading-ink` | `var(--cue-fg)` (`text-fg`) |
22
+ *
23
+ * **Every name is optional** (spec §3.0), declared on no `:root` and left at the
24
+ * shared `[data-style]` reset by every shipped set, so each `var()` resolves its
25
+ * fallback at the title — what the old classes computed there.
26
+ *
27
+ * An overlay's title shares the face, the weight, the ink and the variation but
28
+ * not the size, the tracking or the leading, so it is `_style-overlay-title.ts`
29
+ * and not an import of this: docgen would publish every name in this file as a
30
+ * token of every overlay. `_style-page-title.ts` says why the weight is
31
+ * `font-[number:…]` and why the size comes before the leading.
32
+ *
33
+ * @internal Not part of the public API.
34
+ */
35
+ const TITLE_VOICE = "font-[family-name:var(--cue-style-title-face,var(--cue-font-mono))] text-[length:var(--cue-style-title-size,var(--cue-text-emphasis))] font-[number:var(--cue-style-title-weight,500)] tracking-[var(--cue-style-title-tracking,normal)] leading-[var(--cue-style-title-leading,inherit)] [font-variation-settings:var(--cue-style-title-variation,var(--cue-style-display-variation,normal))] text-[color:var(--cue-style-heading-ink,var(--cue-fg))]";
36
+ //#endregion
37
+ export { TITLE_VOICE };
@@ -0,0 +1,17 @@
1
+ //#region src/system/_style-tooltip.ts
2
+ /**
3
+ * A tooltip's size and padding (plan V.2, P129): the help size, falling back
4
+ * to the `text-label` rung the tooltip drew, and `style-tooltip-pad`, one or
5
+ * two rem lengths, falling back to the `space-2` block and `space-3` inline
6
+ * padding it drew. Porcelain's tooltip is 12px type, 4px by 8px in. Its
7
+ * leading is the body leading (`_style-body-leading.ts`).
8
+ *
9
+ * **Optional** (spec §3.0). Its own module for docgen's reason.
10
+ *
11
+ * @internal Not part of the public API.
12
+ */
13
+ const TOOLTIP_SIZE = "text-[length:var(--cue-style-help-size,var(--cue-text-label))]";
14
+ /** @see TOOLTIP_SIZE */
15
+ const TOOLTIP_PAD = "p-[var(--cue-style-tooltip-pad,var(--cue-space-2)_var(--cue-space-3))]";
16
+ //#endregion
17
+ export { TOOLTIP_PAD, TOOLTIP_SIZE };