@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
@@ -1,5 +1,5 @@
1
1
  import type { LayoutBuilderLabels, RefreshStatus } from "./labels.js";
2
- declare function ToolbarImpl({ L, previewMode, isBusy, status, liveKeys, reachableCount, unreachableCount, onOpenCatalogue, onOpenSave, onDone, hasAnyCell, }: {
2
+ export interface ToolbarProps {
3
3
  L: Required<LayoutBuilderLabels>;
4
4
  previewMode: boolean;
5
5
  isBusy: boolean;
@@ -7,11 +7,21 @@ declare function ToolbarImpl({ L, previewMode, isBusy, status, liveKeys, reachab
7
7
  liveKeys: number;
8
8
  reachableCount: number;
9
9
  unreachableCount: number;
10
+ /** Advanced mode: shows the stats and the catalogue (the data sources tab lives below). */
11
+ advanced: boolean;
12
+ onToggleAdvanced: () => void;
13
+ /** The draft has changes that would be lost (the marker next to the title). */
14
+ unsaved: boolean;
10
15
  onOpenCatalogue: () => void;
11
16
  onOpenSave: () => void;
12
- onDone?: () => void;
17
+ /** Leaves the builder without the edits (or, without `onApply`, resets the draft in place). */
18
+ onDiscard: () => void;
19
+ /** Shows the draft in the view and leaves the builder; absent when there is no view to apply to. */
20
+ onApply?: () => void;
13
21
  hasAnyCell: boolean;
14
- }): import("react").JSX.Element;
15
- export declare const Toolbar: import("react").MemoExoticComponent<typeof ToolbarImpl>;
22
+ }
23
+ /** A dense chrome bar: its Lucide icons draw at stroke 2 (CI §11), not the view's 2.5. */
24
+ declare function DenseToolbar(props: ToolbarProps): import("react").JSX.Element;
25
+ export declare const Toolbar: import("react").MemoExoticComponent<typeof DenseToolbar>;
16
26
  export {};
17
27
  //# sourceMappingURL=Toolbar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../../src/app/builder/Toolbar.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAOrE,iBAAS,WAAW,CAAC,EACnB,CAAC,EACD,WAAW,EACX,MAAM,EACN,MAAM,EACN,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,MAAM,EACN,UAAU,GACX,EAAE;IACD,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAA;IAChC,WAAW,EAAE,OAAO,CAAA;IACpB,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,aAAa,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,MAAM,CAAA;IACtB,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,IAAI,CAAA;IAC3B,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;CACpB,+BAwDA;AAED,eAAO,MAAM,OAAO,yDAAoB,CAAA"}
1
+ {"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../../src/app/builder/Toolbar.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAOrE,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAA;IAChC,WAAW,EAAE,OAAO,CAAA;IACpB,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,aAAa,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,MAAM,CAAA;IACtB,gBAAgB,EAAE,MAAM,CAAA;IACxB,2FAA2F;IAC3F,QAAQ,EAAE,OAAO,CAAA;IACjB,gBAAgB,EAAE,MAAM,IAAI,CAAA;IAC5B,+EAA+E;IAC/E,OAAO,EAAE,OAAO,CAAA;IAChB,eAAe,EAAE,MAAM,IAAI,CAAA;IAC3B,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,+FAA+F;IAC/F,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,oGAAoG;IACpG,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,UAAU,EAAE,OAAO,CAAA;CACpB;AAmJD,0FAA0F;AAC1F,iBAAS,YAAY,CAAC,KAAK,EAAE,YAAY,+BAMxC;AAED,eAAO,MAAM,OAAO,0DAAqB,CAAA"}
@@ -1,15 +1,32 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { memo } from "react";
3
- import { Check, Eye, Layers, Library, Save } from "lucide-react";
3
+ import { Check, Library, LucideProvider, Save, Undo2, Wrench } from "lucide-react";
4
+ import { DENSE_ICON_STROKE } from "../../lib/icon-stroke.js";
5
+ import { FOCUS_RING } from "../../lib/focus-ring.js";
4
6
  import { Badge } from "../../primitives/badge.js";
5
7
  import { Button } from "../../primitives/button.js";
8
+ import { TONE_DOT } from "../../lib/tone-utils.js";
6
9
  import { cn } from "../../lib/utils.js";
7
10
  import { StatusChip } from "./status-chip.js";
8
- // -------------------------------------------------------------------------- //
9
- // Toolbar — sticky top, dense status row + actions
10
- // -------------------------------------------------------------------------- //
11
- function ToolbarImpl({ L, previewMode, isBusy, status, liveKeys, reachableCount, unreachableCount, onOpenCatalogue, onOpenSave, onDone, hasAnyCell, }) {
12
- return (_jsxs("header", { className: "bg-background/80 sticky top-0 z-10 -mx-1 flex flex-wrap items-center gap-3 border-b px-1 py-2 backdrop-blur", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: cn("inline-flex size-6 items-center justify-center rounded-md", previewMode ? "bg-emerald-500/10 text-emerald-500" : "bg-primary/10 text-primary"), "aria-hidden": "true", children: previewMode ? _jsx(Eye, { className: "size-3.5" }) : _jsx(Layers, { className: "size-3.5" }) }), _jsx("h2", { className: "text-sm font-semibold tracking-tight", children: L.title }), _jsx(Badge, { variant: previewMode ? "outline" : "secondary", className: "font-normal", children: previewMode ? L.previewBadge : L.builderBadge })] }), _jsxs("div", { className: "text-muted-foreground hidden items-center gap-3 text-[11px] sm:flex", children: [_jsxs("span", { className: "inline-flex items-center gap-1.5", children: [_jsx("span", { className: "size-1.5 rounded-full bg-emerald-500" }), _jsxs("span", { children: [_jsx("span", { className: "text-foreground font-medium", children: liveKeys }), " live"] })] }), _jsx("span", { className: "bg-border h-3 w-px", "aria-hidden": "true" }), _jsxs("span", { children: [_jsx("span", { className: "text-foreground font-medium", children: reachableCount }), " reachable"] }), unreachableCount > 0 && (_jsxs(_Fragment, { children: [_jsx("span", { className: "bg-border h-3 w-px", "aria-hidden": "true" }), _jsxs("span", { children: [_jsx("span", { className: "text-foreground font-medium", children: unreachableCount }), " unreachable"] })] })), _jsx(StatusChip, { status: status, L: L })] }), _jsxs("div", { className: "ml-auto flex items-center gap-1", children: [_jsxs(Button, { variant: "ghost", size: "sm", onClick: onOpenCatalogue, children: [_jsx(Library, {}), " ", L.catalogue] }), _jsxs(Button, { size: "sm", onClick: onOpenSave, disabled: isBusy || !hasAnyCell, children: [_jsx(Save, {}), " ", L.save] }), onDone && (_jsxs(Button, { variant: "outline", size: "sm", onClick: onDone, children: [_jsx(Check, {}), " ", L.done] }))] })] }));
11
+ /** The live-context stats and the refresh state: data-source vocabulary, so advanced mode only. */
12
+ function Stats({ L, status, liveKeys, reachableCount, unreachableCount, }) {
13
+ return (_jsxs("div", { className: "text-muted-foreground text-small hidden items-center gap-3 sm:flex", children: [_jsxs("span", { className: "inline-flex items-center gap-1.5", children: [_jsx("span", { "aria-hidden": "true", className: `size-1.5 rounded-full ${TONE_DOT.success}` }), _jsxs("span", { children: [_jsx("span", { className: "text-foreground font-medium", children: liveKeys }), " ", L.statsLive] })] }), _jsx("span", { className: "bg-border h-3 w-px", "aria-hidden": "true" }), _jsxs("span", { children: [_jsx("span", { className: "text-foreground font-medium", children: reachableCount }), " ", L.statsReachable] }), unreachableCount > 0 && (_jsxs(_Fragment, { children: [_jsx("span", { className: "bg-border h-3 w-px", "aria-hidden": "true" }), _jsxs("span", { children: [_jsx("span", { className: "text-foreground font-medium", children: unreachableCount }), " ", L.statsUnreachable] })] })), _jsx(StatusChip, { status: status, L: L })] }));
13
14
  }
