@lumal/cockpit 0.0.1-beta → 0.0.3-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 (49) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/LICENSE +21 -21
  3. package/dist/cockpit.css +1 -1
  4. package/dist/createCockpitRegistry-8t6uUH6d.js +31 -0
  5. package/dist/createCockpitRegistry-B2vNbpcw.cjs +1 -0
  6. package/dist/designer.cjs +1 -1
  7. package/dist/designer.js +613 -546
  8. package/dist/index.cjs +1 -1
  9. package/dist/index.js +6 -6
  10. package/dist/registry.cjs +1 -1
  11. package/dist/registry.js +1 -1
  12. package/dist/resolveComponent-DXwlDKov.cjs +1 -0
  13. package/dist/resolveComponent-_XUQaM5w.js +331 -0
  14. package/dist/runtime-Be4SmioJ.cjs +1 -0
  15. package/dist/{runtime-CXiih7DE.js → runtime-DTxtlBRg.js} +167 -155
  16. package/dist/runtime.cjs +1 -1
  17. package/dist/runtime.js +2 -2
  18. package/dist/src/composables/index.d.ts +2 -2
  19. package/dist/src/composables/index.d.ts.map +1 -1
  20. package/dist/src/composables/useCanvasScale.d.ts +2 -1
  21. package/dist/src/composables/useCanvasScale.d.ts.map +1 -1
  22. package/dist/src/composables/useCockpitAutoRefresh.d.ts +1 -1
  23. package/dist/src/composables/useCockpitAutoRefresh.d.ts.map +1 -1
  24. package/dist/src/composables/useCockpitRefresh.d.ts +1 -1
  25. package/dist/src/composables/useCockpitRefresh.d.ts.map +1 -1
  26. package/dist/src/designer/CockpitComponentLibrary.vue.d.ts.map +1 -1
  27. package/dist/src/designer/CockpitLayoutEditor.vue.d.ts.map +1 -1
  28. package/dist/src/designer/CockpitWidgetPreview.vue.d.ts +3 -1
  29. package/dist/src/designer/CockpitWidgetPreview.vue.d.ts.map +1 -1
  30. package/dist/src/designer/LumalCockpitDesigner.vue.d.ts +2 -2
  31. package/dist/src/designer/useCockpitDraft.d.ts.map +1 -1
  32. package/dist/src/index.d.ts +2 -1
  33. package/dist/src/index.d.ts.map +1 -1
  34. package/dist/src/messaging/createCockpitMessageBus.d.ts +2 -2
  35. package/dist/src/messaging/createCockpitMessageBus.d.ts.map +1 -1
  36. package/dist/src/messaging/types.d.ts +5 -1
  37. package/dist/src/messaging/types.d.ts.map +1 -1
  38. package/dist/src/registry/createCockpitRegistry.d.ts.map +1 -1
  39. package/dist/src/runtime/LumalCockpit.vue.d.ts.map +1 -1
  40. package/dist/src/runtime/LumalCockpitContainer.vue.d.ts.map +1 -1
  41. package/dist/src/runtime/LumalCockpitWidgetHost.vue.d.ts.map +1 -1
  42. package/dist/{validate-KSzm5SZW.cjs → validate-CRxxljQ8.cjs} +1 -1
  43. package/dist/{validate-DkC_IHrC.js → validate-ip4tDXsj.js} +1 -1
  44. package/package.json +4 -3
  45. package/dist/createCockpitRegistry-D5F4d5By.js +0 -30
  46. package/dist/createCockpitRegistry-DHr9nXJY.cjs +0 -1
  47. package/dist/resolveComponent-BF1aCxAk.cjs +0 -1
  48. package/dist/resolveComponent-QbJRsdxR.js +0 -308
  49. package/dist/runtime-wzWMTWrS.cjs +0 -1
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./resolveComponent-BF1aCxAk.cjs"),t=require("./runtime-wzWMTWrS.cjs"),n=require("./validate-KSzm5SZW.cjs"),r=require("./createCockpitRegistry-DHr9nXJY.cjs");let i=require("vue");function a(n){let r=e.y();(0,i.onBeforeUnmount)(r.messages.subscribe(t.f,n,{targetId:r.instanceId}))}function o(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function s(e){if(!o(e))throw Error(`驾驶舱配置必须是对象。`);if(e.schemaVersion!==3)throw Error(`仅支持 v3 驾驶舱配置,请重新创建布局。`);return{...e}}function c(e){return e.schemaVersion!==3}function l(t){return e.i(s(t))}exports.COCKPIT_REFRESH_TOPIC=t.f,exports.COCKPIT_SCHEMA_VERSION=e.a,exports.DEFAULT_COCKPIT_AUTO_REFRESH_INTERVAL_MS=t.u,exports.DEFAULT_COLUMN_WIDTH=e.o,exports.DEFAULT_REGION_WIDTH=e.s,exports.DEFAULT_ROW_HEIGHT=e.c,exports.LumalCockpit=t.t,exports.LumalCockpitCard=t.n,exports.computeCanvasScale=e.b,exports.createCockpitId=e.l,exports.createCockpitMessageBus=e.r,exports.createCockpitRegistry=r.t,exports.createDefaultCockpitConfig=e.u,exports.createGridCell=e.d,exports.createGridColumn=e.f,exports.createGridRow=e.p,exports.createLayout=e.m,exports.createRegion=e.h,exports.createWidgetInstance=e.g,exports.equalizeRegionColumns=e._,exports.migrateCockpitConfig=s,exports.needsMigration=c,exports.normalizeCockpitConfig=e.i,exports.prepareCockpitConfig=l,exports.useCanvasScale=e.x,exports.useCockpit=t.l,exports.useCockpitAutoRefresh=t.d,exports.useCockpitContext=e.y,exports.useCockpitRefresh=a,exports.useCockpitRuntimeEnv=t.c,exports.validateCockpitConfig=n.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./resolveComponent-DXwlDKov.cjs"),t=require("./runtime-Be4SmioJ.cjs"),n=require("./validate-CRxxljQ8.cjs"),r=require("./createCockpitRegistry-B2vNbpcw.cjs");let i=require("vue");function a(n){let r=e.y();(0,i.onBeforeUnmount)(r.messages.subscribe(t.d,n,{targetId:r.instanceId}))}function o(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function s(e){if(!o(e))throw Error(`驾驶舱配置必须是对象。`);if(e.schemaVersion!==3)throw Error(`仅支持 v3 驾驶舱配置,请重新创建布局。`);return{...e}}function c(e){return e.schemaVersion!==3}function l(t){return e.i(s(t))}exports.COCKPIT_REFRESH_TOPIC=t.d,exports.COCKPIT_SCHEMA_VERSION=e.a,exports.DEFAULT_COCKPIT_AUTO_REFRESH_INTERVAL_MS=t.l,exports.DEFAULT_COLUMN_WIDTH=e.o,exports.DEFAULT_REGION_WIDTH=e.s,exports.DEFAULT_ROW_HEIGHT=e.c,exports.LumalCockpit=t.t,exports.LumalCockpitCard=t.n,exports.computeCanvasScale=e.b,exports.createCockpitId=e.l,exports.createCockpitMessageBus=e.r,exports.createCockpitRegistry=r.t,exports.createDefaultCockpitConfig=e.u,exports.createGridCell=e.d,exports.createGridColumn=e.f,exports.createGridRow=e.p,exports.createLayout=e.m,exports.createRegion=e.h,exports.createWidgetInstance=e.g,exports.equalizeRegionColumns=e._,exports.migrateCockpitConfig=s,exports.needsMigration=c,exports.normalizeCockpitConfig=e.i,exports.prepareCockpitConfig=l,exports.useCanvasScale=e.x,exports.useCockpit=t.f,exports.useCockpitAutoRefresh=t.u,exports.useCockpitContext=e.y,exports.useCockpitRefresh=a,exports.useCockpitRuntimeEnv=t.c,exports.validateCockpitConfig=n.t;
package/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
- import { _ as e, a as t, b as n, c as r, d as i, f as a, g as o, h as s, i as c, l, m as u, o as d, p as f, r as p, s as m, u as h, x as g, y as _ } from "./resolveComponent-QbJRsdxR.js";
2
- import { c as v, d as y, f as b, l as x, n as S, t as C, u as w } from "./runtime-CXiih7DE.js";
3
- import { t as T } from "./validate-DkC_IHrC.js";
4
- import { t as E } from "./createCockpitRegistry-D5F4d5By.js";
1
+ import { _ as e, a as t, b as n, c as r, d as i, f as a, g as o, h as s, i as c, l, m as u, o as d, p as f, r as p, s as m, u as h, x as g, y as _ } from "./resolveComponent-_XUQaM5w.js";
2
+ import { c as v, d as y, f as b, l as x, n as S, t as C, u as w } from "./runtime-DTxtlBRg.js";
3
+ import { t as T } from "./validate-ip4tDXsj.js";
4
+ import { t as E } from "./createCockpitRegistry-8t6uUH6d.js";
5
5
  import { onBeforeUnmount as D } from "vue";
6
6
  //#region src/composables/useCockpitRefresh.ts
7
7
  function O(e) {
8
8
  let t = _();
9
- D(t.messages.subscribe(b, e, { targetId: t.instanceId }));
9
+ D(t.messages.subscribe(y, e, { targetId: t.instanceId }));
10
10
  }
11
11
  //#endregion
12
12
  //#region src/config/migrate.ts
@@ -27,4 +27,4 @@ function M(e) {
27
27
  return c(A(e));
28
28
  }
29
29
  //#endregion
30
- export { b as COCKPIT_REFRESH_TOPIC, t as COCKPIT_SCHEMA_VERSION, w as DEFAULT_COCKPIT_AUTO_REFRESH_INTERVAL_MS, d as DEFAULT_COLUMN_WIDTH, m as DEFAULT_REGION_WIDTH, r as DEFAULT_ROW_HEIGHT, C as LumalCockpit, S as LumalCockpitCard, n as computeCanvasScale, l as createCockpitId, p as createCockpitMessageBus, E as createCockpitRegistry, h as createDefaultCockpitConfig, i as createGridCell, a as createGridColumn, f as createGridRow, u as createLayout, s as createRegion, o as createWidgetInstance, e as equalizeRegionColumns, A as migrateCockpitConfig, j as needsMigration, c as normalizeCockpitConfig, M as prepareCockpitConfig, g as useCanvasScale, x as useCockpit, y as useCockpitAutoRefresh, _ as useCockpitContext, O as useCockpitRefresh, v as useCockpitRuntimeEnv, T as validateCockpitConfig };
30
+ export { y as COCKPIT_REFRESH_TOPIC, t as COCKPIT_SCHEMA_VERSION, x as DEFAULT_COCKPIT_AUTO_REFRESH_INTERVAL_MS, d as DEFAULT_COLUMN_WIDTH, m as DEFAULT_REGION_WIDTH, r as DEFAULT_ROW_HEIGHT, C as LumalCockpit, S as LumalCockpitCard, n as computeCanvasScale, l as createCockpitId, p as createCockpitMessageBus, E as createCockpitRegistry, h as createDefaultCockpitConfig, i as createGridCell, a as createGridColumn, f as createGridRow, u as createLayout, s as createRegion, o as createWidgetInstance, e as equalizeRegionColumns, A as migrateCockpitConfig, j as needsMigration, c as normalizeCockpitConfig, M as prepareCockpitConfig, g as useCanvasScale, b as useCockpit, w as useCockpitAutoRefresh, _ as useCockpitContext, O as useCockpitRefresh, v as useCockpitRuntimeEnv, T as validateCockpitConfig };
package/dist/registry.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./createCockpitRegistry-DHr9nXJY.cjs");exports.createCockpitRegistry=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./createCockpitRegistry-B2vNbpcw.cjs");exports.createCockpitRegistry=e.t;
package/dist/registry.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as e } from "./createCockpitRegistry-D5F4d5By.js";
1
+ import { t as e } from "./createCockpitRegistry-8t6uUH6d.js";
2
2
  export { e as createCockpitRegistry };
