@vibecook/ice 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/README.md +37 -2
  2. package/dist/chunk-5SJYHQI4.js +636 -0
  3. package/dist/chunk-5SJYHQI4.js.map +1 -0
  4. package/dist/{chunk-5S7GSXJG.js → chunk-DXU3RZZS.js} +2913 -1180
  5. package/dist/chunk-DXU3RZZS.js.map +1 -0
  6. package/dist/{chunk-FIAXPNNY.js → chunk-IASTQMU5.js} +130 -551
  7. package/dist/chunk-IASTQMU5.js.map +1 -0
  8. package/dist/{chunk-BCJ47SX7.js → chunk-OR5FNVUE.js} +460 -1
  9. package/dist/chunk-OR5FNVUE.js.map +1 -0
  10. package/dist/devtools.js +508 -372
  11. package/dist/devtools.js.map +1 -1
  12. package/dist/dom.js +3 -11
  13. package/dist/ground.js +715 -0
  14. package/dist/ground.js.map +1 -0
  15. package/dist/index.js +70 -2
  16. package/dist/kernel.js +31 -1
  17. package/dist/r3f.js +599 -62
  18. package/dist/r3f.js.map +1 -1
  19. package/dist/react.js +34 -418
  20. package/dist/react.js.map +1 -1
  21. package/dist/types/packages/core/src/catalog/camera-derived.d.ts +41 -3
  22. package/dist/types/packages/core/src/catalog/gesture.d.ts +39 -3
  23. package/dist/types/packages/core/src/catalog/graph.d.ts +7 -6
  24. package/dist/types/packages/core/src/catalog/index.d.ts +1 -0
  25. package/dist/types/packages/core/src/catalog/insert.d.ts +31 -0
  26. package/dist/types/packages/core/src/catalog/pointer.d.ts +11 -0
  27. package/dist/types/packages/core/src/catalog/scene.d.ts +37 -4
  28. package/dist/types/packages/core/src/catalog/selection-presence.d.ts +7 -0
  29. package/dist/types/packages/core/src/catalog/settings-resources.d.ts +21 -0
  30. package/dist/types/packages/core/src/doc/autosave.d.ts +15 -2
  31. package/dist/types/packages/core/src/doc/bootstrap.d.ts +29 -0
  32. package/dist/types/packages/core/src/doc/channels.d.ts +9 -0
  33. package/dist/types/packages/core/src/doc/doc-commit-sink.d.ts +2 -1
  34. package/dist/types/packages/core/src/doc/doc-kit.d.ts +16 -1
  35. package/dist/types/packages/core/src/doc/envelope.d.ts +2 -1
  36. package/dist/types/packages/core/src/doc/migrate.d.ts +8 -6
  37. package/dist/types/packages/core/src/doc/schema-migrate.d.ts +50 -0
  38. package/dist/types/packages/core/src/doc/version-gate.d.ts +3 -0
  39. package/dist/types/packages/core/src/engine/commit-sink.d.ts +24 -2
  40. package/dist/types/packages/core/src/engine/frame-info.d.ts +16 -1
  41. package/dist/types/packages/core/src/facade/create-canvas-engine.d.ts +70 -6
  42. package/dist/types/packages/core/src/guards/guarded-tx.d.ts +4 -2
  43. package/dist/types/packages/core/src/helpers/churn-guard.d.ts +40 -0
  44. package/dist/types/packages/core/src/index.d.ts +13 -7
  45. package/dist/types/packages/core/src/input/queue.d.ts +11 -0
  46. package/dist/types/packages/core/src/nav/nested-canvas.d.ts +47 -11
  47. package/dist/types/packages/core/src/ops/arrange.d.ts +15 -0
  48. package/dist/types/packages/core/src/ops/insert.d.ts +62 -0
  49. package/dist/types/packages/core/src/ops/point-pick.d.ts +11 -7
  50. package/dist/types/packages/core/src/ops/sibling-order.d.ts +70 -0
  51. package/dist/types/packages/core/src/schema/meta.d.ts +1 -0
  52. package/dist/types/packages/core/src/settings/defaults.d.ts +45 -0
  53. package/dist/types/packages/core/src/settings/ground-config.d.ts +55 -0
  54. package/dist/types/packages/core/src/systems/chrome.d.ts +6 -2
  55. package/dist/types/packages/core/src/systems/insert-ghost.d.ts +25 -0
  56. package/dist/types/packages/core/src/systems/l1-pick.d.ts +25 -11
  57. package/dist/types/packages/core/src/systems/l2-recognize.d.ts +10 -4
  58. package/dist/types/packages/core/src/systems/l3-behave.d.ts +6 -4
  59. package/dist/types/packages/core/src/systems/l3-claim.d.ts +7 -3
  60. package/dist/types/packages/core/src/systems/l3-drop.d.ts +3 -1
  61. package/dist/types/packages/core/src/systems/l3-resize.d.ts +3 -1
  62. package/dist/types/packages/core/src/systems/l3-snap.d.ts +25 -7
  63. package/dist/types/packages/core/src/systems/nav-flight.d.ts +95 -0
  64. package/dist/types/packages/core/src/widget/define-widget.d.ts +39 -0
  65. package/dist/types/packages/core/src/widget/mount-store.d.ts +11 -3
  66. package/dist/types/packages/core/src/widget/set-props.d.ts +16 -0
  67. package/dist/types/packages/core/src/widget/spawn.d.ts +21 -1
  68. package/dist/types/packages/devtools/src/attach.d.ts +77 -0
  69. package/dist/types/packages/devtools/src/dock.d.ts +38 -0
  70. package/dist/types/packages/devtools/src/gl-panel.d.ts +69 -0
  71. package/dist/types/packages/devtools/src/index.d.ts +8 -6
  72. package/dist/types/packages/dom/src/index.d.ts +1 -3
  73. package/dist/types/packages/dom/src/measure-wiring.d.ts +2 -2
  74. package/dist/types/packages/dom/src/pointer-adapter.d.ts +21 -1
  75. package/dist/types/packages/dom/src/reflectors/dom-widgets.d.ts +5 -0
  76. package/dist/types/packages/ground/src/index.d.ts +52 -0
  77. package/dist/types/packages/ground/src/layer.d.ts +40 -0
  78. package/dist/types/packages/ground/src/pass.d.ts +41 -0
  79. package/dist/types/packages/ground/src/passes/grid.d.ts +21 -0
  80. package/dist/types/packages/ground/src/passes/guides-collect.d.ts +14 -0
  81. package/dist/types/packages/ground/src/passes/guides.d.ts +3 -0
  82. package/dist/types/packages/ground/src/passes/soup-collect.d.ts +35 -0
  83. package/dist/types/packages/ground/src/passes/soup-mesh.d.ts +8 -0
  84. package/dist/types/packages/ground/src/passes/wires-collect.d.ts +31 -0
  85. package/dist/types/packages/ground/src/passes/wires.d.ts +10 -0
  86. package/dist/types/packages/ground/src/renderer.d.ts +15 -0
  87. package/dist/types/packages/ice/src/ground.d.ts +1 -0
  88. package/dist/types/packages/kernel/src/bezier.d.ts +15 -0
  89. package/dist/types/packages/kernel/src/coords.d.ts +15 -0
  90. package/dist/types/packages/kernel/src/easing.d.ts +11 -0
  91. package/dist/types/packages/kernel/src/index.d.ts +3 -0
  92. package/dist/types/packages/kernel/src/layout.d.ts +118 -0
  93. package/dist/types/packages/kernel/src/nav-flight.d.ts +93 -0
  94. package/dist/types/packages/r3f/src/bridge.d.ts +73 -12
  95. package/dist/types/packages/r3f/src/composite-material.d.ts +9 -0
  96. package/dist/types/packages/r3f/src/compositor-pass.d.ts +22 -0
  97. package/dist/types/packages/r3f/src/gl-root.d.ts +76 -1
  98. package/dist/types/packages/r3f/src/gl-router.d.ts +10 -0
  99. package/dist/types/packages/r3f/src/index.d.ts +3 -2
  100. package/dist/types/packages/r3f/src/island-state.d.ts +44 -0
  101. package/dist/types/packages/r3f/src/preview-capture.d.ts +19 -0
  102. package/dist/types/packages/r3f/src/self-sustain.d.ts +39 -0
  103. package/dist/types/packages/r3f/src/use-island-frame.d.ts +16 -1
  104. package/dist/types/packages/react/src/engine-context.d.ts +8 -0
  105. package/dist/types/packages/react/src/index.d.ts +4 -2
  106. package/dist/types/packages/react/src/infinite-canvas.d.ts +40 -6
  107. package/dist/types/packages/react/src/preview-snapshots.d.ts +17 -0
  108. package/dist/types/packages/react/src/widget-preview.d.ts +14 -0
  109. package/package.json +13 -8
  110. package/dist/chunk-5S7GSXJG.js.map +0 -1
  111. package/dist/chunk-BCJ47SX7.js.map +0 -1
  112. package/dist/chunk-FIAXPNNY.js.map +0 -1
  113. package/dist/types/packages/devtools/src/panel.d.ts +0 -48
  114. package/dist/types/packages/dom/src/reflectors/grid.d.ts +0 -63
  115. package/dist/types/packages/dom/src/reflectors/wires.d.ts +0 -88
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../ground/src/layer.ts","../../ground/src/passes/grid.ts","../../ground/src/passes/soup-collect.ts","../../ground/src/passes/guides-collect.ts","../../ground/src/passes/soup-mesh.ts","../../ground/src/passes/guides.ts","../../ground/src/passes/wires-collect.ts","../../ground/src/passes/wires.ts","../../ground/src/renderer.ts","../../ground/src/index.ts"],"sourcesContent":["/**\n * The ground LAYER — one reflector, one canvas, one render (design-004 §1\n * as-built 2026-07-16: P0 consolidated from three stacked canvases into a\n * single WebGPU canvas; grid, wires and snap-guides are now PASSES of this\n * layer, and future ground effects join the same registry).\n *\n * Coordinate model: the layer renders in SCREEN CSS-px space — an ortho\n * camera maps [0..w]×[0..h] (y-down) to clip, and passes build their geometry\n * through the kernel `worldToScreen` seam per collect (the proven 2D-canvas\n * semantics: geometry rebuilds on the same dirt that re-stroked the old\n * canvases; the grid stays a per-pixel screen-space shader). The Y-flip\n * question never arises here — `worldToScreen` IS the one conversion (L13).\n *\n * Reflector contract (design-002 §5): post-notify, output-only, never reads\n * layout in flush (the ResizeObserver owns sizing), never writes ECS.\n * `always: true` with a private dirty union — an idle scene renders zero\n * frames; ANY dirty pass re-renders the whole canvas (one draw, same cost\n * class as a pan frame under the old grid). WebGPU init is async: flushes\n * before ready are deferred (flags stay armed), the first ready flush paints.\n */\nimport { Camera, type ReflectorDef, type World } from \"@ice/core\";\nimport { OrthographicCamera, Scene } from \"three/webgpu\";\nimport type { GroundFrame, GroundPass } from \"./pass\";\nimport type { GroundRendererLike } from \"./renderer\";\n\nexport interface GroundLayerHost {\n readonly container: HTMLElement;\n readonly contentPlane: HTMLElement;\n}\n\nexport interface GroundReflector extends ReflectorDef {\n /** False while init is pending or after a device/context failure. */\n available(): boolean;\n /** Whole-canvas renders so far (the churn instrument — 0 on an idle scene). */\n redraws(): number;\n}\n\nexport interface GroundLayerInternals {\n reflector: GroundReflector;\n /** Wake every pass + render (config changes, external invalidation). */\n invalidateAll(): void;\n dispose(): void;\n}\n\nexport function createLayer(\n host: GroundLayerHost,\n world: World,\n renderer: GroundRendererLike,\n passes: readonly GroundPass[],\n): GroundLayerInternals {\n const doc = host.container.ownerDocument;\n const canvas = renderer.canvas;\n canvas.style.position = \"absolute\";\n canvas.style.left = \"0\";\n canvas.style.top = \"0\";\n canvas.style.width = \"100%\";\n canvas.style.height = \"100%\";\n canvas.style.display = \"block\";\n // P0 is never a DOM hit target (the router owns picking, design-004 §4).\n canvas.style.pointerEvents = \"none\";\n // The whole ground stratum is this ONE canvas, immediately before content.\n host.container.insertBefore(canvas, host.contentPlane);\n\n const scene = new Scene();\n // Screen-px ortho, y-down: (0,0) = top-left, (w,h) = bottom-right.\n const camera = new OrthographicCamera(0, 1, 0, 1, -1000, 1000);\n for (const pass of passes) scene.add(pass.object);\n\n // --- dirt ------------------------------------------------------------------\n const dirty = new Map<GroundPass, boolean>();\n for (const pass of passes) dirty.set(pass, true);\n let anyDirty = true;\n const wakeAll = (): void => {\n for (const pass of passes) dirty.set(pass, true);\n anyDirty = true;\n };\n const unsubs: Array<() => void> = [\n // Camera moves re-map every pass's screen-space geometry (2D-canvas parity).\n world.reactive.observeResource(Camera, wakeAll),\n ];\n for (const pass of passes) {\n unsubs.push(\n ...pass.arm(world, () => {\n dirty.set(pass, true);\n anyDirty = true;\n }),\n );\n }\n renderer.onReady(wakeAll); // the deferred pre-ready flushes are owed one paint\n\n // --- sizing (RO owns layout reads — never the flush) -----------------------\n let cssW = 0;\n let cssH = 0;\n let dpr = 1;\n const applySize = (w: number, h: number): void => {\n dpr = doc.defaultView?.devicePixelRatio ?? 1;\n cssW = w;\n cssH = h;\n renderer.setSize(w, h, dpr);\n camera.left = 0;\n camera.right = Math.max(1, w);\n camera.top = 0;\n camera.bottom = Math.max(1, h);\n camera.updateProjectionMatrix();\n wakeAll();\n };\n const initialRect = host.container.getBoundingClientRect();\n applySize(initialRect.width, initialRect.height);\n let ro: ResizeObserver | null = null;\n try {\n ro = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry === undefined) return;\n applySize(entry.contentRect.width, entry.contentRect.height);\n });\n ro.observe(host.container);\n } catch {\n ro = null;\n }\n\n let redraws = 0;\n\n const reflector: GroundReflector = {\n name: \"ground\",\n // Self-gated on the dirty union (wires/chrome precedent) — the every-frame\n // cost is one boolean check.\n always: true,\n flush(w: World) {\n if (!anyDirty || renderer.failed()) return;\n if (!renderer.ready()) return; // init pending — flags stay armed, retry next frame\n const cam = w.getResource(Camera);\n if (cam === undefined) return;\n anyDirty = false;\n const frame: GroundFrame = { width: cssW, height: cssH, dpr, camera: cam };\n for (const pass of passes) {\n if (dirty.get(pass) === true) {\n dirty.set(pass, false);\n pass.collect(w, frame);\n }\n }\n redraws++;\n renderer.render(scene, camera);\n },\n available: () => renderer.ready() && !renderer.failed(),\n redraws: () => redraws,\n };\n\n return {\n reflector,\n invalidateAll: wakeAll,\n dispose() {\n for (const u of unsubs) u();\n unsubs.length = 0;\n ro?.disconnect();\n ro = null;\n for (const pass of passes) pass.dispose();\n renderer.dispose();\n canvas.remove();\n },\n };\n}\n","/**\n * The dot-grid pass — TSL port of the raw-WebGL grid (itself verbatim from v1\n * GridRenderer.ts; the fragment math below is that shader re-expressed as a\n * node graph, level loop unrolled in JS). Screen-space: a fullscreen triangle\n * whose vertex stage passes clip coords through; the fragment reconstructs\n * world position from `screenCoordinate` (top-left device px on BOTH backends\n * — three normalizes, so the old manual y-flip is gone) + camera uniforms.\n *\n * One deliberate re-expression: the GLSL if/else fade ladder became the\n * closed form `clamp(min(rise, fall), 0, 1)` — identical piecewise output\n * (rise 0→1 across fadeIn, plateau 1, fall 1→0 across fadeOut) with no\n * branching. Everything else (fract-distance dots, 0.5-device-px AA,\n * max-composited levels) matches term for term.\n */\nimport { DEFAULT_GRID_CONFIG, type GridConfig } from \"@ice/core\";\nimport {\n clamp,\n float,\n fract,\n length,\n max,\n min,\n mix,\n positionGeometry,\n screenCoordinate,\n smoothstep,\n uniform,\n vec4,\n} from \"three/tsl\";\nimport {\n BufferAttribute,\n BufferGeometry,\n Mesh,\n MeshBasicNodeMaterial,\n Vector2,\n Vector3,\n type Node,\n} from \"three/webgpu\";\nimport type { GroundFrame, GroundPass } from \"../pass\";\n\nconst FULLSCREEN_TRIANGLE = new Float32Array([-1, -1, 0, 3, -1, 0, -1, 3, 0]);\n\nexport interface GridPass extends GroundPass {\n /** Live re-tune (the react `grid` prop seam) — partial merge over current values. */\n configure(cfg: Partial<GridConfig>): void;\n}\n\nexport function createGridPass(initial: Partial<GridConfig> = {}): GridPass {\n let cfg: GridConfig = { ...DEFAULT_GRID_CONFIG, ...initial };\n\n // Camera facts (layer-written each collect).\n const uCamera = uniform(new Vector2(0, 0));\n const uZoom = uniform(1);\n const uDpr = uniform(1);\n // Config (configure-written).\n const uSpacings = uniform(new Vector3(...cfg.spacings));\n const uDotColor = uniform(new Vector3(...cfg.dotColor));\n const uDotAlpha = uniform(cfg.dotAlpha);\n const uFadeIn = uniform(new Vector2(...cfg.fadeIn));\n const uFadeOut = uniform(new Vector2(...cfg.fadeOut));\n const uDotRadius = uniform(new Vector2(...cfg.dotRadius));\n const uLevelWeight = uniform(new Vector2(...cfg.levelWeight));\n\n const effZoom = uZoom.mul(uDpr);\n const worldPos = screenCoordinate.xy.div(effZoom).add(uCamera);\n\n let total: Node<\"float\"> = float(0);\n for (let i = 0; i < 3; i++) {\n const spacing = i === 0 ? uSpacings.x : i === 1 ? uSpacings.y : uSpacings.z;\n const cssSpacing = spacing.mul(uZoom);\n // Fade ladder, closed form (see header).\n const rise = cssSpacing.sub(uFadeIn.x).div(uFadeIn.y.sub(uFadeIn.x));\n const fall = float(1).sub(cssSpacing.sub(uFadeOut.x).div(uFadeOut.y.sub(uFadeOut.x)));\n const opacity = clamp(min(rise, fall), 0, 1);\n // Distance to the nearest grid intersection, in device px.\n const f = fract(worldPos.div(spacing).add(0.5)).sub(0.5);\n const dist = length(f).mul(spacing).mul(effZoom);\n // Radius optionally grows toward sparser levels (min==max ⇒ constant dots).\n const t = clamp(cssSpacing.sub(uFadeIn.x).div(40), 0, 1);\n const radius = mix(uDotRadius.x, uDotRadius.y, t).mul(uDpr);\n // Anti-aliased dot (0.5 device-px smoothstep), max-composited across levels\n // (additive stacking fattens joint intersections — the CAD tell).\n const dot = smoothstep(radius.sub(0.5), radius.add(0.5), dist).oneMinus();\n const weight = uLevelWeight.x.add(float(i).mul(uLevelWeight.y));\n total = max(total, dot.mul(opacity).mul(weight));\n }\n\n const material = new MeshBasicNodeMaterial();\n material.vertexNode = vec4(positionGeometry.xy, 0, 1); // clip-space passthrough\n material.fragmentNode = vec4(uDotColor, clamp(total.mul(uDotAlpha), 0, 1));\n material.transparent = true;\n material.depthTest = false;\n material.depthWrite = false;\n\n const geometry = new BufferGeometry();\n geometry.setAttribute(\"position\", new BufferAttribute(FULLSCREEN_TRIANGLE, 3));\n const mesh = new Mesh(geometry, material);\n mesh.frustumCulled = false;\n mesh.renderOrder = 0;\n\n return {\n name: \"grid\",\n object: mesh,\n arm: () => [], // camera/resize dirt is layer-owned; config re-tunes call invalidate\n collect(_world, frame: GroundFrame) {\n uCamera.value.set(frame.camera.x, frame.camera.y);\n uZoom.value = frame.camera.zoom;\n uDpr.value = frame.dpr;\n },\n configure(next) {\n cfg = { ...cfg, ...next };\n uSpacings.value.set(...cfg.spacings);\n uDotColor.value.set(...cfg.dotColor);\n uDotAlpha.value = cfg.dotAlpha;\n uFadeIn.value.set(...cfg.fadeIn);\n uFadeOut.value.set(...cfg.fadeOut);\n uDotRadius.value.set(...cfg.dotRadius);\n uLevelWeight.value.set(...cfg.levelWeight);\n },\n dispose() {\n geometry.dispose();\n material.dispose();\n },\n };\n}\n","/**\n * Triangle-soup builders — the PURE half of the geometry passes (no three\n * import; unit-tested under happy-dom). Collectors emit screen-px triangles\n * with per-vertex rgba into a growable soup; the three-side `soup-mesh`\n * uploads them. MSAA (renderer antialias) smooths edges, matching the old 2D\n * canvases' stroke AA closely enough at 1–2 px widths.\n */\n\nexport interface TriSoup {\n /** xyz per vertex (z = 0 — the layer renders flat in screen space). */\n positions: Float32Array;\n /** rgba per vertex, 0-1. */\n colors: Float32Array;\n vertexCount: number;\n}\n\nexport type Rgba = readonly [number, number, number, number];\n\nexport class SoupBuilder {\n private pos: number[] = [];\n private col: number[] = [];\n\n private vert(x: number, y: number, c: Rgba): void {\n this.pos.push(x, y, 0);\n this.col.push(c[0], c[1], c[2], c[3]);\n }\n\n /** Axis-aligned rect (two triangles). */\n rect(x: number, y: number, w: number, h: number, c: Rgba): void {\n this.vert(x, y, c);\n this.vert(x + w, y, c);\n this.vert(x + w, y + h, c);\n this.vert(x, y, c);\n this.vert(x + w, y + h, c);\n this.vert(x, y + h, c);\n }\n\n /** Stroke segment (a→b) of `width`, flat caps — a quad across the segment normal. */\n segment(ax: number, ay: number, bx: number, by: number, width: number, c: Rgba): void {\n const dx = bx - ax;\n const dy = by - ay;\n const len = Math.hypot(dx, dy);\n if (len < 1e-6) return;\n const nx = (-dy / len) * (width / 2);\n const ny = (dx / len) * (width / 2);\n this.vert(ax + nx, ay + ny, c);\n this.vert(bx + nx, by + ny, c);\n this.vert(bx - nx, by - ny, c);\n this.vert(ax + nx, ay + ny, c);\n this.vert(bx - nx, by - ny, c);\n this.vert(ax - nx, ay - ny, c);\n }\n\n /** Stroke a polyline (interleaved xy) as per-segment quads (smooth-curve joins). */\n polyline(points: ArrayLike<number>, width: number, c: Rgba): void {\n const n = Math.floor((points.length as number) / 2);\n for (let i = 1; i < n; i++) {\n this.segment(\n points[(i - 1) * 2] as number,\n points[(i - 1) * 2 + 1] as number,\n points[i * 2] as number,\n points[i * 2 + 1] as number,\n width,\n c,\n );\n }\n }\n\n /** Filled disc as a triangle fan (MSAA smooths the rim; 16 segs ≈ round at ≤8 px). */\n disc(cx: number, cy: number, r: number, c: Rgba, segments = 16): void {\n for (let i = 0; i < segments; i++) {\n const a0 = (i / segments) * Math.PI * 2;\n const a1 = ((i + 1) / segments) * Math.PI * 2;\n this.vert(cx, cy, c);\n this.vert(cx + Math.cos(a0) * r, cy + Math.sin(a0) * r, c);\n this.vert(cx + Math.cos(a1) * r, cy + Math.sin(a1) * r, c);\n }\n }\n\n build(): TriSoup {\n return {\n positions: new Float32Array(this.pos),\n colors: new Float32Array(this.col),\n vertexCount: this.pos.length / 3,\n };\n }\n}\n\n/**\n * `rgba(r, g, b, a)` / `rgb(…)` / `#rrggbb` → [r,g,b,a] 0-1 (the WiresConfig\n * colors are CSS strings — v1/2D-canvas heritage). Unknown formats fall back\n * to opaque mid-gray rather than throwing in a reflector path.\n */\nexport function parseCssColor(css: string): Rgba {\n const rgba = /^rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*(?:,\\s*([\\d.]+)\\s*)?\\)$/.exec(css);\n if (rgba !== null) {\n return [\n Number(rgba[1]) / 255,\n Number(rgba[2]) / 255,\n Number(rgba[3]) / 255,\n rgba[4] === undefined ? 1 : Number(rgba[4]),\n ];\n }\n const hex = /^#([0-9a-f]{6})$/i.exec(css);\n if (hex !== null) {\n const v = Number.parseInt(hex[1] as string, 16);\n return [((v >> 16) & 0xff) / 255, ((v >> 8) & 0xff) / 255, (v & 0xff) / 255, 1];\n }\n return [0.5, 0.5, 0.5, 1];\n}\n","/**\n * Snap-guides collector — the pure ECS→triangles half of the guides pass\n * (v1 SnapGuideRenderer look, carried over from the 2D-canvas reflector it\n * replaces): full-viewport magenta alignment lines (`GuideLine.from == to` ⇒\n * full span — design-003 §6), bounded spans, and equal-spacing bars with 4px\n * end ticks. Screen-px output via the kernel `worldToScreen` seam. NO guide\n * count caps (the pool grows; so does the soup).\n */\nimport {\n DEFAULT_SNAP_GUIDES_CONFIG,\n GuideLine,\n SpacingBar,\n defineQuery,\n type SnapGuidesConfig,\n type World,\n} from \"@ice/core\";\nimport { worldToScreen } from \"@ice/kernel\";\nimport type { GroundFrame } from \"../pass\";\nimport { SoupBuilder, type Rgba, type TriSoup } from \"./soup-collect\";\n\nexport const guideQ = defineQuery([GuideLine]);\nexport const barQ = defineQuery([SpacingBar]);\n\nexport function collectGuides(\n world: World,\n frame: GroundFrame,\n config: SnapGuidesConfig = DEFAULT_SNAP_GUIDES_CONFIG,\n): TriSoup {\n const soup = new SoupBuilder();\n const cam = frame.camera;\n const lw = config.lineWidth;\n const guideColor: Rgba = [config.color[0], config.color[1], config.color[2], config.guideAlpha];\n const barColor: Rgba = [config.color[0], config.color[1], config.color[2], config.spacingAlpha];\n\n world.query(guideQ).each((b) => {\n for (const r of b) {\n const g = world.read(b.entity(r), GuideLine);\n const fullSpan = g.from === g.to;\n if (g.axis === \"x\") {\n const sx = worldToScreen(g.at, 0, cam).x;\n if (frame.width > 0 && (sx < -1 || sx > frame.width + 1)) continue;\n const y0 = fullSpan ? 0 : worldToScreen(0, g.from, cam).y;\n const y1 = fullSpan ? frame.height : worldToScreen(0, g.to, cam).y;\n soup.rect(sx - lw / 2, Math.min(y0, y1), lw, Math.abs(y1 - y0), guideColor);\n } else {\n const sy = worldToScreen(0, g.at, cam).y;\n if (frame.height > 0 && (sy < -1 || sy > frame.height + 1)) continue;\n const x0 = fullSpan ? 0 : worldToScreen(g.from, 0, cam).x;\n const x1 = fullSpan ? frame.width : worldToScreen(g.to, 0, cam).x;\n soup.rect(Math.min(x0, x1), sy - lw / 2, Math.abs(x1 - x0), lw, guideColor);\n }\n }\n });\n\n world.query(barQ).each((b) => {\n for (const r of b) {\n const s = world.read(b.entity(r), SpacingBar);\n const t = config.tickPx;\n if (s.axis === \"x\") {\n // Horizontal gap along x at world-y perp (kernel/v1 axis semantics).\n const a = worldToScreen(s.from, s.perp, cam);\n const bp = worldToScreen(s.to, s.perp, cam);\n if (frame.width > 0 && (Math.max(a.x, bp.x) < 0 || Math.min(a.x, bp.x) > frame.width)) continue;\n soup.rect(Math.min(a.x, bp.x), a.y - lw / 2, Math.abs(bp.x - a.x), lw, barColor);\n soup.rect(a.x - lw / 2, a.y - t, lw, t * 2, barColor);\n soup.rect(bp.x - lw / 2, bp.y - t, lw, t * 2, barColor);\n } else {\n const a = worldToScreen(s.perp, s.from, cam);\n const bp = worldToScreen(s.perp, s.to, cam);\n if (frame.height > 0 && (Math.max(a.y, bp.y) < 0 || Math.min(a.y, bp.y) > frame.height)) continue;\n soup.rect(a.x - lw / 2, Math.min(a.y, bp.y), lw, Math.abs(bp.y - a.y), barColor);\n soup.rect(a.x - t, a.y - lw / 2, t * 2, lw, barColor);\n soup.rect(bp.x - t, bp.y - lw / 2, t * 2, lw, barColor);\n }\n }\n });\n\n return soup.build();\n}\n","/**\n * The three-side half of a triangle-soup pass: a Mesh over a dynamic\n * BufferGeometry (position xyz + color rgba) with an unlit TSL material whose\n * fragment IS the vertex color. Capacity grows geometrically; shrink keeps the\n * buffer and narrows the draw range (guide/wire counts oscillate per frame —\n * reallocating every collect would churn).\n */\nimport { attribute } from \"three/tsl\";\nimport { BufferAttribute, BufferGeometry, DoubleSide, Mesh, MeshBasicNodeMaterial } from \"three/webgpu\";\nimport type { TriSoup } from \"./soup-collect\";\n\nexport interface SoupMesh {\n readonly mesh: Mesh;\n update(soup: TriSoup): void;\n dispose(): void;\n}\n\nexport function createSoupMesh(renderOrder: number): SoupMesh {\n const material = new MeshBasicNodeMaterial();\n material.fragmentNode = attribute(\"color\", \"vec4\");\n material.transparent = true;\n material.depthTest = false;\n material.depthWrite = false;\n // Screen-px collectors emit y-down geometry, which lands CLOCKWISE in NDC\n // through the top=0/bottom=h ortho camera — front-face culling would drop\n // every triangle (the invisible-guides field find, 2026-07-16).\n material.side = DoubleSide;\n\n let geometry = new BufferGeometry();\n let capacity = 0;\n const mesh = new Mesh(geometry, material);\n mesh.frustumCulled = false;\n mesh.renderOrder = renderOrder;\n mesh.visible = false; // until the first non-empty soup\n\n return {\n mesh,\n update(soup) {\n if (soup.vertexCount === 0) {\n mesh.visible = false;\n geometry.setDrawRange(0, 0);\n return;\n }\n if (soup.vertexCount > capacity) {\n capacity = Math.max(soup.vertexCount, capacity * 2, 256);\n const old = geometry;\n geometry = new BufferGeometry();\n const pos = new Float32Array(capacity * 3);\n const col = new Float32Array(capacity * 4);\n pos.set(soup.positions);\n col.set(soup.colors);\n geometry.setAttribute(\"position\", new BufferAttribute(pos, 3));\n geometry.setAttribute(\"color\", new BufferAttribute(col, 4));\n mesh.geometry = geometry;\n old.dispose();\n } else {\n const pos = geometry.getAttribute(\"position\") as BufferAttribute;\n const col = geometry.getAttribute(\"color\") as BufferAttribute;\n (pos.array as Float32Array).set(soup.positions);\n (col.array as Float32Array).set(soup.colors);\n pos.needsUpdate = true;\n col.needsUpdate = true;\n }\n geometry.setDrawRange(0, soup.vertexCount);\n mesh.visible = true;\n },\n dispose() {\n geometry.dispose();\n material.dispose();\n },\n };\n}\n","/**\n * Snap-guides pass — the three-side wrapper over the pure `collectGuides`\n * (renders ABOVE grid and wires within the ground canvas, matching the old\n * P0 stacking order).\n */\nimport { GuideLine, SpacingBar, type World } from \"@ice/core\";\nimport { DEFAULT_SNAP_GUIDES_CONFIG, type SnapGuidesConfig } from \"@ice/core\";\nimport type { GroundFrame, GroundPass } from \"../pass\";\nimport { barQ, collectGuides, guideQ } from \"./guides-collect\";\nimport { createSoupMesh } from \"./soup-mesh\";\n\nexport function createGuidesPass(initial: Partial<SnapGuidesConfig> = {}): GroundPass {\n const config: SnapGuidesConfig = { ...DEFAULT_SNAP_GUIDES_CONFIG, ...initial };\n const soup = createSoupMesh(2);\n\n return {\n name: \"snap-guides\",\n object: soup.mesh,\n arm(world: World, wake: () => void) {\n return [\n world.reactive.observeQuery(guideQ, wake, { cols: [GuideLine] }),\n world.reactive.observeQuery(barQ, wake, { cols: [SpacingBar] }),\n ];\n },\n collect(world: World, frame: GroundFrame) {\n soup.update(collectGuides(world, frame, config));\n },\n dispose() {\n soup.dispose();\n },\n };\n}\n","/**\n * Wires collector — the pure ECS→triangles half of the wires pass. Port of\n * the 2D-canvas wires reflector's drawing, kernel-tessellated:\n *\n * - Wire geometry NEVER reads a port ENTITY (design-001 §5.3): endpoints\n * resolve from the wire's `WireFrom`/`WireTo` widgets + `WirePorts` ids\n * against the type registry's static port schema (core `portSlots` — the\n * old local resolver's TODO, retired), so a CULLED endpoint still draws.\n * - Cubics build in WORLD space then map control points through the kernel\n * `worldToScreen` seam — bezier curves are affine-invariant, so the mapped\n * cubic IS the screen curve — and `tessellateCubic` (0.25 px tolerance)\n * flattens with density that tracks zoom for free.\n * - Connect preview: solid when snapped-compatible, dashed [6,4] otherwise\n * (dash placement from the tessellation's arc-length prefix).\n * - Materialized port dots: triangle-fan discs, active color while any\n * connect drag is routed.\n */\nimport {\n Active,\n Culled,\n DEFAULT_WIRES_CONFIG,\n Drag,\n MeasuredSize,\n Port,\n PortAnchor,\n Position,\n PrefabId,\n RoutedConnect,\n Selected,\n Size,\n Wire,\n WireFrom,\n WirePorts,\n WireTo,\n defineQuery,\n portSlots,\n widgets,\n type Entity,\n type WidgetType,\n type WirePreviewBuffer,\n type WiresConfig,\n type World,\n} from \"@ice/core\";\nimport {\n portAnchor,\n tessellateCubic,\n wireCubic,\n worldToScreen,\n type Cubic,\n type PortSlot,\n type Rect,\n type Tessellation,\n} from \"@ice/kernel\";\nimport type { GroundFrame } from \"../pass\";\nimport { SoupBuilder, parseCssColor, type Rgba, type TriSoup } from \"./soup-collect\";\n\nexport const wireQ = defineQuery([Wire]);\nexport const geometryQ = defineQuery([Position, Size]);\nexport const measuredQ = defineQuery([MeasuredSize]);\nexport const selectedQ = defineQuery([Selected]);\nexport const portQ = defineQuery([Port, PortAnchor]);\nexport const routedConnectQ = defineQuery([RoutedConnect]);\n/** A live connect drag moves the preview every frame — Drag value dirt covers it. */\nexport const connectDragQ = defineQuery([RoutedConnect, Drag]);\n/** Nav churn signal: Active membership flips re-collect (scope filter below). */\nexport const activeQ = defineQuery([Active]);\n\n/**\n * Scope filter (field bug 2026-07-17: root wires floated inside a folder).\n * Coordinates are FRAME-LOCAL (design-001 §5.1) — a wire whose endpoint\n * belongs to another nav frame is geometric nonsense in this one. The\n * signature of \"out of scope\" is the canonical non-member state the\n * activeMembership system stamps: Culled ∧ ¬Active. A VIEWPORT-culled member\n * is Culled ∧ Active and must keep drawing (long wires with offscreen\n * endpoints), and bare worlds with no membership system (unit tests,\n * membership-less rigs) carry neither tag and draw everything.\n */\nfunction outOfScope(world: World, e: Entity): boolean {\n return world.hasTag(e, Culled) && !world.hasTag(e, Active);\n}\n\nconst TESSELLATION_TOLERANCE_PX = 0.25;\nconst DASH_PX = 6;\nconst GAP_PX = 4;\n\n/** Effective widget rect: non-zero MeasuredSize over Size (design-004 §2). */\nfunction readRect(world: World, e: Entity): Rect | undefined {\n const p = world.get(e, Position);\n if (p === undefined) return undefined;\n const measured = world.get(e, MeasuredSize);\n const s = measured !== undefined && measured.w > 0 ? measured : world.get(e, Size);\n if (s === undefined) return undefined;\n return { x: p.x, y: p.y, width: s.w, height: s.h };\n}\n\n/** Per-type slot cache (schemas are immutable; mirrors core ops/port-geometry). */\nconst slotCache = new Map<string, Map<string, PortSlot>>();\nfunction slotOf(wt: WidgetType, portId: string): PortSlot | undefined {\n let slots = slotCache.get(wt.type);\n if (slots === undefined) {\n slots = portSlots(wt.ports);\n slotCache.set(wt.type, slots);\n }\n return slots.get(portId);\n}\n\nfunction endpointAnchor(\n world: World,\n widget: Entity | undefined,\n portId: string,\n): { anchor: Rect; slot: PortSlot } | undefined {\n if (widget === undefined) return undefined;\n const rect = readRect(world, widget);\n if (rect === undefined) return undefined;\n const type = world.get(widget, PrefabId)?.id;\n if (typeof type !== \"string\") return undefined;\n const wt = widgets.get(type);\n if (wt === undefined) return undefined;\n const slot = slotOf(wt, portId);\n if (slot === undefined) return undefined;\n return { anchor: rect, slot };\n}\n\n/** Map a world cubic's control points to screen (affine ⇒ exact curve map). */\nfunction cubicToScreen(c: Cubic, cam: GroundFrame[\"camera\"]): Cubic {\n const p0 = worldToScreen(c.x0, c.y0, cam);\n const p1 = worldToScreen(c.x1, c.y1, cam);\n const p2 = worldToScreen(c.x2, c.y2, cam);\n const p3 = worldToScreen(c.x3, c.y3, cam);\n return { x0: p0.x, y0: p0.y, x1: p1.x, y1: p1.y, x2: p2.x, y2: p2.y, x3: p3.x, y3: p3.y };\n}\n\n/** Point at arc length `d` via the tessellation's prefix sums (binary search + lerp). */\nfunction pointAtLength(t: Tessellation, d: number): { x: number; y: number } {\n const arc = t.arcLength;\n const n = arc.length;\n let lo = 0;\n let hi = n - 1;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if ((arc[mid] as number) < d) lo = mid + 1;\n else hi = mid;\n }\n const i = Math.max(1, lo);\n const a = arc[i - 1] as number;\n const b = arc[i] as number;\n const f = b > a ? (d - a) / (b - a) : 0;\n const x0 = t.points[(i - 1) * 2] as number;\n const y0 = t.points[(i - 1) * 2 + 1] as number;\n const x1 = t.points[i * 2] as number;\n const y1 = t.points[i * 2 + 1] as number;\n return { x: x0 + (x1 - x0) * f, y: y0 + (y1 - y0) * f };\n}\n\n/** Emit a dashed stroke along the tessellation (straight dash segments — canvas parity at 6px dashes). */\nfunction dashedStroke(soup: SoupBuilder, t: Tessellation, width: number, c: Rgba): void {\n const total = t.arcLength[t.arcLength.length - 1] as number;\n for (let d = 0; d < total; d += DASH_PX + GAP_PX) {\n const a = pointAtLength(t, d);\n const b = pointAtLength(t, Math.min(d + DASH_PX, total));\n soup.segment(a.x, a.y, b.x, b.y, width, c);\n }\n}\n\nexport function collectWires(\n world: World,\n frame: GroundFrame,\n config: WiresConfig = DEFAULT_WIRES_CONFIG,\n preview?: WirePreviewBuffer,\n): TriSoup {\n const soup = new SoupBuilder();\n const cam = frame.camera;\n const wireColor = parseCssColor(config.wireColor);\n const selectedColor = parseCssColor(config.selectedColor);\n\n // Committed wires.\n world.query(wireQ).each((batch) => {\n for (const r of batch) {\n const wire = batch.entity(r);\n const ports = world.get(wire, WirePorts);\n if (ports === undefined) continue;\n const fromWidget = world.getRelation(wire, WireFrom);\n const toWidget = world.getRelation(wire, WireTo);\n // Both endpoints must be IN the current nav frame (scope filter above).\n if (fromWidget !== undefined && outOfScope(world, fromWidget)) continue;\n if (toWidget !== undefined && outOfScope(world, toWidget)) continue;\n const from = endpointAnchor(world, fromWidget, ports.from ?? \"\");\n const to = endpointAnchor(world, toWidget, ports.to ?? \"\");\n if (from === undefined || to === undefined) continue;\n const cubic = wireCubic(\n portAnchor(from.anchor, from.slot),\n from.slot.side,\n portAnchor(to.anchor, to.slot),\n to.slot.side,\n );\n const selected = world.hasTag(wire, Selected);\n const t = tessellateCubic(cubicToScreen(cubic, cam), TESSELLATION_TOLERANCE_PX);\n soup.polyline(t.points, selected ? config.selectedWidth : config.wireWidth, selected ? selectedColor : wireColor);\n }\n });\n\n // Connect-drag preview (world coords in the buffer; horizontal-stub cubic —\n // the old reflector's readable stand-in until the wire commits real sides).\n if (preview?.active === true) {\n const stub = Math.max(24, Math.abs(preview.tx - preview.sx) * 0.5);\n const cubic: Cubic = {\n x0: preview.sx,\n y0: preview.sy,\n x1: preview.sx + stub,\n y1: preview.sy,\n x2: preview.tx - stub,\n y2: preview.ty,\n x3: preview.tx,\n y3: preview.ty,\n };\n const t = tessellateCubic(cubicToScreen(cubic, cam), TESSELLATION_TOLERANCE_PX);\n if (preview.compatible) soup.polyline(t.points, config.wireWidth, selectedColor);\n else dashedStroke(soup, t, config.wireWidth, wireColor);\n }\n\n // Materialized port dots.\n const connecting = world.firstOf(routedConnectQ) !== undefined;\n const dotColor = parseCssColor(connecting ? config.portActiveColor : config.portColor);\n world.query(portQ).each((batch) => {\n const ax = batch.col(PortAnchor).x;\n const ay = batch.col(PortAnchor).y;\n for (const r of batch) {\n const s = worldToScreen(ax[r] as number, ay[r] as number, cam);\n soup.disc(s.x, s.y, config.portRadius, dotColor);\n }\n });\n\n return soup.build();\n}\n","/**\n * Wires pass — the three-side wrapper over the pure `collectWires` (renders\n * above the grid, below the guides, matching the old P0 canvas order).\n * Dirt mirrors the old 2D reflector's observers; the connect preview rides\n * `[RoutedConnect, Drag]` value dirt (the buffer updates exactly when the\n * connect recognizer's Drag advances) instead of a per-frame value diff.\n */\nimport {\n DEFAULT_WIRES_CONFIG,\n Drag,\n MeasuredSize,\n PortAnchor,\n Position,\n Size,\n type WirePreviewBuffer,\n type WiresConfig,\n type World,\n} from \"@ice/core\";\nimport type { GroundFrame, GroundPass } from \"../pass\";\nimport { createSoupMesh } from \"./soup-mesh\";\nimport {\n activeQ,\n collectWires,\n connectDragQ,\n geometryQ,\n measuredQ,\n portQ,\n routedConnectQ,\n selectedQ,\n wireQ,\n} from \"./wires-collect\";\n\nexport function createWiresPass(\n initial: Partial<WiresConfig> = {},\n readPreview?: () => WirePreviewBuffer,\n): GroundPass {\n const config: WiresConfig = { ...DEFAULT_WIRES_CONFIG, ...initial };\n const soup = createSoupMesh(1);\n\n return {\n name: \"wires\",\n object: soup.mesh,\n arm(world: World, wake: () => void) {\n return [\n world.reactive.observeQuery(wireQ, wake, { cols: [] }),\n world.reactive.observeQuery(geometryQ, wake, { cols: [Position, Size] }),\n // MeasuredSize rides its own observer (readRect prefers it over Size):\n // in geometryQ's cols it would REQUIRE the rider and drop plain widgets.\n world.reactive.observeQuery(measuredQ, wake, { cols: [MeasuredSize] }),\n world.reactive.observeQuery(selectedQ, wake, { cols: [] }),\n // Nav churn: Active membership flips gate the scope filter (a wire\n // whose endpoints left the current frame must disappear this frame).\n world.reactive.observeQuery(activeQ, wake, { cols: [] }),\n world.reactive.observeQuery(portQ, wake, { cols: [PortAnchor] }),\n world.reactive.observeQuery(routedConnectQ, wake, { cols: [] }),\n world.reactive.observeQuery(connectDragQ, wake, { cols: [Drag] }),\n ];\n },\n collect(world: World, frame: GroundFrame) {\n soup.update(collectWires(world, frame, config, readPreview?.()));\n },\n dispose() {\n soup.dispose();\n },\n };\n}\n","/**\n * WebGPU renderer bootstrap for the ground layer.\n *\n * WebGPU-first (James, 2026-07-16): three's `WebGPURenderer` picks the WebGPU\n * backend when `navigator.gpu` exists and falls back to WebGL2 otherwise —\n * one code path, TSL compiles to WGSL or GLSL per backend. Init is ASYNC\n * (`renderer.init()`), but the reflector flush is synchronous: `ready()`\n * gates drawing, the layer keeps its dirty flags armed, and the first flush\n * after resolution paints (the rAF loop retries every frame — no extra wake\n * plumbing). Any construction/init failure (happy-dom, device loss, no\n * WebGL2 either) degrades to `failed()` — the layer reports available() =\n * false and never throws (grid.ts fault-isolation contract, design-002 §5).\n */\nimport { WebGPURenderer } from \"three/webgpu\";\nimport type { Camera, Scene } from \"three/webgpu\";\n\n/** The layer's renderer seam — tests inject a fake (compositor `GlLike` precedent). */\nexport interface GroundRendererLike {\n readonly canvas: HTMLCanvasElement;\n ready(): boolean;\n failed(): boolean;\n /** Register a one-shot \"became ready\" callback (fires immediately if already ready). */\n onReady(cb: () => void): void;\n setSize(cssW: number, cssH: number, dpr: number): void;\n render(scene: Scene, camera: Camera): void;\n dispose(): void;\n}\n\nexport function createGroundRenderer(\n doc: Document,\n opts: { forceWebGL?: boolean } = {},\n): GroundRendererLike {\n const canvas = doc.createElement(\"canvas\");\n let renderer: WebGPURenderer | null = null;\n let isReady = false;\n let isFailed = false;\n const readyCbs: Array<() => void> = [];\n\n // Probe BEFORE constructing: with neither WebGPU nor WebGL2 (happy-dom,\n // ancient browsers), three's WebGL2 fallback dies inside an internal\n // un-awaited promise — an unhandled rejection our init().catch never sees\n // (widgetlab app-mount test, 2026-07-16). The WebGL2 probe uses a SCRATCH\n // canvas: getContext('webgl2') on the real one would lock it out of a\n // 'webgpu' context (contexts are exclusive per canvas).\n const gpu = (globalThis.navigator as { gpu?: unknown } | undefined)?.gpu;\n if (gpu == null || opts.forceWebGL === true) {\n let gl2: unknown = null;\n try {\n gl2 = doc.createElement(\"canvas\").getContext(\"webgl2\");\n } catch {\n gl2 = null;\n }\n if (gl2 === null) isFailed = true;\n }\n\n if (!isFailed) {\n try {\n renderer = new WebGPURenderer({\n canvas: canvas as unknown as HTMLCanvasElement,\n alpha: true, // transparent clear — the page background shows through P0\n antialias: true,\n ...(opts.forceWebGL === true ? { forceWebGL: true } : {}),\n });\n renderer\n .init()\n .then(() => {\n isReady = true;\n for (const cb of readyCbs.splice(0)) cb();\n })\n .catch(() => {\n isFailed = true; // device loss mid-init\n });\n } catch {\n isFailed = true; // constructor threw\n }\n }\n\n let lastW = 0;\n let lastH = 0;\n let lastDpr = 0;\n\n return {\n canvas,\n ready: () => isReady,\n failed: () => isFailed,\n onReady(cb) {\n if (isReady) cb();\n else readyCbs.push(cb);\n },\n setSize(cssW, cssH, dpr) {\n if (renderer === null || (cssW === lastW && cssH === lastH && dpr === lastDpr)) return;\n lastW = cssW;\n lastH = cssH;\n lastDpr = dpr;\n try {\n renderer.setPixelRatio(dpr);\n // false: the layer owns the canvas CSS size (100% inset-0)\n renderer.setSize(Math.max(1, cssW), Math.max(1, cssH), false);\n } catch {\n isFailed = true;\n }\n },\n render(scene, camera) {\n if (renderer === null || !isReady || isFailed) return;\n try {\n renderer.render(scene, camera);\n } catch {\n isFailed = true; // device loss ⇒ silent no-op forever, never a throwing reflector\n }\n },\n dispose() {\n try {\n renderer?.dispose();\n } catch {\n /* already lost */\n }\n renderer = null;\n },\n };\n}\n","/**\n * @ice/ground — the P0 ground stratum as ONE WebGPU canvas (design-004 §1\n * as-built amendment, 2026-07-16). three's WebGPURenderer + TSL, WebGL2\n * fallback automatic. Off the react chain: react receives the layer as an\n * OPAQUE factory (`<InfiniteCanvas ground={ground(...)}>`); imperative apps\n * register `layer.reflector` themselves. Passes: dot grid, wires, snap\n * guides — future ground shaders/effects join the same pass registry.\n * (Selection chrome moved OFF the ground 2026-07-17: rings live with the\n * cards, the multi-select union box is P4 dom chrome — always on top.)\n */\nimport type { GridConfig, SnapGuidesConfig, WirePreviewBuffer, WiresConfig, World } from \"@ice/core\";\nimport { createLayer, type GroundLayerHost, type GroundReflector } from \"./layer\";\nimport type { GroundPass } from \"./pass\";\nimport { createGridPass } from \"./passes/grid\";\nimport { createGuidesPass } from \"./passes/guides\";\nimport { createWiresPass } from \"./passes/wires\";\nimport { createGroundRenderer, type GroundRendererLike } from \"./renderer\";\n\nexport type { GroundFrame, GroundPass } from \"./pass\";\nexport type { GroundReflector } from \"./layer\";\nexport type { GroundRendererLike } from \"./renderer\";\nexport { SoupBuilder, parseCssColor, type Rgba, type TriSoup } from \"./passes/soup-collect\";\nexport { collectGuides } from \"./passes/guides-collect\";\nexport { collectWires } from \"./passes/wires-collect\";\n// Config vocabulary re-exported for app ergonomics (canonical home: @ice/core).\nexport {\n DEFAULT_GRID_CONFIG,\n DEFAULT_SNAP_GUIDES_CONFIG,\n DEFAULT_WIRES_CONFIG,\n type GridConfig,\n type SnapGuidesConfig,\n type WiresConfig,\n} from \"@ice/core\";\n\nexport interface GroundContext {\n readonly host: GroundLayerHost;\n readonly world: World;\n /** Connect-drag preview reader (graph boards); omit on boards without wires. */\n readonly readWirePreview?: () => WirePreviewBuffer;\n}\n\nexport interface GroundLayer {\n readonly reflector: GroundReflector;\n /** Live grid re-tune (the react `grid` prop forwards here). */\n configureGrid(cfg: Partial<GridConfig>): void;\n dispose(): void;\n}\n\nexport interface GroundOptions {\n readonly grid?: Partial<GridConfig>;\n readonly wires?: Partial<WiresConfig>;\n readonly guides?: Partial<SnapGuidesConfig>;\n /** Extra app passes, rendered after the built-ins (renderOrder ≥ 3 is yours). */\n readonly passes?: readonly GroundPass[];\n /** Force the WebGL2 backend (debug / e2e A-B runs). */\n readonly forceWebGL?: boolean;\n /** TEST seam: inject a fake renderer (headless orchestration tests). */\n readonly rendererOverride?: GroundRendererLike;\n}\n\nexport type GroundFactory = (ctx: GroundContext) => GroundLayer;\n\n/**\n * Build the ground layer factory. Usage:\n * react apps: <InfiniteCanvas ground={ground({ grid: {...} })} …>\n * imperative apps: const layer = ground()( { host, world, readWirePreview } );\n * engine.registerReflector(layer.reflector);\n */\nexport function ground(opts: GroundOptions = {}): GroundFactory {\n return (ctx) => {\n const doc = ctx.host.container.ownerDocument;\n const renderer = opts.rendererOverride ?? createGroundRenderer(doc, { forceWebGL: opts.forceWebGL === true });\n const grid = createGridPass(opts.grid ?? {});\n const wires = createWiresPass(opts.wires ?? {}, ctx.readWirePreview);\n const guides = createGuidesPass(opts.guides ?? {});\n const passes: GroundPass[] = [grid, wires, guides, ...(opts.passes ?? [])];\n const layer = createLayer(ctx.host, ctx.world, renderer, passes);\n return {\n reflector: layer.reflector,\n configureGrid(cfg) {\n grid.configure(cfg);\n layer.invalidateAll();\n },\n dispose: layer.dispose,\n };\n };\n}\n"],"mappings":"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","names":["BufferAttribute","BufferGeometry","Mesh","MeshBasicNodeMaterial"]}
package/dist/index.js CHANGED
@@ -4,7 +4,9 @@ import {
4
4
  ActiveTool,
5
5
  All,
6
6
  Any,
7
+ BoardRoot,
7
8
  CAMERA_DEFAULTS,
9
+ CHROME_DEFAULTS,
8
10
  CORE_VERSION,
9
11
  Camera,
10
12
  CameraInertia,
@@ -13,13 +15,17 @@ import {
13
15
  CanvasSurface,
14
16
  Captures,
15
17
  ChildOf,
18
+ ChromeSettings,
16
19
  ClaimedBy,
17
20
  Container,
18
21
  ContainerCamera,
19
22
  Culled,
20
23
  CursorVisual,
24
+ DEFAULT_GRID_CONFIG,
21
25
  DEFAULT_PRESENCE_TTL_MS,
26
+ DEFAULT_SNAP_GUIDES_CONFIG,
22
27
  DEFAULT_SPAWN_PROFILES,
28
+ DEFAULT_WIRES_CONFIG,
23
29
  Down,
24
30
  Drag,
25
31
  Drags,
@@ -29,6 +35,7 @@ import {
29
35
  ENVELOPE_MAGIC,
30
36
  ENVELOPE_VERSION,
31
37
  EnvelopeError,
38
+ FIT_DEFAULTS,
32
39
  Follows,
33
40
  FrameInfo,
34
41
  GESTURE_DEFAULTS,
@@ -43,6 +50,8 @@ import {
43
50
  GestureRecognized,
44
51
  GestureSettings,
45
52
  GestureSuspended,
53
+ GhostCommitted,
54
+ GhostRetiring,
46
55
  Grab,
47
56
  GuideLine,
48
57
  HadCapture,
@@ -50,6 +59,7 @@ import {
50
59
  HadSequence,
51
60
  HandleSpec,
52
61
  HandledByWidget,
62
+ InsertGhost,
53
63
  Keyboard,
54
64
  Local,
55
65
  LocalPointer,
@@ -59,11 +69,17 @@ import {
59
69
  MeasuredSize,
60
70
  Movable,
61
71
  MultiTap,
72
+ NAV_TRANSITION_DEFAULTS,
73
+ NO_ENTITY,
62
74
  NO_MODS,
63
75
  NavCamera,
64
76
  NavDepth,
65
77
  NavFrame,
78
+ NavTransition,
79
+ NavTransitionSettings,
66
80
  Not,
81
+ Opacity,
82
+ OverInteractive,
67
83
  OverlapCandidate,
68
84
  OverlapRejected,
69
85
  PHASE_GROUPS,
@@ -112,8 +128,11 @@ import {
112
128
  SnapState,
113
129
  SnapTarget,
114
130
  Solid,
131
+ SpacingBar,
115
132
  SpatialVersion,
116
133
  StackZ,
134
+ StageMode,
135
+ SweepsContained,
117
136
  Tap,
118
137
  Targets,
119
138
  TouchesExact,
@@ -134,13 +153,19 @@ import {
134
153
  WirePorts,
135
154
  WirePrefab,
136
155
  WireTo,
156
+ abortNavFlight,
157
+ arrangeWidgets,
137
158
  attachBroadcastRelay,
138
159
  attachPresence,
160
+ attachSpawnParent,
139
161
  broadcastChannelByteChannel,
162
+ buildOrdinals,
140
163
  bumpVersion,
141
164
  cancelActiveGestures,
142
165
  cascadeDestroy,
143
166
  clearSelection,
167
+ compareStackOrder,
168
+ createActiveMembership,
144
169
  createBreakpointSystem,
145
170
  createCameraSystems,
146
171
  createCanvasEngine,
@@ -155,6 +180,7 @@ import {
155
180
  createLiveWriter,
156
181
  createMeasureIngest,
157
182
  createMeasureQueue,
183
+ createNavFlight,
158
184
  createNestedCanvas,
159
185
  createPipelineRegistry,
160
186
  createPortMaterialize,
@@ -164,6 +190,7 @@ import {
164
190
  createReflectorRegistry,
165
191
  createRemoteCursorsSystem,
166
192
  createSelectionChromeSystem,
193
+ createSiblingOrderIndex,
167
194
  createWidgetEquipSystem,
168
195
  createWidgetRuntime,
169
196
  createWireSync,
@@ -189,6 +216,7 @@ import {
189
216
  ensureCanvasSurface,
190
217
  enumOf,
191
218
  field,
219
+ frameParent,
192
220
  gateVerdict,
193
221
  guardedTransaction,
194
222
  hmrInvalidateOnSchemaChange,
@@ -201,9 +229,13 @@ import {
201
229
  joinDoc,
202
230
  makeDefaultMayDiverge,
203
231
  makeVersionGuard,
232
+ navFlightActive,
233
+ offerBase,
204
234
  openDocSession,
205
235
  p,
206
236
  pickTopAt,
237
+ portSlotOf,
238
+ portSlots,
207
239
  prefabs,
208
240
  readDocVersionReport,
209
241
  restoreAutosave,
@@ -213,23 +245,27 @@ import {
213
245
  setDevGuards,
214
246
  setFrameInfo,
215
247
  setSelection,
248
+ setWidgetProps,
216
249
  spawnWidget,
217
250
  stampEngineMeta,
218
251
  startAutosave,
252
+ startNavFlight,
219
253
  tools,
220
254
  webSocketByteChannel,
221
255
  widgetSpawnInits,
222
256
  widgets,
223
257
  writeRuntimeResource
224
- } from "./chunk-5S7GSXJG.js";
225
- import "./chunk-BCJ47SX7.js";
258
+ } from "./chunk-DXU3RZZS.js";
259
+ import "./chunk-OR5FNVUE.js";
226
260
  export {
227
261
  Accepts,
228
262
  Active,
229
263
  ActiveTool,
230
264
  All,
231
265
  Any,
266
+ BoardRoot,
232
267
  CAMERA_DEFAULTS,
268
+ CHROME_DEFAULTS,
233
269
  CORE_VERSION,
234
270
  Camera,
235
271
  CameraInertia,
@@ -238,13 +274,17 @@ export {
238
274
  CanvasSurface,
239
275
  Captures,
240
276
  ChildOf,
277
+ ChromeSettings,
241
278
  ClaimedBy,
242
279
  Container,
243
280
  ContainerCamera,
244
281
  Culled,
245
282
  CursorVisual,
283
+ DEFAULT_GRID_CONFIG,
246
284
  DEFAULT_PRESENCE_TTL_MS,
285
+ DEFAULT_SNAP_GUIDES_CONFIG,
247
286
  DEFAULT_SPAWN_PROFILES,
287
+ DEFAULT_WIRES_CONFIG,
248
288
  Down,
249
289
  Drag,
250
290
  Drags,
@@ -254,6 +294,7 @@ export {
254
294
  ENVELOPE_MAGIC,
255
295
  ENVELOPE_VERSION,
256
296
  EnvelopeError,
297
+ FIT_DEFAULTS,
257
298
  Follows,
258
299
  FrameInfo,
259
300
  GESTURE_DEFAULTS,
@@ -268,6 +309,8 @@ export {
268
309
  GestureRecognized,
269
310
  GestureSettings,
270
311
  GestureSuspended,
312
+ GhostCommitted,
313
+ GhostRetiring,
271
314
  Grab,
272
315
  GuideLine,
273
316
  HadCapture,
@@ -275,6 +318,7 @@ export {
275
318
  HadSequence,
276
319
  HandleSpec,
277
320
  HandledByWidget,
321
+ InsertGhost,
278
322
  Keyboard,
279
323
  Local,
280
324
  LocalPointer,
@@ -284,11 +328,17 @@ export {
284
328
  MeasuredSize,
285
329
  Movable,
286
330
  MultiTap,
331
+ NAV_TRANSITION_DEFAULTS,
332
+ NO_ENTITY,
287
333
  NO_MODS,
288
334
  NavCamera,
289
335
  NavDepth,
290
336
  NavFrame,
337
+ NavTransition,
338
+ NavTransitionSettings,
291
339
  Not,
340
+ Opacity,
341
+ OverInteractive,
292
342
  OverlapCandidate,
293
343
  OverlapRejected,
294
344
  PHASE_GROUPS,
@@ -337,8 +387,11 @@ export {
337
387
  SnapState,
338
388
  SnapTarget,
339
389
  Solid,
390
+ SpacingBar,
340
391
  SpatialVersion,
341
392
  StackZ,
393
+ StageMode,
394
+ SweepsContained,
342
395
  Tap,
343
396
  Targets,
344
397
  TouchesExact,
@@ -359,13 +412,19 @@ export {
359
412
  WirePorts,
360
413
  WirePrefab,
361
414
  WireTo,
415
+ abortNavFlight,
416
+ arrangeWidgets,
362
417
  attachBroadcastRelay,
363
418
  attachPresence,
419
+ attachSpawnParent,
364
420
  broadcastChannelByteChannel,
421
+ buildOrdinals,
365
422
  bumpVersion,
366
423
  cancelActiveGestures,
367
424
  cascadeDestroy,
368
425
  clearSelection,
426
+ compareStackOrder,
427
+ createActiveMembership,
369
428
  createBreakpointSystem,
370
429
  createCameraSystems,
371
430
  createCanvasEngine,
@@ -380,6 +439,7 @@ export {
380
439
  createLiveWriter,
381
440
  createMeasureIngest,
382
441
  createMeasureQueue,
442
+ createNavFlight,
383
443
  createNestedCanvas,
384
444
  createPipelineRegistry,
385
445
  createPortMaterialize,
@@ -389,6 +449,7 @@ export {
389
449
  createReflectorRegistry,
390
450
  createRemoteCursorsSystem,
391
451
  createSelectionChromeSystem,
452
+ createSiblingOrderIndex,
392
453
  createWidgetEquipSystem,
393
454
  createWidgetRuntime,
394
455
  createWireSync,
@@ -414,6 +475,7 @@ export {
414
475
  ensureCanvasSurface,
415
476
  enumOf,
416
477
  field,
478
+ frameParent,
417
479
  gateVerdict,
418
480
  guardedTransaction,
419
481
  hmrInvalidateOnSchemaChange,
@@ -426,9 +488,13 @@ export {
426
488
  joinDoc,
427
489
  makeDefaultMayDiverge,
428
490
  makeVersionGuard,
491
+ navFlightActive,
492
+ offerBase,
429
493
  openDocSession,
430
494
  p,
431
495
  pickTopAt,
496
+ portSlotOf,
497
+ portSlots,
432
498
  prefabs,
433
499
  readDocVersionReport,
434
500
  restoreAutosave,
@@ -438,9 +504,11 @@ export {
438
504
  setDevGuards,
439
505
  setFrameInfo,
440
506
  setSelection,
507
+ setWidgetProps,
441
508
  spawnWidget,
442
509
  stampEngineMeta,
443
510
  startAutosave,
511
+ startNavFlight,
444
512
  tools,
445
513
  webSocketByteChannel,
446
514
  widgetSpawnInits,
package/dist/kernel.js CHANGED
@@ -3,57 +3,87 @@ import {
3
3
  SpatialIndex,
4
4
  ZOOM_BANDS,
5
5
  aabbToRect,
6
+ capFlightStart,
6
7
  clamp,
8
+ composeAffine,
7
9
  compositeCameraFrustum,
8
10
  computeIslandPhase,
9
11
  computeSnapGuides,
10
12
  cubicAABB,
13
+ cubicBezierEase,
11
14
  cubicPoint,
12
15
  distanceToCubic,
13
16
  distanceToSegment,
14
17
  fboPixelSize,
18
+ fitCamera,
19
+ flightCamera,
20
+ flightOctaves,
21
+ insertSlot,
15
22
  intersectsAABB,
23
+ invertAffine,
16
24
  isOutOfBand,
17
25
  islandToWorld,
26
+ layerGraph,
27
+ packLayout,
18
28
  planeCssTransform,
19
29
  pointInAABB,
20
30
  portAnchor,
31
+ portalAffine,
21
32
  rectToAABB,
22
33
  screenToWorld,
23
34
  selectBand,
24
35
  selectEvictions,
25
36
  sideDirection,
37
+ solveFlightStart,
38
+ springStep,
39
+ tessellateCubic,
40
+ visibleRect,
26
41
  wireCubic,
27
42
  worldRectToComposite,
28
43
  worldToIsland,
29
44
  worldToScreen,
30
45
  zoomAtPoint
31
- } from "./chunk-BCJ47SX7.js";
46
+ } from "./chunk-OR5FNVUE.js";
32
47
  export {
33
48
  KERNEL_VERSION,
34
49
  SpatialIndex,
35
50
  ZOOM_BANDS,
36
51
  aabbToRect,
52
+ capFlightStart,
37
53
  clamp,
54
+ composeAffine,
38
55
  compositeCameraFrustum,
39
56
  computeIslandPhase,
40
57
  computeSnapGuides,
41
58
  cubicAABB,
59
+ cubicBezierEase,
42
60
  cubicPoint,
43
61
  distanceToCubic,
44
62
  distanceToSegment,
45
63
  fboPixelSize,
64
+ fitCamera,
65
+ flightCamera,
66
+ flightOctaves,
67
+ insertSlot,
46
68
  intersectsAABB,
69
+ invertAffine,
47
70
  isOutOfBand,
48
71
  islandToWorld,
72
+ layerGraph,
73
+ packLayout,
49
74
  planeCssTransform,
50
75
  pointInAABB,
51
76
  portAnchor,
77
+ portalAffine,
52
78
  rectToAABB,
53
79
  screenToWorld,
54
80
  selectBand,
55
81
  selectEvictions,
56
82
  sideDirection,
83
+ solveFlightStart,
84
+ springStep,
85
+ tessellateCubic,
86
+ visibleRect,
57
87
  wireCubic,
58
88
  worldRectToComposite,
59
89
  worldToIsland,