14
- export const Toolbar = memo(ToolbarImpl);
15
+ /**
16
+ * The unsaved marker. The live region is always mounted (only its content
17
+ * changes), so a screen reader hears the marker appear and go.
18
+ */
19
+ function UnsavedMarker({ L, unsaved }) {
20
+ return (_jsx("span", { role: "status", "data-slot": "builder-unsaved", className: "text-muted-foreground text-small inline-flex items-center gap-1.5", children: unsaved && (_jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": "true", className: `size-2 rounded-full ${TONE_DOT.warning}` }), L.unsavedChanges] })) }));
21
+ }
22
+ function ToolbarImpl({ L, previewMode, isBusy, status, liveKeys, reachableCount, unreachableCount, advanced, onToggleAdvanced, unsaved, onOpenCatalogue, onOpenSave, onDiscard, onApply, hasAnyCell, }) {
23
+ return (_jsxs("header", { className: "bg-background/80 sticky top-0 z-10 -mx-1 flex flex-wrap items-center gap-x-3 gap-y-2 border-b px-1 py-2 backdrop-blur", children: [_jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-2", children: [_jsx("h2", { "data-slot": "builder-title", tabIndex: -1, className: cn("rounded-sm text-sm font-semibold tracking-tight", FOCUS_RING), children: L.title }), _jsx(Badge, { variant: previewMode ? "outline" : "secondary", className: "font-normal", children: previewMode ? L.previewBadge : L.builderBadge }), _jsx(UnsavedMarker, { L: L, unsaved: unsaved })] }), advanced && (_jsx(Stats, { L: L, status: status, liveKeys: liveKeys, reachableCount: reachableCount, unreachableCount: unreachableCount })), _jsxs("div", { className: "ml-auto flex flex-wrap items-center gap-1", children: [_jsxs(Button, { variant: "ghost", size: "sm", "aria-pressed": advanced, title: L.advancedHint, onClick: onToggleAdvanced, className: "aria-pressed:bg-accent aria-pressed:text-accent-foreground", children: [_jsx(Wrench, { "aria-hidden": "true" }), " ", L.advanced] }), advanced && (_jsxs(Button, { variant: "ghost", size: "sm", onClick: onOpenCatalogue, children: [_jsx(Library, { "aria-hidden": "true" }), " ", L.catalogue] })), _jsxs(Button, { variant: "outline", size: "sm", title: L.saveHint, onClick: onOpenSave, disabled: isBusy || !hasAnyCell, children: [_jsx(Save, { "aria-hidden": "true" }), " ", L.save] }), _jsxs(Button, { variant: "ghost", size: "sm",
24
+ // Without Apply there is no view to leave to: Discard resets in place.
25
+ title: onApply ? L.discardHint : L.discardHintStandalone, onClick: onDiscard, children: [_jsx(Undo2, { "aria-hidden": "true" }), " ", L.discard] }), onApply && (_jsxs(Button, { size: "sm", title: L.applyHint, onClick: onApply, children: [_jsx(Check, { "aria-hidden": "true" }), " ", L.apply] }))] })] }));
26
+ }
27
+ /** A dense chrome bar: its Lucide icons draw at stroke 2 (CI §11), not the view's 2.5. */
28
+ function DenseToolbar(props) {
29
+ return (_jsx(LucideProvider, { strokeWidth: DENSE_ICON_STROKE, children: _jsx(ToolbarImpl, { ...props }) }));
30
+ }
31
+ export const Toolbar = memo(DenseToolbar);
15
32
  //# sourceMappingURL=Toolbar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Toolbar.js","sourceRoot":"","sources":["../../../src/app/builder/Toolbar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAC5B,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACnD,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAA;AAEvC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,gFAAgF;AAChF,mDAAmD;AACnD,gFAAgF;AAEhF,SAAS,WAAW,CAAC,EACnB,CAAC,EACD,WAAW,EACX,MAAM,EACN,MAAM,EACN,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,MAAM,EACN,UAAU,GAaX;IACC,OAAO,CACL,kBAAQ,SAAS,EAAC,6GAA6G,aAC7H,eAAK,SAAS,EAAC,yBAAyB,aACtC,eACE,SAAS,EAAE,EAAE,CACX,2DAA2D,EAC3D,WAAW,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,4BAA4B,CAClF,iBACW,MAAM,YAEjB,WAAW,CAAC,CAAC,CAAC,KAAC,GAAG,IAAC,SAAS,EAAC,UAAU,GAAG,CAAC,CAAC,CAAC,KAAC,MAAM,IAAC,SAAS,EAAC,UAAU,GAAG,GACxE,EACP,aAAI,SAAS,EAAC,sCAAsC,YAAE,CAAC,CAAC,KAAK,GAAM,EACnE,KAAC,KAAK,IAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,SAAS,EAAC,aAAa,YAC3E,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,GACxC,IACJ,EAEN,eAAK,SAAS,EAAC,qEAAqE,aAClF,gBAAM,SAAS,EAAC,kCAAkC,aAChD,eAAM,SAAS,EAAC,sCAAsC,GAAG,EACzD,2BACE,eAAM,SAAS,EAAC,6BAA6B,YAAE,QAAQ,GAAQ,aAC1D,IACF,EACP,eAAM,SAAS,EAAC,oBAAoB,iBAAa,MAAM,GAAG,EAC1D,2BACE,eAAM,SAAS,EAAC,6BAA6B,YAAE,cAAc,GAAQ,kBAChE,EACN,gBAAgB,GAAG,CAAC,IAAI,CACvB,8BACE,eAAM,SAAS,EAAC,oBAAoB,iBAAa,MAAM,GAAG,EAC1D,2BACE,eAAM,SAAS,EAAC,6BAA6B,YAAE,gBAAgB,GAAQ,oBAClE,IACN,CACJ,EACD,KAAC,UAAU,IAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,GAAI,IAChC,EAEN,eAAK,SAAS,EAAC,iCAAiC,aAC9C,MAAC,MAAM,IAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,eAAe,aACxD,KAAC,OAAO,KAAG,OAAE,CAAC,CAAC,SAAS,IACjB,EACT,MAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC,UAAU,aACpE,KAAC,IAAI,KAAG,OAAE,CAAC,CAAC,IAAI,IACT,EACR,MAAM,IAAI,CACT,MAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,MAAM,aACjD,KAAC,KAAK,KAAG,OAAE,CAAC,CAAC,IAAI,IACV,CACV,IACG,IACC,CACV,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,CAAA"}
