@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,18 @@
1
+ /**
2
+ * The toolkit's focus indicator as Tailwind classes: an opaque 2px ring in the
3
+ * `--focus` role (blau-link on light, blau-hell on dark — 3:1 or more against
4
+ * every surface, see `theme/theme-css.test.ts`), offset from the control so it
5
+ * reads on any fill. Every interactive kit control uses it; spread it into a
6
+ * custom control's `className` so keyboard focus looks the same everywhere.
7
+ * (`theme.css` also gives every element without its own ring an opaque
8
+ * `:focus-visible` outline in the same colour.)
9
+ *
10
+ * The ring is a box-shadow, which forced-colors mode (Windows High Contrast)
11
+ * drops. `outline-hidden` — never `outline-none` — hides the outline only
12
+ * outside that mode and keeps a transparent 2px outline in it, which the
13
+ * browser paints in the system colour, so focus stays visible there too.
14
+ */
15
+ export const FOCUS_RING = "outline-hidden focus-visible:ring-2 focus-visible:ring-focus focus-visible:ring-offset-2 focus-visible:ring-offset-background";
16
+ /** {@link FOCUS_RING} drawn inside the element — for cells and rows flush with a container edge. */
17
+ export const FOCUS_RING_INSET = "outline-hidden focus-visible:ring-2 focus-visible:ring-focus focus-visible:ring-inset";
18
+ //# sourceMappingURL=focus-ring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus-ring.js","sourceRoot":"","sources":["../../src/lib/focus-ring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,UAAU,GACrB,+HAA+H,CAAA;AAEjI,oGAAoG;AACpG,MAAM,CAAC,MAAM,gBAAgB,GAC3B,uFAAuF,CAAA"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Lucide stroke widths of the toolkit's chrome (CI §11, on the 24 px grid).
3
+ * Set once through `LucideProvider`: `McpAppView` applies {@link ICON_STROKE}
4
+ * to everything it renders (its toast stack included), dense bars narrow it
5
+ * to {@link DENSE_ICON_STROKE}. Icons of a consumer's own `lucide-react` follow
6
+ * the provider only when they resolve to the same module instance (dedupe it).
7
+ */
8
+ /** Default stroke of the toolkit's icons. */
9
+ export declare const ICON_STROKE = 2.5;
10
+ /** Stroke in dense chrome bars (the view toolbar, the builder's bars). */
11
+ export declare const DENSE_ICON_STROKE = 2;
12
+ //# sourceMappingURL=icon-stroke.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-stroke.d.ts","sourceRoot":"","sources":["../../src/lib/icon-stroke.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,6CAA6C;AAC7C,eAAO,MAAM,WAAW,MAAM,CAAA;AAE9B,0EAA0E;AAC1E,eAAO,MAAM,iBAAiB,IAAI,CAAA"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Lucide stroke widths of the toolkit's chrome (CI §11, on the 24 px grid).
3
+ * Set once through `LucideProvider`: `McpAppView` applies {@link ICON_STROKE}
4
+ * to everything it renders (its toast stack included), dense bars narrow it
5
+ * to {@link DENSE_ICON_STROKE}. Icons of a consumer's own `lucide-react` follow
6
+ * the provider only when they resolve to the same module instance (dedupe it).
7
+ */
8
+ /** Default stroke of the toolkit's icons. */
9
+ export const ICON_STROKE = 2.5;
10
+ /** Stroke in dense chrome bars (the view toolbar, the builder's bars). */
11
+ export const DENSE_ICON_STROKE = 2;
12
+ //# sourceMappingURL=icon-stroke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-stroke.js","sourceRoot":"","sources":["../../src/lib/icon-stroke.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,6CAA6C;AAC7C,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAA;AAE9B,0EAA0E;AAC1E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAA"}
@@ -13,10 +13,32 @@ export interface ParseToolResultOptions {
13
13
  */
14
14
  prefer?: "structured" | "text";
15
15
  }
