@miragon/mcp-toolkit-ui 2.7.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 (387) hide show
  1. package/README.md +7 -4
  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.js +1 -1
  7. package/dist/app/builder/BuilderBanners.js.map +1 -1
  8. package/dist/app/builder/CanvasRow.d.ts +4 -2
  9. package/dist/app/builder/CanvasRow.d.ts.map +1 -1
  10. package/dist/app/builder/CanvasRow.js +21 -7
  11. package/dist/app/builder/CanvasRow.js.map +1 -1
  12. package/dist/app/builder/CatalogueSheet.d.ts.map +1 -1
  13. package/dist/app/builder/CatalogueSheet.js +11 -4
  14. package/dist/app/builder/CatalogueSheet.js.map +1 -1
  15. package/dist/app/builder/CellPropsSheet.d.ts +7 -3
  16. package/dist/app/builder/CellPropsSheet.d.ts.map +1 -1
  17. package/dist/app/builder/CellPropsSheet.js +10 -3
  18. package/dist/app/builder/CellPropsSheet.js.map +1 -1
  19. package/dist/app/builder/DiscardDialog.d.ts +18 -0
  20. package/dist/app/builder/DiscardDialog.d.ts.map +1 -0
  21. package/dist/app/builder/DiscardDialog.js +18 -0
  22. package/dist/app/builder/DiscardDialog.js.map +1 -0
  23. package/dist/app/builder/LayoutSurface.d.ts +33 -9
  24. package/dist/app/builder/LayoutSurface.d.ts.map +1 -1
  25. package/dist/app/builder/LayoutSurface.js +74 -23
  26. package/dist/app/builder/LayoutSurface.js.map +1 -1
  27. package/dist/app/builder/PipelineStrip.d.ts +2 -1
  28. package/dist/app/builder/PipelineStrip.d.ts.map +1 -1
  29. package/dist/app/builder/PipelineStrip.js +26 -13
  30. package/dist/app/builder/PipelineStrip.js.map +1 -1
  31. package/dist/app/builder/SaveDialog.d.ts +9 -1
  32. package/dist/app/builder/SaveDialog.d.ts.map +1 -1
  33. package/dist/app/builder/SaveDialog.js +8 -2
  34. package/dist/app/builder/SaveDialog.js.map +1 -1
  35. package/dist/app/builder/Toolbar.d.ts +12 -4
  36. package/dist/app/builder/Toolbar.d.ts.map +1 -1
  37. package/dist/app/builder/Toolbar.js +18 -7
  38. package/dist/app/builder/Toolbar.js.map +1 -1
  39. package/dist/app/builder/Workspace.d.ts +23 -3
  40. package/dist/app/builder/Workspace.d.ts.map +1 -1
  41. package/dist/app/builder/Workspace.js +58 -8
  42. package/dist/app/builder/Workspace.js.map +1 -1
  43. package/dist/app/builder/builder-model.d.ts +143 -1
  44. package/dist/app/builder/builder-model.d.ts.map +1 -1
  45. package/dist/app/builder/builder-model.js +191 -1
  46. package/dist/app/builder/builder-model.js.map +1 -1
  47. package/dist/app/builder/reveal.d.ts +10 -0
  48. package/dist/app/builder/reveal.d.ts.map +1 -0
  49. package/dist/app/builder/reveal.js +10 -0
  50. package/dist/app/builder/reveal.js.map +1 -0
  51. package/dist/app/builder/use-builder-catalogue.d.ts +4 -1
  52. package/dist/app/builder/use-builder-catalogue.d.ts.map +1 -1
  53. package/dist/app/builder/use-builder-catalogue.js +44 -17
  54. package/dist/app/builder/use-builder-catalogue.js.map +1 -1
  55. package/dist/app/builder/use-builder-session.d.ts +30 -0
  56. package/dist/app/builder/use-builder-session.d.ts.map +1 -0
  57. package/dist/app/builder/use-builder-session.js +58 -0
  58. package/dist/app/builder/use-builder-session.js.map +1 -0
  59. package/dist/app/builder/use-display-resolver.d.ts +17 -0
  60. package/dist/app/builder/use-display-resolver.d.ts.map +1 -0
  61. package/dist/app/builder/use-display-resolver.js +16 -0
  62. package/dist/app/builder/use-display-resolver.js.map +1 -0
  63. package/dist/app/index.d.ts +8 -3
  64. package/dist/app/index.d.ts.map +1 -1
  65. package/dist/app/index.js +8 -2
  66. package/dist/app/index.js.map +1 -1
  67. package/dist/app/layout-builder.d.ts +13 -25
  68. package/dist/app/layout-builder.d.ts.map +1 -1
  69. package/dist/app/layout-builder.js +75 -81
  70. package/dist/app/layout-builder.js.map +1 -1
  71. package/dist/app/mcp-app-view-chrome.d.ts +12 -3
  72. package/dist/app/mcp-app-view-chrome.d.ts.map +1 -1
  73. package/dist/app/mcp-app-view-chrome.js +21 -5
  74. package/dist/app/mcp-app-view-chrome.js.map +1 -1
  75. package/dist/app/mcp-app-view-states.d.ts +11 -3
  76. package/dist/app/mcp-app-view-states.d.ts.map +1 -1
  77. package/dist/app/mcp-app-view-states.js +29 -8
  78. package/dist/app/mcp-app-view-states.js.map +1 -1
  79. package/dist/app/mcp-app-view.d.ts +33 -1
  80. package/dist/app/mcp-app-view.d.ts.map +1 -1
  81. package/dist/app/mcp-app-view.js +181 -127
  82. package/dist/app/mcp-app-view.js.map +1 -1
  83. package/dist/app/mcp-toolkit-app.d.ts +6 -1
  84. package/dist/app/mcp-toolkit-app.d.ts.map +1 -1
  85. package/dist/app/mcp-toolkit-app.js +8 -1
  86. package/dist/app/mcp-toolkit-app.js.map +1 -1
  87. package/dist/app/mcp-use-host-bridge.d.ts +15 -6
  88. package/dist/app/mcp-use-host-bridge.d.ts.map +1 -1
  89. package/dist/app/mcp-use-host-bridge.js +51 -22
  90. package/dist/app/mcp-use-host-bridge.js.map +1 -1
  91. package/dist/app/model-context.d.ts +71 -0
  92. package/dist/app/model-context.d.ts.map +1 -0
  93. package/dist/app/model-context.js +101 -0
  94. package/dist/app/model-context.js.map +1 -0
  95. package/dist/app/use-build-mode-focus.d.ts +33 -0
  96. package/dist/app/use-build-mode-focus.d.ts.map +1 -0
  97. package/dist/app/use-build-mode-focus.js +59 -0
  98. package/dist/app/use-build-mode-focus.js.map +1 -0
  99. package/dist/app/use-view-actions.d.ts +31 -0
  100. package/dist/app/use-view-actions.d.ts.map +1 -0
  101. package/dist/app/use-view-actions.js +81 -0
  102. package/dist/app/use-view-actions.js.map +1 -0
  103. package/dist/app/use-view-lifecycle.d.ts +4 -0
  104. package/dist/app/use-view-lifecycle.d.ts.map +1 -1
  105. package/dist/app/use-view-lifecycle.js +2 -0
  106. package/dist/app/use-view-lifecycle.js.map +1 -1
  107. package/dist/app/view-lifecycle.d.ts +80 -4
  108. package/dist/app/view-lifecycle.d.ts.map +1 -1
  109. package/dist/app/view-lifecycle.js +90 -3
  110. package/dist/app/view-lifecycle.js.map +1 -1
  111. package/dist/app/widget-fixture.d.ts +10 -3
  112. package/dist/app/widget-fixture.d.ts.map +1 -1
  113. package/dist/app/widget-fixture.js +21 -8
  114. package/dist/app/widget-fixture.js.map +1 -1
  115. package/dist/app/widget-props-sheet.d.ts +3 -1
  116. package/dist/app/widget-props-sheet.d.ts.map +1 -1
  117. package/dist/app/widget-props-sheet.js +22 -10
  118. package/dist/app/widget-props-sheet.js.map +1 -1
  119. package/dist/app/widget-renderer.js +1 -1
  120. package/dist/app/widget-renderer.js.map +1 -1
  121. package/dist/components/DrillButton.d.ts +9 -6
  122. package/dist/components/DrillButton.d.ts.map +1 -1
  123. package/dist/components/DrillButton.js +8 -6
  124. package/dist/components/DrillButton.js.map +1 -1
  125. package/dist/components/EmptyState.d.ts.map +1 -1
  126. package/dist/components/EmptyState.js +4 -2
  127. package/dist/components/EmptyState.js.map +1 -1
  128. package/dist/components/ErrorState.d.ts +5 -2
  129. package/dist/components/ErrorState.d.ts.map +1 -1
  130. package/dist/components/ErrorState.js +25 -8
  131. package/dist/components/ErrorState.js.map +1 -1
  132. package/dist/components/FilterBar.d.ts +15 -4
  133. package/dist/components/FilterBar.d.ts.map +1 -1
  134. package/dist/components/FilterBar.js +11 -6
  135. package/dist/components/FilterBar.js.map +1 -1
  136. package/dist/components/KpiGrid.d.ts +66 -21
  137. package/dist/components/KpiGrid.d.ts.map +1 -1
  138. package/dist/components/KpiGrid.js +101 -34
  139. package/dist/components/KpiGrid.js.map +1 -1
  140. package/dist/components/ListFooter.d.ts +31 -4
  141. package/dist/components/ListFooter.d.ts.map +1 -1
  142. package/dist/components/ListFooter.js +30 -11
  143. package/dist/components/ListFooter.js.map +1 -1
  144. package/dist/components/PagedListFooter.d.ts +57 -0
  145. package/dist/components/PagedListFooter.d.ts.map +1 -0
  146. package/dist/components/PagedListFooter.js +27 -0
  147. package/dist/components/PagedListFooter.js.map +1 -0
  148. package/dist/components/Pills.d.ts +27 -7
  149. package/dist/components/Pills.d.ts.map +1 -1
  150. package/dist/components/Pills.js +21 -6
  151. package/dist/components/Pills.js.map +1 -1
  152. package/dist/components/SectionHeading.d.ts +3 -1
  153. package/dist/components/SectionHeading.d.ts.map +1 -1
  154. package/dist/components/SectionHeading.js +6 -2
  155. package/dist/components/SectionHeading.js.map +1 -1
  156. package/dist/components/Toast.d.ts +9 -3
  157. package/dist/components/Toast.d.ts.map +1 -1
  158. package/dist/components/Toast.js +31 -16
  159. package/dist/components/Toast.js.map +1 -1
  160. package/dist/components/WidgetHeader.d.ts +34 -10
  161. package/dist/components/WidgetHeader.d.ts.map +1 -1
  162. package/dist/components/WidgetHeader.js +11 -6
  163. package/dist/components/WidgetHeader.js.map +1 -1
  164. package/dist/hooks/index.d.ts +4 -4
  165. package/dist/hooks/index.d.ts.map +1 -1
  166. package/dist/hooks/index.js +1 -1
  167. package/dist/hooks/index.js.map +1 -1
  168. package/dist/hooks/tool-result-recovery-model.d.ts +155 -0
  169. package/dist/hooks/tool-result-recovery-model.d.ts.map +1 -0
  170. package/dist/hooks/tool-result-recovery-model.js +273 -0
  171. package/dist/hooks/tool-result-recovery-model.js.map +1 -0
  172. package/dist/hooks/use-tool-query.d.ts +56 -14
  173. package/dist/hooks/use-tool-query.d.ts.map +1 -1
  174. package/dist/hooks/use-tool-query.js +102 -25
  175. package/dist/hooks/use-tool-query.js.map +1 -1
  176. package/dist/hooks/use-tool-result-recovery.d.ts +47 -52
  177. package/dist/hooks/use-tool-result-recovery.d.ts.map +1 -1
  178. package/dist/hooks/use-tool-result-recovery.js +58 -120
  179. package/dist/hooks/use-tool-result-recovery.js.map +1 -1
  180. package/dist/hooks/use-view-data.d.ts +52 -10
  181. package/dist/hooks/use-view-data.d.ts.map +1 -1
  182. package/dist/hooks/use-view-data.js +81 -16
  183. package/dist/hooks/use-view-data.js.map +1 -1
  184. package/dist/hooks/use-view-tool-query.d.ts +12 -7
  185. package/dist/hooks/use-view-tool-query.d.ts.map +1 -1
  186. package/dist/hooks/use-view-tool-query.js +15 -14
  187. package/dist/hooks/use-view-tool-query.js.map +1 -1
  188. package/dist/index.d.ts +17 -10
  189. package/dist/index.d.ts.map +1 -1
  190. package/dist/index.js +18 -6
  191. package/dist/index.js.map +1 -1
  192. package/dist/lib/focus-return.d.ts +61 -0
  193. package/dist/lib/focus-return.d.ts.map +1 -0
  194. package/dist/lib/focus-return.js +46 -0
  195. package/dist/lib/focus-return.js.map +1 -0
  196. package/dist/lib/parse-tool-result.d.ts +23 -1
  197. package/dist/lib/parse-tool-result.d.ts.map +1 -1
  198. package/dist/lib/parse-tool-result.js +38 -2
  199. package/dist/lib/parse-tool-result.js.map +1 -1
  200. package/dist/lib/toast-model.d.ts +41 -1
  201. package/dist/lib/toast-model.d.ts.map +1 -1
  202. package/dist/lib/toast-model.js +67 -1
  203. package/dist/lib/toast-model.js.map +1 -1
  204. package/dist/lib/tone-utils.d.ts +58 -6
  205. package/dist/lib/tone-utils.d.ts.map +1 -1
  206. package/dist/lib/tone-utils.js +66 -4
  207. package/dist/lib/tone-utils.js.map +1 -1
  208. package/dist/lib/tool-query.d.ts +107 -0
  209. package/dist/lib/tool-query.d.ts.map +1 -0
  210. package/dist/lib/tool-query.js +182 -0
  211. package/dist/lib/tool-query.js.map +1 -0
  212. package/dist/lib/tool-result-observer.d.ts +108 -0
  213. package/dist/lib/tool-result-observer.d.ts.map +1 -0
  214. package/dist/lib/tool-result-observer.js +158 -0
  215. package/dist/lib/tool-result-observer.js.map +1 -0
  216. package/dist/lib/typography.d.ts +37 -0
  217. package/dist/lib/typography.d.ts.map +1 -0
  218. package/dist/lib/typography.js +41 -0
  219. package/dist/lib/typography.js.map +1 -0
  220. package/dist/lib/utils.d.ts.map +1 -1
  221. package/dist/lib/utils.js +11 -1
  222. package/dist/lib/utils.js.map +1 -1
  223. package/dist/locale/index.d.ts +1 -1
  224. package/dist/locale/index.d.ts.map +1 -1
  225. package/dist/locale/message-types.d.ts +117 -4
  226. package/dist/locale/message-types.d.ts.map +1 -1
  227. package/dist/locale/messages-de.d.ts.map +1 -1
  228. package/dist/locale/messages-de.js +44 -10
  229. package/dist/locale/messages-de.js.map +1 -1
  230. package/dist/locale/messages-en.d.ts.map +1 -1
  231. package/dist/locale/messages-en.js +44 -10
  232. package/dist/locale/messages-en.js.map +1 -1
  233. package/dist/locale/toolkit-messages.d.ts +19 -1
  234. package/dist/locale/toolkit-messages.d.ts.map +1 -1
  235. package/dist/locale/toolkit-messages.js +54 -1
  236. package/dist/locale/toolkit-messages.js.map +1 -1
  237. package/dist/primitives/alert.d.ts +1 -1
  238. package/dist/primitives/alert.d.ts.map +1 -1
  239. package/dist/primitives/alert.js +2 -0
  240. package/dist/primitives/alert.js.map +1 -1
  241. package/dist/primitives/badge.d.ts +1 -1
  242. package/dist/primitives/badge.d.ts.map +1 -1
  243. package/dist/primitives/badge.js +9 -4
  244. package/dist/primitives/badge.js.map +1 -1
  245. package/dist/primitives/button.d.ts +1 -1
  246. package/dist/primitives/button.js +1 -1
  247. package/dist/primitives/button.js.map +1 -1
  248. package/dist/primitives/dialog.d.ts +1 -1
  249. package/dist/primitives/dialog.d.ts.map +1 -1
  250. package/dist/primitives/dialog.js +10 -3
  251. package/dist/primitives/dialog.js.map +1 -1
  252. package/dist/primitives/select.js +1 -1
  253. package/dist/primitives/select.js.map +1 -1
  254. package/dist/primitives/sheet.d.ts +1 -1
  255. package/dist/primitives/sheet.d.ts.map +1 -1
  256. package/dist/primitives/sheet.js +6 -2
  257. package/dist/primitives/sheet.js.map +1 -1
  258. package/dist/providers/query-provider.d.ts +32 -1
  259. package/dist/providers/query-provider.d.ts.map +1 -1
  260. package/dist/providers/query-provider.js +53 -4
  261. package/dist/providers/query-provider.js.map +1 -1
  262. package/dist/render-cases-primitives.js +1 -1
  263. package/dist/render-cases-primitives.js.map +1 -1
  264. package/dist/render-cases.d.ts.map +1 -1
  265. package/dist/render-cases.js +30 -6
  266. package/dist/render-cases.js.map +1 -1
  267. package/dist/render-effects.d.ts +42 -0
  268. package/dist/render-effects.d.ts.map +1 -0
  269. package/dist/render-effects.js +81 -0
  270. package/dist/render-effects.js.map +1 -0
  271. package/dist/theme/create-theme.d.ts +19 -1
  272. package/dist/theme/create-theme.d.ts.map +1 -1
  273. package/dist/theme/create-theme.js +15 -0
  274. package/dist/theme/create-theme.js.map +1 -1
  275. package/package.json +5 -4
  276. package/src/app/adapt-data-widget.tsx +2 -42
  277. package/src/app/builder/BuilderBanners.tsx +1 -1
  278. package/src/app/builder/CanvasRow.tsx +63 -17
  279. package/src/app/builder/CatalogueSheet.tsx +50 -29
  280. package/src/app/builder/CellPropsSheet.tsx +17 -2
  281. package/src/app/builder/DiscardDialog.tsx +59 -0
  282. package/src/app/builder/LayoutSurface.tsx +206 -66
  283. package/src/app/builder/PipelineStrip.tsx +253 -153
  284. package/src/app/builder/SaveDialog.tsx +14 -2
  285. package/src/app/builder/Toolbar.tsx +144 -59
  286. package/src/app/builder/Workspace.tsx +226 -58
  287. package/src/app/builder/builder-model.ts +341 -2
  288. package/src/app/builder/builder-model.ux.test.ts +456 -0
  289. package/src/app/builder/builder-ux.test.tsx +844 -0
  290. package/src/app/builder/reveal.ts +10 -0
  291. package/src/app/builder/use-builder-catalogue.ts +56 -19
  292. package/src/app/builder/use-builder-session.ts +68 -0
  293. package/src/app/builder/use-display-resolver.ts +24 -0
  294. package/src/app/index.ts +12 -2
  295. package/src/app/layout-builder.tsx +178 -191
  296. package/src/app/mcp-app-view-chrome.test.tsx +141 -1
  297. package/src/app/mcp-app-view-chrome.tsx +56 -6
  298. package/src/app/mcp-app-view-states.tsx +51 -11
  299. package/src/app/mcp-app-view.effects.test.tsx +292 -0
  300. package/src/app/mcp-app-view.test.tsx +222 -2
  301. package/src/app/mcp-app-view.tsx +267 -117
  302. package/src/app/mcp-toolkit-app.test.tsx +40 -0
  303. package/src/app/mcp-toolkit-app.tsx +8 -1
  304. package/src/app/mcp-use-host-bridge.test.tsx +180 -0
  305. package/src/app/mcp-use-host-bridge.tsx +67 -24
  306. package/src/app/model-context.test.tsx +116 -0
  307. package/src/app/model-context.tsx +125 -0
  308. package/src/app/use-build-mode-focus.ts +62 -0
  309. package/src/app/use-view-actions.ts +89 -0
  310. package/src/app/use-view-lifecycle.ts +6 -0
  311. package/src/app/view-lifecycle.test.ts +216 -0
  312. package/src/app/view-lifecycle.ts +165 -5
  313. package/src/app/widget-fixture.effects.test.tsx +51 -0
  314. package/src/app/widget-fixture.render.test.tsx +81 -0
  315. package/src/app/widget-fixture.tsx +34 -11
  316. package/src/app/widget-props-sheet.tsx +57 -16
  317. package/src/app/widget-renderer.tsx +1 -1
  318. package/src/components/DrillButton.tsx +23 -10
  319. package/src/components/EmptyState.tsx +6 -4
  320. package/src/components/ErrorState.tsx +31 -9
  321. package/src/components/FilterBar.test.tsx +82 -0
  322. package/src/components/FilterBar.tsx +52 -26
  323. package/src/components/KpiGrid.test.tsx +279 -0
  324. package/src/components/KpiGrid.tsx +297 -90
  325. package/src/components/ListFooter.test.tsx +116 -0
  326. package/src/components/ListFooter.tsx +102 -15
  327. package/src/components/PagedListFooter.test.tsx +140 -0
  328. package/src/components/PagedListFooter.tsx +107 -0
  329. package/src/components/Pills.test.tsx +77 -0
  330. package/src/components/Pills.tsx +63 -10
  331. package/src/components/SectionHeading.tsx +9 -3
  332. package/src/components/Toast.tsx +37 -19
  333. package/src/components/WidgetHeader.test.tsx +78 -0
  334. package/src/components/WidgetHeader.tsx +63 -16
  335. package/src/components/feedback-states.test.tsx +98 -9
  336. package/src/components/tone-figures.test.tsx +8 -4
  337. package/src/hooks/index.ts +6 -3
  338. package/src/hooks/tool-result-recovery-model.test.ts +744 -0
  339. package/src/hooks/tool-result-recovery-model.ts +418 -0
  340. package/src/hooks/use-tool-query.effects.test.tsx +205 -0
  341. package/src/hooks/use-tool-query.ts +156 -33
  342. package/src/hooks/use-tool-result-recovery.effects.test.tsx +141 -0
  343. package/src/hooks/use-tool-result-recovery.test.ts +3 -4
  344. package/src/hooks/use-tool-result-recovery.ts +84 -142
  345. package/src/hooks/use-view-data.test.tsx +118 -9
  346. package/src/hooks/use-view-data.ts +128 -18
  347. package/src/hooks/use-view-tool-query.ts +25 -19
  348. package/src/i18n-coverage.test.tsx +104 -2
  349. package/src/index.ts +48 -11
  350. package/src/lib/focus-return.test.ts +288 -0
  351. package/src/lib/focus-return.ts +96 -0
  352. package/src/lib/parse-tool-result.test.ts +46 -1
  353. package/src/lib/parse-tool-result.ts +40 -2
  354. package/src/lib/toast-model.test.ts +166 -1
  355. package/src/lib/toast-model.ts +104 -2
  356. package/src/lib/tone-utils.test.ts +86 -10
  357. package/src/lib/tone-utils.ts +89 -8
  358. package/src/lib/tool-query.test.ts +569 -0
  359. package/src/lib/tool-query.ts +253 -0
  360. package/src/lib/tool-result-observer.test.ts +296 -0
  361. package/src/lib/tool-result-observer.ts +211 -0
  362. package/src/lib/typography.test.ts +45 -0
  363. package/src/lib/typography.ts +47 -0
  364. package/src/lib/utils.ts +12 -1
  365. package/src/locale/index.ts +1 -0
  366. package/src/locale/message-types.ts +118 -2
  367. package/src/locale/messages-de.ts +49 -10
  368. package/src/locale/messages-en.ts +49 -10
  369. package/src/locale/toolkit-messages.test.ts +133 -0
  370. package/src/locale/toolkit-messages.ts +63 -2
  371. package/src/primitives/alert.tsx +3 -0
  372. package/src/primitives/badge.tsx +9 -4
  373. package/src/primitives/button.tsx +1 -1
  374. package/src/primitives/dialog.tsx +10 -1
  375. package/src/primitives/select.tsx +1 -1
  376. package/src/primitives/sheet.tsx +7 -0
  377. package/src/providers/query-provider.test.tsx +154 -0
  378. package/src/providers/query-provider.tsx +66 -5
  379. package/src/render-cases-primitives.tsx +1 -1
  380. package/src/render-cases.tsx +38 -6
  381. package/src/render-effects.tsx +96 -0
  382. package/src/theme/cd-tokens.test.ts +3 -1
  383. package/src/theme/create-theme.test.ts +10 -0
  384. package/src/theme/create-theme.ts +28 -0
  385. package/src/theme/theme-css.test.ts +51 -0
  386. package/src/theme.css +31 -1
  387. package/ui-catalog.json +448 -41
