@miragon/mcp-toolkit-ui 2.5.0 → 2.7.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 (348) hide show
  1. package/README.md +8 -2
  2. package/dist/app/builder/BuilderBanners.d.ts +7 -2
  3. package/dist/app/builder/BuilderBanners.d.ts.map +1 -1
  4. package/dist/app/builder/BuilderBanners.js +8 -3
  5. package/dist/app/builder/BuilderBanners.js.map +1 -1
  6. package/dist/app/builder/CanvasRow.d.ts.map +1 -1
  7. package/dist/app/builder/CanvasRow.js +12 -14
  8. package/dist/app/builder/CanvasRow.js.map +1 -1
  9. package/dist/app/builder/CatalogueSheet.d.ts.map +1 -1
  10. package/dist/app/builder/CatalogueSheet.js +6 -5
  11. package/dist/app/builder/CatalogueSheet.js.map +1 -1
  12. package/dist/app/builder/EmptyHint.d.ts +4 -0
  13. package/dist/app/builder/EmptyHint.d.ts.map +1 -1
  14. package/dist/app/builder/EmptyHint.js +6 -1
  15. package/dist/app/builder/EmptyHint.js.map +1 -1
  16. package/dist/app/builder/LayoutSurface.js +3 -3
  17. package/dist/app/builder/LayoutSurface.js.map +1 -1
  18. package/dist/app/builder/PipelineStrip.d.ts +3 -1
  19. package/dist/app/builder/PipelineStrip.d.ts.map +1 -1
  20. package/dist/app/builder/PipelineStrip.js +11 -6
  21. package/dist/app/builder/PipelineStrip.js.map +1 -1
  22. package/dist/app/builder/SaveDialog.d.ts.map +1 -1
  23. package/dist/app/builder/SaveDialog.js +2 -2
  24. package/dist/app/builder/SaveDialog.js.map +1 -1
  25. package/dist/app/builder/Toolbar.d.ts +3 -1
  26. package/dist/app/builder/Toolbar.d.ts.map +1 -1
  27. package/dist/app/builder/Toolbar.js +9 -3
  28. package/dist/app/builder/Toolbar.js.map +1 -1
  29. package/dist/app/builder/Workspace.js +2 -2
  30. package/dist/app/builder/Workspace.js.map +1 -1
  31. package/dist/app/builder/builder-model.d.ts +3 -2
  32. package/dist/app/builder/builder-model.d.ts.map +1 -1
  33. package/dist/app/builder/builder-model.js +5 -4
  34. package/dist/app/builder/builder-model.js.map +1 -1
  35. package/dist/app/builder/labels.d.ts +13 -62
  36. package/dist/app/builder/labels.d.ts.map +1 -1
  37. package/dist/app/builder/labels.js +9 -58
  38. package/dist/app/builder/labels.js.map +1 -1
  39. package/dist/app/builder/status-chip.d.ts.map +1 -1
  40. package/dist/app/builder/status-chip.js +3 -2
  41. package/dist/app/builder/status-chip.js.map +1 -1
  42. package/dist/app/builder/use-builder-catalogue.d.ts +1 -0
  43. package/dist/app/builder/use-builder-catalogue.d.ts.map +1 -1
  44. package/dist/app/builder/use-builder-catalogue.js +6 -0
  45. package/dist/app/builder/use-builder-catalogue.js.map +1 -1
  46. package/dist/app/builder/use-save-dashboard.d.ts +3 -1
  47. package/dist/app/builder/use-save-dashboard.d.ts.map +1 -1
  48. package/dist/app/builder/use-save-dashboard.js +3 -1
  49. package/dist/app/builder/use-save-dashboard.js.map +1 -1
  50. package/dist/app/index.d.ts +1 -1
  51. package/dist/app/index.d.ts.map +1 -1
  52. package/dist/app/index.js.map +1 -1
  53. package/dist/app/layout-builder.d.ts +7 -2
  54. package/dist/app/layout-builder.d.ts.map +1 -1
  55. package/dist/app/layout-builder.js +17 -5
  56. package/dist/app/layout-builder.js.map +1 -1
  57. package/dist/app/mcp-app-view-chrome.d.ts +94 -20
  58. package/dist/app/mcp-app-view-chrome.d.ts.map +1 -1
  59. package/dist/app/mcp-app-view-chrome.js +109 -40
  60. package/dist/app/mcp-app-view-chrome.js.map +1 -1
  61. package/dist/app/mcp-app-view-states.d.ts +15 -0
  62. package/dist/app/mcp-app-view-states.d.ts.map +1 -0
  63. package/dist/app/mcp-app-view-states.js +34 -0
  64. package/dist/app/mcp-app-view-states.js.map +1 -0
  65. package/dist/app/mcp-app-view.d.ts +40 -5
  66. package/dist/app/mcp-app-view.d.ts.map +1 -1
  67. package/dist/app/mcp-app-view.js +174 -128
  68. package/dist/app/mcp-app-view.js.map +1 -1
  69. package/dist/app/mcp-toolkit-app.d.ts +2 -1
  70. package/dist/app/mcp-toolkit-app.d.ts.map +1 -1
  71. package/dist/app/mcp-toolkit-app.js +25 -3
  72. package/dist/app/mcp-toolkit-app.js.map +1 -1
  73. package/dist/app/use-view-lifecycle.d.ts +38 -0
  74. package/dist/app/use-view-lifecycle.d.ts.map +1 -0
  75. package/dist/app/use-view-lifecycle.js +79 -0
  76. package/dist/app/use-view-lifecycle.js.map +1 -0
  77. package/dist/app/view-lifecycle.d.ts +109 -0
  78. package/dist/app/view-lifecycle.d.ts.map +1 -0
  79. package/dist/app/view-lifecycle.js +120 -0
  80. package/dist/app/view-lifecycle.js.map +1 -0
  81. package/dist/app/widget-props-sheet.d.ts +3 -9
  82. package/dist/app/widget-props-sheet.d.ts.map +1 -1
  83. package/dist/app/widget-props-sheet.js +6 -13
  84. package/dist/app/widget-props-sheet.js.map +1 -1
  85. package/dist/app/widget-renderer.d.ts +41 -1
  86. package/dist/app/widget-renderer.d.ts.map +1 -1
  87. package/dist/app/widget-renderer.js +82 -31
  88. package/dist/app/widget-renderer.js.map +1 -1
  89. package/dist/components/DrillButton.d.ts.map +1 -1
  90. package/dist/components/DrillButton.js +2 -1
  91. package/dist/components/DrillButton.js.map +1 -1
  92. package/dist/components/EmptyState.d.ts +33 -0
  93. package/dist/components/EmptyState.d.ts.map +1 -0
  94. package/dist/components/EmptyState.js +17 -0
  95. package/dist/components/EmptyState.js.map +1 -0
  96. package/dist/components/ErrorState.d.ts +50 -0
  97. package/dist/components/ErrorState.d.ts.map +1 -0
  98. package/dist/components/ErrorState.js +60 -0
  99. package/dist/components/ErrorState.js.map +1 -0
  100. package/dist/components/FilterBar.d.ts +1 -1
  101. package/dist/components/FilterBar.d.ts.map +1 -1
  102. package/dist/components/FilterBar.js +7 -4
  103. package/dist/components/FilterBar.js.map +1 -1
  104. package/dist/components/GroupCard.d.ts.map +1 -1
  105. package/dist/components/GroupCard.js +2 -1
  106. package/dist/components/GroupCard.js.map +1 -1
  107. package/dist/components/KpiGrid.d.ts +10 -3
  108. package/dist/components/KpiGrid.d.ts.map +1 -1
  109. package/dist/components/KpiGrid.js +31 -9
  110. package/dist/components/KpiGrid.js.map +1 -1
  111. package/dist/components/ListFooter.d.ts +3 -2
  112. package/dist/components/ListFooter.d.ts.map +1 -1
  113. package/dist/components/ListFooter.js +14 -4
  114. package/dist/components/ListFooter.js.map +1 -1
  115. package/dist/components/Pills.d.ts +10 -6
  116. package/dist/components/Pills.d.ts.map +1 -1
  117. package/dist/components/Pills.js +12 -6
  118. package/dist/components/Pills.js.map +1 -1
  119. package/dist/components/Toast.d.ts +37 -0
  120. package/dist/components/Toast.d.ts.map +1 -0
  121. package/dist/components/Toast.js +91 -0
  122. package/dist/components/Toast.js.map +1 -0
  123. package/dist/components/WidgetHeader.js +1 -1
  124. package/dist/hooks/use-tool-result-recovery.d.ts +23 -1
  125. package/dist/hooks/use-tool-result-recovery.d.ts.map +1 -1
  126. package/dist/hooks/use-tool-result-recovery.js +21 -7
  127. package/dist/hooks/use-tool-result-recovery.js.map +1 -1
  128. package/dist/hooks/use-view-data.d.ts +6 -0
  129. package/dist/hooks/use-view-data.d.ts.map +1 -1
  130. package/dist/hooks/use-view-data.js +6 -1
  131. package/dist/hooks/use-view-data.js.map +1 -1
  132. package/dist/index.d.ts +12 -5
  133. package/dist/index.d.ts.map +1 -1
  134. package/dist/index.js +14 -4
  135. package/dist/index.js.map +1 -1
  136. package/dist/lib/focus-ring.d.ts +18 -0
  137. package/dist/lib/focus-ring.d.ts.map +1 -0
  138. package/dist/lib/focus-ring.js +18 -0
  139. package/dist/lib/focus-ring.js.map +1 -0
  140. package/dist/lib/icon-stroke.d.ts +12 -0
  141. package/dist/lib/icon-stroke.d.ts.map +1 -0
  142. package/dist/lib/icon-stroke.js +12 -0
  143. package/dist/lib/icon-stroke.js.map +1 -0
  144. package/dist/lib/toast-model.d.ts +46 -0
  145. package/dist/lib/toast-model.d.ts.map +1 -0
  146. package/dist/lib/toast-model.js +36 -0
  147. package/dist/lib/toast-model.js.map +1 -0
  148. package/dist/lib/tone-utils.d.ts +43 -9
  149. package/dist/lib/tone-utils.d.ts.map +1 -1
  150. package/dist/lib/tone-utils.js +36 -7
  151. package/dist/lib/tone-utils.js.map +1 -1
  152. package/dist/locale/index.d.ts +3 -1
  153. package/dist/locale/index.d.ts.map +1 -1
  154. package/dist/locale/index.js +2 -1
  155. package/dist/locale/index.js.map +1 -1
  156. package/dist/locale/locale-provider.d.ts +42 -1
  157. package/dist/locale/locale-provider.d.ts.map +1 -1
  158. package/dist/locale/locale-provider.js +44 -3
  159. package/dist/locale/locale-provider.js.map +1 -1
  160. package/dist/locale/message-types.d.ts +223 -0
  161. package/dist/locale/message-types.d.ts.map +1 -0
  162. package/dist/locale/message-types.js +7 -0
  163. package/dist/locale/message-types.js.map +1 -0
  164. package/dist/locale/messages-de.d.ts +9 -0
  165. package/dist/locale/messages-de.d.ts.map +1 -0
  166. package/dist/locale/messages-de.js +151 -0
  167. package/dist/locale/messages-de.js.map +1 -0
  168. package/dist/locale/messages-en.d.ts +8 -0
  169. package/dist/locale/messages-en.d.ts.map +1 -0
  170. package/dist/locale/messages-en.js +150 -0
  171. package/dist/locale/messages-en.js.map +1 -0
  172. package/dist/locale/toolkit-messages.d.ts +39 -0
  173. package/dist/locale/toolkit-messages.d.ts.map +1 -0
  174. package/dist/locale/toolkit-messages.js +50 -0
  175. package/dist/locale/toolkit-messages.js.map +1 -0
  176. package/dist/primitives/alert.d.ts.map +1 -1
  177. package/dist/primitives/alert.js +4 -2
  178. package/dist/primitives/alert.js.map +1 -1
  179. package/dist/primitives/badge.d.ts +1 -1
  180. package/dist/primitives/badge.d.ts.map +1 -1
  181. package/dist/primitives/badge.js +14 -6
  182. package/dist/primitives/badge.js.map +1 -1
  183. package/dist/primitives/button.d.ts.map +1 -1
  184. package/dist/primitives/button.js +12 -8
  185. package/dist/primitives/button.js.map +1 -1
  186. package/dist/primitives/card.js +4 -4
  187. package/dist/primitives/card.js.map +1 -1
  188. package/dist/primitives/dialog.d.ts +7 -3
  189. package/dist/primitives/dialog.d.ts.map +1 -1
  190. package/dist/primitives/dialog.js +14 -7
  191. package/dist/primitives/dialog.js.map +1 -1
  192. package/dist/primitives/input.d.ts.map +1 -1
  193. package/dist/primitives/input.js +4 -1
  194. package/dist/primitives/input.js.map +1 -1
  195. package/dist/primitives/scroll-area.js +1 -1
  196. package/dist/primitives/scroll-area.js.map +1 -1
  197. package/dist/primitives/select.d.ts.map +1 -1
  198. package/dist/primitives/select.js +5 -2
  199. package/dist/primitives/select.js.map +1 -1
  200. package/dist/primitives/sheet.d.ts +3 -1
  201. package/dist/primitives/sheet.d.ts.map +1 -1
  202. package/dist/primitives/sheet.js +12 -6
  203. package/dist/primitives/sheet.js.map +1 -1
  204. package/dist/primitives/skeleton.js +1 -1
  205. package/dist/primitives/skeleton.js.map +1 -1
  206. package/dist/primitives/switch.d.ts.map +1 -1
  207. package/dist/primitives/switch.js +2 -1
  208. package/dist/primitives/switch.js.map +1 -1
  209. package/dist/primitives/tabs.d.ts.map +1 -1
  210. package/dist/primitives/tabs.js +5 -3
  211. package/dist/primitives/tabs.js.map +1 -1
  212. package/dist/render-cases.d.ts.map +1 -1
  213. package/dist/render-cases.js +20 -2
  214. package/dist/render-cases.js.map +1 -1
  215. package/dist/render-scan.d.ts +25 -0
  216. package/dist/render-scan.d.ts.map +1 -0
  217. package/dist/render-scan.js +66 -0
  218. package/dist/render-scan.js.map +1 -0
  219. package/dist/theme/cd-tokens.d.ts +66 -0
  220. package/dist/theme/cd-tokens.d.ts.map +1 -0
  221. package/dist/theme/cd-tokens.js +64 -0
  222. package/dist/theme/cd-tokens.js.map +1 -0
  223. package/dist/theme/create-theme.d.ts +196 -39
  224. package/dist/theme/create-theme.d.ts.map +1 -1
  225. package/dist/theme/create-theme.js +189 -13
  226. package/dist/theme/create-theme.js.map +1 -1
  227. package/dist/theme/fonts.d.ts +38 -0
  228. package/dist/theme/fonts.d.ts.map +1 -0
  229. package/dist/theme/fonts.js +56 -0
  230. package/dist/theme/fonts.js.map +1 -0
  231. package/dist/theme/host-fonts.d.ts +39 -0
  232. package/dist/theme/host-fonts.d.ts.map +1 -0
  233. package/dist/theme/host-fonts.js +44 -0
  234. package/dist/theme/host-fonts.js.map +1 -0
  235. package/dist/theme/index.d.ts +8 -1
  236. package/dist/theme/index.d.ts.map +1 -1
  237. package/dist/theme/index.js +5 -1
  238. package/dist/theme/index.js.map +1 -1
  239. package/dist/theme/portal-container.d.ts +16 -0
  240. package/dist/theme/portal-container.d.ts.map +1 -0
  241. package/dist/theme/portal-container.js +19 -0
  242. package/dist/theme/portal-container.js.map +1 -0
  243. package/dist/theme/presets.d.ts +24 -9
  244. package/dist/theme/presets.d.ts.map +1 -1
  245. package/dist/theme/presets.js +44 -11
  246. package/dist/theme/presets.js.map +1 -1
  247. package/dist/theme/theme-provider.d.ts +27 -9
  248. package/dist/theme/theme-provider.d.ts.map +1 -1
  249. package/dist/theme/theme-provider.js +42 -20
  250. package/dist/theme/theme-provider.js.map +1 -1
  251. package/package.json +13 -8
  252. package/src/app/builder/BuilderBanners.tsx +26 -13
  253. package/src/app/builder/CanvasRow.tsx +22 -21
  254. package/src/app/builder/CatalogueSheet.tsx +16 -14
  255. package/src/app/builder/EmptyHint.tsx +16 -11
  256. package/src/app/builder/LayoutSurface.tsx +7 -7
  257. package/src/app/builder/PipelineStrip.tsx +26 -17
  258. package/src/app/builder/SaveDialog.tsx +11 -12
  259. package/src/app/builder/Toolbar.tsx +19 -7
  260. package/src/app/builder/Workspace.tsx +5 -3
  261. package/src/app/builder/builder-feedback.test.tsx +75 -0
  262. package/src/app/builder/builder-model.test.ts +5 -0
  263. package/src/app/builder/builder-model.ts +5 -4
  264. package/src/app/builder/labels.ts +15 -121
  265. package/src/app/builder/status-chip.tsx +8 -4
  266. package/src/app/builder/use-builder-catalogue.ts +6 -0
  267. package/src/app/builder/use-save-dashboard.ts +5 -0
  268. package/src/app/index.ts +8 -1
  269. package/src/app/layout-builder.tsx +23 -3
  270. package/src/app/mcp-app-view-chrome.test.tsx +347 -14
  271. package/src/app/mcp-app-view-chrome.tsx +278 -100
  272. package/src/app/mcp-app-view-states.tsx +100 -0
  273. package/src/app/mcp-app-view.test.tsx +258 -0
  274. package/src/app/mcp-app-view.tsx +292 -185
  275. package/src/app/mcp-toolkit-app.tsx +31 -7
  276. package/src/app/use-view-lifecycle.ts +116 -0
  277. package/src/app/view-lifecycle.test.ts +227 -0
  278. package/src/app/view-lifecycle.ts +174 -0
  279. package/src/app/widget-props-sheet.tsx +13 -26
  280. package/src/app/widget-renderer.render.test.tsx +131 -0
  281. package/src/app/widget-renderer.tsx +136 -38
  282. package/src/components/DrillButton.tsx +2 -1
  283. package/src/components/EmptyState.tsx +81 -0
  284. package/src/components/ErrorState.tsx +182 -0
  285. package/src/components/FilterBar.tsx +9 -6
  286. package/src/components/GroupCard.tsx +3 -2
  287. package/src/components/KpiGrid.tsx +75 -44
  288. package/src/components/ListFooter.tsx +17 -6
  289. package/src/components/Pills.tsx +20 -11
  290. package/src/components/Toast.tsx +188 -0
  291. package/src/components/WidgetHeader.tsx +1 -1
  292. package/src/components/feedback-states.test.tsx +225 -0
  293. package/src/components/tone-figures.test.tsx +54 -0
  294. package/src/fonts.css +19 -0
  295. package/src/globals.css +9 -165
  296. package/src/hooks/use-tool-result-recovery.test.ts +25 -1
  297. package/src/hooks/use-tool-result-recovery.ts +34 -6
  298. package/src/hooks/use-view-data.test.tsx +60 -0
  299. package/src/hooks/use-view-data.ts +12 -1
  300. package/src/i18n-coverage.test.tsx +323 -0
  301. package/src/index.ts +57 -5
  302. package/src/lib/focus-ring.ts +20 -0
  303. package/src/lib/icon-stroke.test.ts +59 -0
  304. package/src/lib/icon-stroke.ts +13 -0
  305. package/src/lib/toast-model.test.ts +68 -0
  306. package/src/lib/toast-model.ts +63 -0
  307. package/src/lib/tone-utils.test.ts +47 -14
  308. package/src/lib/tone-utils.ts +61 -13
  309. package/src/locale/index.ts +13 -1
  310. package/src/locale/locale-provider.test.tsx +87 -0
  311. package/src/locale/locale-provider.tsx +90 -3
  312. package/src/locale/message-types.ts +221 -0
  313. package/src/locale/messages-de.ts +159 -0
  314. package/src/locale/messages-en.ts +157 -0
  315. package/src/locale/toolkit-messages.test.ts +216 -0
  316. package/src/locale/toolkit-messages.ts +82 -0
  317. package/src/no-hardcoded-copy.test.ts +432 -0
  318. package/src/primitives/alert.tsx +4 -2
  319. package/src/primitives/badge.tsx +14 -7
  320. package/src/primitives/button.tsx +13 -8
  321. package/src/primitives/card.tsx +4 -4
  322. package/src/primitives/dialog.tsx +32 -7
  323. package/src/primitives/input.tsx +5 -3
  324. package/src/primitives/scroll-area.tsx +1 -1
  325. package/src/primitives/select.tsx +6 -3
  326. package/src/primitives/sheet.tsx +26 -6
  327. package/src/primitives/skeleton.tsx +1 -1
  328. package/src/primitives/switch.tsx +4 -2
  329. package/src/primitives/tabs.tsx +9 -6
  330. package/src/render-cases.tsx +45 -1
  331. package/src/render-scan.ts +75 -0
  332. package/src/theme/cd-tokens.generated.css +48 -0
  333. package/src/theme/cd-tokens.test.ts +107 -0
  334. package/src/theme/cd-tokens.ts +67 -0
  335. package/src/theme/create-theme.test.ts +243 -5
  336. package/src/theme/create-theme.ts +313 -41
  337. package/src/theme/fonts.test.ts +85 -0
  338. package/src/theme/fonts.ts +72 -0
  339. package/src/theme/host-fonts.test.ts +135 -0
  340. package/src/theme/host-fonts.ts +52 -0
  341. package/src/theme/index.ts +15 -1
  342. package/src/theme/portal-container.ts +20 -0
  343. package/src/theme/presets.ts +44 -11
  344. package/src/theme/theme-css.test.ts +568 -0
  345. package/src/theme/theme-provider.test.tsx +82 -0
  346. package/src/theme/theme-provider.tsx +60 -24
  347. package/src/theme.css +314 -0
  348. package/ui-catalog.json +344 -17
