@vibecook/ice 0.10.0 → 0.14.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 +79 -50
- package/dist/chunk-BA7XJC27.js +2429 -0
- package/dist/chunk-BA7XJC27.js.map +1 -0
- package/dist/chunk-BKV4ZEU3.js +1 -0
- package/dist/chunk-BKV4ZEU3.js.map +1 -0
- package/dist/{chunk-5FQS7V2C.js → chunk-DYK6KNLG.js} +13303 -7485
- package/dist/chunk-DYK6KNLG.js.map +1 -0
- package/dist/chunk-ENIFIUEP.js +155 -0
- package/dist/chunk-ENIFIUEP.js.map +1 -0
- package/dist/chunk-IBWWLA6D.js +634 -0
- package/dist/chunk-IBWWLA6D.js.map +1 -0
- package/dist/{chunk-OR5FNVUE.js → chunk-JS6PG6YD.js} +398 -167
- package/dist/chunk-JS6PG6YD.js.map +1 -0
- package/dist/chunk-QXOCF56A.js +148 -0
- package/dist/chunk-QXOCF56A.js.map +1 -0
- package/dist/chunk-ZPUPBULB.js +7399 -0
- package/dist/chunk-ZPUPBULB.js.map +1 -0
- package/dist/desk-engine.js +36 -0
- package/dist/desk-engine.js.map +1 -0
- package/dist/desk-kit.js +244 -0
- package/dist/desk-kit.js.map +1 -0
- package/dist/desk-objects.js +12728 -0
- package/dist/desk-objects.js.map +1 -0
- package/dist/desk.js +469 -0
- package/dist/desk.js.map +1 -0
- package/dist/devtools.js +233 -189
- package/dist/devtools.js.map +1 -1
- package/dist/dom.js +7 -19
- package/dist/index.js +232 -20
- package/dist/kernel.js +53 -25
- package/dist/react.js +1045 -38
- package/dist/react.js.map +1 -1
- package/dist/types/packages/core/src/behavior/define-behavior.d.ts +11 -0
- package/dist/types/packages/core/src/behavior/runtime.d.ts +4 -0
- package/dist/types/packages/core/src/canvas/define-canvas-type.d.ts +86 -0
- package/dist/types/packages/core/src/canvas/define-container.d.ts +17 -0
- package/dist/types/packages/core/src/canvas/diagnostics.d.ts +27 -0
- package/dist/types/packages/core/src/canvas/engine-catalog.d.ts +70 -0
- package/dist/types/packages/core/src/canvas/extensions.d.ts +125 -0
- package/dist/types/packages/core/src/canvas/frame-behavior-host.d.ts +16 -0
- package/dist/types/packages/core/src/canvas/frame-preview.d.ts +79 -0
- package/dist/types/packages/core/src/canvas/frame-projection.d.ts +38 -0
- package/dist/types/packages/core/src/canvas/frame-view.d.ts +36 -0
- package/dist/types/packages/core/src/canvas/migrate.d.ts +14 -0
- package/dist/types/packages/core/src/canvas/placement.d.ts +30 -0
- package/dist/types/packages/core/src/canvas/presentation-transition.d.ts +100 -0
- package/dist/types/packages/core/src/canvas/runtime-extension-host.d.ts +16 -0
- package/dist/types/packages/core/src/canvas/session.d.ts +47 -0
- package/dist/types/packages/core/src/catalog/camera-derived.d.ts +16 -27
- package/dist/types/packages/core/src/catalog/desk.d.ts +326 -0
- package/dist/types/packages/core/src/catalog/gesture.d.ts +51 -0
- package/dist/types/packages/core/src/catalog/graph.d.ts +2 -2
- package/dist/types/packages/core/src/catalog/index.d.ts +2 -0
- package/dist/types/packages/core/src/catalog/pointer.d.ts +42 -0
- package/dist/types/packages/core/src/catalog/selection-presence.d.ts +7 -0
- package/dist/types/packages/core/src/catalog/settings-resources.d.ts +28 -2
- package/dist/types/packages/core/src/catalog/surface.d.ts +1 -0
- package/dist/types/packages/core/src/doc/doc-commit-sink.d.ts +18 -2
- package/dist/types/packages/core/src/doc/doc-kit.d.ts +21 -2
- package/dist/types/packages/core/src/doc/envelope.d.ts +5 -2
- package/dist/types/packages/core/src/doc/schema-migrate.d.ts +1 -1
- package/dist/types/packages/core/src/doc/version-gate.d.ts +21 -3
- package/dist/types/packages/core/src/engine/commit-sink.d.ts +10 -1
- package/dist/types/packages/core/src/engine/engine.d.ts +6 -0
- package/dist/types/packages/core/src/engine/frame-control.d.ts +74 -0
- package/dist/types/packages/core/src/engine/guests.d.ts +4 -1
- package/dist/types/packages/core/src/engine/world-doors.d.ts +12 -0
- package/dist/types/packages/core/src/facade/create-canvas-engine.d.ts +146 -13
- package/dist/types/packages/core/src/index.d.ts +34 -13
- package/dist/types/packages/core/src/input/queue.d.ts +3 -1
- package/dist/types/packages/core/src/interaction/install.d.ts +30 -0
- package/dist/types/packages/core/src/interaction/wakes.d.ts +24 -0
- package/dist/types/packages/core/src/nav/nav-geometry.d.ts +100 -0
- package/dist/types/packages/core/src/nav/nested-canvas.d.ts +47 -4
- package/dist/types/packages/core/src/ops/cascade.d.ts +2 -1
- package/dist/types/packages/core/src/ops/claims.d.ts +6 -0
- package/dist/types/packages/core/src/ops/insert.d.ts +4 -0
- package/dist/types/packages/core/src/ops/point-pick.d.ts +4 -1
- package/dist/types/packages/core/src/ops/sibling-order.d.ts +14 -4
- package/dist/types/packages/core/src/ops/tray.d.ts +48 -0
- package/dist/types/packages/core/src/presence/presence-kit.d.ts +5 -0
- package/dist/types/packages/core/src/schema/meta.d.ts +10 -0
- package/dist/types/packages/core/src/schema/prefab.d.ts +8 -0
- package/dist/types/packages/core/src/settings/defaults.d.ts +25 -6
- package/dist/types/packages/core/src/surface/gpu-device.d.ts +55 -0
- package/dist/types/packages/core/src/systems/camera-sim.d.ts +29 -0
- package/dist/types/packages/core/src/systems/chrome.d.ts +15 -23
- package/dist/types/packages/core/src/systems/drag-mods.d.ts +34 -0
- package/dist/types/packages/core/src/systems/held.d.ts +71 -0
- package/dist/types/packages/core/src/systems/insert-ghost.d.ts +2 -0
- package/dist/types/packages/core/src/systems/l0-input.d.ts +14 -0
- package/dist/types/packages/core/src/systems/l1-pick.d.ts +37 -1
- package/dist/types/packages/core/src/systems/l2-arbitrate.d.ts +18 -4
- package/dist/types/packages/core/src/systems/l3-behave.d.ts +4 -1
- package/dist/types/packages/core/src/systems/l3-claim.d.ts +7 -0
- package/dist/types/packages/core/src/systems/l3-connect.d.ts +1 -1
- package/dist/types/packages/core/src/systems/l3-drop.d.ts +30 -1
- package/dist/types/packages/core/src/systems/l3-marquee.d.ts +2 -1
- package/dist/types/packages/core/src/systems/l3-ports.d.ts +1 -1
- package/dist/types/packages/core/src/systems/l4-cursor.d.ts +5 -0
- package/dist/types/packages/core/src/systems/nav-flight.d.ts +85 -3
- package/dist/types/packages/core/src/systems/nav-tap.d.ts +44 -0
- package/dist/types/packages/core/src/systems/press-wheel.d.ts +11 -0
- package/dist/types/packages/core/src/systems/tray.d.ts +108 -0
- package/dist/types/packages/core/src/systems/zoom-through.d.ts +30 -0
- package/dist/types/packages/core/src/tools/define-tool.d.ts +10 -0
- package/dist/types/packages/core/src/widget/define-widget.d.ts +166 -63
- package/dist/types/packages/core/src/widget/equip.d.ts +14 -2
- package/dist/types/packages/core/src/widget/held-tools.d.ts +83 -0
- package/dist/types/packages/core/src/widget/menu-actions.d.ts +44 -0
- package/dist/types/packages/core/src/widget/mount-store.d.ts +21 -46
- package/dist/types/packages/core/src/widget/spawn.d.ts +1 -1
- package/dist/types/packages/desk/src/assets/blue-noise.gen.d.ts +10 -0
- package/dist/types/packages/desk/src/card/card.d.ts +103 -0
- package/dist/types/packages/desk/src/compose/ambient.d.ts +59 -0
- package/dist/types/packages/desk/src/compose/builder.d.ts +285 -0
- package/dist/types/packages/desk/src/compose/children.d.ts +3 -0
- package/dist/types/packages/desk/src/compose/index.d.ts +14 -0
- package/dist/types/packages/desk/src/compose/marks.d.ts +126 -0
- package/dist/types/packages/desk/src/compose/pick.d.ts +5 -0
- package/dist/types/packages/desk/src/compose/reflector.d.ts +111 -0
- package/dist/types/packages/desk/src/compose/tap.d.ts +5 -0
- package/dist/types/packages/desk/src/docs.d.ts +23 -0
- package/dist/types/packages/desk/src/engine/budget.d.ts +38 -0
- package/dist/types/packages/desk/src/engine/device.d.ts +54 -0
- package/dist/types/packages/desk/src/engine/index.d.ts +5 -0
- package/dist/types/packages/desk/src/engine/pipeline.d.ts +36 -0
- package/dist/types/packages/desk/src/engine/rasters.d.ts +66 -0
- package/dist/types/packages/desk/src/engine/records.d.ts +56 -0
- package/dist/types/packages/desk/src/engine/shader.d.ts +22 -0
- package/dist/types/packages/desk/src/engine/struct.d.ts +39 -0
- package/dist/types/packages/desk/src/engine/target.d.ts +26 -0
- package/dist/types/packages/desk/src/gpu-ablation.d.ts +61 -0
- package/dist/types/packages/desk/src/gpu-memory.d.ts +54 -0
- package/dist/types/packages/desk/src/gpu-profiler.d.ts +141 -0
- package/dist/types/packages/desk/src/gpu-wrap.d.ts +8 -0
- package/dist/types/packages/desk/src/ground.d.ts +388 -0
- package/dist/types/packages/desk/src/hold/focus.d.ts +53 -0
- package/dist/types/packages/desk/src/hold/pose.d.ts +132 -0
- package/dist/types/packages/desk/src/hold/shaders.d.ts +9 -0
- package/dist/types/packages/desk/src/host/editor.d.ts +18 -0
- package/dist/types/packages/desk/src/host/index.d.ts +9 -0
- package/dist/types/packages/desk/src/host/ink.d.ts +18 -0
- package/dist/types/packages/desk/src/host/layer.d.ts +430 -0
- package/dist/types/packages/desk/src/host/picture.d.ts +2 -0
- package/dist/types/packages/desk/src/host/surface.d.ts +5 -0
- package/dist/types/packages/desk/src/index.d.ts +13 -0
- package/dist/types/packages/desk/src/kind.d.ts +187 -0
- package/dist/types/packages/desk/src/kinds/world.d.ts +429 -0
- package/dist/types/packages/desk/src/kit/arrays.d.ts +88 -0
- package/dist/types/packages/desk/src/kit/blobs.d.ts +40 -0
- package/dist/types/packages/desk/src/kit/book.d.ts +2 -0
- package/dist/types/packages/desk/src/kit/editor.d.ts +103 -0
- package/dist/types/packages/desk/src/kit/eye.d.ts +37 -0
- package/dist/types/packages/desk/src/kit/hold.d.ts +1 -0
- package/dist/types/packages/desk/src/kit/index.d.ts +26 -0
- package/dist/types/packages/desk/src/kit/inside.d.ts +116 -0
- package/dist/types/packages/desk/src/kit/layer.d.ts +159 -0
- package/dist/types/packages/desk/src/kit/light.d.ts +3 -0
- package/dist/types/packages/desk/src/kit/mesh.d.ts +29 -0
- package/dist/types/packages/desk/src/kit/mips.d.ts +2 -0
- package/dist/types/packages/desk/src/kit/nav.d.ts +2 -0
- package/dist/types/packages/desk/src/kit/paper-tex.d.ts +5 -0
- package/dist/types/packages/desk/src/kit/physics.d.ts +44 -0
- package/dist/types/packages/desk/src/kit/place.d.ts +44 -0
- package/dist/types/packages/desk/src/kit/print.d.ts +30 -0
- package/dist/types/packages/desk/src/kit/raster.d.ts +34 -0
- package/dist/types/packages/desk/src/kit/sdf.d.ts +1 -0
- package/dist/types/packages/desk/src/kit/seeds.d.ts +11 -0
- package/dist/types/packages/desk/src/kit/services.d.ts +34 -0
- package/dist/types/packages/desk/src/kit/springs.d.ts +12 -0
- package/dist/types/packages/desk/src/kit/strokes.d.ts +93 -0
- package/dist/types/packages/desk/src/kit/text.d.ts +142 -0
- package/dist/types/packages/desk/src/kit/uniform.d.ts +8 -0
- package/dist/types/packages/desk/src/kit/view.d.ts +39 -0
- package/dist/types/packages/desk/src/kit/wgsl.d.ts +15 -0
- package/dist/types/packages/desk/src/lattice/line.d.ts +15 -0
- package/dist/types/packages/desk/src/lattice/lod.d.ts +52 -0
- package/dist/types/packages/desk/src/lattice/ruler.d.ts +88 -0
- package/dist/types/packages/desk/src/marks/assemble.d.ts +65 -0
- package/dist/types/packages/desk/src/marks/ease.d.ts +4 -0
- package/dist/types/packages/desk/src/marks/laser.d.ts +41 -0
- package/dist/types/packages/desk/src/marks/layout.d.ts +167 -0
- package/dist/types/packages/desk/src/marks/pass.d.ts +59 -0
- package/dist/types/packages/desk/src/marks/shaders.d.ts +12 -0
- package/dist/types/packages/desk/src/mat/grid.d.ts +50 -0
- package/dist/types/packages/desk/src/mat/lamp.d.ts +14 -0
- package/dist/types/packages/desk/src/mat/layout.d.ts +144 -0
- package/dist/types/packages/desk/src/mat/mat-pass.d.ts +83 -0
- package/dist/types/packages/desk/src/mat/night.d.ts +95 -0
- package/dist/types/packages/desk/src/mat/projector.d.ts +39 -0
- package/dist/types/packages/desk/src/mat/shaders.d.ts +17 -0
- package/dist/types/packages/desk/src/mat/tilt.d.ts +14 -0
- package/dist/types/packages/desk/src/nav/flight.d.ts +186 -0
- package/dist/types/packages/desk/src/nav/portal.d.ts +95 -0
- package/dist/types/packages/desk/src/object.d.ts +46 -0
- package/dist/types/packages/desk/src/pass-instrument.d.ts +89 -0
- package/dist/types/packages/desk/src/shaders.d.ts +12 -0
- package/dist/types/packages/desk/src/shaders.gen.d.ts +16 -0
- package/dist/types/packages/desk/src/submit-instrument.d.ts +36 -0
- package/dist/types/packages/desk/src/theme.d.ts +475 -0
- package/dist/types/packages/desk/src/tray/carry.d.ts +99 -0
- package/dist/types/packages/desk/src/tray/drawer.d.ts +113 -0
- package/dist/types/packages/desk/src/tray/flux.d.ts +46 -0
- package/dist/types/packages/desk/src/tray/index.d.ts +4 -0
- package/dist/types/packages/desk/src/tray/lattice.d.ts +71 -0
- package/dist/types/packages/desk/src/tray/layout.d.ts +7 -0
- package/dist/types/packages/desk/src/tray/look.d.ts +29 -0
- package/dist/types/packages/desk/src/tray/pass.d.ts +96 -0
- package/dist/types/packages/desk/src/tray/shaders.d.ts +10 -0
- package/dist/types/packages/desk/src/tray/specimens.d.ts +199 -0
- package/dist/types/packages/devtools/src/attach.d.ts +22 -8
- package/dist/types/packages/devtools/src/dock.d.ts +18 -14
- package/dist/types/packages/devtools/src/gpu-panel.d.ts +105 -0
- package/dist/types/packages/devtools/src/index.d.ts +5 -4
- package/dist/types/packages/dom/src/desk-host.d.ts +91 -0
- package/dist/types/packages/dom/src/host.d.ts +13 -14
- package/dist/types/packages/dom/src/index.d.ts +12 -10
- package/dist/types/packages/dom/src/loop.d.ts +18 -1
- package/dist/types/packages/dom/src/pointer-adapter.d.ts +5 -29
- package/dist/types/packages/dom/src/widget-focus.d.ts +17 -13
- package/dist/types/packages/ice/src/desk-engine.d.ts +2 -0
- package/dist/types/packages/ice/src/desk-kit.d.ts +6 -0
- package/dist/types/packages/ice/src/desk-objects.d.ts +5 -0
- package/dist/types/packages/ice/src/desk.d.ts +5 -0
- package/dist/types/packages/kernel/src/atlas-pack.d.ts +157 -0
- package/dist/types/packages/kernel/src/bezier.d.ts +0 -15
- package/dist/types/packages/kernel/src/coords.d.ts +0 -39
- package/dist/types/packages/kernel/src/index.d.ts +2 -2
- package/dist/types/packages/kernel/src/nav-flight.d.ts +6 -0
- package/dist/types/packages/kernel/src/tray.d.ts +155 -0
- package/dist/types/packages/objects/src/board/board-pass.d.ts +180 -0
- package/dist/types/packages/objects/src/board/board-pen.d.ts +36 -0
- package/dist/types/packages/objects/src/board/board.d.ts +104 -0
- package/dist/types/packages/objects/src/board/data.d.ts +31 -0
- package/dist/types/packages/objects/src/board/history.d.ts +33 -0
- package/dist/types/packages/objects/src/board/kind.d.ts +208 -0
- package/dist/types/packages/objects/src/board/layout.d.ts +102 -0
- package/dist/types/packages/objects/src/board/object.d.ts +7 -0
- package/dist/types/packages/objects/src/board/pen.d.ts +71 -0
- package/dist/types/packages/objects/src/board/shaders.d.ts +36 -0
- package/dist/types/packages/objects/src/board/stroke.d.ts +99 -0
- package/dist/types/packages/objects/src/board/theme.d.ts +150 -0
- package/dist/types/packages/objects/src/calendar/data.d.ts +97 -0
- package/dist/types/packages/objects/src/calendar/events.d.ts +58 -0
- package/dist/types/packages/objects/src/calendar/hand.d.ts +53 -0
- package/dist/types/packages/objects/src/calendar/host/input.d.ts +67 -0
- package/dist/types/packages/objects/src/calendar/host/print.d.ts +9 -0
- package/dist/types/packages/objects/src/calendar/kind.d.ts +297 -0
- package/dist/types/packages/objects/src/calendar/law.d.ts +151 -0
- package/dist/types/packages/objects/src/calendar/layout.d.ts +47 -0
- package/dist/types/packages/objects/src/calendar/month.d.ts +75 -0
- package/dist/types/packages/objects/src/calendar/object.d.ts +45 -0
- package/dist/types/packages/objects/src/calendar/pad.d.ts +42 -0
- package/dist/types/packages/objects/src/calendar/pass.d.ts +229 -0
- package/dist/types/packages/objects/src/calendar/print.d.ts +87 -0
- package/dist/types/packages/objects/src/calendar/printing.d.ts +80 -0
- package/dist/types/packages/objects/src/calendar/roll.d.ts +45 -0
- package/dist/types/packages/objects/src/calendar/shaders.d.ts +12 -0
- package/dist/types/packages/objects/src/calendar/sheet.d.ts +43 -0
- package/dist/types/packages/objects/src/calendar/tiles.d.ts +67 -0
- package/dist/types/packages/objects/src/calendar/turn.d.ts +73 -0
- package/dist/types/packages/objects/src/calendar/writing.d.ts +42 -0
- package/dist/types/packages/objects/src/index.d.ts +22 -0
- package/dist/types/packages/objects/src/kinds.d.ts +24 -0
- package/dist/types/packages/objects/src/minimat/inside.d.ts +17 -0
- package/dist/types/packages/objects/src/minimat/kind.d.ts +51 -0
- package/dist/types/packages/objects/src/minimat/layout.d.ts +83 -0
- package/dist/types/packages/objects/src/minimat/minimat.d.ts +179 -0
- package/dist/types/packages/objects/src/minimat/object.d.ts +8 -0
- package/dist/types/packages/objects/src/minimat/pass.d.ts +61 -0
- package/dist/types/packages/objects/src/minimat/shaders.d.ts +10 -0
- package/dist/types/packages/objects/src/minimat/theme.d.ts +98 -0
- package/dist/types/packages/objects/src/notebook/ink.d.ts +70 -0
- package/dist/types/packages/objects/src/notebook/kind.d.ts +236 -0
- package/dist/types/packages/objects/src/notebook/law.d.ts +129 -0
- package/dist/types/packages/objects/src/notebook/layout.d.ts +46 -0
- package/dist/types/packages/objects/src/notebook/leaf.d.ts +44 -0
- package/dist/types/packages/objects/src/notebook/mesh.d.ts +20 -0
- package/dist/types/packages/objects/src/notebook/motion.d.ts +107 -0
- package/dist/types/packages/objects/src/notebook/object.d.ts +8 -0
- package/dist/types/packages/objects/src/notebook/pages.d.ts +56 -0
- package/dist/types/packages/objects/src/notebook/pass.d.ts +197 -0
- package/dist/types/packages/objects/src/notebook/pick.d.ts +30 -0
- package/dist/types/packages/objects/src/notebook/raster.d.ts +28 -0
- package/dist/types/packages/objects/src/notebook/shaders.d.ts +11 -0
- package/dist/types/packages/objects/src/notebook/shape.d.ts +155 -0
- package/dist/types/packages/objects/src/notebook/theme.d.ts +76 -0
- package/dist/types/packages/objects/src/palette.d.ts +577 -0
- package/dist/types/packages/objects/src/paper/host/body.d.ts +30 -0
- package/dist/types/packages/objects/src/paper/kind.d.ts +81 -0
- package/dist/types/packages/objects/src/paper/layout.d.ts +73 -0
- package/dist/types/packages/objects/src/paper/object.d.ts +31 -0
- package/dist/types/packages/objects/src/paper/pages.d.ts +43 -0
- package/dist/types/packages/objects/src/paper/paper-pass.d.ts +86 -0
- package/dist/types/packages/objects/src/paper/paper.d.ts +117 -0
- package/dist/types/packages/objects/src/paper/shaders.d.ts +18 -0
- package/dist/types/packages/objects/src/paper/theme.d.ts +58 -0
- package/dist/types/packages/objects/src/paper/typing.d.ts +51 -0
- package/dist/types/packages/objects/src/paper/writing.d.ts +161 -0
- package/dist/types/packages/objects/src/photo/carry.d.ts +33 -0
- package/dist/types/packages/objects/src/photo/kind.d.ts +136 -0
- package/dist/types/packages/objects/src/photo/layout.d.ts +39 -0
- package/dist/types/packages/objects/src/photo/object.d.ts +5 -0
- package/dist/types/packages/objects/src/photo/photo-pass.d.ts +104 -0
- package/dist/types/packages/objects/src/photo/photo.d.ts +262 -0
- package/dist/types/packages/objects/src/photo/pictures.d.ts +152 -0
- package/dist/types/packages/objects/src/photo/sample.d.ts +9 -0
- package/dist/types/packages/objects/src/photo/shaders.d.ts +18 -0
- package/dist/types/packages/objects/src/preset.d.ts +44 -0
- package/dist/types/packages/objects/src/shaders.d.ts +3 -0
- package/dist/types/packages/objects/src/shaders.gen.d.ts +21 -0
- package/dist/types/packages/react/src/canvas-hooks.d.ts +12 -0
- package/dist/types/packages/react/src/desk.d.ts +56 -0
- package/dist/types/packages/react/src/engine-context.d.ts +2 -2
- package/dist/types/packages/react/src/frame-preview-boundary.d.ts +19 -0
- package/dist/types/packages/react/src/hooks.d.ts +9 -14
- package/dist/types/packages/react/src/index.d.ts +16 -9
- package/dist/types/packages/react/src/keymap.d.ts +21 -2
- package/dist/types/packages/react/src/selection-menu.d.ts +171 -0
- package/dist/types/packages/react/src/tray-bar.d.ts +124 -0
- package/package.json +64 -31
- package/dist/chunk-5FQS7V2C.js.map +0 -1
- package/dist/chunk-JWRHAM7L.js +0 -1163
- package/dist/chunk-JWRHAM7L.js.map +0 -1
- package/dist/chunk-MFTMPJUF.js +0 -681
- package/dist/chunk-MFTMPJUF.js.map +0 -1
- package/dist/chunk-OR5FNVUE.js.map +0 -1
- package/dist/ground.js +0 -1213
- package/dist/ground.js.map +0 -1
- package/dist/r3f.js +0 -1644
- package/dist/r3f.js.map +0 -1
- package/dist/types/packages/core/src/input/measure-queue.d.ts +0 -30
- package/dist/types/packages/core/src/settings/ground-config.d.ts +0 -103
- package/dist/types/packages/core/src/systems/measure-ingest.d.ts +0 -26
- package/dist/types/packages/devtools/src/gl-panel.d.ts +0 -69
- package/dist/types/packages/dom/src/measure-adapter.d.ts +0 -31
- package/dist/types/packages/dom/src/measure-wiring.d.ts +0 -49
- package/dist/types/packages/dom/src/planes.d.ts +0 -33
- package/dist/types/packages/dom/src/reflectors/chrome.d.ts +0 -33
- package/dist/types/packages/dom/src/reflectors/dom-widgets.d.ts +0 -59
- package/dist/types/packages/dom/src/reflectors/graybox.d.ts +0 -31
- package/dist/types/packages/dom/src/reflectors/plane-transform.d.ts +0 -38
- package/dist/types/packages/ground/src/index.d.ts +0 -69
- package/dist/types/packages/ground/src/layer.d.ts +0 -40
- package/dist/types/packages/ground/src/pass.d.ts +0 -41
- package/dist/types/packages/ground/src/passes/grid-classic.d.ts +0 -30
- package/dist/types/packages/ground/src/passes/grid-magnet.d.ts +0 -31
- package/dist/types/packages/ground/src/passes/grid.d.ts +0 -28
- package/dist/types/packages/ground/src/passes/guides-collect.d.ts +0 -14
- package/dist/types/packages/ground/src/passes/guides.d.ts +0 -3
- package/dist/types/packages/ground/src/passes/magnet-collect.d.ts +0 -63
- package/dist/types/packages/ground/src/passes/soup-collect.d.ts +0 -35
- package/dist/types/packages/ground/src/passes/soup-mesh.d.ts +0 -8
- package/dist/types/packages/ground/src/passes/wires-collect.d.ts +0 -35
- package/dist/types/packages/ground/src/passes/wires.d.ts +0 -10
- package/dist/types/packages/ground/src/poles.d.ts +0 -47
- package/dist/types/packages/ground/src/renderer.d.ts +0 -15
- package/dist/types/packages/ice/src/ground.d.ts +0 -1
- package/dist/types/packages/ice/src/r3f.d.ts +0 -1
- package/dist/types/packages/kernel/src/eviction.d.ts +0 -23
- package/dist/types/packages/kernel/src/zoom-bands.d.ts +0 -19
- package/dist/types/packages/r3f/src/bridge.d.ts +0 -129
- package/dist/types/packages/r3f/src/composite-material.d.ts +0 -26
- package/dist/types/packages/r3f/src/compositor-pass.d.ts +0 -105
- package/dist/types/packages/r3f/src/dev-write-trap.d.ts +0 -30
- package/dist/types/packages/r3f/src/gl-root.d.ts +0 -96
- package/dist/types/packages/r3f/src/gl-router.d.ts +0 -70
- package/dist/types/packages/r3f/src/index.d.ts +0 -17
- package/dist/types/packages/r3f/src/island-state.d.ts +0 -112
- package/dist/types/packages/r3f/src/island.d.ts +0 -13
- package/dist/types/packages/r3f/src/pool.d.ts +0 -56
- package/dist/types/packages/r3f/src/preview-capture.d.ts +0 -19
- package/dist/types/packages/r3f/src/resource-registry.d.ts +0 -30
- package/dist/types/packages/r3f/src/self-sustain.d.ts +0 -39
- package/dist/types/packages/r3f/src/use-island-frame.d.ts +0 -39
- package/dist/types/packages/react/src/infinite-canvas.d.ts +0 -140
- package/dist/types/packages/react/src/preview-snapshots.d.ts +0 -17
- package/dist/types/packages/react/src/widget-preview.d.ts +0 -14
- package/dist/types/packages/react/src/widget-root.d.ts +0 -33
package/dist/devtools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 //\n // FIXED 2026-08-15 (petition I14): this read `phaseFlushMicros.get(\"reflect\")`,\n // a map keyed by strata PHASE names — and reflect is not a phase, so the\n // lookup was always undefined and the lane NEVER reported since it shipped.\n // `FrameTelemetry.reflectMicros` is the real source (engine.ts arms the\n // reflector registry's own timing from `enableTelemetry`).\n //\n // The GUEST lanes (petition I14, 2026-08-15): guest work runs between the\n // tick and the publish hooks, so — like reflect — no strata in-world hook can\n // see it, and it was previously invisible to the profiler entirely. One lane\n // per guest, reporting its own last invocation; suspended guests stop\n // reporting rather than flatlining at zero, so a silent lane means \"gone\",\n // which is exactly what the doctor's row says too.\n let removePublish: (() => void) | undefined;\n if (profiler !== null) {\n core.enableTelemetry();\n removePublish = core.onPublish(() => {\n const us = core.lastFrame()?.reflectMicros;\n if (us !== undefined && us > 0) profiler.lane(\"reflect\", us / 1000);\n for (const g of core.guests.list()) {\n if (g.status === \"running\" && g.lastMs > 0) profiler.lane(`guest:${g.id}`, g.lastMs);\n }\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"]}
|
|
1
|
+
{"version":3,"sources":["../../devtools/src/attach.ts","../../devtools/src/dock.ts","../../devtools/src/gpu-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 * GPU SLOT (design-016 K2) the WebGPU desk's frames — the GPU span,\n * its passes, draws by kind, pipelines, bind groups,\n * uploads, memory — pushed by the host through `gpuFrame`\n * as the STRUCTURAL MIRROR `GpuPanelFrame` (gpu-panel.ts:\n * devtools cannot import desk; the old GlPanelStats way),\n * mounted at once when configured (`gpu: {…}`), else on\n * the first push; each push also reports the\n * host LANES `desk flush`, `encode` and `gpu` beside\n * strata's per-system lanes. They are readings side by\n * side, not a partition: `desk flush` runs inside `reflect`,\n * `encode` inside `desk flush`, and `gpu` on the GPU, in\n * parallel with the next frame's CPU — and a frame's GPU\n * span lands a frame or two late (its timestamps are read\n * back asynchronously), in the frame the report arrives.\n *\n * By default all the 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 { createGpuPanel, type GpuPanel, type GpuPanelFrame, type GpuPanelOptions, type GpuPanelStats } from \"./gpu-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 /** Collab demos: the presence session whose store feeds the ephemeral tab. */\n readonly presence?: () => PresenceSession | null | undefined;\n /** The GPU slot (K2): `false` to omit, or its options (budget, expanded, the host's capture) — given as an object it mounts at once (saying it waits for a frame); otherwise on the first `gpuFrame` push. */\n readonly gpu?: boolean | Pick<GpuPanelOptions, \"budgetMs\" | \"expanded\" | \"capture\" | \"captureFrames\">;\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 GPU frame (K2 — wire the desk's GPU profiler here: `profiler.subscribe((r) => devtools.gpuFrame(r, profiler.stats()))`).\n * Mounts the GPU slot on the first push and reports the host lanes `desk flush` / `encode` / `gpu`. No-op when `gpu: false`.\n */\n gpuFrame(frame: GpuPanelFrame, stats?: GpuPanelStats): 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 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 //\n // FIXED 2026-08-15 (petition I14): this read `phaseFlushMicros.get(\"reflect\")`,\n // a map keyed by strata PHASE names — and reflect is not a phase, so the\n // lookup was always undefined and the lane NEVER reported since it shipped.\n // `FrameTelemetry.reflectMicros` is the real source (engine.ts arms the\n // reflector registry's own timing from `enableTelemetry`).\n //\n // The GUEST lanes (petition I14, 2026-08-15): guest work runs between the\n // tick and the publish hooks, so — like reflect — no strata in-world hook can\n // see it, and it was previously invisible to the profiler entirely. One lane\n // per guest, reporting its own last invocation; suspended guests stop\n // reporting rather than flatlining at zero, so a silent lane means \"gone\",\n // which is exactly what the doctor's row says too.\n let removePublish: (() => void) | undefined;\n if (profiler !== null) {\n core.enableTelemetry();\n removePublish = core.onPublish(() => {\n const us = core.lastFrame()?.reflectMicros;\n if (us !== undefined && us > 0) profiler.lane(\"reflect\", us / 1000);\n for (const g of core.guests.list()) {\n if (g.status === \"running\" && g.lastMs > 0) profiler.lane(`guest:${g.id}`, g.lastMs);\n }\n });\n }\n\n let detached = false;\n let gpu: GpuPanel | null = null;\n const mountGpu = (): GpuPanel => {\n gpu ??= createGpuPanel({ ...(typeof opts.gpu === \"object\" ? opts.gpu : {}), ...mountIn(\"gpu\") });\n return gpu;\n };\n if (typeof opts.gpu === \"object\") mountGpu(); // configured: shown at once, waiting for a frame\n return {\n observer,\n profiler,\n lane(name, ms) {\n profiler?.lane(name, ms);\n },\n gpuFrame(frame, stats) {\n if (detached || opts.gpu === false) return;\n mountGpu().push(frame, stats);\n // the host lanes beside strata's per-system ones (side by side, not a partition — the header)\n if (frame.cpu.flush !== null) profiler?.lane(\"desk flush\", frame.cpu.flush);\n profiler?.lane(\"encode\", frame.cpu.encode);\n if (frame.span !== null) profiler?.lane(\"gpu\", frame.span);\n },\n detach() {\n if (detached) return;\n detached = true;\n removePublish?.();\n observer?.dispose();\n profiler?.dispose();\n gpu?.dispose();\n gpu = null;\n dock?.dispose();\n dock = null;\n },\n };\n}\n","/**\n * The devtools dock — ONE draggable window hosting the tools\n * (2026-07-13, James: \"make the 3 tools into one draggable panel\"; two since\n * design-015 D5b — the GL metrics panel, the r3f stats mirror, left with the\n * GL islands it read — and three again since design-016 K2: the `gpu` slot,\n * the WebGPU desk's profiler, between the strip and the observer).\n *\n * strata's observer + profiler each mount `position: fixed` into their own\n * corner. The dock does NOT re-implement either (standing rule: wrap\n * first-party tools): it is a fixed, draggable shell with stacked slots; each\n * tool mounts into its slot via its own `container` option, and dock-scoped\n * CSS de-windows them (`position: static`, full width, no border/shadow) so\n * they read as sections of one panel. Their own behavior is untouched — the\n * observer keeps its tabs/collapse/vertical resize (its header drag goes\n * inert: left/top are ignored at static), the profiler strip keeps its\n * click-to-expand.\n *\n * Slot order is fixed by the dock, not by mount order: the profiler is a\n * one-line summary strip, the observer is the deep-dive — the strip on top,\n * the GPU's frames under it, the observer last.\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\" | \"gpu\" | \"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\", \"gpu\", \"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 {\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 { min-width: 0; }\n.ice-dock .ice-gpu { border: none; border-radius: 0; box-shadow: none; }\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 GPU panel — the WebGPU desk's frames as its GPU saw them (design-016 §4.5, K2), the dock's `gpu` slot: what the \"ice gl\"\n * panel was for the r3f islands until design-015 D5b, rebuilt for the desk's profiler.\n *\n * Pure DOM, strata's visual language (the observer's and the profiler's palette and type, so the dock reads as one toolset).\n * Fed by pushes of `GpuPanelFrame` + `GpuPanelStats` — STRUCTURAL MIRRORS of `@ice/desk`'s `GpuFrameReport` and\n * `GpuProfileStats` (devtools cannot import desk under the walls — `nobody-imports-desk`; this is how `GlPanelStats`\n * mirrored r3f's `GlFrameStats`). apps/desk holds the two in step: its typecheck asserts desk's are assignable to these.\n *\n * head the GPU SPAN's p50 (THE headline: first pass begun → last pass ended), p95 · max, a sparkline against the budget\n * warning timestamps quantised to 100 µs — and the Chrome switch that turns it off\n * frame span / busy (the span less the GPU's waits) / encode / desk flush bars against the budget, p50 · p95 · max\n * passes the last timed frame's passes on its span (they overlap on a tiler, and the GPU waits between them: the sum is not the frame — both shown)\n * calls draws · instances · pipelines · bind groups · passes · submits · writes · upload bytes\n * by kind draws and instances by the kind that drew (a run of notes is ONE instanced draw)\n * uploads the frame's bytes by label · memory: live GPU bytes by label (the ledger), textures / buffers\n * capture \"capture N frames\" → a Chrome trace-event JSON, saved (Perfetto / chrome://tracing)\n *\n * All values land via `textContent` (never innerHTML with data). Rendering is throttled: pushes arrive per frame, the DOM\n * refreshes at ~8 Hz.\n */\n\n/** Mirror of `@ice/desk` `PassTime`. */\nexport interface GpuPanelPass {\n readonly label: string;\n readonly begin: number;\n readonly end: number;\n}\n\n/** Mirror of `@ice/desk` `GpuFrameReport` (structural — see the header). */\nexport interface GpuPanelFrame {\n readonly frame: number;\n readonly span: number | null;\n readonly sum: number | null;\n readonly busy: number | null;\n readonly passes: readonly GpuPanelPass[];\n readonly counts: {\n readonly draws: number;\n readonly instances: number;\n readonly pipelines: number;\n readonly bindGroups: number;\n readonly passes: number;\n readonly submits: number;\n readonly writes: number;\n readonly uploadBytes: number;\n };\n readonly byKind: Readonly<Record<string, { readonly draws: number; readonly instances: number }>>;\n readonly uploads: Readonly<Record<string, { readonly writes: number; readonly bytes: number }>>;\n readonly cpu: { readonly encode: number; readonly flush: number | null };\n readonly memory: {\n readonly byLabel: Readonly<Record<string, { readonly bytes: number; readonly textures: number; readonly buffers: number }>>;\n readonly textures: number;\n readonly buffers: number;\n readonly total: number;\n } | null;\n readonly quantised: boolean | null;\n}\n\n/** Mirror of `@ice/desk` `Rolling`. */\nexport interface GpuPanelRolling {\n readonly n: number;\n readonly p50: number;\n readonly p95: number;\n readonly max: number;\n}\n\n/** Mirror of `@ice/desk` `GpuProfileStats` (the fields the panel reads). */\nexport interface GpuPanelStats {\n readonly frames: number;\n readonly span: GpuPanelRolling | null;\n readonly busy: GpuPanelRolling | null;\n readonly encode: GpuPanelRolling | null;\n readonly flush: GpuPanelRolling | null;\n readonly quantised: boolean | null;\n readonly unquantise: string;\n readonly dropped: number;\n}\n\nexport interface GpuPanelOptions {\n readonly container?: HTMLElement;\n /** The frame budget, ms — the bars' and the sparkline's reference (default 16.7). */\n readonly budgetMs?: number;\n /** Start with the detail body open (default true: the dock opens to read it). */\n readonly expanded?: boolean;\n /** \"capture N frames\": the host's capture (a trace-event JSON) — the panel saves what it answers. Absent: no button. */\n readonly capture?: (frames: number) => Promise<unknown>;\n /** The frames a capture asks for (default 120). */\n readonly captureFrames?: number;\n}\n\nexport interface GpuPanel {\n push(frame: GpuPanelFrame, stats?: GpuPanelStats): void;\n readonly el: HTMLElement;\n dispose(): void;\n}\n\nconst STYLE_ID = \"ice-gpu-style\";\n\n// strata-prof's palette, verbatim — the panels must read as one toolset.\nconst CSS = `\n.ice-gpu { background: rgba(13,17,23,.96); color: #e6edf3; font: 11px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace; user-select: none; }\n.ice-gpu * { box-sizing: border-box; }\n.ice-gpu-head { display: flex; align-items: center; gap: 8px; padding: 6px 9px; cursor: pointer; }\n.ice-gpu-name { font-weight: 700; color: #56d4dd; }\n.ice-gpu-span { font-weight: 700; color: #a371f7; min-width: 64px; }\n.ice-gpu-tail { color: #8b949e; min-width: 118px; }\n.ice-gpu-caret { color: #8b949e; margin-left: auto; }\n.ice-gpu-body { display: none; border-top: 1px solid #21262d; padding: 5px 9px 8px; }\n.ice-gpu.open .ice-gpu-body { display: block; }\n.ice-gpu-warn { display: none; color: #ffa657; padding: 4px 0 2px; white-space: normal; }\n.ice-gpu-warn.on { display: block; }\n.ice-gpu-sect { color: #8b949e; font-weight: 700; padding: 5px 0 2px; }\n.ice-gpu-row { display: flex; align-items: center; gap: 7px; padding: 1px 0; white-space: nowrap; }\n.ice-gpu-label { min-width: 84px; max-width: 120px; overflow: hidden; text-overflow: ellipsis; color: #8b949e; }\n.ice-gpu-bar { position: relative; flex: 1; height: 5px; border-radius: 3px; background: #21262d; overflow: hidden; }\n.ice-gpu-bar > i { position: absolute; top: 0; bottom: 0; left: 0; display: block; background: #58a6ff; border-radius: 3px; }\n.ice-gpu-stat { color: #e6edf3; margin-left: auto; min-width: 64px; text-align: right; }\n.ice-gpu-dim { color: #8b949e; }\n.ice-gpu-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 3px 10px; padding: 2px 0; }\n.ice-gpu-cell b { display: block; color: #e6edf3; font-weight: 700; }\n.ice-gpu-cell span { color: #8b949e; }\n.ice-gpu-foot { display: flex; align-items: center; gap: 8px; padding-top: 6px; color: #8b949e; }\n.ice-gpu-btn { background: #21262d; border: 1px solid #30363d; border-radius: 6px; color: #e6edf3; cursor: pointer; font: inherit; padding: 2px 8px; }\n.ice-gpu-btn:hover { border-color: #58a6ff; }\n.ice-gpu-btn:disabled { color: #8b949e; cursor: default; }\n`;\n\nconst SPARK_W = 120;\nconst SPARK_H = 22;\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\nexport const fmtMs = (ms: number | null | undefined): string => (ms === null || ms === undefined ? \"–\" : ms >= 10 ? `${ms.toFixed(1)} ms` : `${ms.toFixed(2)} ms`);\nexport const fmtBytes = (b: number): string => (b >= 1048576 ? `${(b / 1048576).toFixed(1)} MB` : b >= 1024 ? `${(b / 1024).toFixed(1)} KB` : `${b} B`);\nconst fmtK = (n: number): string => (n >= 1e6 ? `${(n / 1e6).toFixed(2)}M` : n >= 1e4 ? `${(n / 1e3).toFixed(1)}k` : String(n));\n\nexport function createGpuPanel(opts: GpuPanelOptions = {}): GpuPanel {\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-gpu${opts.expanded === false ? \"\" : \" open\"}`;\n const make = <K extends keyof HTMLElementTagNameMap>(tag: K, cls: string, text?: string): HTMLElementTagNameMap[K] => {\n const el = doc.createElement(tag);\n el.className = cls;\n if (text !== undefined) el.textContent = text;\n return el;\n };\n\n const head = make(\"div\", \"ice-gpu-head\");\n const spanEl = make(\"span\", \"ice-gpu-span\", \"–\");\n const tailEl = make(\"span\", \"ice-gpu-tail\", \"no frame yet\");\n const spark = doc.createElement(\"canvas\");\n spark.width = SPARK_W;\n spark.height = SPARK_H;\n spark.style.display = \"block\";\n head.append(make(\"span\", \"ice-gpu-name\", \"gpu\"), spanEl, tailEl, spark, make(\"span\", \"ice-gpu-caret\", \"▾\"));\n head.addEventListener(\"click\", () => root.classList.toggle(\"open\"));\n\n const body = make(\"div\", \"ice-gpu-body\");\n // until a frame comes: at rest the desk draws nothing, and the profiler never asks it to (K-L5)\n const hint = make(\"div\", \"ice-gpu-row ice-gpu-dim\", \"waiting for a frame — at rest the desk draws nothing (idle-zero); move the camera\");\n const warn = make(\"div\", \"ice-gpu-warn\");\n body.append(hint, warn);\n const sect = (label: string): HTMLElement => { const s = make(\"div\", \"ice-gpu-sect\", label); body.appendChild(s); return s; };\n const bar = (label: string, into: HTMLElement = body): { fill: HTMLElement; stat: HTMLElement; label: HTMLElement } => {\n const row = make(\"div\", \"ice-gpu-row\");\n const l = make(\"span\", \"ice-gpu-label\", label);\n const b = make(\"div\", \"ice-gpu-bar\");\n const fill = doc.createElement(\"i\");\n b.appendChild(fill);\n const stat = make(\"span\", \"ice-gpu-stat\");\n row.append(l, b, stat);\n into.appendChild(row);\n return { fill, stat, label: l };\n };\n /** A section whose rows change with the frame: rebuilt on each render. */\n const list = (): HTMLElement => { const el = doc.createElement(\"div\"); body.appendChild(el); return el; };\n\n sect(\"frame\");\n const spanBar = bar(\"gpu span\");\n const busyBar = bar(\"gpu busy\");\n const encodeBar = bar(\"encode\");\n const flushBar = bar(\"desk flush\");\n const passesHead = sect(\"passes\");\n const passesEl = list();\n sect(\"calls\");\n const grid = make(\"div\", \"ice-gpu-grid\");\n body.appendChild(grid);\n const cell = (label: string): HTMLElement => {\n const c = make(\"div\", \"ice-gpu-cell\");\n const v = doc.createElement(\"b\");\n c.append(v, make(\"span\", \"\", label));\n grid.appendChild(c);\n return v;\n };\n const cells = {\n draws: cell(\"draws\"), instances: cell(\"instances\"), pipelines: cell(\"pipelines\"), bindGroups: cell(\"bind groups\"),\n passes: cell(\"passes\"), submits: cell(\"submits\"), writes: cell(\"writes\"), uploadBytes: cell(\"uploaded\"),\n };\n sect(\"by kind\");\n const kindsEl = list();\n sect(\"uploads\");\n const uploadsEl = list();\n const memoryHead = sect(\"memory\");\n const memoryEl = list();\n const foot = make(\"div\", \"ice-gpu-foot\");\n const footText = make(\"span\", \"ice-gpu-dim\");\n foot.appendChild(footText);\n body.appendChild(foot);\n if (opts.capture !== undefined) {\n const n = opts.captureFrames ?? 120;\n const capture = opts.capture;\n const btn = make(\"button\", \"ice-gpu-btn\", `capture ${n} frames`);\n btn.type = \"button\";\n btn.addEventListener(\"click\", () => {\n btn.disabled = true;\n btn.textContent = \"capturing…\";\n capture(n).then(\n (trace) => { save(doc, trace); btn.textContent = `saved — capture ${n} frames`; },\n (e: unknown) => { btn.textContent = `capture failed: ${e instanceof Error ? e.message : String(e)}`; },\n ).finally(() => { btn.disabled = false; });\n });\n foot.prepend(btn);\n }\n root.append(head, body);\n container.appendChild(root);\n\n const samples: number[] = [];\n let latest: GpuPanelFrame | undefined;\n let timed: GpuPanelFrame | undefined;\n let stats: GpuPanelStats | undefined;\n let lastRender = Number.NEGATIVE_INFINITY; // the first push always renders\n let trailing: ReturnType<typeof setTimeout> | undefined;\n let disposed = false;\n\n const setBar = (b: { fill: HTMLElement; stat: HTMLElement }, ms: number | null | undefined, text: string, over = budgetMs): void => {\n b.fill.style.width = `${ms === null || ms === undefined ? 0 : Math.min(100, (ms / budgetMs) * 100)}%`;\n b.fill.style.background = ms !== null && ms !== undefined && ms > over ? \"#ff7b72\" : \"#58a6ff\";\n b.stat.textContent = text;\n };\n const rolling = (r: GpuPanelRolling | null | undefined): string => (r === null || r === undefined ? \"–\" : `${fmtMs(r.p50)} · p95 ${fmtMs(r.p95)} · max ${fmtMs(r.max)}`);\n const drawSpark = (): void => {\n const ctx = spark.getContext?.(\"2d\") ?? null;\n if (ctx === null) return;\n ctx.clearRect(0, 0, SPARK_W, SPARK_H);\n const top = budgetMs * 2; // the 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 const rows = (into: HTMLElement, items: readonly [string, string, number][]): void => {\n into.textContent = \"\";\n for (const [label, text, share] of items) {\n const b = bar(label, into);\n b.fill.style.width = `${Math.max(0, Math.min(100, share * 100))}%`;\n b.stat.textContent = text;\n b.label.title = label;\n }\n if (items.length === 0) into.appendChild(make(\"div\", \"ice-gpu-row ice-gpu-dim\", \"none\"));\n };\n\n const render = (): void => {\n const f = latest;\n if (f === undefined) return;\n hint.remove();\n const st = stats;\n spanEl.textContent = st?.span ? fmtMs(st.span.p50) : fmtMs(f.span);\n tailEl.textContent = st?.span ? `p95 ${fmtMs(st.span.p95)} · max ${fmtMs(st.span.max)}` : f.span === null ? \"untimed\" : \"\";\n drawSpark();\n const q = st?.quantised ?? f.quantised;\n warn.classList.toggle(\"on\", q === true);\n warn.textContent = q === true ? `⚠ timestamps quantised to 100 µs — launch Chrome with ${st?.unquantise ?? \"--disable-dawn-features=timestamp_quantization\"}` : \"\";\n if (!root.classList.contains(\"open\")) return;\n\n setBar(spanBar, st?.span?.p50 ?? f.span, rolling(st?.span));\n setBar(busyBar, st?.busy?.p50 ?? f.busy, rolling(st?.busy));\n setBar(encodeBar, st?.encode?.p50 ?? f.cpu.encode, rolling(st?.encode));\n setBar(flushBar, st?.flush?.p50 ?? f.cpu.flush, rolling(st?.flush));\n\n const t = timed;\n const span = t?.span ?? null;\n passesHead.textContent = t === undefined || span === null\n ? \"passes — untimed (no timestamp-query, or the readback ring was full)\"\n : `passes · frame ${t.frame} · span ${fmtMs(span)} · busy ${fmtMs(t.busy)} · sum ${fmtMs(t.sum)}`;\n passesEl.textContent = \"\";\n if (t !== undefined && span !== null && span > 0) {\n for (const p of t.passes) {\n const b = bar(p.label, passesEl);\n b.fill.style.left = `${(p.begin / span) * 100}%`;\n b.fill.style.width = `${Math.max(0.5, ((p.end - p.begin) / span) * 100)}%`;\n b.stat.textContent = fmtMs(p.end - p.begin);\n b.label.title = `${p.label}: ${p.begin.toFixed(3)} → ${p.end.toFixed(3)} ms`;\n }\n }\n\n const c = f.counts;\n cells.draws.textContent = fmtK(c.draws);\n cells.instances.textContent = fmtK(c.instances);\n cells.pipelines.textContent = fmtK(c.pipelines);\n cells.bindGroups.textContent = fmtK(c.bindGroups);\n cells.passes.textContent = fmtK(c.passes);\n cells.submits.textContent = fmtK(c.submits);\n cells.writes.textContent = fmtK(c.writes);\n cells.uploadBytes.textContent = fmtBytes(c.uploadBytes);\n\n const kinds = Object.entries(f.byKind).sort((a, b) => b[1].draws - a[1].draws);\n const most = Math.max(1, ...kinds.map(([, k]) => k.draws));\n rows(kindsEl, kinds.map(([name, k]) => [name, `${k.draws} draw${k.draws === 1 ? \"\" : \"s\"} · ${fmtK(k.instances)} inst`, k.draws / most]));\n const ups = Object.entries(f.uploads).sort((a, b) => b[1].bytes - a[1].bytes).slice(0, 6);\n const upTotal = Math.max(1, c.uploadBytes);\n rows(uploadsEl, ups.map(([name, u]) => [name, `${fmtBytes(u.bytes)} · ${u.writes}×`, u.bytes / upTotal]));\n const m = f.memory;\n memoryHead.textContent = m === null ? \"memory — no ledger (the host keeps none)\" : `memory · ${fmtBytes(m.total)} live · textures ${fmtBytes(m.textures)} · buffers ${fmtBytes(m.buffers)}`;\n rows(memoryEl, m === null ? [] : Object.entries(m.byLabel).sort((a, b) => b[1].bytes - a[1].bytes).slice(0, 8).map(([name, r]) => [name, fmtBytes(r.bytes), r.bytes / Math.max(1, m.total)]));\n footText.textContent = `${st?.frames ?? 1} frames in the window${st !== undefined && st.dropped > 0 ? ` · ${st.dropped} dropped (the readback ring was full)` : \"\"}`;\n };\n\n return {\n el: root,\n push(frame, s) {\n if (disposed) return;\n latest = frame;\n if (frame.span !== null) {\n timed = frame;\n samples.push(frame.span);\n if (samples.length > SPARK_SAMPLES) samples.splice(0, samples.length - SPARK_SAMPLES);\n }\n if (s !== undefined) stats = s;\n const now = performance.now();\n if (now - lastRender >= 120) {\n lastRender = now;\n render();\n } else if (trailing === undefined) {\n // the last push always shows: at rest the frames stop, and the panel must not keep one from before them\n trailing = setTimeout(() => { trailing = undefined; lastRender = performance.now(); if (!disposed) render(); }, 120 - (now - lastRender));\n }\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n if (trailing !== undefined) clearTimeout(trailing);\n root.remove();\n },\n };\n}\n\n/** Save `trace` as a JSON file (the browser's download): `desk-gpu-<time>.json`. */\nfunction save(doc: Document, trace: unknown): void {\n const view = doc.defaultView;\n if (view === null || typeof view.URL?.createObjectURL !== \"function\") return;\n const url = view.URL.createObjectURL(new view.Blob([JSON.stringify(trace)], { type: \"application/json\" }));\n const a = doc.createElement(\"a\");\n a.href = url;\n a.download = `desk-gpu-${new Date().toISOString().replace(/[:.]/g, \"-\")}.json`;\n doc.body.appendChild(a);\n a.click();\n a.remove();\n view.setTimeout(() => view.URL.revokeObjectURL(url), 1000);\n}\n","/**\n * @ice/devtools — strata's observer panel + FPS profiler, engine-flavored\n * (describe/durable/ephemeral/reflect-lane glue), and the GPU panel the WebGPU\n * desk's profiler feeds (design-016 K2). Reads the world outside the tick;\n * never a reflector, never writes ECS. Nobody imports us (depcruise-enforced\n * 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\";\n// `createGlPanel` (the r3f stats mirror) left at design-015 D5b with the GL islands it read; the GPU panel (design-016 K2)\n// is the WebGPU desk's, fed through its structural mirrors.\nexport {\n createGpuPanel,\n fmtBytes,\n fmtMs,\n type GpuPanel,\n type GpuPanelFrame,\n type GpuPanelOptions,\n type GpuPanelPass,\n type GpuPanelRolling,\n type GpuPanelStats,\n} from \"./gpu-panel\";\n"],"mappings":"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","names":["w","STYLE_ID","CSS","injectStyle"]}
|
package/dist/dom.js
CHANGED
|
@@ -3,45 +3,33 @@ import {
|
|
|
3
3
|
DOM_VERSION,
|
|
4
4
|
FOCUS_PROXY_ATTR,
|
|
5
5
|
KEYBOARD_CLAIM_ATTR,
|
|
6
|
-
attachMeasureAdapter,
|
|
7
6
|
attachPointerAdapter,
|
|
8
7
|
attachWidgetFocus,
|
|
9
8
|
createCanvasHost,
|
|
10
|
-
createChromeReflector,
|
|
11
9
|
createCursorReflector,
|
|
12
|
-
|
|
13
|
-
createGrayboxReflector,
|
|
14
|
-
createPlaneTransformReflector,
|
|
15
|
-
createPlanes,
|
|
10
|
+
createDeskHost,
|
|
16
11
|
createRemoteCursorsReflector,
|
|
17
12
|
isEditableTarget,
|
|
18
13
|
keyboardClaimOf,
|
|
19
14
|
startRafLoop,
|
|
20
|
-
wheelCede
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
import "./chunk-
|
|
24
|
-
import "./chunk-OR5FNVUE.js";
|
|
15
|
+
wheelCede
|
|
16
|
+
} from "./chunk-IBWWLA6D.js";
|
|
17
|
+
import "./chunk-DYK6KNLG.js";
|
|
18
|
+
import "./chunk-JS6PG6YD.js";
|
|
25
19
|
export {
|
|
26
20
|
CLAIM_OWNS_ESCAPE,
|
|
27
21
|
DOM_VERSION,
|
|
28
22
|
FOCUS_PROXY_ATTR,
|
|
29
23
|
KEYBOARD_CLAIM_ATTR,
|
|
30
|
-
attachMeasureAdapter,
|
|
31
24
|
attachPointerAdapter,
|
|
32
25
|
attachWidgetFocus,
|
|
33
26
|
createCanvasHost,
|
|
34
|
-
createChromeReflector,
|
|
35
27
|
createCursorReflector,
|
|
36
|
-
|
|
37
|
-
createGrayboxReflector,
|
|
38
|
-
createPlaneTransformReflector,
|
|
39
|
-
createPlanes,
|
|
28
|
+
createDeskHost,
|
|
40
29
|
createRemoteCursorsReflector,
|
|
41
30
|
isEditableTarget,
|
|
42
31
|
keyboardClaimOf,
|
|
43
32
|
startRafLoop,
|
|
44
|
-
wheelCede
|
|
45
|
-
wireMeasurement
|
|
33
|
+
wheelCede
|
|
46
34
|
};
|
|
47
35
|
//# sourceMappingURL=dom.js.map
|