@lumal/cockpit 0.0.1-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +103 -0
- package/dist/cockpit.css +2 -0
- package/dist/createCockpitRegistry-D5F4d5By.js +30 -0
- package/dist/createCockpitRegistry-DHr9nXJY.cjs +1 -0
- package/dist/designer.cjs +1 -0
- package/dist/designer.js +2282 -0
- package/dist/index.cjs +1 -0
- package/dist/index.js +30 -0
- package/dist/registry.cjs +1 -0
- package/dist/registry.js +2 -0
- package/dist/resolveComponent-BF1aCxAk.cjs +1 -0
- package/dist/resolveComponent-QbJRsdxR.js +308 -0
- package/dist/runtime-CXiih7DE.js +627 -0
- package/dist/runtime-wzWMTWrS.cjs +1 -0
- package/dist/runtime.cjs +1 -0
- package/dist/runtime.js +3 -0
- package/dist/src/composables/index.d.ts +9 -0
- package/dist/src/composables/index.d.ts.map +1 -0
- package/dist/src/composables/useCanvasScale.d.ts +30 -0
- package/dist/src/composables/useCanvasScale.d.ts.map +1 -0
- package/dist/src/composables/useCockpit.d.ts +14 -0
- package/dist/src/composables/useCockpit.d.ts.map +1 -0
- package/dist/src/composables/useCockpitAutoRefresh.d.ts +27 -0
- package/dist/src/composables/useCockpitAutoRefresh.d.ts.map +1 -0
- package/dist/src/composables/useCockpitContext.d.ts +16 -0
- package/dist/src/composables/useCockpitContext.d.ts.map +1 -0
- package/dist/src/composables/useCockpitRefresh.d.ts +9 -0
- package/dist/src/composables/useCockpitRefresh.d.ts.map +1 -0
- package/dist/src/config/defaults.d.ts +19 -0
- package/dist/src/config/defaults.d.ts.map +1 -0
- package/dist/src/config/index.d.ts +13 -0
- package/dist/src/config/index.d.ts.map +1 -0
- package/dist/src/config/migrate.d.ts +6 -0
- package/dist/src/config/migrate.d.ts.map +1 -0
- package/dist/src/config/normalize.d.ts +3 -0
- package/dist/src/config/normalize.d.ts.map +1 -0
- package/dist/src/config/validate.d.ts +8 -0
- package/dist/src/config/validate.d.ts.map +1 -0
- package/dist/src/designer/CockpitComponentLibrary.vue.d.ts +16 -0
- package/dist/src/designer/CockpitComponentLibrary.vue.d.ts.map +1 -0
- package/dist/src/designer/CockpitLayoutEditor.vue.d.ts +34 -0
- package/dist/src/designer/CockpitLayoutEditor.vue.d.ts.map +1 -0
- package/dist/src/designer/CockpitWidgetDropZone.vue.d.ts +45 -0
- package/dist/src/designer/CockpitWidgetDropZone.vue.d.ts.map +1 -0
- package/dist/src/designer/CockpitWidgetPreview.vue.d.ts +19 -0
- package/dist/src/designer/CockpitWidgetPreview.vue.d.ts.map +1 -0
- package/dist/src/designer/LumalCockpitDesigner.vue.d.ts +41 -0
- package/dist/src/designer/LumalCockpitDesigner.vue.d.ts.map +1 -0
- package/dist/src/designer/confirmWidgetReplacement.d.ts +3 -0
- package/dist/src/designer/confirmWidgetReplacement.d.ts.map +1 -0
- package/dist/src/designer/index.d.ts +13 -0
- package/dist/src/designer/index.d.ts.map +1 -0
- package/dist/src/designer/types.d.ts +13 -0
- package/dist/src/designer/types.d.ts.map +1 -0
- package/dist/src/designer/useCockpitDraft.d.ts +50 -0
- package/dist/src/designer/useCockpitDraft.d.ts.map +1 -0
- package/dist/src/index.d.ts +22 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/messaging/createCockpitMessageBus.d.ts +16 -0
- package/dist/src/messaging/createCockpitMessageBus.d.ts.map +1 -0
- package/dist/src/messaging/index.d.ts +5 -0
- package/dist/src/messaging/index.d.ts.map +1 -0
- package/dist/src/messaging/topics.d.ts +10 -0
- package/dist/src/messaging/topics.d.ts.map +1 -0
- package/dist/src/messaging/types.d.ts +24 -0
- package/dist/src/messaging/types.d.ts.map +1 -0
- package/dist/src/registry/createCockpitRegistry.d.ts +4 -0
- package/dist/src/registry/createCockpitRegistry.d.ts.map +1 -0
- package/dist/src/registry/index.d.ts +3 -0
- package/dist/src/registry/index.d.ts.map +1 -0
- package/dist/src/registry/types.d.ts +20 -0
- package/dist/src/registry/types.d.ts.map +1 -0
- package/dist/src/runtime/CockpitErrorBoundary.vue.d.ts +26 -0
- package/dist/src/runtime/CockpitErrorBoundary.vue.d.ts.map +1 -0
- package/dist/src/runtime/LumalCockpit.vue.d.ts +105 -0
- package/dist/src/runtime/LumalCockpit.vue.d.ts.map +1 -0
- package/dist/src/runtime/LumalCockpitCanvas.vue.d.ts +47 -0
- package/dist/src/runtime/LumalCockpitCanvas.vue.d.ts.map +1 -0
- package/dist/src/runtime/LumalCockpitCard.vue.d.ts +31 -0
- package/dist/src/runtime/LumalCockpitCard.vue.d.ts.map +1 -0
- package/dist/src/runtime/LumalCockpitContainer.vue.d.ts +12 -0
- package/dist/src/runtime/LumalCockpitContainer.vue.d.ts.map +1 -0
- package/dist/src/runtime/LumalCockpitRegion.vue.d.ts +11 -0
- package/dist/src/runtime/LumalCockpitRegion.vue.d.ts.map +1 -0
- package/dist/src/runtime/LumalCockpitWidgetHost.vue.d.ts +12 -0
- package/dist/src/runtime/LumalCockpitWidgetHost.vue.d.ts.map +1 -0
- package/dist/src/runtime/card.d.ts +16 -0
- package/dist/src/runtime/card.d.ts.map +1 -0
- package/dist/src/runtime/context.d.ts +25 -0
- package/dist/src/runtime/context.d.ts.map +1 -0
- package/dist/src/runtime/index.d.ts +19 -0
- package/dist/src/runtime/index.d.ts.map +1 -0
- package/dist/src/runtime/resolveComponent.d.ts +13 -0
- package/dist/src/runtime/resolveComponent.d.ts.map +1 -0
- package/dist/src/types/index.d.ts +83 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/validate-DkC_IHrC.js +94 -0
- package/dist/validate-KSzm5SZW.cjs +1 -0
- package/package.json +73 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Lumal contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# @lumal/cockpit
|
|
2
|
+
|
|
3
|
+
Lumal 通用驾驶舱 v3 编排框架。包负责布局配置、左右模块运行时、Designer、组件注册和消息总线;消费应用负责中心内容、业务模块、导航、主题皮肤、权限和持久化。
|
|
4
|
+
|
|
5
|
+
## v3 模型
|
|
6
|
+
|
|
7
|
+
- `CockpitConfig` 只包含 `layouts` 和 `activeLayoutId`,不包含分类、页面或中央组件配置。
|
|
8
|
+
- 一个布局保存独立的左、右区域。
|
|
9
|
+
- 区域由像素列宽和百分比行高组成;所有行高标准化后合计 `100%`。
|
|
10
|
+
- 普通行每列对应一个空槽或模块;合并行跨满区域并作为 Tab 容器。
|
|
11
|
+
- 中心内容不进入配置,由消费应用通过插槽直接提供。
|
|
12
|
+
|
|
13
|
+
## 公开入口
|
|
14
|
+
|
|
15
|
+
```text
|
|
16
|
+
@lumal/cockpit
|
|
17
|
+
@lumal/cockpit/runtime
|
|
18
|
+
@lumal/cockpit/designer
|
|
19
|
+
@lumal/cockpit/registry
|
|
20
|
+
@lumal/cockpit/style.css
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
`runtime` 和 `designer` 独立构建,只读应用无需加载 Designer 与 SortableJS。
|
|
24
|
+
|
|
25
|
+
## 注册模块
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
import { createCockpitRegistry } from '@lumal/cockpit/registry'
|
|
29
|
+
|
|
30
|
+
const registry = createCockpitRegistry()
|
|
31
|
+
|
|
32
|
+
registry.registerWidget({
|
|
33
|
+
type: 'application-widget',
|
|
34
|
+
label: '应用模块',
|
|
35
|
+
component: () => import('./ApplicationWidget.vue'),
|
|
36
|
+
})
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
模块定义可以提供 `thumbnail`。未提供时 Designer 实时渲染组件;缩略图和业务资源始终由消费应用维护。
|
|
40
|
+
|
|
41
|
+
## 运行时
|
|
42
|
+
|
|
43
|
+
```vue
|
|
44
|
+
<LumalCockpit
|
|
45
|
+
v-model:active-layout-id="activeLayoutId"
|
|
46
|
+
:config="config"
|
|
47
|
+
:registry="registry"
|
|
48
|
+
:viewport-mode="viewportMode"
|
|
49
|
+
>
|
|
50
|
+
<template #header-title="{ title }">
|
|
51
|
+
<AppHeader :title="title" :layouts="config.layouts" />
|
|
52
|
+
</template>
|
|
53
|
+
|
|
54
|
+
<template #center="{ context, layout }">
|
|
55
|
+
<ApplicationCenter :key="context.instanceId" :context="context" :layout="layout" />
|
|
56
|
+
</template>
|
|
57
|
+
</LumalCockpit>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
- 布局导航由消费应用负责。
|
|
61
|
+
- 中心内容位于底层全宽画布,左右区域覆盖在其两侧。
|
|
62
|
+
- `viewportMode="scale"` 使用 1920 × 1080 等比缩放;`viewportMode="vwvh"` 使用 VW/VH 单位适配。
|
|
63
|
+
- 相同模块 type 可以创建多个拥有独立 `instanceId` 的实例。
|
|
64
|
+
- Tab 切换保留全部模块实例状态。
|
|
65
|
+
|
|
66
|
+
## Designer
|
|
67
|
+
|
|
68
|
+
```vue
|
|
69
|
+
<LumalCockpitDesigner
|
|
70
|
+
:config="config"
|
|
71
|
+
:registry="registry"
|
|
72
|
+
:saving="saving"
|
|
73
|
+
@save="saveLayout"
|
|
74
|
+
@cancel="closeDesigner"
|
|
75
|
+
/>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
- Designer 只编辑打开时创建的草稿副本。
|
|
79
|
+
- 装配区仅保留左右两侧网格,不再渲染中央大屏预览。
|
|
80
|
+
- 左右区域头部常驻展示行列数与像素列宽,每行头部常驻展示百分比行高,无需悬浮或点击。
|
|
81
|
+
- 每行独立切换普通网格或 Tab 行。
|
|
82
|
+
- 模块库拖入时复制实例,已放置模块可以跨区域和普通槽/Tab 行移动。
|
|
83
|
+
- 替换占用槽必须确认;缩减包含模块的行列会被阻止。
|
|
84
|
+
- 拖拽操作同时提供可聚焦的选择、移动和目标按钮。
|
|
85
|
+
- 已放置模块共享 `mode: 'design'` 的消息总线;模块库预览保持隔离。
|
|
86
|
+
- 保存事件输出 `{ config, layout }`,包不调用 HTTP 或写入 localStorage。
|
|
87
|
+
|
|
88
|
+
## 公共 Card
|
|
89
|
+
|
|
90
|
+
`LumalCockpit` 默认使用 `LumalCockpitCard`。应用可通过 `cardComponent` 替换外框和 Tab 头部,组件须接收:
|
|
91
|
+
|
|
92
|
+
- `title?: string`
|
|
93
|
+
- `widget?: CockpitWidgetInstance`
|
|
94
|
+
- `tabs?: CockpitCardTab[]`
|
|
95
|
+
- `activeTabId?: string`
|
|
96
|
+
- `update:activeTabId` 事件
|
|
97
|
+
- 默认、`title` 和 `tab` 插槽
|
|
98
|
+
|
|
99
|
+
默认 Card 提供 TabList、Tab、TabPanel 语义以及方向键、Home、End 键盘操作。
|
|
100
|
+
|
|
101
|
+
## 主题边界
|
|
102
|
+
|
|
103
|
+
包只提供结构样式和语义 CSS 变量,不包含固定行业皮肤、Logo、地图、业务截图或业务字体。消费应用可以覆盖变量、传入 Card、使用标题背景和自定义插槽实现品牌样式。
|
package/dist/cockpit.css
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
.lumal-icon[data-v-111a6ce8]{width:var(--lumal-icon-size);height:var(--lumal-icon-size);vertical-align:-.125em;justify-content:center;align-items:center;line-height:1;display:inline-flex}.lumal-icon__svg[data-v-111a6ce8],.lumal-icon__component[data-v-111a6ce8]{width:100%;height:100%}.lumal-icon__svg[data-v-111a6ce8] svg{width:100%;height:100%;display:block}.lumal-icon-picker[data-v-937c0d9c]{gap:12px;display:grid}.lumal-icon-picker__toolbar[data-v-937c0d9c]{grid-template-columns:minmax(0,1fr) minmax(140px,200px);gap:12px;display:grid}.lumal-icon-picker__field[data-v-937c0d9c]{gap:6px;display:grid}.lumal-icon-picker__field-label[data-v-937c0d9c],.lumal-icon-picker__summary[data-v-937c0d9c],.lumal-icon-picker__empty[data-v-937c0d9c]{color:var(--el-text-color-secondary,CanvasText);font-size:13px}.lumal-icon-picker__field input[data-v-937c0d9c],.lumal-icon-picker__field select[data-v-937c0d9c],.lumal-icon-picker__pagination button[data-v-937c0d9c]{border:1px solid var(--el-border-color,currentColor);border-radius:var(--lumal-radius-base,8px);min-height:44px;color:var(--el-text-color-primary,CanvasText);background:var(--el-bg-color,Canvas);padding:0 12px}.lumal-icon-picker__summary[data-v-937c0d9c],.lumal-icon-picker__empty[data-v-937c0d9c]{margin:0}.lumal-icon-picker__grid[data-v-937c0d9c]{grid-template-columns:repeat(auto-fill,minmax(52px,1fr));gap:8px;display:grid}.lumal-icon-picker__item[data-v-937c0d9c]{border:1px solid var(--el-border-color-lighter,currentColor);border-radius:var(--lumal-radius-small,6px);min-width:44px;min-height:52px;color:var(--el-text-color-regular,CanvasText);background:var(--el-bg-color,Canvas);cursor:pointer;transition:border-color var(--lumal-motion-fast,.16s), background-color var(--lumal-motion-fast,.16s);flex-direction:column;justify-content:center;align-items:center;gap:6px;padding:8px;display:inline-flex}.lumal-icon-picker__item[data-v-937c0d9c]:hover,.lumal-icon-picker__item.is-selected[data-v-937c0d9c]{border-color:var(--el-color-primary,Highlight);background:var(--el-color-primary-light-9,Canvas)}.lumal-icon-picker__item[data-v-937c0d9c]:focus-visible,.lumal-icon-picker__field input[data-v-937c0d9c]:focus-visible,.lumal-icon-picker__field select[data-v-937c0d9c]:focus-visible,.lumal-icon-picker__pagination button[data-v-937c0d9c]:focus-visible{outline:2px solid var(--el-color-primary,Highlight);outline-offset:2px}.lumal-icon-picker__item span[data-v-937c0d9c]{text-overflow:ellipsis;white-space:nowrap;max-width:100%;font-size:11px;overflow:hidden}.lumal-icon-picker__pagination[data-v-937c0d9c]{justify-content:center;align-items:center;gap:12px;display:flex}.lumal-icon-picker__pagination button[data-v-937c0d9c]:disabled{cursor:not-allowed;opacity:.5}@media (width<=640px){.lumal-icon-picker__toolbar[data-v-937c0d9c]{grid-template-columns:minmax(0,1fr)}}@media (prefers-reduced-motion:reduce){.lumal-icon-picker__item[data-v-937c0d9c]{transition:none}}.lumal-icon-picker-dialog[data-v-9bd629e7]{z-index:var(--lumal-z-dialog,500);background:color-mix(in srgb, CanvasText 48%, transparent);justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.lumal-icon-picker-dialog__body[data-v-9bd629e7]{border-radius:var(--lumal-radius-large,12px);width:min(680px,100%);max-height:min(680px,88dvh);color:var(--el-text-color-primary,CanvasText);background:var(--el-bg-color,Canvas);box-shadow:var(--lumal-shadow-dialog,0 18px 48px color-mix(in srgb, CanvasText 18%, transparent));display:grid;overflow:hidden}.lumal-icon-picker-dialog__header[data-v-9bd629e7],.lumal-icon-picker-dialog__footer[data-v-9bd629e7]{justify-content:space-between;align-items:center;gap:12px;min-height:56px;padding:12px 20px;display:flex}.lumal-icon-picker-dialog__header[data-v-9bd629e7]{border-bottom:1px solid var(--el-border-color-lighter,currentColor)}.lumal-icon-picker-dialog__header h3[data-v-9bd629e7]{margin:0;font-size:17px}.lumal-icon-picker-dialog__content[data-v-9bd629e7]{min-height:0;padding:20px;overflow:auto}.lumal-icon-picker-dialog__footer[data-v-9bd629e7]{border-top:1px solid var(--el-border-color-lighter,currentColor);justify-content:flex-end}.lumal-icon-picker-dialog button[data-v-9bd629e7]{border:1px solid var(--el-border-color,currentColor);border-radius:var(--lumal-radius-base,8px);min-width:44px;min-height:44px;color:inherit;background:var(--el-bg-color,Canvas);cursor:pointer;padding:0 14px}.lumal-icon-picker-dialog button.is-primary[data-v-9bd629e7]{border-color:var(--el-color-primary,Highlight);color:var(--el-color-white,HighlightText);background:var(--el-color-primary,Highlight)}.lumal-icon-picker-dialog button[data-v-9bd629e7]:disabled{cursor:not-allowed;opacity:.5}@media (width<=640px){.lumal-icon-picker-dialog[data-v-9bd629e7]{align-items:flex-end;padding:0}.lumal-icon-picker-dialog__body[data-v-9bd629e7]{border-radius:var(--lumal-radius-large,12px) var(--lumal-radius-large,12px) 0 0;max-height:92dvh}}.lumal-cockpit,.lumal-cockpit-designer{--lumal-cockpit-bg:var(--lumal-bg-color-page,var(--el-bg-color-page,#101722));--lumal-cockpit-bg-overlay:#080f18a3;--lumal-cockpit-texture-opacity:.16;--lumal-cockpit-panel-bg:var(--lumal-cockpit-surface-color,#121f2dc7);--lumal-cockpit-surface:var(--lumal-cockpit-panel-bg);--lumal-cockpit-floating-bg:#192738db;--lumal-cockpit-border:var(--lumal-cockpit-border-color,#94bce62e);--lumal-cockpit-shadow:0 14px 42px #0000003d;--lumal-cockpit-title-bg:linear-gradient(90deg, #409eff2e, #409eff0a);--lumal-cockpit-title-text:var(--lumal-text-color-primary,var(--el-text-color-primary,#f1f6ff));--lumal-cockpit-title-line:var(--lumal-color-primary,var(--el-color-primary,#409eff));--lumal-cockpit-text:var(--lumal-text-color-primary,var(--el-text-color-primary,#e5edf7));--lumal-cockpit-text-secondary:var(--lumal-text-color-regular,var(--el-text-color-regular,#a8b7c8));--lumal-cockpit-text-muted:var(--lumal-text-color-secondary,var(--el-text-color-secondary,#7d8b9c));--lumal-cockpit-accent:var(--lumal-color-primary,var(--el-color-primary,#409eff));--lumal-cockpit-success:var(--el-color-success,#67c23a);--lumal-cockpit-warning:var(--el-color-warning,#e6a23c);--lumal-cockpit-danger:var(--el-color-danger,#f56c6c);--lumal-cockpit-map-mask:#09121e6b;--lumal-cockpit-drop-target:#409eff38;--lumal-cockpit-selected:#409eff2e;--lumal-cockpit-gap:var(--lumal-cockpit-gap-size,12px);--lumal-cockpit-gap-x:var(--lumal-cockpit-gap);--lumal-cockpit-gap-y:var(--lumal-cockpit-gap);--lumal-cockpit-gap-design:12;--lumal-cockpit-radius:var(--lumal-border-radius-base,var(--el-border-radius-base,8px));--lumal-cockpit-header-height:var(--lumal-cockpit-header-size,72px);--lumal-cockpit-header-height-design:72;--lumal-cockpit-header-padding-design:16;--lumal-cockpit-title-size-design:24;--lumal-cockpit-category-height:var(--lumal-cockpit-category-size,64px);--lumal-cockpit-focus-ring:var(--el-color-primary,#409eff)}.lumal-cockpit{width:100%;height:100%;color:var(--lumal-cockpit-text);background:var(--lumal-cockpit-bg);position:relative;overflow:hidden}.lumal-cockpit__auto-refresh{align-items:center;display:inline-flex}.lumal-cockpit__auto-refresh-control{border:1px solid color-mix(in srgb, var(--lumal-cockpit-border), transparent 18%);background:color-mix(in srgb, var(--lumal-cockpit-floating-bg), transparent 14%);min-height:44px;color:var(--lumal-cockpit-text-secondary);cursor:pointer;white-space:nowrap;border-radius:2px;align-items:center;gap:8px;padding:0 10px;font-size:12px;display:inline-flex}.lumal-cockpit-canvas{position:absolute;inset:0;overflow:hidden}.lumal-cockpit-canvas__stage{gap:var(--lumal-cockpit-gap-y);padding:var(--lumal-cockpit-gap-y) var(--lumal-cockpit-gap-x);box-sizing:border-box;will-change:transform;flex-direction:column;display:flex;position:absolute;top:0;left:0}.lumal-cockpit-canvas[data-viewport-mode=vwvh] .lumal-cockpit-canvas__stage{--lumal-cockpit-gap-x:calc(var(--lumal-cockpit-gap-design) * var(--lumal-cockpit-x-unit));--lumal-cockpit-gap-y:calc(var(--lumal-cockpit-gap-design) * var(--lumal-cockpit-y-unit));--lumal-cockpit-header-height:calc(var(--lumal-cockpit-header-height-design) * var(--lumal-cockpit-y-unit));will-change:auto}.lumal-cockpit-canvas[data-viewport-mode=external] .lumal-cockpit-canvas__stage{will-change:auto;width:100%!important;height:100%!important}.lumal-cockpit-canvas__header{align-items:center;gap:var(--lumal-cockpit-gap-x);height:var(--lumal-cockpit-header-height);padding:0 calc(var(--lumal-cockpit-header-padding-design) * var(--lumal-cockpit-x-unit));border:1px solid var(--lumal-cockpit-border);border-radius:var(--lumal-cockpit-radius);background:var(--lumal-cockpit-title-bg);box-shadow:var(--lumal-cockpit-shadow);flex:none;display:flex}.lumal-cockpit-canvas__title{color:var(--lumal-cockpit-title-text);font-size:calc(var(--lumal-cockpit-title-size-design) * var(--lumal-cockpit-x-unit));font-weight:600}.lumal-cockpit-canvas__title h1{font:inherit;margin:0}.lumal-cockpit-canvas__title h1:after{background:var(--lumal-cockpit-title-line);content:"";width:72px;height:2px;margin-top:6px;display:block}.lumal-cockpit-canvas__pages{gap:8px;margin-left:24px;display:flex}.lumal-cockpit-canvas__header-actions{align-items:center;gap:8px;margin-left:auto;display:flex}.lumal-cockpit-canvas__body{flex:auto;min-height:0;position:relative;overflow:hidden}.lumal-cockpit-canvas__left,.lumal-cockpit-canvas__right{z-index:2;min-width:0;height:100%;display:flex;position:absolute;top:0;bottom:0}.lumal-cockpit-canvas__left{left:0}.lumal-cockpit-canvas__right{justify-content:flex-end;right:0}.lumal-cockpit-canvas__center{z-index:0;min-width:0;position:absolute;inset:0;overflow:hidden}.lumal-cockpit-canvas__categories{justify-content:center;align-items:center;gap:var(--lumal-cockpit-gap);height:var(--lumal-cockpit-category-height);flex:none;display:flex}.lumal-cockpit-canvas__page,.lumal-cockpit-canvas__category,.lumal-cockpit-card__tab{border:1px solid var(--lumal-cockpit-border);border-radius:var(--lumal-cockpit-radius);background:var(--lumal-cockpit-surface);min-width:44px;min-height:44px;color:inherit;cursor:pointer;padding:8px 16px}.lumal-cockpit-canvas__page:focus-visible,.lumal-cockpit-canvas__category:focus-visible,.lumal-cockpit-card__tab:focus-visible{outline:2px solid var(--lumal-cockpit-focus-ring);outline-offset:2px}.lumal-cockpit-canvas__page.is-active,.lumal-cockpit-canvas__category.is-active,.lumal-cockpit-card__tab.is-active{border-color:var(--lumal-cockpit-accent);box-shadow:inset 0 -2px 0 0 var(--lumal-cockpit-accent)}.lumal-cockpit-region{gap:var(--lumal-cockpit-gap-x);min-width:0;height:100%;display:flex}.lumal-cockpit-region__column{min-width:0}.lumal-cockpit-column{gap:var(--lumal-cockpit-gap-y);flex-direction:column;height:100%;display:flex}.lumal-cockpit-column__cell{min-height:0}.lumal-cockpit-container{min-width:0;height:100%;min-height:0}.lumal-cockpit-container__combined{gap:var(--lumal-cockpit-gap-x);height:100%;display:flex}.lumal-cockpit-container__combined[data-direction=vertical]{flex-direction:column}.lumal-cockpit-container__combined-item{flex:1 1 0;min-width:0;min-height:0}.lumal-cockpit-container__tabs{flex-direction:column;height:100%;display:flex}.lumal-cockpit-container__tabpanel{flex:auto;height:100%;min-height:0}.lumal-cockpit-card{border:1px solid var(--lumal-cockpit-border);border-radius:var(--lumal-cockpit-radius);background:var(--lumal-cockpit-surface);width:100%;min-width:0;height:100%;min-height:0;box-shadow:var(--lumal-cockpit-shadow);flex-direction:column;display:flex;overflow:hidden}.lumal-cockpit-card__header{border-bottom:1px solid var(--lumal-cockpit-border);background:var(--lumal-cockpit-title-bg);flex:none;align-items:center;min-height:44px;padding:0 12px;display:flex}.lumal-cockpit-card__title{min-width:0;color:var(--lumal-cockpit-title-text);text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.lumal-cockpit-card__tablist{align-items:center;gap:8px;min-width:0;min-height:44px;display:flex;overflow-x:auto}.lumal-cockpit-card__tab{flex:none}.lumal-cockpit-card__body{min-height:0;padding:var(--lumal-cockpit-card-body-padding,12px);box-sizing:border-box;flex-direction:column;flex:auto;display:flex;position:relative;overflow:hidden}.lumal-cockpit-widget,.lumal-cockpit-center{flex-direction:column;height:100%;min-height:0;display:flex}.lumal-cockpit-widget__body,.lumal-cockpit-center__body{flex:auto;min-height:0;overflow:auto}.lumal-cockpit-widget__embedded,.lumal-cockpit-center__embedded{flex-direction:column;height:100%;min-height:0;display:flex}.lumal-cockpit-center{border:1px solid var(--lumal-cockpit-border);border-radius:var(--lumal-cockpit-radius);background:var(--lumal-cockpit-map-mask);overflow:hidden}.lumal-cockpit[data-mode=design] [data-cockpit-node]{cursor:pointer}.lumal-cockpit[data-mode=design] [data-cockpit-node]:hover{outline:2px solid var(--lumal-cockpit-drop-target);outline-offset:-2px}.lumal-cockpit-container__empty,.lumal-cockpit-widget__missing,.lumal-cockpit-widget__error,.lumal-cockpit-center__empty,.lumal-cockpit-center__missing,.lumal-cockpit-center__error,.lumal-cockpit-canvas__empty-page,.lumal-cockpit__empty,.lumal-cockpit__error{height:100%;color:var(--lumal-cockpit-text);opacity:.72;text-align:center;justify-content:center;align-items:center;gap:8px;padding:16px;display:flex}.lumal-cockpit-error-boundary{height:100%}.lumal-cockpit-error-boundary__fallback{flex-direction:column;justify-content:center;align-items:center;gap:8px;height:100%;display:flex}.lumal-cockpit-error-boundary__retry{border:1px solid var(--lumal-cockpit-border);border-radius:var(--lumal-cockpit-radius);background:var(--lumal-cockpit-surface);min-height:44px;color:inherit;cursor:pointer;padding:8px 16px}.lumal-cockpit-error-boundary__retry:focus-visible{outline:2px solid var(--lumal-cockpit-focus-ring);outline-offset:2px}.lumal-cockpit-designer{--lumal-cockpit-designer-control-height:36px;--lumal-cockpit-designer-control-radius:6px;--lumal-cockpit-designer-pane-padding:16px;isolation:isolate;width:100%;min-width:1120px;height:100%;color:var(--lumal-cockpit-text,#e5eaf3);background:var(--lumal-cockpit-bg,#10131a);flex-direction:column;display:flex}.lumal-cockpit-designer__toolbar-actions button,.lumal-cockpit-designer__region :is(button,input:not([type=radio]):not([type=checkbox]),select),.lumal-cockpit-designer__properties :is(button,input),.lumal-cockpit-designer__library :is(button,select){box-sizing:border-box;font:inherit}.lumal-cockpit-designer__toolbar-actions button,.lumal-cockpit-designer__region button,.lumal-cockpit-designer__properties button,.lumal-cockpit-designer__library button{min-height:var(--lumal-cockpit-designer-control-height);border:1px solid var(--lumal-cockpit-border,#ffffff1f);border-radius:var(--lumal-cockpit-designer-control-radius);background:var(--lumal-cockpit-floating-bg,#ffffff0d);color:var(--lumal-cockpit-text,#e5eaf3);cursor:pointer;padding:0 10px;transition:border-color .16s,background-color .16s,color .16s}.lumal-cockpit-designer__toolbar-actions button:hover:not(:disabled),.lumal-cockpit-designer__region button:hover:not(:disabled),.lumal-cockpit-designer__properties button:hover:not(:disabled),.lumal-cockpit-designer__library button:hover:not(:disabled){border-color:color-mix(in srgb, var(--lumal-cockpit-accent,#409eff), transparent 38%);background:color-mix(in srgb, var(--lumal-cockpit-accent,#409eff), transparent 90%)}.lumal-cockpit-designer__toolbar-actions button:disabled,.lumal-cockpit-designer__region button:disabled,.lumal-cockpit-designer__properties button:disabled,.lumal-cockpit-designer__library button:disabled{cursor:not-allowed;opacity:.42}.lumal-cockpit-designer__toolbar-actions button:focus-visible,.lumal-cockpit-designer__region button:focus-visible,.lumal-cockpit-designer__properties button:focus-visible,.lumal-cockpit-designer__library button:focus-visible{outline:2px solid var(--lumal-cockpit-focus-ring,#409eff);outline-offset:2px}.lumal-cockpit-designer__toolbar{justify-content:space-between;align-items:center;gap:var(--lumal-cockpit-gap,12px);border-bottom:1px solid var(--lumal-cockpit-border,#ffffff1f);background:var(--lumal-cockpit-panel-bg,#121f2dc7);flex:none;min-height:64px;padding:0 20px;display:flex;box-shadow:0 1px #ffffff08}.lumal-cockpit-designer__heading{color:var(--lumal-cockpit-title-text,#f1f6ff);margin:0;font-size:18px;font-weight:650}.lumal-cockpit-designer__toolbar-actions{gap:8px;display:flex}.lumal-cockpit-designer__toolbar-actions .lumal-cockpit-designer__save{border-color:var(--lumal-cockpit-accent,#409eff);background:var(--lumal-cockpit-accent,#409eff);color:#fff}.lumal-cockpit-designer__toolbar-actions .lumal-cockpit-designer__save:hover:not(:disabled){border-color:var(--lumal-cockpit-accent,#409eff);background:color-mix(in srgb, var(--lumal-cockpit-accent,#409eff), #000 12%)}.lumal-cockpit-designer__issues{background:#f56c6c1f;border-bottom:1px solid #f56c6c66;flex:none;padding:8px 16px}.lumal-cockpit-designer__issue{margin:2px 0;font-size:13px}.lumal-cockpit-designer__body{flex:auto;grid-template-columns:minmax(244px,268px) minmax(0,1fr) minmax(244px,268px);min-height:0;display:grid}.lumal-cockpit-designer__pane{min-width:0;padding:var(--lumal-cockpit-designer-pane-padding);overflow:auto}.lumal-cockpit-designer__pane--props{border-right:1px solid var(--lumal-cockpit-border,#ffffff1f);background:color-mix(in srgb, var(--lumal-cockpit-panel-bg,#182738), transparent 10%)}.lumal-cockpit-designer__pane--editor{background:color-mix(in srgb, var(--lumal-cockpit-bg,#10131a), #000 8%);flex-direction:column;gap:16px;display:flex}.lumal-cockpit-designer__pane--library{border-left:1px solid var(--lumal-cockpit-border,#ffffff1f);background:color-mix(in srgb, var(--lumal-cockpit-panel-bg,#182738), transparent 10%)}.lumal-cockpit-designer__editors{flex:none;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;display:grid}.lumal-cockpit-designer__preview{flex-direction:column;flex:auto;gap:8px;min-height:420px;display:flex}.lumal-cockpit-designer__preview-label{border:1px solid var(--lumal-cockpit-border,#ffffff1f);background:var(--lumal-cockpit-floating-bg,#ffffff0d);color:var(--lumal-cockpit-text-secondary,#a8b7c8);border-radius:4px;align-self:flex-start;padding:4px 8px;font-size:12px;line-height:1.2}.lumal-cockpit-designer__preview-stage{border:1px solid var(--lumal-cockpit-border,#ffffff1f);border-radius:var(--lumal-cockpit-radius,8px);background:color-mix(in srgb, var(--lumal-cockpit-bg,#10131a), #000 10%);flex:auto;min-height:0;position:relative;overflow:hidden;box-shadow:inset 0 1px #ffffff08}.lumal-cockpit-designer__region{border:1px solid var(--lumal-cockpit-border,#ffffff1f);border-radius:var(--lumal-cockpit-radius,8px);background:var(--lumal-cockpit-panel-bg,#121f2dc7);min-width:0;overflow:hidden;box-shadow:inset 0 1px #ffffff08}.lumal-cockpit-designer__region-head,.lumal-cockpit-designer__column-head,.lumal-cockpit-designer__container-head{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.lumal-cockpit-designer__region-head{border-bottom:1px solid var(--lumal-cockpit-border,#ffffff1f);background:color-mix(in srgb, var(--lumal-cockpit-floating-bg,#192738), transparent 18%);min-height:52px;padding:0 12px}.lumal-cockpit-designer__region-head>span{color:var(--lumal-cockpit-title-text,#f1f6ff);font-size:15px;font-weight:600}.lumal-cockpit-designer__region-head>button{margin-left:auto}.lumal-cockpit-designer__region-empty{min-height:112px;color:var(--lumal-cockpit-text-muted,#7d8b9c);place-items:center;padding:16px;display:grid}.lumal-cockpit-designer__ops{flex-wrap:wrap;gap:4px;margin-left:auto;display:inline-flex}.lumal-cockpit-designer__ops button{min-width:var(--lumal-cockpit-designer-control-height);padding:0 8px}.lumal-cockpit-designer__column{border:1px solid var(--lumal-cockpit-border,#ffffff1f);border-radius:var(--lumal-cockpit-designer-control-radius);background:color-mix(in srgb, var(--lumal-cockpit-floating-bg,#192738), transparent 28%);margin:12px;overflow:hidden}.lumal-cockpit-designer__column-head{border-bottom:1px solid var(--lumal-cockpit-border,#ffffff1f);min-height:48px;padding:8px 10px}.lumal-cockpit-designer__column-head>span{color:var(--lumal-cockpit-title-text,#f1f6ff);font-weight:600}.lumal-cockpit-designer__column-head label,.lumal-cockpit-designer__container-head label{color:var(--lumal-cockpit-text-secondary,#a8b7c8);align-items:center;gap:6px;font-size:12px;display:inline-flex}.lumal-cockpit-designer__column-head label input,.lumal-cockpit-designer__column-head label select,.lumal-cockpit-designer__container-head label input,.lumal-cockpit-designer__container-head label select{width:76px;padding:0 8px}.lumal-cockpit-designer__column-head label select,.lumal-cockpit-designer__container-head label select{width:auto;min-width:74px}.lumal-cockpit-designer__container{border:1px solid var(--lumal-cockpit-border,#ffffff1f);border-radius:var(--lumal-cockpit-radius,8px);background:color-mix(in srgb, var(--lumal-cockpit-bg,#10131a), transparent 14%);margin:10px;overflow:hidden}.lumal-cockpit-designer__container-head{border-bottom:1px solid var(--lumal-cockpit-border,#ffffff1f);min-height:48px;padding:8px 10px}.lumal-cockpit-designer__props-item,.lumal-cockpit-designer__widget{min-width:0}.lumal-cockpit-designer__widgets{gap:6px;padding:10px;display:grid}.lumal-cockpit-designer__widget{border:1px solid color-mix(in srgb, var(--lumal-cockpit-border,#3d5268), transparent 26%);background:color-mix(in srgb, var(--lumal-cockpit-floating-bg,#192738), transparent 36%);border-radius:5px;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px;min-height:40px;padding:6px 8px;display:grid}.lumal-cockpit-designer__widget input{width:16px;height:16px;accent-color:var(--lumal-cockpit-accent,#409eff);margin:0}.lumal-cockpit-designer__widget .lumal-cockpit-designer__ops{justify-self:end}.lumal-cockpit-designer__widget-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.lumal-cockpit-designer__widget-empty{color:var(--lumal-cockpit-text-muted,#7d8b9c);text-align:center;padding:18px 8px}.lumal-cockpit-designer__add-widget{color:var(--lumal-cockpit-text-secondary,#a8b7c8);align-items:center;gap:8px;padding:0 10px 10px;font-size:12px;display:flex}.lumal-cockpit-designer__add-widget select{flex:auto;min-width:0;padding:0 8px}.lumal-cockpit-designer__properties,.lumal-cockpit-designer__library{gap:20px;display:grid}.lumal-cockpit-designer__props-section,.lumal-cockpit-designer__library-section{gap:10px;display:grid}.lumal-cockpit-designer__props-title,.lumal-cockpit-designer__library-title{min-height:32px;color:var(--lumal-cockpit-title-text,#f1f6ff);justify-content:space-between;align-items:center;gap:8px;font-size:14px;font-weight:600;display:flex}.lumal-cockpit-designer__props-title select,.lumal-cockpit-designer__library-title select{min-width:0;max-width:132px;padding:0 8px;font-size:12px}.lumal-cockpit-designer__props-list,.lumal-cockpit-designer__library-list{gap:8px;display:grid}.lumal-cockpit-designer__props-item{border:1px solid var(--lumal-cockpit-border,#ffffff1f);border-radius:var(--lumal-cockpit-designer-control-radius);background:color-mix(in srgb, var(--lumal-cockpit-floating-bg,#192738), transparent 24%);grid-template-columns:minmax(0,1fr) auto;gap:8px;padding:8px;display:grid}.lumal-cockpit-designer__props-item.is-active{border-color:color-mix(in srgb, var(--lumal-cockpit-accent,#409eff), transparent 30%);box-shadow:inset 2px 0 0 var(--lumal-cockpit-accent,#409eff)}.lumal-cockpit-designer__props-select{text-align:left;text-overflow:ellipsis;white-space:nowrap;justify-content:flex-start;min-width:0;overflow:hidden}.lumal-cockpit-designer__rename{grid-column:1/-1;width:100%;padding:0 8px}.lumal-cockpit-designer__props-item>.lumal-cockpit-designer__ops{grid-column:1/-1;justify-content:flex-end;margin-left:0}.lumal-cockpit-designer__library-item{border:1px solid var(--lumal-cockpit-border,#ffffff1f);border-radius:var(--lumal-cockpit-designer-control-radius);background:color-mix(in srgb, var(--lumal-cockpit-floating-bg,#192738), transparent 26%);width:100%;min-height:40px;color:var(--lumal-cockpit-text,#e5eaf3);text-overflow:ellipsis;white-space:nowrap;box-sizing:border-box;align-items:center;padding:8px 10px;display:flex;overflow:hidden}.lumal-cockpit-designer__library-item.is-active{border-color:var(--lumal-cockpit-accent,#409eff);background:color-mix(in srgb, var(--lumal-cockpit-accent,#409eff), transparent 88%);box-shadow:inset 2px 0 0 var(--lumal-cockpit-accent,#409eff)}.lumal-cockpit-designer__library-item.is-static{color:var(--lumal-cockpit-text-secondary,#a8b7c8)}.lumal-cockpit-designer__library-empty{color:var(--lumal-cockpit-text-muted,#7d8b9c);padding:12px 0;font-size:13px}.lumal-cockpit-designer__props-list,.lumal-cockpit-designer__widgets,.lumal-cockpit-designer__library-list{margin:0;padding:0;list-style:none}@media (prefers-reduced-motion:reduce){.lumal-cockpit-canvas__stage{will-change:auto}}.lumal-cockpit-region{gap:var(--lumal-cockpit-gap-y);flex-direction:column;height:100%}.lumal-cockpit-region__column{display:none}.lumal-cockpit-container{flex:none;min-height:0;position:relative}.lumal-cockpit-container__grid{row-gap:var(--lumal-cockpit-gap-y);column-gap:var(--lumal-cockpit-gap-x);width:100%;height:100%;display:grid}.lumal-cockpit-container__cell{min-width:0;min-height:0;overflow:hidden}.lumal-cockpit-container__tabs{height:100%}.lumal-cockpit-canvas__center{min-height:0;display:flex;overflow:hidden}.lumal-cockpit-canvas__center>*{flex:auto;min-width:0;min-height:0}.lumal-cockpit-designer__toolbar{flex-wrap:wrap;align-items:center}.lumal-cockpit-designer__layout-controls{flex-wrap:wrap;flex:520px;align-items:center;gap:8px;display:flex}.lumal-cockpit-designer__layout-controls label,.lumal-cockpit-designer__layout-controls input,.lumal-cockpit-designer__layout-controls select{min-height:var(--lumal-cockpit-designer-control-height);box-sizing:border-box;font:inherit}.lumal-cockpit-designer__layout-controls label{color:var(--lumal-cockpit-text-secondary);align-items:center;gap:6px;font-size:12px;display:inline-flex}.lumal-cockpit-designer__layout-controls input,.lumal-cockpit-designer__layout-controls select{border:1px solid var(--lumal-cockpit-border);border-radius:var(--lumal-cockpit-designer-control-radius);background:var(--lumal-cockpit-bg);min-width:120px;color:var(--lumal-cockpit-text);outline:0;padding:0 8px}.lumal-cockpit-designer__layout-controls input:focus,.lumal-cockpit-designer__layout-controls select:focus{border-color:var(--lumal-cockpit-accent);box-shadow:0 0 0 2px color-mix(in srgb, var(--lumal-cockpit-accent), transparent 82%)}.lumal-cockpit-designer__layout-controls .is-danger{border-color:color-mix(in srgb, var(--lumal-cockpit-danger), transparent 46%);color:var(--lumal-cockpit-danger)}.lumal-cockpit-designer__workspace{background:color-mix(in srgb, var(--lumal-cockpit-bg), #000 8%);flex:auto;grid-template-columns:minmax(320px,1fr) minmax(320px,1fr) minmax(268px,320px);gap:16px;min-height:0;padding:16px;display:grid;overflow:auto}.lumal-cockpit-designer__workspace>.lumal-cockpit-designer__region,.lumal-cockpit-designer__workspace>.lumal-cockpit-designer__library{border:1px solid var(--lumal-cockpit-border);border-radius:var(--lumal-cockpit-radius);background:var(--lumal-cockpit-panel-bg);min-width:0;min-height:0;box-shadow:inset 0 1px #ffffff08}.lumal-cockpit-designer__workspace>.lumal-cockpit-designer__region{flex-direction:column;height:auto;display:flex;overflow:auto}.lumal-cockpit-designer__region-head{border-bottom:1px solid var(--lumal-cockpit-border);background:var(--lumal-cockpit-floating-bg);align-items:center;gap:10px;min-height:64px;padding:10px 12px;display:flex}.lumal-cockpit-designer__region-head>div{gap:2px;margin-right:auto;display:grid}.lumal-cockpit-designer__region-head strong{color:var(--lumal-cockpit-title-text);font-size:15px}.lumal-cockpit-designer__region-head span{color:var(--lumal-cockpit-text-muted);font-size:12px}.lumal-cockpit-designer__region-head label,.lumal-cockpit-designer__region-controls label,.lumal-cockpit-designer__grid-row-head label{color:var(--lumal-cockpit-text-secondary);align-items:center;gap:5px;font-size:12px;display:inline-flex}.lumal-cockpit-designer__region-head input,.lumal-cockpit-designer__region-controls input,.lumal-cockpit-designer__grid-row-head input{border:1px solid var(--lumal-cockpit-border);background:var(--lumal-cockpit-bg);width:64px;min-height:32px;color:var(--lumal-cockpit-text);font:inherit;border-radius:5px;padding:0 7px}.lumal-cockpit-designer__region-controls{border-bottom:1px solid var(--lumal-cockpit-border);flex-wrap:wrap;gap:8px;padding:10px 12px;display:flex}.lumal-cockpit-designer__grid-rows{gap:12px;padding:12px;display:grid}.lumal-cockpit-designer__grid-row{border:1px solid var(--lumal-cockpit-border);background:color-mix(in srgb, var(--lumal-cockpit-floating-bg), transparent 22%);border-radius:6px;gap:8px;padding:10px;display:grid}.lumal-cockpit-designer__grid-row-head{align-items:center;gap:10px;display:flex}.lumal-cockpit-designer__grid-row-head strong{color:var(--lumal-cockpit-title-text);margin-right:auto;font-size:13px}.lumal-cockpit-designer__tabs-switch{cursor:pointer}.lumal-cockpit-designer__tabs-switch input{width:16px;min-height:16px;accent-color:var(--lumal-cockpit-accent);margin:0}.lumal-cockpit-designer__grid-cells{gap:8px;min-height:126px;display:grid}.lumal-cockpit-designer__drop-zone{min-width:0;min-height:0;display:flex}.lumal-cockpit-designer__grid-cells>.lumal-cockpit-designer__drop-zone{min-height:126px}.lumal-cockpit-designer__tab-row .lumal-cockpit-designer__drop-zone{flex-wrap:wrap;gap:8px;min-height:92px}.lumal-cockpit-designer__empty-cell{border:1px dashed color-mix(in srgb, var(--lumal-cockpit-accent), transparent 46%);background:color-mix(in srgb, var(--lumal-cockpit-accent), transparent 94%);width:100%;min-height:100%;color:var(--lumal-cockpit-text-secondary);text-align:center;cursor:pointer;border-radius:5px;place-items:center;padding:12px;display:grid}.lumal-cockpit-designer__empty-cell:disabled{border-color:var(--lumal-cockpit-border);color:var(--lumal-cockpit-text-muted);cursor:default;background:0 0}.lumal-cockpit-designer__placed-widget{border:1px solid color-mix(in srgb, var(--lumal-cockpit-accent), transparent 54%);background:color-mix(in srgb, var(--lumal-cockpit-accent), transparent 90%);width:100%;min-height:72px;color:var(--lumal-cockpit-title-text);cursor:grab;box-sizing:border-box;border-radius:5px;justify-content:space-between;align-items:center;gap:8px;padding:10px;display:flex}.lumal-cockpit-designer__placed-widget:active{cursor:grabbing}.lumal-cockpit-designer__placed-widget.is-active{border-color:var(--lumal-cockpit-accent);box-shadow:inset 0 -2px 0 var(--lumal-cockpit-accent)}.lumal-cockpit-designer__placed-widget button{border:1px solid var(--lumal-cockpit-border);background:var(--lumal-cockpit-floating-bg);min-height:32px;color:inherit;cursor:pointer;border-radius:5px;padding:0 8px}.lumal-cockpit-designer__tab-row .lumal-cockpit-designer__placed-widget{width:auto;min-width:136px;min-height:52px}.lumal-cockpit-designer__library{flex-direction:column;gap:12px;height:auto;padding:12px;display:flex;overflow:auto}.lumal-cockpit-designer__library-title strong,.lumal-cockpit-designer__library-title span{display:block}.lumal-cockpit-designer__library-title strong{color:var(--lumal-cockpit-title-text)}.lumal-cockpit-designer__library-title span{color:var(--lumal-cockpit-text-muted);margin-top:2px;font-size:12px}.lumal-cockpit-designer__library-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;display:grid}.lumal-cockpit-designer__library-card{border:1px solid var(--lumal-cockpit-border);background:color-mix(in srgb, var(--lumal-cockpit-floating-bg), transparent 22%);min-height:112px;color:var(--lumal-cockpit-text);cursor:grab;text-align:left;border-radius:6px;gap:8px;padding:10px;display:grid}.lumal-cockpit-designer__library-card:hover{border-color:var(--lumal-cockpit-accent)}.lumal-cockpit-designer__library-card:focus-visible,.lumal-cockpit-designer__empty-cell:focus-visible,.lumal-cockpit-designer__placed-widget button:focus-visible{outline:2px solid var(--lumal-cockpit-focus-ring);outline-offset:2px}.lumal-cockpit-designer__library-thumbnail,.lumal-cockpit-designer__library-icon{background:color-mix(in srgb, var(--lumal-cockpit-accent), transparent 88%);object-fit:cover;width:100%;height:54px;color:var(--lumal-cockpit-text-secondary);border-radius:4px;place-items:center;font-size:12px;display:grid}.lumal-cockpit-designer__library-label{text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.lumal-cockpit-designer__library-empty{color:var(--lumal-cockpit-text-muted);text-align:center;grid-column:1/-1;margin:0;padding:20px 0}.lumal-cockpit-card__tab.el-button{--el-button-bg-color:transparent;--el-button-border-color:transparent;--el-button-text-color:var(--lumal-cockpit-text-secondary);--el-button-hover-bg-color:var(--lumal-cockpit-selected);--el-button-hover-border-color:transparent;--el-button-hover-text-color:var(--lumal-cockpit-title-text);--el-button-active-bg-color:var(--lumal-cockpit-selected);--el-button-active-border-color:transparent;--el-button-active-text-color:var(--lumal-cockpit-title-text);min-width:44px;min-height:44px;box-shadow:none;border-radius:0;padding:0 12px;font-size:14px}.lumal-cockpit-card__tab.el-button.is-active{color:var(--lumal-cockpit-title-text);box-shadow:inset 0 -2px 0 var(--lumal-cockpit-accent);font-weight:600}.lumal-cockpit-card__tab.el-button:focus-visible{outline:2px solid var(--lumal-cockpit-focus-ring);outline-offset:-2px}.lumal-cockpit-error-boundary__retry.el-button{--el-button-bg-color:var(--lumal-cockpit-surface);--el-button-border-color:var(--lumal-cockpit-border);--el-button-text-color:var(--lumal-cockpit-text);--el-button-hover-bg-color:var(--lumal-cockpit-selected);--el-button-hover-border-color:var(--lumal-cockpit-accent);--el-button-hover-text-color:var(--lumal-cockpit-title-text);align-items:center;gap:6px;display:inline-flex}.lumal-cockpit-designer{--el-color-primary:var(--lumal-cockpit-accent,#00cbf4);--el-color-success:var(--lumal-cockpit-success,#1dffa0);--el-color-warning:var(--lumal-cockpit-warning,#e6a23c);--el-color-danger:var(--lumal-cockpit-danger,#f56c6c);--el-bg-color:var(--lumal-cockpit-panel-bg,#062e40cc);--el-bg-color-overlay:var(--lumal-cockpit-floating-bg,#19374b);--el-bg-color-page:var(--lumal-cockpit-designer-body-bg,#062e40cc);--el-fill-color-blank:var(--lumal-cockpit-control-bg,#004a6a66);--el-fill-color-light:color-mix(in srgb, var(--lumal-cockpit-control-bg,#004a6a66), transparent 12%);--el-fill-color-lighter:color-mix(in srgb, var(--lumal-cockpit-floating-bg,#19374b), transparent 28%);--el-text-color-primary:var(--lumal-cockpit-text,#d7eeff);--el-text-color-regular:var(--lumal-cockpit-text-secondary,#d7efff);--el-text-color-secondary:var(--lumal-cockpit-text-muted,#9dcdf8);--el-text-color-placeholder:var(--lumal-cockpit-text-muted,#9dcdf8);--el-border-color:var(--lumal-cockpit-border,#06b7fd80);--el-border-color-hover:var(--lumal-cockpit-accent,#00cbf4);--el-border-color-light:color-mix(in srgb, var(--lumal-cockpit-border,#06b7fd80), transparent 28%);--el-border-color-lighter:color-mix(in srgb, var(--lumal-cockpit-border,#06b7fd80), transparent 48%);--el-border-radius-base:4px;--el-border-radius-small:3px;--el-disabled-bg-color:color-mix(in srgb, var(--lumal-cockpit-control-bg,#004a6a66), transparent 30%);--el-disabled-text-color:color-mix(in srgb, var(--lumal-cockpit-text-muted,#9dcdf8), transparent 20%);--el-disabled-border-color:color-mix(in srgb, var(--lumal-cockpit-border,#06b7fd80), transparent 50%);--el-input-bg-color:var(--lumal-cockpit-control-bg,#004a6a66);--el-input-text-color:var(--lumal-cockpit-text,#d7eeff);--el-input-border-color:var(--lumal-cockpit-border,#06b7fd80);--el-input-hover-border-color:var(--lumal-cockpit-accent,#00cbf4);--el-input-focus-border-color:var(--lumal-cockpit-accent,#00cbf4);--el-mask-color:#020c1485;width:100%;min-width:1024px;height:100%;min-height:680px;color:var(--lumal-cockpit-text,#d7eeff);background:var(--lumal-cockpit-designer-body-bg,#062e40cc);box-shadow:var(--lumal-cockpit-designer-inset-shadow,inset 0 0 30px #06b7fda3);grid-template-rows:60px 92px auto minmax(0,1fr) 64px;display:grid;overflow:hidden}.lumal-cockpit-designer *{box-sizing:border-box;scrollbar-width:none}.lumal-cockpit-designer ::-webkit-scrollbar{width:0;height:0}.lumal-cockpit-designer__titlebar{background-color:var(--lumal-cockpit-surface,#043547d6);background-image:var(--lumal-cockpit-designer-title-image,none), var(--lumal-cockpit-title-bg,linear-gradient(90deg, #073854, #064258));background-position:50%;background-repeat:no-repeat;background-size:100% 100%;align-items:center;padding:0 40px;display:flex;position:relative}.lumal-cockpit-designer__heading{color:var(--lumal-cockpit-title-text,#fff);align-items:center;gap:9px;margin:0;font-size:18px;font-weight:700;display:inline-flex}.lumal-cockpit-designer__title-actions{align-items:center;gap:8px;margin-left:auto;display:flex}.lumal-cockpit-designer__controlbar{background:0 0;border-bottom:0;align-items:center;padding:0 30px;display:flex}.lumal-cockpit-designer__layout-controls,.lumal-cockpit-designer__layout-tools,.lumal-cockpit-designer__footer-actions{align-items:center;gap:10px;display:flex}.lumal-cockpit-designer__layout-controls{flex-wrap:wrap;width:100%;min-width:0}.lumal-cockpit-designer__layout-controls>.el-input{flex:none;width:200px}.lumal-cockpit-designer__layout-controls .el-select{flex:none;width:220px}.lumal-cockpit-designer__layout-tools{flex:none;margin-left:2px}.lumal-cockpit-designer__field{color:var(--lumal-cockpit-text-secondary,#d7efff);white-space:nowrap;flex:none;align-items:center;gap:6px;font-size:13px;line-height:1;display:inline-flex}.lumal-cockpit-designer__field>span{color:inherit;flex:none}.lumal-cockpit-designer__field>.el-input-number{flex:none;width:132px}.lumal-cockpit-designer__field em{color:var(--lumal-cockpit-text-muted,#9dcdf8);flex:none;font-size:11px;font-style:normal}.lumal-cockpit-designer__layout-controls>.lumal-cockpit-designer__field{gap:10px;font-size:14px;font-weight:600}.lumal-cockpit-designer__issues{gap:6px;padding:0 30px 8px;display:grid}.lumal-cockpit-designer__issues.is-empty{visibility:hidden;height:0;padding:0;overflow:hidden}.lumal-cockpit-designer__workspace{grid-template-columns:minmax(820px,3fr) minmax(286px,1fr);gap:12px;min-height:0;padding:0 10px 10px 30px;display:grid;overflow:hidden}.lumal-cockpit-designer__assembly,.lumal-cockpit-designer__library{border:1.43px solid var(--lumal-cockpit-panel-border,#06b7fd66);background:var(--lumal-cockpit-stage-bg,#004a6a33);border-radius:11.44px;min-width:0;min-height:0;overflow:hidden}.lumal-cockpit-designer__assembly{padding:16px}.lumal-cockpit-designer__assembly-stage{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:12px;width:100%;height:100%;min-height:0;display:grid;position:relative}.lumal-cockpit-designer__region{flex-direction:column;gap:10px;min-width:0;height:100%;min-height:0;display:flex}.lumal-cockpit-designer__region-head{border:1px solid color-mix(in srgb, var(--lumal-cockpit-border,#06b7fd80), var(--lumal-cockpit-accent,#00cbf4) 24%);background:color-mix(in srgb, var(--lumal-cockpit-panel-bg,#062e40f5), #00141e 12%);border-radius:5px;flex-wrap:wrap;align-items:center;gap:8px 12px;min-height:44px;padding:8px 10px;display:flex}.lumal-cockpit-designer__region-head .el-input-number{width:132px}.lumal-cockpit-designer__region-head-meta{flex-direction:column;min-width:86px;margin-right:auto;display:flex}.lumal-cockpit-designer__region-head-meta strong{color:var(--lumal-cockpit-title-text,#fff);font-size:13px}.lumal-cockpit-designer__region-head-meta span{color:var(--lumal-cockpit-text-muted,#9dcdf8);margin-top:1px;font-size:10px}.lumal-cockpit-designer__region-width-field.lumal-cockpit-designer__field .el-input-number{width:148px}.lumal-cockpit-designer__grid-rows{flex-direction:column;flex:1;gap:12px;width:100%;min-height:0;display:flex}.lumal-cockpit-designer__grid-row{isolation:isolate;flex-direction:column;gap:8px;min-width:0;min-height:0;display:flex;overflow:hidden}.lumal-cockpit-designer__grid-row-head{border:1px solid color-mix(in srgb, var(--lumal-cockpit-border,#06b7fd80), transparent 30%);background:color-mix(in srgb, var(--lumal-cockpit-control-bg,#032f3ff0), transparent 12%);border-radius:4px;align-items:center;gap:8px 10px;min-height:40px;padding:6px 8px;display:flex}.lumal-cockpit-designer__grid-row-head>strong{color:var(--lumal-cockpit-text-secondary,#d7efff);margin-right:auto;font-size:11px}.lumal-cockpit-designer__grid-row-head .el-input-number{width:148px}.lumal-cockpit-designer__tabs-switch{color:var(--lumal-cockpit-text-secondary,#d7efff);white-space:nowrap;align-items:center;gap:4px;font-size:10px;display:inline-flex}.lumal-cockpit-designer__grid-cells,.lumal-cockpit-designer__tab-row{flex:1 1 0;width:100%;height:100%;min-height:0}.lumal-cockpit-designer__grid-cells{grid-auto-rows:minmax(0,1fr);align-items:stretch;gap:10px;display:grid}.lumal-cockpit-designer__drop-zone{min-width:0;height:100%;min-height:0;display:block;position:relative}.lumal-cockpit-designer__drop-zone>.lumal-cockpit-designer__placed-widget,.lumal-cockpit-designer__drop-zone>.lumal-cockpit-designer__empty-cell{width:100%;min-width:0;height:100%;min-height:0;position:absolute;inset:0}.lumal-cockpit-designer__drop-zone.is-tabs{width:100%;height:100%;display:block;position:relative}.lumal-cockpit-designer__drop-zone.is-tabs>.lumal-cockpit-designer__tab-card{width:100%;height:100%;position:absolute;inset:0}.lumal-cockpit-designer__empty-cell.el-button{border-radius:var(--el-border-radius-base);white-space:normal;justify-content:center;align-items:center;width:100%;height:100%;min-height:0;margin:0;padding:8px;font-size:16px;display:inline-flex}.lumal-cockpit-designer__empty-cell.el-button:hover:not(:disabled),.lumal-cockpit-designer__empty-cell.el-button:focus-visible:not(:disabled){box-shadow:inset 0 0 18px color-mix(in srgb, var(--lumal-cockpit-accent), transparent 82%)}.lumal-cockpit-designer__empty-cell.el-button:disabled{opacity:1}.lumal-cockpit-designer__empty-cell.el-button .lumal-icon{flex:none}.lumal-cockpit-designer__placed-widget{border:1px solid var(--lumal-cockpit-slot-border,#06b7fd80);box-sizing:border-box;cursor:grab;isolation:isolate;background:0 0;border-radius:4px;grid-template-rows:34px minmax(0,1fr);grid-template-columns:minmax(0,1fr);justify-content:stretch;align-items:stretch;gap:0;width:100%;min-width:0;height:100%;min-height:0;padding:0;transition:border-color .16s,box-shadow .16s;display:grid;position:relative;overflow:hidden}.lumal-cockpit-designer__placed-widget:hover,.lumal-cockpit-designer__placed-widget:focus-within,.lumal-cockpit-designer__placed-widget.is-active{border-color:var(--lumal-cockpit-accent,#00cbf4);box-shadow:0 2px 12px #0003}.lumal-cockpit-designer__placed-widget.is-keyboard-selected{border-color:var(--lumal-cockpit-success,#1dffa0);box-shadow:inset 0 0 0 1px var(--lumal-cockpit-success,#1dffa0), 0 0 12px color-mix(in srgb, var(--lumal-cockpit-success,#1dffa0), transparent 56%)}.lumal-cockpit-designer__placed-widget-header{z-index:3;border-bottom:1px solid color-mix(in srgb, var(--lumal-cockpit-slot-border,#06b7fd80), transparent 18%);background:var(--lumal-cockpit-caption-bg,#0223316b);-webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px);align-items:center;gap:6px;min-width:0;min-height:34px;padding:0 4px 0 8px;display:flex}.lumal-cockpit-designer__placed-widget-header>span{min-width:0;color:var(--lumal-cockpit-text,#fff);text-overflow:ellipsis;white-space:nowrap;flex:auto;font-size:12px;font-weight:600;overflow:hidden}.lumal-cockpit-designer__placed-widget-actions{flex:none;align-items:center;gap:3px;display:flex}.lumal-cockpit-designer__placed-widget-body{min-width:0;height:100%;min-height:0;position:relative;overflow:hidden}.lumal-cockpit-designer__placed-widget-body>.lumal-cockpit-designer__widget-preview,.lumal-cockpit-designer__placed-widget-body>.lumal-cockpit-designer__widget-preview-fallback{width:100%;height:100%;position:absolute;inset:0}.lumal-cockpit-designer__widget-action.el-button,.lumal-cockpit-designer__tab-action.el-button,.lumal-cockpit-designer__tab-target.el-button{border-radius:var(--el-border-radius-small);opacity:.72;justify-content:center;align-items:center;width:24px;min-width:24px;height:24px;min-height:24px;padding:0;display:inline-flex}.lumal-cockpit-designer__widget-action.el-button[aria-pressed=true],.lumal-cockpit-designer__tab-action.el-button[aria-pressed=true]{border-color:var(--lumal-cockpit-success,#1dffa0);color:var(--lumal-cockpit-success,#1dffa0);opacity:1;box-shadow:0 0 8px color-mix(in srgb, var(--lumal-cockpit-success,#1dffa0), transparent 52%)}.lumal-cockpit-designer__placed-widget:hover .lumal-cockpit-designer__widget-action,.lumal-cockpit-designer__placed-widget:focus-within .lumal-cockpit-designer__widget-action,.lumal-cockpit-designer__placed-widget-header:hover .lumal-cockpit-designer__widget-action{opacity:1}.lumal-cockpit-designer__tab-card{border:1px solid var(--lumal-cockpit-slot-border,#06b7fd80);background:0 0;border-radius:4px;grid-template-rows:34px minmax(0,1fr);width:100%;height:100%;min-height:0;display:grid;overflow:hidden}.lumal-cockpit-designer__tab-list{border-bottom:1px solid color-mix(in srgb, var(--lumal-cockpit-slot-border,#06b7fd80), transparent 18%);background:var(--lumal-cockpit-caption-bg,#0223316b);align-items:stretch;min-width:0;min-height:34px;display:flex;overflow-x:auto}.lumal-cockpit-designer__tab-item{border-right:1px solid color-mix(in srgb, var(--lumal-cockpit-slot-border,#06b7fd80), transparent 48%);align-items:center;min-width:0;display:inline-flex}.lumal-cockpit-designer__tab-item.is-active{background:color-mix(in srgb, var(--lumal-cockpit-accent,#00cbf4), transparent 88%);box-shadow:inset 0 -2px 0 var(--lumal-cockpit-accent,#00cbf4)}.lumal-cockpit-designer__tab-item.is-keyboard-selected{box-shadow:inset 0 0 0 1px var(--lumal-cockpit-success,#1dffa0)}.lumal-cockpit-designer__tab-widget-title.el-button{text-overflow:ellipsis;white-space:nowrap;border-radius:0;min-width:64px;max-width:148px;height:32px;min-height:32px;padding:0 8px;overflow:hidden}.lumal-cockpit-designer__tab-item.is-active .lumal-cockpit-designer__tab-widget-title{color:var(--lumal-cockpit-title-text,#fff)}.lumal-cockpit-designer__tab-action.el-button,.lumal-cockpit-designer__tab-target.el-button{flex:none;align-self:center;width:22px;min-width:22px;height:22px;min-height:22px;margin-right:2px}.lumal-cockpit-designer__tab-move{cursor:grab}.lumal-cockpit-designer__tab-target.el-button{border-color:var(--lumal-cockpit-success,#1dffa0);color:var(--lumal-cockpit-success,#1dffa0);margin:5px}.lumal-cockpit-designer__tab-preview{min-width:0;min-height:0;position:relative;overflow:hidden}.lumal-cockpit-designer__tab-preview>.lumal-cockpit-designer__empty-cell{border:0;border-radius:0}.lumal-cockpit-designer__widget-preview{background:0 0;width:100%;height:100%;min-height:0;position:relative;overflow:hidden}.lumal-cockpit-designer__widget-preview-stage{pointer-events:none;position:absolute;top:0;left:0}.lumal-cockpit-designer__widget-preview-stage,.lumal-cockpit-designer__widget-preview-stage>.lumal-cockpit-error-boundary,.lumal-cockpit-designer__widget-preview-stage>.lumal-cockpit-error-boundary>*{width:100%;height:100%}.lumal-cockpit-designer__widget-preview-image{object-fit:contain;width:100%;height:100%;display:block}.lumal-cockpit-designer__widget-preview-fallback{width:100%;height:100%;color:var(--lumal-cockpit-text-muted,#9dcdf8);flex-direction:column;justify-content:center;align-items:center;gap:6px;font-size:11px;display:flex}.lumal-cockpit-designer__library{padding:16px}.lumal-cockpit-designer__library-grid{grid-template-columns:repeat(2,minmax(0,1fr));align-content:start;gap:12px 0;width:100%;height:100%;min-height:0;display:grid;overflow:auto}.lumal-cockpit-designer__library-card{cursor:grab;background:0 0;border:0;border-radius:4px;min-width:0;height:128px;transition:box-shadow .16s;display:block;position:relative;overflow:hidden}.lumal-cockpit-designer__library-card:hover,.lumal-cockpit-designer__library-card:focus-within,.lumal-cockpit-designer__library-card.is-selected{z-index:2;box-shadow:0 2px 12px #0003}.lumal-cockpit-designer__library-select.el-button{z-index:3;-webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px);text-overflow:ellipsis;white-space:nowrap;border-radius:0;width:100%;min-width:0;min-height:30px;margin:0;padding:5px 4px;font-size:12px;font-weight:700;position:absolute;bottom:0;left:0;right:0;overflow:hidden}.lumal-cockpit-designer__library-empty{grid-column:1/-1}.lumal-cockpit-designer__footer{color:var(--lumal-cockpit-text-secondary,#d7efff);background:0 0;justify-content:flex-end;align-items:center;gap:18px;padding:0 16px 8px 30px;display:flex}.lumal-cockpit-designer__footer p{margin:0;font-size:14px}.lumal-cockpit-designer__footer-actions .el-button{min-width:72px}.lumal-cockpit-designer .el-input,.lumal-cockpit-designer .el-select,.lumal-cockpit-designer .el-input-number{--el-component-size:32px;--el-input-height:32px}.lumal-cockpit-designer .el-input__wrapper,.lumal-cockpit-designer .el-select__wrapper,.lumal-cockpit-designer .el-input-number .el-input__wrapper{min-height:var(--el-component-size);height:var(--el-component-size);border-radius:var(--el-border-radius-base);background-color:var(--el-fill-color-blank);box-shadow:0 0 0 1px var(--el-input-border-color) inset;padding:0 10px}.lumal-cockpit-designer .el-input__wrapper:hover,.lumal-cockpit-designer .el-select__wrapper:hover,.lumal-cockpit-designer .el-input-number .el-input__wrapper:hover{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.lumal-cockpit-designer .el-input__wrapper.is-focus,.lumal-cockpit-designer .el-select__wrapper.is-focus,.lumal-cockpit-designer .el-input-number .el-input__wrapper.is-focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset, 0 0 0 2px color-mix(in srgb, var(--lumal-cockpit-accent,#00cbf4), transparent 78%)}.lumal-cockpit-designer .el-input-number{width:132px;line-height:var(--el-component-size)}.lumal-cockpit-designer .el-input-number .el-input__wrapper{padding-left:36px;padding-right:36px}.lumal-cockpit-designer .el-input-number .el-input-number__decrease,.lumal-cockpit-designer .el-input-number .el-input-number__increase{border-color:var(--el-input-border-color);background:color-mix(in srgb, var(--el-fill-color-blank), transparent 20%);width:32px;height:auto;color:var(--el-text-color-regular)}.lumal-cockpit-designer .el-input__inner,.lumal-cockpit-designer .el-select__input,.lumal-cockpit-designer .el-select__selected-item,.lumal-cockpit-designer .el-select__placeholder{width:100%;height:var(--el-component-size);min-height:0;box-shadow:none;line-height:var(--el-component-size);color:var(--el-input-text-color);background:0 0;border:0;border-radius:0;outline:0;padding:0;font-size:13px}.lumal-cockpit-designer .el-select__placeholder{color:var(--el-text-color-placeholder)}.lumal-cockpit-designer .el-select__suffix{color:var(--el-text-color-regular)}.lumal-cockpit-designer .el-button{--el-button-bg-color:var(--lumal-cockpit-control-bg,#004a6a66);--el-button-border-color:var(--lumal-cockpit-border,#06b7fd80);--el-button-text-color:var(--lumal-cockpit-text-secondary,#d7efff);--el-button-hover-bg-color:color-mix(in srgb, var(--lumal-cockpit-accent,#00cbf4), transparent 82%);--el-button-hover-border-color:var(--lumal-cockpit-accent,#00cbf4);--el-button-hover-text-color:var(--lumal-cockpit-title-text,#fff);--el-button-active-bg-color:color-mix(in srgb, var(--lumal-cockpit-accent,#00cbf4), transparent 72%);--el-button-active-border-color:var(--lumal-cockpit-accent,#00cbf4);--el-button-active-text-color:var(--lumal-cockpit-title-text,#fff);--el-button-disabled-bg-color:var(--el-disabled-bg-color);--el-button-disabled-border-color:var(--el-disabled-border-color);--el-button-disabled-text-color:var(--el-disabled-text-color);height:var(--el-component-size,32px);min-height:var(--el-component-size,32px);border-radius:var(--el-border-radius-base);box-shadow:none;padding:0 12px}.lumal-cockpit-designer .el-button:focus-visible{outline:2px solid var(--lumal-cockpit-focus-ring,var(--lumal-cockpit-accent,#00cbf4));outline-offset:2px}.lumal-cockpit-designer .el-button.is-circle{width:var(--el-component-size,32px);min-width:var(--el-component-size,32px);height:var(--el-component-size,32px);min-height:var(--el-component-size,32px);padding:0}.lumal-cockpit-designer .el-button--primary,.lumal-cockpit-designer__save.el-button{--el-button-bg-color:var(--lumal-cockpit-accent,#00cbf4);--el-button-border-color:var(--lumal-cockpit-accent,#00cbf4);--el-button-text-color:#fff;--el-button-hover-bg-color:color-mix(in srgb, var(--lumal-cockpit-accent,#00cbf4), #fff 12%);--el-button-hover-border-color:color-mix(in srgb, var(--lumal-cockpit-accent,#00cbf4), #fff 12%);--el-button-hover-text-color:#fff;--el-button-active-bg-color:color-mix(in srgb, var(--lumal-cockpit-accent,#00cbf4), #000 10%);--el-button-active-border-color:color-mix(in srgb, var(--lumal-cockpit-accent,#00cbf4), #000 10%);--el-button-active-text-color:#fff}.lumal-cockpit-designer .el-button--danger{--el-button-bg-color:color-mix(in srgb, var(--lumal-cockpit-danger,#f56c6c), transparent 78%);--el-button-border-color:color-mix(in srgb, var(--lumal-cockpit-danger,#f56c6c), transparent 40%);--el-button-text-color:var(--lumal-cockpit-danger,#f56c6c);--el-button-hover-bg-color:color-mix(in srgb, var(--lumal-cockpit-danger,#f56c6c), transparent 62%);--el-button-hover-border-color:var(--lumal-cockpit-danger,#f56c6c);--el-button-hover-text-color:#fff;--el-button-active-bg-color:color-mix(in srgb, var(--lumal-cockpit-danger,#f56c6c), transparent 48%);--el-button-active-border-color:var(--lumal-cockpit-danger,#f56c6c);--el-button-active-text-color:#fff}.lumal-cockpit-designer .el-button--danger.is-plain{--el-button-bg-color:color-mix(in srgb, var(--lumal-cockpit-danger,#f56c6c), transparent 90%);--el-button-border-color:color-mix(in srgb, var(--lumal-cockpit-danger,#f56c6c), transparent 55%);--el-button-text-color:var(--lumal-cockpit-danger,#f56c6c);--el-button-hover-bg-color:color-mix(in srgb, var(--lumal-cockpit-danger,#f56c6c), transparent 78%);--el-button-hover-text-color:var(--lumal-cockpit-danger,#f56c6c)}.lumal-cockpit-designer__widget-action.el-button,.lumal-cockpit-designer__tab-action.el-button,.lumal-cockpit-designer__tab-target.el-button{border-radius:var(--el-border-radius-small);width:24px;min-width:24px;height:24px;min-height:24px}.lumal-cockpit-designer__tab-action.el-button,.lumal-cockpit-designer__tab-target.el-button{width:22px;min-width:22px;height:22px;min-height:22px}.lumal-cockpit-designer__widget-action.el-button--danger,.lumal-cockpit-designer__tab-action.el-button--danger{--el-button-bg-color:color-mix(in srgb, var(--lumal-cockpit-danger,#f56c6c), transparent 72%);--el-button-border-color:color-mix(in srgb, var(--lumal-cockpit-danger,#f56c6c), transparent 40%);--el-button-text-color:#fff}.lumal-cockpit-designer__empty-cell.el-button{--el-button-bg-color:transparent;--el-button-border-color:var(--lumal-cockpit-slot-border,var(--lumal-cockpit-border));--el-button-text-color:var(--lumal-cockpit-text-secondary);--el-button-hover-bg-color:color-mix(in srgb, var(--lumal-cockpit-accent), transparent 92%);--el-button-hover-border-color:var(--lumal-cockpit-accent);--el-button-hover-text-color:var(--lumal-cockpit-title-text);--el-button-disabled-bg-color:transparent;--el-button-disabled-border-color:var(--lumal-cockpit-slot-border,var(--lumal-cockpit-border));--el-button-disabled-text-color:var(--lumal-cockpit-text-secondary)}.lumal-cockpit-designer__tab-widget-title.el-button,.lumal-cockpit-designer__library-select.el-button{--el-button-bg-color:transparent;--el-button-border-color:transparent;--el-button-text-color:inherit;--el-button-hover-bg-color:transparent;--el-button-hover-border-color:transparent;--el-button-hover-text-color:inherit}.lumal-cockpit-designer .el-switch{--el-switch-on-color:var(--lumal-cockpit-accent,#00cbf4);--el-switch-off-color:color-mix(in srgb, var(--lumal-cockpit-control-bg,#004a6ab8), #000 20%)}.lumal-cockpit-designer .el-alert{--el-alert-bg-color:color-mix(in srgb, var(--lumal-cockpit-danger,#f56c6c), transparent 88%);--el-alert-border-color:color-mix(in srgb, var(--lumal-cockpit-danger,#f56c6c), transparent 55%);--el-alert-title-color:var(--lumal-cockpit-text);border-radius:var(--el-border-radius-base);background-color:var(--el-alert-bg-color);border:1px solid var(--el-alert-border-color)}.lumal-cockpit-designer .el-button+.el-button{margin-left:0}.lumal-cockpit-designer .is-drag-ghost{opacity:.35}.lumal-cockpit-designer .is-drag-chosen{box-shadow:0 0 0 2px var(--lumal-cockpit-drop-target,#00d7ff57)}@media (width<=1180px){.lumal-cockpit-designer__controlbar{padding-inline:20px}.lumal-cockpit-designer__workspace{grid-template-columns:minmax(0,1fr) 250px;gap:8px;padding:0 8px 8px 20px}.lumal-cockpit-designer__assembly{padding:12px}.lumal-cockpit-designer__assembly-stage{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:8px}.lumal-cockpit-designer__library{padding:12px}.lumal-cockpit-designer__library-grid{grid-template-columns:minmax(0,1fr);gap:10px}.lumal-cockpit-designer__footer{gap:12px;padding-inline:20px 12px}.lumal-cockpit-designer__footer p{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}}
|
|
2
|
+
/*$vite$:1*/
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
//#region src/registry/createCockpitRegistry.ts
|
|
2
|
+
function e() {
|
|
3
|
+
let e = /* @__PURE__ */ new Map();
|
|
4
|
+
function t(t) {
|
|
5
|
+
if (!t.type.trim()) throw Error("[cockpit] 模块 type 不能为空。");
|
|
6
|
+
if (e.has(t.type)) throw Error(`[cockpit] 模块 type 已注册:${t.type}`);
|
|
7
|
+
e.set(t.type, t);
|
|
8
|
+
}
|
|
9
|
+
function n(e) {
|
|
10
|
+
e.forEach(t);
|
|
11
|
+
}
|
|
12
|
+
function r(t) {
|
|
13
|
+
e.delete(t);
|
|
14
|
+
}
|
|
15
|
+
function i(t) {
|
|
16
|
+
return e.get(t);
|
|
17
|
+
}
|
|
18
|
+
function a() {
|
|
19
|
+
return [...e.values()];
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
registerWidget: t,
|
|
23
|
+
registerWidgets: n,
|
|
24
|
+
unregisterWidget: r,
|
|
25
|
+
resolveWidget: i,
|
|
26
|
+
listWidgets: a
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//#endregion
|
|
30
|
+
export { e as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e(){let e=new Map;function t(t){if(!t.type.trim())throw Error(`[cockpit] 模块 type 不能为空。`);if(e.has(t.type))throw Error(`[cockpit] 模块 type 已注册:${t.type}`);e.set(t.type,t)}function n(e){e.forEach(t)}function r(t){e.delete(t)}function i(t){return e.get(t)}function a(){return[...e.values()]}return{registerWidget:t,registerWidgets:n,unregisterWidget:r,resolveWidget:i,listWidgets:a}}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return e}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./resolveComponent-BF1aCxAk.cjs"),t=require("./validate-KSzm5SZW.cjs");let n=require("vue"),r=require("element-plus"),i=require("@lumal/icons-vue");function a(e,t,n){return(t=f(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(){return o=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},o.apply(null,arguments)}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function c(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?s(Object(n),!0).forEach(function(t){a(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):s(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function l(e,t){if(e==null)return{};var n,r,i=u(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function u(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function d(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function f(e){var t=d(e,`string`);return typeof t==`symbol`?t:t+``}function p(e){"@babel/helpers - typeof";return p=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},p(e)}var m=`1.15.7`;function h(e){if(typeof window<`u`&&window.navigator)return!!navigator.userAgent.match(e)}var g=h(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i),_=h(/Edge/i),v=h(/firefox/i),y=h(/safari/i)&&!h(/chrome/i)&&!h(/android/i),b=h(/iP(ad|od|hone)/i),x=h(/chrome/i)&&h(/android/i),S={capture:!1,passive:!1};function C(e,t,n){e.addEventListener(t,n,!g&&S)}function w(e,t,n){e.removeEventListener(t,n,!g&&S)}function T(e,t){if(t){if(t[0]===`>`&&(t=t.substring(1)),e)try{if(e.matches)return e.matches(t);if(e.msMatchesSelector)return e.msMatchesSelector(t);if(e.webkitMatchesSelector)return e.webkitMatchesSelector(t)}catch{return!1}return!1}}function E(e){return e.host&&e!==document&&e.host.nodeType&&e.host!==e?e.host:e.parentNode}function D(e,t,n,r){if(e){n||=document;do{if(t!=null&&(t[0]===`>`?e.parentNode===n&&T(e,t):T(e,t))||r&&e===n)return e;if(e===n)break}while(e=E(e))}return null}var O=/\s+/g;function k(e,t,n){e&&t&&(e.classList?e.classList[n?`add`:`remove`](t):e.className=((` `+e.className+` `).replace(O,` `).replace(` `+t+` `,` `)+(n?` `+t:``)).replace(O,` `))}function A(e,t,n){var r=e&&e.style;if(r){if(n===void 0)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(e,``):e.currentStyle&&(n=e.currentStyle),t===void 0?n:n[t];!(t in r)&&t.indexOf(`webkit`)===-1&&(t=`-webkit-`+t),r[t]=n+(typeof n==`string`?``:`px`)}}function j(e,t){var n=``;if(typeof e==`string`)n=e;else do{var r=A(e,`transform`);r&&r!==`none`&&(n=r+` `+n)}while(!t&&(e=e.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function M(e,t,n){if(e){var r=e.getElementsByTagName(t),i=0,a=r.length;if(n)for(;i<a;i++)n(r[i],i);return r}return[]}function N(){return document.scrollingElement||document.documentElement}function P(e,t,n,r,i){if(!(!e.getBoundingClientRect&&e!==window)){var a,o,s,c,l,u,d;if(e!==window&&e.parentNode&&e!==N()?(a=e.getBoundingClientRect(),o=a.top,s=a.left,c=a.bottom,l=a.right,u=a.height,d=a.width):(o=0,s=0,c=window.innerHeight,l=window.innerWidth,u=window.innerHeight,d=window.innerWidth),(t||n)&&e!==window&&(i||=e.parentNode,!g))do if(i&&i.getBoundingClientRect&&(A(i,`transform`)!==`none`||n&&A(i,`position`)!==`static`)){var f=i.getBoundingClientRect();o-=f.top+parseInt(A(i,`border-top-width`)),s-=f.left+parseInt(A(i,`border-left-width`)),c=o+a.height,l=s+a.width;break}while(i=i.parentNode);if(r&&e!==window){var p=j(i||e),m=p&&p.a,h=p&&p.d;p&&(o/=h,s/=m,d/=m,u/=h,c=o+u,l=s+d)}return{top:o,left:s,bottom:c,right:l,width:d,height:u}}}function ee(e,t,n){for(var r=I(e,!0),i=P(e)[t];r;){var a=P(r)[n],o=void 0;if(o=n===`top`||n===`left`?i>=a:i<=a,!o)return r;if(r===N())break;r=I(r,!1)}return!1}function te(e,t,n,r){for(var i=0,a=0,o=e.children;a<o.length;){if(o[a].style.display!==`none`&&o[a]!==Q.ghost&&(r||o[a]!==Q.dragged)&&D(o[a],n.draggable,e,!1)){if(i===t)return o[a];i++}a++}return null}function ne(e,t){for(var n=e.lastElementChild;n&&(n===Q.ghost||A(n,`display`)===`none`||t&&!T(n,t));)n=n.previousElementSibling;return n||null}function F(e,t){var n=0;if(!e||!e.parentNode)return-1;for(;e=e.previousElementSibling;)e.nodeName.toUpperCase()!==`TEMPLATE`&&e!==Q.clone&&(!t||T(e,t))&&n++;return n}function re(e){var t=0,n=0,r=N();if(e)do{var i=j(e),a=i.a,o=i.d;t+=e.scrollLeft*a,n+=e.scrollTop*o}while(e!==r&&(e=e.parentNode));return[t,n]}function ie(e,t){for(var n in e)if(e.hasOwnProperty(n)){for(var r in t)if(t.hasOwnProperty(r)&&t[r]===e[n][r])return Number(n)}return-1}function I(e,t){if(!e||!e.getBoundingClientRect)return N();var n=e,r=!1;do if(n.clientWidth<n.scrollWidth||n.clientHeight<n.scrollHeight){var i=A(n);if(n.clientWidth<n.scrollWidth&&(i.overflowX==`auto`||i.overflowX==`scroll`)||n.clientHeight<n.scrollHeight&&(i.overflowY==`auto`||i.overflowY==`scroll`)){if(!n.getBoundingClientRect||n===document.body)return N();if(r||t)return n;r=!0}}while(n=n.parentNode);return N()}function ae(e,t){if(e&&t)for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function oe(e,t){return Math.round(e.top)===Math.round(t.top)&&Math.round(e.left)===Math.round(t.left)&&Math.round(e.height)===Math.round(t.height)&&Math.round(e.width)===Math.round(t.width)}var se;function ce(e,t){return function(){if(!se){var n=arguments,r=this;n.length===1?e.call(r,n[0]):e.apply(r,n),se=setTimeout(function(){se=void 0},t)}}}function le(){clearTimeout(se),se=void 0}function ue(e,t,n){e.scrollLeft+=t,e.scrollTop+=n}function de(e){var t=window.Polymer,n=window.jQuery||window.Zepto;return t&&t.dom?t.dom(e).cloneNode(!0):n?n(e).clone(!0)[0]:e.cloneNode(!0)}function fe(e,t,n){var r={};return Array.from(e.children).forEach(function(i){if(!(!D(i,t.draggable,e,!1)||i.animated||i===n)){var a=P(i);r.left=Math.min(r.left??1/0,a.left),r.top=Math.min(r.top??1/0,a.top),r.right=Math.max(r.right??-1/0,a.right),r.bottom=Math.max(r.bottom??-1/0,a.bottom)}}),r.width=r.right-r.left,r.height=r.bottom-r.top,r.x=r.left,r.y=r.top,r}var L=`Sortable`+new Date().getTime();function pe(){var e=[],t;return{captureAnimationState:function(){e=[],this.options.animation&&[].slice.call(this.el.children).forEach(function(t){if(!(A(t,`display`)===`none`||t===Q.ghost)){e.push({target:t,rect:P(t)});var n=c({},e[e.length-1].rect);if(t.thisAnimationDuration){var r=j(t,!0);r&&(n.top-=r.f,n.left-=r.e)}t.fromRect=n}})},addAnimationState:function(t){e.push(t)},removeAnimationState:function(t){e.splice(ie(e,{target:t}),1)},animateAll:function(n){var r=this;if(!this.options.animation){clearTimeout(t),typeof n==`function`&&n();return}var i=!1,a=0;e.forEach(function(e){var t=0,n=e.target,o=n.fromRect,s=P(n),c=n.prevFromRect,l=n.prevToRect,u=e.rect,d=j(n,!0);d&&(s.top-=d.f,s.left-=d.e),n.toRect=s,n.thisAnimationDuration&&oe(c,s)&&!oe(o,s)&&(u.top-s.top)/(u.left-s.left)===(o.top-s.top)/(o.left-s.left)&&(t=he(u,c,l,r.options)),oe(s,o)||(n.prevFromRect=o,n.prevToRect=s,t||=r.options.animation,r.animate(n,u,s,t)),t&&(i=!0,a=Math.max(a,t),clearTimeout(n.animationResetTimer),n.animationResetTimer=setTimeout(function(){n.animationTime=0,n.prevFromRect=null,n.fromRect=null,n.prevToRect=null,n.thisAnimationDuration=null},t),n.thisAnimationDuration=t)}),clearTimeout(t),i?t=setTimeout(function(){typeof n==`function`&&n()},a):typeof n==`function`&&n(),e=[]},animate:function(e,t,n,r){if(r){A(e,`transition`,``),A(e,`transform`,``);var i=j(this.el),a=i&&i.a,o=i&&i.d,s=(t.left-n.left)/(a||1),c=(t.top-n.top)/(o||1);e.animatingX=!!s,e.animatingY=!!c,A(e,`transform`,`translate3d(`+s+`px,`+c+`px,0)`),this.forRepaintDummy=me(e),A(e,`transition`,`transform `+r+`ms`+(this.options.easing?` `+this.options.easing:``)),A(e,`transform`,`translate3d(0,0,0)`),typeof e.animated==`number`&&clearTimeout(e.animated),e.animated=setTimeout(function(){A(e,`transition`,``),A(e,`transform`,``),e.animated=!1,e.animatingX=!1,e.animatingY=!1},r)}}}}function me(e){return e.offsetWidth}function he(e,t,n,r){return Math.sqrt((t.top-e.top)**2+(t.left-e.left)**2)/Math.sqrt((t.top-n.top)**2+(t.left-n.left)**2)*r.animation}var ge=[],_e={initializeByDefault:!0},ve={mount:function(e){for(var t in _e)_e.hasOwnProperty(t)&&!(t in e)&&(e[t]=_e[t]);ge.forEach(function(t){if(t.pluginName===e.pluginName)throw`Sortable: Cannot mount plugin ${e.pluginName} more than once`}),ge.push(e)},pluginEvent:function(e,t,n){var r=this;this.eventCanceled=!1,n.cancel=function(){r.eventCanceled=!0};var i=e+`Global`;ge.forEach(function(r){t[r.pluginName]&&(t[r.pluginName][i]&&t[r.pluginName][i](c({sortable:t},n)),t.options[r.pluginName]&&t[r.pluginName][e]&&t[r.pluginName][e](c({sortable:t},n)))})},initializePlugins:function(e,t,n,r){for(var i in ge.forEach(function(r){var i=r.pluginName;if(!(!e.options[i]&&!r.initializeByDefault)){var a=new r(e,t,e.options);a.sortable=e,a.options=e.options,e[i]=a,o(n,a.defaults)}}),e.options)if(e.options.hasOwnProperty(i)){var a=this.modifyOption(e,i,e.options[i]);a!==void 0&&(e.options[i]=a)}},getEventProperties:function(e,t){var n={};return ge.forEach(function(r){typeof r.eventProperties==`function`&&o(n,r.eventProperties.call(t[r.pluginName],e))}),n},modifyOption:function(e,t,n){var r;return ge.forEach(function(i){e[i.pluginName]&&i.optionListeners&&typeof i.optionListeners[t]==`function`&&(r=i.optionListeners[t].call(e[i.pluginName],n))}),r}};function ye(e){var t=e.sortable,n=e.rootEl,r=e.name,i=e.targetEl,a=e.cloneEl,o=e.toEl,s=e.fromEl,l=e.oldIndex,u=e.newIndex,d=e.oldDraggableIndex,f=e.newDraggableIndex,p=e.originalEvent,m=e.putSortable,h=e.extraEventProperties;if(t||=n&&n[L],t){var v,y=t.options,b=`on`+r.charAt(0).toUpperCase()+r.substr(1);window.CustomEvent&&!g&&!_?v=new CustomEvent(r,{bubbles:!0,cancelable:!0}):(v=document.createEvent(`Event`),v.initEvent(r,!0,!0)),v.to=o||n,v.from=s||n,v.item=i||n,v.clone=a,v.oldIndex=l,v.newIndex=u,v.oldDraggableIndex=d,v.newDraggableIndex=f,v.originalEvent=p,v.pullMode=m?m.lastPutMode:void 0;var x=c(c({},h),ve.getEventProperties(r,t));for(var S in x)v[S]=x[S];n&&n.dispatchEvent(v),y[b]&&y[b].call(t,v)}}var be=[`evt`],R=function(e,t){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},r=n.evt,i=l(n,be);ve.pluginEvent.bind(Q)(e,t,c({dragEl:B,parentEl:V,ghostEl:H,rootEl:U,nextEl:W,lastDownEl:xe,cloneEl:G,cloneHidden:K,dragStarted:Ne,putSortable:Y,activeSortable:Q.active,originalEvent:r,oldIndex:Se,oldDraggableIndex:Ce,newIndex:q,newDraggableIndex:J,hideGhostForTarget:Ze,unhideGhostForTarget:Qe,cloneNowHidden:function(){K=!0},cloneNowShown:function(){K=!1},dispatchSortableEvent:function(e){z({sortable:t,name:e,originalEvent:r})}},i))};function z(e){ye(c({putSortable:Y,cloneEl:G,targetEl:B,rootEl:U,oldIndex:Se,oldDraggableIndex:Ce,newIndex:q,newDraggableIndex:J},e))}var B,V,H,U,W,xe,G,K,Se,q,Ce,J,we,Y,Te=!1,Ee=!1,De=[],Oe,X,ke,Ae,je,Me,Ne,Pe,Fe,Ie=!1,Le=!1,Re,Z,ze=[],Be=!1,Ve=[],He=typeof document<`u`,Ue=b,We=_||g?`cssFloat`:`float`,Ge=He&&!x&&!b&&`draggable`in document.createElement(`div`),Ke=function(){if(He){if(g)return!1;var e=document.createElement(`x`);return e.style.cssText=`pointer-events:auto`,e.style.pointerEvents===`auto`}}(),qe=function(e,t){var n=A(e),r=parseInt(n.width)-parseInt(n.paddingLeft)-parseInt(n.paddingRight)-parseInt(n.borderLeftWidth)-parseInt(n.borderRightWidth),i=te(e,0,t),a=te(e,1,t),o=i&&A(i),s=a&&A(a),c=o&&parseInt(o.marginLeft)+parseInt(o.marginRight)+P(i).width,l=s&&parseInt(s.marginLeft)+parseInt(s.marginRight)+P(a).width;if(n.display===`flex`)return n.flexDirection===`column`||n.flexDirection===`column-reverse`?`vertical`:`horizontal`;if(n.display===`grid`)return n.gridTemplateColumns.split(` `).length<=1?`vertical`:`horizontal`;if(i&&o.float&&o.float!==`none`){var u=o.float===`left`?`left`:`right`;return a&&(s.clear===`both`||s.clear===u)?`vertical`:`horizontal`}return i&&(o.display===`block`||o.display===`flex`||o.display===`table`||o.display===`grid`||c>=r&&n[We]===`none`||a&&n[We]===`none`&&c+l>r)?`vertical`:`horizontal`},Je=function(e,t,n){var r=n?e.left:e.top,i=n?e.right:e.bottom,a=n?e.width:e.height,o=n?t.left:t.top,s=n?t.right:t.bottom,c=n?t.width:t.height;return r===o||i===s||r+a/2===o+c/2},Ye=function(e,t){var n;return De.some(function(r){var i=r[L].options.emptyInsertThreshold;if(!(!i||ne(r))){var a=P(r),o=e>=a.left-i&&e<=a.right+i,s=t>=a.top-i&&t<=a.bottom+i;if(o&&s)return n=r}}),n},Xe=function(e){function t(e,n){return function(r,i,a,o){var s=r.options.group.name&&i.options.group.name&&r.options.group.name===i.options.group.name;if(e==null&&(n||s))return!0;if(e==null||e===!1)return!1;if(n&&e===`clone`)return e;if(typeof e==`function`)return t(e(r,i,a,o),n)(r,i,a,o);var c=(n?r:i).options.group.name;return e===!0||typeof e==`string`&&e===c||e.join&&e.indexOf(c)>-1}}var n={},r=e.group;(!r||p(r)!=`object`)&&(r={name:r}),n.name=r.name,n.checkPull=t(r.pull,!0),n.checkPut=t(r.put),n.revertClone=r.revertClone,e.group=n},Ze=function(){!Ke&&H&&A(H,`display`,`none`)},Qe=function(){!Ke&&H&&A(H,`display`,``)};He&&!x&&document.addEventListener(`click`,function(e){if(Ee)return e.preventDefault(),e.stopPropagation&&e.stopPropagation(),e.stopImmediatePropagation&&e.stopImmediatePropagation(),Ee=!1,!1},!0);var $e=function(e){if(B){e=e.touches?e.touches[0]:e;var t=Ye(e.clientX,e.clientY);if(t){var n={};for(var r in e)e.hasOwnProperty(r)&&(n[r]=e[r]);n.target=n.rootEl=t,n.preventDefault=void 0,n.stopPropagation=void 0,t[L]._onDragOver(n)}}},et=function(e){B&&B.parentNode[L]._isOutsideThisEl(e.target)};function Q(e,t){if(!(e&&e.nodeType&&e.nodeType===1))throw`Sortable: \`el\` must be an HTMLElement, not ${{}.toString.call(e)}`;this.el=e,this.options=t=o({},t),e[L]=this;var n={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(e.nodeName)?`>li`:`>*`,swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return qe(e,this.options)},ghostClass:`sortable-ghost`,chosenClass:`sortable-chosen`,dragClass:`sortable-drag`,ignore:`a, img`,filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(e,t){e.setData(`Text`,t.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:`data-id`,delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:`sortable-fallback`,fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:Q.supportPointer!==!1&&`PointerEvent`in window&&(!y||b),emptyInsertThreshold:5};for(var r in ve.initializePlugins(this,e,n),n)!(r in t)&&(t[r]=n[r]);for(var i in Xe(t),this)i.charAt(0)===`_`&&typeof this[i]==`function`&&(this[i]=this[i].bind(this));this.nativeDraggable=!t.forceFallback&&Ge,this.nativeDraggable&&(this.options.touchStartThreshold=1),t.supportPointer?C(e,`pointerdown`,this._onTapStart):(C(e,`mousedown`,this._onTapStart),C(e,`touchstart`,this._onTapStart)),this.nativeDraggable&&(C(e,`dragover`,this),C(e,`dragenter`,this)),De.push(this.el),t.store&&t.store.get&&this.sort(t.store.get(this)||[]),o(this,pe())}Q.prototype={constructor:Q,_isOutsideThisEl:function(e){!this.el.contains(e)&&e!==this.el&&(Pe=null)},_getDirection:function(e,t){return typeof this.options.direction==`function`?this.options.direction.call(this,e,t,B):this.options.direction},_onTapStart:function(e){if(e.cancelable){var t=this,n=this.el,r=this.options,i=r.preventOnFilter,a=e.type,o=e.touches&&e.touches[0]||e.pointerType&&e.pointerType===`touch`&&e,s=(o||e).target,c=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||s,l=r.filter;if(ut(n),!B&&!(/mousedown|pointerdown/.test(a)&&e.button!==0||r.disabled)&&!c.isContentEditable&&!(!this.nativeDraggable&&y&&s&&s.tagName.toUpperCase()===`SELECT`)&&(s=D(s,r.draggable,n,!1),!(s&&s.animated)&&xe!==s)){if(Se=F(s),Ce=F(s,r.draggable),typeof l==`function`){if(l.call(this,e,s,this)){z({sortable:t,rootEl:c,name:`filter`,targetEl:s,toEl:n,fromEl:n}),R(`filter`,t,{evt:e}),i&&e.preventDefault();return}}else if(l&&(l=l.split(`,`).some(function(r){if(r=D(c,r.trim(),n,!1),r)return z({sortable:t,rootEl:r,name:`filter`,targetEl:s,fromEl:n,toEl:n}),R(`filter`,t,{evt:e}),!0}),l)){i&&e.preventDefault();return}r.handle&&!D(c,r.handle,n,!1)||this._prepareDragStart(e,o,s)}}},_prepareDragStart:function(e,t,n){var r=this,i=r.el,a=r.options,o=i.ownerDocument,s;if(n&&!B&&n.parentNode===i){var c=P(n);if(U=i,B=n,V=B.parentNode,W=B.nextSibling,xe=n,we=a.group,Q.dragged=B,Oe={target:B,clientX:(t||e).clientX,clientY:(t||e).clientY},je=Oe.clientX-c.left,Me=Oe.clientY-c.top,this._lastX=(t||e).clientX,this._lastY=(t||e).clientY,B.style[`will-change`]=`all`,s=function(){if(R(`delayEnded`,r,{evt:e}),Q.eventCanceled){r._onDrop();return}r._disableDelayedDragEvents(),!v&&r.nativeDraggable&&(B.draggable=!0),r._triggerDragStart(e,t),z({sortable:r,name:`choose`,originalEvent:e}),k(B,a.chosenClass,!0)},a.ignore.split(`,`).forEach(function(e){M(B,e.trim(),rt)}),C(o,`dragover`,$e),C(o,`mousemove`,$e),C(o,`touchmove`,$e),a.supportPointer?(C(o,`pointerup`,r._onDrop),!this.nativeDraggable&&C(o,`pointercancel`,r._onDrop)):(C(o,`mouseup`,r._onDrop),C(o,`touchend`,r._onDrop),C(o,`touchcancel`,r._onDrop)),v&&this.nativeDraggable&&(this.options.touchStartThreshold=4,B.draggable=!0),R(`delayStart`,this,{evt:e}),a.delay&&(!a.delayOnTouchOnly||t)&&(!this.nativeDraggable||!(_||g))){if(Q.eventCanceled){this._onDrop();return}a.supportPointer?(C(o,`pointerup`,r._disableDelayedDrag),C(o,`pointercancel`,r._disableDelayedDrag)):(C(o,`mouseup`,r._disableDelayedDrag),C(o,`touchend`,r._disableDelayedDrag),C(o,`touchcancel`,r._disableDelayedDrag)),C(o,`mousemove`,r._delayedDragTouchMoveHandler),C(o,`touchmove`,r._delayedDragTouchMoveHandler),a.supportPointer&&C(o,`pointermove`,r._delayedDragTouchMoveHandler),r._dragStartTimer=setTimeout(s,a.delay)}else s()}},_delayedDragTouchMoveHandler:function(e){var t=e.touches?e.touches[0]:e;Math.max(Math.abs(t.clientX-this._lastX),Math.abs(t.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){B&&rt(B),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var e=this.el.ownerDocument;w(e,`mouseup`,this._disableDelayedDrag),w(e,`touchend`,this._disableDelayedDrag),w(e,`touchcancel`,this._disableDelayedDrag),w(e,`pointerup`,this._disableDelayedDrag),w(e,`pointercancel`,this._disableDelayedDrag),w(e,`mousemove`,this._delayedDragTouchMoveHandler),w(e,`touchmove`,this._delayedDragTouchMoveHandler),w(e,`pointermove`,this._delayedDragTouchMoveHandler)},_triggerDragStart:function(e,t){t||=e.pointerType==`touch`&&e,!this.nativeDraggable||t?this.options.supportPointer?C(document,`pointermove`,this._onTouchMove):t?C(document,`touchmove`,this._onTouchMove):C(document,`mousemove`,this._onTouchMove):(C(B,`dragend`,this),C(U,`dragstart`,this._onDragStart));try{document.selection?dt(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch{}},_dragStarted:function(e,t){if(Te=!1,U&&B){R(`dragStarted`,this,{evt:t}),this.nativeDraggable&&C(document,`dragover`,et);var n=this.options;!e&&k(B,n.dragClass,!1),k(B,n.ghostClass,!0),Q.active=this,e&&this._appendGhost(),z({sortable:this,name:`start`,originalEvent:t})}else this._nulling()},_emulateDragOver:function(){if(X){this._lastX=X.clientX,this._lastY=X.clientY,Ze();for(var e=document.elementFromPoint(X.clientX,X.clientY),t=e;e&&e.shadowRoot&&(e=e.shadowRoot.elementFromPoint(X.clientX,X.clientY),e!==t);)t=e;if(B.parentNode[L]._isOutsideThisEl(e),t)do{if(t[L]){var n=void 0;if(n=t[L]._onDragOver({clientX:X.clientX,clientY:X.clientY,target:e,rootEl:t}),n&&!this.options.dragoverBubble)break}e=t}while(t=E(t));Qe()}},_onTouchMove:function(e){if(Oe){var t=this.options,n=t.fallbackTolerance,r=t.fallbackOffset,i=e.touches?e.touches[0]:e,a=H&&j(H,!0),o=H&&a&&a.a,s=H&&a&&a.d,c=Ue&&Z&&re(Z),l=(i.clientX-Oe.clientX+r.x)/(o||1)+(c?c[0]-ze[0]:0)/(o||1),u=(i.clientY-Oe.clientY+r.y)/(s||1)+(c?c[1]-ze[1]:0)/(s||1);if(!Q.active&&!Te){if(n&&Math.max(Math.abs(i.clientX-this._lastX),Math.abs(i.clientY-this._lastY))<n)return;this._onDragStart(e,!0)}if(H){a?(a.e+=l-(ke||0),a.f+=u-(Ae||0)):a={a:1,b:0,c:0,d:1,e:l,f:u};var d=`matrix(${a.a},${a.b},${a.c},${a.d},${a.e},${a.f})`;A(H,`webkitTransform`,d),A(H,`mozTransform`,d),A(H,`msTransform`,d),A(H,`transform`,d),ke=l,Ae=u,X=i}e.cancelable&&e.preventDefault()}},_appendGhost:function(){if(!H){var e=this.options.fallbackOnBody?document.body:U,t=P(B,!0,Ue,!0,e),n=this.options;if(Ue){for(Z=e;A(Z,`position`)===`static`&&A(Z,`transform`)===`none`&&Z!==document;)Z=Z.parentNode;Z!==document.body&&Z!==document.documentElement?(Z===document&&(Z=N()),t.top+=Z.scrollTop,t.left+=Z.scrollLeft):Z=N(),ze=re(Z)}H=B.cloneNode(!0),k(H,n.ghostClass,!1),k(H,n.fallbackClass,!0),k(H,n.dragClass,!0),A(H,`transition`,``),A(H,`transform`,``),A(H,`box-sizing`,`border-box`),A(H,`margin`,0),A(H,`top`,t.top),A(H,`left`,t.left),A(H,`width`,t.width),A(H,`height`,t.height),A(H,`opacity`,`0.8`),A(H,`position`,Ue?`absolute`:`fixed`),A(H,`zIndex`,`100000`),A(H,`pointerEvents`,`none`),Q.ghost=H,e.appendChild(H),A(H,`transform-origin`,je/parseInt(H.style.width)*100+`% `+Me/parseInt(H.style.height)*100+`%`)}},_onDragStart:function(e,t){var n=this,r=e.dataTransfer,i=n.options;if(R(`dragStart`,this,{evt:e}),Q.eventCanceled){this._onDrop();return}R(`setupClone`,this),Q.eventCanceled||(G=de(B),G.removeAttribute(`id`),G.draggable=!1,G.style[`will-change`]=``,this._hideClone(),k(G,this.options.chosenClass,!1),Q.clone=G),n.cloneId=dt(function(){R(`clone`,n),!Q.eventCanceled&&(n.options.removeCloneOnHide||U.insertBefore(G,B),n._hideClone(),z({sortable:n,name:`clone`}))}),!t&&k(B,i.dragClass,!0),t?(Ee=!0,n._loopId=setInterval(n._emulateDragOver,50)):(w(document,`mouseup`,n._onDrop),w(document,`touchend`,n._onDrop),w(document,`touchcancel`,n._onDrop),r&&(r.effectAllowed=`move`,i.setData&&i.setData.call(n,r,B)),C(document,`drop`,n),A(B,`transform`,`translateZ(0)`)),Te=!0,n._dragStartId=dt(n._dragStarted.bind(n,t,e)),C(document,`selectstart`,n),Ne=!0,window.getSelection().removeAllRanges(),y&&A(document.body,`user-select`,`none`)},_onDragOver:function(e){var t=this.el,n=e.target,r,i,a,o=this.options,s=o.group,l=Q.active,u=we===s,d=o.sort,f=Y||l,p,m=this,h=!1;if(Be)return;function g(o,s){R(o,m,c({evt:e,isOwner:u,axis:p?`vertical`:`horizontal`,revert:a,dragRect:r,targetRect:i,canSort:d,fromSortable:f,target:n,completed:v,onMove:function(n,i){return nt(U,t,B,r,n,P(n),e,i)},changed:y},s))}function _(){g(`dragOverAnimationCapture`),m.captureAnimationState(),m!==f&&f.captureAnimationState()}function v(r){return g(`dragOverCompleted`,{insertion:r}),r&&(u?l._hideClone():l._showClone(m),m!==f&&(k(B,Y?Y.options.ghostClass:l.options.ghostClass,!1),k(B,o.ghostClass,!0)),Y!==m&&m!==Q.active?Y=m:m===Q.active&&Y&&(Y=null),f===m&&(m._ignoreWhileAnimating=n),m.animateAll(function(){g(`dragOverAnimationComplete`),m._ignoreWhileAnimating=null}),m!==f&&(f.animateAll(),f._ignoreWhileAnimating=null)),(n===B&&!B.animated||n===t&&!n.animated)&&(Pe=null),!o.dragoverBubble&&!e.rootEl&&n!==document&&(B.parentNode[L]._isOutsideThisEl(e.target),!r&&$e(e)),!o.dragoverBubble&&e.stopPropagation&&e.stopPropagation(),h=!0}function y(){q=F(B),J=F(B,o.draggable),z({sortable:m,name:`change`,toEl:t,newIndex:q,newDraggableIndex:J,originalEvent:e})}if(e.preventDefault!==void 0&&e.cancelable&&e.preventDefault(),n=D(n,o.draggable,t,!0),g(`dragOver`),Q.eventCanceled)return h;if(B.contains(e.target)||n.animated&&n.animatingX&&n.animatingY||m._ignoreWhileAnimating===n)return v(!1);if(Ee=!1,l&&!o.disabled&&(u?d||(a=V!==U):Y===this||(this.lastPutMode=we.checkPull(this,l,B,e))&&s.checkPut(this,l,B,e))){if(p=this._getDirection(e,n)===`vertical`,r=P(B),g(`dragOverValid`),Q.eventCanceled)return h;if(a)return V=U,_(),this._hideClone(),g(`revert`),Q.eventCanceled||(W?U.insertBefore(B,W):U.appendChild(B)),v(!0);var b=ne(t,o.draggable);if(!b||ot(e,p,this)&&!b.animated){if(b===B)return v(!1);if(b&&t===e.target&&(n=b),n&&(i=P(n)),nt(U,t,B,r,n,i,e,!!n)!==!1)return _(),b&&b.nextSibling?t.insertBefore(B,b.nextSibling):t.appendChild(B),V=t,y(),v(!0)}else if(b&&at(e,p,this)){var x=te(t,0,o,!0);if(x===B)return v(!1);if(n=x,i=P(n),nt(U,t,B,r,n,i,e,!1)!==!1)return _(),t.insertBefore(B,x),V=t,y(),v(!0)}else if(n.parentNode===t){i=P(n);var S=0,C,w=B.parentNode!==t,T=!Je(B.animated&&B.toRect||r,n.animated&&n.toRect||i,p),E=p?`top`:`left`,O=ee(n,`top`,`top`)||ee(B,`top`,`top`),j=O?O.scrollTop:void 0;Pe!==n&&(C=i[E],Ie=!1,Le=!T&&o.invertSwap||w),S=st(e,n,i,p,T?1:o.swapThreshold,o.invertedSwapThreshold==null?o.swapThreshold:o.invertedSwapThreshold,Le,Pe===n);var M;if(S!==0){var N=F(B);do N-=S,M=V.children[N];while(M&&(A(M,`display`)===`none`||M===H))}if(S===0||M===n)return v(!1);Pe=n,Fe=S;var re=n.nextElementSibling,ie=!1;ie=S===1;var I=nt(U,t,B,r,n,i,e,ie);if(I!==!1)return(I===1||I===-1)&&(ie=I===1),Be=!0,setTimeout(it,30),_(),ie&&!re?t.appendChild(B):n.parentNode.insertBefore(B,ie?re:n),O&&ue(O,0,j-O.scrollTop),V=B.parentNode,C!==void 0&&!Le&&(Re=Math.abs(C-P(n)[E])),y(),v(!0)}if(t.contains(B))return v(!1)}return!1},_ignoreWhileAnimating:null,_offMoveEvents:function(){w(document,`mousemove`,this._onTouchMove),w(document,`touchmove`,this._onTouchMove),w(document,`pointermove`,this._onTouchMove),w(document,`dragover`,$e),w(document,`mousemove`,$e),w(document,`touchmove`,$e)},_offUpEvents:function(){var e=this.el.ownerDocument;w(e,`mouseup`,this._onDrop),w(e,`touchend`,this._onDrop),w(e,`pointerup`,this._onDrop),w(e,`pointercancel`,this._onDrop),w(e,`touchcancel`,this._onDrop),w(document,`selectstart`,this)},_onDrop:function(e){var t=this.el,n=this.options;if(q=F(B),J=F(B,n.draggable),R(`drop`,this,{evt:e}),V=B&&B.parentNode,q=F(B),J=F(B,n.draggable),Q.eventCanceled){this._nulling();return}Te=!1,Le=!1,Ie=!1,clearInterval(this._loopId),clearTimeout(this._dragStartTimer),ft(this.cloneId),ft(this._dragStartId),this.nativeDraggable&&(w(document,`drop`,this),w(t,`dragstart`,this._onDragStart)),this._offMoveEvents(),this._offUpEvents(),y&&A(document.body,`user-select`,``),A(B,`transform`,``),e&&(Ne&&(e.cancelable&&e.preventDefault(),!n.dropBubble&&e.stopPropagation()),H&&H.parentNode&&H.parentNode.removeChild(H),(U===V||Y&&Y.lastPutMode!==`clone`)&&G&&G.parentNode&&G.parentNode.removeChild(G),B&&(this.nativeDraggable&&w(B,`dragend`,this),rt(B),B.style[`will-change`]=``,Ne&&!Te&&k(B,Y?Y.options.ghostClass:this.options.ghostClass,!1),k(B,this.options.chosenClass,!1),z({sortable:this,name:`unchoose`,toEl:V,newIndex:null,newDraggableIndex:null,originalEvent:e}),U===V?q!==Se&&q>=0&&(z({sortable:this,name:`update`,toEl:V,originalEvent:e}),z({sortable:this,name:`sort`,toEl:V,originalEvent:e})):(q>=0&&(z({rootEl:V,name:`add`,toEl:V,fromEl:U,originalEvent:e}),z({sortable:this,name:`remove`,toEl:V,originalEvent:e}),z({rootEl:V,name:`sort`,toEl:V,fromEl:U,originalEvent:e}),z({sortable:this,name:`sort`,toEl:V,originalEvent:e})),Y&&Y.save()),Q.active&&((q==null||q===-1)&&(q=Se,J=Ce),z({sortable:this,name:`end`,toEl:V,originalEvent:e}),this.save()))),this._nulling()},_nulling:function(){R(`nulling`,this),U=B=V=H=W=G=xe=K=Oe=X=Ne=q=J=Se=Ce=Pe=Fe=Y=we=Q.dragged=Q.ghost=Q.clone=Q.active=null;var e=this.el;Ve.forEach(function(t){e.contains(t)&&(t.checked=!0)}),Ve.length=ke=Ae=0},handleEvent:function(e){switch(e.type){case`drop`:case`dragend`:this._onDrop(e);break;case`dragenter`:case`dragover`:B&&(this._onDragOver(e),tt(e));break;case`selectstart`:e.preventDefault();break}},toArray:function(){for(var e=[],t,n=this.el.children,r=0,i=n.length,a=this.options;r<i;r++)t=n[r],D(t,a.draggable,this.el,!1)&&e.push(t.getAttribute(a.dataIdAttr)||lt(t));return e},sort:function(e,t){var n={},r=this.el;this.toArray().forEach(function(e,t){var i=r.children[t];D(i,this.options.draggable,r,!1)&&(n[e]=i)},this),t&&this.captureAnimationState(),e.forEach(function(e){n[e]&&(r.removeChild(n[e]),r.appendChild(n[e]))}),t&&this.animateAll()},save:function(){var e=this.options.store;e&&e.set&&e.set(this)},closest:function(e,t){return D(e,t||this.options.draggable,this.el,!1)},option:function(e,t){var n=this.options;if(t===void 0)return n[e];var r=ve.modifyOption(this,e,t);r===void 0?n[e]=t:n[e]=r,e===`group`&&Xe(n)},destroy:function(){R(`destroy`,this);var e=this.el;e[L]=null,w(e,`mousedown`,this._onTapStart),w(e,`touchstart`,this._onTapStart),w(e,`pointerdown`,this._onTapStart),this.nativeDraggable&&(w(e,`dragover`,this),w(e,`dragenter`,this)),Array.prototype.forEach.call(e.querySelectorAll(`[draggable]`),function(e){e.removeAttribute(`draggable`)}),this._onDrop(),this._disableDelayedDragEvents(),De.splice(De.indexOf(this.el),1),this.el=e=null},_hideClone:function(){if(!K){if(R(`hideClone`,this),Q.eventCanceled)return;A(G,`display`,`none`),this.options.removeCloneOnHide&&G.parentNode&&G.parentNode.removeChild(G),K=!0}},_showClone:function(e){if(e.lastPutMode!==`clone`){this._hideClone();return}if(K){if(R(`showClone`,this),Q.eventCanceled)return;B.parentNode==U&&!this.options.group.revertClone?U.insertBefore(G,B):W?U.insertBefore(G,W):U.appendChild(G),this.options.group.revertClone&&this.animate(B,G),A(G,`display`,``),K=!1}}};function tt(e){e.dataTransfer&&(e.dataTransfer.dropEffect=`move`),e.cancelable&&e.preventDefault()}function nt(e,t,n,r,i,a,o,s){var c,l=e[L],u=l.options.onMove,d;return window.CustomEvent&&!g&&!_?c=new CustomEvent(`move`,{bubbles:!0,cancelable:!0}):(c=document.createEvent(`Event`),c.initEvent(`move`,!0,!0)),c.to=t,c.from=e,c.dragged=n,c.draggedRect=r,c.related=i||t,c.relatedRect=a||P(t),c.willInsertAfter=s,c.originalEvent=o,e.dispatchEvent(c),u&&(d=u.call(l,c,o)),d}function rt(e){e.draggable=!1}function it(){Be=!1}function at(e,t,n){var r=P(te(n.el,0,n.options,!0)),i=fe(n.el,n.options,H),a=10;return t?e.clientX<i.left-a||e.clientY<r.top&&e.clientX<r.right:e.clientY<i.top-a||e.clientY<r.bottom&&e.clientX<r.left}function ot(e,t,n){var r=P(ne(n.el,n.options.draggable)),i=fe(n.el,n.options,H),a=10;return t?e.clientX>i.right+a||e.clientY>r.bottom&&e.clientX>r.left:e.clientY>i.bottom+a||e.clientX>r.right&&e.clientY>r.top}function st(e,t,n,r,i,a,o,s){var c=r?e.clientY:e.clientX,l=r?n.height:n.width,u=r?n.top:n.left,d=r?n.bottom:n.right,f=!1;if(!o){if(s&&Re<l*i){if(!Ie&&(Fe===1?c>u+l*a/2:c<d-l*a/2)&&(Ie=!0),Ie)f=!0;else if(Fe===1?c<u+Re:c>d-Re)return-Fe}else if(c>u+l*(1-i)/2&&c<d-l*(1-i)/2)return ct(t)}return f||=o,f&&(c<u+l*a/2||c>d-l*a/2)?c>u+l/2?1:-1:0}function ct(e){return F(B)<F(e)?1:-1}function lt(e){for(var t=e.tagName+e.className+e.src+e.href+e.textContent,n=t.length,r=0;n--;)r+=t.charCodeAt(n);return r.toString(36)}function ut(e){Ve.length=0;for(var t=e.getElementsByTagName(`input`),n=t.length;n--;){var r=t[n];r.checked&&Ve.push(r)}}function dt(e){return setTimeout(e,0)}function ft(e){return clearTimeout(e)}He&&C(document,`touchmove`,function(e){(Q.active||Te)&&e.cancelable&&e.preventDefault()}),Q.utils={on:C,off:w,css:A,find:M,is:function(e,t){return!!D(e,t,e,!1)},extend:ae,throttle:ce,closest:D,toggleClass:k,clone:de,index:F,nextTick:dt,cancelNextTick:ft,detectDirection:qe,getChild:te,expando:L},Q.get=function(e){return e[L]},Q.mount=function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];t[0].constructor===Array&&(t=t[0]),t.forEach(function(e){if(!e.prototype||!e.prototype.constructor)throw`Sortable: Mounted plugin must be a constructor function, not ${{}.toString.call(e)}`;e.utils&&(Q.utils=c(c({},Q.utils),e.utils)),ve.mount(e)})},Q.create=function(e,t){return new Q(e,t)},Q.version=m;var $=[],pt,mt,ht=!1,gt,_t,vt,yt;function bt(){function e(){for(var e in this.defaults={scroll:!0,forceAutoScrollFallback:!1,scrollSensitivity:30,scrollSpeed:10,bubbleScroll:!0},this)e.charAt(0)===`_`&&typeof this[e]==`function`&&(this[e]=this[e].bind(this))}return e.prototype={dragStarted:function(e){var t=e.originalEvent;this.sortable.nativeDraggable?C(document,`dragover`,this._handleAutoScroll):this.options.supportPointer?C(document,`pointermove`,this._handleFallbackAutoScroll):t.touches?C(document,`touchmove`,this._handleFallbackAutoScroll):C(document,`mousemove`,this._handleFallbackAutoScroll)},dragOverCompleted:function(e){var t=e.originalEvent;!this.options.dragOverBubble&&!t.rootEl&&this._handleAutoScroll(t)},drop:function(){this.sortable.nativeDraggable?w(document,`dragover`,this._handleAutoScroll):(w(document,`pointermove`,this._handleFallbackAutoScroll),w(document,`touchmove`,this._handleFallbackAutoScroll),w(document,`mousemove`,this._handleFallbackAutoScroll)),St(),xt(),le()},nulling:function(){vt=mt=pt=ht=yt=gt=_t=null,$.length=0},_handleFallbackAutoScroll:function(e){this._handleAutoScroll(e,!0)},_handleAutoScroll:function(e,t){var n=this,r=(e.touches?e.touches[0]:e).clientX,i=(e.touches?e.touches[0]:e).clientY,a=document.elementFromPoint(r,i);if(vt=e,t||this.options.forceAutoScrollFallback||_||g||y){Ct(e,this.options,a,t);var o=I(a,!0);ht&&(!yt||r!==gt||i!==_t)&&(yt&&St(),yt=setInterval(function(){var a=I(document.elementFromPoint(r,i),!0);a!==o&&(o=a,xt()),Ct(e,n.options,a,t)},10),gt=r,_t=i)}else{if(!this.options.bubbleScroll||I(a,!0)===N()){xt();return}Ct(e,this.options,I(a,!1),!1)}}},o(e,{pluginName:`scroll`,initializeByDefault:!0})}function xt(){$.forEach(function(e){clearInterval(e.pid)}),$=[]}function St(){clearInterval(yt)}var Ct=ce(function(e,t,n,r){if(t.scroll){var i=(e.touches?e.touches[0]:e).clientX,a=(e.touches?e.touches[0]:e).clientY,o=t.scrollSensitivity,s=t.scrollSpeed,c=N(),l=!1,u;mt!==n&&(mt=n,xt(),pt=t.scroll,u=t.scrollFn,pt===!0&&(pt=I(n,!0)));var d=0,f=pt;do{var p=f,m=P(p),h=m.top,g=m.bottom,_=m.left,v=m.right,y=m.width,b=m.height,x=void 0,S=void 0,C=p.scrollWidth,w=p.scrollHeight,T=A(p),E=p.scrollLeft,D=p.scrollTop;p===c?(x=y<C&&(T.overflowX===`auto`||T.overflowX===`scroll`||T.overflowX===`visible`),S=b<w&&(T.overflowY===`auto`||T.overflowY===`scroll`||T.overflowY===`visible`)):(x=y<C&&(T.overflowX===`auto`||T.overflowX===`scroll`),S=b<w&&(T.overflowY===`auto`||T.overflowY===`scroll`));var O=x&&(Math.abs(v-i)<=o&&E+y<C)-(Math.abs(_-i)<=o&&!!E),k=S&&(Math.abs(g-a)<=o&&D+b<w)-(Math.abs(h-a)<=o&&!!D);if(!$[d])for(var j=0;j<=d;j++)$[j]||($[j]={});($[d].vx!=O||$[d].vy!=k||$[d].el!==p)&&($[d].el=p,$[d].vx=O,$[d].vy=k,clearInterval($[d].pid),(O!=0||k!=0)&&(l=!0,$[d].pid=setInterval(function(){r&&this.layer===0&&Q.active._onTouchMove(vt);var t=$[this.layer].vy?$[this.layer].vy*s:0,n=$[this.layer].vx?$[this.layer].vx*s:0;typeof u==`function`&&u.call(Q.dragged.parentNode[L],n,t,e,vt,$[this.layer].el)!==`continue`||ue($[this.layer].el,n,t)}.bind({layer:d}),24))),d++}while(t.bubbleScroll&&f!==c&&(f=I(f,!1)));ht=l}},30),wt=function(e){var t=e.originalEvent,n=e.putSortable,r=e.dragEl,i=e.activeSortable,a=e.dispatchSortableEvent,o=e.hideGhostForTarget,s=e.unhideGhostForTarget;if(t){var c=n||i;o();var l=t.changedTouches&&t.changedTouches.length?t.changedTouches[0]:t,u=document.elementFromPoint(l.clientX,l.clientY);s(),c&&!c.el.contains(u)&&(a(`spill`),this.onSpill({dragEl:r,putSortable:n}))}};function Tt(){}Tt.prototype={startIndex:null,dragStart:function(e){var t=e.oldDraggableIndex;this.startIndex=t},onSpill:function(e){var t=e.dragEl,n=e.putSortable;this.sortable.captureAnimationState(),n&&n.captureAnimationState();var r=te(this.sortable.el,this.startIndex,this.options);r?this.sortable.el.insertBefore(t,r):this.sortable.el.appendChild(t),this.sortable.animateAll(),n&&n.animateAll()},drop:wt},o(Tt,{pluginName:`revertOnSpill`});function Et(){}Et.prototype={onSpill:function(e){var t=e.dragEl,n=e.putSortable||this.sortable;n.captureAnimationState(),t.parentNode&&t.parentNode.removeChild(t),n.animateAll()},drop:wt},o(Et,{pluginName:`removeOnSpill`}),Q.mount(new bt),Q.mount(Et,Tt);var Dt=[`src`,`alt`],Ot={class:`lumal-cockpit-designer__widget-preview-fallback`},kt=(0,n.defineComponent)({__name:`CockpitWidgetPreview`,props:{cockpitId:{},definition:{},instanceId:{},layoutId:{},messageBus:{},baseWidth:{default:480},baseHeight:{default:270}},setup(t){let r=t,a=(0,n.ref)(null),o=r.messageBus??e.r(),s=(0,n.shallowReactive)({cockpitId:r.cockpitId,layoutId:r.layoutId,instanceId:r.instanceId,mode:`design`,messages:o});(0,n.watchEffect)(()=>{s.cockpitId=r.cockpitId,s.layoutId=r.layoutId,s.instanceId=r.instanceId}),e.v(s);let c=(0,n.computed)(()=>e.t(r.definition.component)),{result:l}=e.x(a,{baseWidth:()=>r.baseWidth,baseHeight:()=>r.baseHeight}),u=(0,n.computed)(()=>({width:`${r.baseWidth}px`,height:`${r.baseHeight}px`,transform:`translate(${l.value.offsetX}px, ${l.value.offsetY}px) scale(${l.value.scale})`,transformOrigin:`top left`}));return(0,n.onBeforeUnmount)(()=>{o.clearInstance(r.instanceId)}),(r,o)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{ref_key:`previewRef`,ref:a,class:`lumal-cockpit-designer__widget-preview`},[t.definition.thumbnail?((0,n.openBlock)(),(0,n.createElementBlock)(`img`,{key:0,src:t.definition.thumbnail,alt:`${t.definition.label}预览`,class:`lumal-cockpit-designer__widget-preview-image`},null,8,Dt)):((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{key:1,class:`lumal-cockpit-designer__widget-preview-stage`,style:(0,n.normalizeStyle)(u.value),inert:``,"aria-hidden":`true`},[(0,n.createVNode)(e.n,null,{error:(0,n.withCtx)(()=>[(0,n.createElementVNode)(`div`,Ot,[(0,n.createVNode)((0,n.unref)(i.LumalIcon),{name:t.definition.icon||`lumal:grid`,size:28},null,8,[`name`]),o[0]||=(0,n.createElementVNode)(`span`,null,`预览不可用`,-1)])]),default:(0,n.withCtx)(()=>[((0,n.openBlock)(),(0,n.createBlock)((0,n.resolveDynamicComponent)(c.value),{context:(0,n.unref)(s)},null,8,[`context`]))]),_:1})],4))],512))}}),At={class:`lumal-cockpit-designer__library`,"aria-label":`模块库`},jt=[`data-cockpit-library-type`,`data-cockpit-library-title`],Mt=(0,n.defineComponent)({__name:`CockpitComponentLibrary`,props:{cockpitId:{},layoutId:{},registry:{},selectedType:{}},emits:[`selectWidget`],setup(e,{emit:t}){let i=e,a=t,o=(0,n.ref)(null),s,c=(0,n.computed)(()=>i.registry.listWidgets());return(0,n.onMounted)(()=>{o.value&&(s=Q.create(o.value,{animation:160,group:{name:`lumal-cockpit-designer-modules`,pull:`clone`,put:!1},sort:!1,draggable:`.lumal-cockpit-designer__library-card`,ghostClass:`is-drag-ghost`,chosenClass:`is-drag-chosen`}))}),(0,n.onBeforeUnmount)(()=>{s?.destroy()}),(t,i)=>((0,n.openBlock)(),(0,n.createElementBlock)(`aside`,At,[(0,n.createElementVNode)(`div`,{ref_key:`libraryRef`,ref:o,class:`lumal-cockpit-designer__library-grid`},[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(c.value,t=>((0,n.openBlock)(),(0,n.createElementBlock)(`article`,{key:t.type,class:(0,n.normalizeClass)([`lumal-cockpit-designer__library-card`,{"is-selected":e.selectedType===t.type}]),"data-cockpit-library-type":t.type,"data-cockpit-library-title":t.label},[(0,n.createVNode)(kt,{"cockpit-id":e.cockpitId,definition:t,"instance-id":`library-preview:${t.type}`,"layout-id":e.layoutId},null,8,[`cockpit-id`,`definition`,`instance-id`,`layout-id`]),(0,n.createVNode)((0,n.unref)(r.ElButton),{text:``,class:`lumal-cockpit-designer__library-select`,"aria-label":`选择或拖动模块:${t.label}`,"aria-pressed":e.selectedType===t.type,onClick:e=>a(`selectWidget`,t)},{default:(0,n.withCtx)(()=>[(0,n.createTextVNode)((0,n.toDisplayString)(t.label),1)]),_:2},1032,[`aria-label`,`aria-pressed`,`onClick`])],10,jt))),128)),c.value.length?(0,n.createCommentVNode)(``,!0):((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.ElEmpty),{key:0,class:`lumal-cockpit-designer__library-empty`,description:`暂无可用模块`,"image-size":56}))],512)]))}});async function Nt(){try{return await r.ElMessageBox.confirm(`目标槽位已有模块,是否替换?`,`确认替换`,{cancelButtonText:`取消`,confirmButtonText:`替换`,type:`warning`}),!0}catch{return!1}}var Pt=(0,n.defineComponent)({__name:`CockpitWidgetDropZone`,props:{allowMultiple:{type:Boolean,default:!1},dragHandle:{default:``},sortableTarget:{default:``},target:{},widget:{default:void 0}},emits:[`drop`],setup(e,{emit:t}){let r=e,i=t,a=(0,n.ref)(null),o;function s(e){if(e)try{let t=JSON.parse(e);if(t.kind===`cell`||t.kind===`tabs`)return t}catch{return}}function c(e){return e.to!==e.from||r.allowMultiple}function l(e,t=!1){let n=s(e.dataset.cockpitDragSource),r=e.dataset.cockpitLibraryType;return n?{source:n,replace:t}:r?{library:{type:r,title:e.dataset.cockpitLibraryTitle},replace:t}:{}}async function u(e){let t=e.item,a=l(t),o=!r.allowMultiple&&!!r.widget;if(o&&!await Nt()){if(a.source){let n=e.from.children.item(e.oldIndex??e.from.children.length);e.from.insertBefore(t,n)}else t.remove();return}i(`drop`,{...a,replace:o}),(0,n.nextTick)(()=>t.remove())}return(0,n.onMounted)(()=>{if(!a.value)return;let e=r.sortableTarget?a.value.querySelector(r.sortableTarget):a.value;e&&(o=Q.create(e,{animation:160,group:{name:`lumal-cockpit-designer-modules`,pull:!0,put:!0},handle:r.dragHandle||void 0,sort:r.allowMultiple,draggable:`.lumal-cockpit-designer__drag-item`,ghostClass:`is-drag-ghost`,chosenClass:`is-drag-chosen`,onMove:c,onAdd:e=>void u(e),onUpdate(e){r.allowMultiple&&e.oldIndex!==void 0&&e.newIndex!==void 0&&i(`drop`,{reorder:{oldIndex:e.oldIndex,newIndex:e.newIndex}})}}))}),(0,n.onBeforeUnmount)(()=>{o?.destroy()}),(t,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{ref_key:`zoneRef`,ref:a,class:(0,n.normalizeClass)([`lumal-cockpit-designer__drop-zone`,{"is-tabs":e.allowMultiple}])},[(0,n.renderSlot)(t.$slots,`default`)],2))}}),Ft=[`data-side`],It=[`aria-label`],Lt={class:`lumal-cockpit-designer__region-head-meta`},Rt={class:`lumal-cockpit-designer__field`},zt={class:`lumal-cockpit-designer__field`},Bt={class:`lumal-cockpit-designer__field lumal-cockpit-designer__region-width-field`},Vt={key:0,class:`lumal-cockpit-designer__grid-rows`},Ht=[`aria-label`],Ut={class:`lumal-cockpit-designer__field`},Wt={class:`lumal-cockpit-designer__tabs-switch`},Gt=[`data-cockpit-drag-source`],Kt={class:`lumal-cockpit-designer__placed-widget-header`},qt={class:`lumal-cockpit-designer__placed-widget-actions`},Jt={class:`lumal-cockpit-designer__placed-widget-body`},Yt={key:1,class:`lumal-cockpit-designer__widget-preview-fallback`},Xt=[`aria-label`],Zt=[`data-cockpit-drag-source`],Qt=[`id`,`aria-labelledby`],$t={key:1,class:`lumal-cockpit-designer__widget-preview-fallback`},en=(0,n.defineComponent)({__name:`CockpitLayoutEditor`,props:{cockpitId:{},draft:{},registry:{},placementSelection:{},previewMessageBus:{},side:{}},emits:[`selectPlaced`,`clearPlacement`],setup(e,{emit:t}){let a=e,o=t,s=(0,n.computed)(()=>{let e=a.draft.activeLayout.value;if(e)return a.side===`left`?e.left:e.right});function c(e,t){return{kind:`cell`,side:a.side,rowId:e.id,cellId:t}}function l(e,t){return{kind:`tabs`,side:a.side,rowId:e.id,widgetId:t}}function u(e){return a.registry.resolveWidget(e)}function d(){let e=s.value?.columns.length??1;return Array.from({length:Math.max(1,e)},()=>`minmax(0, 1fr)`).join(` `)}function f(e){return e.widgets.find(t=>t.id===e.activeWidgetId)??e.widgets[0]}function p(e,t){return e.kind!==t.kind||e.side!==t.side||e.rowId!==t.rowId?!1:e.kind===`cell`?e.cellId===t.cellId:e.widgetId===t.widgetId}function m(e){return a.placementSelection?.kind===`placed`&&p(a.placementSelection.location,e)}function h(e){let t=a.placementSelection;return!!(t&&(t.kind!==`placed`||!p(t.location,e)))}function g(e,t){a.draft.resizeRegion(a.side,e,t)||r.ElMessage.warning(`缩减区域会移除已放置模块,请先拖动模块到保留槽位后再操作。`)}function _(e,t){if(!a.draft.setRowTabs(a.side,e.id,t)){r.ElMessage.warning(`Tab 行中的模块数超过当前列数,无法解除合并。`);return}a.placementSelection?.kind===`placed`&&a.placementSelection.location.side===a.side&&a.placementSelection.location.rowId===e.id&&o(`clearPlacement`)}function v(e,t){o(`selectPlaced`,{kind:`placed`,location:e,widgetId:t.id,title:t.title??u(t.type)?.label??t.type})}function y(e){m(e)&&o(`clearPlacement`),a.draft.removeWidget(e)}async function b(e){let t=a.placementSelection;if(!t||t.kind===`placed`&&p(t.location,e))return;let n=!1;if(e.kind===`cell`&&a.draft.hasWidgetAt(e)&&(n=await Nt(),!n))return;if(t.kind===`library`){a.draft.addWidget(e,t.type,t.title,n)||r.ElMessage.warning(`模块放置失败,请检查目标槽位。`);return}let i=a.draft.moveWidget(t.location,e,n);if(i.requiresReplace&&await Nt()&&(i=a.draft.moveWidget(t.location,e,!0)),!i.moved){r.ElMessage.warning(`模块移动失败,请重新选择目标。`);return}o(`clearPlacement`)}function x(e,t){if(t.reorder&&e.kind===`tabs`){a.draft.reorderTabWidgets(a.side,e.rowId,t.reorder.oldIndex,t.reorder.newIndex);return}if(t.library){a.draft.addWidget(e,t.library.type,t.library.title,t.replace)||r.ElMessage.warning(`目标槽位已有模块,请确认替换后再操作。`);return}if(!t.source)return;let n=a.draft.moveWidget(t.source,e,t.replace);!n.moved&&!n.requiresReplace?r.ElMessage.error(`模块移动失败。`):n.moved&&a.placementSelection?.kind===`placed`&&p(a.placementSelection.location,t.source)&&o(`clearPlacement`)}async function S(e,t,r){if(![`ArrowLeft`,`ArrowRight`,`Home`,`End`].includes(r.key)||!e.widgets.length)return;r.preventDefault();let i=e.widgets.length-1,o=r.key===`Home`?0:r.key===`End`?i:r.key===`ArrowRight`?(t+1)%e.widgets.length:(t-1+e.widgets.length)%e.widgets.length;a.draft.setActiveTab(a.side,e.id,e.widgets[o].id),await(0,n.nextTick)(),r.currentTarget.closest(`[role="tablist"]`)?.querySelectorAll(`[role="tab"]`)[o]?.focus()}return(t,a)=>((0,n.openBlock)(),(0,n.createElementBlock)(`section`,{class:`lumal-cockpit-designer__region`,"data-side":e.side},[(0,n.createElementVNode)(`header`,{class:`lumal-cockpit-designer__region-head`,"data-role":`region-tools`,role:`group`,"aria-label":`${e.side===`left`?`左侧`:`右侧`}区域布局设置`},[(0,n.createElementVNode)(`div`,Lt,[(0,n.createElementVNode)(`strong`,null,(0,n.toDisplayString)(e.side===`left`?`左侧区域`:`右侧区域`),1),a[7]||=(0,n.createElementVNode)(`span`,null,`调整网格结构与区域宽`,-1)]),(0,n.createElementVNode)(`label`,Rt,[a[8]||=(0,n.createElementVNode)(`span`,null,`行`,-1),(0,n.createVNode)((0,n.unref)(r.ElInputNumber),{"model-value":s.value?.rows.length??1,min:1,"aria-label":`${e.side===`left`?`左侧`:`右侧`}区域行数`,onChange:a[0]||=e=>g(e??1,s.value?.columns.length??1)},null,8,[`model-value`,`aria-label`])]),(0,n.createElementVNode)(`label`,zt,[a[9]||=(0,n.createElementVNode)(`span`,null,`列`,-1),(0,n.createVNode)((0,n.unref)(r.ElInputNumber),{"model-value":s.value?.columns.length??1,min:1,"aria-label":`${e.side===`left`?`左侧`:`右侧`}区域列数`,onChange:a[1]||=e=>g(s.value?.rows.length??1,e??1)},null,8,[`model-value`,`aria-label`])]),(0,n.createElementVNode)(`label`,Bt,[a[10]||=(0,n.createElementVNode)(`span`,null,`区域宽`,-1),(0,n.createVNode)((0,n.unref)(r.ElInputNumber),{"model-value":s.value?.width??0,min:Math.max(1,s.value?.columns.length??1),"aria-label":`${e.side===`left`?`左侧`:`右侧`}区域宽度像素`,onChange:a[2]||=t=>e.draft.setRegionWidth(e.side,t??s.value?.width??0)},null,8,[`model-value`,`min`,`aria-label`]),a[11]||=(0,n.createElementVNode)(`em`,null,`px`,-1)])],8,It),s.value?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,Vt,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(s.value.rows,(t,o)=>((0,n.openBlock)(),(0,n.createElementBlock)(`section`,{key:t.id,class:`lumal-cockpit-designer__grid-row`,style:(0,n.normalizeStyle)({flex:`${t.height} 1 0`})},[(0,n.createElementVNode)(`header`,{class:`lumal-cockpit-designer__grid-row-head`,"data-role":`row-tools`,role:`group`,"aria-label":`${e.side===`left`?`左侧`:`右侧`}第 ${o+1} 行布局设置`},[(0,n.createElementVNode)(`strong`,null,`第 `+(0,n.toDisplayString)(o+1)+` 行`,1),(0,n.createElementVNode)(`label`,Ut,[a[12]||=(0,n.createElementVNode)(`span`,null,`行高`,-1),(0,n.createVNode)((0,n.unref)(r.ElInputNumber),{"model-value":t.height,min:1,max:100,precision:3,"aria-label":`第 ${o+1} 行高度百分比`,onChange:n=>e.draft.setRowHeight(e.side,t.id,n??t.height)},null,8,[`model-value`,`aria-label`,`onChange`]),a[13]||=(0,n.createElementVNode)(`em`,null,`%`,-1)]),(0,n.createElementVNode)(`label`,Wt,[a[14]||=(0,n.createElementVNode)(`span`,null,`合并列`,-1),(0,n.createVNode)((0,n.unref)(r.ElSwitch),{"model-value":t.mode===`tabs`,onChange:e=>_(t,!!e)},null,8,[`model-value`,`onChange`])])],8,Ht),t.mode===`grid`?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{key:0,class:`lumal-cockpit-designer__grid-cells`,style:(0,n.normalizeStyle)({gridTemplateColumns:d()})},[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(t.cells,o=>((0,n.openBlock)(),(0,n.createBlock)(Pt,{key:o.id,target:c(t,o.id),widget:o.widget,onDrop:e=>x(c(t,o.id),e)},{default:(0,n.withCtx)(()=>[o.widget?((0,n.openBlock)(),(0,n.createElementBlock)(`article`,{key:0,class:(0,n.normalizeClass)([`lumal-cockpit-designer__placed-widget lumal-cockpit-designer__drag-item`,{"is-keyboard-selected":m(c(t,o.id))}]),"data-cockpit-drag-source":JSON.stringify(c(t,o.id)),"data-role":`placed-widget`},[(0,n.createElementVNode)(`header`,Kt,[(0,n.createElementVNode)(`span`,null,(0,n.toDisplayString)(o.widget.title??o.widget.type),1),(0,n.createElementVNode)(`div`,qt,[(0,n.createVNode)((0,n.unref)(r.ElTooltip),{content:`选择并移动模块`,placement:`top`},{default:(0,n.withCtx)(()=>[(0,n.createVNode)((0,n.unref)(r.ElButton),{class:`lumal-cockpit-designer__widget-action`,"data-role":`select-move-source`,"aria-label":`选择移动模块 ${o.widget.title??o.widget.type}`,"aria-pressed":m(c(t,o.id)),onMousedown:a[3]||=(0,n.withModifiers)(()=>{},[`stop`]),onClick:(0,n.withModifiers)(e=>v(c(t,o.id),o.widget),[`stop`])},{default:(0,n.withCtx)(()=>[(0,n.createVNode)((0,n.unref)(i.LumalIcon),{name:`lumal:more`,size:12})]),_:1},8,[`aria-label`,`aria-pressed`,`onClick`])]),_:2},1024),h(c(t,o.id))?((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.ElTooltip),{key:0,content:`移动并替换到此槽位`,placement:`top`},{default:(0,n.withCtx)(()=>[(0,n.createVNode)((0,n.unref)(r.ElButton),{class:`lumal-cockpit-designer__widget-action`,"data-role":`keyboard-target`,"aria-label":`移动并替换 ${o.widget.title??o.widget.type}`,onMousedown:a[4]||=(0,n.withModifiers)(()=>{},[`stop`]),onClick:(0,n.withModifiers)(e=>b(c(t,o.id)),[`stop`])},{default:(0,n.withCtx)(()=>[(0,n.createVNode)((0,n.unref)(i.LumalIcon),{name:`lumal:plus`,size:12})]),_:1},8,[`aria-label`,`onClick`])]),_:2},1024)):(0,n.createCommentVNode)(``,!0),(0,n.createVNode)((0,n.unref)(r.ElTooltip),{content:`移除模块`,placement:`top`},{default:(0,n.withCtx)(()=>[(0,n.createVNode)((0,n.unref)(r.ElButton),{type:`danger`,class:`lumal-cockpit-designer__widget-action`,"data-role":`remove-widget`,"aria-label":`移除模块 ${o.widget.title??o.widget.type}`,onClick:e=>y(c(t,o.id))},{default:(0,n.withCtx)(()=>[(0,n.createVNode)((0,n.unref)(i.LumalIcon),{name:`lumal:close`,size:12})]),_:1},8,[`aria-label`,`onClick`])]),_:2},1024)])]),(0,n.createElementVNode)(`div`,Jt,[u(o.widget.type)?((0,n.openBlock)(),(0,n.createBlock)(kt,{key:0,"cockpit-id":e.cockpitId,definition:u(o.widget.type),"instance-id":o.widget.id,"layout-id":e.draft.activeLayout.value?.id??``,"message-bus":e.previewMessageBus},null,8,[`cockpit-id`,`definition`,`instance-id`,`layout-id`,`message-bus`])):((0,n.openBlock)(),(0,n.createElementBlock)(`div`,Yt,` 未注册模块 `))])],10,Gt)):((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.ElButton),{key:1,class:`lumal-cockpit-designer__empty-cell`,plain:``,disabled:!e.placementSelection,"data-role":`keyboard-target`,onClick:e=>b(c(t,o.id))},{default:(0,n.withCtx)(()=>[(0,n.createElementVNode)(`span`,null,(0,n.toDisplayString)(e.placementSelection?`放入 ${e.placementSelection.title}`:`请置入模块`),1)]),_:1},8,[`disabled`,`onClick`]))]),_:2},1032,[`target`,`widget`,`onDrop`]))),128))],4)):((0,n.openBlock)(),(0,n.createBlock)(Pt,{key:1,class:`lumal-cockpit-designer__tab-row`,"allow-multiple":``,"drag-handle":`.lumal-cockpit-designer__tab-move`,"sortable-target":`.lumal-cockpit-designer__tab-list`,target:l(t),onDrop:e=>x(l(t),e)},{default:(0,n.withCtx)(()=>[(0,n.createElementVNode)(`section`,{class:(0,n.normalizeClass)([`lumal-cockpit-designer__tab-card`,{"is-empty":!t.widgets.length}])},[(0,n.createElementVNode)(`header`,{class:`lumal-cockpit-designer__tab-list`,role:`tablist`,"aria-label":`${e.side===`left`?`左侧`:`右侧`}第 ${o+1} 行模块`},[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(t.widgets,(o,s)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{key:o.id,class:(0,n.normalizeClass)([`lumal-cockpit-designer__tab-item lumal-cockpit-designer__drag-item`,{"is-active":t.activeWidgetId===o.id,"is-keyboard-selected":m(l(t,o.id))}]),"data-cockpit-drag-source":JSON.stringify(l(t,o.id))},[(0,n.createVNode)((0,n.unref)(r.ElButton),{text:``,class:`lumal-cockpit-designer__tab-widget-title`,role:`tab`,id:`designer-tab-${o.id}`,"aria-controls":`designer-tabpanel-${t.id}`,"aria-selected":t.activeWidgetId===o.id,tabindex:t.activeWidgetId===o.id?0:-1,onClick:n=>e.draft.setActiveTab(e.side,t.id,o.id),onKeydown:e=>S(t,s,e)},{default:(0,n.withCtx)(()=>[(0,n.createTextVNode)((0,n.toDisplayString)(o.title??o.type),1)]),_:2},1032,[`id`,`aria-controls`,`aria-selected`,`tabindex`,`onClick`,`onKeydown`]),(0,n.createVNode)((0,n.unref)(r.ElTooltip),{content:`拖拽或选择移动 Tab`,placement:`top`},{default:(0,n.withCtx)(()=>[(0,n.createVNode)((0,n.unref)(r.ElButton),{class:`lumal-cockpit-designer__tab-action lumal-cockpit-designer__tab-move`,"data-role":`select-move-source`,"aria-label":`选择移动 Tab ${o.title??o.type}`,"aria-pressed":m(l(t,o.id)),onMousedown:a[5]||=(0,n.withModifiers)(()=>{},[`stop`]),onClick:(0,n.withModifiers)(e=>v(l(t,o.id),o),[`stop`])},{default:(0,n.withCtx)(()=>[(0,n.createVNode)((0,n.unref)(i.LumalIcon),{name:`lumal:more`,size:11})]),_:1},8,[`aria-label`,`aria-pressed`,`onClick`])]),_:2},1024),(0,n.createVNode)((0,n.unref)(r.ElTooltip),{content:`移除 Tab`,placement:`top`},{default:(0,n.withCtx)(()=>[(0,n.createVNode)((0,n.unref)(r.ElButton),{type:`danger`,class:`lumal-cockpit-designer__tab-action`,"data-role":`remove-widget`,"aria-label":`移除 Tab 模块 ${o.title??o.type}`,onMousedown:a[6]||=(0,n.withModifiers)(()=>{},[`stop`]),onClick:(0,n.withModifiers)(e=>y(l(t,o.id)),[`stop`])},{default:(0,n.withCtx)(()=>[(0,n.createVNode)((0,n.unref)(i.LumalIcon),{name:`lumal:close`,size:11})]),_:1},8,[`aria-label`,`onClick`])]),_:2},1024)],10,Zt))),128)),t.widgets.length&&e.placementSelection?((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.ElTooltip),{key:0,content:`移入此 Tab 行`,placement:`top`},{default:(0,n.withCtx)(()=>[(0,n.createVNode)((0,n.unref)(r.ElButton),{class:`lumal-cockpit-designer__tab-target`,"data-role":`keyboard-target`,"aria-label":`移入此 Tab 行`,onClick:e=>b(l(t))},{default:(0,n.withCtx)(()=>[(0,n.createVNode)((0,n.unref)(i.LumalIcon),{name:`lumal:plus`,size:12})]),_:1},8,[`onClick`])]),_:2},1024)):(0,n.createCommentVNode)(``,!0)],8,Xt),(0,n.createElementVNode)(`div`,{class:`lumal-cockpit-designer__tab-preview`,role:`tabpanel`,id:`designer-tabpanel-${t.id}`,"aria-labelledby":f(t)?`designer-tab-${f(t).id}`:void 0},[f(t)?((0,n.openBlock)(),(0,n.createElementBlock)(n.Fragment,{key:0},[u(f(t).type)?((0,n.openBlock)(),(0,n.createBlock)(kt,{key:f(t).id,"cockpit-id":e.cockpitId,definition:u(f(t).type),"instance-id":f(t).id,"layout-id":e.draft.activeLayout.value?.id??``,"message-bus":e.previewMessageBus},null,8,[`cockpit-id`,`definition`,`instance-id`,`layout-id`,`message-bus`])):((0,n.openBlock)(),(0,n.createElementBlock)(`div`,$t,` 未注册模块 `))],64)):((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.ElButton),{key:1,class:`lumal-cockpit-designer__empty-cell`,plain:``,disabled:!e.placementSelection,"data-role":`keyboard-target`,onClick:e=>b(l(t))},{default:(0,n.withCtx)(()=>[(0,n.createElementVNode)(`span`,null,(0,n.toDisplayString)(e.placementSelection?`添加 ${e.placementSelection.title} 到 Tab`:`请置入模块`),1)]),_:1},8,[`disabled`,`onClick`]))],8,Qt)],2)]),_:2},1032,[`target`,`onDrop`]))],4))),128))])):(0,n.createCommentVNode)(``,!0)],8,Ft))}});function tn(e){return JSON.parse(JSON.stringify(e))}function nn(e){return e.mode===`tabs`?e.widgets:e.cells.flatMap(e=>e.widget?[e.widget]:[])}function rn(e){return nn(e).length>0}function an(e){if(!e.length)return;let t=e.reduce((e,t)=>e+Math.max(0,t.height),0);if(t<=0){let t=100/e.length;e.forEach(e=>{e.height=t});return}e.forEach(e=>{e.height=Number((Math.max(0,e.height)/t*100).toFixed(3))});let n=Number((100-e.reduce((e,t)=>e+t.height,0)).toFixed(3));e[e.length-1].height=Number((e[e.length-1].height+n).toFixed(3))}function on(e,t){return t===`left`?e.left:e.right}function sn(t){let n=JSON.parse(JSON.stringify(t));n.id=e.m().id;for(let t of[`left`,`right`]){let r=on(n,t);r.columns.forEach(t=>{t.id=e.f().id}),r.rows.forEach(t=>{let n=t.mode===`tabs`?Math.max(0,t.widgets.findIndex(e=>e.id===t.activeWidgetId)):-1;t.id=e.p(1).id,t.cells.forEach(t=>{t.id=e.d().id,t.widget&&(t.widget.id=e.g(t.widget.type).id)}),t.widgets.forEach(t=>{t.id=e.g(t.type).id}),t.activeWidgetId=t.mode===`tabs`?t.widgets[n]?.id:void 0})}return n}function cn(r){let i=tn(r),a=(0,n.ref)(tn(r)),o=(0,n.ref)({layoutId:r.activeLayoutId??r.layouts[0]?.id}),s=(0,n.computed)(()=>a.value.layouts),c=(0,n.computed)(()=>{let e=o.value.layoutId;return s.value.find(t=>t.id===e)??s.value[0]});function l(e,t){let n=c.value;return n?on(n,e).rows.find(e=>e.id===t):void 0}function u(e){return l(e.side,e.rowId)?.cells.find(t=>t.id===e.cellId)}function d(e){if(e.kind===`cell`)return u(e)?.widget;let t=l(e.side,e.rowId)?.widgets??[];return e.widgetId?t.find(t=>t.id===e.widgetId):t[0]}function f(){let t=e.m(`布局 ${s.value.length+1}`);a.value.layouts.push(t),a.value.activeLayoutId=t.id,o.value={layoutId:t.id}}function p(e){let t=s.value.findIndex(t=>t.id===e);if(t<0)return;let n=sn(s.value[t]);n.title=`${n.title} 副本`,s.value.splice(t+1,0,n),o.value={layoutId:n.id}}function m(e){if(s.value.length<=1)return!1;let t=s.value.findIndex(t=>t.id===e);if(t<0)return!1;if(s.value.splice(t,1),o.value.layoutId===e){let e=s.value[t]??s.value[t-1];o.value={layoutId:e?.id},a.value.activeLayoutId=e?.id}return!0}function h(e,t){let n=s.value.find(t=>t.id===e);n&&t.trim()&&(n.title=t.trim())}function g(e){s.value.some(t=>t.id===e)&&(o.value={layoutId:e},a.value.activeLayoutId=e)}function _(t,n,r,i=!1){let a=c.value;if(!a)return!1;let o=on(a,t),s=Math.max(1,Math.floor(n)),l=Math.max(1,Math.floor(r)),u=o.rows.slice(s),d=o.rows.filter(e=>e.mode===`grid`).flatMap(e=>e.cells.slice(l));if(!i&&(u.some(rn)||d.some(e=>e.widget)))return!1;for(;o.columns.length<l;)o.columns.push(e.f());for(o.columns.length>l&&o.columns.splice(l),e._(o),o.rows.forEach(t=>{if(t.mode===`grid`){for(;t.cells.length<l;)t.cells.push(e.d());t.cells.length>l&&t.cells.splice(l)}}),o.rows.length>s&&o.rows.splice(s);o.rows.length<s;)o.rows.push(e.p(l,`grid`,100/s));return an(o.rows),!0}function v(t,n){let r=c.value;if(!r||!Number.isFinite(n)||n<=0)return;let i=on(r,t);i.width=Math.max(i.columns.length,Math.round(n)),e._(i)}function y(e,t,n){let r=c.value;if(!r||!Number.isFinite(n))return;let i=on(r,e).rows,a=i.find(e=>e.id===t);if(!a)return;if(i.length===1){a.height=100;return}let o=i.filter(e=>e.id!==t),s=Math.min(Math.max(1,n),100-o.length),l=100-s,u=o.reduce((e,t)=>e+t.height,0);a.height=s,o.forEach(e=>{e.height=u>0?e.height/u*l:l/o.length}),an(i)}function b(t,n,r){let i=c.value;if(!i)return!1;let a=on(i,t),o=a.rows.find(e=>e.id===n);return!o||r&&o.mode===`tabs`||!r&&o.mode===`grid`?!!o:r?(o.widgets=o.cells.flatMap(e=>e.widget?[e.widget]:[]),o.cells=[],o.mode=`tabs`,o.activeWidgetId=o.widgets[0]?.id,!0):o.widgets.length>a.columns.length?!1:(o.cells=Array.from({length:a.columns.length},e.d),o.widgets.forEach((e,t)=>{o.cells[t].widget=e}),o.widgets=[],o.activeWidgetId=void 0,o.mode=`grid`,!0)}function x(e){return!!d(e)}function S(t,n,r,i=!1){let a=e.g(n,r);if(t.kind===`tabs`){let e=l(t.side,t.rowId);return!e||e.mode!==`tabs`?!1:(e.widgets.push(a),e.activeWidgetId=a.id,!0)}let o=u(t);return!o||o.widget&&!i?!1:(o.widget=a,!0)}function C(e){if(e.kind===`cell`){let t=u(e);t&&(t.widget=void 0);return}let t=l(e.side,e.rowId);if(!t||t.mode!==`tabs`)return;let n=e.widgetId?t.widgets.findIndex(t=>t.id===e.widgetId):0;if(n>=0){let e=t.widgets[n]?.id===t.activeWidgetId;t.widgets.splice(n,1),(e||!t.widgets.some(e=>e.id===t.activeWidgetId))&&(t.activeWidgetId=t.widgets[n]?.id??t.widgets[n-1]?.id)}}function w(e,t){if(e.kind===`cell`){let t=u(e),n=t?.widget;return t&&(t.widget=void 0),n}let n=l(e.side,e.rowId);if(!n||n.mode!==`tabs`)return;let r=t?n.widgets.findIndex(e=>e.id===t):0;if(r<0)return;let[i]=n.widgets.splice(r,1);return n.activeWidgetId=n.widgets.some(e=>e.id===n.activeWidgetId)?n.activeWidgetId:n.widgets[0]?.id,i}function T(e,t,n=!1){let r=d(e);if(!r)return{moved:!1,requiresReplace:!1};if(t.kind===`cell`){let i=u(t);if(!i)return{moved:!1,requiresReplace:!1};if(i.widget&&i.widget.id!==r.id&&!n)return{moved:!1,requiresReplace:!0};let a=w(e,r.id);return a?(i.widget=a,{moved:!0,requiresReplace:!1}):{moved:!1,requiresReplace:!1}}let i=l(t.side,t.rowId);if(!i||i.mode!==`tabs`)return{moved:!1,requiresReplace:!1};let a=w(e,r.id);return a?(i.widgets.push(a),i.activeWidgetId=a.id,{moved:!0,requiresReplace:!1}):{moved:!1,requiresReplace:!1}}function E(e,t,n,r){let i=l(e,t);if(!i||i.mode!==`tabs`||n===r||n<0||r<0||n>=i.widgets.length||r>=i.widgets.length)return;let[a]=i.widgets.splice(n,1);i.widgets.splice(r,0,a)}function D(e,t,n){let r=l(e,t);r?.mode===`tabs`&&r.widgets.some(e=>e.id===n)&&(r.activeWidgetId=n)}function O(){a.value=tn(i),o.value={layoutId:i.activeLayoutId??i.layouts[0]?.id}}function k(){let n=t.t(a.value);return{config:e.i(a.value),validation:n}}return{draft:a,selection:o,layouts:s,activeLayout:c,addLayout:f,duplicateLayout:p,removeLayout:m,renameLayout:h,selectLayout:g,resizeRegion:_,setRegionWidth:v,setRowHeight:y,setRowTabs:b,hasWidgetAt:x,addWidget:S,moveWidget:T,removeWidget:C,reorderTabWidgets:E,setActiveTab:D,reset:O,buildSaveConfig:k}}var ln=[`data-cockpit-theme`],un={class:`lumal-cockpit-designer__titlebar`},dn={class:`lumal-cockpit-designer__heading`},fn={class:`lumal-cockpit-designer__title-actions`},pn={class:`lumal-cockpit-designer__controlbar`},mn={class:`lumal-cockpit-designer__layout-controls`},hn={class:`lumal-cockpit-designer__field`},gn={class:`lumal-cockpit-designer__layout-tools`},_n={class:`lumal-cockpit-designer__workspace`},vn={class:`lumal-cockpit-designer__assembly`,"aria-label":`驾驶舱布局装配区`},yn={class:`lumal-cockpit-designer__assembly-stage`},bn={class:`lumal-cockpit-designer__footer`},xn={class:`lumal-cockpit-designer__placement-status`,role:`status`,"aria-live":`polite`},Sn={class:`lumal-cockpit-designer__footer-actions`},Cn=(0,n.defineComponent)({__name:`LumalCockpitDesigner`,props:(0,n.mergeModels)({config:{},registry:{},saving:{type:Boolean},saveError:{}},{themeMode:{default:`dark`},themeModeModifiers:{}}),emits:(0,n.mergeModels)([`save`,`cancel`],[`update:themeMode`]),setup(t,{expose:a,emit:o}){let s=t,c=o,l=(0,n.useModel)(t,`themeMode`),u=cn(s.config),d=(0,n.ref)([]),f=(0,n.ref)(),p=(0,n.computed)(()=>u.activeLayout.value),m=(0,n.computed)(()=>d.value.filter(e=>e.level===`error`)),h=e.r(),g=(0,n.computed)(()=>{let e=f.value;return e?e.kind===`library`?`已选择模块“${e.title}”,可连续放入多个槽位,按 Esc 取消。`:`正在移动“${e.title}”,请选择目标槽位或 Tab 行,按 Esc 取消。`:`PS:将需要的业务板块拖入上方白框内,已占用槽位会在确认后替换。`});(0,n.watch)(()=>p.value?.id,()=>{f.value=void 0});function _(e){f.value={kind:`library`,type:e.type,title:e.label}}function v(e){f.value=e}function y(){f.value=void 0}function b(e){e.key!==`Escape`||!f.value||(e.preventDefault(),y())}function x(){let e=u.buildSaveConfig();if(d.value=e.validation.issues,!e.validation.valid)return;let t=p.value?.id??e.config.activeLayoutId,n=e.config.layouts.find(e=>e.id===t);n&&c(`save`,{config:e.config,layout:n})}async function S(){let e=p.value;if(e){if(u.layouts.value.length<=1){await r.ElMessageBox.alert(`至少保留一个布局。`,`无法删除`,{confirmButtonText:`知道了`,type:`warning`});return}try{await r.ElMessageBox.confirm(`确定删除布局“${e.title}”吗?`,`删除布局`,{cancelButtonText:`取消`,confirmButtonText:`删除`,type:`warning`}),u.removeLayout(e.id)}catch{}}}async function C(){try{await r.ElMessageBox.confirm(`将放弃本次尚未保存的所有布局调整,是否继续?`,`重置草稿`,{cancelButtonText:`取消`,confirmButtonText:`重置`,type:`warning`}),u.reset(),d.value=[]}catch{}}function w(){l.value=l.value===`dark`?`light`:`dark`}return a({toggleTheme:w}),(e,a)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{class:`lumal-cockpit-designer`,"data-cockpit-theme":l.value,onKeydown:b},[(0,n.createElementVNode)(`header`,un,[(0,n.createElementVNode)(`h2`,dn,[(0,n.createVNode)((0,n.unref)(i.LumalIcon),{name:`lumal:settings`,size:18}),a[4]||=(0,n.createTextVNode)(` 模块设置 `,-1)]),(0,n.createElementVNode)(`div`,fn,[(0,n.renderSlot)(e.$slots,`title-actions`,{themeMode:l.value,toggleTheme:w})])]),(0,n.createElementVNode)(`section`,pn,[(0,n.createElementVNode)(`div`,mn,[(0,n.createElementVNode)(`label`,hn,[a[5]||=(0,n.createElementVNode)(`span`,null,`模板名称`,-1),(0,n.createVNode)((0,n.unref)(r.ElSelect),{"model-value":p.value?.id,"aria-label":`选择布局`,"onUpdate:modelValue":(0,n.unref)(u).selectLayout},{default:(0,n.withCtx)(()=>[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)((0,n.unref)(u).layouts.value,e=>((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.ElOption),{key:e.id,label:e.title,value:e.id},null,8,[`label`,`value`]))),128))]),_:1},8,[`model-value`,`onUpdate:modelValue`])]),p.value?((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.ElInput),{key:0,"model-value":p.value.title,"aria-label":`当前布局名称`,onChange:a[0]||=e=>(0,n.unref)(u).renameLayout(p.value.id,e)},null,8,[`model-value`])):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`div`,gn,[(0,n.createVNode)((0,n.unref)(r.ElTooltip),{content:`添加布局`,placement:`top`},{default:(0,n.withCtx)(()=>[(0,n.createVNode)((0,n.unref)(r.ElButton),{circle:``,"aria-label":`添加布局`,onClick:a[1]||=e=>(0,n.unref)(u).addLayout()},{default:(0,n.withCtx)(()=>[(0,n.createVNode)((0,n.unref)(i.LumalIcon),{name:`lumal:plus`,size:15})]),_:1})]),_:1}),p.value?((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.ElButton),{key:0,onClick:a[2]||=e=>(0,n.unref)(u).duplicateLayout(p.value.id)},{default:(0,n.withCtx)(()=>[...a[6]||=[(0,n.createTextVNode)(` 复制 `,-1)]]),_:1})):(0,n.createCommentVNode)(``,!0),p.value?((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.ElButton),{key:1,type:`danger`,plain:``,onClick:S},{default:(0,n.withCtx)(()=>[...a[7]||=[(0,n.createTextVNode)(` 删除 `,-1)]]),_:1})):(0,n.createCommentVNode)(``,!0)])])]),(0,n.createElementVNode)(`div`,{class:(0,n.normalizeClass)([`lumal-cockpit-designer__issues`,{"is-empty":!m.value.length&&!t.saveError}]),role:`alert`},[t.saveError?((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.ElAlert),{key:0,type:`error`,closable:!1,title:`保存失败:${t.saveError}`,"show-icon":``},null,8,[`title`])):(0,n.createCommentVNode)(``,!0),((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(m.value,(e,t)=>((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(r.ElAlert),{key:t,type:`error`,closable:!1,title:e.message,"show-icon":``},null,8,[`title`]))),128))],2),(0,n.createElementVNode)(`main`,_n,[(0,n.createElementVNode)(`section`,vn,[(0,n.createElementVNode)(`div`,yn,[(0,n.createVNode)(en,{"cockpit-id":t.config.id,draft:(0,n.unref)(u),registry:t.registry,"placement-selection":f.value,"preview-message-bus":(0,n.unref)(h),side:`left`,onSelectPlaced:v,onClearPlacement:y},null,8,[`cockpit-id`,`draft`,`registry`,`placement-selection`,`preview-message-bus`]),(0,n.createVNode)(en,{"cockpit-id":t.config.id,draft:(0,n.unref)(u),registry:t.registry,"placement-selection":f.value,"preview-message-bus":(0,n.unref)(h),side:`right`,onSelectPlaced:v,onClearPlacement:y},null,8,[`cockpit-id`,`draft`,`registry`,`placement-selection`,`preview-message-bus`])])]),(0,n.createVNode)(Mt,{"cockpit-id":t.config.id,"layout-id":p.value?.id??``,registry:t.registry,"selected-type":f.value?.kind===`library`?f.value.type:void 0,onSelectWidget:_},null,8,[`cockpit-id`,`layout-id`,`registry`,`selected-type`])]),(0,n.createElementVNode)(`footer`,bn,[(0,n.createElementVNode)(`p`,xn,(0,n.toDisplayString)(g.value),1),(0,n.createElementVNode)(`div`,Sn,[(0,n.createVNode)((0,n.unref)(r.ElButton),{onClick:C},{default:(0,n.withCtx)(()=>[(0,n.createVNode)((0,n.unref)(i.LumalIcon),{name:`lumal:reset`,size:16}),a[8]||=(0,n.createTextVNode)(` 重置 `,-1)]),_:1}),(0,n.createVNode)((0,n.unref)(r.ElButton),{onClick:a[3]||=e=>c(`cancel`)},{default:(0,n.withCtx)(()=>[(0,n.createVNode)((0,n.unref)(i.LumalIcon),{name:`lumal:close`,size:15}),a[9]||=(0,n.createTextVNode)(` 取消 `,-1)]),_:1}),(0,n.createVNode)((0,n.unref)(r.ElButton),{type:`primary`,class:`lumal-cockpit-designer__save`,loading:t.saving,"aria-busy":t.saving,onClick:x},{default:(0,n.withCtx)(()=>[(0,n.createTextVNode)((0,n.toDisplayString)(t.saving?`保存中…`:`保存`),1)]),_:1},8,[`loading`,`aria-busy`])])])],40,ln))}});function wn(e,t){let n=e;return n.install=function(n){n.component(t,e)},n}var Tn=wn(Cn,`LumalCockpitDesigner`);exports.CockpitComponentLibrary=Mt,exports.CockpitLayoutEditor=en,exports.CockpitWidgetDropZone=Pt,exports.CockpitWidgetPreview=kt,exports.LumalCockpitDesigner=Tn,exports.useCockpitDraft=cn;
|