@vc-shell/framework 2.5.0-pr348.52b97ab → 2.5.0-pr350.bce5a99

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/dist/chunks/{VcScheduler.vue_vue_type_script_setup_true_lang-BpQMYp61.js → VcScheduler.vue_vue_type_script_setup_true_lang-BrWMWZS2.js} +3939 -3920
  2. package/dist/chunks/VcScheduler.vue_vue_type_script_setup_true_lang-BrWMWZS2.js.map +1 -0
  3. package/dist/chunks/{dashboard-feed-row.vue_vue_type_script_setup_true_lang-Ckjlhl5k.js → dashboard-feed-row.vue_vue_type_script_setup_true_lang-f8MTDeS0.js} +284 -271
  4. package/dist/chunks/dashboard-feed-row.vue_vue_type_script_setup_true_lang-f8MTDeS0.js.map +1 -0
  5. package/dist/dashboard/index.js +1 -1
  6. package/dist/framework.js +8 -8
  7. package/dist/locales/de.js +2 -1
  8. package/dist/locales/en.js +2 -1
  9. package/dist/locales/en.json +2 -1
  10. package/dist/locales/types.d.ts +1 -0
  11. package/dist/shell/dashboard/draggable-dashboard/GridstackDashboard.vue.d.ts.map +1 -1
  12. package/dist/shell/dashboard/draggable-dashboard/composables/useGridstack.d.ts +2 -0
  13. package/dist/shell/dashboard/draggable-dashboard/composables/useGridstack.d.ts.map +1 -1
  14. package/dist/tsconfig.tsbuildinfo +1 -1
  15. package/dist/ui/components/molecules/vc-popover/vc-popover.vue.d.ts +1 -0
  16. package/dist/ui/components/molecules/vc-popover/vc-popover.vue.d.ts.map +1 -1
  17. package/dist/ui/components/organisms/vc-scheduler/_internal/month/MonthEventPopover.vue.d.ts +2 -2
  18. package/dist/ui/components/organisms/vc-scheduler/_internal/month/MonthEventPopover.vue.d.ts.map +1 -1
  19. package/dist/ui/components/organisms/vc-scheduler/_internal/month/MonthMorePopover.vue.d.ts.map +1 -1
  20. package/dist/ui/components/organisms/vc-scheduler/_internal/quick-create/QuickCreatePopover.vue.d.ts.map +1 -1
  21. package/dist/ui/components/organisms/vc-scheduler/composables/useAnchoredPanelFocus.d.ts +20 -0
  22. package/dist/ui/components/organisms/vc-scheduler/composables/useAnchoredPanelFocus.d.ts.map +1 -0
  23. package/dist/ui/index.js +1 -1
  24. package/package.json +4 -4
  25. package/dist/chunks/VcScheduler.vue_vue_type_script_setup_true_lang-BpQMYp61.js.map +0 -1
  26. package/dist/chunks/dashboard-feed-row.vue_vue_type_script_setup_true_lang-Ckjlhl5k.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-feed-row.vue_vue_type_script_setup_true_lang-f8MTDeS0.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.\n *\n * Reads the values back off the Gridstack node rather than trusting the ones we\n * asked for: Gridstack clamps to the grid edges and compacts the rows, so the\n * requested cell and the resulting cell often differ. Writing the requested\n * values instead is what made the layout state — and every announcement derived\n * from it — disagree with the DOM.\n *\n * `requested` is the fallback for environments where the node is not exposed\n * (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.\n *\n * Restoring one widget and trusting compaction to undo itself does not work:\n * gravity re-floats it into the hole a displaced neighbour left behind. The\n * whole map has to go 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 * GridstackDashboard Component\n *\n * A flexible dashboard powered by Gridstack.js that allows widgets to be\n * dragged and arranged in a grid layout.\n *\n * Features:\n * - Drag and drop interface for arranging widgets\n * - Optional widget resizing\n * - Automatic layout persistence in localStorage\n * - Support for built-in widget positions\n * - Accessibility support\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 dashboard rendering until remote modules finish installing.\n// Without this, widgets preregistered during loadRemote() can mount before\n// their owning module's `defineAppModule.install` runs `mergeLocaleMessage`,\n// causing missing translations. Fallback `ref(true)` keeps tests/stories and\n// hosts without MF working unchanged.\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 must have a non-drag alternative) ---\n//\n// Gridstack only offers pointer dragging, so the widget itself becomes the control:\n// Enter/Space picks it up, arrows move it a cell at a time, Shift+arrows resize,\n// Enter drops, Escape restores the position it was picked up from.\nconst grabbedWidgetId = ref<string | null>(null);\n/**\n * The whole layout as it stood at pick-up, not just the grabbed widget.\n *\n * Restoring one widget and letting compaction undo itself does not work: a move\n * that displaced a neighbour leaves a hole, and gravity floats the widget\n * straight back into it. Escape then announced a cancel the screen did not\n * show (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 * DraggableDashboard Component\n *\n * A flexible dashboard powered by Gridstack.js that allows widgets to be\n * dragged and arranged in a grid layout.\n *\n * Features:\n * - Drag and drop interface for arranging widgets\n * - Automatic layout persistence in localStorage\n * - Support for built-in widget positions\n * - Accessibility support (a11y)\n * - Optional widget resizing\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 &--success {\n @apply tw-text-[var(--success-600)];\n }\n\n &--warning {\n @apply tw-text-[var(--warning-600)];\n }\n\n &--danger {\n @apply tw-text-[var(--danger-600)];\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,4 +1,4 @@
1
- import { _ as o, a as t, b as e, c as r, d, L as g, e as i, f as b, l as L, m as h, s as m, t as u, u as D } from "../chunks/dashboard-feed-row.vue_vue_type_script_setup_true_lang-Ckjlhl5k.js";
1
+ import { _ as o, a as t, b as e, c as r, d, L as g, e as i, f as b, l as L, m as h, s as m, t as u, u as D } from "../chunks/dashboard-feed-row.vue_vue_type_script_setup_true_lang-f8MTDeS0.js";
2
2
  export {
3
3
  o as DashboardFeedList,
4
4
  t as DashboardFeedRow,
package/dist/framework.js CHANGED
@@ -2,8 +2,8 @@ import { b as Ma, c as ka } from "./chunks/vendor-vueuse-core-_wFDcFkI.js";
2
2
  import { N as st, O as se, P as Y, Q as x, l as $, R as be, S as Va, T as yt, p as ot, q as K, n as Se, A as Ua, U as Fa, W as Wa, X as Ha, V as Ee, Y as Ga, Z as xa, $ as $a, a0 as Ka, a1 as za, a2 as qa, a3 as Ya, a4 as Za, a5 as ja } from "./chunks/VcScheduler.vue_vue_type_style_index_0_lang-BFmpC0MN.js";
3
3
  import { B as Yl, a6 as Zl, a as jl, _ as Xl, b as Jl, c as Ql, d as eu, e as tu, f as au, g as nu, h as su, i as ou, j as ru, k as iu, a7 as lu, a8 as uu, a9 as cu, aa as du, ab as Eu, ac as fu, ad as gu, m as mu, o as Su, r as Au, s as pu, t as Tu, u as hu, v as Lu, w as Ou, x as Ru, y as _u, z as Iu, ae as vu, af as wu, ag as Cu, ah as bu, ai as Pu, aj as Nu, ak as Du, al as yu, am as Bu, an as Mu, ao as ku, ap as Vu, aq as Uu, ar as Fu, as as Wu, at as Hu, au as Gu, av as xu, aw as $u, ax as Ku, ay as zu, C as qu, az as Yu, aA as Zu, aB as ju, aC as Xu, D as Ju, aD as Qu, aE as ec, aF as tc, aG as ac, aH as nc, aI as sc, aJ as oc, aK as rc, aL as ic, E as lc, F as uc, G as cc, L as dc, aM as Ec, H as fc, I as gc, aN as mc, J as Sc, aO as Ac, aP as pc, aQ as Tc } from "./chunks/VcScheduler.vue_vue_type_style_index_0_lang-BFmpC0MN.js";
4
4
  import { getCurrentScope as rt, onScopeDispose as it, computed as I, inject as Q, watch as ae, defineComponent as H, openBlock as b, createBlock as D, createSlots as Le, withCtx as h, renderSlot as Z, createElementVNode as U, normalizeClass as Xa, createElementBlock as W, Fragment as ne, createVNode as R, unref as i, createTextVNode as M, toDisplayString as y, shallowReactive as Ja, ref as P, readonly as Me, onMounted as Oe, onBeforeMount as Qa, onBeforeUnmount as en, shallowRef as tn, onUnmounted as an, provide as Bt, toValue as Mt, isRef as kt, normalizeStyle as Vt, createCommentVNode as q, withDirectives as nn, withModifiers as He, reactive as ie, createApp as sn, nextTick as Pe, renderList as Fe, withKeys as lt, mergeProps as re, getCurrentInstance as on, warn as rn, h as ee, toRaw as ln } from "vue";
5
- import { aS as fe, aT as un, aU as cn, aV as Ut, aW as Ge, aX as dn, aY as En, aZ as fn, a_ as gn, a$ as mn, ab as Sn, b0 as xe, b1 as An, b2 as pn, b3 as Re, b4 as We, b5 as Te, b6 as F, b7 as he, b8 as Tn, b9 as hn, ba as gt, bb as Ft, F as Wt, M as Ln, Y as ge, W as $e, am as On, N as Rn, ai as _n, B as _e, a3 as Ht, E as In, bc as vn, bd as wn, be as Cn, an as mt, bf as bn, bg as Pn } from "./chunks/VcScheduler.vue_vue_type_script_setup_true_lang-BpQMYp61.js";
6
- import { bh as Lc, bi as Oc, C as Rc, bj as _c, bk as Ic, bl as vc, _ as wc, bm as Cc, bn as bc, S as Pc, bo as Nc, bp as Dc, a as yc, b as Bc, c as Mc, d as kc, e as Vc, f as Uc, T as Fc, g as Wc, h as Hc, i as Gc, j as xc, k as $c, l as Kc, m as zc, bq as qc, br as Yc, V as Zc, n as jc, o as Xc, p as Jc, q as Qc, r as ed, s as td, t as ad, u as nd, v as sd, w as od, x as rd, y as id, z as ld, A as ud, D as cd, bs as dd, bs as Ed, bt as fd, G as gd, H as md, I as Sd, J as Ad, K as pd, L as Td, O as hd, P as Ld, Q as Od, R as Rd, U as _d, X as Id, Z as vd, $ as wd, a0 as Cd, a1 as bd, a2 as Pd, a4 as Nd, a5 as Dd, a6 as yd, a7 as Bd, a8 as Md, a9 as kd, aa as Vd, ac as Ud, ad as Fd, ae as Wd, af as Hd, ag as Gd, ah as xd, aj as $d, ak as Kd, al as zd, ao as qd, ap as Yd, bu as Zd, aq as jd, bv as Xd, bw as Jd, bx as Qd, by as eE, bz as tE, bA as aE, bB as nE, bC as sE, bD as oE, bE as rE, bF as iE, bG as lE, ar as uE, as as cE, at as dE, bH as EE, au as fE, av as gE, bI as mE, aw as SE, ax as AE, ay as pE, az as TE, bJ as hE, aA as LE, aB as OE, aC as RE, bK as _E, aD as IE, aE as vE, aF as wE, aG as CE, bL as bE, aH as PE, aI as NE, aJ as DE, aK as yE, aL as BE, aM as ME, aN as kE, aO as VE, aP as UE, aQ as FE, aR as WE, aq as HE } from "./chunks/VcScheduler.vue_vue_type_script_setup_true_lang-BpQMYp61.js";
5
+ import { aS as fe, aT as un, aU as cn, aV as Ut, aW as Ge, aX as dn, aY as En, aZ as fn, a_ as gn, a$ as mn, ab as Sn, b0 as xe, b1 as An, b2 as pn, b3 as Re, b4 as We, b5 as Te, b6 as F, b7 as he, b8 as Tn, b9 as hn, ba as gt, bb as Ft, F as Wt, M as Ln, Y as ge, W as $e, am as On, N as Rn, ai as _n, B as _e, a3 as Ht, E as In, bc as vn, bd as wn, be as Cn, an as mt, bf as bn, bg as Pn } from "./chunks/VcScheduler.vue_vue_type_script_setup_true_lang-BrWMWZS2.js";
6
+ import { bh as Lc, bi as Oc, C as Rc, bj as _c, bk as Ic, bl as vc, _ as wc, bm as Cc, bn as bc, S as Pc, bo as Nc, bp as Dc, a as yc, b as Bc, c as Mc, d as kc, e as Vc, f as Uc, T as Fc, g as Wc, h as Hc, i as Gc, j as xc, k as $c, l as Kc, m as zc, bq as qc, br as Yc, V as Zc, n as jc, o as Xc, p as Jc, q as Qc, r as ed, s as td, t as ad, u as nd, v as sd, w as od, x as rd, y as id, z as ld, A as ud, D as cd, bs as dd, bs as Ed, bt as fd, G as gd, H as md, I as Sd, J as Ad, K as pd, L as Td, O as hd, P as Ld, Q as Od, R as Rd, U as _d, X as Id, Z as vd, $ as wd, a0 as Cd, a1 as bd, a2 as Pd, a4 as Nd, a5 as Dd, a6 as yd, a7 as Bd, a8 as Md, a9 as kd, aa as Vd, ac as Ud, ad as Fd, ae as Wd, af as Hd, ag as Gd, ah as xd, aj as $d, ak as Kd, al as zd, ao as qd, ap as Yd, bu as Zd, aq as jd, bv as Xd, bw as Jd, bx as Qd, by as eE, bz as tE, bA as aE, bB as nE, bC as sE, bD as oE, bE as rE, bF as iE, bG as lE, ar as uE, as as cE, at as dE, bH as EE, au as fE, av as gE, bI as mE, aw as SE, ax as AE, ay as pE, az as TE, bJ as hE, aA as LE, aB as OE, aC as RE, bK as _E, aD as IE, aE as vE, aF as wE, aG as CE, bL as bE, aH as PE, aI as NE, aJ as DE, aK as yE, aL as BE, aM as ME, aN as kE, aO as VE, aP as UE, aQ as FE, aR as WE, aq as HE } from "./chunks/VcScheduler.vue_vue_type_script_setup_true_lang-BrWMWZS2.js";
7
7
  import { _ as Nn } from "./chunks/vendor-cypress-signalr-mock-itnm2wpA.js";
8
8
  import { c as k, b as Dn, d as yn, i as et, S as Bn, W as Gt, B as xt, h as Mn, j as $t, k as kn, m as Vn, l as Kt, n as Un, _ as Fn, L as Wn, I as Hn, o as Gn, p as xn, q as $n, r as Kn, s as zn, T as qn, t as Yn, v as Zn, w as jn, x as Xn } from "./chunks/VcAiAgentPanel.vue_vue_type_style_index_0_lang-JB7OKRk6.js";
9
9
  import { A as xE, y as $E, z as KE, C as zE, D as qE, F as YE, G as ZE, H as jE, J as XE, K as JE, e as QE, f as ef, O as tf, P as af, Q as nf, R as sf, U as of, V as rf, X as lf, Y as uf, Z as cf, $ as df, a0 as Ef, E as ff, a1 as gf, a2 as mf, a3 as Sf, a4 as Af, a5 as pf, a6 as Tf, a7 as hf, a8 as Lf, M as Of, N as Rf, a9 as _f, aa as If, ab as vf, ac as wf, ad as Cf, ae as bf, af as Pf, ag as Nf, a as Df, ah as yf, ai as Bf, aj as Mf, ak as kf, u as Vf, g as Uf } from "./chunks/VcAiAgentPanel.vue_vue_type_style_index_0_lang-JB7OKRk6.js";
@@ -93,7 +93,7 @@ import "./chunks/vendor-truncate-html-ChA1T5zy.js";
93
93
  import "./chunks/vendor-sortablejs-Bsvu-FKn.js";
94
94
  import { v as cs } from "./chunks/vendor-vue3-touch-events-DqysuuWh.js";
95
95
  import "./chunks/vendor-gridstack-Beau2jQ7.js";
96
- import { _ as og, a as rg, b as ig, c as lg, d as ug, L as cg, e as dg, f as Eg, l as fg, m as gg, s as mg, t as Sg, u as Ag } from "./chunks/dashboard-feed-row.vue_vue_type_script_setup_true_lang-Ckjlhl5k.js";
96
+ import { _ as og, a as rg, b as ig, c as lg, d as ug, L as cg, e as dg, f as Eg, l as fg, m as gg, s as mg, t as Sg, u as Ag } from "./chunks/dashboard-feed-row.vue_vue_type_script_setup_true_lang-f8MTDeS0.js";
97
97
  import { _ as Tg, a as hg, b as Lg, c as Og, d as Rg, e as _g } from "./chunks/DashboardDonutChart.vue_vue_type_script_setup_true_lang-hTcM33bM.js";
98
98
  import { A as ds, u as Es } from "./chunks/vendor-vue3-application-insights-CAgbt8pk.js";
99
99
  import { o as fs, c as J, d as gs, i as ms } from "./chunks/vendor-lodash-es-D2n90GJy.js";
@@ -1815,7 +1815,7 @@ function Po(e) {
1815
1815
  e && e.getRoutes().some((t) => t.path === "/login" || t.name === "Login") ? e.currentRoute.value.path !== "/login" && e.push("/login") : window.location.href = window.location.origin + "/";
1816
1816
  }
1817
1817
  const oa = { ERRORS: { SESSION_EXPIRED: `Access Denied: Your session has expired or you do not have the necessary permissions.
1818
- Please log in again or contact the administrator for assistance.`, NETWORK_UNAVAILABLE: "Network unavailable. Please check your connection.", REQUEST_TIMED_OUT: "Request timed out. Please try again." }, THEMES: { LIGHT: "Light", DARK: "Dark" }, NOTIFICATIONS: { CLEAR_ALL: "Clear all" } }, ra = { NAVIGATION_ARIA_LABEL: "Primary navigation", SIDEBAR: { SEARCH_PLACEHOLDER: "Search keyword" }, USER: { ROLE: { ADMINISTRATOR: "Administrator" } }, ACCOUNT: { SETTINGS: "Settings", CHANGE_PASSWORD: "Change password", PROFILE: "Profile", LOGOUT: "Log Out" } }, ia = { CONTROLS: { CLEAR: "Clear", CLEAR_ALL: "Clear all", CLOSE: "Close", TOGGLE_DROPDOWN: "Toggle dropdown", SEARCH_OPTIONS: "Search options", SELECT_OPTION: "Select option", CLEAR_SELECTION: "Clear selection", COPY_TO_CLIPBOARD: "Copy to clipboard", DELETE_ITEM: "Delete item", SHOW_PASSWORD: "Show password", HIDE_PASSWORD: "Hide password" }, ATOMS: { VC_IMAGE: { LABEL: "Image" }, VC_BANNER: { SHOW_MORE: "Show more", SHOW_LESS: "Show less" }, VC_SCROLLABLE_CONTAINER: { LABEL: "Scrollable content" }, VC_VIDEO: { NO_SOURCE: "No video source" } }, MOLECULES: { VC_SELECT: { CLICK_TO_SELECT: "Click to select...", LOADING: "Loading...", LOADING_MORE: "Loading more...", NO_OPTIONS: "No options" }, VC_FILE_UPLOAD: { DRAG_HERE: "Drag and drop file here or", BROWSE: "browse your files", TAP_TO_UPLOAD: "Tap to select files", UPLOADING: "Uploading..." }, VC_INPUT: { DATE_PLACEHOLDER: "Select date", DATE_TIME_PLACEHOLDER: "Select date and time" }, VC_PAGINATION: { JUMP: "Jump to page:", LABEL: "Pagination", FIRST: "First page", PREVIOUS: "Previous page", NEXT: "Next page", LAST: "Last page", PAGE: "Page {page}" }, VC_MULTIVALUE: { ADD: "Add" }, VC_BREADCRUMBS: { BACK: "Back", LABEL: "Breadcrumb", SHOW_MORE: "Show more breadcrumbs" }, VC_COLOR_INPUT: { CLEAR: "Clear color" }, VC_DATE_PICKER: { CLEAR: "Clear date" }, VC_SLIDER: { PREVIOUS: "Previous slide", NEXT: "Next slide" }, VC_TOAST: { DISMISS: "Dismiss notification" }, VC_EDITOR: { TOOLBAR: { LABEL: "Text formatting", BOLD: "Bold", ITALIC: "Italic", UNDERLINE: "Underline", STRIKETHROUGH: "Strikethrough", HEADING_1: "Heading 1", HEADING_2: "Heading 2", HEADING_3: "Heading 3", BULLET_LIST: "Bullet list", NUMBERED_LIST: "Numbered list", BLOCKQUOTE: "Blockquote", INSERT_LINK: "Insert link", INSERT_IMAGE: "Insert image", INSERT_TABLE: "Insert table", DELETE_TABLE: "Delete table", ADD_COLUMN_BEFORE: "Add column before", ADD_COLUMN_AFTER: "Add column after", ADD_ROW_BEFORE: "Add row before", ADD_ROW_AFTER: "Add row after", DELETE_COLUMN: "Delete column", DELETE_ROW: "Delete row" }, FONT_SIZE: "Font size", VIEW: { PREVIEW: "Preview", SPLIT: "Side-by-side view", SOURCE: "Source code" } } }, ORGANISMS: { VC_DYNAMIC_PROPERTY: { ADD: "Add value", VALUE_TYPE: { COLOR: { PLACEHOLDER: "Color code", NAME: "Color name" } } }, VC_GALLERY: { INTERNAL: { VC_GALLERY_ITEM: { FULLSCREEN: "Fullscreen", EDIT: "Edit", DELETE: "Delete" }, VC_GALLERY_PREVIEW: { COPY_IMAGE_LINK: "copy image link" }, VC_GALLERY_FILMSTRIP: { PREVIOUS: "Previous images", NEXT: "Next images" } }, GALLERY_IS_EMPTY: "Gallery is empty", DROP_TO_UPLOAD: "Drop to upload", DRAG_IMAGES_HERE: "Drag images here or", BROWSE_IMAGES: "browse your files", UPLOAD: "Upload", OR_DROP_HERE: "or drop here", SHOW_ALL: "Expand ({count})", COLLAPSE: "Collapse" }, VC_APP: { NOTIFICATIONS: "Notifications", OPEN_MENU: "Open menu", CLOSE_MENU: "Close menu", INTERNAL: { VC_APP_BAR: { BACK: "Back" }, MOBILE_LAYOUT: { TAB_MENU: "Menu", TAB_HUB: "Hub" }, APP_HUB: { SEARCH_PLACEHOLDER: "Search applications and widgets", APPLICATIONS: "Applications", WIDGETS: "Widgets", NO_APPLICATIONS: "No applications found", NO_WIDGETS: "No widgets found", LIST_VIEW: "List view", TILE_VIEW: "Tile view" } } }, BLADE_NAVIGATION: { ARIA_LABEL: "Blade navigation" }, VC_BLADE: { SEE_DETAILS: "See details", UNSAVED_CHANGES: "Has unsaved changes", ERROR_POPUP: { TITLE: "Error details", COPY_ERROR: "copy content", CLOSE: "dismiss" }, MORE: "More", TOOLBAR: "Toolbar actions", CLOSE_MENU: "Close menu", PANEL: "Panel" }, VC_BLADE_HEADER: { UNSAVED_CHANGES: "Has unsaved changes", NO_CHANGES: "No unsaved changes", CLOSE: "Close", MAXIMIZE: "Maximize", RESTORE: "Restore" }, VC_TABLE: { SELECT_ROW: "Select row", SELECT_ALL_ROWS: "Select all rows", EXPAND_ROW: "Toggle row details", CURRENT_PAGE_SELECTED: "All items in this page are selected.", SELECT_ALL: "Select all items", ALL_SELECTED: "All items are selected.", ALL_SELECTED_COUNT: "All {count} items selected", SELECT_ALL_COUNT: "Select all {count} items", CANCEL: "Clear selection", ALL_ACTIONS: "All actions", MORE: "More", ALL_FILTERS: "Filters", SEARCH: "Search...", EMPTY: "List is empty.", EMPTY_TITLE: "No data", EMPTY_DESCRIPTION: "No items to display", NOT_FOUND: "Nothing found.", NOT_FOUND_TITLE: "No results found", NOT_FOUND_DESCRIPTION: "Try adjusting your search or filters", TOTALS: "Totals:", ACTIONS: "Actions", NOT_SET: "Not set", SELECTED: "Selected", SELECT_ALL_TRUNCATED: "Select all", PULL_TO_REFRESH: "Pull to refresh", RELEASE_TO_REFRESH: "Release to refresh", REFRESHING: "Refreshing...", ADD_ROW: "Add row", LOADING: "Loading...", PAGE_INFO: "Page {current} of {total}", COLUMN_FILTER: { APPLY: "Apply", CLEAR: "Clear", FROM: "From", TO: "To", TITLE: "Filter column" }, GLOBAL_FILTERS: { BUTTON: "Filters", TITLE: "Filters" }, COLUMN_SWITCHER: { BUTTON: "Columns", TITLE: "Show/Hide Columns", SHOW_ALL: "Show All", RESET: "Reset" }, OF: "of", PAGE: "Page" }, VC_POPUP: { OK: "OK", CONFIRM: "Confirm", CANCEL: "Cancel", CLOSE: "Close", TITLE: { CONFIRMATION: "Confirmation", ERROR: "Error", INFO: "Info" } } }, THEME_SELECTOR: { THEME_CHANGED: " theme", THEME_SELECTOR: "Theme" }, CHANGE_PASSWORD: { TITLE: "Change password", TITLE_FORCED: "Password expired", SUBTITLE_FORCED: "Please set a new password", FORCED: { LABEL: "Your password has expired. You must change the password to continue using the manager." }, CURRENT_PASSWORD: { LABEL: "Current password", PLACEHOLDER: "Enter password" }, NEW_PASSWORD: { LABEL: "New password", PLACEHOLDER: "Enter password" }, CONFIRM_PASSWORD: { LABEL: "Confirm password", PLACEHOLDER: "Confirm password" }, CANCEL: "Cancel", SAVE: "Update", ERRORS: { "Repeat-password": "Passwords are not same", "Equal-passwords": "The new password must not match the old one", "Invalid-token": "Token is invalid or expired", "Password-too-weak": "New password does not comply one or more password security policies:", PasswordTooShort: "Passwords too short", PasswordRequiresUniqueChars: "Passwords must use different characters", PasswordRequiresLower: "Passwords must have at least one lowercase ('a'-'z')", PasswordRequiresUpper: "Passwords must have at least one uppercase ('A'-'Z')", PasswordRequiresDigit: "Passwords must have at least one digit ('0'-'9')", PasswordRequiresNonAlphanumeric: "Passwords must have at least one non alphanumeric character", "Incorrect password.": "You entered an incorrect password", "You have used this password in the past. Choose another one.": "You have used this password in the past. Choose another one." } }, APP_HUB: { TITLE: "Applications" }, NOTIFICATION_DROPDOWN: { TITLE: "Notifications", EMPTY: "No notifications yet" }, LANGUAGE_SELECTOR: { TITLE: "Language" }, FILTERS: { APPLY: "Apply filters", RESET: "Reset" } }, la = { TITLE: "You're invited!", SUBTITLE: "Set a password for your account", FIELDS: { EMAIL: { LABEL: "Email" }, PASSWORD: { LABEL: "New password", PLACEHOLDER: "Enter password" }, CONFIRM_PASSWORD: { LABEL: "Confirm password", PLACEHOLDER: "Confirm password" } }, ACCEPT_INVITATION: "Activate", ERRORS: { "Repeat-password": "Passwords are not same", "Invalid-token": "Token is invalid or expired", "Password-too-weak": "New password does not comply one or more password security policies:", PasswordTooShort: "Passwords too short", PasswordRequiresUniqueChars: "Passwords must use different characters", PasswordRequiresLower: "Passwords must have at least one lowercase ('a'-'z')", PasswordRequiresUpper: "Passwords must have at least one uppercase ('A'-'Z')", PasswordRequiresDigit: "Passwords must have at least one digit ('0'-'9')", PasswordRequiresNonAlphanumeric: "Passwords must have at least one non alphanumeric character", recentPasswordUsed: "You have used this password in the past. Choose another one." } }, ua = { TITLE: "Welcome back", SUBTITLE: "Sign in to your account to continue", FIELDS: { LOGIN: { LABEL: "Email", PLACEHOLDER: "Enter your email" }, PASSWORD: { LABEL: "Password", PLACEHOLDER: "Enter your password" }, FORGOT_PASSWORD: { TITLE: "Forgot password", LABEL: "Email", PLACEHOLDER: "Please enter your email" } }, FORGOT_PASSWORD_BUTTON: "Forgot password?", BUTTON: "Sign in", OR: "or", FORGOT_BUTTON: "Submit", BACK_BUTTON: "Back", BUTTON_OK: "Ok", RESET_EMAIL_TEXT: "We will send you an email with instructions on how to reset your password.", RESET_EMAIL_SENT: "Email with instructions has been sent to you.", SSO_NO_PROVIDERS_ERROR: "SSO authentication is not configured. Please contact your administrator.", ERRORS: { INVALID_CREDENTIALS: "The login or password is incorrect.", AUTH_WITH_CODE: "Authentication error (code: {code}).", AUTH_GENERIC: "Authentication error: {detail}" } }, ca = { TITLE: "Reset your password", SUBTITLE: "Enter your email and we'll send you a reset link", FIELDS: { EMAIL: { LABEL: "Email", PLACEHOLDER: "Enter your email address" } }, SEND_BUTTON: "Send reset link", BACK_TO_LOGIN: "Back to sign in", SUCCESS_TITLE: "Check your email", SUCCESS_TEXT: "We sent a reset link to {email}" }, da = { TITLE: "Set new password", SUBTITLE: "Enter your new password below", FIELDS: { PASSWORD: { LABEL: "New password", PLACEHOLDER: "Enter password" }, CONFIRM_PASSWORD: { LABEL: "Confirm password", PLACEHOLDER: "Confirm password" } }, SAVE_PASSWORD: "Save", ERRORS: { "Repeat-password": "Passwords are not same", "Invalid-token": "Token is invalid or expired", "Password-too-weak": "New password does not comply one or more password security policies:", PasswordTooShort: "Passwords too short", PasswordRequiresUniqueChars: "Passwords must use different characters", PasswordRequiresLower: "Passwords must have at least one lowercase ('a'-'z')", PasswordRequiresUpper: "Passwords must have at least one uppercase ('A'-'Z')", PasswordRequiresDigit: "Passwords must have at least one digit ('0'-'9')", PasswordRequiresNonAlphanumeric: "Passwords must have at least one non alphanumeric character", recentPasswordUsed: "You have used this password in the past. Choose another one." } }, Ea = { TITLE: "Assets", TOOLBAR: { SAVE: "Save", REFRESH: "Refresh", ADD: "Add", DELETE: "Delete selected" }, EMPTY: { NO_ASSETS: "No assets", UPLOAD_ASSETS: "Drag & drop assets here or click 'Upload' button", UPLOAD: "Upload" }, TABLE: { HEADER: { IMAGE: "Img", NAME: "Name", SIZE: "Size", SORT_ORDER: "Sort order", CREATED_DATE: "Created date" }, ACTIONS: { DELETE: "Delete", EDIT: "Edit" } } }, fa = { PAGES: { DETAILS: { SUBTITLE: "Asset edit", TOOLBAR: { SAVE: "Save", DELETE: "Delete" }, FIELDS: { SIZE: "Size", CREATED_DATE: "Created date", URL: "Url", COPY: "Copy link", NAME: { TITLE: "Asset name", PLACEHOLDER: "Enter asset name" }, ALT: { TITLE: "Image alternative text", PLACEHOLDER: "Enter image alt text", TOOLTIP: "This text will be displayed in case of disabled/unloaded image on the page" }, DESCRIPTION: { TITLE: "Meta description", PLACEHOLDER: "Enter meta description" } } } } }, ga = { _default: "The {field} is not valid", alpha: "The {field} field may only contain alphabetic characters", alpha_num: "The {field} field may only contain alpha-numeric characters", alpha_dash: "The {field} field may contain alpha-numeric characters as well as dashes and underscores", alpha_spaces: "The {field} field may only contain alphabetic characters as well as spaces", between: "The {field} field must be between 0:{min} and 1:{max}", confirmed: "The {field} field confirmation does not match", digits: "The {field} field must be numeric and exactly contain 0:{length} digits", dimensions: "The {field} field must be 0:{width} pixels by 1:{height} pixels", email: "The {field} field must be a valid email", not_one_of: "The {field} field is not a valid value", ext: "The {field} field is not a valid file", image: "The {field} field must be an image", integer: "The {field} field must be an integer", length: "The {field} field must be 0:{length} long", max_value: "The {field} field must be 0:{max} or less", max: "The {field} field may not be greater than 0:{length} characters", mimes: "The {field} field must have a valid file type", min_value: "The {field} field must be 0:{min} or more", min: "The {field} field must be at least 0:{length} characters", numeric: "The {field} field may only contain numeric characters", one_of: "The {field} field is not a valid value", regex: "The {field} field format is invalid", required_if: "The {field} field is required", required: "The {field} field is required", size: "The {field} field size must be less than 0:{size}KB", url: "The {field} field is not a valid URL", min_dimensions: { error: "Image dimensions must be greater than {height}*{width}", not_image_error: "Not image file" }, file_weight: "File size must be maximum {size} kb", before: "End date must be earlier than start date", after: "End date must be later than start date", bigint: "Unsupported number" }, ma = { ACCESS_RESTRICTED: "Access restricted" }, Sa = { LOADING: "Loading Virto OZ..." }, Aa = { AGENDA: "Agenda", ALL_DAY: "All day", CANCEL: "Cancel", CLOSE: "Close", COLOR: "Color", COLOR_DEFAULT: "Default color", COLOR_CUSTOM: "Custom color", COLOR_BLUE: "Blue", COLOR_GREEN: "Green", COLOR_AMBER: "Amber", COLOR_RED: "Red", COLOR_PURPLE: "Purple", COLOR_PINK: "Pink", COLOR_TEAL: "Teal", COLOR_SLATE: "Slate", DAY: "Day", DAY_N_OF_M: "Day {n} of {total}", DELETE: "Delete", DELETE_CONFIRM_BODY: `Delete "{title}"? This can't be undone.`, DELETE_CONFIRM_TITLE: "Delete event", EDIT: "Edit", EDIT_EVENT: "Edit event", EMPTY: "No events in this range", EMPTY_HINT: "No events yet. Click a day to add one.", END: "End", LOADING: "Loading events…", MORE: "+{count} more", MORE_EVENTS: "More events", MONTH: "Month", MORE_OPTIONS: "More options", NEW_EVENT: "New event", NEXT: "Next", PREVIOUS: "Previous", RECUR_SCOPE_ALL: "All events", RECUR_SCOPE_BODY_DELETE: "This event is part of a recurring series. Do you want to delete only this event or all events in the series?", RECUR_SCOPE_BODY_EDIT: "This event is part of a recurring series. Do you want to edit only this event or all events in the series?", RECUR_SCOPE_THIS: "This event", RECUR_SCOPE_TITLE: "Recurring event", REPEAT: "Repeat", REPEAT_DAILY: "Daily", REPEAT_END: "Ends", REPEAT_END_COUNT: "After", REPEAT_END_NEVER: "Never", REPEAT_END_UNTIL: "On date", REPEAT_EVERY: "Repeat every", REPEAT_UNIT_DAYS: "day(s)", REPEAT_UNIT_WEEKS: "week(s)", REPEAT_UNIT_MONTHS: "month(s)", REPEAT_UNIT_YEARS: "year(s)", REPEAT_MONTHLY: "Monthly", REPEAT_NONE: "Does not repeat", REPEAT_OCCURRENCES: "occurrence(s)", REPEAT_ON: "Repeat on", REPEAT_WEEKLY: "Weekly", REPEAT_YEARLY: "Yearly", SAVE: "Save", START: "Start", TIMELINE: "Timeline", TIMELINE_DAY: "Timeline Day", TIMELINE_WEEK: "Timeline Week", TITLE: "Title", TODAY: "Today", WEEK: "Week", WORK_WEEK: "Work week", ZOOM_IN: "Zoom in", ZOOM_OUT: "Zoom out" }, pa = { no_options: "No options" }, No = {
1818
+ Please log in again or contact the administrator for assistance.`, NETWORK_UNAVAILABLE: "Network unavailable. Please check your connection.", REQUEST_TIMED_OUT: "Request timed out. Please try again." }, THEMES: { LIGHT: "Light", DARK: "Dark" }, NOTIFICATIONS: { CLEAR_ALL: "Clear all" } }, ra = { NAVIGATION_ARIA_LABEL: "Primary navigation", SIDEBAR: { SEARCH_PLACEHOLDER: "Search keyword" }, USER: { ROLE: { ADMINISTRATOR: "Administrator" } }, ACCOUNT: { SETTINGS: "Settings", CHANGE_PASSWORD: "Change password", PROFILE: "Profile", LOGOUT: "Log Out" } }, ia = { CONTROLS: { CLEAR: "Clear", CLEAR_ALL: "Clear all", CLOSE: "Close", TOGGLE_DROPDOWN: "Toggle dropdown", SEARCH_OPTIONS: "Search options", SELECT_OPTION: "Select option", CLEAR_SELECTION: "Clear selection", COPY_TO_CLIPBOARD: "Copy to clipboard", DELETE_ITEM: "Delete item", SHOW_PASSWORD: "Show password", HIDE_PASSWORD: "Hide password" }, ATOMS: { VC_IMAGE: { LABEL: "Image" }, VC_BANNER: { SHOW_MORE: "Show more", SHOW_LESS: "Show less" }, VC_SCROLLABLE_CONTAINER: { LABEL: "Scrollable content" }, VC_VIDEO: { NO_SOURCE: "No video source" } }, MOLECULES: { VC_SELECT: { CLICK_TO_SELECT: "Click to select...", LOADING: "Loading...", LOADING_MORE: "Loading more...", NO_OPTIONS: "No options" }, VC_FILE_UPLOAD: { DRAG_HERE: "Drag and drop file here or", BROWSE: "browse your files", TAP_TO_UPLOAD: "Tap to select files", UPLOADING: "Uploading..." }, VC_INPUT: { DATE_PLACEHOLDER: "Select date", DATE_TIME_PLACEHOLDER: "Select date and time" }, VC_PAGINATION: { JUMP: "Jump to page:", LABEL: "Pagination", FIRST: "First page", PREVIOUS: "Previous page", NEXT: "Next page", LAST: "Last page", PAGE: "Page {page}" }, VC_MULTIVALUE: { ADD: "Add" }, VC_BREADCRUMBS: { BACK: "Back", LABEL: "Breadcrumb", SHOW_MORE: "Show more breadcrumbs" }, VC_COLOR_INPUT: { CLEAR: "Clear color" }, VC_DATE_PICKER: { CLEAR: "Clear date" }, VC_SLIDER: { PREVIOUS: "Previous slide", NEXT: "Next slide" }, VC_TOAST: { DISMISS: "Dismiss notification" }, VC_EDITOR: { TOOLBAR: { LABEL: "Text formatting", BOLD: "Bold", ITALIC: "Italic", UNDERLINE: "Underline", STRIKETHROUGH: "Strikethrough", HEADING_1: "Heading 1", HEADING_2: "Heading 2", HEADING_3: "Heading 3", BULLET_LIST: "Bullet list", NUMBERED_LIST: "Numbered list", BLOCKQUOTE: "Blockquote", INSERT_LINK: "Insert link", INSERT_IMAGE: "Insert image", INSERT_TABLE: "Insert table", DELETE_TABLE: "Delete table", ADD_COLUMN_BEFORE: "Add column before", ADD_COLUMN_AFTER: "Add column after", ADD_ROW_BEFORE: "Add row before", ADD_ROW_AFTER: "Add row after", DELETE_COLUMN: "Delete column", DELETE_ROW: "Delete row" }, FONT_SIZE: "Font size", VIEW: { PREVIEW: "Preview", SPLIT: "Side-by-side view", SOURCE: "Source code" } } }, ORGANISMS: { VC_DYNAMIC_PROPERTY: { ADD: "Add value", VALUE_TYPE: { COLOR: { PLACEHOLDER: "Color code", NAME: "Color name" } } }, VC_GALLERY: { INTERNAL: { VC_GALLERY_ITEM: { FULLSCREEN: "Fullscreen", EDIT: "Edit", DELETE: "Delete" }, VC_GALLERY_PREVIEW: { COPY_IMAGE_LINK: "copy image link" }, VC_GALLERY_FILMSTRIP: { PREVIOUS: "Previous images", NEXT: "Next images" } }, GALLERY_IS_EMPTY: "Gallery is empty", DROP_TO_UPLOAD: "Drop to upload", DRAG_IMAGES_HERE: "Drag images here or", BROWSE_IMAGES: "browse your files", UPLOAD: "Upload", OR_DROP_HERE: "or drop here", SHOW_ALL: "Expand ({count})", COLLAPSE: "Collapse" }, VC_APP: { NOTIFICATIONS: "Notifications", OPEN_MENU: "Open menu", CLOSE_MENU: "Close menu", INTERNAL: { VC_APP_BAR: { BACK: "Back" }, MOBILE_LAYOUT: { TAB_MENU: "Menu", TAB_HUB: "Hub" }, APP_HUB: { SEARCH_PLACEHOLDER: "Search applications and widgets", APPLICATIONS: "Applications", WIDGETS: "Widgets", NO_APPLICATIONS: "No applications found", NO_WIDGETS: "No widgets found", LIST_VIEW: "List view", TILE_VIEW: "Tile view" } } }, BLADE_NAVIGATION: { ARIA_LABEL: "Blade navigation" }, VC_BLADE: { SEE_DETAILS: "See details", UNSAVED_CHANGES: "Has unsaved changes", ERROR_POPUP: { TITLE: "Error details", COPY_ERROR: "copy content", CLOSE: "dismiss" }, MORE: "More", TOOLBAR: "Toolbar actions", CLOSE_MENU: "Close menu", PANEL: "Panel" }, VC_BLADE_HEADER: { UNSAVED_CHANGES: "Has unsaved changes", NO_CHANGES: "No unsaved changes", CLOSE: "Close", MAXIMIZE: "Maximize", RESTORE: "Restore" }, VC_TABLE: { SELECT_ROW: "Select row", SELECT_ALL_ROWS: "Select all rows", EXPAND_ROW: "Toggle row details", CURRENT_PAGE_SELECTED: "All items in this page are selected.", SELECT_ALL: "Select all items", ALL_SELECTED: "All items are selected.", ALL_SELECTED_COUNT: "All {count} items selected", SELECT_ALL_COUNT: "Select all {count} items", CANCEL: "Clear selection", ALL_ACTIONS: "All actions", MORE: "More", ALL_FILTERS: "Filters", SEARCH: "Search...", EMPTY: "List is empty.", EMPTY_TITLE: "No data", EMPTY_DESCRIPTION: "No items to display", NOT_FOUND: "Nothing found.", NOT_FOUND_TITLE: "No results found", NOT_FOUND_DESCRIPTION: "Try adjusting your search or filters", TOTALS: "Totals:", ACTIONS: "Actions", NOT_SET: "Not set", SELECTED: "Selected", SELECT_ALL_TRUNCATED: "Select all", PULL_TO_REFRESH: "Pull to refresh", RELEASE_TO_REFRESH: "Release to refresh", REFRESHING: "Refreshing...", ADD_ROW: "Add row", LOADING: "Loading...", PAGE_INFO: "Page {current} of {total}", COLUMN_FILTER: { APPLY: "Apply", CLEAR: "Clear", FROM: "From", TO: "To", TITLE: "Filter column" }, GLOBAL_FILTERS: { BUTTON: "Filters", TITLE: "Filters" }, COLUMN_SWITCHER: { BUTTON: "Columns", TITLE: "Show/Hide Columns", SHOW_ALL: "Show All", RESET: "Reset" }, OF: "of", PAGE: "Page" }, VC_POPUP: { OK: "OK", CONFIRM: "Confirm", CANCEL: "Cancel", CLOSE: "Close", TITLE: { CONFIRMATION: "Confirmation", ERROR: "Error", INFO: "Info" } } }, THEME_SELECTOR: { THEME_CHANGED: " theme", THEME_SELECTOR: "Theme" }, CHANGE_PASSWORD: { TITLE: "Change password", TITLE_FORCED: "Password expired", SUBTITLE_FORCED: "Please set a new password", FORCED: { LABEL: "Your password has expired. You must change the password to continue using the manager." }, CURRENT_PASSWORD: { LABEL: "Current password", PLACEHOLDER: "Enter password" }, NEW_PASSWORD: { LABEL: "New password", PLACEHOLDER: "Enter password" }, CONFIRM_PASSWORD: { LABEL: "Confirm password", PLACEHOLDER: "Confirm password" }, CANCEL: "Cancel", SAVE: "Update", ERRORS: { "Repeat-password": "Passwords are not same", "Equal-passwords": "The new password must not match the old one", "Invalid-token": "Token is invalid or expired", "Password-too-weak": "New password does not comply one or more password security policies:", PasswordTooShort: "Passwords too short", PasswordRequiresUniqueChars: "Passwords must use different characters", PasswordRequiresLower: "Passwords must have at least one lowercase ('a'-'z')", PasswordRequiresUpper: "Passwords must have at least one uppercase ('A'-'Z')", PasswordRequiresDigit: "Passwords must have at least one digit ('0'-'9')", PasswordRequiresNonAlphanumeric: "Passwords must have at least one non alphanumeric character", "Incorrect password.": "You entered an incorrect password", "You have used this password in the past. Choose another one.": "You have used this password in the past. Choose another one." } }, APP_HUB: { TITLE: "Applications" }, NOTIFICATION_DROPDOWN: { TITLE: "Notifications", EMPTY: "No notifications yet" }, LANGUAGE_SELECTOR: { TITLE: "Language" }, FILTERS: { APPLY: "Apply filters", RESET: "Reset" } }, la = { TITLE: "You're invited!", SUBTITLE: "Set a password for your account", FIELDS: { EMAIL: { LABEL: "Email" }, PASSWORD: { LABEL: "New password", PLACEHOLDER: "Enter password" }, CONFIRM_PASSWORD: { LABEL: "Confirm password", PLACEHOLDER: "Confirm password" } }, ACCEPT_INVITATION: "Activate", ERRORS: { "Repeat-password": "Passwords are not same", "Invalid-token": "Token is invalid or expired", "Password-too-weak": "New password does not comply one or more password security policies:", PasswordTooShort: "Passwords too short", PasswordRequiresUniqueChars: "Passwords must use different characters", PasswordRequiresLower: "Passwords must have at least one lowercase ('a'-'z')", PasswordRequiresUpper: "Passwords must have at least one uppercase ('A'-'Z')", PasswordRequiresDigit: "Passwords must have at least one digit ('0'-'9')", PasswordRequiresNonAlphanumeric: "Passwords must have at least one non alphanumeric character", recentPasswordUsed: "You have used this password in the past. Choose another one." } }, ua = { TITLE: "Welcome back", SUBTITLE: "Sign in to your account to continue", FIELDS: { LOGIN: { LABEL: "Email", PLACEHOLDER: "Enter your email" }, PASSWORD: { LABEL: "Password", PLACEHOLDER: "Enter your password" }, FORGOT_PASSWORD: { TITLE: "Forgot password", LABEL: "Email", PLACEHOLDER: "Please enter your email" } }, FORGOT_PASSWORD_BUTTON: "Forgot password?", BUTTON: "Sign in", OR: "or", FORGOT_BUTTON: "Submit", BACK_BUTTON: "Back", BUTTON_OK: "Ok", RESET_EMAIL_TEXT: "We will send you an email with instructions on how to reset your password.", RESET_EMAIL_SENT: "Email with instructions has been sent to you.", SSO_NO_PROVIDERS_ERROR: "SSO authentication is not configured. Please contact your administrator.", ERRORS: { INVALID_CREDENTIALS: "The login or password is incorrect.", AUTH_WITH_CODE: "Authentication error (code: {code}).", AUTH_GENERIC: "Authentication error: {detail}" } }, ca = { TITLE: "Reset your password", SUBTITLE: "Enter your email and we'll send you a reset link", FIELDS: { EMAIL: { LABEL: "Email", PLACEHOLDER: "Enter your email address" } }, SEND_BUTTON: "Send reset link", BACK_TO_LOGIN: "Back to sign in", SUCCESS_TITLE: "Check your email", SUCCESS_TEXT: "We sent a reset link to {email}" }, da = { TITLE: "Set new password", SUBTITLE: "Enter your new password below", FIELDS: { PASSWORD: { LABEL: "New password", PLACEHOLDER: "Enter password" }, CONFIRM_PASSWORD: { LABEL: "Confirm password", PLACEHOLDER: "Confirm password" } }, SAVE_PASSWORD: "Save", ERRORS: { "Repeat-password": "Passwords are not same", "Invalid-token": "Token is invalid or expired", "Password-too-weak": "New password does not comply one or more password security policies:", PasswordTooShort: "Passwords too short", PasswordRequiresUniqueChars: "Passwords must use different characters", PasswordRequiresLower: "Passwords must have at least one lowercase ('a'-'z')", PasswordRequiresUpper: "Passwords must have at least one uppercase ('A'-'Z')", PasswordRequiresDigit: "Passwords must have at least one digit ('0'-'9')", PasswordRequiresNonAlphanumeric: "Passwords must have at least one non alphanumeric character", recentPasswordUsed: "You have used this password in the past. Choose another one." } }, Ea = { TITLE: "Assets", TOOLBAR: { SAVE: "Save", REFRESH: "Refresh", ADD: "Add", DELETE: "Delete selected" }, EMPTY: { NO_ASSETS: "No assets", UPLOAD_ASSETS: "Drag & drop assets here or click 'Upload' button", UPLOAD: "Upload" }, TABLE: { HEADER: { IMAGE: "Img", NAME: "Name", SIZE: "Size", SORT_ORDER: "Sort order", CREATED_DATE: "Created date" }, ACTIONS: { DELETE: "Delete", EDIT: "Edit" } } }, fa = { PAGES: { DETAILS: { SUBTITLE: "Asset edit", TOOLBAR: { SAVE: "Save", DELETE: "Delete" }, FIELDS: { SIZE: "Size", CREATED_DATE: "Created date", URL: "Url", COPY: "Copy link", NAME: { TITLE: "Asset name", PLACEHOLDER: "Enter asset name" }, ALT: { TITLE: "Image alternative text", PLACEHOLDER: "Enter image alt text", TOOLTIP: "This text will be displayed in case of disabled/unloaded image on the page" }, DESCRIPTION: { TITLE: "Meta description", PLACEHOLDER: "Enter meta description" } } } } }, ga = { _default: "The {field} is not valid", alpha: "The {field} field may only contain alphabetic characters", alpha_num: "The {field} field may only contain alpha-numeric characters", alpha_dash: "The {field} field may contain alpha-numeric characters as well as dashes and underscores", alpha_spaces: "The {field} field may only contain alphabetic characters as well as spaces", between: "The {field} field must be between 0:{min} and 1:{max}", confirmed: "The {field} field confirmation does not match", digits: "The {field} field must be numeric and exactly contain 0:{length} digits", dimensions: "The {field} field must be 0:{width} pixels by 1:{height} pixels", email: "The {field} field must be a valid email", not_one_of: "The {field} field is not a valid value", ext: "The {field} field is not a valid file", image: "The {field} field must be an image", integer: "The {field} field must be an integer", length: "The {field} field must be 0:{length} long", max_value: "The {field} field must be 0:{max} or less", max: "The {field} field may not be greater than 0:{length} characters", mimes: "The {field} field must have a valid file type", min_value: "The {field} field must be 0:{min} or more", min: "The {field} field must be at least 0:{length} characters", numeric: "The {field} field may only contain numeric characters", one_of: "The {field} field is not a valid value", regex: "The {field} field format is invalid", required_if: "The {field} field is required", required: "The {field} field is required", size: "The {field} field size must be less than 0:{size}KB", url: "The {field} field is not a valid URL", min_dimensions: { error: "Image dimensions must be greater than {height}*{width}", not_image_error: "Not image file" }, file_weight: "File size must be maximum {size} kb", before: "End date must be earlier than start date", after: "End date must be later than start date", bigint: "Unsupported number" }, ma = { ACCESS_RESTRICTED: "Access restricted" }, Sa = { LOADING: "Loading Virto OZ..." }, Aa = { AGENDA: "Agenda", ALL_DAY: "All day", CANCEL: "Cancel", CLOSE: "Close", COLOR: "Color", COLOR_DEFAULT: "Default color", COLOR_CUSTOM: "Custom color", COLOR_BLUE: "Blue", COLOR_GREEN: "Green", COLOR_AMBER: "Amber", COLOR_RED: "Red", COLOR_PURPLE: "Purple", COLOR_PINK: "Pink", COLOR_TEAL: "Teal", COLOR_SLATE: "Slate", DAY: "Day", DAY_N_OF_M: "Day {n} of {total}", DELETE: "Delete", DELETE_CONFIRM_BODY: `Delete "{title}"? This can't be undone.`, DELETE_CONFIRM_TITLE: "Delete event", EDIT: "Edit", EDIT_EVENT: "Edit event", EMPTY: "No events in this range", EMPTY_HINT: "No events yet. Click a day to add one.", END: "End", LOADING: "Loading events…", MORE: "+{count} more", MORE_EVENTS: "More events", MONTH: "Month", MORE_OPTIONS: "More options", NEW_EVENT: "New event", NEXT: "Next", PREVIOUS: "Previous", RECUR_SCOPE_ALL: "All events", RECUR_SCOPE_BODY_DELETE: "This event is part of a recurring series. Do you want to delete only this event or all events in the series?", RECUR_SCOPE_BODY_EDIT: "This event is part of a recurring series. Do you want to edit only this event or all events in the series?", RECUR_SCOPE_THIS: "This event", RECUR_SCOPE_TITLE: "Recurring event", REPEAT: "Repeat", REPEAT_DAILY: "Daily", REPEAT_END: "Ends", REPEAT_END_COUNT: "After", REPEAT_END_NEVER: "Never", REPEAT_END_UNTIL: "On date", REPEAT_EVERY: "Repeat every", REPEAT_UNIT_DAYS: "day(s)", REPEAT_UNIT_WEEKS: "week(s)", REPEAT_UNIT_MONTHS: "month(s)", REPEAT_UNIT_YEARS: "year(s)", REPEAT_MONTHLY: "Monthly", REPEAT_NONE: "Does not repeat", REPEAT_OCCURRENCES: "occurrence(s)", REPEAT_ON: "Repeat on", REPEAT_WEEKLY: "Weekly", REPEAT_YEARLY: "Yearly", SAVE: "Save", START: "Start", TIMELINE: "Timeline", TIMELINE_DAY: "Timeline Day", TIMELINE_WEEK: "Timeline Week", TITLE: "Title", TODAY: "Today", WEEK: "Week", WORK_WEEK: "Work week", ZOOM_IN: "Zoom in", ZOOM_OUT: "Zoom out", EVENT_DETAILS: "Event details" }, pa = { no_options: "No options" }, No = {
1819
1819
  CORE: oa,
1820
1820
  SHELL: ra,
1821
1821
  COMPONENTS: ia,
@@ -1848,7 +1848,7 @@ Please log in again or contact the administrator for assistance.`, NETWORK_UNAVA
1848
1848
  default: No,
1849
1849
  messages: ga
1850
1850
  }, Symbol.toStringTag, { value: "Module" })), Ta = { ERRORS: { SESSION_EXPIRED: `Zugriff verweigert: Ihre Sitzung ist abgelaufen oder Sie verfügen nicht über die erforderlichen Berechtigungen.
1851
- Bitte melden Sie sich erneut an oder wenden Sie sich an den Administrator.`, NETWORK_UNAVAILABLE: "Keine Netzwerkverbindung. Bitte prüfen Sie Ihre Verbindung.", REQUEST_TIMED_OUT: "Zeitüberschreitung der Anfrage. Bitte versuchen Sie es erneut." }, THEMES: { LIGHT: "Hell", DARK: "Dunkel" }, NOTIFICATIONS: { CLEAR_ALL: "Alle löschen" } }, ha = { NAVIGATION_ARIA_LABEL: "Hauptnavigation", SIDEBAR: { SEARCH_PLACEHOLDER: "Suchbegriff" }, USER: { ROLE: { ADMINISTRATOR: "Administrator" } }, ACCOUNT: { SETTINGS: "Einstellungen", CHANGE_PASSWORD: "Passwort ändern", PROFILE: "Profil", LOGOUT: "Abmelden" } }, La = { CONTROLS: { CLEAR: "Löschen", CLEAR_ALL: "Alle löschen", CLOSE: "Schließen", TOGGLE_DROPDOWN: "Dropdown umschalten", SEARCH_OPTIONS: "Optionen suchen", SELECT_OPTION: "Option auswählen", CLEAR_SELECTION: "Auswahl aufheben", COPY_TO_CLIPBOARD: "In die Zwischenablage kopieren", DELETE_ITEM: "Element löschen", SHOW_PASSWORD: "Passwort anzeigen", HIDE_PASSWORD: "Passwort verbergen" }, ATOMS: { VC_IMAGE: { LABEL: "Bild" }, VC_BANNER: { SHOW_MORE: "Mehr anzeigen", SHOW_LESS: "Weniger anzeigen" }, VC_SCROLLABLE_CONTAINER: { LABEL: "Scrollbarer Inhalt" }, VC_VIDEO: { NO_SOURCE: "Keine Videoquelle" } }, MOLECULES: { VC_SELECT: { CLICK_TO_SELECT: "Zum Auswählen klicken...", LOADING: "Wird geladen...", LOADING_MORE: "Mehr laden...", NO_OPTIONS: "Keine Optionen" }, VC_FILE_UPLOAD: { DRAG_HERE: "Datei hier ablegen oder", BROWSE: "Dateien durchsuchen", TAP_TO_UPLOAD: "Tippen, um Dateien auszuwählen", UPLOADING: "Wird hochgeladen..." }, VC_INPUT: { DATE_PLACEHOLDER: "Datum auswählen", DATE_TIME_PLACEHOLDER: "Datum und Uhrzeit auswählen" }, VC_PAGINATION: { JUMP: "Zur Seite springen:", LABEL: "Seitennummerierung", FIRST: "Erste Seite", PREVIOUS: "Vorherige Seite", NEXT: "Nächste Seite", LAST: "Letzte Seite", PAGE: "Seite {page}" }, VC_MULTIVALUE: { ADD: "Hinzufügen" }, VC_BREADCRUMBS: { BACK: "Zurück", LABEL: "Brotkrümelnavigation", SHOW_MORE: "Weitere Brotkrümel anzeigen" }, VC_COLOR_INPUT: { CLEAR: "Farbe löschen" }, VC_DATE_PICKER: { CLEAR: "Datum löschen" }, VC_SLIDER: { PREVIOUS: "Vorherige Folie", NEXT: "Nächste Folie" }, VC_TOAST: { DISMISS: "Benachrichtigung schließen" }, VC_EDITOR: { TOOLBAR: { LABEL: "Textformatierung", BOLD: "Fett", ITALIC: "Kursiv", UNDERLINE: "Unterstrichen", STRIKETHROUGH: "Durchgestrichen", HEADING_1: "Überschrift 1", HEADING_2: "Überschrift 2", HEADING_3: "Überschrift 3", BULLET_LIST: "Aufzählungsliste", NUMBERED_LIST: "Nummerierte Liste", BLOCKQUOTE: "Blockzitat", INSERT_LINK: "Link einfügen", INSERT_IMAGE: "Bild einfügen", INSERT_TABLE: "Tabelle einfügen", DELETE_TABLE: "Tabelle löschen", ADD_COLUMN_BEFORE: "Spalte davor einfügen", ADD_COLUMN_AFTER: "Spalte danach einfügen", ADD_ROW_BEFORE: "Zeile davor einfügen", ADD_ROW_AFTER: "Zeile danach einfügen", DELETE_COLUMN: "Spalte löschen", DELETE_ROW: "Zeile löschen" }, FONT_SIZE: "Schriftgröße", VIEW: { PREVIEW: "Vorschau", SPLIT: "Nebeneinander-Ansicht", SOURCE: "Quellcode" } } }, ORGANISMS: { VC_DYNAMIC_PROPERTY: { ADD: "Wert hinzufügen", VALUE_TYPE: { COLOR: { PLACEHOLDER: "Farbcode", NAME: "Farbname" } } }, VC_GALLERY: { INTERNAL: { VC_GALLERY_ITEM: { FULLSCREEN: "Vollbild", EDIT: "Bearbeiten", DELETE: "Löschen" }, VC_GALLERY_PREVIEW: { COPY_IMAGE_LINK: "Bildlink kopieren" }, VC_GALLERY_FILMSTRIP: { PREVIOUS: "Vorherige Bilder", NEXT: "Nächste Bilder" } }, GALLERY_IS_EMPTY: "Galerie ist leer", DROP_TO_UPLOAD: "Zum Hochladen ablegen", DRAG_IMAGES_HERE: "Bilder hierher ziehen oder", BROWSE_IMAGES: "Dateien durchsuchen", UPLOAD: "Hochladen", OR_DROP_HERE: "oder hierher ziehen", SHOW_ALL: "Erweitern ({count})", COLLAPSE: "Einklappen" }, VC_APP: { NOTIFICATIONS: "Benachrichtigungen", OPEN_MENU: "Menü öffnen", CLOSE_MENU: "Menü schließen", INTERNAL: { VC_APP_BAR: { BACK: "Zurück" }, MOBILE_LAYOUT: { TAB_MENU: "Menü", TAB_HUB: "Hub" }, APP_HUB: { SEARCH_PLACEHOLDER: "Anwendungen und Widgets suchen", APPLICATIONS: "Anwendungen", WIDGETS: "Widgets", NO_APPLICATIONS: "Keine Anwendungen gefunden", NO_WIDGETS: "Keine Widgets gefunden", LIST_VIEW: "Listenansicht", TILE_VIEW: "Kachelansicht" } } }, BLADE_NAVIGATION: { ARIA_LABEL: "Blade-Navigation" }, VC_BLADE: { SEE_DETAILS: "Details anzeigen", UNSAVED_CHANGES: "Hat ungespeicherte Änderungen", ERROR_POPUP: { TITLE: "Fehlerdetails", COPY_ERROR: "Inhalt kopieren", CLOSE: "schließen" }, MORE: "Mehr", TOOLBAR: "Toolbar-Aktionen", CLOSE_MENU: "Menü schließen", PANEL: "Panel" }, VC_BLADE_HEADER: { UNSAVED_CHANGES: "Hat ungespeicherte Änderungen", NO_CHANGES: "Keine ungespeicherten Änderungen", CLOSE: "Schließen", MAXIMIZE: "Maximieren", RESTORE: "Wiederherstellen" }, VC_TABLE: { SELECT_ROW: "Zeile auswählen", SELECT_ALL_ROWS: "Alle Zeilen auswählen", EXPAND_ROW: "Zeilendetails umschalten", CURRENT_PAGE_SELECTED: "Alle Elemente auf dieser Seite sind ausgewählt.", SELECT_ALL: "Alle Elemente auswählen", ALL_SELECTED: "Alle Elemente sind ausgewählt.", ALL_SELECTED_COUNT: "Alle {count} Elemente ausgewählt", SELECT_ALL_COUNT: "Alle {count} Elemente auswählen", CANCEL: "Auswahl aufheben", ALL_ACTIONS: "Alle Aktionen", MORE: "Mehr", ALL_FILTERS: "Filter", SEARCH: "Suchen...", EMPTY: "Liste ist leer.", EMPTY_TITLE: "Keine Daten", EMPTY_DESCRIPTION: "Keine Elemente zum Anzeigen", NOT_FOUND: "Nichts gefunden.", NOT_FOUND_TITLE: "Keine Ergebnisse gefunden", NOT_FOUND_DESCRIPTION: "Passen Sie Ihre Suche oder Filter an", TOTALS: "Gesamt:", ACTIONS: "Aktionen", NOT_SET: "Nicht festgelegt", SELECTED: "Ausgewählt", SELECT_ALL_TRUNCATED: "Alle auswählen", PULL_TO_REFRESH: "Zum Aktualisieren ziehen", RELEASE_TO_REFRESH: "Zum Aktualisieren loslassen", REFRESHING: "Wird aktualisiert...", ADD_ROW: "Zeile hinzufügen", LOADING: "Wird geladen...", PAGE_INFO: "Seite {current} von {total}", COLUMN_FILTER: { APPLY: "Anwenden", CLEAR: "Löschen", FROM: "Von", TO: "Bis", TITLE: "Spalte filtern" }, GLOBAL_FILTERS: { BUTTON: "Filter", TITLE: "Filter" }, COLUMN_SWITCHER: { BUTTON: "Spalten", TITLE: "Spalten ein-/ausblenden", SHOW_ALL: "Alle anzeigen", RESET: "Zurücksetzen" }, OF: "von", PAGE: "Seite" }, VC_POPUP: { OK: "OK", CONFIRM: "Bestätigen", CANCEL: "Abbrechen", CLOSE: "Schließen", TITLE: { CONFIRMATION: "Bestätigung", ERROR: "Fehler", INFO: "Info" } } }, THEME_SELECTOR: { THEME_CHANGED: " Thema", THEME_SELECTOR: "Themen" }, CHANGE_PASSWORD: { TITLE: "Passwort ändern", TITLE_FORCED: "Passwort abgelaufen", SUBTITLE_FORCED: "Bitte legen Sie ein neues Passwort fest", FORCED: { LABEL: "Ihr Passwort ist abgelaufen. Sie müssen das Passwort ändern, um den Manager weiter zu nutzen." }, CURRENT_PASSWORD: { LABEL: "Aktuelles Passwort", PLACEHOLDER: "Passwort eingeben" }, NEW_PASSWORD: { LABEL: "Neues Passwort", PLACEHOLDER: "Passwort eingeben" }, CONFIRM_PASSWORD: { LABEL: "Passwort bestätigen", PLACEHOLDER: "Passwort bestätigen" }, CANCEL: "Abbrechen", SAVE: "Aktualisieren", ERRORS: { "Repeat-password": "Passwörter stimmen nicht überein", "Equal-passwords": "Das neue Passwort darf nicht mit dem alten übereinstimmen", "Invalid-token": "Token ist ungültig oder abgelaufen", "Password-too-weak": "Neues Passwort erfüllt eine oder mehrere Passwort-Sicherheitsrichtlinien nicht:", PasswordTooShort: "Passwort zu kurz", PasswordRequiresUniqueChars: "Passwörter müssen unterschiedliche Zeichen verwenden", PasswordRequiresLower: "Passwörter müssen mindestens einen Kleinbuchstaben enthalten ('a'-'z')", PasswordRequiresUpper: "Passwörter müssen mindestens einen Großbuchstaben enthalten ('A'-'Z')", PasswordRequiresDigit: "Passwörter müssen mindestens eine Ziffer enthalten ('0'-'9')", PasswordRequiresNonAlphanumeric: "Passwörter müssen mindestens ein nicht-alphanumerisches Zeichen enthalten", "Incorrect password.": "Sie haben ein falsches Passwort eingegeben", "You have used this password in the past. Choose another one.": "Sie haben dieses Passwort in der Vergangenheit verwendet. Wählen Sie ein anderes." } }, APP_HUB: { TITLE: "Anwendungen" }, NOTIFICATION_DROPDOWN: { TITLE: "Benachrichtigungen", EMPTY: "Noch keine Benachrichtigungen" }, LANGUAGE_SELECTOR: { TITLE: "Sprache" }, FILTERS: { APPLY: "Filter anwenden", RESET: "Zurücksetzen" } }, Oa = { TITLE: "Sie sind eingeladen!", SUBTITLE: "Legen Sie ein Passwort für Ihr Konto fest", FIELDS: { EMAIL: { LABEL: "E-Mail" }, PASSWORD: { LABEL: "Neues Passwort", PLACEHOLDER: "Passwort eingeben" }, CONFIRM_PASSWORD: { LABEL: "Passwort bestätigen", PLACEHOLDER: "Passwort bestätigen" } }, ACCEPT_INVITATION: "Aktivieren", ERRORS: { "Repeat-password": "Passwörter stimmen nicht überein", "Invalid-token": "Token ist ungültig oder abgelaufen", "Password-too-weak": "Neues Passwort erfüllt eine oder mehrere Passwort-Sicherheitsrichtlinien nicht:", PasswordTooShort: "Passwort zu kurz", PasswordRequiresUniqueChars: "Passwörter müssen unterschiedliche Zeichen verwenden", PasswordRequiresLower: "Passwörter müssen mindestens einen Kleinbuchstaben enthalten ('a'-'z')", PasswordRequiresUpper: "Passwörter müssen mindestens einen Großbuchstaben enthalten ('A'-'Z')", PasswordRequiresDigit: "Passwörter müssen mindestens eine Ziffer enthalten ('0'-'9')", PasswordRequiresNonAlphanumeric: "Passwörter müssen mindestens ein nicht-alphanumerisches Zeichen enthalten", recentPasswordUsed: "Sie haben dieses Passwort in der Vergangenheit verwendet. Wählen Sie ein anderes." } }, Ra = { TITLE: "Willkommen zurück", SUBTITLE: "Melden Sie sich bei Ihrem Konto an, um fortzufahren", FIELDS: { LOGIN: { LABEL: "E-Mail", PLACEHOLDER: "Geben Sie Ihre E-Mail-Adresse ein" }, PASSWORD: { LABEL: "Passwort", PLACEHOLDER: "Geben Sie Ihr Passwort ein" }, FORGOT_PASSWORD: { TITLE: "Passwort vergessen", LABEL: "E-Mail", PLACEHOLDER: "Bitte geben Sie Ihre E-Mail-Adresse ein" } }, FORGOT_PASSWORD_BUTTON: "Passwort vergessen?", BUTTON: "Anmelden", OR: "oder", FORGOT_BUTTON: "Absenden", BACK_BUTTON: "Zurück", BUTTON_OK: "Ok", RESET_EMAIL_TEXT: "Wir senden Ihnen eine E-Mail mit Anweisungen zum Zurücksetzen Ihres Passworts.", RESET_EMAIL_SENT: "Eine E-Mail mit Anweisungen wurde an Sie gesendet.", SSO_NO_PROVIDERS_ERROR: "SSO-Authentifizierung ist nicht konfiguriert. Bitte wenden Sie sich an Ihren Administrator.", ERRORS: { INVALID_CREDENTIALS: "Anmeldename oder Passwort ist falsch.", AUTH_WITH_CODE: "Authentifizierungsfehler (Code: {code}).", AUTH_GENERIC: "Authentifizierungsfehler: {detail}" } }, _a = { TITLE: "Passwort zurücksetzen", SUBTITLE: "Geben Sie Ihre E-Mail-Adresse ein und wir senden Ihnen einen Link zum Zurücksetzen", FIELDS: { EMAIL: { LABEL: "E-Mail", PLACEHOLDER: "Geben Sie Ihre E-Mail-Adresse ein" } }, SEND_BUTTON: "Link zum Zurücksetzen senden", BACK_TO_LOGIN: "Zurück zur Anmeldung", SUCCESS_TITLE: "Überprüfen Sie Ihre E-Mail", SUCCESS_TEXT: "Wir haben einen Link zum Zurücksetzen an {email} gesendet" }, Ia = { TITLE: "Neues Passwort festlegen", SUBTITLE: "Geben Sie unten Ihr neues Passwort ein", FIELDS: { PASSWORD: { LABEL: "Neues Passwort", PLACEHOLDER: "Passwort eingeben" }, CONFIRM_PASSWORD: { LABEL: "Passwort bestätigen", PLACEHOLDER: "Passwort bestätigen" } }, SAVE_PASSWORD: "Speichern", ERRORS: { "Repeat-password": "Passwörter stimmen nicht überein", "Invalid-token": "Token ist ungültig oder abgelaufen", "Password-too-weak": "Neues Passwort erfüllt eine oder mehrere Passwort-Sicherheitsrichtlinien nicht:", PasswordTooShort: "Passwort zu kurz", PasswordRequiresUniqueChars: "Passwörter müssen unterschiedliche Zeichen verwenden", PasswordRequiresLower: "Passwörter müssen mindestens einen Kleinbuchstaben enthalten ('a'-'z')", PasswordRequiresUpper: "Passwörter müssen mindestens einen Großbuchstaben enthalten ('A'-'Z')", PasswordRequiresDigit: "Passwörter müssen mindestens eine Ziffer enthalten ('0'-'9')", PasswordRequiresNonAlphanumeric: "Passwörter müssen mindestens ein nicht-alphanumerisches Zeichen enthalten", recentPasswordUsed: "Sie haben dieses Passwort in der Vergangenheit verwendet. Wählen Sie ein anderes." } }, va = { TITLE: "Assets", TOOLBAR: { SAVE: "Speichern", REFRESH: "Aktualisieren", ADD: "Hinzufügen", DELETE: "Ausgewählte löschen" }, EMPTY: { NO_ASSETS: "Keine Assets", UPLOAD_ASSETS: "Assets hier ablegen oder auf 'Hochladen' klicken", UPLOAD: "Hochladen" }, TABLE: { HEADER: { IMAGE: "Bild", NAME: "Name", SIZE: "Größe", SORT_ORDER: "Sortierreihenfolge", CREATED_DATE: "Erstellungsdatum" }, ACTIONS: { DELETE: "Löschen", EDIT: "Bearbeiten" } } }, wa = { PAGES: { DETAILS: { SUBTITLE: "Asset bearbeiten", TOOLBAR: { SAVE: "Speichern", DELETE: "Löschen" }, FIELDS: { SIZE: "Größe", CREATED_DATE: "Erstellungsdatum", URL: "URL", COPY: "Link kopieren", NAME: { TITLE: "Asset-Name", PLACEHOLDER: "Asset-Namen eingeben" }, ALT: { TITLE: "Alternativer Bildtext", PLACEHOLDER: "Alternativen Bildtext eingeben", TOOLTIP: "Dieser Text wird angezeigt, wenn das Bild auf der Seite deaktiviert oder nicht geladen ist" }, DESCRIPTION: { TITLE: "Meta-Beschreibung", PLACEHOLDER: "Meta-Beschreibung eingeben" } } } } }, Ca = { _default: "Das Feld {field} ist ungültig", alpha: "Das Feld {field} darf nur alphabetische Zeichen enthalten", alpha_num: "Das Feld {field} darf nur alphanumerische Zeichen enthalten", alpha_dash: "Das Feld {field} darf alphanumerische Zeichen sowie Bindestriche und Unterstriche enthalten", alpha_spaces: "Das Feld {field} darf nur alphabetische Zeichen und Leerzeichen enthalten", between: "Das Feld {field} muss zwischen 0:{min} und 1:{max} liegen", confirmed: "Die Bestätigung des Feldes {field} stimmt nicht überein", digits: "Das Feld {field} muss numerisch sein und genau 0:{length} Ziffern enthalten", dimensions: "Das Feld {field} muss 0:{width} Pixel breit und 1:{height} Pixel hoch sein", email: "Das Feld {field} muss eine gültige E-Mail-Adresse sein", not_one_of: "Das Feld {field} hat keinen gültigen Wert", ext: "Das Feld {field} ist keine gültige Datei", image: "Das Feld {field} muss ein Bild sein", integer: "Das Feld {field} muss eine ganze Zahl sein", length: "Das Feld {field} muss 0:{length} lang sein", max_value: "Das Feld {field} muss 0:{max} oder weniger sein", max: "Das Feld {field} darf nicht länger als 0:{length} Zeichen sein", mimes: "Das Feld {field} muss einen gültigen Dateityp haben", min_value: "Das Feld {field} muss 0:{min} oder mehr sein", min: "Das Feld {field} muss mindestens 0:{length} Zeichen lang sein", numeric: "Das Feld {field} darf nur numerische Zeichen enthalten", one_of: "Das Feld {field} hat keinen gültigen Wert", regex: "Das Format des Feldes {field} ist ungültig", required_if: "Das Feld {field} ist erforderlich", required: "Das Feld {field} ist erforderlich", size: "Die Größe des Feldes {field} muss kleiner als 0:{size}KB sein", url: "Das Feld {field} ist keine gültige URL", min_dimensions: { error: "Die Bildabmessungen müssen größer als {height}*{width} sein", not_image_error: "Keine Bilddatei" }, file_weight: "Die Dateigröße darf maximal {size} kb betragen", before: "Das Enddatum muss früher als das Startdatum sein", after: "Das Enddatum muss später als das Startdatum sein", bigint: "Nicht unterstützte Zahl" }, ba = { ACCESS_RESTRICTED: "Zugriff eingeschränkt" }, Pa = { LOADING: "Virto OZ wird geladen..." }, Na = { AGENDA: "Ereignisliste", ALL_DAY: "Ganztägig", CANCEL: "Abbrechen", CLOSE: "Schließen", COLOR: "Farbe", COLOR_DEFAULT: "Standardfarbe", COLOR_CUSTOM: "Eigene Farbe", COLOR_BLUE: "Blau", COLOR_GREEN: "Grün", COLOR_AMBER: "Gelb", COLOR_RED: "Rot", COLOR_PURPLE: "Violett", COLOR_PINK: "Rosa", COLOR_TEAL: "Türkis", COLOR_SLATE: "Grau", DAY: "Tag", DAY_N_OF_M: "Tag {n} von {total}", DELETE: "Löschen", DELETE_CONFIRM_BODY: '"{title}" löschen? Dies kann nicht rückgängig gemacht werden.', DELETE_CONFIRM_TITLE: "Ereignis löschen", EDIT: "Bearbeiten", EDIT_EVENT: "Ereignis bearbeiten", EMPTY: "Keine Ereignisse in diesem Zeitraum", EMPTY_HINT: "Noch keine Ereignisse. Klicke auf einen Tag, um eins hinzuzufügen.", END: "Ende", LOADING: "Ereignisse werden geladen…", MORE: "+{count} weitere", MORE_EVENTS: "Weitere Ereignisse", MONTH: "Monat", MORE_OPTIONS: "Weitere Optionen", NEW_EVENT: "Neues Ereignis", NEXT: "Nächster Zeitraum", PREVIOUS: "Vorheriger Zeitraum", RECUR_SCOPE_ALL: "Alle Ereignisse", RECUR_SCOPE_BODY_DELETE: "Dieses Ereignis ist Teil einer wiederkehrenden Serie. Möchten Sie nur dieses Ereignis oder alle Ereignisse der Serie löschen?", RECUR_SCOPE_BODY_EDIT: "Dieses Ereignis ist Teil einer wiederkehrenden Serie. Möchten Sie nur dieses Ereignis oder alle Ereignisse der Serie bearbeiten?", RECUR_SCOPE_THIS: "Dieses Ereignis", RECUR_SCOPE_TITLE: "Wiederkehrendes Ereignis", REPEAT: "Wiederholen", REPEAT_DAILY: "Täglich", REPEAT_END: "Endet", REPEAT_END_COUNT: "Nach", REPEAT_END_NEVER: "Nie", REPEAT_END_UNTIL: "Am Datum", REPEAT_EVERY: "Wiederholen alle", REPEAT_UNIT_DAYS: "Tag(e)", REPEAT_UNIT_WEEKS: "Woche(n)", REPEAT_UNIT_MONTHS: "Monat(e)", REPEAT_UNIT_YEARS: "Jahr(e)", REPEAT_MONTHLY: "Monatlich", REPEAT_NONE: "Keine Wiederholung", REPEAT_OCCURRENCES: "Vorkommen", REPEAT_ON: "Wiederholen am", REPEAT_WEEKLY: "Wöchentlich", REPEAT_YEARLY: "Jährlich", SAVE: "Speichern", START: "Beginn", TIMELINE: "Zeitachse", TIMELINE_DAY: "Zeitachse Tag", TIMELINE_WEEK: "Zeitachse Woche", TITLE: "Titel", TODAY: "Heute", WEEK: "Woche", WORK_WEEK: "Arbeitswoche", ZOOM_IN: "Vergrößern", ZOOM_OUT: "Verkleinern" }, Da = { no_options: "Keine Optionen" }, yo = {
1851
+ Bitte melden Sie sich erneut an oder wenden Sie sich an den Administrator.`, NETWORK_UNAVAILABLE: "Keine Netzwerkverbindung. Bitte prüfen Sie Ihre Verbindung.", REQUEST_TIMED_OUT: "Zeitüberschreitung der Anfrage. Bitte versuchen Sie es erneut." }, THEMES: { LIGHT: "Hell", DARK: "Dunkel" }, NOTIFICATIONS: { CLEAR_ALL: "Alle löschen" } }, ha = { NAVIGATION_ARIA_LABEL: "Hauptnavigation", SIDEBAR: { SEARCH_PLACEHOLDER: "Suchbegriff" }, USER: { ROLE: { ADMINISTRATOR: "Administrator" } }, ACCOUNT: { SETTINGS: "Einstellungen", CHANGE_PASSWORD: "Passwort ändern", PROFILE: "Profil", LOGOUT: "Abmelden" } }, La = { CONTROLS: { CLEAR: "Löschen", CLEAR_ALL: "Alle löschen", CLOSE: "Schließen", TOGGLE_DROPDOWN: "Dropdown umschalten", SEARCH_OPTIONS: "Optionen suchen", SELECT_OPTION: "Option auswählen", CLEAR_SELECTION: "Auswahl aufheben", COPY_TO_CLIPBOARD: "In die Zwischenablage kopieren", DELETE_ITEM: "Element löschen", SHOW_PASSWORD: "Passwort anzeigen", HIDE_PASSWORD: "Passwort verbergen" }, ATOMS: { VC_IMAGE: { LABEL: "Bild" }, VC_BANNER: { SHOW_MORE: "Mehr anzeigen", SHOW_LESS: "Weniger anzeigen" }, VC_SCROLLABLE_CONTAINER: { LABEL: "Scrollbarer Inhalt" }, VC_VIDEO: { NO_SOURCE: "Keine Videoquelle" } }, MOLECULES: { VC_SELECT: { CLICK_TO_SELECT: "Zum Auswählen klicken...", LOADING: "Wird geladen...", LOADING_MORE: "Mehr laden...", NO_OPTIONS: "Keine Optionen" }, VC_FILE_UPLOAD: { DRAG_HERE: "Datei hier ablegen oder", BROWSE: "Dateien durchsuchen", TAP_TO_UPLOAD: "Tippen, um Dateien auszuwählen", UPLOADING: "Wird hochgeladen..." }, VC_INPUT: { DATE_PLACEHOLDER: "Datum auswählen", DATE_TIME_PLACEHOLDER: "Datum und Uhrzeit auswählen" }, VC_PAGINATION: { JUMP: "Zur Seite springen:", LABEL: "Seitennummerierung", FIRST: "Erste Seite", PREVIOUS: "Vorherige Seite", NEXT: "Nächste Seite", LAST: "Letzte Seite", PAGE: "Seite {page}" }, VC_MULTIVALUE: { ADD: "Hinzufügen" }, VC_BREADCRUMBS: { BACK: "Zurück", LABEL: "Brotkrümelnavigation", SHOW_MORE: "Weitere Brotkrümel anzeigen" }, VC_COLOR_INPUT: { CLEAR: "Farbe löschen" }, VC_DATE_PICKER: { CLEAR: "Datum löschen" }, VC_SLIDER: { PREVIOUS: "Vorherige Folie", NEXT: "Nächste Folie" }, VC_TOAST: { DISMISS: "Benachrichtigung schließen" }, VC_EDITOR: { TOOLBAR: { LABEL: "Textformatierung", BOLD: "Fett", ITALIC: "Kursiv", UNDERLINE: "Unterstrichen", STRIKETHROUGH: "Durchgestrichen", HEADING_1: "Überschrift 1", HEADING_2: "Überschrift 2", HEADING_3: "Überschrift 3", BULLET_LIST: "Aufzählungsliste", NUMBERED_LIST: "Nummerierte Liste", BLOCKQUOTE: "Blockzitat", INSERT_LINK: "Link einfügen", INSERT_IMAGE: "Bild einfügen", INSERT_TABLE: "Tabelle einfügen", DELETE_TABLE: "Tabelle löschen", ADD_COLUMN_BEFORE: "Spalte davor einfügen", ADD_COLUMN_AFTER: "Spalte danach einfügen", ADD_ROW_BEFORE: "Zeile davor einfügen", ADD_ROW_AFTER: "Zeile danach einfügen", DELETE_COLUMN: "Spalte löschen", DELETE_ROW: "Zeile löschen" }, FONT_SIZE: "Schriftgröße", VIEW: { PREVIEW: "Vorschau", SPLIT: "Nebeneinander-Ansicht", SOURCE: "Quellcode" } } }, ORGANISMS: { VC_DYNAMIC_PROPERTY: { ADD: "Wert hinzufügen", VALUE_TYPE: { COLOR: { PLACEHOLDER: "Farbcode", NAME: "Farbname" } } }, VC_GALLERY: { INTERNAL: { VC_GALLERY_ITEM: { FULLSCREEN: "Vollbild", EDIT: "Bearbeiten", DELETE: "Löschen" }, VC_GALLERY_PREVIEW: { COPY_IMAGE_LINK: "Bildlink kopieren" }, VC_GALLERY_FILMSTRIP: { PREVIOUS: "Vorherige Bilder", NEXT: "Nächste Bilder" } }, GALLERY_IS_EMPTY: "Galerie ist leer", DROP_TO_UPLOAD: "Zum Hochladen ablegen", DRAG_IMAGES_HERE: "Bilder hierher ziehen oder", BROWSE_IMAGES: "Dateien durchsuchen", UPLOAD: "Hochladen", OR_DROP_HERE: "oder hierher ziehen", SHOW_ALL: "Erweitern ({count})", COLLAPSE: "Einklappen" }, VC_APP: { NOTIFICATIONS: "Benachrichtigungen", OPEN_MENU: "Menü öffnen", CLOSE_MENU: "Menü schließen", INTERNAL: { VC_APP_BAR: { BACK: "Zurück" }, MOBILE_LAYOUT: { TAB_MENU: "Menü", TAB_HUB: "Hub" }, APP_HUB: { SEARCH_PLACEHOLDER: "Anwendungen und Widgets suchen", APPLICATIONS: "Anwendungen", WIDGETS: "Widgets", NO_APPLICATIONS: "Keine Anwendungen gefunden", NO_WIDGETS: "Keine Widgets gefunden", LIST_VIEW: "Listenansicht", TILE_VIEW: "Kachelansicht" } } }, BLADE_NAVIGATION: { ARIA_LABEL: "Blade-Navigation" }, VC_BLADE: { SEE_DETAILS: "Details anzeigen", UNSAVED_CHANGES: "Hat ungespeicherte Änderungen", ERROR_POPUP: { TITLE: "Fehlerdetails", COPY_ERROR: "Inhalt kopieren", CLOSE: "schließen" }, MORE: "Mehr", TOOLBAR: "Toolbar-Aktionen", CLOSE_MENU: "Menü schließen", PANEL: "Panel" }, VC_BLADE_HEADER: { UNSAVED_CHANGES: "Hat ungespeicherte Änderungen", NO_CHANGES: "Keine ungespeicherten Änderungen", CLOSE: "Schließen", MAXIMIZE: "Maximieren", RESTORE: "Wiederherstellen" }, VC_TABLE: { SELECT_ROW: "Zeile auswählen", SELECT_ALL_ROWS: "Alle Zeilen auswählen", EXPAND_ROW: "Zeilendetails umschalten", CURRENT_PAGE_SELECTED: "Alle Elemente auf dieser Seite sind ausgewählt.", SELECT_ALL: "Alle Elemente auswählen", ALL_SELECTED: "Alle Elemente sind ausgewählt.", ALL_SELECTED_COUNT: "Alle {count} Elemente ausgewählt", SELECT_ALL_COUNT: "Alle {count} Elemente auswählen", CANCEL: "Auswahl aufheben", ALL_ACTIONS: "Alle Aktionen", MORE: "Mehr", ALL_FILTERS: "Filter", SEARCH: "Suchen...", EMPTY: "Liste ist leer.", EMPTY_TITLE: "Keine Daten", EMPTY_DESCRIPTION: "Keine Elemente zum Anzeigen", NOT_FOUND: "Nichts gefunden.", NOT_FOUND_TITLE: "Keine Ergebnisse gefunden", NOT_FOUND_DESCRIPTION: "Passen Sie Ihre Suche oder Filter an", TOTALS: "Gesamt:", ACTIONS: "Aktionen", NOT_SET: "Nicht festgelegt", SELECTED: "Ausgewählt", SELECT_ALL_TRUNCATED: "Alle auswählen", PULL_TO_REFRESH: "Zum Aktualisieren ziehen", RELEASE_TO_REFRESH: "Zum Aktualisieren loslassen", REFRESHING: "Wird aktualisiert...", ADD_ROW: "Zeile hinzufügen", LOADING: "Wird geladen...", PAGE_INFO: "Seite {current} von {total}", COLUMN_FILTER: { APPLY: "Anwenden", CLEAR: "Löschen", FROM: "Von", TO: "Bis", TITLE: "Spalte filtern" }, GLOBAL_FILTERS: { BUTTON: "Filter", TITLE: "Filter" }, COLUMN_SWITCHER: { BUTTON: "Spalten", TITLE: "Spalten ein-/ausblenden", SHOW_ALL: "Alle anzeigen", RESET: "Zurücksetzen" }, OF: "von", PAGE: "Seite" }, VC_POPUP: { OK: "OK", CONFIRM: "Bestätigen", CANCEL: "Abbrechen", CLOSE: "Schließen", TITLE: { CONFIRMATION: "Bestätigung", ERROR: "Fehler", INFO: "Info" } } }, THEME_SELECTOR: { THEME_CHANGED: " Thema", THEME_SELECTOR: "Themen" }, CHANGE_PASSWORD: { TITLE: "Passwort ändern", TITLE_FORCED: "Passwort abgelaufen", SUBTITLE_FORCED: "Bitte legen Sie ein neues Passwort fest", FORCED: { LABEL: "Ihr Passwort ist abgelaufen. Sie müssen das Passwort ändern, um den Manager weiter zu nutzen." }, CURRENT_PASSWORD: { LABEL: "Aktuelles Passwort", PLACEHOLDER: "Passwort eingeben" }, NEW_PASSWORD: { LABEL: "Neues Passwort", PLACEHOLDER: "Passwort eingeben" }, CONFIRM_PASSWORD: { LABEL: "Passwort bestätigen", PLACEHOLDER: "Passwort bestätigen" }, CANCEL: "Abbrechen", SAVE: "Aktualisieren", ERRORS: { "Repeat-password": "Passwörter stimmen nicht überein", "Equal-passwords": "Das neue Passwort darf nicht mit dem alten übereinstimmen", "Invalid-token": "Token ist ungültig oder abgelaufen", "Password-too-weak": "Neues Passwort erfüllt eine oder mehrere Passwort-Sicherheitsrichtlinien nicht:", PasswordTooShort: "Passwort zu kurz", PasswordRequiresUniqueChars: "Passwörter müssen unterschiedliche Zeichen verwenden", PasswordRequiresLower: "Passwörter müssen mindestens einen Kleinbuchstaben enthalten ('a'-'z')", PasswordRequiresUpper: "Passwörter müssen mindestens einen Großbuchstaben enthalten ('A'-'Z')", PasswordRequiresDigit: "Passwörter müssen mindestens eine Ziffer enthalten ('0'-'9')", PasswordRequiresNonAlphanumeric: "Passwörter müssen mindestens ein nicht-alphanumerisches Zeichen enthalten", "Incorrect password.": "Sie haben ein falsches Passwort eingegeben", "You have used this password in the past. Choose another one.": "Sie haben dieses Passwort in der Vergangenheit verwendet. Wählen Sie ein anderes." } }, APP_HUB: { TITLE: "Anwendungen" }, NOTIFICATION_DROPDOWN: { TITLE: "Benachrichtigungen", EMPTY: "Noch keine Benachrichtigungen" }, LANGUAGE_SELECTOR: { TITLE: "Sprache" }, FILTERS: { APPLY: "Filter anwenden", RESET: "Zurücksetzen" } }, Oa = { TITLE: "Sie sind eingeladen!", SUBTITLE: "Legen Sie ein Passwort für Ihr Konto fest", FIELDS: { EMAIL: { LABEL: "E-Mail" }, PASSWORD: { LABEL: "Neues Passwort", PLACEHOLDER: "Passwort eingeben" }, CONFIRM_PASSWORD: { LABEL: "Passwort bestätigen", PLACEHOLDER: "Passwort bestätigen" } }, ACCEPT_INVITATION: "Aktivieren", ERRORS: { "Repeat-password": "Passwörter stimmen nicht überein", "Invalid-token": "Token ist ungültig oder abgelaufen", "Password-too-weak": "Neues Passwort erfüllt eine oder mehrere Passwort-Sicherheitsrichtlinien nicht:", PasswordTooShort: "Passwort zu kurz", PasswordRequiresUniqueChars: "Passwörter müssen unterschiedliche Zeichen verwenden", PasswordRequiresLower: "Passwörter müssen mindestens einen Kleinbuchstaben enthalten ('a'-'z')", PasswordRequiresUpper: "Passwörter müssen mindestens einen Großbuchstaben enthalten ('A'-'Z')", PasswordRequiresDigit: "Passwörter müssen mindestens eine Ziffer enthalten ('0'-'9')", PasswordRequiresNonAlphanumeric: "Passwörter müssen mindestens ein nicht-alphanumerisches Zeichen enthalten", recentPasswordUsed: "Sie haben dieses Passwort in der Vergangenheit verwendet. Wählen Sie ein anderes." } }, Ra = { TITLE: "Willkommen zurück", SUBTITLE: "Melden Sie sich bei Ihrem Konto an, um fortzufahren", FIELDS: { LOGIN: { LABEL: "E-Mail", PLACEHOLDER: "Geben Sie Ihre E-Mail-Adresse ein" }, PASSWORD: { LABEL: "Passwort", PLACEHOLDER: "Geben Sie Ihr Passwort ein" }, FORGOT_PASSWORD: { TITLE: "Passwort vergessen", LABEL: "E-Mail", PLACEHOLDER: "Bitte geben Sie Ihre E-Mail-Adresse ein" } }, FORGOT_PASSWORD_BUTTON: "Passwort vergessen?", BUTTON: "Anmelden", OR: "oder", FORGOT_BUTTON: "Absenden", BACK_BUTTON: "Zurück", BUTTON_OK: "Ok", RESET_EMAIL_TEXT: "Wir senden Ihnen eine E-Mail mit Anweisungen zum Zurücksetzen Ihres Passworts.", RESET_EMAIL_SENT: "Eine E-Mail mit Anweisungen wurde an Sie gesendet.", SSO_NO_PROVIDERS_ERROR: "SSO-Authentifizierung ist nicht konfiguriert. Bitte wenden Sie sich an Ihren Administrator.", ERRORS: { INVALID_CREDENTIALS: "Anmeldename oder Passwort ist falsch.", AUTH_WITH_CODE: "Authentifizierungsfehler (Code: {code}).", AUTH_GENERIC: "Authentifizierungsfehler: {detail}" } }, _a = { TITLE: "Passwort zurücksetzen", SUBTITLE: "Geben Sie Ihre E-Mail-Adresse ein und wir senden Ihnen einen Link zum Zurücksetzen", FIELDS: { EMAIL: { LABEL: "E-Mail", PLACEHOLDER: "Geben Sie Ihre E-Mail-Adresse ein" } }, SEND_BUTTON: "Link zum Zurücksetzen senden", BACK_TO_LOGIN: "Zurück zur Anmeldung", SUCCESS_TITLE: "Überprüfen Sie Ihre E-Mail", SUCCESS_TEXT: "Wir haben einen Link zum Zurücksetzen an {email} gesendet" }, Ia = { TITLE: "Neues Passwort festlegen", SUBTITLE: "Geben Sie unten Ihr neues Passwort ein", FIELDS: { PASSWORD: { LABEL: "Neues Passwort", PLACEHOLDER: "Passwort eingeben" }, CONFIRM_PASSWORD: { LABEL: "Passwort bestätigen", PLACEHOLDER: "Passwort bestätigen" } }, SAVE_PASSWORD: "Speichern", ERRORS: { "Repeat-password": "Passwörter stimmen nicht überein", "Invalid-token": "Token ist ungültig oder abgelaufen", "Password-too-weak": "Neues Passwort erfüllt eine oder mehrere Passwort-Sicherheitsrichtlinien nicht:", PasswordTooShort: "Passwort zu kurz", PasswordRequiresUniqueChars: "Passwörter müssen unterschiedliche Zeichen verwenden", PasswordRequiresLower: "Passwörter müssen mindestens einen Kleinbuchstaben enthalten ('a'-'z')", PasswordRequiresUpper: "Passwörter müssen mindestens einen Großbuchstaben enthalten ('A'-'Z')", PasswordRequiresDigit: "Passwörter müssen mindestens eine Ziffer enthalten ('0'-'9')", PasswordRequiresNonAlphanumeric: "Passwörter müssen mindestens ein nicht-alphanumerisches Zeichen enthalten", recentPasswordUsed: "Sie haben dieses Passwort in der Vergangenheit verwendet. Wählen Sie ein anderes." } }, va = { TITLE: "Assets", TOOLBAR: { SAVE: "Speichern", REFRESH: "Aktualisieren", ADD: "Hinzufügen", DELETE: "Ausgewählte löschen" }, EMPTY: { NO_ASSETS: "Keine Assets", UPLOAD_ASSETS: "Assets hier ablegen oder auf 'Hochladen' klicken", UPLOAD: "Hochladen" }, TABLE: { HEADER: { IMAGE: "Bild", NAME: "Name", SIZE: "Größe", SORT_ORDER: "Sortierreihenfolge", CREATED_DATE: "Erstellungsdatum" }, ACTIONS: { DELETE: "Löschen", EDIT: "Bearbeiten" } } }, wa = { PAGES: { DETAILS: { SUBTITLE: "Asset bearbeiten", TOOLBAR: { SAVE: "Speichern", DELETE: "Löschen" }, FIELDS: { SIZE: "Größe", CREATED_DATE: "Erstellungsdatum", URL: "URL", COPY: "Link kopieren", NAME: { TITLE: "Asset-Name", PLACEHOLDER: "Asset-Namen eingeben" }, ALT: { TITLE: "Alternativer Bildtext", PLACEHOLDER: "Alternativen Bildtext eingeben", TOOLTIP: "Dieser Text wird angezeigt, wenn das Bild auf der Seite deaktiviert oder nicht geladen ist" }, DESCRIPTION: { TITLE: "Meta-Beschreibung", PLACEHOLDER: "Meta-Beschreibung eingeben" } } } } }, Ca = { _default: "Das Feld {field} ist ungültig", alpha: "Das Feld {field} darf nur alphabetische Zeichen enthalten", alpha_num: "Das Feld {field} darf nur alphanumerische Zeichen enthalten", alpha_dash: "Das Feld {field} darf alphanumerische Zeichen sowie Bindestriche und Unterstriche enthalten", alpha_spaces: "Das Feld {field} darf nur alphabetische Zeichen und Leerzeichen enthalten", between: "Das Feld {field} muss zwischen 0:{min} und 1:{max} liegen", confirmed: "Die Bestätigung des Feldes {field} stimmt nicht überein", digits: "Das Feld {field} muss numerisch sein und genau 0:{length} Ziffern enthalten", dimensions: "Das Feld {field} muss 0:{width} Pixel breit und 1:{height} Pixel hoch sein", email: "Das Feld {field} muss eine gültige E-Mail-Adresse sein", not_one_of: "Das Feld {field} hat keinen gültigen Wert", ext: "Das Feld {field} ist keine gültige Datei", image: "Das Feld {field} muss ein Bild sein", integer: "Das Feld {field} muss eine ganze Zahl sein", length: "Das Feld {field} muss 0:{length} lang sein", max_value: "Das Feld {field} muss 0:{max} oder weniger sein", max: "Das Feld {field} darf nicht länger als 0:{length} Zeichen sein", mimes: "Das Feld {field} muss einen gültigen Dateityp haben", min_value: "Das Feld {field} muss 0:{min} oder mehr sein", min: "Das Feld {field} muss mindestens 0:{length} Zeichen lang sein", numeric: "Das Feld {field} darf nur numerische Zeichen enthalten", one_of: "Das Feld {field} hat keinen gültigen Wert", regex: "Das Format des Feldes {field} ist ungültig", required_if: "Das Feld {field} ist erforderlich", required: "Das Feld {field} ist erforderlich", size: "Die Größe des Feldes {field} muss kleiner als 0:{size}KB sein", url: "Das Feld {field} ist keine gültige URL", min_dimensions: { error: "Die Bildabmessungen müssen größer als {height}*{width} sein", not_image_error: "Keine Bilddatei" }, file_weight: "Die Dateigröße darf maximal {size} kb betragen", before: "Das Enddatum muss früher als das Startdatum sein", after: "Das Enddatum muss später als das Startdatum sein", bigint: "Nicht unterstützte Zahl" }, ba = { ACCESS_RESTRICTED: "Zugriff eingeschränkt" }, Pa = { LOADING: "Virto OZ wird geladen..." }, Na = { AGENDA: "Ereignisliste", ALL_DAY: "Ganztägig", CANCEL: "Abbrechen", CLOSE: "Schließen", COLOR: "Farbe", COLOR_DEFAULT: "Standardfarbe", COLOR_CUSTOM: "Eigene Farbe", COLOR_BLUE: "Blau", COLOR_GREEN: "Grün", COLOR_AMBER: "Gelb", COLOR_RED: "Rot", COLOR_PURPLE: "Violett", COLOR_PINK: "Rosa", COLOR_TEAL: "Türkis", COLOR_SLATE: "Grau", DAY: "Tag", DAY_N_OF_M: "Tag {n} von {total}", DELETE: "Löschen", DELETE_CONFIRM_BODY: '"{title}" löschen? Dies kann nicht rückgängig gemacht werden.', DELETE_CONFIRM_TITLE: "Ereignis löschen", EDIT: "Bearbeiten", EDIT_EVENT: "Ereignis bearbeiten", EMPTY: "Keine Ereignisse in diesem Zeitraum", EMPTY_HINT: "Noch keine Ereignisse. Klicke auf einen Tag, um eins hinzuzufügen.", END: "Ende", LOADING: "Ereignisse werden geladen…", MORE: "+{count} weitere", MORE_EVENTS: "Weitere Ereignisse", MONTH: "Monat", MORE_OPTIONS: "Weitere Optionen", NEW_EVENT: "Neues Ereignis", NEXT: "Nächster Zeitraum", PREVIOUS: "Vorheriger Zeitraum", RECUR_SCOPE_ALL: "Alle Ereignisse", RECUR_SCOPE_BODY_DELETE: "Dieses Ereignis ist Teil einer wiederkehrenden Serie. Möchten Sie nur dieses Ereignis oder alle Ereignisse der Serie löschen?", RECUR_SCOPE_BODY_EDIT: "Dieses Ereignis ist Teil einer wiederkehrenden Serie. Möchten Sie nur dieses Ereignis oder alle Ereignisse der Serie bearbeiten?", RECUR_SCOPE_THIS: "Dieses Ereignis", RECUR_SCOPE_TITLE: "Wiederkehrendes Ereignis", REPEAT: "Wiederholen", REPEAT_DAILY: "Täglich", REPEAT_END: "Endet", REPEAT_END_COUNT: "Nach", REPEAT_END_NEVER: "Nie", REPEAT_END_UNTIL: "Am Datum", REPEAT_EVERY: "Wiederholen alle", REPEAT_UNIT_DAYS: "Tag(e)", REPEAT_UNIT_WEEKS: "Woche(n)", REPEAT_UNIT_MONTHS: "Monat(e)", REPEAT_UNIT_YEARS: "Jahr(e)", REPEAT_MONTHLY: "Monatlich", REPEAT_NONE: "Keine Wiederholung", REPEAT_OCCURRENCES: "Vorkommen", REPEAT_ON: "Wiederholen am", REPEAT_WEEKLY: "Wöchentlich", REPEAT_YEARLY: "Jährlich", SAVE: "Speichern", START: "Beginn", TIMELINE: "Zeitachse", TIMELINE_DAY: "Zeitachse Tag", TIMELINE_WEEK: "Zeitachse Woche", TITLE: "Titel", TODAY: "Heute", WEEK: "Woche", WORK_WEEK: "Arbeitswoche", ZOOM_IN: "Vergrößern", ZOOM_OUT: "Verkleinern", EVENT_DETAILS: "Termindetails" }, Da = { no_options: "Keine Optionen" }, yo = {
1852
1852
  CORE: Ta,
1853
1853
  SHELL: ha,
1854
1854
  COMPONENTS: La,
@@ -2107,12 +2107,12 @@ function xo() {
2107
2107
  hasNotification: (t) => e.hasNotification(t)
2108
2108
  });
2109
2109
  }
