@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.
Files changed (100) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +103 -0
  3. package/dist/cockpit.css +2 -0
  4. package/dist/createCockpitRegistry-D5F4d5By.js +30 -0
  5. package/dist/createCockpitRegistry-DHr9nXJY.cjs +1 -0
  6. package/dist/designer.cjs +1 -0
  7. package/dist/designer.js +2282 -0
  8. package/dist/index.cjs +1 -0
  9. package/dist/index.js +30 -0
  10. package/dist/registry.cjs +1 -0
  11. package/dist/registry.js +2 -0
  12. package/dist/resolveComponent-BF1aCxAk.cjs +1 -0
  13. package/dist/resolveComponent-QbJRsdxR.js +308 -0
  14. package/dist/runtime-CXiih7DE.js +627 -0
  15. package/dist/runtime-wzWMTWrS.cjs +1 -0
  16. package/dist/runtime.cjs +1 -0
  17. package/dist/runtime.js +3 -0
  18. package/dist/src/composables/index.d.ts +9 -0
  19. package/dist/src/composables/index.d.ts.map +1 -0
  20. package/dist/src/composables/useCanvasScale.d.ts +30 -0
  21. package/dist/src/composables/useCanvasScale.d.ts.map +1 -0
  22. package/dist/src/composables/useCockpit.d.ts +14 -0
  23. package/dist/src/composables/useCockpit.d.ts.map +1 -0
  24. package/dist/src/composables/useCockpitAutoRefresh.d.ts +27 -0
  25. package/dist/src/composables/useCockpitAutoRefresh.d.ts.map +1 -0
  26. package/dist/src/composables/useCockpitContext.d.ts +16 -0
  27. package/dist/src/composables/useCockpitContext.d.ts.map +1 -0
  28. package/dist/src/composables/useCockpitRefresh.d.ts +9 -0
  29. package/dist/src/composables/useCockpitRefresh.d.ts.map +1 -0
  30. package/dist/src/config/defaults.d.ts +19 -0
  31. package/dist/src/config/defaults.d.ts.map +1 -0
  32. package/dist/src/config/index.d.ts +13 -0
  33. package/dist/src/config/index.d.ts.map +1 -0
  34. package/dist/src/config/migrate.d.ts +6 -0
  35. package/dist/src/config/migrate.d.ts.map +1 -0
  36. package/dist/src/config/normalize.d.ts +3 -0
  37. package/dist/src/config/normalize.d.ts.map +1 -0
  38. package/dist/src/config/validate.d.ts +8 -0
  39. package/dist/src/config/validate.d.ts.map +1 -0
  40. package/dist/src/designer/CockpitComponentLibrary.vue.d.ts +16 -0
  41. package/dist/src/designer/CockpitComponentLibrary.vue.d.ts.map +1 -0
  42. package/dist/src/designer/CockpitLayoutEditor.vue.d.ts +34 -0
  43. package/dist/src/designer/CockpitLayoutEditor.vue.d.ts.map +1 -0
  44. package/dist/src/designer/CockpitWidgetDropZone.vue.d.ts +45 -0
  45. package/dist/src/designer/CockpitWidgetDropZone.vue.d.ts.map +1 -0
  46. package/dist/src/designer/CockpitWidgetPreview.vue.d.ts +19 -0
  47. package/dist/src/designer/CockpitWidgetPreview.vue.d.ts.map +1 -0
  48. package/dist/src/designer/LumalCockpitDesigner.vue.d.ts +41 -0
  49. package/dist/src/designer/LumalCockpitDesigner.vue.d.ts.map +1 -0
  50. package/dist/src/designer/confirmWidgetReplacement.d.ts +3 -0
  51. package/dist/src/designer/confirmWidgetReplacement.d.ts.map +1 -0
  52. package/dist/src/designer/index.d.ts +13 -0
  53. package/dist/src/designer/index.d.ts.map +1 -0
  54. package/dist/src/designer/types.d.ts +13 -0
  55. package/dist/src/designer/types.d.ts.map +1 -0
  56. package/dist/src/designer/useCockpitDraft.d.ts +50 -0
  57. package/dist/src/designer/useCockpitDraft.d.ts.map +1 -0
  58. package/dist/src/index.d.ts +22 -0
  59. package/dist/src/index.d.ts.map +1 -0
  60. package/dist/src/messaging/createCockpitMessageBus.d.ts +16 -0
  61. package/dist/src/messaging/createCockpitMessageBus.d.ts.map +1 -0
  62. package/dist/src/messaging/index.d.ts +5 -0
  63. package/dist/src/messaging/index.d.ts.map +1 -0
  64. package/dist/src/messaging/topics.d.ts +10 -0
  65. package/dist/src/messaging/topics.d.ts.map +1 -0
  66. package/dist/src/messaging/types.d.ts +24 -0
  67. package/dist/src/messaging/types.d.ts.map +1 -0
  68. package/dist/src/registry/createCockpitRegistry.d.ts +4 -0
  69. package/dist/src/registry/createCockpitRegistry.d.ts.map +1 -0
  70. package/dist/src/registry/index.d.ts +3 -0
  71. package/dist/src/registry/index.d.ts.map +1 -0
  72. package/dist/src/registry/types.d.ts +20 -0
  73. package/dist/src/registry/types.d.ts.map +1 -0
  74. package/dist/src/runtime/CockpitErrorBoundary.vue.d.ts +26 -0
  75. package/dist/src/runtime/CockpitErrorBoundary.vue.d.ts.map +1 -0
  76. package/dist/src/runtime/LumalCockpit.vue.d.ts +105 -0
  77. package/dist/src/runtime/LumalCockpit.vue.d.ts.map +1 -0
  78. package/dist/src/runtime/LumalCockpitCanvas.vue.d.ts +47 -0
  79. package/dist/src/runtime/LumalCockpitCanvas.vue.d.ts.map +1 -0
  80. package/dist/src/runtime/LumalCockpitCard.vue.d.ts +31 -0
  81. package/dist/src/runtime/LumalCockpitCard.vue.d.ts.map +1 -0
  82. package/dist/src/runtime/LumalCockpitContainer.vue.d.ts +12 -0
  83. package/dist/src/runtime/LumalCockpitContainer.vue.d.ts.map +1 -0
  84. package/dist/src/runtime/LumalCockpitRegion.vue.d.ts +11 -0
  85. package/dist/src/runtime/LumalCockpitRegion.vue.d.ts.map +1 -0
  86. package/dist/src/runtime/LumalCockpitWidgetHost.vue.d.ts +12 -0
  87. package/dist/src/runtime/LumalCockpitWidgetHost.vue.d.ts.map +1 -0
  88. package/dist/src/runtime/card.d.ts +16 -0
  89. package/dist/src/runtime/card.d.ts.map +1 -0
  90. package/dist/src/runtime/context.d.ts +25 -0
  91. package/dist/src/runtime/context.d.ts.map +1 -0
  92. package/dist/src/runtime/index.d.ts +19 -0
  93. package/dist/src/runtime/index.d.ts.map +1 -0
  94. package/dist/src/runtime/resolveComponent.d.ts +13 -0
  95. package/dist/src/runtime/resolveComponent.d.ts.map +1 -0
  96. package/dist/src/types/index.d.ts +83 -0
  97. package/dist/src/types/index.d.ts.map +1 -0
  98. package/dist/validate-DkC_IHrC.js +94 -0
  99. package/dist/validate-KSzm5SZW.cjs +1 -0
  100. package/package.json +73 -0