16
+ /**
17
+ * A tool answered with an `isError` result: a deterministic failure of the
18
+ * call itself (a validation error, an engine 404), not of the transport.
19
+ * Thrown by {@link parseToolResult}. The query hooks retry it like any
20
+ * failure by default (the client's `retry`); pass `retry: shouldRetryToolCall`
21
+ * to stop that, since repeating the call repeats the answer. Still an `Error`
22
+ * with the tool's first text block as its message.
23
+ */
24
+ export declare class ToolResultError extends Error {
25
+ /** The `isError` result as the tool returned it. */
26
+ readonly result: unknown;
27
+ constructor(message: string, result: unknown);
28
+ }
29
+ /**
30
+ * Whether `error` is a tool's own `isError` answer: a {@link ToolResultError},
31
+ * or mcp-use's `ToolError` (how `useDynamicTool` rejects an `isError` result
32
+ * inside a view), recognised by its name and result so the root barrel never
33
+ * imports `mcp-use/react`. Transport failures (a lost connection, a JSON-RPC
34
+ * error such as an unknown tool) are not tool errors.
35
+ */
36
+ export declare function isToolError(error: unknown): boolean;
16
37
  /**
17
38
  * Decodes an MCP tool result down to its data payload.
18
39
  *
19
- * Default (`prefer: "structured"`): `isError` → throw the first text block,
40
+ * Default (`prefer: "structured"`): `isError` → throw a
41
+ * {@link ToolResultError} with the first text block,
20
42
  * then `structuredContent` (if non-null), then JSON-decode the first text
21
43
  * block (verbatim string if it isn't JSON), then the raw result.
22
44
  *
@@ -1 +1 @@
1
- {"version":3,"file":"parse-tool-result.d.ts","sourceRoot":"","sources":["../../src/lib/parse-tool-result.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,sBAAsB;IACrC;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;CAC/B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,sBAAsB,GAAG,CAAC,CAmC9F;AAKD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,CAAC,CASnE"}
1
+ {"version":3,"file":"parse-tool-result.d.ts","sourceRoot":"","sources":["../../src/lib/parse-tool-result.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,sBAAsB;IACrC;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;CAC/B;AAED;;;;;;;GAOG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;gBAEZ,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;CAK7C;AAMD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAKnD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,sBAAsB,GAAG,CAAC,CAmC9F;AAKD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,CAAC,CASnE"}
@@ -1,7 +1,43 @@
1
+ /**
2
+ * A tool answered with an `isError` result: a deterministic failure of the
3
+ * call itself (a validation error, an engine 404), not of the transport.
4
+ * Thrown by {@link parseToolResult}. The query hooks retry it like any
5
+ * failure by default (the client's `retry`); pass `retry: shouldRetryToolCall`
6
+ * to stop that, since repeating the call repeats the answer. Still an `Error`
7
+ * with the tool's first text block as its message.
8
+ */
9
+ export class ToolResultError extends Error {
10
+ /** The `isError` result as the tool returned it. */
11
+ result;
12
+ constructor(message, result) {
13
+ super(message);
14
+ this.name = "ToolResultError";
15
+ this.result = result;
16
+ }
17
+ }
18
+ function isRecord(value) {
19
+ return typeof value === "object" && value !== null;
20
+ }
21
+ /**
22
+ * Whether `error` is a tool's own `isError` answer: a {@link ToolResultError},
23
+ * or mcp-use's `ToolError` (how `useDynamicTool` rejects an `isError` result
24
+ * inside a view), recognised by its name and result so the root barrel never
25
+ * imports `mcp-use/react`. Transport failures (a lost connection, a JSON-RPC
26
+ * error such as an unknown tool) are not tool errors.
27
+ */
28
+ export function isToolError(error) {
29
+ if (error instanceof ToolResultError)
30
+ return true;
31
+ if (!(error instanceof Error) || error.name !== "ToolError")
32
+ return false;
33
+ const result = error.result;
34
+ return isRecord(result) && result.isError === true;
35
+ }
1
36
  /**
2
37
  * Decodes an MCP tool result down to its data payload.
3
38
  *
4
- * Default (`prefer: "structured"`): `isError` → throw the first text block,
39
+ * Default (`prefer: "structured"`): `isError` → throw a
40
+ * {@link ToolResultError} with the first text block,
5
41
  * then `structuredContent` (if non-null), then JSON-decode the first text
6
42
  * block (verbatim string if it isn't JSON), then the raw result.
7
43
  *
@@ -14,7 +50,7 @@
14
50
  export function parseToolResult(result, opts) {
15
51
  const r = result;
16
52
  if (r?.isError)
17
- throw new Error(r.content?.[0]?.text ?? "Tool call failed");
53
+ throw new ToolResultError(r.content?.[0]?.text ?? "Tool call failed", result);
18
54
  const fromStructured = () => r?.structuredContent != null ? r.structuredContent : undefined;
19
55
  const fromText = () => {
20
56
  const text = r?.content?.[0]?.text;
@@ -1 +1 @@
1
- {"version":3,"file":"parse-tool-result.js","sourceRoot":"","sources":["../../src/lib/parse-tool-result.ts"],"names":[],"mappings":"AAkBA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAAc,MAAe,EAAE,IAA6B;IACzF,MAAM,CAAC,GAAG,MAMG,CAAA;IACb,IAAI,CAAC,EAAE,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,kBAAkB,CAAC,CAAA;IAE3E,MAAM,cAAc,GAAG,GAAkB,EAAE,CACzC,CAAC,EAAE,iBAAiB,IAAI,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,iBAAuB,CAAC,CAAC,CAAC,SAAS,CAAA;IACvE,MAAM,QAAQ,GAAG,GAAkB,EAAE;QACnC,MAAM,IAAI,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAA;QAClC,IAAI,IAAI,IAAI,IAAI;YAAE,OAAO,SAAS,CAAA;QAClC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAA;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAS,CAAA;QAClB,CAAC;IACH,CAAC,CAAA;IAED,IAAI,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAA;QACvB,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAA;QACnC,MAAM,UAAU,GAAG,cAAc,EAAE,CAAA;QACnC,IAAI,UAAU,KAAK,SAAS;YAAE,OAAO,UAAU,CAAA;QAC/C,OAAO,CAAM,CAAA;IACf,CAAC;IAED,MAAM,UAAU,GAAG,cAAc,EAAE,CAAA;IACnC,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,UAAU,CAAA;IAC/C,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAA;IACvB,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IACnC,OAAO,CAAM,CAAA;AACf,CAAC;AAKD;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAc,MAAe;IAC9D,MAAM,MAAM,GAAG,eAAe,CAAU,MAAM,CAAC,CAAA;IAC/C,MAAM,GAAG,GAAI,MAA8B,EAAE,OAAO,CAAA;IACpD,MAAM,OAAO,GAAG,GAAG,EAAE,OAAO,CAAA;IAC5B,IAAI,GAAG,EAAE,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,IAAS,CAAA;QAC1E,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAM,CAAA;IACnF,CAAC;IACD,OAAO,MAAW,CAAA;AACpB,CAAC"}
1
+ {"version":3,"file":"parse-tool-result.js","sourceRoot":"","sources":["../../src/lib/parse-tool-result.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Pure model behind `ToastProvider` / `useToast`: the toast list as a reducer
3
+ * plus the timing rules, so both are testable without a DOM (the house path,
4
+ * FITNESS.md) and the component stays a thin view over them.
5
+ */
6
+ /** Status tone of a toast — the four status roles (`--success` … `--info`). */
7
+ export type ToastTone = "success" | "warning" | "danger" | "info";
8
+ /**
9
+ * The toast tone of any tone name: the four status tones as is, a retired
10
+ * name through `resolveTone` (`error` → `danger`), and `neutral` or anything
11
+ * unknown as `info`. Keeps a toast whose tone arrives untyped (plain JS, wire
12
+ * data) on the screen instead of crashing the view on a missing icon.
13
+ */
14
+ export declare function resolveToastTone(name: unknown): ToastTone;
15
+ /** What a caller passes to `useToast().show(...)`. */
16
+ export interface ToastOptions {
17
+ /**
18
+ * Status tone; drives the edge, the icon and the default duration. Default
19
+ * `"info"`. An untyped retired name still resolves ({@link resolveToastTone}).
20
+ */
21
+ tone?: ToastTone;
22
+ /** The message. Say what happened, in one short sentence ("Job retried."). */
23
+ title: string;
24
+ /** Optional second line (what you can do next, or the affected object). */
25
+ description?: string;
26
+ /** Auto-dismiss after this many ms. Defaults per {@link toastDuration}. */
27
+ duration?: number;
28
+ }
29
+ /** A toast as it sits in the list. */
30
+ export interface ToastItem {
31
+ id: number;
32
+ tone: ToastTone;
33
+ title: string;
34
+ description?: string;
35
+ duration: number;
36
+ }
37
+ /** Default lifetime of a toast (CI §8: about 2.8 s). */
38
+ export declare const TOAST_DURATION_MS = 2800;
39
+ /** Lifetime of an error toast (CI §8: about 5 s) — long enough to read the reason. */
40
+ export declare const TOAST_ERROR_DURATION_MS = 5000;
41
+ /** At most this many toasts stack; the oldest leaves first. */
42
+ export declare const MAX_VISIBLE_TOASTS = 3;
43
+ /** The lifetime of a toast: an explicit positive duration, else the tone's default. */
44
+ export declare function toastDuration(tone: ToastTone, explicit?: number): number;
45
+ /** Normalise caller options into a list item. */
46
+ export declare function createToast(id: number, options: ToastOptions): ToastItem;
47
+ export type ToastAction = {
48
+ type: "add";
49
+ toast: ToastItem;
50
+ } | {
51
+ type: "dismiss";
52
+ id: number;
53
+ };
54
+ /** Add appends (dropping the oldest beyond {@link MAX_VISIBLE_TOASTS}); dismiss removes by id. */
55
+ export declare function toastReducer(state: readonly ToastItem[], action: ToastAction): ToastItem[];
56
+ /**
57
+ * The clock a {@link createToastTimer} runs on. The default reads the global
58
+ * timers at call time, so fake timers installed in a test take effect.
59
+ */
60
+ export interface ToastClock {
61
+ now: () => number;
62
+ setTimeout: (callback: () => void, ms: number) => unknown;
63
+ clearTimeout: (handle: unknown) => void;
64
+ }
65
+ /** The countdown of one toast (see {@link createToastTimer}). */
66
+ export interface ToastTimer {
67
+ /**
68
+ * Hold the toast for `reason` (`"pointer"`, `"focus"`): the countdown
69
+ * pauses and keeps the time that was left.
70
+ */
71
+ hold: (reason: string) => void;
72
+ /** Release `reason`; once nothing holds the toast, it resumes with the time that was left. */
73
+ release: (reason: string) => void;
74
+ /** The time left in ms — frozen while held. */
75
+ remaining: () => number;
76
+ /** Stop for good (the toast left early or unmounted); `onExpire` never fires afterwards. */
77
+ cancel: () => void;
78
+ }
79
+ /**
80
+ * A pausable countdown: starts at once, pauses while anything holds it
81
+ * (hover, keyboard focus — so a reader can finish), and on release RESUMES
82
+ * WITH THE REMAINING TIME instead of restarting the full duration. Fires
83
+ * `onExpire` once.
84
+ */
85
+ export declare function createToastTimer(duration: number, onExpire: () => void, clock?: ToastClock): ToastTimer;
86
+ //# sourceMappingURL=toast-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast-model.d.ts","sourceRoot":"","sources":["../../src/lib/toast-model.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,+EAA+E;AAC/E,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAA;AAEjE;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,CAGzD;AAED,sDAAsD;AACtD,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAA;IACb,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,sCAAsC;AACtC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,SAAS,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,wDAAwD;AACxD,eAAO,MAAM,iBAAiB,OAAO,CAAA;AACrC,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,OAAO,CAAA;AAC3C,+DAA+D;AAC/D,eAAO,MAAM,kBAAkB,IAAI,CAAA;AAEnC,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAGxE;AAED,iDAAiD;AACjD,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,SAAS,CASxE;AAED,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAA;AAE7F,kGAAkG;AAClG,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,EAAE,CAI1F;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,MAAM,CAAA;IACjB,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAA;IACzD,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;CACxC;AAQD,iEAAiE;AACjE,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,8FAA8F;IAC9F,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,+CAA+C;IAC/C,SAAS,EAAE,MAAM,MAAM,CAAA;IACvB,4FAA4F;IAC5F,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,IAAI,EACpB,KAAK,GAAE,UAAyB,GAC/B,UAAU,CA2CZ"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Pure model behind `ToastProvider` / `useToast`: the toast list as a reducer
3
+ * plus the timing rules, so both are testable without a DOM (the house path,
4
+ * FITNESS.md) and the component stays a thin view over them.
5
+ */
6
+ import { resolveTone } from "./tone-utils.js";
7
+ /**
8
+ * The toast tone of any tone name: the four status tones as is, a retired
9
+ * name through `resolveTone` (`error` → `danger`), and `neutral` or anything
10
+ * unknown as `info`. Keeps a toast whose tone arrives untyped (plain JS, wire
11
+ * data) on the screen instead of crashing the view on a missing icon.
12
+ */
13
+ export function resolveToastTone(name) {
14
+ const tone = resolveTone(name, "info");
15
+ return tone === "neutral" ? "info" : tone;
16
+ }
17
+ /** Default lifetime of a toast (CI §8: about 2.8 s). */
18
+ export const TOAST_DURATION_MS = 2800;
19
+ /** Lifetime of an error toast (CI §8: about 5 s) — long enough to read the reason. */
20
+ export const TOAST_ERROR_DURATION_MS = 5000;
21
+ /** At most this many toasts stack; the oldest leaves first. */
22
+ export const MAX_VISIBLE_TOASTS = 3;
23
+ /** The lifetime of a toast: an explicit positive duration, else the tone's default. */
24
+ export function toastDuration(tone, explicit) {
25
+ if (explicit !== undefined && Number.isFinite(explicit) && explicit > 0)
26
+ return explicit;
27
+ return tone === "danger" ? TOAST_ERROR_DURATION_MS : TOAST_DURATION_MS;
28
+ }
29
+ /** Normalise caller options into a list item. */
30
+ export function createToast(id, options) {
31
+ const tone = resolveToastTone(options.tone);
32
+ return {
33
+ id,
34
+ tone,
35
+ title: options.title,
36
+ ...(options.description ? { description: options.description } : {}),
37
+ duration: toastDuration(tone, options.duration),
38
+ };
39
+ }
40
+ /** Add appends (dropping the oldest beyond {@link MAX_VISIBLE_TOASTS}); dismiss removes by id. */
41
+ export function toastReducer(state, action) {
42
+ if (action.type === "add")
43
+ return [...state, action.toast].slice(-MAX_VISIBLE_TOASTS);
44
+ const next = state.filter((t) => t.id !== action.id);
45
+ return next.length === state.length ? state : next;
46
+ }
47
+ const SYSTEM_CLOCK = {
48
+ now: () => Date.now(),
49
+ setTimeout: (callback, ms) => globalThis.setTimeout(callback, ms),
50
+ clearTimeout: (handle) => globalThis.clearTimeout(handle),
51
+ };
52
+ /**
53
+ * A pausable countdown: starts at once, pauses while anything holds it
54
+ * (hover, keyboard focus — so a reader can finish), and on release RESUMES
55
+ * WITH THE REMAINING TIME instead of restarting the full duration. Fires
56
+ * `onExpire` once.
57
+ */
58
+ export function createToastTimer(duration, onExpire, clock = SYSTEM_CLOCK) {
59
+ let left = Math.max(duration, 0);
60
+ let startedAt = 0;
61
+ let handle;
62
+ let running = false;
63
+ let finished = false;
64
+ const holds = new Set();
65
+ const elapsed = () => (running ? clock.now() - startedAt : 0);
66
+ const start = () => {
67
+ if (finished || running || holds.size > 0)
68
+ return;
69
+ running = true;
70
+ startedAt = clock.now();
71
+ handle = clock.setTimeout(() => {
72
+ running = false;
73
+ finished = true;
74
+ left = 0;
75
+ onExpire();
76
+ }, left);
77
+ };
78
+ const pause = () => {
79
+ if (!running)
80
+ return;
81
+ left = Math.max(left - elapsed(), 0);
82
+ running = false;
83
+ clock.clearTimeout(handle);
84
+ };
85
+ start();
86
+ return {
87
+ hold: (reason) => {
88
+ holds.add(reason);
89
+ pause();
90
+ },
91
+ release: (reason) => {
92
+ holds.delete(reason);
93
+ start();
94
+ },
95
+ remaining: () => Math.max(left - elapsed(), 0),
96
+ cancel: () => {
97
+ pause();
98
+ finished = true;
99
+ },
100
+ };
101
+ }
102
+ //# sourceMappingURL=toast-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast-model.js","sourceRoot":"","sources":["../../src/lib/toast-model.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,104 @@
1
1
  /**
2
2
  * Single source of truth for the semantic "tones" used across the tone-aware
3
- * components (`Pills`, `KpiGrid`, `WidgetHeader`, …).
3
+ * components (`Pills`, `StatusBadge`, `KpiGrid`, `Badge`, …).
4
4
  *
5
- * Each tone maps to the status tokens defined in `globals.css`
6
- * (`--danger`, `--warning`, `--success`, `--info`) plus the shadcn neutral ramp
7
- * for the `neutral` tone. All tokens carry light + dark values, so these class
8
- * strings re-theme automatically — change a tone in one place instead of
9
- * hand-rolling `tone === "x" ? "…" : "…"` ternaries at every call site.
5
+ * ONE vocabulary: `success | warning | danger | info | neutral`
6
+ * ({@link TONE_VARIANTS}). Retired or foreign names (`critical`, `error`,
7
+ * `destructive`, …) map onto it through {@link resolveTone}, so a tone that
8
+ * arrives as data (a server-built KPI cell) never renders without a colour.
9
+ *
10
+ * Every status tone has THREE roles (Miragon CI §3.3), each its own token in
11
+ * `theme.css` with light and dark values:
12
+ *
13
+ * | Role | Token | Map |
14
+ * | ---------------------------- | --------------- | -------------- |
15
+ * | fill, dot, border, icon | `--<tone>` | `TONE_DOT`, `TONE_BORDER`, `TONE_ICON` |
16
+ * | tint (badge/banner surface) | `--<tone>-soft` | `TONE_SOFT`, `TONE_TINT` (text on it: the foreground) |
17
+ * | text on a plain surface | `--<tone>-ink` | `TONE_INK` |
18
+ *
19
+ * Status is never text in its own colour: success and warning reach only
20
+ * 1.67:1 / 1.83:1 on white, so their ink is the foreground and the tone shows
21
+ * as a dot, icon or border NEXT to the text. On a tint the text is always the
22
+ * foreground (CI §3.3: "-soft: Text darauf --cd-schwarz, Rand in der
23
+ * Statusfarbe"), so pair `TONE_SOFT` with `TONE_BORDER`. `TONE_INK` is for
24
+ * a tone's words on a plain surface (a field error); figures — counts, KPI
25
+ * values, trends — never take it: they stay in the foreground next to a
26
+ * `TONE_DOT`. In dark mode the colours are the `-hell` values and the tints
27
+ * are transparent (no tinted fills on dark). The `neutral` tone reuses the
28
+ * muted ramp.
29
+ *
30
+ * Change a tone here, in one place, instead of hand-rolling
31
+ * `tone === "x" ? "…" : "…"` ternaries at every call site.
10
32
  */
