@vibecook/ice 0.1.0

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 (148) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +76 -0
  3. package/dist/chunk-5S7GSXJG.js +6003 -0
  4. package/dist/chunk-5S7GSXJG.js.map +1 -0
  5. package/dist/chunk-BCJ47SX7.js +550 -0
  6. package/dist/chunk-BCJ47SX7.js.map +1 -0
  7. package/dist/chunk-FIAXPNNY.js +1446 -0
  8. package/dist/chunk-FIAXPNNY.js.map +1 -0
  9. package/dist/devtools.js +417 -0
  10. package/dist/devtools.js.map +1 -0
  11. package/dist/dom.js +41 -0
  12. package/dist/dom.js.map +1 -0
  13. package/dist/index.js +450 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/kernel.js +63 -0
  16. package/dist/kernel.js.map +1 -0
  17. package/dist/r3f.js +1101 -0
  18. package/dist/r3f.js.map +1 -0
  19. package/dist/react.js +440 -0
  20. package/dist/react.js.map +1 -0
  21. package/dist/types/packages/core/src/boot/hmr.d.ts +12 -0
  22. package/dist/types/packages/core/src/catalog/camera-derived.d.ts +144 -0
  23. package/dist/types/packages/core/src/catalog/gesture.d.ts +254 -0
  24. package/dist/types/packages/core/src/catalog/graph.d.ts +55 -0
  25. package/dist/types/packages/core/src/catalog/index.d.ts +32 -0
  26. package/dist/types/packages/core/src/catalog/pointer.d.ts +111 -0
  27. package/dist/types/packages/core/src/catalog/scene.d.ts +34 -0
  28. package/dist/types/packages/core/src/catalog/selection-presence.d.ts +53 -0
  29. package/dist/types/packages/core/src/catalog/settings-resources.d.ts +46 -0
  30. package/dist/types/packages/core/src/doc/autosave.d.ts +69 -0
  31. package/dist/types/packages/core/src/doc/bootstrap.d.ts +74 -0
  32. package/dist/types/packages/core/src/doc/broadcast-relay.d.ts +52 -0
  33. package/dist/types/packages/core/src/doc/channels.d.ts +49 -0
  34. package/dist/types/packages/core/src/doc/doc-commit-sink.d.ts +22 -0
  35. package/dist/types/packages/core/src/doc/doc-kit.d.ts +50 -0
  36. package/dist/types/packages/core/src/doc/envelope.d.ts +36 -0
  37. package/dist/types/packages/core/src/doc/migrate.d.ts +69 -0
  38. package/dist/types/packages/core/src/doc/version-gate.d.ts +49 -0
  39. package/dist/types/packages/core/src/engine/commit-sink.d.ts +61 -0
  40. package/dist/types/packages/core/src/engine/engine.d.ts +62 -0
  41. package/dist/types/packages/core/src/engine/frame-info.d.ts +16 -0
  42. package/dist/types/packages/core/src/engine/instantiate.d.ts +45 -0
  43. package/dist/types/packages/core/src/engine/pipeline.d.ts +17 -0
  44. package/dist/types/packages/core/src/engine/reflectors.d.ts +56 -0
  45. package/dist/types/packages/core/src/facade/create-canvas-engine.d.ts +120 -0
  46. package/dist/types/packages/core/src/guards/dev.d.ts +2 -0
  47. package/dist/types/packages/core/src/guards/guarded-tx.d.ts +51 -0
  48. package/dist/types/packages/core/src/guards/live-writer.d.ts +33 -0
  49. package/dist/types/packages/core/src/guards/resource-writer.d.ts +17 -0
  50. package/dist/types/packages/core/src/helpers/phase-set.d.ts +70 -0
  51. package/dist/types/packages/core/src/helpers/version-stamps.d.ts +55 -0
  52. package/dist/types/packages/core/src/index.d.ts +63 -0
  53. package/dist/types/packages/core/src/input/measure-queue.d.ts +30 -0
  54. package/dist/types/packages/core/src/input/queue.d.ts +60 -0
  55. package/dist/types/packages/core/src/interaction/install.d.ts +58 -0
  56. package/dist/types/packages/core/src/nav/nested-canvas.d.ts +62 -0
  57. package/dist/types/packages/core/src/ops/cascade.d.ts +18 -0
  58. package/dist/types/packages/core/src/ops/claims.d.ts +15 -0
  59. package/dist/types/packages/core/src/ops/gestures.d.ts +10 -0
  60. package/dist/types/packages/core/src/ops/point-pick.d.ts +42 -0
  61. package/dist/types/packages/core/src/ops/port-geometry.d.ts +17 -0
  62. package/dist/types/packages/core/src/ops/selection.d.ts +14 -0
  63. package/dist/types/packages/core/src/presence/index.d.ts +7 -0
  64. package/dist/types/packages/core/src/presence/presence-kit.d.ts +39 -0
  65. package/dist/types/packages/core/src/presence/publish.d.ts +14 -0
  66. package/dist/types/packages/core/src/presence/remote-cursors.d.ts +18 -0
  67. package/dist/types/packages/core/src/schema/meta.d.ts +43 -0
  68. package/dist/types/packages/core/src/schema/prefab.d.ts +69 -0
  69. package/dist/types/packages/core/src/settings/defaults.d.ts +56 -0
  70. package/dist/types/packages/core/src/systems/camera-sim.d.ts +19 -0
  71. package/dist/types/packages/core/src/systems/chrome.d.ts +48 -0
  72. package/dist/types/packages/core/src/systems/cleanup.d.ts +19 -0
  73. package/dist/types/packages/core/src/systems/l0-input.d.ts +31 -0
  74. package/dist/types/packages/core/src/systems/l1-pick.d.ts +44 -0
  75. package/dist/types/packages/core/src/systems/l1-wires.d.ts +30 -0
  76. package/dist/types/packages/core/src/systems/l2-arbitrate.d.ts +40 -0
  77. package/dist/types/packages/core/src/systems/l2-recognize.d.ts +45 -0
  78. package/dist/types/packages/core/src/systems/l3-behave.d.ts +24 -0
  79. package/dist/types/packages/core/src/systems/l3-claim.d.ts +26 -0
  80. package/dist/types/packages/core/src/systems/l3-connect.d.ts +57 -0
  81. package/dist/types/packages/core/src/systems/l3-draw.d.ts +21 -0
  82. package/dist/types/packages/core/src/systems/l3-drop.d.ts +21 -0
  83. package/dist/types/packages/core/src/systems/l3-marquee.d.ts +35 -0
  84. package/dist/types/packages/core/src/systems/l3-ports.d.ts +30 -0
  85. package/dist/types/packages/core/src/systems/l3-resize.d.ts +17 -0
  86. package/dist/types/packages/core/src/systems/l3-snap.d.ts +19 -0
  87. package/dist/types/packages/core/src/systems/l4-cursor.d.ts +24 -0
  88. package/dist/types/packages/core/src/systems/measure-ingest.d.ts +26 -0
  89. package/dist/types/packages/core/src/tools/define-tool.d.ts +79 -0
  90. package/dist/types/packages/core/src/widget/define-widget.d.ts +124 -0
  91. package/dist/types/packages/core/src/widget/equip.d.ts +14 -0
  92. package/dist/types/packages/core/src/widget/mount-store.d.ts +47 -0
  93. package/dist/types/packages/core/src/widget/props.d.ts +98 -0
  94. package/dist/types/packages/core/src/widget/spawn.d.ts +30 -0
  95. package/dist/types/packages/devtools/src/index.d.ts +8 -0
  96. package/dist/types/packages/devtools/src/panel.d.ts +48 -0
  97. package/dist/types/packages/dom/src/host.d.ts +24 -0
  98. package/dist/types/packages/dom/src/index.d.ts +19 -0
  99. package/dist/types/packages/dom/src/loop.d.ts +11 -0
  100. package/dist/types/packages/dom/src/measure-adapter.d.ts +31 -0
  101. package/dist/types/packages/dom/src/measure-wiring.d.ts +49 -0
  102. package/dist/types/packages/dom/src/planes.d.ts +33 -0
  103. package/dist/types/packages/dom/src/pointer-adapter.d.ts +48 -0
  104. package/dist/types/packages/dom/src/reflectors/chrome.d.ts +33 -0
  105. package/dist/types/packages/dom/src/reflectors/cursor.d.ts +21 -0
  106. package/dist/types/packages/dom/src/reflectors/dom-widgets.d.ts +54 -0
  107. package/dist/types/packages/dom/src/reflectors/graybox.d.ts +31 -0
  108. package/dist/types/packages/dom/src/reflectors/grid.d.ts +63 -0
  109. package/dist/types/packages/dom/src/reflectors/plane-transform.d.ts +38 -0
  110. package/dist/types/packages/dom/src/reflectors/remote-cursors.d.ts +20 -0
  111. package/dist/types/packages/dom/src/reflectors/wires.d.ts +88 -0
  112. package/dist/types/packages/ice/src/devtools.d.ts +1 -0
  113. package/dist/types/packages/ice/src/dom.d.ts +1 -0
  114. package/dist/types/packages/ice/src/index.d.ts +1 -0
  115. package/dist/types/packages/ice/src/kernel.d.ts +1 -0
  116. package/dist/types/packages/ice/src/r3f.d.ts +1 -0
  117. package/dist/types/packages/ice/src/react.d.ts +1 -0
  118. package/dist/types/packages/kernel/src/anchors.d.ts +18 -0
  119. package/dist/types/packages/kernel/src/bezier.d.ts +38 -0
  120. package/dist/types/packages/kernel/src/coords.d.ts +67 -0
  121. package/dist/types/packages/kernel/src/eviction.d.ts +23 -0
  122. package/dist/types/packages/kernel/src/index.d.ts +13 -0
  123. package/dist/types/packages/kernel/src/shapes.d.ts +22 -0
  124. package/dist/types/packages/kernel/src/snap.d.ts +44 -0
  125. package/dist/types/packages/kernel/src/spatial-index.d.ts +16 -0
  126. package/dist/types/packages/kernel/src/zoom-bands.d.ts +19 -0
  127. package/dist/types/packages/r3f/src/bridge.d.ts +68 -0
  128. package/dist/types/packages/r3f/src/composite-material.d.ts +17 -0
  129. package/dist/types/packages/r3f/src/compositor-pass.d.ts +83 -0
  130. package/dist/types/packages/r3f/src/dev-write-trap.d.ts +30 -0
  131. package/dist/types/packages/r3f/src/gl-root.d.ts +21 -0
  132. package/dist/types/packages/r3f/src/gl-router.d.ts +60 -0
  133. package/dist/types/packages/r3f/src/index.d.ts +16 -0
  134. package/dist/types/packages/r3f/src/island-state.d.ts +68 -0
  135. package/dist/types/packages/r3f/src/island.d.ts +13 -0
  136. package/dist/types/packages/r3f/src/pool.d.ts +56 -0
  137. package/dist/types/packages/r3f/src/resource-registry.d.ts +30 -0
  138. package/dist/types/packages/r3f/src/use-island-frame.d.ts +24 -0
  139. package/dist/types/packages/react/src/engine-context.d.ts +31 -0
  140. package/dist/types/packages/react/src/hooks.d.ts +40 -0
  141. package/dist/types/packages/react/src/index.d.ts +14 -0
  142. package/dist/types/packages/react/src/infinite-canvas.d.ts +71 -0
  143. package/dist/types/packages/react/src/keymap.d.ts +42 -0
  144. package/dist/types/packages/react/src/use-commit.d.ts +35 -0
  145. package/dist/types/packages/react/src/use-presence.d.ts +23 -0
  146. package/dist/types/packages/react/src/use-tool.d.ts +4 -0
  147. package/dist/types/packages/react/src/widget-root.d.ts +33 -0
  148. package/package.json +112 -0