@@ -1,15 +1,16 @@
1
- import type { DraftLayout } from "./builder-model.js";
1
+ import { type DraftLayout } from "./builder-model.js";
2
2
  import type { LayoutBuilderLabels } from "./labels.js";
3
3
  import { type WorkspaceProps } from "./Workspace.js";
4
4
  /**
5
5
  * The "Layout" view's canvas surface, extracted from `layout-builder.tsx`.
6
6
  *
7
- * Renders either a single `Workspace` (rows draft) or the tab strip with
8
- * the inline-rename editor plus one `Workspace` per tab (tabs draft). All
9
- * state stays in the LayoutBuilder container — rename feedback included —
10
- * so unmounting this surface (e.g. switching to the Pipeline view) loses
11
- * nothing. Props in, callbacks out; the shared `workspace` bag is spread
12
- * into `<Workspace>` untouched so its memo semantics are unchanged.
7
+ * Renders either a single `Workspace` (rows draft, with an "Add tab" next to
8
+ * "Add row") or the tab strip plus one `Workspace` per tab (tabs draft). A tab
9
+ * is renamed with F2, Enter on the active tab, a double-click or its pencil
10
+ * button; Enter commits, Escape cancels, and either returns focus to the tab,
11
+ * also when the new name remounts it (see `TabRefocus`, held here by index).
12
+ * All state stays in the LayoutBuilder container — rename feedback included —
13
+ * so unmounting this surface (e.g. switching to the data sources) loses nothing.
13
14
  */