11
33
  export type ToneVariant = "neutral" | "info" | "success" | "warning" | "danger";
12
- /** Tinted background + readable foreground — badges, icon tiles, pills. */
34
+ /** Every tone, in severity order (for loops, pickers and validation). */
35
+ export declare const TONE_VARIANTS: readonly ToneVariant[];
36
+ /**
37
+ * Retired or foreign tone names and the tone each one means. One red and one
38
+ * amber (CI §3.3): `critical`, `error` and `destructive` are `danger`; there
39
+ * is no separate severity above it. The names on the left are deprecated:
40
+ * write the {@link ToneVariant} on the right. The map stays so data written
41
+ * against an older vocabulary (a widget-shell `critical`, a shadcn
42
+ * `destructive`) keeps its colour.
43
+ */
44
+ export declare const TONE_ALIASES: {
45
+ readonly critical: "danger";
46
+ readonly error: "danger";
47
+ readonly destructive: "danger";
48
+ readonly failure: "danger";
49
+ readonly warn: "warning";
50
+ readonly ok: "success";
51
+ readonly positive: "success";
52
+ readonly notice: "info";
53
+ readonly default: "neutral";
54
+ readonly muted: "neutral";
55
+ readonly secondary: "neutral";
56
+ };
57
+ /** A name {@link resolveTone} maps onto a tone (see {@link TONE_ALIASES}). */
58
+ export type ToneAlias = keyof typeof TONE_ALIASES;
59
+ /**
60
+ * What a tone-aware component accepts: a {@link ToneVariant}, or a retired
61
+ * name that {@link resolveTone} maps onto one.
62
+ */
63
+ export type ToneName = ToneVariant | ToneAlias;
64
+ /** Whether `value` is one of the five tones (a type guard for data from the wire). */
65
+ export declare function isToneVariant(value: unknown): value is ToneVariant;
66
+ /**
67
+ * Map any tone name onto the vocabulary: a {@link ToneVariant} as is, a
68
+ * retired name ({@link TONE_ALIASES}, case-insensitive) onto its tone, and
69
+ * anything else — unknown, empty, not a string — onto `fallback` (default
70
+ * `"neutral"`, the tone without a state).
71
+ */
72
+ export declare function resolveTone(name: unknown, fallback?: ToneVariant): ToneVariant;
73
+ /**
74
+ * Tinted surface + its text (the foreground: CI §3.3) — badges, pills,
75
+ * banners. Pair it with {@link TONE_BORDER}: the rim carries the tone, and in
76
+ * dark mode (no tints) it is all that does. The neutral tint is the muted
77
+ * surface, its text the foreground too (a count on it is a figure).
78
+ */
13
79
  export declare const TONE_SOFT: Record<ToneVariant, string>;
