@sebastianwessel/isostate 0.4.0 → 0.5.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 (49) hide show
  1. package/dist/animation/animation-engine.d.ts +1 -0
  2. package/dist/animation/animation-engine.d.ts.map +1 -1
  3. package/dist/animation/controller.d.ts +34 -2
  4. package/dist/animation/controller.d.ts.map +1 -1
  5. package/dist/browser/isostate.runtime.js +4 -4
  6. package/dist/browser/isostate.runtime.js.map +11 -10
  7. package/dist/chunks/{index-C3qcXbPI.js → index-CB6XEsbY.js} +257 -43
  8. package/dist/chunks/index-CB6XEsbY.js.map +1 -0
  9. package/dist/chunks/{rendering-engine-BUUV3Qq-.js → rendering-engine-nkqYx0qc.js} +215 -36
  10. package/dist/chunks/rendering-engine-nkqYx0qc.js.map +1 -0
  11. package/dist/chunks/{scene-parser-B9SPDLYs.js → scene-parser-F69XGE0l.js} +87 -32
  12. package/dist/chunks/scene-parser-F69XGE0l.js.map +1 -0
  13. package/dist/dsl/browser.js +1 -1
  14. package/dist/dsl/index.js +1 -1
  15. package/dist/dsl/scene-parser.d.ts.map +1 -1
  16. package/dist/dsl/scene-validator.d.ts.map +1 -1
  17. package/dist/editor-support/index.js +1 -1
  18. package/dist/index.d.ts +4 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +470 -4
  21. package/dist/index.js.map +1 -1
  22. package/dist/rendering/animation-css.d.ts.map +1 -1
  23. package/dist/rendering/rendering-engine.d.ts +9 -0
  24. package/dist/rendering/rendering-engine.d.ts.map +1 -1
  25. package/dist/rendering/theme.d.ts +4 -0
  26. package/dist/rendering/theme.d.ts.map +1 -1
  27. package/dist/runtime/diagnostics-overlay.d.ts +29 -0
  28. package/dist/runtime/diagnostics-overlay.d.ts.map +1 -0
  29. package/dist/runtime/export.d.ts +27 -0
  30. package/dist/runtime/export.d.ts.map +1 -0
  31. package/dist/runtime/index.d.ts +1 -0
  32. package/dist/runtime/index.d.ts.map +1 -1
  33. package/dist/runtime/index.js +2 -2
  34. package/dist/runtime/interactivity.d.ts +56 -0
  35. package/dist/runtime/interactivity.d.ts.map +1 -0
  36. package/dist/runtime/mount-scene.d.ts +11 -10
  37. package/dist/runtime/mount-scene.d.ts.map +1 -1
  38. package/dist/types/asset-registry.d.ts +1 -0
  39. package/dist/types/asset-registry.d.ts.map +1 -1
  40. package/dist/types/node.d.ts +14 -0
  41. package/dist/types/node.d.ts.map +1 -1
  42. package/dist/types/runtime-bundle.d.ts +35 -0
  43. package/dist/types/runtime-bundle.d.ts.map +1 -1
  44. package/dist/types/scene.d.ts +2 -0
  45. package/dist/types/scene.d.ts.map +1 -1
  46. package/package.json +1 -1
  47. package/dist/chunks/index-C3qcXbPI.js.map +0 -1
  48. package/dist/chunks/rendering-engine-BUUV3Qq-.js.map +0 -1
  49. package/dist/chunks/scene-parser-B9SPDLYs.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rendering-engine-nkqYx0qc.js","sources":["../../src/types/asset-registry.ts","../../src/utils/projection.ts","../../src/rendering/animation-css.ts","../../src/rendering/asset-node.ts","../../src/rendering/theme.ts","../../src/rendering/rendering-engine.ts"],"sourcesContent":["import type { AssetCategory, AssetDefinition, AssetRegistry, Theme } from \"./assets.ts\";\n\n// ── Built-in themes ────────────────────────────────────────────────────────\n\nconst BUILTIN_THEMES: Record<string, Record<string, string>> = {\n\tlight: {\n\t\t\"--color-top\": \"#e2e8f0\",\n\t\t\"--color-front\": \"#94a3b8\",\n\t\t\"--color-side\": \"#64748b\",\n\t\t\"--color-back\": \"#475569\",\n\t\t\"--color-leaf\": \"#15803d\",\n\t\t\"--color-trunk\": \"#78350f\",\n\t\t\"--color-accent\": \"#3b82f6\",\n\t},\n\tdark: {\n\t\t\"--color-top\": \"#334155\",\n\t\t\"--color-front\": \"#1e293b\",\n\t\t\"--color-side\": \"#0f172a\",\n\t\t\"--color-back\": \"#020617\",\n\t\t\"--color-leaf\": \"#166534\",\n\t\t\"--color-trunk\": \"#451a03\",\n\t\t\"--color-accent\": \"#60a5fa\",\n\t},\n\tbrand: {\n\t\t\"--color-top\": \"#c7d2fe\",\n\t\t\"--color-front\": \"#818cf8\",\n\t\t\"--color-side\": \"#6366f1\",\n\t\t\"--color-back\": \"#4338ca\",\n\t\t\"--color-leaf\": \"#22c55e\",\n\t\t\"--color-trunk\": \"#854d0e\",\n\t\t\"--color-accent\": \"#f59e0b\",\n\t},\n};\n\n/**\n * Resolve a theme name to its CSS variable map.\n * Returns undefined if the theme is not found.\n */\nexport function resolveTheme(name: string): Record<string, string> | undefined {\n\treturn Object.hasOwn(BUILTIN_THEMES, name) ? BUILTIN_THEMES[name] : undefined;\n}\n\n/**\n * Compose a new theme by extending an existing one with overrides.\n */\nexport function composeTheme(baseName: string, overrides: Record<string, string>): Theme {\n\tconst base = resolveTheme(baseName);\n\tif (!base) {\n\t\treturn { name: baseName, vars: { ...overrides } };\n\t}\n\treturn { name: baseName, vars: { ...base, ...overrides } };\n}\n\n// ── Asset registry implementation ──────────────────────────────────────────\n\n/**\n * Default asset registry implementation.\n * Maps asset ids to definitions and supports category filtering.\n */\nexport class AssetRegistryImpl implements AssetRegistry {\n\tprivate _assets = new Map<string, AssetDefinition>();\n\n\tregister(asset: AssetDefinition): void {\n\t\tthis._assets.set(asset.id, asset);\n\t}\n\n\tget(id: string): AssetDefinition | undefined {\n\t\treturn this._assets.get(id);\n\t}\n\n\tgetAll(category?: AssetCategory): AssetDefinition[] {\n\t\tif (category) {\n\t\t\treturn [...this._assets.values()].filter((a) => a.category === category);\n\t\t}\n\t\treturn [...this._assets.values()];\n\t}\n\n\thas(id: string): boolean {\n\t\treturn this._assets.has(id);\n\t}\n\n\tremove(id: string): void {\n\t\tthis._assets.delete(id);\n\t}\n}\n\n/** Create a registry populated with the given asset definitions. */\nexport function createAssetRegistry(assets: AssetDefinition[] = []): AssetRegistryImpl {\n\tconst registry = new AssetRegistryImpl();\n\tfor (const asset of assets) {\n\t\tregistry.register(asset);\n\t}\n\treturn registry;\n}\n\n/** Create a fresh registry populated with the built-in demo assets. */\nexport function createDefaultRegistry(): AssetRegistryImpl {\n\treturn createAssetRegistry([\n\t\t{\n\t\t\tid: \"iso-platform\",\n\t\t\tcategory: \"infrastructure\",\n\t\t},\n\t\t{\n\t\t\tid: \"iso-server\",\n\t\t\tcategory: \"equipment\",\n\t\t},\n\t\t{\n\t\t\tid: \"iso-database\",\n\t\t\tcategory: \"equipment\",\n\t\t},\n\t\t{\n\t\t\tid: \"iso-connector\",\n\t\t\tcategory: \"decoration\",\n\t\t},\n\t\t{\n\t\t\tid: \"iso-cloud\",\n\t\t\tcategory: \"decoration\",\n\t\t},\n\t]);\n}\n","/** Default cell size in pixels */\nexport const DEFAULT_CELL_SIZE = 64;\n\n/**\n * Calculate raw scene-space coordinates from isometric grid position.\n * Layout is applied separately by subtracting resolved bounds and adding padding.\n */\nexport function projectToRaw(gridX: number, gridY: number, cellSize: number): { rawX: number; rawY: number } {\n\treturn {\n\t\trawX: cellSize * (gridX - gridY) * 0.5,\n\t\trawY: cellSize * (gridX + gridY) * 0.25,\n\t};\n}\n\n/**\n * Calculate screen coordinates from raw isometric projection and resolved bounds.\n */\nexport function projectToScreen(\n\tgridX: number,\n\tgridY: number,\n\tcellSize: number,\n\tboundsMinX = 0,\n\tboundsMinY = 0,\n\tpaddingX = 0,\n\tpaddingY = 0,\n): { screenX: number; screenY: number } {\n\tconst { rawX, rawY } = projectToRaw(gridX, gridY, cellSize);\n\treturn {\n\t\tscreenX: rawX - boundsMinX + paddingX,\n\t\tscreenY: rawY - boundsMinY + paddingY,\n\t};\n}\n\n/** Calculate the screen size for an element based on its grid size. */\nexport function calculateVisualSize(gridSize: number, cellSize: number): number {\n\treturn cellSize * gridSize;\n}\n\n/** Calculate the element transform string for positioning and scaling. */\nexport function calculateTransform(screenX: number, screenY: number, visualSize: number, cellSize: number): string {\n\tconst scale = visualSize / cellSize;\n\treturn `translate(${screenX}px, ${screenY}px) scale(${scale})`;\n}\n","/** Build built-in entry, exit, ambient, and reduced-motion CSS keyframes. */\nexport function buildKeyframeCSS(): string {\n\treturn [\n\t\t\"@keyframes iso-anim-fade-in{from{opacity:0}to{opacity:1}}\",\n\t\t\"@keyframes iso-anim-fade-in-grow{from{opacity:0;scale:.01}to{opacity:1;scale:1}}\",\n\t\t\"@keyframes iso-anim-fall-in{from{opacity:0;translate:0 -40px}to{opacity:1;translate:0 0}}\",\n\t\t\"@keyframes iso-anim-rise-from-ground{from{opacity:0;translate:0 40px}to{opacity:1;translate:0 0}}\",\n\t\t\"@keyframes iso-anim-slide-in-left{from{opacity:0;translate:-60px 0}to{opacity:1;translate:0 0}}\",\n\t\t\"@keyframes iso-anim-slide-in-right{from{opacity:0;translate:60px 0}to{opacity:1;translate:0 0}}\",\n\t\t\"@keyframes iso-anim-flip-in{from{opacity:1;scale:0 1}to{opacity:1;scale:1 1}}\",\n\t\t\"@keyframes iso-anim-fade-out{from{opacity:1}to{opacity:0}}\",\n\t\t\"@keyframes iso-anim-fade-out-shrink{from{opacity:1;scale:1}to{opacity:0;scale:.01}}\",\n\t\t\"@keyframes iso-anim-fall-through-ground{from{opacity:1;translate:0 0}to{opacity:0;translate:0 40px}}\",\n\t\t\"@keyframes iso-anim-rise-away{from{opacity:1;translate:0 0}to{opacity:0;translate:0 -40px}}\",\n\t\t\"@keyframes iso-anim-slide-out-left{from{opacity:1;translate:0 0}to{opacity:0;translate:-60px 0}}\",\n\t\t\"@keyframes iso-anim-slide-out-right{from{opacity:1;translate:0 0}to{opacity:0;translate:60px 0}}\",\n\t\t\"@keyframes iso-anim-flip-out{from{opacity:1;scale:1 1}to{opacity:0;scale:0 1}}\",\n\t\t\"@keyframes iso-anim-pulse{0%,100%{opacity:.7}50%{opacity:1}}\",\n\t\t\"@keyframes iso-anim-float{0%,100%{translate:0 0}50%{translate:0 -6px}}\",\n\t\t\"@keyframes iso-anim-shake{0%,25%,75%,100%{translate:0 0}50%{translate:3px 0}}\",\n\t\t\"@keyframes iso-anim-glow{0%,100%{filter:drop-shadow(0 0 2px rgba(255,255,255,.5))}50%{filter:drop-shadow(0 0 8px rgba(255,255,255,.9))}}\",\n\t\t\"@keyframes iso-anim-spin{from{rotate:0deg}to{rotate:360deg}}\",\n\t\t\"@keyframes iso-anim-blink{0%,49%{opacity:1}50%,100%{opacity:0}}\",\n\t\t\".iso-ambient-pulse{animation:iso-anim-pulse 2s ease-in-out infinite}\",\n\t\t\".iso-ambient-float{animation:iso-anim-float 3s ease-in-out infinite}\",\n\t\t\".iso-ambient-shake{animation:iso-anim-shake 0.5s ease-in-out infinite}\",\n\t\t\".iso-ambient-glow{animation:iso-anim-glow 2s ease-in-out infinite}\",\n\t\t\".iso-ambient-spin{animation:iso-anim-spin 4s linear infinite}\",\n\t\t\".iso-ambient-blink{animation:iso-anim-blink 1.5s step-end infinite}\",\n\t\t\"@keyframes iso-connector-flow-route{from{stroke-dashoffset:0}to{stroke-dashoffset:calc(-1px * var(--iso-flow-distance,20))}}\",\n\t\t\"@keyframes iso-connector-flow-reverse{from{stroke-dashoffset:0}to{stroke-dashoffset:calc(1px * var(--iso-flow-distance,20))}}\",\n\t\t\".iso-connector-pattern-dashed .iso-connector-shaft,.iso-connector-pattern-dotted .iso-connector-shaft{--iso-flow-distance:20}\",\n\t\t\".iso-connector-direction-route .iso-connector-shaft.iso-ambient-flow{animation:iso-connector-flow-route 900ms linear infinite}\",\n\t\t\".iso-connector-direction-reverse .iso-connector-shaft.iso-ambient-flow{animation:iso-connector-flow-reverse 900ms linear infinite}\",\n\t\t\"@media (prefers-reduced-motion: reduce){.iso-element,.iso-connector{animation-duration:1ms!important}.iso-ambient-pulse,.iso-ambient-float,.iso-ambient-shake,.iso-ambient-glow,.iso-ambient-spin,.iso-ambient-blink,.iso-ambient-flow{animation:none!important}}\",\n\t\t\".iso-interactive g[data-id]{cursor:pointer}\",\n\t].join(\"\\n\");\n}\n","import { RenderError } from \"../types/errors.ts\";\nimport type { LinePrimitive, PrimitiveContent, PrimitiveStyle, TextAlign, TextContent } from \"../types/node.ts\";\nimport type { CompiledSprite, RuntimeBundle } from \"../types/runtime-bundle.ts\";\nimport { projectToRaw } from \"../utils/projection.ts\";\n\nconst NS = \"http://www.w3.org/2000/svg\";\n\ntype ResolvedAsset = { url: string; anchor?: [number, number]; sprite?: CompiledSprite };\n\nexport type AssetResolver = (name: string) => ResolvedAsset | undefined;\n\nexport function createAssetResolver(bundle?: RuntimeBundle): AssetResolver {\n\tconst embedded = new Map<string, ResolvedAsset>();\n\tconst bundleAssets = bundle?.assets;\n\n\tif (bundleAssets && typeof bundleAssets === \"object\") {\n\t\tfor (const [name, asset] of Object.entries(bundleAssets)) {\n\t\t\tif (asset && typeof asset === \"object\" && typeof asset.url === \"string\") {\n\t\t\t\tembedded.set(name, { url: asset.url, anchor: asset.anchor, sprite: asset.sprite });\n\t\t\t}\n\t\t}\n\t}\n\n\treturn (name: string) => embedded.get(name);\n}\n\nexport function createAssetNode(asset: ResolvedAsset, assetName: string, cellSize: number): SVGGElement {\n\tif (asset.sprite) {\n\t\treturn createSpriteAssetNode(asset.url, assetName, cellSize, asset.sprite, asset.anchor);\n\t}\n\treturn createUrlAssetNode(asset.url, assetName, cellSize, asset.anchor);\n}\n\nexport function createTextAssetNode(\n\ttextContent: TextContent | undefined,\n\tassetName: string,\n\tcellSize: number,\n): SVGGElement {\n\tif (!textContent?.value) {\n\t\tthrow new RenderError(\"TEXT_CONTENT_MISSING\", `Text content is missing for built-in asset: ${assetName}`, {\n\t\t\tasset: assetName,\n\t\t});\n\t}\n\n\tconst group = document.createElementNS(NS, \"g\") as SVGGElement;\n\tconst text = document.createElementNS(NS, \"text\") as SVGTextElement;\n\tconst align = textContent.align ?? \"middle\";\n\tconst placement = textContent.placement ?? \"cell\";\n\tconst fontSize = textContent.fontSize ?? 12;\n\tconst lineHeight = textContent.lineHeight ?? 1.2;\n\tconst anchorX = textAnchorX(align, cellSize);\n\tconst vertical = textVerticalAnchor(placement, cellSize);\n\n\ttext.setAttribute(\"x\", String(anchorX));\n\ttext.setAttribute(\"y\", String(vertical.y));\n\ttext.setAttribute(\"text-anchor\", align);\n\ttext.setAttribute(\"dominant-baseline\", vertical.baseline);\n\ttext.setAttribute(\"font-family\", \"Arial, Helvetica, sans-serif\");\n\ttext.setAttribute(\"font-size\", String(fontSize));\n\ttext.setAttribute(\"font-weight\", String(textContent.fontWeight ?? 700));\n\ttext.setAttribute(\"fill\", textContent.fill ?? \"currentColor\");\n\n\tconst lines = normalizeTextLines(textContent.value);\n\tfor (const [index, line] of lines.entries()) {\n\t\tconst tspan = document.createElementNS(NS, \"tspan\") as SVGTSpanElement;\n\t\ttspan.setAttribute(\"x\", String(anchorX));\n\t\ttspan.setAttribute(\"dy\", index === 0 ? \"0\" : String(fontSize * lineHeight));\n\t\ttspan.textContent = line;\n\t\ttext.appendChild(tspan);\n\t}\n\n\tgroup.appendChild(text);\n\treturn group;\n}\n\nexport function createPrimitiveAssetNode(\n\tassetName: string,\n\tprimitive: PrimitiveContent | undefined,\n\tcellSize: number,\n): SVGGElement {\n\tconst group = document.createElementNS(NS, \"g\") as SVGGElement;\n\tswitch (assetName) {\n\t\tcase \"rectangle\":\n\t\t\tappendProjectedPolygon(group, rectanglePoints(), primitive?.rectangle, cellSize);\n\t\t\treturn group;\n\t\tcase \"polygon\":\n\t\t\tappendProjectedPolygon(group, primitive?.polygon?.points, primitive?.polygon, cellSize);\n\t\t\treturn group;\n\t\tcase \"line\":\n\t\t\tappendProjectedPolyline(group, primitive?.line, primitive?.line, cellSize);\n\t\t\treturn group;\n\t\tcase \"circle\":\n\t\t\tappendCircle(group, primitive?.circle, cellSize);\n\t\t\treturn group;\n\t\tdefault:\n\t\t\tthrow new RenderError(\"PRIMITIVE_ASSET_UNKNOWN\", `Unknown built-in primitive asset: ${assetName}`, {\n\t\t\t\tasset: assetName,\n\t\t\t});\n\t}\n}\n\nfunction textAnchorX(align: TextAlign, cellSize: number): number {\n\tif (align === \"start\") return -cellSize / 2;\n\tif (align === \"end\") return cellSize / 2;\n\treturn 0;\n}\n\nfunction textVerticalAnchor(placement: TextContent[\"placement\"], cellSize: number): { y: number; baseline: string } {\n\tif (placement === \"caption\") return { y: -cellSize, baseline: \"text-before-edge\" };\n\treturn { y: -cellSize / 2, baseline: \"middle\" };\n}\n\nfunction normalizeTextLines(value: string): string[] {\n\tconst normalized = value.replace(/\\r\\n?/g, \"\\n\").replace(/\\n$/, \"\");\n\treturn normalized.split(\"\\n\");\n}\n\nfunction rectanglePoints(): [number, number][] {\n\treturn [\n\t\t[0, 0],\n\t\t[1, 0],\n\t\t[1, 1],\n\t\t[0, 1],\n\t];\n}\n\nfunction appendProjectedPolygon(\n\tgroup: SVGGElement,\n\tpoints: [number, number][] | undefined,\n\tstyle: PrimitiveStyle | undefined,\n\tcellSize: number,\n): void {\n\tif (!points) return;\n\tconst polygon = document.createElementNS(NS, \"polygon\") as SVGPolygonElement;\n\tpolygon.setAttribute(\"points\", points.map((point) => projectLocalPoint(point, cellSize)).join(\" \"));\n\tapplyPrimitiveStyle(polygon, style, { fill: \"currentColor\", stroke: \"none\" });\n\tgroup.appendChild(polygon);\n}\n\nfunction appendProjectedPolyline(\n\tgroup: SVGGElement,\n\tline: LinePrimitive | undefined,\n\tstyle: PrimitiveStyle | undefined,\n\tcellSize: number,\n): void {\n\tif (!line?.points) return;\n\tconst polyline = document.createElementNS(NS, \"polyline\") as SVGPolylineElement;\n\tpolyline.setAttribute(\"points\", line.points.map((point) => projectLocalPoint(point, cellSize)).join(\" \"));\n\tpolyline.setAttribute(\"fill\", \"none\");\n\tpolyline.setAttribute(\"stroke-linecap\", line.lineCap ?? \"round\");\n\tpolyline.setAttribute(\"stroke-linejoin\", line.lineJoin ?? \"round\");\n\tapplyPrimitiveStyle(polyline, style, {\n\t\tfill: \"none\",\n\t\tstroke: \"currentColor\",\n\t});\n\tgroup.appendChild(polyline);\n}\n\nfunction appendCircle(group: SVGGElement, style: PrimitiveStyle | undefined, cellSize: number): void {\n\tconst center = projectLocalPoint([0.5, 0.5], cellSize);\n\tconst circle = document.createElementNS(NS, \"circle\") as SVGCircleElement;\n\tconst [cx, cy] = center.split(\",\").map(Number);\n\tcircle.setAttribute(\"cx\", String(cx));\n\tcircle.setAttribute(\"cy\", String(cy));\n\tcircle.setAttribute(\"r\", String(cellSize * 0.2));\n\tapplyPrimitiveStyle(circle, style, {\n\t\tfill: \"currentColor\",\n\t\tstroke: \"none\",\n\t});\n\tgroup.appendChild(circle);\n}\n\nfunction projectLocalPoint(point: [number, number], cellSize: number): string {\n\tconst projected = projectToRaw(point[0], point[1], cellSize);\n\tconst anchor = projectToRaw(1, 1, cellSize);\n\treturn `${projected.rawX - anchor.rawX},${projected.rawY - anchor.rawY}`;\n}\n\nfunction applyPrimitiveStyle(\n\tnode: SVGElement,\n\tstyle: PrimitiveStyle | undefined,\n\tdefaults: { fill: string; stroke: string },\n): void {\n\tnode.setAttribute(\"fill\", style?.fill ?? defaults.fill);\n\tnode.setAttribute(\"stroke\", style?.stroke ?? defaults.stroke);\n\tnode.setAttribute(\"stroke-width\", String(style?.strokeWidth ?? 0));\n\tnode.setAttribute(\"opacity\", String(style?.opacity ?? 1));\n\tif (style?.dash) node.setAttribute(\"stroke-dasharray\", style.dash.join(\" \"));\n}\n\nfunction createUrlAssetNode(url: string, assetName: string, cellSize: number, anchor?: [number, number]): SVGGElement {\n\tif (!isSafeAssetUrl(url)) {\n\t\tthrow new RenderError(\"INVALID_ASSET_URL\", `Asset URL is unsafe: ${assetName}`, { asset: assetName });\n\t}\n\tconst group = document.createElementNS(NS, \"g\") as SVGGElement;\n\tconst image = document.createElementNS(NS, \"image\") as SVGImageElement;\n\tconst resolvedUrl = resolveBrowserAssetUrl(url);\n\tconst [anchorX, anchorY] = anchor ?? [0.5, 1];\n\timage.setAttribute(\"href\", resolvedUrl);\n\timage.setAttributeNS(\"http://www.w3.org/1999/xlink\", \"href\", resolvedUrl);\n\timage.setAttribute(\"x\", String(-cellSize * anchorX));\n\timage.setAttribute(\"y\", String(-cellSize * anchorY));\n\timage.setAttribute(\"width\", String(cellSize));\n\timage.setAttribute(\"height\", String(cellSize));\n\timage.setAttribute(\"preserveAspectRatio\", \"xMidYMax meet\");\n\tgroup.appendChild(image);\n\treturn group;\n}\n\nfunction createSpriteAssetNode(\n\turl: string,\n\tassetName: string,\n\tcellSize: number,\n\tsprite: CompiledSprite,\n\tanchor?: [number, number],\n): SVGGElement {\n\tif (!isSafeAssetUrl(url)) {\n\t\tthrow new RenderError(\"INVALID_ASSET_URL\", `Asset URL is unsafe: ${assetName}`, { asset: assetName });\n\t}\n\tconst group = document.createElementNS(NS, \"g\") as SVGGElement;\n\tconst viewport = document.createElementNS(NS, \"svg\") as SVGSVGElement;\n\tconst image = document.createElementNS(NS, \"image\") as SVGImageElement;\n\tconst resolvedUrl = resolveBrowserAssetUrl(url);\n\tconst [anchorX, anchorY] = anchor ?? [0.5, 1];\n\tconst [rectX, rectY, rectWidth, rectHeight] = sprite.rect;\n\n\tviewport.setAttribute(\"x\", String(-cellSize * anchorX));\n\tviewport.setAttribute(\"y\", String(-cellSize * anchorY));\n\tviewport.setAttribute(\"width\", String(cellSize));\n\tviewport.setAttribute(\"height\", String(cellSize));\n\tviewport.setAttribute(\"viewBox\", `${rectX} ${rectY} ${rectWidth} ${rectHeight}`);\n\tviewport.setAttribute(\"preserveAspectRatio\", \"xMidYMax meet\");\n\n\timage.setAttribute(\"href\", resolvedUrl);\n\timage.setAttributeNS(\"http://www.w3.org/1999/xlink\", \"href\", resolvedUrl);\n\timage.setAttribute(\"x\", \"0\");\n\timage.setAttribute(\"y\", \"0\");\n\timage.setAttribute(\"width\", String(sprite.sheetSize[0]));\n\timage.setAttribute(\"height\", String(sprite.sheetSize[1]));\n\tviewport.appendChild(image);\n\tgroup.appendChild(viewport);\n\treturn group;\n}\n\nfunction resolveBrowserAssetUrl(url: string): string {\n\ttry {\n\t\tconst baseURI = document.baseURI;\n\t\treturn typeof baseURI === \"string\" ? new URL(url, baseURI).href : url;\n\t} catch {\n\t\treturn url;\n\t}\n}\n\nfunction isSafeAssetUrl(url: string): boolean {\n\tconst normalized = url.trim().toLowerCase();\n\treturn normalized.length > 0 && !normalized.startsWith(\"javascript:\");\n}\n","import { RenderError } from \"../types/errors.ts\";\n\nconst CSS_CUSTOM_PROPERTY_PATTERN = /^--[a-zA-Z0-9-_]+$/;\n\n/**\n * Apply theme CSS custom properties to an element's inline style.\n * Throws `RenderError` (`INVALID_THEME_VAR`) if a key is not a valid `--name` custom property.\n */\nexport function applyThemeToElement(element: SVGElement | HTMLElement, themeVars: Record<string, string>): void {\n\tfor (const [name, value] of Object.entries(themeVars)) {\n\t\tif (!CSS_CUSTOM_PROPERTY_PATTERN.test(name)) {\n\t\t\tthrow new RenderError(\"INVALID_THEME_VAR\", `Invalid CSS custom property name: ${name}`);\n\t\t}\n\t\telement.style.setProperty(name, value);\n\t}\n}\n","import { resolveTheme } from \"../types/asset-registry.ts\";\nimport { RenderError } from \"../types/errors.ts\";\nimport type { CameraGridArea, ConnectorEndpoint, RuntimeConnectorState, RuntimeElementState } from \"../types/node.ts\";\nimport type { RuntimeBundle } from \"../types/runtime-bundle.ts\";\nimport type { LayerDefinition } from \"../types/scene.ts\";\nimport { calculateVisualSize, projectToRaw, projectToScreen } from \"../utils/projection.ts\";\nimport { buildKeyframeCSS } from \"./animation-css.ts\";\nimport type { AssetResolver } from \"./asset-node.ts\";\nimport { createAssetNode, createAssetResolver, createPrimitiveAssetNode, createTextAssetNode } from \"./asset-node.ts\";\nimport { applyThemeToElement } from \"./theme.ts\";\n\nconst NS = \"http://www.w3.org/2000/svg\";\nconst BUILT_IN_TEXT_ASSET_ID = \"text\";\nconst BUILT_IN_PRIMITIVE_ASSET_IDS = new Set([\"rectangle\", \"circle\", \"polygon\", \"line\"]);\nconst DEFAULT_CONNECTOR_DASH: Record<\"dashed\" | \"dotted\", [number, number]> = {\n\tdashed: [12, 8],\n\tdotted: [0, 8],\n};\nconst ENDPOINT_RADIUS_GRID = 0.14;\nconst ARROW_LENGTH_GRID = 0.35;\nconst ARROW_WIDTH_GRID = 0.28;\nconst BAR_WIDTH_GRID = 0.4;\n\ninterface Bounds {\n\tminX: number;\n\tminY: number;\n\tmaxX: number;\n\tmaxY: number;\n}\n\ninterface ResolvedLayoutState {\n\tcellSize: number;\n\tpadding: { x: number; y: number };\n\tcontentBounds: Bounds;\n\tfloorBounds: Bounds;\n\tselectedBounds: Bounds;\n\tviewBox: { minX: number; minY: number; width: number; height: number };\n}\n\n/** Internal state tracked per element node. */\ninterface ElementState {\n\tnode: SVGGElement;\n\tcurrent: RuntimeElementState;\n\tanchor: [number, number];\n\tisHidden: boolean;\n\tentryKey?: string;\n\texitKey?: string;\n\tambient: Set<string>;\n}\n\nexport interface ViewBoxRect {\n\tminX: number;\n\tminY: number;\n\twidth: number;\n\theight: number;\n}\n\n/** Internal state tracked per connector node. */\ninterface ConnectorState {\n\tnode: SVGGElement;\n\tshaft: SVGPathElement;\n\toutline?: SVGPathElement;\n\tlane?: SVGPathElement;\n\tstartEndpoint?: SVGElement;\n\tendEndpoint?: SVGElement;\n\tisHidden: boolean;\n\tambient: Set<string>;\n\tprevious?: RuntimeConnectorState;\n}\n\n/** Extended SVG with engine internals stored on it. */\ninterface SceneSVG extends SVGSVGElement {\n\t_layerMap: Map<string, Required<LayerDefinition>>;\n\t_elementMap: Map<string, ElementState>;\n\t_connectorMap: Map<string, ConnectorState>;\n\t_layout: ResolvedLayoutState;\n\t_viewBoxW: number;\n\t_viewBoxH: number;\n\t_depthGroup: SVGGElement;\n}\n\n/** Options accepted by `buildSceneDOM()`. */\nexport interface RenderConfig {\n\t/** Accessible label for the mounted SVG root. */\n\tlabel?: string;\n\t/** CSS custom properties applied on top of the bundle theme. */\n\tthemeVars?: Record<string, string>;\n}\n\n// ── Public API ────────────────────────────────────────────────────────────\n\n/** Build the SVG DOM for a compiled runtime bundle and mount it into a container. */\nexport function buildSceneDOM(container: HTMLElement, bundle: RuntimeBundle, config?: RenderConfig): SVGSVGElement {\n\tconst layout = resolveSceneLayout(bundle);\n\tconst initialStop = bundle.scenes[0];\n\tconst allElements = collectElementDefinitions(bundle);\n\tconst allConnectors = collectConnectorDefinitions(bundle);\n\tconst initialById = new Map((initialStop?.elements ?? []).map((element) => [element.id, element]));\n\tconst initialConnectorsById = new Map((initialStop?.connectors ?? []).map((connector) => [connector.id, connector]));\n\n\tconst svg = createRootSvg(layout, config?.label, bundle.className);\n\tconst assetResolver = createAssetResolver(bundle);\n\n\tsvg.appendChild(createCssDefs());\n\n\tapplyThemeToElement(svg, {\n\t\t...(resolveTheme(bundle.theme) ?? {}),\n\t\t...(bundle.themeVars ?? {}),\n\t\t...(config?.themeVars ?? {}),\n\t});\n\n\tconst sortedLayers = sortLayers(bundle.layers);\n\tconst layerMap = createLayerMap(sortedLayers);\n\tif (bundle.floor.visible) {\n\t\tsvg.appendChild(createFloorGrid(bundle, layout));\n\t}\n\n\tconst connectorMap = new Map<string, ConnectorState>();\n\tfor (const def of allConnectors) {\n\t\tconst initial = initialConnectorsById.get(def.id) ?? {\n\t\t\t...def,\n\t\t\tpresence: \"removed\",\n\t\t};\n\t\tconst state = createConnectorInstance(initial, layout);\n\t\tif (initial.presence === \"removed\") {\n\t\t\tstate.isHidden = true;\n\t\t\thideElementAfterExit(state.node);\n\t\t}\n\t\tapplyConnectorAmbientClasses(state, initial.ambient ?? []);\n\t\tsvg.appendChild(state.node);\n\t\tconnectorMap.set(def.id, state);\n\t}\n\n\tconst depthGroup = document.createElementNS(NS, \"g\") as SVGGElement;\n\tdepthGroup.classList.add(\"iso-depth-layer\");\n\tdepthGroup.setAttribute(\"data-layer\", \"depth\");\n\tsvg.appendChild(depthGroup);\n\n\tconst labelGroup = document.createElementNS(NS, \"g\") as SVGGElement;\n\tlabelGroup.classList.add(\"iso-layer\", \"iso-layer-labels\");\n\tlabelGroup.setAttribute(\"data-layer\", \"labels\");\n\tsvg.appendChild(labelGroup);\n\n\tconst elementMap = new Map<string, ElementState>();\n\tconst sortedElements = sortElementsForPerspective(allElements);\n\tfor (const def of sortedElements) {\n\t\tconst declaredLayer = layerMap.get(def.layer);\n\t\tif (!declaredLayer) {\n\t\t\tthrow new RenderError(\"MISSING_LAYER\", `Unknown layer for \"${def.id}\": ${def.layer}`);\n\t\t}\n\n\t\tconst initial = initialById.get(def.id) ?? {\n\t\t\t...def,\n\t\t\tpresence: \"removed\",\n\t\t};\n\t\tconst instance = createElementInstance(initial, layout, assetResolver);\n\t\tinstance.anchor = assetAnchorForBounds(bundle, initial);\n\t\tinstance.node.classList.add(`iso-layer-${def.layer}`);\n\t\tinstance.node.setAttribute(\"data-layer\", def.layer);\n\t\tif (initial.presence === \"removed\") {\n\t\t\tinstance.isHidden = true;\n\t\t\thideElementAfterExit(instance.node);\n\t\t}\n\t\tapplyAmbientClasses(instance, initial.ambient ?? []);\n\t\tconst parent = isTextAsset(def.asset) ? labelGroup : depthGroup;\n\t\tparent.appendChild(instance.node);\n\t\telementMap.set(def.id, instance);\n\t}\n\n\tsvg._layerMap = layerMap;\n\tsvg._elementMap = elementMap;\n\tsvg._connectorMap = connectorMap;\n\tsvg._depthGroup = depthGroup;\n\tcontainer.appendChild(svg);\n\treturn svg;\n}\n\n/** Update transforms and ambient classes for a live set of interpolated runtime values. */\nexport function updateElementTransforms(\n\tsvg: SVGSVGElement & {\n\t\t_elementMap?: Map<string, ElementState | unknown>;\n\t\t_connectorMap?: Map<string, ConnectorState | unknown>;\n\t\t_layout?: ResolvedLayoutState;\n\t\t_depthGroup?: SVGGElement;\n\t},\n\telements: RuntimeElementState[],\n\tconnectors: RuntimeConnectorState[] = [],\n): void {\n\tconst layout = svg._layout;\n\tif (!layout) return;\n\n\tconst map = svg._elementMap as Map<string, ElementState> | undefined;\n\tif (map) {\n\t\tfor (const def of elements) {\n\t\t\tconst state = map.get(def.id);\n\t\t\tif (!state) continue;\n\t\t\tconst previous = state.current;\n\t\t\tstate.current = def;\n\t\t\tif (!hasEqualGeneratedContent(previous, def)) {\n\t\t\t\tupdateGeneratedElementContent(state.node, def, layout);\n\t\t\t}\n\t\t\tapplyElementTransform(state.node, def, layout);\n\t\t\tapplyAmbientClasses(state, def.ambient ?? []);\n\t\t}\n\t\tif (svg._depthGroup) {\n\t\t\treconcileDepthOrder(svg._depthGroup, map);\n\t\t}\n\t}\n\n\tconst connectorMap = svg._connectorMap;\n\tif (!connectorMap) return;\n\tfor (const def of connectors) {\n\t\tconst state = connectorMap.get(def.id) as ConnectorState | undefined;\n\t\tif (!state) continue;\n\t\tapplyConnectorState(state, def, layout);\n\t}\n}\n\n/** Read the internal ElementState for an element by its id. */\nexport function getElementState(\n\tsvg: SVGSVGElement & { _elementMap?: Map<string, ElementState | unknown> },\n\tid: string,\n): ElementState | undefined {\n\treturn svg._elementMap?.get(id) as ElementState | undefined;\n}\n\n/** Read the internal ConnectorState for a connector by its id. */\nexport function getConnectorState(\n\tsvg: SVGSVGElement & {\n\t\t_connectorMap?: Map<string, ConnectorState | unknown>;\n\t},\n\tid: string,\n): ConnectorState | undefined {\n\treturn svg._connectorMap?.get(id) as ConnectorState | undefined;\n}\n\nexport function getResolvedViewBox(bundle: RuntimeBundle): {\n\tminX: number;\n\tminY: number;\n\twidth: number;\n\theight: number;\n} {\n\treturn resolveSceneLayout(bundle).viewBox;\n}\n\nexport function getResolvedProjectionLayout(bundle: RuntimeBundle): {\n\tcellSize: number;\n\tpadding: { x: number; y: number };\n\tselectedBounds: { minX: number; minY: number; maxX: number; maxY: number };\n} {\n\tconst layout = resolveSceneLayout(bundle);\n\treturn {\n\t\tcellSize: layout.cellSize,\n\t\tpadding: layout.padding,\n\t\tselectedBounds: layout.selectedBounds,\n\t};\n}\n\nexport function getCurrentElementBounds(\n\tsvg: SVGSVGElement & { _elementMap?: Map<string, ElementState | unknown>; _layout?: ResolvedLayoutState },\n\tid: string,\n): ViewBoxRect | undefined {\n\tconst layout = svg._layout;\n\tconst state = svg._elementMap?.get(id) as ElementState | undefined;\n\tif (!layout || !state || state.current.presence === \"removed\") return undefined;\n\treturn boundsToViewBox(calculateElementBounds(state.current, layout, state.anchor));\n}\n\nexport function getGridAreaBounds(bundle: RuntimeBundle, area: CameraGridArea): ViewBoxRect {\n\tconst layout = resolveSceneLayout(bundle);\n\tconst [x, y] = area.at;\n\tconst [width, height] = area.size;\n\tlet bounds = emptyBounds();\n\tfor (const point of [\n\t\t[x, y],\n\t\t[x + width, y],\n\t\t[x, y + height],\n\t\t[x + width, y + height],\n\t] as Array<[number, number]>) {\n\t\tconst screen = projectToScreen(\n\t\t\tpoint[0],\n\t\t\tpoint[1],\n\t\t\tlayout.cellSize,\n\t\t\tlayout.selectedBounds.minX,\n\t\t\tlayout.selectedBounds.minY,\n\t\t\tlayout.padding.x,\n\t\t\tlayout.padding.y,\n\t\t);\n\t\tbounds = includePoint(bounds, screen.screenX, screen.screenY);\n\t}\n\treturn boundsToViewBox(bounds);\n}\n\nexport function applySceneViewBox(svg: SVGSVGElement, viewBox: ViewBoxRect): void {\n\tsvg.setAttribute(\"viewBox\", `${viewBox.minX} ${viewBox.minY} ${viewBox.width} ${viewBox.height}`);\n}\n\n// ── Lifecycle helpers ─────────────────────────────────────────────────────\n\n/** Hide an element after its exit animation completes. */\nexport function hideElementAfterExit(node: SVGElement): void {\n\tnode.style.visibility = \"hidden\";\n\tnode.style.pointerEvents = \"none\";\n}\n\n/** Show an element on re-addition. */\nexport function unhideElementOnReadd(node: SVGElement): void {\n\tnode.style.visibility = \"visible\";\n\tnode.style.pointerEvents = \"auto\";\n}\n\n/** Create a new element SVG instance for lifecycle re-instantiation. */\nexport function createNewElementInstance(def: RuntimeElementState, parent?: SVGGElement | null): SVGGElement {\n\tconst layout: ResolvedLayoutState = {\n\t\tcellSize: 64,\n\t\tpadding: { x: 0, y: 0 },\n\t\tcontentBounds: emptyBounds(),\n\t\tfloorBounds: emptyBounds(),\n\t\tselectedBounds: { minX: 0, minY: 0, maxX: 64, maxY: 64 },\n\t\tviewBox: { minX: 0, minY: 0, width: 64, height: 64 },\n\t};\n\tconst instance = createElementInstance(def, layout, createAssetResolver());\n\tparent?.appendChild(instance.node);\n\treturn instance.node;\n}\n\n/** Remove an element node from the DOM. */\nexport function removeElementNode(node: SVGElement): void {\n\tnode.parentElement?.removeChild(node);\n}\n\n// ── Layout helpers ────────────────────────────────────────────────────────\n\nfunction resolveSceneLayout(bundle: RuntimeBundle): ResolvedLayoutState {\n\tconst cellSize = bundle.grid.cellSize;\n\tconst padding = bundle.layout.padding;\n\tconst contentBounds = calculateContentBounds(bundle, cellSize);\n\tconst floorBounds = calculateFloorBounds(bundle, cellSize);\n\tconst selectedBounds = selectBounds(bundle.layout.bounds, contentBounds, floorBounds);\n\tconst width = selectedBounds.maxX - selectedBounds.minX + padding.x * 2;\n\tconst height = selectedBounds.maxY - selectedBounds.minY + padding.y * 2;\n\tconst viewBox = {\n\t\tminX: 0,\n\t\tminY: 0,\n\t\twidth: roundDimension(width || cellSize),\n\t\theight: roundDimension(height || cellSize),\n\t};\n\n\treturn {\n\t\tcellSize,\n\t\tpadding,\n\t\tcontentBounds,\n\t\tfloorBounds,\n\t\tselectedBounds,\n\t\tviewBox,\n\t};\n}\n\nfunction calculateContentBounds(bundle: RuntimeBundle, cellSize: number): Bounds {\n\tlet bounds = emptyBounds();\n\tfor (const stop of bundle.scenes) {\n\t\tfor (const element of stop.elements ?? []) {\n\t\t\tif (element.presence === \"removed\") continue;\n\t\t\tbounds = includeBounds(bounds, calculateRawElementBounds(bundle, element, cellSize));\n\t\t}\n\t\tfor (const connector of stop.connectors ?? []) {\n\t\t\tif (connector.presence === \"removed\") continue;\n\t\t\tbounds = includeBounds(bounds, calculateConnectorBounds(connector, cellSize));\n\t\t}\n\t}\n\treturn normalizeBounds(bounds, cellSize);\n}\n\nfunction calculateRawElementBounds(bundle: RuntimeBundle, element: RuntimeElementState, cellSize: number): Bounds {\n\tconst { rawX, rawY } = projectToRaw(element.pos[0] + element.size, element.pos[1] + element.size, cellSize);\n\tconst visualSize = calculateVisualSize(element.size, cellSize);\n\tconst [anchorX, anchorY] = assetAnchorForBounds(bundle, element);\n\treturn {\n\t\tminX: rawX - visualSize * anchorX,\n\t\tminY: rawY - visualSize * anchorY,\n\t\tmaxX: rawX + visualSize * (1 - anchorX),\n\t\tmaxY: rawY + visualSize * (1 - anchorY),\n\t};\n}\n\nfunction calculateElementBounds(\n\telement: RuntimeElementState,\n\tlayout: ResolvedLayoutState,\n\tanchor: [number, number],\n): Bounds {\n\tconst screen = projectToScreen(\n\t\telement.pos[0] + element.size,\n\t\telement.pos[1] + element.size,\n\t\tlayout.cellSize,\n\t\tlayout.selectedBounds.minX,\n\t\tlayout.selectedBounds.minY,\n\t\tlayout.padding.x,\n\t\tlayout.padding.y,\n\t);\n\tconst visualSize = calculateVisualSize(element.size, layout.cellSize);\n\treturn {\n\t\tminX: screen.screenX - visualSize * anchor[0],\n\t\tminY: screen.screenY - visualSize * anchor[1],\n\t\tmaxX: screen.screenX + visualSize * (1 - anchor[0]),\n\t\tmaxY: screen.screenY + visualSize * (1 - anchor[1]),\n\t};\n}\n\nfunction assetAnchorForBounds(bundle: RuntimeBundle, element: RuntimeElementState): [number, number] {\n\treturn bundle.assets?.[element.asset]?.anchor ?? [0.5, 1];\n}\n\nfunction calculateConnectorBounds(connector: RuntimeConnectorState, cellSize: number): Bounds {\n\tlet bounds = emptyBounds();\n\tfor (const [x, y] of connector.route) {\n\t\tconst { rawX, rawY } = projectToRaw(x, y, cellSize);\n\t\tbounds = includePoint(bounds, rawX, rawY);\n\t}\n\tconst endpointPadding = Math.max(ARROW_LENGTH_GRID, BAR_WIDTH_GRID, ENDPOINT_RADIUS_GRID * 2) * cellSize;\n\tconst strokePadding = connector.style.strokeWidth / 2 + (connector.style.outlineWidth ?? 0);\n\tconst padding = endpointPadding + strokePadding;\n\treturn {\n\t\tminX: bounds.minX - padding,\n\t\tminY: bounds.minY - padding,\n\t\tmaxX: bounds.maxX + padding,\n\t\tmaxY: bounds.maxY + padding,\n\t};\n}\n\nfunction calculateFloorBounds(bundle: RuntimeBundle, cellSize: number): Bounds {\n\tconst origin = bundle.floor.origin;\n\tconst [width, height] = bundle.floor.size;\n\tconst points: Array<[number, number]> = [\n\t\torigin,\n\t\t[origin[0] + width, origin[1]],\n\t\t[origin[0], origin[1] + height],\n\t\t[origin[0] + width, origin[1] + height],\n\t];\n\tlet bounds = emptyBounds();\n\tfor (const [x, y] of points) {\n\t\tconst { rawX, rawY } = projectToRaw(x, y, cellSize);\n\t\tbounds = includePoint(bounds, rawX, rawY);\n\t}\n\treturn normalizeBounds(bounds, cellSize);\n}\n\nfunction selectBounds(mode: RuntimeBundle[\"layout\"][\"bounds\"], content: Bounds, floor: Bounds): Bounds {\n\tif (mode === \"content\") return content;\n\tif (mode === \"floor\") return floor;\n\treturn includeBounds(content, floor);\n}\n\nfunction emptyBounds(): Bounds {\n\treturn {\n\t\tminX: Number.POSITIVE_INFINITY,\n\t\tminY: Number.POSITIVE_INFINITY,\n\t\tmaxX: Number.NEGATIVE_INFINITY,\n\t\tmaxY: Number.NEGATIVE_INFINITY,\n\t};\n}\n\nfunction normalizeBounds(bounds: Bounds, cellSize: number): Bounds {\n\tif (Number.isFinite(bounds.minX)) return bounds;\n\treturn { minX: 0, minY: 0, maxX: cellSize, maxY: cellSize };\n}\n\nfunction boundsToViewBox(bounds: Bounds): ViewBoxRect {\n\tconst centerX = (bounds.minX + bounds.maxX) / 2;\n\tconst centerY = (bounds.minY + bounds.maxY) / 2;\n\tconst width = Math.max(1, bounds.maxX - bounds.minX);\n\tconst height = Math.max(1, bounds.maxY - bounds.minY);\n\treturn {\n\t\tminX: roundDimension(centerX - width / 2),\n\t\tminY: roundDimension(centerY - height / 2),\n\t\twidth: roundDimension(width),\n\t\theight: roundDimension(height),\n\t};\n}\n\nfunction includePoint(bounds: Bounds, x: number, y: number): Bounds {\n\treturn {\n\t\tminX: Math.min(bounds.minX, x),\n\t\tminY: Math.min(bounds.minY, y),\n\t\tmaxX: Math.max(bounds.maxX, x),\n\t\tmaxY: Math.max(bounds.maxY, y),\n\t};\n}\n\nfunction includeBounds(bounds: Bounds, next: Bounds): Bounds {\n\treturn {\n\t\tminX: Math.min(bounds.minX, next.minX),\n\t\tminY: Math.min(bounds.minY, next.minY),\n\t\tmaxX: Math.max(bounds.maxX, next.maxX),\n\t\tmaxY: Math.max(bounds.maxY, next.maxY),\n\t};\n}\n\nfunction roundDimension(value: number): number {\n\treturn Math.round(value * 1000) / 1000;\n}\n\n// ── Private helpers ───────────────────────────────────────────────────────\n\nfunction createRootSvg(layout: ResolvedLayoutState, label?: string, className?: string): SceneSVG {\n\tconst svg = document.createElementNS(NS, \"svg\") as SceneSVG;\n\tsvg.classList.add(\"iso-scene\");\n\tfor (const token of className?.trim().split(/\\s+/) ?? []) {\n\t\tif (token) svg.classList.add(token);\n\t}\n\tsvg.setAttribute(\"width\", \"100%\");\n\tsvg.setAttribute(\"height\", \"100%\");\n\tsvg.setAttribute(\n\t\t\"viewBox\",\n\t\t`${layout.viewBox.minX} ${layout.viewBox.minY} ${layout.viewBox.width} ${layout.viewBox.height}`,\n\t);\n\tsvg.setAttribute(\"preserveAspectRatio\", \"xMidYMid meet\");\n\tsvg.style.width = \"100%\";\n\tsvg.style.height = \"100%\";\n\tsvg.style.display = \"block\";\n\tif (label) {\n\t\tsvg.setAttribute(\"role\", \"img\");\n\t\tsvg.setAttribute(\"aria-label\", label);\n\t} else {\n\t\tsvg.setAttribute(\"aria-hidden\", \"true\");\n\t}\n\tsvg._layout = layout;\n\tsvg._viewBoxW = layout.viewBox.width;\n\tsvg._viewBoxH = layout.viewBox.height;\n\treturn svg;\n}\n\nfunction createCssDefs(): SVGStyleElement {\n\tconst styleEl = document.createElementNS(NS, \"style\") as SVGStyleElement;\n\tstyleEl.textContent = buildKeyframeCSS();\n\treturn styleEl;\n}\n\nfunction createFloorGrid(bundle: RuntimeBundle, layout: ResolvedLayoutState): SVGGElement {\n\tconst group = document.createElementNS(NS, \"g\") as SVGGElement;\n\tgroup.classList.add(\"iso-floor-grid\", `iso-layer-${bundle.floor.layer}`);\n\tgroup.setAttribute(\"data-layer\", bundle.floor.layer);\n\n\tconst [originX, originY] = bundle.floor.origin;\n\tconst [columns, rows] = bundle.floor.size;\n\tconst corners = [\n\t\tprojectGridPoint(originX, originY, layout),\n\t\tprojectGridPoint(originX + columns, originY, layout),\n\t\tprojectGridPoint(originX + columns, originY + rows, layout),\n\t\tprojectGridPoint(originX, originY + rows, layout),\n\t];\n\n\tconst slab = document.createElementNS(NS, \"polygon\");\n\tslab.classList.add(\"iso-floor-slab\");\n\tslab.setAttribute(\"points\", corners.map(pointToString).join(\" \"));\n\tslab.setAttribute(\"fill\", \"#dbe6f4\");\n\tslab.setAttribute(\"fill-opacity\", \"0.22\");\n\tslab.setAttribute(\"stroke\", \"#b9c9df\");\n\tslab.setAttribute(\"stroke-width\", \"1\");\n\tgroup.appendChild(slab);\n\n\tfor (let x = 0; x <= columns; x++) {\n\t\tgroup.appendChild(\n\t\t\tcreateFloorLine(\n\t\t\t\tprojectGridPoint(originX + x, originY, layout),\n\t\t\t\tprojectGridPoint(originX + x, originY + rows, layout),\n\t\t\t),\n\t\t);\n\t}\n\n\tfor (let y = 0; y <= rows; y++) {\n\t\tgroup.appendChild(\n\t\t\tcreateFloorLine(\n\t\t\t\tprojectGridPoint(originX, originY + y, layout),\n\t\t\t\tprojectGridPoint(originX + columns, originY + y, layout),\n\t\t\t),\n\t\t);\n\t}\n\n\treturn group;\n}\n\nfunction createFloorLine(start: { x: number; y: number }, end: { x: number; y: number }): SVGLineElement {\n\tconst line = document.createElementNS(NS, \"line\") as SVGLineElement;\n\tline.setAttribute(\"x1\", String(start.x));\n\tline.setAttribute(\"y1\", String(start.y));\n\tline.setAttribute(\"x2\", String(end.x));\n\tline.setAttribute(\"y2\", String(end.y));\n\tline.setAttribute(\"stroke\", \"#2563eb\");\n\tline.setAttribute(\"stroke-width\", \"1\");\n\tline.setAttribute(\"stroke-dasharray\", \"5 5\");\n\tline.setAttribute(\"stroke-opacity\", \"0.2\");\n\treturn line;\n}\n\nfunction projectGridPoint(x: number, y: number, layout: ResolvedLayoutState): { x: number; y: number } {\n\tconst screen = projectToScreen(\n\t\tx,\n\t\ty,\n\t\tlayout.cellSize,\n\t\tlayout.selectedBounds.minX,\n\t\tlayout.selectedBounds.minY,\n\t\tlayout.padding.x,\n\t\tlayout.padding.y,\n\t);\n\treturn { x: screen.screenX, y: screen.screenY };\n}\n\nfunction pointToString(point: { x: number; y: number }): string {\n\treturn `${point.x},${point.y}`;\n}\n\nfunction createLayerMap(layers: Required<LayerDefinition>[]): Map<string, Required<LayerDefinition>> {\n\treturn new Map(layers.map((layer) => [layer.name, layer]));\n}\n\nfunction sortLayers(layers: LayerDefinition[]): Required<LayerDefinition>[] {\n\treturn [...layers]\n\t\t.map((layer, index) => ({ name: layer.name, order: layer.order ?? index }))\n\t\t.sort((a, b) => a.order - b.order || a.name.localeCompare(b.name));\n}\n\nfunction sortElementsForPerspective(elements: RuntimeElementState[]): RuntimeElementState[] {\n\treturn elements.slice().sort((a, b) => {\n\t\tconst bucket = renderBucket(a) - renderBucket(b);\n\t\tif (bucket !== 0) return bucket;\n\t\tconst depth = a.pos[0] + a.pos[1] - (b.pos[0] + b.pos[1]);\n\t\tif (depth !== 0) return depth;\n\t\treturn a.id.localeCompare(b.id);\n\t});\n}\n\nfunction renderBucket(element: RuntimeElementState): number {\n\tif (isTextAsset(element.asset)) return 1;\n\treturn 0;\n}\n\n/**\n * Re-sort the depth group's live child nodes to match the current\n * `(x + y)` + id perspective order. Only elements whose relative order\n * changed are moved so in-flight CSS animation state on unaffected\n * elements is preserved. Text elements live in the label group and are\n * never part of this reconciliation.\n */\nfunction reconcileDepthOrder(depthGroup: SVGGElement, elementMap: Map<string, ElementState>): void {\n\tconst current: RuntimeElementState[] = [];\n\tfor (const state of elementMap.values()) {\n\t\tif ((state.node.parentElement as SVGGElement | null) !== depthGroup) continue;\n\t\tcurrent.push(state.current);\n\t}\n\tif (current.length < 2) return;\n\n\tconst desiredOrder = sortElementsForPerspective(current);\n\tconst existingOrder = [...depthGroup.childNodes] as unknown as SVGElement[];\n\n\tlet orderMatches = existingOrder.length === desiredOrder.length;\n\tif (orderMatches) {\n\t\tfor (let index = 0; index < desiredOrder.length; index++) {\n\t\t\tconst expectedId = desiredOrder[index]?.id;\n\t\t\tif (existingOrder[index]?.getAttribute(\"data-id\") !== expectedId) {\n\t\t\t\torderMatches = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (orderMatches) return;\n\n\tfor (const def of desiredOrder) {\n\t\tconst state = elementMap.get(def.id);\n\t\tif (state) depthGroup.appendChild(state.node);\n\t}\n}\n\nfunction collectElementDefinitions(bundle: RuntimeBundle): RuntimeElementState[] {\n\tconst byId = new Map<string, RuntimeElementState>();\n\tfor (const stop of bundle.scenes) {\n\t\tfor (const element of stop.elements ?? []) {\n\t\t\tif (!byId.has(element.id) || byId.get(element.id)?.presence === \"removed\") {\n\t\t\t\tbyId.set(element.id, element);\n\t\t\t}\n\t\t}\n\t}\n\treturn [...byId.values()];\n}\n\nfunction collectConnectorDefinitions(bundle: RuntimeBundle): RuntimeConnectorState[] {\n\tconst byId = new Map<string, RuntimeConnectorState>();\n\tfor (const stop of bundle.scenes) {\n\t\tfor (const connector of stop.connectors ?? []) {\n\t\t\tif (!byId.has(connector.id) || byId.get(connector.id)?.presence === \"removed\") {\n\t\t\t\tbyId.set(connector.id, connector);\n\t\t\t}\n\t\t}\n\t}\n\treturn [...byId.values()];\n}\n\n/** Create a single element SVG instance applying entry animation. */\nfunction createElementInstance(\n\tdef: RuntimeElementState,\n\tlayout: ResolvedLayoutState,\n\tresolveAsset: AssetResolver,\n): ElementState {\n\tconst node =\n\t\tdef.asset === BUILT_IN_TEXT_ASSET_ID\n\t\t\t? createTextAssetNode(def.text, def.asset, layout.cellSize)\n\t\t\t: isPrimitiveAsset(def.asset)\n\t\t\t\t? createPrimitiveAssetNode(def.asset, def.primitive, layout.cellSize)\n\t\t\t\t: createResolvedAssetNode(def, resolveAsset, layout.cellSize);\n\tnode.classList.add(\"iso-element\", `iso-element-${def.id}`);\n\tnode.setAttribute(\"data-id\", def.id);\n\tnode.setAttribute(\"data-asset\", def.asset);\n\tnode.style.overflow = \"visible\";\n\tnode.style.pointerEvents = \"auto\";\n\tapplyElementTransform(node, def, layout);\n\n\tconst entryAnim = def.enter;\n\tif (entryAnim && entryAnim !== \"none\" && def.presence !== \"removed\") {\n\t\tconst keyName = `iso-anim-${entryAnim}`;\n\t\tanimateElement(node, keyName, \"enter\");\n\t\tnode.addEventListener(\n\t\t\t\"animationend\",\n\t\t\t() => {\n\t\t\t\tnode.style.animation = \"\";\n\t\t\t},\n\t\t\t{ once: true },\n\t\t);\n\t\treturn { node, current: def, anchor: [0.5, 1], isHidden: false, entryKey: entryAnim, ambient: new Set() };\n\t}\n\n\treturn { node, current: def, anchor: [0.5, 1], isHidden: false, ambient: new Set() };\n}\n\nfunction isTextAsset(assetId: string): boolean {\n\treturn assetId === BUILT_IN_TEXT_ASSET_ID;\n}\n\nfunction isPrimitiveAsset(assetId: string): boolean {\n\treturn BUILT_IN_PRIMITIVE_ASSET_IDS.has(assetId);\n}\n\nfunction createResolvedAssetNode(def: RuntimeElementState, resolveAsset: AssetResolver, cellSize: number): SVGGElement {\n\tconst asset = resolveAsset(def.asset);\n\tif (!asset) {\n\t\tthrow new RenderError(\"ASSET_NOT_FOUND\", `Asset not found: ${def.asset}`, {\n\t\t\tasset: def.asset,\n\t\t\telementId: def.id,\n\t\t});\n\t}\n\treturn createAssetNode(asset, def.asset, cellSize);\n}\n\nfunction updateGeneratedElementContent(node: SVGGElement, def: RuntimeElementState, layout: ResolvedLayoutState): void {\n\tif (!isTextAsset(def.asset) && !isPrimitiveAsset(def.asset)) return;\n\tconst replacement = isTextAsset(def.asset)\n\t\t? createTextAssetNode(def.text, def.asset, layout.cellSize)\n\t\t: createPrimitiveAssetNode(def.asset, def.primitive, layout.cellSize);\n\tclearChildren(node);\n\twhile (replacement.firstChild) {\n\t\tconst child = replacement.firstChild;\n\t\treplacement.removeChild(child);\n\t\tnode.appendChild(child);\n\t}\n}\n\n/**\n * Compare the generated-content payload (`text` or `primitive`) of two\n * element states for structural equality. Used to skip destructive\n * regeneration of text/primitive DOM content on frame updates where the\n * asset, id, and content payload are unchanged from the previous frame.\n */\nfunction hasEqualGeneratedContent(previous: RuntimeElementState | undefined, next: RuntimeElementState): boolean {\n\tif (!previous) return false;\n\tif (previous.asset !== next.asset) return false;\n\tif (!isTextAsset(next.asset) && !isPrimitiveAsset(next.asset)) return true;\n\tif (isTextAsset(next.asset)) return deepEqual(previous.text, next.text);\n\treturn deepEqual(previous.primitive, next.primitive);\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n\tif (a === b) return true;\n\tif (typeof a !== typeof b) return false;\n\tif (a === null || b === null || typeof a !== \"object\" || typeof b !== \"object\") return false;\n\tif (Array.isArray(a) || Array.isArray(b)) {\n\t\tif (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;\n\t\treturn a.every((item, index) => deepEqual(item, b[index]));\n\t}\n\tconst aKeys = Object.keys(a as Record<string, unknown>);\n\tconst bKeys = Object.keys(b as Record<string, unknown>);\n\tif (aKeys.length !== bKeys.length) return false;\n\treturn aKeys.every((key) => deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key]));\n}\n\nfunction createConnectorInstance(def: RuntimeConnectorState, layout: ResolvedLayoutState): ConnectorState {\n\tconst node = document.createElementNS(NS, \"g\") as SVGGElement;\n\tconst shaft = document.createElementNS(NS, \"path\") as SVGPathElement;\n\tconst state: ConnectorState = { node, shaft, isHidden: false, ambient: new Set<string>() };\n\tapplyConnectorState(state, def, layout);\n\n\tconst entryAnim = def.enter;\n\tif (entryAnim && entryAnim !== \"none\" && def.presence !== \"removed\") {\n\t\tanimateElement(node, `iso-anim-${entryAnim}`, \"enter\");\n\t\tnode.addEventListener(\n\t\t\t\"animationend\",\n\t\t\t() => {\n\t\t\t\tnode.style.animation = \"\";\n\t\t\t},\n\t\t\t{ once: true },\n\t\t);\n\t}\n\n\treturn state;\n}\n\nfunction applyConnectorState(state: ConnectorState, def: RuntimeConnectorState, layout: ResolvedLayoutState): void {\n\tconst previous = state.previous;\n\tconst routeChanged = !previous || !routesEqual(previous.route, def.route);\n\tconst styleChanged = !previous || !connectorStylesEqual(previous.style, def.style);\n\tconst shapeChanged =\n\t\t!previous ||\n\t\tshouldRenderOutline(previous) !== shouldRenderOutline(def) ||\n\t\tprevious.style.variant !== def.style.variant ||\n\t\tprevious.style.lane !== def.style.lane ||\n\t\tprevious.start !== def.start ||\n\t\tprevious.end !== def.end ||\n\t\tprevious.route.length !== def.route.length;\n\n\tapplyConnectorGroupAttrs(state.node, def, previous);\n\n\tconst geometryChanged = routeChanged || shapeChanged || styleChanged;\n\tconst d = geometryChanged ? routePath(def.route, layout) : (state.shaft.getAttribute(\"d\") ?? \"\");\n\n\tif (shapeChanged) {\n\t\tif (state.outline) state.node.removeChild(state.outline);\n\t\tstate.outline = undefined;\n\t\tif (shouldRenderOutline(def)) {\n\t\t\tconst outline = document.createElementNS(NS, \"path\") as SVGPathElement;\n\t\t\toutline.classList.add(\"iso-connector-outline\");\n\t\t\tapplyConnectorPathAttrs(outline, def, d, {\n\t\t\t\tstroke: def.style.outline ?? def.style.stroke,\n\t\t\t\tstrokeWidth: def.style.strokeWidth + def.style.outlineWidth * 2,\n\t\t\t\tincludeDash: false,\n\t\t\t});\n\t\t\tstate.node.insertBefore(outline, state.shaft);\n\t\t\tstate.outline = outline;\n\t\t}\n\t} else if (state.outline && geometryChanged) {\n\t\tapplyConnectorPathAttrs(state.outline, def, d, {\n\t\t\tstroke: def.style.outline ?? def.style.stroke,\n\t\t\tstrokeWidth: def.style.strokeWidth + def.style.outlineWidth * 2,\n\t\t\tincludeDash: false,\n\t\t});\n\t}\n\n\tif (!state.shaft.parentNode) state.node.appendChild(state.shaft);\n\tstate.shaft.classList.add(\"iso-connector-shaft\");\n\tif (geometryChanged) {\n\t\tapplyConnectorPathAttrs(state.shaft, def, d, {\n\t\t\tstroke: def.style.stroke,\n\t\t\tstrokeWidth: def.style.strokeWidth,\n\t\t\tincludeDash: true,\n\t\t});\n\t}\n\n\tif (shapeChanged) {\n\t\tif (state.lane) state.node.removeChild(state.lane);\n\t\tstate.lane = undefined;\n\t\tif (def.style.variant === \"road\" && def.style.lane === \"center-dashed\") {\n\t\t\tconst lane = document.createElementNS(NS, \"path\") as SVGPathElement;\n\t\t\tlane.classList.add(\"iso-connector-lane\");\n\t\t\tapplyConnectorPathAttrs(lane, def, d, {\n\t\t\t\tstroke: \"#ffffff\",\n\t\t\t\tstrokeWidth: Math.max(1, def.style.strokeWidth * 0.12),\n\t\t\t\tincludeDash: false,\n\t\t\t});\n\t\t\tlane.setAttribute(\"stroke-dasharray\", \"8 8\");\n\t\t\tstate.node.appendChild(lane);\n\t\t\tstate.lane = lane;\n\t\t}\n\t} else if (state.lane && geometryChanged) {\n\t\tapplyConnectorPathAttrs(state.lane, def, d, {\n\t\t\tstroke: \"#ffffff\",\n\t\t\tstrokeWidth: Math.max(1, def.style.strokeWidth * 0.12),\n\t\t\tincludeDash: false,\n\t\t});\n\t\tstate.lane.setAttribute(\"stroke-dasharray\", \"8 8\");\n\t}\n\n\tif (geometryChanged) {\n\t\tif (state.startEndpoint) state.node.removeChild(state.startEndpoint);\n\t\tif (state.endEndpoint) state.node.removeChild(state.endEndpoint);\n\t\tstate.startEndpoint = appendEndpoint(state.node, def, \"start\", layout);\n\t\tstate.endEndpoint = appendEndpoint(state.node, def, \"end\", layout);\n\t}\n\n\tapplyConnectorAmbientClasses(state, def.ambient ?? []);\n\tstate.previous = def;\n}\n\nfunction clearChildren(node: SVGElement): void {\n\twhile (node.firstChild) node.removeChild(node.firstChild);\n}\n\nfunction routesEqual(a: [number, number][], b: [number, number][]): boolean {\n\tif (a === b) return true;\n\tif (a.length !== b.length) return false;\n\treturn a.every((point, index) => {\n\t\tconst other = b[index];\n\t\treturn other !== undefined && point[0] === other[0] && point[1] === other[1];\n\t});\n}\n\nfunction connectorStylesEqual(a: RuntimeConnectorState[\"style\"], b: RuntimeConnectorState[\"style\"]): boolean {\n\tif (a === b) return true;\n\treturn (\n\t\ta.variant === b.variant &&\n\t\ta.pattern === b.pattern &&\n\t\ta.stroke === b.stroke &&\n\t\ta.strokeWidth === b.strokeWidth &&\n\t\ta.opacity === b.opacity &&\n\t\ta.outline === b.outline &&\n\t\ta.outlineWidth === b.outlineWidth &&\n\t\ta.lane === b.lane &&\n\t\t(a.dash ?? []).join(\",\") === (b.dash ?? []).join(\",\")\n\t);\n}\n\nfunction applyConnectorGroupAttrs(\n\tnode: SVGGElement,\n\tdef: RuntimeConnectorState,\n\tprevious?: RuntimeConnectorState,\n): void {\n\tconst nextClasses = [\n\t\t\"iso-connector\",\n\t\t`iso-connector-${def.id}`,\n\t\t`iso-connector-variant-${def.style.variant}`,\n\t\t`iso-connector-pattern-${def.style.pattern}`,\n\t\t`iso-connector-direction-${def.direction}`,\n\t\t`iso-layer-${def.layer}`,\n\t];\n\tif (!previous) {\n\t\tnode.classList.add(...nextClasses);\n\t} else {\n\t\tconst previousClasses = [\n\t\t\t\"iso-connector\",\n\t\t\t`iso-connector-${previous.id}`,\n\t\t\t`iso-connector-variant-${previous.style.variant}`,\n\t\t\t`iso-connector-pattern-${previous.style.pattern}`,\n\t\t\t`iso-connector-direction-${previous.direction}`,\n\t\t\t`iso-layer-${previous.layer}`,\n\t\t];\n\t\tfor (const name of previousClasses) {\n\t\t\tif (!nextClasses.includes(name)) node.classList.remove(name);\n\t\t}\n\t\tfor (const name of nextClasses) {\n\t\t\tif (!previousClasses.includes(name)) node.classList.add(name);\n\t\t}\n\t}\n\tnode.setAttribute(\"data-id\", def.id);\n\tnode.setAttribute(\"data-layer\", def.layer);\n\tnode.style.overflow = \"visible\";\n\tnode.style.pointerEvents = \"auto\";\n}\n\nfunction shouldRenderOutline(def: RuntimeConnectorState): boolean {\n\treturn Boolean(def.style.outline && def.style.outlineWidth > 0);\n}\n\nfunction applyConnectorPathAttrs(\n\tpath: SVGPathElement,\n\tdef: RuntimeConnectorState,\n\td: string,\n\toptions: { stroke: string; strokeWidth: number; includeDash: boolean },\n): void {\n\tpath.setAttribute(\"d\", d);\n\tpath.setAttribute(\"fill\", \"none\");\n\tpath.setAttribute(\"stroke\", options.stroke);\n\tpath.setAttribute(\"stroke-width\", String(options.strokeWidth));\n\tpath.setAttribute(\"stroke-linecap\", \"round\");\n\tpath.setAttribute(\"stroke-linejoin\", \"round\");\n\tpath.setAttribute(\"opacity\", String(def.style.opacity));\n\tif (options.includeDash && def.style.pattern !== \"solid\") {\n\t\tconst dash = def.style.dash ?? DEFAULT_CONNECTOR_DASH[def.style.pattern];\n\t\tpath.setAttribute(\"stroke-dasharray\", dash.join(\" \"));\n\t}\n}\n\nfunction routePath(route: [number, number][], layout: ResolvedLayoutState): string {\n\treturn route\n\t\t.map((point, index) => {\n\t\t\tconst projected = projectGridPoint(point[0], point[1], layout);\n\t\t\treturn `${index === 0 ? \"M\" : \"L\"} ${projected.x} ${projected.y}`;\n\t\t})\n\t\t.join(\" \");\n}\n\nfunction appendEndpoint(\n\tgroup: SVGGElement,\n\tdef: RuntimeConnectorState,\n\tkind: \"start\" | \"end\",\n\tlayout: ResolvedLayoutState,\n): SVGElement | undefined {\n\tconst endpoint = def[kind];\n\tif (endpoint === \"none\" || def.route.length < 2) return undefined;\n\n\tconst node = createEndpointNode(endpoint, def, kind, layout);\n\tnode.classList.add(`iso-connector-${kind}`);\n\tgroup.appendChild(node);\n\treturn node;\n}\n\nfunction createEndpointNode(\n\tendpoint: ConnectorEndpoint,\n\tdef: RuntimeConnectorState,\n\tkind: \"start\" | \"end\",\n\tlayout: ResolvedLayoutState,\n): SVGElement {\n\tswitch (endpoint) {\n\t\tcase \"arrow\":\n\t\t\treturn createArrowEndpoint(def, kind, layout);\n\t\tcase \"dot\":\n\t\t\treturn createCircleEndpoint(def, kind, layout, true);\n\t\tcase \"circle\":\n\t\t\treturn createCircleEndpoint(def, kind, layout, false);\n\t\tcase \"diamond\":\n\t\t\treturn createDiamondEndpoint(def, kind, layout);\n\t\tcase \"bar\":\n\t\t\treturn createBarEndpoint(def, kind, layout);\n\t\tcase \"none\":\n\t\t\tthrow new RenderError(\"CONNECTOR_ENDPOINT_NONE\", \"Cannot create geometry for endpoint none\");\n\t}\n}\n\nfunction createArrowEndpoint(\n\tdef: RuntimeConnectorState,\n\tkind: \"start\" | \"end\",\n\tlayout: ResolvedLayoutState,\n): SVGPolygonElement {\n\tconst tip = endpointPoint(def, kind);\n\tconst direction = endpointDirection(def, kind);\n\tconst perpendicular: [number, number] = [-direction[1], direction[0]];\n\tconst base: [number, number] = [tip[0] - direction[0] * ARROW_LENGTH_GRID, tip[1] - direction[1] * ARROW_LENGTH_GRID];\n\tconst halfWidth = ARROW_WIDTH_GRID / 2;\n\tconst points = [\n\t\ttip,\n\t\t[base[0] + perpendicular[0] * halfWidth, base[1] + perpendicular[1] * halfWidth] as [number, number],\n\t\t[base[0] - perpendicular[0] * halfWidth, base[1] - perpendicular[1] * halfWidth] as [number, number],\n\t].map((point) => projectGridPoint(point[0], point[1], layout));\n\n\tconst polygon = document.createElementNS(NS, \"polygon\") as SVGPolygonElement;\n\tpolygon.setAttribute(\"points\", points.map(pointToString).join(\" \"));\n\tpolygon.setAttribute(\"fill\", def.style.stroke);\n\tpolygon.setAttribute(\"opacity\", String(def.style.opacity));\n\treturn polygon;\n}\n\nfunction createCircleEndpoint(\n\tdef: RuntimeConnectorState,\n\tkind: \"start\" | \"end\",\n\tlayout: ResolvedLayoutState,\n\tfilled: boolean,\n): SVGCircleElement {\n\tconst point = endpointPoint(def, kind);\n\tconst projected = projectGridPoint(point[0], point[1], layout);\n\tconst circle = document.createElementNS(NS, \"circle\") as SVGCircleElement;\n\tcircle.setAttribute(\"cx\", String(projected.x));\n\tcircle.setAttribute(\"cy\", String(projected.y));\n\tcircle.setAttribute(\"r\", String(ENDPOINT_RADIUS_GRID * layout.cellSize));\n\tcircle.setAttribute(\"stroke\", def.style.stroke);\n\tcircle.setAttribute(\"stroke-width\", String(Math.max(1, def.style.strokeWidth)));\n\tcircle.setAttribute(\"opacity\", String(def.style.opacity));\n\tcircle.setAttribute(\"fill\", filled ? def.style.stroke : \"none\");\n\treturn circle;\n}\n\nfunction createDiamondEndpoint(\n\tdef: RuntimeConnectorState,\n\tkind: \"start\" | \"end\",\n\tlayout: ResolvedLayoutState,\n): SVGPolygonElement {\n\tconst center = endpointPoint(def, kind);\n\tconst radius = ENDPOINT_RADIUS_GRID;\n\tconst points: [number, number][] = [\n\t\t[center[0], center[1] - radius],\n\t\t[center[0] + radius, center[1]],\n\t\t[center[0], center[1] + radius],\n\t\t[center[0] - radius, center[1]],\n\t];\n\tconst polygon = document.createElementNS(NS, \"polygon\") as SVGPolygonElement;\n\tpolygon.setAttribute(\n\t\t\"points\",\n\t\tpoints\n\t\t\t.map((point) => projectGridPoint(point[0], point[1], layout))\n\t\t\t.map(pointToString)\n\t\t\t.join(\" \"),\n\t);\n\tpolygon.setAttribute(\"fill\", def.style.stroke);\n\tpolygon.setAttribute(\"opacity\", String(def.style.opacity));\n\treturn polygon;\n}\n\nfunction createBarEndpoint(\n\tdef: RuntimeConnectorState,\n\tkind: \"start\" | \"end\",\n\tlayout: ResolvedLayoutState,\n): SVGLineElement {\n\tconst center = endpointPoint(def, kind);\n\tconst direction = endpointDirection(def, kind);\n\tconst perpendicular: [number, number] = [-direction[1], direction[0]];\n\tconst half = BAR_WIDTH_GRID / 2;\n\tconst a = projectGridPoint(center[0] + perpendicular[0] * half, center[1] + perpendicular[1] * half, layout);\n\tconst b = projectGridPoint(center[0] - perpendicular[0] * half, center[1] - perpendicular[1] * half, layout);\n\tconst line = document.createElementNS(NS, \"line\") as SVGLineElement;\n\tline.setAttribute(\"x1\", String(a.x));\n\tline.setAttribute(\"y1\", String(a.y));\n\tline.setAttribute(\"x2\", String(b.x));\n\tline.setAttribute(\"y2\", String(b.y));\n\tline.setAttribute(\"stroke\", def.style.stroke);\n\tline.setAttribute(\"stroke-width\", String(Math.max(1, def.style.strokeWidth)));\n\tline.setAttribute(\"stroke-linecap\", \"round\");\n\tline.setAttribute(\"opacity\", String(def.style.opacity));\n\treturn line;\n}\n\nfunction endpointPoint(def: RuntimeConnectorState, kind: \"start\" | \"end\"): [number, number] {\n\treturn kind === \"start\" ? def.route[0] : def.route[def.route.length - 1];\n}\n\nfunction endpointDirection(def: RuntimeConnectorState, kind: \"start\" | \"end\"): [number, number] {\n\tconst point =\n\t\tkind === \"start\"\n\t\t\t? vectorBetween(def.route[0], def.route[1])\n\t\t\t: vectorBetween(def.route[def.route.length - 2], def.route[def.route.length - 1]);\n\tconst effective = def.direction === \"reverse\" ? ([-point[0], -point[1]] as [number, number]) : point;\n\treturn normalizeVector(effective);\n}\n\nfunction vectorBetween(start: [number, number], end: [number, number]): [number, number] {\n\treturn [end[0] - start[0], end[1] - start[1]];\n}\n\nfunction normalizeVector(vector: [number, number]): [number, number] {\n\tconst length = Math.hypot(vector[0], vector[1]);\n\tif (length === 0) return [1, 0];\n\treturn [vector[0] / length, vector[1] / length];\n}\n\nfunction applyElementTransform(node: SVGGElement, def: RuntimeElementState, layout: ResolvedLayoutState): void {\n\tconst screen = projectToScreen(\n\t\tdef.pos[0] + def.size,\n\t\tdef.pos[1] + def.size,\n\t\tlayout.cellSize,\n\t\tlayout.selectedBounds.minX,\n\t\tlayout.selectedBounds.minY,\n\t\tlayout.padding.x,\n\t\tlayout.padding.y,\n\t);\n\tconst visualSize = calculateVisualSize(def.size, layout.cellSize);\n\tconst scale = visualSize / layout.cellSize;\n\tnode.setAttribute(\"transform\", `translate(${screen.screenX} ${screen.screenY}) scale(${scale})`);\n}\n\nfunction applyAmbientClasses(state: ElementState, ambient: RuntimeElementState[\"ambient\"]): void {\n\tconst next = new Set((ambient ?? []).map((item) => item.name));\n\tfor (const name of state.ambient) {\n\t\tif (!next.has(name)) state.node.classList.remove(`iso-ambient-${name}`);\n\t}\n\tfor (const name of next) {\n\t\tif (!state.ambient.has(name)) state.node.classList.add(`iso-ambient-${name}`);\n\t}\n\tstate.ambient = next;\n}\n\nfunction applyConnectorAmbientClasses(state: ConnectorState, ambient: RuntimeConnectorState[\"ambient\"]): void {\n\tconst next = new Set((ambient ?? []).map((item) => item.name));\n\tfor (const name of state.ambient) {\n\t\tif (!next.has(name)) state.shaft.classList.remove(`iso-ambient-${name}`);\n\t}\n\tfor (const name of next) {\n\t\tstate.shaft.classList.add(`iso-ambient-${name}`);\n\t}\n\tstate.ambient = next;\n}\n\n/** Apply a CSS keyframe animation to an element. */\nexport function animateElement(node: SVGElement, keyframeName: string, type: \"enter\" | \"exit\" = \"enter\"): void {\n\tnode.style.opacity = \"1\";\n\tnode.style.animation = \"none\";\n\tnode.getBoundingClientRect();\n\tconst duration = type === \"exit\" ? \"var(--iso-anim-duration-exit, 300ms)\" : \"var(--iso-anim-duration-enter, 400ms)\";\n\tconst easing = type === \"exit\" ? \"var(--iso-anim-easing-exit, ease-in)\" : \"var(--iso-anim-easing-enter, ease-out)\";\n\tnode.style.animation = `${keyframeName} ${duration} ${easing} forwards`;\n}\n"],"names":["NS"],"mappings":"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"}
