@vibecook/ice 0.1.0 → 0.3.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.
- package/README.md +37 -2
- package/dist/chunk-2GUYATUM.js +643 -0
- package/dist/chunk-2GUYATUM.js.map +1 -0
- package/dist/{chunk-5S7GSXJG.js → chunk-5QY7HK6G.js} +3145 -1306
- package/dist/chunk-5QY7HK6G.js.map +1 -0
- package/dist/{chunk-BCJ47SX7.js → chunk-OR5FNVUE.js} +460 -1
- package/dist/chunk-OR5FNVUE.js.map +1 -0
- package/dist/{chunk-FIAXPNNY.js → chunk-PKK6GLSA.js} +143 -551
- package/dist/chunk-PKK6GLSA.js.map +1 -0
- package/dist/devtools.js +508 -372
- package/dist/devtools.js.map +1 -1
- package/dist/dom.js +3 -11
- package/dist/ground.js +715 -0
- package/dist/ground.js.map +1 -0
- package/dist/index.js +80 -2
- package/dist/kernel.js +31 -1
- package/dist/r3f.js +605 -62
- package/dist/r3f.js.map +1 -1
- package/dist/react.js +36 -418
- package/dist/react.js.map +1 -1
- package/dist/types/packages/core/src/catalog/camera-derived.d.ts +65 -3
- package/dist/types/packages/core/src/catalog/gesture.d.ts +40 -4
- package/dist/types/packages/core/src/catalog/graph.d.ts +7 -6
- package/dist/types/packages/core/src/catalog/index.d.ts +1 -0
- package/dist/types/packages/core/src/catalog/insert.d.ts +31 -0
- package/dist/types/packages/core/src/catalog/pointer.d.ts +11 -0
- package/dist/types/packages/core/src/catalog/scene.d.ts +37 -4
- package/dist/types/packages/core/src/catalog/selection-presence.d.ts +7 -0
- package/dist/types/packages/core/src/catalog/settings-resources.d.ts +21 -0
- package/dist/types/packages/core/src/doc/autosave.d.ts +49 -2
- package/dist/types/packages/core/src/doc/bootstrap.d.ts +29 -0
- package/dist/types/packages/core/src/doc/channels.d.ts +9 -0
- package/dist/types/packages/core/src/doc/doc-commit-sink.d.ts +2 -1
- package/dist/types/packages/core/src/doc/doc-kit.d.ts +16 -1
- package/dist/types/packages/core/src/doc/envelope.d.ts +2 -1
- package/dist/types/packages/core/src/doc/migrate.d.ts +8 -6
- package/dist/types/packages/core/src/doc/schema-migrate.d.ts +50 -0
- package/dist/types/packages/core/src/doc/version-gate.d.ts +3 -0
- package/dist/types/packages/core/src/engine/commit-sink.d.ts +24 -2
- package/dist/types/packages/core/src/engine/engine.d.ts +11 -0
- package/dist/types/packages/core/src/engine/frame-control.d.ts +71 -0
- package/dist/types/packages/core/src/engine/frame-info.d.ts +16 -1
- package/dist/types/packages/core/src/facade/create-canvas-engine.d.ts +79 -6
- package/dist/types/packages/core/src/guards/guarded-tx.d.ts +4 -2
- package/dist/types/packages/core/src/helpers/churn-guard.d.ts +40 -0
- package/dist/types/packages/core/src/index.d.ts +15 -7
- package/dist/types/packages/core/src/input/queue.d.ts +11 -0
- package/dist/types/packages/core/src/interaction/gesture-status.d.ts +13 -0
- package/dist/types/packages/core/src/nav/nested-canvas.d.ts +47 -11
- package/dist/types/packages/core/src/ops/arrange.d.ts +15 -0
- package/dist/types/packages/core/src/ops/insert.d.ts +62 -0
- package/dist/types/packages/core/src/ops/point-pick.d.ts +11 -7
- package/dist/types/packages/core/src/ops/sibling-order.d.ts +70 -0
- package/dist/types/packages/core/src/schema/meta.d.ts +1 -0
- package/dist/types/packages/core/src/settings/defaults.d.ts +45 -0
- package/dist/types/packages/core/src/settings/ground-config.d.ts +55 -0
- package/dist/types/packages/core/src/systems/chrome.d.ts +6 -2
- package/dist/types/packages/core/src/systems/insert-ghost.d.ts +25 -0
- package/dist/types/packages/core/src/systems/l1-pick.d.ts +25 -11
- package/dist/types/packages/core/src/systems/l2-recognize.d.ts +10 -4
- package/dist/types/packages/core/src/systems/l3-behave.d.ts +6 -4
- package/dist/types/packages/core/src/systems/l3-claim.d.ts +7 -3
- package/dist/types/packages/core/src/systems/l3-drop.d.ts +3 -1
- package/dist/types/packages/core/src/systems/l3-resize.d.ts +3 -1
- package/dist/types/packages/core/src/systems/l3-snap.d.ts +25 -7
- package/dist/types/packages/core/src/systems/nav-flight.d.ts +95 -0
- package/dist/types/packages/core/src/widget/define-widget.d.ts +39 -0
- package/dist/types/packages/core/src/widget/mount-store.d.ts +11 -3
- package/dist/types/packages/core/src/widget/set-props.d.ts +16 -0
- package/dist/types/packages/core/src/widget/spawn.d.ts +21 -1
- package/dist/types/packages/devtools/src/attach.d.ts +77 -0
- package/dist/types/packages/devtools/src/dock.d.ts +38 -0
- package/dist/types/packages/devtools/src/gl-panel.d.ts +69 -0
- package/dist/types/packages/devtools/src/index.d.ts +8 -6
- package/dist/types/packages/dom/src/index.d.ts +1 -3
- package/dist/types/packages/dom/src/loop.d.ts +11 -0
- package/dist/types/packages/dom/src/measure-wiring.d.ts +2 -2
- package/dist/types/packages/dom/src/pointer-adapter.d.ts +21 -1
- package/dist/types/packages/dom/src/reflectors/dom-widgets.d.ts +5 -0
- package/dist/types/packages/ground/src/index.d.ts +52 -0
- package/dist/types/packages/ground/src/layer.d.ts +40 -0
- package/dist/types/packages/ground/src/pass.d.ts +41 -0
- package/dist/types/packages/ground/src/passes/grid.d.ts +21 -0
- package/dist/types/packages/ground/src/passes/guides-collect.d.ts +14 -0
- package/dist/types/packages/ground/src/passes/guides.d.ts +3 -0
- package/dist/types/packages/ground/src/passes/soup-collect.d.ts +35 -0
- package/dist/types/packages/ground/src/passes/soup-mesh.d.ts +8 -0
- package/dist/types/packages/ground/src/passes/wires-collect.d.ts +31 -0
- package/dist/types/packages/ground/src/passes/wires.d.ts +10 -0
- package/dist/types/packages/ground/src/renderer.d.ts +15 -0
- package/dist/types/packages/ice/src/ground.d.ts +1 -0
- package/dist/types/packages/kernel/src/bezier.d.ts +15 -0
- package/dist/types/packages/kernel/src/coords.d.ts +15 -0
- package/dist/types/packages/kernel/src/easing.d.ts +11 -0
- package/dist/types/packages/kernel/src/index.d.ts +3 -0
- package/dist/types/packages/kernel/src/layout.d.ts +118 -0
- package/dist/types/packages/kernel/src/nav-flight.d.ts +93 -0
- package/dist/types/packages/r3f/src/bridge.d.ts +73 -12
- package/dist/types/packages/r3f/src/composite-material.d.ts +9 -0
- package/dist/types/packages/r3f/src/compositor-pass.d.ts +22 -0
- package/dist/types/packages/r3f/src/gl-root.d.ts +76 -1
- package/dist/types/packages/r3f/src/gl-router.d.ts +10 -0
- package/dist/types/packages/r3f/src/index.d.ts +3 -2
- package/dist/types/packages/r3f/src/island-state.d.ts +44 -0
- package/dist/types/packages/r3f/src/preview-capture.d.ts +19 -0
- package/dist/types/packages/r3f/src/self-sustain.d.ts +39 -0
- package/dist/types/packages/r3f/src/use-island-frame.d.ts +16 -1
- package/dist/types/packages/react/src/engine-context.d.ts +21 -0
- package/dist/types/packages/react/src/index.d.ts +4 -2
- package/dist/types/packages/react/src/infinite-canvas.d.ts +40 -6
- package/dist/types/packages/react/src/preview-snapshots.d.ts +17 -0
- package/dist/types/packages/react/src/widget-preview.d.ts +14 -0
- package/package.json +32 -61
- package/dist/chunk-5S7GSXJG.js.map +0 -1
- package/dist/chunk-BCJ47SX7.js.map +0 -1
- package/dist/chunk-FIAXPNNY.js.map +0 -1
- package/dist/types/packages/devtools/src/panel.d.ts +0 -48
- package/dist/types/packages/dom/src/reflectors/grid.d.ts +0 -63
- package/dist/types/packages/dom/src/reflectors/wires.d.ts +0 -88
package/dist/devtools.js.map
CHANGED
|
@@ -1 +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":[]}
|
|
1
|
+
{"version":3,"sources":["../../devtools/src/attach.ts","../../devtools/src/dock.ts","../../devtools/src/gl-panel.ts","../../devtools/src/index.ts"],"sourcesContent":["/**\n * @ice/devtools — strata's first-party tools, engine-flavored (rebuilt\n * 2026-07-13, superseding the M10 hand-rolled 4-tab panel: the standing rule\n * is observers/inspectors WRAP `@vibecook/strata-ecs/tools`, never\n * re-implement them).\n *\n * `attachDevtools(engine)` = strata's observer panel + FPS profiler, plus the\n * engine glue strata cannot know:\n *\n * DESCRIBE PrefabId → widget type; recognizers → kind + live phase;\n * pointers/ports/wires/peers/chrome labeled as such.\n * DURABLE TAB fed from the facade's CURRENT DocSession (docId, converged\n * snapshot, attachment baseline) — the getter re-reads per\n * poll, so it tracks docs.create/open/join/close live.\n * EPHEMERAL TAB fed from an app-provided PresenceSession getter (the\n * facade keeps presence private; collab demos pass theirs).\n * \"reflect\" LANE the engine's post-notify reflector flush cost — the one\n * frame slice strata's world hooks cannot see — reported\n * into the profiler via an onPublish hook reading\n * `lastFrame()` telemetry (one frame late by construction:\n * publish runs before this frame's reflect).\n *\n * By default all three tools mount into ONE draggable dock (dock.ts —\n * 2026-07-13, James: \"make the 3 tools into one draggable panel\"); pass\n * `dock: false` for the classic scattered corners.\n *\n * Reads only, outside the tick (verified-unrestricted); never a reflector,\n * never writes ECS. Nobody imports this package (depcruise-enforced leaf).\n */\nimport type { Entity, World } from \"@vibecook/strata-ecs\";\nimport {\n attachObserver,\n attachProfiler,\n defaultDescribe,\n type DescribeFn,\n type EntityDescription,\n type ObserverDurableSource,\n type ObserverEphemeralSource,\n type ObserverHandle,\n type ObserverOptions,\n type ProfilerHandle,\n type ProfilerOptions,\n} from \"@vibecook/strata-ecs/tools\";\nimport { createDock, type Dock, type DockOptions, type DockSlotId } from \"./dock\";\nimport { createGlPanel, type GlPanel, type GlPanelOptions, type GlPanelStats } from \"./gl-panel\";\nimport {\n CursorVisual,\n Drag,\n GesturePhases,\n GestureSuspended,\n HandleSpec,\n LongPress,\n Pinch,\n Pointer,\n Port,\n PrefabId,\n PresencePeer,\n Tap,\n WheelPan,\n WheelZoom,\n Wire,\n type CanvasEngine,\n type Engine,\n type PresenceSession,\n} from \"@ice/core\";\n\nexport interface DevtoolsOpts {\n /** Where the dock (or, with `dock: false`, each panel) mounts (default: document.body). */\n readonly container?: HTMLElement;\n /**\n * ONE draggable dock hosting all three tools (the default). `false` scatters\n * them to their classic fixed corners; an object sets initial placement.\n * The dock mounts lazily with the first tool that needs it.\n */\n readonly dock?: boolean | Pick<DockOptions, \"corner\" | \"title\" | \"width\">;\n /** Observer panel: `false` to omit, or strata passthrough options. */\n readonly observer?: boolean | Pick<ObserverOptions, \"defaultTab\" | \"tab\" | \"recorderCap\">;\n /** Profiler HUD: `false` to omit, or strata passthrough options. */\n readonly profiler?: boolean | Pick<ProfilerOptions, \"budgetMs\" | \"windowSize\" | \"corner\" | \"expanded\" | \"lanes\">;\n /** GL metrics panel: `false` to omit, or placement/budget options. Mounts lazily on the first `glStats` push. */\n readonly glPanel?: boolean | Pick<GlPanelOptions, \"corner\" | \"budgetMs\" | \"expanded\">;\n /** Collab demos: the presence session whose store feeds the ephemeral tab. */\n readonly presence?: () => PresenceSession | null | undefined;\n /** Override entity labeling (default: the engine describe below). */\n readonly describe?: DescribeFn;\n}\n\nexport interface DevtoolsHandle {\n readonly observer: ObserverHandle | null;\n readonly profiler: ProfilerHandle | null;\n /** Host-cost lane passthrough (paint, decode…); no-op when the profiler is off. */\n lane(name: string, ms: number): void;\n /**\n * Feed one GL frame's metrics (wire `<GLViews onFrameStats>` here). The GL\n * panel mounts on the first push — renderer counts, virtual-texture census,\n * LOD banding, cull population. No-op when opts.glPanel === false.\n */\n glStats(stats: GlPanelStats): void;\n /** Tear all panels + the telemetry hook down. Idempotent. */\n detach(): void;\n}\n\nconst COLOR = {\n widget: \"#3fb950\",\n gesture: \"#a371f7\",\n pointer: \"#58a6ff\",\n graph: \"#ffa657\",\n presence: \"#f778ba\",\n chrome: \"#8b949e\",\n} as const;\n\nconst PHASE_ORDER = [\"Active\", \"Possible\", \"Recognized\", \"Pending\", \"Ended\", \"Cancelled\", \"Failed\"] as const;\n\nfunction phaseOf(world: World, e: Entity): string | null {\n // Suspended is a rider OUTSIDE the phase set (a pinch freezes single-pointer\n // recognizers without ending them) — surface it first, it explains \"stuck\".\n if (world.hasTag(e, GestureSuspended)) return \"suspended\";\n for (const name of PHASE_ORDER) {\n if (world.hasTag(e, GesturePhases.tags[name])) return name.toLowerCase();\n }\n return null;\n}\n\n/**\n * Engine-aware entity labeling for the observer's lists + timeline: identity\n * off ROLE (widget type, recognizer kind + phase, pointer device), not off\n * raw component-name composition. Falls back to strata's defaultDescribe.\n */\nexport function engineDescribe(world: World, e: Entity): EntityDescription {\n const prefab = world.get(e, PrefabId)?.id;\n if (typeof prefab === \"string\") return { label: prefab, color: COLOR.widget };\n\n const kind = world.has(e, Tap)\n ? \"tap\"\n : world.has(e, LongPress)\n ? \"longpress\"\n : world.has(e, Pinch)\n ? \"pinch\"\n : world.has(e, WheelZoom)\n ? \"wheelzoom\"\n : world.has(e, WheelPan)\n ? \"wheelpan\"\n : world.has(e, Drag)\n ? \"drag\"\n : undefined;\n if (kind !== undefined) return { label: kind, color: COLOR.gesture, phase: phaseOf(world, e) };\n\n if (world.has(e, Pointer)) return { label: `pointer:${world.read(e, Pointer).device}`, color: COLOR.pointer };\n if (world.has(e, Port)) return { label: \"port\", color: COLOR.graph };\n if (world.hasTag(e, Wire)) return { label: \"wire\", color: COLOR.graph };\n if (world.hasTag(e, PresencePeer)) return { label: \"peer\", color: COLOR.presence };\n if (world.has(e, CursorVisual)) return { label: \"cursor\", color: COLOR.presence };\n if (world.has(e, HandleSpec)) return { label: \"handle\", color: COLOR.chrome };\n return defaultDescribe(world, e);\n}\n\n/** Accepts the facade (durable tab included) or a bare core engine. */\nexport type DevtoolsEngine = CanvasEngine | Engine;\n\nexport function attachDevtools(engine: DevtoolsEngine, opts: DevtoolsOpts = {}): DevtoolsHandle {\n const isFacade = \"docs\" in engine;\n const core: Engine = isFacade ? engine.engine : engine;\n const world = core.world;\n\n // Durable tab: only the facade knows the current session; the getter is\n // re-read each poll so it swaps live across doc open/close/join. The store\n // and attachment are the STRUCTURAL mirrors the observer contract documents\n // (docId + snapshot / baseline) — never a sync path.\n const docs = isFacade ? engine.docs : undefined;\n const durable =\n docs === undefined\n ? undefined\n : (): ObserverDurableSource | null => {\n const s = docs.current();\n if (s === undefined) return null;\n return {\n store: s.store as unknown as ObserverDurableSource[\"store\"],\n attachment: s.attachment as unknown as ObserverDurableSource[\"attachment\"],\n };\n };\n\n const presence = opts.presence;\n const ephemeral =\n presence === undefined\n ? undefined\n : (): ObserverEphemeralSource | null => presence()?.eph ?? null;\n\n // The dock is created with the first tool that mounts (so all-flags-off\n // attaches — and glPanel-only attaches before the first push — stay DOM-free).\n let dock: Dock | null = null;\n const mountIn = (id: DockSlotId): { container?: HTMLElement } => {\n if (opts.dock === false) return opts.container !== undefined ? { container: opts.container } : {};\n if (dock === null) {\n dock = createDock({\n ...(typeof opts.dock === \"object\" ? opts.dock : {}),\n ...(opts.container !== undefined ? { container: opts.container } : {}),\n });\n }\n return { container: dock.slot(id) };\n };\n\n const observer =\n opts.observer === false\n ? null\n : attachObserver(world, {\n ...(typeof opts.observer === \"object\" ? opts.observer : {}),\n ...mountIn(\"observer\"),\n describe: opts.describe ?? engineDescribe,\n ...(durable !== undefined ? { durable } : {}),\n ...(ephemeral !== undefined ? { ephemeral } : {}),\n });\n\n const profiler =\n opts.profiler === false\n ? null\n : attachProfiler(world, {\n ...(typeof opts.profiler === \"object\" ? opts.profiler : {}),\n ...mountIn(\"profiler\"),\n });\n\n // The \"reflect\" lane: reflector flushes run POST-notify, invisible to\n // strata's in-world hooks. Publish runs before this frame's reflect, so the\n // hook reports the PREVIOUS frame's cost — a one-frame lag a HUD can carry.\n let removePublish: (() => void) | undefined;\n if (profiler !== null) {\n core.enableTelemetry();\n removePublish = core.onPublish(() => {\n const us = core.lastFrame()?.phaseFlushMicros.get(\"reflect\");\n if (us !== undefined && us > 0) profiler.lane(\"reflect\", us / 1000);\n });\n }\n\n let glPanel: GlPanel | null = null;\n let detached = false;\n return {\n observer,\n profiler,\n lane(name, ms) {\n profiler?.lane(name, ms);\n },\n glStats(stats) {\n if (detached || opts.glPanel === false) return;\n if (glPanel === null) {\n glPanel = createGlPanel({\n ...(typeof opts.glPanel === \"object\" ? opts.glPanel : {}),\n ...mountIn(\"gl\"),\n });\n }\n glPanel.push(stats);\n },\n detach() {\n if (detached) return;\n detached = true;\n removePublish?.();\n observer?.dispose();\n profiler?.dispose();\n glPanel?.dispose();\n glPanel = null;\n dock?.dispose();\n dock = null;\n },\n };\n}\n","/**\n * The devtools dock — ONE draggable window hosting all three tools\n * (2026-07-13, James: \"make the 3 tools into one draggable panel\").\n *\n * strata's observer + profiler and our GL panel each mount `position: fixed`\n * into their own corner. The dock does NOT re-implement any of them (standing\n * rule: wrap first-party tools): it is a fixed, draggable shell with three\n * stacked slots; each tool mounts into its slot via its own `container`\n * option, and dock-scoped CSS de-windows them (`position: static`, full\n * width, no border/shadow) so they read as sections of one panel. Their own\n * behavior is untouched — the observer keeps its tabs/collapse/vertical\n * resize (its header drag goes inert: left/top are ignored at static), the\n * profiler + GL strips keep their click-to-expand.\n *\n * Slot order is fixed by the dock, not by mount order: profiler and GL are\n * one-line summary strips, the observer is the deep-dive — strips on top.\n * Layout (x/y/width/open) persists to localStorage, same as the observer:\n * schema edits full-reload the page by design; the dock must stay put.\n */\n\nexport type DockCorner = \"tl\" | \"tr\" | \"bl\" | \"br\";\n\nexport type DockSlotId = \"profiler\" | \"gl\" | \"observer\";\n\nexport interface DockOptions {\n /** Where the dock mounts (default: document.body). */\n readonly container?: HTMLElement;\n /** Initial corner when nothing is persisted yet (default \"tr\"). */\n readonly corner?: DockCorner;\n /** Header title (default \"ice devtools\"). */\n readonly title?: string;\n /** Initial width in px when nothing is persisted yet (default 420). */\n readonly width?: number;\n}\n\nexport interface Dock {\n readonly el: HTMLElement;\n /** The mount element for one tool. Empty slots are display:none via CSS. */\n slot(id: DockSlotId): HTMLElement;\n dispose(): void;\n}\n\nconst LS_KEY = \"ice-dock:layout\";\nconst STYLE_ID = \"ice-dock-style\";\nconst MARGIN = 8;\nconst KEEP = 90; // px that must stay on screen so the header is always grabbable\nconst SLOT_ORDER: readonly DockSlotId[] = [\"profiler\", \"gl\", \"observer\"];\n\ninterface Layout {\n x?: number;\n y?: number;\n w?: number;\n open?: boolean;\n}\n\nfunction loadLayout(): Layout {\n try {\n return JSON.parse(localStorage.getItem(LS_KEY) ?? \"{}\") as Layout;\n } catch {\n return {};\n }\n}\n\nfunction saveLayout(patch: Layout): void {\n try {\n localStorage.setItem(LS_KEY, JSON.stringify({ ...loadLayout(), ...patch }));\n } catch {\n /* private mode / quota — non-fatal for a dev tool */\n }\n}\n\n// strata-obs's window chrome, verbatim, plus the de-windowing overrides for\n// the hosted tools. `!important` beats both the tools' own stylesheets and\n// the observer's inline width restored from ITS localStorage layout.\nconst CSS = `\n.ice-dock { position: fixed; z-index: 99999; width: 420px; min-width: 340px; max-width: 92vw;\n background: rgba(13,17,23,.96); border: 1px solid #30363d; border-radius: 10px;\n color: #e6edf3; font: 12px/1.45 ui-monospace, SFMono-Regular, Menlo, monospace;\n box-shadow: 0 8px 28px rgba(0,0,0,.45); overflow: hidden; resize: horizontal; }\n.ice-dock * { box-sizing: border-box; }\n.ice-dock.collapsed { resize: none; }\n.ice-dock.dragging { opacity: .92; cursor: grabbing; }\n.ice-dock-head { display: flex; align-items: center; gap: 7px; padding: 7px 10px; cursor: grab;\n background: rgba(22,27,34,.96); user-select: none; }\n.ice-dock-grip { color: #484f58; }\n.ice-dock-name { font-weight: 700; color: #56d4dd; }\n.ice-dock-btn { background: none; border: none; color: #8b949e; cursor: pointer; font: inherit;\n padding: 2px 6px; margin-left: auto; }\n.ice-dock-btn:hover { color: #e6edf3; }\n.ice-dock-body { max-height: calc(100vh - 96px); overflow-y: auto; }\n.ice-dock.collapsed .ice-dock-body { display: none; }\n.ice-dock-slot { border-top: 1px solid #30363d; }\n.ice-dock-slot:empty { display: none; }\n\n/* De-window the hosted tools — the dock is the window now. */\n.ice-dock .strata-obs, .ice-dock .strata-prof, .ice-dock .ice-gl {\n position: static !important; width: auto !important; min-width: 0 !important;\n border: none !important; border-radius: 0 !important; box-shadow: none !important; }\n.ice-dock .strata-obs { resize: vertical !important; }\n.ice-dock .strata-obs-head { cursor: default; }\n.ice-dock .strata-prof-body, .ice-dock .ice-gl-body { min-width: 0; }\n`;\n\nfunction injectStyle(doc: Document): void {\n if (doc.getElementById(STYLE_ID) !== null) return;\n const el = doc.createElement(\"style\");\n el.id = STYLE_ID;\n el.textContent = CSS;\n doc.head.appendChild(el);\n}\n\nexport function createDock(opts: DockOptions = {}): Dock {\n const container = opts.container ?? document.body;\n const doc = container.ownerDocument;\n const win = doc.defaultView ?? window;\n injectStyle(doc);\n\n const clampPos = (x: number, y: number, w: number): { x: number; y: number } => {\n const maxX = win.innerWidth - KEEP;\n const minX = Math.min(MARGIN, MARGIN - (w - KEEP));\n const maxY = win.innerHeight - 34;\n return { x: Math.min(Math.max(x, minX), maxX), y: Math.min(Math.max(y, MARGIN), maxY) };\n };\n\n const root = doc.createElement(\"div\");\n root.className = \"ice-dock\";\n\n const head = doc.createElement(\"div\");\n head.className = \"ice-dock-head\";\n const grip = doc.createElement(\"span\");\n grip.className = \"ice-dock-grip\";\n grip.setAttribute(\"aria-hidden\", \"true\");\n grip.textContent = \"⠿\";\n const name = doc.createElement(\"span\");\n name.className = \"ice-dock-name\";\n name.textContent = opts.title ?? \"ice devtools\";\n const collapse = doc.createElement(\"button\");\n collapse.type = \"button\";\n collapse.className = \"ice-dock-btn\";\n collapse.title = \"Collapse\";\n head.append(grip, name, collapse);\n\n const body = doc.createElement(\"div\");\n body.className = \"ice-dock-body\";\n const slots = new Map<DockSlotId, HTMLElement>();\n for (const id of SLOT_ORDER) {\n const s = doc.createElement(\"div\");\n s.className = \"ice-dock-slot\";\n s.dataset.slot = id;\n body.appendChild(s);\n slots.set(id, s);\n }\n\n root.append(head, body);\n container.appendChild(root);\n\n // restore layout: width, then position (clamped), then open state\n const l = loadLayout();\n const w = typeof l.w === \"number\" ? l.w : (opts.width ?? 420);\n root.style.width = `${w}px`;\n const corner = opts.corner ?? \"tr\";\n const fx = corner === \"tl\" || corner === \"bl\" ? 16 : win.innerWidth - w - 16;\n const fy = corner === \"tl\" || corner === \"tr\" ? 16 : win.innerHeight - 220;\n const p = clampPos(l.x ?? fx, l.y ?? fy, w);\n root.style.left = `${p.x}px`;\n root.style.top = `${p.y}px`;\n let open = l.open ?? true;\n const applyOpen = (): void => {\n root.classList.toggle(\"collapsed\", !open);\n collapse.textContent = open ? \"▾\" : \"▸\";\n };\n applyOpen();\n collapse.addEventListener(\"click\", () => {\n open = !open;\n saveLayout({ open });\n applyOpen();\n });\n\n let drag: { id: number; sx: number; sy: number; ox: number; oy: number } | null = null;\n head.addEventListener(\"pointerdown\", (e) => {\n if ((e.target as HTMLElement).closest(\"button\") !== null) return; // let buttons be buttons\n const r = root.getBoundingClientRect();\n drag = { id: e.pointerId, sx: e.clientX, sy: e.clientY, ox: r.left, oy: r.top };\n if (typeof head.setPointerCapture === \"function\") {\n try {\n head.setPointerCapture(e.pointerId);\n } catch {\n /* synthetic events (tests) have no active pointer */\n }\n }\n root.classList.add(\"dragging\");\n e.preventDefault();\n });\n head.addEventListener(\"pointermove\", (e) => {\n if (drag?.id !== e.pointerId) return;\n const q = clampPos(drag.ox + (e.clientX - drag.sx), drag.oy + (e.clientY - drag.sy), root.offsetWidth);\n root.style.left = `${q.x}px`;\n root.style.top = `${q.y}px`;\n });\n const endDrag = (e: PointerEvent): void => {\n if (drag?.id !== e.pointerId) return;\n drag = null;\n root.classList.remove(\"dragging\");\n const r = root.getBoundingClientRect();\n saveLayout({ x: r.left, y: r.top });\n };\n head.addEventListener(\"pointerup\", endDrag);\n head.addEventListener(\"pointercancel\", endDrag);\n\n const onWinResize = (): void => {\n const r = root.getBoundingClientRect();\n const q = clampPos(r.left, r.top, root.offsetWidth);\n root.style.left = `${q.x}px`;\n root.style.top = `${q.y}px`;\n };\n win.addEventListener(\"resize\", onWinResize);\n const ro = new ResizeObserver(() => {\n saveLayout({ w: root.offsetWidth });\n });\n ro.observe(root);\n\n let disposed = false;\n return {\n el: root,\n slot(id) {\n // SLOT_ORDER covers the full DockSlotId union — the map is total.\n return slots.get(id) as HTMLElement;\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n win.removeEventListener(\"resize\", onWinResize);\n ro.disconnect();\n root.remove();\n },\n };\n}\n","/**\n * The GL metrics panel — the engine-specific renderer readout strata has no\n * counterpart for (2026-07-13, James: \"comprehensive r3f profiler ... and our\n * engine specific optimization metrics ... with nice visuals\").\n *\n * Pure DOM, strata's visual language (same palette/typography as the observer\n * + profiler HUD so the three read as one toolset). Fed by pushes of\n * `GlPanelStats` — the STRUCTURAL MIRROR of @ice/r3f's `GlFrameStats`\n * (devtools cannot import r3f under the walls; keep the shapes aligned):\n *\n * head fps · gpu ms + a gpu sparkline against the frame budget\n * frame cpu / gpu bars vs budget, with session maxima\n * render draw calls · triangles · points/lines · programs · geoms · textures\n * virtual live render targets + total resolution, FBO bytes vs budget,\n * textures the island phase census as a segmented bar, repaint/evict counters\n * lod zoom → hysteresis band → effective DPR, live targets per band\n * widgets Visible vs Culled population\n *\n * All values land via `textContent` (never innerHTML with data). Rendering is\n * throttled — pushes arrive per composited frame, the DOM refreshes at ~8 Hz.\n */\n\n/** Mirror of @ice/r3f `GlFrameStats` (structural — see the header). */\nexport interface GlPanelStats {\n readonly cpuMs: number;\n readonly gpuMs: number;\n readonly fps: number;\n readonly drawCalls: number;\n readonly triangles: number;\n readonly points: number;\n readonly lines: number;\n readonly programs: number;\n readonly geometries: number;\n readonly textures: number;\n readonly renderTargets: number;\n readonly renderMegaPixels: number;\n readonly fboBytes: number;\n readonly fboBudgetBytes: number;\n readonly islands: {\n readonly total: number;\n readonly hot: number;\n readonly warm: number;\n readonly waking: number;\n readonly cold: number;\n readonly dormant: number;\n };\n readonly bandHistogram: Readonly<Record<string, number>>;\n readonly repainted: number;\n readonly pendingPaints: number;\n readonly evicted: number;\n readonly zoom: number;\n readonly band: number;\n readonly effectiveDpr: number;\n readonly visibleWidgets: number;\n readonly culledWidgets: number;\n}\n\nexport type GlPanelCorner = \"tl\" | \"tr\" | \"bl\" | \"br\";\n\nexport interface GlPanelOptions {\n readonly container?: HTMLElement;\n readonly corner?: GlPanelCorner;\n /** Frame budget in ms — the sparkline's reference line (default 16.7). */\n readonly budgetMs?: number;\n /** Start with the detail body open (default false). */\n readonly expanded?: boolean;\n}\n\nexport interface GlPanel {\n push(stats: GlPanelStats): void;\n dispose(): void;\n}\n\nconst STYLE_ID = \"ice-gl-style\";\n\n// strata-prof's palette, verbatim — the panels must read as one toolset.\nconst CSS = `\n.ice-gl { position: fixed; z-index: 99998; background: rgba(13,17,23,.96);\n border: 1px solid #30363d; border-radius: 10px; color: #e6edf3;\n font: 11px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace;\n box-shadow: 0 6px 22px rgba(0,0,0,.45); user-select: none; }\n.ice-gl * { box-sizing: border-box; }\n.ice-gl.tl { top: 10px; left: 10px; } .ice-gl.tr { top: 10px; right: 10px; }\n.ice-gl.bl { bottom: 10px; left: 10px; } .ice-gl.br { bottom: 10px; right: 10px; }\n.ice-gl-head { display: flex; align-items: center; gap: 8px; padding: 6px 9px; cursor: pointer; }\n.ice-gl-name { font-weight: 700; color: #56d4dd; }\n.ice-gl-fps { font-weight: 700; color: #a371f7; min-width: 46px; }\n.ice-gl-gpu { color: #8b949e; min-width: 74px; }\n.ice-gl-caret { color: #8b949e; margin-left: auto; }\n.ice-gl-body { display: none; border-top: 1px solid #21262d; padding: 7px 9px 8px; min-width: 300px; }\n.ice-gl.open .ice-gl-body { display: block; }\n.ice-gl-sect { color: #8b949e; font-weight: 700; padding: 5px 0 2px; }\n.ice-gl-row { display: flex; align-items: center; gap: 7px; padding: 1px 0; white-space: nowrap; }\n.ice-gl-name2 { min-width: 64px; color: #8b949e; }\n.ice-gl-bar { flex: 1; height: 5px; border-radius: 3px; background: #21262d; overflow: hidden; }\n.ice-gl-bar > i { display: block; height: 100%; background: #58a6ff; border-radius: 3px; }\n.ice-gl-stat { color: #e6edf3; margin-left: auto; }\n.ice-gl-dim { color: #8b949e; }\n.ice-gl-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 3px 10px; padding: 2px 0; }\n.ice-gl-cell b { display: block; color: #e6edf3; font-weight: 700; }\n.ice-gl-cell span { color: #8b949e; }\n.ice-gl-seg { display: flex; height: 7px; border-radius: 3px; overflow: hidden; background: #21262d; margin: 3px 0 2px; }\n.ice-gl-seg > i { display: block; height: 100%; }\n.ice-gl-legend { color: #8b949e; padding-bottom: 2px; }\n`;\n\nconst PHASE_COLORS: Readonly<Record<string, string>> = {\n hot: \"#ff7b72\",\n waking: \"#58a6ff\",\n warm: \"#3fb950\",\n cold: \"#8b949e\",\n dormant: \"#484f58\",\n};\n\nconst SPARK_W = 132;\nconst SPARK_H = 26;\nconst SPARK_SAMPLES = SPARK_W / 2;\n\nfunction injectStyle(doc: Document): void {\n if (doc.getElementById(STYLE_ID) !== null) return;\n const el = doc.createElement(\"style\");\n el.id = STYLE_ID;\n el.textContent = CSS;\n doc.head.appendChild(el);\n}\n\nconst fmtInt = (n: number): string => n.toLocaleString();\nconst fmtK = (n: number): string => (n >= 1e6 ? `${(n / 1e6).toFixed(2)}M` : n >= 1e3 ? `${(n / 1e3).toFixed(1)}k` : String(n));\nconst fmtMs = (ms: number): string => `${ms.toFixed(2)}ms`;\nconst fmtMB = (b: number): string => `${(b / 1048576).toFixed(0)}MB`;\n\nexport function createGlPanel(opts: GlPanelOptions = {}): GlPanel {\n const container = opts.container ?? document.body;\n const doc = container.ownerDocument;\n const budgetMs = opts.budgetMs ?? 16.7;\n injectStyle(doc);\n\n const root = doc.createElement(\"div\");\n root.className = `ice-gl ${opts.corner ?? \"bl\"}${opts.expanded === true ? \" open\" : \"\"}`;\n\n const head = doc.createElement(\"div\");\n head.className = \"ice-gl-head\";\n const name = doc.createElement(\"span\");\n name.className = \"ice-gl-name\";\n name.textContent = \"ice gl\";\n const fpsEl = doc.createElement(\"span\");\n fpsEl.className = \"ice-gl-fps\";\n const gpuEl = doc.createElement(\"span\");\n gpuEl.className = \"ice-gl-gpu\";\n const spark = doc.createElement(\"canvas\");\n spark.width = SPARK_W;\n spark.height = SPARK_H;\n spark.style.display = \"block\";\n const caret = doc.createElement(\"span\");\n caret.className = \"ice-gl-caret\";\n caret.textContent = \"▾\";\n head.append(name, fpsEl, gpuEl, spark, caret);\n head.addEventListener(\"click\", () => root.classList.toggle(\"open\"));\n\n const body = doc.createElement(\"div\");\n body.className = \"ice-gl-body\";\n root.append(head, body);\n container.appendChild(root);\n\n // --- static skeleton (rebuilt values only — no per-push DOM churn) --------\n const sect = (label: string): void => {\n const s = doc.createElement(\"div\");\n s.className = \"ice-gl-sect\";\n s.textContent = label;\n body.appendChild(s);\n };\n const bar = (label: string): { fill: HTMLElement; stat: HTMLElement } => {\n const row = doc.createElement(\"div\");\n row.className = \"ice-gl-row\";\n const n = doc.createElement(\"span\");\n n.className = \"ice-gl-name2\";\n n.textContent = label;\n const b = doc.createElement(\"div\");\n b.className = \"ice-gl-bar\";\n const fill = doc.createElement(\"i\");\n b.appendChild(fill);\n const stat = doc.createElement(\"span\");\n stat.className = \"ice-gl-stat\";\n row.append(n, b, stat);\n body.appendChild(row);\n return { fill, stat };\n };\n const textRow = (): HTMLElement => {\n const row = doc.createElement(\"div\");\n row.className = \"ice-gl-row\";\n body.appendChild(row);\n return row;\n };\n\n sect(\"frame\");\n const cpuBar = bar(\"cpu\");\n const gpuBar = bar(\"gpu\");\n\n sect(\"render\");\n const grid = doc.createElement(\"div\");\n grid.className = \"ice-gl-grid\";\n body.appendChild(grid);\n const cell = (label: string): HTMLElement => {\n const c = doc.createElement(\"div\");\n c.className = \"ice-gl-cell\";\n const v = doc.createElement(\"b\");\n const l = doc.createElement(\"span\");\n l.textContent = label;\n c.append(v, l);\n grid.appendChild(c);\n return v;\n };\n const callsEl = cell(\"calls\");\n const trisEl = cell(\"triangles\");\n const ptsEl = cell(\"pts+lines\");\n const progsEl = cell(\"programs\");\n const geosEl = cell(\"geometries\");\n const texsEl = cell(\"textures\");\n\n sect(\"virtual textures\");\n const rtRow = textRow();\n const fboBar = bar(\"fbo mem\");\n const seg = doc.createElement(\"div\");\n seg.className = \"ice-gl-seg\";\n body.appendChild(seg);\n const legend = doc.createElement(\"div\");\n legend.className = \"ice-gl-legend\";\n body.appendChild(legend);\n const paintRow = textRow();\n\n sect(\"lod\");\n const lodRow = textRow();\n const bandsRow = textRow();\n\n sect(\"widgets\");\n const cullBar = bar(\"visible\");\n\n // --- push/render (throttled) ----------------------------------------------\n const samples: number[] = [];\n let latest: GlPanelStats | undefined;\n let maxCpu = 0;\n let maxGpu = 0;\n let evictedTotal = 0;\n let lastRender = 0;\n let disposed = false;\n\n const drawSpark = (): void => {\n const ctx = spark.getContext(\"2d\");\n if (ctx === null) return;\n ctx.clearRect(0, 0, SPARK_W, SPARK_H);\n const top = budgetMs * 2; // budget sits mid-height\n for (let i = 0; i < samples.length; i++) {\n const v = samples[i] ?? 0;\n const h = Math.min(SPARK_H, (v / top) * SPARK_H);\n ctx.fillStyle = v > budgetMs ? \"#ff7b72\" : \"#3fb950\";\n ctx.fillRect(i * 2, SPARK_H - h, 1.6, h);\n }\n ctx.fillStyle = \"rgba(139,148,158,.55)\";\n ctx.fillRect(0, SPARK_H / 2, SPARK_W, 1);\n };\n\n const render = (): void => {\n const s = latest;\n if (s === undefined) return;\n fpsEl.textContent = s.fps > 0 ? `${Math.round(s.fps)} fps` : \"– fps\";\n gpuEl.textContent = s.gpuMs > 0 ? `gpu ${fmtMs(s.gpuMs)}` : \"gpu –\";\n drawSpark();\n if (!root.classList.contains(\"open\")) return;\n\n cpuBar.fill.style.width = `${Math.min(100, (s.cpuMs / budgetMs) * 100)}%`;\n cpuBar.stat.textContent = `${fmtMs(s.cpuMs)} · max ${fmtMs(maxCpu)}`;\n gpuBar.fill.style.width = `${Math.min(100, (s.gpuMs / budgetMs) * 100)}%`;\n gpuBar.fill.style.background = s.gpuMs > budgetMs ? \"#ff7b72\" : \"#58a6ff\";\n gpuBar.stat.textContent = `${fmtMs(s.gpuMs)} · max ${fmtMs(maxGpu)}`;\n\n callsEl.textContent = fmtInt(s.drawCalls);\n trisEl.textContent = fmtK(s.triangles);\n ptsEl.textContent = fmtK(s.points + s.lines);\n progsEl.textContent = fmtInt(s.programs);\n geosEl.textContent = fmtInt(s.geometries);\n texsEl.textContent = fmtInt(s.textures);\n\n rtRow.textContent = `${s.renderTargets} targets · ${s.renderMegaPixels.toFixed(1)} MP total`;\n fboBar.fill.style.width = `${Math.min(100, (s.fboBytes / s.fboBudgetBytes) * 100)}%`;\n fboBar.fill.style.background = s.fboBytes > s.fboBudgetBytes * 0.85 ? \"#ffa657\" : \"#58a6ff\";\n fboBar.stat.textContent = `${fmtMB(s.fboBytes)} / ${fmtMB(s.fboBudgetBytes)}`;\n\n seg.textContent = \"\";\n const phases: Array<[string, number]> = [\n [\"hot\", s.islands.hot],\n [\"waking\", s.islands.waking],\n [\"warm\", s.islands.warm],\n [\"cold\", s.islands.cold],\n [\"dormant\", s.islands.dormant],\n ];\n const denom = Math.max(1, s.islands.total);\n const legendParts: string[] = [];\n for (const [phase, count] of phases) {\n if (count === 0) continue;\n const i = doc.createElement(\"i\");\n i.style.width = `${(count / denom) * 100}%`;\n i.style.background = PHASE_COLORS[phase] ?? \"#8b949e\";\n seg.appendChild(i);\n legendParts.push(`${count} ${phase}`);\n }\n legend.textContent = legendParts.length > 0 ? legendParts.join(\" · \") : \"no islands\";\n paintRow.textContent = `repainted ${s.repainted}/frame · pending ${s.pendingPaints} · evicted Σ${evictedTotal}`;\n\n lodRow.textContent = `zoom ${(s.zoom * 100).toFixed(0)}% → band ×${s.band} → paint dpr ${s.effectiveDpr.toFixed(2)}`;\n const bands = Object.entries(s.bandHistogram).sort((a, b) => a[0].localeCompare(b[0]));\n bandsRow.textContent =\n bands.length > 0 ? `targets by band: ${bands.map(([k, v]) => `${k}: ${v}`).join(\" · \")}` : \"no live targets\";\n\n const pop = Math.max(1, s.visibleWidgets + s.culledWidgets);\n cullBar.fill.style.width = `${(s.visibleWidgets / pop) * 100}%`;\n cullBar.fill.style.background = \"#3fb950\";\n cullBar.stat.textContent = `${s.visibleWidgets} visible · ${s.culledWidgets} culled`;\n };\n\n return {\n push(s) {\n if (disposed) return;\n latest = s;\n maxCpu = Math.max(maxCpu, s.cpuMs);\n maxGpu = Math.max(maxGpu, s.gpuMs);\n evictedTotal += s.evicted;\n samples.push(s.gpuMs > 0 ? s.gpuMs : s.cpuMs);\n if (samples.length > SPARK_SAMPLES) samples.splice(0, samples.length - SPARK_SAMPLES);\n const now = performance.now();\n if (now - lastRender >= 120) {\n lastRender = now;\n render();\n }\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n root.remove();\n },\n };\n}\n","/**\n * @ice/devtools — strata's observer panel + FPS profiler, engine-flavored\n * (describe/durable/ephemeral/reflect-lane glue). Reads the world outside the\n * tick; never a reflector, never writes ECS. Nobody imports us\n * (depcruise-enforced leaf).\n */\nexport const DEVTOOLS_VERSION = \"0.1.0\";\n\nexport {\n attachDevtools,\n engineDescribe,\n type DevtoolsEngine,\n type DevtoolsHandle,\n type DevtoolsOpts,\n} from \"./attach\";\nexport { createDock, type Dock, type DockCorner, type DockOptions, type DockSlotId } from \"./dock\";\nexport { createGlPanel, type GlPanel, type GlPanelCorner, type GlPanelOptions, type GlPanelStats } from \"./gl-panel\";\n"],"mappings":"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","names":["w","STYLE_ID","CSS","injectStyle"]}
|
package/dist/dom.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import {
|
|
2
|
-
DEFAULT_GRID_CONFIG,
|
|
3
|
-
DEFAULT_WIRES_CONFIG,
|
|
4
2
|
DOM_VERSION,
|
|
5
3
|
attachMeasureAdapter,
|
|
6
4
|
attachPointerAdapter,
|
|
@@ -9,19 +7,15 @@ import {
|
|
|
9
7
|
createCursorReflector,
|
|
10
8
|
createDomWidgetsReflector,
|
|
11
9
|
createGrayboxReflector,
|
|
12
|
-
createGridReflector,
|
|
13
10
|
createPlaneTransformReflector,
|
|
14
11
|
createPlanes,
|
|
15
12
|
createRemoteCursorsReflector,
|
|
16
|
-
createWiresReflector,
|
|
17
13
|
startRafLoop,
|
|
18
14
|
wireMeasurement
|
|
19
|
-
} from "./chunk-
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-
|
|
15
|
+
} from "./chunk-PKK6GLSA.js";
|
|
16
|
+
import "./chunk-5QY7HK6G.js";
|
|
17
|
+
import "./chunk-OR5FNVUE.js";
|
|
22
18
|
export {
|
|
23
|
-
DEFAULT_GRID_CONFIG,
|
|
24
|
-
DEFAULT_WIRES_CONFIG,
|
|
25
19
|
DOM_VERSION,
|
|
26
20
|
attachMeasureAdapter,
|
|
27
21
|
attachPointerAdapter,
|
|
@@ -30,11 +24,9 @@ export {
|
|
|
30
24
|
createCursorReflector,
|
|
31
25
|
createDomWidgetsReflector,
|
|
32
26
|
createGrayboxReflector,
|
|
33
|
-
createGridReflector,
|
|
34
27
|
createPlaneTransformReflector,
|
|
35
28
|
createPlanes,
|
|
36
29
|
createRemoteCursorsReflector,
|
|
37
|
-
createWiresReflector,
|
|
38
30
|
startRafLoop,
|
|
39
31
|
wireMeasurement
|
|
40
32
|
};
|