@@ -0,0 +1 @@
1
+ let e=require("vue"),t=require("element-plus"),n=require("@lumal/icons-vue");function r(e,t,n,r){if(n<=0||r<=0||e<=0||t<=0)return{scale:1,scaledWidth:n,scaledHeight:r,offsetX:0,offsetY:0};let i=Math.min(e/n,t/r),a=n*i,o=r*i;return{scale:i,scaledWidth:a,scaledHeight:o,offsetX:(e-a)/2,offsetY:(t-o)/2}}function i(t,n){let i=(0,e.shallowRef)({scale:1,scaledWidth:n.baseWidth(),scaledHeight:n.baseHeight(),offsetX:0,offsetY:0}),a=(0,e.ref)(!1),o=null,s=0;function c(){let e=t.value;e&&(i.value=r(e.clientWidth,e.clientHeight,n.baseWidth(),n.baseHeight()),a.value=!0)}function l(){if(typeof requestAnimationFrame>`u`){c();return}s&&cancelAnimationFrame(s),s=requestAnimationFrame(()=>{s=0,c()})}function u(){o?.disconnect(),o=null}function d(){u(),!(n.enabled!==void 0&&!(0,e.toValue)(n.enabled))&&(c(),typeof ResizeObserver<`u`&&t.value&&(o=new ResizeObserver(l),o.observe(t.value)))}return(0,e.watch)([t,n.baseWidth,n.baseHeight,()=>n.enabled===void 0||(0,e.toValue)(n.enabled)],d,{flush:`post`,immediate:!0}),(0,e.onBeforeUnmount)(()=>{s&&typeof cancelAnimationFrame<`u`&&cancelAnimationFrame(s),u()}),{result:i,ready:a,measure:c}}var a=Symbol(`lumal-cockpit-context`);function o(t){(0,e.provide)(a,t)}function s(t=!1){let n=(0,e.inject)(a,null);if(!n&&!t)throw Error(`[cockpit] 未找到驾驶舱渲染上下文,请确认组件在 LumalCockpit 内渲染。`);return n}var c=3,l=320,u=420,d=100,f=0;function p(e=`ck`){f+=1;let t=Date.now().toString(36),n=Math.random().toString(36).slice(2,8);return`${e}-${t}-${f.toString(36)}-${n}`}function m(e,t){return{id:p(`widget`),type:e,title:t}}function h(e=320){return{id:p(`column`),width:e}}function g(e){let t=Math.max(1,e.columns.length),n=Math.max(t,Math.round(e.width)||420);e.width=n;let r=Math.floor(n/t),i=n-r*t;e.columns.forEach(e=>{e.width=r+ +(i>0),i>0&&--i})}function _(){return{id:p(`cell`)}}function v(e,t=`grid`,n=100){return{id:p(`row`),height:n,mode:t,cells:t===`grid`?Array.from({length:Math.max(1,e)},_):[],widgets:[]}}function y(e=1,t=1,n=420){let r=Array.from({length:Math.max(1,e)},()=>h()),i={width:n,columns:r,rows:Array.from({length:Math.max(1,t)},()=>v(r.length,`grid`,100/Math.max(1,t)))};return g(i),i}function b(e=`新布局`){return{id:p(`layout`),title:e,left:y(),right:y()}}function x(e=p(`cockpit`)){let t=b(`布局 1`);return{schemaVersion:3,id:e,title:`驾驶舱`,activeLayoutId:t.id,layouts:[t]}}function S(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function C(e){return Array.isArray(e)?e:[]}function w(e,t){return typeof e==`string`&&e.trim()?e:t}function T(e,t){let n=typeof e==`number`?e:Number(e);return Number.isFinite(n)&&n>0?n:t}function E(e){if(!(!S(e)||typeof e.type!=`string`||!e.type.trim()))return{id:w(e.id,p(`widget`)),type:e.type,title:typeof e.title==`string`&&e.title.trim()?e.title:void 0}}function D(e){let t=S(e)?e:{};return{id:w(t.id,p(`cell`)),widget:E(t.widget)}}function O(e){let t=C(e).map(e=>{let t=S(e)?e:{};return{id:w(t.id,p(`column`)),width:Math.round(T(t.width,320))}});return t.length?t:[h()]}function k(e,t){let n=S(e)?e:{},r=n.mode===`tabs`?`tabs`:`grid`,i={id:w(n.id,p(`row`)),height:T(n.height,100),mode:r,cells:[],widgets:[]};if(r===`tabs`){i.widgets=C(n.widgets).map(E).filter(e=>!!e);let e=typeof n.activeWidgetId==`string`?n.activeWidgetId:void 0;i.activeWidgetId=i.widgets.some(t=>t.id===e)?e:i.widgets[0]?.id}else{let e=C(n.cells).map(D).slice(0,t);for(;e.length<t;)e.push(_());i.cells=e}return i}function A(e){let t=e.reduce((e,t)=>e+t.height,0);if(t<=0){let t=100/e.length;e.forEach(e=>{e.height=t});return}e.forEach(e=>{e.height=Number((e.height/t*100).toFixed(3))});let n=Number((100-e.reduce((e,t)=>e+t.height,0)).toFixed(3));e[e.length-1]&&(e[e.length-1].height=Number((e[e.length-1].height+n).toFixed(3)))}function j(e){let t=S(e)?e:{},n=O(t.columns),r=n.reduce((e,t)=>e+t.width,0),i=Math.round(T(t.width,r>0?r:420)),a=C(t.rows).map(e=>k(e,n.length));a.length||a.push(v(n.length)),A(a);let o={width:i,columns:n,rows:a};return g(o),o}function M(e){let t=S(e)?e:{},n=b(w(t.title,`未命名布局`));return n.id=w(t.id,n.id),n.left=j(t.left),n.right=j(t.right),n}function N(e){let t=S(e)?e:{},n=C(t.layouts).map(M),r={schemaVersion:3,id:w(t.id,p(`cockpit`)),title:w(t.title,`驾驶舱`),layouts:n.length?n:[b(`布局 1`)]},i=typeof t.activeLayoutId==`string`?t.activeLayoutId:void 0;return r.activeLayoutId=r.layouts.some(e=>e.id===i)?i:r.layouts[0].id,r}function P(e={}){let t=new Map;function n(t,n){let r=e=>{console.error(`[cockpit] 消息订阅处理器异常(topic: ${n})`,e)};try{e.onError?Promise.resolve(e.onError(t,n)).catch(r):r(t)}catch(e){r(e)}}function r(e){let r=t.get(e.topic);if(!r||r.size===0)return;let i=[...r];for(let t of i){let r=e.targetId===void 0,i=t.targetId!==void 0&&t.targetId===e.targetId;if(!(!r&&!i))try{let r=t.handler(e);r&&Promise.resolve(r).catch(t=>n(t,e.topic))}catch(t){n(t,e.topic)}}}function i(e,n,r){let i=t.get(e);i||(i=new Set,t.set(e,i));let a={handler:n,targetId:r?.targetId};return i.add(a),function(){let n=t.get(e);n&&(n.delete(a),n.size===0&&t.delete(e))}}function a(e){for(let[n,r]of t){for(let t of[...r])t.targetId===e&&r.delete(t);r.size===0&&t.delete(n)}}return{publish:r,subscribe:i,clearInstance:a}}var F={class:`lumal-cockpit-error-boundary`},I={class:`lumal-cockpit-error-boundary__fallback`,role:`alert`},L=(0,e.defineComponent)({__name:`CockpitErrorBoundary`,emits:[`error`],setup(r,{emit:i}){let a=i,o=(0,e.ref)(!1),s=(0,e.ref)(null),c=(0,e.ref)(0);(0,e.onErrorCaptured)(e=>(o.value=!0,s.value=e,a(`error`,e),!1));async function l(){o.value=!1,s.value=null,await(0,e.nextTick)(),c.value+=1}return(r,i)=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,F,[o.value?(0,e.renderSlot)(r.$slots,`error`,{key:0,error:s.value,retry:l},()=>[(0,e.createElementVNode)(`div`,I,[i[1]||=(0,e.createElementVNode)(`p`,{class:`lumal-cockpit-error-boundary__message`},` 组件渲染失败 `,-1),(0,e.createVNode)((0,e.unref)(t.ElButton),{class:`lumal-cockpit-error-boundary__retry`,onClick:l},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(n.LumalIcon),{name:`lumal:refresh`,size:15}),i[0]||=(0,e.createTextVNode)(` 重试 `,-1)]),_:1})])]):(0,e.renderSlot)(r.$slots,`default`,{key:c.value})]))}}),R=new WeakMap;function z(t){if(typeof t==`function`){let n=t,r=R.get(n);if(r)return r;let i=(0,e.defineAsyncComponent)(t);return R.set(n,i),i}return t}Object.defineProperty(exports,"_",{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"b",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"x",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"y",{enumerable:!0,get:function(){return s}});
@@ -0,0 +1,331 @@
1
+ import { createElementBlock as e, createElementVNode as t, createTextVNode as n, createVNode as r, defineAsyncComponent as i, defineComponent as a, inject as o, nextTick as s, onBeforeUnmount as c, onErrorCaptured as l, openBlock as u, provide as d, ref as f, renderSlot as p, shallowRef as m, toValue as h, unref as g, watch as _, withCtx as v } from "vue";
2
+ import { ElButton as y } from "element-plus";
3
+ import { LumalIcon as b } from "@lumal/icons-vue";
4
+ //#region src/composables/useCanvasScale.ts
5
+ function x(e, t, n, r) {
6
+ if (n <= 0 || r <= 0 || e <= 0 || t <= 0) return {
7
+ scale: 1,
8
+ scaledWidth: n,
9
+ scaledHeight: r,
10
+ offsetX: 0,
11
+ offsetY: 0
12
+ };
13
+ let i = Math.min(e / n, t / r), a = n * i, o = r * i;
14
+ return {
15
+ scale: i,
16
+ scaledWidth: a,
17
+ scaledHeight: o,
18
+ offsetX: (e - a) / 2,
19
+ offsetY: (t - o) / 2
20
+ };
21
+ }
22
+ function S(e, t) {
23
+ let n = m({
24
+ scale: 1,
25
+ scaledWidth: t.baseWidth(),
26
+ scaledHeight: t.baseHeight(),
27
+ offsetX: 0,
28
+ offsetY: 0
29
+ }), r = f(!1), i = null, a = 0;
30
+ function o() {
31
+ let i = e.value;
32
+ i && (n.value = x(i.clientWidth, i.clientHeight, t.baseWidth(), t.baseHeight()), r.value = !0);
33
+ }
34
+ function s() {
35
+ if (typeof requestAnimationFrame > "u") {
36
+ o();
37
+ return;
38
+ }
39
+ a && cancelAnimationFrame(a), a = requestAnimationFrame(() => {
40
+ a = 0, o();
41
+ });
42
+ }
43
+ function l() {
44
+ i?.disconnect(), i = null;
45
+ }
46
+ function u() {
47
+ l(), !(t.enabled !== void 0 && !h(t.enabled)) && (o(), typeof ResizeObserver < "u" && e.value && (i = new ResizeObserver(s), i.observe(e.value)));
48
+ }
49
+ return _([
50
+ e,
51
+ t.baseWidth,
52
+ t.baseHeight,
53
+ () => t.enabled === void 0 || h(t.enabled)
54
+ ], u, {
55
+ flush: "post",
56
+ immediate: !0
57
+ }), c(() => {
58
+ a && typeof cancelAnimationFrame < "u" && cancelAnimationFrame(a), l();
59
+ }), {
60
+ result: n,
61
+ ready: r,
62
+ measure: o
63
+ };
64
+ }
65
+ //#endregion
66
+ //#region src/composables/useCockpitContext.ts
67
+ var C = Symbol("lumal-cockpit-context");
68
+ function w(e) {
69
+ d(C, e);
70
+ }
71
+ function T(e = !1) {
72
+ let t = o(C, null);
73
+ if (!t && !e) throw Error("[cockpit] 未找到驾驶舱渲染上下文,请确认组件在 LumalCockpit 内渲染。");
74
+ return t;
75
+ }
76
+ //#endregion
77
+ //#region src/config/defaults.ts
78
+ var E = 3, D = 320, ee = 420, O = 100, k = 0;
79
+ function A(e = "ck") {
80
+ k += 1;
81
+ let t = Date.now().toString(36), n = Math.random().toString(36).slice(2, 8);
82
+ return `${e}-${t}-${k.toString(36)}-${n}`;
83
+ }
84
+ function j(e, t) {
85
+ return {
86
+ id: A("widget"),
87
+ type: e,
88
+ title: t
89
+ };
90
+ }
91
+ function M(e = 320) {
92
+ return {
93
+ id: A("column"),
94
+ width: e
95
+ };
96
+ }
97
+ function N(e) {
98
+ let t = Math.max(1, e.columns.length), n = Math.max(t, Math.round(e.width) || 420);
99
+ e.width = n;
100
+ let r = Math.floor(n / t), i = n - r * t;
101
+ e.columns.forEach((e) => {
102
+ e.width = r + +(i > 0), i > 0 && --i;
103
+ });
104
+ }
105
+ function P() {
106
+ return { id: A("cell") };
107
+ }
108
+ function F(e, t = "grid", n = 100) {
109
+ return {
110
+ id: A("row"),
111
+ height: n,
112
+ mode: t,
113
+ cells: t === "grid" ? Array.from({ length: Math.max(1, e) }, P) : [],
114
+ widgets: []
115
+ };
116
+ }
117
+ function I(e = 1, t = 1, n = 420) {
118
+ let r = Array.from({ length: Math.max(1, e) }, () => M()), i = {
119
+ width: n,
120
+ columns: r,
121
+ rows: Array.from({ length: Math.max(1, t) }, () => F(r.length, "grid", 100 / Math.max(1, t)))
122
+ };
123
+ return N(i), i;
124
+ }
125
+ function L(e = "新布局") {
126
+ return {
127
+ id: A("layout"),
128
+ title: e,
129
+ left: I(),
130
+ right: I()
131
+ };
132
+ }
133
+ function R(e = A("cockpit")) {
134
+ let t = L("布局 1");
135
+ return {
136
+ schemaVersion: 3,
137
+ id: e,
138
+ title: "驾驶舱",
139
+ activeLayoutId: t.id,
140
+ layouts: [t]
141
+ };
142
+ }
143
+ //#endregion
144
+ //#region src/config/normalize.ts
145
+ function z(e) {
146
+ return typeof e == "object" && !!e && !Array.isArray(e);
147
+ }
148
+ function B(e) {
149
+ return Array.isArray(e) ? e : [];
150
+ }
151
+ function V(e, t) {
152
+ return typeof e == "string" && e.trim() ? e : t;
153
+ }
154
+ function H(e, t) {
155
+ let n = typeof e == "number" ? e : Number(e);
156
+ return Number.isFinite(n) && n > 0 ? n : t;
157
+ }
158
+ function U(e) {
159
+ if (!(!z(e) || typeof e.type != "string" || !e.type.trim())) return {
160
+ id: V(e.id, A("widget")),
161
+ type: e.type,
162
+ title: typeof e.title == "string" && e.title.trim() ? e.title : void 0
163
+ };
164
+ }
165
+ function W(e) {
166
+ let t = z(e) ? e : {};
167
+ return {
168
+ id: V(t.id, A("cell")),
169
+ widget: U(t.widget)
170
+ };
171
+ }
172
+ function G(e) {
173
+ let t = B(e).map((e) => {
174
+ let t = z(e) ? e : {};
175
+ return {
176
+ id: V(t.id, A("column")),
177
+ width: Math.round(H(t.width, 320))
178
+ };
179
+ });
180
+ return t.length ? t : [M()];
181
+ }
182
+ function K(e, t) {
183
+ let n = z(e) ? e : {}, r = n.mode === "tabs" ? "tabs" : "grid", i = {
184
+ id: V(n.id, A("row")),
185
+ height: H(n.height, 100),
186
+ mode: r,
187
+ cells: [],
188
+ widgets: []
189
+ };
190
+ if (r === "tabs") {
191
+ i.widgets = B(n.widgets).map(U).filter((e) => !!e);
192
+ let e = typeof n.activeWidgetId == "string" ? n.activeWidgetId : void 0;
193
+ i.activeWidgetId = i.widgets.some((t) => t.id === e) ? e : i.widgets[0]?.id;
194
+ } else {
195
+ let e = B(n.cells).map(W).slice(0, t);
196
+ for (; e.length < t;) e.push(P());
197
+ i.cells = e;
198
+ }
199
+ return i;
200
+ }
201
+ function q(e) {
202
+ let t = e.reduce((e, t) => e + t.height, 0);
203
+ if (t <= 0) {
204
+ let t = 100 / e.length;
205
+ e.forEach((e) => {
206
+ e.height = t;
207
+ });
208
+ return;
209
+ }
210
+ e.forEach((e) => {
211
+ e.height = Number((e.height / t * 100).toFixed(3));
212
+ });
213
+ let n = Number((100 - e.reduce((e, t) => e + t.height, 0)).toFixed(3));
214
+ e[e.length - 1] && (e[e.length - 1].height = Number((e[e.length - 1].height + n).toFixed(3)));
215
+ }
216
+ function J(e) {
217
+ let t = z(e) ? e : {}, n = G(t.columns), r = n.reduce((e, t) => e + t.width, 0), i = Math.round(H(t.width, r > 0 ? r : 420)), a = B(t.rows).map((e) => K(e, n.length));
218
+ a.length || a.push(F(n.length)), q(a);
219
+ let o = {
220
+ width: i,
221
+ columns: n,
222
+ rows: a
223
+ };
224
+ return N(o), o;
225
+ }
226
+ function Y(e) {
227
+ let t = z(e) ? e : {}, n = L(V(t.title, "未命名布局"));
228
+ return n.id = V(t.id, n.id), n.left = J(t.left), n.right = J(t.right), n;
229
+ }
230
+ function X(e) {
231
+ let t = z(e) ? e : {}, n = B(t.layouts).map(Y), r = {
232
+ schemaVersion: 3,
233
+ id: V(t.id, A("cockpit")),
234
+ title: V(t.title, "驾驶舱"),
235
+ layouts: n.length ? n : [L("布局 1")]
236
+ }, i = typeof t.activeLayoutId == "string" ? t.activeLayoutId : void 0;
237
+ return r.activeLayoutId = r.layouts.some((e) => e.id === i) ? i : r.layouts[0].id, r;
238
+ }
239
+ //#endregion
240
+ //#region src/messaging/createCockpitMessageBus.ts
241
+ function Z(e = {}) {
242
+ let t = /* @__PURE__ */ new Map();
243
+ function n(t, n) {
244
+ let r = (e) => {
245
+ console.error(`[cockpit] 消息订阅处理器异常(topic: ${n})`, e);
246
+ };
247
+ try {
248
+ e.onError ? Promise.resolve(e.onError(t, n)).catch(r) : r(t);
249
+ } catch (e) {
250
+ r(e);
251
+ }
252
+ }
253
+ function r(e) {
254
+ let r = t.get(e.topic);
255
+ if (!r || r.size === 0) return;
256
+ let i = [...r];
257
+ for (let t of i) {
258
+ let r = e.targetId === void 0, i = t.targetId !== void 0 && t.targetId === e.targetId;
259
+ if (!(!r && !i)) try {
260
+ let r = t.handler(e);
261
+ r && Promise.resolve(r).catch((t) => n(t, e.topic));
262
+ } catch (t) {
263
+ n(t, e.topic);
264
+ }
265
+ }
266
+ }
267
+ function i(e, n, r) {
268
+ let i = t.get(e);
269
+ i || (i = /* @__PURE__ */ new Set(), t.set(e, i));
270
+ let a = {
271
+ handler: n,
272
+ targetId: r?.targetId
273
+ };
274
+ return i.add(a), function() {
275
+ let n = t.get(e);
276
+ n && (n.delete(a), n.size === 0 && t.delete(e));
277
+ };
278
+ }
279
+ function a(e) {
280
+ for (let [n, r] of t) {
281
+ for (let t of [...r]) t.targetId === e && r.delete(t);
282
+ r.size === 0 && t.delete(n);
283
+ }
284
+ }
285
+ return {
286
+ publish: r,
287
+ subscribe: i,
288
+ clearInstance: a
289
+ };
290
+ }
291
+ //#endregion
292
+ //#region src/runtime/CockpitErrorBoundary.vue?vue&type=script&setup=true&lang.ts
293
+ var Q = { class: "lumal-cockpit-error-boundary" }, te = {
294
+ class: "lumal-cockpit-error-boundary__fallback",
295
+ role: "alert"
296
+ }, ne = /* @__PURE__ */ a({
297
+ __name: "CockpitErrorBoundary",
298
+ emits: ["error"],
299
+ setup(i, { emit: a }) {
300
+ let o = a, c = f(!1), d = f(null), m = f(0);
301
+ l((e) => (c.value = !0, d.value = e, o("error", e), !1));
302
+ async function h() {
303
+ c.value = !1, d.value = null, await s(), m.value += 1;
304
+ }
305
+ return (i, a) => (u(), e("div", Q, [c.value ? p(i.$slots, "error", {
306
+ key: 0,
307
+ error: d.value,
308
+ retry: h
309
+ }, () => [t("div", te, [a[1] ||= t("p", { class: "lumal-cockpit-error-boundary__message" }, " 组件渲染失败 ", -1), r(g(y), {
310
+ class: "lumal-cockpit-error-boundary__retry",
311
+ onClick: h
312
+ }, {
313
+ default: v(() => [r(g(b), {
314
+ name: "lumal:refresh",
315
+ size: 15
316
+ }), a[0] ||= n(" 重试 ", -1)]),
317
+ _: 1
318
+ })])]) : p(i.$slots, "default", { key: m.value })]));
319
+ }
320
+ }), $ = /* @__PURE__ */ new WeakMap();
321
+ function re(e) {
322
+ if (typeof e == "function") {
323
+ let t = e, n = $.get(t);
324
+ if (n) return n;
325
+ let r = i(e);
326
+ return $.set(t, r), r;
327
+ }
328
+ return e;
329
+ }
330
+ //#endregion
331
+ export { N as _, E as a, x as b, O as c, P as d, M as f, j as g, I as h, X as i, A as l, L as m, ne as n, D as o, F as p, Z as r, ee as s, re as t, R as u, w as v, S as x, T as y };
@@ -0,0 +1 @@
1
+ const e=require("./resolveComponent-DXwlDKov.cjs");let t=require("vue"),n=require("element-plus"),r=require("@lumal/icons-vue");function i(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 a=`cockpit:refresh`,o=300*1e3;function s(e){let n=e.enabled??(0,t.ref)(e.defaultEnabled??!1),r;function i(n=`manual`){let r={reason:n,at:Date.now()};e.messages.publish({topic:a,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(()=>{typeof document<`u`&&document.hidden||i(`interval`)},n)}function c(){!document.hidden&&n.value&&i(`interval`)}return typeof document<`u`&&document.addEventListener(`visibilitychange`,c),(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(),typeof document<`u`&&document.removeEventListener(`visibilitychange`,c)}),{enabled:n,refreshNow:i}}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.shallowReactive)({cockpitId:o.cockpitId,layoutId:a.layoutId,instanceId:a.widget.id,mode:o.mode,messages:o.messages});(0,t.watchEffect)(()=>{m.cockpitId=o.cockpitId,m.layoutId=a.layoutId,m.instanceId=a.widget.id,m.mode=o.mode,m.messages=o.messages}),e.v(m),(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:(0,t.unref)(m)},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},[((0,t.unref)(s).cachePages?o.has(n.id):n.id===a.value)?(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:o}},{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:a,emit:o}){let l=r,u=o,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.shallowRef)(null),g=(0,t.shallowRef)(null),_=``,v=``;(0,t.watchEffect)(()=>{try{let t=JSON.stringify(l.config);if(t===_){g.value=null;return}let n=e.i(l.config),r=JSON.stringify(n);_=t,g.value=null,r!==v&&(h.value=n,v=r)}catch(e){g.value=e}});let y=(0,t.computed)(()=>({config:h.value,error:g.value}));(0,t.watch)(()=>y.value.error,e=>{e&&u(`configError`,e)},{immediate:!0});let b=l.messageBus??e.r(),x=(0,t.shallowReactive)({cockpitId:l.config.id,mode:l.renderMode,registry:l.registry,messages:b,cachePages:l.cachePages,slots:m,cardComponent:l.cardComponent??z});(0,t.watchEffect)(()=>{x.cockpitId=h.value?.id??l.config.id,x.mode=l.renderMode,x.registry=l.registry,x.cachePages=l.cachePages,x.cardComponent=l.cardComponent??z}),(0,t.provide)(c,x);let S=i({config:()=>h.value??l.config,activeLayoutId:d}),C=(0,t.computed)(()=>{let e=S.activeLayout.value;if(e)return{cockpitId:h.value?.id??l.config.id,layoutId:e.id,instanceId:`${e.id}:center`,mode:l.renderMode,messages:b}}),w=(0,t.ref)(!1);(0,t.watch)([()=>l.autoRefresh,p],([e,t])=>{w.value=!!(e&&t)},{immediate:!0});let T=(0,t.computed)(()=>{let e=Math.round(l.autoRefreshIntervalMs/6e4);return e>=1?`${e} 分钟`:`${Math.round(l.autoRefreshIntervalMs/1e3)} 秒`}),{refreshNow:E}=s({messages:b,sourceId:()=>h.value?.id??l.config.id,intervalMs:()=>l.autoRefreshIntervalMs,enabled:w}),D=(0,t.ref)(null);async function O(){D.value?.requestFullscreen&&await D.value.requestFullscreen()}async function k(){document.fullscreenElement&&await document.exitFullscreen()}function A(){f.value=f.value===`dark`?`light`:`dark`}a({enterFullscreen:O,exitFullscreen:k,messages:b,toggleTheme:A,refreshNow:E});let j=(0,t.computed)(()=>!!h.value?.layouts.length);function N(){u(`configure`)}function P(e){if(l.renderMode!==`design`)return;let t=(e.target instanceof Element?e.target:null)?.closest(`[data-cockpit-node]`);if(!t||!D.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:D,class:`lumal-cockpit`,"data-mode":r.renderMode,"data-cockpit-theme":f.value,"data-viewport-mode":r.viewportMode,onClickCapture:P},[y.value.error?(0,t.renderSlot)(e.$slots,`error`,{key:0,error:y.value.error},()=>[i[1]||=(0,t.createElementVNode)(`div`,{class:`lumal-cockpit__error`,role:`alert`},` 配置加载失败 `,-1)]):j.value?(0,t.unref)(S).activeLayout.value&&C.value?((0,t.openBlock)(),(0,t.createElementBlock)(t.Fragment,{key:2},[(0,t.createVNode)(M,{title:h.value.title,"base-width":r.baseWidth,"base-height":r.baseHeight,"viewport-mode":r.viewportMode,layout:(0,t.unref)(S).activeLayout.value,"center-context":C.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?`关闭自动刷新(每 ${T.value})`:`开启自动刷新(每 ${T.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":`全局自动刷新,间隔 ${T.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:N})],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 a}}),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 o}}),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 s}});