14
- /** Solid dot color — status dots next to a label. */
80
+ /** The tint alone, for a surface that sets its text itself (a soft KPI card). */
81
+ export declare const TONE_TINT: Record<ToneVariant, string>;
82
+ /** Solid dot colour — a status dot next to a label, a bar, a meter fill. */
15
83
  export declare const TONE_DOT: Record<ToneVariant, string>;
16
- /** Foreground-only color — metric values, inline emphasis. */
84
+ /**
85
+ * The tone's TEXT colour (its `-ink` role) for words on a plain surface — a
86
+ * field error, a "missing" label. Success and warning resolve to the
87
+ * foreground on light: pair the text with a {@link TONE_DOT} or
88
+ * {@link TONE_ICON} to show the tone. Never on a tint (use {@link TONE_SOFT})
89
+ * and never for figures (they stay in the foreground next to a dot).
90
+ */
91
+ export declare const TONE_INK: Record<ToneVariant, string>;
92
+ /**
93
+ * @deprecated Renamed to {@link TONE_INK} after the role it maps onto
94
+ * (`--<tone>-ink`); the same object, kept for existing imports.
95
+ */
17
96
  export declare const TONE_TEXT: Record<ToneVariant, string>;
97
+ /** Border colour in the tone — the rim of a tinted badge, banner or toast. */
98
+ export declare const TONE_BORDER: Record<ToneVariant, string>;
99
+ /**
100
+ * Icon colour in the tone (SVG `currentColor`). For icons only — never for
101
+ * text: an icon next to its label carries the tone, the label stays readable.
102
+ */
103
+ export declare const TONE_ICON: Record<ToneVariant, string>;
18
104
  //# sourceMappingURL=tone-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tone-utils.d.ts","sourceRoot":"","sources":["../../src/lib/tone-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;AAE/E,2EAA2E;AAC3E,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAMjD,CAAA;AAED,qDAAqD;AACrD,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAMhD,CAAA;AAED,8DAA8D;AAC9D,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAMjD,CAAA"}
