@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,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 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 group-hover:text-accent-foreground size-3" })] }), w.requires.length > 0 && (_jsxs("span", { className: "text-muted-foreground group-hover:text-accent-foreground 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[];
@@ -84,4 +84,146 @@ export declare function defaultStepIdFor(stepId: string, takenIds: Set<string>):
84
84
  * `WidgetRenderer` expects.
85
85
  */
86
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;
87
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;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,CAStF;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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"}
@@ -1,4 +1,4 @@
1
- import { normalizeLayout } from "@miragon/mcp-toolkit-core";
1
+ import { normalizeLayout, PROPS_SCHEMA_DISPLAY_KEYWORD, resolveLocalizedText, } from "@miragon/mcp-toolkit-core";
2
2
  // -------------------------------------------------------------------------- //
3
3
  // Draft <-> layout conversions
4
4
  // -------------------------------------------------------------------------- //
@@ -172,4 +172,194 @@ export function toPipelineContext(ctx) {
172
172
  }
173
173
  return { steps, keys: ctx.keys, errors: ctx.errors };
174
174
  }
175
+ /**
176
+ * A {@link DisplayKeyResolver} over a translate function that echoes unknown
177
+ * keys (the `createTranslator` / `useTranslate` contract): the echo, or a
178
+ * blank result, means "unknown", so the caller falls back to its inline text.
179
+ */
180
+ export function keyResolverFrom(translate) {
181
+ return (key) => {
182
+ const text = translate(key).trim();
183
+ return text.length > 0 && text !== key ? text : undefined;
184
+ };
185
+ }
186
+ /**
187
+ * The i18n key's text when the resolver knows it, else the inline (per-locale)
188
+ * text. Display text crosses the wire (the catalogue, a `propsSchema`), so a
189
+ * key that is not a string is ignored instead of reaching the translator.
190
+ */
191
+ function keyedText(key, text, locale, resolveKey) {
192
+ const viaKey = typeof key === "string" && resolveKey ? resolveKey(key) : undefined;
193
+ return viaKey ?? resolveLocalizedText(text, locale);
194
+ }
195
+ /**
196
+ * The builder's name for a widget or a step: its `titleKey` (when `resolveKey`
197
+ * knows it), its `title` in `locale`, else the id. The id comes back as `hint`
198
+ * only next to a real title. The `description` is the LLM's text and never
199
+ * appears here.
200
+ */
201
+ export function displayLabel(entry, id, locale, resolveKey) {
202
+ const title = keyedText(entry.titleKey, entry.title, locale, resolveKey);
203
+ const summary = keyedText(entry.summaryKey, entry.summary, locale, resolveKey);
204
+ return {
205
+ label: title ?? id,
206
+ ...(title !== undefined && title !== id ? { hint: id } : {}),
207
+ ...(summary !== undefined ? { summary } : {}),
208
+ };
209
+ }
210
+ function isRecord(value) {
211
+ return typeof value === "object" && value !== null && !Array.isArray(value);
212
+ }
213
+ /**
214
+ * The props sheet's text for one `propsSchema` property. Label: the
215
+ * `x-display` title (key or text), else the standard JSON Schema `title`,
216
+ * else the property name. Help: the `x-display` summary, else the property's
217
+ * `description`.
218
+ */
219
+ export function propFieldText(name, prop, locale, resolveKey) {
220
+ const raw = prop[PROPS_SCHEMA_DISPLAY_KEYWORD];
221
+ const display = isRecord(raw) ? raw : {};
222
+ const schemaTitle = typeof prop.title === "string" ? prop.title : undefined;
223
+ const label = keyedText(display.titleKey, display.title, locale, resolveKey) ??
224
+ resolveLocalizedText(schemaTitle, locale) ??
225
+ name;
226
+ const schemaHelp = typeof prop.description === "string" ? prop.description : undefined;
227
+ const help = keyedText(display.summaryKey, display.summary, locale, resolveKey) ??
228
+ resolveLocalizedText(schemaHelp, locale);
229
+ return {
230
+ label,
231
+ ...(label !== name ? { hint: name } : {}),
232
+ ...(help !== undefined ? { help } : {}),
233
+ };
234
+ }
235
+ // -------------------------------------------------------------------------- //
236
+ // Draft status — what Apply, Discard and the unsaved marker compare
237
+ // -------------------------------------------------------------------------- //
238
+ /**
239
+ * Whether the draft holds at least one element on ANY tab, not only the
240
+ * active one: a new, still empty tab must not disable "Save as dashboard" or
241
+ * the preview while another tab has content.
242
+ */
243
+ export function draftHasCells(draft) {
244
+ const rows = draft.kind === "tabs" ? draft.tabs.flatMap((t) => t.rows) : draft.rows;
245
+ return rows.some((r) => r.row.length > 0);
246
+ }
247
+ /**
248
+ * A comparable fingerprint of what Apply and Save hand on: the layout, the
249
+ * keys (blank names dropped, values parsed) and the steps that name a step.
250
+ * An empty key or step row the user has not filled in changes nothing.
251
+ */
252
+ export function builderSnapshot(draft, keyEntries, stepEntries) {
253
+ return JSON.stringify({
254
+ layout: draftToLayout(draft),
255
+ keys: entriesToKeys(keyEntries),
256
+ steps: stepEntries.filter((s) => s.step.trim().length > 0),
257
+ });
258
+ }
259
+ /**
260
+ * The commit of Apply: the layout, keys and steps exactly as a save would send
261
+ * them, and the live context in its wire shape (`stepIds` + keyed `stepData`)
262
+ * so the view renders the just-built layout without another round trip.
263
+ */
264
+ export function toExitCommit(draft, keyEntries, stepEntries, title, live) {
265
+ return {
266
+ layout: draftToLayout(draft),
267
+ keys: entriesToKeys(keyEntries),
268
+ steps: stepEntries.filter((s) => s.step.trim().length > 0),
269
+ title,
270
+ context: {
271
+ keys: live.keys,
272
+ stepIds: Object.keys(live.steps),
273
+ stepData: Object.fromEntries(Object.entries(live.steps).map(([id, result]) => [
274
+ id,
275
+ { data: result.data, keys: result.keys, _app: result._app, _dataType: result._dataType },
276
+ ])),
277
+ errors: live.errors,
278
+ },
279
+ };
280
+ }
281
+ /** Compares the current {@link builderSnapshot} with the pre-edit one and the last saved one. */
282
+ export function draftStatus(current, baseline, saved) {
283
+ const changed = current !== baseline;
284
+ return { changed, unsaved: changed && current !== saved };
285
+ }
286
+ /**
287
+ * The builder's leave actions. Apply hands `commit()` to `onExit`. Discard
288
+ * calls `onExit()` WITHOUT a commit, so the view stays as it was before
289
+ * editing; without `onExit` it calls `onReset()`, which restores the draft in
290
+ * place. Discard asks first (`confirm`) only when the draft `changed` the
291
+ * view: a draft that matches the view before editing loses nothing, even when
292
+ * it differs from a saved dashboard.
293
+ */
294
+ export function builderLeave({ changed, onExit, onReset, commit, confirm, }) {
295
+ // Never hands its own arguments on: a click event must not reach `onExit` as a commit.
296
+ const discardNow = () => {
297
+ if (onExit)
298
+ onExit();
299
+ else
300
+ onReset();
301
+ };
302
+ return {
303
+ ...(onExit ? { apply: () => onExit(commit()) } : {}),
304
+ discard: () => {
305
+ if (changed)
306
+ confirm();
307
+ else
308
+ discardNow();
309
+ },
310
+ discardNow,
311
+ };
312
+ }
313
+ // -------------------------------------------------------------------------- //
314
+ // Keyboard — tab rename without a double-click
315
+ // -------------------------------------------------------------------------- //
316
+ /**
317
+ * What a key press on a tab trigger does: F2 renames any tab; Enter renames
318
+ * the tab that is already active (on another tab Enter keeps selecting it,
319
+ * the tabs' own behaviour). `null` leaves the key to the tabs.
320
+ */
321
+ export function tabTriggerKeyAction(key, isActive) {
322
+ if (key === "F2")
323
+ return "rename";
324
+ if (key === "Enter" && isActive)
325
+ return "rename";
326
+ return null;
327
+ }
328
+ /** What a key press in a tab's rename field does: Enter commits, Escape cancels. */
329
+ export function renameFieldKeyAction(key) {
330
+ if (key === "Enter")
331
+ return "commit";
332
+ if (key === "Escape")
333
+ return "cancel";
334
+ return null;
335
+ }
336
+ /** A {@link TabRefocus} with no open request. */
337
+ export function createTabRefocus() {
338
+ let pending = null;
339
+ const request = (tabIdx) => {
340
+ pending = tabIdx;
341
+ };
342
+ const attach = (tabIdx, el) => {
343
+ if (el === null || pending !== tabIdx)
344
+ return;
345
+ pending = null;
346
+ el.focus();
347
+ };
348
+ return {
349
+ request,
350
+ attach,
351
+ forTab: (tabIdx) => ({
352
+ triggerRef: (el) => attach(tabIdx, el),
353
+ onRefocus: () => request(tabIdx),
354
+ }),
355
+ };
356
+ }
357
+ /** The builder's views in tab order: the data sources ("pipeline") only in advanced mode. */
358
+ export function builderViews(advanced) {
359
+ return advanced ? ["layout", "pipeline", "preview"] : ["layout", "preview"];
360
+ }
361
+ /** The view to show after advanced mode switches: a view that is now hidden falls back to the layout. */
362
+ export function viewAfterAdvancedToggle(view, advanced) {
363
+ return builderViews(advanced).includes(view) ? view : "layout";
364
+ }
175
365
  //# sourceMappingURL=builder-model.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"builder-model.js","sourceRoot":"","sources":["../../../src/app/builder/builder-model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"builder-model.js","sourceRoot":"","sources":["../../../src/app/builder/builder-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Secondary builder controls (row, tab and cell actions) stay quiet until the