@@ -212,11 +212,18 @@ function validateHeader(document, errors) {
212
212
  }));
213
213
  }
214
214
  }
215
+ const grid = document.header.grid;
216
+ if (grid?.cellSize !== undefined && !(Number.isFinite(grid.cellSize) && grid.cellSize > 0)) {
217
+ errors.push(issue("INVALID_GRID_CELL_SIZE", "Grid cellSize must be a positive finite number"));
218
+ }
215
219
  const floor = document.header.floor;
216
220
  if (floor) {
217
221
  if (floor.size !== undefined && !isValidPositiveTuple(floor.size)) {
218
222
  errors.push(issue("INVALID_FLOOR_SIZE", "Floor size must be positive"));
219
223
  }
224
+ if (floor.origin !== undefined && !floor.origin.every((part) => Number.isFinite(part))) {
225
+ errors.push(issue("INVALID_FLOOR_ORIGIN", "Floor origin must contain finite numbers"));
226
+ }
220
227
  if (floor.layer !== undefined && !layerNames.has(floor.layer)) {
221
228
  errors.push(issue("LAYER_NOT_FOUND", `Floor layer "${floor.layer}" is not declared`, {
222
229
  layerName: floor.layer,
@@ -491,6 +498,13 @@ function validateGeneratedContentForAsset(element, assetId, errors, warnings, sc
491
498
  }
492
499
  }
493
500
  function validateTextForAsset(element, errors, warnings, sceneId, allowSparse) {
501
+ if (element.primitive !== undefined) {
502
+ errors.push(issue("PRIMITIVE_CONTENT_FOR_TEXT_ASSET", "Built-in text elements may not define primitive content", {
503
+ sceneId,
504
+ elementId: element.id,
505
+ field: "primitive",
506
+ }));
507
+ }
494
508
  if (!element.text) {
495
509
  if (allowSparse)
496
510
  return;
@@ -501,13 +515,6 @@ function validateTextForAsset(element, errors, warnings, sceneId, allowSparse) {
501
515
  }));
502
516
  return;
503
517
  }
504
- if (element.primitive !== undefined) {
505
- errors.push(issue("PRIMITIVE_CONTENT_FOR_TEXT_ASSET", "Built-in text elements may not define primitive content", {
506
- sceneId,
507
- elementId: element.id,
508
- field: "primitive",
509
- }));
510
- }
511
518
  validateTextContent(element.text, errors, warnings, sceneId, element.id, allowSparse);
512
519
  }
513
520
  function validatePrimitiveForAsset(element, assetId, errors, sceneId, allowSparse) {
@@ -826,8 +833,16 @@ function validateSceneObjectDeltas(document, errors, warnings) {
826
833
  }));
827
834
  }
