@miragon/mcp-toolkit-ui 2.6.0 → 2.8.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 (511) hide show
  1. package/README.md +14 -5
  2. package/dist/app/adapt-data-widget.d.ts +1 -22
  3. package/dist/app/adapt-data-widget.d.ts.map +1 -1
  4. package/dist/app/adapt-data-widget.js +1 -35
  5. package/dist/app/adapt-data-widget.js.map +1 -1
  6. package/dist/app/builder/BuilderBanners.d.ts +7 -2
  7. package/dist/app/builder/BuilderBanners.d.ts.map +1 -1
  8. package/dist/app/builder/BuilderBanners.js +8 -3
  9. package/dist/app/builder/BuilderBanners.js.map +1 -1
  10. package/dist/app/builder/CanvasRow.d.ts +4 -2
  11. package/dist/app/builder/CanvasRow.d.ts.map +1 -1
  12. package/dist/app/builder/CanvasRow.js +29 -17
  13. package/dist/app/builder/CanvasRow.js.map +1 -1
  14. package/dist/app/builder/CatalogueSheet.d.ts.map +1 -1
  15. package/dist/app/builder/CatalogueSheet.js +14 -6
  16. package/dist/app/builder/CatalogueSheet.js.map +1 -1
  17. package/dist/app/builder/CellPropsSheet.d.ts +7 -3
  18. package/dist/app/builder/CellPropsSheet.d.ts.map +1 -1
  19. package/dist/app/builder/CellPropsSheet.js +10 -3
  20. package/dist/app/builder/CellPropsSheet.js.map +1 -1
  21. package/dist/app/builder/DiscardDialog.d.ts +18 -0
  22. package/dist/app/builder/DiscardDialog.d.ts.map +1 -0
  23. package/dist/app/builder/DiscardDialog.js +18 -0
  24. package/dist/app/builder/DiscardDialog.js.map +1 -0
  25. package/dist/app/builder/EmptyHint.d.ts +4 -0
  26. package/dist/app/builder/EmptyHint.d.ts.map +1 -1
  27. package/dist/app/builder/EmptyHint.js +6 -1
  28. package/dist/app/builder/EmptyHint.js.map +1 -1
  29. package/dist/app/builder/LayoutSurface.d.ts +33 -9
  30. package/dist/app/builder/LayoutSurface.d.ts.map +1 -1
  31. package/dist/app/builder/LayoutSurface.js +74 -23
  32. package/dist/app/builder/LayoutSurface.js.map +1 -1
  33. package/dist/app/builder/PipelineStrip.d.ts +5 -2
  34. package/dist/app/builder/PipelineStrip.d.ts.map +1 -1
  35. package/dist/app/builder/PipelineStrip.js +33 -15
  36. package/dist/app/builder/PipelineStrip.js.map +1 -1
  37. package/dist/app/builder/SaveDialog.d.ts +9 -1
  38. package/dist/app/builder/SaveDialog.d.ts.map +1 -1
  39. package/dist/app/builder/SaveDialog.js +9 -3
  40. package/dist/app/builder/SaveDialog.js.map +1 -1
  41. package/dist/app/builder/Toolbar.d.ts +14 -4
  42. package/dist/app/builder/Toolbar.d.ts.map +1 -1
  43. package/dist/app/builder/Toolbar.js +24 -7
  44. package/dist/app/builder/Toolbar.js.map +1 -1
  45. package/dist/app/builder/Workspace.d.ts +23 -3
  46. package/dist/app/builder/Workspace.d.ts.map +1 -1
  47. package/dist/app/builder/Workspace.js +58 -8
  48. package/dist/app/builder/Workspace.js.map +1 -1
  49. package/dist/app/builder/builder-model.d.ts +146 -3
  50. package/dist/app/builder/builder-model.d.ts.map +1 -1
  51. package/dist/app/builder/builder-model.js +196 -5
  52. package/dist/app/builder/builder-model.js.map +1 -1
  53. package/dist/app/builder/labels.d.ts +13 -62
  54. package/dist/app/builder/labels.d.ts.map +1 -1
  55. package/dist/app/builder/labels.js +9 -58
  56. package/dist/app/builder/labels.js.map +1 -1
  57. package/dist/app/builder/reveal.d.ts +10 -0
  58. package/dist/app/builder/reveal.d.ts.map +1 -0
  59. package/dist/app/builder/reveal.js +10 -0
  60. package/dist/app/builder/reveal.js.map +1 -0
  61. package/dist/app/builder/status-chip.d.ts.map +1 -1
  62. package/dist/app/builder/status-chip.js +3 -2
  63. package/dist/app/builder/status-chip.js.map +1 -1
  64. package/dist/app/builder/use-builder-catalogue.d.ts +5 -1
  65. package/dist/app/builder/use-builder-catalogue.d.ts.map +1 -1
  66. package/dist/app/builder/use-builder-catalogue.js +50 -17
  67. package/dist/app/builder/use-builder-catalogue.js.map +1 -1
  68. package/dist/app/builder/use-builder-session.d.ts +30 -0
  69. package/dist/app/builder/use-builder-session.d.ts.map +1 -0
  70. package/dist/app/builder/use-builder-session.js +58 -0
  71. package/dist/app/builder/use-builder-session.js.map +1 -0
  72. package/dist/app/builder/use-display-resolver.d.ts +17 -0
  73. package/dist/app/builder/use-display-resolver.d.ts.map +1 -0
  74. package/dist/app/builder/use-display-resolver.js +16 -0
  75. package/dist/app/builder/use-display-resolver.js.map +1 -0
  76. package/dist/app/builder/use-save-dashboard.d.ts +3 -1
  77. package/dist/app/builder/use-save-dashboard.d.ts.map +1 -1
  78. package/dist/app/builder/use-save-dashboard.js +3 -1
  79. package/dist/app/builder/use-save-dashboard.js.map +1 -1
  80. package/dist/app/index.d.ts +8 -3
  81. package/dist/app/index.d.ts.map +1 -1
  82. package/dist/app/index.js +8 -2
  83. package/dist/app/index.js.map +1 -1
  84. package/dist/app/layout-builder.d.ts +18 -25
  85. package/dist/app/layout-builder.d.ts.map +1 -1
  86. package/dist/app/layout-builder.js +84 -78
  87. package/dist/app/layout-builder.js.map +1 -1
  88. package/dist/app/mcp-app-view-chrome.d.ts +103 -20
  89. package/dist/app/mcp-app-view-chrome.d.ts.map +1 -1
  90. package/dist/app/mcp-app-view-chrome.js +125 -40
  91. package/dist/app/mcp-app-view-chrome.js.map +1 -1
  92. package/dist/app/mcp-app-view-states.d.ts +23 -0
  93. package/dist/app/mcp-app-view-states.d.ts.map +1 -0
  94. package/dist/app/mcp-app-view-states.js +55 -0
  95. package/dist/app/mcp-app-view-states.js.map +1 -0
  96. package/dist/app/mcp-app-view.d.ts +72 -5
  97. package/dist/app/mcp-app-view.d.ts.map +1 -1
  98. package/dist/app/mcp-app-view.js +241 -141
  99. package/dist/app/mcp-app-view.js.map +1 -1
  100. package/dist/app/mcp-toolkit-app.d.ts +8 -2
  101. package/dist/app/mcp-toolkit-app.d.ts.map +1 -1
  102. package/dist/app/mcp-toolkit-app.js +33 -4
  103. package/dist/app/mcp-toolkit-app.js.map +1 -1
  104. package/dist/app/mcp-use-host-bridge.d.ts +15 -6
  105. package/dist/app/mcp-use-host-bridge.d.ts.map +1 -1
  106. package/dist/app/mcp-use-host-bridge.js +51 -22
  107. package/dist/app/mcp-use-host-bridge.js.map +1 -1
  108. package/dist/app/model-context.d.ts +71 -0
  109. package/dist/app/model-context.d.ts.map +1 -0
  110. package/dist/app/model-context.js +101 -0
  111. package/dist/app/model-context.js.map +1 -0
  112. package/dist/app/use-build-mode-focus.d.ts +33 -0
  113. package/dist/app/use-build-mode-focus.d.ts.map +1 -0
  114. package/dist/app/use-build-mode-focus.js +59 -0
  115. package/dist/app/use-build-mode-focus.js.map +1 -0
  116. package/dist/app/use-view-actions.d.ts +31 -0
  117. package/dist/app/use-view-actions.d.ts.map +1 -0
  118. package/dist/app/use-view-actions.js +81 -0
  119. package/dist/app/use-view-actions.js.map +1 -0
  120. package/dist/app/use-view-lifecycle.d.ts +42 -0
  121. package/dist/app/use-view-lifecycle.d.ts.map +1 -0
  122. package/dist/app/use-view-lifecycle.js +81 -0
  123. package/dist/app/use-view-lifecycle.js.map +1 -0
  124. package/dist/app/view-lifecycle.d.ts +185 -0
  125. package/dist/app/view-lifecycle.d.ts.map +1 -0
  126. package/dist/app/view-lifecycle.js +207 -0
  127. package/dist/app/view-lifecycle.js.map +1 -0
  128. package/dist/app/widget-fixture.d.ts +10 -3
  129. package/dist/app/widget-fixture.d.ts.map +1 -1
  130. package/dist/app/widget-fixture.js +21 -8
  131. package/dist/app/widget-fixture.js.map +1 -1
  132. package/dist/app/widget-props-sheet.d.ts +6 -10
  133. package/dist/app/widget-props-sheet.d.ts.map +1 -1
  134. package/dist/app/widget-props-sheet.js +25 -20
  135. package/dist/app/widget-props-sheet.js.map +1 -1
  136. package/dist/app/widget-renderer.d.ts +41 -1
  137. package/dist/app/widget-renderer.d.ts.map +1 -1
  138. package/dist/app/widget-renderer.js +82 -31
  139. package/dist/app/widget-renderer.js.map +1 -1
  140. package/dist/components/DrillButton.d.ts +9 -6
  141. package/dist/components/DrillButton.d.ts.map +1 -1
  142. package/dist/components/DrillButton.js +9 -6
  143. package/dist/components/DrillButton.js.map +1 -1
  144. package/dist/components/EmptyState.d.ts +33 -0
  145. package/dist/components/EmptyState.d.ts.map +1 -0
  146. package/dist/components/EmptyState.js +19 -0
  147. package/dist/components/EmptyState.js.map +1 -0
  148. package/dist/components/ErrorState.d.ts +53 -0
  149. package/dist/components/ErrorState.d.ts.map +1 -0
  150. package/dist/components/ErrorState.js +77 -0
  151. package/dist/components/ErrorState.js.map +1 -0
  152. package/dist/components/FilterBar.d.ts +16 -5
  153. package/dist/components/FilterBar.d.ts.map +1 -1
  154. package/dist/components/FilterBar.js +13 -5
  155. package/dist/components/FilterBar.js.map +1 -1
  156. package/dist/components/GroupCard.d.ts.map +1 -1
  157. package/dist/components/GroupCard.js +2 -1
  158. package/dist/components/GroupCard.js.map +1 -1
  159. package/dist/components/KpiGrid.d.ts +70 -18
  160. package/dist/components/KpiGrid.d.ts.map +1 -1
  161. package/dist/components/KpiGrid.js +112 -23
  162. package/dist/components/KpiGrid.js.map +1 -1
  163. package/dist/components/ListFooter.d.ts +32 -4
  164. package/dist/components/ListFooter.d.ts.map +1 -1
  165. package/dist/components/ListFooter.js +35 -6
  166. package/dist/components/ListFooter.js.map +1 -1
  167. package/dist/components/PagedListFooter.d.ts +57 -0
  168. package/dist/components/PagedListFooter.d.ts.map +1 -0
  169. package/dist/components/PagedListFooter.js +27 -0
  170. package/dist/components/PagedListFooter.js.map +1 -0
  171. package/dist/components/Pills.d.ts +36 -12
  172. package/dist/components/Pills.d.ts.map +1 -1
  173. package/dist/components/Pills.js +29 -8
  174. package/dist/components/Pills.js.map +1 -1
  175. package/dist/components/SectionHeading.d.ts +3 -1
  176. package/dist/components/SectionHeading.d.ts.map +1 -1
  177. package/dist/components/SectionHeading.js +6 -2
  178. package/dist/components/SectionHeading.js.map +1 -1
  179. package/dist/components/Toast.d.ts +43 -0
  180. package/dist/components/Toast.d.ts.map +1 -0
  181. package/dist/components/Toast.js +106 -0
  182. package/dist/components/Toast.js.map +1 -0
  183. package/dist/components/WidgetHeader.d.ts +34 -10
  184. package/dist/components/WidgetHeader.d.ts.map +1 -1
  185. package/dist/components/WidgetHeader.js +11 -6
  186. package/dist/components/WidgetHeader.js.map +1 -1
  187. package/dist/hooks/index.d.ts +4 -4
  188. package/dist/hooks/index.d.ts.map +1 -1
  189. package/dist/hooks/index.js +1 -1
  190. package/dist/hooks/index.js.map +1 -1
  191. package/dist/hooks/tool-result-recovery-model.d.ts +155 -0
  192. package/dist/hooks/tool-result-recovery-model.d.ts.map +1 -0
  193. package/dist/hooks/tool-result-recovery-model.js +273 -0
  194. package/dist/hooks/tool-result-recovery-model.js.map +1 -0
  195. package/dist/hooks/use-tool-query.d.ts +56 -14
  196. package/dist/hooks/use-tool-query.d.ts.map +1 -1
  197. package/dist/hooks/use-tool-query.js +102 -25
  198. package/dist/hooks/use-tool-query.js.map +1 -1
  199. package/dist/hooks/use-tool-result-recovery.d.ts +61 -44
  200. package/dist/hooks/use-tool-result-recovery.d.ts.map +1 -1
  201. package/dist/hooks/use-tool-result-recovery.js +62 -110
  202. package/dist/hooks/use-tool-result-recovery.js.map +1 -1
  203. package/dist/hooks/use-view-data.d.ts +55 -7
  204. package/dist/hooks/use-view-data.d.ts.map +1 -1
  205. package/dist/hooks/use-view-data.js +81 -11
  206. package/dist/hooks/use-view-data.js.map +1 -1
  207. package/dist/hooks/use-view-tool-query.d.ts +12 -7
  208. package/dist/hooks/use-view-tool-query.d.ts.map +1 -1
  209. package/dist/hooks/use-view-tool-query.js +15 -14
  210. package/dist/hooks/use-view-tool-query.js.map +1 -1
  211. package/dist/index.d.ts +27 -13
  212. package/dist/index.d.ts.map +1 -1
  213. package/dist/index.js +29 -7
  214. package/dist/index.js.map +1 -1
  215. package/dist/lib/focus-return.d.ts +61 -0
  216. package/dist/lib/focus-return.d.ts.map +1 -0
  217. package/dist/lib/focus-return.js +46 -0
  218. package/dist/lib/focus-return.js.map +1 -0
  219. package/dist/lib/focus-ring.d.ts +18 -0
  220. package/dist/lib/focus-ring.d.ts.map +1 -0
  221. package/dist/lib/focus-ring.js +18 -0
  222. package/dist/lib/focus-ring.js.map +1 -0
  223. package/dist/lib/icon-stroke.d.ts +12 -0
  224. package/dist/lib/icon-stroke.d.ts.map +1 -0
  225. package/dist/lib/icon-stroke.js +12 -0
  226. package/dist/lib/icon-stroke.js.map +1 -0
  227. package/dist/lib/parse-tool-result.d.ts +23 -1
  228. package/dist/lib/parse-tool-result.d.ts.map +1 -1
  229. package/dist/lib/parse-tool-result.js +38 -2
  230. package/dist/lib/parse-tool-result.js.map +1 -1
  231. package/dist/lib/toast-model.d.ts +86 -0
  232. package/dist/lib/toast-model.d.ts.map +1 -0
  233. package/dist/lib/toast-model.js +102 -0
  234. package/dist/lib/toast-model.js.map +1 -0
  235. package/dist/lib/tone-utils.d.ts +95 -9
  236. package/dist/lib/tone-utils.d.ts.map +1 -1
  237. package/dist/lib/tone-utils.js +100 -9
  238. package/dist/lib/tone-utils.js.map +1 -1
  239. package/dist/lib/tool-query.d.ts +107 -0
  240. package/dist/lib/tool-query.d.ts.map +1 -0
  241. package/dist/lib/tool-query.js +182 -0
  242. package/dist/lib/tool-query.js.map +1 -0
  243. package/dist/lib/tool-result-observer.d.ts +108 -0
  244. package/dist/lib/tool-result-observer.d.ts.map +1 -0
  245. package/dist/lib/tool-result-observer.js +158 -0
  246. package/dist/lib/tool-result-observer.js.map +1 -0
  247. package/dist/lib/typography.d.ts +37 -0
  248. package/dist/lib/typography.d.ts.map +1 -0
  249. package/dist/lib/typography.js +41 -0
  250. package/dist/lib/typography.js.map +1 -0
  251. package/dist/lib/utils.d.ts.map +1 -1
  252. package/dist/lib/utils.js +11 -1
  253. package/dist/lib/utils.js.map +1 -1
  254. package/dist/locale/index.d.ts +3 -1
  255. package/dist/locale/index.d.ts.map +1 -1
  256. package/dist/locale/index.js +2 -1
  257. package/dist/locale/index.js.map +1 -1
  258. package/dist/locale/locale-provider.d.ts +42 -1
  259. package/dist/locale/locale-provider.d.ts.map +1 -1
  260. package/dist/locale/locale-provider.js +44 -3
  261. package/dist/locale/locale-provider.js.map +1 -1
  262. package/dist/locale/message-types.d.ts +336 -0
  263. package/dist/locale/message-types.d.ts.map +1 -0
  264. package/dist/locale/message-types.js +7 -0
  265. package/dist/locale/message-types.js.map +1 -0
  266. package/dist/locale/messages-de.d.ts +9 -0
  267. package/dist/locale/messages-de.d.ts.map +1 -0
  268. package/dist/locale/messages-de.js +185 -0
  269. package/dist/locale/messages-de.js.map +1 -0
  270. package/dist/locale/messages-en.d.ts +8 -0
  271. package/dist/locale/messages-en.d.ts.map +1 -0
  272. package/dist/locale/messages-en.js +184 -0
  273. package/dist/locale/messages-en.js.map +1 -0
  274. package/dist/locale/toolkit-messages.d.ts +57 -0
  275. package/dist/locale/toolkit-messages.d.ts.map +1 -0
  276. package/dist/locale/toolkit-messages.js +103 -0
  277. package/dist/locale/toolkit-messages.js.map +1 -0
  278. package/dist/primitives/alert.d.ts +1 -1
  279. package/dist/primitives/alert.d.ts.map +1 -1
  280. package/dist/primitives/alert.js +6 -2
  281. package/dist/primitives/alert.js.map +1 -1
  282. package/dist/primitives/badge.d.ts +1 -1
  283. package/dist/primitives/badge.d.ts.map +1 -1
  284. package/dist/primitives/badge.js +19 -6
  285. package/dist/primitives/badge.js.map +1 -1
  286. package/dist/primitives/button.d.ts +1 -1
  287. package/dist/primitives/button.d.ts.map +1 -1
  288. package/dist/primitives/button.js +12 -8
  289. package/dist/primitives/button.js.map +1 -1
  290. package/dist/primitives/card.js +4 -4
  291. package/dist/primitives/card.js.map +1 -1
  292. package/dist/primitives/dialog.d.ts +7 -3
  293. package/dist/primitives/dialog.d.ts.map +1 -1
  294. package/dist/primitives/dialog.js +22 -8
  295. package/dist/primitives/dialog.js.map +1 -1
  296. package/dist/primitives/input.d.ts.map +1 -1
  297. package/dist/primitives/input.js +4 -1
  298. package/dist/primitives/input.js.map +1 -1
  299. package/dist/primitives/scroll-area.js +1 -1
  300. package/dist/primitives/scroll-area.js.map +1 -1
  301. package/dist/primitives/select.d.ts.map +1 -1
  302. package/dist/primitives/select.js +6 -3
  303. package/dist/primitives/select.js.map +1 -1
  304. package/dist/primitives/sheet.d.ts +3 -1
  305. package/dist/primitives/sheet.d.ts.map +1 -1
  306. package/dist/primitives/sheet.js +17 -7
  307. package/dist/primitives/sheet.js.map +1 -1
  308. package/dist/primitives/skeleton.js +1 -1
  309. package/dist/primitives/skeleton.js.map +1 -1
  310. package/dist/primitives/switch.d.ts.map +1 -1
  311. package/dist/primitives/switch.js +2 -1
  312. package/dist/primitives/switch.js.map +1 -1
  313. package/dist/primitives/tabs.d.ts.map +1 -1
  314. package/dist/primitives/tabs.js +5 -3
  315. package/dist/primitives/tabs.js.map +1 -1
  316. package/dist/providers/query-provider.d.ts +32 -1
  317. package/dist/providers/query-provider.d.ts.map +1 -1
  318. package/dist/providers/query-provider.js +53 -4
  319. package/dist/providers/query-provider.js.map +1 -1
  320. package/dist/render-cases-primitives.js +1 -1
  321. package/dist/render-cases-primitives.js.map +1 -1
  322. package/dist/render-cases.d.ts.map +1 -1
  323. package/dist/render-cases.js +48 -6
  324. package/dist/render-cases.js.map +1 -1
  325. package/dist/render-effects.d.ts +42 -0
  326. package/dist/render-effects.d.ts.map +1 -0
  327. package/dist/render-effects.js +81 -0
  328. package/dist/render-effects.js.map +1 -0
  329. package/dist/render-scan.d.ts +25 -0
  330. package/dist/render-scan.d.ts.map +1 -0
  331. package/dist/render-scan.js +66 -0
  332. package/dist/render-scan.js.map +1 -0
  333. package/dist/theme/cd-tokens.d.ts +66 -0
  334. package/dist/theme/cd-tokens.d.ts.map +1 -0
  335. package/dist/theme/cd-tokens.js +64 -0
  336. package/dist/theme/cd-tokens.js.map +1 -0
  337. package/dist/theme/create-theme.d.ts +214 -39
  338. package/dist/theme/create-theme.d.ts.map +1 -1
  339. package/dist/theme/create-theme.js +204 -13
  340. package/dist/theme/create-theme.js.map +1 -1
  341. package/dist/theme/fonts.d.ts +38 -0
  342. package/dist/theme/fonts.d.ts.map +1 -0
  343. package/dist/theme/fonts.js +56 -0
  344. package/dist/theme/fonts.js.map +1 -0
  345. package/dist/theme/host-fonts.d.ts +39 -0
  346. package/dist/theme/host-fonts.d.ts.map +1 -0
  347. package/dist/theme/host-fonts.js +44 -0
  348. package/dist/theme/host-fonts.js.map +1 -0
  349. package/dist/theme/index.d.ts +8 -1
  350. package/dist/theme/index.d.ts.map +1 -1
  351. package/dist/theme/index.js +5 -1
  352. package/dist/theme/index.js.map +1 -1
  353. package/dist/theme/portal-container.d.ts +16 -0
  354. package/dist/theme/portal-container.d.ts.map +1 -0
  355. package/dist/theme/portal-container.js +19 -0
  356. package/dist/theme/portal-container.js.map +1 -0
  357. package/dist/theme/presets.d.ts +24 -9
  358. package/dist/theme/presets.d.ts.map +1 -1
  359. package/dist/theme/presets.js +44 -11
  360. package/dist/theme/presets.js.map +1 -1
  361. package/dist/theme/theme-provider.d.ts +27 -9
  362. package/dist/theme/theme-provider.d.ts.map +1 -1
  363. package/dist/theme/theme-provider.js +42 -20
  364. package/dist/theme/theme-provider.js.map +1 -1
  365. package/package.json +11 -5
  366. package/src/app/adapt-data-widget.tsx +2 -42
  367. package/src/app/builder/BuilderBanners.tsx +26 -13
  368. package/src/app/builder/CanvasRow.tsx +79 -32
  369. package/src/app/builder/CatalogueSheet.tsx +58 -35
  370. package/src/app/builder/CellPropsSheet.tsx +17 -2
  371. package/src/app/builder/DiscardDialog.tsx +59 -0
  372. package/src/app/builder/EmptyHint.tsx +16 -11
  373. package/src/app/builder/LayoutSurface.tsx +207 -67
  374. package/src/app/builder/PipelineStrip.tsx +265 -156
  375. package/src/app/builder/SaveDialog.tsx +25 -14
  376. package/src/app/builder/Toolbar.tsx +154 -57
  377. package/src/app/builder/Workspace.tsx +226 -56
  378. package/src/app/builder/builder-feedback.test.tsx +75 -0
  379. package/src/app/builder/builder-model.test.ts +5 -0
  380. package/src/app/builder/builder-model.ts +346 -6
  381. package/src/app/builder/builder-model.ux.test.ts +456 -0
  382. package/src/app/builder/builder-ux.test.tsx +844 -0
  383. package/src/app/builder/labels.ts +15 -121
  384. package/src/app/builder/reveal.ts +10 -0
  385. package/src/app/builder/status-chip.tsx +8 -4
  386. package/src/app/builder/use-builder-catalogue.ts +62 -19
  387. package/src/app/builder/use-builder-session.ts +68 -0
  388. package/src/app/builder/use-display-resolver.ts +24 -0
  389. package/src/app/builder/use-save-dashboard.ts +5 -0
  390. package/src/app/index.ts +20 -3
  391. package/src/app/layout-builder.tsx +193 -186
  392. package/src/app/mcp-app-view-chrome.test.tsx +487 -14
  393. package/src/app/mcp-app-view-chrome.tsx +328 -100
  394. package/src/app/mcp-app-view-states.tsx +140 -0
  395. package/src/app/mcp-app-view.effects.test.tsx +292 -0
  396. package/src/app/mcp-app-view.test.tsx +478 -0
  397. package/src/app/mcp-app-view.tsx +447 -190
  398. package/src/app/mcp-toolkit-app.test.tsx +40 -0
  399. package/src/app/mcp-toolkit-app.tsx +39 -8
  400. package/src/app/mcp-use-host-bridge.test.tsx +180 -0
  401. package/src/app/mcp-use-host-bridge.tsx +67 -24
  402. package/src/app/model-context.test.tsx +116 -0
  403. package/src/app/model-context.tsx +125 -0
  404. package/src/app/use-build-mode-focus.ts +62 -0
  405. package/src/app/use-view-actions.ts +89 -0
  406. package/src/app/use-view-lifecycle.ts +122 -0
  407. package/src/app/view-lifecycle.test.ts +443 -0
  408. package/src/app/view-lifecycle.ts +334 -0
  409. package/src/app/widget-fixture.effects.test.tsx +51 -0
  410. package/src/app/widget-fixture.render.test.tsx +81 -0
  411. package/src/app/widget-fixture.tsx +34 -11
  412. package/src/app/widget-props-sheet.tsx +67 -39
  413. package/src/app/widget-renderer.render.test.tsx +131 -0
  414. package/src/app/widget-renderer.tsx +136 -38
  415. package/src/components/DrillButton.tsx +24 -10
  416. package/src/components/EmptyState.tsx +83 -0
  417. package/src/components/ErrorState.tsx +204 -0
  418. package/src/components/FilterBar.test.tsx +82 -0
  419. package/src/components/FilterBar.tsx +56 -27
  420. package/src/components/GroupCard.tsx +3 -2
  421. package/src/components/KpiGrid.test.tsx +279 -0
  422. package/src/components/KpiGrid.tsx +329 -91
  423. package/src/components/ListFooter.test.tsx +116 -0
  424. package/src/components/ListFooter.tsx +110 -12
  425. package/src/components/PagedListFooter.test.tsx +140 -0
  426. package/src/components/PagedListFooter.tsx +107 -0
  427. package/src/components/Pills.test.tsx +77 -0
  428. package/src/components/Pills.tsx +78 -16
  429. package/src/components/SectionHeading.tsx +9 -3
  430. package/src/components/Toast.tsx +206 -0
  431. package/src/components/WidgetHeader.test.tsx +78 -0
  432. package/src/components/WidgetHeader.tsx +63 -16
  433. package/src/components/feedback-states.test.tsx +314 -0
  434. package/src/components/tone-figures.test.tsx +58 -0
  435. package/src/fonts.css +19 -0
  436. package/src/globals.css +9 -165
  437. package/src/hooks/index.ts +6 -3
  438. package/src/hooks/tool-result-recovery-model.test.ts +744 -0
  439. package/src/hooks/tool-result-recovery-model.ts +418 -0
  440. package/src/hooks/use-tool-query.effects.test.tsx +205 -0
  441. package/src/hooks/use-tool-query.ts +156 -33
  442. package/src/hooks/use-tool-result-recovery.effects.test.tsx +141 -0
  443. package/src/hooks/use-tool-result-recovery.test.ts +28 -5
  444. package/src/hooks/use-tool-result-recovery.ts +101 -131
  445. package/src/hooks/use-view-data.test.tsx +169 -0
  446. package/src/hooks/use-view-data.ts +131 -10
  447. package/src/hooks/use-view-tool-query.ts +25 -19
  448. package/src/i18n-coverage.test.tsx +425 -0
  449. package/src/index.ts +102 -13
  450. package/src/lib/focus-return.test.ts +288 -0
  451. package/src/lib/focus-return.ts +96 -0
  452. package/src/lib/focus-ring.ts +20 -0
  453. package/src/lib/icon-stroke.test.ts +59 -0
  454. package/src/lib/icon-stroke.ts +13 -0
  455. package/src/lib/parse-tool-result.test.ts +46 -1
  456. package/src/lib/parse-tool-result.ts +40 -2
  457. package/src/lib/toast-model.test.ts +233 -0
  458. package/src/lib/toast-model.ts +165 -0
  459. package/src/lib/tone-utils.test.ts +125 -16
  460. package/src/lib/tone-utils.ts +144 -15
  461. package/src/lib/tool-query.test.ts +569 -0
  462. package/src/lib/tool-query.ts +253 -0
  463. package/src/lib/tool-result-observer.test.ts +296 -0
  464. package/src/lib/tool-result-observer.ts +211 -0
  465. package/src/lib/typography.test.ts +45 -0
  466. package/src/lib/typography.ts +47 -0
  467. package/src/lib/utils.ts +12 -1
  468. package/src/locale/index.ts +14 -1
  469. package/src/locale/locale-provider.test.tsx +87 -0
  470. package/src/locale/locale-provider.tsx +90 -3
  471. package/src/locale/message-types.ts +337 -0
  472. package/src/locale/messages-de.ts +198 -0
  473. package/src/locale/messages-en.ts +196 -0
  474. package/src/locale/toolkit-messages.test.ts +349 -0
  475. package/src/locale/toolkit-messages.ts +143 -0
  476. package/src/no-hardcoded-copy.test.ts +432 -0
  477. package/src/primitives/alert.tsx +7 -2
  478. package/src/primitives/badge.tsx +19 -7
  479. package/src/primitives/button.tsx +13 -8
  480. package/src/primitives/card.tsx +4 -4
  481. package/src/primitives/dialog.tsx +42 -8
  482. package/src/primitives/input.tsx +5 -3
  483. package/src/primitives/scroll-area.tsx +1 -1
  484. package/src/primitives/select.tsx +7 -4
  485. package/src/primitives/sheet.tsx +33 -6
  486. package/src/primitives/skeleton.tsx +1 -1
  487. package/src/primitives/switch.tsx +4 -2
  488. package/src/primitives/tabs.tsx +9 -6
  489. package/src/providers/query-provider.test.tsx +154 -0
  490. package/src/providers/query-provider.tsx +66 -5
  491. package/src/render-cases-primitives.tsx +1 -1
  492. package/src/render-cases.tsx +82 -6
  493. package/src/render-effects.tsx +96 -0
  494. package/src/render-scan.ts +75 -0
  495. package/src/theme/cd-tokens.generated.css +48 -0
  496. package/src/theme/cd-tokens.test.ts +109 -0
  497. package/src/theme/cd-tokens.ts +67 -0
  498. package/src/theme/create-theme.test.ts +253 -5
  499. package/src/theme/create-theme.ts +341 -41
  500. package/src/theme/fonts.test.ts +85 -0
  501. package/src/theme/fonts.ts +72 -0
  502. package/src/theme/host-fonts.test.ts +135 -0
  503. package/src/theme/host-fonts.ts +52 -0
  504. package/src/theme/index.ts +15 -1
  505. package/src/theme/portal-container.ts +20 -0
  506. package/src/theme/presets.ts +44 -11
  507. package/src/theme/theme-css.test.ts +619 -0
  508. package/src/theme/theme-provider.test.tsx +82 -0
  509. package/src/theme/theme-provider.tsx +60 -24
  510. package/src/theme.css +344 -0
  511. package/ui-catalog.json +783 -49