@@ -0,0 +1,417 @@
1
+ import {
2
+ ClaimedBy,
3
+ CursorVisual,
4
+ Drag,
5
+ GesturePhases,
6
+ HandleSpec,
7
+ LocalPointer,
8
+ LongPress,
9
+ Pinch,
10
+ Pointer,
11
+ PointerButtons,
12
+ PointerScreen,
13
+ Port,
14
+ Position,
15
+ PrefabId,
16
+ RoutedConnect,
17
+ RoutedMarquee,
18
+ RoutedMove,
19
+ RoutedPan,
20
+ RoutedResize,
21
+ Size,
22
+ Tap,
23
+ Watches,
24
+ WheelPan,
25
+ WheelZoom,
26
+ Wire,
27
+ defineQuery,
28
+ prefabs,
29
+ schemaMeta
30
+ } from "./chunk-5S7GSXJG.js";
31
+ import "./chunk-BCJ47SX7.js";
32
+
33
+ // ../devtools/src/panel.ts
34
+ var TABS = ["pointers", "planes", "sovereignty", "loop"];
35
+ var TAB_LABELS = {
36
+ pointers: "POINTERS",
37
+ planes: "PLANES",
38
+ sovereignty: "SOVEREIGNTY",
39
+ loop: "LOOP"
40
+ };
41
+ var pointerQ = defineQuery([Pointer]);
42
+ var prefabIdQ = defineQuery([PrefabId]);
43
+ var widgetQ = defineQuery([PrefabId, Position, Size]);
44
+ var portQ = defineQuery([Port]);
45
+ var wireQ = defineQuery([Wire]);
46
+ var handleQ = defineQuery([HandleSpec]);
47
+ var cursorQ = defineQuery([CursorVisual]);
48
+ var RECOGNIZER_KINDS = [
49
+ { label: "Drag", q: defineQuery([Drag]) },
50
+ { label: "Tap", q: defineQuery([Tap]) },
51
+ { label: "LongPress", q: defineQuery([LongPress]) },
52
+ { label: "Pinch", q: defineQuery([Pinch]) },
53
+ { label: "WheelPan", q: defineQuery([WheelPan]) },
54
+ { label: "WheelZoom", q: defineQuery([WheelZoom]) }
55
+ ];
56
+ var ROUTE_TAGS = [
57
+ { label: "move", tag: RoutedMove },
58
+ { label: "resize", tag: RoutedResize },
59
+ { label: "connect", tag: RoutedConnect },
60
+ { label: "marquee", tag: RoutedMarquee },
61
+ { label: "pan", tag: RoutedPan }
62
+ ];
63
+ var C = {
64
+ bg: "#16181d",
65
+ panel: "#1c1f26",
66
+ border: "#2a2e37",
67
+ text: "#cdd3de",
68
+ dim: "#8b93a1",
69
+ accent: "#5aa9e6",
70
+ head: "#0f1115"
71
+ };
72
+ var BADGE = { doc: "#2f6d43", eligible: "#2a5f87", runtime: "#3a3f49", tag: "#4a3a68" };
73
+ function el(doc, tag, style, text) {
74
+ const node = doc.createElement(tag);
75
+ if (style) Object.assign(node.style, style);
76
+ if (text !== void 0) node.textContent = text;
77
+ return node;
78
+ }
79
+ function row(doc, text) {
80
+ return el(doc, "div", {
81
+ padding: "2px 6px",
82
+ borderBottom: `1px solid ${C.border}`,
83
+ whiteSpace: "pre-wrap",
84
+ wordBreak: "break-word"
85
+ }, text);
86
+ }
87
+ function badge(doc, label, color) {
88
+ return el(doc, "span", {
89
+ display: "inline-block",
90
+ padding: "0 4px",
91
+ marginLeft: "4px",
92
+ borderRadius: "3px",
93
+ background: color,
94
+ color: C.text,
95
+ fontSize: "9px",
96
+ verticalAlign: "middle"
97
+ }, label);
98
+ }
99
+ function heading(doc, text) {
100
+ return el(doc, "div", {
101
+ padding: "4px 6px",
102
+ color: C.dim,
103
+ textTransform: "uppercase",
104
+ fontSize: "9px",
105
+ letterSpacing: "0.06em",
106
+ position: "sticky",
107
+ top: "0",
108
+ background: C.panel
109
+ }, text);
110
+ }
111
+ function empty(doc, text) {
112
+ return el(doc, "div", { padding: "8px 6px", color: C.dim, fontStyle: "italic" }, text);
113
+ }
114
+ function renderPointers({ doc, world }) {
115
+ const out = [heading(doc, "pointers")];
116
+ const pointers = world.entities(pointerQ);
117
+ if (pointers.length === 0) out.push(empty(doc, "no live pointers"));
118
+ for (const e of pointers) {
119
+ const id = world.readField(e, Pointer, "id") ?? "?";
120
+ const device = world.readField(e, Pointer, "device") ?? "?";
121
+ const local = world.hasTag(e, LocalPointer) ? "\xB7local" : "";
122
+ const sx = world.has(e, PointerScreen) ? world.readField(e, PointerScreen, "x") : void 0;
123
+ const sy = world.has(e, PointerScreen) ? world.readField(e, PointerScreen, "y") : void 0;
124
+ const btns = world.has(e, PointerButtons) ? world.readField(e, PointerButtons, "buttons") : void 0;
125
+ const claim = world.getRelation(e, ClaimedBy);
126
+ const at = sx === void 0 ? "" : ` (${fmt(sx)},${fmt(sy ?? 0)})`;
127
+ const b = btns ? ` btn=${btns}` : "";
128
+ const c = claim === void 0 ? "" : ` \u2192claim #${claim}`;
129
+ const r = row(doc, `#${e} ${device}${local} "${id}"${at}${b}${c}`);
130
+ r.dataset.row = "pointer";
131
+ out.push(r);
132
+ }
133
+ out.push(heading(doc, "recognizers"));
134
+ let anyRec = false;
135
+ for (const kind of RECOGNIZER_KINDS) {
136
+ for (const e of world.entities(kind.q)) {
137
+ anyRec = true;
138
+ const phase = GesturePhases.current(world, e) ?? "\u2014";
139
+ const watches = world.getRelations(e, Watches);
140
+ const claims = world.getReverse(e, ClaimedBy);
141
+ const routes = ROUTE_TAGS.filter((rt) => world.hasTag(e, rt.tag)).map((rt) => rt.label);
142
+ const w = watches.length ? ` watches:[${watches.map((p) => `#${p}`).join(",")}]` : "";
143
+ const cl = claims.length ? ` claims:[${claims.map((p) => `#${p}`).join(",")}]` : "";
144
+ const ro = routes.length ? ` routes:${routes.join("+")}` : "";
145
+ const r = row(doc, `#${e} ${kind.label} [${phase}]${w}${cl}${ro}`);
146
+ r.dataset.row = "recognizer";
147
+ out.push(r);
148
+ }
149
+ }
150
+ if (!anyRec) out.push(empty(doc, "no live recognizers"));
151
+ return out;
152
+ }
153
+ function renderPlanes({ doc, world, engine, state }) {
154
+ const out = [heading(doc, "reflectors (flushed last frame)")];
155
+ const frame = engine.lastFrame();
156
+ const flushedNow = new Set(frame?.reflectorsFlushed ?? []);
157
+ for (const name of engine.reflectorNames()) state.seenReflectors.add(name);
158
+ for (const name of flushedNow) state.seenReflectors.add(name);
159
+ if (state.seenReflectors.size === 0) {
160
+ out.push(empty(doc, "no reflectors registered"));
161
+ }
162
+ for (const name of [...state.seenReflectors].sort()) {
163
+ const r = row(doc, name);
164
+ r.appendChild(
165
+ flushedNow.has(name) ? badge(doc, "flushed", BADGE.eligible) : badge(doc, "idle", BADGE.runtime)
166
+ );
167
+ r.dataset.row = "reflector";
168
+ out.push(r);
169
+ }
170
+ out.push(heading(doc, "entity counts"));
171
+ const counts = [
172
+ ["widgets", world.count(widgetQ)],
173
+ ["ports", world.count(portQ)],
174
+ ["wires", world.count(wireQ)],
175
+ ["chrome handles", world.count(handleQ)],
176
+ ["cursors", world.count(cursorQ)]
177
+ ];
178
+ for (const [label, n] of counts) {
179
+ const r = row(doc, `${label}: ${n}`);
180
+ r.dataset.row = "count";
181
+ out.push(r);
182
+ }
183
+ return out;
184
+ }
185
+ function renderSovereignty(ctx) {
186
+ const { doc, world, state } = ctx;
187
+ const out = [heading(doc, "prefabs (click a row to inspect)")];
188
+ const buckets = /* @__PURE__ */ new Map();
189
+ for (const e of world.entities(prefabIdQ)) {
190
+ const id = world.readField(e, PrefabId, "id");
191
+ if (id === void 0 || id === null) continue;
192
+ const b = buckets.get(id);
193
+ if (b) b.count++;
194
+ else buckets.set(id, { count: 1, first: e });
195
+ }
196
+ const all = prefabs.all();
197
+ if (all.length === 0) out.push(empty(doc, "no prefabs registered"));
198
+ for (const p of all) {
199
+ const bucket = buckets.get(p.id);
200
+ const n = bucket?.count ?? 0;
201
+ const r = el(doc, "div", {
202
+ padding: "2px 6px",
203
+ borderBottom: `1px solid ${C.border}`,
204
+ cursor: "pointer",
205
+ background: state.selectedPrefab === p.id ? C.head : "transparent"
206
+ });
207
+ r.textContent = `${p.id} \xD7${n}`;
208
+ r.appendChild(badge(doc, p.store, storeColor(p.store)));
209
+ r.dataset.row = "prefab";
210
+ r.dataset.prefab = p.id;
211
+ out.push(r);
212
+ }
213
+ const sel = state.selectedPrefab;
214
+ if (sel !== null) {
215
+ const p = prefabs.get(sel);
216
+ const bucket = buckets.get(sel);
217
+ out.push(heading(doc, `components \u2014 ${sel}`));
218
+ if (p === void 0 || bucket === void 0) {
219
+ out.push(empty(doc, "no live entity of this type"));
220
+ } else {
221
+ out.push(...renderEntityCells(ctx, p, bucket.first));
222
+ }
223
+ }
224
+ return out;
225
+ }
226
+ function renderEntityCells(ctx, p, e) {
227
+ const { doc, world, opts } = ctx;
228
+ const out = [];
229
+ out.push(row(doc, opts.keyOf ? `entity #${e} key: ${String(opts.keyOf(e))}` : `entity #${e}`));
230
+ const durable = p.store === "durable";
231
+ for (const c of p.eligible) {
232
+ if (!world.has(e, c)) continue;
233
+ const name = schemaMeta.component(c)?.name ?? "(component)";
234
+ const r = row(doc, name);
235
+ if (durable && opts.cellInDoc?.(e, c) === true) r.appendChild(badge(doc, "doc", BADGE.doc));
236
+ else if (durable) r.appendChild(badge(doc, "doc?", BADGE.eligible));
237
+ else r.appendChild(badge(doc, "rt", BADGE.runtime));
238
+ r.dataset.row = "component";
239
+ out.push(r);
240
+ }
241
+ return out;
242
+ }
243
+ function storeColor(store) {
244
+ if (store === "durable") return BADGE.doc;
245
+ if (store === "runtime") return BADGE.eligible;
246
+ return BADGE.tag;
247
+ }
248
+ function renderLoop({ doc, engine }) {
249
+ const frame = engine.lastFrame();
250
+ if (frame === void 0) {
251
+ return [heading(doc, "loop"), empty(doc, "no telemetry yet \u2014 arm it and step the engine")];
252
+ }
253
+ const out = [heading(doc, "loop")];
254
+ const ran = frame.systems.filter((s) => s.ran).length;
255
+ const total = frame.systems.length;
256
+ out.push(row(doc, `tick #${frame.tick} ${fmt(frame.totalMicros)}\xB5s ran ${ran}/${total}`));
257
+ out.push(heading(doc, "systems (by cost)"));
258
+ const sorted = [...frame.systems].sort((a, b) => b.micros - a.micros);
259
+ if (sorted.length === 0) out.push(empty(doc, "no systems registered"));
260
+ for (const s of sorted) {
261
+ const mark = s.ran ? "\u25CF" : "\u25CB";
262
+ const r = row(doc, `${mark} ${s.phase}/${s.system} ${fmt(s.micros)}\xB5s`);
263
+ r.style.color = s.ran ? C.text : C.dim;
264
+ r.dataset.row = "system";
265
+ out.push(r);
266
+ }
267
+ if (frame.phaseFlushMicros.size > 0) {
268
+ out.push(heading(doc, "phase flush"));
269
+ for (const [phase, micros] of frame.phaseFlushMicros) {
270
+ const r = row(doc, `${phase} ${fmt(micros)}\xB5s`);
271
+ r.dataset.row = "phase";
272
+ out.push(r);
273
+ }
274
+ }
275
+ return out;
276
+ }
277
+ var RENDERERS = {
278
+ pointers: renderPointers,
279
+ planes: renderPlanes,
280
+ sovereignty: renderSovereignty,
281
+ loop: renderLoop
282
+ };
283
+ function fmt(n) {
284
+ return Number.isInteger(n) ? String(n) : n.toFixed(1);
285
+ }
286
+ function attachDevtools(engine, opts = {}) {
287
+ const world = engine.world;
288
+ const container = opts.container ?? document.body;
289
+ const doc = container.ownerDocument ?? document;
290
+ if (opts.telemetry !== false) engine.enableTelemetry();
291
+ const state = {
292
+ active: "pointers",
293
+ collapsed: false,
294
+ selectedPrefab: null,
295
+ seenReflectors: /* @__PURE__ */ new Set()
296
+ };
297
+ let detached = false;
298
+ const root = el(doc, "div", {
299
+ position: "fixed",
300
+ right: "12px",
301
+ bottom: "12px",
302
+ width: "360px",
303
+ maxHeight: "70vh",
304
+ display: "flex",
305
+ flexDirection: "column",
306
+ overflow: "hidden",
307
+ background: C.bg,
308
+ color: C.text,
309
+ font: "11px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace",
310
+ border: `1px solid ${C.border}`,
311
+ borderRadius: "6px",
312
+ boxShadow: "0 6px 24px rgba(0,0,0,0.4)",
313
+ zIndex: "2147483000"
314
+ });
315
+ root.dataset.iceDevtools = "";
316
+ const header = el(doc, "div", {
317
+ display: "flex",
318
+ alignItems: "center",
319
+ justifyContent: "space-between",
320
+ padding: "4px 8px",
321
+ background: C.head,
322
+ borderBottom: `1px solid ${C.border}`,
323
+ cursor: "default",
324
+ userSelect: "none"
325
+ });
326
+ header.appendChild(el(doc, "span", { color: C.accent, fontWeight: "600" }, "ice devtools"));
327
+ const collapseBtn = el(doc, "button", {
328
+ background: "transparent",
329
+ border: "none",
330
+ color: C.text,
331
+ cursor: "pointer",
332
+ font: "inherit",
333
+ padding: "0 4px"
334
+ }, "\u25BE");
335
+ collapseBtn.dataset.collapse = "";
336
+ header.appendChild(collapseBtn);
337
+ root.appendChild(header);
338
+ const tabBar = el(doc, "div", {
339
+ display: "flex",
340
+ borderBottom: `1px solid ${C.border}`,
341
+ background: C.panel
342
+ });
343
+ const tabButtons = /* @__PURE__ */ new Map();
344
+ for (const id of TABS) {
345
+ const btn = el(doc, "button", {
346
+ flex: "1",
347
+ padding: "4px 2px",
348
+ background: "transparent",
349
+ border: "none",
350
+ borderRight: `1px solid ${C.border}`,
351
+ color: C.dim,
352
+ cursor: "pointer",
353
+ font: "inherit",
354
+ fontSize: "9px",
355
+ letterSpacing: "0.04em"
356
+ }, TAB_LABELS[id]);
357
+ btn.dataset.tab = id;
358
+ btn.addEventListener("click", () => {
359
+ state.active = id;
360
+ render();
361
+ });
362
+ tabButtons.set(id, btn);
363
+ tabBar.appendChild(btn);
364
+ }
365
+ root.appendChild(tabBar);
366
+ const content = el(doc, "div", { flex: "1", overflowY: "auto", overflowX: "hidden" });
367
+ root.appendChild(content);
368
+ content.addEventListener("click", (ev) => {
369
+ const target = ev.target;
370
+ const prefabRow = target?.closest("[data-prefab]");
371
+ if (prefabRow?.dataset.prefab) {
372
+ state.selectedPrefab = prefabRow.dataset.prefab;
373
+ render();
374
+ }
375
+ });
376
+ collapseBtn.addEventListener("click", () => {
377
+ state.collapsed = !state.collapsed;
378
+ render();
379
+ });
380
+ const ctx = { doc, world, engine, opts, state };
381
+ function render() {
382
+ if (detached) return;
383
+ for (const [id, btn] of tabButtons) {
384
+ const on = id === state.active && !state.collapsed;
385
+ btn.style.color = on ? C.text : C.dim;
386
+ btn.style.background = on ? C.bg : "transparent";
387
+ }
388
+ collapseBtn.textContent = state.collapsed ? "\u25B8" : "\u25BE";
389
+ if (state.collapsed) {
390
+ tabBar.style.display = "none";
391
+ content.style.display = "none";
392
+ return;
393
+ }
394
+ tabBar.style.display = "flex";
395
+ content.style.display = "block";
396
+ content.replaceChildren(...RENDERERS[state.active](ctx));
397
+ }
398
+ container.appendChild(root);
399
+ render();
400
+ const timer = setInterval(render, opts.intervalMs ?? 250);
401
+ return {
402
+ detach() {
403
+ if (detached) return;
404
+ detached = true;
405
+ clearInterval(timer);
406
+ root.remove();
407
+ }
408
+ };
409
+ }
410
+
411
+ // ../devtools/src/index.ts
412
+ var DEVTOOLS_VERSION = "0.0.0";
413
+ export {
414
+ DEVTOOLS_VERSION,
415
+ attachDevtools
416
+ };
417
+ //# sourceMappingURL=devtools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../devtools/src/panel.ts","../../devtools/src/index.ts"],"sourcesContent":["/**\n * The engine devtools panel (design-005 §4, M10).\n *\n * A standalone, dependency-free DOM panel that reads the world OUTSIDE the tick\n * — a verified-unrestricted read (reads are never gated; only writes are) — on a\n * fixed interval (250ms default). It is deliberately NOT a reflector: it never\n * registers with the reflector registry, never writes ECS, and refreshes on its\n * own timer rather than post-notify. Four engine tabs (design-005 §4):\n *\n * POINTERS live L0 pointers + L2 recognizers (kind, phase, watches, claims, routes)\n * PLANES reflectors flushed last frame + key entity-class counts\n * SOVEREIGNTY per-prefab store class + live count; a selected type's per-component badges\n * LOOP per-system run/skip/µs from engine telemetry, sorted by cost\n *\n * Telemetry: attach arms `engine.enableTelemetry()` by default (idempotent). The\n * LOOP tab and the PLANES reflector-flushed list both read `engine.lastFrame()`,\n * which is only populated once telemetry is armed and one step has run. Pass\n * `{ telemetry: false }` to leave it off — those two feeds then read as empty.\n *\n * Rendering is intentionally un-optimized: each refresh rebuilds the active tab's\n * content from scratch (via createElement + textContent — never innerHTML, since\n * pointer/prefab ids and component names are user/pack strings) once per 250ms.\n * That churn is a non-issue for a dev panel and keeps the reconcile trivial.\n *\n * Doc-sovereignty seams: the panel never imports doc internals. `keyOf` maps an\n * entity to its durable key (shown in the sovereignty detail header) and\n * `cellInDoc` reports whether a given component cell is actually committed to the\n * doc (badge \"doc\"); without them the badge falls back to the prefab registry's\n * static eligible set (\"doc?\" vs \"rt\").\n */\nimport {\n ClaimedBy,\n type Component,\n CursorVisual,\n Drag,\n defineQuery,\n type Engine,\n type Entity,\n type FrameTelemetry,\n GesturePhases,\n HandleSpec,\n LocalPointer,\n LongPress,\n Pinch,\n Pointer,\n PointerButtons,\n PointerScreen,\n Port,\n Position,\n type Prefab,\n PrefabId,\n prefabs,\n type Query,\n RoutedConnect,\n RoutedMarquee,\n RoutedMove,\n RoutedPan,\n RoutedResize,\n schemaMeta,\n Size,\n type Tag,\n Tap,\n Watches,\n WheelPan,\n WheelZoom,\n Wire,\n type World,\n} from \"@ice/core\";\n\nexport interface DevtoolsOpts {\n /** Where to mount the panel (default: document.body). */\n readonly container?: HTMLElement;\n /** Refresh cadence in ms (default: 250). */\n readonly intervalMs?: number;\n /** Entity → durable key, for the sovereignty detail header (no doc import needed). */\n readonly keyOf?: (e: Entity) => unknown;\n /** True when component `c`'s cell on `e` is actually committed to the doc (badge \"doc\"). */\n readonly cellInDoc?: (e: Entity, c: Component) => boolean;\n /** Arm engine telemetry on attach (default: true — the LOOP/PLANES feeds need it). */\n readonly telemetry?: boolean;\n}\n\nexport interface DevtoolsHandle {\n /** Remove the panel from the DOM and stop the refresh timer. */\n detach(): void;\n}\n\n// --- tabs ---\n\nconst TABS = [\"pointers\", \"planes\", \"sovereignty\", \"loop\"] as const;\ntype TabId = (typeof TABS)[number];\nconst TAB_LABELS: Record<TabId, string> = {\n pointers: \"POINTERS\",\n planes: \"PLANES\",\n sovereignty: \"SOVEREIGNTY\",\n loop: \"LOOP\",\n};\n\n// --- queries (defined once; catalog reads only) ---\n\nconst pointerQ = defineQuery([Pointer]);\nconst prefabIdQ = defineQuery([PrefabId]);\nconst widgetQ = defineQuery([PrefabId, Position, Size]);\nconst portQ = defineQuery([Port]);\nconst wireQ = defineQuery([Wire]);\nconst handleQ = defineQuery([HandleSpec]);\nconst cursorQ = defineQuery([CursorVisual]);\n\n/** Recognizer identity IS the kind component's presence (design-003 §4.2). */\nconst RECOGNIZER_KINDS: ReadonlyArray<{ label: string; q: Query }> = [\n { label: \"Drag\", q: defineQuery([Drag]) },\n { label: \"Tap\", q: defineQuery([Tap]) },\n { label: \"LongPress\", q: defineQuery([LongPress]) },\n { label: \"Pinch\", q: defineQuery([Pinch]) },\n { label: \"WheelPan\", q: defineQuery([WheelPan]) },\n { label: \"WheelZoom\", q: defineQuery([WheelZoom]) },\n];\n\nconst ROUTE_TAGS: ReadonlyArray<{ label: string; tag: Tag }> = [\n { label: \"move\", tag: RoutedMove },\n { label: \"resize\", tag: RoutedResize },\n { label: \"connect\", tag: RoutedConnect },\n { label: \"marquee\", tag: RoutedMarquee },\n { label: \"pan\", tag: RoutedPan },\n];\n\n// --- palette (dark, fixed) ---\n\nconst C = {\n bg: \"#16181d\",\n panel: \"#1c1f26\",\n border: \"#2a2e37\",\n text: \"#cdd3de\",\n dim: \"#8b93a1\",\n accent: \"#5aa9e6\",\n head: \"#0f1115\",\n};\nconst BADGE = { doc: \"#2f6d43\", eligible: \"#2a5f87\", runtime: \"#3a3f49\", tag: \"#4a3a68\" };\n\n// --- small DOM builders ---\n\nfunction el<K extends keyof HTMLElementTagNameMap>(\n doc: Document,\n tag: K,\n style?: Partial<CSSStyleDeclaration>,\n text?: string,\n): HTMLElementTagNameMap[K] {\n const node = doc.createElement(tag);\n if (style) Object.assign(node.style, style);\n if (text !== undefined) node.textContent = text;\n return node;\n}\n\nfunction row(doc: Document, text: string): HTMLDivElement {\n return el(doc, \"div\", {\n padding: \"2px 6px\",\n borderBottom: `1px solid ${C.border}`,\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n }, text);\n}\n\nfunction badge(doc: Document, label: string, color: string): HTMLSpanElement {\n return el(doc, \"span\", {\n display: \"inline-block\",\n padding: \"0 4px\",\n marginLeft: \"4px\",\n borderRadius: \"3px\",\n background: color,\n color: C.text,\n fontSize: \"9px\",\n verticalAlign: \"middle\",\n }, label);\n}\n\nfunction heading(doc: Document, text: string): HTMLDivElement {\n return el(doc, \"div\", {\n padding: \"4px 6px\",\n color: C.dim,\n textTransform: \"uppercase\",\n fontSize: \"9px\",\n letterSpacing: \"0.06em\",\n position: \"sticky\",\n top: \"0\",\n background: C.panel,\n }, text);\n}\n\nfunction empty(doc: Document, text: string): HTMLDivElement {\n return el(doc, \"div\", { padding: \"8px 6px\", color: C.dim, fontStyle: \"italic\" }, text);\n}\n\n// --- render context ---\n\ninterface PanelState {\n active: TabId;\n collapsed: boolean;\n selectedPrefab: string | null;\n /** Reflector names seen flushed across frames — a stable list grows as they fire. */\n readonly seenReflectors: Set<string>;\n}\n\ninterface RenderCtx {\n readonly doc: Document;\n readonly world: World;\n readonly engine: Engine;\n readonly opts: DevtoolsOpts;\n readonly state: PanelState;\n}\n\n// --- POINTERS tab ---\n\nfunction renderPointers({ doc, world }: RenderCtx): HTMLElement[] {\n const out: HTMLElement[] = [heading(doc, \"pointers\")];\n const pointers = world.entities(pointerQ);\n if (pointers.length === 0) out.push(empty(doc, \"no live pointers\"));\n for (const e of pointers) {\n const id = world.readField(e, Pointer, \"id\") ?? \"?\";\n const device = world.readField(e, Pointer, \"device\") ?? \"?\";\n const local = world.hasTag(e, LocalPointer) ? \"·local\" : \"\";\n const sx = world.has(e, PointerScreen) ? world.readField(e, PointerScreen, \"x\") : undefined;\n const sy = world.has(e, PointerScreen) ? world.readField(e, PointerScreen, \"y\") : undefined;\n const btns = world.has(e, PointerButtons) ? world.readField(e, PointerButtons, \"buttons\") : undefined;\n const claim = world.getRelation(e, ClaimedBy);\n const at = sx === undefined ? \"\" : ` (${fmt(sx)},${fmt(sy ?? 0)})`;\n const b = btns ? ` btn=${btns}` : \"\";\n const c = claim === undefined ? \"\" : ` →claim #${claim}`;\n const r = row(doc, `#${e} ${device}${local} \"${id}\"${at}${b}${c}`);\n r.dataset.row = \"pointer\";\n out.push(r);\n }\n\n out.push(heading(doc, \"recognizers\"));\n let anyRec = false;\n for (const kind of RECOGNIZER_KINDS) {\n for (const e of world.entities(kind.q)) {\n anyRec = true;\n const phase = GesturePhases.current(world, e) ?? \"—\";\n const watches = world.getRelations(e, Watches);\n const claims = world.getReverse(e, ClaimedBy);\n const routes = ROUTE_TAGS.filter((rt) => world.hasTag(e, rt.tag)).map((rt) => rt.label);\n const w = watches.length ? ` watches:[${watches.map((p) => `#${p}`).join(\",\")}]` : \"\";\n const cl = claims.length ? ` claims:[${claims.map((p) => `#${p}`).join(\",\")}]` : \"\";\n const ro = routes.length ? ` routes:${routes.join(\"+\")}` : \"\";\n const r = row(doc, `#${e} ${kind.label} [${phase}]${w}${cl}${ro}`);\n r.dataset.row = \"recognizer\";\n out.push(r);\n }\n }\n if (!anyRec) out.push(empty(doc, \"no live recognizers\"));\n return out;\n}\n\n// --- PLANES tab ---\n\nfunction renderPlanes({ doc, world, engine, state }: RenderCtx): HTMLElement[] {\n const out: HTMLElement[] = [heading(doc, \"reflectors (flushed last frame)\")];\n const frame = engine.lastFrame();\n const flushedNow = new Set(frame?.reflectorsFlushed ?? []);\n // Registered enumeration is telemetry-independent (engine.reflectorNames,\n // added on this panel's field request) — idle-since-boot reflectors list\n // too; the seen-set only backfills ones unregistered since their flush.\n for (const name of engine.reflectorNames()) state.seenReflectors.add(name);\n for (const name of flushedNow) state.seenReflectors.add(name);\n if (state.seenReflectors.size === 0) {\n out.push(empty(doc, \"no reflectors registered\"));\n }\n for (const name of [...state.seenReflectors].sort()) {\n const r = row(doc, name);\n r.appendChild(\n flushedNow.has(name) ? badge(doc, \"flushed\", BADGE.eligible) : badge(doc, \"idle\", BADGE.runtime),\n );\n r.dataset.row = \"reflector\";\n out.push(r);\n }\n\n out.push(heading(doc, \"entity counts\"));\n const counts: ReadonlyArray<[string, number]> = [\n [\"widgets\", world.count(widgetQ)],\n [\"ports\", world.count(portQ)],\n [\"wires\", world.count(wireQ)],\n [\"chrome handles\", world.count(handleQ)],\n [\"cursors\", world.count(cursorQ)],\n ];\n for (const [label, n] of counts) {\n const r = row(doc, `${label}: ${n}`);\n r.dataset.row = \"count\";\n out.push(r);\n }\n return out;\n}\n\n// --- SOVEREIGNTY tab ---\n\nfunction renderSovereignty(ctx: RenderCtx): HTMLElement[] {\n const { doc, world, state } = ctx;\n const out: HTMLElement[] = [heading(doc, \"prefabs (click a row to inspect)\")];\n\n // Bucket live PrefabId'd entities by their prefab id (count + a first live handle).\n const buckets = new Map<string, { count: number; first: Entity }>();\n for (const e of world.entities(prefabIdQ)) {\n const id = world.readField(e, PrefabId, \"id\");\n if (id === undefined || id === null) continue;\n const b = buckets.get(id);\n if (b) b.count++;\n else buckets.set(id, { count: 1, first: e });\n }\n\n const all = prefabs.all();\n if (all.length === 0) out.push(empty(doc, \"no prefabs registered\"));\n for (const p of all) {\n const bucket = buckets.get(p.id);\n const n = bucket?.count ?? 0;\n const r = el(doc, \"div\", {\n padding: \"2px 6px\",\n borderBottom: `1px solid ${C.border}`,\n cursor: \"pointer\",\n background: state.selectedPrefab === p.id ? C.head : \"transparent\",\n });\n r.textContent = `${p.id} ×${n}`;\n r.appendChild(badge(doc, p.store, storeColor(p.store)));\n r.dataset.row = \"prefab\";\n r.dataset.prefab = p.id;\n out.push(r);\n }\n\n // Narrow through a const: `heading()` between the null check and use would\n // otherwise invalidate the narrowing of the mutable `state.selectedPrefab`.\n const sel = state.selectedPrefab;\n if (sel !== null) {\n const p = prefabs.get(sel);\n const bucket = buckets.get(sel);\n out.push(heading(doc, `components — ${sel}`));\n if (p === undefined || bucket === undefined) {\n out.push(empty(doc, \"no live entity of this type\"));\n } else {\n out.push(...renderEntityCells(ctx, p, bucket.first));\n }\n }\n return out;\n}\n\n/**\n * The selected entity's per-component sovereignty badges. The candidate set is\n * the prefab's `eligible` components (essential ∪ optional ∪ PrefabId) probed by\n * `world.has` — the public introspection surface. That set IS the doc-eligible\n * set for a durable prefab, so the badge reads straight off it:\n * durable + cellInDoc(e,c) → \"doc\" · durable → \"doc?\" · runtime/ephemeral → \"rt\".\n * (Runtime cells attached BEYOND the prefab's declared set aren't enumerable\n * through the public World type, so they don't appear — a known v1 limitation.)\n */\nfunction renderEntityCells(ctx: RenderCtx, p: Prefab, e: Entity): HTMLElement[] {\n const { doc, world, opts } = ctx;\n const out: HTMLElement[] = [];\n out.push(row(doc, opts.keyOf ? `entity #${e} key: ${String(opts.keyOf(e))}` : `entity #${e}`));\n\n const durable = p.store === \"durable\";\n for (const c of p.eligible) {\n if (!world.has(e, c)) continue;\n const name = schemaMeta.component(c)?.name ?? \"(component)\";\n const r = row(doc, name);\n if (durable && opts.cellInDoc?.(e, c) === true) r.appendChild(badge(doc, \"doc\", BADGE.doc));\n else if (durable) r.appendChild(badge(doc, \"doc?\", BADGE.eligible));\n else r.appendChild(badge(doc, \"rt\", BADGE.runtime));\n r.dataset.row = \"component\";\n out.push(r);\n }\n return out;\n}\n\nfunction storeColor(store: string): string {\n if (store === \"durable\") return BADGE.doc;\n if (store === \"runtime\") return BADGE.eligible;\n return BADGE.tag;\n}\n\n// --- LOOP tab ---\n\nfunction renderLoop({ doc, engine }: RenderCtx): HTMLElement[] {\n const frame = engine.lastFrame();\n if (frame === undefined) {\n return [heading(doc, \"loop\"), empty(doc, \"no telemetry yet — arm it and step the engine\")];\n }\n const out: HTMLElement[] = [heading(doc, \"loop\")];\n const ran = frame.systems.filter((s) => s.ran).length;\n const total = frame.systems.length;\n out.push(row(doc, `tick #${frame.tick} ${fmt(frame.totalMicros)}µs ran ${ran}/${total}`));\n\n out.push(heading(doc, \"systems (by cost)\"));\n const sorted = [...frame.systems].sort((a, b) => b.micros - a.micros);\n if (sorted.length === 0) out.push(empty(doc, \"no systems registered\"));\n for (const s of sorted) {\n const mark = s.ran ? \"●\" : \"○\";\n const r = row(doc, `${mark} ${s.phase}/${s.system} ${fmt(s.micros)}µs`);\n r.style.color = s.ran ? C.text : C.dim;\n r.dataset.row = \"system\";\n out.push(r);\n }\n\n if (frame.phaseFlushMicros.size > 0) {\n out.push(heading(doc, \"phase flush\"));\n for (const [phase, micros] of frame.phaseFlushMicros) {\n const r = row(doc, `${phase} ${fmt(micros)}µs`);\n r.dataset.row = \"phase\";\n out.push(r);\n }\n }\n return out;\n}\n\nconst RENDERERS: Record<TabId, (ctx: RenderCtx) => HTMLElement[]> = {\n pointers: renderPointers,\n planes: renderPlanes,\n sovereignty: renderSovereignty,\n loop: renderLoop,\n};\n\nfunction fmt(n: number): string {\n return Number.isInteger(n) ? String(n) : n.toFixed(1);\n}\n\n// --- attach ---\n\nexport function attachDevtools(engine: Engine, opts: DevtoolsOpts = {}): DevtoolsHandle {\n const world = engine.world;\n const container = opts.container ?? document.body;\n const doc = container.ownerDocument ?? document;\n if (opts.telemetry !== false) engine.enableTelemetry();\n\n const state: PanelState = {\n active: \"pointers\",\n collapsed: false,\n selectedPrefab: null,\n seenReflectors: new Set(),\n };\n let detached = false;\n\n const root = el(doc, \"div\", {\n position: \"fixed\",\n right: \"12px\",\n bottom: \"12px\",\n width: \"360px\",\n maxHeight: \"70vh\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n background: C.bg,\n color: C.text,\n font: \"11px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace\",\n border: `1px solid ${C.border}`,\n borderRadius: \"6px\",\n boxShadow: \"0 6px 24px rgba(0,0,0,0.4)\",\n zIndex: \"2147483000\",\n });\n root.dataset.iceDevtools = \"\";\n\n // Header: title + collapse toggle.\n const header = el(doc, \"div\", {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"4px 8px\",\n background: C.head,\n borderBottom: `1px solid ${C.border}`,\n cursor: \"default\",\n userSelect: \"none\",\n });\n header.appendChild(el(doc, \"span\", { color: C.accent, fontWeight: \"600\" }, \"ice devtools\"));\n const collapseBtn = el(doc, \"button\", {\n background: \"transparent\",\n border: \"none\",\n color: C.text,\n cursor: \"pointer\",\n font: \"inherit\",\n padding: \"0 4px\",\n }, \"▾\");\n collapseBtn.dataset.collapse = \"\";\n header.appendChild(collapseBtn);\n root.appendChild(header);\n\n // Tab bar (persistent buttons — only the content below is rebuilt).\n const tabBar = el(doc, \"div\", {\n display: \"flex\",\n borderBottom: `1px solid ${C.border}`,\n background: C.panel,\n });\n const tabButtons = new Map<TabId, HTMLButtonElement>();\n for (const id of TABS) {\n const btn = el(doc, \"button\", {\n flex: \"1\",\n padding: \"4px 2px\",\n background: \"transparent\",\n border: \"none\",\n borderRight: `1px solid ${C.border}`,\n color: C.dim,\n cursor: \"pointer\",\n font: \"inherit\",\n fontSize: \"9px\",\n letterSpacing: \"0.04em\",\n }, TAB_LABELS[id]);\n btn.dataset.tab = id;\n btn.addEventListener(\"click\", () => {\n state.active = id;\n render();\n });\n tabButtons.set(id, btn);\n tabBar.appendChild(btn);\n }\n root.appendChild(tabBar);\n\n const content = el(doc, \"div\", { flex: \"1\", overflowY: \"auto\", overflowX: \"hidden\" });\n root.appendChild(content);\n\n // Delegated click: selecting a prefab row (content is rebuilt every render).\n content.addEventListener(\"click\", (ev) => {\n const target = ev.target as HTMLElement | null;\n const prefabRow = target?.closest<HTMLElement>(\"[data-prefab]\");\n if (prefabRow?.dataset.prefab) {\n state.selectedPrefab = prefabRow.dataset.prefab;\n render();\n }\n });\n\n collapseBtn.addEventListener(\"click\", () => {\n state.collapsed = !state.collapsed;\n render();\n });\n\n const ctx: RenderCtx = { doc, world, engine, opts, state };\n\n function render(): void {\n if (detached) return;\n for (const [id, btn] of tabButtons) {\n const on = id === state.active && !state.collapsed;\n btn.style.color = on ? C.text : C.dim;\n btn.style.background = on ? C.bg : \"transparent\";\n }\n collapseBtn.textContent = state.collapsed ? \"▸\" : \"▾\";\n if (state.collapsed) {\n tabBar.style.display = \"none\";\n content.style.display = \"none\";\n return;\n }\n tabBar.style.display = \"flex\";\n content.style.display = \"block\";\n content.replaceChildren(...RENDERERS[state.active](ctx));\n }\n\n container.appendChild(root);\n render();\n const timer = setInterval(render, opts.intervalMs ?? 250);\n\n return {\n detach(): void {\n if (detached) return;\n detached = true;\n clearInterval(timer);\n root.remove();\n },\n };\n}\n","/**\n * @ice/devtools — the engine devtools panel (design-005 §4): pointers/recognizers,\n * planes, sovereignty badges, loop telemetry. A standalone DOM panel that reads\n * the world outside the tick — it is NOT a reflector and writes no ECS.\n * Import wall: @ice/core (+kernel) only; nobody imports us (depcruise-enforced).\n */\nexport const DEVTOOLS_VERSION = \"0.0.0\";\n\nexport { attachDevtools, type DevtoolsHandle, type DevtoolsOpts } from \"./panel\";\n"],"mappings":"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","names":[]}
package/dist/dom.js ADDED
@@ -0,0 +1,41 @@
1
+ import {
2
+ DEFAULT_GRID_CONFIG,
3
+ DEFAULT_WIRES_CONFIG,
4
+ DOM_VERSION,
5
+ attachMeasureAdapter,
6
+ attachPointerAdapter,
7
+ createCanvasHost,
8
+ createChromeReflector,
9
+ createCursorReflector,
10
+ createDomWidgetsReflector,
11
+ createGrayboxReflector,
12
+ createGridReflector,
13
+ createPlaneTransformReflector,
14
+ createPlanes,
15
+ createRemoteCursorsReflector,
16
+ createWiresReflector,
17
+ startRafLoop,
18
+ wireMeasurement
19
+ } from "./chunk-FIAXPNNY.js";
20
+ import "./chunk-5S7GSXJG.js";
21
+ import "./chunk-BCJ47SX7.js";
22
+ export {
23
+ DEFAULT_GRID_CONFIG,
24
+ DEFAULT_WIRES_CONFIG,
25
+ DOM_VERSION,
26
+ attachMeasureAdapter,
27
+ attachPointerAdapter,
28
+ createCanvasHost,
29
+ createChromeReflector,
30
+ createCursorReflector,
31
+ createDomWidgetsReflector,
32
+ createGrayboxReflector,
33
+ createGridReflector,
34
+ createPlaneTransformReflector,
35
+ createPlanes,
36
+ createRemoteCursorsReflector,
37
+ createWiresReflector,
38
+ startRafLoop,
39
+ wireMeasurement
40
+ };
41
+ //# sourceMappingURL=dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}