14
15
  export declare function LayoutSurface({ L, draft, activeTabIndex, setActiveTabIndex, editingTabIdx, setEditingTabIdx, renameRejected, commitRename, onAddTab, onRemoveTab, workspace, }: {
15
16
  L: Required<LayoutBuilderLabels>;
@@ -19,9 +20,32 @@ export declare function LayoutSurface({ L, draft, activeTabIndex, setActiveTabIn
19
20
  editingTabIdx: number | null;
20
21
  setEditingTabIdx: (idx: number | null) => void;
21
22
  renameRejected: boolean;
22
- commitRename: (tabIdx: number, label: string) => void;
23
+ /** Commits a rename; `false` when it was rejected and the field stays open. */
24
+ commitRename: (tabIdx: number, label: string) => boolean;
23
25
  onAddTab: () => void;
24
26
  onRemoveTab: (tabIdx: number) => void;
25
- workspace: Omit<WorkspaceProps, "showAddTabButton" | "onAddTab">;
27
+ workspace: Omit<WorkspaceProps, "onAddTab">;
28
+ }): import("react").JSX.Element;
29
+ /**
30
+ * One tab. It holds no state of its own (it is keyed by its label, so a
31
+ * rename remounts it): the focus hand-back after a keyboard rename goes
32
+ * through `onRefocus` and `triggerRef` to the surface's `TabRefocus`.
33
+ * Exported for its tests only.
34
+ */
35
+ export declare function TabItem({ L, label, active, editing, renameRejected, errorId, onStartRename, onCommitRename, onCancelRename, onRemove, triggerRef, onRefocus, }: {
36
+ L: Required<LayoutBuilderLabels>;
37
+ label: string;
38
+ active: boolean;
39
+ editing: boolean;
40
+ renameRejected: boolean;
41
+ errorId: string;
42
+ onStartRename: () => void;
43
+ onCommitRename: (label: string) => boolean;
44
+ onCancelRename: () => void;
45
+ onRemove: () => void;
46
+ /** The trigger's ref callback: it takes the focus back after a keyboard rename. */
47
+ triggerRef: (el: HTMLButtonElement | null) => void;
48
+ /** Asks for the focus to come back to this tab's trigger when it mounts again. */
49
+ onRefocus: () => void;
26
50
  }): import("react").JSX.Element;
27
51
  //# sourceMappingURL=LayoutSurface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LayoutSurface.d.ts","sourceRoot":"","sources":["../../../src/app/builder/LayoutSurface.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAO/D;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,EAC5B,CAAC,EACD,KAAK,EACL,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,SAAS,GACV,EAAE;IACD,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAA;IAChC,KAAK,EAAE,WAAW,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IAC9C,cAAc,EAAE,OAAO,CAAA;IACvB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACrD,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,kBAAkB,GAAG,UAAU,CAAC,CAAA;CACjE,+BA4FA"}
1
+ {"version":3,"file":"LayoutSurface.d.ts","sourceRoot":"","sources":["../../../src/app/builder/LayoutSurface.tsx"],"names":[],"mappings":"AAMA,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEtD,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAO/D;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,EAC5B,CAAC,EACD,KAAK,EACL,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,SAAS,GACV,EAAE;IACD,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAA;IAChC,KAAK,EAAE,WAAW,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IAC9C,cAAc,EAAE,OAAO,CAAA;IACvB,+EAA+E;IAC/E,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;IACxD,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,CAAA;CAC5C,+BAkEA;AAMD;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,EACtB,CAAC,EACD,KAAK,EACL,MAAM,EACN,OAAO,EACP,cAAc,EACd,OAAO,EACP,aAAa,EACb,cAAc,EACd,cAAc,EACd,QAAQ,EACR,UAAU,EACV,SAAS,GACV,EAAE;IACD,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAA;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,cAAc,EAAE,OAAO,CAAA;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;IAC1C,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,mFAAmF;IACnF,UAAU,EAAE,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI,KAAK,IAAI,CAAA;IAClD,kFAAkF;IAClF,SAAS,EAAE,MAAM,IAAI,CAAA;CACtB,+BA8DA"}
@@ -1,8 +1,12 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Plus, X } from "lucide-react";
2
+ import { useId, useRef, useState } from "react";
3
+ import { Pencil, Plus, X } from "lucide-react";
3
4
  import { Button } from "../../primitives/button.js";
4
5
  import { Tabs, TabsContent, TabsList, TabsTrigger } from "../../primitives/tabs.js";
6
+ import { FOCUS_RING } from "../../lib/focus-ring.js";
5
7
  import { cn } from "../../lib/utils.js";
8
+ import { createTabRefocus, renameFieldKeyAction, tabTriggerKeyAction, } from "./builder-model.js";
9
+ import { REVEAL_ON_INTENT } from "./reveal.js";
6
10
  import { Workspace } from "./Workspace.js";
7
11
  // -------------------------------------------------------------------------- //
8
12
  // Layout surface — single workspace, or the tab strip (with inline rename)
@@ -11,35 +15,82 @@ import { Workspace } from "./Workspace.js";
11
15
  /**
12
16
  * The "Layout" view's canvas surface, extracted from `layout-builder.tsx`.
13
17
  *
14
- * Renders either a single `Workspace` (rows draft) or the tab strip with
15
- * the inline-rename editor plus one `Workspace` per tab (tabs draft). All
16
- * state stays in the LayoutBuilder container — rename feedback included —
17
- * so unmounting this surface (e.g. switching to the Pipeline view) loses
18
- * nothing. Props in, callbacks out; the shared `workspace` bag is spread
19
- * into `<Workspace>` untouched so its memo semantics are unchanged.
18
+ * Renders either a single `Workspace` (rows draft, with an "Add tab" next to
19
+ * "Add row") or the tab strip plus one `Workspace` per tab (tabs draft). A tab
20
+ * is renamed with F2, Enter on the active tab, a double-click or its pencil
21
+ * button; Enter commits, Escape cancels, and either returns focus to the tab,
22
+ * also when the new name remounts it (see `TabRefocus`, held here by index).
23
+ * All state stays in the LayoutBuilder container — rename feedback included —
24
+ * so unmounting this surface (e.g. switching to the data sources) loses nothing.
20
25
  */
21
26
  export function LayoutSurface({ L, draft, activeTabIndex, setActiveTabIndex, editingTabIdx, setEditingTabIdx, renameRejected, commitRename, onAddTab, onRemoveTab, workspace, }) {
27
+ const errorId = useId();
28
+ // One per surface, outside the tabs: a tab is keyed by its label, so a
29
+ // rename remounts it, and a focus request held by the tab would go with it.
30
+ const [refocus] = useState(createTabRefocus);
22
31
  if (draft.kind !== "tabs") {
23
- return _jsx(Workspace, { ...workspace, showAddTabButton: true, onAddTab: onAddTab });
32
+ return _jsx(Workspace, { ...workspace, onAddTab: onAddTab });
24
33
  }
25
34
  return (_jsxs(Tabs, { value: draft.tabs[activeTabIndex]?.label ?? "", onValueChange: (label) => {
26
35
  const idx = draft.tabs.findIndex((t) => t.label === label);
27
36
  if (idx >= 0)
28
37
  setActiveTabIndex(idx);
29
- }, children: [_jsxs("div", { className: "mb-3 flex items-center gap-1", children: [_jsx(TabsList, { children: draft.tabs.map((tab, idx) => (_jsxs("div", { className: "group relative inline-flex", children: [_jsx(TabsTrigger, { value: tab.label, className: "pr-7", onDoubleClick: () => setEditingTabIdx(idx), title: L.renameTitle, children: editingTabIdx === idx ? (_jsx("input", { autoFocus: true, defaultValue: tab.label, "aria-invalid": renameRejected, onClick: (e) => e.stopPropagation(), onPointerDown: (e) => e.stopPropagation(), onKeyDown: (e) => {
30
- if (e.key === "Enter") {
31
- e.preventDefault();
32
- commitRename(idx, e.currentTarget.value);
33
- }
34
- else if (e.key === "Escape") {
35
- e.preventDefault();
36
- setEditingTabIdx(null);
37
- }
38
- }, onBlur: (e) => {
39
- commitRename(idx, e.currentTarget.value);
40
- }, className: cn("focus-visible:ring-focus w-24 rounded-sm border-none bg-transparent p-0 text-inherit outline-hidden focus-visible:ring-2", renameRejected && "text-danger-ink"), size: Math.max(tab.label.length + 1, 6) })) : (_jsx("span", { children: tab.label })) }), _jsx("button", { type: "button", "aria-label": L.removeTab, title: L.removeTab, onPointerDown: (e) => e.stopPropagation(), onClick: (e) => {
41
- e.stopPropagation();
42
- onRemoveTab(idx);
43
- }, className: "text-muted-foreground hover:text-foreground absolute top-1/2 right-1 -translate-y-1/2 rounded-sm p-0.5 opacity-0 transition-opacity group-hover:opacity-100 focus-visible:opacity-100 data-[state=active]:opacity-100", children: _jsx(X, { className: "size-3" }) })] }, tab.label))) }), _jsx(Button, { variant: "ghost", size: "icon-sm", onClick: onAddTab, "aria-label": L.addTab, title: L.addTab, children: _jsx(Plus, {}) }), _jsx("span", { className: "text-muted-foreground ml-2 hidden text-[10px] sm:inline", children: L.renameHint })] }), renameRejected && editingTabIdx !== null && (_jsx("p", { className: "text-danger-ink -mt-1 mb-2 text-[11px]", role: "alert", children: L.renameDuplicate })), draft.tabs.map((tab, idx) => (_jsx(TabsContent, { value: tab.label, className: "mt-0", children: idx === activeTabIndex ? _jsx(Workspace, { ...workspace }) : null }, tab.label)))] }));
38
+ }, children: [_jsxs("div", { className: "mb-3 flex flex-wrap items-center gap-1", children: [_jsx(TabsList, { "aria-label": L.tabsLabel, className: "flex-wrap group-data-[orientation=horizontal]/tabs:h-auto", children: draft.tabs.map((tab, idx) => (_jsx(TabItem, { L: L, label: tab.label, active: idx === activeTabIndex, editing: editingTabIdx === idx, renameRejected: renameRejected, errorId: errorId, onStartRename: () => {
39
+ setActiveTabIndex(idx);
40
+ setEditingTabIdx(idx);
41
+ }, onCommitRename: (label) => commitRename(idx, label), onCancelRename: () => setEditingTabIdx(null), onRemove: () => onRemoveTab(idx), ...refocus.forTab(idx) }, tab.label))) }), _jsx(Button, { variant: "ghost", size: "icon-sm", onClick: onAddTab, "aria-label": L.addTab, title: L.addTab, children: _jsx(Plus, { "aria-hidden": "true" }) }), _jsx("span", { className: "text-muted-foreground text-small ml-2 hidden sm:inline", children: L.renameHint })] }), renameRejected && editingTabIdx !== null && (_jsx("p", { id: errorId, className: "text-danger-ink text-small -mt-1 mb-2", role: "alert", children: L.renameDuplicate })), draft.tabs.map((tab, idx) => (_jsx(TabsContent, { value: tab.label, className: "mt-0", children: idx === activeTabIndex ? _jsx(Workspace, { ...workspace }) : null }, tab.label)))] }));
42
+ }
43
+ // -------------------------------------------------------------------------- //
44
+ // One tab: trigger (or the rename field) plus its rename and remove buttons
45
+ // -------------------------------------------------------------------------- //
46
+ /**
47
+ * One tab. It holds no state of its own (it is keyed by its label, so a
48
+ * rename remounts it): the focus hand-back after a keyboard rename goes
49
+ * through `onRefocus` and `triggerRef` to the surface's `TabRefocus`.
50
+ * Exported for its tests only.
51
+ */
52
+ export function TabItem({ L, label, active, editing, renameRejected, errorId, onStartRename, onCommitRename, onCancelRename, onRemove, triggerRef, onRefocus, }) {
53
+ return (_jsxs("div", { className: "group inline-flex items-center", "data-slot": "builder-tab", children: [editing ? (_jsx(RenameField, { L: L, initial: label, invalid: renameRejected, errorId: errorId, onCommit: (value, byKeyboard) => {
54
+ const accepted = onCommitRename(value);
55
+ // A pointer commit leaves the focus where the pointer went.
56
+ if (accepted && byKeyboard)
57
+ onRefocus();
58
+ return accepted;
59
+ }, onCancel: () => {
60
+ onRefocus();
61
+ onCancelRename();
62
+ } })) : (_jsx(TabsTrigger, { ref: triggerRef, value: label, title: L.renameTitle, onDoubleClick: onStartRename, onKeyDown: (e) => {
63
+ if (tabTriggerKeyAction(e.key, active) !== "rename")
64
+ return;
65
+ e.preventDefault();
66
+ onStartRename();
67
+ }, children: label })), _jsxs("div", { "data-slot": "builder-tab-actions", className: cn("flex items-center", active ? "opacity-100" : REVEAL_ON_INTENT), children: [!editing && (_jsx(Button, { variant: "ghost", size: "icon-xs", "aria-label": L.renameTabNamed(label), title: L.renameTab, onClick: onStartRename, children: _jsx(Pencil, { "aria-hidden": "true" }) })), _jsx(Button, { variant: "ghost", size: "icon-xs", "aria-label": L.removeTabNamed(label), title: L.removeTab, onClick: onRemove, children: _jsx(X, { "aria-hidden": "true" }) })] })] }));
68
+ }
69
+ /**
70
+ * The inline rename field, mounted for one rename. Enter commits (a rejected
71
+ * name keeps it open with the error), Escape cancels; leaving it by pointer
72
+ * commits too. A field that already ended by keyboard ignores the blur that
73
+ * its own unmount may fire.
74
+ */
75
+ function RenameField({ L, initial, invalid, errorId, onCommit, onCancel, }) {
76
+ const ended = useRef(false);
77
+ return (_jsx("input", {
78
+ // The field replaces the tab the user just chose to rename: focus follows.
79
+ autoFocus: true, defaultValue: initial, "aria-label": L.renameTab, "aria-invalid": invalid, "aria-describedby": invalid ? errorId : undefined, onKeyDown: (e) => {
80
+ const action = renameFieldKeyAction(e.key);
81
+ if (action === null)
82
+ return;
83
+ e.preventDefault();
84
+ if (action === "cancel") {
85
+ ended.current = true;
86
+ onCancel();
87
+ return;
88
+ }
89
+ if (onCommit(e.currentTarget.value, true))
90
+ ended.current = true;
91
+ }, onBlur: (e) => {
92
+ if (!ended.current)
93
+ onCommit(e.currentTarget.value, false);
94
+ }, className: cn("bg-background text-foreground h-7 w-28 rounded-sm border px-1.5 text-sm", FOCUS_RING, invalid && "border-danger"), size: Math.max(initial.length + 1, 6) }));
44
95
  }