@@ -0,0 +1,82 @@
1
+ /// <reference types="node" />
2
+ // The colours below are a CUSTOMER brand's values (white-label fixtures).
3
+ /* brand-lint-disable */
4
+ import { readFileSync } from "node:fs"
5
+ import { renderToStaticMarkup } from "react-dom/server"
6
+ import { describe, expect, it } from "vitest"
7
+ import { createTheme } from "./create-theme.js"
8
+ import { ThemeProvider, useTheme } from "./theme-provider.js"
9
+
10
+ /**
11
+ * ThemeProvider's scope markup (SSR, the house render path — no jsdom) and the
12
+ * portal-into-scope wiring (#178 N36). Radix renders portal content only after
13
+ * mount, so the overlays themselves cannot be rendered here; the source gate
14
+ * below pins that Dialog, Sheet and Select keep passing the scope's node.
15
+ */
16
+
17
+ const acme = () =>
18
+ createTheme({ primary: "#0f766e", primaryForeground: "#ffffff" }, { dark: { link: "#5eead4" } })
19
+
20
+ describe("ThemeProvider scope", () => {
21
+ it("opens the scope with the empty display:contents portal node, before the children", () => {
22
+ const html = renderToStaticMarkup(
23
+ <ThemeProvider mode="dark" theme={acme()} className="space-y-4 divide-y">
24
+ <p>first</p>
25
+ <p>last</p>
26
+ </ThemeProvider>,
27
+ )
28
+ // The real last child stays :last-child, so space-*/divide-*/last: are unaffected.
29
+ expect(html).toMatch(
30
+ /^<div class="dark [^"]*space-y-4 divide-y" style="[^"]*--primary:#0f766e[^"]*" data-theme-mode="dark"><div data-slot="theme-portal" style="display:contents"><\/div><p>first<\/p><p>last<\/p><\/div>$/,
31
+ )
32
+ })
33
+
34
+ it("re-applies the enclosing theme in a nested provider's own mode", () => {
35
+ function Probe() {
36
+ const { theme, resolvedMode } = useTheme()
37
+ return (
38
+ <i>
39
+ {resolvedMode}:{theme ? "themed" : "none"}
40
+ </i>
41
+ )
42
+ }
43
+ const html = renderToStaticMarkup(
44
+ <ThemeProvider mode="dark" theme={acme()}>
45
+ <ThemeProvider mode="light">
46
+ <Probe />
47
+ </ThemeProvider>
48
+ </ThemeProvider>,
49
+ )
50
+ const inner = /<div class="[^"]*" style="([^"]*)" data-theme-mode="light">/.exec(html)
51
+ // The light island inside the dark brand scope keeps the brand's LIGHT vars
52
+ // and none of its dark ones.
53
+ expect(inner?.[1]).toContain("--primary:#0f766e")
54
+ expect(inner?.[1]).toContain("--primary-foreground:#ffffff")
55
+ expect(inner?.[1]).not.toContain("#5eead4")
56
+ expect(html).toContain("<i>light:themed</i>")
57
+ })
58
+
59
+ it("an explicit theme on a nested provider wins over the enclosing one", () => {
60
+ const other = createTheme({ primary: "#7c2d12" })
61
+ const html = renderToStaticMarkup(
62
+ <ThemeProvider theme={acme()}>
63
+ <ThemeProvider theme={other}>x</ThemeProvider>
64
+ </ThemeProvider>,
65
+ )
66
+ expect(html).toMatch(
67
+ /style="[^"]*--primary:#7c2d12[^"]*" data-theme-mode="light"><div data-slot="theme-portal"[^>]*><\/div>x<\/div>/,
68
+ )
69
+ })
70
+ })
71
+
72
+ describe("overlays portal into the theme scope (source gate, #178 N36)", () => {
73
+ it.each(["dialog", "sheet", "select"])(
74
+ "%s passes the scope's portal node as the container",
75
+ (name) => {
76
+ const src = readFileSync(new URL(`../primitives/${name}.tsx`, import.meta.url), "utf8")
77
+ expect(src).toMatch(/const portalContainer = usePortalContainer\(\)/)
78
+ expect(src).toMatch(/<\w+Primitive\.Portal\b[^>]*container=\{[^}]*\bportalContainer\b[^}]*\}/)
79
+ },
80
+ )
81
+ })
82
+ /* brand-lint-enable */
@@ -7,7 +7,8 @@ import {
7
7
  type CSSProperties,
8
8
  type ReactNode,
9
9
  } from "react"
