@miragon/mcp-toolkit-ui 2.6.0 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -5
- package/dist/app/adapt-data-widget.d.ts +1 -22
- package/dist/app/adapt-data-widget.d.ts.map +1 -1
- package/dist/app/adapt-data-widget.js +1 -35
- package/dist/app/adapt-data-widget.js.map +1 -1
- package/dist/app/builder/BuilderBanners.d.ts +7 -2
- package/dist/app/builder/BuilderBanners.d.ts.map +1 -1
- package/dist/app/builder/BuilderBanners.js +8 -3
- package/dist/app/builder/BuilderBanners.js.map +1 -1
- package/dist/app/builder/CanvasRow.d.ts +4 -2
- package/dist/app/builder/CanvasRow.d.ts.map +1 -1
- package/dist/app/builder/CanvasRow.js +29 -17
- package/dist/app/builder/CanvasRow.js.map +1 -1
- package/dist/app/builder/CatalogueSheet.d.ts.map +1 -1
- package/dist/app/builder/CatalogueSheet.js +14 -6
- package/dist/app/builder/CatalogueSheet.js.map +1 -1
- package/dist/app/builder/CellPropsSheet.d.ts +7 -3
- package/dist/app/builder/CellPropsSheet.d.ts.map +1 -1
- package/dist/app/builder/CellPropsSheet.js +10 -3
- package/dist/app/builder/CellPropsSheet.js.map +1 -1
- package/dist/app/builder/DiscardDialog.d.ts +18 -0
- package/dist/app/builder/DiscardDialog.d.ts.map +1 -0
- package/dist/app/builder/DiscardDialog.js +18 -0
- package/dist/app/builder/DiscardDialog.js.map +1 -0
- package/dist/app/builder/EmptyHint.d.ts +4 -0
- package/dist/app/builder/EmptyHint.d.ts.map +1 -1
- package/dist/app/builder/EmptyHint.js +6 -1
- package/dist/app/builder/EmptyHint.js.map +1 -1
- package/dist/app/builder/LayoutSurface.d.ts +33 -9
- package/dist/app/builder/LayoutSurface.d.ts.map +1 -1
- package/dist/app/builder/LayoutSurface.js +74 -23
- package/dist/app/builder/LayoutSurface.js.map +1 -1
- package/dist/app/builder/PipelineStrip.d.ts +5 -2
- package/dist/app/builder/PipelineStrip.d.ts.map +1 -1
- package/dist/app/builder/PipelineStrip.js +33 -15
- package/dist/app/builder/PipelineStrip.js.map +1 -1
- package/dist/app/builder/SaveDialog.d.ts +9 -1
- package/dist/app/builder/SaveDialog.d.ts.map +1 -1
- package/dist/app/builder/SaveDialog.js +9 -3
- package/dist/app/builder/SaveDialog.js.map +1 -1
- package/dist/app/builder/Toolbar.d.ts +14 -4
- package/dist/app/builder/Toolbar.d.ts.map +1 -1
- package/dist/app/builder/Toolbar.js +24 -7
- package/dist/app/builder/Toolbar.js.map +1 -1
- package/dist/app/builder/Workspace.d.ts +23 -3
- package/dist/app/builder/Workspace.d.ts.map +1 -1
- package/dist/app/builder/Workspace.js +58 -8
- package/dist/app/builder/Workspace.js.map +1 -1
- package/dist/app/builder/builder-model.d.ts +146 -3
- package/dist/app/builder/builder-model.d.ts.map +1 -1
- package/dist/app/builder/builder-model.js +196 -5
- package/dist/app/builder/builder-model.js.map +1 -1
- package/dist/app/builder/labels.d.ts +13 -62
- package/dist/app/builder/labels.d.ts.map +1 -1
- package/dist/app/builder/labels.js +9 -58
- package/dist/app/builder/labels.js.map +1 -1
- package/dist/app/builder/reveal.d.ts +10 -0
- package/dist/app/builder/reveal.d.ts.map +1 -0
- package/dist/app/builder/reveal.js +10 -0
- package/dist/app/builder/reveal.js.map +1 -0
- package/dist/app/builder/status-chip.d.ts.map +1 -1
- package/dist/app/builder/status-chip.js +3 -2
- package/dist/app/builder/status-chip.js.map +1 -1
- package/dist/app/builder/use-builder-catalogue.d.ts +5 -1
- package/dist/app/builder/use-builder-catalogue.d.ts.map +1 -1
- package/dist/app/builder/use-builder-catalogue.js +50 -17
- package/dist/app/builder/use-builder-catalogue.js.map +1 -1
- package/dist/app/builder/use-builder-session.d.ts +30 -0
- package/dist/app/builder/use-builder-session.d.ts.map +1 -0
- package/dist/app/builder/use-builder-session.js +58 -0
- package/dist/app/builder/use-builder-session.js.map +1 -0
- package/dist/app/builder/use-display-resolver.d.ts +17 -0
- package/dist/app/builder/use-display-resolver.d.ts.map +1 -0
- package/dist/app/builder/use-display-resolver.js +16 -0
- package/dist/app/builder/use-display-resolver.js.map +1 -0
- package/dist/app/builder/use-save-dashboard.d.ts +3 -1
- package/dist/app/builder/use-save-dashboard.d.ts.map +1 -1
- package/dist/app/builder/use-save-dashboard.js +3 -1
- package/dist/app/builder/use-save-dashboard.js.map +1 -1
- package/dist/app/index.d.ts +8 -3
- package/dist/app/index.d.ts.map +1 -1
- package/dist/app/index.js +8 -2
- package/dist/app/index.js.map +1 -1
- package/dist/app/layout-builder.d.ts +18 -25
- package/dist/app/layout-builder.d.ts.map +1 -1
- package/dist/app/layout-builder.js +84 -78
- package/dist/app/layout-builder.js.map +1 -1
- package/dist/app/mcp-app-view-chrome.d.ts +103 -20
- package/dist/app/mcp-app-view-chrome.d.ts.map +1 -1
- package/dist/app/mcp-app-view-chrome.js +125 -40
- package/dist/app/mcp-app-view-chrome.js.map +1 -1
- package/dist/app/mcp-app-view-states.d.ts +23 -0
- package/dist/app/mcp-app-view-states.d.ts.map +1 -0
- package/dist/app/mcp-app-view-states.js +55 -0
- package/dist/app/mcp-app-view-states.js.map +1 -0
- package/dist/app/mcp-app-view.d.ts +72 -5
- package/dist/app/mcp-app-view.d.ts.map +1 -1
- package/dist/app/mcp-app-view.js +241 -141
- package/dist/app/mcp-app-view.js.map +1 -1
- package/dist/app/mcp-toolkit-app.d.ts +8 -2
- package/dist/app/mcp-toolkit-app.d.ts.map +1 -1
- package/dist/app/mcp-toolkit-app.js +33 -4
- package/dist/app/mcp-toolkit-app.js.map +1 -1
- package/dist/app/mcp-use-host-bridge.d.ts +15 -6
- package/dist/app/mcp-use-host-bridge.d.ts.map +1 -1
- package/dist/app/mcp-use-host-bridge.js +51 -22
- package/dist/app/mcp-use-host-bridge.js.map +1 -1
- package/dist/app/model-context.d.ts +71 -0
- package/dist/app/model-context.d.ts.map +1 -0
- package/dist/app/model-context.js +101 -0
- package/dist/app/model-context.js.map +1 -0
- package/dist/app/use-build-mode-focus.d.ts +33 -0
- package/dist/app/use-build-mode-focus.d.ts.map +1 -0
- package/dist/app/use-build-mode-focus.js +59 -0
- package/dist/app/use-build-mode-focus.js.map +1 -0
- package/dist/app/use-view-actions.d.ts +31 -0
- package/dist/app/use-view-actions.d.ts.map +1 -0
- package/dist/app/use-view-actions.js +81 -0
- package/dist/app/use-view-actions.js.map +1 -0
- package/dist/app/use-view-lifecycle.d.ts +42 -0
- package/dist/app/use-view-lifecycle.d.ts.map +1 -0
- package/dist/app/use-view-lifecycle.js +81 -0
- package/dist/app/use-view-lifecycle.js.map +1 -0
- package/dist/app/view-lifecycle.d.ts +185 -0
- package/dist/app/view-lifecycle.d.ts.map +1 -0
- package/dist/app/view-lifecycle.js +207 -0
- package/dist/app/view-lifecycle.js.map +1 -0
- package/dist/app/widget-fixture.d.ts +10 -3
- package/dist/app/widget-fixture.d.ts.map +1 -1
- package/dist/app/widget-fixture.js +21 -8
- package/dist/app/widget-fixture.js.map +1 -1
- package/dist/app/widget-props-sheet.d.ts +6 -10
- package/dist/app/widget-props-sheet.d.ts.map +1 -1
- package/dist/app/widget-props-sheet.js +25 -20
- package/dist/app/widget-props-sheet.js.map +1 -1
- package/dist/app/widget-renderer.d.ts +41 -1
- package/dist/app/widget-renderer.d.ts.map +1 -1
- package/dist/app/widget-renderer.js +82 -31
- package/dist/app/widget-renderer.js.map +1 -1
- package/dist/components/DrillButton.d.ts +9 -6
- package/dist/components/DrillButton.d.ts.map +1 -1
- package/dist/components/DrillButton.js +9 -6
- package/dist/components/DrillButton.js.map +1 -1
- package/dist/components/EmptyState.d.ts +33 -0
- package/dist/components/EmptyState.d.ts.map +1 -0
- package/dist/components/EmptyState.js +19 -0
- package/dist/components/EmptyState.js.map +1 -0
- package/dist/components/ErrorState.d.ts +53 -0
- package/dist/components/ErrorState.d.ts.map +1 -0
- package/dist/components/ErrorState.js +77 -0
- package/dist/components/ErrorState.js.map +1 -0
- package/dist/components/FilterBar.d.ts +16 -5
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +13 -5
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/GroupCard.d.ts.map +1 -1
- package/dist/components/GroupCard.js +2 -1
- package/dist/components/GroupCard.js.map +1 -1
- package/dist/components/KpiGrid.d.ts +70 -18
- package/dist/components/KpiGrid.d.ts.map +1 -1
- package/dist/components/KpiGrid.js +112 -23
- package/dist/components/KpiGrid.js.map +1 -1
- package/dist/components/ListFooter.d.ts +32 -4
- package/dist/components/ListFooter.d.ts.map +1 -1
- package/dist/components/ListFooter.js +35 -6
- package/dist/components/ListFooter.js.map +1 -1
- package/dist/components/PagedListFooter.d.ts +57 -0
- package/dist/components/PagedListFooter.d.ts.map +1 -0
- package/dist/components/PagedListFooter.js +27 -0
- package/dist/components/PagedListFooter.js.map +1 -0
- package/dist/components/Pills.d.ts +36 -12
- package/dist/components/Pills.d.ts.map +1 -1
- package/dist/components/Pills.js +29 -8
- package/dist/components/Pills.js.map +1 -1
- package/dist/components/SectionHeading.d.ts +3 -1
- package/dist/components/SectionHeading.d.ts.map +1 -1
- package/dist/components/SectionHeading.js +6 -2
- package/dist/components/SectionHeading.js.map +1 -1
- package/dist/components/Toast.d.ts +43 -0
- package/dist/components/Toast.d.ts.map +1 -0
- package/dist/components/Toast.js +106 -0
- package/dist/components/Toast.js.map +1 -0
- package/dist/components/WidgetHeader.d.ts +34 -10
- package/dist/components/WidgetHeader.d.ts.map +1 -1
- package/dist/components/WidgetHeader.js +11 -6
- package/dist/components/WidgetHeader.js.map +1 -1
- package/dist/hooks/index.d.ts +4 -4
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/tool-result-recovery-model.d.ts +155 -0
- package/dist/hooks/tool-result-recovery-model.d.ts.map +1 -0
- package/dist/hooks/tool-result-recovery-model.js +273 -0
- package/dist/hooks/tool-result-recovery-model.js.map +1 -0
- package/dist/hooks/use-tool-query.d.ts +56 -14
- package/dist/hooks/use-tool-query.d.ts.map +1 -1
- package/dist/hooks/use-tool-query.js +102 -25
- package/dist/hooks/use-tool-query.js.map +1 -1
- package/dist/hooks/use-tool-result-recovery.d.ts +61 -44
- package/dist/hooks/use-tool-result-recovery.d.ts.map +1 -1
- package/dist/hooks/use-tool-result-recovery.js +62 -110
- package/dist/hooks/use-tool-result-recovery.js.map +1 -1
- package/dist/hooks/use-view-data.d.ts +55 -7
- package/dist/hooks/use-view-data.d.ts.map +1 -1
- package/dist/hooks/use-view-data.js +81 -11
- package/dist/hooks/use-view-data.js.map +1 -1
- package/dist/hooks/use-view-tool-query.d.ts +12 -7
- package/dist/hooks/use-view-tool-query.d.ts.map +1 -1
- package/dist/hooks/use-view-tool-query.js +15 -14
- package/dist/hooks/use-view-tool-query.js.map +1 -1
- package/dist/index.d.ts +27 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -7
- package/dist/index.js.map +1 -1
- package/dist/lib/focus-return.d.ts +61 -0
- package/dist/lib/focus-return.d.ts.map +1 -0
- package/dist/lib/focus-return.js +46 -0
- package/dist/lib/focus-return.js.map +1 -0
- package/dist/lib/focus-ring.d.ts +18 -0
- package/dist/lib/focus-ring.d.ts.map +1 -0
- package/dist/lib/focus-ring.js +18 -0
- package/dist/lib/focus-ring.js.map +1 -0
- package/dist/lib/icon-stroke.d.ts +12 -0
- package/dist/lib/icon-stroke.d.ts.map +1 -0
- package/dist/lib/icon-stroke.js +12 -0
- package/dist/lib/icon-stroke.js.map +1 -0
- package/dist/lib/parse-tool-result.d.ts +23 -1
- package/dist/lib/parse-tool-result.d.ts.map +1 -1
- package/dist/lib/parse-tool-result.js +38 -2
- package/dist/lib/parse-tool-result.js.map +1 -1
- package/dist/lib/toast-model.d.ts +86 -0
- package/dist/lib/toast-model.d.ts.map +1 -0
- package/dist/lib/toast-model.js +102 -0
- package/dist/lib/toast-model.js.map +1 -0
- package/dist/lib/tone-utils.d.ts +95 -9
- package/dist/lib/tone-utils.d.ts.map +1 -1
- package/dist/lib/tone-utils.js +100 -9
- package/dist/lib/tone-utils.js.map +1 -1
- package/dist/lib/tool-query.d.ts +107 -0
- package/dist/lib/tool-query.d.ts.map +1 -0
- package/dist/lib/tool-query.js +182 -0
- package/dist/lib/tool-query.js.map +1 -0
- package/dist/lib/tool-result-observer.d.ts +108 -0
- package/dist/lib/tool-result-observer.d.ts.map +1 -0
- package/dist/lib/tool-result-observer.js +158 -0
- package/dist/lib/tool-result-observer.js.map +1 -0
- package/dist/lib/typography.d.ts +37 -0
- package/dist/lib/typography.d.ts.map +1 -0
- package/dist/lib/typography.js +41 -0
- package/dist/lib/typography.js.map +1 -0
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +11 -1
- package/dist/lib/utils.js.map +1 -1
- package/dist/locale/index.d.ts +3 -1
- package/dist/locale/index.d.ts.map +1 -1
- package/dist/locale/index.js +2 -1
- package/dist/locale/index.js.map +1 -1
- package/dist/locale/locale-provider.d.ts +42 -1
- package/dist/locale/locale-provider.d.ts.map +1 -1
- package/dist/locale/locale-provider.js +44 -3
- package/dist/locale/locale-provider.js.map +1 -1
- package/dist/locale/message-types.d.ts +336 -0
- package/dist/locale/message-types.d.ts.map +1 -0
- package/dist/locale/message-types.js +7 -0
- package/dist/locale/message-types.js.map +1 -0
- package/dist/locale/messages-de.d.ts +9 -0
- package/dist/locale/messages-de.d.ts.map +1 -0
- package/dist/locale/messages-de.js +185 -0
- package/dist/locale/messages-de.js.map +1 -0
- package/dist/locale/messages-en.d.ts +8 -0
- package/dist/locale/messages-en.d.ts.map +1 -0
- package/dist/locale/messages-en.js +184 -0
- package/dist/locale/messages-en.js.map +1 -0
- package/dist/locale/toolkit-messages.d.ts +57 -0
- package/dist/locale/toolkit-messages.d.ts.map +1 -0
- package/dist/locale/toolkit-messages.js +103 -0
- package/dist/locale/toolkit-messages.js.map +1 -0
- package/dist/primitives/alert.d.ts +1 -1
- package/dist/primitives/alert.d.ts.map +1 -1
- package/dist/primitives/alert.js +6 -2
- package/dist/primitives/alert.js.map +1 -1
- package/dist/primitives/badge.d.ts +1 -1
- package/dist/primitives/badge.d.ts.map +1 -1
- package/dist/primitives/badge.js +19 -6
- package/dist/primitives/badge.js.map +1 -1
- package/dist/primitives/button.d.ts +1 -1
- package/dist/primitives/button.d.ts.map +1 -1
- package/dist/primitives/button.js +12 -8
- package/dist/primitives/button.js.map +1 -1
- package/dist/primitives/card.js +4 -4
- package/dist/primitives/card.js.map +1 -1
- package/dist/primitives/dialog.d.ts +7 -3
- package/dist/primitives/dialog.d.ts.map +1 -1
- package/dist/primitives/dialog.js +22 -8
- package/dist/primitives/dialog.js.map +1 -1
- package/dist/primitives/input.d.ts.map +1 -1
- package/dist/primitives/input.js +4 -1
- package/dist/primitives/input.js.map +1 -1
- package/dist/primitives/scroll-area.js +1 -1
- package/dist/primitives/scroll-area.js.map +1 -1
- package/dist/primitives/select.d.ts.map +1 -1
- package/dist/primitives/select.js +6 -3
- package/dist/primitives/select.js.map +1 -1
- package/dist/primitives/sheet.d.ts +3 -1
- package/dist/primitives/sheet.d.ts.map +1 -1
- package/dist/primitives/sheet.js +17 -7
- package/dist/primitives/sheet.js.map +1 -1
- package/dist/primitives/skeleton.js +1 -1
- package/dist/primitives/skeleton.js.map +1 -1
- package/dist/primitives/switch.d.ts.map +1 -1
- package/dist/primitives/switch.js +2 -1
- package/dist/primitives/switch.js.map +1 -1
- package/dist/primitives/tabs.d.ts.map +1 -1
- package/dist/primitives/tabs.js +5 -3
- package/dist/primitives/tabs.js.map +1 -1
- package/dist/providers/query-provider.d.ts +32 -1
- package/dist/providers/query-provider.d.ts.map +1 -1
- package/dist/providers/query-provider.js +53 -4
- package/dist/providers/query-provider.js.map +1 -1
- package/dist/render-cases-primitives.js +1 -1
- package/dist/render-cases-primitives.js.map +1 -1
- package/dist/render-cases.d.ts.map +1 -1
- package/dist/render-cases.js +48 -6
- package/dist/render-cases.js.map +1 -1
- package/dist/render-effects.d.ts +42 -0
- package/dist/render-effects.d.ts.map +1 -0
- package/dist/render-effects.js +81 -0
- package/dist/render-effects.js.map +1 -0
- package/dist/render-scan.d.ts +25 -0
- package/dist/render-scan.d.ts.map +1 -0
- package/dist/render-scan.js +66 -0
- package/dist/render-scan.js.map +1 -0
- package/dist/theme/cd-tokens.d.ts +66 -0
- package/dist/theme/cd-tokens.d.ts.map +1 -0
- package/dist/theme/cd-tokens.js +64 -0
- package/dist/theme/cd-tokens.js.map +1 -0
- package/dist/theme/create-theme.d.ts +214 -39
- package/dist/theme/create-theme.d.ts.map +1 -1
- package/dist/theme/create-theme.js +204 -13
- package/dist/theme/create-theme.js.map +1 -1
- package/dist/theme/fonts.d.ts +38 -0
- package/dist/theme/fonts.d.ts.map +1 -0
- package/dist/theme/fonts.js +56 -0
- package/dist/theme/fonts.js.map +1 -0
- package/dist/theme/host-fonts.d.ts +39 -0
- package/dist/theme/host-fonts.d.ts.map +1 -0
- package/dist/theme/host-fonts.js +44 -0
- package/dist/theme/host-fonts.js.map +1 -0
- package/dist/theme/index.d.ts +8 -1
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +5 -1
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/portal-container.d.ts +16 -0
- package/dist/theme/portal-container.d.ts.map +1 -0
- package/dist/theme/portal-container.js +19 -0
- package/dist/theme/portal-container.js.map +1 -0
- package/dist/theme/presets.d.ts +24 -9
- package/dist/theme/presets.d.ts.map +1 -1
- package/dist/theme/presets.js +44 -11
- package/dist/theme/presets.js.map +1 -1
- package/dist/theme/theme-provider.d.ts +27 -9
- package/dist/theme/theme-provider.d.ts.map +1 -1
- package/dist/theme/theme-provider.js +42 -20
- package/dist/theme/theme-provider.js.map +1 -1
- package/package.json +11 -5
- package/src/app/adapt-data-widget.tsx +2 -42
- package/src/app/builder/BuilderBanners.tsx +26 -13
- package/src/app/builder/CanvasRow.tsx +79 -32
- package/src/app/builder/CatalogueSheet.tsx +58 -35
- package/src/app/builder/CellPropsSheet.tsx +17 -2
- package/src/app/builder/DiscardDialog.tsx +59 -0
- package/src/app/builder/EmptyHint.tsx +16 -11
- package/src/app/builder/LayoutSurface.tsx +207 -67
- package/src/app/builder/PipelineStrip.tsx +265 -156
- package/src/app/builder/SaveDialog.tsx +25 -14
- package/src/app/builder/Toolbar.tsx +154 -57
- package/src/app/builder/Workspace.tsx +226 -56
- package/src/app/builder/builder-feedback.test.tsx +75 -0
- package/src/app/builder/builder-model.test.ts +5 -0
- package/src/app/builder/builder-model.ts +346 -6
- package/src/app/builder/builder-model.ux.test.ts +456 -0
- package/src/app/builder/builder-ux.test.tsx +844 -0
- package/src/app/builder/labels.ts +15 -121
- package/src/app/builder/reveal.ts +10 -0
- package/src/app/builder/status-chip.tsx +8 -4
- package/src/app/builder/use-builder-catalogue.ts +62 -19
- package/src/app/builder/use-builder-session.ts +68 -0
- package/src/app/builder/use-display-resolver.ts +24 -0
- package/src/app/builder/use-save-dashboard.ts +5 -0
- package/src/app/index.ts +20 -3
- package/src/app/layout-builder.tsx +193 -186
- package/src/app/mcp-app-view-chrome.test.tsx +487 -14
- package/src/app/mcp-app-view-chrome.tsx +328 -100
- package/src/app/mcp-app-view-states.tsx +140 -0
- package/src/app/mcp-app-view.effects.test.tsx +292 -0
- package/src/app/mcp-app-view.test.tsx +478 -0
- package/src/app/mcp-app-view.tsx +447 -190
- package/src/app/mcp-toolkit-app.test.tsx +40 -0
- package/src/app/mcp-toolkit-app.tsx +39 -8
- package/src/app/mcp-use-host-bridge.test.tsx +180 -0
- package/src/app/mcp-use-host-bridge.tsx +67 -24
- package/src/app/model-context.test.tsx +116 -0
- package/src/app/model-context.tsx +125 -0
- package/src/app/use-build-mode-focus.ts +62 -0
- package/src/app/use-view-actions.ts +89 -0
- package/src/app/use-view-lifecycle.ts +122 -0
- package/src/app/view-lifecycle.test.ts +443 -0
- package/src/app/view-lifecycle.ts +334 -0
- package/src/app/widget-fixture.effects.test.tsx +51 -0
- package/src/app/widget-fixture.render.test.tsx +81 -0
- package/src/app/widget-fixture.tsx +34 -11
- package/src/app/widget-props-sheet.tsx +67 -39
- package/src/app/widget-renderer.render.test.tsx +131 -0
- package/src/app/widget-renderer.tsx +136 -38
- package/src/components/DrillButton.tsx +24 -10
- package/src/components/EmptyState.tsx +83 -0
- package/src/components/ErrorState.tsx +204 -0
- package/src/components/FilterBar.test.tsx +82 -0
- package/src/components/FilterBar.tsx +56 -27
- package/src/components/GroupCard.tsx +3 -2
- package/src/components/KpiGrid.test.tsx +279 -0
- package/src/components/KpiGrid.tsx +329 -91
- package/src/components/ListFooter.test.tsx +116 -0
- package/src/components/ListFooter.tsx +110 -12
- package/src/components/PagedListFooter.test.tsx +140 -0
- package/src/components/PagedListFooter.tsx +107 -0
- package/src/components/Pills.test.tsx +77 -0
- package/src/components/Pills.tsx +78 -16
- package/src/components/SectionHeading.tsx +9 -3
- package/src/components/Toast.tsx +206 -0
- package/src/components/WidgetHeader.test.tsx +78 -0
- package/src/components/WidgetHeader.tsx +63 -16
- package/src/components/feedback-states.test.tsx +314 -0
- package/src/components/tone-figures.test.tsx +58 -0
- package/src/fonts.css +19 -0
- package/src/globals.css +9 -165
- package/src/hooks/index.ts +6 -3
- package/src/hooks/tool-result-recovery-model.test.ts +744 -0
- package/src/hooks/tool-result-recovery-model.ts +418 -0
- package/src/hooks/use-tool-query.effects.test.tsx +205 -0
- package/src/hooks/use-tool-query.ts +156 -33
- package/src/hooks/use-tool-result-recovery.effects.test.tsx +141 -0
- package/src/hooks/use-tool-result-recovery.test.ts +28 -5
- package/src/hooks/use-tool-result-recovery.ts +101 -131
- package/src/hooks/use-view-data.test.tsx +169 -0
- package/src/hooks/use-view-data.ts +131 -10
- package/src/hooks/use-view-tool-query.ts +25 -19
- package/src/i18n-coverage.test.tsx +425 -0
- package/src/index.ts +102 -13
- package/src/lib/focus-return.test.ts +288 -0
- package/src/lib/focus-return.ts +96 -0
- package/src/lib/focus-ring.ts +20 -0
- package/src/lib/icon-stroke.test.ts +59 -0
- package/src/lib/icon-stroke.ts +13 -0
- package/src/lib/parse-tool-result.test.ts +46 -1
- package/src/lib/parse-tool-result.ts +40 -2
- package/src/lib/toast-model.test.ts +233 -0
- package/src/lib/toast-model.ts +165 -0
- package/src/lib/tone-utils.test.ts +125 -16
- package/src/lib/tone-utils.ts +144 -15
- package/src/lib/tool-query.test.ts +569 -0
- package/src/lib/tool-query.ts +253 -0
- package/src/lib/tool-result-observer.test.ts +296 -0
- package/src/lib/tool-result-observer.ts +211 -0
- package/src/lib/typography.test.ts +45 -0
- package/src/lib/typography.ts +47 -0
- package/src/lib/utils.ts +12 -1
- package/src/locale/index.ts +14 -1
- package/src/locale/locale-provider.test.tsx +87 -0
- package/src/locale/locale-provider.tsx +90 -3
- package/src/locale/message-types.ts +337 -0
- package/src/locale/messages-de.ts +198 -0
- package/src/locale/messages-en.ts +196 -0
- package/src/locale/toolkit-messages.test.ts +349 -0
- package/src/locale/toolkit-messages.ts +143 -0
- package/src/no-hardcoded-copy.test.ts +432 -0
- package/src/primitives/alert.tsx +7 -2
- package/src/primitives/badge.tsx +19 -7
- package/src/primitives/button.tsx +13 -8
- package/src/primitives/card.tsx +4 -4
- package/src/primitives/dialog.tsx +42 -8
- package/src/primitives/input.tsx +5 -3
- package/src/primitives/scroll-area.tsx +1 -1
- package/src/primitives/select.tsx +7 -4
- package/src/primitives/sheet.tsx +33 -6
- package/src/primitives/skeleton.tsx +1 -1
- package/src/primitives/switch.tsx +4 -2
- package/src/primitives/tabs.tsx +9 -6
- package/src/providers/query-provider.test.tsx +154 -0
- package/src/providers/query-provider.tsx +66 -5
- package/src/render-cases-primitives.tsx +1 -1
- package/src/render-cases.tsx +82 -6
- package/src/render-effects.tsx +96 -0
- package/src/render-scan.ts +75 -0
- package/src/theme/cd-tokens.generated.css +48 -0
- package/src/theme/cd-tokens.test.ts +109 -0
- package/src/theme/cd-tokens.ts +67 -0
- package/src/theme/create-theme.test.ts +253 -5
- package/src/theme/create-theme.ts +341 -41
- package/src/theme/fonts.test.ts +85 -0
- package/src/theme/fonts.ts +72 -0
- package/src/theme/host-fonts.test.ts +135 -0
- package/src/theme/host-fonts.ts +52 -0
- package/src/theme/index.ts +15 -1
- package/src/theme/portal-container.ts +20 -0
- package/src/theme/presets.ts +44 -11
- package/src/theme/theme-css.test.ts +619 -0
- package/src/theme/theme-provider.test.tsx +82 -0
- package/src/theme/theme-provider.tsx +60 -24
- package/src/theme.css +344 -0
- package/ui-catalog.json +783 -49
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { memo, useCallback, useRef } from "react"
|
|
2
2
|
import { ChevronDown, ChevronUp, SlidersHorizontal, Trash2, X } from "lucide-react"
|
|
3
|
-
import type { RowDef, WidgetProps } from "@miragon/mcp-toolkit-core"
|
|
3
|
+
import type { DisplayText, RowDef, WidgetProps } from "@miragon/mcp-toolkit-core"
|
|
4
4
|
import { GridItem, GridLayout } from "../../components/GridLayout.js"
|
|
5
5
|
import { Button } from "../../primitives/button.js"
|
|
6
6
|
import {
|
|
@@ -10,10 +10,14 @@ import {
|
|
|
10
10
|
SelectTrigger,
|
|
11
11
|
SelectValue,
|
|
12
12
|
} from "../../primitives/select.js"
|
|
13
|
+
import { FOCUS_RING, FOCUS_RING_INSET } from "../../lib/focus-ring.js"
|
|
13
14
|
import { cn } from "../../lib/utils.js"
|
|
14
15
|
import { RenderedWidget, type WidgetComponent } from "../widget-renderer.js"
|
|
16
|
+
import { displayLabel } from "./builder-model.js"
|
|
15
17
|
import type { LayoutBuilderLabels } from "./labels.js"
|
|
16
18
|
import { WIDGET_DRAG_MIME } from "./labels.js"
|
|
19
|
+
import { REVEAL_ON_INTENT } from "./reveal.js"
|
|
20
|
+
import { useDisplayResolver } from "./use-display-resolver.js"
|
|
17
21
|
|
|
18
22
|
// -------------------------------------------------------------------------- //
|
|
19
23
|
// Canvas row — drop target + per-cell controls + resize handle
|
|
@@ -36,6 +40,8 @@ function CanvasRowImpl({
|
|
|
36
40
|
onAddWidget,
|
|
37
41
|
onConfigureCell,
|
|
38
42
|
propsSchemaByWidgetId,
|
|
43
|
+
displayByWidgetId,
|
|
44
|
+
advanced,
|
|
39
45
|
widgets,
|
|
40
46
|
widgetProps,
|
|
41
47
|
}: {
|
|
@@ -55,14 +61,25 @@ function CanvasRowImpl({
|
|
|
55
61
|
onAddWidget: (widgetId: string, targetRowIdx?: number) => void
|
|
56
62
|
onConfigureCell: (rowIdx: number, cellIdx: number) => void
|
|
57
63
|
propsSchemaByWidgetId: Map<string, Record<string, unknown>>
|
|
64
|
+
displayByWidgetId: Map<string, DisplayText>
|
|
65
|
+
advanced: boolean
|
|
58
66
|
widgets: Record<string, WidgetComponent>
|
|
59
67
|
widgetProps: WidgetProps
|
|
60
68
|
}) {
|
|
61
69
|
const gridRef = useRef<HTMLDivElement | null>(null)
|
|
70
|
+
const { locale, resolveKey } = useDisplayResolver()
|
|
71
|
+
// The target row follows the pointer AND the keyboard: focus moving into a
|
|
72
|
+
// row (its actions, a cell control) makes it the row the palette adds to.
|
|
73
|
+
const target = () => {
|
|
74
|
+
if (!focused) setFocusedRowIndex(rowIdx)
|
|
75
|
+
}
|
|
62
76
|
|
|
63
77
|
return (
|
|
64
78
|
<div
|
|
65
|
-
|
|
79
|
+
data-slot="builder-row"
|
|
80
|
+
data-target={focused ? "" : undefined}
|
|
81
|
+
onClick={target}
|
|
82
|
+
onFocus={target}
|
|
66
83
|
onDragOver={(e) => {
|
|
67
84
|
if (!e.dataTransfer.types.includes(WIDGET_DRAG_MIME)) return
|
|
68
85
|
e.preventDefault()
|
|
@@ -82,21 +99,28 @@ function CanvasRowImpl({
|
|
|
82
99
|
}
|
|
83
100
|
}}
|
|
84
101
|
className={cn(
|
|
85
|
-
"group relative rounded-
|
|
102
|
+
"group relative rounded-md border-l-2 px-3 py-2 transition-colors",
|
|
86
103
|
focused
|
|
87
104
|
? "border-l-primary bg-card"
|
|
88
105
|
: "bg-background hover:bg-card/60 border-l-transparent",
|
|
89
106
|
dragOver && "bg-primary/5 border-l-primary",
|
|
90
107
|
)}
|
|
91
108
|
>
|
|
92
|
-
<div className="mb-2 flex items-center justify-between">
|
|
93
|
-
<div className="text-muted-foreground flex items-center gap-2
|
|
94
|
-
<span className="font-
|
|
95
|
-
<span className="bg-muted
|
|
96
|
-
|
|
97
|
-
|
|
109
|
+
<div className="mb-2 flex flex-wrap items-center justify-between gap-2">
|
|
110
|
+
<div className="text-muted-foreground text-small flex flex-wrap items-center gap-2">
|
|
111
|
+
<span className="font-medium">{L.rowLabel(rowIdx + 1)}</span>
|
|
112
|
+
<span className="bg-muted rounded px-1.5 py-0.5">{L.elementCount(row.row.length)}</span>
|
|
113
|
+
{focused && (
|
|
114
|
+
<span className="text-foreground inline-flex items-center gap-1.5">
|
|
115
|
+
<span aria-hidden="true" className="bg-primary size-1.5 rounded-full" />
|
|
116
|
+
{L.rowTarget}
|
|
117
|
+
</span>
|
|
118
|
+
)}
|
|
98
119
|
</div>
|
|
99
|
-
<div
|
|
120
|
+
<div
|
|
121
|
+
data-slot="builder-row-actions"
|
|
122
|
+
className={cn("flex items-center", focused ? "opacity-100" : REVEAL_ON_INTENT)}
|
|
123
|
+
>
|
|
100
124
|
<Button
|
|
101
125
|
variant="ghost"
|
|
102
126
|
size="icon-xs"
|
|
@@ -105,7 +129,7 @@ function CanvasRowImpl({
|
|
|
105
129
|
onMoveRow(rowIdx, -1)
|
|
106
130
|
}}
|
|
107
131
|
disabled={isFirst}
|
|
108
|
-
aria-label=
|
|
132
|
+
aria-label={L.moveRowUp}
|
|
109
133
|
>
|
|
110
134
|
<ChevronUp />
|
|
111
135
|
</Button>
|
|
@@ -117,7 +141,7 @@ function CanvasRowImpl({
|
|
|
117
141
|
onMoveRow(rowIdx, 1)
|
|
118
142
|
}}
|
|
119
143
|
disabled={isLast}
|
|
120
|
-
aria-label=
|
|
144
|
+
aria-label={L.moveRowDown}
|
|
121
145
|
>
|
|
122
146
|
<ChevronDown />
|
|
123
147
|
</Button>
|
|
@@ -137,10 +161,10 @@ function CanvasRowImpl({
|
|
|
137
161
|
{row.row.length === 0 ? (
|
|
138
162
|
<div
|
|
139
163
|
className={cn(
|
|
140
|
-
"rounded-md border border-dashed py-6 text-center
|
|
164
|
+
"text-small rounded-md border border-dashed py-6 text-center transition-colors",
|
|
141
165
|
dragOver
|
|
142
|
-
? "border-
|
|
143
|
-
: "border-
|
|
166
|
+
? "border-focus bg-accent text-accent-foreground"
|
|
167
|
+
: "border-input text-muted-foreground",
|
|
144
168
|
)}
|
|
145
169
|
>
|
|
146
170
|
{dragOver ? L.canvasDropHint : L.canvasEmpty}
|
|
@@ -153,29 +177,48 @@ function CanvasRowImpl({
|
|
|
153
177
|
const Widget = widgets[cell.widget]
|
|
154
178
|
const hasPropsSchema = propsSchemaByWidgetId.has(cell.widget)
|
|
155
179
|
const propCount = cell.props ? Object.keys(cell.props).length : 0
|
|
180
|
+
const name = displayLabel(
|
|
181
|
+
displayByWidgetId.get(cell.widget) ?? {},
|
|
182
|
+
cell.widget,
|
|
183
|
+
locale,
|
|
184
|
+
resolveKey,
|
|
185
|
+
)
|
|
156
186
|
return (
|
|
157
187
|
<GridItem key={`${cell.widget}-${cellIdx}`} span={span}>
|
|
158
|
-
<div className="border-border bg-card relative overflow-hidden rounded-md border
|
|
159
|
-
<div className="text-muted-foreground bg-muted/30 flex items-center justify-between gap-2 border-b px-2 py-1
|
|
160
|
-
<span className="
|
|
188
|
+
<div className="border-border bg-card shadow-1 relative overflow-hidden rounded-md border">
|
|
189
|
+
<div className="text-muted-foreground bg-muted/30 text-small flex items-center justify-between gap-2 border-b px-2 py-1">
|
|
190
|
+
<span className="flex min-w-0 items-baseline gap-2" title={name.hint}>
|
|
191
|
+
<span className="text-foreground truncate font-medium">{name.label}</span>
|
|
192
|
+
{advanced && name.hint && (
|
|
193
|
+
<span className="truncate font-mono">{name.hint}</span>
|
|
194
|
+
)}
|
|
195
|
+
</span>
|
|
161
196
|
<div className="flex shrink-0 items-center gap-2">
|
|
162
|
-
<label className="text-muted-foreground
|
|
163
|
-
<span className="sr-only">
|
|
197
|
+
<label className="text-muted-foreground inline-flex items-center gap-0.5 tabular-nums">
|
|
198
|
+
<span className="sr-only">{L.columnSpan}</span>
|
|
164
199
|
<Select
|
|
165
200
|
value={String(span)}
|
|
166
201
|
onValueChange={(v) => onSetCellSpan(rowIdx, cellIdx, Number(v))}
|
|
167
202
|
>
|
|
168
203
|
<SelectTrigger
|
|
169
204
|
size="sm"
|
|
170
|
-
className=
|
|
171
|
-
|
|
205
|
+
className={cn(
|
|
206
|
+
"text-small h-6 gap-0.5 border-none bg-transparent px-1 py-0 tabular-nums shadow-none",
|
|
207
|
+
// Borderless, so the input focus edge is gone: the kit ring instead.
|
|
208
|
+
FOCUS_RING,
|
|
209
|
+
)}
|
|
210
|
+
aria-label={L.columnSpan}
|
|
172
211
|
onClick={(e) => e.stopPropagation()}
|
|
173
212
|
>
|
|
174
213
|
<SelectValue />
|
|
175
214
|
</SelectTrigger>
|
|
176
215
|
<SelectContent>
|
|
177
216
|
{Array.from({ length: 12 }, (_, i) => i + 1).map((n) => (
|
|
178
|
-
<SelectItem
|
|
217
|
+
<SelectItem
|
|
218
|
+
key={n}
|
|
219
|
+
value={String(n)}
|
|
220
|
+
className="text-small tabular-nums"
|
|
221
|
+
>
|
|
179
222
|
{n}
|
|
180
223
|
</SelectItem>
|
|
181
224
|
))}
|
|
@@ -191,13 +234,11 @@ function CanvasRowImpl({
|
|
|
191
234
|
e.stopPropagation()
|
|
192
235
|
onConfigureCell(rowIdx, cellIdx)
|
|
193
236
|
}}
|
|
194
|
-
aria-label=
|
|
237
|
+
aria-label={L.configureElement}
|
|
195
238
|
title={
|
|
196
|
-
propCount > 0
|
|
197
|
-
? `Configure widget props (${propCount} set)`
|
|
198
|
-
: "Configure widget props"
|
|
239
|
+
propCount > 0 ? L.configureElementSet(propCount) : L.configureElement
|
|
199
240
|
}
|
|
200
|
-
className={cn(propCount > 0 && "text-
|
|
241
|
+
className={cn(propCount > 0 && "text-link")}
|
|
201
242
|
>
|
|
202
243
|
<SlidersHorizontal />
|
|
203
244
|
</Button>
|
|
@@ -209,7 +250,7 @@ function CanvasRowImpl({
|
|
|
209
250
|
e.stopPropagation()
|
|
210
251
|
onRemoveCell(rowIdx, cellIdx)
|
|
211
252
|
}}
|
|
212
|
-
aria-label=
|
|
253
|
+
aria-label={L.removeElement}
|
|
213
254
|
>
|
|
214
255
|
<X />
|
|
215
256
|
</Button>
|
|
@@ -222,10 +263,11 @@ function CanvasRowImpl({
|
|
|
222
263
|
props={widgetProps}
|
|
223
264
|
cellProps={cell.props}
|
|
224
265
|
showEmptyHint
|
|
225
|
-
notBundledClassName="text-muted-foreground rounded border border-dashed p-3 text-center text-
|
|
266
|
+
notBundledClassName="text-muted-foreground rounded border border-dashed p-3 text-center text-small"
|
|
226
267
|
/>
|
|
227
268
|
</div>
|
|
228
269
|
<ResizeHandle
|
|
270
|
+
label={L.resizeElement}
|
|
229
271
|
rowIdx={rowIdx}
|
|
230
272
|
cellIdx={cellIdx}
|
|
231
273
|
span={span}
|
|
@@ -250,12 +292,14 @@ export const CanvasRow = memo(CanvasRowImpl)
|
|
|
250
292
|
// -------------------------------------------------------------------------- //
|
|
251
293
|
|
|
252
294
|
function ResizeHandle({
|
|
295
|
+
label,
|
|
253
296
|
rowIdx,
|
|
254
297
|
cellIdx,
|
|
255
298
|
span,
|
|
256
299
|
getGridEl,
|
|
257
300
|
onSetCellSpan,
|
|
258
301
|
}: {
|
|
302
|
+
label: string
|
|
259
303
|
rowIdx: number
|
|
260
304
|
cellIdx: number
|
|
261
305
|
span: number
|
|
@@ -304,8 +348,11 @@ function ResizeHandle({
|
|
|
304
348
|
onClick={(e) => e.stopPropagation()}
|
|
305
349
|
onKeyDown={onKeyDown}
|
|
306
350
|
tabIndex={0}
|
|
307
|
-
className=
|
|
308
|
-
|
|
351
|
+
className={cn(
|
|
352
|
+
"hover:bg-primary/40 focus-visible:bg-primary/40 absolute top-0 right-0 h-full w-1.5 cursor-col-resize touch-none select-none",
|
|
353
|
+
FOCUS_RING_INSET,
|
|
354
|
+
)}
|
|
355
|
+
aria-label={label}
|
|
309
356
|
role="separator"
|
|
310
357
|
aria-orientation="vertical"
|
|
311
358
|
aria-valuenow={span}
|
|
@@ -11,8 +11,11 @@ import {
|
|
|
11
11
|
SheetHeader,
|
|
12
12
|
SheetTitle,
|
|
13
13
|
} from "../../primitives/sheet.js"
|
|
14
|
+
import { TONE_DOT, TONE_TEXT } from "../../lib/tone-utils.js"
|
|
14
15
|
import { cn } from "../../lib/utils.js"
|
|
16
|
+
import { displayLabel } from "./builder-model.js"
|
|
15
17
|
import type { LayoutBuilderLabels } from "./labels.js"
|
|
18
|
+
import { useDisplayResolver } from "./use-display-resolver.js"
|
|
16
19
|
|
|
17
20
|
// -------------------------------------------------------------------------- //
|
|
18
21
|
// Catalogue Sheet — slides in from the right
|
|
@@ -37,6 +40,7 @@ export function CatalogueSheet({
|
|
|
37
40
|
onSeedKey: (name: string) => void
|
|
38
41
|
onAddProducingStep: (key: string) => void
|
|
39
42
|
}) {
|
|
43
|
+
const { locale, resolveKey } = useDisplayResolver()
|
|
40
44
|
const producerOf = useMemo(() => {
|
|
41
45
|
const map = new Map<string, string | undefined>()
|
|
42
46
|
for (const e of keyCatalog) map.set(e.key, e.producedBySteps[0])
|
|
@@ -59,28 +63,29 @@ export function CatalogueSheet({
|
|
|
59
63
|
<section className="flex flex-col gap-2">
|
|
60
64
|
<CatalogueSectionHeader title={L.catalogueKeys} count={keyCatalog.length} />
|
|
61
65
|
{keyCatalog.length === 0 ? (
|
|
62
|
-
<p className="text-muted-foreground text-
|
|
66
|
+
<p className="text-muted-foreground text-small italic">{L.noKeysRegistered}</p>
|
|
63
67
|
) : (
|
|
64
68
|
<ul className="flex flex-col gap-1">
|
|
65
69
|
{keyCatalog.map((entry) => (
|
|
66
70
|
<li
|
|
67
71
|
key={entry.key}
|
|
68
|
-
className="hover:bg-
|
|
72
|
+
className="hover:bg-muted text-small flex flex-col gap-1 rounded-md border px-2 py-1.5"
|
|
69
73
|
>
|
|
70
74
|
<div className="flex items-start justify-between gap-2">
|
|
71
75
|
<span className="truncate font-mono">{entry.key}</span>
|
|
72
76
|
<span
|
|
73
77
|
className={cn(
|
|
74
|
-
"inline-flex shrink-0 items-center gap-1
|
|
75
|
-
entry.inContext
|
|
76
|
-
? "text-emerald-600 dark:text-emerald-400"
|
|
77
|
-
: "text-muted-foreground",
|
|
78
|
+
"text-small inline-flex shrink-0 items-center gap-1",
|
|
79
|
+
entry.inContext ? TONE_TEXT.success : "text-muted-foreground",
|
|
78
80
|
)}
|
|
79
81
|
>
|
|
80
82
|
<span
|
|
83
|
+
aria-hidden="true"
|
|
81
84
|
className={cn(
|
|
82
85
|
"size-1.5 rounded-full",
|
|
83
|
-
entry.inContext
|
|
86
|
+
entry.inContext
|
|
87
|
+
? TONE_DOT.success
|
|
88
|
+
: "border-input border bg-transparent",
|
|
84
89
|
)}
|
|
85
90
|
/>
|
|
86
91
|
{entry.inContext ? L.catalogueLive : L.catalogueMissing}
|
|
@@ -89,7 +94,7 @@ export function CatalogueSheet({
|
|
|
89
94
|
{(entry.producedBySteps.length > 0 ||
|
|
90
95
|
entry.consumedBySteps.length > 0 ||
|
|
91
96
|
entry.consumedByWidgets.length > 0) && (
|
|
92
|
-
<div className="text-muted-foreground
|
|
97
|
+
<div className="text-muted-foreground text-small flex flex-col gap-0.5">
|
|
93
98
|
{entry.producedBySteps.length > 0 && (
|
|
94
99
|
<span>
|
|
95
100
|
{L.catalogueProducedBy}{" "}
|
|
@@ -98,13 +103,13 @@ export function CatalogueSheet({
|
|
|
98
103
|
)}
|
|
99
104
|
{entry.consumedBySteps.length > 0 && (
|
|
100
105
|
<span>
|
|
101
|
-
|
|
106
|
+
{L.catalogueStepPrefix} {L.catalogueConsumedBy}{" "}
|
|
102
107
|
<span className="font-mono">{entry.consumedBySteps.join(", ")}</span>
|
|
103
108
|
</span>
|
|
104
109
|
)}
|
|
105
110
|
{entry.consumedByWidgets.length > 0 && (
|
|
106
111
|
<span>
|
|
107
|
-
|
|
112
|
+
{L.catalogueElementPrefix} {L.catalogueConsumedBy}{" "}
|
|
108
113
|
<span className="font-mono">
|
|
109
114
|
{entry.consumedByWidgets.join(", ")}
|
|
110
115
|
</span>
|
|
@@ -137,25 +142,39 @@ export function CatalogueSheet({
|
|
|
137
142
|
<section className="flex flex-col gap-2">
|
|
138
143
|
<CatalogueSectionHeader title={L.catalogueSteps} count={availableSteps.length} />
|
|
139
144
|
{availableSteps.length === 0 ? (
|
|
140
|
-
<p className="text-muted-foreground text-
|
|
145
|
+
<p className="text-muted-foreground text-small italic">{L.noStepsRegistered}</p>
|
|
141
146
|
) : (
|
|
142
147
|
<ul className="flex flex-col gap-1">
|
|
143
|
-
{availableSteps.map((s) =>
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
<span className="font-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
148
|
+
{availableSteps.map((s) => {
|
|
149
|
+
const name = displayLabel(s, s.id, locale, resolveKey)
|
|
150
|
+
return (
|
|
151
|
+
<li
|
|
152
|
+
key={s.id}
|
|
153
|
+
className="text-small flex flex-col gap-0.5 rounded-md border px-2 py-1.5"
|
|
154
|
+
>
|
|
155
|
+
<span className="truncate font-medium">{name.label}</span>
|
|
156
|
+
{name.hint && (
|
|
157
|
+
<span className="text-muted-foreground truncate font-mono">
|
|
158
|
+
{name.hint}
|
|
159
|
+
</span>
|
|
160
|
+
)}
|
|
161
|
+
<div className="text-muted-foreground flex flex-wrap gap-x-3">
|
|
162
|
+
<span>
|
|
163
|
+
{L.catalogueNeedsKeys}{" "}
|
|
164
|
+
<span className="font-mono">
|
|
165
|
+
{s.requires.length ? s.requires.join(", ") : L.noInputs}
|
|
166
|
+
</span>
|
|
167
|
+
</span>
|
|
168
|
+
<span>
|
|
169
|
+
{L.stepProvides}{" "}
|
|
170
|
+
<span className="font-mono">
|
|
171
|
+
{s.produces.length ? s.produces.join(", ") : L.noOutputs}
|
|
172
|
+
</span>
|
|
173
|
+
</span>
|
|
174
|
+
</div>
|
|
175
|
+
</li>
|
|
176
|
+
)
|
|
177
|
+
})}
|
|
159
178
|
</ul>
|
|
160
179
|
)}
|
|
161
180
|
</section>
|
|
@@ -166,7 +185,7 @@ export function CatalogueSheet({
|
|
|
166
185
|
count={unreachableWidgets.length}
|
|
167
186
|
/>
|
|
168
187
|
{unreachableWidgets.length === 0 ? (
|
|
169
|
-
<p className="text-muted-foreground text-
|
|
188
|
+
<p className="text-muted-foreground text-small italic">
|
|
170
189
|
{L.catalogueUnreachableEmpty}
|
|
171
190
|
</p>
|
|
172
191
|
) : (
|
|
@@ -175,13 +194,19 @@ export function CatalogueSheet({
|
|
|
175
194
|
const candidate = w.missingKeys
|
|
176
195
|
.map((k) => ({ key: k, step: producerOf.get(k) }))
|
|
177
196
|
.find((c) => c.step)
|
|
197
|
+
const name = displayLabel(w, w.id, locale, resolveKey)
|
|
178
198
|
return (
|
|
179
199
|
<li
|
|
180
200
|
key={w.id}
|
|
181
|
-
className="bg-muted/20 flex flex-col gap-1 rounded-md border px-2 py-1.5
|
|
201
|
+
className="bg-muted/20 text-small flex flex-col gap-1 rounded-md border px-2 py-1.5"
|
|
182
202
|
>
|
|
183
|
-
<span className="truncate font-
|
|
184
|
-
|
|
203
|
+
<span className="truncate font-medium">{name.label}</span>
|
|
204
|
+
{name.hint && (
|
|
205
|
+
<span className="text-muted-foreground truncate font-mono">
|
|
206
|
+
{name.hint}
|
|
207
|
+
</span>
|
|
208
|
+
)}
|
|
209
|
+
<span className="text-muted-foreground">
|
|
185
210
|
{L.catalogueNeedsKeys}{" "}
|
|
186
211
|
<span className="font-mono">{w.missingKeys.join(", ")}</span>
|
|
187
212
|
</span>
|
|
@@ -218,11 +243,9 @@ export function CatalogueSheet({
|
|
|
218
243
|
function CatalogueSectionHeader({ title, count }: { title: string; count: number }) {
|
|
219
244
|
return (
|
|
220
245
|
<div className="flex items-center gap-2">
|
|
221
|
-
<
|
|
222
|
-
{title}
|
|
223
|
-
</span>
|
|
246
|
+
<h3 className="text-muted-foreground text-small font-semibold">{title}</h3>
|
|
224
247
|
<span className="bg-border h-px flex-1" aria-hidden="true" />
|
|
225
|
-
<Badge variant="outline" className="px-1.5
|
|
248
|
+
<Badge variant="outline" className="px-1.5">
|
|
226
249
|
{count}
|
|
227
250
|
</Badge>
|
|
228
251
|
</div>
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import type { RowDef } from "@miragon/mcp-toolkit-core"
|
|
1
|
+
import type { DisplayText, RowDef } from "@miragon/mcp-toolkit-core"
|
|
2
2
|
import { WidgetPropsSheet } from "../widget-props-sheet.js"
|
|
3
|
+
import { displayLabel } from "./builder-model.js"
|
|
4
|
+
import { useDisplayResolver } from "./use-display-resolver.js"
|
|
3
5
|
|
|
4
6
|
// -------------------------------------------------------------------------- //
|
|
5
7
|
// Cell props sheet — mounts the WidgetPropsSheet for the configured cell
|
|
@@ -10,25 +12,37 @@ import { WidgetPropsSheet } from "../widget-props-sheet.js"
|
|
|
10
12
|
* can be open at a time across the entire workspace — including across
|
|
11
13
|
* tabs. `configuringCell` addresses `{ rowIdx, cellIdx }` on the currently
|
|
12
14
|
* active draft surface (rows or active tab's rows); renders nothing when no
|
|
13
|
-
* cell is being configured or the address no longer resolves.
|
|
15
|
+
* cell is being configured or the address no longer resolves. The sheet is
|
|
16
|
+
* titled with the widget's name; closing it returns focus to the cell's
|
|
17
|
+
* configure button (the kit's `SheetContent` hands it back to the element
|
|
18
|
+
* that opened it, see `lib/focus-return.ts`).
|
|
14
19
|
*/
|
|
15
20
|
export function CellPropsSheet({
|
|
16
21
|
configuringCell,
|
|
17
22
|
activeRows,
|
|
18
23
|
propsSchemaByWidgetId,
|
|
24
|
+
displayByWidgetId,
|
|
19
25
|
onApply,
|
|
20
26
|
onClose,
|
|
21
27
|
}: {
|
|
22
28
|
configuringCell: { rowIdx: number; cellIdx: number } | null
|
|
23
29
|
activeRows: RowDef[]
|
|
24
30
|
propsSchemaByWidgetId: Map<string, Record<string, unknown>>
|
|
31
|
+
displayByWidgetId: Map<string, DisplayText>
|
|
25
32
|
onApply: (rowIdx: number, cellIdx: number, next: Record<string, unknown> | undefined) => void
|
|
26
33
|
onClose: () => void
|
|
27
34
|
}) {
|
|
35
|
+
const { locale, resolveKey } = useDisplayResolver()
|
|
28
36
|
if (!configuringCell) return null
|
|
29
37
|
const cell = activeRows[configuringCell.rowIdx]?.row[configuringCell.cellIdx]
|
|
30
38
|
if (!cell) return null
|
|
31
39
|
const schema = propsSchemaByWidgetId.get(cell.widget)
|
|
40
|
+
const name = displayLabel(
|
|
41
|
+
displayByWidgetId.get(cell.widget) ?? {},
|
|
42
|
+
cell.widget,
|
|
43
|
+
locale,
|
|
44
|
+
resolveKey,
|
|
45
|
+
)
|
|
32
46
|
return (
|
|
33
47
|
<WidgetPropsSheet
|
|
34
48
|
open
|
|
@@ -36,6 +50,7 @@ export function CellPropsSheet({
|
|
|
36
50
|
if (!open) onClose()
|
|
37
51
|
}}
|
|
38
52
|
widgetId={cell.widget}
|
|
53
|
+
widgetTitle={name.hint ? name.label : undefined}
|
|
39
54
|
schema={schema}
|
|
40
55
|
value={cell.props}
|
|
41
56
|
onApply={(next) => {
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Button } from "../../primitives/button.js"
|
|
2
|
+
import {
|
|
3
|
+
Dialog,
|
|
4
|
+
DialogClose,
|
|
5
|
+
DialogContent,
|
|
6
|
+
DialogDescription,
|
|
7
|
+
DialogFooter,
|
|
8
|
+
DialogHeader,
|
|
9
|
+
DialogTitle,
|
|
10
|
+
} from "../../primitives/dialog.js"
|
|
11
|
+
import type { LayoutBuilderLabels } from "./labels.js"
|
|
12
|
+
|
|
13
|
+
// -------------------------------------------------------------------------- //
|
|
14
|
+
// Discard confirmation
|
|
15
|
+
// -------------------------------------------------------------------------- //
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Asks before Discard takes the changes out of the view (CI §9: confirm
|
|
19
|
+
* before an irreversible action). When a saved dashboard holds them
|
|
20
|
+
* (`changesSaved`), it says so instead of calling them lost. The safe choice
|
|
21
|
+
* comes first in the DOM, so the dialog opens with focus on "Keep editing";
|
|
22
|
+
* closing it returns focus to Discard (the kit's `DialogContent` hands it
|
|
23
|
+
* back to the element that opened it, see `lib/focus-return.ts`).
|
|
24
|
+
*/
|
|
25
|
+
export function DiscardDialog({
|
|
26
|
+
L,
|
|
27
|
+
open,
|
|
28
|
+
onOpenChange,
|
|
29
|
+
changesSaved,
|
|
30
|
+
onConfirm,
|
|
31
|
+
}: {
|
|
32
|
+
L: Required<LayoutBuilderLabels>
|
|
33
|
+
open: boolean
|
|
34
|
+
onOpenChange: (open: boolean) => void
|
|
35
|
+
/** A saved dashboard holds the changes: only the view goes back. */
|
|
36
|
+
changesSaved: boolean
|
|
37
|
+
onConfirm: () => void
|
|
38
|
+
}) {
|
|
39
|
+
return (
|
|
40
|
+
<Dialog open={open} onOpenChange={onOpenChange}>
|
|
41
|
+
<DialogContent>
|
|
42
|
+
<DialogHeader>
|
|
43
|
+
<DialogTitle>{L.discardDialogTitle}</DialogTitle>
|
|
44
|
+
<DialogDescription>
|
|
45
|
+
{changesSaved ? L.discardDialogDescriptionSaved : L.discardDialogDescription}
|
|
46
|
+
</DialogDescription>
|
|
47
|
+
</DialogHeader>
|
|
48
|
+
<DialogFooter>
|
|
49
|
+
<DialogClose asChild>
|
|
50
|
+
<Button variant="outline">{L.keepEditing}</Button>
|
|
51
|
+
</DialogClose>
|
|
52
|
+
<Button variant="destructive" onClick={onConfirm}>
|
|
53
|
+
{L.discardConfirm}
|
|
54
|
+
</Button>
|
|
55
|
+
</DialogFooter>
|
|
56
|
+
</DialogContent>
|
|
57
|
+
</Dialog>
|
|
58
|
+
)
|
|
59
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Layers, SlidersHorizontal } from "lucide-react"
|
|
2
|
+
import { EmptyState } from "../../components/EmptyState.js"
|
|
2
3
|
import { Button } from "../../primitives/button.js"
|
|
3
4
|
import type { LayoutBuilderLabels } from "./labels.js"
|
|
4
5
|
|
|
@@ -6,6 +7,10 @@ import type { LayoutBuilderLabels } from "./labels.js"
|
|
|
6
7
|
// Empty hint — shown on the Layout view before any widget is reachable
|
|
7
8
|
// -------------------------------------------------------------------------- //
|
|
8
9
|
|
|
10
|
+
/**
|
|
11
|
+
* The builder's empty state. Its one next step (open the data sources) is the
|
|
12
|
+
* blue primary button: CI §9 "Leer: Empty-State-Karte mit blauem CTA".
|
|
13
|
+
*/
|
|
9
14
|
export function EmptyHint({
|
|
10
15
|
L,
|
|
11
16
|
onGotoPipeline,
|
|
@@ -14,16 +19,16 @@ export function EmptyHint({
|
|
|
14
19
|
onGotoPipeline: () => void
|
|
15
20
|
}) {
|
|
16
21
|
return (
|
|
17
|
-
<
|
|
18
|
-
|
|
19
|
-
<
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
<EmptyState
|
|
23
|
+
className="rounded-md border border-dashed"
|
|
24
|
+
icon={<Layers />}
|
|
25
|
+
title={L.emptyHintTitle}
|
|
26
|
+
description={L.emptyHintBody}
|
|
27
|
+
action={
|
|
28
|
+
<Button size="sm" onClick={onGotoPipeline}>
|
|
29
|
+
<SlidersHorizontal aria-hidden="true" /> {L.openDataSources}
|
|
30
|
+
</Button>
|
|
31
|
+
}
|
|
32
|
+
/>
|
|
28
33
|
)
|
|
29
34
|
}
|