1
+ {"version":3,"file":"Toolbar.js","sourceRoot":"","sources":["../../../src/app/builder/Toolbar.tsx"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { ReachableWidget, RowDef, WidgetProps } from "@miragon/mcp-toolkit-core";
1
+ import type { DisplayText, ReachableWidget, RowDef, WidgetProps } from "@miragon/mcp-toolkit-core";
2
2
  import type { WidgetComponent } from "../widget-renderer.js";
3
3
  import type { LayoutBuilderLabels } from "./labels.js";
4
4
  /**
@@ -9,7 +9,13 @@ import type { LayoutBuilderLabels } from "./labels.js";
9
9
  export interface WorkspaceProps {
10
10
  L: Required<LayoutBuilderLabels>;
11
11
  paletteByApp: [string, ReachableWidget[]][];
12
+ /** Each app's title (or its key) by app name: the palette's group headings. */
13
+ appDisplayByName: Map<string, DisplayText>;
12
14
  paletteCount: number;
15
+ /** The first catalogue answer is still on its way: the palette shows a loading state. */
16
+ paletteLoading: boolean;
17
+ /** The empty palette's next step: show the data sources (it turns on advanced mode). */
18
+ onOpenDataSources: () => void;
13
19
  activeRows: RowDef[];
14
20
  focusedRowIndex: number;
15
21
  setFocusedRowIndex: (idx: number) => void;
@@ -23,12 +29,26 @@ export interface WorkspaceProps {
23
29
  onAddWidget: (widgetId: string, targetRowIdx?: number) => void;
24
30
  onConfigureCell: (rowIdx: number, cellIdx: number) => void;
25
31
  propsSchemaByWidgetId: Map<string, Record<string, unknown>>;
32
+ /** Title, summary (or their keys) per widget id: the canvas cells' names. */
33
+ displayByWidgetId: Map<string, DisplayText>;
34
+ /** Advanced mode adds the technical lines (a widget's required keys, cell ids). */
35
+ advanced: boolean;
26
36
  widgets: Record<string, WidgetComponent>;
27
37
  widgetProps: WidgetProps;
28
- showAddTabButton?: boolean;
38
+ /** Offered next to "Add row" while the draft has no tabs yet. */
29
39
  onAddTab?: () => void;
30
40
  }
31
- declare function WorkspaceImpl({ L, paletteByApp, paletteCount, activeRows, focusedRowIndex, setFocusedRowIndex, dragOverRow, setDragOverRow, onAddRow, onRemoveRow, onMoveRow, onSetCellSpan, onRemoveCell, onAddWidget, onConfigureCell, propsSchemaByWidgetId, widgets, widgetProps, showAddTabButton, onAddTab, }: WorkspaceProps): import("react").JSX.Element;
41
+ declare function WorkspaceImpl({ L, paletteByApp, appDisplayByName, paletteCount, paletteLoading, onOpenDataSources, activeRows, focusedRowIndex, setFocusedRowIndex, dragOverRow, setDragOverRow, onAddRow, onRemoveRow, onMoveRow, onSetCellSpan, onRemoveCell, onAddWidget, onConfigureCell, propsSchemaByWidgetId, displayByWidgetId, advanced, widgets, widgetProps, onAddTab, }: WorkspaceProps): import("react").JSX.Element;
32
42
  export declare const Workspace: import("react").MemoExoticComponent<typeof WorkspaceImpl>;
43
+ /**
44
+ * The palette without any element. It speaks no data-source words (they sit
45
+ * behind Advanced); its one next step opens the data sources, also when the
46
+ * layout already has cells and the builder's empty state is not shown.
47
+ * Exported for its tests only.
48
+ */
49
+ export declare function PaletteEmpty({ L, onOpenDataSources, }: {
50
+ L: Required<LayoutBuilderLabels>;
51
+ onOpenDataSources: () => void;
52
+ }): import("react").JSX.Element;
33
53
  export {};
34
54
  //# sourceMappingURL=Workspace.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Workspace.d.ts","sourceRoot":"","sources":["../../../src/app/builder/Workspace.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAIrF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAQtD;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAA;IAChC,YAAY,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,EAAE,CAAA;IAC3C,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IAC5C,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAA;IACtD,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACtE,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACvD,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9D,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1D,qBAAqB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAC3D,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IACxC,WAAW,EAAE,WAAW,CAAA;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB;AAED,iBAAS,aAAa,CAAC,EACrB,CAAC,EACD,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,QAAQ,EACR,WAAW,EACX,SAAS,EACT,aAAa,EACb,YAAY,EACZ,WAAW,EACX,eAAe,EACf,qBAAqB,EACrB,OAAO,EACP,WAAW,EACX,gBAAgB,EAChB,QAAQ,GACT,EAAE,cAAc,+BA4EhB;AAED,eAAO,MAAM,SAAS,2DAAsB,CAAA"}
1
+ {"version":3,"file":"Workspace.d.ts","sourceRoot":"","sources":["../../../src/app/builder/Workspace.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAMlG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAE5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAStD;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAA;IAChC,YAAY,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,EAAE,CAAA;IAC3C,+EAA+E;IAC/E,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IAC1C,YAAY,EAAE,MAAM,CAAA;IACpB,yFAAyF;IACzF,cAAc,EAAE,OAAO,CAAA;IACvB,wFAAwF;IACxF,iBAAiB,EAAE,MAAM,IAAI,CAAA;IAC7B,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IAC5C,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAA;IACtD,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACtE,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACvD,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9D,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1D,qBAAqB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAC3D,6EAA6E;IAC7E,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IAC3C,mFAAmF;IACnF,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IACxC,WAAW,EAAE,WAAW,CAAA;IACxB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB;AAED,iBAAS,aAAa,CAAC,EACrB,CAAC,EACD,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,QAAQ,EACR,WAAW,EACX,SAAS,EACT,aAAa,EACb,YAAY,EACZ,WAAW,EACX,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EACjB,QAAQ,EACR,OAAO,EACP,WAAW,EACX,QAAQ,GACT,EAAE,cAAc,+BAuDhB;AAED,eAAO,MAAM,SAAS,2DAAsB,CAAA;AAuF5C;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAC3B,CAAC,EACD,iBAAiB,GAClB,EAAE;IACD,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAA;IAChC,iBAAiB,EAAE,MAAM,IAAI,CAAA;CAC9B,+BAYA"}
@@ -1,23 +1,73 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { memo } from "react";
3
- import { GripVertical, Plus } from "lucide-react";
2
+ import { memo, useId } from "react";
3
+ import { GripVertical, Plus, SlidersHorizontal } from "lucide-react";
4
+ import { FOCUS_RING } from "../../lib/focus-ring.js";
5
+ import { cn } from "../../lib/utils.js";
4
6
  import { Badge } from "../../primitives/badge.js";
5
7
  import { Button } from "../../primitives/button.js";
6
- import { ScrollArea } from "../../primitives/scroll-area.js";
8
+ import { Skeleton } from "../../primitives/skeleton.js";
9
+ import { displayLabel } from "./builder-model.js";
7
10
  import { WIDGET_DRAG_MIME } from "./labels.js";
8
11
  import { CanvasRow } from "./CanvasRow.js";
9
- function WorkspaceImpl({ L, paletteByApp, paletteCount, activeRows, focusedRowIndex, setFocusedRowIndex, dragOverRow, setDragOverRow, onAddRow, onRemoveRow, onMoveRow, onSetCellSpan, onRemoveCell, onAddWidget, onConfigureCell, propsSchemaByWidgetId, widgets, widgetProps, showAddTabButton, onAddTab, }) {
10
- return (_jsxs("div", { className: "grid grid-cols-12 gap-4", children: [_jsx("aside", { className: "col-span-12 lg:col-span-3 xl:col-span-2", children: _jsxs("div", { className: "lg:sticky lg:top-16", children: [_jsxs("div", { className: "text-muted-foreground mb-2 flex items-center gap-2 text-[10px] font-semibold tracking-[0.12em] uppercase", children: [L.paletteHeader, _jsx(Badge, { variant: "outline", className: "px-1.5 text-[10px]", children: paletteCount })] }), paletteCount === 0 ? (_jsx("div", { className: "text-muted-foreground rounded-md border border-dashed p-3 text-xs", children: L.paletteEmpty })) : (_jsx(ScrollArea, { className: "lg:max-h-[70vh]", children: _jsx("div", { className: "flex flex-col gap-3 pr-1", children: paletteByApp.map(([app, ws]) => (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("div", { className: "text-muted-foreground/80 text-[10px] font-semibold tracking-wide uppercase", children: app }), ws.map((w) => (_jsx(PaletteItem, { w: w, onClick: () => onAddWidget(w.id) }, w.id)))] }, app))) }) })), showAddTabButton && onAddTab && (_jsxs(Button, { variant: "ghost", size: "xs", onClick: onAddTab, className: "text-muted-foreground hover:text-foreground mt-3", children: [_jsx(Plus, {}), " ", L.addTab] }))] }) }), _jsx("section", { className: "col-span-12 lg:col-span-9 xl:col-span-10", children: _jsxs("div", { className: "flex flex-col gap-3", children: [activeRows.map((row, rowIdx) => (_jsx(CanvasRow, { L: L, row: row, rowIdx: rowIdx, focused: rowIdx === focusedRowIndex, isFirst: rowIdx === 0, isLast: rowIdx === activeRows.length - 1, dragOver: dragOverRow === rowIdx, setDragOverRow: setDragOverRow, setFocusedRowIndex: setFocusedRowIndex, onRemoveRow: onRemoveRow, onMoveRow: onMoveRow, onSetCellSpan: onSetCellSpan, onRemoveCell: onRemoveCell, onAddWidget: onAddWidget, onConfigureCell: onConfigureCell, propsSchemaByWidgetId: propsSchemaByWidgetId, widgets: widgets, widgetProps: widgetProps }, rowIdx))), _jsxs(Button, { variant: "outline", size: "sm", onClick: onAddRow, className: "self-start text-xs", children: [_jsx(Plus, {}), " ", L.addRow] })] }) })] }));
12
+ import { useDisplayResolver } from "./use-display-resolver.js";
13
+ function WorkspaceImpl({ L, paletteByApp, appDisplayByName, paletteCount, paletteLoading, onOpenDataSources, activeRows, focusedRowIndex, setFocusedRowIndex, dragOverRow, setDragOverRow, onAddRow, onRemoveRow, onMoveRow, onSetCellSpan, onRemoveCell, onAddWidget, onConfigureCell, propsSchemaByWidgetId, displayByWidgetId, advanced, widgets, widgetProps, onAddTab, }) {
14
+ return (_jsxs("div", { className: "grid grid-cols-12 gap-4", children: [_jsx(Palette, { L: L, paletteByApp: paletteByApp, appDisplayByName: appDisplayByName, paletteCount: paletteCount, loading: paletteLoading, advanced: advanced, onAddWidget: onAddWidget, onOpenDataSources: onOpenDataSources }), _jsx("section", { className: "col-span-12 lg:col-span-9 xl:col-span-10", children: _jsxs("div", { className: "flex flex-col gap-3", children: [activeRows.map((row, rowIdx) => (_jsx(CanvasRow, { L: L, row: row, rowIdx: rowIdx, focused: rowIdx === focusedRowIndex, isFirst: rowIdx === 0, isLast: rowIdx === activeRows.length - 1, dragOver: dragOverRow === rowIdx, setDragOverRow: setDragOverRow, setFocusedRowIndex: setFocusedRowIndex, onRemoveRow: onRemoveRow, onMoveRow: onMoveRow, onSetCellSpan: onSetCellSpan, onRemoveCell: onRemoveCell, onAddWidget: onAddWidget, onConfigureCell: onConfigureCell, propsSchemaByWidgetId: propsSchemaByWidgetId, displayByWidgetId: displayByWidgetId, advanced: advanced, widgets: widgets, widgetProps: widgetProps }, rowIdx))), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs(Button, { variant: "outline", size: "sm", onClick: onAddRow, children: [_jsx(Plus, { "aria-hidden": "true" }), " ", L.addRow] }), onAddTab && (_jsxs(Button, { variant: "ghost", size: "sm", onClick: onAddTab, children: [_jsx(Plus, { "aria-hidden": "true" }), " ", L.addTab] }))] })] }) })] }));
11
15
  }
