@sebastianwessel/isostate 0.3.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 (55) 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 +12 -11
  7. package/dist/chunks/{index-B6HlPnov.js → index-CB6XEsbY.js} +257 -43
  8. package/dist/chunks/index-CB6XEsbY.js.map +1 -0
  9. package/dist/chunks/{rendering-engine-BgHel7yX.js → rendering-engine-nkqYx0qc.js} +224 -38
  10. package/dist/chunks/rendering-engine-nkqYx0qc.js.map +1 -0
  11. package/dist/chunks/{scene-parser-xgVJh2FU.js → scene-parser-F69XGE0l.js} +100 -33
  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/adapter.d.ts +1 -0
  18. package/dist/editor-support/adapter.d.ts.map +1 -1
  19. package/dist/editor-support/index.js +6 -3
  20. package/dist/editor-support/index.js.map +1 -1
  21. package/dist/index.d.ts +4 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +470 -4
  24. package/dist/index.js.map +1 -1
  25. package/dist/rendering/animation-css.d.ts.map +1 -1
  26. package/dist/rendering/asset-node.d.ts.map +1 -1
  27. package/dist/rendering/rendering-engine.d.ts +9 -0
  28. package/dist/rendering/rendering-engine.d.ts.map +1 -1
  29. package/dist/rendering/theme.d.ts +4 -0
  30. package/dist/rendering/theme.d.ts.map +1 -1
  31. package/dist/runtime/diagnostics-overlay.d.ts +29 -0
  32. package/dist/runtime/diagnostics-overlay.d.ts.map +1 -0
  33. package/dist/runtime/export.d.ts +27 -0
  34. package/dist/runtime/export.d.ts.map +1 -0
  35. package/dist/runtime/index.d.ts +1 -0
  36. package/dist/runtime/index.d.ts.map +1 -1
  37. package/dist/runtime/index.js +2 -2
  38. package/dist/runtime/interactivity.d.ts +56 -0
  39. package/dist/runtime/interactivity.d.ts.map +1 -0
  40. package/dist/runtime/mount-scene.d.ts +11 -10
  41. package/dist/runtime/mount-scene.d.ts.map +1 -1
  42. package/dist/types/asset-registry.d.ts +1 -0
  43. package/dist/types/asset-registry.d.ts.map +1 -1
  44. package/dist/types/index.d.ts +1 -1
  45. package/dist/types/index.d.ts.map +1 -1
  46. package/dist/types/node.d.ts +18 -0
  47. package/dist/types/node.d.ts.map +1 -1
  48. package/dist/types/runtime-bundle.d.ts +35 -0
  49. package/dist/types/runtime-bundle.d.ts.map +1 -1
  50. package/dist/types/scene.d.ts +2 -0
  51. package/dist/types/scene.d.ts.map +1 -1
  52. package/package.json +1 -1
  53. package/dist/chunks/index-B6HlPnov.js.map +0 -1
  54. package/dist/chunks/rendering-engine-BgHel7yX.js.map +0 -1
  55. package/dist/chunks/scene-parser-xgVJh2FU.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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"}
@@ -48,6 +48,7 @@ const VALID_CONNECTOR_LANES = new Set(["none", "center-dashed"]);
48
48
  const VALID_CAMERA_EASINGS = new Set(["linear", "ease-in-out", "ease-out"]);
49
49
  const VALID_SPRITE_SHEET_EXTENSIONS = new Set([".png", ".webp", ".jpg", ".jpeg", ".svg"]);
50
50
  const VALID_TEXT_ALIGN = new Set(["start", "middle", "end"]);
51
+ const VALID_TEXT_PLACEMENT = new Set(["cell", "caption"]);
51
52
  const VALID_TEXT_WEIGHT = new Set(["normal", "bold"]);
52
53
  const VALID_LINE_CAPS = new Set(["butt", "round", "square"]);
53
54
  const VALID_LINE_JOINS = new Set(["miter", "round", "bevel"]);
@@ -211,11 +212,18 @@ function validateHeader(document, errors) {
211
212
  }));
212
213
  }
213
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
+ }
214
219
  const floor = document.header.floor;