828
835
  }
836
+ const addedElementIds = new Set();
829
837
  for (const add of scene.add?.elements ?? []) {
830
838
  validatePlacement(add, document, errors, warnings, scene.id);
839
+ if (addedElementIds.has(add.id)) {
840
+ errors.push(issue("DUPLICATE_ELEMENT_ID", `Duplicate element "${add.id}"`, {
841
+ sceneId: scene.id,
842
+ elementId: add.id,
843
+ }));
844
+ }
845
+ addedElementIds.add(add.id);
831
846
  if (elements.has(add.id)) {
832
847
  errors.push(issue("ELEMENT_ALREADY_PRESENT", `Element "${add.id}" is already present`, {
833
848
  sceneId: scene.id,
@@ -846,6 +861,7 @@ function validateSceneObjectDeltas(document, errors, warnings) {
846
861
  elementsForConnections.set(add.id, normalizePlacement(document, add));
847
862
  }
848
863
  validateEndpointRemovalRule(scene, connectors, errors);
864
+ const removedElementIds = new Set((scene.remove?.elements ?? []).map((removal) => removal.id));
849
865
  const connectorUpdateIds = new Set();
850
866
  for (const update of scene.update?.connections ?? []) {
851
867
  validateConnectionRemovalLikeId(update.id, errors, scene.id);
@@ -859,11 +875,13 @@ function validateSceneObjectDeltas(document, errors, warnings) {
859
875
  validateConnectionPatch(update, document, errors, scene.id, elementsForConnections, documentElementIds);
860
876
  continue;
861
877
  }
862
- validateConnectionPatch({
878
+ const merged = {
863
879
  ...existing,
864
880
  ...update,
865
881
  style: mergeStyle(existing.style, update.style),
866
- }, document, errors, scene.id, elementsForConnections, documentElementIds);
882
+ };
883
+ validateConnectionPatch(merged, document, errors, scene.id, elementsForConnections, documentElementIds);
884
+ validateEndpointsAgainstRemovals(merged, removedElementIds, errors, scene.id);
867
885
  }
868
886
  for (const removal of scene.remove?.connections ?? []) {
869
887
  validateConnectionRemoval(removal, errors, scene.id);
@@ -880,8 +898,17 @@ function validateSceneObjectDeltas(document, errors, warnings) {
880
898
  }));
881
899
  }
882
900
  }
901
+ const addedConnectorIds = new Set();
883
902
  for (const add of scene.add?.connections ?? []) {
884
903
  validateConnectionPlacement(add, document, errors, scene.id, elementsForConnections, documentElementIds);
904
+ validateEndpointsAgainstRemovals(add, removedElementIds, errors, scene.id);
905
+ if (addedConnectorIds.has(add.id)) {
906
+ errors.push(issue("DUPLICATE_CONNECTOR_ID", `Duplicate connection "${add.id}"`, {
907
+ sceneId: scene.id,
908
+ elementId: add.id,
909
+ }));
910
+ }
911
+ addedConnectorIds.add(add.id);
885
912
  if (connectors.has(add.id)) {
886
913
  errors.push(issue("CONNECTOR_ALREADY_PRESENT", `Connection "${add.id}" is already present`, {
887
914
  sceneId: scene.id,
@@ -984,8 +1011,11 @@ function validateEndpointRemovalRule(scene, connectors, errors) {
984
1011
  if (removedElements.size === 0)
985
1012
  return;
986
1013
  const removedConnections = new Set((scene.remove?.connections ?? []).map((removal) => removal.id));
1014
+ // Connectors updated in this scene are checked against their merged
1015
+ // endpoints in the update loop instead.
1016
+ const updatedConnections = new Set((scene.update?.connections ?? []).map((update) => update.id));
987
1017
  for (const connection of connectors.values()) {
988
- if (removedConnections.has(connection.id))
1018
+ if (removedConnections.has(connection.id) || updatedConnections.has(connection.id))
989
1019
  continue;
990
1020
  const endpointIds = [connection.from?.element, connection.to?.element];
991
1021
  if (endpointIds.some((id) => id !== undefined && removedElements.has(id))) {
@@ -993,6 +1023,14 @@ function validateEndpointRemovalRule(scene, connectors, errors) {
993
1023
  }
994
1024
  }
995
1025
  }
1026
+ function validateEndpointsAgainstRemovals(connection, removedElementIds, errors, sceneId) {
1027
+ if (removedElementIds.size === 0)
1028
+ return;
1029
+ const endpointIds = [connection.from?.element, connection.to?.element];
1030
+ if (endpointIds.some((id) => id !== undefined && removedElementIds.has(id))) {
1031
+ errors.push(issue("CONNECTION_ENDPOINT_REMOVED", `Connection "${connection.id}" references an element removed in the same scene`, { sceneId, elementId: connection.id }));
1032
+ }
1033
+ }
996
1034
  function validateConnectionPlacement(connection, document, errors, sceneId, elements, documentElementIds) {
997
1035
  validateConnectionCommon(connection, document, errors, sceneId, elements, documentElementIds);
998
1036
  }
@@ -1272,6 +1310,12 @@ function validateWarnings(document, warnings) {
1272
1310
  if (document.header.floor?.asset && document.header.floor.visible !== false) {
1273
1311
  usedAssets.add(document.header.floor.asset);
1274
1312
  }
1313
+ const floorBounds = document.header.floor?.size
1314
+ ? {
1315
+ min: document.header.floor.origin ?? [0, 0],
1316
+ size: document.header.floor.size,
1317
+ }
1318
+ : undefined;
1275
1319
  for (const snapshot of snapshots) {
1276
1320
  for (const element of snapshot.elements) {
1277
1321
  usedAssets.add(element.asset);
@@ -1279,9 +1323,10 @@ function validateWarnings(document, warnings) {
1279
1323
  usedAssets.delete(element.asset);
1280
1324
  }
1281
1325
  usedLayers.add(element.layer);
1282
- if (document.header.floor?.size) {
1283
- const [columns, rows] = document.header.floor.size;
1284
- if (element.pos[0] + element.size > columns || element.pos[1] + element.size > rows) {
1326
+ if (floorBounds) {
1327
+ const outside = [0, 1].some((axis) => element.pos[axis] < floorBounds.min[axis] ||
1328
+ element.pos[axis] + element.size > floorBounds.min[axis] + floorBounds.size[axis]);
1329
+ if (outside) {
1285
1330
  warnings.push(issue("ELEMENT_OUTSIDE_FLOOR", `Element "${element.id}" is outside floor bounds`, {
1286
1331
  sceneId: snapshot.id,
1287
1332
  elementId: element.id,
@@ -1291,9 +1336,9 @@ function validateWarnings(document, warnings) {
1291
1336
  }
1292
1337
  for (const connector of snapshot.connectors) {
1293
1338
  usedLayers.add(connector.layer);
1294
- if (document.header.floor?.size) {
1295
- const [columns, rows] = document.header.floor.size;
1296
- if (connector.route.some((point) => point[0] > columns || point[1] > rows)) {
1339
+ if (floorBounds) {
1340
+ const outside = connector.route.some((point) => [0, 1].some((axis) => point[axis] < floorBounds.min[axis] || point[axis] > floorBounds.min[axis] + floorBounds.size[axis]));
1341
+ if (outside) {
1297
1342
  warnings.push(issue("CONNECTOR_OUTSIDE_FLOOR", `Connection "${connector.id}" is outside floor bounds`, {
1298
1343
  sceneId: snapshot.id,
1299
1344
  elementId: connector.id,
@@ -1303,7 +1348,12 @@ function validateWarnings(document, warnings) {
1303
1348
  }
1304
1349
  }
1305
1350
  for (const asset of document.header.assets) {
1306
- if (!usedAssets.has(asset.id)) {
1351
+ // Sprite sheets are referenced through their sprite ids, never through
1352
+ // the sheet namespace id itself.
1353
+ const isUsed = isSpriteSheetAsset(asset)
1354
+ ? Object.keys(asset.sprites ?? {}).some((spriteId) => usedAssets.has(spriteId))
1355
+ : usedAssets.has(asset.id);
1356
+ if (!isUsed) {
1307
1357
  warnings.push(issue("UNREFERENCED_ASSET", `Asset "${asset.id}" is not used`, {
1308
1358
  assetName: asset.id,
1309
1359
  }));
@@ -1504,8 +1554,8 @@ function toRuntimeConnectorState(document, connection, elements, presence, exit)
1504
1554
  start: connection.start ?? "none",
1505
1555
  end: connection.end ?? "arrow",
1506
1556
  direction: connection.direction ?? "route",
1507
- enter: presence === "entering" ? (connection.enter ?? "fade-in") : (connection.enter ?? "fade-in"),
1508
- exit: presence === "exiting" ? (exit ?? connection.exit ?? "fade-out") : (exit ?? connection.exit ?? "fade-out"),
1557
+ enter: presence === "entering" ? (connection.enter ?? "fade-in") : connection.enter,
1558
+ exit: presence === "exiting" ? (exit ?? connection.exit ?? "fade-out") : (exit ?? connection.exit),
1509
1559
  ambient: connection.ambient,
1510
1560
  };
1511
1561
  }
@@ -1756,7 +1806,7 @@ function isGridAxisRoute(route) {
1756
1806
  return true;
1757
1807
  }
1758
1808
 
1759
- const DEFAULT_VERSION = "0.4.0";
1809
+ const DEFAULT_VERSION = "0.5.0";
1760
1810
  const RUNTIME_BUNDLE_FORMAT = "isostate-runtime-bundle";
1761
1811
  const BUILT_IN_TEXT_ASSET_ID = "text";
1762
1812
  const BUILT_IN_PRIMITIVE_ASSET_IDS = new Set(["rectangle", "circle", "polygon", "line"]);
@@ -1901,7 +1951,11 @@ function compileLayers(layers) {
1901
1951
  name: layer.name,
1902
1952
  order: layer.order ?? index,
1903
1953
  }))
1904
- .sort((a, b) => a.order - b.order || a.name.localeCompare(b.name));
1954
+ .sort((a, b) => a.order - b.order || compareCodePointOrder(a.name, b.name));
1955
+ }
1956
+ /** Locale-independent string comparator so tie-break order is byte-deterministic across hosts. */
1957
+ function compareCodePointOrder(a, b) {
1958
+ return a < b ? -1 : a > b ? 1 : 0;
1905
1959
  }
1906
1960
  function resolveAssetUrl(document, assetId) {
1907
1961
  const base = document.header.assetBaseUrl;
@@ -2032,8 +2086,8 @@ function requireString(value, context) {
2032
2086
  return value;
2033
2087
  }
2034
2088
  function requireNumber(value, context) {
2035
- if (typeof value !== "number" || Number.isNaN(value)) {
2036
- fail("DSL_SCHEMA_TYPE_ERROR", `${context} must be a number`);
2089
+ if (typeof value !== "number" || !Number.isFinite(value)) {
2090
+ fail("DSL_SCHEMA_TYPE_ERROR", `${context} must be a finite number`);
2037
2091
  }
2038
2092
  return value;
2039
2093
  }
@@ -2582,23 +2636,24 @@ function parseCamera(raw, context) {
2582
2636
  assertKnownFields(camera, new Set(["target", "padding", "duration", "easing"]), context);
2583
2637
  const target = requireObject(camera.target, `${context}.target`);
2584
2638
  assertKnownFields(target, new Set(["element", "area", "reset"]), `${context}.target`);
2585
- const parsed = { target: {} };
2639
+ // Collect every authored target kind so the validator can reject documents
2640
+ // that declare more than one of element/area/reset.
2641
+ const parsedTarget = {};
2586
2642
  if (target.element !== undefined) {
2587
- parsed.target = { element: requireIdentifier(target.element, `${context}.target.element`) };
2643
+ parsedTarget.element = requireIdentifier(target.element, `${context}.target.element`);
2588
2644
  }
2589
2645
  if (target.area !== undefined) {
2590
2646
  const area = requireObject(target.area, `${context}.target.area`);
2591
2647
  assertKnownFields(area, new Set(["at", "size"]), `${context}.target.area`);
2592
- parsed.target = {
2593
- area: {
2594
- at: parseTuple2(area.at, `${context}.target.area.at`),
2595
- size: parseTuple2(area.size, `${context}.target.area.size`),
2596
- },
2648
+ parsedTarget.area = {
2649
+ at: parseTuple2(area.at, `${context}.target.area.at`),
2650
+ size: parseTuple2(area.size, `${context}.target.area.size`),
2597
2651
  };
2598
2652
  }
2599
2653
  if (target.reset !== undefined) {
2600
- parsed.target = { reset: requireBoolean(target.reset, `${context}.target.reset`) };
2654
+ parsedTarget.reset = requireBoolean(target.reset, `${context}.target.reset`);
2601
2655
  }
2656
+ const parsed = { target: parsedTarget };
2602
2657
  if (camera.padding !== undefined) {
2603
2658
  parsed.padding = requireNumber(camera.padding, `${context}.padding`);
2604
2659
  }
@@ -2685,4 +2740,4 @@ function parseScene(dsl) {
2685
2740
  }
2686
2741
 
2687
2742
  export { fromJson as a, toJson as b, compileScene as c, deriveProgresses as d, fromJs as f, parseScene as p, resolveSceneSnapshots as r, toJs as t, validateScene as v };
2688
- //# sourceMappingURL=scene-parser-B9SPDLYs.js.map
2743
+ //# sourceMappingURL=scene-parser-F69XGE0l.js.map