3
+ * pointer is over their group or focus is anywhere inside it, and are always
4
+ * visible where nothing can hover (touch screens). Spread it on the controls'
5
+ * container inside an element with `group`; a control that is never revealed
6
+ * by hover alone is a CI §12 rule ("alles per Tastatur bedienbar"), guarded by
7
+ * `builder-ux.test.tsx`.
8
+ */
9
+ export declare const REVEAL_ON_INTENT = "opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100 focus-within:opacity-100 [@media(hover:none)]:opacity-100";
10
+ //# sourceMappingURL=reveal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reveal.d.ts","sourceRoot":"","sources":["../../../src/app/builder/reveal.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,kJACoH,CAAA"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Secondary builder controls (row, tab and cell actions) stay quiet until the
3
+ * pointer is over their group or focus is anywhere inside it, and are always
4
+ * visible where nothing can hover (touch screens). Spread it on the controls'
5
+ * container inside an element with `group`; a control that is never revealed
6
+ * by hover alone is a CI §12 rule ("alles per Tastatur bedienbar"), guarded by
7
+ * `builder-ux.test.tsx`.
8
+ */
9
+ export const REVEAL_ON_INTENT = "opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100 focus-within:opacity-100 [@media(hover:none)]:opacity-100";
10
+ //# sourceMappingURL=reveal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reveal.js","sourceRoot":"","sources":["../../../src/app/builder/reveal.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAC3B,+IAA+I,CAAA"}