215
220
  if (floor) {
216
221
  if (floor.size !== undefined && !isValidPositiveTuple(floor.size)) {
217
222
  errors.push(issue("INVALID_FLOOR_SIZE", "Floor size must be positive"));
218
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
+ }
219
227
  if (floor.layer !== undefined && !layerNames.has(floor.layer)) {
220
228
  errors.push(issue("LAYER_NOT_FOUND", `Floor layer "${floor.layer}" is not declared`, {
221
229
  layerName: floor.layer,
@@ -490,6 +498,13 @@ function validateGeneratedContentForAsset(element, assetId, errors, warnings, sc
490
498
  }
491
499
  }
492
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
+ }
493
508
  if (!element.text) {
494
509
  if (allowSparse)
495
510
  return;
@@ -500,13 +515,6 @@ function validateTextForAsset(element, errors, warnings, sceneId, allowSparse) {
500
515
  }));
501
516
  return;
502
517
  }
503
- if (element.primitive !== undefined) {
504
- errors.push(issue("PRIMITIVE_CONTENT_FOR_TEXT_ASSET", "Built-in text elements may not define primitive content", {
505
- sceneId,
506
- elementId: element.id,
507
- field: "primitive",
508
- }));
509
- }
510
518
  validateTextContent(element.text, errors, warnings, sceneId, element.id, allowSparse);
511
519
  }
512
520
  function validatePrimitiveForAsset(element, assetId, errors, sceneId, allowSparse) {
@@ -671,6 +679,14 @@ function validateTextContent(text, errors, warnings, sceneId, elementId, allowSp
671
679
  value: text.align,
672
680
  }));
673
681
  }
682
+ if (text.placement !== undefined && !VALID_TEXT_PLACEMENT.has(text.placement)) {
683
+ errors.push(issue("INVALID_TEXT_STYLE", "Text placement must be cell or caption", {
684
+ sceneId,
685
+ elementId,
686
+ field: "text.placement",
687
+ value: text.placement,
688
+ }));
689
+ }
674
690
  if (text.fontSize !== undefined && !isValidPositiveNumber(text.fontSize)) {
675
691
  errors.push(issue("INVALID_TEXT_STYLE", "Text fontSize must be greater than zero", {
676
692
  sceneId,
@@ -817,8 +833,16 @@ function validateSceneObjectDeltas(document, errors, warnings) {
817
833
  }));
818
834
  }
819
835
  }