45
96
  //# sourceMappingURL=LayoutSurface.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LayoutSurface.js","sourceRoot":"","sources":["../../../src/app/builder/LayoutSurface.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LayoutSurface.js","sourceRoot":"","sources":["../../../src/app/builder/LayoutSurface.tsx"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import type { AvailableStep, KeyCatalogEntry, PipelineStepRef } from "@miragon/mcp-toolkit-core";
2
2
  import { type KeyEntry } from "./builder-model.js";
3
3
  import type { LayoutBuilderLabels, RefreshStatus } from "./labels.js";
4
+ type Labels = Required<LayoutBuilderLabels>;
4
5
  declare function PipelineStripImpl({ L, keyEntries, stepEntries, keyCatalog, availableSteps, stepsByApp, liveKeys, onAddKey, onUpdateKey, onRemoveKey, onAddStep, onUpdateStep, onRemoveStep, status, }: {
5
- L: Required<LayoutBuilderLabels>;
6
+ L: Labels;
6
7
  keyEntries: KeyEntry[];
7
8
  stepEntries: PipelineStepRef[];
8
9
  keyCatalog: KeyCatalogEntry[];
@@ -1 +1 @@
1
- {"version":3,"file":"PipelineStrip.d.ts","sourceRoot":"","sources":["../../../src/app/builder/PipelineStrip.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAYhG,OAAO,EAAsC,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AACtF,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAOrE,iBAAS,iBAAiB,CAAC,EACzB,CAAC,EACD,UAAU,EACV,WAAW,EACX,UAAU,EACV,cAAc,EACd,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,WAAW,EACX,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,MAAM,GACP,EAAE;IACD,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAA;IAChC,UAAU,EAAE,QAAQ,EAAE,CAAA;IACtB,WAAW,EAAE,eAAe,EAAE,CAAA;IAC9B,UAAU,EAAE,eAAe,EAAE,CAAA;IAC7B,cAAc,EAAE,aAAa,EAAE,CAAA;IAC/B,UAAU,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,EAAE,CAAA;IACvC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,QAAQ,EAAE,CAAC,aAAa,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAA;IAC5D,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,KAAK,IAAI,CAAA;IACpE,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,MAAM,EAAE,aAAa,CAAA;CACtB,+BA6MA;AAED,0FAA0F;AAC1F,iBAAS,kBAAkB,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC,CAAC,CAAC,+BAMzE;AAED,eAAO,MAAM,aAAa,gEAA2B,CAAA"}
1
+ {"version":3,"file":"PipelineStrip.d.ts","sourceRoot":"","sources":["../../../src/app/builder/PipelineStrip.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAYhG,OAAO,EAKL,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAQrE,KAAK,MAAM,GAAG,QAAQ,CAAC,mBAAmB,CAAC,CAAA;AAkN3C,iBAAS,iBAAiB,CAAC,EACzB,CAAC,EACD,UAAU,EACV,WAAW,EACX,UAAU,EACV,cAAc,EACd,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,WAAW,EACX,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,MAAM,GACP,EAAE;IACD,CAAC,EAAE,MAAM,CAAA;IACT,UAAU,EAAE,QAAQ,EAAE,CAAA;IACtB,WAAW,EAAE,eAAe,EAAE,CAAA;IAC9B,UAAU,EAAE,eAAe,EAAE,CAAA;IAC7B,cAAc,EAAE,aAAa,EAAE,CAAA;IAC/B,UAAU,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,EAAE,CAAA;IACvC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,QAAQ,EAAE,CAAC,aAAa,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAA;IAC5D,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,KAAK,IAAI,CAAA;IACpE,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,MAAM,EAAE,aAAa,CAAA;CACtB,+BAwFA;AAED,0FAA0F;AAC1F,iBAAS,kBAAkB,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC,CAAC,CAAC,+BAMzE;AAED,eAAO,MAAM,aAAa,gEAA2B,CAAA"}
@@ -6,27 +6,40 @@ import { Badge } from "../../primitives/badge.js";
6
6
  import { Button } from "../../primitives/button.js";
7
7
  import { Input } from "../../primitives/input.js";
8
8
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "../../primitives/select.js";
9
- import { formatLiveKeyValue, valueTypeLabel } from "./builder-model.js";
9
+ import { displayLabel, formatLiveKeyValue, valueTypeLabel, } from "./builder-model.js";
10
10
  import { StatusChip } from "./status-chip.js";
11
- // -------------------------------------------------------------------------- //
12
- // Pipeline strip — compact horizontal Keys + Steps
13
- // -------------------------------------------------------------------------- //
11
+ import { useDisplayResolver } from "./use-display-resolver.js";
12
+ /** "needs a, b · provides c" in words (no arrow glyphs): a step's contract. */
13
+ function StepContract({ L, step }) {
14
+ return (_jsxs("span", { className: "text-muted-foreground text-small flex flex-wrap gap-x-2", children: [_jsxs("span", { children: [L.catalogueNeedsKeys, " ", _jsx("span", { className: "font-mono", children: step.requires.length ? step.requires.join(", ") : L.noInputs })] }), _jsxs("span", { children: [L.stepProvides, " ", _jsx("span", { className: "font-mono", children: step.produces.length ? step.produces.join(", ") : L.noOutputs })] })] }));
15
+ }
16
+ function KeyRows({ L, keyEntries, keyCatalog, liveKeys, onUpdateKey, onRemoveKey, }) {
17
+ return (_jsx("ul", { className: "flex flex-col gap-1", children: keyEntries.map((entry, idx) => {
18
+ const livePreview = formatLiveKeyValue(liveKeys[entry.name], L.catalogueLive);
19
+ const usedNames = new Set(keyEntries.map((e, i) => (i === idx ? "" : e.name)).filter(Boolean));
20
+ const pickable = keyCatalog.filter((c) => c.key === entry.name || !usedNames.has(c.key));
21
+ return (_jsxs("li", { className: "grid grid-cols-2 items-center gap-1", children: [_jsxs(Select, { value: entry.name || undefined, onValueChange: (value) => onUpdateKey(idx, { name: value }), children: [_jsx(SelectTrigger, { "aria-label": L.keyName, className: "text-small h-7 min-w-0 font-mono", children: _jsx(SelectValue, { placeholder: L.keyName, children: entry.name || null }) }), _jsx(SelectContent, { children: pickable.length === 0 ? (_jsx("div", { className: "text-muted-foreground text-small px-2 py-1.5 italic", children: L.noMoreKeys })) : (pickable.map((c) => (_jsx(SelectItem, { value: c.key, className: "py-1.5", children: _jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-small font-mono", children: c.key }), c.consumedByWidgets.length + c.consumedBySteps.length > 0 && (_jsxs("span", { className: "text-muted-foreground text-small", children: [L.catalogueConsumedBy, " ", _jsx("span", { className: "font-mono", children: [...c.consumedByWidgets, ...c.consumedBySteps].join(", ") })] }))] }) }, c.key)))) })] }), _jsxs("div", { className: "flex min-w-0 items-center gap-1", children: [_jsxs("div", { className: "relative min-w-0 flex-1", children: [_jsx(Input, { "aria-label": L.keyValueFor(entry.name), value: entry.rawValue, onChange: (e) => onUpdateKey(idx, { rawValue: e.target.value }), placeholder: livePreview ?? L.keyValue, className: "text-small h-7 pr-14 font-mono" }), _jsx("span", { className: "text-muted-foreground text-small pointer-events-none absolute top-1/2 right-2 -translate-y-1/2 tabular-nums", title: L.parsedType, children: L.valueType(valueTypeLabel(entry.rawValue)) })] }), _jsx(Button, { variant: "ghost", size: "icon-xs", onClick: () => onRemoveKey(idx), "aria-label": L.removeKey, children: _jsx(X, { "aria-hidden": "true" }) })] })] }, idx));
22
+ }) }));
23
+ }
24
+ function StepRows({ L, stepEntries, stepLookup, stepsByApp, locale, resolveKey, onUpdateStep, onRemoveStep, }) {
25
+ return (_jsx("ul", { className: "flex flex-col gap-1", children: stepEntries.map((step, idx) => {
26
+ const meta = stepLookup.get(step.step);
27
+ const selected = meta ? displayLabel(meta, meta.id, locale, resolveKey).label : step.step;
28
+ return (_jsxs("li", { className: "flex flex-col gap-0.5", children: [_jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Input, { "aria-label": L.stepContextId, value: step.id, onChange: (e) => onUpdateStep(idx, { id: e.target.value }), placeholder: L.stepContextId, className: "text-small h-7 w-24 font-mono" }), _jsxs(Select, { value: step.step || undefined, onValueChange: (value) => onUpdateStep(idx, { step: value }), children: [_jsx(SelectTrigger, { "aria-label": L.stepPickerLabel, className: "text-small h-7 min-w-0 flex-1", children: _jsx(SelectValue, { placeholder: L.stepPickerLabel, children: step.step ? selected : null }) }), _jsx(SelectContent, { children: stepsByApp.map(([app, items]) => (_jsxs("div", { children: [_jsx("div", { className: "text-muted-foreground text-small px-2 py-1 font-semibold", children: app }), items.map((s) => {
29
+ const name = displayLabel(s, s.id, locale, resolveKey);
30
+ return (_jsx(SelectItem, { value: s.id, className: "py-2", children: _jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-small font-medium", children: name.label }), name.summary && (_jsx("span", { className: "text-muted-foreground text-small", children: name.summary })), name.hint && (_jsx("span", { className: "text-muted-foreground text-small font-mono", children: name.hint })), _jsx(StepContract, { L: L, step: s })] }) }, s.id));
31
+ })] }, app))) })] }), _jsx(Button, { variant: "ghost", size: "icon-xs", onClick: () => onRemoveStep(idx), "aria-label": L.removeStep, children: _jsx(X, { "aria-hidden": "true" }) })] }), meta && (_jsx("div", { className: "ml-1 pl-24", children: _jsx(StepContract, { L: L, step: meta }) }))] }, idx));
32
+ }) }));
33
+ }
14
34
  function PipelineStripImpl({ L, keyEntries, stepEntries, keyCatalog, availableSteps, stepsByApp, liveKeys, onAddKey, onUpdateKey, onRemoveKey, onAddStep, onUpdateStep, onRemoveStep, status, }) {
35
+ const { locale, resolveKey } = useDisplayResolver();
15
36
  const stepLookup = useMemo(() => {
16
37
  const map = new Map();
17
38
  for (const s of availableSteps)
18
39
  map.set(s.id, s);
19
40
  return map;
20
41
  }, [availableSteps]);
21
- return (_jsxs("section", { className: "bg-muted/30 -mx-1 rounded-lg border px-3 py-3", children: [_jsxs("div", { className: "mb-2 flex items-center gap-2", children: [_jsx("span", { className: "text-muted-foreground text-[10px] font-semibold tracking-[0.12em] uppercase", children: L.pipelineHeader }), _jsxs("span", { className: "text-muted-foreground text-[10px]", children: ["\u00B7 ", L.autoApplies] }), _jsx("div", { className: "ml-auto text-[11px]", children: _jsx(StatusChip, { status: status, L: L }) })] }), _jsxs("div", { className: "grid grid-cols-1 gap-x-6 gap-y-3 lg:grid-cols-2", children: [_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsxs("div", { className: "text-muted-foreground flex items-center gap-1.5 text-[11px] font-semibold", children: [_jsx(ArrowRightToLine, { className: "size-3" }), L.keysHeader, _jsx(Badge, { variant: "outline", className: "px-1.5 text-[10px]", children: keyEntries.length })] }), keyEntries.length === 0 ? (_jsx("div", { className: "text-muted-foreground rounded-md border border-dashed px-2 py-1.5 text-xs italic", children: L.emptyKeys })) : (_jsx("ul", { className: "flex flex-col gap-1", children: keyEntries.map((entry, idx) => {
22
- const livePreview = formatLiveKeyValue(liveKeys[entry.name], L.catalogueLive);
23
- const usedNames = new Set(keyEntries.map((e, i) => (i === idx ? "" : e.name)).filter(Boolean));
24
- const pickable = keyCatalog.filter((c) => c.key === entry.name || !usedNames.has(c.key));
25
- return (_jsxs("li", { className: "grid grid-cols-2 items-center gap-1", children: [_jsxs(Select, { value: entry.name || undefined, onValueChange: (value) => onUpdateKey(idx, { name: value }), children: [_jsx(SelectTrigger, { className: "h-7 min-w-0 font-mono text-xs", children: _jsx(SelectValue, { placeholder: L.keyName }) }), _jsx(SelectContent, { children: pickable.length === 0 ? (_jsx("div", { className: "text-muted-foreground px-2 py-1.5 text-xs italic", children: L.noMoreKeys })) : (pickable.map((c) => (_jsx(SelectItem, { value: c.key, className: "py-1.5", children: _jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "font-mono text-xs", children: c.key }), c.consumedByWidgets.length + c.consumedBySteps.length > 0 && (_jsxs("span", { className: "text-muted-foreground font-mono text-[10px]", children: ["\u2192 ", [...c.consumedByWidgets, ...c.consumedBySteps].join(", ")] }))] }) }, c.key)))) })] }), _jsxs("div", { className: "flex min-w-0 items-center gap-1", children: [_jsxs("div", { className: "relative min-w-0 flex-1", children: [_jsx(Input, { value: entry.rawValue, onChange: (e) => onUpdateKey(idx, { rawValue: e.target.value }), placeholder: livePreview ?? L.keyValue, className: "h-7 pr-10 font-mono text-xs" }), _jsx("span", { className: "text-muted-foreground pointer-events-none absolute top-1/2 right-2 -translate-y-1/2 font-mono text-[10px] tabular-nums", title: L.parsedType, children: L.valueType(valueTypeLabel(entry.rawValue)) })] }), _jsx(Button, { variant: "ghost", size: "icon-xs", onClick: () => onRemoveKey(idx), "aria-label": L.removeKey, children: _jsx(X, {}) })] })] }, idx));
26
- }) })), _jsxs(Button, { variant: "ghost", size: "xs", onClick: () => onAddKey(), className: "text-muted-foreground hover:text-foreground self-start", children: [_jsx(Plus, {}), " ", L.addKey] })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsxs("div", { className: "text-muted-foreground flex items-center gap-1.5 text-[11px] font-semibold", children: [_jsx(ArrowDownToLine, { className: "size-3" }), L.stepsHeader, _jsx(Badge, { variant: "outline", className: "px-1.5 text-[10px]", children: stepEntries.length })] }), stepEntries.length === 0 ? (_jsx("div", { className: "text-muted-foreground rounded-md border border-dashed px-2 py-1.5 text-xs italic", children: L.emptySteps })) : (_jsx("ul", { className: "flex flex-col gap-1", children: stepEntries.map((step, idx) => {
27
- const meta = stepLookup.get(step.step);
28
- return (_jsxs("li", { className: "flex flex-col gap-0.5", children: [_jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Input, { value: step.id, onChange: (e) => onUpdateStep(idx, { id: e.target.value }), placeholder: L.stepContextId, className: "h-7 w-24 font-mono text-xs" }), _jsxs(Select, { value: step.step || undefined, onValueChange: (value) => onUpdateStep(idx, { step: value }), children: [_jsx(SelectTrigger, { className: "h-7 flex-1 text-xs", children: _jsx(SelectValue, { placeholder: L.stepPickerLabel }) }), _jsx(SelectContent, { children: stepsByApp.map(([app, items]) => (_jsxs("div", { children: [_jsx("div", { className: "text-muted-foreground px-2 py-1 text-[10px] font-semibold tracking-wide uppercase", children: app }), items.map((s) => (_jsx(SelectItem, { value: s.id, className: "py-2", children: _jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "font-mono text-xs", children: s.id }), _jsxs("div", { className: "text-muted-foreground flex flex-wrap gap-x-2 text-[10px]", children: [_jsxs("span", { className: "font-mono", children: ["\u2190 ", s.requires.length ? s.requires.join(", ") : L.noInputs] }), _jsxs("span", { className: "font-mono", children: ["\u2192 ", s.produces.length ? s.produces.join(", ") : L.noOutputs] })] })] }) }, s.id)))] }, app))) })] }), _jsx(Button, { variant: "ghost", size: "icon-xs", onClick: () => onRemoveStep(idx), "aria-label": L.removeStep, children: _jsx(X, {}) })] }), meta && (_jsxs("div", { className: "text-muted-foreground ml-1 flex flex-wrap gap-x-2 pl-24 text-[10px]", children: [_jsxs("span", { className: "font-mono", children: ["\u2190 ", meta.requires.length ? meta.requires.join(", ") : L.noInputs] }), _jsxs("span", { className: "font-mono", children: ["\u2192 ", meta.produces.length ? meta.produces.join(", ") : L.noOutputs] })] }))] }, idx));
29
- }) })), _jsxs(Button, { variant: "ghost", size: "xs", onClick: () => onAddStep(), disabled: availableSteps.length === 0, className: "text-muted-foreground hover:text-foreground self-start", children: [_jsx(Plus, {}), " ", L.addStep] })] })] })] }));
42
+ return (_jsxs("section", { className: "bg-muted/30 -mx-1 rounded-lg border px-3 py-3", children: [_jsxs("div", { className: "mb-2 flex flex-wrap items-center gap-2", children: [_jsx("h3", { className: "text-muted-foreground text-small font-semibold", children: L.pipelineHeader }), _jsx("span", { className: "text-muted-foreground text-small", children: L.autoApplies }), _jsx("div", { className: "text-small ml-auto", children: _jsx(StatusChip, { status: status, L: L }) })] }), _jsxs("div", { className: "grid grid-cols-1 gap-x-6 gap-y-3 lg:grid-cols-2", children: [_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsxs("div", { className: "text-muted-foreground text-small flex items-center gap-1.5 font-semibold", children: [_jsx(ArrowRightToLine, { "aria-hidden": "true", className: "size-3.5" }), L.keysHeader, _jsx(Badge, { variant: "outline", className: "px-1.5", children: keyEntries.length })] }), keyEntries.length === 0 ? (_jsx("div", { className: "text-muted-foreground text-small rounded-md border border-dashed px-2 py-1.5 italic", children: L.emptyKeys })) : (_jsx(KeyRows, { L: L, keyEntries: keyEntries, keyCatalog: keyCatalog, liveKeys: liveKeys, onUpdateKey: onUpdateKey, onRemoveKey: onRemoveKey })), _jsxs(Button, { variant: "ghost", size: "xs", onClick: () => onAddKey(), className: "text-muted-foreground hover:text-foreground self-start", children: [_jsx(Plus, { "aria-hidden": "true" }), " ", L.addKey] })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsxs("div", { className: "text-muted-foreground text-small flex items-center gap-1.5 font-semibold", children: [_jsx(ArrowDownToLine, { "aria-hidden": "true", className: "size-3.5" }), L.stepsHeader, _jsx(Badge, { variant: "outline", className: "px-1.5", children: stepEntries.length })] }), stepEntries.length === 0 ? (_jsx("div", { className: "text-muted-foreground text-small rounded-md border border-dashed px-2 py-1.5 italic", children: L.emptySteps })) : (_jsx(StepRows, { L: L, stepEntries: stepEntries, stepLookup: stepLookup, stepsByApp: stepsByApp, locale: locale, resolveKey: resolveKey, onUpdateStep: onUpdateStep, onRemoveStep: onRemoveStep })), _jsxs(Button, { variant: "ghost", size: "xs", onClick: () => onAddStep(), disabled: availableSteps.length === 0, className: "text-muted-foreground hover:text-foreground self-start", children: [_jsx(Plus, { "aria-hidden": "true" }), " ", L.addStep] })] })] })] }));
30
43
  }
