@energy8platform/game-engine 0.33.2 → 0.33.4

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.
@@ -0,0 +1,372 @@
1
+ // Pure helpers behind the scene inspector — kept renderer/DOM-free so the control
2
+ // inference and layout-field enumeration are unit-testable and reusable (the same
3
+ // mapping later feeds schema-driven autogen and the agent's docs).
4
+ /** Infer an editor control for a props value (schema-less fallback). */
5
+ function propControlKind(value) {
6
+ switch (typeof value) {
7
+ case 'number':
8
+ return 'number';
9
+ case 'boolean':
10
+ return 'boolean';
11
+ case 'string':
12
+ return /^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(value) ? 'color' : 'text';
13
+ default:
14
+ return 'json';
15
+ }
16
+ }
17
+ const FRACTION_KEYS = /frac|anchor|scale|sag|left$|top$|width$|height$/i;
18
+ function numberStep(path, value) {
19
+ if (/rotation/i.test(path))
20
+ return 0.01;
21
+ if (FRACTION_KEYS.test(path) && Math.abs(value) <= 4)
22
+ return 0.01;
23
+ return 1;
24
+ }
25
+ /** Flatten a layout rule into editable field specs (mode itself is structural → readonly). */
26
+ function layoutFieldSpecs(rule) {
27
+ const out = [];
28
+ const visit = (value, path, label) => {
29
+ if (typeof value === 'number') {
30
+ out.push({ path, label, kind: 'number', value, step: numberStep(path, value) });
31
+ }
32
+ else if (typeof value === 'string') {
33
+ out.push(path === 'mode' ? { path, label, kind: 'readonly', value } : { path, label, kind: 'text', value });
34
+ }
35
+ else if (typeof value === 'boolean') {
36
+ out.push({ path, label, kind: 'text', value: String(value) });
37
+ }
38
+ else if (Array.isArray(value)) {
39
+ value.forEach((item, i) => visit(item, `${path}.${i}`, `${label}[${i}]`));
40
+ }
41
+ else if (value && typeof value === 'object') {
42
+ for (const [k, v] of Object.entries(value))
43
+ visit(v, `${path}.${k}`, `${label}.${k}`);
44
+ }
45
+ };
46
+ for (const [key, value] of Object.entries(rule))
47
+ visit(value, key, key);
48
+ return out;
49
+ }
50
+ /** Immutable set of a dot-path inside a (JSON-ish) rule object. */
51
+ function setRulePath(rule, path, value) {
52
+ const clone = JSON.parse(JSON.stringify(rule));
53
+ const parts = path.split('.');
54
+ let cursor = clone;
55
+ for (let i = 0; i < parts.length - 1; i++) {
56
+ const key = parts[i];
57
+ const next = Array.isArray(cursor) ? cursor[Number(key)] : cursor[key];
58
+ if (typeof next !== 'object' || next === null) {
59
+ const fresh = {};
60
+ if (Array.isArray(cursor))
61
+ cursor[Number(key)] = fresh;
62
+ else
63
+ cursor[key] = fresh;
64
+ cursor = fresh;
65
+ }
66
+ else {
67
+ cursor = next;
68
+ }
69
+ }
70
+ const last = parts[parts.length - 1];
71
+ if (Array.isArray(cursor))
72
+ cursor[Number(last)] = value;
73
+ else
74
+ cursor[last] = value;
75
+ return clone;
76
+ }
77
+
78
+ // Scene outliner + inspector — the human lens over the same SceneHandle surface the
79
+ // agent drives (tree/patch/setState). Framework-free DOM, dev-only: hosts (scene-lab,
80
+ // a game's preview page, later a harness panel) mount it into any container element.
81
+ // Every edit leaves through a ScenePatch, so a mouse edit and an agent edit are the
82
+ // same operation on the same doc.
83
+ const STYLE = `
84
+ .e8si { font: 12px/1.45 system-ui, sans-serif; color: #dfe6f5; display: flex; flex-direction: column; height: 100%; min-height: 0; }
85
+ .e8si h3 { margin: 0; padding: 8px 10px 6px; font-size: 11px; letter-spacing: 1px; text-transform: uppercase; color: #7d8ab0; }
86
+ .e8si-tree { overflow: auto; max-height: 42%; border-bottom: 1px solid #1c2540; padding-bottom: 6px; }
87
+ .e8si-row { display: flex; gap: 6px; align-items: baseline; padding: 2px 10px; cursor: pointer; white-space: nowrap; }
88
+ .e8si-row:hover { background: #141c36; }
89
+ .e8si-row.sel { background: #1d2b55; }
90
+ .e8si-row .t { color: #7d8ab0; }
91
+ .e8si-row .dim { opacity: 0.45; }
92
+ .e8si-insp { overflow: auto; flex: 1; padding: 4px 0 12px; }
93
+ .e8si-head { padding: 6px 10px; }
94
+ .e8si-head .id { font-weight: 700; font-size: 13px; }
95
+ .e8si-head .meta { color: #7d8ab0; }
96
+ .e8si-sec { margin-top: 6px; }
97
+ .e8si-field { display: flex; align-items: center; gap: 6px; padding: 2px 10px; }
98
+ .e8si-field label { flex: 0 0 96px; color: #9fb0d8; overflow: hidden; text-overflow: ellipsis; }
99
+ .e8si-field input[type=number], .e8si-field input[type=text], .e8si-field select, .e8si-field textarea {
100
+ flex: 1; min-width: 0; background: #0d1428; color: #dfe6f5; border: 1px solid #2b3866; border-radius: 6px; padding: 3px 6px; font: inherit; }
101
+ .e8si-field input[type=color] { width: 34px; height: 24px; padding: 0; border: 1px solid #2b3866; border-radius: 6px; background: none; }
102
+ .e8si-field .ro { color: #8fa0c9; }
103
+ .e8si-json { display: block; width: calc(100% - 20px); margin: 2px 10px; min-height: 52px; font: 11px/1.4 ui-monospace, monospace; }
104
+ .e8si-apply { margin: 4px 10px; padding: 3px 10px; background: #18213d; color: #dfe6f5; border: 1px solid #2b3866; border-radius: 6px; cursor: pointer; }
105
+ .e8si-empty { padding: 10px; color: #7d8ab0; }
106
+ .e8si-badge { display: inline-block; padding: 0 6px; border: 1px solid #2b3866; border-radius: 8px; color: #9fb0d8; font-size: 10px; }
107
+ `;
108
+ function createSceneInspector(opts) {
109
+ const { handle, container } = opts;
110
+ const applyPatch = opts.applyPatch ?? handle.patch;
111
+ const getOrientation = opts.getOrientation ?? (() => 'landscape');
112
+ const root = document.createElement('div');
113
+ root.className = 'e8si';
114
+ const style = document.createElement('style');
115
+ style.textContent = STYLE;
116
+ root.appendChild(style);
117
+ const treeHost = document.createElement('div');
118
+ treeHost.className = 'e8si-tree';
119
+ const inspHost = document.createElement('div');
120
+ inspHost.className = 'e8si-insp';
121
+ root.append(treeHost, inspHost);
122
+ container.appendChild(root);
123
+ let selectedId = null;
124
+ // Edits from our own inputs schedule a refresh that must not rebuild the form under
125
+ // the user's cursor — only the outliner refreshes then.
126
+ let ownEdit = false;
127
+ const findNode = (id) => {
128
+ const walk = (n) => n.id === id ? n : n.children.map(walk).find(Boolean);
129
+ return walk(handle.tree());
130
+ };
131
+ const docNode = (id) => {
132
+ const walk = (n) => {
133
+ if (n.id === id)
134
+ return n;
135
+ for (const child of n.children ?? []) {
136
+ const hit = walk(child);
137
+ if (hit)
138
+ return hit;
139
+ }
140
+ return undefined;
141
+ };
142
+ return walk(handle.doc().root);
143
+ };
144
+ const patchAndRefresh = (patch) => {
145
+ ownEdit = true;
146
+ applyPatch(patch);
147
+ ownEdit = false;
148
+ renderTree();
149
+ };
150
+ // ── Outliner ────────────────────────────────────────────────────────────────
151
+ const renderTree = () => {
152
+ treeHost.textContent = '';
153
+ const title = document.createElement('h3');
154
+ title.textContent = 'Scene';
155
+ treeHost.appendChild(title);
156
+ const renderRow = (node, depth) => {
157
+ const row = document.createElement('div');
158
+ row.className = `e8si-row${node.id === selectedId ? ' sel' : ''}${node.visible ? '' : ' dim'}`;
159
+ row.style.paddingLeft = `${10 + depth * 12}px`;
160
+ const id = document.createElement('span');
161
+ id.textContent = node.id;
162
+ const type = document.createElement('span');
163
+ type.className = 't';
164
+ type.textContent = node.name ? `${node.type} · ${node.name}` : node.type;
165
+ row.append(id, type);
166
+ if (node.state) {
167
+ const badge = document.createElement('span');
168
+ badge.className = 'e8si-badge';
169
+ badge.textContent = node.state;
170
+ row.appendChild(badge);
171
+ }
172
+ row.addEventListener('click', () => {
173
+ select(node.id);
174
+ opts.onSelect?.(node.id);
175
+ });
176
+ treeHost.appendChild(row);
177
+ node.children.forEach((child) => renderRow(child, depth + 1));
178
+ };
179
+ renderRow(handle.tree(), 0);
180
+ };
181
+ // ── Inspector form ─────────────────────────────────────────────────────────
182
+ const field = (labelText) => {
183
+ const wrap = document.createElement('div');
184
+ wrap.className = 'e8si-field';
185
+ const label = document.createElement('label');
186
+ label.textContent = labelText;
187
+ label.title = labelText;
188
+ wrap.appendChild(label);
189
+ return wrap;
190
+ };
191
+ const renderInspector = () => {
192
+ inspHost.textContent = '';
193
+ if (!selectedId) {
194
+ const empty = document.createElement('div');
195
+ empty.className = 'e8si-empty';
196
+ empty.textContent = 'Select a node (canvas or tree) to edit its layout & props.';
197
+ inspHost.appendChild(empty);
198
+ return;
199
+ }
200
+ const id = selectedId;
201
+ const node = docNode(id);
202
+ const outline = findNode(id);
203
+ if (!node || !outline)
204
+ return;
205
+ const head = document.createElement('div');
206
+ head.className = 'e8si-head';
207
+ head.innerHTML = '';
208
+ const idEl = document.createElement('div');
209
+ idEl.className = 'id';
210
+ idEl.textContent = `#${node.id}`;
211
+ const meta = document.createElement('div');
212
+ meta.className = 'meta';
213
+ meta.textContent = `${node.type}${node.name ? ` · ${node.name}` : ''}${node.anchorName ? ` · @${node.anchorName}` : ''}${node.visibleWhen ? ` · when: ${node.visibleWhen}` : ''}`;
214
+ head.append(idEl, meta);
215
+ inspHost.appendChild(head);
216
+ // State selector (named prop variants).
217
+ const stateNames = Object.keys(node.states ?? {});
218
+ if (stateNames.length > 0) {
219
+ const wrap = field('state');
220
+ const select = document.createElement('select');
221
+ for (const name of ['—', ...stateNames]) {
222
+ const option = document.createElement('option');
223
+ option.value = name;
224
+ option.textContent = name;
225
+ select.appendChild(option);
226
+ }
227
+ select.value = outline.state ?? '—';
228
+ select.addEventListener('change', () => {
229
+ patchAndRefresh({ op: 'set-state', id, state: select.value === '—' ? null : select.value });
230
+ });
231
+ wrap.appendChild(select);
232
+ inspHost.appendChild(wrap);
233
+ }
234
+ // Layout — the EFFECTIVE rule for the current orientation, edited in place.
235
+ const orientation = getOrientation();
236
+ const override = node.responsive?.[orientation]?.layout;
237
+ const rule = override ?? node.layout;
238
+ const layoutTitle = document.createElement('h3');
239
+ layoutTitle.textContent = `Layout (${orientation}${override ? ' override' : ''})`;
240
+ layoutTitle.className = 'e8si-sec';
241
+ inspHost.appendChild(layoutTitle);
242
+ if (!rule) {
243
+ const none = document.createElement('div');
244
+ none.className = 'e8si-empty';
245
+ none.textContent = '(no rule — parent-relative identity)';
246
+ inspHost.appendChild(none);
247
+ }
248
+ else {
249
+ for (const spec of layoutFieldSpecs(rule)) {
250
+ const wrap = field(spec.label);
251
+ if (spec.kind === 'readonly') {
252
+ const span = document.createElement('span');
253
+ span.className = 'ro';
254
+ span.textContent = String(spec.value);
255
+ wrap.appendChild(span);
256
+ }
257
+ else {
258
+ const input = document.createElement('input');
259
+ input.type = spec.kind === 'number' ? 'number' : 'text';
260
+ if (spec.step !== undefined)
261
+ input.step = String(spec.step);
262
+ input.value = String(spec.value);
263
+ input.addEventListener('change', () => {
264
+ const raw = spec.kind === 'number' ? Number(input.value) : input.value;
265
+ if (spec.kind === 'number' && !Number.isFinite(raw))
266
+ return;
267
+ patchAndRefresh({
268
+ op: 'set-layout',
269
+ id,
270
+ layout: setRulePath(rule, spec.path, raw),
271
+ orientation: override ? orientation : undefined,
272
+ });
273
+ });
274
+ wrap.appendChild(input);
275
+ }
276
+ inspHost.appendChild(wrap);
277
+ }
278
+ }
279
+ // Props — base props, schema-less control inference.
280
+ const props = node.props ?? {};
281
+ const propKeys = Object.keys(props);
282
+ if (propKeys.length > 0) {
283
+ const propsTitle = document.createElement('h3');
284
+ propsTitle.textContent = 'Props';
285
+ propsTitle.className = 'e8si-sec';
286
+ inspHost.appendChild(propsTitle);
287
+ for (const key of propKeys) {
288
+ const value = props[key];
289
+ const kind = propControlKind(value);
290
+ if (kind === 'json') {
291
+ const wrap = field(key);
292
+ inspHost.appendChild(wrap);
293
+ const area = document.createElement('textarea');
294
+ area.className = 'e8si-json';
295
+ area.value = JSON.stringify(value, null, 1);
296
+ const apply = document.createElement('button');
297
+ apply.className = 'e8si-apply';
298
+ apply.textContent = `apply ${key}`;
299
+ apply.addEventListener('click', () => {
300
+ try {
301
+ patchAndRefresh({ op: 'set-props', id, props: { [key]: JSON.parse(area.value) } });
302
+ }
303
+ catch {
304
+ apply.textContent = `apply ${key} — invalid JSON`;
305
+ }
306
+ });
307
+ inspHost.append(area, apply);
308
+ continue;
309
+ }
310
+ const wrap = field(key);
311
+ if (kind === 'boolean') {
312
+ const input = document.createElement('input');
313
+ input.type = 'checkbox';
314
+ input.checked = value === true;
315
+ input.addEventListener('change', () => patchAndRefresh({ op: 'set-props', id, props: { [key]: input.checked } }));
316
+ wrap.appendChild(input);
317
+ }
318
+ else if (kind === 'color') {
319
+ const color = document.createElement('input');
320
+ color.type = 'color';
321
+ color.value = String(value).slice(0, 7);
322
+ const text = document.createElement('input');
323
+ text.type = 'text';
324
+ text.value = String(value);
325
+ const push = (v) => patchAndRefresh({ op: 'set-props', id, props: { [key]: v } });
326
+ color.addEventListener('input', () => {
327
+ text.value = color.value;
328
+ push(color.value);
329
+ });
330
+ text.addEventListener('change', () => push(text.value));
331
+ wrap.append(color, text);
332
+ }
333
+ else {
334
+ const input = document.createElement('input');
335
+ input.type = kind === 'number' ? 'number' : 'text';
336
+ input.value = String(value);
337
+ input.addEventListener('change', () => {
338
+ const raw = kind === 'number' ? Number(input.value) : input.value;
339
+ if (kind === 'number' && !Number.isFinite(raw))
340
+ return;
341
+ patchAndRefresh({ op: 'set-props', id, props: { [key]: raw } });
342
+ });
343
+ wrap.appendChild(input);
344
+ }
345
+ inspHost.appendChild(wrap);
346
+ }
347
+ }
348
+ };
349
+ const select = (id) => {
350
+ selectedId = id;
351
+ renderTree();
352
+ renderInspector();
353
+ };
354
+ renderTree();
355
+ renderInspector();
356
+ return {
357
+ select,
358
+ selected: () => selectedId,
359
+ refresh() {
360
+ renderTree();
361
+ // Keep the form stable while the user is typing into it after their own edit.
362
+ if (!ownEdit && !inspHost.contains(document.activeElement))
363
+ renderInspector();
364
+ },
365
+ destroy() {
366
+ root.remove();
367
+ },
368
+ };
369
+ }
370
+
371
+ export { createSceneInspector, layoutFieldSpecs, propControlKind, setRulePath };
372
+ //# sourceMappingURL=scene-devtools.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-devtools.esm.js","sources":["../src/scene/devtools/helpers.ts","../src/scene/devtools/inspector.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}