@vc-shell/framework 2.5.0-pr354.da09837 → 2.6.0-pr370.de147ea
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/dist/charts/index.d.ts.map +1 -1
- package/dist/chunks/ExtensionPoint.vue_vue_type_style_index_0_lang-B1R06zHa.js.map +1 -1
- package/dist/chunks/VcAiAgentPanel.vue_vue_type_script_setup_true_lang-y-eKcMMU.js.map +1 -1
- package/dist/chunks/VcAiAgentPanel.vue_vue_type_style_index_0_lang-JB7OKRk6.js.map +1 -1
- package/dist/chunks/{VcScheduler.vue_vue_type_script_setup_true_lang-RHeDlcVB.js → VcScheduler.vue_vue_type_script_setup_true_lang-CS_aEQ84.js} +7810 -7636
- package/dist/chunks/VcScheduler.vue_vue_type_script_setup_true_lang-CS_aEQ84.js.map +1 -0
- package/dist/chunks/{VcScheduler.vue_vue_type_style_index_0_lang-BQ09AUgy.js → VcScheduler.vue_vue_type_style_index_0_lang-Cjmi5lAM.js} +1369 -1333
- package/dist/chunks/VcScheduler.vue_vue_type_style_index_0_lang-Cjmi5lAM.js.map +1 -0
- package/dist/chunks/{dashboard-feed-row.vue_vue_type_script_setup_true_lang-C0IjvNtI.js → dashboard-feed-row.vue_vue_type_script_setup_true_lang-CYq_EvRc.js} +269 -256
- package/dist/chunks/dashboard-feed-row.vue_vue_type_script_setup_true_lang-CYq_EvRc.js.map +1 -0
- package/dist/core/blade-navigation/singletons.d.ts +3 -5
- package/dist/core/blade-navigation/singletons.d.ts.map +1 -1
- package/dist/core/blade-navigation/table-query-state/createBladeQueryState.d.ts.map +1 -1
- package/dist/core/blade-navigation/table-query-state/useTableQueryState.d.ts +2 -3
- package/dist/core/blade-navigation/table-query-state/useTableQueryState.d.ts.map +1 -1
- package/dist/core/blade-navigation/types/index.d.ts +9 -14
- package/dist/core/blade-navigation/types/index.d.ts.map +1 -1
- package/dist/core/blade-navigation/utils/bladeRouterGuard.d.ts +6 -14
- package/dist/core/blade-navigation/utils/bladeRouterGuard.d.ts.map +1 -1
- package/dist/core/blade-navigation/utils/navigateToMainRoute.d.ts +9 -2
- package/dist/core/blade-navigation/utils/navigateToMainRoute.d.ts.map +1 -1
- package/dist/core/blade-navigation/utils/restoreFromUrl.d.ts.map +1 -1
- package/dist/core/blade-navigation/utils/urlSync.d.ts +2 -3
- package/dist/core/blade-navigation/utils/urlSync.d.ts.map +1 -1
- package/dist/core/composables/useAssets/index.d.ts.map +1 -1
- package/dist/core/composables/useAssetsManager/index.d.ts.map +1 -1
- package/dist/core/composables/useAssetsManager/uploadAssets.d.ts +33 -0
- package/dist/core/composables/useAssetsManager/uploadAssets.d.ts.map +1 -0
- package/dist/core/composables/useAsync/index.d.ts +3 -4
- package/dist/core/composables/useAsync/index.d.ts.map +1 -1
- package/dist/core/composables/useBladeForm/index.d.ts +5 -9
- package/dist/core/composables/useBladeForm/index.d.ts.map +1 -1
- package/dist/core/composables/useBladeNavigationAdapter/index.d.ts.map +1 -1
- package/dist/core/composables/useDynamicProperties/resolveControlKind.d.ts +12 -0
- package/dist/core/composables/useDynamicProperties/resolveControlKind.d.ts.map +1 -0
- package/dist/core/composables/useKeyboardNavigation/index.d.ts.map +1 -1
- package/dist/core/composables/useLatestRequest/index.d.ts +25 -18
- package/dist/core/composables/useLatestRequest/index.d.ts.map +1 -1
- package/dist/core/composables/useModificationTracker/index.d.ts +11 -0
- package/dist/core/composables/useModificationTracker/index.d.ts.map +1 -1
- package/dist/core/composables/usePlatformLocaleSync/index.d.ts +5 -13
- package/dist/core/composables/usePlatformLocaleSync/index.d.ts.map +1 -1
- package/dist/core/composables/usePopup/index.d.ts +3 -4
- package/dist/core/composables/usePopup/index.d.ts.map +1 -1
- package/dist/core/composables/usePopup/types.d.ts +9 -12
- package/dist/core/composables/usePopup/types.d.ts.map +1 -1
- package/dist/core/composables/useSlowNetworkDetection/index.d.ts.map +1 -1
- package/dist/core/composables/useToolbar/index.d.ts +3 -4
- package/dist/core/composables/useToolbar/index.d.ts.map +1 -1
- package/dist/core/composables/useUser/index.d.ts.map +1 -1
- package/dist/core/interceptors/index.d.ts.map +1 -1
- package/dist/core/notifications/composables/useBladeNotifications.d.ts +3 -7
- package/dist/core/notifications/composables/useBladeNotifications.d.ts.map +1 -1
- package/dist/core/notifications/composables/useNotificationStore.d.ts +3 -6
- package/dist/core/notifications/composables/useNotificationStore.d.ts.map +1 -1
- package/dist/core/plugins/ai-agent/components/VcAiAgentPanel.vue.d.ts.map +1 -1
- package/dist/core/plugins/ai-agent/types.d.ts +8 -14
- package/dist/core/plugins/ai-agent/types.d.ts.map +1 -1
- package/dist/core/plugins/extension-points/store.d.ts +3 -5
- package/dist/core/plugins/extension-points/store.d.ts.map +1 -1
- package/dist/core/plugins/signalR/index.d.ts.map +1 -1
- package/dist/core/services/menu-service.d.ts +3 -5
- package/dist/core/services/menu-service.d.ts.map +1 -1
- package/dist/core/types/index.d.ts +3 -5
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/menu-types.d.ts +2 -3
- package/dist/core/types/menu-types.d.ts.map +1 -1
- package/dist/core/utilities/backendRegistry.d.ts +3 -5
- package/dist/core/utilities/backendRegistry.d.ts.map +1 -1
- package/dist/core/utilities/buildInfo.d.ts +4 -6
- package/dist/core/utilities/buildInfo.d.ts.map +1 -1
- package/dist/core/utilities/error.d.ts.map +1 -1
- package/dist/core/utilities/focus.d.ts +7 -21
- package/dist/core/utilities/focus.d.ts.map +1 -1
- package/dist/core/utilities/pendingErrorNotifications.d.ts +5 -8
- package/dist/core/utilities/pendingErrorNotifications.d.ts.map +1 -1
- package/dist/core/utilities/sessionExpiration.d.ts +15 -21
- package/dist/core/utilities/sessionExpiration.d.ts.map +1 -1
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +1 -1
- package/dist/framework.js +1221 -1253
- package/dist/framework.js.map +1 -1
- package/dist/index.css +1 -1
- package/dist/locales/de.js +6 -1
- package/dist/locales/en.js +6 -1
- package/dist/locales/en.json +6 -1
- package/dist/locales/types.d.ts +5 -0
- package/dist/shell/_internal/blade-navigation/components/vc-blade-navigation/focus-target.d.ts +6 -7
- package/dist/shell/_internal/blade-navigation/components/vc-blade-navigation/focus-target.d.ts.map +1 -1
- package/dist/shell/_internal/blade-navigation/components/vc-blade-navigation/vc-blade-navigation-new.vue.d.ts.map +1 -1
- package/dist/shell/_internal/blade-navigation/plugin-v2.d.ts +5 -10
- package/dist/shell/_internal/blade-navigation/plugin-v2.d.ts.map +1 -1
- package/dist/shell/_internal/notifications/components/notification-container/computeToastOffsets.d.ts +3 -4
- package/dist/shell/_internal/notifications/components/notification-container/computeToastOffsets.d.ts.map +1 -1
- package/dist/shell/_internal/notifications/components/notification-container/index.d.ts +2 -2
- package/dist/shell/_internal/popup/components/vc-popup-container/PopupInstanceProvider.vue.d.ts +3 -4
- package/dist/shell/_internal/popup/components/vc-popup-container/PopupInstanceProvider.vue.d.ts.map +1 -1
- package/dist/shell/_internal/popup/components/vc-popup-container/vc-popup-container.vue.d.ts.map +1 -1
- package/dist/shell/components/notification-template/notification-template.vue.d.ts.map +1 -1
- package/dist/shell/components/user-dropdown-button/_internal/user-info.vue.d.ts.map +1 -1
- package/dist/shell/dashboard/dashboard-widget-card/dashboard-stat-item.vue.d.ts.map +1 -1
- package/dist/shell/dashboard/draggable-dashboard/DraggableDashboard.vue.d.ts +5 -2
- package/dist/shell/dashboard/draggable-dashboard/DraggableDashboard.vue.d.ts.map +1 -1
- package/dist/shell/dashboard/draggable-dashboard/GridstackDashboard.vue.d.ts.map +1 -1
- package/dist/shell/dashboard/draggable-dashboard/composables/useGridstack.d.ts +2 -0
- package/dist/shell/dashboard/draggable-dashboard/composables/useGridstack.d.ts.map +1 -1
- package/dist/shell/dashboard/draggable-dashboard/types.d.ts +3 -6
- package/dist/shell/dashboard/draggable-dashboard/types.d.ts.map +1 -1
- package/dist/test-mock-factories.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/ui/components/atoms/vc-button/vc-button.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-card/vc-card.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-environment-banner/vc-environment-banner.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-hint/vc-hint.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-icon/vc-icon.vue.d.ts +6 -8
- package/dist/ui/components/atoms/vc-icon/vc-icon.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-video/vc-video.vue.d.ts +4 -6
- package/dist/ui/components/atoms/vc-video/vc-video.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-color-input/vc-color-input.vue.d.ts +2 -0
- package/dist/ui/components/molecules/vc-color-input/vc-color-input.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-date-picker/vc-date-picker.vue.d.ts +7 -0
- package/dist/ui/components/molecules/vc-date-picker/vc-date-picker.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-editor/vc-editor.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts +8 -2
- package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.vue.d.ts +4 -0
- package/dist/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-multivalue/composables/useMultivalueInput.d.ts +3 -6
- package/dist/ui/components/molecules/vc-multivalue/composables/useMultivalueInput.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-popover/vc-popover.vue.d.ts +7 -0
- package/dist/ui/components/molecules/vc-popover/vc-popover.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-rating/vc-rating.vue.d.ts +1 -0
- package/dist/ui/components/molecules/vc-rating/vc-rating.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-select/composables/useSelectDataSource.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-textarea/vc-textarea.vue.d.ts +2 -0
- package/dist/ui/components/molecules/vc-textarea/vc-textarea.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-app/_internal/app-bar/components/AppHubPopover.vue.d.ts +2 -0
- package/dist/ui/components/organisms/vc-app/_internal/app-bar/components/AppHubPopover.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-app/_internal/layouts/DesktopLayout.vue.d.ts +3 -5
- package/dist/ui/components/organisms/vc-app/_internal/layouts/DesktopLayout.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-app/_internal/menu/VcAppMenu.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-auth-layout/vc-auth-layout.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-blade/_internal/BladeHeader.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-blade/_internal/composables/useToolbarRegistration.d.ts +4 -5
- package/dist/ui/components/organisms/vc-blade/_internal/composables/useToolbarRegistration.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-blade/_internal/toolbar/ToolbarBaseButton.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-blade/utils.d.ts +2 -5
- package/dist/ui/components/organisms/vc-blade/utils.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-blade/vc-blade.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/VcDataTable.vue.d.ts +3 -3
- package/dist/ui/components/organisms/vc-data-table/VcDataTable.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/VcTableAdapter.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/components/ColumnFilter.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/components/DataTableBody.vue.d.ts +3 -4
- package/dist/ui/components/organisms/vc-data-table/components/DataTableBody.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/components/DataTableCellRenderer.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/components/DataTableHeader.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/components/DataTableRow.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/components/GlobalFiltersPanel.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/components/HeaderTitle.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/components/Table.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/components/TableHead.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/components/VcColumn.vue.d.ts +3 -3
- package/dist/ui/components/organisms/vc-data-table/components/VcColumn.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/components/_internal/SlotProxy.d.ts +3 -4
- package/dist/ui/components/organisms/vc-data-table/components/_internal/SlotProxy.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/components/cells/CellDateAgo.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/components/mobile/DataTableMobileCard.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/components/mobile/DataTableMobileView.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/components/mobile/PullToRefresh.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/composables/builtinCells.d.ts +2 -3
- package/dist/ui/components/organisms/vc-data-table/composables/builtinCells.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/composables/createTableSelectionFacade.d.ts +3 -5
- package/dist/ui/components/organisms/vc-data-table/composables/createTableSelectionFacade.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/composables/useDataTableOrchestrator.d.ts +4 -11
- package/dist/ui/components/organisms/vc-data-table/composables/useDataTableOrchestrator.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/composables/useMobileCardLayout.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/composables/useTableColumns.d.ts +2 -5
- package/dist/ui/components/organisms/vc-data-table/composables/useTableColumns.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/composables/useTableColumnsReorder.d.ts +4 -6
- package/dist/ui/components/organisms/vc-data-table/composables/useTableColumnsReorder.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/composables/useTableColumnsResize.d.ts +3 -6
- package/dist/ui/components/organisms/vc-data-table/composables/useTableColumnsResize.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/composables/useTableEditing.d.ts +2 -10
- package/dist/ui/components/organisms/vc-data-table/composables/useTableEditing.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/composables/useTableInlineEdit.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/composables/useTableRowReorder.d.ts +5 -11
- package/dist/ui/components/organisms/vc-data-table/composables/useTableRowReorder.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/composables/useTableSelectionV2.d.ts +3 -11
- package/dist/ui/components/organisms/vc-data-table/composables/useTableSelectionV2.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/composables/useTableSort.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/types.d.ts +13 -14
- package/dist/ui/components/organisms/vc-data-table/types.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/utils/ColumnCollector.d.ts +3 -6
- package/dist/ui/components/organisms/vc-data-table/utils/ColumnCollector.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-data-table/utils/columnHelpers.d.ts +3 -4
- package/dist/ui/components/organisms/vc-data-table/utils/columnHelpers.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue.d.ts +9 -0
- package/dist/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-popup/vc-popup.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-scheduler/VcScheduler.vue.d.ts +1 -1
- package/dist/ui/components/organisms/vc-scheduler/VcScheduler.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-scheduler/_internal/editor/SchedulerEventEditor.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-scheduler/_internal/month/MonthEventPopover.vue.d.ts +2 -2
- package/dist/ui/components/organisms/vc-scheduler/_internal/month/MonthEventPopover.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-scheduler/_internal/month/MonthMorePopover.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-scheduler/_internal/quick-create/QuickCreatePopover.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-scheduler/composables/useAnchoredPanelFocus.d.ts +20 -0
- package/dist/ui/components/organisms/vc-scheduler/composables/useAnchoredPanelFocus.d.ts.map +1 -0
- package/dist/ui/components/organisms/vc-scheduler/composables/useEventColor.d.ts +5 -7
- package/dist/ui/components/organisms/vc-scheduler/composables/useEventColor.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-scheduler/composables/useEventInteraction.d.ts +7 -12
- package/dist/ui/components/organisms/vc-scheduler/composables/useEventInteraction.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-scheduler/composables/useRecurrence.d.ts +6 -7
- package/dist/ui/components/organisms/vc-scheduler/composables/useRecurrence.d.ts.map +1 -1
- package/dist/ui/composables/useDataTablePagination.d.ts +4 -8
- package/dist/ui/composables/useDataTablePagination.d.ts.map +1 -1
- package/dist/ui/index.js +2 -2
- package/globals-augments.d.ts +3 -5
- package/globals.d.ts +5 -12
- package/package.json +4 -4
- package/shims-vue.d.ts +3 -5
- package/dist/chunks/VcScheduler.vue_vue_type_script_setup_true_lang-RHeDlcVB.js.map +0 -1
- package/dist/chunks/VcScheduler.vue_vue_type_style_index_0_lang-BQ09AUgy.js.map +0 -1
- package/dist/chunks/dashboard-feed-row.vue_vue_type_script_setup_true_lang-C0IjvNtI.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-feed-row.vue_vue_type_script_setup_true_lang-CYq_EvRc.js","sources":["../../shell/dashboard/draggable-dashboard/composables/useGridstackAdapter.ts","../../shell/dashboard/draggable-dashboard/composables/useGridstack.ts","../../shell/dashboard/draggable-dashboard/DashboardWidgetSkeleton.vue","../../shell/dashboard/draggable-dashboard/GridstackDashboard.vue","../../shell/dashboard/draggable-dashboard/DraggableDashboard.vue","../../shell/dashboard/draggable-dashboard/index.ts","../../shell/dashboard/dashboard-widget-card/dashboard-widget-card.vue","../../shell/dashboard/dashboard-widget-card/dashboard-stat-item.vue","../../shell/dashboard/dashboard-widget-card/dashboard-feed-list.vue","../../shell/dashboard/dashboard-widget-card/dashboard-feed-row.vue"],"sourcesContent":["/**\n * Gridstack Type Adapter\n *\n * Converts between our IDashboardWidget types and Gridstack's GridStackWidget types.\n * Handles localStorage format migration for backwards compatibility.\n */\n\nimport type { GridStackWidget, GridStackNode } from \"gridstack\";\nimport type {\n IDashboardWidget,\n DashboardWidgetPosition,\n DashboardWidgetPlacement,\n DashboardWidgetSize,\n} from \"@shell/dashboard/draggable-dashboard/types\";\n\n/**\n * LocalStorage key for layout persistence\n */\nexport const LAYOUT_STORAGE_KEY = \"vc-dashboard-layout\";\n\n/**\n * Old localStorage format (Map serialized as object)\n */\ninterface LegacyLayoutFormat {\n [widgetId: string]: DashboardWidgetPosition;\n}\n\n/**\n * Converts our widget type to Gridstack widget format\n */\nexport function toGridstackWidget(widget: IDashboardWidget, placement?: DashboardWidgetPlacement): GridStackWidget {\n const pos = placement ?? widget.position;\n return {\n id: widget.id,\n x: pos?.x ?? 0,\n y: pos?.y ?? 0,\n // A placement size wins over the declared one, so a saved or live resize is\n // restored instead of snapping back to the widget's default.\n w: placement?.width ?? widget.size.width,\n h: placement?.height ?? widget.size.height,\n minW: 2,\n minH: 2,\n };\n}\n\n/**\n * Extracts position from Gridstack node\n */\nexport function fromGridstackNode(node: GridStackNode): {\n id: string;\n position: DashboardWidgetPosition;\n size: DashboardWidgetSize;\n} {\n return {\n id: node.id ?? \"\",\n position: {\n x: node.x ?? 0,\n y: node.y ?? 0,\n },\n size: {\n width: node.w ?? 1,\n height: node.h ?? 1,\n },\n };\n}\n\n/**\n * Converts Gridstack nodes array to our layout Map format\n */\nexport function gridstackNodesToLayoutMap(nodes: GridStackNode[]): Map<string, DashboardWidgetPlacement> {\n const layout = new Map<string, DashboardWidgetPlacement>();\n\n for (const node of nodes) {\n if (node.id) {\n layout.set(node.id, {\n x: node.x ?? 0,\n y: node.y ?? 0,\n // Size is carried through as well; dropping it here is what used to make\n // every resize — mouse or keyboard — invisible to state and to storage.\n ...(typeof node.w === \"number\" ? { width: node.w } : {}),\n ...(typeof node.h === \"number\" ? { height: node.h } : {}),\n });\n }\n }\n\n return layout;\n}\n\n/**\n * Loads layout from localStorage with legacy format support\n */\nexport function loadLayoutFromStorage(): Map<string, DashboardWidgetPlacement> | null {\n try {\n const stored = localStorage.getItem(LAYOUT_STORAGE_KEY);\n if (!stored) return null;\n\n const parsed = JSON.parse(stored);\n\n // Check if it's the new Gridstack array format\n if (Array.isArray(parsed)) {\n return gridstackNodesToLayoutMap(parsed as GridStackNode[]);\n }\n\n // Legacy format: object with widget IDs as keys. It never carried a size, so\n // those entries stay size-less and fall back to the widget's declared size.\n if (typeof parsed === \"object\" && parsed !== null) {\n const layout = new Map<string, DashboardWidgetPlacement>();\n for (const [id, pos] of Object.entries(parsed as LegacyLayoutFormat)) {\n if (pos && typeof pos.x === \"number\" && typeof pos.y === \"number\") {\n layout.set(id, { x: pos.x, y: pos.y });\n }\n }\n return layout;\n }\n\n return null;\n } catch (error) {\n console.warn(\"[GridstackAdapter] Failed to load layout from storage:\", error);\n return null;\n }\n}\n\n/**\n * Saves layout to localStorage in Gridstack format\n */\nexport function saveLayoutToStorage(widgets: IDashboardWidget[], layout: Map<string, DashboardWidgetPlacement>): void {\n try {\n const gridstackFormat: GridStackWidget[] = widgets.map((widget) => {\n const placement = layout.get(widget.id);\n return {\n id: widget.id,\n x: placement?.x ?? widget.position?.x ?? 0,\n y: placement?.y ?? widget.position?.y ?? 0,\n // Prefer the live size. Reading `widget.size` unconditionally is what used\n // to discard every resize on reload, since that prop is never written back.\n w: placement?.width ?? widget.size.width,\n h: placement?.height ?? widget.size.height,\n };\n });\n\n localStorage.setItem(LAYOUT_STORAGE_KEY, JSON.stringify(gridstackFormat));\n } catch (error) {\n console.warn(\"[GridstackAdapter] Failed to save layout to storage:\", error);\n }\n}\n\n/**\n * Clears layout from localStorage\n */\nexport function clearLayoutStorage(): void {\n try {\n localStorage.removeItem(LAYOUT_STORAGE_KEY);\n } catch (error) {\n console.warn(\"[GridstackAdapter] Failed to clear layout storage:\", error);\n }\n}\n\n/**\n * Auto-arrange widgets in a grid layout\n * Places widgets side by side when possible, wrapping to next row\n */\nfunction autoArrangeWidgets(widgets: IDashboardWidget[], columns: number = 12): Map<string, DashboardWidgetPlacement> {\n const layout = new Map<string, DashboardWidgetPlacement>();\n\n // Track occupied cells in each row\n const rowOccupancy: Map<number, number[]> = new Map();\n\n const isPositionFree = (x: number, y: number, width: number, height: number): boolean => {\n for (let row = y; row < y + height; row++) {\n const occupied = rowOccupancy.get(row) || [];\n for (let col = x; col < x + width; col++) {\n if (occupied.includes(col)) return false;\n }\n }\n return true;\n };\n\n const occupyPosition = (x: number, y: number, width: number, height: number): void => {\n for (let row = y; row < y + height; row++) {\n const occupied = rowOccupancy.get(row) || [];\n for (let col = x; col < x + width; col++) {\n occupied.push(col);\n }\n rowOccupancy.set(row, occupied);\n }\n };\n\n const findFreePosition = (width: number, height: number): DashboardWidgetPosition => {\n let y = 0;\n while (true) {\n for (let x = 0; x <= columns - width; x++) {\n if (isPositionFree(x, y, width, height)) {\n return { x, y };\n }\n }\n y++;\n // Safety limit\n if (y > 100) break;\n }\n return { x: 0, y };\n };\n\n for (const widget of widgets) {\n const position = findFreePosition(widget.size.width, widget.size.height);\n layout.set(widget.id, position);\n occupyPosition(position.x, position.y, widget.size.width, widget.size.height);\n }\n\n return layout;\n}\n\n/**\n * Merges saved layout with widget defaults\n * Handles cases where widgets have been added/removed\n * Auto-arranges widgets that don't have positions\n */\nexport function mergeLayoutWithWidgets(\n widgets: IDashboardWidget[],\n savedLayout: Map<string, DashboardWidgetPlacement> | null,\n): Map<string, DashboardWidgetPlacement> {\n // If we have a saved layout with positions, use it\n if (savedLayout && savedLayout.size > 0) {\n const layout = new Map<string, DashboardWidgetPlacement>();\n\n for (const widget of widgets) {\n // Carries the saved size through as well — dropping it here would restore\n // the position but snap the widget back to its declared size.\n const savedPlacement = savedLayout.get(widget.id);\n const builtInPos = widget.position;\n const placement = savedPlacement ?? builtInPos ?? { x: 0, y: 0 };\n layout.set(widget.id, placement);\n }\n\n return layout;\n }\n\n // Check if all widgets have built-in positions\n const allHavePositions = widgets.every((w) => w.position !== undefined);\n\n if (allHavePositions) {\n const layout = new Map<string, DashboardWidgetPlacement>();\n for (const widget of widgets) {\n layout.set(widget.id, widget.position!);\n }\n return layout;\n }\n\n // Auto-arrange widgets\n return autoArrangeWidgets(widgets);\n}\n","/**\n * Gridstack Integration Composable\n *\n * Provides Vue 3 integration with Gridstack.js library.\n * Handles initialization, event binding, and cleanup.\n */\n\nimport { ref, shallowRef, onUnmounted, watch, nextTick, type Ref, type ShallowRef } from \"vue\";\nimport { GridStack, type GridStackOptions, type GridStackNode } from \"gridstack\";\nimport type {\n IDashboardWidget,\n DashboardWidgetPosition,\n DashboardWidgetPlacement,\n DashboardWidgetSize,\n} from \"@shell/dashboard/draggable-dashboard/types\";\nimport {\n toGridstackWidget,\n fromGridstackNode,\n loadLayoutFromStorage,\n saveLayoutToStorage,\n mergeLayoutWithWidgets,\n} from \"@shell/dashboard/draggable-dashboard/composables/useGridstackAdapter\";\n\n/**\n * Default Gridstack configuration\n */\nconst DEFAULT_OPTIONS: GridStackOptions = {\n column: 12,\n cellHeight: 80,\n margin: \"10px\",\n float: false,\n animate: true,\n // Disable responsive column changes - always use 12 columns\n columnOpts: {\n breakpoints: [{ w: 0, c: 12 }], // Always 12 columns regardless of width\n },\n draggable: {\n handle: \".grid-stack-item-content\",\n },\n resizable: {\n handles: \"se\", // Only bottom-right corner\n },\n};\n\n/**\n * Options for useGridstack composable\n */\nexport interface UseGridstackOptions {\n /** Gridstack configuration options */\n gridOptions?: Partial<GridStackOptions>;\n /** Enable widget resizing */\n resizable?: boolean;\n /** Auto-save layout to localStorage */\n autoSave?: boolean;\n /** Callback when layout changes */\n onLayoutChange?: (layout: Map<string, DashboardWidgetPlacement>) => void;\n}\n\n/**\n * Return type for useGridstack composable\n */\nexport interface UseGridstackReturn {\n /** Reference to GridStack instance */\n grid: ShallowRef<GridStack | null>;\n /** Current layout map: live position and, once known, live size */\n layout: Ref<Map<string, DashboardWidgetPlacement>>;\n /** Whether grid is initialized */\n isInitialized: Ref<boolean>;\n /** Initialize grid on element */\n initGrid: (element: HTMLElement) => void;\n /** Destroy grid instance */\n destroyGrid: () => void;\n /** Add a widget to the grid */\n addWidget: (widget: IDashboardWidget) => void;\n /** Remove a widget from the grid */\n removeWidget: (widgetId: string) => void;\n /** Update widget position */\n updateWidgetPosition: (widgetId: string, position: DashboardWidgetPosition) => void;\n updateWidgetSize: (widgetId: string, size: DashboardWidgetSize) => void;\n /** Save current layout */\n saveLayout: () => void;\n /** Load layout from storage */\n loadLayout: () => void;\n /** Reset to built-in positions */\n resetToDefaults: () => void;\n /** Put the grid back to a layout captured earlier */\n restoreLayout: (snapshot: Map<string, DashboardWidgetPlacement>) => void;\n /** Batch update mode (disable animations) */\n batchUpdate: (fn: () => void) => void;\n}\n\n/**\n * Vue 3 composable for Gridstack integration\n */\nexport function useGridstack(widgets: Ref<IDashboardWidget[]>, options: UseGridstackOptions = {}): UseGridstackReturn {\n const { gridOptions = {}, resizable = false, autoSave = true, onLayoutChange } = options;\n\n // State\n const grid = shallowRef<GridStack | null>(null);\n const layout = ref<Map<string, DashboardWidgetPlacement>>(new Map());\n const isInitialized = ref(false);\n const isUpdating = ref(false);\n\n /**\n * Merge options with defaults\n */\n const mergedOptions: GridStackOptions = {\n ...DEFAULT_OPTIONS,\n ...gridOptions,\n disableResize: !resizable,\n };\n\n /**\n * Initialize the grid on a DOM element\n */\n const initGrid = (element: HTMLElement): void => {\n if (grid.value) {\n console.warn(\"[useGridstack] Grid already initialized\");\n return;\n }\n\n // Load saved layout\n const savedLayout = loadLayoutFromStorage();\n layout.value = mergeLayoutWithWidgets(widgets.value, savedLayout);\n\n // Initialize Gridstack\n grid.value = GridStack.init(mergedOptions, element);\n\n // Bind event handlers\n grid.value.on(\"change\", handleChange);\n grid.value.on(\"added\", handleAdded);\n grid.value.on(\"removed\", handleRemoved);\n\n // Explicitly load widgets with their positions to ensure proper layout\n // This is needed because Vue renders DOM after Gridstack.init() processes children\n const widgetData = widgets.value.map((widget) => {\n const position = layout.value.get(widget.id);\n return toGridstackWidget(widget, position);\n });\n\n // Use load() to apply positions - this updates existing items\n grid.value.load(widgetData);\n\n isInitialized.value = true;\n };\n\n /**\n * Handle grid change events (drag/resize)\n */\n const handleChange = (_event: Event, nodes: GridStackNode[]): void => {\n if (isUpdating.value) return;\n\n for (const node of nodes) {\n const { id, position } = fromGridstackNode(node);\n if (id) {\n // Size is recorded too, so a mouse resize reaches state and storage. Read\n // straight off the node rather than via fromGridstackNode, which defaults\n // a missing w/h to 1 — persisting that invented 1 would shrink the widget.\n const previous = layout.value.get(id);\n const width = typeof node.w === \"number\" ? node.w : previous?.width;\n const height = typeof node.h === \"number\" ? node.h : previous?.height;\n layout.value.set(id, {\n ...position,\n ...(typeof width === \"number\" ? { width } : {}),\n ...(typeof height === \"number\" ? { height } : {}),\n });\n }\n }\n\n // Trigger reactivity\n layout.value = new Map(layout.value);\n\n // Notify callback\n onLayoutChange?.(layout.value);\n\n // Auto-save\n if (autoSave) {\n saveLayout();\n }\n };\n\n /**\n * Handle widget added event\n */\n const handleAdded = (_event: Event, nodes: GridStackNode[]): void => {\n for (const node of nodes) {\n const { id, position } = fromGridstackNode(node);\n if (id && !layout.value.has(id)) {\n layout.value.set(id, position);\n }\n }\n layout.value = new Map(layout.value);\n };\n\n /**\n * Handle widget removed event\n */\n const handleRemoved = (_event: Event, nodes: GridStackNode[]): void => {\n for (const node of nodes) {\n if (node.id) {\n layout.value.delete(node.id);\n }\n }\n layout.value = new Map(layout.value);\n };\n\n /**\n * Destroy the grid instance\n */\n const destroyGrid = (): void => {\n if (grid.value) {\n grid.value.off(\"change\");\n grid.value.off(\"added\");\n grid.value.off(\"removed\");\n grid.value.destroy(false); // false = don't remove DOM elements\n grid.value = null;\n isInitialized.value = false;\n }\n };\n\n /**\n * Add a widget to the grid\n */\n const addWidget = (widget: IDashboardWidget): void => {\n if (!grid.value) return;\n\n const position = layout.value.get(widget.id) ?? widget.position;\n const gsWidget = toGridstackWidget(widget, position);\n\n // Find the DOM element for this widget\n const element = document.querySelector(`[gs-id=\"${widget.id}\"]`);\n if (element) {\n grid.value.makeWidget(element as HTMLElement, gsWidget);\n }\n };\n\n /**\n * Remove a widget from the grid\n */\n const removeWidget = (widgetId: string): void => {\n if (!grid.value) return;\n\n const element = document.querySelector(`[gs-id=\"${widgetId}\"]`);\n if (element) {\n grid.value.removeWidget(element as HTMLElement, false);\n }\n layout.value.delete(widgetId);\n };\n\n /**\n * Records where a widget actually ended up after a programmatic update: the values come\n * off the Gridstack node, not the request, because Gridstack clamps to the grid edges and\n * compacts rows. Trusting the request left layout state, and the announcements derived\n * from it, disagreeing with the DOM. `requested` is the fallback where the node is not\n * exposed, notably unit tests with a stubbed grid.\n */\n const recordPlacementFromNode = (\n widgetId: string,\n element: Element,\n requestedPosition?: DashboardWidgetPosition,\n requestedSize?: DashboardWidgetSize,\n ): void => {\n const node = (element as HTMLElement & { gridstackNode?: GridStackNode }).gridstackNode;\n const previous = layout.value.get(widgetId);\n\n const x = node?.x ?? requestedPosition?.x ?? previous?.x ?? 0;\n const y = node?.y ?? requestedPosition?.y ?? previous?.y ?? 0;\n const width = node?.w ?? requestedSize?.width ?? previous?.width;\n const height = node?.h ?? requestedSize?.height ?? previous?.height;\n\n layout.value.set(widgetId, {\n x,\n y,\n ...(typeof width === \"number\" ? { width } : {}),\n ...(typeof height === \"number\" ? { height } : {}),\n });\n layout.value = new Map(layout.value);\n };\n\n /**\n * Update widget position programmatically\n */\n const updateWidgetPosition = (widgetId: string, position: DashboardWidgetPosition): void => {\n if (!grid.value) return;\n\n const element = document.querySelector(`[gs-id=\"${widgetId}\"]`);\n if (element) {\n isUpdating.value = true;\n grid.value.update(element as HTMLElement, { x: position.x, y: position.y });\n recordPlacementFromNode(widgetId, element, position);\n isUpdating.value = false;\n }\n };\n\n /**\n * Counterpart of updateWidgetPosition for the size axis, so a widget can be\n * resized programmatically — keyboard resizing has no drag handle to simulate.\n */\n const updateWidgetSize = (widgetId: string, size: DashboardWidgetSize): void => {\n if (!grid.value) return;\n\n const element = document.querySelector(`[gs-id=\"${widgetId}\"]`);\n if (element) {\n isUpdating.value = true;\n grid.value.update(element as HTMLElement, { w: size.width, h: size.height });\n recordPlacementFromNode(widgetId, element, undefined, size);\n isUpdating.value = false;\n }\n };\n\n /**\n * Save current layout to localStorage\n */\n const saveLayout = (): void => {\n saveLayoutToStorage(widgets.value, layout.value);\n };\n\n /**\n * Load layout from localStorage\n */\n const loadLayout = (): void => {\n const savedLayout = loadLayoutFromStorage();\n if (savedLayout) {\n layout.value = mergeLayoutWithWidgets(widgets.value, savedLayout);\n applyLayoutToGrid();\n }\n };\n\n /**\n * Reset to built-in widget positions\n */\n const resetToDefaults = (): void => {\n layout.value = new Map();\n for (const widget of widgets.value) {\n if (widget.position) {\n layout.value.set(widget.id, { ...widget.position });\n }\n }\n applyLayoutToGrid();\n saveLayout();\n };\n\n /**\n * Apply current layout to grid\n */\n const applyLayoutToGrid = (): void => {\n if (!grid.value) return;\n\n isUpdating.value = true;\n grid.value.batchUpdate();\n\n for (const widget of widgets.value) {\n const placement = layout.value.get(widget.id);\n if (placement) {\n const element = document.querySelector(`[gs-id=\"${widget.id}\"]`);\n if (element) {\n grid.value.update(element as HTMLElement, {\n x: placement.x,\n y: placement.y,\n // Restores a persisted size; omitted when unknown so Gridstack keeps\n // whatever the element already declares.\n ...(typeof placement.width === \"number\" ? { w: placement.width } : {}),\n ...(typeof placement.height === \"number\" ? { h: placement.height } : {}),\n });\n }\n }\n }\n\n grid.value.batchUpdate(false);\n isUpdating.value = false;\n };\n\n /**\n * Put the grid back to a layout captured earlier. Restoring one widget and trusting\n * compaction to undo itself does not work: gravity re-floats it into the hole a\n * displaced neighbour left behind, so the whole map goes back in one batch (VCST-5804).\n */\n const restoreLayout = (snapshot: Map<string, DashboardWidgetPlacement>): void => {\n layout.value = new Map([...snapshot].map(([id, placement]) => [id, { ...placement }]));\n applyLayoutToGrid();\n };\n\n /**\n * Execute function in batch update mode\n */\n const batchUpdate = (fn: () => void): void => {\n if (!grid.value) {\n fn();\n return;\n }\n\n isUpdating.value = true;\n grid.value.batchUpdate();\n fn();\n grid.value.batchUpdate(false);\n isUpdating.value = false;\n };\n\n // Watch for widget changes\n watch(\n widgets,\n async (newWidgets, oldWidgets) => {\n if (!grid.value || !isInitialized.value) return;\n\n await nextTick();\n\n // Find added widgets\n const addedWidgets = newWidgets.filter((w) => !oldWidgets?.some((ow) => ow.id === w.id));\n\n // Find removed widgets\n const removedWidgetIds =\n oldWidgets?.filter((w) => !newWidgets.some((nw) => nw.id === w.id)).map((w) => w.id) ?? [];\n\n // Remove old widgets\n for (const id of removedWidgetIds) {\n removeWidget(id);\n }\n\n // Add new widgets\n for (const widget of addedWidgets) {\n addWidget(widget);\n }\n },\n { deep: false },\n );\n\n // Cleanup on unmount\n onUnmounted(() => {\n destroyGrid();\n });\n\n return {\n grid,\n layout,\n isInitialized,\n initGrid,\n destroyGrid,\n addWidget,\n removeWidget,\n updateWidgetPosition,\n updateWidgetSize,\n saveLayout,\n loadLayout,\n resetToDefaults,\n restoreLayout,\n batchUpdate,\n };\n}\n","<template>\n <div\n class=\"dashboard-widget-skeleton\"\n aria-hidden=\"true\"\n >\n <div class=\"dashboard-widget-skeleton__header\">\n <div class=\"dashboard-widget-skeleton__icon\" />\n <div class=\"dashboard-widget-skeleton__title\" />\n </div>\n <div class=\"dashboard-widget-skeleton__stats\">\n <div class=\"dashboard-widget-skeleton__stat\" />\n <div class=\"dashboard-widget-skeleton__stat\" />\n <div class=\"dashboard-widget-skeleton__stat\" />\n </div>\n <div class=\"dashboard-widget-skeleton__body\">\n <div class=\"dashboard-widget-skeleton__line dashboard-widget-skeleton__line--w80\" />\n <div class=\"dashboard-widget-skeleton__line dashboard-widget-skeleton__line--w60\" />\n <div class=\"dashboard-widget-skeleton__line dashboard-widget-skeleton__line--w90\" />\n <div class=\"dashboard-widget-skeleton__line dashboard-widget-skeleton__line--w70\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\"></script>\n\n<style lang=\"scss\">\n:root {\n --dashboard-widget-skeleton-bg: var(--dashboard-widget-card-background, var(--additional-50));\n --dashboard-widget-skeleton-border-color: var(--dashboard-widget-card-border-color, var(--neutrals-200));\n --dashboard-widget-skeleton-radius: var(--dashboard-widget-card-border-radius, 8px);\n --dashboard-widget-skeleton-shadow: var(\n --dashboard-widget-card-shadow,\n 0 1px 3px rgba(0, 0, 0, 0.08) 0 1px 2px rgba(0, 0, 0, 0.06)\n );\n --dashboard-widget-skeleton-shimmer-from: var(--neutrals-100);\n --dashboard-widget-skeleton-shimmer-to: var(--neutrals-200);\n}\n\n@keyframes dashboard-widget-skeleton-shimmer {\n 0% {\n background-position: -400px 0;\n }\n 100% {\n background-position: 400px 0;\n }\n}\n\n.dashboard-widget-skeleton {\n @apply tw-overflow-hidden tw-h-full tw-flex tw-flex-col;\n background: var(--dashboard-widget-skeleton-bg);\n border: 1px solid var(--dashboard-widget-skeleton-border-color);\n border-radius: var(--dashboard-widget-skeleton-radius);\n box-shadow: var(--dashboard-widget-skeleton-shadow);\n\n %shimmer {\n background: linear-gradient(\n 90deg,\n var(--dashboard-widget-skeleton-shimmer-from) 0%,\n var(--dashboard-widget-skeleton-shimmer-to) 50%,\n var(--dashboard-widget-skeleton-shimmer-from) 100%\n );\n background-size: 800px 100%;\n animation: dashboard-widget-skeleton-shimmer 1.4s ease-in-out infinite;\n border-radius: 4px;\n }\n\n &__header {\n @apply tw-px-5 tw-py-4 tw-flex tw-items-center tw-gap-3;\n }\n\n &__icon {\n @apply tw-w-9 tw-h-9 tw-rounded-lg tw-flex-shrink-0;\n @extend %shimmer;\n }\n\n &__title {\n @apply tw-h-5 tw-flex-1 tw-max-w-[180px];\n @extend %shimmer;\n }\n\n &__stats {\n @apply tw-px-5 tw-py-3 tw-flex tw-items-center tw-gap-6;\n border-top: 1px solid var(--dashboard-widget-skeleton-border-color);\n border-bottom: 1px solid var(--dashboard-widget-skeleton-border-color);\n }\n\n &__stat {\n @apply tw-h-6 tw-flex-1;\n @extend %shimmer;\n }\n\n &__body {\n @apply tw-flex-1 tw-min-h-0 tw-px-5 tw-py-4 tw-flex tw-flex-col tw-gap-3;\n }\n\n &__line {\n @apply tw-h-3;\n @extend %shimmer;\n\n &--w60 {\n @apply tw-w-3/5;\n }\n &--w70 {\n @apply tw-w-7/12;\n }\n &--w80 {\n @apply tw-w-4/5;\n }\n &--w90 {\n @apply tw-w-11/12;\n }\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .dashboard-widget-skeleton {\n %shimmer {\n animation: none;\n }\n }\n}\n</style>\n","<template>\n <VcContainer\n no-padding\n class=\"vc-gridstack-dashboard\"\n >\n <div\n v-if=\"!modulesReady\"\n class=\"vc-gridstack-dashboard__skeleton-grid\"\n role=\"status\"\n aria-busy=\"true\"\n :aria-label=\"ariaLabel\"\n >\n <DashboardWidgetSkeleton\n v-for=\"(item, index) in skeletonItems\"\n :key=\"`skeleton-${index}`\"\n class=\"vc-gridstack-dashboard__skeleton-item\"\n :style=\"skeletonItemStyle(item)\"\n />\n </div>\n <div\n v-else\n ref=\"gridRef\"\n class=\"grid-stack vc-gridstack-dashboard__grid\"\n role=\"list\"\n :aria-label=\"ariaLabel\"\n >\n <div\n v-for=\"(widget, index) in widgets\"\n :key=\"widget.id\"\n class=\"grid-stack-item\"\n :class=\"{ 'vc-gridstack-dashboard__item--grabbed': grabbedWidgetId === widget.id }\"\n :gs-id=\"widget.id\"\n :gs-x=\"getPosition(widget.id)?.x ?? widget.position?.x ?? 0\"\n :gs-y=\"getPosition(widget.id)?.y ?? widget.position?.y ?? 0\"\n :gs-w=\"sizeOf(widget).width\"\n :gs-h=\"sizeOf(widget).height\"\n :gs-min-w=\"2\"\n :gs-min-h=\"2\"\n role=\"listitem\"\n tabindex=\"0\"\n :aria-label=\"getWidgetAriaLabel(widget, index)\"\n @keydown=\"onWidgetKeydown($event, widget)\"\n >\n <div class=\"grid-stack-item-content\">\n <!-- Drag handle (optional) -->\n <div\n v-if=\"showDragHandles\"\n class=\"vc-gridstack-dashboard__drag-handle\"\n aria-hidden=\"true\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n >\n <circle\n cx=\"5\"\n cy=\"3\"\n r=\"1.5\"\n />\n <circle\n cx=\"11\"\n cy=\"3\"\n r=\"1.5\"\n />\n <circle\n cx=\"5\"\n cy=\"8\"\n r=\"1.5\"\n />\n <circle\n cx=\"11\"\n cy=\"8\"\n r=\"1.5\"\n />\n <circle\n cx=\"5\"\n cy=\"13\"\n r=\"1.5\"\n />\n <circle\n cx=\"11\"\n cy=\"13\"\n r=\"1.5\"\n />\n </svg>\n </div>\n\n <!-- Widget content -->\n <component\n :is=\"widget.component\"\n v-bind=\"widget.props || {}\"\n class=\"vc-gridstack-dashboard__widget-content\"\n />\n </div>\n </div>\n </div>\n\n <!-- Screen reader announcements -->\n <div\n class=\"vc-gridstack-dashboard__live-region\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {{ liveAnnouncement }}\n </div>\n </VcContainer>\n</template>\n\n<script setup lang=\"ts\">\n/**\n * Dashboard powered by Gridstack.js: widgets are dragged and optionally resized into a\n * grid, and the layout is persisted in localStorage.\n */\nimport { ref, computed, onMounted, nextTick, inject, watch } from \"vue\";\nimport type {\n IDashboardWidget,\n DashboardWidgetPlacement,\n DashboardWidgetPosition,\n DashboardWidgetSize,\n} from \"@shell/dashboard/draggable-dashboard/types\";\nimport { useDashboard } from \"@core/composables/useDashboard\";\nimport { useGridstack } from \"@shell/dashboard/draggable-dashboard/composables/useGridstack\";\nimport VcContainer from \"@ui/components/atoms/vc-container/vc-container.vue\";\nimport DashboardWidgetSkeleton from \"@shell/dashboard/draggable-dashboard/DashboardWidgetSkeleton.vue\";\nimport { ModulesReadyKey } from \"@framework/injection-keys\";\nimport { LAYOUT_STORAGE_KEY } from \"@shell/dashboard/draggable-dashboard/composables/useGridstackAdapter\";\nimport \"gridstack/dist/gridstack.min.css\";\n\ninterface SkeletonItem {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n// Default placeholders shown when there's no persisted layout yet (first visit).\n// 6×6 matches the typical real widget size in vc-shell apps.\nconst DEFAULT_SKELETONS: SkeletonItem[] = [\n { x: 0, y: 0, w: 6, h: 6 },\n { x: 6, y: 0, w: 6, h: 6 },\n { x: 0, y: 6, w: 6, h: 6 },\n { x: 6, y: 6, w: 6, h: 6 },\n];\n\nfunction readPersistedSkeletons(): SkeletonItem[] | null {\n if (typeof window === \"undefined\") return null;\n try {\n const raw = window.localStorage.getItem(LAYOUT_STORAGE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return null;\n const items = parsed\n .filter(\n (n: unknown): n is SkeletonItem =>\n !!n &&\n typeof n === \"object\" &&\n typeof (n as SkeletonItem).w === \"number\" &&\n typeof (n as SkeletonItem).h === \"number\" &&\n typeof (n as SkeletonItem).x === \"number\" &&\n typeof (n as SkeletonItem).y === \"number\",\n )\n .map((n) => ({ x: n.x, y: n.y, w: n.w, h: n.h }));\n return items.length > 0 ? items : null;\n } catch {\n return null;\n }\n}\n\n// Props\ninterface Props {\n /** Show drag handle icons on widgets */\n showDragHandles?: boolean;\n /** Enable widget resizing */\n resizable?: boolean;\n /** Aria label for the dashboard container */\n ariaLabel?: string;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showDragHandles: false,\n resizable: false,\n ariaLabel: \"Dashboard widgets. Drag a widget, or focus one and press Enter to rearrange with the arrow keys.\",\n});\n\n// Refs\nconst gridRef = ref<HTMLElement | null>(null);\nconst liveAnnouncement = ref(\"\");\n\n// Gate rendering until remote modules finish installing: widgets preregistered during\n// loadRemote() would otherwise mount before their module's install runs mergeLocaleMessage\n// and lose translations. The `ref(true)` fallback covers tests, stories and non-MF hosts.\nconst modulesReady = inject(ModulesReadyKey, ref(true));\n\n// Skeleton placeholders shown until modules finish loading. Pulled from the last\n// persisted layout (so returning users see card sizes matching their real dashboard);\n// fallback to a generic 4-card grid on first visit.\nconst skeletonItems = computed<SkeletonItem[]>(() => {\n if (modulesReady.value) return [];\n return readPersistedSkeletons() ?? DEFAULT_SKELETONS;\n});\n\nconst skeletonItemStyle = (item: SkeletonItem): Record<string, string> => ({\n gridColumn: `${item.x + 1} / span ${item.w}`,\n gridRow: `${item.y + 1} / span ${item.h}`,\n});\n\n// Dashboard service\nconst dashboard = useDashboard();\nconst widgets = computed(() => dashboard.getWidgets() as IDashboardWidget[]);\n\n// Gridstack integration\nconst {\n layout,\n isInitialized,\n initGrid,\n saveLayout,\n resetToDefaults,\n restoreLayout,\n updateWidgetPosition,\n updateWidgetSize,\n} = useGridstack(widgets, {\n resizable: props.resizable,\n autoSave: true,\n gridOptions: {\n draggable: {\n handle: props.showDragHandles ? \".vc-gridstack-dashboard__drag-handle\" : \".grid-stack-item-content\",\n },\n },\n onLayoutChange: (newLayout) => {\n // Sync with dashboard service\n for (const [widgetId, position] of newLayout) {\n dashboard.updateWidgetPosition(widgetId, position);\n }\n announceToScreenReader(\"Widget positions updated\");\n },\n});\n\n// Helper to get widget position\nconst getPosition = (widgetId: string): DashboardWidgetPosition | undefined => {\n return layout.value.get(widgetId);\n};\n\n// Keyboard reordering (WCAG 2.5.7: dragging needs a non-drag alternative).\n// Gridstack only supports pointer dragging, so the widget is the control: Enter/Space\n// picks up, arrows move a cell, Shift+arrows resize, Enter drops, Escape restores.\nconst grabbedWidgetId = ref<string | null>(null);\n/**\n * The whole layout as it stood at pick-up, not just the grabbed widget: restoring one\n * widget lets gravity float it straight back into the hole left by a displaced\n * neighbour, so Escape announced a cancel the screen never showed (VCST-5804).\n */\nconst grabbedLayout = ref<Map<string, DashboardWidgetPlacement> | null>(null);\n\n// Mirrors gs-min-w / gs-min-h on the item.\nconst MIN_WIDGET_SPAN = 2;\n\nconst positionOf = (widget: IDashboardWidget): DashboardWidgetPosition =>\n layout.value.get(widget.id) ?? widget.position ?? { x: 0, y: 0 };\n\n// The live size, mirroring positionOf. `widget.size` is only the declared default\n// and is never written back to, so reading it directly made every resize compute\n// from the same baseline instead of from the current size.\nconst sizeOf = (widget: IDashboardWidget): DashboardWidgetSize => {\n const placement = layout.value.get(widget.id);\n return {\n width: placement?.width ?? widget.size.width,\n height: placement?.height ?? widget.size.height,\n };\n};\n\nconst widgetName = (widget: IDashboardWidget): string => widget.name || widget.id;\n\nconst pickUpWidget = (widget: IDashboardWidget): void => {\n grabbedWidgetId.value = widget.id;\n // Built from positionOf/sizeOf rather than copied off `layout`: a widget that\n // has not been resized yet carries no size in the map, and a snapshot missing\n // it would restore the position while leaving the new size in place.\n grabbedLayout.value = new Map(\n widgets.value.map((candidate) => [candidate.id, { ...positionOf(candidate), ...sizeOf(candidate) }]),\n );\n announceToScreenReader(\n `${widgetName(widget)} picked up. Use arrow keys to move, Shift and arrow keys to resize, Enter to drop, Escape to cancel.`,\n );\n};\n\nconst dropWidget = (widget: IDashboardWidget): void => {\n grabbedWidgetId.value = null;\n grabbedLayout.value = null;\n saveLayout();\n const { x, y } = positionOf(widget);\n announceToScreenReader(`${widgetName(widget)} dropped at column ${x + 1}, row ${y + 1}.`);\n};\n\nconst cancelWidgetMove = (widget: IDashboardWidget): void => {\n if (grabbedLayout.value) {\n restoreLayout(grabbedLayout.value);\n }\n\n grabbedWidgetId.value = null;\n grabbedLayout.value = null;\n announceToScreenReader(`Move cancelled. ${widgetName(widget)} returned to its original position and size.`);\n};\n\nconst moveWidgetBy = (widget: IDashboardWidget, dx: number, dy: number): void => {\n const current = positionOf(widget);\n const next = { x: current.x + dx, y: current.y + dy };\n // Gridstack clamps silently; refusing the move keeps the announcement honest.\n if (next.x < 0 || next.y < 0) return;\n\n updateWidgetPosition(widget.id, next);\n // Announce where the widget actually landed, not where it was asked to go —\n // Gridstack compacts rows, so the two differ.\n // Announce where the widget actually landed, not where it was asked to go —\n // Gridstack compacts rows, so the two differ.\n const landed = positionOf(widget);\n announceToScreenReader(`${widgetName(widget)} moved to column ${landed.x + 1}, row ${landed.y + 1}.`);\n};\n\nconst resizeWidgetBy = (widget: IDashboardWidget, dw: number, dh: number): void => {\n const current = sizeOf(widget);\n // Only the requested axis changes; sending both would drag the untouched one\n // back to its baseline.\n const width = dw ? Math.max(MIN_WIDGET_SPAN, current.width + dw) : current.width;\n const height = dh ? Math.max(MIN_WIDGET_SPAN, current.height + dh) : current.height;\n if (width === current.width && height === current.height) return;\n\n updateWidgetSize(widget.id, { width, height });\n const applied = sizeOf(widget);\n announceToScreenReader(`${widgetName(widget)} resized to ${applied.width} by ${applied.height} cells.`);\n};\n\nconst onWidgetKeydown = (event: KeyboardEvent, widget: IDashboardWidget): void => {\n if (event.target !== event.currentTarget) return;\n\n const isGrabbed = grabbedWidgetId.value === widget.id;\n\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n if (isGrabbed) dropWidget(widget);\n else {\n // Starting another move cancels the unfinished one so its origin is not lost.\n const grabbedWidget = widgets.value.find((candidate) => candidate.id === grabbedWidgetId.value);\n if (grabbedWidget) cancelWidgetMove(grabbedWidget);\n pickUpWidget(widget);\n }\n return;\n }\n\n if (event.key === \"Escape\" && isGrabbed) {\n event.preventDefault();\n cancelWidgetMove(widget);\n return;\n }\n\n const dx = event.key === \"ArrowLeft\" ? -1 : event.key === \"ArrowRight\" ? 1 : 0;\n const dy = event.key === \"ArrowUp\" ? -1 : event.key === \"ArrowDown\" ? 1 : 0;\n if ((dx === 0 && dy === 0) || !isGrabbed) return;\n\n event.preventDefault();\n if (event.shiftKey) {\n if (props.resizable) resizeWidgetBy(widget, dx, dy);\n } else {\n moveWidgetBy(widget, dx, dy);\n }\n};\n\n// Accessibility helpers\nconst getWidgetAriaLabel = (widget: IDashboardWidget, index: number): string => {\n const name = widget.name || widget.id;\n const state =\n grabbedWidgetId.value === widget.id\n ? \"Picked up. Arrow keys move, Enter drops, Escape cancels.\"\n : \"Press Enter to pick up and rearrange with the arrow keys.\";\n return `${name}, widget ${index + 1} of ${widgets.value.length}. ${state}`;\n};\n\nconst announceToScreenReader = (message: string): void => {\n liveAnnouncement.value = message;\n setTimeout(() => {\n liveAnnouncement.value = \"\";\n }, 1000);\n};\n\nconst tryInitGrid = async (): Promise<void> => {\n await nextTick();\n if (gridRef.value && !isInitialized.value) {\n initGrid(gridRef.value);\n }\n};\n\nonMounted(tryInitGrid);\n\n// When modules finish loading, the v-if mounts gridRef — initialize gridstack then.\nwatch(modulesReady, (ready) => {\n if (ready) tryInitGrid();\n});\n\n// Public methods\nconst rearrangeWidgets = (): void => {\n resetToDefaults();\n};\n\nconst recalculateLayout = (): void => {\n // Gridstack handles this automatically\n};\n\nconst useBuiltInPositions = (): boolean => {\n resetToDefaults();\n return true;\n};\n\n// Expose public methods\ndefineExpose({\n rearrangeWidgets,\n recalculateLayout,\n saveLayout,\n useBuiltInPositions,\n});\n</script>\n\n<style lang=\"scss\">\n@import \"gridstack/dist/gridstack.min.css\";\n\n:root {\n --gridstack-dashboard-background: var(--additional-50);\n --gridstack-widget-background: var(--additional-50);\n --gridstack-widget-border-radius: 8px;\n --gridstack-widget-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n --gridstack-widget-shadow-dragging: 0 8px 24px rgba(0, 0, 0, 0.15);\n --gridstack-placeholder-background: rgba(59, 130, 246, 0.1);\n --gridstack-placeholder-border: rgba(59, 130, 246, 0.5);\n --gridstack-drag-handle-color: var(--neutrals-400);\n --gridstack-drag-handle-color-hover: var(--neutrals-600);\n --gridstack-widget-focus-ring-color: var(--primary-500);\n}\n\n.vc-gridstack-dashboard {\n background-color: var(--gridstack-dashboard-background);\n min-height: 100%;\n\n &__grid {\n padding: 24px 18px;\n min-height: calc(80px * 8 + 24px * 2); // 8 rows minimum\n }\n\n // Widgets are focusable so they can be rearranged from the keyboard.\n .grid-stack-item:focus-visible {\n @apply tw-outline-none tw-ring-[3px] tw-ring-[color:var(--gridstack-widget-focus-ring-color)];\n border-radius: var(--gridstack-widget-border-radius);\n }\n\n // Picked up for a keyboard move: the pointer equivalent of \"being dragged\".\n &__item--grabbed {\n z-index: var(--z-local-above);\n\n .grid-stack-item-content {\n box-shadow: var(--gridstack-widget-shadow-dragging);\n outline: 2px dashed var(--gridstack-placeholder-border);\n outline-offset: 2px;\n }\n }\n\n // Skeleton grid mirrors gridstack's 12-column geometry. Row height and gap are\n // tuned so a 6×6 placeholder visually matches a real 6×6 widget rendered by\n // gridstack (which collapses margins differently than a plain CSS grid).\n &__skeleton-grid {\n display: grid;\n grid-template-columns: repeat(12, 1fr);\n grid-auto-rows: 55px;\n gap: 20px;\n padding: 24px 18px;\n min-height: calc(55px * 8 + 24px * 2);\n }\n\n &__skeleton-item {\n min-width: 0;\n min-height: 0;\n }\n\n // Widget item styling\n .grid-stack-item {\n &-content {\n background: var(--gridstack-widget-background);\n border-radius: var(--gridstack-widget-border-radius);\n box-shadow: var(--gridstack-widget-shadow);\n overflow: hidden;\n // Note: Don't set height: 100% - Gridstack uses position: absolute with inset for margins\n transition: box-shadow 0.2s ease;\n }\n\n // Dragging state\n &.ui-draggable-dragging {\n .grid-stack-item-content {\n box-shadow: var(--gridstack-widget-shadow-dragging);\n }\n }\n\n // Resizing state\n &.ui-resizable-resizing {\n .grid-stack-item-content {\n box-shadow: var(--gridstack-widget-shadow-dragging);\n }\n }\n }\n\n // Placeholder styling\n .grid-stack-placeholder {\n > .placeholder-content {\n background: var(--gridstack-placeholder-background);\n border: 2px dashed var(--gridstack-placeholder-border);\n border-radius: var(--gridstack-widget-border-radius);\n }\n }\n\n // Drag handle\n &__drag-handle {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: var(--z-local-sticky);\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--gridstack-drag-handle-color);\n cursor: grab;\n border-radius: 4px;\n transition:\n color 0.15s ease,\n background-color 0.15s ease;\n\n &:hover {\n color: var(--gridstack-drag-handle-color-hover);\n background-color: rgba(0, 0, 0, 0.05);\n }\n\n &:active {\n cursor: grabbing;\n }\n }\n\n // Widget content\n &__widget-content {\n width: 100%;\n height: 100%;\n }\n\n // Screen reader only\n &__live-region {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n}\n\n// Respect reduced motion preference\n@media (prefers-reduced-motion: reduce) {\n .vc-gridstack-dashboard {\n .grid-stack-item {\n transition: none !important;\n\n &-content {\n transition: none !important;\n }\n }\n }\n\n .grid-stack {\n &.grid-stack-animate {\n .grid-stack-item {\n transition: none !important;\n }\n }\n }\n}\n</style>\n","<template>\n <GridstackDashboard\n ref=\"dashboardRef\"\n :show-drag-handles=\"showDragHandles\"\n :resizable=\"resizable\"\n :aria-label=\"ariaLabel\"\n />\n</template>\n\n<script setup lang=\"ts\">\n/**\n * Dashboard powered by Gridstack.js: widgets are dragged into a grid, the layout persists\n * to localStorage, built-in widget positions are honoured, and resizing is optional.\n */\nimport { ref } from \"vue\";\nimport GridstackDashboard from \"@shell/dashboard/draggable-dashboard/GridstackDashboard.vue\";\n\n// Props\ninterface Props {\n /** Show drag handle icons on widgets */\n showDragHandles?: boolean;\n /** Enable widget resizing */\n resizable?: boolean;\n /**\n * Aria label for the dashboard container. Left without a default here on\n * purpose: this is a pass-through, and GridstackDashboard owns the wording.\n * A copy in both places is how they came to disagree (VCST-5805).\n */\n ariaLabel?: string;\n}\n\nwithDefaults(defineProps<Props>(), {\n showDragHandles: false,\n resizable: false,\n});\n\n// State\nconst dashboardRef = ref<InstanceType<typeof GridstackDashboard> | null>(null);\n\n// Public methods (delegated to GridstackDashboard)\nconst rearrangeWidgets = (): void => {\n dashboardRef.value?.rearrangeWidgets?.();\n};\n\nconst recalculateLayout = (): void => {\n dashboardRef.value?.recalculateLayout?.();\n};\n\nconst saveLayout = (): void => {\n dashboardRef.value?.saveLayout?.();\n};\n\nconst useBuiltInPositions = (): boolean => {\n return dashboardRef.value?.useBuiltInPositions?.() ?? false;\n};\n\n// Expose public methods\ndefineExpose({\n rearrangeWidgets,\n recalculateLayout,\n saveLayout,\n useBuiltInPositions,\n});\n</script>\n","// Main component\nexport { default as DraggableDashboard } from \"@shell/dashboard/draggable-dashboard/DraggableDashboard.vue\";\n\n// Types\nexport type {\n IDashboardWidget,\n DashboardWidgetPosition,\n DashboardWidgetSize,\n DashboardDragEvent,\n DashboardGridConfig,\n} from \"@shell/dashboard/draggable-dashboard/types\";\n\n// Gridstack composables (for advanced usage)\nexport { useGridstack } from \"@shell/dashboard/draggable-dashboard/composables/useGridstack\";\nexport type {\n UseGridstackOptions,\n UseGridstackReturn,\n} from \"@shell/dashboard/draggable-dashboard/composables/useGridstack\";\n\n// Import and re-export to avoid Storybook docgen issues with direct re-exports\nimport {\n toGridstackWidget as _toGridstackWidget,\n fromGridstackNode as _fromGridstackNode,\n loadLayoutFromStorage as _loadLayoutFromStorage,\n saveLayoutToStorage as _saveLayoutToStorage,\n mergeLayoutWithWidgets as _mergeLayoutWithWidgets,\n clearLayoutStorage as _clearLayoutStorage,\n LAYOUT_STORAGE_KEY as _LAYOUT_STORAGE_KEY,\n} from \"@shell/dashboard/draggable-dashboard/composables/useGridstackAdapter\";\n\nexport const toGridstackWidget = _toGridstackWidget;\nexport const fromGridstackNode = _fromGridstackNode;\nexport const loadLayoutFromStorage = _loadLayoutFromStorage;\nexport const saveLayoutToStorage = _saveLayoutToStorage;\nexport const mergeLayoutWithWidgets = _mergeLayoutWithWidgets;\nexport const clearLayoutStorage = _clearLayoutStorage;\nexport const LAYOUT_STORAGE_KEY = _LAYOUT_STORAGE_KEY;\n","<template>\n <div class=\"dashboard-widget-card\">\n <div class=\"dashboard-widget-card__header\">\n <slot name=\"header\">\n <div class=\"dashboard-widget-card__header-content\">\n <div\n v-if=\"icon\"\n class=\"dashboard-widget-card__icon-wrapper\"\n >\n <VcIcon\n class=\"dashboard-widget-card__icon\"\n :icon=\"icon\"\n size=\"l\"\n />\n </div>\n <div class=\"dashboard-widget-card__title\">{{ props.header }}</div>\n </div>\n </slot>\n <div\n v-if=\"$slots.actions\"\n class=\"dashboard-widget-card__actions\"\n >\n <slot name=\"actions\"></slot>\n </div>\n </div>\n\n <div\n v-if=\"$slots.stats\"\n class=\"dashboard-widget-card__stats\"\n >\n <slot name=\"stats\"></slot>\n </div>\n\n <div\n v-loading=\"loading\"\n class=\"dashboard-widget-card__body\"\n >\n <slot name=\"content\"></slot>\n </div>\n\n <div\n v-if=\"$slots.footer\"\n class=\"dashboard-widget-card__footer\"\n >\n <slot name=\"footer\"></slot>\n </div>\n </div>\n</template>\n\n<!-- eslint-disable @typescript-eslint/no-explicit-any -->\n<script setup lang=\"ts\">\nexport interface Props {\n header?: string;\n icon?: string;\n loading?: boolean;\n}\n\nimport { VcIcon } from \"@ui/components\";\nimport { vLoading } from \"@core/directives\";\n\nconst props = defineProps<Props>();\n\ndefineSlots<{\n header?: (props: any) => any;\n actions?: (props: any) => any;\n stats?: (props: any) => any;\n content?: (props: any) => any;\n footer?: (props: any) => any;\n}>();\n</script>\n\n<style lang=\"scss\">\n:root {\n // Legacy variables (preserved for backward compat)\n --dashboard-widget-card-header-color: var(--additional-50);\n --dashboard-widget-card-header-text-color: var(--neutrals-950);\n --dashboard-widget-card-icon-color: var(--primary-600);\n --dashboard-widget-card-header-border-color: var(--neutrals-200);\n\n // New variables\n --dashboard-widget-card-background: var(--additional-50);\n --dashboard-widget-card-border-color: var(--neutrals-200);\n --dashboard-widget-card-border-radius: 8px;\n --dashboard-widget-card-shadow: 0 1px 3px rgba(0, 0, 0, 0.08), 0 1px 2px rgba(0, 0, 0, 0.06);\n --dashboard-widget-card-shadow-hover: 0 4px 12px rgba(0, 0, 0, 0.1);\n --dashboard-widget-card-icon-bg: var(--primary-50);\n --dashboard-widget-card-stats-bg: var(--neutrals-50);\n --dashboard-widget-card-footer-color: var(--primary-700);\n}\n\n.dashboard-widget-card {\n @apply tw-overflow-hidden tw-h-full tw-flex tw-flex-col;\n background: var(--dashboard-widget-card-background);\n border: 1px solid var(--dashboard-widget-card-border-color);\n border-radius: var(--dashboard-widget-card-border-radius);\n box-shadow: var(--dashboard-widget-card-shadow);\n transition: box-shadow 0.2s ease;\n\n &:hover {\n box-shadow: var(--dashboard-widget-card-shadow-hover);\n }\n\n &__header {\n @apply tw-px-5 tw-py-4 tw-flex tw-justify-between tw-items-center tw-gap-3;\n }\n\n &__header-content {\n @apply tw-flex tw-items-center tw-gap-3 tw-min-w-0;\n }\n\n &__icon-wrapper {\n @apply tw-flex tw-items-center tw-justify-center tw-w-9 tw-h-9 tw-rounded-lg tw-flex-shrink-0;\n background: var(--dashboard-widget-card-icon-bg);\n }\n\n &__icon {\n @apply tw-text-[var(--dashboard-widget-card-icon-color)];\n }\n\n &__title {\n @apply tw-text-lg tw-font-semibold tw-truncate;\n color: var(--dashboard-widget-card-header-text-color);\n }\n\n &__actions {\n @apply tw-flex tw-items-center tw-gap-2 tw-flex-shrink-0;\n }\n\n &__stats {\n @apply tw-px-5 tw-py-3 tw-flex tw-items-center tw-gap-6;\n background: var(--dashboard-widget-card-stats-bg);\n border-top: 1px solid var(--dashboard-widget-card-border-color);\n border-bottom: 1px solid var(--dashboard-widget-card-border-color);\n }\n\n &__body {\n @apply tw-flex-1 tw-min-h-0;\n }\n\n &__footer {\n @apply tw-px-5 tw-py-3 tw-text-center;\n border-top: 1px solid var(--dashboard-widget-card-border-color);\n\n a,\n button {\n @apply tw-text-sm tw-font-medium tw-no-underline;\n color: var(--dashboard-widget-card-footer-color);\n transition: opacity 0.15s ease;\n\n &:hover {\n @apply tw-underline;\n opacity: 0.85;\n }\n }\n }\n}\n\n// Shared activity-feed row style for dashboard card content\n.dashboard-feed-row {\n @apply tw-flex tw-items-center tw-justify-between tw-px-5 tw-py-2.5 tw-cursor-pointer tw-transition-colors;\n\n &:hover {\n background: var(--dashboard-widget-card-icon-bg, var(--primary-50));\n }\n}\n</style>\n","<template>\n <div class=\"dashboard-stat-item\">\n <div\n class=\"dashboard-stat-item__value\"\n :class=\"variant ? `dashboard-stat-item__value--${variant}` : ''\"\n >\n {{ value }}\n </div>\n <div class=\"dashboard-stat-item__label\">{{ label }}</div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nexport interface DashboardStatItemProps {\n /** The metric value to display */\n value: string | number;\n /** Descriptive label below the value */\n label: string;\n /** Color variant for the value */\n variant?: \"default\" | \"success\" | \"warning\" | \"danger\";\n}\n\ndefineProps<DashboardStatItemProps>();\n</script>\n\n<style lang=\"scss\">\n:root {\n --dashboard-stat-item-value-color: var(--neutrals-950);\n --dashboard-stat-item-label-color: var(--neutrals-500);\n}\n\n.dashboard-stat-item {\n @apply tw-flex tw-flex-col tw-items-center tw-min-w-0;\n\n &__value {\n @apply tw-text-lg tw-font-semibold tw-leading-tight tw-text-[var(--dashboard-stat-item-value-color)] tw-truncate tw-max-w-full;\n\n // Lightest shade per colour that clears AA on the widget card in both themes,\n // measured: -600 fails in light for all three (4.13 / 2.01 / 3.80) and danger fails in\n // dark too (4.33). Amber needs a deeper step, which is a property of amber.\n &--success {\n // light 6.88, dark 9.45\n @apply tw-text-[var(--success-700)];\n }\n\n &--warning {\n // light 6.22, dark 10.60 — -700 is still 3.98 in light\n @apply tw-text-[var(--warning-800)];\n }\n\n &--danger {\n // light 6.01, dark 5.76\n @apply tw-text-[var(--danger-700)];\n }\n }\n\n &__label {\n @apply tw-text-xs tw-text-[var(--dashboard-stat-item-label-color)] tw-mt-0.5 tw-truncate tw-max-w-full;\n }\n}\n</style>\n","<!-- eslint-disable @typescript-eslint/no-explicit-any -->\n<template>\n <div class=\"tw-divide-y tw-divide-[var(--neutrals-200)]\">\n <slot />\n </div>\n</template>\n\n<script setup lang=\"ts\">\ndefineSlots<{\n default: (props: any) => any;\n}>();\n</script>\n","<!-- eslint-disable @typescript-eslint/no-explicit-any -->\n<template>\n <div\n class=\"dashboard-feed-row\"\n @click=\"$emit('click')\"\n >\n <div class=\"tw-flex tw-items-center tw-gap-2.5 tw-min-w-0\">\n <slot />\n </div>\n <div\n v-if=\"$slots.trailing\"\n class=\"tw-flex tw-items-center tw-gap-3 tw-flex-shrink-0 tw-ml-3\"\n >\n <slot name=\"trailing\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\ndefineEmits<{\n click: [];\n}>();\n\ndefineSlots<{\n default: (props: any) => any;\n trailing: (props: any) => any;\n}>();\n</script>\n"],"names":["LAYOUT_STORAGE_KEY","toGridstackWidget","widget","placement","pos","fromGridstackNode","node","gridstackNodesToLayoutMap","nodes","layout","loadLayoutFromStorage","stored","parsed","id","error","saveLayoutToStorage","widgets","gridstackFormat","clearLayoutStorage","autoArrangeWidgets","columns","rowOccupancy","isPositionFree","x","width","height","row","occupied","col","occupyPosition","findFreePosition","y","position","mergeLayoutWithWidgets","savedLayout","savedPlacement","builtInPos","w","DEFAULT_OPTIONS","useGridstack","options","gridOptions","resizable","autoSave","onLayoutChange","grid","shallowRef","ref","isInitialized","isUpdating","mergedOptions","initGrid","element","GridStack","handleChange","handleAdded","handleRemoved","widgetData","_event","previous","saveLayout","destroyGrid","addWidget","gsWidget","removeWidget","widgetId","recordPlacementFromNode","requestedPosition","requestedSize","updateWidgetPosition","updateWidgetSize","size","loadLayout","applyLayoutToGrid","resetToDefaults","restoreLayout","snapshot","batchUpdate","fn","watch","newWidgets","oldWidgets","nextTick","addedWidgets","ow","removedWidgetIds","nw","onUnmounted","_openBlock","_createElementBlock","_hoisted_1","_cache","MIN_WIDGET_SPAN","DEFAULT_SKELETONS","readPersistedSkeletons","raw","items","n","props","__props","gridRef","liveAnnouncement","modulesReady","inject","ModulesReadyKey","skeletonItems","computed","skeletonItemStyle","item","dashboard","useDashboard","newLayout","announceToScreenReader","getPosition","grabbedWidgetId","grabbedLayout","positionOf","sizeOf","widgetName","pickUpWidget","candidate","dropWidget","cancelWidgetMove","moveWidgetBy","dx","dy","current","next","landed","resizeWidgetBy","dw","dh","applied","onWidgetKeydown","event","isGrabbed","grabbedWidget","getWidgetAriaLabel","index","name","state","message","tryInitGrid","onMounted","ready","__expose","_createBlock","VcContainer","_unref","_Fragment","_renderList","$event","_createElementVNode","_hoisted_4","_hoisted_5","_resolveDynamicComponent","_mergeProps","DashboardWidgetSkeleton","_normalizeStyle","_hoisted_6","_toDisplayString","dashboardRef","GridstackDashboard","_toGridstackWidget","_fromGridstackNode","_loadLayoutFromStorage","_saveLayoutToStorage","_mergeLayoutWithWidgets","_clearLayoutStorage","_LAYOUT_STORAGE_KEY","_hoisted_2","_renderSlot","_ctx","_hoisted_3","_createVNode","VcIcon","$slots","_hoisted_7","_withDirectives","_hoisted_8","_hoisted_9","_normalizeClass","$emit"],"mappings":"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"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import type { IBladeStack, IBladeMessaging, BladeNavigationPlugin } from "../blade-navigation/types";
|
|
2
2
|
import type { IBladeRegistry } from "../composables/useBladeRegistry";
|
|
3
3
|
/**
|
|
4
|
-
* Module-level singletons
|
|
5
|
-
*
|
|
6
|
-
* Core composables (useBlade, useBladeNavigationAdapter) read via exported variables.
|
|
4
|
+
* Module-level singletons, readable without inject(). Shell's blade-navigation plugin
|
|
5
|
+
* calls the setters during install(); core composables read the exported variables.
|
|
7
6
|
*
|
|
8
|
-
*
|
|
9
|
-
* Call _resetBladeNavigationSingletons() in test teardown.
|
|
7
|
+
* Only one Vue app per JS context. Call _resetBladeNavigationSingletons() in test teardown.
|
|
10
8
|
*/
|
|
11
9
|
export declare let bladeNavigationInstance: BladeNavigationPlugin | undefined;
|
|
12
10
|
export declare let bladeStackInstance: IBladeStack | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"singletons.d.ts","sourceRoot":"","sources":["../../../core/blade-navigation/singletons.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACxG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE
|
|
1
|
+
{"version":3,"file":"singletons.d.ts","sourceRoot":"","sources":["../../../core/blade-navigation/singletons.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACxG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE;;;;;GAKG;AAEH,eAAO,IAAI,uBAAuB,EAAE,qBAAqB,GAAG,SAAS,CAAC;AACtE,eAAO,IAAI,kBAAkB,EAAE,WAAW,GAAG,SAAS,CAAC;AACvD,eAAO,IAAI,sBAAsB,EAAE,eAAe,GAAG,SAAS,CAAC;AAC/D,eAAO,IAAI,qBAAqB,EAAE,cAAc,GAAG,SAAS,CAAC;AAE7D,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAEhF;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,CAEjE;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAEzE;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAEvE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createBladeQueryState.d.ts","sourceRoot":"","sources":["../../../../core/blade-navigation/table-query-state/createBladeQueryState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEjF,OAAO,KAAK,EAAE,uBAAuB,EAAmB,MAAM,SAAS,CAAC;AAKxE,MAAM,WAAW,yBAAyB;IACxC,6EAA6E;IAC7E,UAAU,EAAE,WAAW,CAAC,eAAe,CAAC,CAAC;IACzC,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,UAAU,EAAE,WAAW,CAAC;CACzB;AAQD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,yBAAyB,GAAG,uBAAuB,
|
|
1
|
+
{"version":3,"file":"createBladeQueryState.d.ts","sourceRoot":"","sources":["../../../../core/blade-navigation/table-query-state/createBladeQueryState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEjF,OAAO,KAAK,EAAE,uBAAuB,EAAmB,MAAM,SAAS,CAAC;AAKxE,MAAM,WAAW,yBAAyB;IACxC,6EAA6E;IAC7E,UAAU,EAAE,WAAW,CAAC,eAAe,CAAC,CAAC;IACzC,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,UAAU,EAAE,WAAW,CAAC;CACzB;AAQD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,yBAAyB,GAAG,uBAAuB,CAkD9F"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { type TableQueryPatch } from "./types";
|
|
2
2
|
export interface UseTableQueryStateReturn {
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* standalone table or a non-URL blade), so callers can use it unconditionally.
|
|
4
|
+
* Table view state (sort/search/page) restored from the URL. Returns an empty patch when
|
|
5
|
+
* no persistence service is provided, so callers can use it unconditionally.
|
|
7
6
|
*/
|
|
8
7
|
read(): TableQueryPatch;
|
|
9
8
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTableQueryState.d.ts","sourceRoot":"","sources":["../../../../core/blade-navigation/table-query-state/useTableQueryState.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAEnE,MAAM,WAAW,wBAAwB;IACvC
|
|
1
|
+
{"version":3,"file":"useTableQueryState.d.ts","sourceRoot":"","sources":["../../../../core/blade-navigation/table-query-state/useTableQueryState.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAEnE,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,IAAI,IAAI,eAAe,CAAC;CACzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,wBAAwB,CAM9E"}
|
|
@@ -157,11 +157,10 @@ export interface ParsedBladeUrl {
|
|
|
157
157
|
/**
|
|
158
158
|
* Where the blade stack writes the URL after a navigation action.
|
|
159
159
|
*
|
|
160
|
-
* The stack decides
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
* `createRouterUrlSink` in `utils/urlSync.ts` is the router-backed implementation.
|
|
160
|
+
* The stack decides when to sync and which verb to use; the sink resolves the
|
|
161
|
+
* location and talks to the router, keeping the router (and the tenant prefix
|
|
162
|
+
* only it knows) out of the stack. `createRouterUrlSink` in `utils/urlSync.ts`
|
|
163
|
+
* is the router-backed implementation.
|
|
165
164
|
*/
|
|
166
165
|
export interface UrlSink {
|
|
167
166
|
/** Push a history entry for the stack's current URL (blade opened). */
|
|
@@ -202,11 +201,8 @@ export interface IBladeStack {
|
|
|
202
201
|
/**
|
|
203
202
|
* Register a before-close guard for a blade.
|
|
204
203
|
*
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
* **Note**: The legacy `onBeforeClose` callback has INVERTED semantics:
|
|
208
|
-
* return `false` to prevent, `undefined`/`true` to allow.
|
|
209
|
-
* The adapter in `useBladeNavigationAdapter.ts` handles this inversion.
|
|
204
|
+
* Return `true` to prevent close, `false` to allow. The legacy `onBeforeClose`
|
|
205
|
+
* callback is inverted; `useBladeNavigationAdapter.ts` handles that.
|
|
210
206
|
*/
|
|
211
207
|
registerBeforeClose(bladeId: string, guard: () => Promise<boolean>): void;
|
|
212
208
|
/** Unregister a before-close guard */
|
|
@@ -218,10 +214,9 @@ export interface IBladeStack {
|
|
|
218
214
|
/** Update a blade's title (called by VcBlade when title prop changes) */
|
|
219
215
|
setBladeTitle(bladeId: string, title: string | undefined): void;
|
|
220
216
|
/**
|
|
221
|
-
* Breadcrumb trail for a blade:
|
|
222
|
-
*
|
|
223
|
-
*
|
|
224
|
-
* Clicking a crumb closes everything opened after that blade.
|
|
217
|
+
* Breadcrumb trail for a blade: visible ancestors, outermost first, with blade id
|
|
218
|
+
* and runtime title (falling back to the blade name). Reads `blades`, so call it
|
|
219
|
+
* inside a computed. Clicking a crumb closes everything opened after that blade.
|
|
225
220
|
*/
|
|
226
221
|
trailFor(bladeId: string): Breadcrumbs[];
|
|
227
222
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/blade-navigation/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,MAAM,8BAA8B,GAAG;IAC3C,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,WAAW,CAAC,EAAE,GAAG,CAAC;CACnB,CAAC;AAIF;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAChC,KAAK,CAAC,EAAE,mBAAmB,CAAC;KAC7B,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAChC,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAChC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AAMxD,+EAA+E;AAC/E,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEnD,uFAAuF;AACvF,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC;AAED,kDAAkD;AAElD,MAAM,MAAM,wBAAwB,CAAC,EAAE,SAAS,SAAS,GAAG,SAAS,IAAI,SAAS,GAAG;IACnF,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,CAAC;AAEF,sDAAsD;AACtD,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAC1D,KAAK,EAAE,wBAAwB,CAAC,CAAC,CAAC,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qEAAqE;AACrE,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE;QACL,UAAU,EAAE;YACV,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;YACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;YACrB,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;YACnD,KAAK,CAAC,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;YAC1B,QAAQ,EAAE,gBAAgB,GAAG,SAAS,GAAG,IAAI,CAAC;YAC9C,GAAG,EAAE,MAAM,CAAC;YACZ,SAAS,CAAC,EAAE,OAAO,CAAC;SACrB,CAAC;QACF,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,IAAI,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;CAC3D;AAID;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8DAA8D;IAC9D,EAAE,EAAE,MAAM,CAAC;IACX,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,iCAAiC;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,mEAAmE;IACnE,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/blade-navigation/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,MAAM,8BAA8B,GAAG;IAC3C,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,WAAW,CAAC,EAAE,GAAG,CAAC;CACnB,CAAC;AAIF;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAChC,KAAK,CAAC,EAAE,mBAAmB,CAAC;KAC7B,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAChC,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAChC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AAMxD,+EAA+E;AAC/E,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEnD,uFAAuF;AACvF,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC;AAED,kDAAkD;AAElD,MAAM,MAAM,wBAAwB,CAAC,EAAE,SAAS,SAAS,GAAG,SAAS,IAAI,SAAS,GAAG;IACnF,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,CAAC;AAEF,sDAAsD;AACtD,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAC1D,KAAK,EAAE,wBAAwB,CAAC,CAAC,CAAC,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qEAAqE;AACrE,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE;QACL,UAAU,EAAE;YACV,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;YACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;YACrB,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;YACnD,KAAK,CAAC,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;YAC1B,QAAQ,EAAE,gBAAgB,GAAG,SAAS,GAAG,IAAI,CAAC;YAC9C,GAAG,EAAE,MAAM,CAAC;YACZ,SAAS,CAAC,EAAE,OAAO,CAAC;SACrB,CAAC;QACF,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,IAAI,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;CAC3D;AAID;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8DAA8D;IAC9D,EAAE,EAAE,MAAM,CAAC;IACX,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,iCAAiC;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,mEAAmE;IACnE,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,OAAO;IACtB,uEAAuE;IACvE,IAAI,IAAI,IAAI,CAAC;IACb,qFAAqF;IACrF,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,gFAAgF;AAChF,eAAO,MAAM,aAAa,EAAE,OAG1B,CAAC;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;IAC7D,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,eAAe,EAAE,CAAC,CAAC;IACzD,6BAA6B;IAC7B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;IAE/D,mEAAmE;IACnE,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,sDAAsD;IACtD,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,2EAA2E;IAC3E,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,oFAAoF;IACpF,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClF,yGAAyG;IACzG,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,uEAAuE;IACvE,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/C;;;;;OAKG;IACH,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAC1E,sCAAsC;IACtC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7C,8BAA8B;IAC9B,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACrD,4BAA4B;IAC5B,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAEvC,yEAAyE;IACzE,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAEhE;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC;IAEzC;;;;OAIG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAEvE,iGAAiG;IACjG,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;IAC1C,6CAA6C;IAC7C,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,oCAAoC;IACpC,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/C,uCAAuC;IACvC,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAElC,gFAAgF;IAChF,aAAa,CAAC,WAAW,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;CACrD;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC;IAC1F,gDAAgD;IAChD,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3F,gEAAgE;IAChE,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAID,eAAO,MAAM,aAAa,EAAE,YAAY,CAAC,WAAW,CAAwB,CAAC;AAC7E,eAAO,MAAM,iBAAiB,EAAE,YAAY,CAAC,eAAe,CAA4B,CAAC;AACzF,eAAO,MAAM,kBAAkB,EAAE,YAAY,CAAC,WAAW,CAAC,eAAe,CAAC,CAA6B,CAAC;AACxG,eAAO,MAAM,iBAAiB,EAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAA4B,CAAC;AAEtF;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,mDAAmD;IACnD,SAAS,EAAE,OAAO,CAAC;IACnB,uDAAuD;IACvD,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC;CAC7B;AAED,eAAO,MAAM,sBAAsB,EAAE,YAAY,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAiC,CAAC;AACpH,eAAO,MAAM,YAAY,EAAE,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CACtF,CAAC;AAItB;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,sDAAsD;IACtD,EAAE,EAAE,MAAM,CAAC;IACX,gEAAgE;IAChE,OAAO,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IACnD,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,KAAK,CAAC;IACrB,gEAAgE;IAChE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,MAAM,CAAC,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,IAAI,CAAC;KACrB,CAAC;CAGH;AAED,eAAO,MAAM,eAAe,EAAE,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAA0B,CAAC"}
|
|
@@ -2,11 +2,8 @@ import type { RouteLocationNormalized, Router } from "vue-router";
|
|
|
2
2
|
import type { UseBladeRegistryReturn } from "../../composables/useBladeRegistry";
|
|
3
3
|
import type { IBladeStack } from "../../blade-navigation/types";
|
|
4
4
|
/**
|
|
5
|
-
* Result of the blade router guard
|
|
6
|
-
*
|
|
7
|
-
* - `undefined` — allow navigation (no redirect)
|
|
8
|
-
* - `false` — cancel navigation (e.g. beforeClose guard prevented closing)
|
|
9
|
-
* - `{ path, query, replace }` — redirect to cleaned-up URL
|
|
5
|
+
* Result of the blade router guard: `undefined` allows the navigation, `false` cancels it
|
|
6
|
+
* (a beforeClose guard refused), and `{ path, query, replace }` redirects to a cleaned URL.
|
|
10
7
|
*/
|
|
11
8
|
export type BladeGuardResult = undefined | false | {
|
|
12
9
|
path: string;
|
|
@@ -16,16 +13,11 @@ export type BladeGuardResult = undefined | false | {
|
|
|
16
13
|
/**
|
|
17
14
|
* Router guard that syncs URL navigation with the BladeStack.
|
|
18
15
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* - **Real child routes** (e.g. "Platform", "Dashboard"): clears any open
|
|
23
|
-
* blades and lets Vue Router render the page.
|
|
24
|
-
* - **Blade catch-all route**: parses URL segments and restores the
|
|
25
|
-
* blade stack (workspace + optional child blade).
|
|
16
|
+
* A real child route ("Platform", "Dashboard") clears open blades and lets Vue Router
|
|
17
|
+
* render the page. The blade catch-all route instead parses the URL segments and restores
|
|
18
|
+
* the stack (workspace plus optional child).
|
|
26
19
|
*
|
|
27
|
-
* The catch-all
|
|
28
|
-
* by the BladeNavigationPlugin when it registers the catch-all.
|
|
20
|
+
* The catch-all is identified by `meta.bladeCatchAll`, set by BladeNavigationPlugin.
|
|
29
21
|
*/
|
|
30
22
|
export declare function bladeRouterGuard(to: RouteLocationNormalized, bladeStack: IBladeStack, bladeRegistry: UseBladeRegistryReturn, hasAccess?: (permissions: string | string[] | undefined) => boolean, router?: Router): Promise<BladeGuardResult>;
|
|
31
23
|
//# sourceMappingURL=bladeRouterGuard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bladeRouterGuard.d.ts","sourceRoot":"","sources":["../../../../core/blade-navigation/utils/bladeRouterGuard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAIhE
|
|
1
|
+
{"version":3,"file":"bladeRouterGuard.d.ts","sourceRoot":"","sources":["../../../../core/blade-navigation/utils/bladeRouterGuard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAIhE;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,CAAC;AAyBlH;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,uBAAuB,EAC3B,UAAU,EAAE,WAAW,EACvB,aAAa,EAAE,sBAAsB,EACrC,SAAS,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,KAAK,OAAO,EACnE,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,CAAC,CAqD3B"}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
|
-
import type { Router } from "vue-router";
|
|
1
|
+
import type { RouteRecordNormalized, Router } from "vue-router";
|
|
2
|
+
/**
|
|
3
|
+
* Resolve the application's main route — the one marked `meta.root` — preferring its alias.
|
|
4
|
+
*
|
|
5
|
+
* Returns `undefined` when no route declares `meta.root`. The alias lookup is guarded on
|
|
6
|
+
* that: with `mainRoute` undefined the predicate reads `r.aliasOf?.path === undefined`,
|
|
7
|
+
* true for every route without an alias, so `find` would return whatever registered first.
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveMainRoute(router: Router): RouteRecordNormalized | undefined;
|
|
2
10
|
/**
|
|
3
11
|
* Navigate to the application's main (root) route.
|
|
4
12
|
*
|
|
5
|
-
* Resolves the route marked with `meta.root`, preferring its alias if one exists.
|
|
6
13
|
* Uses `router.replace()` to avoid adding a history entry.
|
|
7
14
|
*/
|
|
8
15
|
export declare function navigateToMainRoute(router: Router, params?: Record<string, string>): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigateToMainRoute.d.ts","sourceRoot":"","sources":["../../../../core/blade-navigation/utils/navigateToMainRoute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"navigateToMainRoute.d.ts","sourceRoot":"","sources":["../../../../core/blade-navigation/utils/navigateToMainRoute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEhE;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAKlF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAKzF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restoreFromUrl.d.ts","sourceRoot":"","sources":["../../../../core/blade-navigation/utils/restoreFromUrl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAKhF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,WAAW,EACvB,aAAa,EAAE,cAAc,EAC7B,MAAM,EAAE,cAAc,EACtB,SAAS,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,KAAK,OAAO,EACnE,MAAM,CAAC,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"restoreFromUrl.d.ts","sourceRoot":"","sources":["../../../../core/blade-navigation/utils/restoreFromUrl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAKhF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,WAAW,EACvB,aAAa,EAAE,cAAc,EAC7B,MAAM,EAAE,cAAc,EACtB,SAAS,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,KAAK,OAAO,EACnE,MAAM,CAAC,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,OAAO,CAAC,CAqElB"}
|
|
@@ -45,9 +45,8 @@ export interface RouterUrlSink extends UrlSink {
|
|
|
45
45
|
/**
|
|
46
46
|
* Run `fn` with URL writes disabled.
|
|
47
47
|
*
|
|
48
|
-
* The router guard restores the
|
|
49
|
-
*
|
|
50
|
-
* guard. Reference-counted, so nested and overlapping windows are safe;
|
|
48
|
+
* The router guard restores the stack from the URL, so writing back from inside
|
|
49
|
+
* `beforeEach` would re-enter it. Reference-counted, so nested windows are safe;
|
|
51
50
|
* releases even if `fn` throws.
|
|
52
51
|
*/
|
|
53
52
|
suppressWhile<T>(fn: () => Promise<T>): Promise<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"urlSync.d.ts","sourceRoot":"","sources":["../../../../core/blade-navigation/utils/urlSync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAE1G;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,SAAS,eAAe,EAAE,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CA2CjD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,cAAc,CAiBrF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAItE;AAaD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED,iFAAiF;AACjF,MAAM,WAAW,aAAc,SAAQ,OAAO;IAC5C
|
|
1
|
+
{"version":3,"file":"urlSync.d.ts","sourceRoot":"","sources":["../../../../core/blade-navigation/utils/urlSync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAE1G;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,SAAS,eAAe,EAAE,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CA2CjD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,cAAc,CAiBrF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAItE;AAaD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED,iFAAiF;AACjF,MAAM,WAAW,aAAc,SAAQ,OAAO;IAC5C;;;;;;OAMG;IACH,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACpD;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,GAAG,SAAS,GAAG,aAAa,CA6B1G;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW;uBAM3C,IAAI;0BAOD,IAAI;EAKhC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/composables/useAssets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,WAAW,EAAE,MAAM,KAAK,CAAC;AAEjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/composables/useAssets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,WAAW,EAAE,MAAM,KAAK,CAAC;AAEjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMhD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACrG,MAAM,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,EAAE,eAAe,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,CAAC;IAC3F,IAAI,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,EAAE,eAAe,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,CAAC;IACxF,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;CAC/B;AAED,8CAA8C;AAC9C,MAAM,MAAM,UAAU,GAAG,eAAe,CAAC;AAEzC,wBAAgB,SAAS,IAAI,eAAe,CAoE3C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/composables/useAssetsManager/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,GAAG,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/composables/useAssetsManager/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,GAAG,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC;AAM7D,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,iBAAiB,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,MAAM,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,UAAU,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;IACtC,UAAU,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACtC,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;CAC/B;AAkBD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,EAC3C,OAAO,EAAE,uBAAuB,GAC/B,sBAAsB,CAwFxB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The asset upload transport, shared by `useAssets` and `useAssetsManager`. The two differ
|
|
3
|
+
* only in who owns the resulting array, so the POST, the sortOrder assignment and the
|
|
4
|
+
* batching live here once instead of in both.
|
|
5
|
+
*/
|
|
6
|
+
/** Default number of uploads in flight at once. */
|
|
7
|
+
export declare const DEFAULT_UPLOAD_CONCURRENCY = 4;
|
|
8
|
+
export interface UploadAssetsOptions {
|
|
9
|
+
/** Folder the files are uploaded into. A leading slash is optional. */
|
|
10
|
+
uploadPath: string;
|
|
11
|
+
/**
|
|
12
|
+
* `sortOrder` of the last existing item. Uploads continue the sequence from
|
|
13
|
+
* there; omitted or negative means every upload gets 0.
|
|
14
|
+
*/
|
|
15
|
+
startingSortOrder?: number;
|
|
16
|
+
/** Uploads in flight at once. Defaults to {@link DEFAULT_UPLOAD_CONCURRENCY}. */
|
|
17
|
+
concurrency?: number;
|
|
18
|
+
}
|
|
19
|
+
/** Shape the endpoint returns and both composables narrow to their own type. */
|
|
20
|
+
interface UploadedAsset {
|
|
21
|
+
url?: string;
|
|
22
|
+
size?: number;
|
|
23
|
+
createdDate?: Date;
|
|
24
|
+
sortOrder?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Upload `files`, preserving their order in the returned array. They are sent in batches of
|
|
28
|
+
* `concurrency`. A file the endpoint answers without a body is dropped from the result
|
|
29
|
+
* rather than failing the batch, so a partial upload returns fewer assets than files.
|
|
30
|
+
*/
|
|
31
|
+
export declare function uploadAssets<T extends UploadedAsset>(files: FileList | File[], { uploadPath, startingSortOrder, concurrency }: UploadAssetsOptions): Promise<T[]>;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=uploadAssets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploadAssets.d.ts","sourceRoot":"","sources":["../../../../core/composables/useAssetsManager/uploadAssets.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mDAAmD;AACnD,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C,MAAM,WAAW,mBAAmB;IAClC,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iFAAiF;IACjF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,gFAAgF;AAChF,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAqCD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,CAAC,SAAS,aAAa,EACxD,KAAK,EAAE,QAAQ,GAAG,IAAI,EAAE,EACxB,EAAE,UAAU,EAAE,iBAAiB,EAAE,WAAwC,EAAE,EAAE,mBAAmB,GAC/F,OAAO,CAAC,CAAC,EAAE,CAAC,CAad"}
|
|
@@ -6,10 +6,9 @@ export interface UseAsyncOptions {
|
|
|
6
6
|
/**
|
|
7
7
|
* Show error notification on failure. Default: true.
|
|
8
8
|
*
|
|
9
|
-
* Notifications are deferred via setTimeout(0) so
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* showing toasts for save/delete errors caught by module try/catch.
|
|
9
|
+
* Notifications are deferred via setTimeout(0) so ErrorInterceptor can cancel them
|
|
10
|
+
* when it catches the same error for the blade banner — no duplicate toast+banner
|
|
11
|
+
* on load errors, while save/delete errors still get a toast.
|
|
13
12
|
*/
|
|
14
13
|
notify?: boolean;
|
|
15
14
|
/** Notification timeout in ms. Default: 8000 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/composables/useAsync/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,GAAG,EAAE,KAAK,YAAY,EAAE,MAAM,KAAK,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAc,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAarE,MAAM,MAAM,WAAW,CAAC,OAAO,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEhH,MAAM,WAAW,eAAe;IAC9B
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/composables/useAsync/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,GAAG,EAAE,KAAK,YAAY,EAAE,MAAM,KAAK,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAc,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAarE,MAAM,MAAM,WAAW,CAAC,OAAO,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEhH,MAAM,WAAW,eAAe;IAC9B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc,CAAC,OAAO,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,CAAE,SAAQ,UAAU;IAC/E,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACrC,wEAAwE;IACxE,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC,CAAC;CACnD;AAED,6CAA6C;AAC7C,MAAM,MAAM,QAAQ,CAAC,OAAO,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAEtF,wBAAgB,QAAQ,CAAC,OAAO,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,EACpD,WAAW,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,EACzC,OAAO,CAAC,EAAE,eAAe,GACxB,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAkDjC"}
|
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
import type { UseBladeFormOptions, UseBladeFormReturn } from "./types";
|
|
2
2
|
export type { UseBladeFormOptions, UseBladeFormReturn, BladeFormInjection } from "./types";
|
|
3
3
|
/**
|
|
4
|
-
* Unified form state management for blades
|
|
4
|
+
* Unified form state management for blades: vee-validate form, modification
|
|
5
|
+
* tracking, browser unload guard and blade close guard in one composable.
|
|
5
6
|
*
|
|
6
|
-
*
|
|
7
|
-
* and blade close guard into a single composable with lifecycle-based API.
|
|
7
|
+
* Must be called from component setup() — uses provide() internally.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* Unlike useModificationTracker (which creates a separate currentValue clone),
|
|
12
|
-
* this composable tracks changes directly on the passed `data` ref.
|
|
13
|
-
* The template binds to `data` via v-model — edits go straight into
|
|
14
|
-
* the ref and are detected by a deep watcher against a pristine snapshot.
|
|
9
|
+
* Unlike useModificationTracker there is no separate currentValue clone: the
|
|
10
|
+
* template writes into `data`, and a deep watcher compares it to a pristine snapshot.
|
|
15
11
|
*/
|
|
16
12
|
export declare function useBladeForm<T>(options: UseBladeFormOptions<T>): UseBladeFormReturn;
|
|
17
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/composables/useBladeForm/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAEvE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAgC3F
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/composables/useBladeForm/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAEvE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAgC3F;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAgHnF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/composables/useBladeNavigationAdapter/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAA8C,SAAS,EAAE,WAAW,EAAY,MAAM,KAAK,CAAC;AACnG,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAQ1F,OAAO,EACL,UAAU,EACV,WAAW,EACX,eAAe,EACf,wBAAwB,EAGzB,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/composables/useBladeNavigationAdapter/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAA8C,SAAS,EAAE,WAAW,EAAY,MAAM,KAAK,CAAC;AACnG,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAQ1F,OAAO,EACL,UAAU,EACV,WAAW,EACX,eAAe,EACf,wBAAwB,EAGzB,MAAM,8BAA8B,CAAC;AAoBtC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IAC9D,QAAQ,CAAC,0BAA0B,EAAE,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC,CAAC;IAChG,SAAS,EAAE,CAAC,KAAK,SAAS,SAAS,EACjC,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,EACxB,WAAW,CAAC,EAAE,OAAO,KAClB,OAAO,CAAC,IAAI,GAAG,iBAAiB,CAAC,CAAC;IACvC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,QAAQ,EAAE,MAAM,gBAAgB,CAAC;IACjC,YAAY,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,iBAAiB,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,KAAK,IAAI,CAAC;IAChE,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,wBAAwB,GAAG,SAAS,CAAC;IAC3E,aAAa,EAAE,CAAC,EAAE,EAAE,uBAAuB,KAAK,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACrH,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC;IACrE,kBAAkB,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS,CAAC;IACtE,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1D,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AA2HD,wBAAgB,kBAAkB,IAAI,mBAAmB,CA+OxD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { IBaseProperty } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Which control `VcDynamicProperty` renders for a property.
|
|
4
|
+
*
|
|
5
|
+
* Precedence mirrors `resolveStrategy` exactly — the strategy is the data
|
|
6
|
+
* contract, so the control follows it, not the template's old `v-else-if`
|
|
7
|
+
* chain, which tested `dictionary` first and left Measure properties with a
|
|
8
|
+
* dictionary unable to store a unit.
|
|
9
|
+
*/
|
|
10
|
+
export type ControlKind = "dictionary" | "measure" | "boolean" | "datetime" | "long-text" | "number" | "number-multivalue" | "integer" | "integer-multivalue" | "short-text" | "short-text-multivalue" | "multivalue-dictionary" | "color" | "color-dictionary" | "color-multivalue" | "color-multivalue-dictionary" | "unsupported";
|
|
11
|
+
export declare function resolveControlKind(property: IBaseProperty): ControlKind;
|
|
12
|
+
//# sourceMappingURL=resolveControlKind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveControlKind.d.ts","sourceRoot":"","sources":["../../../../core/composables/useDynamicProperties/resolveControlKind.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAG7C;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GACnB,YAAY,GACZ,SAAS,GACT,SAAS,GACT,UAAU,GACV,WAAW,GACX,QAAQ,GACR,mBAAmB,GACnB,SAAS,GACT,oBAAoB,GACpB,YAAY,GACZ,uBAAuB,GACvB,uBAAuB,GACvB,OAAO,GACP,kBAAkB,GAClB,kBAAkB,GAClB,6BAA6B,GAC7B,aAAa,CAAC;AAElB,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,GAAG,WAAW,CAqCvE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/composables/useKeyboardNavigation/index.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,4BAA4B;IAC3C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,2BAA2B;IAC1C,sBAAsB,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,IAAI,CAAC;IAClD,yBAAyB,EAAE,MAAM,IAAI,CAAC;IACtC,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,eAAe,EAAE,MAAM,MAAM,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,4BAAiC,GAAG,2BAA2B,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/composables/useKeyboardNavigation/index.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,4BAA4B;IAC3C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,2BAA2B;IAC1C,sBAAsB,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,IAAI,CAAC;IAClD,yBAAyB,EAAE,MAAM,IAAI,CAAC;IACtC,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,eAAe,EAAE,MAAM,MAAM,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,4BAAiC,GAAG,2BAA2B,CAwO7G"}
|