@@ -1,28 +1,39 @@
1
1
  import type { CSSProperties } from "react";
2
2
  /**
3
- * A curated, brand-relevant subset of the toolkit's CSS-variable theming
4
- * surface (the full set lives in `packages/ui/src/globals.css`). These are the
5
- * tokens a white-label client almost always wants to change — the brand colour
6
- * pair, the surface/accent colours, the border/ring, and the shape/typography
7
- * knobs — expressed in plain, design-system terms.
3
+ * The toolkit's theming surface in plain, design-system terms: one optional
4
+ * field per ROLE variable defined in `packages/ui/src/theme.css` (the role-token
5
+ * contract, see {@link ROLE_TOKENS}), plus the legacy shadcn knobs it always had.
8
6
  *
9
- * Every field is **optional**: a theme overrides only the tokens it cares about
10
- * and inherits the rest from the toolkit defaults (`:root` / `.dark`). Colour
11
- * values are any valid CSS colour string (`oklch(...)`, `#rrggbb`, `hsl(...)`),
12
- * `radius` is any CSS length (e.g. `"0.5rem"`), and the font fields are CSS
13
- * `font-family` lists.
7
+ * The defaults are the Miragon theme — every role points at a vendored
8
+ * `--cd-*` corporate-design token, in light and in dark. A brand overrides
9
+ * only the roles it cares about and inherits the rest. Colour values are any
10
+ * CSS colour string (`#rrggbb`, `oklch(...)`, `color-mix(...)`), lengths any
11
+ * CSS length, fonts `font-family` lists, durations CSS times.
14
12
  *
15
- * Unlisted CSS variables (`--popover`, `--chart-*`, `--sidebar-*`, …) are
16
- * intentionally out of scope here: they are part of the theming surface but not
17
- * the brand essentials, so a client tunes them by hand in CSS when needed. See
18
- * {@link TOKEN_TO_CSS_VAR} for the exact field → variable mapping.
13
+ * Roles a component must never take from a host's palette — primary, link,
14
+ * focus, the status tones and the input border — are brand decisions; a host
15
+ * maps only the neutral roles (background, card, foreground, border, …).
16
+ *
17
+ * Unlisted variables (`--chart-*`, `--sidebar-*`, `--popover-foreground`, …)
18
+ * stay themeable in CSS. See {@link TOKEN_TO_CSS_VAR} for the exact mapping.
19
19
  */