2110
- const $o = "2.5.0-pr348.52b97ab";
2110
+ const $o = "2.5.0-pr350.bce5a99";
2111
2111
  function Ko() {
2112
2112
  return {
2113
2113
  version: $o,
2114
- buildDate: "2026-09-01T14:43:04.727Z",
2115
- gitHash: "52b97abb2"
2114
+ buildDate: "2026-09-02T09:58:26.438Z",
2115
+ gitHash: "bce5a99dc"
2116
2116
  };
2117
2117
  }
2118
2118
  function zo(e = Ko()) {
@@ -606,7 +606,8 @@ export default {
606
606
  "WEEK": "Woche",
607
607
  "WORK_WEEK": "Arbeitswoche",
608
608
  "ZOOM_IN": "Vergrößern",
609
- "ZOOM_OUT": "Verkleinern"
609
+ "ZOOM_OUT": "Verkleinern",
610
+ "EVENT_DETAILS": "Termindetails"
610
611
  },
611
612
  "common": {
612
613
  "no_options": "Keine Optionen"
@@ -606,7 +606,8 @@ export default {
606
606
  "WEEK": "Week",
607
607
  "WORK_WEEK": "Work week",
608
608
  "ZOOM_IN": "Zoom in",
609
- "ZOOM_OUT": "Zoom out"
609
+ "ZOOM_OUT": "Zoom out",
610
+ "EVENT_DETAILS": "Event details"
610
611
  },
611
612
  "common": {
612
613
  "no_options": "No options"
@@ -606,7 +606,8 @@
606
606
  "WEEK": "Week",
607
607
  "WORK_WEEK": "Work week",
608
608
  "ZOOM_IN": "Zoom in",
609
- "ZOOM_OUT": "Zoom out"
609
+ "ZOOM_OUT": "Zoom out",
610
+ "EVENT_DETAILS": "Event details"
610
611
  },
611
612
  "common": {
612
613
  "no_options": "No options"
@@ -613,6 +613,7 @@ export interface VcShellLocale {
613
613
  WORK_WEEK: string;
614
614
  ZOOM_IN: string;
615
615
  ZOOM_OUT: string;
616
+ EVENT_DETAILS: string;
616
617
  };
617
618
  common: {
618
619
  no_options: string;
@@ -1 +1 @@
1
- {"version":3,"file":"GridstackDashboard.vue.d.ts","sourceRoot":"","sources":["../../../../shell/dashboard/draggable-dashboard/GridstackDashboard.vue"],"names":[],"mappings":"AA4mBA,OAAO,kCAAkC,CAAC;AA2C1C,UAAU,KAAK;IACb,wCAAwC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,6BAA6B;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAyaD,QAAA,MAAM,YAAY;4BA5MW,IAAI;6BAIH,IAAI;;+BAIF,OAAO;;eAtOzB,MAAM;eAFN,OAAO;qBAFD,OAAO;6EAkbzB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"GridstackDashboard.vue.d.ts","sourceRoot":"","sources":["../../../../shell/dashboard/draggable-dashboard/GridstackDashboard.vue"],"names":[],"mappings":"AAunBA,OAAO,kCAAkC,CAAC;AA2C1C,UAAU,KAAK;IACb,wCAAwC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,6BAA6B;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAkbD,QAAA,MAAM,YAAY;4BA5MW,IAAI;6BAIH,IAAI;;+BAIF,OAAO;;eA/OzB,MAAM;eAFN,OAAO;qBAFD,OAAO;6EA2bzB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -47,6 +47,8 @@ export interface UseGridstackReturn {
47
47
  loadLayout: () => void;
48
48
  /** Reset to built-in positions */
49
49
  resetToDefaults: () => void;
50
+ /** Put the grid back to a layout captured earlier */
51
+ restoreLayout: (snapshot: Map<string, DashboardWidgetPlacement>) => void;
50
52
  /** Batch update mode (disable animations) */
51
53
  batchUpdate: (fn: () => void) => void;
52
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useGridstack.d.ts","sourceRoot":"","sources":["../../../../../shell/dashboard/draggable-dashboard/composables/useGridstack.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAiD,KAAK,GAAG,EAAE,KAAK,UAAU,EAAE,MAAM,KAAK,CAAC;AAC/F,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAsB,MAAM,WAAW,CAAC;AACjF,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,EACpB,MAAM,4CAA4C,CAAC;AA8BpD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,sCAAsC;IACtC,WAAW,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACxC,6BAA6B;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mCAAmC;IACnC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,wBAAwB,CAAC,KAAK,IAAI,CAAC;CAC1E;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,sCAAsC;IACtC,IAAI,EAAE,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IACnC,mEAAmE;IACnE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC;IACnD,kCAAkC;IAClC,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5B,iCAAiC;IACjC,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IACzC,4BAA4B;IAC5B,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,+BAA+B;IAC/B,SAAS,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC9C,oCAAoC;IACpC,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,6BAA6B;IAC7B,oBAAoB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACpF,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACxE,0BAA0B;IAC1B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,kCAAkC;IAClC,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,6CAA6C;IAC7C,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CACvC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,gBAAgB,EAAE,CAAC,EAAE,OAAO,GAAE,mBAAwB,GAAG,kBAAkB,CA2VpH"}
1
+ {"version":3,"file":"useGridstack.d.ts","sourceRoot":"","sources":["../../../../../shell/dashboard/draggable-dashboard/composables/useGridstack.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAiD,KAAK,GAAG,EAAE,KAAK,UAAU,EAAE,MAAM,KAAK,CAAC;AAC/F,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAsB,MAAM,WAAW,CAAC;AACjF,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,EACpB,MAAM,4CAA4C,CAAC;AA8BpD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,sCAAsC;IACtC,WAAW,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACxC,6BAA6B;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mCAAmC;IACnC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,wBAAwB,CAAC,KAAK,IAAI,CAAC;CAC1E;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,sCAAsC;IACtC,IAAI,EAAE,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IACnC,mEAAmE;IACnE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC;IACnD,kCAAkC;IAClC,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5B,iCAAiC;IACjC,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IACzC,4BAA4B;IAC5B,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,+BAA+B;IAC/B,SAAS,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC9C,oCAAoC;IACpC,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,6BAA6B;IAC7B,oBAAoB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACpF,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACxE,0BAA0B;IAC1B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,kCAAkC;IAClC,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,qDAAqD;IACrD,aAAa,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,wBAAwB,CAAC,KAAK,IAAI,CAAC;IACzE,6CAA6C;IAC7C,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CACvC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,gBAAgB,EAAE,CAAC,EAAE,OAAO,GAAE,mBAAwB,GAAG,kBAAkB,CAwWpH"}