@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.
- package/README.md +37 -2
- package/dist/chunk-5SJYHQI4.js +636 -0
- package/dist/chunk-5SJYHQI4.js.map +1 -0
- package/dist/{chunk-5S7GSXJG.js → chunk-DXU3RZZS.js} +2913 -1180
- package/dist/chunk-DXU3RZZS.js.map +1 -0
- package/dist/{chunk-FIAXPNNY.js → chunk-IASTQMU5.js} +130 -551
- package/dist/chunk-IASTQMU5.js.map +1 -0
- package/dist/{chunk-BCJ47SX7.js → chunk-OR5FNVUE.js} +460 -1
- package/dist/chunk-OR5FNVUE.js.map +1 -0
- package/dist/devtools.js +508 -372
- package/dist/devtools.js.map +1 -1
- package/dist/dom.js +3 -11
- package/dist/ground.js +715 -0
- package/dist/ground.js.map +1 -0
- package/dist/index.js +70 -2
- package/dist/kernel.js +31 -1
- package/dist/r3f.js +599 -62
- package/dist/r3f.js.map +1 -1
- package/dist/react.js +34 -418
- package/dist/react.js.map +1 -1
- package/dist/types/packages/core/src/catalog/camera-derived.d.ts +41 -3
- package/dist/types/packages/core/src/catalog/gesture.d.ts +39 -3
- package/dist/types/packages/core/src/catalog/graph.d.ts +7 -6
- package/dist/types/packages/core/src/catalog/index.d.ts +1 -0
- package/dist/types/packages/core/src/catalog/insert.d.ts +31 -0
- package/dist/types/packages/core/src/catalog/pointer.d.ts +11 -0
- package/dist/types/packages/core/src/catalog/scene.d.ts +37 -4
- package/dist/types/packages/core/src/catalog/selection-presence.d.ts +7 -0
- package/dist/types/packages/core/src/catalog/settings-resources.d.ts +21 -0
- package/dist/types/packages/core/src/doc/autosave.d.ts +15 -2
- package/dist/types/packages/core/src/doc/bootstrap.d.ts +29 -0
- package/dist/types/packages/core/src/doc/channels.d.ts +9 -0
- package/dist/types/packages/core/src/doc/doc-commit-sink.d.ts +2 -1
- package/dist/types/packages/core/src/doc/doc-kit.d.ts +16 -1
- package/dist/types/packages/core/src/doc/envelope.d.ts +2 -1
- package/dist/types/packages/core/src/doc/migrate.d.ts +8 -6
- package/dist/types/packages/core/src/doc/schema-migrate.d.ts +50 -0
- package/dist/types/packages/core/src/doc/version-gate.d.ts +3 -0
- package/dist/types/packages/core/src/engine/commit-sink.d.ts +24 -2
- package/dist/types/packages/core/src/engine/frame-info.d.ts +16 -1
- package/dist/types/packages/core/src/facade/create-canvas-engine.d.ts +70 -6
- package/dist/types/packages/core/src/guards/guarded-tx.d.ts +4 -2
- package/dist/types/packages/core/src/helpers/churn-guard.d.ts +40 -0
- package/dist/types/packages/core/src/index.d.ts +13 -7
- package/dist/types/packages/core/src/input/queue.d.ts +11 -0
- package/dist/types/packages/core/src/nav/nested-canvas.d.ts +47 -11
- package/dist/types/packages/core/src/ops/arrange.d.ts +15 -0
- package/dist/types/packages/core/src/ops/insert.d.ts +62 -0
- package/dist/types/packages/core/src/ops/point-pick.d.ts +11 -7
- package/dist/types/packages/core/src/ops/sibling-order.d.ts +70 -0
- package/dist/types/packages/core/src/schema/meta.d.ts +1 -0
- package/dist/types/packages/core/src/settings/defaults.d.ts +45 -0
- package/dist/types/packages/core/src/settings/ground-config.d.ts +55 -0
- package/dist/types/packages/core/src/systems/chrome.d.ts +6 -2
- package/dist/types/packages/core/src/systems/insert-ghost.d.ts +25 -0
- package/dist/types/packages/core/src/systems/l1-pick.d.ts +25 -11
- package/dist/types/packages/core/src/systems/l2-recognize.d.ts +10 -4
- package/dist/types/packages/core/src/systems/l3-behave.d.ts +6 -4
- package/dist/types/packages/core/src/systems/l3-claim.d.ts +7 -3
- package/dist/types/packages/core/src/systems/l3-drop.d.ts +3 -1
- package/dist/types/packages/core/src/systems/l3-resize.d.ts +3 -1
- package/dist/types/packages/core/src/systems/l3-snap.d.ts +25 -7
- package/dist/types/packages/core/src/systems/nav-flight.d.ts +95 -0
- package/dist/types/packages/core/src/widget/define-widget.d.ts +39 -0
- package/dist/types/packages/core/src/widget/mount-store.d.ts +11 -3
- package/dist/types/packages/core/src/widget/set-props.d.ts +16 -0
- package/dist/types/packages/core/src/widget/spawn.d.ts +21 -1
- package/dist/types/packages/devtools/src/attach.d.ts +77 -0
- package/dist/types/packages/devtools/src/dock.d.ts +38 -0
- package/dist/types/packages/devtools/src/gl-panel.d.ts +69 -0
- package/dist/types/packages/devtools/src/index.d.ts +8 -6
- package/dist/types/packages/dom/src/index.d.ts +1 -3
- package/dist/types/packages/dom/src/measure-wiring.d.ts +2 -2
- package/dist/types/packages/dom/src/pointer-adapter.d.ts +21 -1
- package/dist/types/packages/dom/src/reflectors/dom-widgets.d.ts +5 -0
- package/dist/types/packages/ground/src/index.d.ts +52 -0
- package/dist/types/packages/ground/src/layer.d.ts +40 -0
- package/dist/types/packages/ground/src/pass.d.ts +41 -0
- package/dist/types/packages/ground/src/passes/grid.d.ts +21 -0
- package/dist/types/packages/ground/src/passes/guides-collect.d.ts +14 -0
- package/dist/types/packages/ground/src/passes/guides.d.ts +3 -0
- package/dist/types/packages/ground/src/passes/soup-collect.d.ts +35 -0
- package/dist/types/packages/ground/src/passes/soup-mesh.d.ts +8 -0
- package/dist/types/packages/ground/src/passes/wires-collect.d.ts +31 -0
- package/dist/types/packages/ground/src/passes/wires.d.ts +10 -0
- package/dist/types/packages/ground/src/renderer.d.ts +15 -0
- package/dist/types/packages/ice/src/ground.d.ts +1 -0
- package/dist/types/packages/kernel/src/bezier.d.ts +15 -0
- package/dist/types/packages/kernel/src/coords.d.ts +15 -0
- package/dist/types/packages/kernel/src/easing.d.ts +11 -0
- package/dist/types/packages/kernel/src/index.d.ts +3 -0
- package/dist/types/packages/kernel/src/layout.d.ts +118 -0
- package/dist/types/packages/kernel/src/nav-flight.d.ts +93 -0
- package/dist/types/packages/r3f/src/bridge.d.ts +73 -12
- package/dist/types/packages/r3f/src/composite-material.d.ts +9 -0
- package/dist/types/packages/r3f/src/compositor-pass.d.ts +22 -0
- package/dist/types/packages/r3f/src/gl-root.d.ts +76 -1
- package/dist/types/packages/r3f/src/gl-router.d.ts +10 -0
- package/dist/types/packages/r3f/src/index.d.ts +3 -2
- package/dist/types/packages/r3f/src/island-state.d.ts +44 -0
- package/dist/types/packages/r3f/src/preview-capture.d.ts +19 -0
- package/dist/types/packages/r3f/src/self-sustain.d.ts +39 -0
- package/dist/types/packages/r3f/src/use-island-frame.d.ts +16 -1
- package/dist/types/packages/react/src/engine-context.d.ts +8 -0
- package/dist/types/packages/react/src/index.d.ts +4 -2
- package/dist/types/packages/react/src/infinite-canvas.d.ts +40 -6
- package/dist/types/packages/react/src/preview-snapshots.d.ts +17 -0
- package/dist/types/packages/react/src/widget-preview.d.ts +14 -0
- package/package.json +13 -8
- package/dist/chunk-5S7GSXJG.js.map +0 -1
- package/dist/chunk-BCJ47SX7.js.map +0 -1
- package/dist/chunk-FIAXPNNY.js.map +0 -1
- package/dist/types/packages/devtools/src/panel.d.ts +0 -48
- package/dist/types/packages/dom/src/reflectors/grid.d.ts +0 -63
- package/dist/types/packages/dom/src/reflectors/wires.d.ts +0 -88
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../kernel/src/shapes.ts","../../kernel/src/coords.ts","../../kernel/src/snap.ts","../../kernel/src/spatial-index.ts","../../kernel/src/zoom-bands.ts","../../kernel/src/eviction.ts","../../kernel/src/anchors.ts","../../kernel/src/bezier.ts","../../kernel/src/easing.ts","../../kernel/src/nav-flight.ts","../../kernel/src/layout.ts","../../kernel/src/index.ts"],"sourcesContent":["/** Plain geometric structs shared across the kernel. Ported from v1 `ecs/math.ts`. */\n\nexport interface Vec2 {\n x: number;\n y: number;\n}\n\nexport interface Rect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface AABB {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport function rectToAABB(r: Rect): AABB {\n return { minX: r.x, minY: r.y, maxX: r.x + r.width, maxY: r.y + r.height };\n}\n\nexport function aabbToRect(a: AABB): Rect {\n return { x: a.minX, y: a.minY, width: a.maxX - a.minX, height: a.maxY - a.minY };\n}\n\nexport function intersectsAABB(a: AABB, b: AABB): boolean {\n return a.maxX >= b.minX && a.minX <= b.maxX && a.maxY >= b.minY && a.minY <= b.maxY;\n}\n\nexport function pointInAABB(px: number, py: number, a: AABB): boolean {\n return px >= a.minX && px <= a.maxX && py >= a.minY && py <= a.maxY;\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n","/**\n * THE coordinate seam (Law 13): every conversion between screen, world, and\n * island (widget-local GL) space lives here — including the ONE Y-flip.\n * v1 duplicated this math in three places; nothing outside this module may\n * re-derive it.\n *\n * Conventions:\n * - screen: CSS px, canvas-container-relative, Y-down. DPR never enters world\n * math (it exists only in GL uniforms / FBO sizing — see zoom-bands).\n * - world: world units, Y-down. `Camera.{x,y}` is the WORLD point at the\n * viewport's top-left; `zoom` is screen px per world unit.\n * - island: widget-local GL space — CENTER origin, Y-UP, world-unit scale.\n * (v1 VirtualWidget convention; the only Y-flip in the codebase.)\n */\nimport type { Rect, Vec2 } from \"./shapes\";\n\nexport interface CameraState {\n x: number;\n y: number;\n zoom: number;\n}\n\nexport function screenToWorld(screenX: number, screenY: number, camera: CameraState): Vec2 {\n return {\n x: screenX / camera.zoom + camera.x,\n y: screenY / camera.zoom + camera.y,\n };\n}\n\nexport function worldToScreen(worldX: number, worldY: number, camera: CameraState): Vec2 {\n return {\n x: (worldX - camera.x) * camera.zoom,\n y: (worldY - camera.y) * camera.zoom,\n };\n}\n\n/**\n * Zoom about a fixed screen point (v1 `zoomAtPoint`): the world point under\n * `(screenX, screenY)` stays under it after the zoom change.\n * Returns the new camera (does not mutate). Clamping is the caller's policy.\n */\nexport function zoomAtPoint(\n camera: CameraState,\n screenX: number,\n screenY: number,\n newZoom: number,\n): CameraState {\n const anchor = screenToWorld(screenX, screenY, camera);\n return {\n x: anchor.x - screenX / newZoom,\n y: anchor.y - screenY / newZoom,\n zoom: newZoom,\n };\n}\n\n/**\n * The DEFAULT framing camera (2026-07-18, James: \"do zoom to fit, but with a\n * upper and bottom cap … should feel natural\"): zoom-to-fit `content` (a\n * world-space bbox) with `pad` px of breathing room on every side, zoom\n * clamped into [minZoom, maxZoom] — the natural band: never so far in that\n * one small card fills the screen, never so far out that the board turns\n * into an ant farm. The content CENTER stays centered whether or not a cap\n * engages. Callers own the band policy (engine default: FIT_DEFAULTS ∩ the\n * session's hard CameraLimits) and must pass a real viewport.\n */\nexport function fitCamera(\n content: Rect,\n vpW: number,\n vpH: number,\n opts: { pad: number; minZoom: number; maxZoom: number },\n): CameraState {\n const fit = Math.min(vpW / (content.width + opts.pad * 2), vpH / (content.height + opts.pad * 2));\n const zoom = Math.min(opts.maxZoom, Math.max(opts.minZoom, fit));\n return {\n x: content.x + content.width / 2 - vpW / (2 * zoom),\n y: content.y + content.height / 2 - vpH / (2 * zoom),\n zoom,\n };\n}\n\n/**\n * Camera → the ONE per-plane CSS transform (design-002 §5 `planeTransform`).\n * Children are laid out in WORLD units inside the plane (left/top = world x/y),\n * the plane carries `transform: translate(tx px, ty px) scale(scale)` with\n * `transform-origin: 0 0` — so a child at world point p lands at\n * `p·zoom + t = (p − camera)·zoom`, i.e. exactly `worldToScreen(p)`.\n */\nexport function planeCssTransform(camera: CameraState): { tx: number; ty: number; scale: number } {\n return {\n tx: -camera.x * camera.zoom,\n ty: -camera.y * camera.zoom,\n scale: camera.zoom,\n };\n}\n\n/** World → island (center-origin, Y-up). THE Y-flip, direction one. */\nexport function worldToIsland(worldX: number, worldY: number, widget: Rect): Vec2 {\n return {\n x: worldX - (widget.x + widget.width / 2),\n y: -(worldY - (widget.y + widget.height / 2)),\n };\n}\n\n/** Island → world. THE Y-flip, direction two. */\nexport function islandToWorld(islandX: number, islandY: number, widget: Rect): Vec2 {\n return {\n x: widget.x + widget.width / 2 + islandX,\n y: widget.y + widget.height / 2 - islandY,\n };\n}\n\n// --- P2 composite scene (design-004 §1/§3) -------------------------------\n// The GL-views plane composites island quads in a Three scene whose axes are\n// world-unit X-right / Y-UP (Three convention). Same flip as island space,\n// applied at WORLD scale — these two helpers are the only place it exists.\n\n/**\n * Camera → the P2 composite ortho frustum + camera position (world units,\n * Y-up scene). `left/top` pin the viewport's top-left to `Camera.{x,y}`\n * exactly like `planeCssTransform` does for the DOM planes: the frustum spans\n * `viewport / zoom` world units and the camera sits at the world origin\n * offset, so a quad at `worldRectToComposite(rect)` lands on the same screen\n * pixels as a DOM host at `rect` under the plane transform.\n */\nexport function compositeCameraFrustum(\n camera: CameraState,\n viewportW: number,\n viewportH: number,\n): { left: number; right: number; top: number; bottom: number; x: number; y: number } {\n return {\n left: 0,\n right: viewportW / camera.zoom,\n top: 0,\n bottom: -(viewportH / camera.zoom),\n x: camera.x,\n y: -camera.y,\n };\n}\n\n/** World rect → composite-quad center + scale in the Y-up P2 scene. */\nexport function worldRectToComposite(rect: Rect): { x: number; y: number; sx: number; sy: number } {\n return {\n x: rect.x + rect.width / 2,\n y: -(rect.y + rect.height / 2),\n sx: rect.width,\n sy: rect.height,\n };\n}\n","/**\n * Snap guide computation (Figma-style), ported verbatim from v1\n * `ecs/spatial/snap.ts` (audited CLEAN-PORT):\n * Phase 1 — edge/center alignment (7 X + 7 Y candidate pairs per reference,\n * per-axis nearest-wins, ties within 0.01 accumulate guides)\n * Phase 2 — equal spacing (between-two-neighbors midpoint; extend-a-pattern),\n * same-perpendicular-band filter\n * Merge — alignment takes priority per axis; equal spacing fills the other;\n * indicators recomputed post-snap at threshold × 0.5.\n * Pure function over plain bounds. Candidate GATHERING (spatial index, tags,\n * Active scoping) is the caller's job — design-003 §5.2/§6.\n */\n\nexport interface SnapGuide {\n axis: \"x\" | \"y\";\n /** World-space coordinate of the alignment line */\n position: number;\n type: \"edge\" | \"center\";\n}\n\nexport interface EqualSpacingIndicator {\n axis: \"x\" | \"y\";\n /** The equal gap value (world units) */\n gap: number;\n /** Pairs of (from, to) marking each equal gap segment */\n segments: { from: number; to: number }[];\n /** Position on the perpendicular axis (for rendering) */\n perpPosition: number;\n}\n\nexport interface SnapResult {\n /** Snap-corrected delta (world units). Apply to entity position. */\n snapDx: number;\n snapDy: number;\n guides: SnapGuide[];\n spacings: EqualSpacingIndicator[];\n}\n\nexport interface EntityBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport function computeSnapGuides(\n dragged: EntityBounds,\n references: EntityBounds[],\n threshold: number,\n): SnapResult {\n const guides: SnapGuide[] = [];\n const spacings: EqualSpacingIndicator[] = [];\n let snapDx = 0;\n let snapDy = 0;\n\n const dLeft = dragged.x;\n const dRight = dragged.x + dragged.width;\n const dCenterX = dragged.x + dragged.width / 2;\n const dTop = dragged.y;\n const dBottom = dragged.y + dragged.height;\n const dCenterY = dragged.y + dragged.height / 2;\n\n let bestSnapX = Number.POSITIVE_INFINITY;\n let bestSnapY = Number.POSITIVE_INFINITY;\n let bestDx = 0;\n let bestDy = 0;\n const xGuides: SnapGuide[] = [];\n const yGuides: SnapGuide[] = [];\n\n // --- Phase 1: edge/center alignment ---\n for (const ref of references) {\n const rLeft = ref.x;\n const rRight = ref.x + ref.width;\n const rCenterX = ref.x + ref.width / 2;\n const rTop = ref.y;\n const rBottom = ref.y + ref.height;\n const rCenterY = ref.y + ref.height / 2;\n\n const xPairs: [number, number, \"edge\" | \"center\"][] = [\n [dLeft, rLeft, \"edge\"],\n [dLeft, rRight, \"edge\"],\n [dRight, rLeft, \"edge\"],\n [dRight, rRight, \"edge\"],\n [dCenterX, rCenterX, \"center\"],\n [dLeft, rCenterX, \"edge\"],\n [dRight, rCenterX, \"edge\"],\n ];\n for (const [dVal, rVal, type] of xPairs) {\n const dist = Math.abs(dVal - rVal);\n if (dist <= threshold) {\n const dx = rVal - dVal;\n if (dist < bestSnapX) {\n bestSnapX = dist;\n bestDx = dx;\n xGuides.length = 0;\n }\n if (dist <= bestSnapX + 0.01) {\n xGuides.push({ axis: \"x\", position: rVal, type });\n }\n }\n }\n\n const yPairs: [number, number, \"edge\" | \"center\"][] = [\n [dTop, rTop, \"edge\"],\n [dTop, rBottom, \"edge\"],\n [dBottom, rTop, \"edge\"],\n [dBottom, rBottom, \"edge\"],\n [dCenterY, rCenterY, \"center\"],\n [dTop, rCenterY, \"edge\"],\n [dBottom, rCenterY, \"edge\"],\n ];\n for (const [dVal, rVal, type] of yPairs) {\n const dist = Math.abs(dVal - rVal);\n if (dist <= threshold) {\n const dy = rVal - dVal;\n if (dist < bestSnapY) {\n bestSnapY = dist;\n bestDy = dy;\n yGuides.length = 0;\n }\n if (dist <= bestSnapY + 0.01) {\n yGuides.push({ axis: \"y\", position: rVal, type });\n }\n }\n }\n }\n\n // --- Phase 2: equal spacing ---\n const eqResult = computeEqualSpacing(dragged, references, threshold);\n\n // Merge: alignment snap takes priority; equal spacing fills the other axis.\n if (bestSnapX <= threshold) {\n snapDx = bestDx;\n } else if (eqResult.snapDx !== undefined) {\n snapDx = eqResult.snapDx;\n }\n if (bestSnapY <= threshold) {\n snapDy = bestDy;\n } else if (eqResult.snapDy !== undefined) {\n snapDy = eqResult.snapDy;\n }\n\n if (bestSnapX <= threshold) {\n const seen = new Set<number>();\n for (const g of xGuides) {\n if (!seen.has(g.position)) {\n seen.add(g.position);\n guides.push(g);\n }\n }\n }\n if (bestSnapY <= threshold) {\n const seen = new Set<number>();\n for (const g of yGuides) {\n if (!seen.has(g.position)) {\n seen.add(g.position);\n guides.push(g);\n }\n }\n }\n\n // Indicators recomputed against the SNAPPED bounds at half threshold.\n const snappedBounds: EntityBounds = {\n x: dragged.x + snapDx,\n y: dragged.y + snapDy,\n width: dragged.width,\n height: dragged.height,\n };\n const eqFinal = computeEqualSpacing(snappedBounds, references, threshold * 0.5);\n spacings.push(...eqFinal.indicators);\n\n return { snapDx, snapDy, guides, spacings };\n}\n\ninterface EqualSpacingResult {\n snapDx: number | undefined;\n snapDy: number | undefined;\n indicators: EqualSpacingIndicator[];\n}\n\nfunction computeEqualSpacing(\n dragged: EntityBounds,\n references: EntityBounds[],\n threshold: number,\n): EqualSpacingResult {\n const indicators: EqualSpacingIndicator[] = [];\n let snapDx: number | undefined;\n let snapDy: number | undefined;\n\n const xResult = checkAxisSpacing(dragged, references, threshold, \"x\");\n if (xResult) {\n snapDx = xResult.snap;\n indicators.push(...xResult.indicators);\n }\n const yResult = checkAxisSpacing(dragged, references, threshold, \"y\");\n if (yResult) {\n snapDy = yResult.snap;\n indicators.push(...yResult.indicators);\n }\n return { snapDx, snapDy, indicators };\n}\n\nfunction checkAxisSpacing(\n dragged: EntityBounds,\n references: EntityBounds[],\n threshold: number,\n axis: \"x\" | \"y\",\n): { snap: number; indicators: EqualSpacingIndicator[] } | null {\n const isX = axis === \"x\";\n const pos = (b: EntityBounds) => (isX ? b.x : b.y);\n const size = (b: EntityBounds) => (isX ? b.width : b.height);\n const perpPos = (b: EntityBounds) => (isX ? b.y : b.x);\n const perpSize = (b: EntityBounds) => (isX ? b.height : b.width);\n const end = (b: EntityBounds) => pos(b) + size(b);\n\n // Same-perpendicular-band filter.\n const neighbors = references.filter(\n (ref) =>\n perpPos(ref) < perpPos(dragged) + perpSize(dragged) &&\n perpPos(ref) + perpSize(ref) > perpPos(dragged),\n );\n if (neighbors.length < 1) return null;\n\n const sorted = [...neighbors].sort((a, b) => pos(a) - pos(b));\n\n // Existing gaps between consecutive references.\n const refGaps: { from: EntityBounds; to: EntityBounds; gap: number }[] = [];\n for (let i = 0; i < sorted.length - 1; i++) {\n const a = sorted[i];\n const b = sorted[i + 1];\n if (a === undefined || b === undefined) continue;\n const gap = pos(b) - end(a);\n if (gap > 0.1) refGaps.push({ from: a, to: b, gap });\n }\n\n let bestSnap: number | null = null;\n let bestIndicators: EqualSpacingIndicator[] = [];\n let bestDiff = Number.POSITIVE_INFINITY;\n\n // Case 1: between two neighbors — equalize left/right gaps.\n let leftN: EntityBounds | null = null;\n let rightN: EntityBounds | null = null;\n for (const ref of sorted) {\n if (end(ref) <= pos(dragged) + threshold) {\n if (!leftN || end(ref) > end(leftN)) leftN = ref;\n }\n if (pos(ref) >= end(dragged) - threshold) {\n if (!rightN || pos(ref) < pos(rightN)) rightN = ref;\n }\n }\n if (leftN && rightN) {\n const lGap = pos(dragged) - end(leftN);\n const rGap = pos(rightN) - end(dragged);\n const diff = Math.abs(lGap - rGap);\n if (diff <= threshold && diff < bestDiff) {\n const idealPos = (end(leftN) + pos(rightN) - size(dragged)) / 2;\n const snap = idealPos - pos(dragged);\n const equalGap = (pos(rightN) - end(leftN) - size(dragged)) / 2;\n if (equalGap > 0.1) {\n const perpY = computePerpCenter(dragged, [leftN, rightN], isX);\n bestSnap = snap;\n bestDiff = diff;\n bestIndicators = [\n {\n axis,\n gap: equalGap,\n segments: [\n { from: end(leftN), to: idealPos },\n { from: idealPos + size(dragged), to: pos(rightN) },\n ],\n perpPosition: perpY,\n },\n ];\n }\n }\n }\n\n // Case 2: extend an existing gap pattern (append right / prepend left).\n for (const refGap of refGaps) {\n const patternGap = refGap.gap;\n\n if (rightN === null || pos(refGap.to) >= end(dragged) - threshold * 2) {\n const chainEnd = refGap.to;\n const dragGap = pos(dragged) - end(chainEnd);\n const diff = Math.abs(dragGap - patternGap);\n if (diff <= threshold && diff < bestDiff) {\n const idealPos = end(chainEnd) + patternGap;\n const snap = idealPos - pos(dragged);\n const perpY = computePerpCenter(dragged, [refGap.from, refGap.to], isX);\n bestSnap = snap;\n bestDiff = diff;\n bestIndicators = [\n {\n axis,\n gap: patternGap,\n segments: [\n { from: end(refGap.from), to: pos(refGap.to) },\n { from: end(chainEnd), to: idealPos },\n ],\n perpPosition: perpY,\n },\n ];\n }\n }\n\n if (leftN === null || end(refGap.from) <= pos(dragged) + threshold * 2) {\n const chainStart = refGap.from;\n const dragGap = pos(chainStart) - end(dragged);\n const diff = Math.abs(dragGap - patternGap);\n if (diff <= threshold && diff < bestDiff) {\n const idealPos = pos(chainStart) - patternGap - size(dragged);\n const snap = idealPos - pos(dragged);\n const perpY = computePerpCenter(dragged, [refGap.from, refGap.to], isX);\n bestSnap = snap;\n bestDiff = diff;\n bestIndicators = [\n {\n axis,\n gap: patternGap,\n segments: [\n { from: idealPos + size(dragged), to: pos(chainStart) },\n { from: end(refGap.from), to: pos(refGap.to) },\n ],\n perpPosition: perpY,\n },\n ];\n }\n }\n }\n\n if (bestSnap !== null) return { snap: bestSnap, indicators: bestIndicators };\n return null;\n}\n\nfunction computePerpCenter(dragged: EntityBounds, refs: EntityBounds[], isX: boolean): number {\n const perpPos = (b: EntityBounds) => (isX ? b.y : b.x);\n const perpSize = (b: EntityBounds) => (isX ? b.height : b.width);\n const allBounds = [dragged, ...refs];\n const maxStart = Math.max(...allBounds.map(perpPos));\n const minEnd = Math.min(...allBounds.map((b) => perpPos(b) + perpSize(b)));\n if (minEnd < maxStart) {\n return perpPos(dragged) + perpSize(dragged) / 2;\n }\n return maxStart + (minEnd - maxStart) / 2;\n}\n","/**\n * Spatial index backed by an R-tree (rbush) — ported from v1 (audited CLEAN-PORT).\n * World-space AABBs for culling, hit-testing, and snap-candidate gathering\n * (Law 15: the ONLY hit path). The id↔entry map gives O(log n) removal by\n * passing rbush the exact stored reference (v1 \"Fix #8\").\n *\n * `rbush` is the kernel's single, named dependency exception: a zero-dep pure\n * data structure (see .dependency-cruiser.cjs).\n */\nimport RBushImport from \"rbush\";\nimport type { AABB } from \"./shapes\";\n\n// CJS/ESM interop — rbush exports differently depending on context (kept from v1).\ntype RBushModule = typeof RBushImport & { default?: typeof RBushImport };\nconst rbushModule = RBushImport as RBushModule;\nconst RBush = (\n typeof rbushModule.default === \"function\" ? rbushModule.default : RBushImport\n) as typeof RBushImport;\n\nexport interface SpatialEntry<Id> extends AABB {\n id: Id;\n}\n\nexport class SpatialIndex<Id> {\n private tree = new RBush<SpatialEntry<Id>>();\n private entries = new Map<Id, SpatialEntry<Id>>();\n\n upsert(id: Id, bounds: AABB): void {\n const existing = this.entries.get(id);\n if (existing) this.tree.remove(existing);\n const entry: SpatialEntry<Id> = { ...bounds, id };\n this.entries.set(id, entry);\n this.tree.insert(entry);\n }\n\n remove(id: Id): void {\n const existing = this.entries.get(id);\n if (existing) {\n this.tree.remove(existing);\n this.entries.delete(id);\n }\n }\n\n /** All entries intersecting the given AABB. */\n search(bounds: AABB): SpatialEntry<Id>[] {\n return this.tree.search(bounds);\n }\n\n /** Entries within `tolerance` of a point (z-priority is the caller's job). */\n searchPoint(x: number, y: number, tolerance = 0): SpatialEntry<Id>[] {\n return this.tree.search({\n minX: x - tolerance,\n minY: y - tolerance,\n maxX: x + tolerance,\n maxY: y + tolerance,\n });\n }\n\n clear(): void {\n this.tree.clear();\n this.entries.clear();\n }\n\n get size(): number {\n return this.entries.size;\n }\n}\n","/**\n * Hysteresis-banded zoom-resolution policy — ported from v1 `ZoomBands.ts`\n * (RFC-002). An island FBO is allocated at `widget bounds × dpr × band(zoom)`;\n * while zoom stays within `[band × 0.5, band × 2]` no repaint is needed.\n * Bands are powers of 2 (each covers a 4× display range).\n */\nexport const ZOOM_BANDS = [0.0625, 0.125, 0.25, 0.5, 1, 2, 4, 8, 16] as const;\nconst MIN_BAND = 0.0625;\nconst MAX_BAND = 16;\n\n/** Smallest band ≥ zoom (clamped to the ladder). */\nexport function selectBand(zoom: number): number {\n if (zoom <= MIN_BAND) return MIN_BAND;\n if (zoom >= MAX_BAND) return MAX_BAND;\n for (const b of ZOOM_BANDS) {\n if (zoom <= b) return b;\n }\n return MAX_BAND;\n}\n\n/**\n * True when zoom left the `[band × 0.5, band × 2]` window of the band the\n * island was painted at. `paintedBand ≤ 0` = never painted (handled elsewhere).\n */\nexport function isOutOfBand(currentZoom: number, paintedBand: number): boolean {\n if (paintedBand <= 0) return false;\n const ratio = currentZoom / paintedBand;\n return ratio > 2 || ratio < 0.5;\n}\n\n/** FBO pixel size for a widget at a band (v1: `bounds × dpr × band`, min 1px). */\nexport function fboPixelSize(\n worldWidth: number,\n worldHeight: number,\n dpr: number,\n band: number,\n): { width: number; height: number } {\n return {\n width: Math.max(1, Math.round(worldWidth * dpr * band)),\n height: Math.max(1, Math.round(worldHeight * dpr * band)),\n };\n}\n","/**\n * FBO-pool eviction policy — ported from v1 `eviction.ts` (pure part of the\n * pool). Priority: Cold(0) < Warm(1) < Dormant(2); LRU within a phase;\n * Hot/Waking are never evicted even under an impossible budget.\n */\nexport type IslandPhase = \"Hot\" | \"Warm\" | \"Waking\" | \"Cold\" | \"Dormant\";\n\nexport interface EvictionCandidate<Id> {\n id: Id;\n phase: IslandPhase;\n bytes: number;\n lastUsedMs: number;\n}\n\nconst PHASE_PRIORITY: Record<IslandPhase, number> = {\n Cold: 0,\n Warm: 1,\n Dormant: 2,\n Waking: Number.POSITIVE_INFINITY,\n Hot: Number.POSITIVE_INFINITY,\n};\n\n/**\n * The island phase truth table (design-004 §3; v1 `computePhase` verbatim —\n * RFC-002 pinned it with tests). `active` is the nested-canvas membership\n * signal (always true until M8); `hasFbo` splits Warm (retained texture,\n * composite-ready) from Waking (must paint before compositing) — after an\n * eviction a re-entering island comes back as Waking, after a plain cull\n * round-trip it comes back Warm from the retained texture.\n */\nexport function computeIslandPhase(\n active: boolean,\n visible: boolean,\n animating: boolean,\n hasFbo: boolean,\n): IslandPhase {\n if (!active) return \"Dormant\";\n if (visible) {\n if (animating) return \"Hot\";\n return hasFbo ? \"Warm\" : \"Waking\";\n }\n // Culled OR not yet culled-classified: treat as Cold — never paint a widget\n // the engine hasn't placed in the viewport yet (v1 rule, kept).\n return \"Cold\";\n}\n\n/** Ordered ids to release so total bytes ≤ budget. Pure. */\nexport function selectEvictions<Id>(\n candidates: EvictionCandidate<Id>[],\n totalBytes: number,\n maxBytes: number,\n): Id[] {\n if (totalBytes <= maxBytes) return [];\n\n const eligible = candidates.filter((c) => Number.isFinite(PHASE_PRIORITY[c.phase]));\n eligible.sort((a, b) => {\n const p = PHASE_PRIORITY[a.phase] - PHASE_PRIORITY[b.phase];\n if (p !== 0) return p;\n return a.lastUsedMs - b.lastUsedMs;\n });\n\n const toEvict: Id[] = [];\n let remaining = totalBytes;\n for (const c of eligible) {\n if (remaining <= maxBytes) break;\n toEvict.push(c.id);\n remaining -= c.bytes;\n }\n return toEvict;\n}\n","/**\n * Port-anchor math (design-001 §5.3): wire geometry NEVER reads port entities —\n * anchors are pure functions over the widget rect + the port declaration, so\n * culled endpoints work by construction.\n */\nimport type { Rect, Vec2 } from \"./shapes\";\n\nexport type PortSide = \"n\" | \"e\" | \"s\" | \"w\";\n\nexport interface PortSlot {\n side: PortSide;\n /** 0-based position among the ports sharing this side. */\n index: number;\n /** Total ports on this side. */\n count: number;\n}\n\n/** World-space anchor point: ports distribute evenly along their side. */\nexport function portAnchor(widget: Rect, slot: PortSlot): Vec2 {\n const f = (slot.index + 1) / (slot.count + 1);\n switch (slot.side) {\n case \"n\":\n return { x: widget.x + widget.width * f, y: widget.y };\n case \"s\":\n return { x: widget.x + widget.width * f, y: widget.y + widget.height };\n case \"w\":\n return { x: widget.x, y: widget.y + widget.height * f };\n case \"e\":\n return { x: widget.x + widget.width, y: widget.y + widget.height * f };\n }\n}\n\n/** Outward unit direction of a side (wire tangent stubs, Y-down world). */\nexport function sideDirection(side: PortSide): Vec2 {\n switch (side) {\n case \"n\":\n return { x: 0, y: -1 };\n case \"s\":\n return { x: 0, y: 1 };\n case \"w\":\n return { x: -1, y: 0 };\n case \"e\":\n return { x: 1, y: 0 };\n }\n}\n","/**\n * Cubic-bezier wire geometry: construction from port anchors, conservative\n * AABB (for the spatial index), and sampled distance (for picking — wires rank\n * below widgets, design-003 §3).\n */\nimport { sideDirection, type PortSide } from \"./anchors\";\nimport type { AABB, Vec2 } from \"./shapes\";\n\nexport interface Cubic {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n x3: number;\n y3: number;\n}\n\n/**\n * Wire curve between two anchors: tangent stubs leave each port along its\n * side's outward direction, scaled with distance (min stub keeps short wires\n * readable).\n */\nexport function wireCubic(\n from: Vec2,\n fromSide: PortSide,\n to: Vec2,\n toSide: PortSide,\n stubScale = 0.4,\n minStub = 24,\n): Cubic {\n const dist = Math.hypot(to.x - from.x, to.y - from.y);\n const stub = Math.max(minStub, dist * stubScale);\n const df = sideDirection(fromSide);\n const dt = sideDirection(toSide);\n return {\n x0: from.x,\n y0: from.y,\n x1: from.x + df.x * stub,\n y1: from.y + df.y * stub,\n x2: to.x + dt.x * stub,\n y2: to.y + dt.y * stub,\n x3: to.x,\n y3: to.y,\n };\n}\n\n/** Point on the curve at t ∈ [0, 1] (Bernstein form). */\nexport function cubicPoint(c: Cubic, t: number): Vec2 {\n const u = 1 - t;\n const b0 = u * u * u;\n const b1 = 3 * u * u * t;\n const b2 = 3 * u * t * t;\n const b3 = t * t * t;\n return {\n x: b0 * c.x0 + b1 * c.x1 + b2 * c.x2 + b3 * c.x3,\n y: b0 * c.y0 + b1 * c.y1 + b2 * c.y2 + b3 * c.y3,\n };\n}\n\n/**\n * Conservative bounds: the control-point hull contains the curve (convex-hull\n * property). Cheap and index-friendly; exact extrema are unnecessary for\n * culling/picking prefilters.\n */\nexport function cubicAABB(c: Cubic): AABB {\n return {\n minX: Math.min(c.x0, c.x1, c.x2, c.x3),\n minY: Math.min(c.y0, c.y1, c.y2, c.y3),\n maxX: Math.max(c.x0, c.x1, c.x2, c.x3),\n maxY: Math.max(c.y0, c.y1, c.y2, c.y3),\n };\n}\n\nexport interface Tessellation {\n /** Flattened polyline, interleaved [x0,y0, x1,y1, …] in the cubic's own space. */\n points: Float32Array;\n /** Cumulative arc length at each polyline point (same unit; [0] = 0). */\n arcLength: Float32Array;\n}\n\n/**\n * Anti-Grain-Geometry flatness: the control points' summed deviation from the\n * chord, squared, against tolerance² × chord² (degenerate chords fall back to\n * raw control-point distance from p0).\n */\nfunction flatEnough(c: Cubic, tolSq: number): boolean {\n const dx = c.x3 - c.x0;\n const dy = c.y3 - c.y0;\n const chordSq = dx * dx + dy * dy;\n if (chordSq <= 1e-12) {\n const d1 = Math.hypot(c.x1 - c.x0, c.y1 - c.y0);\n const d2 = Math.hypot(c.x2 - c.x0, c.y2 - c.y0);\n return (d1 + d2) * (d1 + d2) <= tolSq;\n }\n const d1 = Math.abs((c.x1 - c.x0) * dy - (c.y1 - c.y0) * dx);\n const d2 = Math.abs((c.x2 - c.x0) * dy - (c.y2 - c.y0) * dx);\n return (d1 + d2) * (d1 + d2) <= tolSq * chordSq;\n}\n\n/** De Casteljau split at t = 0.5 → [left, right]. */\nfunction splitCubic(c: Cubic): [Cubic, Cubic] {\n const ax = (c.x0 + c.x1) / 2;\n const ay = (c.y0 + c.y1) / 2;\n const bx = (c.x1 + c.x2) / 2;\n const by = (c.y1 + c.y2) / 2;\n const cx = (c.x2 + c.x3) / 2;\n const cy = (c.y2 + c.y3) / 2;\n const abx = (ax + bx) / 2;\n const aby = (ay + by) / 2;\n const bcx = (bx + cx) / 2;\n const bcy = (by + cy) / 2;\n const mx = (abx + bcx) / 2;\n const my = (aby + bcy) / 2;\n return [\n { x0: c.x0, y0: c.y0, x1: ax, y1: ay, x2: abx, y2: aby, x3: mx, y3: my },\n { x0: mx, y0: my, x1: bcx, y1: bcy, x2: cx, y2: cy, x3: c.x3, y3: c.y3 },\n ];\n}\n\n/**\n * Adaptive cubic flattening + prefix arc length (2026-07-16, the @ice/ground\n * wires pass: stroke tessellation and dash placement both ride this). Emit\n * density follows curvature — flat spans emit one segment regardless of\n * length; tolerance is in the cubic's OWN space (the ground renderer passes\n * screen-px cubics with ~0.25 px tolerance, so density tracks zoom for free).\n * `maxDepth` bounds pathological inputs (2^depth segments worst case).\n */\nexport function tessellateCubic(c: Cubic, tolerance = 0.25, maxDepth = 16): Tessellation {\n const pts: number[] = [c.x0, c.y0];\n const tolSq = tolerance * tolerance;\n const walk = (cur: Cubic, depth: number): void => {\n if (depth >= maxDepth || flatEnough(cur, tolSq)) {\n pts.push(cur.x3, cur.y3);\n return;\n }\n const [l, r] = splitCubic(cur);\n walk(l, depth + 1);\n walk(r, depth + 1);\n };\n walk(c, 0);\n\n const n = pts.length / 2;\n const points = new Float32Array(pts);\n const arcLength = new Float32Array(n);\n let acc = 0;\n for (let i = 1; i < n; i++) {\n const dx = (pts[i * 2] as number) - (pts[i * 2 - 2] as number);\n const dy = (pts[i * 2 + 1] as number) - (pts[i * 2 - 1] as number);\n acc += Math.hypot(dx, dy);\n arcLength[i] = acc;\n }\n return { points, arcLength };\n}\n\n/** Distance from a point to a line segment. */\nexport function distanceToSegment(\n px: number,\n py: number,\n ax: number,\n ay: number,\n bx: number,\n by: number,\n): number {\n const dx = bx - ax;\n const dy = by - ay;\n const lenSq = dx * dx + dy * dy;\n let t = 0;\n if (lenSq > 0) {\n t = ((px - ax) * dx + (py - ay) * dy) / lenSq;\n t = Math.max(0, Math.min(1, t));\n }\n const cx = ax + t * dx;\n const cy = ay + t * dy;\n return Math.hypot(px - cx, py - cy);\n}\n\n/**\n * Min distance from a point to the curve via polyline sampling. 32 samples is\n * ample for hit thresholds of a few px; error shrinks with curve flatness.\n */\nexport function distanceToCubic(px: number, py: number, c: Cubic, samples = 32): number {\n let best = Number.POSITIVE_INFINITY;\n let prev = cubicPoint(c, 0);\n for (let i = 1; i <= samples; i++) {\n const cur = cubicPoint(c, i / samples);\n const d = distanceToSegment(px, py, prev.x, prev.y, cur.x, cur.y);\n if (d < best) best = d;\n prev = cur;\n }\n return best;\n}\n","/**\n * CSS-style cubic-bezier timing functions (pure math — kernel).\n *\n * `cubicBezierEase(x1, y1, x2, y2)` builds f(t): the exact curve CSS\n * `transition-timing-function: cubic-bezier(…)` runs, so GL surfaces can\n * match DOM transitions beat-for-beat (the composite-quad lift mirrors the\n * DOM card lift's spring, cubic-bezier(0.2, 0.9, 0.3, 1.2)). y outside [0,1]\n * (overshoot springs) is legal and expected; x1/x2 are clamped to [0,1] per\n * spec so x(u) stays monotone and invertible.\n */\n\n/** Bernstein sample with P0=0, P3=1 (one axis of the timing curve). */\nfunction sample(u: number, p1: number, p2: number): number {\n const v = 1 - u;\n return 3 * v * v * u * p1 + 3 * v * u * u * p2 + u * u * u;\n}\n\nexport function cubicBezierEase(x1: number, y1: number, x2: number, y2: number): (t: number) => number {\n const cx1 = Math.min(1, Math.max(0, x1));\n const cx2 = Math.min(1, Math.max(0, x2));\n const sampleDx = (u: number): number => {\n const v = 1 - u;\n return 3 * v * v * cx1 + 6 * v * u * (cx2 - cx1) + 3 * u * u * (1 - cx2);\n };\n\n return (t: number): number => {\n if (t <= 0) return 0;\n if (t >= 1) return 1;\n // Solve x(u) = t: Newton first (fast for well-behaved curves)…\n let u = t;\n for (let i = 0; i < 8; i++) {\n const err = sample(u, cx1, cx2) - t;\n if (Math.abs(err) < 1e-6) return sample(u, y1, y2);\n const d = sampleDx(u);\n if (d < 1e-6) break; // flat spot — Newton would explode\n u = Math.min(1, Math.max(0, u - err / d));\n }\n // …bisection fallback (x is monotone under the clamp).\n let lo = 0;\n let hi = 1;\n u = t;\n while (hi - lo > 1e-6) {\n if (sample(u, cx1, cx2) < t) lo = u;\n else hi = u;\n u = (lo + hi) / 2;\n }\n return sample(u, y1, y2);\n };\n}\n","/**\n * Nav-flight math (design-006 §2/§4 — the portal zoom, T1 camera-flight half).\n *\n * Pure math, no ECS/DOM. Conventions are coords.ts's (Law 13): camera {x,y} =\n * world point at the viewport top-left, zoom = screen px per world unit,\n * `screen = (world − cam)·zoom`.\n *\n * The portal embedding: a container's content coordinates are FRAME-LOCAL\n * (design-001 §5.1) — the transition DEFINES the embedding by mapping the\n * arrival camera's visible rect onto the container's body rect (`portalAffine`,\n * aspect-fit, centers aligned). With that affine fixed, both transition layers\n * ride ONE camera: the destination frame renders under `c(t)` directly; the\n * departed frame renders under `c(t) ∘ A` where A maps departed-frame coords\n * into destination-frame coords. Continuity at the cut is exact by\n * construction (`solveFlightStart`), and no drift is possible mid-flight —\n * there is no second clock.\n *\n * Numerics locked by the mock (2026-07-15, three rounds of field testing):\n * - the progress spring uses the CLOSED-FORM critically-damped solution —\n * semi-implicit Euler diverges once ω·dt nears 1 (a fast exit response on\n * one dropped frame sent the mock's camera to zoom 1501);\n * - the path interpolates zoom in LOG space (constant perceived zoom\n * velocity — van Wijk & Nuij) with the view center linear in 1/zoom, which\n * is exactly an anchored zoom whenever a fixed screen point exists;\n * - flights beyond `maxOctaves` must be depth-capped (`capFlightStart`):\n * sweeping a DOM plane's raster scale ~30× in one flight outruns\n * Chromium's async tile re-raster (stale/missing tiles, persisting at\n * rest) — the capped flight is presented as a crossfade-through-zoom.\n */\nimport type { CameraState } from \"./coords\";\nimport type { Rect } from \"./shapes\";\n\n/** Uniform scale + translate: `A(q) = o + q·s`. */\nexport interface PortalAffine {\n readonly s: number;\n readonly ox: number;\n readonly oy: number;\n}\n\n/** The world rect a camera shows through a viewport. */\nexport function visibleRect(cam: CameraState, vpW: number, vpH: number): Rect {\n return { x: cam.x, y: cam.y, width: vpW / cam.zoom, height: vpH / cam.zoom };\n}\n\n/**\n * The portal embedding: map `arrival` (the world rect the arrival camera will\n * show, in the CHILD frame's coords) onto `portal` (the container's body rect,\n * in the PARENT frame's coords). Aspect-FIT with centers aligned (design-006\n * §8.3 — the card chrome absorbs the letterbox).\n */\nexport function portalAffine(arrival: Rect, portal: Rect): PortalAffine {\n const s = Math.min(portal.width / arrival.width, portal.height / arrival.height);\n return {\n s,\n ox: portal.x + portal.width / 2 - (arrival.x + arrival.width / 2) * s,\n oy: portal.y + portal.height / 2 - (arrival.y + arrival.height / 2) * s,\n };\n}\n\nexport function invertAffine(a: PortalAffine): PortalAffine {\n return { s: 1 / a.s, ox: -a.ox / a.s, oy: -a.oy / a.s };\n}\n\n/** `(outer ∘ inner)(q) = outer(inner(q))` — for multi-level exit portals. */\nexport function composeAffine(outer: PortalAffine, inner: PortalAffine): PortalAffine {\n return { s: outer.s * inner.s, ox: outer.ox + inner.ox * outer.s, oy: outer.oy + inner.oy * outer.s };\n}\n\n/**\n * Continuity solve: the camera `c0` (in the DESTINATION frame) under which\n * departed-frame content mapped through `A` (departed → destination coords)\n * renders EXACTLY as it did under `camPre` (in the departed frame) the instant\n * before the cut. Derivation: a departed point q renders at\n * `(A(q) − c0)·z0 = q·(A.s·z0) + (A.o − c0)·z0`; matching `(q − camPre)·zPre`\n * coefficient-wise gives z0 and the origin below. Zoom limits deliberately do\n * NOT apply here — flight paths transit far outside the user-gesture band\n * (design-006 §3.1); only the ARRIVAL camera is clamped by the caller.\n */\nexport function solveFlightStart(A: PortalAffine, camPre: CameraState): CameraState {\n return {\n x: A.ox + camPre.x * A.s,\n y: A.oy + camPre.y * A.s,\n zoom: camPre.zoom / A.s,\n };\n}\n\n/** Zoom distance in octaves — the flight-length measure (design-006 §4/§5). */\nexport function flightOctaves(from: CameraState, to: CameraState): number {\n return Math.abs(Math.log2(to.zoom / from.zoom));\n}\n\n/**\n * Depth-cap a flight start (design-006 §5): beyond `maxOctaves`, clamp the\n * start zoom to `capFactor ×` the arrival zoom (dive direction preserved),\n * keeping the exact start's view CENTER — the portal anchor — so the motion\n * still comes from/goes to the right place. `capped: true` means the caller\n * must present the flight as a crossfade (frozen departing cover + incoming\n * fade-in): geometric continuity is unpresentable at that raster-scale swing.\n */\nexport function capFlightStart(\n exact: CameraState,\n arrival: CameraState,\n vpW: number,\n vpH: number,\n maxOctaves: number,\n capFactor: number,\n): { c0: CameraState; capped: boolean } {\n if (flightOctaves(exact, arrival) <= maxOctaves) return { c0: exact, capped: false };\n const zCap = exact.zoom > arrival.zoom ? arrival.zoom * capFactor : arrival.zoom / capFactor;\n return {\n c0: {\n x: exact.x + (vpW / 2) * (1 / exact.zoom - 1 / zCap),\n y: exact.y + (vpH / 2) * (1 / exact.zoom - 1 / zCap),\n zoom: zCap,\n },\n capped: true,\n };\n}\n\n/**\n * The flight path `c(p)`, p ∈ [0,1]: zoom log-lerped (constant perceived zoom\n * velocity); view CENTER linear in 1/zoom — exactly an anchored zoom whenever\n * a fixed screen point exists between the endpoints, a graceful blend\n * otherwise. Endpoints are exact: c(0) = c0, c(1) = c1.\n */\nexport function flightCamera(\n c0: CameraState,\n c1: CameraState,\n p: number,\n vpW: number,\n vpH: number,\n): CameraState {\n const zoom = Math.exp(Math.log(c0.zoom) + (Math.log(c1.zoom) - Math.log(c0.zoom)) * p);\n const inv0 = 1 / c0.zoom;\n const inv1 = 1 / c1.zoom;\n const inv = 1 / zoom;\n const w = Math.abs(inv1 - inv0) < 1e-12 ? p : (inv - inv0) / (inv1 - inv0);\n const cx = c0.x + vpW * inv0 * 0.5 + (c1.x + vpW * inv1 * 0.5 - (c0.x + vpW * inv0 * 0.5)) * w;\n const cy = c0.y + vpH * inv0 * 0.5 + (c1.y + vpH * inv1 * 0.5 - (c0.y + vpH * inv0 * 0.5)) * w;\n return { x: cx - vpW * inv * 0.5, y: cy - vpH * inv * 0.5, zoom };\n}\n\n/**\n * One step of the critically-damped progress spring toward 1, in CLOSED FORM:\n * with u = 1 − p, the exact solution is `u(t) = (u₀ + Bt)·e^(−ωt)`,\n * `B = −v₀ + ω·u₀`. Unconditionally stable at ANY dt — the discretized form\n * (semi-implicit Euler) diverges once ω·dt approaches 1, which one dropped\n * frame at a fast response reaches easily (mock-measured, 2026-07-15).\n * From rest (v=0) the approach is monotonic: p never overshoots 1.\n */\nexport function springStep(\n p: number,\n v: number,\n omega: number,\n dtSec: number,\n): { p: number; v: number } {\n const u = 1 - p;\n const B = -v + omega * u;\n const decay = Math.exp(-omega * dtSec);\n const u2 = (u + B * dtSec) * decay;\n const du2 = (B - omega * (u + B * dtSec)) * decay;\n return { p: 1 - u2, v: -du2 };\n}\n","/**\n * Pure auto-layout math (2026-07-17, James: cards dropped into a folder \"just\n * pile up on each other\" — and, later, an explicit desktop-style Clean Up).\n *\n * Two primitives, two products, one law each:\n * - `insertSlot` — place ONE newcomer near a drop hint without moving\n * anything: newcomers get a free slot, incumbents never move. Consumed by\n * the drop-consume path (l3-behave). Candidates are edge-aligned to the\n * incumbents (flush right/below/left/above with a gutter), so successive\n * drops grow aligned rows and columns instead of a global imposed grid.\n * - `packLayout` — bottom-left candidate packing for the explicit\n * \"Clean Up\" command (v2 2026-07-17, James: shelves were \"not really\n * efficient\" and selection packs \"overlay on top of unselected widgets\"):\n * items flow in reading order (current y, then x, then index) and each\n * takes the lowest-then-leftmost free spot, so small cards fill the air\n * beside tall ones instead of opening a new shelf. `obstacles` rects are\n * honored as immovable — a scoped pack flows AROUND bystanders. Still\n * \"my mess, straightened\": deterministic, anchored at the cluster's own\n * top-left, idempotent on packed input (pinned by test).\n * - `layerGraph` — the Unreal-Blueprint-style arrange for WIRED widgets:\n * Sugiyama-lite layered layout (longest-path ranks along edge direction,\n * barycenter ordering, columns left→right, vertically centered). Callers\n * lay out each connected component with this and pack the resulting\n * blocks with `packLayout`.\n *\n * Plain structs in, plain structs out (Law 13): no ECS, no DOM, no camera.\n * All coordinates live in ONE frame — callers convert (container-local for\n * folder drops, world for canvas clean-up) before and after.\n */\n\nexport interface LayoutRect {\n readonly x: number;\n readonly y: number;\n readonly w: number;\n readonly h: number;\n}\n\nexport interface LayoutSize {\n readonly w: number;\n readonly h: number;\n}\n\nexport interface LayoutPoint {\n readonly x: number;\n readonly y: number;\n}\n\n/** True when the rects are closer than `gutter` on BOTH axes (≥gutter on either axis = fine). */\nfunction crowds(a: LayoutRect, b: LayoutRect, gutter: number): boolean {\n return (\n a.x < b.x + b.w + gutter &&\n b.x < a.x + a.w + gutter &&\n a.y < b.y + b.h + gutter &&\n b.y < a.y + a.h + gutter\n );\n}\n\nfunction isFree(x: number, y: number, size: LayoutSize, incumbents: readonly LayoutRect[], gutter: number): boolean {\n const r = { x, y, w: size.w, h: size.h };\n for (const i of incumbents) {\n if (crowds(r, i, gutter)) return false;\n }\n return true;\n}\n\n/**\n * Nearest free slot to `hint` for a `size` newcomer among `incumbents`.\n *\n * The hint wins verbatim when it is already free (a deliberate drop into\n * empty space is user intent — don't second-guess it). Otherwise candidates\n * flush against each incumbent's edges (top- and far-aligned variants) are\n * ranked by squared distance to the hint; ties resolve to the first-seen\n * candidate (stable in incumbent order — deterministic across runs). The\n * fallback — a spot gutter-right of EVERYTHING — cannot crowd anyone, so a\n * slot always exists.\n */\nexport function insertSlot(\n incumbents: readonly LayoutRect[],\n size: LayoutSize,\n hint: LayoutPoint,\n gutter: number,\n): { x: number; y: number } {\n if (incumbents.length === 0 || isFree(hint.x, hint.y, size, incumbents, gutter)) {\n return { x: hint.x, y: hint.y };\n }\n let best: { x: number; y: number } | undefined;\n let bestD = Number.POSITIVE_INFINITY;\n for (const i of incumbents) {\n const candidates = [\n { x: i.x + i.w + gutter, y: i.y }, // right, top-aligned\n { x: i.x, y: i.y + i.h + gutter }, // below, left-aligned\n { x: i.x - size.w - gutter, y: i.y }, // left, top-aligned\n { x: i.x, y: i.y - size.h - gutter }, // above, left-aligned\n { x: i.x + i.w + gutter, y: i.y + i.h - size.h }, // right, bottom-aligned\n { x: i.x + i.w - size.w, y: i.y + i.h + gutter }, // below, right-aligned\n ];\n for (const c of candidates) {\n if (!isFree(c.x, c.y, size, incumbents, gutter)) continue;\n const d = (c.x - hint.x) ** 2 + (c.y - hint.y) ** 2;\n if (d < bestD) {\n bestD = d;\n best = c;\n }\n }\n }\n if (best !== undefined) return best;\n let maxRight = Number.NEGATIVE_INFINITY;\n for (const i of incumbents) maxRight = Math.max(maxRight, i.x + i.w);\n return { x: maxRight + gutter, y: hint.y };\n}\n\nexport interface PackOpts {\n readonly gutter: number;\n /** Pack origin; defaults to the items' current bbox top-left (the cluster stays put). */\n readonly origin?: LayoutPoint;\n /**\n * Band wrap width; defaults to a near-square derivation (√(total area × 1.6),\n * never narrower than the widest item). Soft: an item that fits nowhere\n * inside the band still places (lowest spot, band ignored) rather than\n * failing.\n */\n readonly maxWidth?: number;\n /**\n * Immovable rects the pack must flow AROUND (e.g. unselected widgets when\n * arranging a selection). Never returned, never moved, never crowded.\n */\n readonly obstacles?: readonly LayoutRect[];\n}\n\n/**\n * Bottom-left candidate packing: items in reading order of their CURRENT\n * positions (strict y, then x, then input index) each take the\n * lowest-then-leftmost free spot from the candidate set (the origin, plus\n * gutter-flush right-of and below-of every placed/obstacle rect, plus the\n * band-left row start under each). Dense with mixed sizes — small cards fill\n * the air beside tall ones — and obstacle-aware. Returns placements parallel\n * to the input array.\n */\nexport function packLayout(items: readonly LayoutRect[], opts: PackOpts): Array<{ x: number; y: number }> {\n if (items.length === 0) return [];\n const gutter = opts.gutter;\n\n let ox: number;\n let oy: number;\n if (opts.origin !== undefined) {\n ox = opts.origin.x;\n oy = opts.origin.y;\n } else {\n ox = Number.POSITIVE_INFINITY;\n oy = Number.POSITIVE_INFINITY;\n for (const it of items) {\n ox = Math.min(ox, it.x);\n oy = Math.min(oy, it.y);\n }\n }\n\n let maxWidth = opts.maxWidth;\n if (maxWidth === undefined) {\n let area = 0;\n let widest = 0;\n for (const it of items) {\n area += (it.w + gutter) * (it.h + gutter);\n widest = Math.max(widest, it.w);\n }\n maxWidth = Math.max(widest, Math.sqrt(area * 1.6));\n }\n\n const order = items\n .map((_, i) => i)\n .sort((a, b) => {\n const ia = items[a] as LayoutRect;\n const ib = items[b] as LayoutRect;\n return ia.y - ib.y || ia.x - ib.x || a - b;\n });\n\n // Feasibility set: obstacles first (they also seed candidates), then\n // every placed item as it lands.\n const placed: LayoutRect[] = [...(opts.obstacles ?? [])];\n const out = new Array<{ x: number; y: number }>(items.length);\n for (const idx of order) {\n const it = items[idx] as LayoutRect;\n const cands: LayoutPoint[] = [{ x: ox, y: oy }];\n for (const r of placed) {\n cands.push({ x: r.x + r.w + gutter, y: r.y }); // right, top-aligned\n cands.push({ x: r.x, y: r.y + r.h + gutter }); // below, left-aligned\n cands.push({ x: ox, y: r.y + r.h + gutter }); // band-left row start\n }\n let best: LayoutPoint | undefined;\n // Pass 1 honors the band; pass 2 drops it (an oversize item or a wall of\n // obstacles must still place — the below-everything candidate is always\n // free, so pass 2 cannot come up empty).\n for (const inBand of [true, false]) {\n for (const c of cands) {\n if (c.x < ox || c.y < oy) continue;\n if (inBand && c.x + it.w > ox + maxWidth) continue;\n if (!isFree(c.x, c.y, it, placed, gutter)) continue;\n if (best === undefined || c.y < best.y || (c.y === best.y && c.x < best.x)) best = c;\n }\n if (best !== undefined) break;\n }\n if (best === undefined) {\n // Defensive only (see pass-2 note above).\n let maxBottom = oy;\n for (const r of placed) maxBottom = Math.max(maxBottom, r.y + r.h);\n best = { x: ox, y: maxBottom + gutter };\n }\n out[idx] = { x: best.x, y: best.y };\n placed.push({ x: best.x, y: best.y, w: it.w, h: it.h });\n }\n return out;\n}\n\nexport interface LayerGraphOpts {\n /** Horizontal gap between columns (leave room for wires to breathe). */\n readonly gapX: number;\n /** Vertical gap between nodes inside a column. */\n readonly gapY: number;\n /**\n * Wrap the column run into stacked BANDS when the unwrapped width would\n * exceed this (carriage-return style: each band flows left→right, bands\n * stack top→down with a 2×gapY separator). Omit for a single band — a\n * graph is inherently wide and only wraps when the caller says the canvas\n * band demands it.\n */\n readonly maxWidth?: number;\n}\n\n/**\n * Layered graph layout (Sugiyama-lite) — the Unreal-Blueprint-style arrange\n * for wired widgets. Rank = longest path from the sources along edge\n * direction (a DFS drops back edges, so cycles are safe); columns flow\n * left→right; nodes stack top→down within a column. Ordering = alternating\n * barycenter sweeps with the BEST ordering kept (counted wire crossings),\n * then the classic transpose refinement (adjacent swaps that strictly\n * reduce crossings) — not provably minimal, but the standard practical\n * pair. Columns center vertically on their band's tallest. Placements are\n * relative to (0,0) — callers anchor the block. Deterministic: all\n * orderings tie-break on node index.\n */\nexport function layerGraph(\n nodes: readonly LayoutSize[],\n edges: readonly (readonly [number, number])[],\n opts: LayerGraphOpts,\n): Array<{ x: number; y: number }> {\n const n = nodes.length;\n if (n === 0) return [];\n\n // Drop self-edges; find back edges via iterative DFS (in index order).\n const outAdj: number[][] = Array.from({ length: n }, () => []);\n for (const [u, v] of edges) {\n if (u !== v && u >= 0 && u < n && v >= 0 && v < n) outAdj[u]?.push(v);\n }\n const kept: Array<[number, number]> = [];\n const state = new Array<0 | 1 | 2>(n).fill(0); // 0 unseen, 1 on stack, 2 done\n for (let root = 0; root < n; root++) {\n if (state[root] !== 0) continue;\n const stack: Array<{ u: number; i: number }> = [{ u: root, i: 0 }];\n state[root] = 1;\n while (stack.length > 0) {\n const top = stack[stack.length - 1] as { u: number; i: number };\n const adj = outAdj[top.u] as number[];\n if (top.i < adj.length) {\n const v = adj[top.i] as number;\n top.i += 1;\n if (state[v] === 1) continue; // back edge — dropped\n kept.push([top.u, v]);\n if (state[v] === 0) {\n state[v] = 1;\n stack.push({ u: v, i: 0 });\n }\n } else {\n state[top.u] = 2;\n stack.pop();\n }\n }\n }\n\n // Longest-path ranks over the kept DAG (topological relaxation).\n const keptOut: number[][] = Array.from({ length: n }, () => []);\n const indeg = new Array<number>(n).fill(0);\n for (const [u, v] of kept) {\n keptOut[u]?.push(v);\n indeg[v] = (indeg[v] as number) + 1;\n }\n const rank = new Array<number>(n).fill(0);\n const queue: number[] = [];\n for (let i = 0; i < n; i++) if (indeg[i] === 0) queue.push(i);\n for (let qi = 0; qi < queue.length; qi++) {\n const u = queue[qi] as number;\n for (const v of keptOut[u] as number[]) {\n rank[v] = Math.max(rank[v] as number, (rank[u] as number) + 1);\n indeg[v] = (indeg[v] as number) - 1;\n if (indeg[v] === 0) queue.push(v);\n }\n }\n\n const maxRank = Math.max(...rank);\n const layers: number[][] = Array.from({ length: maxRank + 1 }, () => []);\n for (let i = 0; i < n; i++) layers[rank[i] as number]?.push(i);\n\n // Barycenter ordering: neighbors (both directions) pull a node toward\n // their average slot in the adjacent fixed layer.\n const neighbors: number[][] = Array.from({ length: n }, () => []);\n for (const [u, v] of kept) {\n neighbors[u]?.push(v);\n neighbors[v]?.push(u);\n }\n const slot = new Array<number>(n).fill(0);\n const reSlot = (): void => {\n for (const layer of layers) {\n layer.forEach((node, s) => {\n slot[node] = s;\n });\n }\n };\n reSlot();\n\n /** Wire crossings across every adjacent layer pair, under the current slots. */\n const crossings = (): number => {\n let total = 0;\n for (let li = 0; li < maxRank; li++) {\n const pairs: Array<[number, number]> = [];\n for (const [u, v] of kept) {\n if (rank[u] === li && rank[v] === li + 1) pairs.push([slot[u] as number, slot[v] as number]);\n }\n for (let i = 0; i < pairs.length; i++) {\n for (let j = i + 1; j < pairs.length; j++) {\n const a = pairs[i] as [number, number];\n const b = pairs[j] as [number, number];\n if ((a[0] - b[0]) * (a[1] - b[1]) < 0) total += 1;\n }\n }\n }\n return total;\n };\n\n // Alternating barycenter sweeps; a sweep can WORSEN crossings, so the best\n // ordering seen is kept, not the last.\n const snapshot = (): number[][] => layers.map((l) => [...l]);\n const restore = (saved: number[][]): void => {\n saved.forEach((l, li) => {\n layers[li] = [...l];\n });\n reSlot();\n };\n let best = snapshot();\n let bestX = crossings();\n for (let sweep = 0; sweep < 4 && bestX > 0; sweep++) {\n const forward = sweep % 2 === 0;\n for (let li = forward ? 1 : maxRank - 1; forward ? li <= maxRank : li >= 0; li += forward ? 1 : -1) {\n const layer = layers[li] as number[];\n const bary = (node: number): number => {\n const ns = (neighbors[node] as number[]).filter((m) => Math.abs((rank[m] as number) - li) === 1);\n if (ns.length === 0) return slot[node] as number;\n return ns.reduce((sum, m) => sum + (slot[m] as number), 0) / ns.length;\n };\n layer.sort((a, b) => bary(a) - bary(b) || a - b);\n reSlot();\n }\n const x = crossings();\n if (x < bestX) {\n bestX = x;\n best = snapshot();\n }\n }\n restore(best);\n\n // Transpose refinement (the classic Sugiyama tail): adjacent swaps that\n // STRICTLY reduce crossings, until a quiet round. Catches the barycenter's\n // tie stalls.\n let improved = bestX > 0;\n for (let round = 0; round < 4 && improved; round++) {\n improved = false;\n for (const layer of layers) {\n for (let s = 0; s + 1 < layer.length; s++) {\n const a = layer[s] as number;\n const b = layer[s + 1] as number;\n layer[s] = b;\n layer[s + 1] = a;\n reSlot();\n const x = crossings();\n if (x < bestX) {\n bestX = x;\n improved = true;\n } else {\n layer[s] = a;\n layer[s + 1] = b;\n reSlot();\n }\n }\n }\n }\n\n // Coordinates. Column widths first; then the column run is partitioned\n // into bands (single band unless maxWidth demands wrapping); each band\n // flows left→right from x=0, stacks below the previous with a 2×gapY\n // separator, and centers its columns on the band's tallest.\n const colW = (layers as number[][]).map((layer) => {\n let widest = 0;\n for (const node of layer) widest = Math.max(widest, (nodes[node] as LayoutSize).w);\n return widest;\n });\n const colH = (layers as number[][]).map((layer) =>\n layer.reduce((sum, node, i) => sum + (nodes[node] as LayoutSize).h + (i > 0 ? opts.gapY : 0), 0),\n );\n\n const bands: number[][] = [];\n if (opts.maxWidth === undefined) {\n bands.push((layers as number[][]).map((_, li) => li));\n } else {\n let cur: number[] = [];\n let width = 0;\n for (let li = 0; li <= maxRank; li++) {\n const grown = (cur.length > 0 ? width + opts.gapX : 0) + (colW[li] as number);\n if (cur.length > 0 && grown > opts.maxWidth) {\n bands.push(cur);\n cur = [li];\n width = colW[li] as number;\n } else {\n cur.push(li);\n width = grown;\n }\n }\n if (cur.length > 0) bands.push(cur);\n }\n\n const out = new Array<{ x: number; y: number }>(n);\n let bandTop = 0;\n for (const band of bands) {\n let tallest = 0;\n for (const li of band) tallest = Math.max(tallest, colH[li] as number);\n let x = 0;\n for (const li of band) {\n let y = bandTop + (tallest - (colH[li] as number)) / 2;\n for (const node of layers[li] as number[]) {\n out[node] = { x, y };\n y += (nodes[node] as LayoutSize).h + opts.gapY;\n }\n x += (colW[li] as number) + opts.gapX;\n }\n bandTop += tallest + opts.gapY * 2;\n }\n return out;\n}\n","/**\n * @ice/kernel — pure math. Plain structs in, plain structs out.\n * Import wall: nothing but `rbush` (named exception — zero-dep R-tree).\n */\nexport const KERNEL_VERSION = \"0.0.0\";\n\nexport * from \"./shapes\";\nexport * from \"./coords\";\nexport * from \"./snap\";\nexport * from \"./spatial-index\";\nexport * from \"./zoom-bands\";\nexport * from \"./eviction\";\nexport * from \"./anchors\";\nexport * from \"./bezier\";\nexport * from \"./easing\";\nexport * from \"./nav-flight\";\nexport * from \"./layout\";\n"],"mappings":"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","names":["d1","d2"]}
|