20
20
  export interface ThemeTokens {
21
- /** Brand colour. Maps to `--primary`. */
21
+ /** Brand colour: primary button fill, selection. Maps to `--primary`. */
22
22
  primary?: string;
23
23
  /** Text/icon colour on a `primary` surface. Maps to `--primary-foreground`. */
24
24
  primaryForeground?: string;
25
- /** Accent colour for subtle highlights. Maps to `--accent`. */
25
+ /**
26
+ * Primary button fill on hover. Maps to `--primary-hover`. A theme that sets
27
+ * `primary` but never `primaryHover` gets `primary` at 90 % (the pre-role
28
+ * hover) from {@link resolveThemeVars}.
29
+ */
30
+ primaryHover?: string;
31
+ /**
32
+ * Link and interactive text. Maps to `--link`. A theme that sets `primary`
33
+ * but never `link` gets links in `primary` (the pre-role link colour).
34
+ */
35
+ link?: string;
36
+ /** Hover/selection highlight surface. Maps to `--accent`. */
26
37
  accent?: string;
27
38
  /** Text colour on an `accent` surface. Maps to `--accent-foreground`. */
28
39
  accentForeground?: string;
@@ -34,40 +45,171 @@ export interface ThemeTokens {
34
45
  card?: string;
35
46
  /** Text colour on a `card` surface. Maps to `--card-foreground`. */
36
47
  cardForeground?: string;
37
- /** Border colour for dividers/outlines. Maps to `--border`. */
48
+ /** Menu, select and dialog surface. Maps to `--popover`. */
49
+ popover?: string;
50
+ /** Quiet surface (table heads, skeletons, tab rails). Maps to `--muted`. */
51
+ muted?: string;
52
+ /** Secondary text — must keep 4.5:1 on `muted`. Maps to `--muted-foreground`. */
53
+ mutedForeground?: string;
54
+ /** Secondary button / badge surface. Maps to `--secondary`. */
55
+ secondary?: string;
56
+ /** Decorative dividers and outlines (no contrast claim). Maps to `--border`. */
38
57
  border?: string;
39
- /** Focus-ring colour. Maps to `--ring`. */
58
+ /** Input border — must keep 3:1 on its surface. Maps to `--input`. */
59
+ input?: string;
60
+ /** Legacy focus-ring colour (shadcn). Maps to `--ring`. */
40
61
  ring?: string;
41
- /** Base corner radius (a CSS length). Maps to `--radius`. */
62
+ /**
63
+ * Focus ring and focused-input border, opaque, 3:1. Maps to `--focus`. A
64
+ * theme that sets `ring` but never `focus` gets its focus ring in `ring`.
65
+ */
66
+ focus?: string;
67
+ /** Destructive action fill. Maps to `--destructive`. */
68
+ destructive?: string;
69
+ /**
70
+ * Text/icon colour on a `destructive` fill (white by default; keep 4.5:1).
71
+ * Maps to `--destructive-foreground`.
72
+ */
73
+ destructiveForeground?: string;
74
+ /** Success colour — fill, dot, border, icon (never text on light). Maps to `--success`. */
75
+ success?: string;
76
+ /** Success tint surface. Maps to `--success-soft`. */
77
+ successSoft?: string;
78
+ /** Text colour of the success tone. Maps to `--success-ink`. */
79
+ successInk?: string;
80
+ /** Warning colour — fill, dot, border, icon (never text on light). Maps to `--warning`. */
81
+ warning?: string;
82
+ /** Warning tint surface. Maps to `--warning-soft`. */
83
+ warningSoft?: string;
84
+ /** Text colour of the warning tone. Maps to `--warning-ink`. */
85
+ warningInk?: string;
86
+ /** Danger colour — fill, dot, border, icon. Maps to `--danger`. */
87
+ danger?: string;
88
+ /** Danger tint surface. Maps to `--danger-soft`. */
89
+ dangerSoft?: string;
90
+ /** Text colour of the danger tone. Maps to `--danger-ink`. */
91
+ dangerInk?: string;
92
+ /** Info colour — fill, dot, border, icon. Maps to `--info`. */
93
+ info?: string;
94
+ /** Info tint surface. Maps to `--info-soft`. */
95
+ infoSoft?: string;
96
+ /** Text colour of the info tone. Maps to `--info-ink`. */
97
+ infoInk?: string;
98
+ /**
99
+ * Base corner radius (the legacy shadcn knob). Drives `rounded-xl` and up;
100
+ * applied through a theme ({@link ThemeProvider}, {@link resolveThemeVars}
101
+ * or `toStyle()`) it also derives `radiusSm`/`radiusMd`/`radiusLg` when those
102
+ * are not set. In plain CSS `--radius` no longer reshapes `rounded-sm/md/lg`:
103
+ * set `--radius-sm`/`--radius-md`/`--radius-lg` there. Maps to `--radius`.
104
+ */
42
105
  radius?: string;
106
+ /** Badges and chips. Maps to `--radius-sm` (`rounded-sm`). */
107
+ radiusSm?: string;
108
+ /** The standard: buttons, inputs, cards, dialogs. Maps to `--radius-md` (`rounded-md`). */
109
+ radiusMd?: string;
110
+ /** Large panels and tiles. Maps to `--radius-lg` (`rounded-lg`). */
111
+ radiusLg?: string;
112
+ /** Pills and avatars. Maps to `--radius-pill` (`rounded-pill`). */
113
+ radiusPill?: string;
114
+ /** Subtle elevation. Maps to `--shadow-1` (`shadow-1`). */
115
+ shadow1?: string;
116
+ /** Cards, hovered primary buttons. Maps to `--shadow-2` (`shadow-2`). */
117
+ shadow2?: string;
118
+ /** Popovers and dialogs. Maps to `--shadow-3` (`shadow-3`). */
119
+ shadow3?: string;
120
+ /** Dialog/sheet backdrop. Maps to `--scrim` (`bg-scrim`). */
121
+ scrim?: string;
122
+ /** Hover-speed transitions. Maps to `--motion-fast` (the default duration). */
123
+ motionFast?: string;
124
+ /** Standard transitions. Maps to `--motion-base`. */
125
+ motionBase?: string;
126
+ /** Large enter/leave transitions. Maps to `--motion-slow`. */
127
+ motionSlow?: string;
128
+ /** Easing curve. Maps to `--ease` (the default timing function). */
129
+ ease?: string;
43
130
  /** Body font-family list. Maps to `--font-sans`. */
44
131
  fontSans?: string;
132
+ /** Code, ids and stack traces. Maps to `--font-mono`. */
133
+ fontMono?: string;
45
134
  /** Heading font-family list. Maps to `--font-heading`. */
46
135
  fontHeading?: string;
47
136
  }
48
137
  /** The CSS custom-property name a {@link ThemeTokens} field resolves to. */
49
138
  type CssVarName = `--${string}`;
50
139
  /**
51
- * The single source of truth mapping each curated {@link ThemeTokens} field to
52
- * its real CSS variable name from `globals.css`. `tokensToVars` walks this map,
53
- * so adding a field here (and to {@link ThemeTokens}) is all that is needed to
54
- * extend the public theming surface.
140
+ * The single source of truth mapping each {@link ThemeTokens} field to its real
141
+ * CSS variable name in `theme.css`. `tokensToVars` walks this map, so adding a
142
+ * field here (and to {@link ThemeTokens}) is all that is needed to extend the
143
+ * public theming surface.
55
144
  */
56
145
  export declare const TOKEN_TO_CSS_VAR: {
57
146
  readonly primary: "--primary";
58
147
  readonly primaryForeground: "--primary-foreground";
148
+ readonly primaryHover: "--primary-hover";
149
+ readonly link: "--link";
59
150
  readonly accent: "--accent";
60
151
  readonly accentForeground: "--accent-foreground";
61
152
  readonly background: "--background";
62
153
  readonly foreground: "--foreground";
63
154
  readonly card: "--card";
64
155
  readonly cardForeground: "--card-foreground";
156
+ readonly popover: "--popover";
157
+ readonly muted: "--muted";
158
+ readonly mutedForeground: "--muted-foreground";
159
+ readonly secondary: "--secondary";
65
160
  readonly border: "--border";
161
+ readonly input: "--input";
66
162
  readonly ring: "--ring";
163
+ readonly focus: "--focus";
164
+ readonly destructive: "--destructive";
165
+ readonly destructiveForeground: "--destructive-foreground";
166
+ readonly success: "--success";
167
+ readonly successSoft: "--success-soft";
168
+ readonly successInk: "--success-ink";
169
+ readonly warning: "--warning";
170
+ readonly warningSoft: "--warning-soft";
171
+ readonly warningInk: "--warning-ink";
172
+ readonly danger: "--danger";
173
+ readonly dangerSoft: "--danger-soft";
174
+ readonly dangerInk: "--danger-ink";
175
+ readonly info: "--info";
176
+ readonly infoSoft: "--info-soft";
177
+ readonly infoInk: "--info-ink";
67
178
  readonly radius: "--radius";
179
+ readonly radiusSm: "--radius-sm";
180
+ readonly radiusMd: "--radius-md";
181
+ readonly radiusLg: "--radius-lg";
182
+ readonly radiusPill: "--radius-pill";
183
+ readonly shadow1: "--shadow-1";
184
+ readonly shadow2: "--shadow-2";
185
+ readonly shadow3: "--shadow-3";
186
+ readonly scrim: "--scrim";
187
+ readonly motionFast: "--motion-fast";
188
+ readonly motionBase: "--motion-base";
189
+ readonly motionSlow: "--motion-slow";
190
+ readonly ease: "--ease";
68
191
  readonly fontSans: "--font-sans";
192
+ readonly fontMono: "--font-mono";
69
193
  readonly fontHeading: "--font-heading";
70
194
  };
195
+ /**
196
+ * The role-token contract: every variable the toolkit defines for components
197
+ * to use (`theme.css`), in light and — for colours — dark. Components in this
198
+ * package, and in apps built on it, style through these names only, never
199
+ * through raw colours or Tailwind palette classes.
200
+ */
201
+ export declare const ROLE_TOKENS: readonly ["--background", "--card", "--popover", "--muted", "--secondary", "--foreground", "--muted-foreground", "--border", "--input", "--primary", "--primary-foreground", "--primary-hover", "--link", "--ring", "--focus", "--success", "--warning", "--danger", "--info", "--success-soft", "--warning-soft", "--danger-soft", "--info-soft", "--success-ink", "--warning-ink", "--danger-ink", "--info-ink", "--destructive", "--radius-sm", "--radius-md", "--radius-lg", "--radius-pill", "--shadow-1", "--shadow-2", "--shadow-3", "--scrim", "--motion-fast", "--motion-base", "--motion-slow", "--ease", "--font-sans", "--font-mono"];
202
+ /**
203
+ * Variables whose toolkit value is the same in light and dark (theme.css
204
+ * declares them once, or identically in both modes). A theme's LIGHT value for
205
+ * one of these also applies in dark mode — a brand's button colour, radius or
206
+ * font does not change with the mode. Every other variable (surfaces, text,
207
+ * links, focus, status tones) takes its dark value from the theme's `dark`
208
+ * tokens or, failing that, from the toolkit's dark defaults — never from the
209
+ * light value, which would put light surfaces into a dark scope.
210
+ * Pinned against theme.css by `theme-css.test.ts`.
211
+ */
212
+ export declare const MODE_INVARIANT_VARS: ReadonlySet<CssVarName>;
71
213
  /** A serializable map of CSS custom properties (`--primary` → value). */
72
214
  export type ThemeVars = Record<CssVarName, string>;
73
215
  /**
@@ -80,14 +222,18 @@ export type ThemeVars = Record<CssVarName, string>;
80
222
  * logged, or persisted and rehydrated.
81
223
  */
82
224
  export interface ThemeDefinition {
83
- /** CSS variables applied at the theme scope (overrides `:root`). */
225
+ /** CSS variables applied at the theme scope in light mode (overrides `:root`). */
84
226
  vars: ThemeVars;
85
- /** Dark-mode CSS variables, applied under `.dark` at the theme scope. */
227
+ /** Dark-mode CSS variables, applied at the theme scope in dark mode. */
86
228
  darkVars?: ThemeVars;
87
229
  /**
88
- * The light {@link vars} as a React `style` object (CSS custom properties are
89
- * valid `CSSProperties` keys). Handy for inlining onto a wrapper element
90
- * without the {@link ThemeProvider}.
230
+ * The theme's light-mode variables as a React `style` object (CSS custom
231
+ * properties are valid `CSSProperties` keys): exactly what
232
+ * {@link ThemeProvider} applies in light mode, i.e.
233
+ * {@link resolveThemeVars}`(theme, "light")` — {@link vars} plus the values
234
+ * derived from the legacy knobs (sm/md/lg from `radius`, …). Handy for
235
+ * inlining onto a wrapper element without the provider; for dark mode use
236
+ * {@link resolveThemeVars}`(theme, "dark")`.
91
237
  */
92
238
  toStyle(): CSSProperties;
93
239
  }
@@ -100,31 +246,42 @@ export declare function tokensToVars(tokens: ThemeTokens): ThemeVars;
100
246
  /** Options for {@link createTheme}. */
101
247
  export interface CreateThemeOptions {
102
248
  /**
103
- * Dark-mode token overrides. Applied on top of the toolkit's `.dark` defaults
104
- * when the active mode is dark (see {@link ThemeProvider}). Provide only the
105
- * tokens that differ from light — typically a darker `background`/`card` and a
106
- * brighter `primary`.
249
+ * Dark-mode token overrides. In dark mode a theme scope gets the toolkit's
250
+ * dark defaults, the theme's mode-invariant light tokens (brand button
251
+ * colour, radii, fonts — see {@link MODE_INVARIANT_VARS}) and these. Provide
252
+ * what differs in dark — typically `background`, `card`, `link`.
107
253
  */
108
254
  dark?: ThemeTokens;
109
255
  }
110
256
  /**
111
- * Build a serializable {@link ThemeDefinition} from a curated set of brand
257
+ * Build a serializable {@link ThemeDefinition} from a set of brand
112
258
  * {@link ThemeTokens}. This is the one switch a white-label client flips: pass
113
- * your brand's primary colour, radius, and (optionally) dark overrides, and
114
- * every toolkit primitive that reads the design tokens — `Card`, `Button`,
115
- * `Badge`, `bg-card`, `text-primary`, `rounded-lg` — re-skins to match.
259
+ * the brand's roles (and, optionally, dark overrides), and every toolkit
260
+ * primitive that reads the role tokens — `Card`, `Button`, `Badge`, `bg-card`,
261
+ * `text-link`, `rounded-md` — re-skins to match. Without a theme the toolkit
262
+ * renders in the Miragon theme.
116
263
  *
117
264
  * Pure and side-effect-free: it only maps fields to CSS-variable names. Apply
118
265
  * the result with {@link ThemeProvider} (recommended) or by spreading
119
- * `theme.toStyle()` onto a wrapper element.
266
+ * {@link resolveThemeVars}`(theme, mode)` onto a wrapper element.
120
267
  *
121
268
  * @example
122
269
  * const brand = createTheme(
123
- * { primary: "oklch(0.55 0.2 264)", radius: "0.5rem" },
124
- * { dark: { primary: "oklch(0.7 0.18 264)" } },
270
+ * { primary: "#0f766e", link: "#0f766e", focus: "#0f766e", radiusMd: "6px" },
271
+ * { dark: { link: "#5eead4", focus: "#5eead4" } },
125
272
  * )
126
273
  * // <ThemeProvider theme={brand}>…</ThemeProvider>
127
274
  */
128
275
  export declare function createTheme(tokens: ThemeTokens, opts?: CreateThemeOptions): ThemeDefinition;
276
+ /**
277
+ * The CSS variables a theme applies at its scope in `mode`. Light mode: the
278
+ * theme's `vars`. Dark mode: its mode-invariant light vars plus its `darkVars`
279
+ * — never the other light vars, which would beat the toolkit's dark defaults
280
+ * (mcp-toolkit#178 N35). Both modes add what the legacy knobs derive (a base
281
+ * `--radius` → sm/md/lg; `--primary` → hover and link; `--ring` → focus)
282
+ * where the theme does not set those roles itself.
283
+ * `null`/`undefined` yields `{}` (the toolkit defaults apply).
284
+ */
285
+ export declare function resolveThemeVars(theme: ThemeDefinition | null | undefined, mode: "light" | "dark"): ThemeVars;
129
286
  export {};
130
287
  //# sourceMappingURL=create-theme.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-theme.d.ts","sourceRoot":"","sources":["../../src/theme/create-theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAE1C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,WAAW;IAC1B,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,+EAA+E;IAC/E,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,4EAA4E;AAC5E,KAAK,UAAU,GAAG,KAAK,MAAM,EAAE,CAAA;AAE/B;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;CAc6B,CAAA;AAE1D,yEAAyE;AACzE,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;AAElD;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,IAAI,EAAE,SAAS,CAAA;IACf,yEAAyE;IACzE,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB;;;;OAIG;IACH,OAAO,IAAI,aAAa,CAAA;CACzB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAY3D;AAED,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,IAAI,CAAC,EAAE,WAAW,CAAA;CACnB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,eAAe,CAU3F"}
1
+ {"version":3,"file":"create-theme.d.ts","sourceRoot":"","sources":["../../src/theme/create-theme.ts"],"names":[],"mappings":"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"}
@@ -1,24 +1,142 @@
1
1
  /**
2
- * The single source of truth mapping each curated {@link ThemeTokens} field to
3
- * its real CSS variable name from `globals.css`. `tokensToVars` walks this map,
4
- * so adding a field here (and to {@link ThemeTokens}) is all that is needed to
5
- * extend the public theming surface.
2
+ * The single source of truth mapping each {@link ThemeTokens} field to its real
3
+ * CSS variable name in `theme.css`. `tokensToVars` walks this map, so adding a
4
+ * field here (and to {@link ThemeTokens}) is all that is needed to extend the
5
+ * public theming surface.
6
6
  */
7
7
  export const TOKEN_TO_CSS_VAR = {
8
8
  primary: "--primary",
9
9
  primaryForeground: "--primary-foreground",
10
+ primaryHover: "--primary-hover",
11
+ link: "--link",
10
12
  accent: "--accent",
11
13
  accentForeground: "--accent-foreground",
12
14
  background: "--background",
13
15
  foreground: "--foreground",
14
16
  card: "--card",
15
17
  cardForeground: "--card-foreground",
18
+ popover: "--popover",
19
+ muted: "--muted",
20
+ mutedForeground: "--muted-foreground",
21
+ secondary: "--secondary",
16
22
  border: "--border",
23
+ input: "--input",
17
24
  ring: "--ring",
25
+ focus: "--focus",
26
+ destructive: "--destructive",
27
+ destructiveForeground: "--destructive-foreground",
28
+ success: "--success",
29
+ successSoft: "--success-soft",
30
+ successInk: "--success-ink",
31
+ warning: "--warning",
32
+ warningSoft: "--warning-soft",
33
+ warningInk: "--warning-ink",
34
+ danger: "--danger",
35
+ dangerSoft: "--danger-soft",
36
+ dangerInk: "--danger-ink",
37
+ info: "--info",
38
+ infoSoft: "--info-soft",
39
+ infoInk: "--info-ink",
18
40
  radius: "--radius",
41
+ radiusSm: "--radius-sm",
42
+ radiusMd: "--radius-md",
43
+ radiusLg: "--radius-lg",
44
+ radiusPill: "--radius-pill",
45
+ shadow1: "--shadow-1",
46
+ shadow2: "--shadow-2",
47
+ shadow3: "--shadow-3",
48
+ scrim: "--scrim",
49
+ motionFast: "--motion-fast",
50
+ motionBase: "--motion-base",
51
+ motionSlow: "--motion-slow",
52
+ ease: "--ease",
19
53
  fontSans: "--font-sans",
54
+ fontMono: "--font-mono",
20
55
  fontHeading: "--font-heading",
21
56
  };
57
+ /**
58
+ * The role-token contract: every variable the toolkit defines for components
59
+ * to use (`theme.css`), in light and — for colours — dark. Components in this
60
+ * package, and in apps built on it, style through these names only, never
61
+ * through raw colours or Tailwind palette classes.
62
+ */
63
+ export const ROLE_TOKENS = [
64
+ "--background",
65
+ "--card",
66
+ "--popover",
67
+ "--muted",
68
+ "--secondary",
69
+ "--foreground",
70
+ "--muted-foreground",
71
+ "--border",
72
+ "--input",
73
+ "--primary",
74
+ "--primary-foreground",
75
+ "--primary-hover",
76
+ "--link",
77
+ "--ring",
78
+ "--focus",
79
+ "--success",
80
+ "--warning",
81
+ "--danger",
82
+ "--info",
83
+ "--success-soft",
84
+ "--warning-soft",
85
+ "--danger-soft",
86
+ "--info-soft",
87
+ "--success-ink",
88
+ "--warning-ink",
89
+ "--danger-ink",
90
+ "--info-ink",
91
+ "--destructive",
92
+ "--radius-sm",
93
+ "--radius-md",
94
+ "--radius-lg",
95
+ "--radius-pill",
96
+ "--shadow-1",
97
+ "--shadow-2",
98
+ "--shadow-3",
99
+ "--scrim",
100
+ "--motion-fast",
101
+ "--motion-base",
102
+ "--motion-slow",
103
+ "--ease",
104
+ "--font-sans",
105
+ "--font-mono",
106
+ ];
107
+ /**
108
+ * Variables whose toolkit value is the same in light and dark (theme.css
109
+ * declares them once, or identically in both modes). A theme's LIGHT value for
110
+ * one of these also applies in dark mode — a brand's button colour, radius or
111
+ * font does not change with the mode. Every other variable (surfaces, text,
112
+ * links, focus, status tones) takes its dark value from the theme's `dark`
113
+ * tokens or, failing that, from the toolkit's dark defaults — never from the
114
+ * light value, which would put light surfaces into a dark scope.
115
+ * Pinned against theme.css by `theme-css.test.ts`.
116
+ */
117
+ export const MODE_INVARIANT_VARS = new Set([
118
+ "--primary",
119
+ "--primary-foreground",
120
+ "--primary-hover",
121
+ "--destructive",
122
+ "--destructive-foreground",
123
+ "--input",
124
+ "--radius",
125
+ "--radius-sm",
126
+ "--radius-md",
127
+ "--radius-lg",
128
+ "--radius-pill",
129
+ "--shadow-1",
130
+ "--shadow-2",
131
+ "--shadow-3",
132
+ "--motion-fast",
133
+ "--motion-base",
134
+ "--motion-slow",
135
+ "--ease",
136
+ "--font-sans",
137
+ "--font-mono",
138
+ "--font-heading",
139
+ ]);
22
140
  /**
23
141
  * Map a {@link ThemeTokens} object to its CSS variables. Empty/partial token
24
142
  * objects yield only the variables that were set; fields not present in
@@ -35,20 +153,21 @@ export function tokensToVars(tokens) {
35
153
  return vars;
36
154
  }
37
155
  /**
38
- * Build a serializable {@link ThemeDefinition} from a curated set of brand
156
+ * Build a serializable {@link ThemeDefinition} from a set of brand
39
157
  * {@link ThemeTokens}. This is the one switch a white-label client flips: pass
40
- * your brand's primary colour, radius, and (optionally) dark overrides, and
41
- * every toolkit primitive that reads the design tokens — `Card`, `Button`,
42
- * `Badge`, `bg-card`, `text-primary`, `rounded-lg` — re-skins to match.
158
+ * the brand's roles (and, optionally, dark overrides), and every toolkit
159
+ * primitive that reads the role tokens — `Card`, `Button`, `Badge`, `bg-card`,
160
+ * `text-link`, `rounded-md` — re-skins to match. Without a theme the toolkit
161
+ * renders in the Miragon theme.
43
162
  *
44
163
  * Pure and side-effect-free: it only maps fields to CSS-variable names. Apply
45
164
  * the result with {@link ThemeProvider} (recommended) or by spreading
46
- * `theme.toStyle()` onto a wrapper element.
165
+ * {@link resolveThemeVars}`(theme, mode)` onto a wrapper element.
47
166
  *
48
167
  * @example
49
168
  * const brand = createTheme(
50
- * { primary: "oklch(0.55 0.2 264)", radius: "0.5rem" },
51
- * { dark: { primary: "oklch(0.7 0.18 264)" } },
169
+ * { primary: "#0f766e", link: "#0f766e", focus: "#0f766e", radiusMd: "6px" },
170
+ * { dark: { link: "#5eead4", focus: "#5eead4" } },
52
171
  * )
53
172
  * // <ThemeProvider theme={brand}>…</ThemeProvider>
54
173
  */
@@ -56,10 +175,67 @@ export function createTheme(tokens, opts) {
56
175
  const vars = tokensToVars(tokens);
57
176
  const darkTokens = opts?.dark;
58
177
  const darkVars = darkTokens ? tokensToVars(darkTokens) : undefined;
59
- return {
178
+ const theme = {
60
179
  vars,
61
180
  ...(darkVars && Object.keys(darkVars).length > 0 ? { darkVars } : {}),
62
- toStyle: () => vars,
181
+ toStyle: () => resolveThemeVars(theme, "light"),
63
182
  };
183
+ return theme;
184
+ }
185
+ /** Whether the theme sets `name` itself, in light or in dark. */
186
+ function declares(theme, name) {
187
+ return name in theme.vars || (theme.darkVars !== undefined && name in theme.darkVars);
188
+ }
189
+ /**
190
+ * Fill the roles a theme written against the pre-role API leaves unset, from
191
+ * the knobs it does set, so it keeps ONE brand instead of half Miragon:
192
+ *
193
+ * - the base `--radius` reshapes the sm/md/lg steps (CI ratio 6 : 12 : 16);
194
+ * - `--primary` gives `--primary-hover` (90 %, the old `bg-primary/90`) and
195
+ * `--link` (the old link button was `text-primary`);
196
+ * - `--ring` gives `--focus` (the old focus ring).
197
+ *
198
+ * A role the theme sets itself — in either mode — is never derived, and an
199
+ * explicit value always wins.
200
+ */
201
+ function withDerivedVars(vars, theme) {
202
+ const derived = {};
203
+ const radius = vars["--radius"];
204
+ if (radius) {
205
+ derived["--radius-sm"] = `calc(${radius} * 0.5)`;
206
+ derived["--radius-md"] = radius;
207
+ derived["--radius-lg"] = `calc(${radius} * 4 / 3)`;
208
+ }
209
+ const primary = vars["--primary"];
210
+ if (primary && !declares(theme, "--primary-hover")) {
211
+ derived["--primary-hover"] = `color-mix(in srgb, ${primary} 90%, transparent)`;
212
+ }
213
+ if (primary && !declares(theme, "--link"))
214
+ derived["--link"] = primary;
215
+ const ring = vars["--ring"];
216
+ if (ring && !declares(theme, "--focus"))
217
+ derived["--focus"] = ring;
218
+ return { ...derived, ...vars };
219
+ }
220
+ /**
221
+ * The CSS variables a theme applies at its scope in `mode`. Light mode: the
222
+ * theme's `vars`. Dark mode: its mode-invariant light vars plus its `darkVars`
223
+ * — never the other light vars, which would beat the toolkit's dark defaults
224
+ * (mcp-toolkit#178 N35). Both modes add what the legacy knobs derive (a base
225
+ * `--radius` → sm/md/lg; `--primary` → hover and link; `--ring` → focus)
226
+ * where the theme does not set those roles itself.
227
+ * `null`/`undefined` yields `{}` (the toolkit defaults apply).
228
+ */
229
+ export function resolveThemeVars(theme, mode) {
230
+ if (!theme)
231
+ return {};
232
+ if (mode === "light")
233
+ return withDerivedVars(theme.vars, theme);
234
+ const carried = {};
235
+ for (const [name, value] of Object.entries(theme.vars)) {
236
+ if (MODE_INVARIANT_VARS.has(name))
237
+ carried[name] = value;
238
+ }
239
+ return withDerivedVars({ ...carried, ...theme.darkVars }, theme);
64
240
  }
65
241
  //# sourceMappingURL=create-theme.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-theme.js","sourceRoot":"","sources":["../../src/theme/create-theme.ts"],"names":[],"mappings":"AAoDA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,OAAO,EAAE,WAAW;IACpB,iBAAiB,EAAE,sBAAsB;IACzC,MAAM,EAAE,UAAU;IAClB,gBAAgB,EAAE,qBAAqB;IACvC,UAAU,EAAE,cAAc;IAC1B,UAAU,EAAE,cAAc;IAC1B,IAAI,EAAE,QAAQ;IACd,cAAc,EAAE,mBAAmB;IACnC,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,UAAU;IAClB,QAAQ,EAAE,aAAa;IACvB,WAAW,EAAE,gBAAgB;CAC2B,CAAA;AA2B1D;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,MAAmB;IAC9C,MAAM,IAAI,GAAc,EAAE,CAAA;IAC1B,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAG1D,EAAE,CAAC;QACJ,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;QAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,CAAA;QACtB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAaD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,WAAW,CAAC,MAAmB,EAAE,IAAyB;IACxE,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACjC,MAAM,UAAU,GAAG,IAAI,EAAE,IAAI,CAAA;IAC7B,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAElE,OAAO;QACL,IAAI;QACJ,GAAG,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI;KACpB,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"create-theme.js","sourceRoot":"","sources":["../../src/theme/create-theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Opt-in Geist delivery by URL. The toolkit's font tokens name "Geist" and
3
+ * "Geist Mono" first but load no font: an app either imports
4
+ * `@miragon/mcp-toolkit-ui/fonts.css` (bundled by the build) or serves the
5
+ * woff2 files itself and declares them with {@link fontFaces}. The second path
6
+ * keeps MCP App views small — the files are fetched once and cached instead of
7
+ * inlined as base64 into every view; allow their origin in the view's CSP
8
+ * `resourceDomains`. Where the fonts never load, the host's font renders (if
9
+ * the host sends one, see `adoptHostFontVariables`), else the system stack.
10
+ */
11
+ /** The latin variable woff2 files, as `@fontsource-variable/geist(-mono)` ship them. */
12
+ export declare const GEIST_FONT_FILES: {
13
+ readonly sans: "geist-latin-wght-normal.woff2";
14
+ readonly mono: "geist-mono-latin-wght-normal.woff2";
15
+ };
16
+ /** Options for {@link fontFaces}. */
17
+ export interface FontFacesOptions {
18
+ /** Where the woff2 files are served from, e.g. `https://mcp.example.com/fonts`. */
19
+ baseUrl: string;
20
+ /** File names under `baseUrl`. Defaults to {@link GEIST_FONT_FILES}. */
21
+ files?: {
22
+ sans?: string;
23
+ mono?: string;
24
+ };
25
+ /** `font-display` strategy. Default `"swap"`: text renders at once in the fallback. */
26
+ display?: "auto" | "block" | "swap" | "fallback" | "optional";
27
+ }
28
+ /**
29
+ * The `@font-face` rules for Geist and Geist Mono (latin, variable weight
30
+ * 100–900) served from `baseUrl`. Pure — inject the string where your app
31
+ * builds its document, e.g. `<style>{fontFaces({ baseUrl })}</style>`.
32
+ *
33
+ * @example
34
+ * fontFaces({ baseUrl: "https://mcp.example.com/fonts" })
35
+ * // @font-face { font-family: "Geist"; … src: url("https://mcp.example.com/fonts/geist-latin-wght-normal.woff2") … }
36
+ */
37
+ export declare function fontFaces({ baseUrl, files, display }: FontFacesOptions): string;
38
+ //# sourceMappingURL=fonts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fonts.d.ts","sourceRoot":"","sources":["../../src/theme/fonts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,wFAAwF;AACxF,eAAO,MAAM,gBAAgB;;;CAGnB,CAAA;AAMV,qCAAqC;AACrC,MAAM,WAAW,gBAAgB;IAC/B,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAA;IACf,wEAAwE;IACxE,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACxC,uFAAuF;IACvF,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAA;CAC9D;AA0BD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAgB,EAAE,EAAE,gBAAgB,GAAG,MAAM,CAOxF"}