10
- import type { ThemeDefinition } from "./create-theme.js"
10
+ import { resolveThemeVars, type ThemeDefinition } from "./create-theme.js"
11
+ import { PortalContainerContext } from "./portal-container.js"
11
12
 
12
13
  /**
13
14
  * How the `.dark` class is resolved on the theme scope:
@@ -74,8 +75,11 @@ function useResolvedMode(mode: ThemeMode): "light" | "dark" {
74
75
  /** Props for {@link ThemeProvider}. */
75
76
  export interface ThemeProviderProps {
76
77
  /**
77
- * The white-label theme to apply (from {@link createTheme} or `themePresets`).
78
- * Omit to manage only the light/dark `mode` against the toolkit defaults.
78
+ * The white-label theme to apply (from {@link createTheme}). Omit to keep the
79
+ * theme of the nearest enclosing `ThemeProvider` (re-applied in this
80
+ * provider's mode, so a light island inside a dark branded scope stays on
81
+ * the brand), or, at the top, to manage only the light/dark `mode` against
82
+ * the toolkit defaults (the Miragon theme).
79
83
  */
80
84
  theme?: ThemeDefinition
81
85
  /**
@@ -97,19 +101,34 @@ export interface ThemeProviderProps {
97
101
  /**
98
102
  * Apply a white-label {@link ThemeDefinition} to a subtree. Renders a wrapper
99
103
  * element carrying the theme's CSS variables as inline `style`, so they override
100
- * the `:root` defaults for every descendant — `Card`, `Button`, `bg-card`,
101
- * `text-primary`, and `rounded-lg` all re-skin without touching the widgets.
104
+ * the toolkit's defaults (the Miragon theme) for every descendant — `Card`,
105
+ * `Button`, `bg-card`, `text-link`, and `rounded-md` all re-skin without
106
+ * touching the widgets.
102
107
  *
103
- * Dark mode is handled at the scope: the `.dark` class is toggled on the wrapper
104
- * (not `<html>`) per the resolved {@link ThemeMode}, and the theme's `darkVars`
105
- * are layered on under it. This keeps theming local — two differently themed
108
+ * Dark mode is handled at the scope: the `.dark` class and `data-theme-mode`
109
+ * are set on the wrapper (not `<html>`) per the resolved {@link ThemeMode}. In
110
+ * dark mode the wrapper gets the toolkit's dark roles plus the theme's dark
111
+ * tokens and its mode-invariant light tokens ({@link resolveThemeVars}) — a
112
+ * light surface colour never leaks into a dark scope (mcp-toolkit#178 N35). A
113
+ * light scope inside a dark scope stays light: there, `data-theme-mode="light"`
114
+ * re-declares the toolkit's light roles. A light scope in a light document
115
+ * re-declares nothing and keeps what the document set (a consumer's `:root`
116
+ * brand). A nested provider without `theme` re-applies the enclosing one's
117
+ * theme in its own mode. This keeps theming local — two differently themed
106
118
  * subtrees (e.g. a brand preview gallery) coexist on one page.
107
119
  *
120
+ * Overlays opened inside the scope (Dialog, Sheet, Select) portal into a node
121
+ * within it, so they wear the same theme and mode (#178 N36,
122
+ * {@link usePortalContainer}). That node is the wrapper's FIRST child, an empty
123
+ * `display: contents` element: it draws no box, and `space-*`, `divide-*`,
124
+ * `gap` and `last:` on the wrapper see only your children. Only selectors on
125
+ * the wrapper's first/nth child (`first:`, `odd:`) count it.
126
+ *
108
127
  * Uses only React + the DOM (no `mcp-use/react`), so it ships from the root
109
128
  * barrel and works in a host-free standalone app, a host, or SSR alike.
110
129
  *
111
130
  * @example
112
- * <ThemeProvider theme={themePresets.violet} mode={host.theme ?? "system"}>
131
+ * <ThemeProvider theme={brand} mode={host.theme ?? "system"}>
113
132
  * <YourWidget />
114
133
  * </ThemeProvider>
115
134
  */
@@ -122,31 +141,48 @@ export function ThemeProvider({
122
141
  }: ThemeProviderProps): ReactNode {
123
142
  const resolvedMode = useResolvedMode(mode)
124
143
  const isDark = resolvedMode === "dark"
144
+ const [portalContainer, setPortalContainer] = useState<HTMLElement | null>(null)
145
+ // Without its own theme a nested provider keeps the enclosing one's brand.
146
+ const enclosing = useContext(ThemeContext)
147
+ const activeTheme = theme ?? enclosing?.theme ?? null
125
148
 
126
- // Merge the light vars with the dark overrides only when dark is active, so a
127
- // dark scope gets the brand's dark palette on top of `.dark`'s defaults.
128
- const style = useMemo<CSSProperties>(() => {
129
- if (!theme) return {}
130
- if (isDark && theme.darkVars) {
131
- return { ...theme.vars, ...theme.darkVars }
132
- }
133
- return theme.vars
134
- }, [theme, isDark])
149
+ const style = useMemo<CSSProperties>(
150
+ () => resolveThemeVars(activeTheme, resolvedMode),
151
+ [activeTheme, resolvedMode],
152
+ )
135
153
 
136
154
  const value = useMemo<ThemeContextValue>(
137
- () => ({ theme: theme ?? null, mode, resolvedMode }),
138
- [theme, mode, resolvedMode],
155
+ () => ({ theme: activeTheme, mode, resolvedMode }),
156
+ [activeTheme, mode, resolvedMode],
139
157
  )
140
158
 
141
- const classes = [isDark ? "dark" : undefined, "bg-background text-foreground", className]
159
+ const classes = [
160
+ isDark ? "dark" : undefined,
161
+ "bg-background text-foreground font-sans",
162
+ className,
163
+ ]
142
164
  .filter(Boolean)
143
165
  .join(" ")
144
166
 
167
+ // The portal node OPENS the scope as an empty `display: contents` element:
168
+ // it draws no box, yet overlays portaled into it inherit the scope's
169
+ // variables and its `.dark` / `data-theme-mode`. First, not last: Tailwind's
170
+ // `space-*`/`divide-*` and `last:` target the last child, so a trailing node
171
+ // would hand the real last child a margin or divider it never had.
172
+ const PortalRoot = As === "span" ? "span" : "div"
173
+
145
174
  return (
146
175
  <ThemeContext.Provider value={value}>
147
- <As className={classes} style={style} data-theme-mode={resolvedMode}>
148
- {children}
149
- </As>
176
+ <PortalContainerContext.Provider value={portalContainer}>
177
+ <As className={classes} style={style} data-theme-mode={resolvedMode}>
178
+ <PortalRoot
179
+ ref={setPortalContainer}
180
+ data-slot="theme-portal"
181
+ style={{ display: "contents" }}
182
+ />
183
+ {children}
184
+ </As>
185
+ </PortalContainerContext.Provider>
150
186
  </ThemeContext.Provider>
151
187
  )
152
188
  }
package/src/theme.css ADDED
@@ -0,0 +1,344 @@
1
+ /*
2
+ * @miragon/mcp-toolkit-ui/theme.css — the toolkit's design tokens and base
3
+ * layer, without Tailwind's entry point. `globals.css` is this file plus
4
+ * `@import "tailwindcss"` and the toolkit's `@source`; import THIS file instead
5
+ * when your own stylesheet already imports Tailwind:
6
+ *
7
+ * @import "tailwindcss";
8
+ * @source "../node_modules/@miragon/mcp-toolkit-ui/src";
9
+ * @import "@miragon/mcp-toolkit-ui/theme.css";
10
+ *
11
+ * Three layers (modeler-tool-design §13):
12
+ * 1. `--cd-*` the Miragon corporate-design tokens, vendored unchanged.
13
+ * 2. Roles `--primary`, `--link`, `--focus`, `--<tone>`, `--<tone>-soft`,
14
+ * `--<tone>-ink`, radii, shadows, motion, fonts — light AND dark,
15
+ * each pointing at `--cd-*` only (never at another role, so a
16
+ * role overridden on a scope cannot leave a stale alias behind;
17
+ * the font roles also name the host's font, `--host-font-*`).
18
+ * 3. Utilities Tailwind's `@theme` maps utilities onto the roles.
19
+ * A brand (a customer's, or a host's neutral palette) overrides layer 2 only —
20
+ * see docs/guides/white-labeling.md. Components use role names exclusively.
21
+ */
22
+ @import "tw-animate-css";
23
+ /* Vendort aus Miragon/corporate-identity. Nicht bearbeiten, zum Aktualisieren neu kopieren. */
24
+ @import "./theme/cd-tokens.generated.css";
25
+
26
+ /*
27
+ * Dark mode follows the host: a `.dark` class (the toolkit's ThemeProvider, a
28
+ * shell that mirrors the host theme) or `data-theme="dark"` (what SEP-1865
29
+ * hosts and mcp-use's ThemeProvider write on <html>). `data-theme-mode="light"`
30
+ * marks a forced-light island — a light ThemeProvider, or an always-light
31
+ * surface such as a diagram's paper and its zoom chrome.
32
+ *
33
+ * `dark:` follows the NEAREST mode scope: an element is dark when it sits in a
34
+ * dark scope with no light island in between. The second branch is a dark
35
+ * scope nested in a light island (a dark preview inside a light app); one
36
+ * such re-nesting is supported, which also covers a light island inside it.
37
+ */
38
+ @custom-variant dark (&:is(:is(.dark, [data-theme="dark"], [data-theme-mode="dark"]) *:not([data-theme-mode="light"] *), [data-theme-mode="light"] :is(.dark, [data-theme="dark"], [data-theme-mode="dark"]) *:not([data-theme-mode="light"] :is(.dark, [data-theme="dark"], [data-theme-mode="dark"]) [data-theme-mode="light"] *)));
39
+
40
+ @theme inline {
41
+ --font-heading: var(--font-sans);
42
+ --color-sidebar-ring: var(--sidebar-ring);
43
+ --color-sidebar-border: var(--sidebar-border);
44
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
45
+ --color-sidebar-accent: var(--sidebar-accent);
46
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
47
+ --color-sidebar-primary: var(--sidebar-primary);
48
+ --color-sidebar-foreground: var(--sidebar-foreground);
49
+ --color-sidebar: var(--sidebar);
50
+ --color-chart-5: var(--chart-5);
51
+ --color-chart-4: var(--chart-4);
52
+ --color-chart-3: var(--chart-3);
53
+ --color-chart-2: var(--chart-2);
54
+ --color-chart-1: var(--chart-1);
55
+ --color-ring: var(--ring);
56
+ --color-focus: var(--focus);
57
+ --color-input: var(--input);
58
+ --color-border: var(--border);
59
+ --color-destructive: var(--destructive);
60
+ --color-destructive-foreground: var(--destructive-foreground);
61
+ --color-accent-foreground: var(--accent-foreground);
62
+ --color-accent: var(--accent);
63
+ --color-muted-foreground: var(--muted-foreground);
64
+ --color-muted: var(--muted);
65
+ --color-secondary-foreground: var(--secondary-foreground);
66
+ --color-secondary: var(--secondary);
67
+ --color-primary-foreground: var(--primary-foreground);
68
+ --color-primary-hover: var(--primary-hover);
69
+ --color-primary: var(--primary);
70
+ --color-link: var(--link);
71
+ --color-popover-foreground: var(--popover-foreground);
72
+ --color-popover: var(--popover);
73
+ --color-card-foreground: var(--card-foreground);
74
+ --color-card: var(--card);
75
+ --color-foreground: var(--foreground);
76
+ --color-background: var(--background);
77
+ --color-scrim: var(--scrim);
78
+ /* Status tones — three roles each (CI §3.3): the colour itself for fills,
79
+ dots, borders and icons (`bg-danger`, `border-danger`); a tint for
80
+ surfaces (`bg-danger-soft`, the text on it is the foreground); and the
81
+ TEXT colour of a tone on a plain surface (`text-danger-ink`, e.g. a
82
+ field error). Success and warning reach only 1.67:1 / 1.83:1 on white,
83
+ so their ink is the foreground. Figures never take a tone colour. */
84
+ --color-danger: var(--danger);
85
+ --color-danger-soft: var(--danger-soft);
86
+ --color-danger-ink: var(--danger-ink);
87
+ --color-warning: var(--warning);
88
+ --color-warning-soft: var(--warning-soft);
89
+ --color-warning-ink: var(--warning-ink);
90
+ --color-success: var(--success);
91
+ --color-success-soft: var(--success-soft);
92
+ --color-success-ink: var(--success-ink);
93
+ --color-info: var(--info);
94
+ --color-info-soft: var(--info-soft);
95
+ --color-info-ink: var(--info-ink);
96
+ /* Larger legacy steps keep deriving from the base `--radius`. */
97
+ --radius-xl: calc(var(--radius) * 1.4);
98
+ --radius-2xl: calc(var(--radius) * 1.8);
99
+ --radius-3xl: calc(var(--radius) * 2.2);
100
+ --radius-4xl: calc(var(--radius) * 2.6);
101
+ --default-transition-duration: var(--motion-fast);
102
+ --default-transition-timing-function: var(--ease);
103
+ }
104
+
105
+ /* Utilities whose role carries the utility's own name (`rounded-md` →
106
+ `var(--radius-md)`, `shadow-2` → `var(--shadow-2)`, `font-mono` →
107
+ `var(--font-mono)`). `reference` keeps Tailwind from emitting the
108
+ self-referencing theme variable; the roles below define the values.
109
+ The type scale works the same way: `text-small` sets the font size, line
110
+ height and weight of the `--text-small` role. */
111
+ @theme inline reference {
112
+ --text-title: var(--text-title);
113
+ --text-title--line-height: var(--text-title--line-height);
114
+ --text-title--font-weight: var(--text-title--font-weight);
115
+ --text-section: var(--text-section);
116
+ --text-section--line-height: var(--text-section--line-height);
117
+ --text-section--font-weight: var(--text-section--font-weight);
118
+ --text-body: var(--text-body);
119
+ --text-body--line-height: var(--text-body--line-height);
120
+ --text-dense: var(--text-dense);
121
+ --text-dense--line-height: var(--text-dense--line-height);
122
+ --text-small: var(--text-small);
123
+ --text-small--line-height: var(--text-small--line-height);
124
+ --radius-sm: var(--radius-sm);
125
+ --radius-md: var(--radius-md);
126
+ --radius-lg: var(--radius-lg);
127
+ --radius-pill: var(--radius-pill);
128
+ --shadow-1: var(--shadow-1);
129
+ --shadow-2: var(--shadow-2);
130
+ --shadow-3: var(--shadow-3);
131
+ --font-sans: var(--font-sans);
132
+ --font-mono: var(--font-mono);
133
+ }
134
+
135
+ /* ── Mode-independent roles ───────────────────────────────────────────────── */
136
+ :root {
137
+ --radius: var(--cd-radius-md);
138
+ --radius-sm: var(--cd-radius-sm);
139
+ --radius-md: var(--cd-radius-md);
140
+ --radius-lg: var(--cd-radius-lg);
141
+ --radius-pill: var(--cd-radius-pill);
142
+ --shadow-1: var(--cd-shadow-1);
143
+ --shadow-2: var(--cd-shadow-2);
144
+ --shadow-3: var(--cd-shadow-3);
145
+ --motion-fast: var(--cd-motion-fast);
146
+ --motion-base: var(--cd-motion-base);
147
+ --motion-slow: var(--cd-motion-slow);
148
+ --ease: var(--cd-ease);
149
+ /* Type scale (modeler-tool-design §4, adapted for embedded widgets: the
150
+ page title is the CI h2, dense tables keep 14 px as the documented
151
+ product exception). 13 px is the floor: nothing renders smaller. In rem,
152
+ so a reader's font-size setting scales it. */
153
+ --text-title: 1.75rem; /* 28px */
154
+ --text-title--line-height: 1.2;
155
+ --text-title--font-weight: 700;
156
+ --text-section: 1.3125rem; /* 21px */
157
+ --text-section--line-height: 1.3;
158
+ --text-section--font-weight: 600;
159
+ --text-body: 1rem; /* 16px */
160
+ --text-body--line-height: 1.6;
161
+ --text-dense: 0.875rem; /* 14px */
162
+ --text-dense--line-height: 1.5;
163
+ --text-small: 0.8125rem; /* 13px */
164
+ --text-small--line-height: 1.5;
165
+ /* Geist first, then the host's font, then the system stack. Loading Geist
166
+ is opt-in (fonts.css or fontFaces()); where it is not loaded the next
167
+ family renders. A SEP-1865 host sends its font as --font-sans and
168
+ --font-mono, the same names as these roles: McpToolkitApp moves it to
169
+ --host-font-sans / --host-font-mono (adoptHostFontVariables), so it
170
+ fills the fallback slot instead of replacing the whole stack. A brand
171
+ sets --font-sans itself. */
172
+ --font-sans:
173
+ "Geist", "Geist Variable", var(--host-font-sans, ui-sans-serif), system-ui, sans-serif;
174
+ --font-mono:
175
+ "Geist Mono", "Geist Mono Variable", var(--host-font-mono, ui-monospace), SFMono-Regular, Menlo,
176
+ Consolas, monospace;
177
+ }
178
+
179
+ /* ── Light roles ──────────────────────────────────────────────────────────── */
180
+ /* Re-declared on a forced-light island only where it sits inside a dark
181
+ scope, so it stays light there. A light scope in a light document
182
+ re-declares nothing and inherits what the document set, a consumer's
183
+ `:root` brand included. `:where()` keeps the island selector at (0,1,0):
184
+ a brand rule on `[data-theme-mode="light"]` after this file still wins. */
185
+ :root,
186
+ :where(.dark, [data-theme="dark"], [data-theme-mode="dark"]) [data-theme-mode="light"] {
187
+ --background: var(--cd-weiss);
188
+ --foreground: var(--cd-schwarz);
189
+ --card: var(--cd-weiss);
190
+ --card-foreground: var(--cd-schwarz);
191
+ --popover: var(--cd-weiss);
192
+ --popover-foreground: var(--cd-schwarz);
193
+ --primary: var(--cd-blau);
194
+ --primary-foreground: var(--cd-weiss);
195
+ --primary-hover: var(--cd-blau-link);
196
+ --secondary: var(--cd-grau);
197
+ --secondary-foreground: var(--cd-schwarz);
198
+ --muted: var(--cd-grau);
199
+ --muted-foreground: var(--cd-text-leise);
200
+ --accent: var(--cd-info-soft);
201
+ --accent-foreground: var(--cd-blau-link);
202
+ --link: var(--cd-blau-link);
203
+ --destructive: var(--cd-danger);
204
+ --destructive-foreground: var(--cd-weiss);
205
+ --border: var(--cd-linie);
206
+ --input: var(--cd-kontur);
207
+ --ring: var(--cd-blau-link);
208
+ --focus: var(--cd-blau-link);
209
+ --success: var(--cd-success);
210
+ --success-soft: var(--cd-success-soft);
211
+ --success-ink: var(--cd-schwarz);
212
+ --warning: var(--cd-warning);
213
+ --warning-soft: var(--cd-warning-soft);
214
+ --warning-ink: var(--cd-schwarz);
215
+ --danger: var(--cd-danger);
216
+ --danger-soft: var(--cd-danger-soft);
217
+ --danger-ink: var(--cd-danger);
218
+ --info: var(--cd-info);
219
+ --info-soft: var(--cd-info-soft);
220
+ --info-ink: var(--cd-info);
221
+ --chart-1: var(--cd-blau);
222
+ --chart-2: var(--cd-gruen);
223
+ --chart-3: var(--cd-blau-hell);
224
+ --chart-4: var(--cd-kontur);
225
+ --chart-5: var(--cd-schwarz);
226
+ --sidebar: var(--cd-grau);
227
+ --sidebar-foreground: var(--cd-schwarz);
228
+ --sidebar-primary: var(--cd-blau);
229
+ --sidebar-primary-foreground: var(--cd-weiss);
230
+ --sidebar-accent: var(--cd-info-soft);
231
+ --sidebar-accent-foreground: var(--cd-blau-link);
232
+ --sidebar-border: var(--cd-linie);
233
+ --sidebar-ring: var(--cd-blau-link);
234
+ --scrim: color-mix(in srgb, var(--cd-schwarz) 42%, transparent);
235
+ }
236
+
237
+ /* ── Dark roles (CI dark-ground rules) ────────────────────────────────────── */
238
+ /* --cd-schwarz is the ground; quiet surfaces lift it with white. Text white,
239
+ links and accent text green, buttons stay blue with white text, focus
240
+ blau-hell, status in the -hell values WITHOUT tinted fills, quiet text
241
+ --cd-kontur. --cd-kontur keeps 4.5:1 only up to a 3 % lift, so the quiet
242
+ surfaces quiet text sits on (--muted, --sidebar) lift 3 %. The
243
+ hover/selected (--accent) and secondary surfaces lift 10 % to stay
244
+ visible; quiet text on them switches to their foreground (both pinned in
245
+ theme-css.test.ts). --popover stays on the ground: --cd-blau (a checked
246
+ Switch in a sheet) reaches 3:1 only there (3.08:1; 2.92:1 at a 2 % lift).
247
+ Overlays stand off the page by their border and a scrim that pushes the
248
+ page back harder than on light. A destructive action keeps the
249
+ --cd-danger fill: white on --cd-danger-hell is 2.79:1. */
250
+ .dark,
251
+ [data-theme="dark"],
252
+ [data-theme-mode="dark"] {
253
+ --background: var(--cd-schwarz);
254
+ --foreground: var(--cd-weiss);
255
+ --card: var(--cd-schwarz);
256
+ --card-foreground: var(--cd-weiss);
257
+ --popover: var(--cd-schwarz);
258
+ --popover-foreground: var(--cd-weiss);
259
+ --primary: var(--cd-blau);
260
+ --primary-foreground: var(--cd-weiss);
261
+ --primary-hover: var(--cd-blau-link);
262
+ --secondary: color-mix(in srgb, var(--cd-weiss) 10%, var(--cd-schwarz));
263
+ --secondary-foreground: var(--cd-weiss);
264
+ --muted: color-mix(in srgb, var(--cd-weiss) 3%, var(--cd-schwarz));
265
+ --muted-foreground: var(--cd-kontur);
266
+ --accent: color-mix(in srgb, var(--cd-weiss) 10%, var(--cd-schwarz));
267
+ --accent-foreground: var(--cd-weiss);
268
+ --link: var(--cd-gruen);
269
+ --destructive: var(--cd-danger);
270
+ --destructive-foreground: var(--cd-weiss);
271
+ --border: color-mix(in srgb, var(--cd-weiss) 14%, transparent);
272
+ --input: var(--cd-kontur);
273
+ --ring: var(--cd-blau-hell);
274
+ --focus: var(--cd-blau-hell);
275
+ --success: var(--cd-success-hell);
276
+ --success-soft: transparent;
277
+ --success-ink: var(--cd-success-hell);
278
+ --warning: var(--cd-warning-hell);
279
+ --warning-soft: transparent;
280
+ --warning-ink: var(--cd-warning-hell);
281
+ --danger: var(--cd-danger-hell);
282
+ --danger-soft: transparent;
283
+ --danger-ink: var(--cd-danger-hell);
284
+ --info: var(--cd-info-hell);
285
+ --info-soft: transparent;
286
+ --info-ink: var(--cd-info-hell);
287
+ --chart-1: var(--cd-blau-hell);
288
+ --chart-2: var(--cd-gruen);
289
+ --chart-3: var(--cd-blau);
290
+ --chart-4: var(--cd-kontur);
291
+ --chart-5: var(--cd-weiss);
292
+ --sidebar: color-mix(in srgb, var(--cd-weiss) 3%, var(--cd-schwarz));
293
+ --sidebar-foreground: var(--cd-weiss);
294
+ --sidebar-primary: var(--cd-blau);
295
+ --sidebar-primary-foreground: var(--cd-weiss);
296
+ --sidebar-accent: color-mix(in srgb, var(--cd-weiss) 10%, var(--cd-schwarz));
297
+ --sidebar-accent-foreground: var(--cd-weiss);
298
+ --sidebar-border: color-mix(in srgb, var(--cd-weiss) 14%, transparent);
299
+ --sidebar-ring: var(--cd-blau-hell);
300
+ --scrim: color-mix(in srgb, var(--cd-schwarz) 72%, transparent);
301
+ }
302
+
303
+ @layer base {
304
+ *,
305
+ *::before,
306
+ *::after {
307
+ @apply border-border outline-focus;
308
+ }
309
+ html,
310
+ body {
311
+ @apply bg-background text-foreground;
312
+ }
313
+ /* An opaque focus ring (>= 3:1 in both modes) on every focusable element,
314
+ including raw <button>s. Components with their own ring (FOCUS_RING) win:
315
+ utilities are a later layer. */
316
+ :focus-visible {
317
+ outline: 2px solid var(--focus);
318
+ outline-offset: 2px;
319
+ }
320
+ /* Native controls and scrollbars follow the mode. Declared on <body> and
321
+ the mode scopes, never on <html>: a root color-scheme that differs from
322
+ the host's iframe element makes the browser paint an opaque canvas
323
+ behind the view, which mcp-use keeps transparent on purpose. */
324
+ body,
325
+ :where(body) [data-theme-mode="light"] {
326
+ color-scheme: light;
327
+ }
328
+ :is(.dark, [data-theme="dark"]) body,
329
+ body:is(.dark, [data-theme="dark"], [data-theme-mode="dark"]),
330
+ :where(body) :is(.dark, [data-theme="dark"], [data-theme-mode="dark"]) {
331
+ color-scheme: dark;
332
+ }
333
+ }
334
+
335
+ /* Reduced motion, always (modeler-tool-design §7). */
336
+ @media (prefers-reduced-motion: reduce) {
337
+ *,
338
+ *::before,
339
+ *::after {
340
+ animation-duration: 0.001ms !important;
341
+ animation-iteration-count: 1 !important;
342
+ transition-duration: 0.001ms !important;
343
+ }
344
+ }