31
44
  /** A dense chrome bar: its Lucide icons draw at stroke 2 (CI §11), not the view's 2.5. */
32
45
  function DensePipelineStrip(props) {
@@ -1 +1 @@
1
- {"version":3,"file":"PipelineStrip.js","sourceRoot":"","sources":["../../../src/app/builder/PipelineStrip.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PipelineStrip.js","sourceRoot":"","sources":["../../../src/app/builder/PipelineStrip.tsx"],"names":[],"mappings":"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"}
@@ -1,8 +1,16 @@
1
1
  import type { LayoutBuilderLabels } from "./labels.js";
2
- export declare function SaveDialog({ L, open, onOpenChange, name, setName, description, setDescription, onSubmit, busy, error, }: {
2
+ /**
3
+ * Names the draft and saves it as a dashboard. Its description mentions Apply
4
+ * only where there is one (`canApply`: the builder has an `onExit`). Opens
5
+ * with the focus on the name field and hands it back to "Save as dashboard"
6
+ * when it closes.
7
+ */
8
+ export declare function SaveDialog({ L, open, onOpenChange, canApply, name, setName, description, setDescription, onSubmit, busy, error, }: {
3
9
  L: Required<LayoutBuilderLabels>;
4
10
  open: boolean;
5
11
  onOpenChange: (open: boolean) => void;
12
+ /** The builder has a view to apply the draft to (an `onExit`). */
13
+ canApply: boolean;
6
14
  name: string;
7
15
  setName: (v: string) => void;
8
16
  description: string;
@@ -1 +1 @@
1
- {"version":3,"file":"SaveDialog.d.ts","sourceRoot":"","sources":["../../../src/app/builder/SaveDialog.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAMtD,wBAAgB,UAAU,CAAC,EACzB,CAAC,EACD,IAAI,EACJ,YAAY,EACZ,IAAI,EACJ,OAAO,EACP,WAAW,EACX,cAAc,EACd,QAAQ,EACR,IAAI,EACJ,KAAK,GACN,EAAE;IACD,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAA;IAChC,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7B,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB,+BAqDA"}
1
+ {"version":3,"file":"SaveDialog.d.ts","sourceRoot":"","sources":["../../../src/app/builder/SaveDialog.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAMtD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EACzB,CAAC,EACD,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,WAAW,EACX,cAAc,EACd,QAAQ,EACR,IAAI,EACJ,KAAK,GACN,EAAE;IACD,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAA;IAChC,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,kEAAkE;IAClE,QAAQ,EAAE,OAAO,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7B,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB,+BAwDA"}
@@ -6,8 +6,14 @@ import { Input } from "../../primitives/input.js";
6
6
  // -------------------------------------------------------------------------- //
7
7
  // Save dialog
8
8
  // -------------------------------------------------------------------------- //
9
- export function SaveDialog({ L, open, onOpenChange, name, setName, description, setDescription, onSubmit, busy, error, }) {
10
- return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: L.saveDialogTitle }), _jsx(DialogDescription, { children: L.saveDialogDescription })] }), _jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("label", { className: "flex flex-col gap-1 text-sm", children: [_jsx("span", { className: "font-medium", children: L.saveNameLabel }), _jsx(Input, { value: name, onChange: (e) => setName(e.target.value), placeholder: L.saveNamePlaceholder, autoFocus: true })] }), _jsxs("label", { className: "flex flex-col gap-1 text-sm", children: [_jsx("span", { className: "font-medium", children: L.saveDescriptionLabel }), _jsx(Input, { value: description, onChange: (e) => setDescription(e.target.value), placeholder: L.saveDescriptionPlaceholder })] }), error && (_jsx(ErrorState, { variant: "inline", title: L.saveError, description: L.saveErrorHint, details: error }))] }), _jsxs(DialogFooter, { children: [_jsx(DialogClose, { asChild: true, children: _jsx(Button, { variant: "outline", children: L.cancel }) }), _jsx(Button, { disabled: !name.trim() || busy, onClick: () => {
9
+ /**
10
+ * Names the draft and saves it as a dashboard. Its description mentions Apply
11
+ * only where there is one (`canApply`: the builder has an `onExit`). Opens
12
+ * with the focus on the name field and hands it back to "Save as dashboard"
13
+ * when it closes.
14
+ */
15
+ export function SaveDialog({ L, open, onOpenChange, canApply, name, setName, description, setDescription, onSubmit, busy, error, }) {
16
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: L.saveDialogTitle }), _jsx(DialogDescription, { children: canApply ? L.saveDialogDescription : L.saveDialogDescriptionStandalone })] }), _jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("label", { className: "flex flex-col gap-1 text-sm", children: [_jsx("span", { className: "font-medium", children: L.saveNameLabel }), _jsx(Input, { value: name, onChange: (e) => setName(e.target.value), placeholder: L.saveNamePlaceholder })] }), _jsxs("label", { className: "flex flex-col gap-1 text-sm", children: [_jsx("span", { className: "font-medium", children: L.saveDescriptionLabel }), _jsx(Input, { value: description, onChange: (e) => setDescription(e.target.value), placeholder: L.saveDescriptionPlaceholder })] }), error && (_jsx(ErrorState, { variant: "inline", title: L.saveError, description: L.saveErrorHint, details: error }))] }), _jsxs(DialogFooter, { children: [_jsx(DialogClose, { asChild: true, children: _jsx(Button, { variant: "outline", children: L.cancel }) }), _jsx(Button, { disabled: !name.trim() || busy, onClick: () => {
11
17
  void onSubmit();
12
18
  }, children: L.saveConfirm })] })] }) }));