836
+ const addedElementIds = new Set();
820
837
  for (const add of scene.add?.elements ?? []) {
821
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);
822
846
  if (elements.has(add.id)) {
823
847
  errors.push(issue("ELEMENT_ALREADY_PRESENT", `Element "${add.id}" is already present`, {
824
848
  sceneId: scene.id,
@@ -837,6 +861,7 @@ function validateSceneObjectDeltas(document, errors, warnings) {
837
861
  elementsForConnections.set(add.id, normalizePlacement(document, add));
838
862
  }
839
863
  validateEndpointRemovalRule(scene, connectors, errors);
864
+ const removedElementIds = new Set((scene.remove?.elements ?? []).map((removal) => removal.id));
840
865
  const connectorUpdateIds = new Set();
841
866
  for (const update of scene.update?.connections ?? []) {
842
867
  validateConnectionRemovalLikeId(update.id, errors, scene.id);
@@ -850,11 +875,13 @@ function validateSceneObjectDeltas(document, errors, warnings) {
850
875
  validateConnectionPatch(update, document, errors, scene.id, elementsForConnections, documentElementIds);
851
876
  continue;
852
877
  }
853
- validateConnectionPatch({
878
+ const merged = {
854
879
  ...existing,
855
880
  ...update,
856
881
  style: mergeStyle(existing.style, update.style),
857
- }, document, errors, scene.id, elementsForConnections, documentElementIds);
882
+ };
883
+ validateConnectionPatch(merged, document, errors, scene.id, elementsForConnections, documentElementIds);
884
+ validateEndpointsAgainstRemovals(merged, removedElementIds, errors, scene.id);
858
885
  }
859
886
  for (const removal of scene.remove?.connections ?? []) {
860
887
  validateConnectionRemoval(removal, errors, scene.id);
@@ -871,8 +898,17 @@ function validateSceneObjectDeltas(document, errors, warnings) {
871
898
  }));
872
899
  }
873
900
  }
901
+ const addedConnectorIds = new Set();
874
902
  for (const add of scene.add?.connections ?? []) {
875
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);
876
912
  if (connectors.has(add.id)) {
877
913
  errors.push(issue("CONNECTOR_ALREADY_PRESENT", `Connection "${add.id}" is already present`, {
878
914
  sceneId: scene.id,
@@ -975,8 +1011,11 @@ function validateEndpointRemovalRule(scene, connectors, errors) {
975
1011
  if (removedElements.size === 0)
976
1012
  return;
977
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));
978
1017
  for (const connection of connectors.values()) {
979
- if (removedConnections.has(connection.id))
1018
+ if (removedConnections.has(connection.id) || updatedConnections.has(connection.id))
980
1019
  continue;
981
1020
  const endpointIds = [connection.from?.element, connection.to?.element];
982
1021
  if (endpointIds.some((id) => id !== undefined && removedElements.has(id))) {
@@ -984,6 +1023,14 @@ function validateEndpointRemovalRule(scene, connectors, errors) {
984
1023
  }
985
1024
  }
986
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
+ }
987
1034
  function validateConnectionPlacement(connection, document, errors, sceneId, elements, documentElementIds) {
988
1035
  validateConnectionCommon(connection, document, errors, sceneId, elements, documentElementIds);
989
1036
  }
@@ -1263,6 +1310,12 @@ function validateWarnings(document, warnings) {
1263
1310
  if (document.header.floor?.asset && document.header.floor.visible !== false) {
1264
1311
  usedAssets.add(document.header.floor.asset);
1265
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;
1266
1319
  for (const snapshot of snapshots) {
1267
1320
  for (const element of snapshot.elements) {
1268
1321
  usedAssets.add(element.asset);
@@ -1270,9 +1323,10 @@ function validateWarnings(document, warnings) {
1270
1323
  usedAssets.delete(element.asset);
1271
1324
  }
1272
1325
  usedLayers.add(element.layer);
1273
- if (document.header.floor?.size) {
1274
- const [columns, rows] = document.header.floor.size;
1275
- 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) {
1276
1330
  warnings.push(issue("ELEMENT_OUTSIDE_FLOOR", `Element "${element.id}" is outside floor bounds`, {
1277
1331
  sceneId: snapshot.id,
1278
1332
  elementId: element.id,
@@ -1282,9 +1336,9 @@ function validateWarnings(document, warnings) {
1282
1336
  }
1283
1337
  for (const connector of snapshot.connectors) {
1284
1338
  usedLayers.add(connector.layer);
1285
- if (document.header.floor?.size) {
1286
- const [columns, rows] = document.header.floor.size;
1287
- 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) {
1288
1342
  warnings.push(issue("CONNECTOR_OUTSIDE_FLOOR", `Connection "${connector.id}" is outside floor bounds`, {
1289
1343
  sceneId: snapshot.id,
1290
1344
  elementId: connector.id,
@@ -1294,7 +1348,12 @@ function validateWarnings(document, warnings) {
1294
1348
  }
1295
1349
  }
1296
1350
  for (const asset of document.header.assets) {
1297
- 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) {
1298
1357
  warnings.push(issue("UNREFERENCED_ASSET", `Asset "${asset.id}" is not used`, {
1299
1358
  assetName: asset.id,
1300
1359
  }));
@@ -1495,8 +1554,8 @@ function toRuntimeConnectorState(document, connection, elements, presence, exit)
1495
1554
  start: connection.start ?? "none",
1496
1555
  end: connection.end ?? "arrow",
1497
1556
  direction: connection.direction ?? "route",
1498
- enter: presence === "entering" ? (connection.enter ?? "fade-in") : (connection.enter ?? "fade-in"),
1499
- 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),
1500
1559
  ambient: connection.ambient,
1501
1560
  };
1502
1561
  }
@@ -1747,7 +1806,7 @@ function isGridAxisRoute(route) {
1747
1806
  return true;
1748
1807
  }
1749
1808
 
1750
- const DEFAULT_VERSION = "0.3.0";
1809
+ const DEFAULT_VERSION = "0.5.0";
1751
1810
  const RUNTIME_BUNDLE_FORMAT = "isostate-runtime-bundle";
1752
1811
  const BUILT_IN_TEXT_ASSET_ID = "text";
1753
1812
  const BUILT_IN_PRIMITIVE_ASSET_IDS = new Set(["rectangle", "circle", "polygon", "line"]);
@@ -1892,7 +1951,11 @@ function compileLayers(layers) {
1892
1951
  name: layer.name,
1893
1952
  order: layer.order ?? index,
1894
1953
  }))
1895
- .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;
1896
1959
  }
1897
1960
  function resolveAssetUrl(document, assetId) {
1898
1961
  const base = document.header.assetBaseUrl;
@@ -2023,8 +2086,8 @@ function requireString(value, context) {
2023
2086
  return value;
2024
2087
  }
2025
2088
  function requireNumber(value, context) {
2026
- if (typeof value !== "number" || Number.isNaN(value)) {
2027
- 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`);
2028
2091
  }
2029
2092
  return value;
2030
2093
  }
@@ -2220,7 +2283,7 @@ function parsePointArray(raw, context) {
2220
2283
  }
2221
2284
  function parseTextContent(raw, context, requireValue = true) {
2222
2285
  const text = requireObject(raw, context);
2223
- assertKnownFields(text, new Set(["value", "align", "fontSize", "fontWeight", "lineHeight", "fill"]), context);
2286
+ assertKnownFields(text, new Set(["value", "align", "placement", "fontSize", "fontWeight", "lineHeight", "fill"]), context);
2224
2287
  const parsed = {};
2225
2288
  if (requireValue || text.value !== undefined) {
2226
2289
  parsed.value = requireString(text.value, `${context}.value`);
@@ -2228,6 +2291,9 @@ function parseTextContent(raw, context, requireValue = true) {
2228
2291
  if (text.align !== undefined) {
2229
2292
  parsed.align = requireString(text.align, `${context}.align`);
2230
2293
  }
2294
+ if (text.placement !== undefined) {
2295
+ parsed.placement = requireString(text.placement, `${context}.placement`);
2296
+ }
2231
2297
  if (text.fontSize !== undefined) {
2232
2298
  parsed.fontSize = requireNumber(text.fontSize, `${context}.fontSize`);
2233
2299
  }
@@ -2570,23 +2636,24 @@ function parseCamera(raw, context) {
2570
2636
  assertKnownFields(camera, new Set(["target", "padding", "duration", "easing"]), context);
2571
2637
  const target = requireObject(camera.target, `${context}.target`);
2572
2638
  assertKnownFields(target, new Set(["element", "area", "reset"]), `${context}.target`);
2573
- 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 = {};
2574
2642
  if (target.element !== undefined) {
2575
- parsed.target = { element: requireIdentifier(target.element, `${context}.target.element`) };
2643
+ parsedTarget.element = requireIdentifier(target.element, `${context}.target.element`);
2576
2644
  }
2577
2645
  if (target.area !== undefined) {
2578
2646
  const area = requireObject(target.area, `${context}.target.area`);
2579
2647
  assertKnownFields(area, new Set(["at", "size"]), `${context}.target.area`);
2580
- parsed.target = {
2581
- area: {
2582
- at: parseTuple2(area.at, `${context}.target.area.at`),
2583
- size: parseTuple2(area.size, `${context}.target.area.size`),
2584
- },
2648
+ parsedTarget.area = {
2649
+ at: parseTuple2(area.at, `${context}.target.area.at`),
2650
+ size: parseTuple2(area.size, `${context}.target.area.size`),
2585
2651
  };
2586
2652
  }
2587
2653
  if (target.reset !== undefined) {
2588
- parsed.target = { reset: requireBoolean(target.reset, `${context}.target.reset`) };
2654
+ parsedTarget.reset = requireBoolean(target.reset, `${context}.target.reset`);
2589
2655
  }
2656
+ const parsed = { target: parsedTarget };
2590
2657
  if (camera.padding !== undefined) {
2591
2658
  parsed.padding = requireNumber(camera.padding, `${context}.padding`);
2592
2659
  }
@@ -2673,4 +2740,4 @@ function parseScene(dsl) {
2673
2740
  }
2674
2741
 
2675
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 };
2676
- //# sourceMappingURL=scene-parser-xgVJh2FU.js.map
2743
+ //# sourceMappingURL=scene-parser-F69XGE0l.js.map