12
16
  export const Workspace = memo(WorkspaceImpl);
13
17
  // -------------------------------------------------------------------------- //
18
+ // Palette — the elements to add, grouped by app (sticky on lg+)
19
+ // -------------------------------------------------------------------------- //
20
+ function Palette({ L, paletteByApp, appDisplayByName, paletteCount, loading, advanced, onAddWidget, onOpenDataSources, }) {
21
+ const headingId = useId();
22
+ return (_jsx("aside", { "aria-labelledby": headingId, className: "col-span-12 lg:col-span-3 xl:col-span-2", children: _jsxs("div", { className: "lg:sticky lg:top-16", children: [_jsxs("h3", { id: headingId, className: "text-muted-foreground text-small mb-2 flex items-center gap-2 font-semibold", children: [L.paletteHeader, !loading && (_jsx(Badge, { variant: "outline", className: "px-1.5", children: paletteCount }))] }), loading ? (_jsx(PaletteLoading, { L: L })) : paletteCount === 0 ? (_jsx(PaletteEmpty, { L: L, onOpenDataSources: onOpenDataSources })) : (_jsx("div", { className: "flex flex-col gap-3 lg:max-h-[70vh] lg:overflow-y-auto lg:pr-1", children: paletteByApp.map(([app, ws]) => (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(PaletteGroupHeading, { app: app, display: appDisplayByName.get(app), advanced: advanced }), _jsx("ul", { className: "flex flex-col gap-1", children: ws.map((w) => (_jsx("li", { children: _jsx(PaletteItem, { L: L, w: w, advanced: advanced, onClick: () => onAddWidget(w.id) }) }, w.id))) })] }, app))) }))] }) }));
23
+ }
24
+ /** The palette while the first catalogue answer is on its way (CI §9: a skeleton, not "none"). */
25
+ function PaletteLoading({ L }) {
26
+ return (_jsxs("div", { "data-slot": "builder-palette-loading", className: "flex flex-col gap-1", children: [_jsx(Skeleton, { "aria-hidden": "true", className: "h-9 w-full" }), _jsx(Skeleton, { "aria-hidden": "true", className: "h-9 w-full" }), _jsx(Skeleton, { "aria-hidden": "true", className: "h-9 w-3/4" }), _jsx("p", { role: "status", className: "text-muted-foreground text-small mt-1", children: L.paletteLoading })] }));
27
+ }
28
+ /**
29
+ * The palette without any element. It speaks no data-source words (they sit
30
+ * behind Advanced); its one next step opens the data sources, also when the
31
+ * layout already has cells and the builder's empty state is not shown.
32
+ * Exported for its tests only.
33
+ */
34
+ export function PaletteEmpty({ L, onOpenDataSources, }) {
35
+ return (_jsxs("div", { "data-slot": "builder-palette-empty", className: "text-muted-foreground text-small flex flex-col items-start gap-2 rounded-md border border-dashed p-3", children: [_jsx("p", { children: L.paletteEmpty }), _jsxs(Button, { size: "sm", variant: "outline", onClick: onOpenDataSources, children: [_jsx(SlidersHorizontal, { "aria-hidden": "true" }), " ", L.openDataSources] })] }));
36
+ }
37
+ // -------------------------------------------------------------------------- //
38
+ // Palette group heading
39
+ // -------------------------------------------------------------------------- //
40
+ /**
41
+ * The heading of one app's group in the palette: the app's title. Without a
42
+ * title the app's name is a technical namespace, so it heads the group only in
43
+ * advanced mode; there it also follows a title as a quiet mono hint.
44
+ */
45
+ function PaletteGroupHeading({ app, display, advanced, }) {
46
+ const { locale, resolveKey } = useDisplayResolver();
47
+ const { label, hint } = displayLabel(display ?? {}, app, locale, resolveKey);
48
+ if (hint === undefined && !advanced)
49
+ return null;
50
+ return (_jsxs("div", { "data-slot": "builder-palette-group", className: "text-muted-foreground text-small font-semibold", children: [label, advanced && hint && _jsx("span", { className: "ml-1.5 font-mono font-normal", children: hint })] }));
51
+ }
52
+ // -------------------------------------------------------------------------- //
14
53
  // Palette item