13
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SaveDialog.js","sourceRoot":"","sources":["../../../src/app/builder/SaveDialog.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACnD,OAAO,EACL,MAAM,EACN,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAA;AAGjD,gFAAgF;AAChF,cAAc;AACd,gFAAgF;AAEhF,MAAM,UAAU,UAAU,CAAC,EACzB,CAAC,EACD,IAAI,EACJ,YAAY,EACZ,IAAI,EACJ,OAAO,EACP,WAAW,EACX,cAAc,EACd,QAAQ,EACR,IAAI,EACJ,KAAK,GAYN;IACC,OAAO,CACL,KAAC,MAAM,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,YAC5C,MAAC,aAAa,eACZ,MAAC,YAAY,eACX,KAAC,WAAW,cAAE,CAAC,CAAC,eAAe,GAAe,EAC9C,KAAC,iBAAiB,cAAE,CAAC,CAAC,qBAAqB,GAAqB,IACnD,EACf,eAAK,SAAS,EAAC,qBAAqB,aAClC,iBAAO,SAAS,EAAC,6BAA6B,aAC5C,eAAM,SAAS,EAAC,aAAa,YAAE,CAAC,CAAC,aAAa,GAAQ,EACtD,KAAC,KAAK,IACJ,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACxC,WAAW,EAAE,CAAC,CAAC,mBAAmB,EAClC,SAAS,SACT,IACI,EACR,iBAAO,SAAS,EAAC,6BAA6B,aAC5C,eAAM,SAAS,EAAC,aAAa,YAAE,CAAC,CAAC,oBAAoB,GAAQ,EAC7D,KAAC,KAAK,IACJ,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC/C,WAAW,EAAE,CAAC,CAAC,0BAA0B,GACzC,IACI,EAGP,KAAK,IAAI,CACR,KAAC,UAAU,IACT,OAAO,EAAC,QAAQ,EAChB,KAAK,EAAE,CAAC,CAAC,SAAS,EAClB,WAAW,EAAE,CAAC,CAAC,aAAa,EAC5B,OAAO,EAAE,KAAK,GACd,CACH,IACG,EACN,MAAC,YAAY,eACX,KAAC,WAAW,IAAC,OAAO,kBAClB,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,YAAE,CAAC,CAAC,MAAM,GAAU,GACjC,EACd,KAAC,MAAM,IACL,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,EAC9B,OAAO,EAAE,GAAG,EAAE;gCACZ,KAAK,QAAQ,EAAE,CAAA;4BACjB,CAAC,YAEA,CAAC,CAAC,WAAW,GACP,IACI,IACD,GACT,CACV,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"SaveDialog.js","sourceRoot":"","sources":["../../../src/app/builder/SaveDialog.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACnD,OAAO,EACL,MAAM,EACN,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAA;AAGjD,gFAAgF;AAChF,cAAc;AACd,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,CAAC,EACD,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,WAAW,EACX,cAAc,EACd,QAAQ,EACR,IAAI,EACJ,KAAK,GAcN;IACC,OAAO,CACL,KAAC,MAAM,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,YAC5C,MAAC,aAAa,eACZ,MAAC,YAAY,eACX,KAAC,WAAW,cAAE,CAAC,CAAC,eAAe,GAAe,EAC9C,KAAC,iBAAiB,cACf,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,+BAA+B,GACrD,IACP,EACf,eAAK,SAAS,EAAC,qBAAqB,aAClC,iBAAO,SAAS,EAAC,6BAA6B,aAC5C,eAAM,SAAS,EAAC,aAAa,YAAE,CAAC,CAAC,aAAa,GAAQ,EAGtD,KAAC,KAAK,IACJ,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACxC,WAAW,EAAE,CAAC,CAAC,mBAAmB,GAClC,IACI,EACR,iBAAO,SAAS,EAAC,6BAA6B,aAC5C,eAAM,SAAS,EAAC,aAAa,YAAE,CAAC,CAAC,oBAAoB,GAAQ,EAC7D,KAAC,KAAK,IACJ,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC/C,WAAW,EAAE,CAAC,CAAC,0BAA0B,GACzC,IACI,EAGP,KAAK,IAAI,CACR,KAAC,UAAU,IACT,OAAO,EAAC,QAAQ,EAChB,KAAK,EAAE,CAAC,CAAC,SAAS,EAClB,WAAW,EAAE,CAAC,CAAC,aAAa,EAC5B,OAAO,EAAE,KAAK,GACd,CACH,IACG,EACN,MAAC,YAAY,eACX,KAAC,WAAW,IAAC,OAAO,kBAClB,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,YAAE,CAAC,CAAC,MAAM,GAAU,GACjC,EACd,KAAC,MAAM,IACL,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,EAC9B,OAAO,EAAE,GAAG,EAAE;gCACZ,KAAK,QAAQ,EAAE,CAAA;4BACjB,CAAC,YAEA,CAAC,CAAC,WAAW,GACP,IACI,IACD,GACT,CACV,CAAA;AACH,CAAC"}
@@ -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,13 +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;
22
+ }
15
23
  /** A dense chrome bar: its Lucide icons draw at stroke 2 (CI §11), not the view's 2.5. */