@@ -0,0 +1,627 @@
1
+ import { i as e, n as t, r as n, t as r, v as i, x as a } from "./resolveComponent-QbJRsdxR.js";
2
+ import { Fragment as o, computed as s, createBlock as c, createCommentVNode as l, createElementBlock as u, createElementVNode as d, createSlots as f, createTextVNode as p, createVNode as m, defineComponent as h, guardReactiveProps as g, inject as _, mergeModels as v, nextTick as y, normalizeClass as b, normalizeProps as x, normalizeStyle as S, onBeforeUnmount as C, openBlock as w, provide as ee, reactive as T, ref as E, renderList as D, renderSlot as O, resolveDynamicComponent as k, toDisplayString as A, toValue as j, unref as M, useId as N, useModel as P, useSlots as te, vShow as F, watch as I, withCtx as L, withDirectives as R } from "vue";
3
+ import { ElButton as z, ElSwitch as ne, ElTooltip as re } from "element-plus";
4
+ import { LumalIcon as B } from "@lumal/icons-vue";
5
+ //#region src/messaging/topics.ts
6
+ var V = "cockpit:refresh", H = 300 * 1e3;
7
+ function U(e) {
8
+ let t = e.enabled ?? E(e.defaultEnabled ?? !1), n;
9
+ function r(t = "manual") {
10
+ let n = {
11
+ reason: t,
12
+ at: Date.now()
13
+ };
14
+ e.messages.publish({
15
+ topic: V,
16
+ sourceId: j(e.sourceId),
17
+ payload: n
18
+ });
19
+ }
20
+ function i() {
21
+ n !== void 0 && (clearInterval(n), n = void 0);
22
+ }
23
+ function a() {
24
+ i();
25
+ let t = Math.max(1e3, j(e.intervalMs) ?? 3e5);
26
+ n = setInterval(() => {
27
+ r("interval");
28
+ }, t);
29
+ }
30
+ return I(t, (e) => {
31
+ e ? a() : i();
32
+ }, { immediate: !0 }), I(() => j(e.intervalMs), () => {
33
+ t.value && a();
34
+ }), C(i), {
35
+ enabled: t,
36
+ refreshNow: r
37
+ };
38
+ }
39
+ //#endregion
40
+ //#region src/composables/useCockpit.ts
41
+ function W(e) {
42
+ let t = s(() => {
43
+ let t = e.config().layouts;
44
+ if (!t.length) return;
45
+ let n = e.activeLayoutId.value ?? e.config().activeLayoutId;
46
+ return t.find((e) => e.id === n) ?? t[0];
47
+ });
48
+ function n(t) {
49
+ e.activeLayoutId.value = t;
50
+ }
51
+ return {
52
+ activeLayout: t,
53
+ selectLayout: n
54
+ };
55
+ }
56
+ //#endregion
57
+ //#region src/runtime/context.ts
58
+ var G = Symbol("lumal-cockpit-runtime-env");
59
+ function K() {
60
+ let e = _(G, null);
61
+ if (!e) throw Error("[cockpit] 运行时环境缺失,组件必须在 LumalCockpit 内渲染。");
62
+ return e;
63
+ }
64
+ //#endregion
65
+ //#region src/runtime/LumalCockpitWidgetHost.vue?vue&type=script&setup=true&lang.ts
66
+ var ie = [
67
+ "data-widget-type",
68
+ "data-instance-id",
69
+ "data-cockpit-node-id",
70
+ "data-cockpit-side"
71
+ ], ae = { class: "lumal-cockpit-widget__body" }, oe = {
72
+ key: 1,
73
+ class: "lumal-cockpit-widget__missing",
74
+ role: "status"
75
+ }, se = {
76
+ key: 1,
77
+ class: "lumal-cockpit-widget__error",
78
+ role: "alert"
79
+ }, q = /* @__PURE__ */ h({
80
+ __name: "LumalCockpitWidgetHost",
81
+ props: {
82
+ layoutId: {},
83
+ side: {},
84
+ widget: {},
85
+ embedded: { type: Boolean }
86
+ },
87
+ setup(e) {
88
+ let n = e, a = K(), l = s(() => a.registry.resolveWidget(n.widget.type)), h = s(() => {
89
+ let e = l.value;
90
+ return e ? r(e.component) : null;
91
+ }), _ = s(() => ({
92
+ cockpitId: a.cockpitId,
93
+ layoutId: n.layoutId,
94
+ instanceId: n.widget.id,
95
+ mode: a.mode,
96
+ messages: a.messages
97
+ }));
98
+ i(_.value), C(() => {
99
+ a.messages.clearInstance(n.widget.id);
100
+ });
101
+ let v = s(() => n.widget.title ?? l.value?.label ?? n.widget.type), y = s(() => n.embedded ? "div" : a.cardComponent), b = s(() => n.embedded ? { class: "lumal-cockpit-widget__embedded" } : {
102
+ title: v.value,
103
+ widget: n.widget
104
+ });
105
+ return (n, r) => (w(), u("section", {
106
+ class: "lumal-cockpit-widget",
107
+ "data-widget-type": e.widget.type,
108
+ "data-instance-id": e.widget.id,
109
+ "data-cockpit-node": "widget",
110
+ "data-cockpit-node-id": e.widget.id,
111
+ "data-cockpit-side": e.side
112
+ }, [(w(), c(k(y.value), x(g(b.value)), f({
113
+ default: L(() => [d("div", ae, [l.value ? (w(), c(t, { key: 1 }, {
114
+ error: L(({ retry: t }) => [M(a).slots.error ? (w(), c(k(M(a).slots.error), {
115
+ key: 0,
116
+ retry: t,
117
+ "instance-id": e.widget.id
118
+ }, null, 8, ["retry", "instance-id"])) : (w(), u("div", se, [r[1] ||= d("span", null, "模块加载失败", -1), m(M(z), {
119
+ text: "",
120
+ type: "primary",
121
+ onClick: t
122
+ }, {
123
+ default: L(() => [m(M(B), {
124
+ name: "lumal:refresh",
125
+ size: 14
126
+ }), r[0] ||= p(" 重试 ", -1)]),
127
+ _: 1
128
+ }, 8, ["onClick"])]))]),
129
+ default: L(() => [(w(), c(k(h.value), { context: _.value }, null, 8, ["context"]))]),
130
+ _: 1
131
+ })) : (w(), u(o, { key: 0 }, [M(a).slots["missing-widget"] ? (w(), c(k(M(a).slots["missing-widget"]), {
132
+ key: 0,
133
+ type: e.widget.type,
134
+ "instance-id": e.widget.id
135
+ }, null, 8, ["type", "instance-id"])) : (w(), u("div", oe, " 未注册模块:" + A(e.widget.type), 1))], 64))])]),
136
+ _: 2
137
+ }, [!e.embedded && M(a).slots["widget-title"] ? {
138
+ name: "title",
139
+ fn: L(() => [(w(), c(k(M(a).slots["widget-title"]), {
140
+ widget: e.widget,
141
+ title: v.value
142
+ }, null, 8, ["widget", "title"]))]),
143
+ key: "0"
144
+ } : void 0]), 1040))], 8, ie));
145
+ }
146
+ }), ce = ["data-cockpit-node-id", "data-cockpit-side"], le = ["data-cockpit-node-id", "data-cockpit-side"], ue = {
147
+ key: 1,
148
+ class: "lumal-cockpit-container__empty",
149
+ role: "status"
150
+ }, de = {
151
+ key: 0,
152
+ class: "lumal-cockpit-container__tabpanel"
153
+ }, fe = {
154
+ key: 1,
155
+ class: "lumal-cockpit-container__empty",
156
+ role: "status"
157
+ }, J = /* @__PURE__ */ h({
158
+ __name: "LumalCockpitContainer",
159
+ props: {
160
+ columns: {},
161
+ layoutId: {},
162
+ row: {},
163
+ side: {}
164
+ },
165
+ setup(e) {
166
+ let t = e, n = s(() => ({ height: `${t.row.height}%` })), r = s(() => ({ gridTemplateColumns: t.columns.map((e) => `calc(${e.width} * var(--lumal-cockpit-x-unit, 1px))`).join(" ") })), i = E(), a = T(/* @__PURE__ */ new Set()), d = K(), p = s(() => t.row.widgets.map((e) => ({
167
+ id: e.id,
168
+ title: e.title ?? d.registry.resolveWidget(e.type)?.label ?? e.type,
169
+ widget: e
170
+ })));
171
+ function h() {
172
+ let e = t.row.activeWidgetId;
173
+ return t.row.widgets.some((t) => t.id === e) ? e : t.row.widgets[0]?.id;
174
+ }
175
+ return I(() => [t.row.id, t.row.activeWidgetId], () => {
176
+ i.value = h();
177
+ }, { immediate: !0 }), I(() => t.row.widgets.map((e) => e.id).join(","), () => {
178
+ let e = new Set(t.row.widgets.map((e) => e.id));
179
+ a.forEach((t) => {
180
+ e.has(t) || a.delete(t);
181
+ }), t.row.widgets.some((e) => e.id === i.value) || (i.value = h());
182
+ }), I(i, (e) => {
183
+ e && a.add(e);
184
+ }, { immediate: !0 }), (t, s) => (w(), u("section", {
185
+ class: b(["lumal-cockpit-container", { "is-tabs": e.row.mode === "tabs" }]),
186
+ style: S(n.value),
187
+ "data-cockpit-node": "row",
188
+ "data-cockpit-node-id": e.row.id,
189
+ "data-cockpit-side": e.side
190
+ }, [e.row.mode === "grid" ? (w(), u("div", {
191
+ key: 0,
192
+ class: "lumal-cockpit-container__grid",
193
+ style: S(r.value)
194
+ }, [(w(!0), u(o, null, D(e.row.cells, (t) => (w(), u("div", {
195
+ key: t.id,
196
+ class: "lumal-cockpit-container__cell",
197
+ "data-cockpit-node": "cell",
198
+ "data-cockpit-node-id": t.id,
199
+ "data-cockpit-side": e.side
200
+ }, [t.widget ? (w(), c(q, {
201
+ key: t.widget.id,
202
+ "layout-id": e.layoutId,
203
+ side: e.side,
204
+ widget: t.widget
205
+ }, null, 8, [
206
+ "layout-id",
207
+ "side",
208
+ "widget"
209
+ ])) : (w(), u("div", ue, " 空模块槽 "))], 8, le))), 128))], 4)) : (w(), u(o, { key: 1 }, [e.row.widgets.length ? (w(), c(k(M(d).cardComponent), {
210
+ key: 0,
211
+ "active-tab-id": i.value,
212
+ "onUpdate:activeTabId": s[0] ||= (e) => i.value = e,
213
+ tabs: p.value
214
+ }, f({
215
+ default: L(() => [(w(!0), u(o, null, D(e.row.widgets, (t) => (w(), u(o, { key: t.id }, [a.has(t.id) ? R((w(), u("div", de, [m(q, {
216
+ embedded: "",
217
+ "layout-id": e.layoutId,
218
+ side: e.side,
219
+ widget: t
220
+ }, null, 8, [
221
+ "layout-id",
222
+ "side",
223
+ "widget"
224
+ ])], 512)), [[F, t.id === i.value]]) : l("", !0)], 64))), 128))]),
225
+ _: 2
226
+ }, [M(d).slots["widget-title"] ? {
227
+ name: "title",
228
+ fn: L(({ title: e, widget: t }) => [(w(), c(k(M(d).slots["widget-title"]), {
229
+ widget: t,
230
+ title: e
231
+ }, null, 8, ["widget", "title"]))]),
232
+ key: "0"
233
+ } : void 0, M(d).slots["widget-title"] ? {
234
+ name: "tab",
235
+ fn: L(({ tab: e }) => [(w(), c(k(M(d).slots["widget-title"]), {
236
+ widget: e.widget,
237
+ title: e.title
238
+ }, null, 8, ["widget", "title"]))]),
239
+ key: "1"
240
+ } : void 0]), 1064, ["active-tab-id", "tabs"])) : (w(), u("div", fe, " 空 Tab 行 "))], 64))], 14, ce));
241
+ }
242
+ }), pe = [
243
+ "data-side",
244
+ "data-cockpit-node-id",
245
+ "data-cockpit-side"
246
+ ], Y = /* @__PURE__ */ h({
247
+ __name: "LumalCockpitRegion",
248
+ props: {
249
+ layoutId: {},
250
+ region: {},
251
+ side: {}
252
+ },
253
+ setup(e) {
254
+ let t = e, n = s(() => t.region.width > 0 ? t.region.width : t.region.columns.reduce((e, t) => e + t.width, 0)), r = s(() => ({ width: `calc(${n.value} * var(--lumal-cockpit-x-unit, 1px) + ${Math.max(0, t.region.columns.length - 1)} * var(--lumal-cockpit-gap-x, 12px))` }));
255
+ return (t, n) => (w(), u("section", {
256
+ class: "lumal-cockpit-region",
257
+ "data-side": e.side,
258
+ "data-cockpit-node": "region",
259
+ "data-cockpit-node-id": `${e.layoutId}:${e.side}`,
260
+ "data-cockpit-side": e.side,
261
+ style: S(r.value)
262
+ }, [(w(!0), u(o, null, D(e.region.rows, (t) => (w(), c(J, {
263
+ key: t.id,
264
+ "layout-id": e.layoutId,
265
+ side: e.side,
266
+ columns: e.region.columns,
267
+ row: t
268
+ }, null, 8, [
269
+ "layout-id",
270
+ "side",
271
+ "columns",
272
+ "row"
273
+ ]))), 128))], 12, pe));
274
+ }
275
+ }), me = ["data-scale", "data-viewport-mode"], he = { class: "lumal-cockpit-canvas__header" }, ge = { class: "lumal-cockpit-canvas__header-prefix" }, _e = { class: "lumal-cockpit-canvas__title" }, ve = { class: "lumal-cockpit-canvas__header-actions" }, X = { class: "lumal-cockpit-canvas__body" }, ye = { class: "lumal-cockpit-canvas__center" }, be = { class: "lumal-cockpit-canvas__left" }, xe = { class: "lumal-cockpit-canvas__right" }, Z = /* @__PURE__ */ h({
276
+ __name: "LumalCockpitCanvas",
277
+ props: {
278
+ title: {},
279
+ baseWidth: {},
280
+ baseHeight: {},
281
+ layout: {},
282
+ centerContext: {},
283
+ viewportMode: {}
284
+ },
285
+ setup(e) {
286
+ let t = e, n = E(null), { result: r } = a(n, {
287
+ baseWidth: () => t.baseWidth,
288
+ baseHeight: () => t.baseHeight
289
+ }), i = s(() => t.viewportMode === "vwvh" ? {
290
+ width: "100vw",
291
+ height: "100vh",
292
+ "--lumal-cockpit-x-unit": `${100 / t.baseWidth}vw`,
293
+ "--lumal-cockpit-y-unit": `${100 / t.baseHeight}vh`
294
+ } : t.viewportMode === "external" ? {
295
+ width: `${t.baseWidth}px`,
296
+ height: `${t.baseHeight}px`,
297
+ "--lumal-cockpit-x-unit": "1px",
298
+ "--lumal-cockpit-y-unit": "1px"
299
+ } : {
300
+ width: `${t.baseWidth}px`,
301
+ height: `${t.baseHeight}px`,
302
+ transform: `translate(${r.value.offsetX}px, ${r.value.offsetY}px) scale(${r.value.scale})`,
303
+ transformOrigin: "top left",
304
+ "--lumal-cockpit-x-unit": "1px",
305
+ "--lumal-cockpit-y-unit": "1px"
306
+ });
307
+ return (t, a) => (w(), u("div", {
308
+ ref_key: "containerRef",
309
+ ref: n,
310
+ class: "lumal-cockpit-canvas",
311
+ "data-scale": M(r).scale.toFixed(3),
312
+ "data-viewport-mode": e.viewportMode
313
+ }, [d("div", {
314
+ class: "lumal-cockpit-canvas__stage",
315
+ style: S(i.value)
316
+ }, [d("header", he, [
317
+ d("div", ge, [O(t.$slots, "header-prefix")]),
318
+ d("div", _e, [O(t.$slots, "header-title", { title: e.title }, () => [d("h1", null, A(e.title), 1)])]),
319
+ d("div", ve, [O(t.$slots, "header-actions")])
320
+ ]), d("div", X, [
321
+ d("main", ye, [O(t.$slots, "center", {
322
+ context: e.centerContext,
323
+ layout: e.layout
324
+ }, () => [a[0] ||= d("div", {
325
+ class: "lumal-cockpit-center__empty",
326
+ role: "status"
327
+ }, " 由应用提供中央内容 ", -1)])]),
328
+ d("div", be, [O(t.$slots, "left", {
329
+ layout: e.layout,
330
+ region: e.layout.left,
331
+ side: "left"
332
+ }, () => [m(Y, {
333
+ side: "left",
334
+ "layout-id": e.layout.id,
335
+ region: e.layout.left
336
+ }, null, 8, ["layout-id", "region"])])]),
337
+ d("div", xe, [O(t.$slots, "right", {
338
+ layout: e.layout,
339
+ region: e.layout.right,
340
+ side: "right"
341
+ }, () => [m(Y, {
342
+ side: "right",
343
+ "layout-id": e.layout.id,
344
+ region: e.layout.right
345
+ }, null, 8, ["layout-id", "region"])])])
346
+ ])], 4)], 8, me));
347
+ }
348
+ }), Se = {
349
+ key: 0,
350
+ class: "lumal-cockpit-card__header"
351
+ }, Ce = {
352
+ class: "lumal-cockpit-card__tablist",
353
+ role: "tablist",
354
+ "aria-label": "模块切换"
355
+ }, we = [
356
+ "id",
357
+ "aria-selected",
358
+ "tabindex",
359
+ "onClick",
360
+ "onKeydown"
361
+ ], Te = {
362
+ key: 1,
363
+ class: "lumal-cockpit-card__header"
364
+ }, Ee = { class: "lumal-cockpit-card__title" }, De = [
365
+ "id",
366
+ "role",
367
+ "aria-labelledby",
368
+ "tabindex"
369
+ ], Q = /* @__PURE__ */ h({
370
+ __name: "LumalCockpitCard",
371
+ props: {
372
+ title: {},
373
+ widget: {},
374
+ tabs: { default: () => [] },
375
+ activeTabId: {}
376
+ },
377
+ emits: ["update:activeTabId"],
378
+ setup(e, { emit: t }) {
379
+ let n = e, r = t, i = N(), a = /* @__PURE__ */ new Map(), c = s(() => n.tabs.length > 1), f = s(() => n.tabs[0]), m = s(() => {
380
+ let e = n.activeTabId;
381
+ return n.tabs.some((t) => t.id === e) ? e : n.tabs[0]?.id;
382
+ }), h = s(() => n.widget ?? f.value?.widget), g = s(() => n.title ?? n.widget?.title ?? f.value?.title ?? h.value?.title ?? h.value?.type), _ = `${i}-tabpanel`;
383
+ function v(e) {
384
+ return `${i}-tab-${e}`;
385
+ }
386
+ function x(e, t) {
387
+ t instanceof HTMLButtonElement ? a.set(e, t) : a.delete(e);
388
+ }
389
+ function S(e) {
390
+ e !== m.value && r("update:activeTabId", e);
391
+ }
392
+ function C(e, t) {
393
+ if (!n.tabs.length) return;
394
+ let r = {
395
+ ArrowRight: (t + 1) % n.tabs.length,
396
+ ArrowDown: (t + 1) % n.tabs.length,
397
+ ArrowLeft: (t - 1 + n.tabs.length) % n.tabs.length,
398
+ ArrowUp: (t - 1 + n.tabs.length) % n.tabs.length,
399
+ Home: 0,
400
+ End: n.tabs.length - 1
401
+ }[e.key], i = n.tabs[r];
402
+ i && (e.preventDefault(), S(i.id), y(() => a.get(i.id)?.focus()));
403
+ }
404
+ return I(() => [n.activeTabId, n.tabs.map((e) => e.id).join(",")], () => {
405
+ let e = m.value;
406
+ c.value && e && e !== n.activeTabId && r("update:activeTabId", e);
407
+ }, { immediate: !0 }), (t, n) => (w(), u("section", { class: b(["lumal-cockpit-card", { "is-tabs": c.value }]) }, [c.value ? (w(), u("header", Se, [d("div", Ce, [(w(!0), u(o, null, D(e.tabs, (e, n) => (w(), u("button", {
408
+ id: v(n),
409
+ key: e.id,
410
+ ref_for: !0,
411
+ ref: (t) => x(e.id, t),
412
+ type: "button",
413
+ role: "tab",
414
+ class: b(["lumal-cockpit-card__tab", { "is-active": e.id === m.value }]),
415
+ "aria-controls": _,
416
+ "aria-selected": e.id === m.value,
417
+ tabindex: e.id === m.value ? 0 : -1,
418
+ onClick: (t) => S(e.id),
419
+ onKeydown: (e) => C(e, n)
420
+ }, [O(t.$slots, "tab", {
421
+ tab: e,
422
+ active: e.id === m.value
423
+ }, () => [p(A(e.title), 1)])], 42, we))), 128))])])) : g.value || t.$slots.title ? (w(), u("header", Te, [d("div", Ee, [O(t.$slots, "title", {
424
+ title: g.value,
425
+ widget: h.value
426
+ }, () => [p(A(g.value), 1)])])])) : l("", !0), d("div", {
427
+ id: c.value ? _ : void 0,
428
+ class: "lumal-cockpit-card__body",
429
+ role: c.value ? "tabpanel" : void 0,
430
+ "aria-labelledby": c.value ? v(Math.max(0, e.tabs.findIndex((e) => e.id === m.value))) : void 0,
431
+ tabindex: c.value ? 0 : void 0
432
+ }, [O(t.$slots, "default", { activeTabId: m.value })], 8, De)], 2));
433
+ }
434
+ }), Oe = [
435
+ "data-mode",
436
+ "data-cockpit-theme",
437
+ "data-viewport-mode"
438
+ ], ke = {
439
+ key: 0,
440
+ class: "lumal-cockpit__auto-refresh"
441
+ }, Ae = { class: "lumal-cockpit__auto-refresh-control" }, je = /* @__PURE__ */ h({
442
+ __name: "LumalCockpit",
443
+ props: /*@__PURE__*/ v({
444
+ config: {},
445
+ registry: {},
446
+ baseWidth: { default: 1920 },
447
+ baseHeight: { default: 1080 },
448
+ cachePages: {
449
+ type: Boolean,
450
+ default: !0
451
+ },
452
+ renderMode: { default: "runtime" },
453
+ viewportMode: { default: "scale" },
454
+ messageBus: {},
455
+ cardComponent: {},
456
+ autoRefresh: {
457
+ type: Boolean,
458
+ default: !1
459
+ },
460
+ autoRefreshIntervalMs: { default: H }
461
+ }, {
462
+ activeLayoutId: {},
463
+ activeLayoutIdModifiers: {},
464
+ themeMode: { default: "dark" },
465
+ themeModeModifiers: {},
466
+ autoRefreshEnabled: {
467
+ type: Boolean,
468
+ default: !1
469
+ },
470
+ autoRefreshEnabledModifiers: {}
471
+ }),
472
+ emits: /*@__PURE__*/ v([
473
+ "configure",
474
+ "configError",
475
+ "nodeSelect"
476
+ ], [
477
+ "update:activeLayoutId",
478
+ "update:themeMode",
479
+ "update:autoRefreshEnabled"
480
+ ]),
481
+ setup(t, { expose: r, emit: i }) {
482
+ let a = t, c = i, f = P(t, "activeLayoutId"), p = P(t, "themeMode"), h = P(t, "autoRefreshEnabled"), _ = te(), v = s(() => {
483
+ try {
484
+ return {
485
+ config: e(a.config),
486
+ error: null
487
+ };
488
+ } catch (e) {
489
+ return {
490
+ config: null,
491
+ error: e
492
+ };
493
+ }
494
+ }), y = s(() => v.value.config);
495
+ I(() => v.value.error, (e) => {
496
+ e && c("configError", e);
497
+ }, { immediate: !0 });
498
+ let b = a.messageBus ?? n();
499
+ ee(G, {
500
+ cockpitId: a.config.id,
501
+ mode: a.renderMode,
502
+ registry: a.registry,
503
+ messages: b,
504
+ cachePages: a.cachePages,
505
+ slots: _,
506
+ get cardComponent() {
507
+ return a.cardComponent ?? Q;
508
+ }
509
+ });
510
+ let S = W({
511
+ config: () => y.value ?? a.config,
512
+ activeLayoutId: f
513
+ }), C = s(() => {
514
+ let e = S.activeLayout.value;
515
+ if (e) return {
516
+ cockpitId: y.value?.id ?? a.config.id,
517
+ layoutId: e.id,
518
+ instanceId: `${e.id}:center`,
519
+ mode: a.renderMode,
520
+ messages: b
521
+ };
522
+ }), T = E(!1);
523
+ I([() => a.autoRefresh, h], ([e, t]) => {
524
+ T.value = !!(e && t);
525
+ }, { immediate: !0 });
526
+ let D = s(() => {
527
+ let e = Math.round(a.autoRefreshIntervalMs / 6e4);
528
+ return e >= 1 ? `${e} 分钟` : `${Math.round(a.autoRefreshIntervalMs / 1e3)} 秒`;
529
+ }), { refreshNow: k } = U({
530
+ messages: b,
531
+ sourceId: () => y.value?.id ?? a.config.id,
532
+ intervalMs: () => a.autoRefreshIntervalMs,
533
+ enabled: T
534
+ }), A = E(null);
535
+ async function j() {
536
+ A.value?.requestFullscreen && await A.value.requestFullscreen();
537
+ }
538
+ async function N() {
539
+ document.fullscreenElement && await document.exitFullscreen();
540
+ }
541
+ function F() {
542
+ p.value = p.value === "dark" ? "light" : "dark";
543
+ }
544
+ r({
545
+ enterFullscreen: j,
546
+ exitFullscreen: N,
547
+ messages: b,
548
+ toggleTheme: F,
549
+ refreshNow: k
550
+ });
551
+ let R = s(() => !!y.value?.layouts.length);
552
+ function z() {
553
+ c("configure");
554
+ }
555
+ function B(e) {
556
+ if (a.renderMode !== "design") return;
557
+ let t = (e.target instanceof Element ? e.target : null)?.closest("[data-cockpit-node]");
558
+ if (!t || !A.value?.contains(t)) return;
559
+ let n = t.dataset.cockpitNode, r = t.dataset.cockpitNodeId;
560
+ !n || !r || c("nodeSelect", {
561
+ kind: n,
562
+ id: r,
563
+ side: t.dataset.cockpitSide
564
+ });
565
+ }
566
+ return (e, n) => (w(), u("div", {
567
+ ref_key: "rootRef",
568
+ ref: A,
569
+ class: "lumal-cockpit",
570
+ "data-mode": t.renderMode,
571
+ "data-cockpit-theme": p.value,
572
+ "data-viewport-mode": t.viewportMode,
573
+ onClickCapture: B
574
+ }, [v.value.error ? O(e.$slots, "error", {
575
+ key: 0,
576
+ error: v.value.error
577
+ }, () => [n[1] ||= d("div", {
578
+ class: "lumal-cockpit__error",
579
+ role: "alert"
580
+ }, " 配置加载失败 ", -1)]) : R.value ? M(S).activeLayout.value && C.value ? (w(), u(o, { key: 2 }, [m(Z, {
581
+ title: y.value.title,
582
+ "base-width": t.baseWidth,
583
+ "base-height": t.baseHeight,
584
+ "viewport-mode": t.viewportMode,
585
+ layout: M(S).activeLayout.value,
586
+ "center-context": C.value
587
+ }, {
588
+ "header-prefix": L(() => [O(e.$slots, "header-prefix")]),
589
+ "header-title": L((t) => [O(e.$slots, "header-title", x(g(t)))]),
590
+ "header-actions": L(() => [t.autoRefresh ? (w(), u("div", ke, [m(M(re), { content: h.value ? `关闭自动刷新(每 ${D.value})` : `开启自动刷新(每 ${D.value})` }, {
591
+ default: L(() => [d("label", Ae, [n[3] ||= d("span", null, "自动刷新", -1), m(M(ne), {
592
+ modelValue: h.value,
593
+ "onUpdate:modelValue": n[0] ||= (e) => h.value = e,
594
+ size: "small",
595
+ "data-action": "cockpit-auto-refresh",
596
+ "aria-label": `全局自动刷新,间隔 ${D.value}`
597
+ }, null, 8, ["modelValue", "aria-label"])])]),
598
+ _: 1
599
+ }, 8, ["content"])])) : l("", !0), O(e.$slots, "header-actions")]),
600
+ center: L((t) => [O(e.$slots, "center", x(g(t)))]),
601
+ left: L((t) => [O(e.$slots, "left", x(g(t)))]),
602
+ right: L((t) => [O(e.$slots, "right", x(g(t)))]),
603
+ _: 3
604
+ }, 8, [
605
+ "title",
606
+ "base-width",
607
+ "base-height",
608
+ "viewport-mode",
609
+ "layout",
610
+ "center-context"
611
+ ]), O(e.$slots, "configure-trigger", { configure: z })], 64)) : l("", !0) : O(e.$slots, "empty", { key: 1 }, () => [n[2] ||= d("div", {
612
+ class: "lumal-cockpit__empty",
613
+ role: "status"
614
+ }, " 空驾驶舱 ", -1)])], 40, Oe));
615
+ }
616
+ });
617
+ //#endregion
618
+ //#region src/runtime/index.ts
619
+ function $(e, t) {
620
+ let n = e;
621
+ return n.install = function(n) {
622
+ n.component(t, e);
623
+ }, n;
624
+ }
625
+ var Me = $(je, "LumalCockpit"), Ne = $(Q, "LumalCockpitCard");
626
+ //#endregion
627
+ export { J as a, K as c, U as d, V as f, Y as i, W as l, Ne as n, q as o, Z as r, G as s, Me as t, H as u };
@@ -0,0 +1 @@
1
+ const e=require("./resolveComponent-BF1aCxAk.cjs");let t=require("vue"),n=require("element-plus"),r=require("@lumal/icons-vue");var i=`cockpit:refresh`,a=300*1e3;function o(e){let n=e.enabled??(0,t.ref)(e.defaultEnabled??!1),r;function a(n=`manual`){let r={reason:n,at:Date.now()};e.messages.publish({topic:i,sourceId:(0,t.toValue)(e.sourceId),payload:r})}function o(){r!==void 0&&(clearInterval(r),r=void 0)}function s(){o();let n=Math.max(1e3,(0,t.toValue)(e.intervalMs)??3e5);r=setInterval(()=>{a(`interval`)},n)}return(0,t.watch)(n,e=>{e?s():o()},{immediate:!0}),(0,t.watch)(()=>(0,t.toValue)(e.intervalMs),()=>{n.value&&s()}),(0,t.onBeforeUnmount)(o),{enabled:n,refreshNow:a}}function s(e){let n=(0,t.computed)(()=>{let t=e.config().layouts;if(!t.length)return;let n=e.activeLayoutId.value??e.config().activeLayoutId;return t.find(e=>e.id===n)??t[0]});function r(t){e.activeLayoutId.value=t}return{activeLayout:n,selectLayout:r}}var c=Symbol(`lumal-cockpit-runtime-env`);function l(){let e=(0,t.inject)(c,null);if(!e)throw Error(`[cockpit] 运行时环境缺失,组件必须在 LumalCockpit 内渲染。`);return e}var u=[`data-widget-type`,`data-instance-id`,`data-cockpit-node-id`,`data-cockpit-side`],d={class:`lumal-cockpit-widget__body`},f={key:1,class:`lumal-cockpit-widget__missing`,role:`status`},p={key:1,class:`lumal-cockpit-widget__error`,role:`alert`},m=(0,t.defineComponent)({__name:`LumalCockpitWidgetHost`,props:{layoutId:{},side:{},widget:{},embedded:{type:Boolean}},setup(i){let a=i,o=l(),s=(0,t.computed)(()=>o.registry.resolveWidget(a.widget.type)),c=(0,t.computed)(()=>{let t=s.value;return t?e.t(t.component):null}),m=(0,t.computed)(()=>({cockpitId:o.cockpitId,layoutId:a.layoutId,instanceId:a.widget.id,mode:o.mode,messages:o.messages}));e.v(m.value),(0,t.onBeforeUnmount)(()=>{o.messages.clearInstance(a.widget.id)});let h=(0,t.computed)(()=>a.widget.title??s.value?.label??a.widget.type),g=(0,t.computed)(()=>a.embedded?`div`:o.cardComponent),_=(0,t.computed)(()=>a.embedded?{class:`lumal-cockpit-widget__embedded`}:{title:h.value,widget:a.widget});return(a,l)=>((0,t.openBlock)(),(0,t.createElementBlock)(`section`,{class:`lumal-cockpit-widget`,"data-widget-type":i.widget.type,"data-instance-id":i.widget.id,"data-cockpit-node":`widget`,"data-cockpit-node-id":i.widget.id,"data-cockpit-side":i.side},[((0,t.openBlock)(),(0,t.createBlock)((0,t.resolveDynamicComponent)(g.value),(0,t.normalizeProps)((0,t.guardReactiveProps)(_.value)),(0,t.createSlots)({default:(0,t.withCtx)(()=>[(0,t.createElementVNode)(`div`,d,[s.value?((0,t.openBlock)(),(0,t.createBlock)(e.n,{key:1},{error:(0,t.withCtx)(({retry:e})=>[(0,t.unref)(o).slots.error?((0,t.openBlock)(),(0,t.createBlock)((0,t.resolveDynamicComponent)((0,t.unref)(o).slots.error),{key:0,retry:e,"instance-id":i.widget.id},null,8,[`retry`,`instance-id`])):((0,t.openBlock)(),(0,t.createElementBlock)(`div`,p,[l[1]||=(0,t.createElementVNode)(`span`,null,`模块加载失败`,-1),(0,t.createVNode)((0,t.unref)(n.ElButton),{text:``,type:`primary`,onClick:e},{default:(0,t.withCtx)(()=>[(0,t.createVNode)((0,t.unref)(r.LumalIcon),{name:`lumal:refresh`,size:14}),l[0]||=(0,t.createTextVNode)(` 重试 `,-1)]),_:1},8,[`onClick`])]))]),default:(0,t.withCtx)(()=>[((0,t.openBlock)(),(0,t.createBlock)((0,t.resolveDynamicComponent)(c.value),{context:m.value},null,8,[`context`]))]),_:1})):((0,t.openBlock)(),(0,t.createElementBlock)(t.Fragment,{key:0},[(0,t.unref)(o).slots[`missing-widget`]?((0,t.openBlock)(),(0,t.createBlock)((0,t.resolveDynamicComponent)((0,t.unref)(o).slots[`missing-widget`]),{key:0,type:i.widget.type,"instance-id":i.widget.id},null,8,[`type`,`instance-id`])):((0,t.openBlock)(),(0,t.createElementBlock)(`div`,f,` 未注册模块:`+(0,t.toDisplayString)(i.widget.type),1))],64))])]),_:2},[!i.embedded&&(0,t.unref)(o).slots[`widget-title`]?{name:`title`,fn:(0,t.withCtx)(()=>[((0,t.openBlock)(),(0,t.createBlock)((0,t.resolveDynamicComponent)((0,t.unref)(o).slots[`widget-title`]),{widget:i.widget,title:h.value},null,8,[`widget`,`title`]))]),key:`0`}:void 0]),1040))],8,u))}}),h=[`data-cockpit-node-id`,`data-cockpit-side`],g=[`data-cockpit-node-id`,`data-cockpit-side`],_={key:1,class:`lumal-cockpit-container__empty`,role:`status`},v={key:0,class:`lumal-cockpit-container__tabpanel`},y={key:1,class:`lumal-cockpit-container__empty`,role:`status`},b=(0,t.defineComponent)({__name:`LumalCockpitContainer`,props:{columns:{},layoutId:{},row:{},side:{}},setup(e){let n=e,r=(0,t.computed)(()=>({height:`${n.row.height}%`})),i=(0,t.computed)(()=>({gridTemplateColumns:n.columns.map(e=>`calc(${e.width} * var(--lumal-cockpit-x-unit, 1px))`).join(` `)})),a=(0,t.ref)(),o=(0,t.reactive)(new Set),s=l(),c=(0,t.computed)(()=>n.row.widgets.map(e=>({id:e.id,title:e.title??s.registry.resolveWidget(e.type)?.label??e.type,widget:e})));function u(){let e=n.row.activeWidgetId;return n.row.widgets.some(t=>t.id===e)?e:n.row.widgets[0]?.id}return(0,t.watch)(()=>[n.row.id,n.row.activeWidgetId],()=>{a.value=u()},{immediate:!0}),(0,t.watch)(()=>n.row.widgets.map(e=>e.id).join(`,`),()=>{let e=new Set(n.row.widgets.map(e=>e.id));o.forEach(t=>{e.has(t)||o.delete(t)}),n.row.widgets.some(e=>e.id===a.value)||(a.value=u())}),(0,t.watch)(a,e=>{e&&o.add(e)},{immediate:!0}),(n,l)=>((0,t.openBlock)(),(0,t.createElementBlock)(`section`,{class:(0,t.normalizeClass)([`lumal-cockpit-container`,{"is-tabs":e.row.mode===`tabs`}]),style:(0,t.normalizeStyle)(r.value),"data-cockpit-node":`row`,"data-cockpit-node-id":e.row.id,"data-cockpit-side":e.side},[e.row.mode===`grid`?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:0,class:`lumal-cockpit-container__grid`,style:(0,t.normalizeStyle)(i.value)},[((0,t.openBlock)(!0),(0,t.createElementBlock)(t.Fragment,null,(0,t.renderList)(e.row.cells,n=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:n.id,class:`lumal-cockpit-container__cell`,"data-cockpit-node":`cell`,"data-cockpit-node-id":n.id,"data-cockpit-side":e.side},[n.widget?((0,t.openBlock)(),(0,t.createBlock)(m,{key:n.widget.id,"layout-id":e.layoutId,side:e.side,widget:n.widget},null,8,[`layout-id`,`side`,`widget`])):((0,t.openBlock)(),(0,t.createElementBlock)(`div`,_,` 空模块槽 `))],8,g))),128))],4)):((0,t.openBlock)(),(0,t.createElementBlock)(t.Fragment,{key:1},[e.row.widgets.length?((0,t.openBlock)(),(0,t.createBlock)((0,t.resolveDynamicComponent)((0,t.unref)(s).cardComponent),{key:0,"active-tab-id":a.value,"onUpdate:activeTabId":l[0]||=e=>a.value=e,tabs:c.value},(0,t.createSlots)({default:(0,t.withCtx)(()=>[((0,t.openBlock)(!0),(0,t.createElementBlock)(t.Fragment,null,(0,t.renderList)(e.row.widgets,n=>((0,t.openBlock)(),(0,t.createElementBlock)(t.Fragment,{key:n.id},[o.has(n.id)?(0,t.withDirectives)(((0,t.openBlock)(),(0,t.createElementBlock)(`div`,v,[(0,t.createVNode)(m,{embedded:``,"layout-id":e.layoutId,side:e.side,widget:n},null,8,[`layout-id`,`side`,`widget`])],512)),[[t.vShow,n.id===a.value]]):(0,t.createCommentVNode)(``,!0)],64))),128))]),_:2},[(0,t.unref)(s).slots[`widget-title`]?{name:`title`,fn:(0,t.withCtx)(({title:e,widget:n})=>[((0,t.openBlock)(),(0,t.createBlock)((0,t.resolveDynamicComponent)((0,t.unref)(s).slots[`widget-title`]),{widget:n,title:e},null,8,[`widget`,`title`]))]),key:`0`}:void 0,(0,t.unref)(s).slots[`widget-title`]?{name:`tab`,fn:(0,t.withCtx)(({tab:e})=>[((0,t.openBlock)(),(0,t.createBlock)((0,t.resolveDynamicComponent)((0,t.unref)(s).slots[`widget-title`]),{widget:e.widget,title:e.title},null,8,[`widget`,`title`]))]),key:`1`}:void 0]),1064,[`active-tab-id`,`tabs`])):((0,t.openBlock)(),(0,t.createElementBlock)(`div`,y,` 空 Tab 行 `))],64))],14,h))}}),x=[`data-side`,`data-cockpit-node-id`,`data-cockpit-side`],S=(0,t.defineComponent)({__name:`LumalCockpitRegion`,props:{layoutId:{},region:{},side:{}},setup(e){let n=e,r=(0,t.computed)(()=>n.region.width>0?n.region.width:n.region.columns.reduce((e,t)=>e+t.width,0)),i=(0,t.computed)(()=>({width:`calc(${r.value} * var(--lumal-cockpit-x-unit, 1px) + ${Math.max(0,n.region.columns.length-1)} * var(--lumal-cockpit-gap-x, 12px))`}));return(n,r)=>((0,t.openBlock)(),(0,t.createElementBlock)(`section`,{class:`lumal-cockpit-region`,"data-side":e.side,"data-cockpit-node":`region`,"data-cockpit-node-id":`${e.layoutId}:${e.side}`,"data-cockpit-side":e.side,style:(0,t.normalizeStyle)(i.value)},[((0,t.openBlock)(!0),(0,t.createElementBlock)(t.Fragment,null,(0,t.renderList)(e.region.rows,n=>((0,t.openBlock)(),(0,t.createBlock)(b,{key:n.id,"layout-id":e.layoutId,side:e.side,columns:e.region.columns,row:n},null,8,[`layout-id`,`side`,`columns`,`row`]))),128))],12,x))}}),C=[`data-scale`,`data-viewport-mode`],w={class:`lumal-cockpit-canvas__header`},T={class:`lumal-cockpit-canvas__header-prefix`},E={class:`lumal-cockpit-canvas__title`},D={class:`lumal-cockpit-canvas__header-actions`},O={class:`lumal-cockpit-canvas__body`},k={class:`lumal-cockpit-canvas__center`},A={class:`lumal-cockpit-canvas__left`},j={class:`lumal-cockpit-canvas__right`},M=(0,t.defineComponent)({__name:`LumalCockpitCanvas`,props:{title:{},baseWidth:{},baseHeight:{},layout:{},centerContext:{},viewportMode:{}},setup(n){let r=n,i=(0,t.ref)(null),{result:a}=e.x(i,{baseWidth:()=>r.baseWidth,baseHeight:()=>r.baseHeight}),o=(0,t.computed)(()=>r.viewportMode===`vwvh`?{width:`100vw`,height:`100vh`,"--lumal-cockpit-x-unit":`${100/r.baseWidth}vw`,"--lumal-cockpit-y-unit":`${100/r.baseHeight}vh`}:r.viewportMode===`external`?{width:`${r.baseWidth}px`,height:`${r.baseHeight}px`,"--lumal-cockpit-x-unit":`1px`,"--lumal-cockpit-y-unit":`1px`}:{width:`${r.baseWidth}px`,height:`${r.baseHeight}px`,transform:`translate(${a.value.offsetX}px, ${a.value.offsetY}px) scale(${a.value.scale})`,transformOrigin:`top left`,"--lumal-cockpit-x-unit":`1px`,"--lumal-cockpit-y-unit":`1px`});return(e,r)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{ref_key:`containerRef`,ref:i,class:`lumal-cockpit-canvas`,"data-scale":(0,t.unref)(a).scale.toFixed(3),"data-viewport-mode":n.viewportMode},[(0,t.createElementVNode)(`div`,{class:`lumal-cockpit-canvas__stage`,style:(0,t.normalizeStyle)(o.value)},[(0,t.createElementVNode)(`header`,w,[(0,t.createElementVNode)(`div`,T,[(0,t.renderSlot)(e.$slots,`header-prefix`)]),(0,t.createElementVNode)(`div`,E,[(0,t.renderSlot)(e.$slots,`header-title`,{title:n.title},()=>[(0,t.createElementVNode)(`h1`,null,(0,t.toDisplayString)(n.title),1)])]),(0,t.createElementVNode)(`div`,D,[(0,t.renderSlot)(e.$slots,`header-actions`)])]),(0,t.createElementVNode)(`div`,O,[(0,t.createElementVNode)(`main`,k,[(0,t.renderSlot)(e.$slots,`center`,{context:n.centerContext,layout:n.layout},()=>[r[0]||=(0,t.createElementVNode)(`div`,{class:`lumal-cockpit-center__empty`,role:`status`},` 由应用提供中央内容 `,-1)])]),(0,t.createElementVNode)(`div`,A,[(0,t.renderSlot)(e.$slots,`left`,{layout:n.layout,region:n.layout.left,side:`left`},()=>[(0,t.createVNode)(S,{side:`left`,"layout-id":n.layout.id,region:n.layout.left},null,8,[`layout-id`,`region`])])]),(0,t.createElementVNode)(`div`,j,[(0,t.renderSlot)(e.$slots,`right`,{layout:n.layout,region:n.layout.right,side:`right`},()=>[(0,t.createVNode)(S,{side:`right`,"layout-id":n.layout.id,region:n.layout.right},null,8,[`layout-id`,`region`])])])])],4)],8,C))}}),N={key:0,class:`lumal-cockpit-card__header`},P={class:`lumal-cockpit-card__tablist`,role:`tablist`,"aria-label":`模块切换`},F=[`id`,`aria-selected`,`tabindex`,`onClick`,`onKeydown`],I={key:1,class:`lumal-cockpit-card__header`},L={class:`lumal-cockpit-card__title`},R=[`id`,`role`,`aria-labelledby`,`tabindex`],z=(0,t.defineComponent)({__name:`LumalCockpitCard`,props:{title:{},widget:{},tabs:{default:()=>[]},activeTabId:{}},emits:[`update:activeTabId`],setup(e,{emit:n}){let r=e,i=n,a=(0,t.useId)(),o=new Map,s=(0,t.computed)(()=>r.tabs.length>1),c=(0,t.computed)(()=>r.tabs[0]),l=(0,t.computed)(()=>{let e=r.activeTabId;return r.tabs.some(t=>t.id===e)?e:r.tabs[0]?.id}),u=(0,t.computed)(()=>r.widget??c.value?.widget),d=(0,t.computed)(()=>r.title??r.widget?.title??c.value?.title??u.value?.title??u.value?.type),f=`${a}-tabpanel`;function p(e){return`${a}-tab-${e}`}function m(e,t){t instanceof HTMLButtonElement?o.set(e,t):o.delete(e)}function h(e){e!==l.value&&i(`update:activeTabId`,e)}function g(e,n){if(!r.tabs.length)return;let i={ArrowRight:(n+1)%r.tabs.length,ArrowDown:(n+1)%r.tabs.length,ArrowLeft:(n-1+r.tabs.length)%r.tabs.length,ArrowUp:(n-1+r.tabs.length)%r.tabs.length,Home:0,End:r.tabs.length-1}[e.key],a=r.tabs[i];a&&(e.preventDefault(),h(a.id),(0,t.nextTick)(()=>o.get(a.id)?.focus()))}return(0,t.watch)(()=>[r.activeTabId,r.tabs.map(e=>e.id).join(`,`)],()=>{let e=l.value;s.value&&e&&e!==r.activeTabId&&i(`update:activeTabId`,e)},{immediate:!0}),(n,r)=>((0,t.openBlock)(),(0,t.createElementBlock)(`section`,{class:(0,t.normalizeClass)([`lumal-cockpit-card`,{"is-tabs":s.value}])},[s.value?((0,t.openBlock)(),(0,t.createElementBlock)(`header`,N,[(0,t.createElementVNode)(`div`,P,[((0,t.openBlock)(!0),(0,t.createElementBlock)(t.Fragment,null,(0,t.renderList)(e.tabs,(e,r)=>((0,t.openBlock)(),(0,t.createElementBlock)(`button`,{id:p(r),key:e.id,ref_for:!0,ref:t=>m(e.id,t),type:`button`,role:`tab`,class:(0,t.normalizeClass)([`lumal-cockpit-card__tab`,{"is-active":e.id===l.value}]),"aria-controls":f,"aria-selected":e.id===l.value,tabindex:e.id===l.value?0:-1,onClick:t=>h(e.id),onKeydown:e=>g(e,r)},[(0,t.renderSlot)(n.$slots,`tab`,{tab:e,active:e.id===l.value},()=>[(0,t.createTextVNode)((0,t.toDisplayString)(e.title),1)])],42,F))),128))])])):d.value||n.$slots.title?((0,t.openBlock)(),(0,t.createElementBlock)(`header`,I,[(0,t.createElementVNode)(`div`,L,[(0,t.renderSlot)(n.$slots,`title`,{title:d.value,widget:u.value},()=>[(0,t.createTextVNode)((0,t.toDisplayString)(d.value),1)])])])):(0,t.createCommentVNode)(``,!0),(0,t.createElementVNode)(`div`,{id:s.value?f:void 0,class:`lumal-cockpit-card__body`,role:s.value?`tabpanel`:void 0,"aria-labelledby":s.value?p(Math.max(0,e.tabs.findIndex(e=>e.id===l.value))):void 0,tabindex:s.value?0:void 0},[(0,t.renderSlot)(n.$slots,`default`,{activeTabId:l.value})],8,R)],2))}}),B=[`data-mode`,`data-cockpit-theme`,`data-viewport-mode`],V={key:0,class:`lumal-cockpit__auto-refresh`},H={class:`lumal-cockpit__auto-refresh-control`},U=(0,t.defineComponent)({__name:`LumalCockpit`,props:(0,t.mergeModels)({config:{},registry:{},baseWidth:{default:1920},baseHeight:{default:1080},cachePages:{type:Boolean,default:!0},renderMode:{default:`runtime`},viewportMode:{default:`scale`},messageBus:{},cardComponent:{},autoRefresh:{type:Boolean,default:!1},autoRefreshIntervalMs:{default:a}},{activeLayoutId:{},activeLayoutIdModifiers:{},themeMode:{default:`dark`},themeModeModifiers:{},autoRefreshEnabled:{type:Boolean,default:!1},autoRefreshEnabledModifiers:{}}),emits:(0,t.mergeModels)([`configure`,`configError`,`nodeSelect`],[`update:activeLayoutId`,`update:themeMode`,`update:autoRefreshEnabled`]),setup(r,{expose:i,emit:a}){let l=r,u=a,d=(0,t.useModel)(r,`activeLayoutId`),f=(0,t.useModel)(r,`themeMode`),p=(0,t.useModel)(r,`autoRefreshEnabled`),m=(0,t.useSlots)(),h=(0,t.computed)(()=>{try{return{config:e.i(l.config),error:null}}catch(e){return{config:null,error:e}}}),g=(0,t.computed)(()=>h.value.config);(0,t.watch)(()=>h.value.error,e=>{e&&u(`configError`,e)},{immediate:!0});let _=l.messageBus??e.r();(0,t.provide)(c,{cockpitId:l.config.id,mode:l.renderMode,registry:l.registry,messages:_,cachePages:l.cachePages,slots:m,get cardComponent(){return l.cardComponent??z}});let v=s({config:()=>g.value??l.config,activeLayoutId:d}),y=(0,t.computed)(()=>{let e=v.activeLayout.value;if(e)return{cockpitId:g.value?.id??l.config.id,layoutId:e.id,instanceId:`${e.id}:center`,mode:l.renderMode,messages:_}}),b=(0,t.ref)(!1);(0,t.watch)([()=>l.autoRefresh,p],([e,t])=>{b.value=!!(e&&t)},{immediate:!0});let x=(0,t.computed)(()=>{let e=Math.round(l.autoRefreshIntervalMs/6e4);return e>=1?`${e} 分钟`:`${Math.round(l.autoRefreshIntervalMs/1e3)} 秒`}),{refreshNow:S}=o({messages:_,sourceId:()=>g.value?.id??l.config.id,intervalMs:()=>l.autoRefreshIntervalMs,enabled:b}),C=(0,t.ref)(null);async function w(){C.value?.requestFullscreen&&await C.value.requestFullscreen()}async function T(){document.fullscreenElement&&await document.exitFullscreen()}function E(){f.value=f.value===`dark`?`light`:`dark`}i({enterFullscreen:w,exitFullscreen:T,messages:_,toggleTheme:E,refreshNow:S});let D=(0,t.computed)(()=>!!g.value?.layouts.length);function O(){u(`configure`)}function k(e){if(l.renderMode!==`design`)return;let t=(e.target instanceof Element?e.target:null)?.closest(`[data-cockpit-node]`);if(!t||!C.value?.contains(t))return;let n=t.dataset.cockpitNode,r=t.dataset.cockpitNodeId;!n||!r||u(`nodeSelect`,{kind:n,id:r,side:t.dataset.cockpitSide})}return(e,i)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{ref_key:`rootRef`,ref:C,class:`lumal-cockpit`,"data-mode":r.renderMode,"data-cockpit-theme":f.value,"data-viewport-mode":r.viewportMode,onClickCapture:k},[h.value.error?(0,t.renderSlot)(e.$slots,`error`,{key:0,error:h.value.error},()=>[i[1]||=(0,t.createElementVNode)(`div`,{class:`lumal-cockpit__error`,role:`alert`},` 配置加载失败 `,-1)]):D.value?(0,t.unref)(v).activeLayout.value&&y.value?((0,t.openBlock)(),(0,t.createElementBlock)(t.Fragment,{key:2},[(0,t.createVNode)(M,{title:g.value.title,"base-width":r.baseWidth,"base-height":r.baseHeight,"viewport-mode":r.viewportMode,layout:(0,t.unref)(v).activeLayout.value,"center-context":y.value},{"header-prefix":(0,t.withCtx)(()=>[(0,t.renderSlot)(e.$slots,`header-prefix`)]),"header-title":(0,t.withCtx)(n=>[(0,t.renderSlot)(e.$slots,`header-title`,(0,t.normalizeProps)((0,t.guardReactiveProps)(n)))]),"header-actions":(0,t.withCtx)(()=>[r.autoRefresh?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,V,[(0,t.createVNode)((0,t.unref)(n.ElTooltip),{content:p.value?`关闭自动刷新(每 ${x.value})`:`开启自动刷新(每 ${x.value})`},{default:(0,t.withCtx)(()=>[(0,t.createElementVNode)(`label`,H,[i[3]||=(0,t.createElementVNode)(`span`,null,`自动刷新`,-1),(0,t.createVNode)((0,t.unref)(n.ElSwitch),{modelValue:p.value,"onUpdate:modelValue":i[0]||=e=>p.value=e,size:`small`,"data-action":`cockpit-auto-refresh`,"aria-label":`全局自动刷新,间隔 ${x.value}`},null,8,[`modelValue`,`aria-label`])])]),_:1},8,[`content`])])):(0,t.createCommentVNode)(``,!0),(0,t.renderSlot)(e.$slots,`header-actions`)]),center:(0,t.withCtx)(n=>[(0,t.renderSlot)(e.$slots,`center`,(0,t.normalizeProps)((0,t.guardReactiveProps)(n)))]),left:(0,t.withCtx)(n=>[(0,t.renderSlot)(e.$slots,`left`,(0,t.normalizeProps)((0,t.guardReactiveProps)(n)))]),right:(0,t.withCtx)(n=>[(0,t.renderSlot)(e.$slots,`right`,(0,t.normalizeProps)((0,t.guardReactiveProps)(n)))]),_:3},8,[`title`,`base-width`,`base-height`,`viewport-mode`,`layout`,`center-context`]),(0,t.renderSlot)(e.$slots,`configure-trigger`,{configure:O})],64)):(0,t.createCommentVNode)(``,!0):(0,t.renderSlot)(e.$slots,`empty`,{key:1},()=>[i[2]||=(0,t.createElementVNode)(`div`,{class:`lumal-cockpit__empty`,role:`status`},` 空驾驶舱 `,-1)])],40,B))}});function W(e,t){let n=e;return n.install=function(n){n.component(t,e)},n}var G=W(U,`LumalCockpit`),K=W(z,`LumalCockpitCard`);Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return a}});
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./resolveComponent-BF1aCxAk.cjs"),t=require("./runtime-wzWMTWrS.cjs");exports.LumalCockpit=t.t,exports.LumalCockpitCanvas=t.r,exports.LumalCockpitCard=t.n,exports.LumalCockpitContainer=t.a,exports.LumalCockpitRegion=t.i,exports.LumalCockpitWidgetHost=t.o,exports.cockpitRuntimeEnvKey=t.s,exports.resolveCockpitComponent=e.t,exports.useCockpitRuntimeEnv=t.c;
@@ -0,0 +1,3 @@
1
+ import { t as e } from "./resolveComponent-QbJRsdxR.js";
2
+ import { a as t, c as n, i as r, n as i, o as a, r as o, s, t as c } from "./runtime-CXiih7DE.js";
3
+ export { c as LumalCockpit, o as LumalCockpitCanvas, i as LumalCockpitCard, t as LumalCockpitContainer, r as LumalCockpitRegion, a as LumalCockpitWidgetHost, s as cockpitRuntimeEnvKey, e as resolveCockpitComponent, n as useCockpitRuntimeEnv };
@@ -0,0 +1,9 @@
1
+ export { computeCanvasScale, useCanvasScale, } from './useCanvasScale';
2
+ export type { CanvasScaleResult, UseCanvasScaleOptions, } from './useCanvasScale';
3
+ export { DEFAULT_COCKPIT_AUTO_REFRESH_INTERVAL_MS, useCockpitAutoRefresh, } from './useCockpitAutoRefresh';
4
+ export type { UseCockpitAutoRefreshOptions, UseCockpitAutoRefreshReturn, } from './useCockpitAutoRefresh';
5
+ export { useCockpit, } from './useCockpit';
6
+ export type { UseCockpitOptions, UseCockpitReturn, } from './useCockpit';
7
+ export { cockpitContextKey, provideCockpitContext, useCockpitContext, } from './useCockpitContext';
8
+ export { useCockpitRefresh, } from './useCockpitRefresh';
9
+ //# sourceMappingURL=index.d.ts.map