1
+ {"version":3,"file":"tone-utils.d.ts","sourceRoot":"","sources":["../../src/lib/tone-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;AAE/E,yEAAyE;AACzE,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAM/C,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;CAYuB,CAAA;AAEhD,8EAA8E;AAC9E,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,YAAY,CAAA;AAEjD;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAA;AAI9C,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAElE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,GAAE,WAAuB,GAAG,WAAW,CAKzF;AAED;;;;;GAKG;AACH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAMjD,CAAA;AAED,iFAAiF;AACjF,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAMjD,CAAA;AAED,4EAA4E;AAC5E,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAMhD,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAMhD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAY,CAAA;AAE9D,8EAA8E;AAC9E,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAMnD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAMjD,CAAA"}
@@ -1,12 +1,73 @@
1
- /** Tinted background + readable foreground — badges, icon tiles, pills. */
1
+ /** Every tone, in severity order (for loops, pickers and validation). */
2
+ export const TONE_VARIANTS = [
3
+ "danger",
4
+ "warning",
5
+ "success",
6
+ "info",
7
+ "neutral",
8
+ ];
9
+ /**
10
+ * Retired or foreign tone names and the tone each one means. One red and one
11
+ * amber (CI §3.3): `critical`, `error` and `destructive` are `danger`; there
12
+ * is no separate severity above it. The names on the left are deprecated:
13
+ * write the {@link ToneVariant} on the right. The map stays so data written
14
+ * against an older vocabulary (a widget-shell `critical`, a shadcn
15
+ * `destructive`) keeps its colour.
16
+ */
17
+ export const TONE_ALIASES = {
18
+ critical: "danger",
19
+ error: "danger",
20
+ destructive: "danger",
21
+ failure: "danger",
22
+ warn: "warning",
23
+ ok: "success",
24
+ positive: "success",
25
+ notice: "info",
26
+ default: "neutral",
27
+ muted: "neutral",
28
+ secondary: "neutral",
29
+ };
30
+ const TONE_SET = new Set(TONE_VARIANTS);
31
+ /** Whether `value` is one of the five tones (a type guard for data from the wire). */
32
+ export function isToneVariant(value) {
33
+ return typeof value === "string" && TONE_SET.has(value);
34
+ }
35
+ /**
36
+ * Map any tone name onto the vocabulary: a {@link ToneVariant} as is, a
37
+ * retired name ({@link TONE_ALIASES}, case-insensitive) onto its tone, and
38
+ * anything else — unknown, empty, not a string — onto `fallback` (default
39
+ * `"neutral"`, the tone without a state).
40
+ */
41
+ export function resolveTone(name, fallback = "neutral") {
42
+ if (typeof name !== "string")
43
+ return fallback;
44
+ const key = name.trim().toLowerCase();
45
+ if (TONE_SET.has(key))
46
+ return key;
47
+ return Object.hasOwn(TONE_ALIASES, key) ? TONE_ALIASES[key] : fallback;
48
+ }
49
+ /**
50
+ * Tinted surface + its text (the foreground: CI §3.3) — badges, pills,
51
+ * banners. Pair it with {@link TONE_BORDER}: the rim carries the tone, and in
52
+ * dark mode (no tints) it is all that does. The neutral tint is the muted
53
+ * surface, its text the foreground too (a count on it is a figure).
54
+ */
2
55
  export const TONE_SOFT = {
3
- neutral: "bg-muted text-muted-foreground",
4
- info: "bg-info-soft text-info",
5
- success: "bg-success-soft text-success",
6
- warning: "bg-warning-soft text-warning",
7
- danger: "bg-danger-soft text-danger",
56
+ neutral: "bg-muted text-foreground",
57
+ info: "bg-info-soft text-foreground",
58
+ success: "bg-success-soft text-foreground",
59
+ warning: "bg-warning-soft text-foreground",
60
+ danger: "bg-danger-soft text-foreground",
61
+ };
62
+ /** The tint alone, for a surface that sets its text itself (a soft KPI card). */
63
+ export const TONE_TINT = {
64
+ neutral: "bg-muted",
65
+ info: "bg-info-soft",
66
+ success: "bg-success-soft",
67
+ warning: "bg-warning-soft",
68
+ danger: "bg-danger-soft",
8
69
  };
9
- /** Solid dot color — status dots next to a label. */
70
+ /** Solid dot colour — a status dot next to a label, a bar, a meter fill. */
10
71
  export const TONE_DOT = {
11
72
  neutral: "bg-muted-foreground",
12
73
  info: "bg-info",
@@ -14,9 +75,39 @@ export const TONE_DOT = {
14
75
  warning: "bg-warning",
15
76
  danger: "bg-danger",
16
77
  };
17
- /** Foreground-only color — metric values, inline emphasis. */
18
- export const TONE_TEXT = {
78
+ /**
79
+ * The tone's TEXT colour (its `-ink` role) for words on a plain surface — a
80
+ * field error, a "missing" label. Success and warning resolve to the
81
+ * foreground on light: pair the text with a {@link TONE_DOT} or
82
+ * {@link TONE_ICON} to show the tone. Never on a tint (use {@link TONE_SOFT})
83
+ * and never for figures (they stay in the foreground next to a dot).
84
+ */
85
+ export const TONE_INK = {
19
86
  neutral: "text-foreground",
87
+ info: "text-info-ink",
88
+ success: "text-success-ink",
89
+ warning: "text-warning-ink",
90
+ danger: "text-danger-ink",
91
+ };
92
+ /**
93
+ * @deprecated Renamed to {@link TONE_INK} after the role it maps onto
94
+ * (`--<tone>-ink`); the same object, kept for existing imports.
95
+ */
96
+ export const TONE_TEXT = TONE_INK;
97
+ /** Border colour in the tone — the rim of a tinted badge, banner or toast. */
98
+ export const TONE_BORDER = {
99
+ neutral: "border-border",
100
+ info: "border-info",
101
+ success: "border-success",
102
+ warning: "border-warning",
103
+ danger: "border-danger",
104
+ };
105
+ /**
106
+ * Icon colour in the tone (SVG `currentColor`). For icons only — never for
107
+ * text: an icon next to its label carries the tone, the label stays readable.
108
+ */
109
+ export const TONE_ICON = {
110
+ neutral: "text-muted-foreground",
20
111
  info: "text-info",
21
112
  success: "text-success",
22
113
  warning: "text-warning",
@@ -1 +1 @@
1
- {"version":3,"file":"tone-utils.js","sourceRoot":"","sources":["../../src/lib/tone-utils.ts"],"names":[],"mappings":"AAYA,2EAA2E;AAC3E,MAAM,CAAC,MAAM,SAAS,GAAgC;IACpD,OAAO,EAAE,gCAAgC;IACzC,IAAI,EAAE,wBAAwB;IAC9B,OAAO,EAAE,8BAA8B;IACvC,OAAO,EAAE,8BAA8B;IACvC,MAAM,EAAE,4BAA4B;CACrC,CAAA;AAED,qDAAqD;AACrD,MAAM,CAAC,MAAM,QAAQ,GAAgC;IACnD,OAAO,EAAE,qBAAqB;IAC9B,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;CACpB,CAAA;AAED,8DAA8D;AAC9D,MAAM,CAAC,MAAM,SAAS,GAAgC;IACpD,OAAO,EAAE,iBAAiB;IAC1B,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,cAAc;IACvB,OAAO,EAAE,cAAc;IACvB,MAAM,EAAE,aAAa;CACtB,CAAA"}
1
+ {"version":3,"file":"tone-utils.js","sourceRoot":"","sources":["../../src/lib/tone-utils.ts"],"names":[],"mappings":"AAkCA,yEAAyE;AACzE,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,QAAQ;IACR,SAAS;IACT,SAAS;IACT,MAAM;IACN,SAAS;CACV,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,QAAQ;IACf,WAAW,EAAE,QAAQ;IACrB,OAAO,EAAE,QAAQ;IACjB,IAAI,EAAE,SAAS;IACf,EAAE,EAAE,SAAS;IACb,QAAQ,EAAE,SAAS;IACnB,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;IAChB,SAAS,EAAE,SAAS;CAC0B,CAAA;AAWhD,MAAM,QAAQ,GAAwB,IAAI,GAAG,CAAC,aAAa,CAAC,CAAA;AAE5D,sFAAsF;AACtF,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;AACzD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAa,EAAE,WAAwB,SAAS;IAC1E,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACrC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,GAAkB,CAAA;IAChD,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAgB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;AACrF,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAgC;IACpD,OAAO,EAAE,0BAA0B;IACnC,IAAI,EAAE,8BAA8B;IACpC,OAAO,EAAE,iCAAiC;IAC1C,OAAO,EAAE,iCAAiC;IAC1C,MAAM,EAAE,gCAAgC;CACzC,CAAA;AAED,iFAAiF;AACjF,MAAM,CAAC,MAAM,SAAS,GAAgC;IACpD,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,iBAAiB;IAC1B,OAAO,EAAE,iBAAiB;IAC1B,MAAM,EAAE,gBAAgB;CACzB,CAAA;AAED,4EAA4E;AAC5E,MAAM,CAAC,MAAM,QAAQ,GAAgC;IACnD,OAAO,EAAE,qBAAqB;IAC9B,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;CACpB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAgC;IACnD,OAAO,EAAE,iBAAiB;IAC1B,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,kBAAkB;IAC3B,OAAO,EAAE,kBAAkB;IAC3B,MAAM,EAAE,iBAAiB;CAC1B,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAgC,QAAQ,CAAA;AAE9D,8EAA8E;AAC9E,MAAM,CAAC,MAAM,WAAW,GAAgC;IACtD,OAAO,EAAE,eAAe;IACxB,IAAI,EAAE,aAAa;IACnB,OAAO,EAAE,gBAAgB;IACzB,OAAO,EAAE,gBAAgB;IACzB,MAAM,EAAE,eAAe;CACxB,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAgC;IACpD,OAAO,EAAE,uBAAuB;IAChC,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,cAAc;IACvB,OAAO,EAAE,cAAc;IACvB,MAAM,EAAE,aAAa;CACtB,CAAA"}