@aigne/afs-ui 1.11.0-beta.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +26 -0
- package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.cjs +11 -0
- package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.mjs +10 -0
- package/dist/aup-protocol.cjs +235 -0
- package/dist/aup-protocol.d.cts +78 -0
- package/dist/aup-protocol.d.cts.map +1 -0
- package/dist/aup-protocol.d.mts +78 -0
- package/dist/aup-protocol.d.mts.map +1 -0
- package/dist/aup-protocol.mjs +235 -0
- package/dist/aup-protocol.mjs.map +1 -0
- package/dist/aup-registry.cjs +2489 -0
- package/dist/aup-registry.mjs +2487 -0
- package/dist/aup-registry.mjs.map +1 -0
- package/dist/aup-spec.cjs +1467 -0
- package/dist/aup-spec.mjs +1466 -0
- package/dist/aup-spec.mjs.map +1 -0
- package/dist/aup-types.cjs +165 -0
- package/dist/aup-types.d.cts +157 -0
- package/dist/aup-types.d.cts.map +1 -0
- package/dist/aup-types.d.mts +157 -0
- package/dist/aup-types.d.mts.map +1 -0
- package/dist/aup-types.mjs +157 -0
- package/dist/aup-types.mjs.map +1 -0
- package/dist/backend.cjs +14 -0
- package/dist/backend.d.cts +104 -0
- package/dist/backend.d.cts.map +1 -0
- package/dist/backend.d.mts +104 -0
- package/dist/backend.d.mts.map +1 -0
- package/dist/backend.mjs +13 -0
- package/dist/backend.mjs.map +1 -0
- package/dist/degradation.cjs +85 -0
- package/dist/degradation.d.cts +17 -0
- package/dist/degradation.d.cts.map +1 -0
- package/dist/degradation.d.mts +17 -0
- package/dist/degradation.d.mts.map +1 -0
- package/dist/degradation.mjs +84 -0
- package/dist/degradation.mjs.map +1 -0
- package/dist/index.cjs +36 -0
- package/dist/index.d.cts +12 -0
- package/dist/index.d.mts +12 -0
- package/dist/index.mjs +13 -0
- package/dist/runtime.cjs +117 -0
- package/dist/runtime.d.cts +59 -0
- package/dist/runtime.d.cts.map +1 -0
- package/dist/runtime.d.mts +59 -0
- package/dist/runtime.d.mts.map +1 -0
- package/dist/runtime.mjs +118 -0
- package/dist/runtime.mjs.map +1 -0
- package/dist/session.cjs +159 -0
- package/dist/session.d.cts +80 -0
- package/dist/session.d.cts.map +1 -0
- package/dist/session.d.mts +80 -0
- package/dist/session.d.mts.map +1 -0
- package/dist/session.mjs +159 -0
- package/dist/session.mjs.map +1 -0
- package/dist/snapshot.cjs +162 -0
- package/dist/snapshot.mjs +163 -0
- package/dist/snapshot.mjs.map +1 -0
- package/dist/term-page.cjs +264 -0
- package/dist/term-page.mjs +264 -0
- package/dist/term-page.mjs.map +1 -0
- package/dist/term.cjs +295 -0
- package/dist/term.d.cts +84 -0
- package/dist/term.d.cts.map +1 -0
- package/dist/term.d.mts +84 -0
- package/dist/term.d.mts.map +1 -0
- package/dist/term.mjs +296 -0
- package/dist/term.mjs.map +1 -0
- package/dist/tty.cjs +136 -0
- package/dist/tty.d.cts +53 -0
- package/dist/tty.d.cts.map +1 -0
- package/dist/tty.d.mts +53 -0
- package/dist/tty.d.mts.map +1 -0
- package/dist/tty.mjs +135 -0
- package/dist/tty.mjs.map +1 -0
- package/dist/ui-provider.cjs +4615 -0
- package/dist/ui-provider.d.cts +307 -0
- package/dist/ui-provider.d.cts.map +1 -0
- package/dist/ui-provider.d.mts +307 -0
- package/dist/ui-provider.d.mts.map +1 -0
- package/dist/ui-provider.mjs +4616 -0
- package/dist/ui-provider.mjs.map +1 -0
- package/dist/web-page/core.cjs +1388 -0
- package/dist/web-page/core.mjs +1387 -0
- package/dist/web-page/core.mjs.map +1 -0
- package/dist/web-page/css.cjs +1699 -0
- package/dist/web-page/css.mjs +1698 -0
- package/dist/web-page/css.mjs.map +1 -0
- package/dist/web-page/icons.cjs +248 -0
- package/dist/web-page/icons.mjs +248 -0
- package/dist/web-page/icons.mjs.map +1 -0
- package/dist/web-page/overlay-themes.cjs +514 -0
- package/dist/web-page/overlay-themes.mjs +513 -0
- package/dist/web-page/overlay-themes.mjs.map +1 -0
- package/dist/web-page/renderers/action.cjs +72 -0
- package/dist/web-page/renderers/action.mjs +72 -0
- package/dist/web-page/renderers/action.mjs.map +1 -0
- package/dist/web-page/renderers/broadcast.cjs +160 -0
- package/dist/web-page/renderers/broadcast.mjs +160 -0
- package/dist/web-page/renderers/broadcast.mjs.map +1 -0
- package/dist/web-page/renderers/calendar.cjs +137 -0
- package/dist/web-page/renderers/calendar.mjs +137 -0
- package/dist/web-page/renderers/calendar.mjs.map +1 -0
- package/dist/web-page/renderers/canvas.cjs +173 -0
- package/dist/web-page/renderers/canvas.mjs +173 -0
- package/dist/web-page/renderers/canvas.mjs.map +1 -0
- package/dist/web-page/renderers/cdn-loader.cjs +25 -0
- package/dist/web-page/renderers/cdn-loader.mjs +25 -0
- package/dist/web-page/renderers/cdn-loader.mjs.map +1 -0
- package/dist/web-page/renderers/chart.cjs +101 -0
- package/dist/web-page/renderers/chart.mjs +101 -0
- package/dist/web-page/renderers/chart.mjs.map +1 -0
- package/dist/web-page/renderers/deck.cjs +390 -0
- package/dist/web-page/renderers/deck.mjs +390 -0
- package/dist/web-page/renderers/deck.mjs.map +1 -0
- package/dist/web-page/renderers/device.cjs +1015 -0
- package/dist/web-page/renderers/device.mjs +1015 -0
- package/dist/web-page/renderers/device.mjs.map +1 -0
- package/dist/web-page/renderers/editor.cjs +127 -0
- package/dist/web-page/renderers/editor.mjs +127 -0
- package/dist/web-page/renderers/editor.mjs.map +1 -0
- package/dist/web-page/renderers/finance-chart.cjs +178 -0
- package/dist/web-page/renderers/finance-chart.mjs +178 -0
- package/dist/web-page/renderers/finance-chart.mjs.map +1 -0
- package/dist/web-page/renderers/frame.cjs +274 -0
- package/dist/web-page/renderers/frame.mjs +274 -0
- package/dist/web-page/renderers/frame.mjs.map +1 -0
- package/dist/web-page/renderers/globe.cjs +119 -0
- package/dist/web-page/renderers/globe.mjs +119 -0
- package/dist/web-page/renderers/globe.mjs.map +1 -0
- package/dist/web-page/renderers/input.cjs +137 -0
- package/dist/web-page/renderers/input.mjs +137 -0
- package/dist/web-page/renderers/input.mjs.map +1 -0
- package/dist/web-page/renderers/list.cjs +1243 -0
- package/dist/web-page/renderers/list.mjs +1243 -0
- package/dist/web-page/renderers/list.mjs.map +1 -0
- package/dist/web-page/renderers/map.cjs +126 -0
- package/dist/web-page/renderers/map.mjs +126 -0
- package/dist/web-page/renderers/map.mjs.map +1 -0
- package/dist/web-page/renderers/media.cjs +106 -0
- package/dist/web-page/renderers/media.mjs +106 -0
- package/dist/web-page/renderers/media.mjs.map +1 -0
- package/dist/web-page/renderers/moonphase.cjs +105 -0
- package/dist/web-page/renderers/moonphase.mjs +105 -0
- package/dist/web-page/renderers/moonphase.mjs.map +1 -0
- package/dist/web-page/renderers/natal-chart.cjs +222 -0
- package/dist/web-page/renderers/natal-chart.mjs +222 -0
- package/dist/web-page/renderers/natal-chart.mjs.map +1 -0
- package/dist/web-page/renderers/overlay.cjs +531 -0
- package/dist/web-page/renderers/overlay.mjs +531 -0
- package/dist/web-page/renderers/overlay.mjs.map +1 -0
- package/dist/web-page/renderers/table.cjs +74 -0
- package/dist/web-page/renderers/table.mjs +74 -0
- package/dist/web-page/renderers/table.mjs.map +1 -0
- package/dist/web-page/renderers/terminal.cjs +30 -0
- package/dist/web-page/renderers/terminal.mjs +30 -0
- package/dist/web-page/renderers/terminal.mjs.map +1 -0
- package/dist/web-page/renderers/text.cjs +109 -0
- package/dist/web-page/renderers/text.mjs +109 -0
- package/dist/web-page/renderers/text.mjs.map +1 -0
- package/dist/web-page/renderers/ticker.cjs +133 -0
- package/dist/web-page/renderers/ticker.mjs +133 -0
- package/dist/web-page/renderers/ticker.mjs.map +1 -0
- package/dist/web-page/renderers/time.cjs +69 -0
- package/dist/web-page/renderers/time.mjs +69 -0
- package/dist/web-page/renderers/time.mjs.map +1 -0
- package/dist/web-page/renderers/unknown.cjs +20 -0
- package/dist/web-page/renderers/unknown.mjs +20 -0
- package/dist/web-page/renderers/unknown.mjs.map +1 -0
- package/dist/web-page/renderers/view.cjs +161 -0
- package/dist/web-page/renderers/view.mjs +161 -0
- package/dist/web-page/renderers/view.mjs.map +1 -0
- package/dist/web-page/renderers/wm.cjs +669 -0
- package/dist/web-page/renderers/wm.mjs +669 -0
- package/dist/web-page/renderers/wm.mjs.map +1 -0
- package/dist/web-page/skeleton.cjs +103 -0
- package/dist/web-page/skeleton.mjs +103 -0
- package/dist/web-page/skeleton.mjs.map +1 -0
- package/dist/web-page.cjs +114 -0
- package/dist/web-page.d.cts +19 -0
- package/dist/web-page.d.cts.map +1 -0
- package/dist/web-page.d.mts +19 -0
- package/dist/web-page.d.mts.map +1 -0
- package/dist/web-page.mjs +115 -0
- package/dist/web-page.mjs.map +1 -0
- package/dist/web.cjs +827 -0
- package/dist/web.d.cts +144 -0
- package/dist/web.d.cts.map +1 -0
- package/dist/web.d.mts +144 -0
- package/dist/web.d.mts.map +1 -0
- package/dist/web.mjs +828 -0
- package/dist/web.mjs.map +1 -0
- package/dist/wm-state.cjs +172 -0
- package/dist/wm-state.mjs +171 -0
- package/dist/wm-state.mjs.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,669 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/web-page/renderers/wm.ts
|
|
3
|
+
/**
|
|
4
|
+
* WM Renderer — Client-side window manager as AUP node types.
|
|
5
|
+
*
|
|
6
|
+
* WM is no longer a separate message protocol. It's two AUP node types:
|
|
7
|
+
* - "wm": container node, props.strategy = "single" | "floating" | "panels"
|
|
8
|
+
* - "wm-surface": child of wm, src = session URL, props = { title, position, size, ... }
|
|
9
|
+
*
|
|
10
|
+
* State lives in the AUP tree. Reconnect replays the tree → WM restores for free.
|
|
11
|
+
* Patches on WM nodes trigger re-render via the standard AUP DOM patching pipeline.
|
|
12
|
+
*/
|
|
13
|
+
const WM_JS = `
|
|
14
|
+
// ── WM Node Renderer ──
|
|
15
|
+
// Renders a "wm" AUP node as a window manager container.
|
|
16
|
+
// Reads strategy from node.props.strategy, surfaces from node.children (type="wm-surface").
|
|
17
|
+
|
|
18
|
+
var _wmMaxZ = 10;
|
|
19
|
+
|
|
20
|
+
function renderAupWm(node) {
|
|
21
|
+
var p = node.props || {};
|
|
22
|
+
var strategy = p.strategy || "single";
|
|
23
|
+
var children = node.children || [];
|
|
24
|
+
|
|
25
|
+
var container = document.createElement("div");
|
|
26
|
+
container.className = "wm-container";
|
|
27
|
+
container.setAttribute("data-wm-strategy", strategy);
|
|
28
|
+
|
|
29
|
+
// Collect surface data from children
|
|
30
|
+
var surfaces = [];
|
|
31
|
+
for (var i = 0; i < children.length; i++) {
|
|
32
|
+
var child = children[i];
|
|
33
|
+
if (child.type === "wm-surface") {
|
|
34
|
+
var cp = child.props || {};
|
|
35
|
+
surfaces.push({
|
|
36
|
+
id: child.id,
|
|
37
|
+
name: cp.surfaceName || child.id,
|
|
38
|
+
src: child.src || "",
|
|
39
|
+
title: cp.title || cp.surfaceName || child.id,
|
|
40
|
+
position: cp.position || null,
|
|
41
|
+
size: cp.size || null,
|
|
42
|
+
zIndex: cp.zIndex || 0,
|
|
43
|
+
docked: !!cp.docked,
|
|
44
|
+
panel: cp.panel || null,
|
|
45
|
+
originalPanel: cp.originalPanel || null,
|
|
46
|
+
node: child
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Determine active surface (from WM node state or first non-docked)
|
|
52
|
+
var wmState = node.state || {};
|
|
53
|
+
var activeName = wmState.active || null;
|
|
54
|
+
if (!activeName && surfaces.length > 0) {
|
|
55
|
+
for (var ai = 0; ai < surfaces.length; ai++) {
|
|
56
|
+
if (!surfaces[ai].docked) { activeName = surfaces[ai].name; break; }
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
switch (strategy) {
|
|
61
|
+
case "floating":
|
|
62
|
+
_wmRenderFloatingFromNode(container, surfaces, activeName, node);
|
|
63
|
+
break;
|
|
64
|
+
case "panels":
|
|
65
|
+
_wmRenderPanelsFromNode(container, surfaces, activeName, node);
|
|
66
|
+
break;
|
|
67
|
+
case "single":
|
|
68
|
+
default:
|
|
69
|
+
_wmRenderSingleFromNode(container, surfaces, activeName);
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return container;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ── Single Strategy ──
|
|
77
|
+
function _wmRenderSingleFromNode(container, surfaces, activeName) {
|
|
78
|
+
if (surfaces.length === 0) {
|
|
79
|
+
container.innerHTML = '<div class="wm-empty">No surfaces</div>';
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
for (var i = 0; i < surfaces.length; i++) {
|
|
83
|
+
var s = surfaces[i];
|
|
84
|
+
var el = _wmCreateSurfaceElFromNode(s);
|
|
85
|
+
if (s.name === activeName) {
|
|
86
|
+
el.style.display = "block";
|
|
87
|
+
el.setAttribute("data-active", "true");
|
|
88
|
+
el.style.position = "relative";
|
|
89
|
+
el.style.width = "100%";
|
|
90
|
+
el.style.height = "100%";
|
|
91
|
+
} else {
|
|
92
|
+
el.style.display = "none";
|
|
93
|
+
}
|
|
94
|
+
container.appendChild(el);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// ── Floating Strategy ──
|
|
99
|
+
function _wmRenderFloatingFromNode(container, surfaces, activeName, wmNode) {
|
|
100
|
+
container.style.position = "relative";
|
|
101
|
+
container.style.overflow = "hidden";
|
|
102
|
+
if (surfaces.length === 0) {
|
|
103
|
+
container.innerHTML = '<div class="wm-empty">No surfaces</div>';
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
var hasDocked = false;
|
|
108
|
+
var cascadeOffset = 30;
|
|
109
|
+
var floatingIdx = 0;
|
|
110
|
+
|
|
111
|
+
for (var i = 0; i < surfaces.length; i++) {
|
|
112
|
+
var s = surfaces[i];
|
|
113
|
+
if (s.docked) { hasDocked = true; continue; }
|
|
114
|
+
|
|
115
|
+
var el = _wmCreateSurfaceElFromNode(s);
|
|
116
|
+
|
|
117
|
+
// Floating: absolute position
|
|
118
|
+
el.style.position = "absolute";
|
|
119
|
+
if (s.position) {
|
|
120
|
+
el.style.left = s.position.x + "px";
|
|
121
|
+
el.style.top = s.position.y + "px";
|
|
122
|
+
} else {
|
|
123
|
+
el.style.left = (cascadeOffset * floatingIdx) + "px";
|
|
124
|
+
el.style.top = (cascadeOffset * floatingIdx) + "px";
|
|
125
|
+
}
|
|
126
|
+
if (s.size) {
|
|
127
|
+
el.style.width = s.size.width + "px";
|
|
128
|
+
el.style.height = s.size.height + "px";
|
|
129
|
+
} else {
|
|
130
|
+
el.style.width = "400px";
|
|
131
|
+
el.style.height = "300px";
|
|
132
|
+
}
|
|
133
|
+
var z = s.zIndex || (++_wmMaxZ);
|
|
134
|
+
el.style.zIndex = String(z);
|
|
135
|
+
|
|
136
|
+
// Decorator: title bar + close + resize
|
|
137
|
+
_wmApplyDecoratorFromNode(el, s, wmNode);
|
|
138
|
+
|
|
139
|
+
// Click-to-front
|
|
140
|
+
(function(surfEl, surfData, wmN) {
|
|
141
|
+
surfEl.addEventListener("pointerdown", function() {
|
|
142
|
+
_wmBringToFrontFromNode(surfEl, surfData, wmN);
|
|
143
|
+
});
|
|
144
|
+
})(el, s, wmNode);
|
|
145
|
+
|
|
146
|
+
// Active state
|
|
147
|
+
if (s.name === activeName) {
|
|
148
|
+
el.setAttribute("data-active", "true");
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
container.appendChild(el);
|
|
152
|
+
floatingIdx++;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Dock
|
|
156
|
+
if (hasDocked) {
|
|
157
|
+
var dockEl = document.createElement("div");
|
|
158
|
+
dockEl.className = "wm-dock";
|
|
159
|
+
dockEl.style.display = "flex";
|
|
160
|
+
for (var di = 0; di < surfaces.length; di++) {
|
|
161
|
+
var ds = surfaces[di];
|
|
162
|
+
if (!ds.docked) continue;
|
|
163
|
+
var item = document.createElement("div");
|
|
164
|
+
item.className = "wm-dock-item";
|
|
165
|
+
item.textContent = _escapeHtml(ds.title);
|
|
166
|
+
item.setAttribute("data-surface-id", ds.name);
|
|
167
|
+
// Undock on click — fire AUP event
|
|
168
|
+
(function(surfData, wmN) {
|
|
169
|
+
item.addEventListener("click", function() {
|
|
170
|
+
_fireAupEvent(surfData.id, "undock", {});
|
|
171
|
+
});
|
|
172
|
+
})(ds, wmNode);
|
|
173
|
+
dockEl.appendChild(item);
|
|
174
|
+
}
|
|
175
|
+
container.appendChild(dockEl);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function _wmBringToFrontFromNode(el, surfData, wmNode) {
|
|
180
|
+
surfData.zIndex = ++_wmMaxZ;
|
|
181
|
+
el.style.zIndex = String(surfData.zIndex);
|
|
182
|
+
// Update active on all siblings
|
|
183
|
+
var container = el.parentNode;
|
|
184
|
+
if (!container) return;
|
|
185
|
+
var siblings = container.querySelectorAll(".wm-surface");
|
|
186
|
+
for (var i = 0; i < siblings.length; i++) {
|
|
187
|
+
siblings[i].removeAttribute("data-active");
|
|
188
|
+
}
|
|
189
|
+
el.setAttribute("data-active", "true");
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// ── Panels Strategy ──
|
|
193
|
+
// Positions that span full width (rows, not columns)
|
|
194
|
+
var _wmRowPositions = { header: 1, footer: 1, statusbar: 1, dock: 1 };
|
|
195
|
+
|
|
196
|
+
function _wmRenderPanelsFromNode(container, surfaces, activeName, wmNode) {
|
|
197
|
+
var p = wmNode.props || {};
|
|
198
|
+
var panels = p.panels || [];
|
|
199
|
+
var panelActives = (wmNode.state || {}).panelActives || {};
|
|
200
|
+
|
|
201
|
+
if (panels.length === 0) {
|
|
202
|
+
container.innerHTML = '<div class="wm-empty">No panel layout configured</div>';
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
container.className = "wm-container wm-panels";
|
|
207
|
+
|
|
208
|
+
// Separate panels into rows (header/footer/statusbar/dock) and columns
|
|
209
|
+
var topRows = []; // header
|
|
210
|
+
var columns = []; // sidebar, primary, inspector, col1, col2, col3, etc.
|
|
211
|
+
var bottomRows = []; // footer, statusbar, dock
|
|
212
|
+
for (var pi = 0; pi < panels.length; pi++) {
|
|
213
|
+
var pos = panels[pi].position;
|
|
214
|
+
if (pos === "header") topRows.push(panels[pi]);
|
|
215
|
+
else if (_wmRowPositions[pos]) bottomRows.push(panels[pi]);
|
|
216
|
+
else columns.push(panels[pi]);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Build grid-template-columns from columns, with 4px dividers between
|
|
220
|
+
var colSizes = [];
|
|
221
|
+
var visibleCols = [];
|
|
222
|
+
for (var ci = 0; ci < columns.length; ci++) {
|
|
223
|
+
var col = columns[ci];
|
|
224
|
+
colSizes.push(col.defaultSize || "1fr");
|
|
225
|
+
visibleCols.push(col);
|
|
226
|
+
}
|
|
227
|
+
// Interleave divider gaps: "220px 4px 1fr 4px 280px"
|
|
228
|
+
var gridCols = [];
|
|
229
|
+
for (var gi = 0; gi < colSizes.length; gi++) {
|
|
230
|
+
if (gi > 0) gridCols.push("4px"); // divider
|
|
231
|
+
gridCols.push(colSizes[gi]);
|
|
232
|
+
}
|
|
233
|
+
if (gridCols.length === 0) gridCols.push("1fr");
|
|
234
|
+
|
|
235
|
+
// Compute grid-template-rows
|
|
236
|
+
var gridRows = [];
|
|
237
|
+
if (topRows.length > 0) gridRows.push("auto");
|
|
238
|
+
gridRows.push("1fr"); // main column area
|
|
239
|
+
for (var br = 0; br < bottomRows.length; br++) gridRows.push("auto");
|
|
240
|
+
|
|
241
|
+
container.style.gridTemplateColumns = gridCols.join(" ");
|
|
242
|
+
container.style.gridTemplateRows = gridRows.join(" ");
|
|
243
|
+
|
|
244
|
+
// Responsive tab bar (hidden by default, shown < 768px)
|
|
245
|
+
var responsiveTabBar = document.createElement("div");
|
|
246
|
+
responsiveTabBar.className = "wm-responsive-tabs";
|
|
247
|
+
var responsiveActivePanel = null;
|
|
248
|
+
|
|
249
|
+
// ── Render top rows (header) ──
|
|
250
|
+
for (var tri = 0; tri < topRows.length; tri++) {
|
|
251
|
+
_wmRenderPanelEl(container, topRows[tri], surfaces, panelActives, wmNode);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// ── Render columns with dividers ──
|
|
255
|
+
var colRow = topRows.length > 0 ? 2 : 1;
|
|
256
|
+
for (var cii = 0; cii < visibleCols.length; cii++) {
|
|
257
|
+
// Insert divider before this column (except first)
|
|
258
|
+
if (cii > 0) {
|
|
259
|
+
var divider = document.createElement("div");
|
|
260
|
+
divider.className = "wm-divider";
|
|
261
|
+
divider.style.gridRow = String(colRow);
|
|
262
|
+
// Divider resize: between visibleCols[cii-1] and visibleCols[cii]
|
|
263
|
+
(function(div, leftPanel, rightPanel, containerEl) {
|
|
264
|
+
_wmEnableDividerResize(div, leftPanel, rightPanel, containerEl, wmNode);
|
|
265
|
+
})(divider, visibleCols[cii - 1], visibleCols[cii], container);
|
|
266
|
+
container.appendChild(divider);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
var colPanel = visibleCols[cii];
|
|
270
|
+
var panelEl = _wmRenderPanelEl(container, colPanel, surfaces, panelActives, wmNode);
|
|
271
|
+
panelEl.style.gridRow = String(colRow);
|
|
272
|
+
// Tag panels that have flexible size so divider resize preserves "1fr"
|
|
273
|
+
if (colPanel.defaultSize === "1fr" || !colPanel.defaultSize) {
|
|
274
|
+
panelEl.setAttribute("data-wm-flex", "true");
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Add to responsive tab bar
|
|
278
|
+
var rTab = document.createElement("div");
|
|
279
|
+
rTab.className = "wm-responsive-tab";
|
|
280
|
+
rTab.textContent = colPanel.id;
|
|
281
|
+
rTab.setAttribute("data-panel-id", colPanel.id);
|
|
282
|
+
if (!responsiveActivePanel) {
|
|
283
|
+
responsiveActivePanel = colPanel.id;
|
|
284
|
+
rTab.setAttribute("data-active", "true");
|
|
285
|
+
} else {
|
|
286
|
+
panelEl.setAttribute("data-wm-responsive-hidden", "true");
|
|
287
|
+
}
|
|
288
|
+
(function(tab, pid, panelElement, allTabs) {
|
|
289
|
+
tab.addEventListener("click", function() {
|
|
290
|
+
// Show this panel, hide others
|
|
291
|
+
var allPanels = container.querySelectorAll(".wm-panel");
|
|
292
|
+
var allRTabs = container.querySelectorAll(".wm-responsive-tab");
|
|
293
|
+
for (var ri = 0; ri < allPanels.length; ri++) {
|
|
294
|
+
var rp = allPanels[ri];
|
|
295
|
+
var rpPos = rp.getAttribute("data-wm-position");
|
|
296
|
+
if (_wmRowPositions[rpPos]) continue;
|
|
297
|
+
rp.setAttribute("data-wm-responsive-hidden", rp.getAttribute("data-wm-panel") !== pid ? "true" : "false");
|
|
298
|
+
}
|
|
299
|
+
for (var rti = 0; rti < allRTabs.length; rti++) {
|
|
300
|
+
allRTabs[rti].setAttribute("data-active", allRTabs[rti].getAttribute("data-panel-id") === pid ? "true" : "false");
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
})(rTab, colPanel.id, panelEl, responsiveTabBar);
|
|
304
|
+
responsiveTabBar.appendChild(rTab);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Insert responsive tab bar after top rows
|
|
308
|
+
if (visibleCols.length > 1) {
|
|
309
|
+
container.appendChild(responsiveTabBar);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// ── Render bottom rows (footer, statusbar, dock) ──
|
|
313
|
+
for (var bri = 0; bri < bottomRows.length; bri++) {
|
|
314
|
+
_wmRenderPanelEl(container, bottomRows[bri], surfaces, panelActives, wmNode);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// ── Floating overlay for surfaces with no panel assignment ──
|
|
318
|
+
var overlays = [];
|
|
319
|
+
for (var oi = 0; oi < surfaces.length; oi++) {
|
|
320
|
+
if (!surfaces[oi].panel && !surfaces[oi].docked) overlays.push(surfaces[oi]);
|
|
321
|
+
}
|
|
322
|
+
if (overlays.length > 0) {
|
|
323
|
+
var overlayEl = document.createElement("div");
|
|
324
|
+
overlayEl.className = "wm-overlay";
|
|
325
|
+
var cascadeOff = 30;
|
|
326
|
+
for (var oii = 0; oii < overlays.length; oii++) {
|
|
327
|
+
var oSurf = overlays[oii];
|
|
328
|
+
var oEl = _wmCreateSurfaceElFromNode(oSurf);
|
|
329
|
+
oEl.style.position = "absolute";
|
|
330
|
+
if (oSurf.position) {
|
|
331
|
+
oEl.style.left = oSurf.position.x + "px";
|
|
332
|
+
oEl.style.top = oSurf.position.y + "px";
|
|
333
|
+
} else {
|
|
334
|
+
oEl.style.left = (80 + cascadeOff * oii) + "px";
|
|
335
|
+
oEl.style.top = (80 + cascadeOff * oii) + "px";
|
|
336
|
+
}
|
|
337
|
+
if (oSurf.size) {
|
|
338
|
+
oEl.style.width = oSurf.size.width + "px";
|
|
339
|
+
oEl.style.height = oSurf.size.height + "px";
|
|
340
|
+
} else {
|
|
341
|
+
oEl.style.width = "400px";
|
|
342
|
+
oEl.style.height = "300px";
|
|
343
|
+
}
|
|
344
|
+
oEl.style.zIndex = String(oSurf.zIndex || (++_wmMaxZ));
|
|
345
|
+
_wmApplyDecoratorFromNode(oEl, oSurf, wmNode);
|
|
346
|
+
(function(sEl, sd, wn) {
|
|
347
|
+
sEl.addEventListener("pointerdown", function() {
|
|
348
|
+
_wmBringToFrontFromNode(sEl, sd, wn);
|
|
349
|
+
});
|
|
350
|
+
})(oEl, oSurf, wmNode);
|
|
351
|
+
overlayEl.appendChild(oEl);
|
|
352
|
+
}
|
|
353
|
+
container.appendChild(overlayEl);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// ── Render a single panel element with its surfaces/tabs ──
|
|
358
|
+
function _wmRenderPanelEl(container, panel, surfaces, panelActives, wmNode) {
|
|
359
|
+
var panelEl = document.createElement("div");
|
|
360
|
+
panelEl.className = "wm-panel";
|
|
361
|
+
panelEl.setAttribute("data-wm-panel", panel.id);
|
|
362
|
+
panelEl.setAttribute("data-wm-position", panel.position);
|
|
363
|
+
|
|
364
|
+
// Find surfaces assigned to this panel
|
|
365
|
+
var panelSurfaces = [];
|
|
366
|
+
for (var k = 0; k < surfaces.length; k++) {
|
|
367
|
+
if (surfaces[k].panel === panel.id) {
|
|
368
|
+
panelSurfaces.push(surfaces[k]);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
if (panelSurfaces.length === 0) {
|
|
373
|
+
var placeholder = document.createElement("div");
|
|
374
|
+
placeholder.className = "wm-empty";
|
|
375
|
+
placeholder.textContent = panel.id;
|
|
376
|
+
panelEl.appendChild(placeholder);
|
|
377
|
+
} else if (panelSurfaces.length === 1) {
|
|
378
|
+
var sEl = _wmCreateSurfaceElFromNode(panelSurfaces[0]);
|
|
379
|
+
sEl.style.position = "relative";
|
|
380
|
+
sEl.style.width = "100%";
|
|
381
|
+
sEl.style.height = "100%";
|
|
382
|
+
sEl.style.display = "block";
|
|
383
|
+
panelEl.appendChild(sEl);
|
|
384
|
+
} else {
|
|
385
|
+
// Multiple surfaces — tab bar
|
|
386
|
+
var panelActive = panelActives[panel.id] || panelSurfaces[0].name;
|
|
387
|
+
var tabBar = document.createElement("div");
|
|
388
|
+
tabBar.className = "wm-tabs";
|
|
389
|
+
|
|
390
|
+
for (var t = 0; t < panelSurfaces.length; t++) {
|
|
391
|
+
var tabSurf = panelSurfaces[t];
|
|
392
|
+
var tab = document.createElement("div");
|
|
393
|
+
tab.className = "wm-tab" + (tabSurf.name === panelActive ? " wm-tab-active" : "");
|
|
394
|
+
tab.setAttribute("data-surface-id", tabSurf.name);
|
|
395
|
+
|
|
396
|
+
var tabLabel = document.createElement("span");
|
|
397
|
+
tabLabel.className = "wm-tab-label";
|
|
398
|
+
tabLabel.textContent = _escapeHtml(tabSurf.title);
|
|
399
|
+
tab.appendChild(tabLabel);
|
|
400
|
+
|
|
401
|
+
// Tab close
|
|
402
|
+
var tabClose = document.createElement("button");
|
|
403
|
+
tabClose.className = "wm-tab-close";
|
|
404
|
+
tabClose.textContent = "\\u2715";
|
|
405
|
+
tabClose.title = "Close tab";
|
|
406
|
+
(function(sd) {
|
|
407
|
+
tabClose.addEventListener("click", function(e) {
|
|
408
|
+
e.stopPropagation();
|
|
409
|
+
_fireAupEvent(sd.id, "close", {});
|
|
410
|
+
});
|
|
411
|
+
})(tabSurf);
|
|
412
|
+
tab.appendChild(tabClose);
|
|
413
|
+
|
|
414
|
+
// Tab click to switch
|
|
415
|
+
(function(sd, pid) {
|
|
416
|
+
tab.addEventListener("click", function() {
|
|
417
|
+
_fireAupEvent(wmNode.id, "panel-active", { panel: pid, surface: sd.name });
|
|
418
|
+
});
|
|
419
|
+
})(tabSurf, panel.id);
|
|
420
|
+
|
|
421
|
+
tabBar.appendChild(tab);
|
|
422
|
+
}
|
|
423
|
+
panelEl.appendChild(tabBar);
|
|
424
|
+
|
|
425
|
+
// Render tab contents
|
|
426
|
+
for (var m = 0; m < panelSurfaces.length; m++) {
|
|
427
|
+
var surfEl = _wmCreateSurfaceElFromNode(panelSurfaces[m]);
|
|
428
|
+
surfEl.style.position = "relative";
|
|
429
|
+
surfEl.style.width = "100%";
|
|
430
|
+
surfEl.style.flex = "1";
|
|
431
|
+
surfEl.style.display = panelSurfaces[m].name === panelActive ? "block" : "none";
|
|
432
|
+
panelEl.appendChild(surfEl);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
container.appendChild(panelEl);
|
|
437
|
+
return panelEl;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// ── Divider Drag Resize (between two column panels) ──
|
|
441
|
+
// If the left panel is flex (1fr), resize the right panel instead.
|
|
442
|
+
function _wmEnableDividerResize(divider, leftPanel, rightPanel, containerEl, wmNode) {
|
|
443
|
+
var startX, targetStartW;
|
|
444
|
+
var dragging = false;
|
|
445
|
+
var targetEl = null;
|
|
446
|
+
var leftIsFlex = (leftPanel.defaultSize === "1fr" || !leftPanel.defaultSize);
|
|
447
|
+
var direction = leftIsFlex ? -1 : 1; // -1 means resize right panel (inverse drag)
|
|
448
|
+
|
|
449
|
+
function findPanelEl(panelId) {
|
|
450
|
+
return containerEl.querySelector('[data-wm-panel="' + panelId + '"]');
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
divider.addEventListener("pointerdown", function(e) {
|
|
454
|
+
dragging = true;
|
|
455
|
+
startX = e.clientX;
|
|
456
|
+
var targetPanel = leftIsFlex ? rightPanel : leftPanel;
|
|
457
|
+
targetEl = findPanelEl(targetPanel.id);
|
|
458
|
+
if (targetEl) targetStartW = targetEl.offsetWidth;
|
|
459
|
+
divider.setPointerCapture(e.pointerId);
|
|
460
|
+
divider.classList.add("wm-divider-active");
|
|
461
|
+
e.preventDefault();
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
divider.addEventListener("pointermove", function(e) {
|
|
465
|
+
if (!dragging || !targetEl) return;
|
|
466
|
+
var dx = e.clientX - startX;
|
|
467
|
+
var targetPanel = leftIsFlex ? rightPanel : leftPanel;
|
|
468
|
+
var minW = parseInt(targetPanel.minSize) || 80;
|
|
469
|
+
var newW = Math.max(minW, targetStartW + dx * direction);
|
|
470
|
+
targetEl.style.width = newW + "px";
|
|
471
|
+
targetEl.style.flex = "0 0 " + newW + "px";
|
|
472
|
+
_wmRecomputeGridCols(containerEl, wmNode);
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
divider.addEventListener("pointerup", function(e) {
|
|
476
|
+
if (!dragging) return;
|
|
477
|
+
dragging = false;
|
|
478
|
+
divider.classList.remove("wm-divider-active");
|
|
479
|
+
try { divider.releasePointerCapture(e.pointerId); } catch(_) {}
|
|
480
|
+
if (targetEl) {
|
|
481
|
+
var targetPanel = leftIsFlex ? rightPanel : leftPanel;
|
|
482
|
+
_fireAupEvent(wmNode.id, "panel-resize", { panelId: targetPanel.id, size: targetEl.offsetWidth + "px" });
|
|
483
|
+
}
|
|
484
|
+
});
|
|
485
|
+
|
|
486
|
+
divider.addEventListener("lostpointercapture", function() {
|
|
487
|
+
dragging = false;
|
|
488
|
+
divider.classList.remove("wm-divider-active");
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
// Recompute grid-template-columns from actual panel widths
|
|
493
|
+
// Panels tagged data-wm-flex="true" keep "1fr" so they absorb remaining space.
|
|
494
|
+
function _wmRecomputeGridCols(containerEl, wmNode) {
|
|
495
|
+
var cols = containerEl.querySelectorAll(".wm-panel:not([data-wm-position='header']):not([data-wm-position='footer']):not([data-wm-position='statusbar']):not([data-wm-position='dock'])");
|
|
496
|
+
var sizes = [];
|
|
497
|
+
for (var i = 0; i < cols.length; i++) {
|
|
498
|
+
if (i > 0) sizes.push("4px");
|
|
499
|
+
if (cols[i].getAttribute("data-wm-flex") === "true") {
|
|
500
|
+
sizes.push("1fr");
|
|
501
|
+
} else {
|
|
502
|
+
var w = cols[i].style.width;
|
|
503
|
+
if (w && w !== "") sizes.push(w);
|
|
504
|
+
else sizes.push(cols[i].offsetWidth + "px");
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
if (sizes.length > 0) containerEl.style.gridTemplateColumns = sizes.join(" ");
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
// ── Decorator (title bar + close + resize) ──
|
|
511
|
+
function _wmApplyDecoratorFromNode(el, surfData, wmNode) {
|
|
512
|
+
var titleBar = document.createElement("div");
|
|
513
|
+
titleBar.className = "wm-titlebar";
|
|
514
|
+
|
|
515
|
+
var titleText = document.createElement("span");
|
|
516
|
+
titleText.className = "wm-title-text";
|
|
517
|
+
titleText.textContent = _escapeHtml(surfData.title);
|
|
518
|
+
titleBar.appendChild(titleText);
|
|
519
|
+
|
|
520
|
+
var closeBtn = document.createElement("button");
|
|
521
|
+
closeBtn.className = "wm-close-btn";
|
|
522
|
+
closeBtn.textContent = "\\u2715";
|
|
523
|
+
closeBtn.title = "Close";
|
|
524
|
+
closeBtn.addEventListener("click", function(e) {
|
|
525
|
+
e.stopPropagation();
|
|
526
|
+
_fireAupEvent(surfData.id, "close", {});
|
|
527
|
+
});
|
|
528
|
+
titleBar.appendChild(closeBtn);
|
|
529
|
+
|
|
530
|
+
el.insertBefore(titleBar, el.firstChild);
|
|
531
|
+
|
|
532
|
+
// Drag via title bar
|
|
533
|
+
_wmEnableDragFromNode(el, titleBar, surfData);
|
|
534
|
+
|
|
535
|
+
// Resize handle
|
|
536
|
+
var resizeHandle = document.createElement("div");
|
|
537
|
+
resizeHandle.className = "wm-resize-handle";
|
|
538
|
+
el.appendChild(resizeHandle);
|
|
539
|
+
_wmEnableResizeFromNode(el, resizeHandle, surfData);
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
// ── Drag ──
|
|
543
|
+
function _wmEnableDragFromNode(el, handle, surfData) {
|
|
544
|
+
var startX, startY, origLeft, origTop;
|
|
545
|
+
var dragging = false;
|
|
546
|
+
|
|
547
|
+
function onPointerDown(e) {
|
|
548
|
+
if (e.target.tagName === "BUTTON") return;
|
|
549
|
+
dragging = true;
|
|
550
|
+
startX = e.clientX;
|
|
551
|
+
startY = e.clientY;
|
|
552
|
+
origLeft = parseInt(el.style.left) || 0;
|
|
553
|
+
origTop = parseInt(el.style.top) || 0;
|
|
554
|
+
handle.setPointerCapture(e.pointerId);
|
|
555
|
+
e.preventDefault();
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
function onPointerMove(e) {
|
|
559
|
+
if (!dragging) return;
|
|
560
|
+
var dx = e.clientX - startX;
|
|
561
|
+
var dy = e.clientY - startY;
|
|
562
|
+
var container = el.parentNode;
|
|
563
|
+
var newX = Math.max(0, Math.min(origLeft + dx, container.clientWidth - 40));
|
|
564
|
+
var newY = Math.max(0, Math.min(origTop + dy, container.clientHeight - 40));
|
|
565
|
+
el.style.left = newX + "px";
|
|
566
|
+
el.style.top = newY + "px";
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
function onPointerUp(e) {
|
|
570
|
+
if (!dragging) return;
|
|
571
|
+
dragging = false;
|
|
572
|
+
try { handle.releasePointerCapture(e.pointerId); } catch(_) {}
|
|
573
|
+
// Sync final position back via AUP event
|
|
574
|
+
var finalX = parseInt(el.style.left) || 0;
|
|
575
|
+
var finalY = parseInt(el.style.top) || 0;
|
|
576
|
+
_fireAupEvent(surfData.id, "move", { position: { x: finalX, y: finalY } });
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
handle.addEventListener("pointerdown", onPointerDown);
|
|
580
|
+
handle.addEventListener("pointermove", onPointerMove);
|
|
581
|
+
handle.addEventListener("pointerup", onPointerUp);
|
|
582
|
+
handle.addEventListener("lostpointercapture", function() { dragging = false; });
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
// ── Resize ──
|
|
586
|
+
function _wmEnableResizeFromNode(el, handle, surfData) {
|
|
587
|
+
var startX, startY, origW, origH;
|
|
588
|
+
var resizing = false;
|
|
589
|
+
var MIN_W = 120, MIN_H = 80;
|
|
590
|
+
|
|
591
|
+
function onPointerDown(e) {
|
|
592
|
+
resizing = true;
|
|
593
|
+
startX = e.clientX;
|
|
594
|
+
startY = e.clientY;
|
|
595
|
+
origW = el.offsetWidth;
|
|
596
|
+
origH = el.offsetHeight;
|
|
597
|
+
handle.setPointerCapture(e.pointerId);
|
|
598
|
+
e.preventDefault();
|
|
599
|
+
e.stopPropagation();
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
function onPointerMove(e) {
|
|
603
|
+
if (!resizing) return;
|
|
604
|
+
var dx = e.clientX - startX;
|
|
605
|
+
var dy = e.clientY - startY;
|
|
606
|
+
var w = Math.max(MIN_W, origW + dx);
|
|
607
|
+
var h = Math.max(MIN_H, origH + dy);
|
|
608
|
+
el.style.width = w + "px";
|
|
609
|
+
el.style.height = h + "px";
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
function onPointerUp(e) {
|
|
613
|
+
if (!resizing) return;
|
|
614
|
+
resizing = false;
|
|
615
|
+
try { handle.releasePointerCapture(e.pointerId); } catch(_) {}
|
|
616
|
+
// Sync final size back via AUP event
|
|
617
|
+
var finalW = el.offsetWidth;
|
|
618
|
+
var finalH = el.offsetHeight;
|
|
619
|
+
_fireAupEvent(surfData.id, "resize", { size: { width: finalW, height: finalH } });
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
handle.addEventListener("pointerdown", onPointerDown);
|
|
623
|
+
handle.addEventListener("pointermove", onPointerMove);
|
|
624
|
+
handle.addEventListener("pointerup", onPointerUp);
|
|
625
|
+
handle.addEventListener("lostpointercapture", function() { resizing = false; });
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
// ── Surface Element Factory ──
|
|
629
|
+
function _wmCreateSurfaceElFromNode(surfData) {
|
|
630
|
+
var el = document.createElement("div");
|
|
631
|
+
el.className = "wm-surface";
|
|
632
|
+
el.setAttribute("data-surface-id", surfData.name);
|
|
633
|
+
el.setAttribute("data-aup-id", surfData.id);
|
|
634
|
+
|
|
635
|
+
var content = document.createElement("div");
|
|
636
|
+
content.className = "wm-surface-content";
|
|
637
|
+
el.appendChild(content);
|
|
638
|
+
|
|
639
|
+
// Universal surface: 3 modes
|
|
640
|
+
// 1. Inline AUP children → render directly (no device)
|
|
641
|
+
var children = surfData.node.children || [];
|
|
642
|
+
if (children.length > 0) {
|
|
643
|
+
for (var ci = 0; ci < children.length; ci++) {
|
|
644
|
+
var rendered = renderAupNode(children[ci]);
|
|
645
|
+
if (rendered) content.appendChild(rendered);
|
|
646
|
+
}
|
|
647
|
+
return el;
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
// 2. src = ws:// or http:// URL → device connects to remote AUP server
|
|
651
|
+
// 3. src = /afs/path → device introspects via window.afs
|
|
652
|
+
if (surfData.src && typeof renderAupDevice === "function") {
|
|
653
|
+
var deviceNode = {
|
|
654
|
+
id: "wm-device-" + surfData.name,
|
|
655
|
+
type: "device",
|
|
656
|
+
src: surfData.src,
|
|
657
|
+
props: { sizing: "fit", showStatus: false }
|
|
658
|
+
};
|
|
659
|
+
var deviceEl = renderAupDevice(deviceNode);
|
|
660
|
+
if (deviceEl) content.appendChild(deviceEl);
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
return el;
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
`;
|
|
667
|
+
|
|
668
|
+
//#endregion
|
|
669
|
+
exports.WM_JS = WM_JS;
|