16
- declare function DenseToolbar(props: Parameters<typeof ToolbarImpl>[0]): import("react").JSX.Element;
24
+ declare function DenseToolbar(props: ToolbarProps): import("react").JSX.Element;
17
25
  export declare const Toolbar: import("react").MemoExoticComponent<typeof DenseToolbar>;
18
26
  export {};
19
27
  //# sourceMappingURL=Toolbar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../../src/app/builder/Toolbar.tsx"],"names":[],"mappings":"AAOA,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,+BAyDA;AAED,0FAA0F;AAC1F,iBAAS,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,+BAM7D;AAED,eAAO,MAAM,OAAO,0DAAqB,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,17 +1,28 @@
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, LucideProvider, Save } from "lucide-react";
3
+ import { Check, Library, LucideProvider, Save, Undo2, Wrench } from "lucide-react";
4
4
  import { DENSE_ICON_STROKE } from "../../lib/icon-stroke.js";
5
+ import { FOCUS_RING } from "../../lib/focus-ring.js";
5
6
  import { Badge } from "../../primitives/badge.js";
6
7
  import { Button } from "../../primitives/button.js";
7
- import { TONE_DOT, TONE_SOFT } from "../../lib/tone-utils.js";
8
+ import { TONE_DOT } from "../../lib/tone-utils.js";
8
9
  import { cn } from "../../lib/utils.js";
9
10
  import { StatusChip } from "./status-chip.js";
10
- // -------------------------------------------------------------------------- //
11
- // Toolbar — sticky top, dense status row + actions
12
- // -------------------------------------------------------------------------- //
13
- function ToolbarImpl({ L, previewMode, isBusy, status, liveKeys, reachableCount, unreachableCount, onOpenCatalogue, onOpenSave, onDone, hasAnyCell, }) {
14
- 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 ? TONE_SOFT.success : TONE_SOFT.info), "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", { "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 })] }), _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 })] }));
14
+ }
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] }))] })] }));
15
26
  }
16
27
  /** A dense chrome bar: its Lucide icons draw at stroke 2 (CI §11), not the view's 2.5. */
17
28
  function DenseToolbar(props) {
@@ -1 +1 @@
1
- {"version":3,"file":"Toolbar.js","sourceRoot":"","sources":["../../../src/app/builder/Toolbar.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Toolbar.js","sourceRoot":"","sources":["../../../src/app/builder/Toolbar.tsx"],"names":[],"mappings":"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"}