15
54
  // -------------------------------------------------------------------------- //
16
- function PaletteItemImpl({ w, onClick }) {
17
- return (_jsxs("button", { type: "button", draggable: true, onDragStart: (e) => {
55
+ /**
56
+ * One widget in the palette: its title and one-line summary, the widget id as
57
+ * a quiet mono line (only next to a real title), and in advanced mode the keys
58
+ * it needs. A click (or Enter) adds it to the target row; dragging drops it
59
+ * on any row.
60
+ */
61
+ function PaletteItemImpl({ L, w, advanced, onClick, }) {
62
+ const { locale, resolveKey } = useDisplayResolver();
63
+ const { label, hint, summary } = displayLabel(w, w.id, locale, resolveKey);
64
+ // On the hovered --accent surface quiet text takes the surface's
65
+ // foreground: --muted-foreground drops to 3.66:1 there in dark.
66
+ const quiet = "text-muted-foreground group-hover:text-accent-foreground block w-full truncate";
67
+ return (_jsxs("button", { type: "button", draggable: true, "data-slot": "builder-palette-item", onDragStart: (e) => {
18
68
  e.dataTransfer.setData(WIDGET_DRAG_MIME, w.id);
19
69
  e.dataTransfer.effectAllowed = "copy";
20
- }, onClick: onClick, className: "hover:bg-accent hover:text-accent-foreground group bg-background/50 flex cursor-grab flex-col items-start gap-0.5 rounded-md border px-2 py-1.5 text-left text-xs transition-colors active:cursor-grabbing", children: [_jsxs("span", { className: "flex w-full items-center justify-between gap-2", children: [_jsx("span", { className: "truncate font-mono", children: w.id }), _jsx(GripVertical, { className: "text-muted-foreground/40 group-hover:text-muted-foreground size-3" })] }), w.requires.length > 0 && (_jsxs("span", { className: "text-muted-foreground/80 truncate font-mono text-[10px]", children: ["\u2190 ", w.requires.join(", ")] }))] }));
70
+ }, onClick: onClick, className: cn("hover:bg-accent hover:text-accent-foreground group bg-background flex w-full cursor-grab flex-col items-start gap-0.5 rounded-md border px-2 py-1.5 text-left transition-colors active:cursor-grabbing", FOCUS_RING), children: [_jsxs("span", { className: "flex w-full items-center justify-between gap-2", children: [_jsx("span", { className: "truncate text-sm font-medium", children: label }), _jsx(GripVertical, { "aria-hidden": "true", className: "text-muted-foreground group-hover:text-accent-foreground size-3.5 shrink-0" })] }), summary && _jsx("span", { className: cn(quiet, "text-small"), children: summary }), hint && _jsx("span", { className: cn(quiet, "text-small font-mono"), children: hint }), advanced && w.requires.length > 0 && (_jsxs("span", { className: cn(quiet, "text-small"), children: [L.catalogueNeedsKeys, " ", _jsx("span", { className: "font-mono", children: w.requires.join(", ") })] }))] }));
21
71
  }
22
72
  const PaletteItem = memo(PaletteItemImpl);
23
73
  //# sourceMappingURL=Workspace.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Workspace.js","sourceRoot":"","sources":["../../../src/app/builder/Workspace.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Workspace.js","sourceRoot":"","sources":["../../../src/app/builder/Workspace.tsx"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@
7
7
  * `parseKeyValue ↔ keysToEntries ↔ entriesToKeys` round-trip and
8
8
  * `draftToLayout` — unit-testable in isolation.
9
9
  */
10
- import type { LayoutConfig, PipelineContext, RowDef } from "@miragon/mcp-toolkit-core";
10
+ import type { DisplayText, LayoutConfig, PipelineContext, PipelineStepRef, RowDef } from "@miragon/mcp-toolkit-core";
11
11
  export interface DraftTab {
12
12
  label: string;
13
13
  rows: RowDef[];
@@ -71,9 +71,10 @@ export declare function entriesToKeys(entries: KeyEntry[]): Record<string, unkno
71
71
  * Compact preview of a value as it currently lives in the pipeline.
72
72
  * Used as the placeholder when the editor's `rawValue` is empty so the
73
73
  * user can see what the server is actually working with right now
74
- * without the editor overwriting their (empty) input.
74
+ * without the editor overwriting their (empty) input. `prefix` is the
75
+ * localized word for "live" (the builder passes its catalog's).
75
76
  */
76
- export declare function formatLiveKeyValue(value: unknown): string | undefined;
77
+ export declare function formatLiveKeyValue(value: unknown, prefix?: string): string | undefined;
77
78
  export declare function valueTypeLabel(raw: string): string;
78
79
  export declare function sizeToSpan(size: string): number;
79
80
  export declare function defaultStepIdFor(stepId: string, takenIds: Set<string>): string;
@@ -83,4 +84,146 @@ export declare function defaultStepIdFor(stepId: string, takenIds: Set<string>):
83
84
  * `WidgetRenderer` expects.
84
85
  */
85
86
  export declare function toPipelineContext(ctx: WireContext): PipelineContext;
87
+ /** Resolves an i18n key in the active locale; `undefined` when it is unknown. */
88
+ export type DisplayKeyResolver = (key: string) => string | undefined;
89
+ /**
90
+ * A {@link DisplayKeyResolver} over a translate function that echoes unknown
91
+ * keys (the `createTranslator` / `useTranslate` contract): the echo, or a
92
+ * blank result, means "unknown", so the caller falls back to its inline text.
93
+ */
94
+ export declare function keyResolverFrom(translate: (key: string) => string): DisplayKeyResolver;
95
+ /** How the builder names one entry: a label, the technical id as a quiet hint, a one-liner. */
96
+ export interface DisplayLabel {
97
+ /** The name people read: the entry's title, else its id. */
98
+ label: string;
99
+ /** The technical id, set only when the label is a real title (so it is never shown twice). */
100
+ hint?: string;
101
+ /** The one-line summary, when the entry has one. */
102
+ summary?: string;
103
+ }
104
+ /**
105
+ * The builder's name for a widget or a step: its `titleKey` (when `resolveKey`
106
+ * knows it), its `title` in `locale`, else the id. The id comes back as `hint`
107
+ * only next to a real title. The `description` is the LLM's text and never
108
+ * appears here.
109
+ */
110
+ export declare function displayLabel(entry: DisplayText, id: string, locale: string, resolveKey?: DisplayKeyResolver): DisplayLabel;
111
+ /** A props-sheet field: its label, the raw property name as a hint, and its help line. */
112
+ export interface PropFieldText {
113
+ label: string;
114
+ /** The property name, set only when the label differs from it. */
115
+ hint?: string;
116
+ help?: string;
117
+ }
118
+ /**
119
+ * The props sheet's text for one `propsSchema` property. Label: the
120
+ * `x-display` title (key or text), else the standard JSON Schema `title`,
121
+ * else the property name. Help: the `x-display` summary, else the property's
122
+ * `description`.
123
+ */
124
+ export declare function propFieldText(name: string, prop: Record<string, unknown>, locale: string, resolveKey?: DisplayKeyResolver): PropFieldText;
125
+ /**
126
+ * Whether the draft holds at least one element on ANY tab, not only the
127
+ * active one: a new, still empty tab must not disable "Save as dashboard" or
128
+ * the preview while another tab has content.
129
+ */
130
+ export declare function draftHasCells(draft: DraftLayout): boolean;
131
+ /**
132
+ * A comparable fingerprint of what Apply and Save hand on: the layout, the
133
+ * keys (blank names dropped, values parsed) and the steps that name a step.
134
+ * An empty key or step row the user has not filled in changes nothing.
135
+ */
136
+ export declare function builderSnapshot(draft: DraftLayout, keyEntries: KeyEntry[], stepEntries: PipelineStepRef[]): string;
137
+ /** What Apply hands to `onExit`: the draft, plus the live context it was previewed with. */
138
+ export interface BuilderExitCommit {
139
+ layout: LayoutConfig;
140
+ keys?: Record<string, unknown>;
141
+ steps?: PipelineStepRef[];
142
+ title?: string;
143
+ context?: WireContext;
144
+ }
145
+ /**
146
+ * The commit of Apply: the layout, keys and steps exactly as a save would send
147
+ * them, and the live context in its wire shape (`stepIds` + keyed `stepData`)
148
+ * so the view renders the just-built layout without another round trip.
149
+ */
150
+ export declare function toExitCommit(draft: DraftLayout, keyEntries: KeyEntry[], stepEntries: PipelineStepRef[], title: string | undefined, live: PipelineContext): BuilderExitCommit;
151
+ export interface DraftStatus {
152
+ /**
153
+ * The draft differs from the view as it was before editing: what Discard
154
+ * takes out of the view, so it decides whether Discard asks first.
155
+ */
156
+ changed: boolean;
157
+ /**
158
+ * The draft has changes that would be lost: it differs from the view before
159
+ * editing AND from the last saved dashboard (a draft equal to either one
160
+ * loses nothing). Drives the unsaved marker and tells the discard
161
+ * confirmation whether a dashboard keeps the changes.
162
+ */
163
+ unsaved: boolean;
164
+ }
165
+ /** Compares the current {@link builderSnapshot} with the pre-edit one and the last saved one. */
166
+ export declare function draftStatus(current: string, baseline: string, saved: string | null): DraftStatus;
167
+ /** The builder's leave actions, built by {@link builderLeave}. */
168
+ export interface BuilderLeave {
169
+ /** Apply: hands the commit to `onExit`. Absent without `onExit` (no view to apply to). */
170
+ apply?: () => void;
171
+ /** Discard: asks first when the view would lose changes, else leaves at once. */
172
+ discard: () => void;
173
+ /** Discard without asking (the confirmation's own action). */
174
+ discardNow: () => void;
175
+ }
176
+ /**
177
+ * The builder's leave actions. Apply hands `commit()` to `onExit`. Discard
178
+ * calls `onExit()` WITHOUT a commit, so the view stays as it was before
179
+ * editing; without `onExit` it calls `onReset()`, which restores the draft in
180
+ * place. Discard asks first (`confirm`) only when the draft `changed` the
181
+ * view: a draft that matches the view before editing loses nothing, even when
182
+ * it differs from a saved dashboard.
183
+ */
184
+ export declare function builderLeave({ changed, onExit, onReset, commit, confirm, }: {
185
+ changed: boolean;
186
+ onExit?: (commit?: BuilderExitCommit) => void;
187
+ onReset: () => void;
188
+ commit: () => BuilderExitCommit;
189
+ confirm: () => void;
190
+ }): BuilderLeave;
191
+ /**
192
+ * What a key press on a tab trigger does: F2 renames any tab; Enter renames
193
+ * the tab that is already active (on another tab Enter keeps selecting it,
194
+ * the tabs' own behaviour). `null` leaves the key to the tabs.
195
+ */
196
+ export declare function tabTriggerKeyAction(key: string, isActive: boolean): "rename" | null;
197
+ /** What a key press in a tab's rename field does: Enter commits, Escape cancels. */
198
+ export declare function renameFieldKeyAction(key: string): "commit" | "cancel" | null;
199
+ /**
200
+ * Hands the focus back to a tab once its rename field closes by keyboard.
201
+ * The tab strip holds it, by the tab's INDEX: a rename that changes the label
202
+ * mounts a new tab, so a request held by the tab itself would go with the old
203
+ * one and leave the focus on the document body.
204
+ */
205
+ export interface TabRefocus {
206
+ /** The trigger of tab `tabIdx` takes the focus the next time it attaches. */
207
+ request: (tabIdx: number) => void;
208
+ /** The ref callback of tab `tabIdx`'s trigger: focuses it once while a request for it is open. */
209
+ attach: (tabIdx: number, el: {
210
+ focus: () => void;
211
+ } | null) => void;
212
+ /** The two props that wire tab `tabIdx` to this hand-back: its trigger's ref and its request. */
213
+ forTab: (tabIdx: number) => TabRefocusProps;
214
+ }
215
+ /** What one tab gets from {@link TabRefocus.forTab}. */
216
+ export interface TabRefocusProps {
217
+ triggerRef: (el: {
218
+ focus: () => void;
219
+ } | null) => void;
220
+ onRefocus: () => void;
221
+ }
222
+ /** A {@link TabRefocus} with no open request. */
223
+ export declare function createTabRefocus(): TabRefocus;
224
+ export type BuilderView = "layout" | "pipeline" | "preview";
225
+ /** The builder's views in tab order: the data sources ("pipeline") only in advanced mode. */
226
+ export declare function builderViews(advanced: boolean): BuilderView[];
227
+ /** The view to show after advanced mode switches: a view that is now hidden falls back to the layout. */
228
+ export declare function viewAfterAdvancedToggle(view: BuilderView, advanced: boolean): BuilderView;
86
229
  //# sourceMappingURL=builder-model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"builder-model.d.ts","sourceRoot":"","sources":["../../../src/app/builder/builder-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAOtF,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,EAAE,CAAA;CACf;AAED,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAA;AAE/F,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,EAAE,MAAM,CACd,MAAM,EACN;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAClF,CAAA;IACD,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAC7C;AAMD,wBAAgB,SAAS,IAAI,MAAM,EAAE,CAEpC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAElD;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,WAAW,CAWvE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,CAK9D;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAYlD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,QAAQ,EAAE,CAYnF;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAO1E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CASrE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAgBlD;AAMD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAc/C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAM9E;AAMD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,eAAe,CAMnE"}
1
+ {"version":3,"file":"builder-model.d.ts","sourceRoot":"","sources":["../../../src/app/builder/builder-model.ts"],"names":[],"mappings":"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"}