@pascal-app/viewer 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/renderers/building/building-renderer.d.ts +5 -0
- package/dist/components/renderers/building/building-renderer.d.ts.map +1 -0
- package/dist/components/renderers/building/building-renderer.js +11 -0
- package/dist/components/renderers/ceiling/ceiling-renderer.d.ts +5 -0
- package/dist/components/renderers/ceiling/ceiling-renderer.d.ts.map +1 -0
- package/dist/components/renderers/ceiling/ceiling-renderer.js +24 -0
- package/dist/components/renderers/guide/guide-renderer.d.ts +5 -0
- package/dist/components/renderers/guide/guide-renderer.d.ts.map +1 -0
- package/dist/components/renderers/guide/guide-renderer.js +36 -0
- package/dist/components/renderers/item/item-renderer.d.ts +5 -0
- package/dist/components/renderers/item/item-renderer.d.ts.map +1 -0
- package/dist/components/renderers/item/item-renderer.js +70 -0
- package/dist/components/renderers/level/level-renderer.d.ts +5 -0
- package/dist/components/renderers/level/level-renderer.d.ts.map +1 -0
- package/dist/components/renderers/level/level-renderer.js +11 -0
- package/dist/components/renderers/node-renderer.d.ts +5 -0
- package/dist/components/renderers/node-renderer.d.ts.map +1 -0
- package/dist/components/renderers/node-renderer.js +19 -0
- package/dist/components/renderers/roof/roof-renderer.d.ts +5 -0
- package/dist/components/renderers/roof/roof-renderer.d.ts.map +1 -0
- package/dist/components/renderers/roof/roof-renderer.js +10 -0
- package/dist/components/renderers/scan/scan-renderer.d.ts +5 -0
- package/dist/components/renderers/scan/scan-renderer.d.ts.map +1 -0
- package/dist/components/renderers/scan/scan-renderer.js +50 -0
- package/dist/components/renderers/scene-renderer.d.ts +2 -0
- package/dist/components/renderers/scene-renderer.d.ts.map +1 -0
- package/dist/components/renderers/scene-renderer.js +8 -0
- package/dist/components/renderers/slab/slab-renderer.d.ts +5 -0
- package/dist/components/renderers/slab/slab-renderer.d.ts.map +1 -0
- package/dist/components/renderers/slab/slab-renderer.js +10 -0
- package/dist/components/renderers/wall/wall-renderer.d.ts +5 -0
- package/dist/components/renderers/wall/wall-renderer.d.ts.map +1 -0
- package/dist/components/renderers/wall/wall-renderer.js +11 -0
- package/dist/components/renderers/zone/zone-renderer.d.ts +5 -0
- package/dist/components/renderers/zone/zone-renderer.d.ts.map +1 -0
- package/dist/components/renderers/zone/zone-renderer.js +154 -0
- package/dist/components/viewer/index.d.ts +13 -0
- package/dist/components/viewer/index.d.ts.map +1 -0
- package/dist/components/viewer/index.js +29 -0
- package/dist/components/viewer/lights.d.ts +2 -0
- package/dist/components/viewer/lights.d.ts.map +1 -0
- package/dist/components/viewer/lights.js +10 -0
- package/dist/components/viewer/post-processing.d.ts +17 -0
- package/dist/components/viewer/post-processing.d.ts.map +1 -0
- package/dist/components/viewer/post-processing.js +139 -0
- package/dist/components/viewer/selection-manager.d.ts +2 -0
- package/dist/components/viewer/selection-manager.d.ts.map +1 -0
- package/dist/components/viewer/selection-manager.js +279 -0
- package/dist/components/viewer/viewer-camera.d.ts +2 -0
- package/dist/components/viewer/viewer-camera.d.ts.map +1 -0
- package/dist/components/viewer/viewer-camera.js +7 -0
- package/dist/hooks/use-asset-url.d.ts +6 -0
- package/dist/hooks/use-asset-url.d.ts.map +1 -0
- package/dist/hooks/use-asset-url.js +21 -0
- package/dist/hooks/use-gltf-ktx2.d.ts +4 -0
- package/dist/hooks/use-gltf-ktx2.d.ts.map +1 -0
- package/dist/hooks/use-gltf-ktx2.js +16 -0
- package/dist/hooks/use-grid-events.d.ts +12 -0
- package/dist/hooks/use-grid-events.d.ts.map +1 -0
- package/dist/hooks/use-grid-events.js +33 -0
- package/dist/hooks/use-node-events.d.ts +49 -0
- package/dist/hooks/use-node-events.d.ts.map +1 -0
- package/dist/hooks/use-node-events.js +38 -0
- package/dist/index.d.ts +4 -81
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -19168
- package/dist/store/use-viewer.d.ts +35 -0
- package/dist/store/use-viewer.d.ts.map +1 -0
- package/dist/store/use-viewer.js +46 -0
- package/dist/systems/guide/guide-system.d.ts +2 -0
- package/dist/systems/guide/guide-system.d.ts.map +1 -0
- package/dist/systems/guide/guide-system.js +16 -0
- package/dist/systems/level/level-system.d.ts +2 -0
- package/dist/systems/level/level-system.d.ts.map +1 -0
- package/dist/systems/level/level-system.js +23 -0
- package/dist/systems/scan/scan-system.d.ts +2 -0
- package/dist/systems/scan/scan-system.d.ts.map +1 -0
- package/dist/systems/scan/scan-system.js +16 -0
- package/dist/systems/wall/wall-cutout.d.ts +2 -0
- package/dist/systems/wall/wall-cutout.d.ts.map +1 -0
- package/dist/systems/wall/wall-cutout.js +103 -0
- package/package.json +36 -32
- package/dist/index.js.map +0 -1
- package/types.d.ts +0 -81
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.bun/suncalc@1.9.0/node_modules/suncalc/suncalc.js","../../../node_modules/.bun/idb-keyval@6.2.2/node_modules/idb-keyval/dist/index.js","../../core/src/events/bus.ts","../../core/src/building-elements.ts","../../core/src/utils.ts","../../core/src/commands/scenegraph-commands.ts","../../core/src/commands/group-commands.ts","../../core/src/constants.ts","../../core/src/processors/level-height-processor.ts","../../core/src/processors/level-elevation-processor.ts","../../core/src/processors/vertical-stacking-processor.ts","../../core/src/processors/occupancy-grid.ts","../../core/src/processors/room-detection-processor.ts","../../../node_modules/.bun/dedent@1.7.1/node_modules/dedent/dist/dedent.mjs","../../core/src/scenegraph/schema/camera.ts","../../core/src/scenegraph/schema/base.ts","../../core/src/scenegraph/schema/nodes/column.ts","../../core/src/scenegraph/schema/nodes/ceiling.ts","../../core/src/scenegraph/schema/nodes/door.ts","../../core/src/scenegraph/schema/nodes/item.ts","../../core/src/scenegraph/schema/nodes/slab.ts","../../core/src/scenegraph/schema/nodes/window.ts","../../core/src/scenegraph/schema/nodes/wall.ts","../../core/src/scenegraph/schema/nodes/group.ts","../../core/src/scenegraph/schema/nodes/image.ts","../../core/src/scenegraph/schema/nodes/roof.ts","../../core/src/scenegraph/schema/nodes/scan.ts","../../core/src/scenegraph/schema/nodes/level.ts","../../core/src/scenegraph/schema/nodes/building.ts","../../core/src/scenegraph/schema/nodes/site.ts","../../core/src/scenegraph/schema/nodes/stair.ts","../../core/src/scenegraph/schema/types.ts","../../core/src/scenegraph/schema/collections.ts","../../core/src/scenegraph/schema/environment.ts","../../core/src/scenegraph/schema/root.ts","../../core/src/scenegraph/schema/views.ts","../../core/src/scenegraph/schema/zones.ts","../../core/src/scenegraph/schema/index.ts","../../core/src/scenegraph/index.ts","../../core/src/spatial-grid.ts","../../core/src/hooks/use-editor.tsx","../../../node_modules/.bun/lucide-react@0.546.0+2f44e903108183df/node_modules/shared/src/utils.ts","../../../node_modules/.bun/lucide-react@0.546.0+2f44e903108183df/node_modules/lucide-react/src/defaultAttributes.ts","../../../node_modules/.bun/lucide-react@0.546.0+2f44e903108183df/node_modules/lucide-react/src/Icon.ts","../../../node_modules/.bun/lucide-react@0.546.0+2f44e903108183df/node_modules/lucide-react/src/createLucideIcon.ts","../../../node_modules/.bun/lucide-react@0.546.0+2f44e903108183df/node_modules/lucide-react/src/icons/box.ts","../../../node_modules/.bun/lucide-react@0.546.0+2f44e903108183df/node_modules/lucide-react/src/icons/building-2.ts","../../../node_modules/.bun/lucide-react@0.546.0+2f44e903108183df/node_modules/lucide-react/src/icons/group.ts","../../../node_modules/.bun/lucide-react@0.546.0+2f44e903108183df/node_modules/lucide-react/src/icons/hexagon.ts","../../../node_modules/.bun/lucide-react@0.546.0+2f44e903108183df/node_modules/lucide-react/src/icons/image.ts","../../../node_modules/.bun/lucide-react@0.546.0+2f44e903108183df/node_modules/lucide-react/src/icons/minus.ts","../../../node_modules/.bun/lucide-react@0.546.0+2f44e903108183df/node_modules/lucide-react/src/icons/package.ts","../../../node_modules/.bun/lucide-react@0.546.0+2f44e903108183df/node_modules/lucide-react/src/icons/pentagon.ts","../../../node_modules/.bun/lucide-react@0.546.0+2f44e903108183df/node_modules/lucide-react/src/icons/square-dashed.ts","../../../node_modules/.bun/lucide-react@0.546.0+2f44e903108183df/node_modules/lucide-react/src/icons/square.ts","../../../node_modules/.bun/lucide-react@0.546.0+2f44e903108183df/node_modules/lucide-react/src/icons/triangle.ts","../../core/src/registry/index.ts","../../core/src/components/nodes/building/building-renderer.tsx","../../core/src/components/nodes/building/building-node.tsx","../../core/src/geometry/wall-overlap.ts","../../core/src/materials/colors.ts","../../core/src/materials/presets.ts","../../core/src/materials/utils.ts","../../core/src/components/nodes/wall/wall-renderer.tsx","../../core/src/components/nodes/wall/wall-node.tsx","../../../node_modules/.bun/@phosphor-icons+react@2.1.10+2b5434204782a989/node_modules/@phosphor-icons/react/dist/defs/Cylinder.es.js","../../../node_modules/.bun/@phosphor-icons+react@2.1.10+2b5434204782a989/node_modules/@phosphor-icons/react/dist/defs/Stairs.es.js","../../../node_modules/.bun/@phosphor-icons+react@2.1.10+2b5434204782a989/node_modules/@phosphor-icons/react/dist/lib/context.es.js","../../../node_modules/.bun/@phosphor-icons+react@2.1.10+2b5434204782a989/node_modules/@phosphor-icons/react/dist/lib/IconBase.es.js","../../../node_modules/.bun/@phosphor-icons+react@2.1.10+2b5434204782a989/node_modules/@phosphor-icons/react/dist/csr/Cylinder.es.js","../../../node_modules/.bun/@phosphor-icons+react@2.1.10+2b5434204782a989/node_modules/@phosphor-icons/react/dist/csr/Stairs.es.js","../../core/src/components/nodes/column/column-renderer.tsx","../../core/src/components/nodes/column/column-node.tsx","../../core/src/components/nodes/slab/slab-renderer.tsx","../../core/src/components/nodes/slab/slab-node.tsx","../../core/src/components/nodes/ceiling/ceiling-renderer.tsx","../../core/src/components/nodes/ceiling/ceiling-node.tsx","../../core/src/components/nodes/roof/roof-renderer.tsx","../../core/src/components/nodes/roof/roof-node.tsx","../../core/src/components/nodes/room/room-node.tsx","../../core/src/components/nodes/custom-room/custom-room-node.tsx","../../core/src/components/nodes/zone/zone-tool.tsx","../../core/src/components/nodes/image/image-renderer.tsx","../../core/src/components/nodes/image/image-node.tsx","../../core/src/asset-storage.ts","../../core/src/components/nodes/scan/scan-renderer.tsx","../../core/src/components/nodes/scan/scan-node.tsx","../../../node_modules/.bun/react-error-boundary@6.0.1+2b5434204782a989/node_modules/react-error-boundary/lib/context/ErrorBoundaryContext.ts","../../../node_modules/.bun/react-error-boundary@6.0.1+2b5434204782a989/node_modules/react-error-boundary/lib/components/ErrorBoundary.tsx","../../core/src/components/nodes/item/item-renderer.tsx","../../core/src/components/nodes/item/item-node.tsx","../../core/src/components/nodes/group/group-node.tsx","../../core/src/components/nodes/stair/stair-renderer.tsx","../../core/src/components/nodes/stair/stair-node.tsx","../../core/src/components/nodes/site/site-renderer.tsx","../../core/src/components/nodes/site/site-node.tsx","../../core/src/components/nodes/zone/zone-renderer.tsx","../../../node_modules/.bun/gsap@3.14.2/node_modules/gsap/gsap-core.js","../../../node_modules/.bun/gsap@3.14.2/node_modules/gsap/CSSPlugin.js","../../../node_modules/.bun/gsap@3.14.2/node_modules/gsap/index.js","../../../node_modules/.bun/@gsap+react@2.1.2+94fa0cb7617ff110/node_modules/@gsap/react/src/index.js","../../core/src/components/nodes/environment/environment-renderer.tsx","../../../node_modules/.bun/three-stdlib@2.36.1+0e441ae2280c4edb/node_modules/src/_polyfill/constants.ts","../../../node_modules/.bun/three-stdlib@2.36.1+0e441ae2280c4edb/node_modules/src/objects/Sky.js","../../core/src/components/renderer/node-renderer.tsx","../../core/src/components/viewer/infinite-floor.tsx","../src/utils.ts","../src/components/selection-controls.tsx","../src/components/level-hover-manager.tsx","../src/components/viewer-custom-controls.tsx","../src/components/Viewer.tsx","../src/SceneViewer.tsx"],"names":["exports","e","l","d","h","C","SunCalc","c","a","m","t","set","z","sampleX","sampleZ","gx","gz","z2","dedent","customAlphabet","context","nodeType","r","nodeId","get","graph","initialScene","_a","p2","forwardRef","createElement","__iconNode","config","dx","dy","WALL_THICKNESS","p","snap","y","useShallow","levelId","THREE","getClosestGridPoint","useRef","useEffect","y2","e2","e3","o","f","e4","o3","useMemo","THREE2","jsx","Fragment","jsxs","EMPTY_LEVELS","SLAB_THICKNESS","THREE3","node","THREE4","useState","useCallback","centerX","centerZ","Edges","Line","TILE_SIZE","currentLevel","GRID_SIZE","ORIGIN_MARKER_SIZE","ARROW_SHAFT_RADIUS","ARROW_SHAFT_LENGTH","ARROW_HEAD_RADIUS","ARROW_HEAD_LENGTH","ROTATION_HANDLE_RADIUS","ROTATION_HANDLE_THICKNESS","ORIGIN_HIT_SCALE","ARROW_HIT_RADIUS_SCALE","ARROW_HIT_LENGTH_SCALE","ROTATION_HIT_SCALE","memo","_b","HitMaterial","HandleMaterial","THREE6","useThree","THREE7","useGLTF","HANDLE_SCALE","SCALE_HANDLE_RADIUS","SCALE_HANDLE_LENGTH","SCALE_HIT_SCALE","THREE8","THREE9","ErrorBoundaryContext","createContext","initialState","ErrorBoundary","Component","props","error","args","info","prevProps","prevState","didCatch","resetKeys","hasArrayChanged","children","fallbackRender","FallbackComponent","fallback","childToRender","b","item","index","THREE10","Suspense","useFrame","THREE11","THREE12","DoubleSide","THREE13","ZonePolygon","shape","linePoints","center","wallGeometry","_isString","_isFunction","_isNumber","_isUndefined","_isObject","_isNotFalse","_windowExists","_isFuncOrString","_install","_missingPlugin","_warn","_addGlobal","_emptyFunc","_harness","_getCache","toArray","_getProperty","_forEachName","_round","_roundPrecise","_parseRelative","_arrayContainsAny","_lazyRender","_isRevertWorthy","_lazySafeRender","_numericIfPossible","_passThrough","_setDefaults","defaults","_setKeyframeDefaults","_merge","_mergeDeep","_copyExcluding","_inheritDefaults","_arraysMatch","_addLinkedListItem","_removeLinkedListItem","_removeFromParent","_uncache","_recacheAncestors","_rewindStartAt","_hasNoPausedAncestors","_elapsedCycleDuration","_animationCycle","_parentToChildTotalTime","_setEnd","_alignPlayhead","_postAddChecks","timeline","_addToTimeline","_scrollTrigger","_attemptInitTween","_parentPlayheadIsBeforeStart","_isFromOrFromStart","_renderZeroDurationTween","_findNextPauseTween","_setDuration","_onUpdateTotalDuration","_parsePosition","_createTweenType","_conditionalReturn","_clamp","getUnit","clamp","_isArrayLike","_flatten","selector","shuffle","distribute","_roundModifier","random","pipe","unitize","normalize","_wrapArray","wrap","value","wrapYoyo","_replaceRandom","mapRange","interpolate","func","i","_getLabelInDirection","_callback","_interrupt","_createPlugin","_hue","splitColor","_colorOrderData","v","_formatColors","_colorStringFilter","_listeners","_tick","_wake","_parseObjectInString","_valueInParentheses","_configEaseFromString","_invertEase","_propagateYoyoEase","_parseEase","_insertEase","easeOut","easeInOut","_easeInOutFromOut","_configElastic","amplitude","period","_configBack","overshoot","GSCache","Animation","_resolve","Timeline","render","getById","getTweensOf","_addComplexStringPropTween","_addPropTween","_processVars","_checkPlugin","_initTween","_updatePropTweens","_addAliasesToVars","_parseKeyframe","_parseFuncOrString","Tween","_setterPlain","_setterFunc","_setterFuncWithParam","_setterAttribute","_getSetter","_renderPlain","_renderBoolean","_renderComplexString","_renderPropTweens","_addPluginModifier","_killPropTweensOf","_setterWithModifier","_sortPropTweensByPriority","PropTween","_dispatch","_onMediaChange","Context","matchMedia","MatchMedia","property","unit","uncache","_setDefaults2","_getPluginPropTween","_addModifiers","_buildModifierPlugin","init","tween","name","_win","_doc","_reverting","_bigNum","_renderCSSProp","_renderPropWithEnd","_renderCSSPropWithBeginning","_renderCSSPropWithBeginningAndEnd","_renderRoundedCSSProp","_renderNonTweeningValue","_renderNonTweeningValueOnlyAtEnd","_setterCSSStyle","_setterCSSProp","_setterTransform","_setterScale","_setterScaleWithRender","_setterTransformWithRender","_saveStyle","_removeIndependentTransforms","_revertStyle","_getStyleSaver","_createElement","_getComputedProperty","_checkPropPrefix","_initCore","_getReparentedCloneBBox","_getAttributeFallbacks","_getBBox","_isSVG","_removeProperty","_addNonTweeningPT","_convertToUnit","_get","_tweenComplexCSSString","_convertKeywordsToPercentages","_renderClearProps","_isNullTransform","_getComputedTransformMatrixAsArray","_getMatrix","_applySVGOrigin","_parseTransform","_firstTwoOnly","_addPxTranslate","_renderNon3DTransforms","_renderCSSTransforms","_renderSVGTransforms","_addRotationalPropTween","_assign","_addRawTransformPTs","_gsap","Vector3","BackSide","Sky","Mesh","BoxGeometry","THREE14","c2","MeshPhysicalMaterial","THREE16","current","size","getBoxEdgePoints","THREE17","Raycaster","Box3","Plane","Vector2","hit","WALL_HEIGHT","THREE18","site"],"mappings":"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","file":"index.js","sourcesContent":["/*\n (c) 2011-2015, Vladimir Agafonkin\n SunCalc is a JavaScript library for calculating sun/moon position and light phases.\n https://github.com/mourner/suncalc\n*/\n\n(function () { 'use strict';\n\n// shortcuts for easier to read formulas\n\nvar PI = Math.PI,\n sin = Math.sin,\n cos = Math.cos,\n tan = Math.tan,\n asin = Math.asin,\n atan = Math.atan2,\n acos = Math.acos,\n rad = PI / 180;\n\n// sun calculations are based on http://aa.quae.nl/en/reken/zonpositie.html formulas\n\n\n// date/time constants and conversions\n\nvar dayMs = 1000 * 60 * 60 * 24,\n J1970 = 2440588,\n J2000 = 2451545;\n\nfunction toJulian(date) { return date.valueOf() / dayMs - 0.5 + J1970; }\nfunction fromJulian(j) { return new Date((j + 0.5 - J1970) * dayMs); }\nfunction toDays(date) { return toJulian(date) - J2000; }\n\n\n// general calculations for position\n\nvar e = rad * 23.4397; // obliquity of the Earth\n\nfunction rightAscension(l, b) { return atan(sin(l) * cos(e) - tan(b) * sin(e), cos(l)); }\nfunction declination(l, b) { return asin(sin(b) * cos(e) + cos(b) * sin(e) * sin(l)); }\n\nfunction azimuth(H, phi, dec) { return atan(sin(H), cos(H) * sin(phi) - tan(dec) * cos(phi)); }\nfunction altitude(H, phi, dec) { return asin(sin(phi) * sin(dec) + cos(phi) * cos(dec) * cos(H)); }\n\nfunction siderealTime(d, lw) { return rad * (280.16 + 360.9856235 * d) - lw; }\n\nfunction astroRefraction(h) {\n if (h < 0) // the following formula works for positive altitudes only.\n h = 0; // if h = -0.08901179 a div/0 would occur.\n\n // formula 16.4 of \"Astronomical Algorithms\" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.\n // 1.02 / tan(h + 10.26 / (h + 5.10)) h in degrees, result in arc minutes -> converted to rad:\n return 0.0002967 / Math.tan(h + 0.00312536 / (h + 0.08901179));\n}\n\n// general sun calculations\n\nfunction solarMeanAnomaly(d) { return rad * (357.5291 + 0.98560028 * d); }\n\nfunction eclipticLongitude(M) {\n\n var C = rad * (1.9148 * sin(M) + 0.02 * sin(2 * M) + 0.0003 * sin(3 * M)), // equation of center\n P = rad * 102.9372; // perihelion of the Earth\n\n return M + C + P + PI;\n}\n\nfunction sunCoords(d) {\n\n var M = solarMeanAnomaly(d),\n L = eclipticLongitude(M);\n\n return {\n dec: declination(L, 0),\n ra: rightAscension(L, 0)\n };\n}\n\n\nvar SunCalc = {};\n\n\n// calculates sun position for a given date and latitude/longitude\n\nSunCalc.getPosition = function (date, lat, lng) {\n\n var lw = rad * -lng,\n phi = rad * lat,\n d = toDays(date),\n\n c = sunCoords(d),\n H = siderealTime(d, lw) - c.ra;\n\n return {\n azimuth: azimuth(H, phi, c.dec),\n altitude: altitude(H, phi, c.dec)\n };\n};\n\n\n// sun times configuration (angle, morning name, evening name)\n\nvar times = SunCalc.times = [\n [-0.833, 'sunrise', 'sunset' ],\n [ -0.3, 'sunriseEnd', 'sunsetStart' ],\n [ -6, 'dawn', 'dusk' ],\n [ -12, 'nauticalDawn', 'nauticalDusk'],\n [ -18, 'nightEnd', 'night' ],\n [ 6, 'goldenHourEnd', 'goldenHour' ]\n];\n\n// adds a custom time to the times config\n\nSunCalc.addTime = function (angle, riseName, setName) {\n times.push([angle, riseName, setName]);\n};\n\n\n// calculations for sun times\n\nvar J0 = 0.0009;\n\nfunction julianCycle(d, lw) { return Math.round(d - J0 - lw / (2 * PI)); }\n\nfunction approxTransit(Ht, lw, n) { return J0 + (Ht + lw) / (2 * PI) + n; }\nfunction solarTransitJ(ds, M, L) { return J2000 + ds + 0.0053 * sin(M) - 0.0069 * sin(2 * L); }\n\nfunction hourAngle(h, phi, d) { return acos((sin(h) - sin(phi) * sin(d)) / (cos(phi) * cos(d))); }\nfunction observerAngle(height) { return -2.076 * Math.sqrt(height) / 60; }\n\n// returns set time for the given sun altitude\nfunction getSetJ(h, lw, phi, dec, n, M, L) {\n\n var w = hourAngle(h, phi, dec),\n a = approxTransit(w, lw, n);\n return solarTransitJ(a, M, L);\n}\n\n\n// calculates sun times for a given date, latitude/longitude, and, optionally,\n// the observer height (in meters) relative to the horizon\n\nSunCalc.getTimes = function (date, lat, lng, height) {\n\n height = height || 0;\n\n var lw = rad * -lng,\n phi = rad * lat,\n\n dh = observerAngle(height),\n\n d = toDays(date),\n n = julianCycle(d, lw),\n ds = approxTransit(0, lw, n),\n\n M = solarMeanAnomaly(ds),\n L = eclipticLongitude(M),\n dec = declination(L, 0),\n\n Jnoon = solarTransitJ(ds, M, L),\n\n i, len, time, h0, Jset, Jrise;\n\n\n var result = {\n solarNoon: fromJulian(Jnoon),\n nadir: fromJulian(Jnoon - 0.5)\n };\n\n for (i = 0, len = times.length; i < len; i += 1) {\n time = times[i];\n h0 = (time[0] + dh) * rad;\n\n Jset = getSetJ(h0, lw, phi, dec, n, M, L);\n Jrise = Jnoon - (Jset - Jnoon);\n\n result[time[1]] = fromJulian(Jrise);\n result[time[2]] = fromJulian(Jset);\n }\n\n return result;\n};\n\n\n// moon calculations, based on http://aa.quae.nl/en/reken/hemelpositie.html formulas\n\nfunction moonCoords(d) { // geocentric ecliptic coordinates of the moon\n\n var L = rad * (218.316 + 13.176396 * d), // ecliptic longitude\n M = rad * (134.963 + 13.064993 * d), // mean anomaly\n F = rad * (93.272 + 13.229350 * d), // mean distance\n\n l = L + rad * 6.289 * sin(M), // longitude\n b = rad * 5.128 * sin(F), // latitude\n dt = 385001 - 20905 * cos(M); // distance to the moon in km\n\n return {\n ra: rightAscension(l, b),\n dec: declination(l, b),\n dist: dt\n };\n}\n\nSunCalc.getMoonPosition = function (date, lat, lng) {\n\n var lw = rad * -lng,\n phi = rad * lat,\n d = toDays(date),\n\n c = moonCoords(d),\n H = siderealTime(d, lw) - c.ra,\n h = altitude(H, phi, c.dec),\n // formula 14.1 of \"Astronomical Algorithms\" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.\n pa = atan(sin(H), tan(phi) * cos(c.dec) - sin(c.dec) * cos(H));\n\n h = h + astroRefraction(h); // altitude correction for refraction\n\n return {\n azimuth: azimuth(H, phi, c.dec),\n altitude: h,\n distance: c.dist,\n parallacticAngle: pa\n };\n};\n\n\n// calculations for illumination parameters of the moon,\n// based on http://idlastro.gsfc.nasa.gov/ftp/pro/astro/mphase.pro formulas and\n// Chapter 48 of \"Astronomical Algorithms\" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.\n\nSunCalc.getMoonIllumination = function (date) {\n\n var d = toDays(date || new Date()),\n s = sunCoords(d),\n m = moonCoords(d),\n\n sdist = 149598000, // distance from Earth to Sun in km\n\n phi = acos(sin(s.dec) * sin(m.dec) + cos(s.dec) * cos(m.dec) * cos(s.ra - m.ra)),\n inc = atan(sdist * sin(phi), m.dist - sdist * cos(phi)),\n angle = atan(cos(s.dec) * sin(s.ra - m.ra), sin(s.dec) * cos(m.dec) -\n cos(s.dec) * sin(m.dec) * cos(s.ra - m.ra));\n\n return {\n fraction: (1 + cos(inc)) / 2,\n phase: 0.5 + 0.5 * inc * (angle < 0 ? -1 : 1) / Math.PI,\n angle: angle\n };\n};\n\n\nfunction hoursLater(date, h) {\n return new Date(date.valueOf() + h * dayMs / 24);\n}\n\n// calculations for moon rise/set times are based on http://www.stargazing.net/kepler/moonrise.html article\n\nSunCalc.getMoonTimes = function (date, lat, lng, inUTC) {\n var t = new Date(date);\n if (inUTC) t.setUTCHours(0, 0, 0, 0);\n else t.setHours(0, 0, 0, 0);\n\n var hc = 0.133 * rad,\n h0 = SunCalc.getMoonPosition(t, lat, lng).altitude - hc,\n h1, h2, rise, set, a, b, xe, ye, d, roots, x1, x2, dx;\n\n // go in 2-hour chunks, each time seeing if a 3-point quadratic curve crosses zero (which means rise or set)\n for (var i = 1; i <= 24; i += 2) {\n h1 = SunCalc.getMoonPosition(hoursLater(t, i), lat, lng).altitude - hc;\n h2 = SunCalc.getMoonPosition(hoursLater(t, i + 1), lat, lng).altitude - hc;\n\n a = (h0 + h2) / 2 - h1;\n b = (h2 - h0) / 2;\n xe = -b / (2 * a);\n ye = (a * xe + b) * xe + h1;\n d = b * b - 4 * a * h1;\n roots = 0;\n\n if (d >= 0) {\n dx = Math.sqrt(d) / (Math.abs(a) * 2);\n x1 = xe - dx;\n x2 = xe + dx;\n if (Math.abs(x1) <= 1) roots++;\n if (Math.abs(x2) <= 1) roots++;\n if (x1 < -1) x1 = x2;\n }\n\n if (roots === 1) {\n if (h0 < 0) rise = i + x1;\n else set = i + x1;\n\n } else if (roots === 2) {\n rise = i + (ye < 0 ? x2 : x1);\n set = i + (ye < 0 ? x1 : x2);\n }\n\n if (rise && set) break;\n\n h0 = h2;\n }\n\n var result = {};\n\n if (rise) result.rise = hoursLater(t, rise);\n if (set) result.set = hoursLater(t, set);\n\n if (!rise && !set) result[ye > 0 ? 'alwaysUp' : 'alwaysDown'] = true;\n\n return result;\n};\n\n\n// export as Node module / AMD module / browser variable\nif (typeof exports === 'object' && typeof module !== 'undefined') module.exports = SunCalc;\nelse if (typeof define === 'function' && define.amd) define(SunCalc);\nelse window.SunCalc = SunCalc;\n\n}());\n","function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n let dbp;\n const getDB = () => {\n if (dbp)\n return dbp;\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n dbp = promisifyRequest(request);\n dbp.then((db) => {\n // It seems like Safari sometimes likes to just close the connection.\n // It's supposed to fire this event when that happens. Let's hope it does!\n db.onclose = () => (dbp = undefined);\n }, () => { });\n return dbp;\n };\n return (txMode, callback) => getDB().then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","// The emitter itself (if you need direct access)\n// emitter: Emitter<EditorEvents>\n\n// // Typed on method\n// on: <K extends keyof EditorEvents>(\n// event: K,\n// handler: (data: EditorEvents[K]) => void\n// ) => () => void\n// // Typed emit method\n// emit: <K extends keyof EditorEvents>(\n// event: K,\n// data: EditorEvents[K]\n// ) => void\n\nimport mitt from 'mitt'\nimport type { AnyNode, CeilingNode, GridPoint, ImageNode, WallNode } from '../scenegraph/schema/index'\n\nexport interface GridEvent {\n position: [number, number]\n}\n\nexport interface NodeEvent {\n node: AnyNode\n gridPosition: GridPoint\n position: [number, number, number] // [x, y, z] world coordinates\n normal?: [number, number, number] // [x, y, z] normal vector\n stopPropagation: () => void\n}\n\nexport interface WallEvent extends NodeEvent {\n node: WallNode\n}\n\nexport interface CeilingEvent extends NodeEvent {\n node: CeilingNode\n}\n\nexport interface ImageEvent {\n node: ImageNode\n}\n\nexport interface ImageUpdateEvent {\n nodeId: string\n updates: Partial<{\n position: [number, number]\n rotation: [number, number, number]\n scale: number\n }>\n pushToUndo: boolean\n}\n\nexport interface ImageManipulationEvent {\n nodeId: string\n}\n\nexport interface ScanUpdateEvent {\n nodeId: string\n updates: Partial<{\n position: [number, number, number]\n rotation: [number, number, number]\n scale: number\n yOffset: number\n }>\n pushToUndo: boolean\n}\n\nexport interface ScanManipulationEvent {\n nodeId: string\n}\n\nexport interface ViewCaptureRequest {\n name: string\n description?: string\n}\n\nexport interface ViewApplyEvent {\n camera: {\n position: [number, number, number]\n target: [number, number, number]\n mode: 'perspective' | 'orthographic'\n fov?: number\n zoom?: number\n }\n}\n\nexport interface NodeCameraCaptureRequest {\n nodeId: string\n}\n\nexport interface InteractionClickEvent {\n type: 'node' | 'zone' | 'level' | 'building' | 'void'\n id: string | null\n data?: any\n}\n\nexport interface ZonePreviewEvent {\n points: Array<[number, number]>\n cursorPoint?: [number, number] | null\n}\n\ntype EditorEvents = {\n 'grid:click': GridEvent\n 'grid:rightclick': GridEvent\n 'grid:move': GridEvent\n 'grid:double-click': GridEvent\n 'grid:enter': GridEvent\n 'grid:leave': GridEvent\n 'grid:pointerdown': GridEvent\n 'grid:pointerup': GridEvent\n 'wall:click': WallEvent\n 'wall:move': WallEvent\n 'wall:enter': WallEvent\n 'wall:leave': WallEvent\n 'wall:pointerdown': WallEvent\n 'wall:pointerup': WallEvent\n 'ceiling:click': CeilingEvent\n 'ceiling:move': CeilingEvent\n 'ceiling:enter': CeilingEvent\n 'ceiling:leave': CeilingEvent\n 'image:select': ImageEvent\n 'image:update': ImageUpdateEvent\n 'image:manipulation-start': ImageManipulationEvent\n 'image:manipulation-end': ImageManipulationEvent\n 'scan:update': ScanUpdateEvent\n 'scan:manipulation-start': ScanManipulationEvent\n 'scan:manipulation-end': ScanManipulationEvent\n 'view:request-capture': ViewCaptureRequest\n 'view:apply': ViewApplyEvent\n 'node:capture-camera': NodeCameraCaptureRequest\n 'interaction:click': InteractionClickEvent\n 'zone:preview': ZonePreviewEvent\n 'tool:cancel': undefined\n}\nexport const emitter = mitt<EditorEvents>()\n","import type { AnyNodeId } from './scenegraph/schema'\n\n/**\n * Check if an element is selected\n */\nexport function isElementSelected(selectedElements: AnyNodeId[], elementId: AnyNodeId): boolean {\n return selectedElements.includes(elementId)\n}\n\n/**\n * Toggle element selection (with multi-select support)\n *\n * Figma-style behavior:\n * - multiSelect=false (regular click): Always select only this element, deselect all others\n * - multiSelect=true (Shift/Cmd+click): Toggle this element in/out of selection\n */\nexport function toggleElementSelection(\n selectedElements: AnyNodeId[],\n elementId: AnyNodeId,\n multiSelect: boolean,\n): AnyNodeId[] {\n const isSelected = isElementSelected(selectedElements, elementId)\n\n if (multiSelect) {\n // Add/remove from selection (toggle)\n if (isSelected) {\n return selectedElements.filter((id) => id !== elementId)\n }\n return [...selectedElements, elementId]\n }\n\n // Single select: Always replace selection with only this element\n return [elementId]\n}\n\n/**\n * Handle simple element click without range selection support\n * Used for nested elements like doors/windows or groups\n *\n * Behavior:\n * - Regular click: Select only this element\n * - Shift/Cmd/Ctrl+click: Toggle this element in/out of selection\n */\nexport function handleSimpleClick(\n selectedElements: AnyNodeId[],\n elementId: AnyNodeId,\n event: { metaKey?: boolean; ctrlKey?: boolean; shiftKey?: boolean },\n): AnyNodeId[] {\n if (event.metaKey || event.ctrlKey || event.shiftKey) {\n // Cmd/Ctrl/Shift+click: toggle selection\n return toggleElementSelection(selectedElements, elementId, true)\n }\n\n // Regular click: single select\n return toggleElementSelection(selectedElements, elementId, false)\n}\n","import { customAlphabet } from 'nanoid'\nimport type { WallNode } from './scenegraph/schema/index'\n\nconst nanoid = customAlphabet('0123456789abcdefghijklmnopqrstuvwxyz', 16)\nexport const createId = (prefix?: string) => `${prefix ? `${prefix}_` : ''}${nanoid()}`\n\nexport function worldPositionToGrid(\n position: [number, number, number],\n {\n gridSize,\n tileSize,\n }: {\n gridSize: number\n tileSize: number\n },\n): [number, number] {\n const localX = position[0] + gridSize / 2\n const localZ = position[2] + gridSize / 2\n\n // Round to nearest intersection\n const x = Math.round(localX / tileSize)\n const y = Math.round(localZ / tileSize)\n return [x, y]\n}\n\n/**\n * Check if a grid item (door, window, etc.) can be placed on a wall\n * @param wall - The wall node to place the item on\n * @param item - The grid item to place (must have position, rotation, and optionally side)\n * @param itemWidth - Width of the item in grid cells (e.g., 2 for doors/windows)\n * @returns true if the item can be placed, false otherwise\n */\nexport function canPlaceGridItemOnWall(\n wall: WallNode,\n item: { position: [number, number]; rotation: number; preview?: boolean; side?: 'front' | 'back' },\n itemWidth = 2,\n): boolean {\n // Items are now positioned in wall's LOCAL coordinate system\n // In wall-local space, the wall runs from (0, 0) to (length, 0) along the X-axis\n const wallLength = wall.size[0]\n const itemLocalPos = item.position\n\n // In wall-local space, the wall direction is always along X-axis\n const wallDirX = 1\n const wallDirZ = 0\n\n // Check if item's X position (distance along wall) is within wall bounds\n // Item needs at least 1 cell on each side of center\n if (itemLocalPos[0] < 1 || itemLocalPos[0] > wallLength - 1) {\n return false\n }\n\n // Calculate item's 3 grid points: center + 2 endpoints (in wall-local space)\n const itemCenter = itemLocalPos\n const itemEndpoint1: [number, number] = [\n itemCenter[0] + Math.round(wallDirX),\n itemCenter[1] + Math.round(wallDirZ),\n ]\n const itemEndpoint2: [number, number] = [\n itemCenter[0] - Math.round(wallDirX),\n itemCenter[1] - Math.round(wallDirZ),\n ]\n\n const itemPoints = [itemEndpoint1, itemEndpoint2, itemCenter]\n\n // Check for overlaps with existing doors/windows/items on the wall\n for (const child of wall.children) {\n // Skip preview nodes\n if (child.editor?.preview) continue\n\n // Get the side of the existing child (doors/windows have no side = affect both sides)\n const childSide = child.type === 'item' ? (child as { side?: 'front' | 'back' }).side : undefined\n\n // Side-aware collision logic:\n // - If the new item has no side (undefined), it affects both sides → always check collision\n // - If the existing child has no side (undefined), it affects both sides → always check collision\n // - If both have a side and they're different → no collision (opposite sides)\n // - If both have the same side → check collision\n const itemSide = item.side\n const bothHaveSides = itemSide !== undefined && childSide !== undefined\n if (bothHaveSides && itemSide !== childSide) {\n // Both items have explicit sides and they're on opposite sides of the wall\n continue\n }\n // Otherwise: at least one item has no side (affects both) OR they're on the same side → check collision\n\n // Children are also in wall-local coordinates\n const childCenter = child.position\n const childEndpoint1: [number, number] = [\n childCenter[0] + Math.round(wallDirX),\n childCenter[1] + Math.round(wallDirZ),\n ]\n const childEndpoint2: [number, number] = [\n childCenter[0] - Math.round(wallDirX),\n childCenter[1] - Math.round(wallDirZ),\n ]\n\n const childPoints = [childEndpoint1, childEndpoint2, childCenter]\n\n // Count overlapping points\n let overlapCount = 0\n for (const itemPoint of itemPoints) {\n for (const childPoint of childPoints) {\n if (\n Math.abs(itemPoint[0] - childPoint[0]) < 0.01 &&\n Math.abs(itemPoint[1] - childPoint[1]) < 0.01\n ) {\n overlapCount++\n }\n }\n }\n\n // If 2 or more points overlap, it's a collision\n if (overlapCount >= 2) {\n return false\n }\n }\n\n return true\n}\n","import { getLevels } from '../scenegraph/editor-utils'\nimport type { SceneGraph, SceneNodeHandle } from '../scenegraph/index'\nimport type {\n AnyNode,\n AnyNodeId,\n LevelNode,\n RootNode,\n SceneNode,\n} from '../scenegraph/schema/index'\nimport { createId } from '../utils'\n\n// Helper type for nodes that can have children\ntype NodeWithChildren = Extract<AnyNode, { children: unknown }>\n\n// Helper to check if a node has children property\nfunction hasChildren(node: AnyNode): node is NodeWithChildren {\n return 'children' in node && Array.isArray((node as NodeWithChildren).children)\n}\n\n// ============================================================================\n// COMMAND INTERFACE\n// ============================================================================\n\nexport interface Command {\n /** Execute the command */\n execute(graph: SceneGraph): void\n\n /** Undo the command */\n undo(graph: SceneGraph): void\n}\n\n// ============================================================================\n// ADD NODE COMMAND\n// ============================================================================\n\nexport class AddNodeCommand implements Command {\n private readonly nodeId: string\n private readonly nodeData: AnyNode\n private readonly parentId: string | null\n\n constructor(nodeData: Omit<AnyNode, 'id'>, parentId: string | null, nodeId?: string) {\n this.parentId = parentId\n this.nodeId = nodeId || createId(nodeData.type)\n\n // Ensure ID is set on the node data\n this.nodeData = {\n ...nodeData,\n id: this.nodeId,\n } as AnyNode\n\n // Ensure children have IDs recursively\n if (hasChildren(this.nodeData)) {\n // Type assertion needed because children types vary by node type\n this.nodeData.children = this.ensureChildrenIds(\n this.nodeData.children,\n ) as typeof this.nodeData.children\n }\n }\n\n private ensureChildrenIds(children: readonly AnyNode[]): AnyNode[] {\n return children.map((child) => {\n // Type assertion needed because AnyNode is a discriminated union\n const childAsRecord = child as Record<string, unknown> & { type: string; id?: string }\n const childId = childAsRecord.id || createId(childAsRecord.type)\n const updatedChild: AnyNode = {\n ...child,\n id: childId,\n } as AnyNode\n\n // Recursively ensure IDs for nested children\n if (hasChildren(child)) {\n ;(updatedChild as NodeWithChildren).children = this.ensureChildrenIds(\n child.children,\n ) as typeof child.children\n }\n\n return updatedChild\n })\n }\n\n getNodeId(): string {\n return this.nodeId\n }\n\n execute(graph: SceneGraph): void {\n if (this.parentId) {\n // Type assertion: runtime parentId is always a valid node ID string\n graph.nodes.create(this.nodeData, this.parentId as AnyNode['id'])\n } else if (this.nodeData.type === 'level') {\n // Special handling for adding levels to root (via Main Building or Site)\n // Current structure: Root -> Site -> Building -> Level\n // But SceneGraph.nodes.create with no parentId assumes adding to root/site logic?\n // Let's look at SceneGraph.nodes.create logic:\n // \"If no parentId, assume adding to site (if node is building) or root (if node is site)\"\n\n // We need to find the main building to add level to.\n const building = graph.nodes.find({ type: 'building' })[0]\n if (building) {\n graph.nodes.create(this.nodeData, building.id)\n } else {\n // Fallback or error?\n // Maybe create works if we pass null? SceneGraph.nodes.create throws if parentId missing for non-site.\n console.error('Cannot add level: No building found')\n }\n } else if (this.nodeData.type === 'site') {\n graph.nodes.create(this.nodeData)\n }\n }\n\n undo(graph: SceneGraph): void {\n // Type assertion: runtime nodeId is always a valid node ID string\n graph.deleteNode(this.nodeId as AnyNode['id'])\n }\n}\n\n// ============================================================================\n// UPDATE NODE COMMAND\n// ============================================================================\n\nexport class UpdateNodeCommand implements Command {\n private readonly nodeId: string\n private readonly updates: Partial<AnyNode>\n // Use Record for dynamic property storage, runtime values are type-safe\n private previousState: Record<string, unknown> | null = null\n\n constructor(nodeId: string, updates: Partial<AnyNode>) {\n this.nodeId = nodeId\n this.updates = updates\n }\n\n execute(graph: SceneGraph): void {\n // Type assertion: runtime nodeId is always a valid node ID string\n const handle = graph.getNodeById(this.nodeId as AnyNode['id'])\n if (!handle) return\n\n // Save previous state for undo\n if (!this.previousState) {\n this.previousState = {}\n const currentNode = handle.data() as Record<string, unknown>\n for (const key of Object.keys(this.updates)) {\n this.previousState[key] = currentNode[key]\n }\n }\n\n // Type assertion: runtime nodeId is always a valid node ID string\n graph.updateNode(this.nodeId as AnyNode['id'], this.updates)\n }\n\n undo(graph: SceneGraph): void {\n if (this.previousState) {\n // Type assertion: runtime nodeId is always a valid node ID string\n // Runtime values in previousState are correct for their keys\n graph.updateNode(this.nodeId as AnyNode['id'], this.previousState as Partial<AnyNode>)\n }\n }\n}\n\n// ============================================================================\n// DELETE NODE COMMAND\n// ============================================================================\n\nexport class DeleteNodeCommand implements Command {\n private readonly nodeId: string\n private deletedNode: AnyNode | null = null\n private parentId: string | null = null\n\n constructor(nodeId: string) {\n this.nodeId = nodeId\n }\n\n execute(graph: SceneGraph): void {\n // Type assertion: runtime nodeId is always a valid node ID string\n const handle = graph.getNodeById(this.nodeId as AnyNode['id'])\n if (!handle) return\n\n this.deletedNode = handle.data()\n const parent = handle.parent()\n this.parentId = parent ? parent.id : null\n\n // Type assertion: runtime nodeId is always a valid node ID string\n graph.deleteNode(this.nodeId as AnyNode['id'])\n }\n\n undo(graph: SceneGraph): void {\n if (!(this.deletedNode && this.parentId)) return\n\n // We need to re-insert at specific index?\n // SceneGraph.create adds to end or beginning?\n // addNodeAtPath unshifts (adds to beginning).\n // We might need specific insertion logic in SceneGraph if we want exact index restoration.\n // For now, just adding back is enough for MVP, but order matters for rendering (sometimes).\n\n // Type assertion: runtime parentId is always a valid node ID string\n graph.nodes.create(this.deletedNode, this.parentId as AnyNode['id'])\n\n // TODO: Handle index restoration if SceneGraph supports it\n }\n}\n\n// ============================================================================\n// BATCH DELETE COMMAND\n// ============================================================================\n\nexport class BatchDeleteCommand implements Command {\n private readonly deleteCommands: DeleteNodeCommand[] = []\n\n constructor(nodeIds: string[]) {\n this.deleteCommands = nodeIds.map((id) => new DeleteNodeCommand(id))\n }\n\n execute(graph: SceneGraph): void {\n for (const command of this.deleteCommands) {\n command.execute(graph)\n }\n }\n\n undo(graph: SceneGraph): void {\n for (let i = this.deleteCommands.length - 1; i >= 0; i--) {\n this.deleteCommands[i].undo(graph)\n }\n }\n}\n\n// ============================================================================\n// LEVEL COMMANDS\n// ============================================================================\n\nexport class AddLevelCommand implements Command {\n private readonly level: LevelNode\n\n constructor(level: Omit<LevelNode, 'children'>) {\n this.level = {\n ...level,\n children: [],\n } as LevelNode\n }\n\n execute(graph: SceneGraph): void {\n const building = graph.nodes.find({ type: 'building' })[0]\n if (!building) return\n\n // Just add the node\n graph.nodes.create(this.level, building.id)\n }\n\n undo(graph: SceneGraph): void {\n // Type assertion: level.id is always a valid level ID string\n graph.deleteNode(this.level.id as AnyNode['id'])\n }\n}\n\nexport class DeleteLevelCommand implements Command {\n private readonly levelId: string\n private deletedLevel: LevelNode | null = null\n private parentId: string | null = null\n\n constructor(levelId: string) {\n this.levelId = levelId\n }\n\n execute(graph: SceneGraph): void {\n // Type assertion: runtime levelId is always a valid node ID string\n const handle = graph.getNodeById(this.levelId as AnyNode['id'])\n if (!handle) return\n\n this.deletedLevel = handle.data() as LevelNode\n const parent = handle.parent()\n this.parentId = parent ? parent.id : null\n\n // Type assertion: runtime levelId is always a valid node ID string\n graph.deleteNode(this.levelId as AnyNode['id'])\n }\n\n undo(graph: SceneGraph): void {\n if (this.deletedLevel && this.parentId) {\n // Type assertion: runtime parentId is always a valid node ID string\n graph.nodes.create(this.deletedLevel, this.parentId as AnyNode['id'])\n }\n }\n}\n\nexport class ReorderLevelsCommand implements Command {\n private readonly newOrder: LevelNode[]\n private previousOrder: LevelNode[] = []\n\n constructor(newOrder: LevelNode[]) {\n this.newOrder = newOrder\n }\n\n execute(graph: SceneGraph): void {\n // Reordering involves updating the children array of the building\n const building = graph.nodes.find({ type: 'building' })[0]\n if (!building) return\n\n const currentLevels = building.children()\n this.previousOrder = currentLevels.map((h) => h.data() as LevelNode)\n\n // Update building's children array with new order\n // TypeScript doesn't know building has children, so we use Partial with children property\n graph.updateNode(building.id, { children: this.newOrder } as Partial<NodeWithChildren>)\n }\n\n undo(graph: SceneGraph): void {\n const building = graph.nodes.find({ type: 'building' })[0]\n if (!building) return\n\n // Restore previous order\n graph.updateNode(building.id, { children: this.previousOrder } as Partial<NodeWithChildren>)\n }\n}\n\n// ============================================================================\n// MOVE NODE COMMAND\n// ============================================================================\n\nexport class MoveNodeCommand implements Command {\n private readonly nodeId: string\n private readonly newParentId: string\n private originalNode: AnyNode | null = null\n private originalParentId: string | null = null\n\n constructor(nodeId: string, newParentId: string, index = -1) {\n this.nodeId = nodeId\n this.newParentId = newParentId\n }\n\n private getNodePosition(node: AnyNode): { x: number; y: number } {\n if ('position' in node && Array.isArray(node.position)) {\n return { x: node.position[0], y: node.position[1] }\n }\n return { x: 0, y: 0 }\n }\n\n private getRotation(node: AnyNode): number {\n return 'rotation' in node && typeof node.rotation === 'number' ? node.rotation : 0\n }\n\n execute(graph: SceneGraph): void {\n const handle = graph.getNodeById(this.nodeId as AnyNodeId)\n if (!handle) return\n\n const node = handle.data()\n const parent = handle.parent()\n if (!parent) return\n\n // Store state for undo if not already stored\n if (!this.originalNode) {\n this.originalNode = JSON.parse(JSON.stringify(node))\n this.originalParentId = parent.id\n }\n\n // 1. Calculate World Position\n let worldX = 0\n let worldY = 0\n let worldRot = 0\n\n const nodePos = this.getNodePosition(node)\n const nodeRot = this.getRotation(node)\n\n if (parent.type === 'group') {\n const groupNode = parent.data()\n const groupPos = this.getNodePosition(groupNode)\n const groupRot = this.getRotation(groupNode)\n\n const cos = Math.cos(groupRot)\n const sin = Math.sin(groupRot)\n\n worldX = nodePos.x * cos - nodePos.y * sin + groupPos.x\n worldY = nodePos.x * sin + nodePos.y * cos + groupPos.y\n worldRot = nodeRot + groupRot\n } else {\n worldX = nodePos.x\n worldY = nodePos.y\n worldRot = nodeRot\n }\n\n // 2. Calculate New Local Position\n const newParentHandle = graph.getNodeById(this.newParentId as AnyNodeId)\n if (!newParentHandle) return\n\n const newParent = newParentHandle.data()\n let newLocalX = worldX\n let newLocalY = worldY\n let newLocalRot = worldRot\n\n if (newParent.type === 'group') {\n const groupPos = this.getNodePosition(newParent)\n const groupRot = this.getRotation(newParent)\n\n const dx = worldX - groupPos.x\n const dy = worldY - groupPos.y\n const cos = Math.cos(-groupRot)\n const sin = Math.sin(-groupRot)\n\n newLocalX = dx * cos - dy * sin\n newLocalY = dx * sin + dy * cos\n newLocalRot = worldRot - groupRot\n }\n\n // 3. Move Node\n graph.deleteNode(this.nodeId as AnyNodeId)\n\n const updatedNode = { ...node }\n if ('position' in updatedNode && Array.isArray(updatedNode.position)) {\n ;(updatedNode as any).position = [newLocalX, newLocalY, updatedNode.position[2] || 0].slice(\n 0,\n updatedNode.position.length,\n )\n }\n if ('rotation' in updatedNode && typeof updatedNode.rotation === 'number') {\n updatedNode.rotation = newLocalRot\n }\n\n graph.nodes.create(updatedNode, this.newParentId as AnyNodeId)\n }\n\n undo(graph: SceneGraph): void {\n if (!(this.originalNode && this.originalParentId)) return\n\n graph.deleteNode(this.nodeId as AnyNodeId)\n graph.nodes.create(this.originalNode, this.originalParentId as AnyNodeId)\n }\n}\n\n// ============================================================================\n// TRANSACTION COMMAND (groups multiple operations into one undo step)\n// ============================================================================\n\nexport class TransactionCommand implements Command {\n /** Snapshot of node states before the transaction */\n private readonly snapshotState: Map<string, { node: AnyNode; parentId: string }> = new Map()\n /** IDs of nodes created during the transaction (need to delete on undo) */\n private readonly createdNodeIds: Set<string> = new Set()\n /** Reference to the graph for capturing snapshots */\n private readonly graph: SceneGraph\n /** Final state after transaction for redo */\n private finalState: Map<string, { node: AnyNode; parentId: string }> | null = null\n /** IDs of nodes that were deleted during the transaction (for redo) */\n private deletedNodeIds: Set<string> | null = null\n\n constructor(graph: SceneGraph) {\n this.graph = graph\n }\n\n /**\n * Capture initial state of a node before modification.\n * Call this before any modifications to ensure proper undo.\n * Cleans preview flags from the captured state so undo restores a clean state.\n */\n captureSnapshot(nodeId: string): void {\n if (this.snapshotState.has(nodeId)) return\n\n const handle = this.graph.getNodeById(nodeId as AnyNodeId)\n if (handle) {\n const parent = handle.parent()\n const nodeData = JSON.parse(JSON.stringify(handle.data()))\n\n // Clean preview flags from the snapshot - we want to restore to a clean state\n if (nodeData.editor) {\n delete nodeData.editor.deletePreview\n delete nodeData.editor.deleteRange\n delete nodeData.editor.paintPreview\n delete nodeData.editor.paintRange\n delete nodeData.editor.paintFace\n }\n\n this.snapshotState.set(nodeId, {\n node: nodeData,\n parentId: parent?.id ?? '',\n })\n }\n }\n\n /**\n * Track a node that was created during the transaction.\n * These will be deleted on undo.\n */\n trackCreatedNode(nodeId: string): void {\n this.createdNodeIds.add(nodeId)\n }\n\n /**\n * Capture final state before committing transaction (for redo support).\n * Call this right before committing to capture the end state.\n */\n captureFinalState(): void {\n this.finalState = new Map()\n this.deletedNodeIds = new Set()\n\n // For each node we have a snapshot of, capture its final state (or mark as deleted)\n for (const [nodeId, { parentId }] of this.snapshotState) {\n const handle = this.graph.getNodeById(nodeId as AnyNodeId)\n if (handle) {\n // Node still exists, capture its current state\n const nodeData = JSON.parse(JSON.stringify(handle.data()))\n // Clean preview flags\n if (nodeData.editor) {\n delete nodeData.editor.deletePreview\n delete nodeData.editor.deleteRange\n delete nodeData.editor.paintPreview\n delete nodeData.editor.paintRange\n delete nodeData.editor.paintFace\n }\n this.finalState.set(nodeId, { node: nodeData, parentId })\n } else {\n // Node was deleted\n this.deletedNodeIds.add(nodeId)\n }\n }\n\n // Also capture created nodes' final state\n for (const nodeId of this.createdNodeIds) {\n const handle = this.graph.getNodeById(nodeId as AnyNodeId)\n if (handle) {\n const parent = handle.parent()\n const capturedParentId = parent?.id ?? ''\n const nodeData = JSON.parse(JSON.stringify(handle.data()))\n // Clean preview flags\n if (nodeData.editor) {\n delete nodeData.editor.deletePreview\n delete nodeData.editor.deleteRange\n delete nodeData.editor.paintPreview\n delete nodeData.editor.paintRange\n delete nodeData.editor.paintFace\n }\n this.finalState.set(nodeId, { node: nodeData, parentId: capturedParentId })\n }\n }\n }\n\n execute(graph: SceneGraph): void {\n // Called on redo - replay the final state\n if (!this.finalState) return\n\n // First, delete nodes that should be deleted\n if (this.deletedNodeIds) {\n for (const nodeId of this.deletedNodeIds) {\n const handle = graph.getNodeById(nodeId as AnyNodeId)\n if (handle) {\n graph.deleteNode(nodeId as AnyNodeId)\n }\n }\n }\n\n // Then, restore/create nodes to their final state\n for (const [nodeId, { node, parentId }] of this.finalState) {\n // Skip nodes that were deleted\n if (this.deletedNodeIds?.has(nodeId)) continue\n\n const handle = graph.getNodeById(nodeId as AnyNodeId)\n if (handle) {\n // Node exists, update to final state\n graph.updateNode(nodeId as AnyNodeId, node)\n } else if (parentId) {\n // Node doesn't exist, create it\n graph.nodes.create(node, parentId as AnyNodeId)\n }\n }\n }\n\n undo(graph: SceneGraph): void {\n // First, delete any nodes that were created during the transaction\n for (const nodeId of this.createdNodeIds) {\n const handle = graph.getNodeById(nodeId as AnyNodeId)\n if (handle) {\n graph.deleteNode(nodeId as AnyNodeId)\n }\n }\n\n // Then, restore nodes to their snapshot state\n for (const [nodeId, { node, parentId }] of this.snapshotState) {\n const handle = graph.getNodeById(nodeId as AnyNodeId)\n if (handle) {\n // Node still exists, restore its state\n graph.updateNode(nodeId as AnyNodeId, node)\n } else if (parentId) {\n // Node was deleted, recreate it\n graph.nodes.create(node, parentId as AnyNodeId)\n }\n }\n }\n\n isEmpty(): boolean {\n return this.snapshotState.size === 0 && this.createdNodeIds.size === 0\n }\n}\n\n// ============================================================================\n// COMMAND MANAGER\n// ============================================================================\n\nexport class CommandManager {\n private undoStack: Command[] = []\n private redoStack: Command[] = []\n private readonly maxStackSize = 50\n private activeTransaction: TransactionCommand | null = null\n\n execute(command: Command, graph: SceneGraph): void {\n command.execute(graph)\n\n // Always add to undo stack\n this.undoStack.push(command)\n if (this.undoStack.length > this.maxStackSize) {\n this.undoStack.shift()\n }\n this.redoStack = [] // Clear redo stack on new action\n }\n\n // ============================================================================\n // TRANSACTION METHODS\n // ============================================================================\n\n /**\n * Start a new transaction. All changes during the transaction\n * will be grouped into a single undo step.\n */\n startTransaction(graph: SceneGraph): void {\n if (this.activeTransaction) {\n console.warn('Transaction already in progress, committing previous transaction')\n this.commitTransaction()\n }\n this.activeTransaction = new TransactionCommand(graph)\n }\n\n /**\n * Check if a transaction is currently active\n */\n isTransactionActive(): boolean {\n return this.activeTransaction !== null\n }\n\n /**\n * Get the active transaction (for capturing snapshots)\n */\n getActiveTransaction(): TransactionCommand | null {\n return this.activeTransaction\n }\n\n /**\n * Commit the current transaction to the undo stack\n */\n commitTransaction(): void {\n if (!this.activeTransaction) {\n console.warn('No active transaction to commit')\n return\n }\n\n if (!this.activeTransaction.isEmpty()) {\n // Capture final state for redo support\n this.activeTransaction.captureFinalState()\n this.undoStack.push(this.activeTransaction)\n if (this.undoStack.length > this.maxStackSize) {\n this.undoStack.shift()\n }\n this.redoStack = [] // Clear redo stack on new action\n }\n\n this.activeTransaction = null\n }\n\n /**\n * Cancel the current transaction and restore to pre-transaction state\n */\n cancelTransaction(graph: SceneGraph): void {\n if (!this.activeTransaction) {\n return\n }\n\n // Undo all changes made during the transaction\n this.activeTransaction.undo(graph)\n this.activeTransaction = null\n }\n\n undo(graph: SceneGraph): boolean {\n // If there's an active transaction, cancel it first\n if (this.activeTransaction) {\n this.cancelTransaction(graph)\n return true\n }\n\n const command = this.undoStack.pop()\n if (!command) return false\n\n command.undo(graph)\n this.redoStack.push(command)\n return true\n }\n\n redo(graph: SceneGraph): boolean {\n const command = this.redoStack.pop()\n if (!command) return false\n\n command.execute(graph)\n this.undoStack.push(command)\n return true\n }\n\n canUndo(): boolean {\n return this.undoStack.length > 0 || this.activeTransaction !== null\n }\n\n canRedo(): boolean {\n return this.redoStack.length > 0\n }\n\n clear(): void {\n this.undoStack = []\n this.redoStack = []\n this.activeTransaction = null\n }\n\n getUndoStack(): Command[] {\n return [...this.undoStack]\n }\n\n getRedoStack(): Command[] {\n return [...this.redoStack]\n }\n}\n","import type { SceneGraph } from '../scenegraph'\nimport type { AnyNode, AnyNodeId, GroupNode } from '../scenegraph/schema'\nimport { createId } from '../utils'\nimport type { Command } from './scenegraph-commands'\n\n// Helper to get position from any node type\nfunction getNodePosition(node: AnyNode): { x: number; y: number } {\n if ('position' in node && Array.isArray(node.position)) {\n // Most nodes (Item, Group, etc.)\n return { x: node.position[0], y: node.position[1] }\n }\n // Fallback for nodes that might not have position in the future or handle differently\n // WallNode currently has position (legacy) and start/end.\n // We use position as the \"origin\" for the group transform.\n return { x: 0, y: 0 }\n}\n\nexport class GroupNodesCommand implements Command {\n private readonly groupNodeId: string\n private readonly selectedNodeIds: string[]\n // Store original state for undo\n private readonly originalNodes: { node: AnyNode; parentId: string }[] = []\n\n constructor(selectedNodeIds: string[]) {\n this.selectedNodeIds = selectedNodeIds\n this.groupNodeId = createId('group')\n }\n\n getGroupNodeId(): string {\n return this.groupNodeId\n }\n\n execute(graph: SceneGraph): void {\n if (this.selectedNodeIds.length === 0) return\n\n const nodesToGroup: AnyNode[] = []\n let commonParentId: string | null = null\n\n // 1. Validate and Collect Nodes\n for (const id of this.selectedNodeIds) {\n const handle = graph.getNodeById(id as AnyNodeId)\n if (!handle) continue\n\n const node = handle.data()\n const parent = handle.parent()\n\n if (!parent) continue // Should not happen for groupable nodes (root/site/building/level not groupable)\n\n if (commonParentId === null) {\n commonParentId = parent.id\n } else if (commonParentId !== parent.id) {\n console.warn('Cannot group nodes from different parents')\n return\n }\n\n // Check for disallowed types\n if (['level', 'building', 'site'].includes(node.type)) {\n console.warn(`Cannot group node of type ${node.type}`)\n return\n }\n\n nodesToGroup.push(node)\n this.originalNodes.push({ node: JSON.parse(JSON.stringify(node)), parentId: parent.id })\n }\n\n if (!commonParentId || nodesToGroup.length === 0) return\n\n // 2. Calculate Group Center\n let minX = Number.POSITIVE_INFINITY,\n minY = Number.POSITIVE_INFINITY,\n maxX = Number.NEGATIVE_INFINITY,\n maxY = Number.NEGATIVE_INFINITY\n\n for (const node of nodesToGroup) {\n const pos = getNodePosition(node)\n minX = Math.min(minX, pos.x)\n minY = Math.min(minY, pos.y)\n maxX = Math.max(maxX, pos.x)\n maxY = Math.max(maxY, pos.y)\n }\n\n const centerX = (minX + maxX) / 2\n const centerY = (minY + maxY) / 2\n\n // 3. Create Group Node\n const groupNode: GroupNode = {\n id: this.groupNodeId as GroupNode['id'],\n type: 'group',\n children: [], // Will add children manually\n position: [centerX, centerY],\n rotation: 0,\n object: 'node',\n parentId: commonParentId,\n visible: true,\n opacity: 100,\n metadata: {},\n }\n\n // Add group to common parent\n graph.nodes.create(groupNode, commonParentId as AnyNodeId)\n\n // 4. Move Nodes to Group and adjust positions\n for (const node of nodesToGroup) {\n // Remove from old location\n graph.deleteNode(node.id)\n\n // Calculate new relative position\n const oldPos = getNodePosition(node)\n const newX = oldPos.x - centerX\n const newY = oldPos.y - centerY\n\n const updatedNode = { ...node }\n\n if ('position' in updatedNode && Array.isArray(updatedNode.position)) {\n ;(updatedNode as any).position = [newX, newY, updatedNode.position[2] || 0].slice(\n 0,\n updatedNode.position.length,\n )\n }\n\n // Update parentId to point to the group\n updatedNode.parentId = this.groupNodeId\n\n // Add to group\n graph.nodes.create(updatedNode, this.groupNodeId as AnyNodeId)\n }\n }\n\n undo(graph: SceneGraph): void {\n // 1. Delete the group node (and its children currently in the graph)\n // Note: deleteNode deletes the subtree.\n graph.deleteNode(this.groupNodeId as AnyNodeId)\n\n // 2. Restore original nodes to their original parents\n for (const { node, parentId } of this.originalNodes) {\n // Create restores the node with its original ID and data (including absolute position)\n graph.nodes.create(node, parentId as AnyNodeId)\n }\n }\n}\n\nexport class UngroupNodesCommand implements Command {\n private readonly groupNodeId: string\n private originalGroupNode: GroupNode | null = null\n private originalChildren: AnyNode[] = []\n private parentId: string | null = null\n\n constructor(groupNodeId: string) {\n this.groupNodeId = groupNodeId\n }\n\n execute(graph: SceneGraph): void {\n const groupHandle = graph.getNodeById(this.groupNodeId as AnyNodeId)\n if (!groupHandle) return\n\n const groupNode = groupHandle.data() as GroupNode\n if (groupNode.type !== 'group') return\n\n const parent = groupHandle.parent()\n if (!parent) return\n this.parentId = parent.id\n\n this.originalGroupNode = JSON.parse(JSON.stringify(groupNode))\n\n // Get all children\n const childrenHandles = groupHandle.children()\n this.originalChildren = childrenHandles.map((h) => JSON.parse(JSON.stringify(h.data())))\n\n const groupX = groupNode.position[0]\n const groupY = groupNode.position[1]\n const groupRotation = groupNode.rotation || 0\n\n // 1. Move children to parent\n for (const childHandle of childrenHandles) {\n const childNode = childHandle.data()\n graph.deleteNode(childNode.id)\n\n const updatedChild = { ...childNode }\n const childPos = getNodePosition(childNode)\n\n // Transform local to parent\n // x' = x*cos(theta) - y*sin(theta) + tx\n // y' = x*sin(theta) + y*cos(theta) + ty\n const cos = Math.cos(groupRotation)\n const sin = Math.sin(groupRotation)\n\n const newX = childPos.x * cos - childPos.y * sin + groupX\n const newY = childPos.x * sin + childPos.y * cos + groupY\n\n if ('position' in updatedChild && Array.isArray(updatedChild.position)) {\n ;(updatedChild as any).position = [newX, newY, updatedChild.position[2] || 0].slice(\n 0,\n updatedChild.position.length,\n )\n }\n\n if ('rotation' in updatedChild && typeof updatedChild.rotation === 'number') {\n updatedChild.rotation = (updatedChild.rotation || 0) + groupRotation\n }\n\n // Update parentId to point to the new parent\n updatedChild.parentId = this.parentId\n\n graph.nodes.create(updatedChild, this.parentId as AnyNodeId)\n }\n\n // 2. Delete Group Node\n graph.deleteNode(this.groupNodeId as AnyNodeId)\n }\n\n undo(graph: SceneGraph): void {\n if (!(this.originalGroupNode && this.parentId)) return\n\n // 1. Restore Group Node\n // We create it without children first\n const groupToRestore = { ...this.originalGroupNode, children: [] }\n graph.nodes.create(groupToRestore, this.parentId as AnyNodeId)\n\n // 2. Remove children from parent and add back to group with original local positions\n for (const child of this.originalChildren) {\n // Delete from parent (where they were moved during execute)\n graph.deleteNode(child.id)\n\n // Add back to group (child data already has relative coordinates from original state)\n graph.nodes.create(child, this.groupNodeId as AnyNodeId)\n }\n }\n}\n","// Grid and building constants\nexport const TILE_SIZE = 0.5 // 50cm grid spacing\nexport const WALL_HEIGHT = 2.5 // 2.5m standard wall height\nexport const GRID_SIZE = 30 // 30m x 30m\nexport const SLAB_THICKNESS = 0.2 // 20cm thickness\nexport const FLOOR_SPACING = 12 // 12m vertical spacing between floors\n","import { SLAB_THICKNESS, WALL_HEIGHT } from '../constants'\nimport type { SceneGraph } from '../scenegraph'\nimport type { AnyNode, NodeTypeMap } from '../scenegraph/schema/index'\nimport type { NodeProcessor, NodeProcessResult } from './types'\n\n// Minimum level height (in meters)\nconst MIN_LEVEL_HEIGHT = WALL_HEIGHT\n\n/**\n * Gets the height of a node based on its type\n */\n// TODO: Should be generified to support custom heights per node type\nfunction getNodeHeight(node: AnyNode): number {\n switch (node.type) {\n case 'wall':\n case 'column':\n return WALL_HEIGHT\n case 'slab':\n return SLAB_THICKNESS\n case 'door':\n return 2.0 // Standard door height\n case 'window':\n return 1.22 // Standard window height\n case 'roof':\n return 2.5 // Roof thickness\n default:\n return 0\n }\n}\n\n/**\n * Recursively calculates the maximum height among a node and all its descendants\n */\nfunction getMaxHeightRecursive(node: AnyNode): number {\n // Get this node's height + elevation\n const nodeHeight = getNodeHeight(node)\n const nodeElevation = (node as any).elevation || 0\n let maxHeight = nodeHeight + nodeElevation\n\n // Recursively check all children\n // AnyNode union doesn't guarantee children property structure identically across all types in a simple way without narrowing\n // But for calculation purposes we can iterate if it exists\n if ('children' in node && Array.isArray(node.children)) {\n for (const child of node.children) {\n const childMaxHeight = getMaxHeightRecursive(child)\n if (childMaxHeight > maxHeight) {\n maxHeight = childMaxHeight\n }\n }\n }\n\n return maxHeight\n}\n\n/**\n * LevelHeightProcessor calculates the height of each level\n * based on the maximum height of all nodes in that level (including nested children).\n *\n * The height represents how tall the level is internally (its content height).\n * This is different from elevation, which is calculated separately based on\n * the cumulative heights of previous levels.\n */\nexport class LevelHeightProcessor implements NodeProcessor {\n nodeTypes = ['level']\n\n process(nodes: AnyNode[], graph: SceneGraph): NodeProcessResult[] {\n const results: NodeProcessResult[] = []\n\n // Process each level\n nodes.forEach((node) => {\n if (node.type !== 'level') return\n\n const level = node as NodeTypeMap['level']\n\n // Calculate the maximum height among all descendant nodes (recursively)\n let maxHeight = 0\n\n level.children.forEach((child) => {\n const childMaxHeight = getMaxHeightRecursive(child as AnyNode)\n if (childMaxHeight > maxHeight) {\n maxHeight = childMaxHeight\n }\n })\n\n // Use minimum level height if no children or all children have zero height\n const levelHeight = Math.max(maxHeight, MIN_LEVEL_HEIGHT)\n\n results.push({\n nodeId: level.id,\n updates: {\n height: levelHeight,\n },\n })\n })\n\n return results\n }\n}\n","import type { SceneGraph } from '../scenegraph'\nimport type { AnyNode, NodeTypeMap } from '../scenegraph/schema/index'\nimport type { NodeProcessor, NodeProcessResult } from './types'\n\n/**\n * LevelElevationProcessor calculates the elevation (Y offset from ground) for each level\n * based on the cumulative heights of all previous levels.\n *\n * This processor should run AFTER LevelHeightProcessor, which calculates each level's height.\n *\n * Example:\n * - Level 0: height = 3m, elevation = 0m (ground floor)\n * - Level 1: height = 2.5m, elevation = 3m (on top of level 0)\n * - Level 2: height = 3.5m, elevation = 5.5m (on top of level 1)\n */\nexport class LevelElevationProcessor implements NodeProcessor {\n nodeTypes = ['level']\n\n process(nodes: AnyNode[], graph: SceneGraph): NodeProcessResult[] {\n const results: NodeProcessResult[] = []\n\n // Filter and sort levels by their level number\n const levels = nodes\n .filter((node): node is NodeTypeMap['level'] => node.type === 'level')\n .sort((a, b) => a.level - b.level)\n\n // Calculate cumulative elevation for each level\n let cumulativeElevation = 0\n\n levels.forEach((level) => {\n // Set this level's elevation\n results.push({\n nodeId: level.id,\n updates: {\n elevation: cumulativeElevation,\n },\n })\n\n // Add this level's height to the cumulative total for the next level\n // Use the calculated height, or 0 if not yet calculated\n const levelHeight = level.height || 0\n cumulativeElevation += levelHeight\n })\n\n return results\n }\n}\n","import { SLAB_THICKNESS, WALL_HEIGHT } from '../constants'\nimport type { SceneGraph } from '../scenegraph'\nimport type { AnyNode, SceneNodeId } from '../scenegraph/schema/index'\nimport type { NodeProcessor, NodeProcessResult } from './types'\n\nexport class VerticalStackingProcessor implements NodeProcessor {\n nodeTypes = ['wall', 'column', 'slab', 'item', 'stair', 'ceiling']\n\n process(nodes: AnyNode[], graph: SceneGraph): NodeProcessResult[] {\n const results: NodeProcessResult[] = []\n\n // Check if there's a slab in the affected nodes\n const hasSlab = nodes.some((node) => node.type === 'slab')\n\n nodes.forEach((node) => {\n // Skip slab nodes themselves\n if (node.type === 'slab') {\n return\n }\n\n // Skip nodes whose parent chain includes a node with elevation\n // (e.g., items attached to walls or ceilings)\n // These nodes are positioned relative to their parent\n if (this.hasElevatedParent(node, graph)) {\n return\n }\n\n if (this.supportsVerticalStacking(node)) {\n let elevation: number\n\n if (node.type === 'ceiling') {\n // Ceiling is positioned at the top of the walls\n elevation = hasSlab ? SLAB_THICKNESS + WALL_HEIGHT : WALL_HEIGHT\n } else {\n // Walls, columns, items, stairs are positioned at the bottom\n elevation = hasSlab ? SLAB_THICKNESS : 0\n }\n\n results.push({\n nodeId: node.id,\n updates: {\n elevation,\n },\n })\n }\n })\n\n return results\n }\n\n /**\n * Check if any ancestor in the parent chain has elevation applied\n * Recursively checks up the parent chain until reaching level/building/root\n */\n private hasElevatedParent(node: AnyNode, graph: SceneGraph): boolean {\n if (!('parentId' in node && node.parentId)) {\n return false\n }\n\n const parent = graph.getNodeById(node.parentId as SceneNodeId)?.data()\n if (!parent) {\n return false\n }\n\n // If parent is one of the types that gets elevation, return true\n if (this.nodeTypes.includes(parent.type)) {\n return true\n }\n\n // Recursively check the parent's parent\n return this.hasElevatedParent(parent, graph)\n }\n\n private supportsVerticalStacking(node: AnyNode): boolean {\n return this.nodeTypes.includes(node.type)\n }\n}\n","/**\n * 2D Occupancy Grid for flood fill-based room detection\n * Used to determine which side of walls face interior (room) vs exterior space\n */\n\nexport interface BoundingBox {\n minX: number\n maxX: number\n minZ: number\n maxZ: number\n}\n\nexport class OccupancyGrid {\n // Cell states\n static EMPTY = 0\n static WALL = 1\n static EXTERIOR = 2\n static ROOM_BASE = 3 // Rooms are 3, 4, 5, etc.\n\n private grid: Uint8Array\n public readonly width: number\n public readonly height: number\n private originX: number\n private originZ: number\n private cellSize: number\n\n constructor(bounds: BoundingBox, cellSize: number = 0.1) {\n // Add padding for exterior flood fill\n const padding = 1.0 // 1 meter padding\n this.originX = bounds.minX - padding\n this.originZ = bounds.minZ - padding\n this.cellSize = cellSize\n this.width = Math.ceil((bounds.maxX - bounds.minX + 2 * padding) / cellSize)\n this.height = Math.ceil((bounds.maxZ - bounds.minZ + 2 * padding) / cellSize)\n this.grid = new Uint8Array(this.width * this.height)\n }\n\n /**\n * Convert world coordinates to grid indices\n */\n worldToGrid(x: number, z: number): [number, number] {\n const gx = Math.floor((x - this.originX) / this.cellSize)\n const gz = Math.floor((z - this.originZ) / this.cellSize)\n return [gx, gz]\n }\n\n /**\n * Convert grid indices to world coordinates (center of cell)\n */\n gridToWorld(gx: number, gz: number): [number, number] {\n const x = this.originX + (gx + 0.5) * this.cellSize\n const z = this.originZ + (gz + 0.5) * this.cellSize\n return [x, z]\n }\n\n /**\n * Check if grid indices are within bounds\n */\n isInBounds(gx: number, gz: number): boolean {\n return gx >= 0 && gx < this.width && gz >= 0 && gz < this.height\n }\n\n /**\n * Get cell value at grid indices\n */\n get(gx: number, gz: number): number {\n if (!this.isInBounds(gx, gz)) return OccupancyGrid.EXTERIOR\n return this.grid[gz * this.width + gx]\n }\n\n /**\n * Set cell value at grid indices\n */\n set(gx: number, gz: number, value: number): void {\n if (!this.isInBounds(gx, gz)) return\n this.grid[gz * this.width + gx] = value\n }\n\n /**\n * Rasterize a wall line segment with thickness onto the grid\n */\n rasterizeWall(start: [number, number], end: [number, number], thickness: number): void {\n const halfT = thickness / 2\n\n const dx = end[0] - start[0]\n const dz = end[1] - start[1]\n const len = Math.sqrt(dx * dx + dz * dz)\n\n if (len < 0.001) return\n\n // Normal perpendicular to wall direction\n const nx = -dz / len\n const nz = dx / len\n\n // 4 corners of the wall rectangle\n const corners: [number, number][] = [\n [start[0] + nx * halfT, start[1] + nz * halfT],\n [start[0] - nx * halfT, start[1] - nz * halfT],\n [end[0] - nx * halfT, end[1] - nz * halfT],\n [end[0] + nx * halfT, end[1] + nz * halfT],\n ]\n\n // Fill the polygon\n this.fillPolygon(corners, OccupancyGrid.WALL)\n }\n\n /**\n * Fill a polygon using scan-line algorithm\n */\n private fillPolygon(corners: [number, number][], value: number): void {\n // Convert corners to grid coordinates\n const gridCorners = corners.map(([x, z]) => this.worldToGrid(x, z))\n\n // Find bounding box in grid space\n let minGx = Infinity,\n maxGx = -Infinity\n let minGz = Infinity,\n maxGz = -Infinity\n\n for (const [gx, gz] of gridCorners) {\n minGx = Math.min(minGx, gx)\n maxGx = Math.max(maxGx, gx)\n minGz = Math.min(minGz, gz)\n maxGz = Math.max(maxGz, gz)\n }\n\n // Clamp to grid bounds\n minGx = Math.max(0, minGx)\n maxGx = Math.min(this.width - 1, maxGx)\n minGz = Math.max(0, minGz)\n maxGz = Math.min(this.height - 1, maxGz)\n\n // Scan-line fill using point-in-polygon test\n for (let gz = minGz; gz <= maxGz; gz++) {\n for (let gx = minGx; gx <= maxGx; gx++) {\n const [wx, wz] = this.gridToWorld(gx, gz)\n if (this.pointInPolygon(wx, wz, corners)) {\n this.set(gx, gz, value)\n }\n }\n }\n }\n\n /**\n * Check if a point is inside a polygon using ray casting\n */\n private pointInPolygon(x: number, z: number, polygon: [number, number][]): boolean {\n let inside = false\n const n = polygon.length\n\n for (let i = 0, j = n - 1; i < n; j = i++) {\n const [xi, zi] = polygon[i]\n const [xj, zj] = polygon[j]\n\n if (zi > z !== zj > z && x < ((xj - xi) * (z - zi)) / (zj - zi) + xi) {\n inside = !inside\n }\n }\n\n return inside\n }\n\n /**\n * Flood fill from a world coordinate\n */\n floodFill(startX: number, startZ: number, fillValue: number): number {\n const [gx, gz] = this.worldToGrid(startX, startZ)\n return this.floodFillGrid(gx, gz, fillValue)\n }\n\n /**\n * Flood fill from grid coordinates using BFS\n */\n floodFillGrid(startGx: number, startGz: number, fillValue: number): number {\n if (!this.isInBounds(startGx, startGz)) return 0\n if (this.get(startGx, startGz) !== OccupancyGrid.EMPTY) return 0\n\n // BFS flood fill for efficiency (avoids stack overflow on large grids)\n const queue: [number, number][] = [[startGx, startGz]]\n let filledCount = 0\n\n // Mark starting cell immediately to prevent re-adding\n this.set(startGx, startGz, fillValue)\n filledCount++\n\n while (queue.length > 0) {\n const [gx, gz] = queue.shift()!\n\n // 4-connected neighbors\n const neighbors: [number, number][] = [\n [gx + 1, gz],\n [gx - 1, gz],\n [gx, gz + 1],\n [gx, gz - 1],\n ]\n\n for (const [nx, nz] of neighbors) {\n if (this.isInBounds(nx, nz) && this.get(nx, nz) === OccupancyGrid.EMPTY) {\n this.set(nx, nz, fillValue)\n filledCount++\n queue.push([nx, nz])\n }\n }\n }\n\n return filledCount\n }\n\n /**\n * Flood fill exterior from all grid edges\n */\n floodFillExterior(): void {\n // Fill from top and bottom edges\n for (let gx = 0; gx < this.width; gx++) {\n if (this.get(gx, 0) === OccupancyGrid.EMPTY) {\n this.floodFillGrid(gx, 0, OccupancyGrid.EXTERIOR)\n }\n if (this.get(gx, this.height - 1) === OccupancyGrid.EMPTY) {\n this.floodFillGrid(gx, this.height - 1, OccupancyGrid.EXTERIOR)\n }\n }\n\n // Fill from left and right edges\n for (let gz = 0; gz < this.height; gz++) {\n if (this.get(0, gz) === OccupancyGrid.EMPTY) {\n this.floodFillGrid(0, gz, OccupancyGrid.EXTERIOR)\n }\n if (this.get(this.width - 1, gz) === OccupancyGrid.EMPTY) {\n this.floodFillGrid(this.width - 1, gz, OccupancyGrid.EXTERIOR)\n }\n }\n }\n\n /**\n * Detect rooms by flood filling remaining EMPTY cells\n * Returns the number of rooms detected\n */\n detectRooms(): number {\n let roomId = OccupancyGrid.ROOM_BASE\n let roomCount = 0\n\n // Scan grid for remaining EMPTY cells - each contiguous region is a room\n for (let gz = 0; gz < this.height; gz++) {\n for (let gx = 0; gx < this.width; gx++) {\n if (this.get(gx, gz) === OccupancyGrid.EMPTY) {\n const filled = this.floodFillGrid(gx, gz, roomId)\n if (filled > 0) {\n roomId++\n roomCount++\n }\n }\n }\n }\n\n return roomCount\n }\n\n /**\n * Get the cell state on a specific side of a wall\n * Samples multiple points along the wall and returns the first room found,\n * or EXTERIOR if no room is found\n * @param wallStart Start point of wall [x, z]\n * @param wallEnd End point of wall [x, z]\n * @param side 'front' or 'back'\n * @param wallThickness thickness of the wall (default 0.2m)\n * @returns The cell state (EXTERIOR, ROOM_BASE+N)\n */\n getSideState(\n wallStart: [number, number],\n wallEnd: [number, number],\n side: 'front' | 'back',\n wallThickness = 0.2,\n ): number {\n // Calculate wall direction\n const dx = wallEnd[0] - wallStart[0]\n const dz = wallEnd[1] - wallStart[1]\n const len = Math.sqrt(dx * dx + dz * dz)\n\n if (len < 0.001) return OccupancyGrid.EXTERIOR\n\n // Calculate normal direction (perpendicular to wall)\n // Front normal points in the direction of positive local Z\n let normalX = -dz / len\n let normalZ = dx / len\n\n if (side === 'back') {\n normalX = -normalX\n normalZ = -normalZ\n }\n\n // Sample distance from wall center line (past the wall surface)\n const sampleDist = wallThickness / 2 + this.cellSize * 2\n\n // Sample at multiple points along the wall (start, middle, end)\n // This handles cases where part of the wall is near other walls\n const samplePoints = [0.2, 0.5, 0.8] // 20%, 50%, 80% along wall length\n\n for (const t of samplePoints) {\n const pointX = wallStart[0] + dx * t\n const pointZ = wallStart[1] + dz * t\n\n const sampleX = pointX + normalX * sampleDist\n const sampleZ = pointZ + normalZ * sampleDist\n\n const [gx, gz] = this.worldToGrid(sampleX, sampleZ)\n\n // Skip if out of bounds\n if (!this.isInBounds(gx, gz)) continue\n\n const state = this.get(gx, gz)\n\n // If we find a room, return it immediately\n if (state >= OccupancyGrid.ROOM_BASE) {\n return state\n }\n }\n\n // No room found at any sample point - check if any point is EXTERIOR vs WALL\n // Sample again to determine if it's exterior or just hitting walls\n const midX = (wallStart[0] + wallEnd[0]) / 2\n const midZ = (wallStart[1] + wallEnd[1]) / 2\n const sampleX = midX + normalX * sampleDist\n const sampleZ = midZ + normalZ * sampleDist\n const [gx, gz] = this.worldToGrid(sampleX, sampleZ)\n\n if (!this.isInBounds(gx, gz)) {\n return OccupancyGrid.EXTERIOR\n }\n\n return this.get(gx, gz)\n }\n\n /**\n * Check if a cell state represents a room (interior space)\n */\n static isRoom(state: number): boolean {\n return state >= OccupancyGrid.ROOM_BASE\n }\n\n /**\n * Debug: Print a visual representation of the grid to console\n */\n debugPrint(): void {\n const chars: Record<number, string> = {\n [OccupancyGrid.EMPTY]: '.',\n [OccupancyGrid.WALL]: '#',\n [OccupancyGrid.EXTERIOR]: ' ',\n }\n\n console.log(`Grid ${this.width}x${this.height}:`)\n for (let gz = this.height - 1; gz >= 0; gz--) {\n let row = ''\n for (let gx = 0; gx < this.width; gx++) {\n const state = this.get(gx, gz)\n if (state >= OccupancyGrid.ROOM_BASE) {\n // Show room ID as a letter (A, B, C, ...)\n row += String.fromCharCode(65 + (state - OccupancyGrid.ROOM_BASE))\n } else {\n row += chars[state] ?? '?'\n }\n }\n console.log(row)\n }\n }\n}\n","/**\n * Room Detection Processor\n * Uses flood fill to detect enclosed rooms and assign interior sides to walls\n */\n\nimport type { SceneGraph } from '../scenegraph'\nimport type { AnyNode } from '../scenegraph/schema/index'\nimport type { WallNode } from '../scenegraph/schema/nodes/wall'\nimport type { NodeProcessResult, NodeProcessor } from './types'\nimport { type BoundingBox, OccupancyGrid } from './occupancy-grid'\n\nconst WALL_THICKNESS = 0.2 // 20cm default wall thickness\n\nexport class RoomDetectionProcessor implements NodeProcessor {\n nodeTypes = ['level']\n\n // Cache for tracking when reprocessing is needed\n private readonly lastWallHash: Map<string, string> = new Map()\n\n process(nodes: AnyNode[], graph: SceneGraph): NodeProcessResult[] {\n const results: NodeProcessResult[] = []\n\n for (const node of nodes) {\n if (node.type !== 'level') continue\n\n const levelResults = this.processLevel(node, graph)\n results.push(...levelResults)\n }\n\n return results\n }\n\n private processLevel(levelNode: AnyNode, graph: SceneGraph): NodeProcessResult[] {\n const results: NodeProcessResult[] = []\n\n // Step 1: Collect all walls in this level (including walls in groups)\n const allWalls = this.collectWalls(levelNode)\n\n // Filter out preview walls - only process committed walls\n const walls = allWalls.filter((w) => !w.editor?.preview)\n\n // Step 1.5: Check if walls have changed since last processing\n // Compute hash BEFORE early return so we can detect \"no walls\" -> \"some walls\" transitions\n const wallHash = this.computeWallHash(walls)\n const levelId = (levelNode as any).id as string\n\n if (this.lastWallHash.get(levelId) === wallHash) {\n // No changes to committed walls, skip reprocessing\n return results\n }\n this.lastWallHash.set(levelId, wallHash)\n\n // No committed walls - nothing to process\n if (walls.length === 0) return results\n\n // Step 2: Calculate bounds for the occupancy grid\n const bounds = this.calculateLevelBounds(walls)\n if (!bounds) return results\n\n // Step 3: Create and populate occupancy grid\n const grid = new OccupancyGrid(bounds, 0.1) // 10cm resolution\n\n // Rasterize all walls onto the grid\n for (const wall of walls) {\n grid.rasterizeWall(wall.start, wall.end, wall.thickness || WALL_THICKNESS)\n }\n\n // Step 4: Flood fill exterior from grid boundary\n grid.floodFillExterior()\n\n // Step 5: Detect rooms (flood fill remaining EMPTY cells)\n // After this, any EMPTY cell that wasn't reached by exterior flood fill\n // becomes a room. Each contiguous region gets a unique room ID.\n grid.detectRooms()\n\n // Step 6: Determine interior side for each wall\n for (const wall of walls) {\n const interiorSide = this.determineInteriorSide(wall, grid)\n\n // Only update if the value has changed\n if (interiorSide !== wall.interiorSide) {\n results.push({\n nodeId: wall.id,\n updates: { interiorSide },\n })\n }\n }\n\n return results\n }\n\n /**\n * Recursively collect all walls in a level, including those nested in groups\n * Transforms wall coordinates to level space based on parent group transforms\n */\n private collectWalls(node: AnyNode): WallNode[] {\n const walls: WallNode[] = []\n\n // Transform a point by group position and rotation\n const transformPoint = (\n point: [number, number],\n groupPos: [number, number],\n groupRot: number,\n ): [number, number] => {\n // Apply rotation then translation\n const cos = Math.cos(groupRot)\n const sin = Math.sin(groupRot)\n const rotatedX = point[0] * cos - point[1] * sin\n const rotatedZ = point[0] * sin + point[1] * cos\n return [rotatedX + groupPos[0], rotatedZ + groupPos[1]]\n }\n\n const traverse = (n: AnyNode, parentPos: [number, number], parentRot: number) => {\n if (n.type === 'wall') {\n const wall = n as WallNode\n // Transform wall coordinates to level space\n const transformedStart = transformPoint(wall.start, parentPos, parentRot)\n const transformedEnd = transformPoint(wall.end, parentPos, parentRot)\n\n // Create a copy with transformed coordinates for processing\n // (we don't modify the original wall node)\n walls.push({\n ...wall,\n start: transformedStart,\n end: transformedEnd,\n })\n }\n\n if (n.type === 'group' && 'position' in n && 'rotation' in n) {\n // Accumulate group transforms\n const group = n as { position: [number, number]; rotation: number; children: AnyNode[] }\n const newPos = transformPoint(group.position, parentPos, parentRot)\n const newRot = parentRot + group.rotation\n\n if (Array.isArray(group.children)) {\n for (const child of group.children) {\n traverse(child as AnyNode, newPos, newRot)\n }\n }\n } else if ('children' in n && Array.isArray(n.children)) {\n for (const child of n.children) {\n traverse(child as AnyNode, parentPos, parentRot)\n }\n }\n }\n\n // Start traversing from level's children with identity transform\n if ('children' in node && Array.isArray(node.children)) {\n for (const child of node.children) {\n traverse(child as AnyNode, [0, 0], 0)\n }\n }\n\n return walls\n }\n\n /**\n * Compute a hash of wall positions to detect changes\n */\n private computeWallHash(walls: WallNode[]): string {\n if (walls.length === 0) return 'empty'\n\n // Sort by ID for consistent ordering\n const sorted = [...walls].sort((a, b) => a.id.localeCompare(b.id))\n // Create a simple hash from wall geometry\n const parts = sorted.map(\n (w) => `${w.id}:${w.start[0]},${w.start[1]}:${w.end[0]},${w.end[1]}:${w.thickness || 0.2}`,\n )\n return parts.join('|')\n }\n\n /**\n * Calculate the bounding box of all walls\n */\n private calculateLevelBounds(walls: WallNode[]): BoundingBox | null {\n let minX = Infinity,\n maxX = -Infinity\n let minZ = Infinity,\n maxZ = -Infinity\n\n for (const wall of walls) {\n const [x1, z1] = wall.start\n const [x2, z2] = wall.end\n minX = Math.min(minX, x1, x2)\n maxX = Math.max(maxX, x1, x2)\n minZ = Math.min(minZ, z1, z2)\n maxZ = Math.max(maxZ, z1, z2)\n }\n\n if (minX === Infinity) return null\n\n return { minX, maxX, minZ, maxZ }\n }\n\n /**\n * Determine which side of a wall faces interior space\n */\n private determineInteriorSide(\n wall: WallNode,\n grid: OccupancyGrid,\n ): 'front' | 'back' | 'both' | 'neither' {\n const thickness = wall.thickness || 0.2\n const frontState = grid.getSideState(wall.start, wall.end, 'front', thickness)\n const backState = grid.getSideState(wall.start, wall.end, 'back', thickness)\n\n const frontIsRoom = OccupancyGrid.isRoom(frontState)\n const backIsRoom = OccupancyGrid.isRoom(backState)\n\n if (frontIsRoom && backIsRoom) {\n // Wall between two rooms (or same room if it's an internal partition)\n return 'both'\n } else if (frontIsRoom) {\n return 'front'\n } else if (backIsRoom) {\n return 'back'\n } else {\n // Neither side is a room (both exterior or both wall)\n return 'neither'\n }\n }\n}\n","function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nconst dedent = createDedent({});\nexport default dedent;\nfunction createDedent(options) {\n dedent.withOptions = newOptions => createDedent(_objectSpread(_objectSpread({}, options), newOptions));\n return dedent;\n function dedent(strings, ...values) {\n const raw = typeof strings === \"string\" ? [strings] : strings.raw;\n const {\n alignValues = false,\n escapeSpecialCharacters = Array.isArray(strings),\n trimWhitespace = true\n } = options;\n\n // first, perform interpolation\n let result = \"\";\n for (let i = 0; i < raw.length; i++) {\n let next = raw[i];\n if (escapeSpecialCharacters) {\n // handle escaped newlines, backticks, and interpolation characters\n next = next.replace(/\\\\\\n[ \\t]*/g, \"\").replace(/\\\\`/g, \"`\").replace(/\\\\\\$/g, \"$\").replace(/\\\\\\{/g, \"{\");\n }\n result += next;\n if (i < values.length) {\n const value = alignValues ? alignValue(values[i], result) : values[i];\n\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n result += value;\n }\n }\n\n // now strip indentation\n const lines = result.split(\"\\n\");\n let mindent = null;\n for (const l of lines) {\n const m = l.match(/^(\\s+)\\S+/);\n if (m) {\n const indent = m[1].length;\n if (!mindent) {\n // this is the first indented line\n mindent = indent;\n } else {\n mindent = Math.min(mindent, indent);\n }\n }\n }\n if (mindent !== null) {\n const m = mindent; // appease TypeScript\n result = lines\n // https://github.com/typescript-eslint/typescript-eslint/issues/7140\n // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with\n .map(l => l[0] === \" \" || l[0] === \"\\t\" ? l.slice(m) : l).join(\"\\n\");\n }\n\n // dedent eats leading and trailing whitespace too\n if (trimWhitespace) {\n result = result.trim();\n }\n\n // handle escaped newlines at the end to ensure they don't get stripped too\n if (escapeSpecialCharacters) {\n result = result.replace(/\\\\n/g, \"\\n\");\n }\n\n // Workaround for Bun issue with Unicode characters\n // https://github.com/oven-sh/bun/issues/8745\n if (typeof Bun !== \"undefined\") {\n result = result.replace(\n // Matches e.g. \\\\u{1f60a} or \\\\u5F1F\n /\\\\u(?:\\{([\\da-fA-F]{1,6})\\}|([\\da-fA-F]{4}))/g, (_, braced, unbraced) => {\n var _ref;\n const hex = (_ref = braced !== null && braced !== void 0 ? braced : unbraced) !== null && _ref !== void 0 ? _ref : \"\";\n return String.fromCodePoint(parseInt(hex, 16));\n });\n }\n return result;\n }\n}\n\n/**\n * Adjusts the indentation of a multi-line interpolated value to match the current line.\n */\nfunction alignValue(value, precedingText) {\n if (typeof value !== \"string\" || !value.includes(\"\\n\")) {\n return value;\n }\n const currentLine = precedingText.slice(precedingText.lastIndexOf(\"\\n\") + 1);\n const indentMatch = currentLine.match(/^(\\s+)/);\n if (indentMatch) {\n const indent = indentMatch[1];\n return value.replace(/\\n/g, `\\n${indent}`);\n }\n return value;\n}\n","import { z } from 'zod'\n\nconst Vector3Schema = z.tuple([z.number(), z.number(), z.number()])\n\nexport const CameraSchema = z.object({\n position: Vector3Schema,\n target: Vector3Schema,\n mode: z.enum(['perspective', 'orthographic']).default('perspective'),\n fov: z.number().optional(), // For perspective\n zoom: z.number().optional(), // For orthographic\n})\n\nexport type Camera = z.infer<typeof CameraSchema>\n\n","import { customAlphabet } from 'nanoid'\nimport { z } from 'zod'\nimport { CameraSchema } from './camera'\n\nconst customId = customAlphabet('0123456789abcdefghijklmnopqrstuvwxyz', 16)\n\n/**\n * Material preset name reference\n * @example 'white', 'brick', 'wood', 'glass', 'preview-valid'\n */\nexport const Material = z.string().optional()\nexport const generateId = <T extends string>(prefix: T): `${T}_${string}` =>\n `${prefix}_${customId()}` as `${T}_${string}`\nexport const objectId = <T extends string>(prefix: T) => {\n const schema = z.templateLiteral([`${prefix}_`, z.string()])\n\n return schema.default(() => generateId(prefix) as z.infer<typeof schema>)\n}\nexport const nodeType = <T extends string>(type: T) => z.literal(type).default(type)\n\nexport const BaseNode = z.object({\n object: z.literal('node').default('node'),\n id: z.string(), // objectId('node'), @Aymericr: Thing is if we specify objectId here, when using BaseNode.extend, TS complains that the id is not assignable to the more specific type in the extended node\n type: nodeType('node'),\n name: z.string().optional(),\n parentId: z.string().nullable().default(null),\n visible: z.boolean().optional().default(true),\n opacity: z.number().min(0).max(100).optional().default(100),\n camera: CameraSchema.optional(),\n metadata: z.json().optional().default({}),\n editor: z\n .object({\n canPlace: z.boolean().optional(),\n preview: z.boolean().optional(),\n locked: z.boolean().optional(),\n deletePreview: z.boolean().optional(),\n // Delete range: grid cell indices [startIndex, endIndex] (inclusive)\n // For a wall of length 5, indices are 0-4\n deleteRange: z.tuple([z.number(), z.number()]).optional(),\n // Paint preview state for painting tool\n paintPreview: z.boolean().optional(),\n paintRange: z.tuple([z.number(), z.number()]).optional(),\n paintFace: z.enum(['front', 'back']).optional(),\n })\n .optional(),\n})\n\nexport type BaseNode = z.infer<typeof BaseNode>\n","import dedent from 'dedent'\nimport { z } from 'zod'\nimport { BaseNode, nodeType, objectId } from '../base'\n\nexport const ColumnNode = BaseNode.extend({\n id: objectId('column'),\n type: nodeType('column'),\n diameter: z.number().optional(),\n height: z.number().optional(),\n position: z.tuple([z.number(), z.number()]),\n}).describe(\n dedent`\n Column node - used to represent a column in the building\n - diameter: diameter in meters (default is .3 meters)\n - height: height in meters (default is 2.5 meters)\n - position: position in level coordinate system\n `,\n)\n\nexport type ColumnNode = z.infer<typeof ColumnNode>\n","import dedent from 'dedent'\nimport { z } from 'zod'\nimport { BaseNode, nodeType, objectId } from '../base'\nimport { GroupNode } from './group'\nimport { ItemNode } from './item'\n\nexport const CeilingNode = BaseNode.extend({\n id: objectId('ceiling'),\n type: nodeType('ceiling'),\n // Grid props\n position: z.tuple([z.number(), z.number()]),\n rotation: z.number(),\n size: z.tuple([z.number(), z.number()]),\n}).describe(\n dedent`\n Ceiling node - used to represent a ceiling surface\n - position: bottom-left corner position in grid coordinates\n - rotation: rotation in radians\n - size: width and depth in grid units\n - elevation: height above floor in meters\n `,\n)\n\nexport type CeilingNode = z.infer<typeof CeilingNode>\n","// lib/scenegraph/schema/nodes/door.ts\nimport dedent from 'dedent'\nimport { z } from 'zod'\nimport { BaseNode, nodeType, objectId } from '../base'\n\nexport const DoorNode = BaseNode.extend({\n id: objectId('door'),\n type: nodeType('door'),\n // Position is in local coordinate system of the wall\n position: z.tuple([z.number(), z.number()]), // x along wall from wall start point, y vertical position\n rotation: z.number(), // TODO: remove in favor of the parent node wall rotation\n size: z.tuple([z.number(), z.number()]),\n}).describe(\n dedent`\n Door node - used to represent a door in the wall:\n - position: position in local coordinate system of the wall\n `,\n)\n\nexport type DoorNode = z.infer<typeof DoorNode>\n","import dedent from 'dedent'\nimport { z } from 'zod'\nimport { BaseNode, nodeType, objectId } from '../base'\n\nexport const ItemNode = BaseNode.extend({\n id: objectId('item'),\n type: nodeType('item'),\n category: z.string(),\n position: z.tuple([z.number(), z.number()]),\n rotation: z.number(),\n size: z.tuple([z.number(), z.number()]),\n src: z.string(),\n modelScale: z\n .union([z.number(), z.tuple([z.number(), z.number(), z.number()])])\n .default([1, 1, 1]),\n modelPosition: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),\n modelRotation: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),\n attachTo: z.enum(['wall', 'wall-side', 'ceiling']).optional(),\n side: z.enum(['front', 'back']).optional(),\n}).describe(dedent`Item node - used to represent a item in the building\n - position: position in level coordinate system (or parent coordinate system if attached)\n - rotation: rotation in level coordinate system (or parent coordinate system if attached)\n - size: size in level coordinate system\n - src: url of the model\n - attachTo: optional attachment type - 'wall' (both sides), 'wall-side' (one side only), or 'ceiling'. When set, item is parented to wall/ceiling\n - side: optional wall side - 'front' or 'back'. When undefined, item affects both sides (like doors/windows)\n`)\n\nexport type ItemNode = z.infer<typeof ItemNode>\n","import dedent from 'dedent'\nimport { z } from 'zod'\nimport { BaseNode, Material, nodeType, objectId } from '../base'\n\nexport const SlabNode = BaseNode.extend({\n id: objectId('slab'),\n type: nodeType('slab'),\n // Grid props\n position: z.tuple([z.number(), z.number()]),\n rotation: z.number(),\n size: z.tuple([z.number(), z.number()]),\n // Specific props\n thickness: z.number().optional(),\n // Material property\n material: Material,\n}).describe(\n dedent`\n Slab node - used to represent a concrete slab\n - material: material preset name (e.g., 'white', 'concrete', 'tile')\n `,\n)\n\nexport type SlabNode = z.infer<typeof SlabNode>\n","import dedent from 'dedent'\nimport { z } from 'zod'\nimport { BaseNode, nodeType, objectId } from '../base'\n\nexport const WindowNode = BaseNode.extend({\n id: objectId('window'),\n type: nodeType('window'),\n // Specific props: size, position on wall, etc.\n height: z.number().default(1), // height in meters of the bottom of the window\n position: z.tuple([z.number(), z.number()]), // position in local coordinate system of the wall\n size: z.tuple([z.number(), z.number()]),\n rotation: z.number(),\n}).describe(\n dedent`\n Window node - used to represent a window in the wall:\n - height: height in meters (default is 1 meter)\n - position: position in local coordinate system of the wall\n `,\n)\n\nexport type WindowNode = z.infer<typeof WindowNode>\n","import dedent from 'dedent'\nimport { z } from 'zod'\nimport { BaseNode, Material, nodeType, objectId } from '../base'\nimport { DoorNode } from './door'\nimport { ItemNode } from './item'\nimport { WindowNode } from './window'\n\nexport const WallNode = BaseNode.extend({\n id: objectId('wall'),\n type: nodeType('wall'),\n get children() {\n return z.array(z.discriminatedUnion('type', [DoorNode, WindowNode, ItemNode])).default([])\n },\n // Specific props\n thickness: z.number().optional(),\n height: z.number().optional(),\n // e.g., start/end points for path\n start: z.tuple([z.number(), z.number()]),\n end: z.tuple([z.number(), z.number()]),\n position: z.tuple([z.number(), z.number()]), // TODO: remove in favor of start and end\n size: z.tuple([z.number(), z.number()]), // TODO: remove in favor of start and end\n rotation: z.number(),\n // Material properties\n materialFront: Material,\n materialBack: Material,\n interiorSide: z.enum(['front', 'back', 'both', 'neither']).optional(),\n}).describe(\n dedent`\n Wall node - used to represent a wall in the building\n - thickness: thickness in meters\n - height: height in meters\n - start: start point of the wall in level coordinate system\n - end: end point of the wall in level coordinate system\n - size: size of the wall in grid units\n - materialFront: material for the front face (positive Z normal direction)\n - materialBack: material for the back face (negative Z normal direction)\n - interiorSide: which side is considered the interior side for rendering purposes\n `,\n)\nexport type WallNode = z.infer<typeof WallNode>\n","import dedent from 'dedent'\nimport { z } from 'zod'\nimport { BaseNode, nodeType, objectId } from '../base'\nimport { CeilingNode } from './ceiling'\nimport { ColumnNode } from './column'\nimport { DoorNode } from './door'\nimport { ItemNode } from './item'\nimport { SlabNode } from './slab'\nimport { WallNode } from './wall'\nimport { WindowNode } from './window'\n\n// Helper to avoid circular dependencies with lazy evaluation\nconst GroupChildNode: z.ZodType<any> = z.lazy(() =>\n z.discriminatedUnion('type', [\n // Building elements or items\n SlabNode,\n WallNode,\n DoorNode,\n WindowNode,\n ColumnNode,\n CeilingNode,\n ItemNode,\n GroupNode,\n ]),\n)\n\nexport const GroupNode = BaseNode.extend({\n id: objectId('group'),\n type: nodeType('group'),\n children: z.array(GroupChildNode).default([]),\n position: z.tuple([z.number(), z.number()]),\n rotation: z.number(),\n}).describe(\n dedent`\n Group node - used to represent a group of nodes in the building\n - children: array of floor, wall, door, window nodes\n - position: position in level coordinate system\n `,\n)\n\nexport type GroupNode = z.infer<typeof GroupNode>\n","import dedent from 'dedent'\nimport { z } from 'zod'\nimport { BaseNode, nodeType, objectId } from '../base'\n\nexport const ImageNode = BaseNode.extend({\n id: objectId('image'),\n type: nodeType('reference-image'),\n url: z.string(), // Data URL for image\n position: z.tuple([z.number(), z.number()]).default([0, 0]),\n // Euler rotation [x, y, z] in radians (standard Three.js convention)\n rotation: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),\n scale: z.number().min(0).default(1),\n}).describe(\n dedent`\n Image node - used to represent a image in the building\n - url: url of the image\n `,\n)\n\nexport type ImageNode = z.infer<typeof ImageNode>\n","import dedent from 'dedent'\nimport { z } from 'zod'\nimport { BaseNode, nodeType, objectId } from '../base'\n\nexport const RoofNode = BaseNode.extend({\n id: objectId('roof'),\n type: nodeType('roof'),\n position: z.tuple([z.number(), z.number()]),\n rotation: z.number(),\n size: z.tuple([z.number(), z.number()]),\n height: z.number(),\n leftWidth: z.number(),\n rightWidth: z.number(),\n}).describe(\n dedent`\n Roof node - used to represent a roof in the building\n - position: position of the roof\n - rotation: rotation of the roof\n - size: size of the roof (length, width)\n - height: height of the roof\n - leftWidth: width of the left side of the roof (in meters)\n - rightWidth: width of the right side of the roof (in meters)\n `,\n)\n\nexport type RoofNode = z.infer<typeof RoofNode>\n","import dedent from 'dedent'\nimport { z } from 'zod'\nimport { BaseNode, nodeType, objectId } from '../base'\n\nexport const ScanNode = BaseNode.extend({\n id: objectId('scan'),\n type: nodeType('scan'),\n url: z.string(), // Data URL for 3D model\n // position and rotation are in level coordinate system (scan can be adjusted around any axis)\n position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),\n rotation: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),\n scale: z.number().min(0).default(1),\n}).describe(\n dedent`\n Scan node - used to represent a scan in the building\n - position: position of the scan in level coordinate system\n - rotation: rotation of the scan in level coordinate system\n - scale: scale of the scan\n `,\n)\n\nexport type ScanNode = z.infer<typeof ScanNode>\n","import dedent from 'dedent'\nimport { z } from 'zod'\nimport { BaseNode, nodeType, objectId } from '../base'\nimport { ColumnNode } from './column'\nimport { GroupNode } from './group'\nimport { ImageNode } from './image'\nimport { ItemNode } from './item'\nimport { RoofNode } from './roof'\nimport { ScanNode } from './scan'\nimport { SlabNode } from './slab'\nimport { WallNode } from './wall'\n\nexport const LevelNode = BaseNode.extend({\n id: objectId('level'),\n type: nodeType('level'),\n children: z\n .array(\n z.discriminatedUnion('type', [\n SlabNode,\n WallNode,\n SlabNode,\n ColumnNode,\n GroupNode,\n ItemNode,\n RoofNode,\n ImageNode,\n ScanNode,\n ]),\n )\n .default([]),\n // Specific props\n level: z.number().default(0),\n elevation: z.number().optional(),\n height: z.number().optional(),\n}).describe(\n dedent`\n Level node - used to represent a level in the building\n - children: array of floor, wall, ceiling, roof, item nodes\n - level: level number\n `,\n)\n\nexport type LevelNode = z.infer<typeof LevelNode>\n","import dedent from 'dedent'\nimport { z } from 'zod'\nimport { BaseNode, nodeType, objectId } from '../base'\nimport { LevelNode } from './level'\n\nexport const BuildingNode = BaseNode.extend({\n id: objectId('building'),\n type: nodeType('building'),\n children: z.array(LevelNode).default([LevelNode.parse({})]),\n position: z.tuple([z.number(), z.number()]).default([0, 0]), // (x, z) in site coordinate system (default is [0, 0])\n rotation: z.number().default(0), // Yaw around Y-axis in site coordinate system\n}).describe(\n dedent`\n Building node - used to represent a building\n - children: array of level nodes (each level is a tree of floor and wall nodes) \n - position: position in site coordinate system (default is [0, 0]) anchoring the building to the site\n - rotation: rotation in site coordinate system (default is 0) yaw around Y-axis\n `,\n)\n\nexport type BuildingNode = z.infer<typeof BuildingNode>\n","// lib/scenegraph/schema/nodes/site.ts\n\nimport dedent from 'dedent'\nimport { z } from 'zod'\nimport { BaseNode, nodeType, objectId } from '../base'\nimport { BuildingNode } from './building'\nimport { ItemNode } from './item'\n\n// 2D Polygon\nconst PropertyLineData = z.object({\n type: z.literal('polygon'),\n points: z.array(z.tuple([z.number(), z.number()])),\n})\n\n// 3D Polygon/Mesh\n// const TerrainData = z.object({\n// type: z.literal('terrain'),\n// points: z.array(z.tuple([z.number(), z.number(), z.number()])),\n// })\n\nexport const SiteNode = BaseNode.extend({\n id: objectId('site'),\n type: nodeType('site'),\n position: z.tuple([z.number(), z.number()]).default([0, 0]),\n rotation: z.number().default(0),\n // Specific props\n polygon: PropertyLineData.optional().default({\n type: 'polygon',\n // Default 30x30 square matching GRID_SIZE\n points: [\n [0, 0],\n [30, 0],\n [30, 30],\n [0, 30],\n ],\n }),\n // terrain: TerrainData,\n children: z\n .array(z.discriminatedUnion('type', [BuildingNode, ItemNode]))\n .default([BuildingNode.parse({})]),\n}).describe(\n dedent`\n Site node - used to represent a site\n - position: position in world coordinate system (default is [0, 0])\n - rotation: rotation in world coordinate system (default is 0)\n - polygon: polygon data\n - children: array of building and item nodes\n `,\n)\n\nexport type SiteNode = z.infer<typeof SiteNode>\n","import dedent from 'dedent'\nimport { z } from 'zod'\nimport { BaseNode, nodeType, objectId } from '../base'\n\n// Helper schemas\nconst SegmentTypeSchema = z.enum(['stair', 'landing'])\nconst AttachmentSideSchema = z.enum(['front', 'left', 'right'])\n\nexport const StairSegmentNode = BaseNode.extend({\n id: objectId('stairsegment'),\n type: nodeType('stairsegment'),\n\n // Dimensions\n width: z.number().default(1.0),\n length: z.number().default(1.0), // Horizontal run\n height: z.number().default(2.0), // Vertical rise (0 for landing)\n\n // Logic\n segmentType: SegmentTypeSchema.default('stair'), // 'type' is reserved by BaseNode\n stepCount: z.number().default(10),\n attachmentSide: AttachmentSideSchema.default('front'),\n\n // Appearance\n fillToFloor: z.boolean().default(true),\n thickness: z.number().default(0.25),\n}).describe(\n dedent`\n Stair segment node - used to represent a stair segment in the stair\n `,\n)\nexport type StairSegmentNode = z.infer<typeof StairSegmentNode>\n\nexport const StairNode = BaseNode.extend({\n id: objectId('stair'),\n type: nodeType('stair'),\n position: z.tuple([z.number(), z.number()]).default([0, 0]), // [x, y] on grid (world x, z)\n rotation: z.number().default(0), // rotation around Y\n elevation: z.number().optional(), // Height from floor\n size: z.tuple([z.number(), z.number()]).default([1, 3]), // Bounding box [width, length] roughly\n children: z.array(StairSegmentNode).default([]),\n}).describe(\n dedent`\n Stair node - used to represent a stair in the building\n `,\n)\nexport type StairNode = z.infer<typeof StairNode>\n","import z from 'zod'\n\n// Export all specific node types\nimport { BuildingNode } from './nodes/building'\nimport { CeilingNode } from './nodes/ceiling'\nimport { ColumnNode } from './nodes/column'\nimport { DoorNode } from './nodes/door'\nimport { GroupNode } from './nodes/group'\nimport { ImageNode } from './nodes/image'\nimport { ItemNode } from './nodes/item'\nimport { LevelNode } from './nodes/level'\nimport { RoofNode } from './nodes/roof'\nimport { ScanNode } from './nodes/scan'\nimport { SiteNode } from './nodes/site'\nimport { SlabNode } from './nodes/slab'\nimport { StairNode, StairSegmentNode } from './nodes/stair'\nimport { WallNode } from './nodes/wall'\nimport { WindowNode } from './nodes/window'\n\n// Nodes that should not be included in the AnyNode are: SiteNode\nexport const AnyNode = z.discriminatedUnion('type', [\n BuildingNode,\n LevelNode,\n WallNode,\n DoorNode,\n WindowNode,\n CeilingNode,\n RoofNode,\n ColumnNode,\n GroupNode,\n ItemNode,\n ImageNode,\n ScanNode,\n SlabNode,\n SiteNode,\n StairNode,\n StairSegmentNode,\n])\nexport type AnyNode = z.infer<typeof AnyNode>\nexport type AnyNodeType = AnyNode['type']\nexport type AnyNodeId = AnyNode['id']\n\n// RootNode and EnvironmentNode are not \"nodes\" anymore (no ID, no Type)\nexport type SceneNode = AnyNode\nexport type SceneNodeId = SceneNode['id']\nexport type SceneNodeType = SceneNode['type']\n\nexport const NodeSchemas = {\n site: SiteNode,\n building: BuildingNode,\n level: LevelNode,\n wall: WallNode,\n door: DoorNode,\n window: WindowNode,\n ceiling: CeilingNode,\n roof: RoofNode,\n column: ColumnNode,\n group: GroupNode,\n item: ItemNode,\n image: ImageNode,\n scan: ScanNode,\n slab: SlabNode,\n stair: StairNode,\n stair_segment: StairSegmentNode,\n}\n\nexport const NodeCreateSchemas = {\n site: SiteNode.omit({ id: true, object: true, type: true }),\n building: BuildingNode.omit({ id: true, object: true, type: true }),\n level: LevelNode.omit({ id: true, object: true, type: true }),\n wall: WallNode.omit({ id: true, object: true, type: true }),\n door: DoorNode.omit({ id: true, object: true, type: true }),\n window: WindowNode.omit({ id: true, object: true, type: true }),\n ceiling: CeilingNode.omit({ id: true, object: true, type: true }),\n roof: RoofNode.omit({ id: true, object: true, type: true }),\n column: ColumnNode.omit({ id: true, object: true, type: true }),\n group: GroupNode.omit({ id: true, object: true, type: true }),\n item: ItemNode.omit({ id: true, object: true, type: true }),\n image: ImageNode.omit({ id: true, object: true, type: true }),\n scan: ScanNode.omit({ id: true, object: true, type: true }),\n slab: SlabNode.omit({ id: true, object: true, type: true }),\n stair: StairNode.omit({ id: true, object: true, type: true }),\n stair_segment: StairSegmentNode.omit({ id: true, object: true, type: true }),\n}\n","import dedent from 'dedent'\nimport { z } from 'zod'\nimport { objectId } from './base'\n\nexport const CollectionSchema = z\n .object({\n id: objectId('collection'),\n object: z.literal('collection').default('collection'),\n levelId: z.string().nullable().default(null), // Level this collection is associated with\n name: z.string(),\n nodeIds: z.array(z.string()).default([]),\n // Visual styling\n color: z.string().default('#3b82f6'), // Default blue\n metadata: z.json().optional().default({}),\n })\n .describe(\n dedent`\n Collection schema - a logical grouping of nodes (e.g., electric appliances, furniture set)\n - object: \"collection\"\n - id: collection id\n - levelId: level this collection is associated with (optional)\n - name: collection name\n - nodeIds: array of node ids in this collection\n - color: hex color for visual styling\n - metadata: collection metadata (optional)\n `,\n )\n\nexport type Collection = z.infer<typeof CollectionSchema>\n","import dedent from 'dedent'\nimport { z } from 'zod'\n\nexport const EnvironmentNode = z\n .object({\n object: z.literal('environment').default('environment'),\n latitude: z.number().default(0), // degrees\n longitude: z.number().default(0), // degrees\n altitude: z.number().default(0), // meters above sea level\n address: z.string().optional(), // address of the environment\n timeMode: z.enum(['now', 'custom']).default('now'),\n timePreset: z.enum(['dawn', 'day', 'dusk', 'night', 'now', 'custom']).optional(),\n staticTime: z.number().optional(), // timestamp for custom time\n metadata: z.json().optional().default({}), // metadata for the environment\n })\n .describe(\n dedent`\n Environment config - used to synchronize lighting and sky orientation with the real world sun position, X axis is pointing south, Y is up, Z is east\n - latitude: latitude in degrees\n - longitude: longitude in degrees\n - altitude: altitude in meters above sea level\n - timeMode: 'now' for browser time, 'custom' for staticTime\n - staticTime: timestamp for fixed time\n `,\n )\n\nexport type EnvironmentNode = z.infer<typeof EnvironmentNode>\n","import dedent from 'dedent'\nimport { z } from 'zod'\nimport { EnvironmentNode } from './environment'\nimport { SiteNode } from './nodes/site'\n\nexport const RootNode = z\n .object({\n environment: EnvironmentNode.default(EnvironmentNode.parse({})),\n children: z.array(SiteNode).default([SiteNode.parse({})]),\n })\n .describe(\n dedent`\n Root object - used to represent the root of the scene\n - environment: environment config\n - children: array of site nodes\n `,\n )\n\nexport type RootNode = z.infer<typeof RootNode>\n","import dedent from 'dedent'\nimport { z } from 'zod'\nimport { objectId } from './base'\nimport { CameraSchema } from './camera'\n\nexport const SceneStateOverrideSchema = z.object({\n selectedLevelId: z.string().nullable().optional(),\n levelMode: z.enum(['stacked', 'exploded', 'single-floor']).optional(),\n visibleZoneIds: z.array(z.string()).optional(),\n visibleCollectionIds: z.array(z.string()).optional(),\n timePreset: z.enum(['dawn', 'day', 'dusk', 'night', 'now', 'custom']).optional(),\n staticTime: z.number().optional(),\n})\n\nexport const ViewSchema = z\n .object({\n id: objectId('view'),\n object: z.literal('view').default('view'),\n name: z.string(),\n description: z.string().optional(),\n camera: CameraSchema,\n sceneState: SceneStateOverrideSchema.optional(),\n thumbnail: z.string().optional(), // Data URL or path\n metadata: z.json().optional().default({}),\n })\n .describe(\n dedent`\n View schema - used to represent a saved camera view and scene state\n - object: \"view\"\n - name: view name\n - camera: camera configuration (position, target, mode)\n - sceneState: optional overrides for scene state (level, zones, time)\n `,\n )\n\nexport type View = z.infer<typeof ViewSchema>\nexport type { Camera } from './camera'\nexport type SceneStateOverride = z.infer<typeof SceneStateOverrideSchema>\n","import dedent from 'dedent'\nimport { z } from 'zod'\nimport { objectId } from './base'\n\n// Polygon boundary for zone area - array of [x, z] coordinates\nexport const ZonePolygon = z.array(z.tuple([z.number(), z.number()]))\n\nexport const ZoneSchema = z\n .object({\n id: objectId('zone'),\n object: z.literal('zone').default('zone'),\n levelId: z.string(), // Required - must be attached to a level\n name: z.string(),\n // Polygon boundary - array of [x, z] coordinates defining the zone\n polygon: ZonePolygon,\n // Visual styling\n color: z.string().default('#3b82f6'), // Default blue\n metadata: z.json().optional().default({}),\n })\n .describe(\n dedent`\n Zone schema - a polygon zone attached to a level\n - object: \"zone\"\n - id: zone id\n - levelId: level this zone is attached to\n - name: zone name\n - polygon: array of [x, z] points defining the zone boundary\n - color: hex color for visual styling\n - metadata: zone metadata (optional)\n `,\n )\n\nexport type Zone = z.infer<typeof ZoneSchema>\nexport type ZonePolygon = z.infer<typeof ZonePolygon>\n","import { z } from 'zod'\nimport { CollectionSchema } from './collections'\nimport { RootNode } from './root'\nimport { AnyNode, type NodeCreateSchemas, type NodeSchemas } from './types'\nimport { ViewSchema } from './views'\nimport { ZoneSchema } from './zones'\n\nexport * from '../common-types'\nexport * from './base'\nexport * from './collections'\nexport * from './zones'\nexport * from './environment'\n// Export all specific node types\nexport * from './nodes/building'\nexport * from './nodes/ceiling'\nexport * from './nodes/column'\nexport * from './nodes/door'\nexport * from './nodes/group'\nexport * from './nodes/image'\nexport * from './nodes/item'\nexport * from './nodes/level'\nexport * from './nodes/roof'\nexport * from './nodes/scan'\nexport * from './nodes/site'\nexport * from './nodes/slab'\nexport * from './nodes/stair'\nexport * from './nodes/wall'\nexport * from './nodes/window'\nexport * from './root'\nexport * from './types'\nexport * from './views'\n\nexport const SceneSchema = z.object({\n root: RootNode.default(RootNode.parse({})),\n zones: z.array(ZoneSchema).default([]),\n collections: z.array(CollectionSchema).default([]),\n views: z.array(ViewSchema).default([]),\n metadata: z.json().default({}),\n})\n\nexport type Scene = z.infer<typeof SceneSchema>\n\nexport function initScene(): Scene {\n return SceneSchema.parse({\n root: RootNode.parse({}),\n zones: [],\n collections: [],\n views: [],\n metadata: {},\n })\n}\n\nexport function loadScene(scene: unknown) {\n const result = SceneSchema.safeParse(scene)\n if (!result.success) {\n throw new Error(`Failed to load scene: ${result.error.message}`)\n }\n return result.data as Scene\n}\n\n// Type mapping for extracting specific node types\nexport type NodeTypeMap = {\n [K in keyof typeof NodeSchemas]: z.infer<(typeof NodeSchemas)[K]>\n}\n\nexport type NodeCreateTypeMap = {\n [K in keyof typeof NodeCreateSchemas]: z.infer<(typeof NodeCreateSchemas)[K]>\n}\n\nexport const loadNode = (node: unknown): AnyNode => {\n const result = AnyNode.safeParse(node)\n if (!result.success) {\n throw new Error(`Failed to load node: ${result.error.message}`)\n }\n return result.data as AnyNode\n}\n","import { produce } from 'immer'\nimport {\n type AnyNode,\n type AnyNodeId,\n type AnyNodeType,\n NodeSchemas,\n type SceneNode,\n type SceneNodeId,\n type SceneNodeType,\n} from './schema/types'\nimport { type Zone, initScene, type NodeCreateTypeMap, type Scene, type View } from './schema'\n\n// Re-export from schema that are used elsewhere\nexport type {\n AnyNode,\n AnyNodeId,\n AnyNodeType,\n SceneNode,\n SceneNodeId,\n SceneNodeType,\n} from './schema/types'\n// ============================================================================\n// Scene Graph Index Types\n// ============================================================================\n\nexport type byIdNodeIndex = {\n id: SceneNodeId\n type: SceneNodeType\n path: (string | number)[]\n parent: SceneNodeId | null\n children: SceneNodeId[]\n levelId: SceneNodeId | null\n buildingId: SceneNodeId | null\n siteId: SceneNodeId | null\n isPreview: boolean\n}\n\nexport type NodeTreeIndex = {\n byId: Map<SceneNodeId, byIdNodeIndex>\n byType: Map<SceneNodeType, Set<SceneNodeId>>\n byLevel: Map<SceneNodeId, Set<SceneNodeId>>\n byBuilding: Map<SceneNodeId, Set<SceneNodeId>>\n bySite: Map<SceneNodeId, Set<SceneNodeId>>\n previewIds: Set<SceneNodeId>\n}\n\n// ============================================================================\n// Traversal & Indexing\n// ============================================================================\n\n/**\n * Check if a value looks like a node (has type and id properties)\n */\nfunction isNodeLike(value: unknown): value is SceneNode {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as any).object === 'node' &&\n 'type' in value &&\n 'id' in value\n )\n}\n\nexport const buildNodeTreeIndex = (scene: Scene): NodeTreeIndex => {\n const byId: NodeTreeIndex['byId'] = new Map()\n const byType: NodeTreeIndex['byType'] = new Map()\n const byLevel: NodeTreeIndex['byLevel'] = new Map()\n const byBuilding: NodeTreeIndex['byBuilding'] = new Map()\n const bySite: NodeTreeIndex['bySite'] = new Map()\n const previewIds: NodeTreeIndex['previewIds'] = new Set()\n\n function ensureSet<K>(map: Map<K, Set<SceneNodeId>>, key: K) {\n if (!map.has(key)) {\n map.set(key, new Set())\n }\n return map.get(key)!\n }\n\n function visitNode(\n node: SceneNode,\n context: {\n parentId: SceneNodeId | null\n path: (string | number)[]\n levelId: SceneNodeId | null\n buildingId: SceneNodeId | null\n siteId: SceneNodeId | null\n },\n ) {\n // Determine context for current node and children\n const levelId = node.type === 'level' ? node.id : context.levelId\n const buildingId = node.type === 'building' ? node.id : context.buildingId\n const siteId = node.type === 'site' ? node.id : context.siteId\n\n // Collect children\n const childIds: SceneNodeId[] = []\n const isPreview = Boolean((node as { editor?: { preview?: boolean } }).editor?.preview)\n\n if ('children' in node && Array.isArray(node.children)) {\n // Verify children array\n const children = node.children as SceneNode[]\n children.forEach((child, index) => {\n childIds.push(child.id)\n visitNode(child, {\n parentId: node.id,\n path: [...context.path, 'children', index],\n levelId,\n buildingId,\n siteId,\n })\n })\n }\n\n // Index by id\n const meta: byIdNodeIndex = {\n id: node.id,\n type: node.type,\n path: context.path,\n parent: context.parentId,\n children: childIds,\n levelId,\n buildingId,\n siteId,\n isPreview,\n }\n byId.set(node.id, meta)\n\n if (levelId) {\n ensureSet(byLevel, levelId).add(node.id)\n }\n if (buildingId) {\n ensureSet(byBuilding, buildingId).add(node.id)\n }\n if (siteId) {\n ensureSet(bySite, siteId).add(node.id)\n }\n\n if (isPreview) {\n previewIds.add(node.id)\n }\n\n // Index by type\n const type = node.type\n if (!byType.has(type)) {\n byType.set(type, new Set())\n }\n byType.get(type)?.add(node.id)\n }\n\n // Start traversal from sites (children of root)\n // Root structure: { children: SiteNode[] }\n const sites = scene.root.children\n\n sites.forEach((site, index) => {\n visitNode(site, {\n parentId: null,\n path: ['root', 'children', index],\n levelId: null,\n buildingId: null,\n siteId: null,\n })\n })\n\n return { byId, byType, byLevel, byBuilding, bySite, previewIds }\n}\n\n// Alias for backward compatibility\nexport const buildNodeIndex = buildNodeTreeIndex\n\n// ============================================================================\n// Path Operations\n// ============================================================================\n\n/**\n * Get a node from the scene by following a path\n */\nexport function getNodeByPath(\n scene: Scene,\n path: (string | number)[],\n nodeType?: AnyNodeType,\n): AnyNode | null {\n let current: unknown = scene\n\n for (const segment of path) {\n if (typeof current !== 'object' || current === null) {\n return null\n }\n\n if (typeof segment === 'number') {\n if (!Array.isArray(current)) return null\n current = current[segment]\n } else {\n current = (current as Record<string, unknown>)[segment]\n }\n }\n\n const node = isNodeLike(current) ? current : null\n\n // If a specific type was requested, validate it\n if (nodeType !== undefined && node !== null) {\n return node.type === nodeType ? node : null\n }\n\n return node\n}\n\n/**\n * Update a node in the scene by path using Immer\n */\nexport const updateNodeAtPath = (\n scene: Scene,\n path: (string | number)[],\n updater: (node: SceneNode) => void,\n): Scene => {\n if (path.length === 0) return scene\n\n return produce(scene, (draft) => {\n // Use 'any' to avoid \"Type instantiation is excessively deep\" error\n // This is a known limitation with immer's Draft type and recursive structures\n const node = getNodeByPath(draft as any, path)\n if (node) {\n updater(node)\n }\n })\n}\n\nconst removeNodeAtPath = (scene: Scene, path: (string | number)[]): Scene => {\n if (path.length === 0) {\n return scene\n }\n\n return produce(scene, (draft) => {\n let cursor: unknown = draft\n for (let i = 0; i < path.length - 1; i += 1) {\n const key = path[i]\n if (typeof cursor !== 'object' || cursor === null) {\n return\n }\n\n if (Array.isArray(cursor) && typeof key === 'number') {\n cursor = cursor[key]\n } else if (!Array.isArray(cursor) && typeof key === 'string') {\n cursor = (cursor as Record<string, unknown>)[key]\n } else {\n return\n }\n }\n\n if (typeof cursor !== 'object' || cursor === null) {\n return\n }\n\n const container = cursor as Record<string, unknown> | unknown[]\n const lastKey = path[path.length - 1]\n if (Array.isArray(container) && typeof lastKey === 'number') {\n container.splice(lastKey, 1)\n } else if (!Array.isArray(container) && typeof lastKey === 'string') {\n delete container[lastKey]\n }\n })\n}\n\nconst addNodeAtPath = (scene: Scene, path: (string | number)[], node: SceneNode): Scene => {\n return produce(scene, (draft) => {\n let cursor: unknown = draft\n\n // Traverse to the parent container\n for (const key of path) {\n if (typeof cursor !== 'object' || cursor === null) {\n return\n }\n if (Array.isArray(cursor) && typeof key === 'number') {\n cursor = cursor[key]\n } else if (!Array.isArray(cursor) && typeof key === 'string') {\n cursor = (cursor as Record<string, unknown>)[key]\n }\n }\n\n // Cursor should now be the parent node (or root container)\n const parent = cursor as Record<string, unknown>\n\n if (!parent.children) {\n parent.children = []\n }\n\n if (Array.isArray(parent.children)) {\n parent.children.unshift(node)\n }\n })\n}\n\n// ============================================================================\n// Scene Graph Helper Utilities\n// ============================================================================\n\nexport const getNodeMeta = (index: NodeTreeIndex, nodeId: SceneNodeId): byIdNodeIndex | null =>\n index.byId.get(nodeId) ?? null\n\nexport const getParentId = (index: NodeTreeIndex, nodeId: SceneNodeId): SceneNodeId | null =>\n index.byId.get(nodeId)?.parent ?? null\n\nexport const getAncestorChain = (index: NodeTreeIndex, nodeId: SceneNodeId): byIdNodeIndex[] => {\n const chain: byIdNodeIndex[] = []\n let current = index.byId.get(nodeId)\n\n while (current?.parent) {\n const parentMeta = index.byId.get(current.parent)\n if (!parentMeta) {\n break\n }\n chain.push(parentMeta)\n current = parentMeta\n }\n\n return chain\n}\n\nexport const getLevelIdForNode = (index: NodeTreeIndex, nodeId: SceneNodeId): SceneNodeId | null =>\n index.byId.get(nodeId)?.levelId ?? null\n\nexport const listNodeIdsByLevel = (\n index: NodeTreeIndex,\n levelId: SceneNodeId,\n types?: SceneNodeType[],\n): SceneNodeId[] => {\n const ids = index.byLevel.get(levelId)\n if (!ids) {\n return []\n }\n\n if (!types || types.length === 0) {\n return Array.from(ids)\n }\n\n const typeSet = new Set(types)\n return Array.from(ids).filter((nodeId) => {\n const meta = index.byId.get(nodeId)\n return meta ? typeSet.has(meta.type) : false\n })\n}\n\nexport const listChildrenIds = (index: NodeTreeIndex, parentId: SceneNodeId): SceneNodeId[] =>\n index.byId.get(parentId)?.children ?? []\n\nexport const listChildrenIdsOfType = (\n index: NodeTreeIndex,\n parentId: SceneNodeId,\n types?: SceneNodeType[],\n): SceneNodeId[] => {\n const children = listChildrenIds(index, parentId)\n if (!types || types.length === 0) {\n return children\n }\n const typeSet = new Set(types)\n return children.filter((childId) => {\n const meta = index.byId.get(childId)\n return meta ? typeSet.has(meta.type) : false\n })\n}\n\nexport const listPreviewNodeIds = (index: NodeTreeIndex): SceneNodeId[] =>\n Array.from(index.previewIds)\n\nexport const isPreviewNode = (index: NodeTreeIndex, nodeId: SceneNodeId): boolean =>\n index.previewIds.has(nodeId)\n\n// ============================================================================\n// SceneGraph Class\n// ============================================================================\n\ntype SceneGraphOptions = {\n index?: NodeTreeIndex | null\n onChange?: (nextScene: Scene, nextIndex: NodeTreeIndex) => void\n}\n\ntype NodeVisitor = (handle: SceneNodeHandle) => void\n\nconst toArray = <T>(value: Iterable<T> | undefined): T[] => {\n if (!value) {\n return []\n }\n return Array.from(value)\n}\n\nexport class SceneGraph {\n private _scene: Scene\n private _index: NodeTreeIndex\n private readonly onChange?: (nextScene: Scene, nextIndex: NodeTreeIndex) => void\n\n constructor(scene?: Scene, options?: SceneGraphOptions) {\n this._scene = scene ?? initScene()\n this._index = options?.index ?? buildNodeTreeIndex(this._scene)\n this.onChange = options?.onChange\n }\n\n get scene() {\n return this._scene\n }\n\n get index() {\n return this._index\n }\n\n get root() {\n return this._scene.root\n }\n\n get size() {\n return this._index.byId.size\n }\n\n static init() {\n return new SceneGraph(initScene())\n }\n\n getNodeById<T extends AnyNodeType>(id: SceneNodeId): SceneNodeHandle<AnyNode & { type: T }> | null\n getNodeById(id: SceneNodeId): SceneNodeHandle | null\n getNodeById(id: SceneNodeId) {\n const meta = this._index.byId.get(id)\n if (!meta) {\n return null\n }\n const node = getNodeByPath(this._scene, meta.path)\n if (!node) {\n return null\n }\n return new SceneNodeHandle(this, node, meta)\n }\n\n getNodesByType<T extends AnyNodeType>(type: T): SceneNodeHandle<AnyNode & { type: T }>[] {\n const ids = this._index.byType.get(type)\n return toArray(ids)\n .map((id) => this.getNodeById<T>(id))\n .filter((value): value is SceneNodeHandle<AnyNode & { type: T }> => value !== null)\n }\n\n getAllNodes() {\n const handles: SceneNodeHandle[] = []\n this._index.byId.forEach((_, id) => {\n const handle = this.getNodeById(id)\n if (handle) {\n handles.push(handle)\n }\n })\n return handles\n }\n\n get nodes() {\n return {\n find: (query: {\n type?: AnyNodeType\n levelId?: SceneNodeId\n buildingId?: SceneNodeId\n siteId?: SceneNodeId\n }) => {\n let candidateIds: Set<SceneNodeId> | null = null\n let criteriaCount = 0\n\n const applyCriteria = (ids: Set<SceneNodeId> | undefined) => {\n criteriaCount++\n if (!ids) return false // No matches for this criterion\n\n if (candidateIds === null) {\n candidateIds = new Set(ids)\n } else {\n // Intersect\n for (const id of candidateIds) {\n if (!ids.has(id)) {\n candidateIds.delete(id)\n }\n }\n }\n\n return candidateIds.size > 0\n }\n\n if (query.type && !applyCriteria(this._index.byType.get(query.type))) {\n return []\n }\n\n if (query.levelId && !applyCriteria(this._index.byLevel.get(query.levelId))) {\n return []\n }\n\n if (query.buildingId && !applyCriteria(this._index.byBuilding.get(query.buildingId))) {\n return []\n }\n\n if (query.siteId && !applyCriteria(this._index.bySite.get(query.siteId))) {\n return []\n }\n\n if (criteriaCount === 0) {\n // No criteria provided, return all nodes\n return this.getAllNodes()\n }\n\n if (!candidateIds || (candidateIds as Set<SceneNodeId>).size === 0) {\n return []\n }\n\n return toArray(candidateIds as Set<SceneNodeId>)\n .map((id) => this.getNodeById(id))\n .filter((value): value is SceneNodeHandle => value !== null)\n },\n\n create: (node: AnyNode, parentId?: SceneNodeId) => {\n // If no parentId, assume adding to site (if node is building) or root (if node is site)\n // But root structure is fixed: root -> children (sites).\n\n let path: (string | number)[] = []\n\n if (parentId) {\n const parentMeta = this._index.byId.get(parentId)\n if (!parentMeta) {\n throw new Error(`Parent node not found: ${parentId}`)\n }\n path = parentMeta.path\n } else if (node.type === 'site') {\n path = ['root']\n } else {\n throw new Error('Parent ID required for non-site nodes')\n }\n\n const nextScene = addNodeAtPath(this._scene, path, node)\n this.updateState(nextScene)\n\n return this.getNodeById(node.id)\n },\n }\n }\n\n get views() {\n return {\n all: () => this._scene.views,\n get: (id: string) => this._scene.views.find((v) => v.id === id),\n add: (view: View) => {\n const nextScene = produce(this._scene, (draft) => {\n draft.views.push(view as any)\n })\n this.updateState(nextScene)\n },\n update: (id: string, updater: (view: View) => void) => {\n const nextScene = produce(this._scene, (draft) => {\n const view = draft.views.find((v) => v.id === id)\n if (view) {\n updater(view as any)\n }\n })\n this.updateState(nextScene)\n },\n delete: (id: string) => {\n const nextScene = produce(this._scene, (draft) => {\n const index = draft.views.findIndex((v) => v.id === id)\n if (index !== -1) {\n draft.views.splice(index, 1)\n }\n })\n this.updateState(nextScene)\n },\n }\n }\n\n get zones() {\n return {\n all: () => this._scene.zones,\n get: (id: string) => this._scene.zones.find((c) => c.id === id),\n add: (zone: Zone) => {\n const nextScene = produce(this._scene, (draft) => {\n draft.zones.push(zone as any)\n })\n this.updateState(nextScene)\n },\n update: (id: string, updater: (zone: Zone) => void) => {\n const nextScene = produce(this._scene, (draft) => {\n const zone = draft.zones.find((c) => c.id === id)\n if (zone) {\n updater(zone as any)\n }\n })\n this.updateState(nextScene)\n },\n delete: (id: string) => {\n const nextScene = produce(this._scene, (draft) => {\n const index = draft.zones.findIndex((c) => c.id === id)\n if (index !== -1) {\n draft.zones.splice(index, 1)\n }\n })\n this.updateState(nextScene)\n },\n }\n }\n\n traverse(visitor: NodeVisitor) {\n this._index.byId.forEach((_, id) => {\n const handle = this.getNodeById(id)\n if (handle) {\n visitor(handle)\n }\n })\n }\n\n private updateState(nextScene: Scene) {\n if (nextScene === this._scene) return\n this._scene = nextScene\n // Cast to any to avoid \"excessively deep\" error with recursive Zod types\n this._index = buildNodeTreeIndex(nextScene as any)\n if (this.onChange) {\n this.onChange(nextScene as any, this._index)\n }\n }\n\n updateNode(id: SceneNodeId, updates: Partial<AnyNode>) {\n const meta = this._index.byId.get(id)\n if (!meta) {\n return\n }\n\n const nextScene = updateNodeAtPath(this._scene, meta.path, (node) => {\n Object.assign(node, updates)\n })\n\n this.updateState(nextScene)\n }\n\n deleteNode(id: SceneNodeId) {\n const meta = this._index.byId.get(id)\n if (!meta) {\n return\n }\n\n const nextScene = removeNodeAtPath(this._scene, meta.path)\n this.updateState(nextScene)\n }\n\n [Symbol.for('nodejs.util.inspect.custom')]() {\n return `SceneGraph { nodes: ${this.size} }`\n }\n}\n\ntype SceneNodeMeta = byIdNodeIndex\n\nexport class SceneNodeHandle<T extends AnyNode = AnyNode> {\n private readonly graph: SceneGraph\n private readonly _id: SceneNodeId\n\n constructor(graph: SceneGraph, node: SceneNode, _meta: SceneNodeMeta) {\n this.graph = graph\n this._id = node.id\n }\n\n private get meta() {\n const meta = this.graph.index.byId.get(this._id)\n if (!meta) {\n throw new Error(`Node ${this._id} is no longer in the scene graph`)\n }\n return meta\n }\n\n private get node() {\n const meta = this.meta\n const node = getNodeByPath(this.graph.scene, meta.path)\n if (!node) {\n throw new Error(`Node ${this._id} not found at path ${meta.path.join('.')}`)\n }\n return node as T\n }\n\n get id() {\n return this._id\n }\n\n get type() {\n return this.meta.type as T extends { type: infer U } ? U : never\n }\n\n get value() {\n return this.node\n }\n\n get path() {\n return [...this.meta.path]\n }\n\n data() {\n return this.node\n }\n\n parent() {\n const parentId = this.meta.parent\n if (!parentId) {\n return null\n }\n\n return this.graph.getNodeById(parentId)\n }\n\n children(filter?: (child: SceneNodeHandle) => boolean) {\n const handles = this.meta.children\n .map((childId) => this.graph.getNodeById(childId))\n .filter((value): value is SceneNodeHandle => value !== null)\n\n if (filter) {\n return handles.filter(filter)\n }\n\n return handles\n }\n\n update(patch: Partial<T>) {\n this.graph.updateNode(this._id, patch)\n }\n\n delete() {\n this.graph.deleteNode(this._id)\n }\n\n create<K extends keyof NodeCreateTypeMap>(\n type: K,\n data: Omit<NodeCreateTypeMap[K], 'id' | 'object' | 'type' | 'parentId' | 'children'>,\n ) {\n const schema = NodeSchemas[type]\n if (!schema) {\n throw new Error(`Unknown node type: ${type}`)\n }\n // Parse will handle defaults (like id generation)\n const node = schema.parse(data) as SceneNode\n return this.graph.nodes.create(node, this._id)\n }\n\n toJSON() {\n return this.node\n }\n}\n","import type { AnyNode, SceneNode } from './scenegraph/schema/index'\n\n/**\n * Bounding box in 2D space (X, Z coordinates)\n */\nexport interface BoundingBox {\n minX: number\n minZ: number\n maxX: number\n maxZ: number\n}\n\ntype NodeProvider = (id: string) => SceneNode | null\n\n/**\n * Calculate absolute world position by traversing parent chain\n * Accumulates parent positions up to the root (level)\n */\nfunction calculateAbsolutePosition(\n node: SceneNode,\n getNode: NodeProvider,\n): [number, number] | null {\n // For nodes without position\n if (!('position' in node && Array.isArray(node.position))) {\n return null\n }\n\n let [absoluteX, absoluteZ] = node.position as [number, number]\n\n // Traverse up parent chain and accumulate positions\n let currentNode: SceneNode = node\n while (currentNode.parentId) {\n const parent = getNode(currentNode.parentId)\n if (!parent) break\n\n if ('position' in parent && Array.isArray(parent.position)) {\n const [px, pz] = parent.position as [number, number]\n absoluteX += px\n absoluteZ += pz\n }\n\n currentNode = parent\n }\n\n return [absoluteX, absoluteZ]\n}\n\n/**\n * Calculate absolute world position for a point (x, z) by adding parent positions\n */\nfunction calculateAbsolutePoint(\n point: { x: number; z: number },\n node: SceneNode,\n getNode: NodeProvider,\n): { x: number; z: number } {\n let absoluteX = point.x\n let absoluteZ = point.z\n\n // Traverse up parent chain and accumulate positions\n let currentNode: SceneNode = node\n while (currentNode.parentId) {\n const parent = getNode(currentNode.parentId)\n if (!parent) break\n\n if ('position' in parent && Array.isArray(parent.position)) {\n const [px, pz] = parent.position as [number, number]\n absoluteX += px\n absoluteZ += pz\n }\n\n currentNode = parent\n }\n\n return { x: absoluteX, z: absoluteZ }\n}\n\n/**\n * Calculate bounding box for a node based on its type\n * Uses absolute world coordinates by traversing parent chain\n * Returns null for nodes that don't have spatial bounds (like levels)\n */\nexport function calculateNodeBounds(node: SceneNode, getNode: NodeProvider): BoundingBox | null {\n const type = node.type as string\n\n switch (type) {\n case 'wall': {\n const wallNode = node as any\n if (wallNode.start && wallNode.end) {\n // Convert tuple [x, z] to object { x, z } for calculateAbsolutePoint\n const startPoint = { x: wallNode.start[0], z: wallNode.start[1] }\n const endPoint = { x: wallNode.end[0], z: wallNode.end[1] }\n\n // Calculate absolute positions for start and end (in case wall is nested)\n const absoluteStart = calculateAbsolutePoint(startPoint, node, getNode)\n const absoluteEnd = calculateAbsolutePoint(endPoint, node, getNode)\n\n const minX = Math.min(absoluteStart.x, absoluteEnd.x)\n const maxX = Math.max(absoluteStart.x, absoluteEnd.x)\n const minZ = Math.min(absoluteStart.z, absoluteEnd.z)\n const maxZ = Math.max(absoluteStart.z, absoluteEnd.z)\n return { minX, maxX, minZ, maxZ }\n }\n return null\n }\n\n case 'slab':\n case 'ceiling': {\n const areaNode = node as any\n if (areaNode.size) {\n const absolutePos = calculateAbsolutePosition(node, getNode)\n if (!absolutePos) return null\n\n const [x, z] = absolutePos\n const [width, depth] = areaNode.size\n return {\n minX: x,\n maxX: x + width,\n minZ: z,\n maxZ: z + depth,\n }\n }\n return null\n }\n\n case 'column': {\n const absolutePos = calculateAbsolutePosition(node, getNode)\n if (!absolutePos) return null\n\n const [x, z] = absolutePos\n const radius = 0.25 // Approximate column radius\n return {\n minX: x - radius,\n maxX: x + radius,\n minZ: z - radius,\n maxZ: z + radius,\n }\n }\n\n case 'door':\n case 'window': {\n const absolutePos = calculateAbsolutePosition(node, getNode)\n if (!absolutePos) return null\n\n const openingNode = node as any\n const [x, z] = absolutePos\n const width = openingNode.width || 1\n const halfWidth = width / 2\n return {\n minX: x - halfWidth,\n maxX: x + halfWidth,\n minZ: z - 0.2,\n maxZ: z + 0.2,\n }\n }\n\n case 'roof': {\n // For roof segments, we'd need to iterate through children\n // For now, return null (can be implemented later if needed)\n return null\n }\n\n case 'reference-image':\n case 'scan': {\n const absolutePos = calculateAbsolutePosition(node, getNode)\n if (!absolutePos) return null\n\n const mediaNode = node as any\n const [x, z] = absolutePos\n const scale = mediaNode.scale || 1\n const size = 2 * scale // Approximate size\n return {\n minX: x - size,\n maxX: x + size,\n minZ: z - size,\n maxZ: z + size,\n }\n }\n\n case 'item':\n case 'stair': {\n const absolutePos = calculateAbsolutePosition(node, getNode)\n if (!absolutePos) return null\n\n const gridNode = node as any\n const [x, z] = absolutePos\n const [width, depth] = gridNode.size || [1, 1]\n return {\n minX: x,\n maxX: x + width,\n minZ: z,\n maxZ: z + depth,\n }\n }\n\n case 'group': {\n // Groups don't have their own size - calculate bounds from children\n const groupNode = node as any\n if (!groupNode.children || groupNode.children.length === 0) {\n return null\n }\n\n // Calculate the union of all children's bounds\n // Note: calculateNodeBounds already returns bounds in absolute world coordinates\n // because it calls calculateAbsolutePosition which traverses the parent chain\n let minX = Number.POSITIVE_INFINITY\n let maxX = Number.NEGATIVE_INFINITY\n let minZ = Number.POSITIVE_INFINITY\n let maxZ = Number.NEGATIVE_INFINITY\n\n for (const child of groupNode.children) {\n const childBounds = calculateNodeBounds(child, getNode)\n if (childBounds) {\n // Child bounds are already in absolute coordinates, just take the union\n minX = Math.min(minX, childBounds.minX)\n maxX = Math.max(maxX, childBounds.maxX)\n minZ = Math.min(minZ, childBounds.minZ)\n maxZ = Math.max(maxZ, childBounds.maxZ)\n }\n }\n\n // If no valid children bounds were found, return null\n if (minX === Number.POSITIVE_INFINITY) {\n return null\n }\n\n return { minX, maxX, minZ, maxZ }\n }\n\n default:\n return null\n }\n}\n\n/**\n * 2D Spatial Grid for efficient spatial queries\n *\n * Maintains separate grids for each level, using a cell-based spatial partitioning\n * scheme for fast neighbor and intersection queries.\n */\nexport class SpatialGrid {\n private readonly cellSize: number\n private readonly grids: Map<string, Map<string, Set<string>>> // levelId -> cellKey -> nodeIds\n private readonly nodeBounds: Map<string, { levelId: string; bounds: BoundingBox }> // nodeId -> metadata\n\n constructor(cellSize = 1) {\n this.cellSize = cellSize\n this.grids = new Map()\n this.nodeBounds = new Map()\n }\n\n /**\n * Get the cell key for a given world position\n */\n private getCellKey(x: number, z: number): string {\n const cellX = Math.floor(x / this.cellSize)\n const cellZ = Math.floor(z / this.cellSize)\n return `${cellX},${cellZ}`\n }\n\n /**\n * Get all cell keys that a bounding box spans\n */\n private getCellsForBounds(bounds: BoundingBox): string[] {\n const cells: string[] = []\n\n const minCellX = Math.floor(bounds.minX / this.cellSize)\n const minCellZ = Math.floor(bounds.minZ / this.cellSize)\n const maxCellX = Math.floor(bounds.maxX / this.cellSize)\n const maxCellZ = Math.floor(bounds.maxZ / this.cellSize)\n\n for (let x = minCellX; x <= maxCellX; x++) {\n for (let z = minCellZ; z <= maxCellZ; z++) {\n cells.push(`${x},${z}`)\n }\n }\n\n return cells\n }\n\n /**\n * Ensure a grid exists for the given level\n */\n private ensureLevelGrid(levelId: string): Map<string, Set<string>> {\n if (!this.grids.has(levelId)) {\n this.grids.set(levelId, new Map())\n }\n return this.grids.get(levelId)!\n }\n\n /**\n * Add or update a node in the spatial grid\n * Automatically handles moving nodes between cells\n */\n updateNode(nodeId: string, levelId: string, node: SceneNode, getNode: NodeProvider): void {\n // Calculate bounds for this node (using absolute world coordinates)\n const bounds = calculateNodeBounds(node, getNode)\n if (!bounds) {\n // Node doesn't have spatial bounds, skip\n return\n }\n\n // Remove from old position if exists\n const existing = this.nodeBounds.get(nodeId)\n if (existing) {\n this.removeNode(nodeId)\n }\n\n // Add to new position\n const grid = this.ensureLevelGrid(levelId)\n const cells = this.getCellsForBounds(bounds)\n\n for (const cellKey of cells) {\n if (!grid.has(cellKey)) {\n grid.set(cellKey, new Set())\n }\n grid.get(cellKey)!.add(nodeId)\n }\n\n // Store bounds for this node\n this.nodeBounds.set(nodeId, { levelId, bounds })\n }\n\n /**\n * Remove a node from the spatial grid\n */\n removeNode(nodeId: string): void {\n const existing = this.nodeBounds.get(nodeId)\n if (!existing) return\n\n const { levelId, bounds } = existing\n const grid = this.grids.get(levelId)\n if (!grid) return\n\n const cells = this.getCellsForBounds(bounds)\n\n for (const cellKey of cells) {\n const cellNodes = grid.get(cellKey)\n if (cellNodes) {\n cellNodes.delete(nodeId)\n // Clean up empty cells\n if (cellNodes.size === 0) {\n grid.delete(cellKey)\n }\n }\n }\n\n this.nodeBounds.delete(nodeId)\n }\n\n /**\n * Query all nodes that intersect with the given bounding box\n * Returns only nodes that actually intersect (not just in same cells)\n */\n query(levelId: string, bounds: BoundingBox): Set<string> {\n const grid = this.grids.get(levelId)\n if (!grid) return new Set()\n\n const cells = this.getCellsForBounds(bounds)\n const candidates = new Set<string>()\n\n // Gather all candidates from cells\n for (const cellKey of cells) {\n const cellNodes = grid.get(cellKey)\n if (cellNodes) {\n for (const nodeId of cellNodes) {\n candidates.add(nodeId)\n }\n }\n }\n\n // Filter to only nodes that actually intersect\n const result = new Set<string>()\n for (const nodeId of candidates) {\n const nodeData = this.nodeBounds.get(nodeId)\n if (nodeData && this.boundsIntersect(bounds, nodeData.bounds)) {\n result.add(nodeId)\n }\n }\n\n return result\n }\n\n /**\n * Query all nodes that contain the given point\n */\n queryPoint(levelId: string, point: [number, number]): Set<string> {\n const grid = this.grids.get(levelId)\n if (!grid) return new Set()\n\n const [x, z] = point\n const cellKey = this.getCellKey(x, z)\n const cellNodes = grid.get(cellKey)\n if (!cellNodes) return new Set()\n\n // Filter to only nodes that actually contain the point\n const result = new Set<string>()\n for (const nodeId of cellNodes) {\n const nodeData = this.nodeBounds.get(nodeId)\n if (nodeData && this.pointInBounds(point, nodeData.bounds)) {\n result.add(nodeId)\n }\n }\n\n return result\n }\n\n /**\n * Query all nodes that intersect with the given rectangle\n */\n queryRect(\n levelId: string,\n min: [number, number],\n max: [number, number],\n ): string[] {\n const grid = this.grids.get(levelId)\n if (!grid) return []\n\n const [minX, minZ] = min\n const [maxX, maxZ] = max\n\n const queryBounds: BoundingBox = { minX, maxX, minZ, maxZ }\n\n // Get all cells that might intersect the query rect\n const minCellX = Math.floor(minX / this.cellSize)\n const maxCellX = Math.floor(maxX / this.cellSize)\n const minCellZ = Math.floor(minZ / this.cellSize)\n const maxCellZ = Math.floor(maxZ / this.cellSize)\n\n const candidates = new Set<string>()\n\n for (let cx = minCellX; cx <= maxCellX; cx++) {\n for (let cz = minCellZ; cz <= maxCellZ; cz++) {\n const cellKey = `${cx},${cz}`\n const cellNodes = grid.get(cellKey)\n if (cellNodes) {\n for (const nodeId of cellNodes) {\n candidates.add(nodeId)\n }\n }\n }\n }\n\n // Filter to only nodes that actually intersect the query rect\n const result: string[] = []\n for (const nodeId of candidates) {\n const nodeData = this.nodeBounds.get(nodeId)\n if (nodeData && this.boundsIntersect(queryBounds, nodeData.bounds)) {\n result.push(nodeId)\n }\n }\n\n return result\n }\n\n /**\n * Check if two bounding boxes intersect\n */\n private boundsIntersect(a: BoundingBox, b: BoundingBox): boolean {\n return !(a.maxX < b.minX || a.minX > b.maxX || a.maxZ < b.minZ || a.minZ > b.maxZ)\n }\n\n /**\n * Check if a point is inside a bounding box\n */\n private pointInBounds(point: [number, number], bounds: BoundingBox): boolean {\n const [x, z] = point\n return x >= bounds.minX && x <= bounds.maxX && z >= bounds.minZ && z <= bounds.maxZ\n }\n\n /**\n * Get the bounds of a node (if it exists in the grid)\n * Returns null if the node is not in the grid\n */\n getNodeBounds(nodeId: string): BoundingBox | null {\n const data = this.nodeBounds.get(nodeId)\n return data ? data.bounds : null\n }\n\n /**\n * Get all node IDs in a level (for debugging/testing)\n */\n getNodesInLevel(levelId: string): Set<string> {\n const result = new Set<string>()\n for (const [nodeId, data] of this.nodeBounds) {\n if (data.levelId === levelId) {\n result.add(nodeId)\n }\n }\n return result\n }\n\n /**\n * Clear all data (useful for testing/reset)\n */\n clear(): void {\n this.grids.clear()\n this.nodeBounds.clear()\n }\n}\n","'use client'\n\nimport { del as idbDel, get as idbGet, set as idbSet } from 'idb-keyval'\nimport { enableMapSet, produce } from 'immer'\nimport type * as THREE from 'three'\nimport { GLTFExporter } from 'three/addons/exporters/GLTFExporter.js'\nimport { create } from 'zustand'\nimport { createJSONStorage, persist, type StateStorage } from 'zustand/middleware'\n\n// Enable Map/Set support in Immer\nenableMapSet()\n\nimport { emitter } from '../events'\nimport { handleSimpleClick } from '../building-elements'\nimport { GroupNodesCommand, UngroupNodesCommand } from '../commands'\nimport {\n AddLevelCommand,\n AddNodeCommand,\n BatchDeleteCommand,\n CommandManager,\n DeleteLevelCommand,\n DeleteNodeCommand,\n MoveNodeCommand,\n ReorderLevelsCommand,\n UpdateNodeCommand,\n} from '../commands'\nimport { LevelElevationProcessor } from '../processors'\nimport { LevelHeightProcessor } from '../processors'\nimport { RoomDetectionProcessor } from '../processors'\nimport { VerticalStackingProcessor } from '../processors'\nimport { getLevelIdForNode, SceneGraph, type SceneNodeHandle } from '../scenegraph'\nimport { type Collection, CollectionSchema } from '../scenegraph/schema/collections'\nimport {\n type AnyNode,\n type AnyNodeId,\n BuildingNode,\n initScene,\n RootNode,\n type Scene,\n type SceneNode,\n SiteNode,\n} from '../scenegraph/schema'\nimport { type View, ViewSchema } from '../scenegraph/schema/views'\nimport { type Zone, ZoneSchema } from '../scenegraph/schema/zones'\nimport { calculateNodeBounds, SpatialGrid } from '../spatial-grid'\n\n// Split structure and heavy assets across two IDB keys to avoid rewriting large payloads\ntype AssetMap = Record<string, string>\ntype PersistEnvelope = { state: any; version: number }\n\n/**\n * Extracts heavy asset URLs from root node structure into a separate map.\n */\nfunction extractAssetsFromRoot(root: RootNode): {\n root: RootNode\n assets: AssetMap\n} {\n const assets: AssetMap = {}\n\n const walk = (node: SceneNode): SceneNode => {\n const n = { ...node } as any\n\n if (\n (n.type === 'reference-image' || n.type === 'scan') &&\n typeof n.url === 'string' &&\n n.url.length > 0\n ) {\n assets[n.id] = n.url\n n.url = `asset:${n.id}`\n }\n\n // Generic traversal\n for (const key of Object.keys(n)) {\n const value = n[key]\n if (typeof value === 'object' && value !== null) {\n if ((value as any).object === 'node') {\n n[key] = walk(value)\n } else if (Array.isArray(value)) {\n n[key] = value.map((item: any) =>\n typeof item === 'object' && item !== null && item.object === 'node' ? walk(item) : item,\n )\n }\n }\n }\n return n as SceneNode\n }\n\n // Walk sites\n if (root.children) {\n root.children = root.children.map((site) => walk(site) as SiteNode)\n }\n\n return { root, assets }\n}\n\n/**\n * Injects asset URLs back into root structure from the assets map.\n */\nfunction injectAssetsIntoRoot(root: RootNode, assets: AssetMap): RootNode {\n const walk = (node: SceneNode): SceneNode => {\n const n = { ...node } as any\n\n if (typeof n.url === 'string' && n.url.startsWith('asset:')) {\n const id = n.url.slice('asset:'.length)\n n.url = assets[id] ?? n.url\n }\n\n // Generic traversal\n for (const key of Object.keys(n)) {\n const value = n[key]\n if (typeof value === 'object' && value !== null) {\n if ((value as any).object === 'node') {\n n[key] = walk(value)\n } else if (Array.isArray(value)) {\n n[key] = value.map((item: any) =>\n typeof item === 'object' && item !== null && item.object === 'node' ? walk(item) : item,\n )\n }\n }\n }\n return n as SceneNode\n }\n\n // Walk sites\n if (root.children) {\n root.children = root.children.map((site) => walk(site) as SiteNode)\n }\n\n return root\n}\n\n// Cache for last persisted scene - used to prevent transient scenes from overwriting storage\nlet lastPersistedSceneCache: Scene | null = null\n\n// IndexedDB storage adapter for Zustand persist middleware (split keys)\nconst indexedDBStorage: StateStorage = {\n getItem: async (name: string) => {\n // Read split keys\n const structureRaw = await idbGet<string>(`${name}:structure`)\n // Backwards compatibility: check single key if split key not found\n const raw = structureRaw || (await idbGet<string>(name))\n\n if (!raw) return null\n\n const assetsRaw = (await idbGet<string>(`${name}:assets`)) ?? '{\"assets\":{}}'\n try {\n const env = JSON.parse(raw) as PersistEnvelope\n const { assets } = JSON.parse(assetsRaw) as { assets: AssetMap }\n\n // Handle Scene structure (v3+)\n if (env.state?.scene?.root) {\n env.state.scene.root = injectAssetsIntoRoot(env.state.scene.root as RootNode, assets)\n return JSON.stringify(env)\n }\n\n return JSON.stringify(env)\n } catch (error) {\n console.error('[Storage] Failed to parse storage:', error)\n return null\n }\n },\n\n setItem: async (name: string, value: string) => {\n try {\n const env = JSON.parse(value) as PersistEnvelope\n\n // Check for scene root\n const root = env.state?.scene?.root\n if (!root) {\n // Fallback: store unmodified\n await idbSet(name, value)\n return\n }\n\n // Extract assets from root\n const { root: processedRoot, assets } = extractAssetsFromRoot(root as RootNode)\n\n // Prepare structure to save\n const stateToSave = {\n ...env.state,\n scene: {\n ...env.state.scene,\n root: processedRoot,\n },\n }\n\n const structureToSave = JSON.stringify({\n state: stateToSave,\n version: env.version,\n })\n\n await idbSet(`${name}:structure`, structureToSave)\n\n // Save assets (heavy, only updates when assets change)\n const nextAssets = JSON.stringify({ assets })\n const prevAssets = await idbGet<string>(`${name}:assets`)\n if (prevAssets !== nextAssets) {\n await idbSet(`${name}:assets`, nextAssets)\n }\n } catch (error) {\n console.error('[Storage] Failed to save split keys, falling back:', error)\n await idbSet(name, value)\n }\n },\n\n removeItem: async (name: string) => {\n await idbDel(name)\n await idbDel(`${name}:structure`)\n await idbDel(`${name}:assets`)\n },\n}\n\n// Re-export types needed by components\nexport type {\n AnyNode,\n BaseNode,\n ColumnNode,\n DoorNode,\n GridItem,\n GroupNode,\n ImageNode,\n LevelNode,\n RoofNode,\n ScanNode,\n WallNode,\n WindowNode,\n} from '../scenegraph/schema'\n\n// Using Schema types instead for internal use\nimport type { LevelNode as SchemaLevelNode } from '../scenegraph/schema'\n\n// Editor modes - high-level workflow modes\nexport type EditorMode = 'site' | 'structure' | 'furnish'\n\n// Site mode tools\nexport type SiteTool = 'property-line' | 'building-select'\n\n// Structure mode tools (building elements)\nexport type StructureTool =\n | 'wall'\n | 'room'\n | 'custom-room'\n | 'slab'\n | 'ceiling'\n | 'roof'\n | 'column'\n | 'stair'\n | 'door'\n | 'window'\n | 'zone'\n\n// Furnish mode tools (items and decoration)\nexport type FurnishTool =\n | 'furniture'\n | 'appliance'\n | 'kitchen'\n | 'bathroom'\n | 'outdoor'\n | 'painting'\n\n// Combined tool type (including 'item' for backward compatibility during transition)\nexport type Tool = SiteTool | StructureTool | FurnishTool | 'item'\n\n// Catalog categories for furnish mode items\nexport type CatalogCategory =\n | 'furniture'\n | 'appliance'\n | 'bathroom'\n | 'kitchen'\n | 'outdoor'\n | 'window'\n | 'door'\n\n// Control modes - sub-modes within each editor mode (keeping legacy values for compatibility during transition)\nexport type ControlMode = 'select' | 'edit' | 'delete' | 'build' | 'building' | 'guide' | 'painting'\nexport type CameraMode = 'perspective' | 'orthographic'\nexport type LevelMode = 'stacked' | 'exploded'\nexport type WallMode = 'up' | 'cutaway' | 'down'\nexport type ViewMode = 'full' | 'level'\nexport type ViewerDisplayMode = 'scans' | 'objects'\nexport type PaintMode = 'wall' | 'room'\n\n// Scene source tracking - determines persistence behavior\nexport type SceneSource =\n | { type: 'persisted' } // Default: saved to IndexedDB (editor mode)\n | { type: 'url'; url: string } // Loaded from URL, not persisted (viewer mode)\n | { type: 'slot'; name: string } // Named slot for future multi-project support\n\nexport type AddToCollectionState = {\n isActive: boolean\n nodeIds: string[]\n}\n\nexport type StoreState = {\n // ============================================================================\n // SCENE GRAPH STATE\n // ============================================================================\n scene: Scene\n graph: SceneGraph\n spatialGrid: SpatialGrid\n /** Tracks where the current scene was loaded from - determines persistence behavior */\n sceneSource: SceneSource\n\n // ============================================================================\n // UNDO/REDO\n // ============================================================================\n commandManager: CommandManager\n\n // ============================================================================\n // UI STATE\n // ============================================================================\n currentLevel: number\n selectedFloorId: string | null\n viewMode: ViewMode\n viewerDisplayMode: ViewerDisplayMode\n selectedNodeIds: string[]\n isHelpOpen: boolean\n isJsonInspectorOpen: boolean\n wallsGroupRef: THREE.Group | null\n activeTool: Tool | null\n lastBuildingTool: Tool\n lastCatalogCategory: CatalogCategory | null\n catalogCategory: CatalogCategory | null\n controlMode: ControlMode\n\n // New editor mode system\n editorMode: EditorMode\n selectedBuildingId: string | null\n lastToolByMode: Record<EditorMode, Tool | null>\n cameraMode: CameraMode\n levelMode: LevelMode\n wallMode: WallMode\n movingCamera: boolean\n isManipulatingImage: boolean\n isManipulatingScan: boolean\n handleClear: () => void\n debug: boolean\n\n addToCollectionState: AddToCollectionState\n selectedCollectionId: string | null\n // Zone selection (for editing boundaries)\n selectedZoneId: string | null\n\n selectedItem: {\n category?: CatalogCategory\n name?: string\n modelUrl: string\n scale: [number, number, number]\n size: [number, number]\n position?: [number, number, number]\n rotation?: [number, number, number]\n attachTo?: 'ceiling' | 'wall' | 'wall-side'\n }\n\n // Painting mode\n selectedMaterial: string\n paintMode: PaintMode\n\n // Processors\n verticalStackingProcessor: VerticalStackingProcessor\n levelHeightProcessor: LevelHeightProcessor\n levelElevationProcessor: LevelElevationProcessor\n roomDetectionProcessor: RoomDetectionProcessor\n} & {\n // Operations\n addLevel: (level: Omit<SchemaLevelNode, 'children'>) => void\n deleteLevel: (levelId: string) => void\n reorderLevels: (levels: SchemaLevelNode[]) => void\n selectFloor: (floorId: string | null) => void\n selectZone: (zoneId: string | null) => void\n\n handleNodeSelect: (\n nodeId: string,\n event: { metaKey?: boolean; ctrlKey?: boolean; shiftKey?: boolean },\n ) => void\n\n // Deprecated/Compatibility aliases - mapping to handleNodeSelect/selectedNodeIds\n handleElementSelect: (\n elementId: AnyNodeId,\n event: { metaKey?: boolean; ctrlKey?: boolean; shiftKey?: boolean },\n ) => void\n setSelectedImageIds: (ids: string[]) => void\n setSelectedScanIds: (ids: string[]) => void\n\n setIsHelpOpen: (open: boolean) => void\n setIsJsonInspectorOpen: (open: boolean) => void\n closeSpecialEditors: () => Partial<StoreState>\n setActiveTool: (tool: Tool | null, catalogCategory?: CatalogCategory | null) => void\n setCatalogCategory: (category: CatalogCategory | null) => void\n setControlMode: (mode: ControlMode) => void\n setEditorMode: (mode: EditorMode, buildingId?: string | null) => void\n setCameraMode: (mode: CameraMode) => void\n toggleLevelMode: () => void\n toggleWallMode: () => void\n setViewerDisplayMode: (mode: ViewerDisplayMode) => void\n setMovingCamera: (moving: boolean) => void\n setIsManipulatingImage: (manipulating: boolean) => void\n setIsManipulatingScan: (manipulating: boolean) => void\n setDebug: (debug: boolean) => void\n setSelectedItem: (item: any) => void\n setSelectedMaterial: (material: string) => void\n setPaintMode: (mode: PaintMode) => void\n\n getSelectedElementsSet: () => Set<AnyNodeId>\n getSelectedImageIdsSet: () => Set<string>\n getSelectedScanIdsSet: () => Set<string>\n\n handleExport: () => void\n handleDeleteSelected: () => void\n handleDeleteSelectedElements: () => void\n handleDeleteSelectedImages: () => void\n handleDeleteSelectedScans: () => void\n\n groupSelected: () => void\n ungroupSelected: () => void\n\n serializeLayout: () => any\n loadLayout: (json: any) => void\n /** Load a scene transiently (e.g., from URL) without affecting persisted editor state */\n loadTransientScene: (json: any, sourceUrl?: string) => void\n /** Restore the persisted editor scene from storage */\n restorePersistedScene: () => Promise<void>\n /** Check if current scene is transient (not persisted) */\n isTransientScene: () => boolean\n handleLoadLayout: (file: File) => void\n handleResetToDefault: () => void\n\n undo: () => void\n redo: () => void\n\n // Simplified Node Operations\n toggleNodeVisibility: (nodeId: string) => void\n setNodeOpacity: (nodeId: string, opacity: number) => void\n\n // Helper accessors\n getLevelId: (nodeId: string) => string | null\n getNode: (nodeId: string) => SceneNodeHandle | null\n\n // Generic node operations\n selectNode: (nodeId: string) => void\n addNode: (nodeData: Omit<AnyNode, 'id'>, parentId: string | null) => string\n moveNode: (nodeId: string, parentId: string) => void\n updateNode: (nodeId: string, updates: Partial<AnyNode>, skipUndo?: boolean) => string\n deleteNode: (nodeId: string) => void\n deleteNodes: (nodeIds: string[]) => void\n deletePreviewNodes: () => void\n commitMove: (\n nodeId: string,\n originalData: {\n position: [number, number]\n rotation: number\n start?: [number, number]\n end?: [number, number]\n },\n ) => void\n\n // Zone operations\n addZone: (name: string, levelId: string, polygon: [number, number][]) => Zone\n deleteZone: (zoneId: string) => void\n renameZone: (zoneId: string, name: string) => void\n updateZonePolygon: (zoneId: string, polygon: [number, number][]) => void\n setZoneColor: (zoneId: string, color: string) => void\n\n // Collection operations (logical groupings of nodes)\n selectCollection: (collectionId: string | null) => void\n addCollection: (name: string) => Collection\n deleteCollection: (collectionId: string) => void\n renameCollection: (collectionId: string, name: string) => void\n addNodesToCollection: (collectionId: string, nodeIds: string[]) => void\n removeNodesFromCollection: (collectionId: string, nodeIds: string[]) => void\n startAddToCollection: () => void\n confirmAddToCollection: (collectionId: string) => void\n cancelAddToCollection: () => void\n\n // View operations\n addView: (viewData: Omit<View, 'id' | 'object'>) => void\n deleteView: (viewId: string) => void\n updateView: (viewId: string, updates: Partial<View>) => void\n applyView: (viewId: string) => void\n\n // Transaction operations (for grouping multiple operations into one undo step)\n startTransaction: () => void\n commitTransaction: () => void\n cancelTransaction: () => void\n isTransactionActive: () => boolean\n captureSnapshot: (nodeId: string) => void\n trackCreatedNode: (nodeId: string) => void\n}\n\n/**\n * Rebuild the spatial grid from the scene graph\n */\nfunction rebuildSpatialGrid(spatialGrid: SpatialGrid, graph: SceneGraph): void {\n spatialGrid.clear()\n const getNode = (id: string) => graph.getNodeById(id as AnyNodeId)?.data() ?? null\n\n graph.traverse((handle) => {\n const node = handle.data()\n const levelId = getLevelIdForNode(graph.index, handle.id)\n if (levelId) {\n spatialGrid.updateNode(node.id, levelId, node, getNode)\n }\n })\n}\n\n/**\n * Process all nodes in a level with their spatial neighbors\n */\nfunction processLevel(\n state: {\n spatialGrid: SpatialGrid\n graph: SceneGraph\n verticalStackingProcessor: VerticalStackingProcessor\n levelHeightProcessor: LevelHeightProcessor\n levelElevationProcessor: LevelElevationProcessor\n roomDetectionProcessor: RoomDetectionProcessor\n },\n levelId: string | null,\n): void {\n if (!levelId) return\n\n const levelHandle = state.graph.getNodeById(levelId as AnyNodeId)\n if (!levelHandle || levelHandle.type !== 'level') return\n\n const nodeIds = state.spatialGrid.getNodesInLevel(levelId)\n\n for (const nodeId of nodeIds) {\n const handle = state.graph.getNodeById(nodeId as AnyNodeId)\n if (!handle) continue\n\n const bounds = state.spatialGrid.getNodeBounds(nodeId)\n if (!bounds) continue\n\n const neighborIds = state.spatialGrid.query(levelId, bounds)\n\n const neighbors = Array.from(neighborIds)\n .map((id) => state.graph.getNodeById(id as AnyNodeId)?.data())\n .filter((n): n is AnyNode => n !== undefined)\n\n const results = state.verticalStackingProcessor.process(neighbors, state.graph)\n const nodeResults = results.filter((r) => r.nodeId === nodeId)\n\n nodeResults.forEach(({ nodeId, updates }) => {\n // Direct update on graph (triggers onChange)\n state.graph.updateNode(nodeId as AnyNodeId, updates)\n })\n }\n\n // Step 2: Calculate level height\n const levelNode = levelHandle.data() as unknown as SchemaLevelNode\n const heightResults = state.levelHeightProcessor.process([levelNode], state.graph)\n heightResults.forEach(({ nodeId, updates }) => {\n state.graph.updateNode(nodeId as AnyNodeId, updates)\n })\n\n // Step 3: Calculate elevation for all levels\n const building = state.graph.nodes.find({ type: 'building' })[0]\n if (building) {\n const allLevels = building.children().map((h) => h.data()) as unknown as SchemaLevelNode[]\n const elevationResults = state.levelElevationProcessor.process(allLevels, state.graph)\n\n elevationResults.forEach(({ nodeId, updates }) => {\n state.graph.updateNode(nodeId as AnyNodeId, updates)\n })\n }\n\n // Step 4: Detect rooms and assign wall interior sides\n const roomResults = state.roomDetectionProcessor.process([levelNode], state.graph)\n roomResults.forEach(({ nodeId, updates }) => {\n state.graph.updateNode(nodeId as AnyNodeId, updates)\n })\n}\n\nfunction recomputeAllLevels(state: {\n spatialGrid: SpatialGrid\n graph: SceneGraph\n verticalStackingProcessor: VerticalStackingProcessor\n levelHeightProcessor: LevelHeightProcessor\n levelElevationProcessor: LevelElevationProcessor\n roomDetectionProcessor: RoomDetectionProcessor\n}): void {\n const levels = state.graph.nodes.find({ type: 'level' })\n for (const level of levels) {\n processLevel(state, level.id)\n }\n}\n\nconst useStore = create<StoreState>()(\n persist(\n (set, get) => {\n const initialScene = initScene()\n\n // Handler for graph changes\n const handleGraphChange = (nextScene: Scene) => {\n const currentScene = get().scene\n\n // Preserve data that is managed outside the graph:\n // - environment: managed directly via setState in updateEnvironment\n // - zones: managed via zone operations in the store\n // - collections: managed via collection operations in the store\n // - metadata: scene-level metadata not managed by the graph\n // The graph's scene copy may have stale data for these fields.\n const sceneWithPreservedData = {\n ...nextScene,\n zones: currentScene.zones,\n collections: currentScene.collections,\n views: currentScene.views,\n metadata: currentScene.metadata,\n root: {\n ...nextScene.root,\n environment: currentScene.root.environment,\n },\n }\n set({ scene: sceneWithPreservedData })\n\n // Get fresh state after updating scene\n const currentState = get()\n rebuildSpatialGrid(currentState.spatialGrid, currentState.graph)\n recomputeAllLevels(currentState)\n }\n\n const graph = new SceneGraph(initialScene, {\n onChange: (nextScene) => handleGraphChange(nextScene),\n })\n\n return {\n scene: initialScene,\n graph,\n spatialGrid: new SpatialGrid(1),\n sceneSource: { type: 'persisted' } as SceneSource,\n commandManager: new CommandManager(),\n\n verticalStackingProcessor: new VerticalStackingProcessor(),\n levelHeightProcessor: new LevelHeightProcessor(),\n levelElevationProcessor: new LevelElevationProcessor(),\n roomDetectionProcessor: new RoomDetectionProcessor(),\n\n currentLevel: 0,\n selectedFloorId: null,\n viewMode: 'level',\n viewerDisplayMode: 'objects',\n selectedNodeIds: [],\n isHelpOpen: false,\n isJsonInspectorOpen: false,\n wallsGroupRef: null,\n activeTool: 'wall',\n lastBuildingTool: 'wall',\n lastCatalogCategory: null,\n catalogCategory: null,\n controlMode: 'building',\n\n // New editor mode system - default to structure mode\n editorMode: 'structure',\n selectedBuildingId: null,\n lastToolByMode: {\n site: null,\n structure: 'wall',\n furnish: 'furniture',\n },\n cameraMode: 'perspective',\n levelMode: 'stacked',\n wallMode: 'cutaway',\n movingCamera: false,\n isManipulatingImage: false,\n isManipulatingScan: false,\n debug: false,\n addToCollectionState: { isActive: false, nodeIds: [] },\n selectedCollectionId: null,\n selectedZoneId: null,\n selectedItem: {\n modelUrl: '/items/couch-medium/model.glb',\n scale: [0.4, 0.4, 0.4],\n size: [4, 2],\n position: [0, 0, 0],\n rotation: [0, 0, 0],\n },\n selectedMaterial: 'brick',\n paintMode: 'wall',\n\n addLevel: (level) => {\n const { graph, commandManager } = get()\n const command = new AddLevelCommand(level)\n commandManager.execute(command, graph)\n },\n deleteLevel: (levelId) => {\n const { graph, commandManager } = get()\n const command = new DeleteLevelCommand(levelId)\n commandManager.execute(command, graph)\n },\n reorderLevels: (levels) => {\n const { graph, commandManager } = get()\n const command = new ReorderLevelsCommand(levels)\n commandManager.execute(command, graph)\n },\n selectFloor: (floorId) => {\n const state = get()\n if (!floorId) {\n set({\n selectedFloorId: null,\n currentLevel: -1,\n viewMode: 'full',\n controlMode: 'select',\n activeTool: null,\n })\n return\n }\n\n const level = state.graph.nodes.find({ type: 'level' }).find((l) => l.id === floorId)\n if (level) {\n set({\n selectedFloorId: floorId,\n currentLevel: (level.data() as unknown as SchemaLevelNode).level,\n viewMode: 'level',\n selectedNodeIds: [],\n selectedZoneId: null, // Clear zone selection when floor changes\n })\n }\n },\n selectZone: (zoneId) => {\n const state = get()\n if (!zoneId) {\n set({\n selectedZoneId: null,\n selectedNodeIds: [],\n })\n return\n }\n\n // Find the zone\n const zone = state.scene.zones?.find((c) => c.id === zoneId)\n if (!zone) return\n\n // If zone has a levelId, ensure that level is selected\n if (zone.levelId && zone.levelId !== state.selectedFloorId) {\n const level = state.graph.nodes\n .find({ type: 'level' })\n .find((l) => l.id === zone.levelId)\n if (level) {\n set({\n selectedFloorId: zone.levelId,\n currentLevel: (level.data() as unknown as SchemaLevelNode).level,\n viewMode: 'level',\n })\n }\n }\n\n set({\n selectedZoneId: zoneId,\n selectedNodeIds: [], // Zones are polygon areas, not node containers\n })\n },\n handleNodeSelect: (nodeId, event) => {\n const currentSelection = get().selectedNodeIds\n const updatedSelection = handleSimpleClick(\n currentSelection as AnyNodeId[],\n nodeId as AnyNodeId,\n event,\n )\n\n const state = get()\n const updates: Partial<StoreState> = {\n selectedNodeIds: updatedSelection,\n selectedZoneId: null, // Clear zone selection when individual nodes are selected\n }\n\n // Auto-switch level if the selected node is on a different level\n const levelId = getLevelIdForNode(state.graph.index, nodeId as AnyNodeId)\n if (\n levelId &&\n levelId !== state.selectedFloorId &&\n updatedSelection.includes(nodeId as AnyNodeId)\n ) {\n const level = state.graph.nodes.find({ type: 'level' }).find((l) => l.id === levelId)\n if (level) {\n Object.assign(updates, {\n selectedFloorId: levelId,\n currentLevel: (level.data() as unknown as SchemaLevelNode).level,\n viewMode: 'level',\n })\n }\n }\n\n set(updates)\n\n // Auto-switch control mode based on node type\n const handle = state.graph.getNodeById(nodeId as AnyNodeId)\n const node = handle?.data()\n\n if (node?.type === 'site') {\n // Site nodes should enter edit mode for property line editing\n set({ controlMode: 'edit' })\n } else if (node?.type === 'reference-image' || node?.type === 'scan') {\n set({ controlMode: 'guide' })\n } else if (state.controlMode !== 'select' && state.controlMode !== 'edit') {\n set({ controlMode: 'building' })\n }\n },\n\n // Compatibility Wrappers\n handleElementSelect: (elementId, event) => get().handleNodeSelect(elementId, event),\n setSelectedImageIds: (ids) => set({ selectedNodeIds: ids }), // This overwrites selection, matching previous behavior somewhat\n setSelectedScanIds: (ids) => set({ selectedNodeIds: ids }),\n\n setIsHelpOpen: (open) => set({ isHelpOpen: open }),\n setIsJsonInspectorOpen: (open) => set({ isJsonInspectorOpen: open }),\n\n // Helper to close special editors (zones, site property lines) when changing modes/tools\n // Returns partial state updates to be merged with other updates\n closeSpecialEditors: () => {\n const state = get()\n const updates: Partial<StoreState> = {}\n\n // Clear zone selection\n if (state.selectedZoneId) {\n updates.selectedZoneId = null\n }\n\n // Clear site node selection (site nodes use edit mode for property line editing)\n if (state.controlMode === 'edit' && state.selectedNodeIds.length > 0) {\n const siteNodeIds = state.selectedNodeIds.filter((nodeId) => {\n const handle = state.graph.getNodeById(nodeId as AnyNodeId)\n return handle?.type === 'site'\n })\n if (siteNodeIds.length > 0) {\n updates.selectedNodeIds = state.selectedNodeIds.filter(\n (id) => !siteNodeIds.includes(id),\n )\n }\n }\n\n return updates\n },\n\n setActiveTool: (tool, catalogCategory) => {\n get().deletePreviewNodes()\n // If catalogCategory is explicitly passed, use it; otherwise clear it unless tool is 'item'\n const newCatalogCategory =\n catalogCategory !== undefined\n ? catalogCategory\n : tool === 'item'\n ? (get().catalogCategory ?? 'furniture')\n : null\n\n const state = get()\n const updates: Partial<StoreState> = {\n activeTool: tool,\n catalogCategory: newCatalogCategory,\n ...get().closeSpecialEditors(),\n }\n\n if (tool !== null) {\n updates.controlMode = 'building'\n\n // Auto-select floor if none selected\n if (!state.selectedFloorId) {\n const levels = state.graph.nodes.find({ type: 'level' })\n if (levels.length > 0) {\n // Try to find level 0, otherwise default to first level found\n const level0 = levels.find((l) => (l.data() as any).level === 0)\n const targetLevel = level0 || levels[0]\n\n Object.assign(updates, {\n selectedFloorId: targetLevel.id,\n currentLevel: (targetLevel.data() as unknown as SchemaLevelNode).level,\n viewMode: 'level',\n })\n }\n }\n } else {\n updates.controlMode = 'select'\n }\n\n set(updates)\n },\n setCatalogCategory: (category) => set({ catalogCategory: category }),\n setControlMode: (mode) => {\n if (mode !== 'building') {\n get().deletePreviewNodes()\n }\n\n // Close special editors and apply updates\n const specialEditorUpdates = get().closeSpecialEditors()\n if (Object.keys(specialEditorUpdates).length > 0) {\n set(specialEditorUpdates)\n }\n\n set({ controlMode: mode })\n if (mode !== 'building') {\n // Save current tool and catalog category before clearing so we can restore them when re-entering building mode\n const currentTool = get().activeTool\n const currentCategory = get().catalogCategory\n if (currentTool) {\n set({ lastBuildingTool: currentTool, lastCatalogCategory: currentCategory })\n }\n set({ activeTool: null, catalogCategory: null })\n }\n },\n setEditorMode: (mode, buildingId) => {\n const state = get()\n\n // Save current tool for the current editor mode\n const currentTool = state.activeTool\n if (currentTool) {\n set({\n lastToolByMode: {\n ...state.lastToolByMode,\n [state.editorMode]: currentTool,\n },\n })\n }\n\n // Prepare updates\n const updates: Partial<StoreState> = {\n editorMode: mode,\n }\n\n // Filter selected nodes based on target mode\n if (state.selectedNodeIds.length > 0) {\n const filteredSelection = state.selectedNodeIds.filter((nodeId) => {\n const handle = state.graph.getNodeById(nodeId as AnyNodeId)\n if (!handle) return false\n const nodeType = handle.type\n\n if (mode === 'site') {\n // Site mode: only keep site or building selections\n return nodeType === 'site' || nodeType === 'building'\n }\n // Structure/Furnish mode: deselect site and building nodes\n return nodeType !== 'site' && nodeType !== 'building'\n })\n\n if (filteredSelection.length !== state.selectedNodeIds.length) {\n updates.selectedNodeIds = filteredSelection\n }\n }\n\n // Define available control modes per editor mode\n const modesByEditorMode: Record<EditorMode, ControlMode[]> = {\n site: ['select', 'edit'],\n structure: ['select', 'delete', 'building', 'guide'],\n furnish: ['select', 'delete', 'building', 'painting'],\n }\n\n // Check if current control mode is available in target editor mode\n const availableModes = modesByEditorMode[mode]\n const currentControlMode = state.controlMode\n const isCurrentModeAvailable = availableModes.includes(currentControlMode)\n\n // Handle building selection for structure/furnish modes\n if (mode === 'structure' || mode === 'furnish') {\n if (buildingId !== undefined) {\n updates.selectedBuildingId = buildingId\n }\n\n // Only switch control mode if current one is not available\n if (!isCurrentModeAvailable) {\n updates.controlMode = 'select'\n updates.activeTool = null\n updates.catalogCategory = null\n }\n } else if (mode === 'site') {\n // Clear building selection when entering site mode\n updates.selectedBuildingId = null\n\n // Only switch control mode if current one is not available\n if (!isCurrentModeAvailable) {\n updates.controlMode = 'select'\n }\n updates.activeTool = null\n updates.catalogCategory = null\n }\n\n set(updates)\n },\n setCameraMode: (mode) => set({ cameraMode: mode }),\n setMovingCamera: (moving) => set({ movingCamera: moving }),\n setIsManipulatingImage: (manipulating) => set({ isManipulatingImage: manipulating }),\n setIsManipulatingScan: (manipulating) => set({ isManipulatingScan: manipulating }),\n setDebug: (debug) => set({ debug }),\n setSelectedItem: (item) => set({ selectedItem: item }),\n setSelectedMaterial: (material) => set({ selectedMaterial: material }),\n setPaintMode: (mode) => set({ paintMode: mode }),\n setViewerDisplayMode: (mode) => set({ viewerDisplayMode: mode }),\n toggleLevelMode: () =>\n set((state) => ({\n levelMode: state.levelMode === 'stacked' ? 'exploded' : 'stacked',\n })),\n toggleWallMode: () =>\n set((state) => {\n const modes: WallMode[] = ['up', 'cutaway', 'down']\n const currentIndex = modes.indexOf(state.wallMode)\n const nextIndex = (currentIndex + 1) % modes.length\n return { wallMode: modes[nextIndex] }\n }),\n\n getSelectedElementsSet: () => {\n const state = get()\n const set = new Set<AnyNodeId>()\n state.selectedNodeIds.forEach((id) => {\n const node = state.graph.getNodeById(id as AnyNodeId)?.data()\n // Filter out images/scans to match legacy behavior of \"elements\"\n if (node && node.type !== 'reference-image' && node.type !== 'scan') {\n set.add(id as AnyNodeId)\n }\n })\n return set\n },\n getSelectedImageIdsSet: () => {\n const state = get()\n const set = new Set<string>()\n state.selectedNodeIds.forEach((id) => {\n const node = state.graph.getNodeById(id as AnyNodeId)?.data()\n if (node?.type === 'reference-image') set.add(id)\n })\n return set\n },\n getSelectedScanIdsSet: () => {\n const state = get()\n const set = new Set<string>()\n state.selectedNodeIds.forEach((id) => {\n const node = state.graph.getNodeById(id as AnyNodeId)?.data()\n if (node?.type === 'scan') set.add(id)\n })\n return set\n },\n\n handleExport: () => {\n const ref = get().wallsGroupRef\n if (!ref) return\n const exporter = new GLTFExporter()\n exporter.parse(\n ref,\n (result) => {\n const blob = new Blob([result as ArrayBuffer], { type: 'application/octet-stream' })\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = 'house_model.glb'\n link.click()\n URL.revokeObjectURL(url)\n },\n (error) => console.error('Export error:', error),\n { binary: true },\n )\n },\n\n handleDeleteSelected: () => {\n const state = get()\n if (state.selectedNodeIds.length === 0) return\n\n const batchCommand = new BatchDeleteCommand(state.selectedNodeIds)\n state.commandManager.execute(batchCommand, state.graph)\n\n // Remove deleted nodes from any collections they belong to\n const deletedSet = new Set(state.selectedNodeIds)\n const updatedCollections = (state.scene.collections || []).map((c) => ({\n ...c,\n nodeIds: c.nodeIds.filter((id) => !deletedSet.has(id)),\n }))\n set({ scene: { ...state.scene, collections: updatedCollections }, selectedNodeIds: [] })\n },\n handleDeleteSelectedElements: () => get().handleDeleteSelected(),\n handleDeleteSelectedImages: () => get().handleDeleteSelected(),\n handleDeleteSelectedScans: () => get().handleDeleteSelected(),\n handleClear: () => set({ selectedNodeIds: [] }),\n\n groupSelected: () => {\n const { graph, commandManager, selectedNodeIds } = get()\n if (selectedNodeIds.length < 1) return // Can group 1 node effectively wrapping it, but usually 2+\n\n const command = new GroupNodesCommand(selectedNodeIds)\n commandManager.execute(command, graph)\n\n // Select the new group\n set({ selectedNodeIds: [command.getGroupNodeId()] })\n },\n\n ungroupSelected: () => {\n const { graph, commandManager, selectedNodeIds } = get()\n if (selectedNodeIds.length === 0) return\n\n const newSelection: string[] = []\n let didUngroup = false\n\n // Collect all commands first\n for (const id of selectedNodeIds) {\n const handle = graph.getNodeById(id as AnyNodeId)\n if (handle && handle.type === 'group') {\n const children = handle.children()\n children.forEach((c) => {\n newSelection.push(c.id)\n })\n\n const command = new UngroupNodesCommand(id)\n commandManager.execute(command, graph)\n didUngroup = true\n } else {\n // Keep non-group nodes selected\n newSelection.push(id)\n }\n }\n\n if (didUngroup) {\n set({ selectedNodeIds: newSelection })\n }\n },\n\n serializeLayout: () => get().scene,\n\n loadTransientScene: (json, sourceUrl) => {\n // Load the scene using loadLayout logic but mark it as transient\n // This prevents it from being persisted to storage\n get().loadLayout(json)\n set({\n sceneSource: sourceUrl\n ? { type: 'url', url: sourceUrl }\n : { type: 'url', url: 'unknown' },\n })\n },\n\n restorePersistedScene: async () => {\n // Force rehydration from storage to restore the persisted editor state\n // This is useful when returning to editor after viewing a transient scene\n const storage = indexedDBStorage\n const raw = await storage.getItem('editor-storage')\n if (raw) {\n try {\n const env = JSON.parse(raw) as { state: any; version: number }\n if (env.state?.scene) {\n get().loadLayout(env.state.scene)\n set({ sceneSource: { type: 'persisted' } })\n }\n } catch (error) {\n console.error('[Storage] Failed to restore persisted scene:', error)\n }\n }\n },\n\n isTransientScene: () => get().sceneSource.type !== 'persisted',\n\n loadLayout: (json) => {\n // Helper to ensure all nodes have the 'object: node' marker\n const ensureNodeMarkers = (node: any): void => {\n if (typeof node !== 'object' || node === null) return\n\n // Mark as node if it has id and type\n if (node.id && node.type && !node.object) {\n node.object = 'node'\n }\n\n // Recursively process all properties\n for (const value of Object.values(node)) {\n if (Array.isArray(value)) {\n value.forEach((v: any) => {\n ensureNodeMarkers(v)\n })\n } else if (typeof value === 'object' && value !== null) {\n ensureNodeMarkers(value)\n }\n }\n }\n\n set({\n selectedNodeIds: [],\n selectedFloorId: null,\n viewMode: 'full',\n controlMode: 'select',\n activeTool: null,\n })\n\n if (json.root) {\n const root = json.root as any\n\n const fixBuilding = (b: any) => {\n if (b.levels && !b.children) {\n b.children = b.levels\n delete b.levels\n }\n }\n\n if (root.buildings && !root.children) {\n if (Array.isArray(root.buildings)) {\n root.buildings.forEach(fixBuilding)\n const site = {\n id: 'site_default',\n type: 'site',\n object: 'node',\n children: root.buildings,\n }\n root.children = [site]\n }\n delete root.buildings\n } else if (root.children) {\n if (root.children.length > 0 && root.children[0].type === 'building') {\n const buildings = root.children\n buildings.forEach(fixBuilding)\n const site = {\n id: 'site_default',\n type: 'site',\n object: 'node',\n children: buildings,\n }\n root.children = [site]\n } else {\n root.children.forEach((site: any) => {\n if (site.children) {\n site.children.forEach((c: any) => {\n if (c.type === 'building') fixBuilding(c)\n })\n }\n })\n }\n }\n\n ensureNodeMarkers(root)\n\n // Parse zones and collections if present\n const zones = Array.isArray(json.zones) ? json.zones : []\n const collections = Array.isArray(json.collections) ? json.collections : []\n const metadata = json.metadata || {}\n\n const newScene = { root, zones, collections, metadata } as unknown as Scene\n const newGraph = new SceneGraph(newScene, {\n onChange: (s) => handleGraphChange(s),\n })\n\n set({ scene: newScene, graph: newGraph, sceneSource: { type: 'persisted' } })\n rebuildSpatialGrid(get().spatialGrid, newGraph)\n } else if (json.levels) {\n const migratedRoot = RootNode.parse({\n children: [\n SiteNode.parse({\n children: [\n BuildingNode.parse({\n children: json.levels,\n }),\n ],\n }),\n ],\n })\n ensureNodeMarkers(migratedRoot)\n\n const newScene = {\n root: migratedRoot,\n zones: [],\n collections: [],\n views: [],\n metadata: {},\n } as unknown as Scene\n const newGraph = new SceneGraph(newScene, {\n onChange: (s) => handleGraphChange(s),\n })\n set({ scene: newScene, graph: newGraph, sceneSource: { type: 'persisted' } })\n rebuildSpatialGrid(get().spatialGrid, newGraph)\n }\n },\n handleLoadLayout: (file) => {\n if (file && file.type === 'application/json') {\n const reader = new FileReader()\n reader.onload = (event) => {\n try {\n const json = JSON.parse(event.target?.result as string)\n get().loadLayout(json)\n } catch (error) {\n console.error('Failed to parse layout JSON:', error)\n }\n }\n reader.readAsText(file)\n }\n },\n handleResetToDefault: () => {\n const initialScene = initScene()\n const newGraph = new SceneGraph(initialScene, {\n onChange: (s) => handleGraphChange(s),\n })\n const site = initialScene.root.children?.[0]\n const mainBuilding = site?.children?.find((c) => c.type === 'building')\n\n set({\n scene: initialScene,\n graph: newGraph,\n sceneSource: { type: 'persisted' },\n currentLevel: 0,\n selectedFloorId: mainBuilding?.children?.[0]?.id ?? null,\n viewMode: 'level',\n selectedNodeIds: [],\n })\n get().commandManager.clear()\n rebuildSpatialGrid(get().spatialGrid, newGraph)\n },\n\n undo: () => {\n const { commandManager, graph } = get()\n const success = commandManager.undo(graph)\n if (success) {\n set({\n selectedNodeIds: [],\n })\n }\n },\n redo: () => {\n const { commandManager, graph } = get()\n const success = commandManager.redo(graph)\n if (success) {\n set({\n selectedNodeIds: [],\n })\n }\n },\n\n toggleNodeVisibility: (nodeId) => {\n const { graph } = get()\n const handle = graph.getNodeById(nodeId as AnyNodeId)\n if (handle) {\n const node = handle.data()\n graph.updateNode(nodeId as AnyNodeId, { visible: !(node.visible ?? true) } as any)\n }\n },\n setNodeOpacity: (nodeId, opacity) => {\n get().graph.updateNode(nodeId as AnyNodeId, { opacity } as any)\n },\n\n getLevelId: (nodeId) => {\n const { graph } = get()\n return getLevelIdForNode(graph.index, nodeId as AnyNodeId)\n },\n getNode: (nodeId) => {\n const { graph } = get()\n return graph.getNodeById(nodeId as AnyNodeId)\n },\n\n selectNode: (nodeId) => {\n // Force single selection of this node\n const state = get()\n const handle = state.graph.getNodeById(nodeId as AnyNodeId)\n if (!handle) return\n\n // Set selection\n set({ selectedNodeIds: [nodeId] })\n\n const node = handle.data()\n\n // Switch context if needed\n if (node.type === 'level') {\n state.selectFloor(node.id)\n } else if (node.type === 'reference-image' || node.type === 'scan') {\n // Ensure guide mode if selecting reference/scan?\n // Legacy behavior was specific:\n // set({ controlMode: 'guide' })\n // We can keep that if desired, but maybe let the user decide or handle in handleNodeSelect\n }\n },\n\n addNode: (nodeData, parentId) => {\n const { graph, commandManager } = get()\n const command = new AddNodeCommand(nodeData, parentId)\n\n // Skip undo if preview node OR if a transaction is active (transaction handles undo via snapshots)\n if ((nodeData as any).editor?.preview || commandManager.isTransactionActive()) {\n command.execute(graph)\n } else {\n commandManager.execute(command, graph)\n }\n\n return command.getNodeId()\n },\n\n moveNode: (nodeId, parentId) => {\n const { graph, commandManager } = get()\n const command = new MoveNodeCommand(nodeId, parentId)\n commandManager.execute(command, graph)\n },\n\n updateNode: (nodeId, updates, skipUndo = false) => {\n const { graph, commandManager } = get()\n\n const handle = graph.getNodeById(nodeId as AnyNodeId)\n if (!handle) return nodeId\n const fromNode = handle.data()\n\n const isCommittingPreview =\n (fromNode as any).editor?.preview === true && (updates as any).editor?.preview === false\n\n if (isCommittingPreview) {\n // Get parent info before deletion\n const parentHandle = handle.parent()\n const parentId = parentHandle ? parentHandle.id : null\n\n // Recursively collect and clean node data\n const cleanNodeData = (node: any): any => {\n const cleaned = { ...node }\n\n // Clean up preview flag\n if (cleaned.editor?.preview) {\n cleaned.editor = { ...cleaned.editor, preview: false }\n }\n\n // Clean up name if it contains \"Preview\"\n if (cleaned.name && typeof cleaned.name === 'string') {\n cleaned.name = cleaned.name.replace(' Preview', '').replace('Preview ', '')\n }\n\n // Apply updates to root node\n if (node.id === nodeId) {\n Object.assign(cleaned, updates)\n }\n\n // Recursively clean children\n if (cleaned.children && Array.isArray(cleaned.children)) {\n cleaned.children = cleaned.children.map((child: any) => cleanNodeData(child))\n }\n\n return cleaned\n }\n\n const cleanedData = cleanNodeData(fromNode)\n\n // Delete preview node (no undo)\n const deleteCommand = new DeleteNodeCommand(nodeId)\n deleteCommand.execute(graph)\n\n // Add new real node (with undo) - this is the only operation in undo stack\n const { id, ...dataWithoutId } = cleanedData\n const addCommand = new AddNodeCommand(dataWithoutId, parentId, nodeId)\n commandManager.execute(addCommand, graph)\n\n return nodeId\n }\n const command = new UpdateNodeCommand(nodeId, updates)\n // Skip undo if explicitly requested, preview node, OR if a transaction is active\n if (\n skipUndo ||\n (fromNode as any).editor?.preview ||\n commandManager.isTransactionActive()\n ) {\n command.execute(graph)\n } else {\n commandManager.execute(command, graph)\n }\n return nodeId\n },\n deleteNode: (nodeId) => {\n const { graph, commandManager, scene } = get()\n const handle = graph.getNodeById(nodeId as AnyNodeId)\n\n const command = new DeleteNodeCommand(nodeId)\n // Skip undo if preview node OR if a transaction is active (transaction handles undo via snapshots)\n if ((handle?.data() as any)?.editor?.preview || commandManager.isTransactionActive()) {\n command.execute(graph)\n } else {\n commandManager.execute(command, graph)\n }\n\n // Remove the node from any collections it belongs to\n const updatedCollections = (scene.collections || []).map((c) => ({\n ...c,\n nodeIds: c.nodeIds.filter((id) => id !== nodeId),\n }))\n set({ scene: { ...scene, collections: updatedCollections } })\n },\n\n deleteNodes: (nodeIds) => {\n const { graph, commandManager, scene } = get()\n\n // Filter out preview nodes and regular nodes\n const previewNodeIds: string[] = []\n const regularNodeIds: string[] = []\n\n for (const nodeId of nodeIds) {\n const handle = graph.getNodeById(nodeId as AnyNodeId)\n if ((handle?.data() as any)?.editor?.preview) {\n previewNodeIds.push(nodeId)\n } else {\n regularNodeIds.push(nodeId)\n }\n }\n\n // Delete preview nodes without adding to history\n for (const nodeId of previewNodeIds) {\n const command = new DeleteNodeCommand(nodeId)\n command.execute(graph)\n }\n\n // Batch delete regular nodes with single history entry\n if (regularNodeIds.length > 0) {\n const command = new BatchDeleteCommand(regularNodeIds)\n commandManager.execute(command, graph)\n }\n\n // Remove deleted nodes from any collections they belong to\n const deletedSet = new Set(nodeIds)\n const updatedCollections = (scene.collections || []).map((c) => ({\n ...c,\n nodeIds: c.nodeIds.filter((id) => !deletedSet.has(id)),\n }))\n set({ scene: { ...scene, collections: updatedCollections }, selectedNodeIds: [] })\n },\n\n deletePreviewNodes: () => {\n const { graph } = get()\n const previewIds = Array.from(graph.index.previewIds)\n\n previewIds.forEach((id) => {\n const command = new DeleteNodeCommand(id)\n command.execute(graph)\n })\n },\n\n commitMove: (nodeId, originalData) => {\n const { graph, commandManager } = get()\n const handle = graph.getNodeById(nodeId as AnyNodeId)\n if (!handle) return\n\n const currentNode = handle.data() as any\n\n // Build update with current position and preview: false\n const updates: any = {\n position: currentNode.position,\n rotation: currentNode.rotation,\n editor: { preview: false },\n }\n // Include wall-specific data if present\n if (currentNode.start && currentNode.end) {\n updates.start = currentNode.start\n updates.end = currentNode.end\n }\n\n // First, clear preview flag without undo (direct graph update)\n graph.updateNode(nodeId as AnyNodeId, { editor: { preview: false } })\n\n // Now create an UpdateNodeCommand that records the position change\n // The command will store originalData as previousState for undo\n const command = new UpdateNodeCommand(nodeId, {\n position: currentNode.position,\n rotation: currentNode.rotation,\n ...(currentNode.start && currentNode.end\n ? { start: currentNode.start, end: currentNode.end }\n : {}),\n })\n\n // Manually set the previousState to originalData so undo restores original position\n ;(command as any).previousState = {\n position: originalData.position,\n rotation: originalData.rotation,\n ...(originalData.start && originalData.end\n ? { start: originalData.start, end: originalData.end }\n : {}),\n }\n\n // Push to undo stack (execute is a no-op since we already have current values)\n commandManager.execute(command, graph)\n },\n\n // Zone operations\n addZone: (name: string, levelId: string, polygon: [number, number][]) => {\n const zone = ZoneSchema.parse({ name, levelId, polygon })\n const state = get()\n set({\n scene: {\n ...state.scene,\n zones: [...(state.scene.zones || []), zone],\n },\n })\n return zone\n },\n\n deleteZone: (zoneId: string) => {\n const state = get()\n set({\n scene: {\n ...state.scene,\n zones: (state.scene.zones || []).filter((c) => c.id !== zoneId),\n },\n })\n },\n\n renameZone: (zoneId: string, name: string) => {\n const state = get()\n set({\n scene: {\n ...state.scene,\n zones: (state.scene.zones || []).map((c) => (c.id === zoneId ? { ...c, name } : c)),\n },\n })\n },\n\n updateZonePolygon: (zoneId: string, polygon: [number, number][]) => {\n const state = get()\n set({\n scene: {\n ...state.scene,\n zones: (state.scene.zones || []).map((c) =>\n c.id === zoneId ? { ...c, polygon } : c,\n ),\n },\n })\n },\n\n setZoneColor: (zoneId: string, color: string) => {\n const state = get()\n set({\n scene: {\n ...state.scene,\n zones: (state.scene.zones || []).map((c) => (c.id === zoneId ? { ...c, color } : c)),\n },\n })\n },\n\n // Collection operations (logical groupings of nodes)\n selectCollection: (collectionId) => {\n const state = get()\n if (!collectionId) {\n set({\n selectedCollectionId: null,\n selectedNodeIds: [],\n })\n return\n }\n\n // Find the collection\n const collection = state.scene.collections?.find((c) => c.id === collectionId)\n if (!collection) return\n\n // If collection has a levelId, ensure that level is selected\n if (collection.levelId && collection.levelId !== state.selectedFloorId) {\n const level = state.graph.nodes\n .find({ type: 'level' })\n .find((l) => l.id === collection.levelId)\n if (level) {\n set({\n selectedFloorId: collection.levelId,\n currentLevel: (level.data() as unknown as SchemaLevelNode).level,\n viewMode: 'level',\n })\n }\n }\n\n set({\n selectedCollectionId: collectionId,\n selectedNodeIds: [...collection.nodeIds],\n })\n },\n\n addCollection: (name: string) => {\n const collection = CollectionSchema.parse({ name })\n const state = get()\n set({\n scene: {\n ...state.scene,\n collections: [...(state.scene.collections || []), collection],\n },\n })\n return collection\n },\n\n deleteCollection: (collectionId: string) => {\n const state = get()\n set({\n scene: {\n ...state.scene,\n collections: (state.scene.collections || []).filter((c) => c.id !== collectionId),\n },\n })\n },\n\n renameCollection: (collectionId: string, name: string) => {\n const state = get()\n set({\n scene: {\n ...state.scene,\n collections: (state.scene.collections || []).map((c) =>\n c.id === collectionId ? { ...c, name } : c,\n ),\n },\n })\n },\n\n addNodesToCollection: (collectionId: string, nodeIds: string[]) => {\n const state = get()\n set({\n scene: {\n ...state.scene,\n collections: (state.scene.collections || []).map((c) => {\n if (c.id !== collectionId) return c\n // Add only node IDs that aren't already in the collection\n const existingIds = new Set(c.nodeIds || [])\n const newIds = nodeIds.filter((id) => !existingIds.has(id))\n\n // If this is the first node being added, set the levelId from that node\n const isFirstNode = existingIds.size === 0 && newIds.length > 0\n const levelId = isFirstNode\n ? getLevelIdForNode(state.graph.index, newIds[0] as AnyNodeId)\n : c.levelId\n\n return {\n ...c,\n nodeIds: [...(c.nodeIds || []), ...newIds],\n levelId,\n }\n }),\n },\n })\n },\n\n removeNodesFromCollection: (collectionId: string, nodeIds: string[]) => {\n const state = get()\n const idsToRemove = new Set(nodeIds)\n set({\n scene: {\n ...state.scene,\n collections: (state.scene.collections || []).map((c) => {\n if (c.id !== collectionId) return c\n return { ...c, nodeIds: (c.nodeIds || []).filter((id) => !idsToRemove.has(id)) }\n }),\n },\n })\n },\n\n startAddToCollection: () => {\n const { selectedNodeIds } = get()\n if (selectedNodeIds.length === 0) return\n set({\n addToCollectionState: {\n isActive: true,\n nodeIds: [...selectedNodeIds],\n },\n })\n },\n\n confirmAddToCollection: (collectionId: string) => {\n const { addToCollectionState, addNodesToCollection } = get()\n if (!addToCollectionState.isActive || addToCollectionState.nodeIds.length === 0) return\n addNodesToCollection(collectionId, addToCollectionState.nodeIds)\n set({ addToCollectionState: { isActive: false, nodeIds: [] } })\n },\n\n cancelAddToCollection: () => {\n set({ addToCollectionState: { isActive: false, nodeIds: [] } })\n },\n\n // View operations\n addView: (viewData) => {\n const view = ViewSchema.parse(viewData)\n const state = get()\n set({\n scene: {\n ...state.scene,\n views: [...(state.scene.views || []), view],\n },\n })\n },\n\n deleteView: (viewId) => {\n const state = get()\n set({\n scene: {\n ...state.scene,\n views: (state.scene.views || []).filter((v) => v.id !== viewId),\n },\n })\n },\n\n updateView: (viewId, updates) => {\n const state = get()\n set({\n scene: {\n ...state.scene,\n views: (state.scene.views || []).map((v) =>\n v.id === viewId ? { ...v, ...updates } : v,\n ),\n },\n })\n },\n\n applyView: (viewId) => {\n const state = get()\n const view = state.scene.views?.find((v) => v.id === viewId)\n if (!view) return\n\n // Apply scene overrides\n if (view.sceneState) {\n if (view.sceneState.selectedLevelId !== undefined) {\n state.selectFloor(view.sceneState.selectedLevelId)\n }\n if (view.sceneState.levelMode) {\n const mode = view.sceneState.levelMode\n if (mode === 'single-floor') {\n set({ viewMode: 'level' })\n } else {\n set({ levelMode: mode as LevelMode, viewMode: 'full' })\n }\n }\n // Add other overrides here (time, visibility) when supported\n }\n\n // Apply camera\n emitter.emit('view:apply', { camera: view.camera })\n },\n\n // Transaction operations (for grouping multiple operations into one undo step)\n startTransaction: () => {\n const { commandManager, graph } = get()\n commandManager.startTransaction(graph)\n },\n\n commitTransaction: () => {\n const { commandManager } = get()\n commandManager.commitTransaction()\n },\n\n cancelTransaction: () => {\n const { commandManager, graph } = get()\n commandManager.cancelTransaction(graph)\n },\n\n isTransactionActive: () => {\n const { commandManager } = get()\n return commandManager.isTransactionActive()\n },\n\n captureSnapshot: (nodeId: string) => {\n const { commandManager } = get()\n const transaction = commandManager.getActiveTransaction()\n if (transaction) {\n transaction.captureSnapshot(nodeId)\n }\n },\n\n trackCreatedNode: (nodeId: string) => {\n const { commandManager } = get()\n const transaction = commandManager.getActiveTransaction()\n if (transaction) {\n transaction.trackCreatedNode(nodeId)\n }\n },\n }\n },\n {\n name: 'editor-storage',\n version: 5, // Increment version for migration\n storage: createJSONStorage(() => indexedDBStorage),\n partialize: (state) => {\n const filterPreviewNodes = (node: SceneNode): SceneNode => {\n const n = { ...node } as any\n for (const key of Object.keys(n)) {\n const value = n[key]\n if (typeof value === 'object' && value !== null) {\n if ((value as any).object === 'node') {\n n[key] = filterPreviewNodes(value)\n } else if (Array.isArray(value)) {\n n[key] = value\n .filter((item: any) => !(typeof item === 'object' && item?.editor?.preview))\n .map((item: any) =>\n typeof item === 'object' && item !== null && item.object === 'node'\n ? filterPreviewNodes(item)\n : item,\n )\n }\n }\n }\n return n as SceneNode\n }\n\n // Only persist the scene if it's from a persisted source\n // For transient scenes (loaded via URL), keep the last persisted scene in storage\n if (state.sceneSource?.type === 'persisted') {\n const processedRoot = { ...state.scene.root } as RootNode\n if (processedRoot.children) {\n processedRoot.children = processedRoot.children.map(\n (site) => filterPreviewNodes(site) as SiteNode,\n )\n }\n\n const sceneToStore = {\n ...state.scene,\n root: processedRoot,\n zones: state.scene.zones || [],\n collections: state.scene.collections || [],\n }\n\n // Cache this as the last persisted scene\n lastPersistedSceneCache = sceneToStore as Scene\n\n return {\n scene: sceneToStore,\n selectedNodeIds: state.selectedNodeIds,\n debug: state.debug,\n }\n }\n\n // For transient scenes, persist the cached scene instead (or nothing if no cache)\n // This prevents URL-loaded scenes from overwriting the editor's work-in-progress\n if (lastPersistedSceneCache) {\n return {\n scene: lastPersistedSceneCache,\n // Don't persist selection state from transient scenes\n selectedNodeIds: [],\n debug: state.debug,\n }\n }\n\n // No cached scene yet - don't persist anything\n // This can happen on first load before any persisted scene exists\n return {\n scene: state.scene,\n selectedNodeIds: [],\n debug: state.debug,\n }\n },\n onRehydrateStorage: () => (state) => {\n if (state) {\n // Migrate old keys if present (though partialize won't save them anymore)\n if ((state as any).selectedElements) {\n state.selectedNodeIds = [\n ...((state as any).selectedElements || []),\n ...((state as any).selectedImageIds || []),\n ...((state as any).selectedScanIds || []),\n ]\n delete (state as any).selectedElements\n delete (state as any).selectedImageIds\n delete (state as any).selectedScanIds\n }\n\n if (state.scene?.root) {\n const root = state.scene.root as any\n const fixBuilding = (b: any) => {\n if (b.levels && !b.children) {\n b.children = b.levels\n delete b.levels\n }\n }\n if (root.buildings && !root.children) {\n if (Array.isArray(root.buildings)) {\n root.buildings.forEach(fixBuilding)\n const site = {\n id: 'site_default',\n type: 'site',\n object: 'node',\n children: root.buildings,\n }\n root.children = [site]\n }\n delete root.buildings\n } else if (root.children) {\n if (root.children.length > 0 && root.children[0].type === 'building') {\n const buildings = root.children\n buildings.forEach(fixBuilding)\n const site = {\n id: 'site_default',\n type: 'site',\n object: 'node',\n children: buildings,\n }\n root.children = [site]\n } else {\n root.children.forEach((site: any) => {\n if (site.children) {\n site.children.forEach((c: any) => {\n if (c.type === 'building') fixBuilding(c)\n })\n }\n })\n }\n }\n } else {\n state.scene = initScene()\n }\n\n state.commandManager = new CommandManager()\n state.spatialGrid = new SpatialGrid(1)\n // Scene loaded from storage is always persisted source\n state.sceneSource = { type: 'persisted' }\n // Cache the rehydrated scene for transient scene handling\n lastPersistedSceneCache = state.scene\n\n const handleGraphChange = (nextScene: Scene) => {\n useStore.setState((s) => {\n const currentGraph = s.graph\n rebuildSpatialGrid(s.spatialGrid, currentGraph)\n recomputeAllLevels(s as any)\n\n // Preserve data that is managed outside the graph:\n // - environment: managed directly via setState in updateEnvironment\n // - zones: managed via zone operations in the store\n // - collections: managed via collection operations in the store\n // - metadata: scene-level metadata not managed by the graph\n // The graph's scene copy may have stale data for these fields.\n return {\n scene: {\n ...nextScene,\n zones: s.scene.zones,\n collections: s.scene.collections,\n views: s.scene.views,\n metadata: s.scene.metadata,\n root: {\n ...nextScene.root,\n environment: s.scene.root.environment,\n },\n },\n }\n })\n }\n\n state.graph = new SceneGraph(state.scene, {\n onChange: handleGraphChange,\n })\n\n rebuildSpatialGrid(state.spatialGrid, state.graph)\n\n const levels = state.graph.nodes.find({ type: 'level' })\n if (!state.selectedFloorId && levels.length > 0) {\n const mainLevel = levels.find((lvl) => (lvl.data() as any).level === 0)\n if (mainLevel) {\n state.selectedFloorId = mainLevel.id\n state.currentLevel = 0\n } else {\n state.selectedFloorId = levels[0].id\n state.currentLevel = (levels[0].data() as unknown as SchemaLevelNode).level\n }\n state.viewMode = 'level'\n }\n\n if (state.selectedFloorId === null) {\n state.viewMode = 'full'\n } else if (state.viewMode === undefined) {\n state.viewMode = 'level'\n }\n\n if (!state.selectedNodeIds) state.selectedNodeIds = []\n\n state.verticalStackingProcessor = new VerticalStackingProcessor()\n state.levelHeightProcessor = new LevelHeightProcessor()\n state.levelElevationProcessor = new LevelElevationProcessor()\n }\n },\n },\n ),\n)\n\nexport const useEditor = useStore\n\n// Helper to wait for hydration to complete before performing actions\nexport const waitForHydration = (): Promise<void> => {\n return new Promise((resolve) => {\n // Check if already hydrated\n if (useStore.persist.hasHydrated()) {\n resolve()\n return\n }\n // Otherwise wait for hydration\n const unsubscribe = useStore.persist.onFinishHydration(() => {\n unsubscribe()\n resolve()\n })\n })\n}\n","import { CamelToPascal } from './utility-types';\n\n/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n\n/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n\n/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n\n/**\n * Is empty string\n *\n * @param {unknown} value\n * @returns {boolean} Whether the value is an empty string\n */\nexport const isEmptyString = (value: unknown): boolean => value === '';\n\n/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: Record<string, any>) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n};\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","import { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses, hasA11yProp } from '@lucide/shared';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n {\n color = 'currentColor',\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = '',\n children,\n iconNode,\n ...rest\n },\n ref,\n ) =>\n createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,\n className: mergeClasses('lucide', className),\n ...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n ),\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className,\n ),\n ...props,\n }),\n );\n\n Component.displayName = toPascalCase(iconName);\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z',\n key: 'hh9hay',\n },\n ],\n ['path', { d: 'm3.3 7 8.7 5 8.7-5', key: 'g66t2b' }],\n ['path', { d: 'M12 22V12', key: 'd0xqtd' }],\n];\n\n/**\n * @component @name Box\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/box\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Box = createLucideIcon('box', __iconNode);\n\nexport default Box;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M10 12h4', key: 'a56b0p' }],\n ['path', { d: 'M10 8h4', key: '1sr2af' }],\n ['path', { d: 'M14 21v-3a2 2 0 0 0-4 0v3', key: '1rgiei' }],\n [\n 'path',\n {\n d: 'M6 10H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-2',\n key: 'secmi2',\n },\n ],\n ['path', { d: 'M6 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16', key: '16ra0t' }],\n];\n\n/**\n * @component @name Building2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/building-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Building2 = createLucideIcon('building-2', __iconNode);\n\nexport default Building2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 7V5c0-1.1.9-2 2-2h2', key: 'adw53z' }],\n ['path', { d: 'M17 3h2c1.1 0 2 .9 2 2v2', key: 'an4l38' }],\n ['path', { d: 'M21 17v2c0 1.1-.9 2-2 2h-2', key: '144t0e' }],\n ['path', { d: 'M7 21H5c-1.1 0-2-.9-2-2v-2', key: 'rtnfgi' }],\n ['rect', { width: '7', height: '5', x: '7', y: '7', rx: '1', key: '1eyiv7' }],\n ['rect', { width: '7', height: '5', x: '10', y: '12', rx: '1', key: '1qlmkx' }],\n];\n\n/**\n * @component @name Group\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/group\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Group = createLucideIcon('group', __iconNode);\n\nexport default Group;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z',\n key: 'yt0hxn',\n },\n ],\n];\n\n/**\n * @component @name Hexagon\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/hexagon\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Hexagon = createLucideIcon('hexagon', __iconNode);\n\nexport default Hexagon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', ry: '2', key: '1m3agn' }],\n ['circle', { cx: '9', cy: '9', r: '2', key: 'af1f0g' }],\n ['path', { d: 'm21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21', key: '1xmnt7' }],\n];\n\n/**\n * @component @name Image\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/image\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Image = createLucideIcon('image', __iconNode);\n\nexport default Image;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'M5 12h14', key: '1ays0h' }]];\n\n/**\n * @component @name Minus\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/minus\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Minus = createLucideIcon('minus', __iconNode);\n\nexport default Minus;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z',\n key: '1a0edw',\n },\n ],\n ['path', { d: 'M12 22V12', key: 'd0xqtd' }],\n ['polyline', { points: '3.29 7 12 12 20.71 7', key: 'ousv84' }],\n ['path', { d: 'm7.5 4.27 9 5.15', key: '1c824w' }],\n];\n\n/**\n * @component @name Package\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/package\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Package = createLucideIcon('package', __iconNode);\n\nexport default Package;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M10.83 2.38a2 2 0 0 1 2.34 0l8 5.74a2 2 0 0 1 .73 2.25l-3.04 9.26a2 2 0 0 1-1.9 1.37H7.04a2 2 0 0 1-1.9-1.37L2.1 10.37a2 2 0 0 1 .73-2.25z',\n key: '2hea0t',\n },\n ],\n];\n\n/**\n * @component @name Pentagon\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/pentagon\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Pentagon = createLucideIcon('pentagon', __iconNode);\n\nexport default Pentagon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M5 3a2 2 0 0 0-2 2', key: 'y57alp' }],\n ['path', { d: 'M19 3a2 2 0 0 1 2 2', key: '18rm91' }],\n ['path', { d: 'M21 19a2 2 0 0 1-2 2', key: '1j7049' }],\n ['path', { d: 'M5 21a2 2 0 0 1-2-2', key: 'sbafld' }],\n ['path', { d: 'M9 3h1', key: '1yesri' }],\n ['path', { d: 'M9 21h1', key: '15o7lz' }],\n ['path', { d: 'M14 3h1', key: '1ec4yj' }],\n ['path', { d: 'M14 21h1', key: 'v9vybs' }],\n ['path', { d: 'M3 9v1', key: '1r0deq' }],\n ['path', { d: 'M21 9v1', key: 'mxsmne' }],\n ['path', { d: 'M3 14v1', key: 'vnatye' }],\n ['path', { d: 'M21 14v1', key: '169vum' }],\n];\n\n/**\n * @component @name SquareDashed\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/square-dashed\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst SquareDashed = createLucideIcon('square-dashed', __iconNode);\n\nexport default SquareDashed;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', key: 'afitv7' }],\n];\n\n/**\n * @component @name Square\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/square\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Square = createLucideIcon('square', __iconNode);\n\nexport default Square;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n { d: 'M13.73 4a2 2 0 0 0-3.46 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z', key: '14u9p9' },\n ],\n];\n\n/**\n * @component @name Triangle\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/triangle\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Triangle = createLucideIcon('triangle', __iconNode);\n\nexport default Triangle;\n","import type React from 'react'\nimport { z } from 'zod'\nimport type { BaseNode } from '../scenegraph/schema'\n\n// ============================================================================\n// COMPONENT CONFIG SCHEMA & TYPES\n// ============================================================================\n\n/**\n * Schema for component configuration\n * Uses Zod for runtime validation and type inference\n */\nexport const ComponentConfigSchema = z.object({\n // Node type identifier (must match node.type in the node tree)\n nodeType: z.string(),\n\n // Human-readable name for the component\n nodeName: z.string(),\n\n // Editor mode where this component is active (optional for render-only components)\n editorMode: z.enum(['select', 'delete', 'building', 'guide']).optional(),\n\n // Tool name (for building mode)\n toolName: z.string().optional(),\n\n // Tool icon component (React component type, optional for render-only components)\n toolIcon: z.any().optional(),\n\n // Zod schema for the node structure\n schema: z.instanceof(z.ZodType).optional(),\n\n // Editor logic that maps user actions to scene graph node operations\n // This is the builder logic (add/update/delete nodes) - not a visual component\n nodeEditor: z.any().optional(), // React.FC - uses useEditor hooks to manage nodes\n\n // Renderer component (renders the 3D representation of the node)\n nodeRenderer: z.any(), // React.FC<{ node: BaseNode }>\n})\n\nexport type ComponentConfig = z.infer<typeof ComponentConfigSchema>\n\n// ============================================================================\n// REGISTRY ENTRY\n// ============================================================================\n\nexport interface RegistryEntry {\n config: ComponentConfig\n}\n\n// ============================================================================\n// COMPONENT REGISTRY\n// ============================================================================\n\n/**\n * Global registry mapping node types to their configurations\n */\nclass ComponentRegistry {\n private readonly registry = new Map<string, RegistryEntry>()\n\n /**\n * Register a new component type\n */\n register(config: ComponentConfig): void {\n // Validate config with Zod\n const validatedConfig = ComponentConfigSchema.parse(config)\n\n if (this.registry.has(validatedConfig.nodeType)) {\n console.warn(\n `[Registry] Overwriting existing registration for type: ${validatedConfig.nodeType}`,\n )\n }\n\n this.registry.set(validatedConfig.nodeType, {\n config: validatedConfig,\n })\n\n console.log(`[Registry] Registered component: ${validatedConfig.nodeType}`)\n }\n\n /**\n * Get configuration for a node type\n */\n get(nodeType: string): RegistryEntry | undefined {\n return this.registry.get(nodeType)\n }\n\n /**\n * Check if a node type is registered\n */\n has(nodeType: string): boolean {\n return this.registry.has(nodeType)\n }\n\n /**\n * Get all registered node types\n */\n getRegisteredTypes(): string[] {\n return Array.from(this.registry.keys())\n }\n\n /**\n * Get all registry entries\n */\n getAll(): Map<string, RegistryEntry> {\n return new Map(this.registry)\n }\n\n /**\n * Get components by editor mode\n */\n getByMode(mode: 'select' | 'delete' | 'building' | 'guide'): RegistryEntry[] {\n return Array.from(this.registry.values()).filter((entry) => entry.config.editorMode === mode)\n }\n\n /**\n * Get component by tool name (for building mode)\n */\n getByTool(toolName: string): RegistryEntry | undefined {\n return Array.from(this.registry.values()).find(\n (entry) => entry.config.toolName === toolName && entry.config.editorMode === 'building',\n )\n }\n\n /**\n * Clear all registrations (useful for testing)\n */\n clear(): void {\n this.registry.clear()\n }\n}\n\n// Export singleton instance\nexport const componentRegistry = new ComponentRegistry()\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Helper function to register a component\n * This is the main API for component authors\n */\nexport function registerComponent(config: ComponentConfig): void {\n componentRegistry.register(config)\n}\n\n/**\n * Get renderer component for a node type\n */\nexport function getRenderer(nodeType: string): React.FC<{ nodeId: BaseNode['id'] }> | undefined {\n const entry = componentRegistry.get(nodeType)\n return entry?.config.nodeRenderer\n}\n","'use client'\n\nimport { memo } from 'react'\n\nexport const BuildingRenderer = memo(() => null)\n","// ============================================================================\n// REGISTER BUILDING COMPONENT\n// ============================================================================\n\nimport { Building2 } from 'lucide-react'\nimport { registerComponent } from '../../../registry'\nimport { BuildingNode } from '@pascal/core/scenegraph/schema/nodes/building'\nimport { BuildingRenderer } from './building-renderer'\n\n// ============================================================================\n// BUILDING BUILDER COMPONENT\n// ============================================================================\n\n/**\n * Building node editor component\n * Buildings don't have interactive editing UI\n */\nexport function BuildingNodeEditor() {\n return null\n}\n\n// ============================================================================\n// REGISTER BUILDING COMPONENT\n// ============================================================================\n\nregisterComponent({\n nodeType: 'building',\n nodeName: 'Building',\n editorMode: 'building',\n schema: BuildingNode,\n nodeEditor: BuildingNodeEditor,\n nodeRenderer: BuildingRenderer,\n toolIcon: Building2,\n})\n","/**\n * Check if two line segments intersect (cross each other or overlap).\n * Returns true if they share any interior points.\n */\nexport function segmentsIntersect(\n segmentA: { x1: number; y1: number; x2: number; y2: number },\n segmentB: { x1: number; y1: number; x2: number; y2: number },\n): boolean {\n const { x1: ax1, y1: ay1, x2: ax2, y2: ay2 } = segmentA\n const { x1: bx1, y1: by1, x2: bx2, y2: by2 } = segmentB\n\n const epsilon = 0.0001\n\n // Direction vectors\n const dax = ax2 - ax1\n const day = ay2 - ay1\n const dbx = bx2 - bx1\n const dby = by2 - by1\n\n // Cross product to check if lines are parallel\n const cross = dax * dby - day * dbx\n\n if (Math.abs(cross) > epsilon) {\n // Lines are not parallel - check for intersection point\n // Parametric form: A + t*(A2-A1) = B + s*(B2-B1)\n // Solving for t and s:\n const dx = bx1 - ax1\n const dy = by1 - ay1\n\n const t = (dx * dby - dy * dbx) / cross\n const s = (dx * day - dy * dax) / cross\n\n // Intersection is valid if both t and s are strictly between 0 and 1 (exclusive)\n // We exclude endpoints to allow walls to meet at corners\n if (t > epsilon && t < 1 - epsilon && s > epsilon && s < 1 - epsilon) {\n return true\n }\n return false\n }\n\n // Lines are parallel - check if they're collinear and overlap\n const dx = bx1 - ax1\n const dy = by1 - ay1\n\n // Cross product of (a1->a2) and (a1->b1) - if zero, points are collinear\n const collinearCross = dax * dy - day * dx\n if (Math.abs(collinearCross) > epsilon) {\n // Parallel but not collinear - no overlap\n return false\n }\n\n // Lines are collinear - check if segments overlap\n // Project onto the axis with greater extent\n let s0: number, s1: number\n\n if (Math.abs(dax) > Math.abs(day)) {\n // Project onto x-axis\n if (Math.abs(dax) < epsilon) return false // Segment A is a point\n s0 = (bx1 - ax1) / dax\n s1 = (bx2 - ax1) / dax\n } else {\n // Project onto y-axis\n if (Math.abs(day) < epsilon) return false // Segment A is a point\n s0 = (by1 - ay1) / day\n s1 = (by2 - ay1) / day\n }\n\n // Ensure s0 <= s1\n if (s0 > s1) {\n const temp = s0\n s0 = s1\n s1 = temp\n }\n\n // Check for overlap - segments overlap if their intervals share more than just endpoints\n // [0, 1] and [s0, s1]\n const overlapStart = Math.max(0, s0)\n const overlapEnd = Math.min(1, s1)\n\n // They overlap if the overlap region has positive length (not just touching at a point)\n return overlapEnd - overlapStart > epsilon\n}\n\n/**\n * Get all existing walls from all children on a level, recursively searching groups.\n * Returns walls with their absolute (world) coordinates.\n */\nexport function getAllWallsOnLevel(\n levelChildren: any[],\n excludeIds?: Set<string> | string,\n): Array<{ x1: number; y1: number; x2: number; y2: number; id: string }> {\n const walls: Array<{ x1: number; y1: number; x2: number; y2: number; id: string }> = []\n\n // Convert single string to Set for consistent handling\n const excludeSet = typeof excludeIds === 'string' ? new Set([excludeIds]) : (excludeIds ?? new Set())\n\n function collectWalls(children: any[], parentPosition: [number, number] = [0, 0]) {\n for (const child of children) {\n // Skip excluded IDs (both walls and groups)\n if (excludeSet.has(child.id)) continue\n\n if (child.type === 'wall') {\n // Convert wall start/end to absolute coordinates\n const [sx, sy] = child.start\n const [ex, ey] = child.end\n walls.push({\n x1: parentPosition[0] + sx,\n y1: parentPosition[1] + sy,\n x2: parentPosition[0] + ex,\n y2: parentPosition[1] + ey,\n id: child.id,\n })\n } else if (child.type === 'group' && child.children) {\n // Recursively search groups (rooms)\n const groupPos: [number, number] = [\n parentPosition[0] + (child.position?.[0] ?? 0),\n parentPosition[1] + (child.position?.[1] ?? 0),\n ]\n collectWalls(child.children, groupPos)\n }\n }\n }\n\n collectWalls(levelChildren)\n return walls\n}\n\n/**\n * Check if any of the given wall segments intersect with existing walls on the level.\n */\nexport function checkWallsOverlap(\n newWalls: Array<{ x1: number; y1: number; x2: number; y2: number }>,\n existingWalls: Array<{ x1: number; y1: number; x2: number; y2: number }>,\n): boolean {\n for (const newWall of newWalls) {\n for (const existingWall of existingWalls) {\n if (segmentsIntersect(newWall, existingWall)) {\n return true\n }\n }\n }\n return false\n}\n\n// Keep the old name as an alias for backwards compatibility\nexport const wallSegmentsOverlap = segmentsIntersect\n","/**\n * Centralized color palette for the editor\n * All colors are defined as hex values\n */\n\n// Preset state colors\nexport const COLORS = {\n // Preview states\n previewValid: '#4cde4c',\n previewInvalid: 0xff_44_44,\n\n // Action states\n delete: 0xff_00_00,\n ghost: 0xaa_aa_aa,\n\n // Glass\n glass: 0xff_ff_ff,\n\n // Solid colors\n white: 0xff_ff_ff,\n black: 0x11_11_11,\n gray: 0x88_88_88,\n pink: 0xff_aa_cc,\n green: 0x44_aa_44,\n blue: 0x44_88_ff,\n red: 0xff_44_44,\n orange: 0xff_88_44,\n yellow: 0xff_dd_44,\n purple: 0xaa_44_ff,\n\n // Default wall colors\n wallDefault: 0xee_ee_ee,\n wallFront: 0xf5_f5_f5,\n wallBack: 0xe0_e0_e0,\n\n // Floor/ceiling\n floor: 0xcc_cc_cc,\n ceiling: 0xfa_fa_fa,\n} as const\n\nexport type ColorName = keyof typeof COLORS\n","import { COLORS } from './colors'\nimport type { MaterialDefinition, MaterialName } from './types'\n\n/**\n * Predefined material definitions for common use cases\n */\nexport const MATERIAL_PRESETS: Record<MaterialName, MaterialDefinition> = {\n // === Preset states ===\n 'preview-valid': {\n name: 'preview-valid',\n type: 'standard',\n color: COLORS.previewValid,\n opacity: 0.6,\n transparent: true,\n metalness: 0,\n roughness: 1,\n emissive: COLORS.previewValid,\n emissiveIntensity: 0.3,\n },\n 'preview-invalid': {\n name: 'preview-invalid',\n type: 'standard',\n color: COLORS.previewInvalid,\n opacity: 0.6,\n transparent: true,\n metalness: 0,\n roughness: 1,\n emissive: COLORS.previewInvalid,\n emissiveIntensity: 0.3,\n },\n delete: {\n name: 'delete',\n type: 'standard',\n color: COLORS.delete,\n opacity: 0.8,\n transparent: true,\n metalness: 0,\n roughness: 1,\n emissive: COLORS.delete,\n emissiveIntensity: 0.5,\n },\n ghost: {\n name: 'ghost',\n type: 'standard',\n color: COLORS.ghost,\n opacity: 0.3,\n transparent: true,\n metalness: 0,\n roughness: 1,\n },\n 'shadow-caster': {\n name: 'shadow-caster',\n type: 'standard',\n color: COLORS.ghost,\n depthWrite: false,\n colorWrite: false,\n },\n glass: {\n name: 'glass',\n type: 'standard',\n color: COLORS.glass,\n opacity: 0.2,\n transparent: true,\n metalness: 0.4,\n roughness: 1,\n transmission: 0.95,\n thickness: 0.5,\n ior: 1.5,\n depthWrite: false,\n },\n\n // === Solid colors ===\n white: {\n name: 'white',\n type: 'standard',\n color: COLORS.white,\n metalness: 0,\n roughness: 0.8,\n },\n black: {\n name: 'black',\n type: 'standard',\n color: COLORS.black,\n metalness: 0,\n roughness: 0.8,\n },\n gray: {\n name: 'gray',\n type: 'standard',\n color: COLORS.gray,\n metalness: 0,\n roughness: 0.8,\n },\n pink: {\n name: 'pink',\n type: 'standard',\n color: COLORS.pink,\n metalness: 0,\n roughness: 0.8,\n },\n green: {\n name: 'green',\n type: 'standard',\n color: COLORS.green,\n metalness: 0,\n roughness: 0.8,\n },\n blue: {\n name: 'blue',\n type: 'standard',\n color: COLORS.blue,\n metalness: 0,\n roughness: 0.8,\n },\n red: {\n name: 'red',\n type: 'standard',\n color: COLORS.red,\n metalness: 0,\n roughness: 0.8,\n },\n orange: {\n name: 'orange',\n type: 'standard',\n color: COLORS.orange,\n metalness: 0,\n roughness: 0.8,\n },\n yellow: {\n name: 'yellow',\n type: 'standard',\n color: COLORS.yellow,\n metalness: 0,\n roughness: 0.8,\n },\n purple: {\n name: 'purple',\n type: 'standard',\n color: COLORS.purple,\n metalness: 0,\n roughness: 0.8,\n },\n\n // === Textured materials ===\n brick: {\n name: 'brick',\n type: 'standard',\n color: '#c5a493',\n metalness: 0,\n roughness: 0.9,\n },\n wood: {\n name: 'wood',\n type: 'standard',\n color: 0xbb_88_55,\n metalness: 0,\n roughness: 0.7,\n textureUrl: '/textures/wood/diffuse.jpg',\n normalMapUrl: '/textures/wood/normal.jpg',\n roughnessMapUrl: '/textures/wood/roughness.jpg',\n },\n concrete: {\n name: 'concrete',\n type: 'physical',\n color: 0x99_99_99,\n metalness: 0,\n roughness: 0.95,\n },\n tile: {\n name: 'tile',\n type: 'standard',\n color: 0xdd_dd_dd,\n metalness: 0.1,\n roughness: 0.3,\n textureUrl: '/textures/tile/diffuse.jpg',\n normalMapUrl: '/textures/tile/normal.jpg',\n },\n marble: {\n name: 'marble',\n type: 'standard',\n color: 0xf0_f0_f0,\n metalness: 0.2,\n roughness: 0.2,\n textureUrl: '/textures/marble/diffuse.jpg',\n normalMapUrl: '/textures/marble/normal.jpg',\n },\n}\n\n/**\n * Get a material definition by name\n */\nexport function getMaterialPreset(name: MaterialName): MaterialDefinition {\n return MATERIAL_PRESETS[name]\n}\n","import {\n Color,\n DoubleSide,\n FrontSide,\n MeshMatcapMaterial,\n MeshPhysicalMaterial,\n MeshStandardMaterial,\n TextureLoader,\n} from 'three'\nimport { depth } from 'three/src/nodes/TSL.js'\nimport { getMaterialPreset } from './presets'\nimport type { MaterialDefinition, MaterialName } from './types'\n\ntype MaterialResult = MeshStandardMaterial | MeshPhysicalMaterial | MeshMatcapMaterial\n\n/**\n * Singleton cache for materials - created lazily on first use\n */\nconst materialCache = new Map<MaterialName, MaterialResult>()\n\n/**\n * Create a Three.js material from a MaterialDefinition (internal use)\n */\nfunction createMaterial(definition: MaterialDefinition): MaterialResult {\n const baseProps: Record<string, unknown> = {\n name: definition.name,\n color: new Color(definition.color),\n side: FrontSide,\n opacity: definition.opacity ?? 1,\n transparent:\n definition.transparent ?? (definition.opacity !== undefined && definition.opacity < 1),\n metalness: definition.metalness ?? 0,\n roughness: definition.roughness ?? 0.5,\n depthWrite: definition.depthWrite ?? true,\n colorWrite: definition.colorWrite ?? true,\n }\n\n // Only add emissive properties if they are defined (Three.js doesn't like undefined values)\n if (definition.emissive !== undefined) {\n baseProps.emissive = new Color(definition.emissive)\n }\n if (definition.emissiveIntensity !== undefined) {\n baseProps.emissiveIntensity = definition.emissiveIntensity\n }\n\n if (definition.type === 'physical') {\n const physicalProps: Record<string, unknown> = { ...baseProps }\n if (definition.transmission !== undefined) physicalProps.transmission = definition.transmission\n if (definition.thickness !== undefined) physicalProps.thickness = definition.thickness\n if (definition.ior !== undefined) physicalProps.ior = definition.ior\n if (definition.clearcoat !== undefined) physicalProps.clearcoat = definition.clearcoat\n if (definition.clearcoatRoughness !== undefined)\n physicalProps.clearcoatRoughness = definition.clearcoatRoughness\n\n return new MeshPhysicalMaterial(physicalProps)\n }\n\n if (definition.type === 'matcap') {\n const textureLoader = new TextureLoader()\n const matcapMaterial = new MeshMatcapMaterial({\n ...baseProps,\n matcap: definition.textureUrl ? textureLoader.load(definition.textureUrl) : undefined,\n })\n return matcapMaterial\n }\n\n return new MeshStandardMaterial(baseProps)\n}\n\n/**\n * Get a material by preset name (singleton, lazily created on first use)\n * Falls back to 'white' if the name is not a valid preset\n */\nexport function getMaterial(name: string): MaterialResult {\n const materialName = name as MaterialName\n let material = materialCache.get(materialName)\n if (!material) {\n const definition = getMaterialPreset(materialName)\n material = createMaterial(definition)\n materialCache.set(materialName, material)\n }\n return material\n}\n\n/**\n * Hook to get a material by preset name\n * Materials are singletons - same instance returned for same name\n */\nexport function useMaterial(name: string): MaterialResult {\n return getMaterial(name)\n}\n\n/**\n * Get material props for use with react-three-fiber meshStandardMaterial JSX\n * Use this when you need to spread props onto a material component\n */\nexport function getMaterialProps(name: MaterialName): {\n color: string\n opacity?: number\n transparent?: boolean\n metalness?: number\n roughness?: number\n emissive?: string\n emissiveIntensity?: number\n} {\n const definition = getMaterialPreset(name)\n return {\n color: `#${new Color(definition.color).getHexString()}`,\n opacity: definition.opacity,\n transparent:\n definition.transparent ?? (definition.opacity !== undefined && definition.opacity < 1),\n metalness: definition.metalness,\n roughness: definition.roughness,\n emissive: definition.emissive ? `#${new Color(definition.emissive).getHexString()}` : undefined,\n emissiveIntensity: definition.emissiveIntensity,\n }\n}\n","'use client'\n\nimport { Addition, Base, Geometry, Subtraction, useCSG } from '@react-three/csg'\nimport { Edges, Line, useGLTF } from '@react-three/drei'\nimport { type ThreeEvent, useFrame } from '@react-three/fiber'\nimport { Suspense, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport * as THREE from 'three'\nimport type { GLTF } from 'three-stdlib'\nimport { useShallow } from 'zustand/react/shallow'\nimport { emitter } from '@pascal/core/events'\nimport { useEditor } from '../../../hooks'\nimport { getMaterialProps, useMaterial } from '@pascal/core/materials'\nimport type { SceneGraph } from '@pascal/core/scenegraph'\nimport type {\n AnyNode,\n GridItem,\n GridPoint,\n ItemNode,\n SceneNode,\n SceneNodeId,\n WallNode,\n} from '@pascal/core'\nimport { TILE_SIZE, WALL_HEIGHT } from '../../../constants'\n\nexport const WALL_THICKNESS = 0.2 // 20cm wall thickness\n// --- Junction Helper Types and Functions (from wall.tsx) ---\ninterface Point {\n x: number\n y: number\n}\ninterface LineEquation {\n a: number\n b: number\n c: number\n}\ninterface ProcessedWall {\n angle: number\n edgeA: LineEquation\n edgeB: LineEquation\n v: Point\n wall_id: string\n pA: Point\n pB: Point\n}\ninterface Junction {\n meetingPoint: Point\n connectedWalls: { wall: LiveWall; endType: 'start' | 'end' }[]\n}\ninterface LiveWall {\n id: string\n start: Point\n end: Point\n thickness: number\n}\n\nfunction pointToKey(p: Point, tolerance = 1e-3): string {\n const snap = 1 / tolerance\n return `${Math.round(p.x * snap)},${Math.round(p.y * snap)}`\n}\n\nfunction getOutgoingVector(wall: LiveWall, endType: 'start' | 'end', meetingPoint: Point): Point {\n if (endType === 'start') {\n return { x: wall.end.x - wall.start.x, y: wall.end.y - wall.start.y }\n }\n return { x: wall.start.x - wall.end.x, y: wall.start.y - wall.end.y }\n}\n\nfunction createLineFromPointAndVector(p: Point, v: Point): LineEquation {\n const a = -v.y\n const b = v.x\n const c = -(a * p.x + b * p.y)\n return { a, b, c }\n}\n\nfunction intersectLines(l1: LineEquation, l2: LineEquation): Point | null {\n const det = l1.a * l2.b - l2.a * l1.b\n if (Math.abs(det) < 1e-9) return null\n const x = (l1.b * l2.c - l2.b * l1.c) / det\n const y = (l2.a * l1.c - l1.a * l2.c) / det\n return { x, y }\n}\n\nfunction findJunctions(walls: LiveWall[]): Map<string, Junction> {\n const junctions = new Map<string, Junction>()\n\n walls.forEach((wall) => {\n const keyStart = pointToKey(wall.start)\n const keyEnd = pointToKey(wall.end)\n\n if (!junctions.has(keyStart)) {\n junctions.set(keyStart, { meetingPoint: wall.start, connectedWalls: [] })\n }\n junctions.get(keyStart)?.connectedWalls.push({ wall, endType: 'start' })\n\n if (!junctions.has(keyEnd)) {\n junctions.set(keyEnd, { meetingPoint: wall.end, connectedWalls: [] })\n }\n junctions.get(keyEnd)?.connectedWalls.push({ wall, endType: 'end' })\n })\n\n const actualJunctions = new Map<string, Junction>()\n for (const [key, junction] of junctions.entries()) {\n if (junction.connectedWalls.length >= 2) {\n actualJunctions.set(key, junction)\n }\n }\n return actualJunctions\n}\n\nfunction calculateJunctionIntersections(junction: Junction) {\n const { meetingPoint, connectedWalls } = junction\n const processedWalls: ProcessedWall[] = []\n\n for (const connected of connectedWalls) {\n const { wall, endType } = connected\n const halfThickness = wall.thickness / 2\n const v = getOutgoingVector(wall, endType, meetingPoint)\n const L = Math.sqrt(v.x * v.x + v.y * v.y)\n\n if (L < 1e-9) continue\n\n const n_unit = { x: -v.y / L, y: v.x / L }\n const pA = {\n x: meetingPoint.x + n_unit.x * halfThickness,\n y: meetingPoint.y + n_unit.y * halfThickness,\n }\n const pB = {\n x: meetingPoint.x - n_unit.x * halfThickness,\n y: meetingPoint.y - n_unit.y * halfThickness,\n }\n\n processedWalls.push({\n angle: Math.atan2(v.y, v.x),\n edgeA: createLineFromPointAndVector(pA, v),\n edgeB: createLineFromPointAndVector(pB, v),\n v,\n wall_id: wall.id,\n pA,\n pB,\n })\n }\n\n processedWalls.sort((a, b) => a.angle - b.angle)\n\n const wallIntersections = new Map<string, { left: Point; right: Point }>()\n const n = processedWalls.length\n if (n < 2) return { wallIntersections }\n\n for (let i = 0; i < n; i++) {\n const wall1 = processedWalls[i]\n const wall2 = processedWalls[(i + 1) % n]\n\n const intersection = intersectLines(wall1.edgeA, wall2.edgeB)\n\n let p: Point\n if (intersection === null) {\n p = wall1.pA\n } else {\n p = intersection\n }\n\n if (!wallIntersections.has(wall1.wall_id)) {\n wallIntersections.set(wall1.wall_id, {} as any)\n }\n wallIntersections.get(wall1.wall_id)!.left = p\n\n if (!wallIntersections.has(wall2.wall_id)) {\n wallIntersections.set(wall2.wall_id, {} as any)\n }\n wallIntersections.get(wall2.wall_id)!.right = p\n }\n\n return { wallIntersections }\n}\n// --- End of Junction Helpers ---\n\ntype NodeProvider = (id: string) => AnyNode | null | undefined\n\n/**\n * Find all ancestors of a node using the node index\n */\nfunction findAncestors(getNode: NodeProvider, nodeId: string): AnyNode[] {\n const ancestors: AnyNode[] = []\n let current = getNode(nodeId)\n\n while (current?.parentId) {\n const parent = getNode(current.parentId)\n if (parent) {\n ancestors.push(parent)\n current = parent\n } else {\n break\n }\n }\n return ancestors\n}\n\n/**\n * Calculate the absolute world position of a node by traversing up through all parents\n * and accumulating position and rotation transforms\n */\nfunction calculateWorldPosition(\n node: AnyNode & GridItem,\n getNode: NodeProvider,\n): { position: [number, number]; rotation: number } {\n // If node doesn't have a parentId property, it's at world root\n if (!node.parentId) {\n return {\n position: node.position,\n rotation: node.rotation,\n }\n }\n\n // Get all ancestors (from immediate parent up to root)\n const ancestors = findAncestors(getNode, node.id)\n\n // Start with the node's local position and rotation\n let worldX = node.position[0]\n let worldY = node.position[1]\n let worldRotation = node.rotation\n\n // Traverse up through ancestors (from immediate parent to root)\n // ancestors array is ordered from immediate parent to root\n for (const ancestor of ancestors) {\n // Check if ancestor has at least position (groups have position but no rotation/size)\n if ('position' in ancestor) {\n const parent = ancestor as any\n const parentRotation = parent.rotation || 0 // Groups don't have rotation, default to 0\n const parentPos = parent.position\n\n // Rotate the current position by parent's rotation (if any)\n if (parentRotation !== 0) {\n const cos = Math.cos(parentRotation)\n const sin = Math.sin(parentRotation)\n const rotatedX = worldX * cos - worldY * sin\n const rotatedY = worldX * sin + worldY * cos\n worldX = parentPos[0] + rotatedX\n worldY = parentPos[1] + rotatedY\n } else {\n // No rotation, just add position offset\n worldX = parentPos[0] + worldX\n worldY = parentPos[1] + worldY\n }\n\n // Add parent's rotation (if any)\n worldRotation += parentRotation\n }\n }\n\n return {\n position: [worldX, worldY],\n rotation: worldRotation,\n }\n}\n\ninterface WallRendererProps {\n nodeId: WallNode['id']\n}\n\n// Create a selector that returns wall IDs and their relevant properties\nexport const selectWallDataFromLevel = (levelId: string) => (state: { graph: SceneGraph }) => {\n const levelHandle = state.graph.getNodeById(levelId as SceneNodeId)\n\n const level = levelHandle?.data()\n if (!level || level.type !== 'level') {\n return { wallIds: [], wallData: {} }\n }\n\n const wallIds: string[] = []\n const wallData: Record<\n string,\n { position: [number, number]; size: [number, number]; rotation: number }\n > = {}\n\n const traverse = (nodes: AnyNode[]) => {\n for (const node of nodes) {\n if (node.type === 'wall') {\n const wall = node as WallNode\n wallIds.push(wall.id)\n wallData[wall.id] = {\n position: wall.position,\n size: wall.size,\n rotation: wall.rotation || 0,\n }\n } else if (node.type === 'group' && 'children' in node && Array.isArray(node.children)) {\n traverse(node.children as AnyNode[])\n }\n }\n }\n\n // Use SceneGraph handles to get children\n const children = levelHandle!.children().map((h) => h.data())\n traverse(children as AnyNode[])\n\n return { wallIds, wallData }\n}\n\nconst createWallDataSelector = (levelId: string) => {\n let lastWallIds: string[] = []\n let lastWallData: Record<string, any> = {}\n let lastResult = { wallIds: lastWallIds, wallData: lastWallData }\n return (state: { graph: SceneGraph }) => {\n const levelHandle = state.graph.getNodeById(levelId as SceneNodeId)\n if (!levelHandle) {\n return lastResult // Return same reference if no level\n }\n\n const wallIds: string[] = []\n const wallData: Record<string, any> = {}\n\n // Recursive traversal helper using scene graph handles or data\n // Since we are inside a selector, accessing state.graph is fine, but state.graph.getNodeById returns handles wrapper around scene\n // We can just use the raw nodes if we want, or handles.\n\n // We need to traverse children recursively.\n // levelHandle.children() is only direct children.\n\n const traverse = (handle: any) => {\n const children = handle.children()\n for (const childHandle of children) {\n const node = childHandle.data()\n if (node.type === 'wall') {\n const wall = node as WallNode\n wallIds.push(wall.id)\n wallData[wall.id] = {\n position: wall.position,\n size: wall.size,\n rotation: wall.rotation || 0,\n start: wall.start,\n end: wall.end,\n }\n } else if (node.type === 'group') {\n traverse(childHandle)\n }\n }\n }\n\n traverse(levelHandle)\n\n // Check if data actually changed\n const idsChanged =\n wallIds.length !== lastWallIds.length || !wallIds.every((id, i) => id === lastWallIds[i])\n\n const dataChanged =\n Object.keys(wallData).length !== Object.keys(lastWallData).length ||\n !Object.keys(wallData).every((key) => {\n const prev = lastWallData[key]\n const next = wallData[key]\n return (\n prev &&\n JSON.stringify(prev.position) === JSON.stringify(next.position) &&\n JSON.stringify(prev.size) === JSON.stringify(next.size) &&\n JSON.stringify(prev.start) === JSON.stringify(next.start) &&\n JSON.stringify(prev.end) === JSON.stringify(next.end) &&\n prev.rotation === next.rotation\n )\n })\n\n if (idsChanged || dataChanged) {\n lastWallIds = wallIds\n lastWallData = wallData\n lastResult = { wallIds, wallData }\n }\n\n return lastResult\n }\n}\n\nexport function WallRenderer({ nodeId }: WallRendererProps) {\n const debug = useEditor((state) => state.debug)\n const {\n isPreview,\n canPlace,\n deletePreview,\n deleteRange,\n paintPreview,\n paintRange,\n paintFace,\n levelId,\n nodeSize,\n nodeChildrenIdsStr,\n materialFront,\n materialBack,\n interiorSide,\n wallMode,\n } = useEditor(\n useShallow((state) => {\n const handle = state.graph.getNodeById(nodeId)\n const node = handle?.data() as WallNode | undefined\n\n // getLevelId helper in state works with node object, but we updated it to take node\n // But store.getLevelId(node) calls graph.getNodeById.\n\n // Actually we can just use handle.meta.levelId directly if available via selector?\n // Yes, SceneGraph handles have meta.\n const levelId = state.graph.index.byId.get(nodeId)?.levelId\n\n return {\n isPreview: node?.editor?.preview === true,\n canPlace: node?.editor?.canPlace !== false,\n deletePreview: node?.editor?.deletePreview === true,\n deleteRange: node?.editor?.deleteRange as [number, number] | undefined,\n paintPreview: node?.editor?.paintPreview === true,\n paintRange: node?.editor?.paintRange as [number, number] | undefined,\n paintFace: node?.editor?.paintFace as 'front' | 'back' | undefined,\n levelId,\n nodeSize: node?.size || [0, 0],\n nodeChildrenIdsStr: JSON.stringify(node?.children?.map((child) => child.id) || []),\n materialFront: node?.materialFront || 'concrete',\n materialBack: node?.materialBack || 'brick',\n interiorSide: node?.interiorSide || 'neither',\n wallMode: state.wallMode,\n }\n }),\n )\n\n // Use it with useMemo to create a stable selector\n const wallDataSelector = useMemo(\n () => createWallDataSelector(levelId ?? ''),\n [levelId, createWallDataSelector],\n )\n const { wallIds, wallData } = useEditor(useShallow(wallDataSelector))\n\n const nodeChildrenIds = useMemo(() => JSON.parse(nodeChildrenIdsStr), [nodeChildrenIdsStr])\n\n // Determine preview colors based on canPlace using centralized materials\n const previewProps = getMaterialProps(canPlace ? 'preview-valid' : 'preview-invalid')\n const previewColor = previewProps.color\n const previewEmissive = previewProps.emissive\n const previewLineDim = canPlace ? '#336633' : '#663333'\n\n // Delete preview colors using centralized materials\n const deleteProps = getMaterialProps('delete')\n const deleteColor = deleteProps.color\n const deleteEmissive = deleteProps.emissive\n\n const selectedFloorId = useEditor((state) => state.selectedFloorId)\n\n // Calculate local space coordinates for preview line\n // The parent group already handles position & rotation, so we render in local space\n const { localEndX, localEndZ } = useMemo(() => {\n const length = nodeSize[0] // Length in grid units\n const worldLength = length * TILE_SIZE\n\n // In local space, start is always at (0, 0) and end is at (length, 0)\n // since the parent group handles the rotation and position\n return {\n localEndX: worldLength,\n localEndZ: 0,\n }\n }, [nodeSize])\n\n // Generate wall geometry similar to wall.tsx with junction handling\n // Note: Geometry is in LOCAL space since parent group handles position & rotation\n const wallGeometry = useMemo(() => {\n // Get wall dimensions from node\n const length = nodeSize[0] // Length in grid units\n const worldLength = length * TILE_SIZE\n const wallHeight = WALL_HEIGHT\n\n if (worldLength < 1e-9) return null // Skip zero-length walls\n\n const halfT = WALL_THICKNESS / 2\n\n // Calculate world space coordinates for junction detection\n // Now using calculateWorldPosition to account for parent transforms\n const graph = useEditor.getState().graph\n const getNode = (id: string) => graph.getNodeById(id as SceneNodeId)?.data()\n\n const wall = getNode(nodeId) as WallNode\n if (!wall) return null\n\n const worldPos = calculateWorldPosition(wall, getNode)\n const [x1, y1] = worldPos.position\n const worldRotation = worldPos.rotation\n\n // Calculate end point in world space\n // rotation was calculated as atan2(-dy, dx), so when reconstructing:\n // x2 = x1 + length * cos(rotation)\n // y2 = y1 - length * sin(rotation) <- Note the minus sign!\n const x2 = x1 + Math.cos(worldRotation) * length\n const y2 = y1 - Math.sin(worldRotation) * length\n\n const liveWalls: LiveWall[] = wallIds.map((wallId) => {\n const data = wallData[wallId]\n\n // Get the actual wall node from the index\n const wallNode = getNode(wallId) as WallNode\n const wWorldPos = calculateWorldPosition(wallNode, getNode)\n const [wx1, wy1] = wWorldPos.position\n const wWorldRotation = wWorldPos.rotation\n const wLength = data.size[0]\n\n const wx2 = wx1 + Math.cos(wWorldRotation) * wLength\n const wy2 = wy1 - Math.sin(wWorldRotation) * wLength\n\n return {\n id: wallId,\n start: { x: wx1 * TILE_SIZE, y: wy1 * TILE_SIZE },\n end: { x: wx2 * TILE_SIZE, y: wy2 * TILE_SIZE },\n thickness: WALL_THICKNESS,\n }\n })\n\n // Find junctions\n const junctions = findJunctions(liveWalls)\n const junctionData = new Map<string, Map<string, { left: Point; right: Point }>>()\n for (const [key, junction] of junctions.entries()) {\n const { wallIntersections } = calculateJunctionIntersections(junction)\n junctionData.set(key, wallIntersections)\n }\n\n // Get this wall's data\n const thisWall = liveWalls.find((w) => w.id === nodeId)\n if (!thisWall) return null\n\n const key_start = pointToKey(thisWall.start)\n const key_end = pointToKey(thisWall.end)\n const startJunctionData = junctionData.get(key_start)?.get(nodeId)\n const endJunctionData = junctionData.get(key_end)?.get(nodeId)\n\n // Helper to transform world point to local space\n const worldToLocal = (worldPoint: Point): { x: number; z: number } => {\n // Translate to origin\n const dx = worldPoint.x - thisWall.start.x\n const dy = worldPoint.y - thisWall.start.y\n // Since rotation = atan2(-dy, dx), we rotate by +rotation (not -rotation) to align with +X axis\n const cos = Math.cos(worldRotation)\n const sin = Math.sin(worldRotation)\n return {\n x: dx * cos - dy * sin,\n z: dx * sin + dy * cos,\n }\n }\n\n // Calculate local space corners\n let p_start_L: { x: number; z: number }\n let p_start_R: { x: number; z: number }\n let p_end_L: { x: number; z: number }\n let p_end_R: { x: number; z: number }\n\n if (startJunctionData) {\n p_start_L = worldToLocal(startJunctionData.left)\n p_start_R = worldToLocal(startJunctionData.right)\n } else {\n p_start_L = { x: 0, z: halfT }\n p_start_R = { x: 0, z: -halfT }\n }\n\n if (endJunctionData) {\n p_end_L = worldToLocal(endJunctionData.right)\n p_end_R = worldToLocal(endJunctionData.left)\n } else {\n p_end_L = { x: worldLength, z: halfT }\n p_end_R = { x: worldLength, z: -halfT }\n }\n\n // Build polygon in local space\n const polyPoints = [p_start_R, p_end_R]\n if (endJunctionData) polyPoints.push({ x: worldLength, z: 0 }) // center point\n polyPoints.push(p_end_L, p_start_L)\n if (startJunctionData) polyPoints.push({ x: 0, z: 0 }) // center point\n\n // Create THREE.Shape\n // Note: After rotation by -π/2 around X, Vector2(x,y) becomes 3D(x,z,-y)\n // So to get the correct z orientation, we negate: Vector2(x, -z)\n const shapePoints = polyPoints.map((p) => new THREE.Vector2(p.x, -p.z))\n const shape = new THREE.Shape(shapePoints)\n\n // Create Extrude Geometry\n const extrudeSettings: THREE.ExtrudeGeometryOptions = {\n depth: wallHeight,\n bevelEnabled: false,\n UVGenerator: {\n generateTopUV: (_geo, vertices, ...idx) => {\n const [a, b, c] = idx\n return [\n new THREE.Vector2(vertices[a * 3] + 0.5, vertices[a * 3 + 1] + 0.5),\n new THREE.Vector2(vertices[b * 3] + 0.5, vertices[b * 3 + 1] + 0.5),\n new THREE.Vector2(vertices[c * 3] + 0.5, vertices[c * 3 + 1] + 0.5),\n ]\n },\n generateSideWallUV: (_geo, vertices, ...idx) => {\n const [a, b, c, d] = idx\n return [\n new THREE.Vector2(vertices[a * 3], vertices[a * 3 + 1]),\n new THREE.Vector2(vertices[b * 3], vertices[b * 3 + 1]),\n new THREE.Vector2(vertices[c * 3], vertices[c * 3 + 1]),\n new THREE.Vector2(vertices[d * 3], vertices[d * 3 + 1]),\n ]\n },\n },\n }\n const geometry = new THREE.ExtrudeGeometry(shape, extrudeSettings)\n\n // Rotate to lie on XZ plane and extrude along Y\n geometry.rotateX(-Math.PI / 2)\n\n // Assign material groups based on face normals (after rotation)\n // Material indices: 0 = front (+Z), 1 = back (-Z), 2 = sides (top/bottom/ends)\n const positions = geometry.getAttribute('position')\n const indices = geometry.getIndex()\n\n geometry.clearGroups()\n\n // Helper vectors for computing face normal\n const vA = new THREE.Vector3()\n const vB = new THREE.Vector3()\n const vC = new THREE.Vector3()\n const ab = new THREE.Vector3()\n const ac = new THREE.Vector3()\n const faceNormal = new THREE.Vector3()\n\n // Determine number of triangles and how to access vertex indices\n const isIndexed = indices !== null\n const numTriangles = isIndexed ? indices.count / 3 : positions.count / 3\n\n // Process each triangle and assign to material group based on computed face normal\n let currentGroup: { start: number; count: number; materialIndex: number } | null = null\n\n for (let i = 0; i < numTriangles; i++) {\n const triStart = i * 3\n\n // Get vertex indices - for non-indexed geometry, vertices are sequential\n const idxA = isIndexed ? indices.getX(triStart) : triStart\n const idxB = isIndexed ? indices.getX(triStart + 1) : triStart + 1\n const idxC = isIndexed ? indices.getX(triStart + 2) : triStart + 2\n\n // Get triangle vertices\n vA.fromBufferAttribute(positions, idxA)\n vB.fromBufferAttribute(positions, idxB)\n vC.fromBufferAttribute(positions, idxC)\n\n // Compute face normal using cross product\n ab.subVectors(vB, vA)\n ac.subVectors(vC, vA)\n faceNormal.crossVectors(ab, ac).normalize()\n\n const nx = faceNormal.x\n const ny = faceNormal.y\n const nz = faceNormal.z\n\n // Determine material based on dominant normal direction\n let materialIndex: number\n const absX = Math.abs(nx)\n const absY = Math.abs(ny)\n const absZ = Math.abs(nz)\n\n if (absZ > absX && absZ > absY) {\n // Z-facing: front or back wall surfaces\n materialIndex = nz > 0 ? 0 : 1 // 0 = front (+Z), 1 = back (-Z)\n } else {\n // X or Y facing: sides (end caps, top, bottom)\n materialIndex = 2\n }\n\n // Group consecutive triangles with same material\n if (currentGroup === null || currentGroup.materialIndex !== materialIndex) {\n if (currentGroup !== null) {\n geometry.addGroup(currentGroup.start, currentGroup.count, currentGroup.materialIndex)\n }\n currentGroup = { start: triStart, count: 3, materialIndex }\n } else {\n currentGroup.count += 3\n }\n }\n\n // Add the last group\n if (currentGroup !== null) {\n geometry.addGroup(currentGroup.start, currentGroup.count, currentGroup.materialIndex)\n }\n\n return geometry\n }, [wallData, wallIds, nodeId, nodeSize])\n\n // Generate geometry for the delete preview segment (only the portion to be deleted)\n const deleteSegmentGeometry = useMemo(() => {\n if (!deleteRange) return null\n\n const [rangeStart, rangeEnd] = deleteRange\n const wallHeight = WALL_HEIGHT\n const halfT = WALL_THICKNESS / 2\n\n // Calculate segment bounds in world units\n const segmentStartX = rangeStart * TILE_SIZE\n const segmentEndX = (rangeEnd + 1) * TILE_SIZE // +1 because range is inclusive\n\n // Simple box geometry for the segment (no junction handling for preview)\n const shapePoints = [\n new THREE.Vector2(segmentStartX, halfT),\n new THREE.Vector2(segmentEndX, halfT),\n new THREE.Vector2(segmentEndX, -halfT),\n new THREE.Vector2(segmentStartX, -halfT),\n ]\n const shape = new THREE.Shape(shapePoints)\n\n const extrudeSettings = { depth: wallHeight, bevelEnabled: false }\n const geometry = new THREE.ExtrudeGeometry(shape, extrudeSettings)\n geometry.rotateX(-Math.PI / 2)\n\n return geometry\n }, [deleteRange])\n\n // Generate geometry for the paint preview segment - only on the specified face\n const paintSegmentGeometry = useMemo(() => {\n if (!paintRange) return null\n if (!paintFace) return null\n\n const [rangeStart, rangeEnd] = paintRange\n const wallHeight = WALL_HEIGHT\n const halfT = WALL_THICKNESS / 2\n\n // Calculate segment bounds in world units\n const segmentStartX = rangeStart * TILE_SIZE\n const segmentEndX = (rangeEnd + 1) * TILE_SIZE // +1 because range is inclusive\n\n // Create a thin plane on only the specified face (front = +Z, back = -Z)\n const planeThickness = 0.02\n const zOffset = paintFace === 'front' ? halfT + planeThickness / 2 : -halfT - planeThickness / 2\n\n // Create plane geometry for the face\n const planeWidth = segmentEndX - segmentStartX\n const geometry = new THREE.BoxGeometry(planeWidth, wallHeight, planeThickness)\n\n // Position the plane: center it on the segment and at the correct Z offset\n geometry.translate(segmentStartX + planeWidth / 2, wallHeight / 2, zOffset)\n\n return geometry\n }, [paintRange, paintFace])\n\n // Determine opacity based on selected floo, [allWalls]r\n // When no floor is selected (selectedFloorId === null), show all walls fully opaque (like full view mode)\n // When a floor is selected, show only that floor's walls fully opaque, others semi-transparent\n const isActiveFloor = selectedFloorId === null || levelId === selectedFloorId\n\n const opacity = isActiveFloor ? 1 : 0.3\n const transparent = !isActiveFloor\n\n const getClosestGridPoint = useCallback(\n (point: THREE.Vector3, object: THREE.Object3D): GridPoint => {\n // Transform the world point to the wall mesh's local coordinate system\n // This automatically handles all parent transforms (room, level, etc.)\n const localPoint = object.worldToLocal(point.clone())\n\n // Convert to grid coordinates in local space\n const localGridX = localPoint.x / TILE_SIZE\n const localGridZ = localPoint.z / TILE_SIZE\n\n // In wall-local space, the wall runs from (0, 0) to (length, 0) along the X-axis\n const wallLength = nodeSize[0] // Wall length in grid units\n\n // Project onto the wall's X-axis (the wall runs horizontally in its local space)\n // Clamp to [0, wallLength]\n const projectedX = Math.max(0, Math.min(wallLength, localGridX))\n\n // Return the grid position in wall-local coordinates\n // Round to nearest grid point\n const localGridPoint: GridPoint = {\n x: Math.round(projectedX),\n z: 0, // Always 0 in wall-local space (on the wall surface)\n }\n\n return localGridPoint\n },\n [nodeSize],\n )\n // Event handlers\n\n const onPointerDown = useCallback(\n (e: ThreeEvent<PointerEvent>) => {\n // Only emit events for left-click (button 0)\n if (e.button !== 0) return\n\n const node = useEditor.getState().graph.getNodeById(nodeId)?.data() as WallNode\n const eventData = {\n node,\n gridPosition: getClosestGridPoint(e.point, e.object),\n position: [e.point.x, e.point.y, e.point.z] as [number, number, number],\n normal: e.face\n ? ([e.face.normal.x, e.face.normal.y, e.face.normal.z] as [number, number, number])\n : undefined,\n stopPropagation: () => e.stopPropagation(),\n }\n emitter.emit('wall:click', eventData)\n emitter.emit('wall:pointerdown', eventData)\n },\n [getClosestGridPoint, nodeId],\n )\n\n const onPointerUp = useCallback(\n (e: ThreeEvent<PointerEvent>) => {\n // Only emit events for left-click (button 0)\n if (e.button !== 0) return\n\n const node = useEditor.getState().graph.getNodeById(nodeId)?.data() as WallNode\n emitter.emit('wall:pointerup', {\n node,\n gridPosition: getClosestGridPoint(e.point, e.object),\n position: [e.point.x, e.point.y, e.point.z],\n normal: e.face\n ? ([e.face.normal.x, e.face.normal.y, e.face.normal.z] as [number, number, number])\n : undefined,\n stopPropagation: () => e.stopPropagation(),\n })\n },\n [getClosestGridPoint, nodeId],\n )\n\n const onPointerEnter = useCallback(\n (e: ThreeEvent<PointerEvent>) => {\n const node = useEditor.getState().graph.getNodeById(nodeId)?.data() as WallNode\n emitter.emit('wall:enter', {\n node,\n gridPosition: getClosestGridPoint(e.point, e.object),\n position: [e.point.x, e.point.y, e.point.z],\n normal: e.face ? [e.face.normal.x, e.face.normal.y, e.face.normal.z] : undefined,\n stopPropagation: () => e.stopPropagation(),\n })\n },\n [getClosestGridPoint, nodeId],\n )\n\n const onPointerLeave = useCallback(\n (e: ThreeEvent<PointerEvent>) => {\n const node = useEditor.getState().graph.getNodeById(nodeId)?.data() as WallNode\n emitter.emit('wall:leave', {\n node,\n gridPosition: getClosestGridPoint(e.point, e.object),\n position: [e.point.x, e.point.y, e.point.z],\n normal: e.face ? [e.face.normal.x, e.face.normal.y, e.face.normal.z] : undefined,\n stopPropagation: () => e.stopPropagation(),\n })\n },\n [getClosestGridPoint, nodeId],\n )\n\n const onPointerMove = useCallback(\n (e: ThreeEvent<PointerEvent>) => {\n const node = useEditor.getState().graph.getNodeById(nodeId)?.data() as WallNode\n emitter.emit('wall:move', {\n node,\n gridPosition: getClosestGridPoint(e.point, e.object),\n position: [e.point.x, e.point.y, e.point.z],\n normal: e.face ? [e.face.normal.x, e.face.normal.y, e.face.normal.z] : undefined,\n stopPropagation: () => e.stopPropagation(),\n })\n },\n [getClosestGridPoint, nodeId],\n )\n\n const selectedMaterial = useEditor((state) => state.selectedMaterial)\n\n const frontMaterial = useMaterial(materialFront)\n const backMaterial = useMaterial(materialBack)\n const sidesMaterial = useMaterial('white')\n const ghostMaterial = useMaterial('ghost')\n const paintMaterial = useMaterial(selectedMaterial)\n const shadowCasterMaterial = useMaterial('shadow-caster')\n\n const wallMaterial = useMemo(\n () => (isActiveFloor ? [frontMaterial, backMaterial, sidesMaterial] : ghostMaterial),\n [isActiveFloor, frontMaterial, backMaterial, sidesMaterial, ghostMaterial],\n )\n\n const u = new THREE.Vector3()\n const v = new THREE.Vector3()\n const wallMesh = useRef<THREE.Mesh>(null)\n const miniwallMesh = useRef<THREE.Mesh>(null)\n const activeTool = useEditor((state) => state.activeTool)\n const controlMode = useEditor((state) => state.controlMode)\n const lastCheckedAt = useRef(0)\n const cachedMaterial = useRef<THREE.Material | THREE.Material[] | null>(null)\n\n useFrame(({ camera, clock }) => {\n if (clock.elapsedTime - lastCheckedAt.current < 0.2) {\n return\n }\n camera.getWorldDirection(u)\n lastCheckedAt.current = clock.elapsedTime\n if (wallMesh.current) {\n wallMesh.current.getWorldDirection(v)\n\n let hideWall = false\n\n if (\n activeTool === 'wall' ||\n activeTool === 'custom-room' ||\n activeTool === 'room' ||\n controlMode === 'painting' ||\n wallMode === 'up'\n ) {\n hideWall = false\n } else if (wallMode === 'down') {\n hideWall = true\n } else if (interiorSide === 'front') {\n hideWall = v.dot(u) > 0\n } else if (interiorSide === 'back') {\n hideWall = v.dot(u) < 0\n } else if (interiorSide === 'both') {\n hideWall = true\n }\n\n // Handle material switching to preserve CSG materials (which may extend the material array)\n if (hideWall) {\n if (wallMesh.current.material !== shadowCasterMaterial) {\n cachedMaterial.current = wallMesh.current.material\n wallMesh.current.material = shadowCasterMaterial\n }\n } else if (wallMesh.current.material === shadowCasterMaterial) {\n // If we are showing the wall, make sure we aren't using the shadow caster\n if (cachedMaterial.current) {\n wallMesh.current.material = cachedMaterial.current\n } else {\n // Fallback to base materials if cache is missing\n wallMesh.current.material = wallMaterial\n }\n }\n // If material is not shadowCasterMaterial, we assume it's the correct CSG material\n // and leave it alone (don't overwrite with wallMaterial which might be missing CSG parts)\n\n if (miniwallMesh.current) {\n miniwallMesh.current.visible = hideWall\n }\n }\n })\n\n lastCheckedAt.current = 0\n if (!wallGeometry) return null\n\n return (\n <>\n {isPreview ? (\n <>\n {/* Preview line - occluded version (dimmer) */}\n <Line\n color={previewLineDim}\n dashed={false}\n depthTest={false}\n lineWidth={2}\n opacity={0.3}\n points={[\n [0, 0.1, 0], // Start at origin in local space\n [localEndX, 0.1, localEndZ], // End at length along local X axis\n ]}\n transparent\n />\n\n {/* Preview line - visible version (brighter) */}\n <Line\n color={previewColor}\n dashed={false}\n depthTest={true}\n lineWidth={3}\n points={[\n [0, 0.1, 0], // Start at origin in local space\n [localEndX, 0.1, localEndZ], // End at length along local X axis\n ]}\n />\n\n {/* Occluded/behind version - dimmer, shows through everything */}\n <mesh geometry={wallGeometry} renderOrder={1}>\n <meshStandardMaterial\n color={previewColor}\n depthTest={false}\n depthWrite={false}\n emissive={previewEmissive}\n emissiveIntensity={0.1}\n opacity={0.15}\n transparent\n />\n </mesh>\n\n {/* Visible/front version - brighter, only shows when not occluded */}\n <mesh geometry={wallGeometry} renderOrder={2}>\n <meshStandardMaterial\n color={previewColor}\n depthTest={true}\n depthWrite={false}\n emissive={previewEmissive}\n emissiveIntensity={0.4}\n opacity={0.5}\n transparent\n />\n </mesh>\n </>\n ) : (\n <>\n <group>\n {/* INVISIBLE MESH USED FOR EVENTS */}\n {isActiveFloor && (\n <mesh\n geometry={wallGeometry}\n onPointerDown={onPointerDown}\n onPointerEnter={onPointerEnter}\n onPointerLeave={onPointerLeave}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n visible={false}\n />\n )}\n <mesh\n geometry={wallGeometry}\n material={sidesMaterial}\n ref={miniwallMesh}\n scale-y={0.05}\n visible={false}\n />\n <mesh castShadow receiveShadow ref={wallMesh}>\n <Geometry useGroups>\n <Base geometry={wallGeometry} material={wallMaterial} />\n {nodeChildrenIds.map((openingId: string) => (\n <WallOpening key={openingId} nodeId={openingId} />\n ))}\n {/* Delete preview overlay - only shows the segment to be deleted */}\n {deletePreview && deleteSegmentGeometry && (\n <Subtraction geometry={deleteSegmentGeometry} renderOrder={100} showOperation>\n <meshStandardMaterial\n color={deleteColor}\n depthTest={true}\n depthWrite={false}\n emissive={deleteEmissive}\n emissiveIntensity={0.6}\n opacity={0.6}\n transparent\n />\n </Subtraction>\n )}\n {/* {hideWallBasedOnCameraPosition && (\n <Subtraction\n position-x={nodeSize[0] * TILE_SIZE * 0.5}\n position-y={WALL_HEIGHT / 2 + WALL_HEIGHT * 0.2}\n renderOrder={10}\n >\n <boxGeometry args={[nodeSize[0] * TILE_SIZE, WALL_HEIGHT, nodeSize[1]]} />\n </Subtraction>\n )} */}\n {/* Paint preview overlay - shows the segment to be painted */}\n {paintPreview && paintSegmentGeometry && (\n <Addition\n geometry={paintSegmentGeometry}\n material={paintMaterial}\n showOperation\n />\n )}\n </Geometry>\n {debug && (\n <Edges\n color=\"#000000\"\n key={wallGeometry.id}\n linewidth={1}\n opacity={0.1}\n renderOrder={1000}\n threshold={15}\n />\n )}\n </mesh>\n </group>\n </>\n )}\n </>\n )\n}\n\nconst WallOpening = ({ nodeId }: { nodeId: string }) => {\n const opening = useEditor(\n useShallow((state) => {\n const handle = state.graph.getNodeById(nodeId as SceneNodeId)\n const node = handle?.data()\n\n return {\n position: (node as any)?.position,\n modelPosition: (node as ItemNode)?.modelPosition || [0, 0, 0],\n modelScale: (node as ItemNode)?.modelScale || [1, 1, 1],\n nodeSrc: (node as ItemNode)?.src,\n }\n }),\n )\n\n if (!opening.nodeSrc) {\n return null\n }\n\n return (\n <Suspense>\n <WallCutout\n key={`${opening.position.join(',')}-${opening.nodeSrc}`}\n modelPosition={opening.modelPosition}\n modelScale={opening.modelScale}\n position={opening.position}\n src={opening.nodeSrc}\n />\n </Suspense>\n )\n}\n\ntype GLTFResult = GLTF & {\n nodes: {\n cutout?: THREE.Mesh\n }\n}\n\nconst WallCutout = ({\n position,\n src,\n modelPosition,\n modelScale,\n}: {\n position: ItemNode['position']\n src: ItemNode['src']\n modelPosition: ItemNode['modelPosition']\n modelScale: ItemNode['modelScale']\n}) => {\n const { nodes } = useGLTF(src) as GLTFResult\n const { update } = useCSG()\n const [isReady, setIsReady] = useState(false)\n\n useEffect(() => {\n if (!nodes.cutout?.geometry) return\n\n // Check if BVH methods are available, if not wait a frame\n if (typeof nodes.cutout.geometry.disposeBoundsTree !== 'function') {\n const timeout = setTimeout(() => setIsReady(true), 0)\n return () => clearTimeout(timeout)\n }\n\n setIsReady(true)\n }, [nodes.cutout?.geometry])\n\n useEffect(() => {\n if (isReady && nodes.cutout?.geometry) {\n update()\n }\n }, [isReady, update, nodes.cutout?.geometry])\n\n if (!(isReady && nodes.cutout?.geometry)) return null\n\n return (\n <Subtraction\n geometry={nodes.cutout.geometry}\n position-x={modelPosition[0] + position[0] * TILE_SIZE}\n position-y={modelPosition[1]}\n position-z={modelPosition[2] + position[1] * TILE_SIZE}\n raycast={() => null}\n scale={modelScale}\n >\n <meshStandardMaterial color={'skyblue'} opacity={0.5} transparent />\n </Subtraction>\n )\n}\n","'use client'\n\nimport { Minus } from 'lucide-react'\nimport { useEffect, useRef } from 'react'\nimport { emitter, type GridEvent } from '@pascal/core/events'\nimport { useEditor } from '../../../hooks'\nimport { getAllWallsOnLevel, wallSegmentsOverlap } from '../../../geometry/wall-overlap'\nimport { registerComponent } from '../../../registry'\nimport { WallNode } from '@pascal/core/scenegraph/schema/nodes/wall'\nimport { WallRenderer } from './wall-renderer'\n\n// ============================================================================\n// WALL NODE EDITOR\n// ============================================================================\n\n/**\n * Wall node editor component\n * Uses useEditor hooks directly to manage wall creation\n */\nconst EMPTY_LEVELS: any[] = []\n\nexport function WallNodeEditor() {\n const addNode = useEditor((state) => state.addNode)\n const updateNode = useEditor((state) => state.updateNode)\n const deleteNode = useEditor((state) => state.deleteNode)\n const selectedFloorId = useEditor((state) => state.selectedFloorId)\n const levels = useEditor((state) => {\n const building = state.scene.root.children?.[0]?.children.find((c) => c.type === 'building')\n return building ? building.children : EMPTY_LEVELS\n })\n\n // Use ref to persist values across renders without triggering re-renders\n const wallStateRef = useRef<{\n startPoint: [number, number] | null\n previewWallId: string | null\n lastEndPoint: [number, number] | null\n }>({\n startPoint: null,\n previewWallId: null,\n lastEndPoint: null,\n })\n\n useEffect(() => {\n const calculateWallEndPoint = (x: number, y: number): [number, number] => {\n const wallStartPoint = wallStateRef.current.startPoint\n if (wallStartPoint === null) {\n return [x, y]\n }\n const [x1, y1] = wallStartPoint\n\n let projectedX = x1\n let projectedY = y1\n\n const dx = x - x1\n const dy = y - y1\n const absDx = Math.abs(dx)\n const absDy = Math.abs(dy)\n\n // Calculate distances to horizontal, vertical, and diagonal lines\n const horizontalDist = absDy\n const verticalDist = absDx\n const diagonalDist = Math.abs(absDx - absDy)\n\n // Find the minimum distance to determine which axis to snap to\n const minDist = Math.min(horizontalDist, verticalDist, diagonalDist)\n\n if (minDist === diagonalDist) {\n // Snap to 45° diagonal\n const diagonalLength = Math.min(absDx, absDy)\n projectedX = x1 + Math.sign(dx) * diagonalLength\n projectedY = y1 + Math.sign(dy) * diagonalLength\n } else if (minDist === horizontalDist) {\n // Snap to horizontal\n projectedX = x\n projectedY = y1\n } else {\n // Snap to vertical\n projectedX = x1\n projectedY = y\n }\n\n return [projectedX, projectedY]\n }\n\n const handleGridClick = (e: GridEvent) => {\n if (!selectedFloorId) return\n\n const [x, y] = e.position\n if (wallStateRef.current.startPoint === null) {\n // First click: set start point and create preview node\n wallStateRef.current.startPoint = [x, y]\n wallStateRef.current.lastEndPoint = null // Reset last end point\n\n // Create preview wall node\n const previewWallId = addNode(\n WallNode.parse({\n name: 'Wall Preview',\n position: [x, y],\n rotation: 0,\n size: [0, 0.2], // Zero length initially\n start: [x, y],\n end: [x, y],\n editor: { preview: true },\n }),\n selectedFloorId,\n )\n\n wallStateRef.current.previewWallId = previewWallId\n } else {\n // Second click: commit or delete the preview wall based on canPlace\n const previewWallId = wallStateRef.current.previewWallId\n\n if (previewWallId) {\n // Get the wall node to check if it can be placed\n const currentLevel = levels.find((l) => l.id === selectedFloorId)\n const wallNode = currentLevel?.children.find((child: any) => child.id === previewWallId)\n\n if (wallNode && 'canPlace' in wallNode && wallNode.canPlace === false) {\n // Wall is invalid (overlapping or zero length), delete it\n deleteNode(previewWallId)\n } else {\n // Wall is valid, commit the preview by setting preview: false\n updateNode(previewWallId, { editor: { preview: false } })\n }\n }\n\n // Reset state\n wallStateRef.current.startPoint = null\n wallStateRef.current.previewWallId = null\n wallStateRef.current.lastEndPoint = null\n }\n }\n\n const handleGridMove = (e: GridEvent) => {\n if (!selectedFloorId) return\n\n const [x, y] = e.position\n const wallStartPoint = wallStateRef.current.startPoint\n const previewWallId = wallStateRef.current.previewWallId\n\n if (wallStartPoint !== null && previewWallId) {\n const [x1, y1] = wallStartPoint\n const [x2, y2] = calculateWallEndPoint(x, y)\n\n // Only update if the end point has changed\n const lastEndPoint = wallStateRef.current.lastEndPoint\n if (!lastEndPoint || lastEndPoint[0] !== x2 || lastEndPoint[1] !== y2) {\n wallStateRef.current.lastEndPoint = [x2, y2]\n\n // Calculate new wall properties\n const dx = x2 - x1\n const dy = y2 - y1\n const length = Math.sqrt(dx * dx + dy * dy)\n const rotation = Math.atan2(-dy, dx) // Negate dy to match 3D z-axis direction\n\n // Wall can only be placed if it has non-zero length\n let canPlace = length >= 1\n\n // Check for overlap with existing walls on the same level (including walls inside rooms)\n if (canPlace) {\n const currentLevel = levels.find((l) => l.id === selectedFloorId)\n if (currentLevel?.children) {\n // Get all walls on the level, excluding walls from our preview\n const existingWalls = getAllWallsOnLevel(currentLevel.children, previewWallId)\n\n // Check if new wall overlaps with any existing wall\n for (const existingWall of existingWalls) {\n if (wallSegmentsOverlap({ x1, y1, x2, y2 }, existingWall)) {\n canPlace = false\n break\n }\n }\n }\n }\n\n // Update preview wall\n updateNode(previewWallId, {\n size: [length, 0.2] as [number, number],\n rotation,\n start: [x1, y1],\n end: [x2, y2],\n editor: { canPlace, preview: true },\n })\n }\n }\n }\n\n const handleToolCancel = () => {\n // Only cancel if we've started drawing (first click done)\n if (wallStateRef.current.startPoint !== null && wallStateRef.current.previewWallId) {\n deleteNode(wallStateRef.current.previewWallId)\n wallStateRef.current.startPoint = null\n wallStateRef.current.previewWallId = null\n wallStateRef.current.lastEndPoint = null\n }\n }\n\n // Register event listeners\n emitter.on('grid:click', handleGridClick)\n emitter.on('grid:move', handleGridMove)\n emitter.on('tool:cancel', handleToolCancel)\n\n // Cleanup event listeners\n return () => {\n emitter.off('grid:click', handleGridClick)\n emitter.off('grid:move', handleGridMove)\n emitter.off('tool:cancel', handleToolCancel)\n }\n }, [addNode, updateNode, deleteNode, selectedFloorId, levels])\n\n return null\n}\n\n// ============================================================================\n// REGISTER WALL COMPONENT\n// ============================================================================\n\nregisterComponent({\n nodeType: 'wall',\n nodeName: 'Wall',\n editorMode: 'building',\n toolName: 'wall',\n toolIcon: Minus,\n schema: WallNode,\n nodeEditor: WallNodeEditor,\n nodeRenderer: WallRenderer,\n})\n","import * as e from \"react\";\nconst t = /* @__PURE__ */ new Map([\n [\n \"bold\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M179.14,24.08C165.28,16.29,147.12,12,128,12S90.72,16.29,76.86,24.08C60.83,33.1,52,45.86,52,60V196c0,14.14,8.83,26.9,24.86,35.92C90.72,239.71,108.88,244,128,244s37.28-4.29,51.14-12.08c16-9,24.86-21.78,24.86-35.92V60C204,45.86,195.17,33.1,179.14,24.08ZM88.63,45c10.17-5.72,24.52-9,39.37-9s29.2,3.28,39.37,9c8,4.52,12.63,10,12.63,15s-4.6,10.48-12.63,15c-10.17,5.72-24.52,9-39.37,9s-29.2-3.28-39.37-9C80.6,70.48,76,65,76,60S80.6,49.52,88.63,45Zm78.74,166c-10.17,5.72-24.52,9-39.37,9s-29.2-3.28-39.37-9C80.6,206.48,76,201,76,196V95.4l.86.52C90.72,103.71,108.88,108,128,108s37.28-4.29,51.14-12.08l.86-.52V196C180,201,175.4,206.48,167.37,211Z\" }))\n ],\n [\n \"duotone\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n \"path\",\n {\n d: \"M192,60c0,19.88-28.65,36-64,36S64,79.88,64,60s28.65-36,64-36S192,40.12,192,60Z\",\n opacity: \"0.2\"\n }\n ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,16C87.63,16,56,35.33,56,60V196c0,24.67,31.63,44,72,44s72-19.33,72-44V60C200,35.33,168.37,16,128,16Zm0,16c26.49,0,56,11.5,56,28s-29.51,28-56,28S72,76.5,72,60,101.51,32,128,32Zm0,192c-29.83,0-56-13.08-56-28V88c13.1,9.85,33.14,16,56,16s42.9-6.2,56-16V196C184,210.92,157.83,224,128,224Z\" }))\n ],\n [\n \"fill\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,16C87.63,16,56,35.33,56,60V196c0,24.67,31.63,44,72,44s72-19.33,72-44V60C200,35.33,168.37,16,128,16Zm0,208c-29.83,0-56-13.08-56-28V77.43C82.92,88.5,103.9,96,128,96s45.08-7.5,56-18.57V196C184,210.92,157.83,224,128,224Z\" }))\n ],\n [\n \"light\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,18C88.75,18,58,36.45,58,60V196c0,23.55,30.75,42,70,42s70-18.45,70-42V60C198,36.45,167.25,18,128,18Zm0,12c31.44,0,58,13.74,58,30s-26.56,30-58,30S70,76.26,70,60,96.56,30,128,30Zm0,196c-31.44,0-58-13.74-58-30V83.81C82.48,94.87,103.59,102,128,102s45.52-7.13,58-18.19V196C186,212.26,159.44,226,128,226Z\" }))\n ],\n [\n \"regular\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,16C87.63,16,56,35.33,56,60V196c0,24.67,31.63,44,72,44s72-19.33,72-44V60C200,35.33,168.37,16,128,16Zm0,16c26.49,0,56,11.5,56,28s-29.51,28-56,28S72,76.5,72,60,101.51,32,128,32Zm0,192c-29.83,0-56-13.08-56-28V88c13.1,9.85,33.14,16,56,16s42.9-6.2,56-16V196C184,210.92,157.83,224,128,224Z\" }))\n ],\n [\n \"thin\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,20C89.87,20,60,37.57,60,60V196c0,22.43,29.87,40,68,40s68-17.57,68-40V60C196,37.57,166.13,20,128,20Zm0,8c32.52,0,60,14.65,60,32s-27.48,32-60,32S68,77.35,68,60,95.48,28,128,28Zm60,168c0,17.35-27.48,32-60,32s-60-14.65-60-32V79.11C79.35,91.65,101.71,100,128,100s48.65-8.35,60-20.89Z\" }))\n ]\n]);\nexport {\n t as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n [\n \"bold\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M200,20H56A20,20,0,0,0,36,40V216a20,20,0,0,0,20,20H200a20,20,0,0,0,20-20V40A20,20,0,0,0,200,20ZM152,148h44v16H116V148Zm12-24V108h32v16Zm32-80V84H152a12,12,0,0,0-12,12v28H104a12,12,0,0,0-12,12v28H60V44ZM60,212V188H196v24Z\" }))\n ],\n [\n \"duotone\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n \"path\",\n {\n d: \"M208,40V96H152v40H104v40H48V40a8,8,0,0,1,8-8H200A8,8,0,0,1,208,40Z\",\n opacity: \"0.2\"\n }\n ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M200,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V40A16,16,0,0,0,200,24ZM152,144h48v24H112V144Zm8-16V104h40v24Zm40-88V88H152a8,8,0,0,0-8,8v32H104a8,8,0,0,0-8,8v32H56V40Zm0,176H56V184H200v32Z\" }))\n ],\n [\n \"fill\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M200,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V40A16,16,0,0,0,200,24Zm-40,80h40v24H160Zm-48,40h88v24H112Zm88,72H56V184H200v32Z\" }))\n ],\n [\n \"light\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M200,26H56A14,14,0,0,0,42,40V216a14,14,0,0,0,14,14H200a14,14,0,0,0,14-14V40A14,14,0,0,0,200,26ZM152,142h50v28H110V142Zm6-12V102h44v28ZM56,38H200a2,2,0,0,1,2,2V90H152a6,6,0,0,0-6,6v34H104a6,6,0,0,0-6,6v34H54V40A2,2,0,0,1,56,38ZM200,218H56a2,2,0,0,1-2-2V182H202v34A2,2,0,0,1,200,218Z\" }))\n ],\n [\n \"regular\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M200,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V40A16,16,0,0,0,200,24ZM152,144h48v24H112V144Zm8-16V104h40v24Zm40-88V88H152a8,8,0,0,0-8,8v32H104a8,8,0,0,0-8,8v32H56V40Zm0,176H56V184H200v32Z\" }))\n ],\n [\n \"thin\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M200,28H56A12,12,0,0,0,44,40V216a12,12,0,0,0,12,12H200a12,12,0,0,0,12-12V40A12,12,0,0,0,200,28ZM152,140h52v32H108V140Zm4-8V100h48v32ZM56,36H200a4,4,0,0,1,4,4V92H152a4,4,0,0,0-4,4v36H104a4,4,0,0,0-4,4v36H52V40A4,4,0,0,1,56,36ZM200,220H56a4,4,0,0,1-4-4V180H204v36A4,4,0,0,1,200,220Z\" }))\n ]\n]);\nexport {\n a as default\n};\n","import { createContext as r } from \"react\";\nconst o = r({\n color: \"currentColor\",\n size: \"1em\",\n weight: \"regular\",\n mirrored: !1\n});\nexport {\n o as IconContext\n};\n","import * as e from \"react\";\nimport { IconContext as h } from \"./context.es.js\";\nconst p = e.forwardRef(\n (s, a) => {\n const {\n alt: n,\n color: r,\n size: t,\n weight: o,\n mirrored: c,\n children: i,\n weights: m,\n ...x\n } = s, {\n color: d = \"currentColor\",\n size: l,\n weight: f = \"regular\",\n mirrored: g = !1,\n ...w\n } = e.useContext(h);\n return /* @__PURE__ */ e.createElement(\n \"svg\",\n {\n ref: a,\n xmlns: \"http://www.w3.org/2000/svg\",\n width: t != null ? t : l,\n height: t != null ? t : l,\n fill: r != null ? r : d,\n viewBox: \"0 0 256 256\",\n transform: c || g ? \"scale(-1, 1)\" : void 0,\n ...w,\n ...x\n },\n !!n && /* @__PURE__ */ e.createElement(\"title\", null, n),\n i,\n m.get(o != null ? o : f)\n );\n }\n);\np.displayName = \"IconBase\";\nexport {\n p as default\n};\n","import * as e from \"react\";\nimport n from \"../lib/IconBase.es.js\";\nimport a from \"../defs/Cylinder.es.js\";\nconst o = e.forwardRef((r, t) => /* @__PURE__ */ e.createElement(n, { ref: t, ...r, weights: a }));\no.displayName = \"CylinderIcon\";\nconst c = o;\nexport {\n c as Cylinder,\n o as CylinderIcon\n};\n","import * as o from \"react\";\nimport e from \"../lib/IconBase.es.js\";\nimport s from \"../defs/Stairs.es.js\";\nconst r = o.forwardRef((t, a) => /* @__PURE__ */ o.createElement(e, { ref: a, ...t, weights: s }));\nr.displayName = \"StairsIcon\";\nconst c = r;\nexport {\n c as Stairs,\n r as StairsIcon\n};\n","'use client'\n\nimport { useMemo } from 'react'\nimport * as THREE from 'three'\nimport { useShallow } from 'zustand/shallow'\nimport { useEditor } from '../../../hooks'\nimport type { ColumnNode } from '@pascal/core'\nimport { WALL_HEIGHT } from '../../../constants'\n\nconst COLUMN_RADIUS = 0.15 // 15cm radius\n\ninterface ColumnRendererProps {\n nodeId: ColumnNode['id']\n}\n\nexport function ColumnRenderer({ nodeId }: ColumnRendererProps) {\n const { selectedFloorId, isPreview, levelId } = useEditor(\n useShallow((state) => {\n const handle = state.graph.getNodeById(nodeId)\n const node = handle?.data() as ColumnNode | undefined\n return {\n selectedFloorId: state.selectedFloorId,\n isPreview: node?.editor?.preview === true,\n levelId: state.getLevelId(nodeId),\n }\n }),\n )\n\n // Create cylinder geometry\n const cylinderGeometry = useMemo(\n () => new THREE.CylinderGeometry(COLUMN_RADIUS, COLUMN_RADIUS, WALL_HEIGHT, 16),\n [],\n )\n\n // Determine opacity based on selected floor\n const isActiveFloor = selectedFloorId === null || levelId === selectedFloorId\n const opacity = isActiveFloor ? 1 : 0.3\n const transparent = !isActiveFloor\n\n // Position is handled by parent group in NodeRenderer\n // We only need to position the column vertically (Y axis)\n const yPosition = WALL_HEIGHT / 2\n\n return (\n <>\n {isPreview ? (\n <group>\n {/* Occluded/behind version - dimmer, shows through everything */}\n <mesh geometry={cylinderGeometry} position-y={yPosition} renderOrder={1}>\n <meshStandardMaterial\n color=\"#44ff44\"\n depthTest={false}\n depthWrite={false}\n emissive=\"#22aa22\"\n emissiveIntensity={0.1}\n opacity={0.15}\n transparent\n />\n </mesh>\n {/* Visible/front version - brighter, only shows when not occluded */}\n <mesh geometry={cylinderGeometry} position-y={yPosition} renderOrder={2}>\n <meshStandardMaterial\n color=\"#44ff44\"\n depthTest={true}\n depthWrite={false}\n emissive=\"#22aa22\"\n emissiveIntensity={0.4}\n opacity={0.5}\n transparent\n />\n </mesh>\n </group>\n ) : (\n <mesh castShadow geometry={cylinderGeometry} position-y={yPosition} receiveShadow>\n <meshPhysicalMaterial\n color=\"#dcdcf7\"\n metalness={0.1}\n opacity={opacity}\n roughness={0.7}\n transparent={transparent}\n />\n </mesh>\n )}\n </>\n )\n}\n","'use client'\n\nimport { CylinderIcon } from '@phosphor-icons/react'\nimport { useEffect, useRef } from 'react'\nimport { ColumnRenderer } from '../column/column-renderer'\nimport { emitter, type GridEvent } from '@pascal/core/events'\nimport { useEditor } from '../../../hooks'\nimport { registerComponent } from '../../../registry'\nimport type { BuildingNode } from '@pascal/core/scenegraph/schema/nodes/building'\nimport { ColumnNode } from '@pascal/core/scenegraph/schema/nodes/column'\nimport type { LevelNode } from '@pascal/core/scenegraph/schema/nodes/level'\n\n// ============================================================================\n// COLUMN BUILDER COMPONENT\n// ============================================================================\n\n/**\n * Column builder component\n * Uses useEditor hooks directly to manage column placement\n */\nconst EMPTY_LEVELS: LevelNode[] = []\n\nexport function ColumnNodeEditor() {\n const addNode = useEditor((state) => state.addNode)\n const updateNode = useEditor((state) => state.updateNode)\n const selectedFloorId = useEditor((state) => state.selectedFloorId)\n const levels = useEditor((state) => {\n // Use graph API to find building\n const buildingHandle = state.graph.nodes.find({ type: 'building' })[0]\n if (!buildingHandle) return EMPTY_LEVELS\n // Access data() to get the node structure\n return (buildingHandle.data() as BuildingNode).children\n })\n\n // Use ref to persist preview state across renders without triggering re-renders\n const previewStateRef = useRef<{\n previewColumnId: string | null\n lastPreviewPosition: [number, number] | null\n }>({\n previewColumnId: null,\n lastPreviewPosition: null,\n })\n\n useEffect(() => {\n const handleGridClick = (e: GridEvent) => {\n if (!selectedFloorId) return\n\n const level = levels.find((l) => l.id === selectedFloorId)\n if (!level) return\n\n const [x, y] = e.position\n\n // Check if column already exists at this position (non-preview)\n const existingColumn = level.children.find(\n (child) =>\n child.type === 'column' &&\n child.position[0] === x &&\n child.position[1] === y &&\n !child.editor?.preview,\n )\n\n if (!existingColumn) {\n // Create column node\n updateNode(previewStateRef.current.previewColumnId!, {\n editor: { preview: false },\n })\n previewStateRef.current.previewColumnId = null\n }\n }\n\n const handleGridMove = (e: GridEvent) => {\n if (!selectedFloorId) return\n\n const level = levels.find((l) => l.id === selectedFloorId)\n if (!level) return\n\n const [x, y] = e.position\n const lastPos = previewStateRef.current.lastPreviewPosition\n\n // Only update if position changed\n if (!lastPos || lastPos[0] !== x || lastPos[1] !== y) {\n previewStateRef.current.lastPreviewPosition = [x, y]\n\n // Check if there's already a non-preview column at this position\n const existingColumn = level.children.find(\n (child) =>\n child.type === 'column' &&\n child.position[0] === x &&\n child.position[1] === y &&\n !child.editor?.preview,\n )\n\n if (existingColumn) {\n // Don't show preview if there's already a column here\n if (previewStateRef.current.previewColumnId) {\n updateNode(previewStateRef.current.previewColumnId, { visible: false })\n }\n } else {\n // Show preview\n const previewId = previewStateRef.current.previewColumnId\n\n if (previewId) {\n // Update existing preview position\n updateNode(previewId, {\n position: [x, y] as [number, number],\n visible: true,\n })\n } else {\n // Create new preview column\n const columnData: Omit<ColumnNode, 'id'> = {\n type: 'column',\n name: 'Column Preview',\n position: [x, y],\n visible: true,\n opacity: 100,\n parentId: null,\n metadata: {},\n editor: { canPlace: true, preview: true },\n object: 'node', // Required discriminator\n }\n\n const newPreviewId = addNode(columnData, selectedFloorId)\n previewStateRef.current.previewColumnId = newPreviewId\n }\n }\n }\n }\n\n // Register event listeners\n emitter.on('grid:click', handleGridClick)\n emitter.on('grid:move', handleGridMove)\n\n // Cleanup event listeners\n return () => {\n emitter.off('grid:click', handleGridClick)\n emitter.off('grid:move', handleGridMove)\n }\n }, [addNode, updateNode, selectedFloorId, levels])\n\n return null\n}\n\n// ============================================================================\n// REGISTER COLUMN COMPONENT\n// ============================================================================\n\nregisterComponent({\n nodeType: 'column',\n nodeName: 'Column',\n editorMode: 'building',\n toolName: 'column',\n toolIcon: CylinderIcon,\n schema: ColumnNode,\n nodeEditor: ColumnNodeEditor,\n nodeRenderer: ColumnRenderer,\n})\n","'use client'\n\nimport { useMemo } from 'react'\nimport * as THREE from 'three'\nimport { useShallow } from 'zustand/shallow'\nimport { TILE_SIZE } from '../../../constants'\nimport { useEditor } from '../../../hooks'\nimport { useMaterial } from '@pascal/core/materials'\nimport type { SlabNode } from '@pascal/core'\nimport { WALL_THICKNESS } from '../wall/wall-renderer'\n\nexport const SLAB_THICKNESS = 0.2 // 20cm thickness\n\ninterface SlabRendererProps {\n nodeId: SlabNode['id']\n}\n\nconst SLAB_SPILLOVER = WALL_THICKNESS\n\nexport function SlabRenderer({ nodeId }: SlabRendererProps) {\n const getLevelId = useEditor((state) => state.getLevelId)\n const selectedFloorId = useEditor((state) => state.selectedFloorId)\n\n const { nodeSize, isPreview, levelId, canPlace, material } = useEditor(\n useShallow((state) => {\n const handle = state.graph.getNodeById(nodeId)\n const node = handle?.data() as SlabNode | undefined\n return {\n nodeSize: node?.size,\n isPreview: node?.editor?.preview === true,\n levelId: state.getLevelId(nodeId),\n canPlace: node?.editor?.canPlace !== false,\n material: node?.material || 'tile',\n }\n }),\n )\n\n // Create box geometry for the slab\n const [width, depth] = nodeSize || [0, 0]\n const slabGeometry = useMemo(\n () =>\n new THREE.BoxGeometry(\n width * TILE_SIZE + SLAB_SPILLOVER,\n SLAB_THICKNESS,\n depth * TILE_SIZE + SLAB_SPILLOVER,\n ),\n [width, depth],\n )\n\n // Determine opacity based on selected floor\n const isActiveFloor = selectedFloorId === null || levelId === selectedFloorId\n\n // Position the slab at ground level (half of thickness above y=0)\n const yPosition = SLAB_THICKNESS / 2\n\n // Offset to position the bottom-left corner at the node's position\n // BoxGeometry is centered, so we need to shift by half the size\n const xOffset = (width * TILE_SIZE) / 2\n const zOffset = (depth * TILE_SIZE) / 2\n\n const slabMaterial = useMaterial(\n isActiveFloor\n ? isPreview\n ? canPlace\n ? 'preview-valid'\n : 'preview-invalid'\n : material\n : 'ghost',\n )\n\n return (\n <>\n <mesh\n castShadow\n geometry={slabGeometry}\n material={slabMaterial}\n position={[xOffset, yPosition, zOffset]}\n receiveShadow\n />\n {/* <meshPhysicalMaterial\n color=\"#dcdcf7\"\n key={`slab-material-${opacity}`}\n metalness={0.2}\n opacity={opacity}\n roughness={0.8}\n transparent={transparent}\n /> */}\n </>\n )\n}\n","'use client'\n\nimport { Square } from 'lucide-react'\nimport { useEffect, useRef } from 'react'\nimport { z } from 'zod'\nimport { emitter, type GridEvent } from '@pascal/core/events'\nimport { useEditor } from '../../../hooks'\nimport { registerComponent } from '../../../registry'\nimport { SlabNode } from '@pascal/core/scenegraph/schema/nodes/slab'\nimport { SlabRenderer } from './slab-renderer'\n\n// ============================================================================\n// SLAB NODE EDITOR\n// ============================================================================\n\n/**\n * Slab node editor component\n * Uses useEditor hooks directly to manage slab creation via two-click area selection\n */\nconst EMPTY_LEVELS: any[] = []\n\nexport function SlabNodeEditor() {\n const addNode = useEditor((state) => state.addNode)\n const updateNode = useEditor((state) => state.updateNode)\n const deleteNode = useEditor((state) => state.deleteNode)\n const selectedFloorId = useEditor((state) => state.selectedFloorId)\n const levels = useEditor((state) => {\n const building = state.scene.root.children?.[0]?.children.find((c) => c.type === 'building')\n return building ? building.children : EMPTY_LEVELS\n })\n\n // Use ref to persist state across renders without triggering re-renders\n const slabStateRef = useRef<{\n startPoint: [number, number] | null\n previewSlabId: string | null\n lastEndPoint: [number, number] | null\n }>({\n startPoint: null,\n previewSlabId: null,\n lastEndPoint: null,\n })\n\n useEffect(() => {\n const handleGridClick = (e: GridEvent) => {\n if (!selectedFloorId) return\n\n const [x, y] = e.position\n\n if (slabStateRef.current.startPoint === null) {\n // First click: set start corner and create preview slab\n slabStateRef.current.startPoint = [x, y]\n slabStateRef.current.lastEndPoint = null\n\n // Create preview slab at start position with zero size initially\n const previewSlabId = addNode(\n SlabNode.parse({\n name: 'Slab Preview',\n position: [x, y],\n rotation: 0,\n size: [0, 0], // Zero size initially\n editor: {\n preview: true,\n },\n }),\n selectedFloorId,\n )\n\n slabStateRef.current.previewSlabId = previewSlabId\n } else {\n // Second click: commit or delete the preview slab based on canPlace\n const previewSlabId = slabStateRef.current.previewSlabId\n\n if (previewSlabId) {\n // Get the slab node to check if it can be placed\n const currentLevel = levels.find((l) => l.id === selectedFloorId)\n const slabNode = currentLevel?.children.find((child: any) => child.id === previewSlabId)\n\n if (slabNode && 'canPlace' in slabNode && slabNode.canPlace === false) {\n // Slab is invalid (too small), delete it\n deleteNode(previewSlabId)\n } else {\n // Slab is valid, commit the preview by setting preview: false\n updateNode(previewSlabId, { editor: { preview: false } })\n }\n }\n\n // Reset state\n slabStateRef.current.startPoint = null\n slabStateRef.current.previewSlabId = null\n slabStateRef.current.lastEndPoint = null\n }\n }\n\n const handleGridMove = (e: GridEvent) => {\n if (!selectedFloorId) return\n\n const [x, y] = e.position\n const slabStartPoint = slabStateRef.current.startPoint\n const previewSlabId = slabStateRef.current.previewSlabId\n\n if (slabStartPoint !== null && previewSlabId) {\n const [x1, y1] = slabStartPoint\n const [x2, y2] = [x, y]\n\n // Only update if the end point has changed\n const lastEndPoint = slabStateRef.current.lastEndPoint\n if (!lastEndPoint || lastEndPoint[0] !== x2 || lastEndPoint[1] !== y2) {\n slabStateRef.current.lastEndPoint = [x2, y2]\n\n // Calculate slab position (bottom-left corner) and size\n const slabX = Math.min(x1, x2)\n const slabY = Math.min(y1, y2)\n const slabWidth = Math.abs(x2 - x1)\n const slabHeight = Math.abs(y2 - y1)\n\n // Slab can only be placed if both width and height are at least 1 grid unit\n let canPlace = slabWidth >= 1 && slabHeight >= 1\n\n // Check for overlap with existing slabs on the same level\n if (canPlace) {\n const currentLevel = levels.find((l) => l.id === selectedFloorId)\n if (currentLevel?.children) {\n const existingSlabs = currentLevel.children.filter(\n (child: any) => child.type === 'slab' && child.id !== previewSlabId,\n )\n\n // Check if new slab overlaps with any existing slab (interior overlap, not just edges)\n for (const existingSlab of existingSlabs) {\n const [ex, ey] = existingSlab.position\n const [ew, eh] = existingSlab.size\n\n // Two rectangles overlap if they share interior area\n // They don't overlap if one is completely to the left, right, above, or below the other\n const noOverlap =\n slabX >= ex + ew || // new slab is to the right\n slabX + slabWidth <= ex || // new slab is to the left\n slabY >= ey + eh || // new slab is below\n slabY + slabHeight <= ey // new slab is above\n\n if (!noOverlap) {\n canPlace = false\n break\n }\n }\n }\n }\n\n // Update slab with position and size\n updateNode(previewSlabId, {\n position: [slabX, slabY] as [number, number],\n size: [slabWidth, slabHeight] as [number, number],\n editor: { canPlace, preview: true },\n })\n }\n }\n }\n\n const handleToolCancel = () => {\n // Only cancel if we've started drawing (first click done)\n if (slabStateRef.current.startPoint !== null && slabStateRef.current.previewSlabId) {\n deleteNode(slabStateRef.current.previewSlabId)\n slabStateRef.current.startPoint = null\n slabStateRef.current.previewSlabId = null\n slabStateRef.current.lastEndPoint = null\n }\n }\n\n // Register event listeners\n emitter.on('grid:click', handleGridClick)\n emitter.on('grid:move', handleGridMove)\n emitter.on('tool:cancel', handleToolCancel)\n\n // Cleanup event listeners\n return () => {\n emitter.off('grid:click', handleGridClick)\n emitter.off('grid:move', handleGridMove)\n emitter.off('tool:cancel', handleToolCancel)\n }\n }, [addNode, updateNode, deleteNode, selectedFloorId, levels])\n\n return null\n}\n\n// ============================================================================\n// REGISTER SLAB COMPONENT\n// ============================================================================\n\nregisterComponent({\n nodeType: 'slab',\n nodeName: 'Slab',\n editorMode: 'building',\n toolName: 'slab',\n toolIcon: Square,\n schema: SlabNode,\n nodeEditor: SlabNodeEditor,\n nodeRenderer: SlabRenderer,\n})\n","'use client'\n\nimport type { ThreeEvent } from '@react-three/fiber'\nimport { useMemo } from 'react'\nimport * as THREE from 'three'\nimport { useShallow } from 'zustand/shallow'\nimport { TILE_SIZE } from '../../../constants'\nimport { emitter } from '@pascal/core/events'\nimport { useEditor } from '../../../hooks'\nimport type { CeilingNode, GridPoint } from '@pascal/core'\n\nexport const CEILING_THICKNESS = 0.15 // 15cm thickness\nexport const DEFAULT_CEILING_ELEVATION = 2.5 // 2.5m default height\n\ninterface CeilingRendererProps {\n nodeId: CeilingNode['id']\n}\n\n/**\n * Get closest grid point from a THREE.js intersection point\n * The ceiling mesh is centered, so we need to account for the offset\n */\nfunction getClosestGridPoint(\n point: THREE.Vector3,\n object: THREE.Object3D,\n ceilingSize: [number, number],\n): GridPoint {\n // Transform the world point to the ceiling mesh's local coordinate system\n // This automatically handles all parent transforms (level, building, etc.)\n const localPoint = object.worldToLocal(point.clone())\n\n const [width, depth] = ceilingSize\n\n // The mesh is centered and rotated [-Math.PI / 2, 0, 0]\n // After rotation, the plane is in XZ, but worldToLocal might give us XY coordinates\n // We need to add half the size to shift the origin to bottom-left corner\n const localGridX = localPoint.x / TILE_SIZE + width / 2\n const localGridZ = -localPoint.y / TILE_SIZE + depth / 2\n\n // Return the grid position rounded to nearest grid point\n return {\n x: Math.round(localGridX),\n z: Math.round(localGridZ),\n }\n}\n\nexport function CeilingRenderer({ nodeId }: CeilingRendererProps) {\n const selectedFloorId = useEditor((state) => state.selectedFloorId)\n\n const { nodeSize, isPreview, levelId, canPlace, node } = useEditor(\n useShallow((state) => {\n const handle = state.graph.getNodeById(nodeId)\n const node = handle?.data() as CeilingNode | undefined\n return {\n node,\n nodeSize: node?.size,\n isPreview: node?.editor?.preview === true,\n levelId: state.getLevelId(nodeId),\n canPlace: node?.editor?.canPlace !== false,\n }\n }),\n )\n\n const [width, depth] = nodeSize || [0, 0]\n\n // Create plane geometry for the ceiling\n const ceilingGeometry = useMemo(\n () => new THREE.PlaneGeometry(width * TILE_SIZE, depth * TILE_SIZE),\n [width, depth],\n )\n\n // Determine opacity based on selected floor\n const isActiveFloor = selectedFloorId === null || levelId === selectedFloorId\n const opacity = isActiveFloor ? 1 : 0.3\n const transparent = !isActiveFloor\n\n // Offset to position the bottom-left corner at the node's position\n // PlaneGeometry is centered, so we need to shift by half the size\n const xOffset = (width * TILE_SIZE) / 2\n const zOffset = (depth * TILE_SIZE) / 2\n\n // Check if this preview can be placed\n const previewColor = canPlace ? '#44ff44' : '#ff4444'\n const previewEmissive = canPlace ? '#22aa22' : '#aa2222'\n\n // Event handlers for custom events\n const handleClick = (e: ThreeEvent<MouseEvent>) => {\n // e.stopPropagation()\n if (!node) return\n // Only emit click event for left-click (button 0)\n if (e.button !== 0) return\n\n emitter.emit('ceiling:click', {\n node,\n gridPosition: getClosestGridPoint(e.point, e.object, [width, depth]),\n position: [e.point.x, e.point.y, e.point.z],\n stopPropagation: () => e.stopPropagation(),\n })\n }\n\n const handlePointerEnter = (e: ThreeEvent<PointerEvent>) => {\n // e.stopPropagation()\n if (!node) return\n\n emitter.emit('ceiling:enter', {\n node,\n gridPosition: getClosestGridPoint(e.point, e.object, [width, depth]),\n position: [e.point.x, e.point.y, e.point.z],\n stopPropagation: () => e.stopPropagation(),\n })\n }\n\n const handlePointerLeave = (e: ThreeEvent<PointerEvent>) => {\n // e.stopPropagation()\n if (!node) return\n\n emitter.emit('ceiling:leave', {\n node,\n gridPosition: getClosestGridPoint(e.point, e.object, [width, depth]),\n position: [e.point.x, e.point.y, e.point.z],\n stopPropagation: () => e.stopPropagation(),\n })\n }\n\n const handlePointerMove = (e: ThreeEvent<PointerEvent>) => {\n // e.stopPropagation()\n if (!node) return\n\n emitter.emit('ceiling:move', {\n node,\n gridPosition: getClosestGridPoint(e.point, e.object, [width, depth]),\n position: [e.point.x, e.point.y, e.point.z],\n stopPropagation: () => e.stopPropagation(),\n })\n }\n\n return (\n <group>\n {/* Top side (visible from above) - semi-transparent */}\n <mesh\n // castShadow={!isPreview}\n geometry={ceilingGeometry}\n onClick={isPreview ? undefined : handleClick}\n onPointerEnter={isPreview ? undefined : handlePointerEnter}\n onPointerLeave={isPreview ? undefined : handlePointerLeave}\n onPointerMove={isPreview ? undefined : handlePointerMove}\n position={[xOffset, 0.005, zOffset]}\n // receiveShadow={!isPreview}\n renderOrder={isPreview ? 1 : undefined}\n rotation={[-Math.PI / 2, 0, 0]} // Rotate to horizontal\n >\n <meshStandardMaterial\n color={isPreview ? previewColor : '#f0f0f0'}\n depthTest={!isPreview}\n emissive={isPreview ? previewEmissive : '#000000'}\n emissiveIntensity={isPreview ? 0.1 : 0}\n key={`ceiling-top-${opacity}-${isPreview}`}\n metalness={0.1}\n opacity={isPreview ? 0.15 : opacity * 0.5}\n roughness={0.9}\n side={THREE.FrontSide}\n transparent\n />\n </mesh>\n\n {/* Bottom side (visible from below) - opaque or brighter preview */}\n <mesh\n // castShadow={!isPreview}\n geometry={ceilingGeometry}\n onClick={isPreview ? undefined : handleClick}\n onPointerEnter={isPreview ? undefined : handlePointerEnter}\n onPointerLeave={isPreview ? undefined : handlePointerLeave}\n onPointerMove={isPreview ? undefined : handlePointerMove}\n position={[xOffset, -0.005, zOffset]} // Slight offset to avoid z-fighting\n // receiveShadow={!isPreview}\n renderOrder={isPreview ? 1 : -1}\n rotation={[-Math.PI / 2, 0, 0]} // Rotate to horizontal\n >\n <meshStandardMaterial\n color={isPreview ? previewColor : '#ffffff'}\n depthTest={!isPreview}\n emissive={isPreview ? previewEmissive : '#000000'}\n emissiveIntensity={isPreview ? 0.4 : 0}\n key={`ceiling-bottom-${opacity}-${isPreview}`}\n metalness={0.1}\n opacity={isPreview ? 0.5 : opacity}\n roughness={0.8}\n side={THREE.BackSide}\n transparent={isPreview || transparent}\n />\n </mesh>\n </group>\n )\n}\n","'use client'\n\nimport { Square } from 'lucide-react'\nimport { useEffect, useRef } from 'react'\nimport { emitter, type GridEvent } from '@pascal/core/events'\nimport { useEditor } from '../../../hooks'\nimport { registerComponent } from '../../../registry'\nimport { CeilingNode } from '@pascal/core/scenegraph/schema/nodes/ceiling'\nimport { CeilingRenderer } from './ceiling-renderer'\n\n// ============================================================================\n// CEILING NODE EDITOR\n// ============================================================================\n\n/**\n * Ceiling node editor component\n * Uses useEditor hooks directly to manage ceiling creation via two-click area selection\n */\nconst EMPTY_LEVELS: any[] = []\n\nexport function CeilingNodeEditor() {\n const addNode = useEditor((state) => state.addNode)\n const updateNode = useEditor((state) => state.updateNode)\n const deleteNode = useEditor((state) => state.deleteNode)\n const selectedFloorId = useEditor((state) => state.selectedFloorId)\n const levels = useEditor((state) => {\n const building = state.scene.root.children?.[0]?.children.find((c) => c.type === 'building')\n return building ? building.children : EMPTY_LEVELS\n })\n\n // Use ref to persist state across renders without triggering re-renders\n const ceilingStateRef = useRef<{\n startPoint: [number, number] | null\n previewCeilingId: string | null\n lastEndPoint: [number, number] | null\n }>({\n startPoint: null,\n previewCeilingId: null,\n lastEndPoint: null,\n })\n\n useEffect(() => {\n const handleGridClick = (e: GridEvent) => {\n if (!selectedFloorId) return\n\n const [x, y] = e.position\n\n if (ceilingStateRef.current.startPoint === null) {\n // First click: set start corner and create preview ceiling\n ceilingStateRef.current.startPoint = [x, y]\n ceilingStateRef.current.lastEndPoint = null\n\n // Create preview ceiling at start position with zero size initially\n // Elevation will be calculated by vertical-stacking-processor\n const previewCeilingId = addNode(\n CeilingNode.parse({\n name: 'Ceiling Preview',\n position: [x, y],\n rotation: 0,\n size: [0, 0], // Zero size initially\n editor: {\n preview: true,\n },\n }),\n selectedFloorId,\n )\n\n ceilingStateRef.current.previewCeilingId = previewCeilingId\n } else {\n // Second click: commit or delete the preview ceiling based on canPlace\n const previewCeilingId = ceilingStateRef.current.previewCeilingId\n\n if (previewCeilingId) {\n // Get the ceiling node to check if it can be placed\n const currentLevel = levels.find((l) => l.id === selectedFloorId)\n const ceilingNode = currentLevel?.children.find(\n (child: any) => child.id === previewCeilingId,\n )\n\n if (ceilingNode && 'canPlace' in ceilingNode && ceilingNode.canPlace === false) {\n // Ceiling is invalid (too small), delete it\n deleteNode(previewCeilingId)\n } else {\n // Ceiling is valid, commit the preview by setting preview: false\n updateNode(previewCeilingId, { editor: { preview: false } })\n }\n }\n\n // Reset state\n ceilingStateRef.current.startPoint = null\n ceilingStateRef.current.previewCeilingId = null\n ceilingStateRef.current.lastEndPoint = null\n }\n }\n\n const handleGridMove = (e: GridEvent) => {\n if (!selectedFloorId) return\n\n const [x, y] = e.position\n const ceilingStartPoint = ceilingStateRef.current.startPoint\n const previewCeilingId = ceilingStateRef.current.previewCeilingId\n\n if (ceilingStartPoint !== null && previewCeilingId) {\n const [x1, y1] = ceilingStartPoint\n const [x2, y2] = [x, y]\n\n // Only update if the end point has changed\n const lastEndPoint = ceilingStateRef.current.lastEndPoint\n if (!lastEndPoint || lastEndPoint[0] !== x2 || lastEndPoint[1] !== y2) {\n ceilingStateRef.current.lastEndPoint = [x2, y2]\n\n // Calculate ceiling position (bottom-left corner) and size\n const ceilingX = Math.min(x1, x2)\n const ceilingY = Math.min(y1, y2)\n const ceilingWidth = Math.abs(x2 - x1)\n const ceilingHeight = Math.abs(y2 - y1)\n\n // Ceiling can only be placed if both width and height are at least 1 grid unit\n let canPlace = ceilingWidth >= 1 && ceilingHeight >= 1\n\n // Check for overlap with existing ceilings on the same level\n if (canPlace) {\n const currentLevel = levels.find((l) => l.id === selectedFloorId)\n if (currentLevel?.children) {\n const existingCeilings = currentLevel.children.filter(\n (child: any) => child.type === 'ceiling' && child.id !== previewCeilingId,\n )\n\n // Check if new ceiling overlaps with any existing ceiling (interior overlap, not just edges)\n for (const existingCeiling of existingCeilings) {\n const [ex, ey] = existingCeiling.position\n const [ew, eh] = existingCeiling.size\n\n // Two rectangles overlap if they share interior area\n // They don't overlap if one is completely to the left, right, above, or below the other\n const noOverlap =\n ceilingX >= ex + ew || // new ceiling is to the right\n ceilingX + ceilingWidth <= ex || // new ceiling is to the left\n ceilingY >= ey + eh || // new ceiling is below\n ceilingY + ceilingHeight <= ey // new ceiling is above\n\n if (!noOverlap) {\n canPlace = false\n break\n }\n }\n }\n }\n\n // Update ceiling with position and size\n updateNode(previewCeilingId, {\n position: [ceilingX, ceilingY] as [number, number],\n size: [ceilingWidth, ceilingHeight] as [number, number],\n editor: { canPlace, preview: true },\n })\n }\n }\n }\n\n const handleToolCancel = () => {\n // Only cancel if we've started drawing (first click done)\n if (ceilingStateRef.current.startPoint !== null && ceilingStateRef.current.previewCeilingId) {\n deleteNode(ceilingStateRef.current.previewCeilingId)\n ceilingStateRef.current.startPoint = null\n ceilingStateRef.current.previewCeilingId = null\n ceilingStateRef.current.lastEndPoint = null\n }\n }\n\n // Register event listeners\n emitter.on('grid:click', handleGridClick)\n emitter.on('grid:move', handleGridMove)\n emitter.on('tool:cancel', handleToolCancel)\n\n // Cleanup event listeners\n return () => {\n emitter.off('grid:click', handleGridClick)\n emitter.off('grid:move', handleGridMove)\n emitter.off('tool:cancel', handleToolCancel)\n }\n }, [addNode, updateNode, deleteNode, selectedFloorId, levels])\n\n return null\n}\n\n// ============================================================================\n// REGISTER CEILING COMPONENT\n// ============================================================================\n\n// Icon will be provided via building menu\nregisterComponent({\n nodeType: 'ceiling',\n nodeName: 'Ceiling',\n editorMode: 'building',\n toolName: 'ceiling',\n toolIcon: Square,\n schema: CeilingNode,\n nodeEditor: CeilingNodeEditor,\n nodeRenderer: CeilingRenderer,\n})\n","'use client'\n\nimport { Edges, Line } from '@react-three/drei'\nimport { useThree } from '@react-three/fiber'\nimport { memo, useCallback, useMemo, useState } from 'react'\nimport * as THREE from 'three'\nimport { useShallow } from 'zustand/shallow'\nimport { TILE_SIZE } from '../../../constants'\nimport { useEditor } from '../../../hooks'\nimport type { RoofNode } from '@pascal/core'\n\nconst ROOF_WIDTH = 6 // 6m total width (3m on each side of ridge)\nconst OUTLINE_RADIUS = 0.02 // 2cm radius for selection outline cylinders\n\n// Constants for detailed geometry (in meters)\nconst THICKNESS_A = 0.05 // Roof cover thickness\nconst THICKNESS_B = 0.1 // Structure thickness\nconst ROOF_COVER_OVERHANG = 0.05 // Extension of cover past structure (Rake/Eave side extension)\nconst EAVE_OVERHANG = 0.4 // Horizontal eave overhang\nconst RAKE_OVERHANG = 0.3 // Overhang at gable ends\nconst WALL_THICKNESS = 0.2 // Gable wall thickness\nconst BASE_HEIGHT = 0.5 // Base height (knee wall / truss heel)\n\n// Handle geometry dimensions\nconst DEBUG = false\nconst ORIGIN_MARKER_SIZE = 0.16\nconst ARROW_SHAFT_RADIUS = 0.06\nconst ARROW_SHAFT_LENGTH = 0.5\nconst ARROW_HEAD_RADIUS = 0.12\nconst ARROW_HEAD_LENGTH = 0.3\nconst ROTATION_HANDLE_RADIUS = 0.4\nconst ROTATION_HANDLE_THICKNESS = 0.06\n\n// Hit target scale factors\nconst ORIGIN_HIT_SCALE = 2.5\nconst ARROW_HIT_RADIUS_SCALE = 2.5\nconst ARROW_HIT_LENGTH_SCALE = 1.7\nconst ROTATION_HIT_SCALE = 2\n\n// Helper function to create a cylinder between two points\nfunction createEdgeCylinder(start: number[], end: number[]) {\n const dx = end[0] - start[0]\n const dy = end[1] - start[1]\n const dz = end[2] - start[2]\n const length = Math.sqrt(dx * dx + dy * dy + dz * dz)\n\n const geometry = new THREE.CylinderGeometry(OUTLINE_RADIUS, OUTLINE_RADIUS, length, 8)\n const midpoint = new THREE.Vector3(\n (start[0] + end[0]) / 2,\n (start[1] + end[1]) / 2,\n (start[2] + end[2]) / 2,\n )\n\n // Calculate rotation to align cylinder with edge\n const direction = new THREE.Vector3(dx, dy, dz).normalize()\n const axis = new THREE.Vector3(0, 1, 0).cross(direction).normalize()\n const angle = Math.acos(new THREE.Vector3(0, 1, 0).dot(direction))\n\n return { geometry, midpoint, axis, angle }\n}\n\n// Helper to create a Three.js Shape from polygon points\nfunction createShape(points: { x: number; y: number }[]): THREE.Shape {\n const shape = new THREE.Shape()\n if (points.length === 0) return shape\n shape.moveTo(points[0].x, points[0].y)\n for (let i = 1; i < points.length; i++) {\n shape.lineTo(points[i].x, points[i].y)\n }\n shape.closePath()\n return shape\n}\n\n// Helper to solve pitch angle analytically given rise, run and thicknesses\n// Solves: run * tan(a) + (ThickA + ThickB)/cos(a) = rise\n// Equivalent to finding 'a' such that the roof peak is at 'rise' height\n// while passing through the pivot point with specified thickness.\nfunction solvePitch(rise: number, run: number, thickA: number, thickB: number) {\n const T = thickA + thickB\n // If run is too small, default to 0\n if (run < 0.01) return 0\n\n // Analytic solution: angle = phi - asin(T/R)\n // where phi = atan2(rise, run) and R = sqrt(run^2 + rise^2)\n const R = Math.sqrt(run * run + rise * rise)\n\n // Clamp if thickness exceeds geometric diagonal (impossible geometry)\n if (R <= T) {\n return Math.atan2(rise, run) * 0.5 // Fallback\n }\n\n const phi = Math.atan2(rise, run)\n const shift = Math.asin(T / R)\n\n return phi - shift\n}\n\n// Material components for handles\nconst HitMaterial = () => {\n const hitAreaOpacity = DEBUG ? (0.5 as const) : 0\n return <meshStandardMaterial depthTest={false} opacity={hitAreaOpacity} transparent />\n}\n\nconst HandleMaterial = ({\n color,\n opacity,\n emissiveIntensity,\n}: {\n color: string\n opacity: number\n emissiveIntensity: number\n}) => (\n <meshStandardMaterial\n color={color}\n depthTest={false}\n emissive={color}\n emissiveIntensity={emissiveIntensity}\n metalness={0.3}\n opacity={opacity}\n roughness={0.4}\n side={THREE.DoubleSide}\n transparent\n />\n)\n\ninterface RoofRendererProps {\n nodeId: RoofNode['id']\n}\n\nexport function RoofRenderer({ nodeId }: RoofRendererProps) {\n const debug = useEditor((state) => state.debug)\n const selectedFloorId = useEditor((state) => state.selectedFloorId)\n const tileSize = TILE_SIZE\n\n // Track hover and active states for handles\n const [hoveredHandle, setHoveredHandle] = useState<string | null>(null)\n const [activeHandle, setActiveHandle] = useState<string | null>(null)\n const [isDragging, setIsDragging] = useState(false)\n\n // Three.js scene utilities\n const { camera, gl } = useThree()\n\n const {\n isPreview,\n levelId,\n nodePosition,\n nodeVisible,\n nodeOpacity,\n nodeHeight,\n nodeLeftWidth,\n nodeRightWidth,\n nodeSize,\n nodeRotation,\n isSelected,\n movingCamera,\n controlMode,\n } = useEditor(\n useShallow((state) => {\n const handle = state.graph.getNodeById(nodeId)\n const node = handle?.data() as RoofNode | undefined\n return {\n isPreview: node?.editor?.preview === true,\n levelId: state.graph.index.byId.get(nodeId)?.levelId,\n nodePosition: node?.position,\n nodeVisible: node?.visible,\n nodeOpacity: node?.opacity,\n nodeHeight: (node as any).height ?? 2.5,\n nodeLeftWidth: (node as any).leftWidth ?? ROOF_WIDTH / 2,\n nodeRightWidth: (node as any).rightWidth ?? ROOF_WIDTH / 2,\n nodeSize: node?.size || [0, 0],\n nodeRotation: node?.rotation || 0,\n isSelected: state.selectedNodeIds.includes(nodeId),\n movingCamera: state.movingCamera,\n controlMode: state.controlMode,\n }\n }),\n )\n\n // Roof segment with ABSOLUTE grid coordinates (for manipulation handles)\n const roofSegment = useMemo(() => {\n const [x1, y1] = nodePosition || [0, 0]\n const length = nodeSize[0]\n const x2 = x1 + Math.cos(nodeRotation) * length\n const y2 = y1 - Math.sin(nodeRotation) * length\n\n return {\n start: [x1, y1] as [number, number],\n end: [x2, y2] as [number, number],\n id: nodeId,\n height: nodeHeight,\n leftWidth: nodeLeftWidth,\n rightWidth: nodeRightWidth,\n visible: nodeVisible ?? true,\n opacity: nodeOpacity ?? 100,\n }\n }, [\n nodeHeight,\n nodeLeftWidth,\n nodeRightWidth,\n nodeVisible,\n nodeOpacity,\n nodePosition,\n nodeSize,\n nodeRotation,\n nodeId,\n ])\n\n // Local segment for rendering (parent group handles position & rotation)\n const localSegment = useMemo(() => {\n const length = nodeSize[0]\n return {\n start: [0, 0] as [number, number], // Start at origin in local space\n end: [length, 0] as [number, number], // End along local X axis\n height: nodeHeight,\n leftWidth: nodeLeftWidth,\n rightWidth: nodeRightWidth,\n }\n }, [nodeHeight, nodeLeftWidth, nodeRightWidth, nodeSize])\n\n // Update roof segment in the store\n const updateRoofSegment = useCallback(\n (updatedSegment: typeof roofSegment) => {\n const state = useEditor.getState()\n const [x1, y1] = updatedSegment.start\n const [x2, y2] = updatedSegment.end\n const dx = x2 - x1\n const dy = y2 - y1\n const length = Math.sqrt(dx * dx + dy * dy)\n const rotation = Math.atan2(-dy, dx) // Negate dy to match 3D z-axis direction\n\n const updates: Record<string, unknown> = {\n position: [x1, y1] as [number, number],\n rotation,\n size: [length, 0] as [number, number],\n height: updatedSegment.height,\n leftWidth: updatedSegment.leftWidth,\n rightWidth: updatedSegment.rightWidth,\n visible: updatedSegment.visible ?? true,\n opacity: updatedSegment.opacity ?? 100,\n }\n\n // Update node in store without pushing to undo stack (skipUndo=true)\n state.updateNode(nodeId, updates, true)\n },\n [nodeId],\n )\n\n // Handle drag for edge manipulation\n const handleEdgeDrag = useCallback(\n (handleId: string, handleType: 'horizontal' | 'ridge') => {\n // Capture original segment state for undo\n const originalSegmentState = {\n start: roofSegment.start,\n end: roofSegment.end,\n height: roofSegment.height,\n leftWidth: roofSegment.leftWidth,\n rightWidth: roofSegment.rightWidth,\n }\n\n const plane = new THREE.Plane()\n const raycaster = new THREE.Raycaster()\n const pointer = new THREE.Vector2()\n\n // Setup plane based on handle type\n if (handleType === 'ridge') {\n // Ridge handle moves along Y axis\n const cameraDirection = new THREE.Vector3()\n camera.getWorldDirection(cameraDirection)\n cameraDirection.y = 0\n cameraDirection.normalize()\n plane.setFromNormalAndCoplanarPoint(cameraDirection, new THREE.Vector3(0, 0, 0))\n } else {\n // Horizontal edge handle moves on the ZX plane (ground plane)\n plane.setFromNormalAndCoplanarPoint(new THREE.Vector3(0, 1, 0), new THREE.Vector3(0, 0, 0))\n }\n\n const intersection = new THREE.Vector3()\n let startPoint: THREE.Vector3 | null = null\n let originalSegment = roofSegment\n let hasChanged = false\n\n const onPointerMove = (event: PointerEvent) => {\n // Calculate pointer position\n const rect = gl.domElement.getBoundingClientRect()\n pointer.x = ((event.clientX - rect.left) / rect.width) * 2 - 1\n pointer.y = -((event.clientY - rect.top) / rect.height) * 2 + 1\n\n raycaster.setFromCamera(pointer, camera)\n\n if (!raycaster.ray.intersectPlane(plane, intersection)) return\n\n if (!startPoint) {\n startPoint = intersection.clone()\n return\n }\n\n const delta = new THREE.Vector3().subVectors(intersection, startPoint)\n\n // Update segment based on handle type\n let updatedSegment: typeof roofSegment\n\n if (handleType === 'ridge') {\n // Ridge handle: adjust height\n let newHeight = Math.max(0.5, Math.min(10, originalSegment.height + delta.y))\n\n // Snap to 0.1 increments when Shift is held\n if (event.shiftKey) {\n newHeight = Math.round(newHeight * 10) / 10\n }\n\n updatedSegment = { ...originalSegment, height: newHeight }\n } else {\n // Extract edge type from handleId (front, right, back, left)\n const edgeType = handleId.split('-').pop()\n\n const startWorld = [\n originalSegment.start[0] * tileSize,\n originalSegment.start[1] * tileSize,\n ]\n const endWorld = [originalSegment.end[0] * tileSize, originalSegment.end[1] * tileSize]\n\n const dx = endWorld[0] - startWorld[0]\n const dz = endWorld[1] - startWorld[1]\n const ridgeLength = Math.sqrt(dx * dx + dz * dz)\n\n if (ridgeLength < 0.1) {\n updatedSegment = originalSegment\n } else {\n const ridgeDir = { x: dx / ridgeLength, z: dz / ridgeLength }\n const perpDir = { x: -ridgeDir.z, z: ridgeDir.x }\n\n // Snap to whole grid units when Shift is held\n const snapToGrid = (val: number) => (event.shiftKey ? Math.round(val) : val)\n\n const currentLeftWidth = originalSegment.leftWidth ?? ROOF_WIDTH / 2\n const currentRightWidth = originalSegment.rightWidth ?? ROOF_WIDTH / 2\n\n if (edgeType === 'front') {\n // Front edge: move the START point along the ridge direction\n const projectedDelta = delta.x * ridgeDir.x + delta.z * ridgeDir.z\n const newStartX = originalSegment.start[0] + (projectedDelta * ridgeDir.x) / tileSize\n const newStartY = originalSegment.start[1] + (projectedDelta * ridgeDir.z) / tileSize\n\n updatedSegment = {\n ...originalSegment,\n start: [snapToGrid(newStartX), snapToGrid(newStartY)] as [number, number],\n }\n } else if (edgeType === 'back') {\n // Back edge: move the END point along the ridge direction\n const projectedDelta = delta.x * ridgeDir.x + delta.z * ridgeDir.z\n const newEndX = originalSegment.end[0] + (projectedDelta * ridgeDir.x) / tileSize\n const newEndY = originalSegment.end[1] + (projectedDelta * ridgeDir.z) / tileSize\n\n updatedSegment = {\n ...originalSegment,\n end: [snapToGrid(newEndX), snapToGrid(newEndY)] as [number, number],\n }\n } else if (edgeType === 'left') {\n // Left edge: move the edge and shift ridge to stay centered\n const projectedDelta = delta.x * perpDir.x + delta.z * perpDir.z\n const newLeftWidth = Math.max(0.5, currentLeftWidth + projectedDelta)\n\n const ridgeShift = (newLeftWidth - currentLeftWidth) / 2\n const newStartX = originalSegment.start[0] + (ridgeShift * perpDir.x) / tileSize\n const newStartY = originalSegment.start[1] + (ridgeShift * perpDir.z) / tileSize\n const newEndX = originalSegment.end[0] + (ridgeShift * perpDir.x) / tileSize\n const newEndY = originalSegment.end[1] + (ridgeShift * perpDir.z) / tileSize\n\n const newRightWidth = currentRightWidth + ridgeShift\n\n updatedSegment = {\n ...originalSegment,\n start: [snapToGrid(newStartX), snapToGrid(newStartY)] as [number, number],\n end: [snapToGrid(newEndX), snapToGrid(newEndY)] as [number, number],\n leftWidth: snapToGrid(newLeftWidth - ridgeShift),\n rightWidth: snapToGrid(newRightWidth),\n }\n } else if (edgeType === 'right') {\n // Right edge: move the edge and shift ridge to stay centered\n const projectedDelta = -(delta.x * perpDir.x + delta.z * perpDir.z)\n const newRightWidth = Math.max(0.5, currentRightWidth + projectedDelta)\n\n const ridgeShift = -(newRightWidth - currentRightWidth) / 2\n const newStartX = originalSegment.start[0] + (ridgeShift * perpDir.x) / tileSize\n const newStartY = originalSegment.start[1] + (ridgeShift * perpDir.z) / tileSize\n const newEndX = originalSegment.end[0] + (ridgeShift * perpDir.x) / tileSize\n const newEndY = originalSegment.end[1] + (ridgeShift * perpDir.z) / tileSize\n\n const newLeftWidth = currentLeftWidth - ridgeShift\n\n updatedSegment = {\n ...originalSegment,\n start: [snapToGrid(newStartX), snapToGrid(newStartY)] as [number, number],\n end: [snapToGrid(newEndX), snapToGrid(newEndY)] as [number, number],\n leftWidth: snapToGrid(newLeftWidth),\n rightWidth: snapToGrid(newRightWidth + ridgeShift),\n }\n } else {\n updatedSegment = originalSegment\n }\n }\n }\n\n // Update in store\n updateRoofSegment(updatedSegment)\n hasChanged = true\n }\n\n const onPointerUp = () => {\n setIsDragging(false)\n setActiveHandle(null)\n document.removeEventListener('pointermove', onPointerMove)\n document.removeEventListener('pointerup', onPointerUp)\n gl.domElement.style.cursor = 'auto'\n\n // Record undo operation if there were changes\n if (hasChanged) {\n // Use updateNode to record the change with command manager (skipUndo=false default)\n useEditor.getState().updateNode(nodeId, {\n position: roofSegment.start,\n size: [\n Math.sqrt(\n (roofSegment.end[0] - roofSegment.start[0]) ** 2 +\n (roofSegment.end[1] - roofSegment.start[1]) ** 2,\n ),\n 0,\n ] as [number, number],\n height: roofSegment.height,\n leftWidth: roofSegment.leftWidth,\n rightWidth: roofSegment.rightWidth,\n })\n }\n }\n\n setIsDragging(true)\n document.addEventListener('pointermove', onPointerMove)\n document.addEventListener('pointerup', onPointerUp)\n gl.domElement.style.cursor = 'grabbing'\n },\n [roofSegment, camera, gl, tileSize, updateRoofSegment, nodeId],\n )\n\n // Handle rotation around base center\n const handleRotationDrag = useCallback(() => {\n const plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), 0)\n const raycaster = new THREE.Raycaster()\n const pointer = new THREE.Vector2()\n\n const startWorld = [roofSegment.start[0] * tileSize, roofSegment.start[1] * tileSize]\n const endWorld = [roofSegment.end[0] * tileSize, roofSegment.end[1] * tileSize]\n\n let initialAngle = 0\n let hasChanged = false\n const originalSegment = roofSegment\n let finalSegment: typeof roofSegment | null = null\n\n // Calculate geometric center\n const dx = endWorld[0] - startWorld[0]\n const dz = endWorld[1] - startWorld[1]\n const ridgeLength = Math.sqrt(dx * dx + dz * dz)\n if (ridgeLength < 0.1) return\n const ridgeDir = { x: dx / ridgeLength, z: dz / ridgeLength }\n const perpDir = { x: -ridgeDir.z, z: ridgeDir.x }\n const leftWidth = originalSegment.leftWidth ?? ROOF_WIDTH / 2\n const rightWidth = originalSegment.rightWidth ?? ROOF_WIDTH / 2\n const bottomLeft = [\n startWorld[0] + perpDir.x * leftWidth,\n 0,\n startWorld[1] + perpDir.z * leftWidth,\n ]\n const bottomRight = [\n startWorld[0] - perpDir.x * rightWidth,\n 0,\n startWorld[1] - perpDir.z * rightWidth,\n ]\n const bottomLeftEnd = [\n endWorld[0] + perpDir.x * leftWidth,\n 0,\n endWorld[1] + perpDir.z * leftWidth,\n ]\n const bottomRightEnd = [\n endWorld[0] - perpDir.x * rightWidth,\n 0,\n endWorld[1] - perpDir.z * rightWidth,\n ]\n const centerX = (bottomLeft[0] + bottomRight[0] + bottomLeftEnd[0] + bottomRightEnd[0]) / 4\n const centerZ = (bottomLeft[2] + bottomRight[2] + bottomLeftEnd[2] + bottomRightEnd[2]) / 4\n const center = new THREE.Vector3(centerX, 0, centerZ)\n\n let previousAngle = 0\n let totalDelta = 0\n\n const onPointerMove = (event: PointerEvent) => {\n // Calculate pointer position\n const rect = gl.domElement.getBoundingClientRect()\n pointer.x = ((event.clientX - rect.left) / rect.width) * 2 - 1\n pointer.y = -((event.clientY - rect.top) / rect.height) * 2 + 1\n\n raycaster.setFromCamera(pointer, camera)\n\n const intersection = new THREE.Vector3()\n if (!raycaster.ray.intersectPlane(plane, intersection)) return\n\n const vector = intersection.clone().sub(center)\n const currentAngle = Math.atan2(vector.z, vector.x)\n\n if (!hasChanged) {\n initialAngle = currentAngle\n previousAngle = currentAngle\n totalDelta = 0\n hasChanged = true\n return\n }\n\n // Compute smallest delta handling wrap-around\n let delta = currentAngle - previousAngle\n delta = ((delta + Math.PI) % (2 * Math.PI)) - Math.PI\n\n totalDelta += delta\n previousAngle = currentAngle\n\n // Apply snapping when Shift is held (snap to 45-degree increments)\n let effectiveDelta = totalDelta\n if (event.shiftKey) {\n const degrees = (totalDelta * 180) / Math.PI\n const snappedDegrees = Math.round(degrees / 45) * 45\n effectiveDelta = (snappedDegrees * Math.PI) / 180\n }\n\n // Rotate using effectiveDelta\n const rotatePoint = (point: [number, number]) => {\n const worldX = point[0] * tileSize\n const worldZ = point[1] * tileSize\n const dX = worldX - centerX\n const dZ = worldZ - centerZ\n const cos = Math.cos(effectiveDelta)\n const sin = Math.sin(effectiveDelta)\n const newX = centerX + dX * cos + dZ * sin\n const newZ = centerZ - dX * sin + dZ * cos\n return [newX / tileSize, newZ / tileSize] as [number, number]\n }\n\n const newStart = rotatePoint(originalSegment.start)\n const newEnd = rotatePoint(originalSegment.end)\n\n const updatedSegment = {\n ...originalSegment,\n start: newStart,\n end: newEnd,\n }\n\n finalSegment = updatedSegment\n\n // Update in store\n updateRoofSegment(updatedSegment)\n }\n\n const onPointerUp = () => {\n setIsDragging(false)\n setActiveHandle(null)\n document.removeEventListener('pointermove', onPointerMove)\n document.removeEventListener('pointerup', onPointerUp)\n gl.domElement.style.cursor = 'auto'\n\n if (hasChanged && finalSegment) {\n // Apply final snap on release\n const snapToGrid = (val: number) => Math.round(val * 10) / 10\n\n const snappedSegment = {\n ...finalSegment,\n start: [snapToGrid(finalSegment.start[0]), snapToGrid(finalSegment.start[1])] as [\n number,\n number,\n ],\n end: [snapToGrid(finalSegment.end[0]), snapToGrid(finalSegment.end[1])] as [\n number,\n number,\n ],\n }\n\n updateRoofSegment(snappedSegment)\n\n // Record undo operation\n useEditor.getState().updateNode(nodeId, {\n position: snappedSegment.start,\n size: [\n Math.sqrt(\n (snappedSegment.end[0] - snappedSegment.start[0]) ** 2 +\n (snappedSegment.end[1] - snappedSegment.start[1]) ** 2,\n ),\n 0,\n ] as [number, number],\n height: snappedSegment.height,\n leftWidth: snappedSegment.leftWidth,\n rightWidth: snappedSegment.rightWidth,\n })\n }\n }\n\n setIsDragging(true)\n document.addEventListener('pointermove', onPointerMove)\n document.addEventListener('pointerup', onPointerUp)\n gl.domElement.style.cursor = 'grabbing'\n }, [roofSegment, camera, gl, tileSize, updateRoofSegment, nodeId])\n\n // Handle translation for whole roof segment\n const handleTranslationDrag = useCallback(\n (axis: 'ridge' | 'perp' | 'xz') => {\n const plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), 0)\n const raycaster = new THREE.Raycaster()\n const pointer = new THREE.Vector2()\n\n // Calculate roof orientation\n const startWorld = [roofSegment.start[0] * tileSize, roofSegment.start[1] * tileSize]\n const endWorld = [roofSegment.end[0] * tileSize, roofSegment.end[1] * tileSize]\n const dx = endWorld[0] - startWorld[0]\n const dz = endWorld[1] - startWorld[1]\n const ridgeLength = Math.sqrt(dx * dx + dz * dz)\n\n // Ridge and perpendicular directions in world space\n const ridgeDir = new THREE.Vector3(dx / ridgeLength, 0, dz / ridgeLength)\n const perpDir = new THREE.Vector3(-dz / ridgeLength, 0, dx / ridgeLength)\n\n const intersection = new THREE.Vector3()\n let startPoint: THREE.Vector3 | null = null\n const originalSegment = roofSegment\n let hasChanged = false\n\n const onPointerMove = (event: PointerEvent) => {\n // Calculate pointer position\n const rect = gl.domElement.getBoundingClientRect()\n pointer.x = ((event.clientX - rect.left) / rect.width) * 2 - 1\n pointer.y = -((event.clientY - rect.top) / rect.height) * 2 + 1\n\n raycaster.setFromCamera(pointer, camera)\n\n if (!raycaster.ray.intersectPlane(plane, intersection)) return\n\n if (!startPoint) {\n startPoint = intersection.clone()\n return\n }\n\n const delta = new THREE.Vector3().subVectors(intersection, startPoint)\n\n // Project delta onto roof-aligned axes\n let deltaX = 0\n let deltaZ = 0\n\n if (axis === 'ridge') {\n // Move along ridge direction\n const projectedDelta = delta.dot(ridgeDir)\n deltaX = projectedDelta * ridgeDir.x\n deltaZ = projectedDelta * ridgeDir.z\n } else if (axis === 'perp') {\n // Move perpendicular to ridge\n const projectedDelta = delta.dot(perpDir)\n deltaX = projectedDelta * perpDir.x\n deltaZ = projectedDelta * perpDir.z\n } else {\n // Free movement on XZ plane\n deltaX = delta.x\n deltaZ = delta.z\n }\n\n // Snap to grid when Shift is held\n if (event.shiftKey) {\n deltaX = Math.round(deltaX / tileSize) * tileSize\n deltaZ = Math.round(deltaZ / tileSize) * tileSize\n }\n\n // Update both start and end points\n const newStart: [number, number] = [\n originalSegment.start[0] + deltaX / tileSize,\n originalSegment.start[1] + deltaZ / tileSize,\n ]\n const newEnd: [number, number] = [\n originalSegment.end[0] + deltaX / tileSize,\n originalSegment.end[1] + deltaZ / tileSize,\n ]\n\n const updatedSegment = {\n ...originalSegment,\n start: newStart,\n end: newEnd,\n }\n\n // Update in store\n updateRoofSegment(updatedSegment)\n hasChanged = true\n }\n\n const onPointerUp = () => {\n setIsDragging(false)\n setActiveHandle(null)\n document.removeEventListener('pointermove', onPointerMove)\n document.removeEventListener('pointerup', onPointerUp)\n gl.domElement.style.cursor = 'auto'\n\n // Record undo operation if there were changes\n if (hasChanged) {\n // Use updateNode to record the change with command manager\n useEditor.getState().updateNode(nodeId, {\n position: roofSegment.start,\n size: [\n Math.sqrt(\n (roofSegment.end[0] - roofSegment.start[0]) ** 2 +\n (roofSegment.end[1] - roofSegment.start[1]) ** 2,\n ),\n 0,\n ] as [number, number],\n height: roofSegment.height,\n leftWidth: roofSegment.leftWidth,\n rightWidth: roofSegment.rightWidth,\n })\n }\n }\n\n setIsDragging(true)\n document.addEventListener('pointermove', onPointerMove)\n document.addEventListener('pointerup', onPointerUp)\n gl.domElement.style.cursor = 'grabbing'\n },\n [roofSegment, camera, gl, tileSize, updateRoofSegment, nodeId],\n )\n\n // Visual states for handles\n const getHandleOpacity = (handleId: string) => {\n if (activeHandle === handleId || hoveredHandle === handleId) return 1\n return 0.6\n }\n\n const getHandleEmissiveIntensity = (handleId: string) => {\n if (activeHandle === handleId || hoveredHandle === handleId) return 0.5\n return 0.05\n }\n\n // Detailed Geometry Calculation\n const roofGeometry = useMemo(() => {\n // Convert local grid coordinates to local world coordinates\n const startWorld = [localSegment.start[0] * tileSize, localSegment.start[1] * tileSize]\n const endWorld = [localSegment.end[0] * tileSize, localSegment.end[1] * tileSize]\n\n const dx = endWorld[0] - startWorld[0]\n const dz = endWorld[1] - startWorld[1]\n const ridgeLength = Math.sqrt(dx * dx + dz * dz)\n\n if (ridgeLength < 0.1) return null\n\n const wallDistLeft = localSegment.leftWidth ?? ROOF_WIDTH / 2\n const wallDistRight = localSegment.rightWidth ?? ROOF_WIDTH / 2\n const roofHeight = localSegment.height || 2.5\n\n // Points for handles (The Base Footprint of Walls)\n // Local coordinates: X = Length, Z = Width (centered at 0?).\n // No, Z=0 is the ridge line (if centered). But here \"leftWidth\" is dist from ridge.\n // So Left is Z = +leftWidth, Right is Z = -rightWidth.\n const bottomLeft = [0, 0, wallDistLeft]\n const bottomRight = [0, 0, -wallDistRight]\n const bottomLeftEnd = [ridgeLength, 0, wallDistLeft]\n const bottomRightEnd = [ridgeLength, 0, -wallDistRight]\n const ridgeStart = [0, roofHeight, 0]\n const ridgeEnd = [ridgeLength, roofHeight, 0]\n\n // --- Detailed Profile Generation (YZ Plane) ---\n // Y is Up, Z is Width. Extrusion along X (Length).\n\n const getSideProfile = (dir: 1 | -1) => {\n // Direction: 1 for Left (Positive Z), -1 for Right (Negative Z)\n // Left Side (Positive Z): wall center is at Z = wallDistLeft.\n // Right Side (Negative Z): wall center is at Z = -wallDistRight.\n\n const width = dir === 1 ? wallDistLeft : wallDistRight\n const halfWall = WALL_THICKNESS / 2\n\n // Run is distance from pivot (inner wall face) to centerline (approx)\n // Pivot Z = dir * (width - halfWall).\n const pivotZ = dir * (width - halfWall)\n\n // Calculate Pitch based on Total Height and Run\n // Rise = roofHeight - BASE_HEIGHT\n const rise = Math.max(0, roofHeight - BASE_HEIGHT)\n // Run = width - halfWall (horizontal distance from ridge to inner wall face)\n const run = width - halfWall\n\n const angle = solvePitch(rise, run, THICKNESS_A, THICKNESS_B)\n const tanA = Math.tan(angle)\n const cosA = Math.cos(angle)\n const sinA = Math.sin(angle)\n\n // Calculate key heights\n const ridgeUnderY = BASE_HEIGHT + run * tanA\n const ridgeInterfaceY = ridgeUnderY + THICKNESS_B / cosA\n const ridgeTopY = ridgeInterfaceY + THICKNESS_A / cosA\n\n // Wall Outer Top Height\n const wallOuterTopY = BASE_HEIGHT - WALL_THICKNESS * tanA\n\n // Overhangs\n const overhangDx = EAVE_OVERHANG * cosA\n // const overhangDy = EAVE_OVERHANG * sinA // Unused directly\n\n // Eave Top Point (Cover Layer A)\n // Eave starts from outer wall face\n const eaveTopZ = width + halfWall + overhangDx\n const eaveTopY = ridgeTopY - eaveTopZ * tanA\n\n // Eave tip extended by cover overhang\n const coverExtDx = ROOF_COVER_OVERHANG * cosA\n const coverExtDy = ROOF_COVER_OVERHANG * sinA\n\n const eaveTopExtZ = eaveTopZ + coverExtDx\n const eaveTopExtY = eaveTopY - coverExtDy\n\n // Interface/Bottom of A\n const eaveInterfaceExtZ = eaveTopExtZ - THICKNESS_A * sinA\n const eaveInterfaceExtY = eaveTopExtY - THICKNESS_A * cosA\n\n const eaveInterfaceZ = eaveTopZ\n // const eaveInterfaceY = eaveTopY - THICKNESS_A / cosA // Unused\n\n // Bottom of B\n const eaveBottomZ = eaveTopZ\n const eaveBottomY = ridgeUnderY - eaveTopZ * tanA\n\n // Construct Polygons (in +Z coords for simplicity, then flip if needed)\n // Z=0 is ridge.\n\n // Layer A (Cover)\n const pointsA = [\n { x: 0, y: ridgeTopY }, // Ridge Top\n { x: dir * eaveTopExtZ, y: eaveTopExtY }, // Eave Top Extended\n { x: dir * eaveInterfaceExtZ, y: eaveInterfaceExtY }, // Eave Bottom Extended\n { x: 0, y: ridgeInterfaceY }, // Ridge Bottom\n ]\n\n // Layer B (Structure)\n const pointsB = [\n { x: 0, y: ridgeInterfaceY },\n { x: dir * eaveInterfaceZ, y: ridgeInterfaceY - eaveTopZ * tanA }, // Interface at Eave\n { x: dir * eaveBottomZ, y: eaveBottomY }, // Bottom at Eave\n { x: 0, y: ridgeUnderY },\n ]\n\n // Side Wall (C3/C4)\n const zInner = width - halfWall\n const zOuter = width + halfWall\n\n const pointsSide = [\n { x: dir * zInner, y: 0 },\n { x: dir * zOuter, y: 0 },\n { x: dir * zOuter, y: Math.max(0, wallOuterTopY) }, // Clamp to 0\n { x: dir * zInner, y: BASE_HEIGHT },\n ]\n\n // Gable Top (C1 part)\n const pointsC1 = [\n { x: 0, y: BASE_HEIGHT }, // Center Base\n { x: dir * zInner, y: BASE_HEIGHT }, // Inner Wall Base\n { x: dir * zInner, y: BASE_HEIGHT }, // Inner Wall Top (Redundant but closed)\n { x: 0, y: ridgeUnderY }, // Ridge Under\n ]\n\n // Gable Base (C2 part)\n const pointsC2 = [\n { x: 0, y: 0 },\n { x: dir * zInner, y: 0 },\n { x: dir * zInner, y: BASE_HEIGHT },\n { x: 0, y: BASE_HEIGHT },\n ]\n\n return { pointsA, pointsB, pointsSide, pointsC1, pointsC2 }\n }\n\n const leftP = getSideProfile(1)\n const rightP = getSideProfile(-1)\n\n return {\n shapes: {\n ALeft: createShape(leftP.pointsA),\n ARight: createShape(rightP.pointsA),\n BLeft: createShape(leftP.pointsB),\n BRight: createShape(rightP.pointsB),\n SideLeft: createShape(leftP.pointsSide),\n SideRight: createShape(rightP.pointsSide),\n C1Left: createShape(leftP.pointsC1),\n C1Right: createShape(rightP.pointsC1),\n C2Left: createShape(leftP.pointsC2),\n C2Right: createShape(rightP.pointsC2),\n },\n lengths: {\n A: ridgeLength + 2 * RAKE_OVERHANG + 2 * ROOF_COVER_OVERHANG + WALL_THICKNESS,\n B: ridgeLength + 2 * RAKE_OVERHANG + WALL_THICKNESS,\n Side: ridgeLength + WALL_THICKNESS,\n Gable: WALL_THICKNESS,\n },\n offsets: {\n A: -RAKE_OVERHANG - ROOF_COVER_OVERHANG - WALL_THICKNESS / 2,\n B: -RAKE_OVERHANG - WALL_THICKNESS / 2,\n Side: -WALL_THICKNESS / 2,\n GableFront: -WALL_THICKNESS / 2,\n GableBack: ridgeLength - WALL_THICKNESS / 2,\n },\n points: {\n bottomLeft,\n bottomRight,\n bottomLeftEnd,\n bottomRightEnd,\n ridgeStart,\n ridgeEnd,\n },\n }\n }, [localSegment, tileSize])\n\n if (!roofGeometry) return null\n\n // Determine opacity based on selected floor\n const isActiveFloor = selectedFloorId === null || levelId === selectedFloorId\n let opacity = isActiveFloor ? 1 : 0.3\n\n // Apply custom opacity if set (convert from 0-100 to 0-1)\n if (roofSegment.opacity !== undefined && roofSegment.opacity < 100) {\n opacity *= roofSegment.opacity / 100\n }\n\n const transparent = opacity < 1\n\n // Check if element should be visible\n const isHidden =\n roofSegment.visible === false ||\n (roofSegment.opacity !== undefined && roofSegment.opacity === 0)\n if (isHidden) return null\n\n // Materials\n const materialA = (\n <meshStandardMaterial\n color=\"#93c5fd\"\n metalness={0.1}\n opacity={opacity}\n roughness={0.8}\n side={THREE.DoubleSide}\n transparent={transparent}\n />\n )\n const materialB = (\n <meshStandardMaterial\n color=\"#6ee7b7\"\n metalness={0.1}\n opacity={opacity}\n roughness={0.8}\n side={THREE.DoubleSide}\n transparent={transparent}\n />\n )\n const materialC = (\n <meshPhysicalMaterial\n color=\"#dcdcf7\"\n metalness={0.1}\n opacity={opacity}\n roughness={0.7}\n side={THREE.DoubleSide}\n transparent={transparent}\n />\n )\n const materialSide = (\n <meshPhysicalMaterial\n color=\"#dcdcf7\"\n metalness={0.1}\n opacity={opacity}\n roughness={0.7}\n side={THREE.DoubleSide}\n transparent={transparent}\n />\n )\n\n // Calculate derived dimensions for handles\n const arrowHitRadius = ARROW_SHAFT_RADIUS * ARROW_HIT_RADIUS_SCALE\n const arrowHitLength = ARROW_SHAFT_LENGTH * ARROW_HIT_LENGTH_SCALE\n const arrowShaftPos = ARROW_SHAFT_LENGTH / 2\n const arrowHitPos = arrowHitLength / 2\n const arrowHeadPos = ARROW_SHAFT_LENGTH + ARROW_HEAD_LENGTH / 2\n\n const originHitSize = ORIGIN_MARKER_SIZE * ORIGIN_HIT_SCALE\n const originMarkerEdge = ORIGIN_MARKER_SIZE / 2\n const originHitEdge = originHitSize / 2\n const transArrowShaftPos = originMarkerEdge + ARROW_SHAFT_LENGTH / 2\n const transArrowHitPos = originHitEdge + arrowHitLength / 2\n const transArrowHeadPos = originMarkerEdge + ARROW_SHAFT_LENGTH + ARROW_HEAD_LENGTH / 2\n\n // Define horizontal edge handles\n const horizontalEdges = [\n {\n id: `${nodeId}-front`,\n edge: [roofGeometry.points.bottomLeft, roofGeometry.points.bottomRight],\n color: '#ff4444',\n },\n {\n id: `${nodeId}-right`,\n edge: [roofGeometry.points.bottomRight, roofGeometry.points.bottomRightEnd],\n color: '#44ff44',\n },\n {\n id: `${nodeId}-back`,\n edge: [roofGeometry.points.bottomRightEnd, roofGeometry.points.bottomLeftEnd],\n color: '#4444ff',\n },\n {\n id: `${nodeId}-left`,\n edge: [roofGeometry.points.bottomLeftEnd, roofGeometry.points.bottomLeft],\n color: '#ffff44',\n },\n ]\n\n // Calculate values for handle positioning (all in local space)\n const centerX =\n (roofGeometry.points.bottomLeft[0] +\n roofGeometry.points.bottomRight[0] +\n roofGeometry.points.bottomLeftEnd[0] +\n roofGeometry.points.bottomRightEnd[0]) /\n 4\n const centerZ =\n (roofGeometry.points.bottomLeft[2] +\n roofGeometry.points.bottomRight[2] +\n roofGeometry.points.bottomLeftEnd[2] +\n roofGeometry.points.bottomRightEnd[2]) /\n 4\n\n const corners = [\n roofGeometry.points.bottomLeft,\n roofGeometry.points.bottomRight,\n roofGeometry.points.bottomLeftEnd,\n roofGeometry.points.bottomRightEnd,\n ]\n const arcAngle = Math.PI / 2\n const rotationHitThickness = ROTATION_HANDLE_THICKNESS * ROTATION_HIT_SCALE\n const rotationHandleId = `${nodeId}-rotation`\n\n // Helper to render a mesh part\n const RenderPart = ({ shape, depth, material, position }: any) => (\n <mesh castShadow position={position} receiveShadow rotation={[0, Math.PI / 2, 0]}>\n <extrudeGeometry args={[shape, { depth, bevelEnabled: false }]} />\n {material}\n {debug && (\n <Edges color=\"#000000\" linewidth={1} opacity={0.1} renderOrder={1000} threshold={15} />\n )}\n </mesh>\n )\n\n return (\n <group>\n {isPreview ? (\n // Simplified preview\n <group>\n <Line\n color=\"#336633\"\n depthTest={false}\n lineWidth={2}\n opacity={0.3}\n points={[\n roofGeometry.points.bottomLeft as [number, number, number],\n roofGeometry.points.bottomRight as [number, number, number],\n roofGeometry.points.bottomRightEnd as [number, number, number],\n roofGeometry.points.bottomLeftEnd as [number, number, number],\n roofGeometry.points.bottomLeft as [number, number, number],\n ]}\n transparent\n />\n </group>\n ) : (\n <group>\n {/* Layer A (Cover) */}\n <RenderPart\n depth={roofGeometry.lengths.A}\n material={materialA}\n position={[roofGeometry.offsets.A, 0, 0]}\n shape={roofGeometry.shapes.ALeft}\n />\n <RenderPart\n depth={roofGeometry.lengths.A}\n material={materialA}\n position={[roofGeometry.offsets.A, 0, 0]}\n shape={roofGeometry.shapes.ARight}\n />\n\n {/* Layer B (Structure) */}\n <RenderPart\n depth={roofGeometry.lengths.B}\n material={materialB}\n position={[roofGeometry.offsets.B, 0, 0]}\n shape={roofGeometry.shapes.BLeft}\n />\n <RenderPart\n depth={roofGeometry.lengths.B}\n material={materialB}\n position={[roofGeometry.offsets.B, 0, 0]}\n shape={roofGeometry.shapes.BRight}\n />\n\n {/* Side Walls */}\n <RenderPart\n depth={roofGeometry.lengths.Side}\n material={materialSide}\n position={[roofGeometry.offsets.Side, 0, 0]}\n shape={roofGeometry.shapes.SideLeft}\n />\n <RenderPart\n depth={roofGeometry.lengths.Side}\n material={materialSide}\n position={[roofGeometry.offsets.Side, 0, 0]}\n shape={roofGeometry.shapes.SideRight}\n />\n\n {/* Gable Walls (Front) */}\n <RenderPart\n depth={roofGeometry.lengths.Gable}\n material={materialC}\n position={[roofGeometry.offsets.GableFront, 0, 0]}\n shape={roofGeometry.shapes.C1Left}\n />\n <RenderPart\n depth={roofGeometry.lengths.Gable}\n material={materialC}\n position={[roofGeometry.offsets.GableFront, 0, 0]}\n shape={roofGeometry.shapes.C1Right}\n />\n <RenderPart\n depth={roofGeometry.lengths.Gable}\n material={materialC}\n position={[roofGeometry.offsets.GableFront, 0, 0]}\n shape={roofGeometry.shapes.C2Left}\n />\n <RenderPart\n depth={roofGeometry.lengths.Gable}\n material={materialC}\n position={[roofGeometry.offsets.GableFront, 0, 0]}\n shape={roofGeometry.shapes.C2Right}\n />\n\n {/* Gable Walls (Back) */}\n <RenderPart\n depth={roofGeometry.lengths.Gable}\n material={materialC}\n position={[roofGeometry.offsets.GableBack, 0, 0]}\n shape={roofGeometry.shapes.C1Left}\n />\n <RenderPart\n depth={roofGeometry.lengths.Gable}\n material={materialC}\n position={[roofGeometry.offsets.GableBack, 0, 0]}\n shape={roofGeometry.shapes.C1Right}\n />\n <RenderPart\n depth={roofGeometry.lengths.Gable}\n material={materialC}\n position={[roofGeometry.offsets.GableBack, 0, 0]}\n shape={roofGeometry.shapes.C2Left}\n />\n <RenderPart\n depth={roofGeometry.lengths.Gable}\n material={materialC}\n position={[roofGeometry.offsets.GableBack, 0, 0]}\n shape={roofGeometry.shapes.C2Right}\n />\n\n {/* Selection outline */}\n {isSelected && (\n <>\n {(() => {\n const {\n bottomLeft,\n bottomRight,\n bottomLeftEnd,\n bottomRightEnd,\n ridgeStart,\n ridgeEnd,\n } = roofGeometry.points\n\n const edges = [\n [bottomLeft, bottomRight],\n [bottomRight, bottomRightEnd],\n [bottomRightEnd, bottomLeftEnd],\n [bottomLeftEnd, bottomLeft],\n [bottomLeft, ridgeStart],\n [ridgeStart, ridgeEnd],\n [ridgeEnd, bottomLeftEnd],\n [bottomRight, ridgeStart],\n [ridgeEnd, bottomRightEnd],\n ]\n\n return edges.map((edge, idx) => {\n const {\n geometry: cylGeom,\n midpoint,\n axis,\n angle,\n } = createEdgeCylinder(edge[0], edge[1])\n return (\n <mesh\n geometry={cylGeom}\n key={idx}\n position={midpoint}\n quaternion={new THREE.Quaternion().setFromAxisAngle(axis, angle)}\n renderOrder={999}\n >\n <meshStandardMaterial\n color=\"#ffffff\"\n depthTest={false}\n emissive=\"#ffffff\"\n emissiveIntensity={0.5}\n />\n </mesh>\n )\n })\n })()}\n </>\n )}\n\n {/* Edge manipulation handles */}\n {isSelected && (controlMode === 'building' || controlMode === 'edit') && (\n <>\n {/* Horizontal edge handles */}\n {horizontalEdges.map(({ id, edge, color }) => {\n const start = edge[0]\n const end = edge[1]\n\n const midX = (start[0] + end[0]) / 2\n const midY = (start[1] + end[1]) / 2\n const midZ = (start[2] + end[2]) / 2\n\n const edgeDir = new THREE.Vector3(\n end[0] - start[0],\n end[1] - start[1],\n end[2] - start[2],\n ).normalize()\n\n const perpDir = new THREE.Vector3(edgeDir.z, 0, -edgeDir.x).normalize()\n\n const quaternion = new THREE.Quaternion().setFromUnitVectors(\n new THREE.Vector3(1, 0, 0),\n perpDir,\n )\n\n return (\n <group key={id} position={[midX, midY, midZ]} quaternion={quaternion}>\n <mesh\n onPointerDown={(e) => {\n if (e.button !== 0 || movingCamera || isDragging) return\n e.stopPropagation()\n setActiveHandle(id)\n handleEdgeDrag(id, 'horizontal')\n }}\n onPointerEnter={() => !isDragging && setHoveredHandle(id)}\n onPointerLeave={() => !isDragging && setHoveredHandle(null)}\n position={[arrowHitPos, 0, 0]}\n renderOrder={1000}\n rotation={[0, 0, Math.PI / 2]}\n >\n <cylinderGeometry\n args={[arrowHitRadius, arrowHitRadius, arrowHitLength, 8]}\n />\n <HitMaterial />\n </mesh>\n\n <mesh\n position={[arrowShaftPos, 0, 0]}\n renderOrder={1000}\n rotation={[0, 0, Math.PI / 2]}\n >\n <cylinderGeometry\n args={[ARROW_SHAFT_RADIUS, ARROW_SHAFT_RADIUS, ARROW_SHAFT_LENGTH, 16]}\n />\n <HandleMaterial\n color={color}\n emissiveIntensity={getHandleEmissiveIntensity(id)}\n opacity={getHandleOpacity(id)}\n />\n </mesh>\n\n <mesh\n position={[arrowHeadPos, 0, 0]}\n renderOrder={1000}\n rotation={[0, 0, -Math.PI / 2]}\n >\n <coneGeometry args={[ARROW_HEAD_RADIUS, ARROW_HEAD_LENGTH, 16]} />\n <HandleMaterial\n color={color}\n emissiveIntensity={getHandleEmissiveIntensity(id)}\n opacity={getHandleOpacity(id)}\n />\n </mesh>\n </group>\n )\n })}\n\n {/* Ridge handle */}\n {(() => {\n const ridgeId = `${nodeId}-ridge`\n const ridgeMidX =\n (roofGeometry.points.ridgeStart[0] + roofGeometry.points.ridgeEnd[0]) / 2\n const ridgeMidY =\n (roofGeometry.points.ridgeStart[1] + roofGeometry.points.ridgeEnd[1]) / 2\n const ridgeMidZ =\n (roofGeometry.points.ridgeStart[2] + roofGeometry.points.ridgeEnd[2]) / 2\n\n return (\n <group key={ridgeId} position={[ridgeMidX, ridgeMidY, ridgeMidZ]}>\n <mesh\n onPointerDown={(e) => {\n if (e.button !== 0 || movingCamera || isDragging) return\n e.stopPropagation()\n setActiveHandle(ridgeId)\n handleEdgeDrag(ridgeId, 'ridge')\n }}\n onPointerEnter={() => !isDragging && setHoveredHandle(ridgeId)}\n onPointerLeave={() => !isDragging && setHoveredHandle(null)}\n position={[0, arrowHitPos, 0]}\n renderOrder={1000}\n >\n <cylinderGeometry\n args={[arrowHitRadius, arrowHitRadius, arrowHitLength, 8]}\n />\n <HitMaterial />\n </mesh>\n\n <mesh position={[0, arrowShaftPos, 0]} renderOrder={1000}>\n <cylinderGeometry\n args={[ARROW_SHAFT_RADIUS, ARROW_SHAFT_RADIUS, ARROW_SHAFT_LENGTH, 16]}\n />\n <HandleMaterial\n color=\"#ff44ff\"\n emissiveIntensity={getHandleEmissiveIntensity(ridgeId)}\n opacity={getHandleOpacity(ridgeId)}\n />\n </mesh>\n\n <mesh position={[0, arrowHeadPos, 0]} renderOrder={1000}>\n <coneGeometry args={[ARROW_HEAD_RADIUS, ARROW_HEAD_LENGTH, 16]} />\n <HandleMaterial\n color=\"#ff44ff\"\n emissiveIntensity={getHandleEmissiveIntensity(ridgeId)}\n opacity={getHandleOpacity(ridgeId)}\n />\n </mesh>\n </group>\n )\n })()}\n\n {/* Rotation handles */}\n {corners.map((corner, idx) => {\n const cdx = corner[0] - centerX\n const cdz = corner[2] - centerZ\n const angle = Math.atan2(cdz, cdx)\n const groupRotation: [number, number, number] = [\n Math.PI / 2,\n 0,\n angle - arcAngle / 2,\n ]\n\n return (\n <group\n key={`${rotationHandleId}-${idx}`}\n position={[corner[0], corner[1], corner[2]]}\n >\n <mesh\n onPointerDown={(e) => {\n if (e.button !== 0 || movingCamera || isDragging) return\n e.stopPropagation()\n setActiveHandle(rotationHandleId)\n handleRotationDrag()\n }}\n onPointerEnter={() => !isDragging && setHoveredHandle(rotationHandleId)}\n onPointerLeave={() => !isDragging && setHoveredHandle(null)}\n renderOrder={1000}\n rotation={groupRotation}\n >\n <torusGeometry\n args={[ROTATION_HANDLE_RADIUS, rotationHitThickness, 16, 32, arcAngle]}\n />\n <HitMaterial />\n </mesh>\n\n <mesh renderOrder={1000} rotation={groupRotation}>\n <torusGeometry\n args={[ROTATION_HANDLE_RADIUS, ROTATION_HANDLE_THICKNESS, 16, 32, arcAngle]}\n />\n <HandleMaterial\n color=\"#4444ff\"\n emissiveIntensity={getHandleEmissiveIntensity(rotationHandleId)}\n opacity={getHandleOpacity(rotationHandleId)}\n />\n </mesh>\n </group>\n )\n })}\n\n {/* Translation handles */}\n <group key={`${nodeId}-translation`} position={[centerX, 0, centerZ]}>\n {/* Center origin marker for XZ translation */}\n <group position={[0, 0, 0]}>\n <mesh\n onPointerDown={(e) => {\n if (e.button !== 0 || movingCamera || isDragging) return\n e.stopPropagation()\n setActiveHandle(`${nodeId}-translate-xz`)\n handleTranslationDrag('xz')\n }}\n onPointerEnter={() => !isDragging && setHoveredHandle(`${nodeId}-translate-xz`)}\n onPointerLeave={() => !isDragging && setHoveredHandle(null)}\n position={[0, 0, 0]}\n renderOrder={1000}\n >\n <boxGeometry args={[originHitSize, originHitSize, originHitSize]} />\n <HitMaterial />\n </mesh>\n <mesh position={[0, 0, 0]} renderOrder={1000}>\n <boxGeometry\n args={[ORIGIN_MARKER_SIZE, ORIGIN_MARKER_SIZE, ORIGIN_MARKER_SIZE]}\n />\n <HandleMaterial\n color=\"white\"\n emissiveIntensity={getHandleEmissiveIntensity(`${nodeId}-translate-xz`)}\n opacity={getHandleOpacity(`${nodeId}-translate-xz`)}\n />\n </mesh>\n </group>\n\n {/* Translate along ridge - Green arrow */}\n <group position={[0, 0, 0]}>\n <mesh\n onPointerDown={(e) => {\n if (e.button !== 0 || movingCamera || isDragging) return\n e.stopPropagation()\n setActiveHandle(`${nodeId}-translate-ridge`)\n handleTranslationDrag('ridge')\n }}\n onPointerEnter={() =>\n !isDragging && setHoveredHandle(`${nodeId}-translate-ridge`)\n }\n onPointerLeave={() => !isDragging && setHoveredHandle(null)}\n position={[transArrowHitPos, 0, 0]}\n renderOrder={1000}\n rotation={[0, 0, Math.PI / 2]}\n >\n <cylinderGeometry args={[arrowHitRadius, arrowHitRadius, arrowHitLength, 8]} />\n <HitMaterial />\n </mesh>\n <mesh\n position={[transArrowShaftPos, 0, 0]}\n renderOrder={1000}\n rotation={[0, 0, Math.PI / 2]}\n >\n <cylinderGeometry\n args={[ARROW_SHAFT_RADIUS, ARROW_SHAFT_RADIUS, ARROW_SHAFT_LENGTH, 16]}\n />\n <HandleMaterial\n color=\"#44ff44\"\n emissiveIntensity={getHandleEmissiveIntensity(`${nodeId}-translate-ridge`)}\n opacity={getHandleOpacity(`${nodeId}-translate-ridge`)}\n />\n </mesh>\n <mesh\n position={[transArrowHeadPos, 0, 0]}\n renderOrder={1000}\n rotation={[0, 0, -Math.PI / 2]}\n >\n <coneGeometry args={[ARROW_HEAD_RADIUS, ARROW_HEAD_LENGTH, 16]} />\n <HandleMaterial\n color=\"#44ff44\"\n emissiveIntensity={getHandleEmissiveIntensity(`${nodeId}-translate-ridge`)}\n opacity={getHandleOpacity(`${nodeId}-translate-ridge`)}\n />\n </mesh>\n </group>\n\n {/* Translate perpendicular - Red arrow */}\n <group position={[0, 0, 0]}>\n <mesh\n onPointerDown={(e) => {\n if (e.button !== 0 || movingCamera || isDragging) return\n e.stopPropagation()\n setActiveHandle(`${nodeId}-translate-perp`)\n handleTranslationDrag('perp')\n }}\n onPointerEnter={() =>\n !isDragging && setHoveredHandle(`${nodeId}-translate-perp`)\n }\n onPointerLeave={() => !isDragging && setHoveredHandle(null)}\n position={[0, 0, transArrowHitPos]}\n renderOrder={1000}\n rotation={[Math.PI / 2, 0, 0]}\n >\n <cylinderGeometry args={[arrowHitRadius, arrowHitRadius, arrowHitLength, 8]} />\n <HitMaterial />\n </mesh>\n <mesh\n position={[0, 0, transArrowShaftPos]}\n renderOrder={1000}\n rotation={[Math.PI / 2, 0, 0]}\n >\n <cylinderGeometry\n args={[ARROW_SHAFT_RADIUS, ARROW_SHAFT_RADIUS, ARROW_SHAFT_LENGTH, 16]}\n />\n <HandleMaterial\n color=\"#ff44ff\"\n emissiveIntensity={getHandleEmissiveIntensity(`${nodeId}-translate-perp`)}\n opacity={getHandleOpacity(`${nodeId}-translate-perp`)}\n />\n </mesh>\n <mesh\n position={[0, 0, transArrowHeadPos]}\n renderOrder={1000}\n rotation={[Math.PI / 2, 0, 0]}\n >\n <coneGeometry args={[ARROW_HEAD_RADIUS, ARROW_HEAD_LENGTH, 16]} />\n <HandleMaterial\n color=\"#ff44ff\"\n emissiveIntensity={getHandleEmissiveIntensity(`${nodeId}-translate-perp`)}\n opacity={getHandleOpacity(`${nodeId}-translate-perp`)}\n />\n </mesh>\n </group>\n </group>\n </>\n )}\n </group>\n )}\n </group>\n )\n}\n","'use client'\n\nimport { Triangle } from 'lucide-react'\nimport { useEffect, useRef } from 'react'\nimport { RoofRenderer } from '../roof/roof-renderer'\nimport { emitter, type GridEvent } from '@pascal/core/events'\nimport { useEditor } from '../../../hooks'\nimport { registerComponent } from '../../../registry'\nimport { RoofNode } from '@pascal/core/scenegraph/schema/nodes/roof'\n\nconst TILE_SIZE = 0.5 // 50cm grid spacing\nconst MIN_WALL_LENGTH = 0.5 // 50cm minimum wall length\n\n// ============================================================================\n// ROOF NODE EDITOR\n// ============================================================================\n\n/**\n * Roof node editor component\n * Uses useEditor hooks directly to manage roof creation via two-click area selection\n */\nexport function RoofNodeEditor() {\n const addNode = useEditor((state) => state.addNode)\n const updateNode = useEditor((state) => state.updateNode)\n const deleteNode = useEditor((state) => state.deleteNode)\n const selectedFloorId = useEditor((state) => state.selectedFloorId)\n\n // Use ref to persist values across renders without triggering re-renders\n const roofStateRef = useRef<{\n startCorner: [number, number] | null\n previewRoofId: string | null\n lastEndCorner: [number, number] | null\n }>({\n startCorner: null,\n previewRoofId: null,\n lastEndCorner: null,\n })\n\n useEffect(() => {\n const handleGridClick = (e: GridEvent) => {\n if (!selectedFloorId) return\n\n const [x, y] = e.position\n if (roofStateRef.current.startCorner === null) {\n // First click: set start corner and create preview node\n roofStateRef.current.startCorner = [x, y]\n roofStateRef.current.lastEndCorner = null // Reset last end corner\n\n // Create preview roof node (zero size initially)\n const previewRoofId = addNode(\n RoofNode.parse({\n type: 'roof',\n name: 'Roof Preview',\n position: [x, y] as [number, number],\n rotation: 0,\n size: [0, 0] as [number, number], // Zero size initially\n height: 2.5,\n leftWidth: 0,\n rightWidth: 0,\n visible: true,\n opacity: 100,\n editor: { preview: true }, // Mark as preview\n children: [],\n }),\n selectedFloorId,\n )\n\n roofStateRef.current.previewRoofId = previewRoofId\n } else {\n // Second click: commit the preview roof\n const previewRoofId = roofStateRef.current.previewRoofId\n\n if (previewRoofId) {\n // Update the roof to remove preview flag\n updateNode(previewRoofId, {\n editor: { preview: false },\n name: 'Roof',\n })\n }\n\n // Reset state\n roofStateRef.current.startCorner = null\n roofStateRef.current.previewRoofId = null\n roofStateRef.current.lastEndCorner = null\n }\n }\n\n const handleGridMove = (e: GridEvent) => {\n if (!selectedFloorId) return\n\n const [x, y] = e.position\n const startCorner = roofStateRef.current.startCorner\n const previewRoofId = roofStateRef.current.previewRoofId\n\n if (startCorner !== null && previewRoofId) {\n const [x1, y1] = startCorner\n const [x2, y2] = [x, y]\n\n // Only update if the end corner has changed\n const lastEndCorner = roofStateRef.current.lastEndCorner\n if (!lastEndCorner || lastEndCorner[0] !== x2 || lastEndCorner[1] !== y2) {\n roofStateRef.current.lastEndCorner = [x2, y2]\n\n // Calculate base dimensions (rectangle footprint)\n const width = Math.abs(x2 - x1)\n const depth = Math.abs(y2 - y1)\n\n // Ensure roof base is at least MIN_WALL_LENGTH\n if (width * TILE_SIZE >= MIN_WALL_LENGTH && depth * TILE_SIZE >= MIN_WALL_LENGTH) {\n // Calculate ridge line along the longer axis\n // Ridge runs parallel to the longer side, centered in the rectangle\n const minX = Math.min(x1, x2)\n const maxX = Math.max(x1, x2)\n const minY = Math.min(y1, y2)\n const maxY = Math.max(y1, y2)\n const centerX = (minX + maxX) / 2\n const centerY = (minY + maxY) / 2\n\n let ridgeStart: [number, number]\n let ridgeEnd: [number, number]\n let roofWidth: number // Distance from ridge to each edge in grid units\n\n if (width >= depth) {\n // Ridge runs along X axis (longer side)\n ridgeStart = [minX, centerY]\n ridgeEnd = [maxX, centerY]\n roofWidth = depth / 2\n } else {\n // Ridge runs along Y axis (longer side)\n ridgeStart = [centerX, minY]\n ridgeEnd = [centerX, maxY]\n roofWidth = width / 2\n }\n\n // Calculate ridge line properties\n const dx = ridgeEnd[0] - ridgeStart[0]\n const dy = ridgeEnd[1] - ridgeStart[1]\n const length = Math.sqrt(dx * dx + dy * dy)\n const rotation = Math.atan2(-dy, dx) // Negate dy to match 3D z-axis direction\n\n // Convert roofWidth from grid units to meters\n const leftWidth = roofWidth * TILE_SIZE\n const rightWidth = roofWidth * TILE_SIZE\n\n // Update preview roof with ridge line and widths\n updateNode(previewRoofId, {\n position: ridgeStart as [number, number],\n rotation,\n size: [length, leftWidth + rightWidth] as [number, number], // [ridge length, total width]\n leftWidth,\n rightWidth,\n })\n } else {\n // Too small, reset to zero size\n updateNode(previewRoofId, {\n position: startCorner,\n rotation: 0,\n size: [0, 0] as [number, number],\n leftWidth: 0,\n rightWidth: 0,\n })\n }\n }\n }\n }\n\n const handleToolCancel = () => {\n // Only cancel if we've started drawing (first click done)\n if (roofStateRef.current.startCorner !== null && roofStateRef.current.previewRoofId) {\n deleteNode(roofStateRef.current.previewRoofId)\n roofStateRef.current.startCorner = null\n roofStateRef.current.previewRoofId = null\n roofStateRef.current.lastEndCorner = null\n }\n }\n\n // Register event listeners\n emitter.on('grid:click', handleGridClick)\n emitter.on('grid:move', handleGridMove)\n emitter.on('tool:cancel', handleToolCancel)\n\n // Cleanup event listeners\n return () => {\n emitter.off('grid:click', handleGridClick)\n emitter.off('grid:move', handleGridMove)\n emitter.off('tool:cancel', handleToolCancel)\n }\n }, [addNode, updateNode, deleteNode, selectedFloorId])\n\n return null\n}\n\n// ============================================================================\n// REGISTER ROOF COMPONENT\n// ============================================================================\n\nregisterComponent({\n nodeType: 'roof',\n nodeName: 'Roof',\n editorMode: 'building',\n toolName: 'roof',\n toolIcon: Triangle,\n schema: RoofNode,\n nodeEditor: RoofNodeEditor,\n nodeRenderer: RoofRenderer,\n})\n","'use client'\n\nimport { BoxSelect } from 'lucide-react'\nimport { useEffect, useRef } from 'react'\nimport { emitter, type GridEvent } from '@pascal/core/events'\nimport { useEditor } from '../../../hooks'\nimport { checkWallsOverlap, getAllWallsOnLevel } from '../../../geometry/wall-overlap'\nimport { registerComponent } from '../../../registry'\nimport { GroupNode } from '@pascal/core/scenegraph/schema/nodes/group'\nimport { WallNode } from '@pascal/core/scenegraph/schema/nodes/wall'\nimport { createId } from '../../../utils'\n\n// ============================================================================\n// ROOM NODE EDITOR\n// ============================================================================\n\n/**\n * Room node editor component\n * Uses useEditor hooks directly to manage room creation via two-click area selection\n */\nconst EMPTY_LEVELS: any[] = []\n\nexport function RoomNodeEditor() {\n const addNode = useEditor((state) => state.addNode)\n const updateNode = useEditor((state) => state.updateNode)\n const deleteNode = useEditor((state) => state.deleteNode)\n const selectedFloorId = useEditor((state) => state.selectedFloorId)\n const levels = useEditor((state) => {\n const building = state.scene.root.children?.[0]?.children.find((c) => c.type === 'building')\n return building ? building.children : EMPTY_LEVELS\n })\n\n // Use ref to persist values across renders without triggering re-renders\n const roomStateRef = useRef<{\n startPoint: [number, number] | null\n previewRoomId: string | null\n lastEndPoint: [number, number] | null\n }>({\n startPoint: null,\n previewRoomId: null,\n lastEndPoint: null,\n })\n\n useEffect(() => {\n const handleGridClick = (e: GridEvent) => {\n if (!selectedFloorId) return\n\n const [x, y] = e.position\n if (roomStateRef.current.startPoint === null) {\n // First click: set start corner and create preview room\n roomStateRef.current.startPoint = [x, y]\n roomStateRef.current.lastEndPoint = null\n\n // Count existing rooms to auto-increment the number\n const currentLevel = levels.find((l) => l.id === selectedFloorId)\n const existingRooms =\n currentLevel?.children.filter(\n (child: any) => child.type === 'group' && (child as any).groupType === 'room',\n ) || []\n const roomNumber = existingRooms.length + 1\n\n // Create preview room group with 4 walls\n // Room will be positioned at the start point with zero size initially\n // Pre-generate wall IDs so we can update their parent after the group is created\n const topWallId = createId('wall')\n const bottomWallId = createId('wall')\n const leftWallId = createId('wall')\n const rightWallId = createId('wall')\n\n const previewRoomId = addNode(\n GroupNode.parse({\n type: 'group',\n name: `Room ${roomNumber} Preview`,\n position: [x, y], // Room position (bottom-left corner)\n rotation: 0,\n visible: true,\n opacity: 100,\n editor: { preview: true },\n children: [\n // Bottom wall (relative position [0, 0])\n WallNode.parse({\n id: bottomWallId,\n type: 'wall',\n name: 'Wall Preview Bottom',\n position: [0, 0], // RELATIVE to room\n rotation: 0,\n size: [0, 0.2],\n start: [0, 0], // RELATIVE to room\n end: [0, 0],\n visible: true,\n opacity: 100,\n editor: { preview: true },\n children: [],\n }),\n // Right wall (relative position [0, 0])\n WallNode.parse({\n id: rightWallId,\n type: 'wall',\n name: 'Wall Preview Right',\n position: [0, 0], // RELATIVE to room\n rotation: 0,\n size: [0, 0.2],\n start: [0, 0], // RELATIVE to room\n end: [0, 0],\n visible: true,\n opacity: 100,\n editor: { preview: true },\n children: [],\n }),\n // Top wall (relative position [0, 0])\n WallNode.parse({\n id: topWallId,\n type: 'wall',\n name: 'Wall Preview Top',\n position: [0, 0], // RELATIVE to room\n rotation: 0,\n size: [0, 0.2],\n start: [0, 0], // RELATIVE to room\n end: [0, 0],\n visible: true,\n opacity: 100,\n editor: { preview: true },\n children: [],\n }),\n // Left wall (relative position [0, 0])\n WallNode.parse({\n id: leftWallId,\n type: 'wall',\n name: 'Wall Preview Left',\n position: [0, 0], // RELATIVE to room\n rotation: 0,\n size: [0, 0.2],\n start: [0, 0], // RELATIVE to room\n end: [0, 0],\n visible: true,\n opacity: 100,\n editor: { preview: true },\n children: [],\n }),\n ],\n }),\n selectedFloorId,\n )\n\n // Now update each wall's parent to the actual group ID returned by addNode\n updateNode(topWallId, { parentId: previewRoomId })\n updateNode(bottomWallId, { parentId: previewRoomId })\n updateNode(leftWallId, { parentId: previewRoomId })\n updateNode(rightWallId, { parentId: previewRoomId })\n\n roomStateRef.current.previewRoomId = previewRoomId\n } else {\n // Second click: commit or delete the preview room based on canPlace\n const previewRoomId = roomStateRef.current.previewRoomId\n\n if (previewRoomId) {\n // Get the room node to check if it can be placed\n const currentLevel = levels.find((l) => l.id === selectedFloorId)\n const roomNode = currentLevel?.children.find((child: any) => child.id === previewRoomId)\n\n if (roomNode && 'canPlace' in roomNode && roomNode.canPlace === false) {\n // Room is invalid (too small), delete it\n deleteNode(previewRoomId)\n } else {\n // Room is valid, commit the preview by setting preview: false\n updateNode(previewRoomId, { editor: { preview: false } })\n }\n }\n\n // Reset state\n roomStateRef.current.startPoint = null\n roomStateRef.current.previewRoomId = null\n roomStateRef.current.lastEndPoint = null\n }\n }\n\n const handleGridMove = (e: GridEvent) => {\n if (!selectedFloorId) return\n\n const [x, y] = e.position\n const roomStartPoint = roomStateRef.current.startPoint\n const previewRoomId = roomStateRef.current.previewRoomId\n\n if (roomStartPoint !== null && previewRoomId) {\n const [x1, y1] = roomStartPoint\n const [x2, y2] = [x, y]\n\n // Only update if the end point has changed\n const lastEndPoint = roomStateRef.current.lastEndPoint\n if (!lastEndPoint || lastEndPoint[0] !== x2 || lastEndPoint[1] !== y2) {\n roomStateRef.current.lastEndPoint = [x2, y2]\n\n // Calculate room position (bottom-left corner) and size\n const roomX = Math.min(x1, x2)\n const roomY = Math.min(y1, y2)\n const roomWidth = Math.abs(x2 - x1)\n const roomHeight = Math.abs(y2 - y1)\n\n // Room can only be placed if both width and height are at least 1 grid unit\n // This ensures walls don't overlap (e.g., when width=0, left and right walls would be at same position)\n let canPlace = roomWidth >= 1 && roomHeight >= 1\n\n // Check for overlap with existing walls on the same level\n if (canPlace) {\n const currentLevel = levels.find((l) => l.id === selectedFloorId)\n if (currentLevel?.children) {\n // Get all existing walls, excluding walls from our preview room\n const existingWalls = getAllWallsOnLevel(currentLevel.children, previewRoomId)\n\n // Define the 4 walls of the room in absolute coordinates\n const roomWalls = [\n // Bottom wall: (roomX, roomY) -> (roomX + roomWidth, roomY)\n { x1: roomX, y1: roomY, x2: roomX + roomWidth, y2: roomY },\n // Right wall: (roomX + roomWidth, roomY) -> (roomX + roomWidth, roomY + roomHeight)\n { x1: roomX + roomWidth, y1: roomY, x2: roomX + roomWidth, y2: roomY + roomHeight },\n // Top wall: (roomX + roomWidth, roomY + roomHeight) -> (roomX, roomY + roomHeight)\n { x1: roomX + roomWidth, y1: roomY + roomHeight, x2: roomX, y2: roomY + roomHeight },\n // Left wall: (roomX, roomY + roomHeight) -> (roomX, roomY)\n { x1: roomX, y1: roomY + roomHeight, x2: roomX, y2: roomY },\n ]\n\n if (checkWallsOverlap(roomWalls, existingWalls)) {\n canPlace = false\n }\n }\n }\n\n // Update room group with position and size\n updateNode(previewRoomId, {\n position: [roomX, roomY] as [number, number],\n size: [roomWidth, roomHeight] as [number, number],\n editor: { canPlace, preview: true },\n })\n\n // Get the room node and update its walls with RELATIVE positions\n const currentLevel = levels.find((l) => l.id === selectedFloorId)\n const roomNode = currentLevel?.children.find((child: any) => child.id === previewRoomId)\n\n if (roomNode && 'children' in roomNode && roomNode.children.length === 4) {\n const [bottomWall, rightWall, topWall, leftWall] = roomNode.children\n\n // All walls inherit the room's canPlace status since walls overlapping means the room is invalid\n // Bottom wall: (0,0) -> (roomWidth,0) - horizontal, going right\n const bottomRotation = Math.atan2(0, roomWidth)\n updateNode(bottomWall.id, {\n position: [0, 0] as [number, number], // RELATIVE to room\n size: [roomWidth, 0.2] as [number, number],\n rotation: bottomRotation,\n start: [0, 0], // RELATIVE to room\n end: [roomWidth, 0],\n editor: { canPlace, preview: true },\n })\n\n // Right wall: (roomWidth,0) -> (roomWidth,roomHeight) - vertical, going up\n const rightRotation = Math.atan2(-roomHeight, 0)\n updateNode(rightWall.id, {\n position: [roomWidth, 0] as [number, number], // RELATIVE to room\n size: [roomHeight, 0.2] as [number, number],\n rotation: rightRotation,\n start: [roomWidth, 0], // RELATIVE to room\n end: [roomWidth, roomHeight],\n editor: { canPlace, preview: true },\n })\n\n // Top wall: (roomWidth,roomHeight) -> (0,roomHeight) - horizontal, going left\n const topRotation = Math.atan2(0, -roomWidth)\n updateNode(topWall.id, {\n position: [roomWidth, roomHeight] as [number, number], // RELATIVE to room\n size: [roomWidth, 0.2] as [number, number],\n rotation: topRotation,\n start: [roomWidth, roomHeight], // RELATIVE to room\n end: [0, roomHeight],\n editor: { canPlace, preview: true },\n })\n\n // Left wall: (0,roomHeight) -> (0,0) - vertical, going down\n const leftRotation = Math.atan2(roomHeight, 0)\n updateNode(leftWall.id, {\n position: [0, roomHeight] as [number, number], // RELATIVE to room\n size: [roomHeight, 0.2] as [number, number],\n rotation: leftRotation,\n start: [0, roomHeight], // RELATIVE to room\n end: [0, 0],\n editor: { canPlace, preview: true },\n })\n }\n }\n }\n }\n\n const handleToolCancel = () => {\n // Only cancel if we've started drawing (first click done)\n if (roomStateRef.current.startPoint !== null && roomStateRef.current.previewRoomId) {\n deleteNode(roomStateRef.current.previewRoomId)\n roomStateRef.current.startPoint = null\n roomStateRef.current.previewRoomId = null\n roomStateRef.current.lastEndPoint = null\n }\n }\n\n // Register event listeners\n emitter.on('grid:click', handleGridClick)\n emitter.on('grid:move', handleGridMove)\n emitter.on('tool:cancel', handleToolCancel)\n\n // Cleanup event listeners\n return () => {\n emitter.off('grid:click', handleGridClick)\n emitter.off('grid:move', handleGridMove)\n emitter.off('tool:cancel', handleToolCancel)\n }\n }, [addNode, updateNode, deleteNode, selectedFloorId, levels])\n\n return null\n}\n\n// ============================================================================\n// REGISTER ROOM COMPONENT\n// ============================================================================\n\nregisterComponent({\n nodeType: 'room', // Unique type for registry, even though it creates 'group' nodes\n nodeName: 'Room',\n editorMode: 'building',\n toolName: 'room',\n toolIcon: BoxSelect,\n schema: GroupNode,\n nodeEditor: RoomNodeEditor,\n nodeRenderer: null,\n})\n","'use client'\n\nimport { Pentagon } from 'lucide-react'\nimport { useEffect, useRef } from 'react'\nimport { emitter, type GridEvent } from '@pascal/core/events'\nimport { useEditor } from '../../../hooks'\nimport { getAllWallsOnLevel, wallSegmentsOverlap } from '../../../geometry/wall-overlap'\nimport { registerComponent } from '../../../registry'\nimport { GroupNode } from '@pascal/core/scenegraph/schema/nodes/group'\nimport { WallNode } from '@pascal/core/scenegraph/schema/nodes/wall'\nimport { createId } from '../../../utils'\n\n// ============================================================================\n// CUSTOM ROOM NODE EDITOR\n// ============================================================================\n\n/**\n * Custom room node editor component\n * Uses useEditor hooks directly to manage custom room creation via multi-point polygon\n */\nconst EMPTY_LEVELS: any[] = []\n\nexport function CustomRoomNodeEditor() {\n const addNode = useEditor((state) => state.addNode)\n const updateNode = useEditor((state) => state.updateNode)\n const deleteNode = useEditor((state) => state.deleteNode)\n const selectedFloorId = useEditor((state) => state.selectedFloorId)\n const levels = useEditor((state) => {\n const building = state.scene.root.children?.[0]?.children.find((c) => c.type === 'building')\n return building ? building.children : EMPTY_LEVELS\n })\n\n // Use ref to persist values across renders without triggering re-renders\n const customRoomStateRef = useRef<{\n points: Array<[number, number]> // Points in absolute grid coordinates\n groupOrigin: [number, number] | null // Group's absolute position for calculating relative coords\n previewWallIds: string[] // Walls for placed segments\n cursorWallId: string | null // Wall from last point to cursor\n previewGroupId: string | null\n lastCursorPoint: [number, number] | null // Track last cursor position to avoid unnecessary updates\n }>({\n points: [],\n groupOrigin: null,\n previewWallIds: [],\n cursorWallId: null,\n previewGroupId: null,\n lastCursorPoint: null,\n })\n\n useEffect(() => {\n const calculateSnapPoint = (\n lastPoint: [number, number],\n currentPoint: [number, number],\n ): [number, number] => {\n const [x1, y1] = lastPoint\n const [x, y] = currentPoint\n\n let projectedX = x1\n let projectedY = y1\n\n const dx = x - x1\n const dy = y - y1\n const absDx = Math.abs(dx)\n const absDy = Math.abs(dy)\n\n // Calculate distances to horizontal, vertical, and diagonal lines\n const horizontalDist = absDy\n const verticalDist = absDx\n const diagonalDist = Math.abs(absDx - absDy)\n\n // Find the minimum distance to determine which axis to snap to\n const minDist = Math.min(horizontalDist, verticalDist, diagonalDist)\n\n if (minDist === diagonalDist) {\n // Snap to 45° diagonal\n const diagonalLength = Math.min(absDx, absDy)\n projectedX = x1 + Math.sign(dx) * diagonalLength\n projectedY = y1 + Math.sign(dy) * diagonalLength\n } else if (minDist === horizontalDist) {\n // Snap to horizontal\n projectedX = x\n projectedY = y1\n } else {\n // Snap to vertical\n projectedX = x1\n projectedY = y\n }\n\n return [projectedX, projectedY]\n }\n\n const handleGridClick = (e: GridEvent) => {\n if (!selectedFloorId) return\n\n const points = customRoomStateRef.current.points\n let [x, y] = e.position\n\n // Snap to grid from last point if we have points\n if (points.length > 0) {\n ;[x, y] = calculateSnapPoint(points[points.length - 1], [x, y])\n }\n\n // Check if clicking on the first point to close the shape\n if (points.length >= 3 && x === points[0][0] && y === points[0][1]) {\n // Finalize the room by removing preview flags\n const previewGroupId = customRoomStateRef.current.previewGroupId\n const cursorWallId = customRoomStateRef.current.cursorWallId\n const groupOrigin = customRoomStateRef.current.groupOrigin\n\n if (previewGroupId && groupOrigin) {\n // Update cursor wall to closing wall position, or delete it if 0-length\n if (cursorWallId) {\n const [x1, y1] = points[points.length - 1] // Absolute coordinates\n const [x2, y2] = points[0] // Absolute coordinates\n const dx = x2 - x1\n const dy = y2 - y1\n const length = Math.sqrt(dx * dx + dy * dy)\n\n if (length > 0) {\n const rotation = Math.atan2(-dy, dx)\n\n // Convert to group-relative coordinates\n const relX1 = x1 - groupOrigin[0]\n const relY1 = y1 - groupOrigin[1]\n const relX2 = x2 - groupOrigin[0]\n const relY2 = y2 - groupOrigin[1]\n\n updateNode(cursorWallId, {\n position: [relX1, relY1] as [number, number],\n size: [length, 0.2] as [number, number],\n rotation,\n start: [relX1, relY1] as [number, number],\n end: [relX2, relY2] as [number, number],\n })\n } else {\n // Delete 0-length cursor wall before committing\n deleteNode(cursorWallId)\n }\n }\n\n // Commit the entire group\n updateNode(previewGroupId, {\n editor: { preview: false },\n })\n }\n\n // Reset state\n customRoomStateRef.current.points = []\n customRoomStateRef.current.groupOrigin = null\n customRoomStateRef.current.previewWallIds = []\n customRoomStateRef.current.cursorWallId = null\n customRoomStateRef.current.previewGroupId = null\n customRoomStateRef.current.lastCursorPoint = null\n } else if (points.length === 0) {\n // First click: create preview group with cursor wall\n customRoomStateRef.current.points = [[x, y]]\n customRoomStateRef.current.groupOrigin = [x, y] // Store group's origin\n customRoomStateRef.current.lastCursorPoint = null\n\n const cursorWall = WallNode.parse({\n name: 'Wall Preview Cursor',\n position: [0, 0], // Relative to group\n rotation: 0,\n size: [0, 0.2],\n start: [0, 0], // Relative to group\n end: [0, 0], // Relative to group\n editor: { preview: true },\n })\n\n // Create preview group at [x, y]\n // Walls inside are positioned relative to this group origin\n const groupId = addNode(\n GroupNode.parse({\n name: 'Custom Room Preview',\n position: [x, y],\n rotation: 0,\n editor: { preview: true },\n children: [cursorWall],\n }),\n selectedFloorId,\n )\n\n // Update cursor wall parent\n updateNode(cursorWall.id, { parentId: groupId })\n\n customRoomStateRef.current.cursorWallId = cursorWall.id\n customRoomStateRef.current.previewGroupId = groupId\n } else {\n // Subsequent click: update cursor wall to the click position, then finalize it\n const oldCursorWallId = customRoomStateRef.current.cursorWallId\n const groupOrigin = customRoomStateRef.current.groupOrigin\n if (oldCursorWallId && groupOrigin) {\n // Calculate the final geometry for the cursor wall\n const [x1, y1] = points[points.length - 1] // Absolute coordinates\n const [x2, y2] = [x, y] // Absolute coordinates\n const dx = x2 - x1\n const dy = y2 - y1\n const length = Math.sqrt(dx * dx + dy * dy)\n\n // Only finalize the wall if it has non-zero length\n // (prevents adding 0-length walls when double-clicking)\n if (length > 0) {\n // Check for intersections before placing\n let canPlace = true\n\n // Check against existing walls on the level\n const currentLevel = levels.find((l) => l.id === selectedFloorId)\n if (currentLevel?.children) {\n const previewGroupId = customRoomStateRef.current.previewGroupId\n const existingWalls = getAllWallsOnLevel(currentLevel.children, previewGroupId ?? undefined)\n for (const existingWall of existingWalls) {\n if (wallSegmentsOverlap({ x1, y1, x2, y2 }, existingWall)) {\n canPlace = false\n break\n }\n }\n }\n\n // Check against our own placed walls\n if (canPlace && points.length >= 2) {\n for (let i = 0; i < points.length - 1; i++) {\n const [px1, py1] = points[i]\n const [px2, py2] = points[i + 1]\n if (wallSegmentsOverlap({ x1, y1, x2, y2 }, { x1: px1, y1: py1, x2: px2, y2: py2 })) {\n canPlace = false\n break\n }\n }\n }\n\n // Don't place the wall if it intersects\n if (!canPlace) {\n return\n }\n\n const rotation = Math.atan2(-dy, dx)\n\n // Convert to group-relative coordinates\n const relX1 = x1 - groupOrigin[0]\n const relY1 = y1 - groupOrigin[1]\n const relX2 = x2 - groupOrigin[0]\n const relY2 = y2 - groupOrigin[1]\n\n // Update cursor wall to final position (relative to group)\n updateNode(oldCursorWallId, {\n position: [relX1, relY1] as [number, number],\n size: [length, 0.2] as [number, number],\n rotation,\n start: [relX1, relY1] as [number, number],\n end: [relX2, relY2] as [number, number],\n name: `Wall Preview ${customRoomStateRef.current.previewWallIds.length + 1}`,\n })\n\n // Move it to the placed walls list\n customRoomStateRef.current.previewWallIds.push(oldCursorWallId)\n\n // Add the new point AFTER finalizing the old cursor wall\n const newPoints = [...points, [x, y] as [number, number]]\n customRoomStateRef.current.points = newPoints\n customRoomStateRef.current.lastCursorPoint = null\n\n // Create new cursor wall starting at the point we just added (relative to group)\n const newCursorWallId = addNode(\n WallNode.parse({\n name: 'Wall Preview Cursor',\n position: [relX2, relY2],\n rotation: 0,\n size: [0, 0.2],\n start: [relX2, relY2],\n end: [relX2, relY2],\n editor: { preview: true },\n children: [],\n }),\n customRoomStateRef.current.previewGroupId!,\n )\n\n // Update cursor wall parent (must be explicit for calculateWorldPosition to work)\n updateNode(newCursorWallId, { parentId: customRoomStateRef.current.previewGroupId! })\n\n customRoomStateRef.current.cursorWallId = newCursorWallId\n }\n }\n }\n }\n\n const handleGridMove = (e: GridEvent) => {\n if (!selectedFloorId) return\n\n const points = customRoomStateRef.current.points\n const cursorWallId = customRoomStateRef.current.cursorWallId\n const groupOrigin = customRoomStateRef.current.groupOrigin\n\n if (points.length >= 1 && cursorWallId && groupOrigin) {\n let [x, y] = e.position\n\n // Snap to grid from last point\n ;[x, y] = calculateSnapPoint(points[points.length - 1], [x, y])\n\n // Only update if the cursor point has changed\n const lastCursorPoint = customRoomStateRef.current.lastCursorPoint\n if (!lastCursorPoint || lastCursorPoint[0] !== x || lastCursorPoint[1] !== y) {\n customRoomStateRef.current.lastCursorPoint = [x, y]\n\n // Check if hovering over the first point to close the shape\n const hoveringFirstPoint = points.length >= 3 && x === points[0][0] && y === points[0][1]\n\n const [x1, y1] = points[points.length - 1] // Absolute coordinates\n const [x2, y2] = hoveringFirstPoint ? points[0] : [x, y] // Absolute coordinates\n const dx = x2 - x1\n const dy = y2 - y1\n const length = Math.sqrt(dx * dx + dy * dy)\n const rotation = Math.atan2(-dy, dx)\n\n // Convert to group-relative coordinates\n const relX1 = x1 - groupOrigin[0]\n const relY1 = y1 - groupOrigin[1]\n const relX2 = x2 - groupOrigin[0]\n const relY2 = y2 - groupOrigin[1]\n\n // Check if this wall segment overlaps with existing walls or our own placed walls\n let canPlace = length >= 1\n if (canPlace) {\n const currentLevel = levels.find((l) => l.id === selectedFloorId)\n if (currentLevel?.children) {\n const previewGroupId = customRoomStateRef.current.previewGroupId\n const existingWalls = getAllWallsOnLevel(currentLevel.children, previewGroupId ?? undefined)\n\n // Check if the new wall segment overlaps with any existing wall\n for (const existingWall of existingWalls) {\n if (wallSegmentsOverlap({ x1, y1, x2, y2 }, existingWall)) {\n canPlace = false\n break\n }\n }\n }\n\n // Also check against our own placed walls in the current custom room\n if (canPlace && points.length >= 2) {\n const groupOriginForCheck = customRoomStateRef.current.groupOrigin\n if (groupOriginForCheck) {\n // Build wall segments from our placed points (in absolute coordinates)\n for (let i = 0; i < points.length - 1; i++) {\n const [px1, py1] = points[i]\n const [px2, py2] = points[i + 1]\n if (wallSegmentsOverlap({ x1, y1, x2, y2 }, { x1: px1, y1: py1, x2: px2, y2: py2 })) {\n canPlace = false\n break\n }\n }\n }\n }\n }\n\n // Update cursor wall with relative positions\n updateNode(cursorWallId, {\n position: [relX1, relY1] as [number, number],\n size: [length, 0.2] as [number, number],\n rotation,\n start: [relX1, relY1] as [number, number],\n end: [relX2, relY2] as [number, number],\n visible: true,\n editor: { canPlace, preview: true },\n })\n }\n }\n }\n\n const handleGridDoubleClick = (e: GridEvent) => {\n if (!selectedFloorId) return\n\n // Double-click to finish without closing the shape\n const points = customRoomStateRef.current.points\n const previewGroupId = customRoomStateRef.current.previewGroupId\n const cursorWallId = customRoomStateRef.current.cursorWallId\n\n if (points.length >= 2 && previewGroupId) {\n // Delete the cursor wall before committing (it's always 0-length or unwanted)\n if (cursorWallId) {\n deleteNode(cursorWallId)\n }\n // Commit the entire group\n updateNode(previewGroupId, {\n editor: { preview: false },\n })\n\n // Reset state\n customRoomStateRef.current.points = []\n customRoomStateRef.current.groupOrigin = null\n customRoomStateRef.current.previewWallIds = []\n customRoomStateRef.current.cursorWallId = null\n customRoomStateRef.current.previewGroupId = null\n customRoomStateRef.current.lastCursorPoint = null\n }\n }\n\n const handleToolCancel = () => {\n // Only cancel if we've started drawing (at least one point placed)\n if (customRoomStateRef.current.points.length > 0 && customRoomStateRef.current.previewGroupId) {\n deleteNode(customRoomStateRef.current.previewGroupId)\n customRoomStateRef.current.points = []\n customRoomStateRef.current.groupOrigin = null\n customRoomStateRef.current.previewWallIds = []\n customRoomStateRef.current.cursorWallId = null\n customRoomStateRef.current.previewGroupId = null\n customRoomStateRef.current.lastCursorPoint = null\n }\n }\n\n // Register event listeners\n emitter.on('grid:click', handleGridClick)\n emitter.on('grid:move', handleGridMove)\n emitter.on('grid:double-click', handleGridDoubleClick)\n emitter.on('tool:cancel', handleToolCancel)\n\n // Cleanup event listeners\n return () => {\n emitter.off('grid:click', handleGridClick)\n emitter.off('grid:move', handleGridMove)\n emitter.off('grid:double-click', handleGridDoubleClick)\n emitter.off('tool:cancel', handleToolCancel)\n }\n }, [addNode, updateNode, deleteNode, selectedFloorId, levels])\n\n return null\n}\n\n// ============================================================================\n// REGISTER CUSTOM ROOM COMPONENT\n// ============================================================================\n\nregisterComponent({\n nodeType: 'custom-room', // Unique type for registry, even though it creates 'group' nodes\n nodeName: 'Custom Room',\n editorMode: 'building',\n toolName: 'custom-room',\n toolIcon: Pentagon,\n schema: GroupNode,\n nodeEditor: CustomRoomNodeEditor,\n nodeRenderer: null,\n})\n","'use client'\n\nimport { Hexagon } from 'lucide-react'\nimport { useEffect, useRef } from 'react'\nimport { emitter, type GridEvent } from '@pascal/core/events'\nimport { useEditor } from '../../../hooks'\nimport { registerComponent } from '../../../registry'\n\n// ============================================================================\n// ZONE TOOL EDITOR\n// ============================================================================\n\n/**\n * Zone tool editor component\n * Uses multi-point polygon drawing to create zones\n */\nexport function ZoneToolEditor() {\n const addZone = useEditor((state) => state.addZone)\n const selectedFloorId = useEditor((state) => state.selectedFloorId)\n const setActiveTool = useEditor((state) => state.setActiveTool)\n\n // Helper to generate zone name based on current count\n const getNextZoneName = () => {\n const zones = useEditor.getState().scene.zones || []\n return `Zone ${zones.length + 1}`\n }\n\n // Use ref to persist state across renders\n const zoneStateRef = useRef<{\n points: Array<[number, number]>\n lastCursorPoint: [number, number] | null\n }>({\n points: [],\n lastCursorPoint: null,\n })\n\n useEffect(() => {\n const calculateSnapPoint = (\n lastPoint: [number, number],\n currentPoint: [number, number],\n ): [number, number] => {\n const [x1, y1] = lastPoint\n const [x, y] = currentPoint\n\n let projectedX = x1\n let projectedY = y1\n\n const dx = x - x1\n const dy = y - y1\n const absDx = Math.abs(dx)\n const absDy = Math.abs(dy)\n\n // Calculate distances to horizontal, vertical, and diagonal lines\n const horizontalDist = absDy\n const verticalDist = absDx\n const diagonalDist = Math.abs(absDx - absDy)\n\n // Find the minimum distance to determine which axis to snap to\n const minDist = Math.min(horizontalDist, verticalDist, diagonalDist)\n\n if (minDist === diagonalDist) {\n // Snap to 45° diagonal\n const diagonalLength = Math.min(absDx, absDy)\n projectedX = x1 + Math.sign(dx) * diagonalLength\n projectedY = y1 + Math.sign(dy) * diagonalLength\n } else if (minDist === horizontalDist) {\n // Snap to horizontal\n projectedX = x\n projectedY = y1\n } else {\n // Snap to vertical\n projectedX = x1\n projectedY = y\n }\n\n return [projectedX, projectedY]\n }\n\n const handleGridClick = (e: GridEvent) => {\n if (!selectedFloorId) return\n\n const points = zoneStateRef.current.points\n let [x, y] = e.position\n\n // Snap to grid from last point if we have points\n if (points.length > 0) {\n ;[x, y] = calculateSnapPoint(points[points.length - 1], [x, y])\n }\n\n // Check if clicking on the first point to close the shape\n if (points.length >= 3 && x === points[0][0] && y === points[0][1]) {\n // Create the zone with the polygon\n addZone(getNextZoneName(), selectedFloorId, points)\n\n // Reset state\n zoneStateRef.current.points = []\n zoneStateRef.current.lastCursorPoint = null\n\n // Emit event for preview cleanup\n emitter.emit('zone:preview', { points: [] })\n\n // Deactivate tool after creating zone\n setActiveTool(null)\n } else {\n // Add point to polygon\n const newPoints = [...points, [x, y] as [number, number]]\n zoneStateRef.current.points = newPoints\n zoneStateRef.current.lastCursorPoint = null\n\n // Emit event for preview\n emitter.emit('zone:preview', { points: newPoints, cursorPoint: null })\n }\n }\n\n const handleGridMove = (e: GridEvent) => {\n if (!selectedFloorId) return\n\n const points = zoneStateRef.current.points\n if (points.length === 0) return\n\n let [x, y] = e.position\n\n // Snap to grid from last point\n ;[x, y] = calculateSnapPoint(points[points.length - 1], [x, y])\n\n // Only update if cursor point changed\n const lastCursorPoint = zoneStateRef.current.lastCursorPoint\n if (!lastCursorPoint || lastCursorPoint[0] !== x || lastCursorPoint[1] !== y) {\n zoneStateRef.current.lastCursorPoint = [x, y]\n\n // Emit event for preview with cursor point\n emitter.emit('zone:preview', { points, cursorPoint: [x, y] })\n }\n }\n\n const handleGridDoubleClick = (_e: GridEvent) => {\n if (!selectedFloorId) return\n\n const points = zoneStateRef.current.points\n\n // Need at least 3 points to form a polygon\n if (points.length >= 3) {\n // Create the zone with the polygon\n addZone(getNextZoneName(), selectedFloorId, points)\n\n // Reset state\n zoneStateRef.current.points = []\n zoneStateRef.current.lastCursorPoint = null\n\n // Emit event for preview cleanup\n emitter.emit('zone:preview', { points: [] })\n\n // Deactivate tool after creating zone\n setActiveTool(null)\n }\n }\n\n const handleToolCancel = () => {\n // Cancel if we've started drawing\n if (zoneStateRef.current.points.length > 0) {\n zoneStateRef.current.points = []\n zoneStateRef.current.lastCursorPoint = null\n\n // Emit event for preview cleanup\n emitter.emit('zone:preview', { points: [] })\n }\n }\n\n // Register event listeners\n emitter.on('grid:click', handleGridClick)\n emitter.on('grid:move', handleGridMove)\n emitter.on('grid:double-click', handleGridDoubleClick)\n emitter.on('tool:cancel', handleToolCancel)\n\n // Cleanup event listeners\n return () => {\n emitter.off('grid:click', handleGridClick)\n emitter.off('grid:move', handleGridMove)\n emitter.off('grid:double-click', handleGridDoubleClick)\n emitter.off('tool:cancel', handleToolCancel)\n\n // Also cleanup preview on unmount\n emitter.emit('zone:preview', { points: [] })\n }\n }, [addZone, selectedFloorId, setActiveTool])\n\n return null\n}\n\n// ============================================================================\n// REGISTER ZONE COMPONENT\n// ============================================================================\n\nregisterComponent({\n nodeType: 'zone',\n nodeName: 'Zone',\n editorMode: 'building',\n toolName: 'zone',\n toolIcon: Hexagon,\n schema: undefined, // Not a node, just a tool that creates zones\n nodeEditor: ZoneToolEditor,\n nodeRenderer: null,\n})\n","'use client'\n\nimport { useTexture } from '@react-three/drei'\nimport { memo, useMemo, useRef, useState } from 'react'\nimport * as THREE from 'three'\nimport { useShallow } from 'zustand/shallow'\nimport { FLOOR_SPACING, TILE_SIZE } from '../../../constants'\nimport { useImageManipulation } from '../image/image-node'\nimport { useEditor } from '../../../hooks'\nimport type { ImageNode } from '@pascal/core'\n\nconst GRID_SIZE = 30 // 30m x 30m\n\nconst DEBUG = false\nconst HANDLE_SCALE = 1 // Manual scale for manipulation handles\n\n// Handle geometry dimensions - base sizes\nconst ORIGIN_MARKER_SIZE = 0.16\nconst ARROW_SHAFT_RADIUS = 0.06\nconst ARROW_SHAFT_LENGTH = 2\nconst ARROW_HEAD_RADIUS = 0.12\nconst ARROW_HEAD_LENGTH = 0.3\nconst ROTATION_HANDLE_RADIUS = 0.4\nconst ROTATION_HANDLE_THICKNESS = 0.06\nconst SCALE_HANDLE_RADIUS = 0.12\nconst SCALE_HANDLE_LENGTH = 0.3\n\n// Hit target scale factors (multipliers for base dimensions)\nconst ORIGIN_HIT_SCALE = 2.5\nconst ARROW_HIT_RADIUS_SCALE = 2.5\nconst ARROW_HIT_LENGTH_SCALE = 1.1\nconst ROTATION_HIT_SCALE = 2\nconst SCALE_HIT_SCALE = 1.5\n\ninterface ImageRendererProps {\n nodeId: ImageNode['id']\n}\n\nconst EMPTY_LEVELS: any[] = []\n\nexport const ImageRenderer = memo(({ nodeId }: ImageRendererProps) => {\n const hitAreaOpacity = DEBUG ? (0.5 as const) : 0\n const node = useEditor(\n useShallow((state) => state.graph.getNodeById(nodeId)?.data() as ImageNode | undefined),\n )\n const texture = useTexture(node?.url || '')\n const groupRef = useRef<THREE.Group>(null)\n\n // Get state from store\n const controlMode = useEditor((state) => state.controlMode)\n const movingCamera = useEditor((state) => state.movingCamera)\n const selectedNodeIds = useEditor((state) => state.selectedNodeIds)\n\n const isSelected = selectedNodeIds.includes(nodeId)\n\n // Track hover and active states for handles\n const [hoveredHandle, setHoveredHandle] = useState<string | null>(null)\n const [activeHandle, setActiveHandle] = useState<string | null>(null)\n\n // Get manipulation handlers from the builder hook\n const {\n handleSelect,\n handleTranslateDown,\n handleTranslateXZDown,\n handleRotationDown,\n handleScaleDown,\n } = useImageManipulation(nodeId, groupRef, setActiveHandle)\n\n // Get level for Y position\n const getLevelId = useEditor((state) => state.getLevelId)\n const levels = useEditor((state) => {\n const building = state.scene.root.children?.[0]?.children.find((c) => c.type === 'building')\n return building ? building.children : EMPTY_LEVELS\n })\n const levelId = useMemo(() => getLevelId(nodeId), [getLevelId, nodeId])\n const level = useMemo(() => levels.find((l) => l.id === levelId), [levels, levelId])\n const levelNumber = (level as any)?.level ?? 0\n\n // Track hover state for the image itself\n const [isHovered, setIsHovered] = useState(false)\n\n // Calculate aspect-ratio-preserving dimensions\n const [planeWidth, planeHeight] = useMemo(() => {\n if (!texture.image) return [GRID_SIZE, GRID_SIZE]\n\n const image = texture.image as HTMLImageElement\n const imageWidth = image.width\n const imageHeight = image.height\n const aspectRatio = imageWidth / imageHeight\n\n if (aspectRatio > 1) {\n return [GRID_SIZE, GRID_SIZE / aspectRatio]\n }\n return [GRID_SIZE * aspectRatio, GRID_SIZE]\n }, [texture])\n\n // Visual states for handles\n const getHandleOpacity = (handleId: string) => {\n if (activeHandle === handleId || hoveredHandle === handleId) return 1\n return 0.6\n }\n\n const getHandleEmissiveIntensity = (handleId: string) => {\n if (activeHandle === handleId || hoveredHandle === handleId) return 0.5\n return 0.05\n }\n\n // Reusable material components\n const HitMaterial = () => (\n <meshStandardMaterial depthTest={false} opacity={hitAreaOpacity} transparent />\n )\n\n const HandleMaterial = ({ color, handleId }: { color: string; handleId: string }) => (\n <meshStandardMaterial\n color={color}\n depthTest={false}\n emissive={color}\n emissiveIntensity={getHandleEmissiveIntensity(handleId)}\n metalness={0.3}\n opacity={getHandleOpacity(handleId)}\n roughness={0.4}\n side={THREE.DoubleSide}\n transparent\n />\n )\n\n // Calculate derived dimensions from base sizes and scale factors\n const originHitSize = ORIGIN_MARKER_SIZE * ORIGIN_HIT_SCALE\n const arrowHitRadius = ARROW_SHAFT_RADIUS * ARROW_HIT_RADIUS_SCALE\n const arrowHitLength = ARROW_SHAFT_LENGTH * ARROW_HIT_LENGTH_SCALE\n const rotationHitThickness = ROTATION_HANDLE_THICKNESS * ROTATION_HIT_SCALE\n const scaleHitRadius = SCALE_HANDLE_RADIUS * SCALE_HIT_SCALE\n const scaleHitLength = SCALE_HANDLE_LENGTH * SCALE_HIT_SCALE\n\n // Calculate handle positions based on dimensions\n const originMarkerEdge = ORIGIN_MARKER_SIZE / 2\n const originHitEdge = originHitSize / 2\n\n const arrowShaftPos = originMarkerEdge + ARROW_SHAFT_LENGTH / 2\n const arrowHitPos = originHitEdge + arrowHitLength / 2\n const arrowHeadPos = originMarkerEdge + ARROW_SHAFT_LENGTH + ARROW_HEAD_LENGTH / 2\n\n // Convert grid position to world position\n\n const isInteractive = controlMode === 'guide' || controlMode === 'select'\n\n return (\n <group ref={groupRef}>\n {/* Image plane - rotated to lie flat on XZ plane */}\n <group rotation={[-Math.PI / 2, 0, 0]}>\n <mesh\n onPointerDown={(e) => {\n if (e.button !== 0) return\n if ((controlMode === 'guide' || controlMode === 'select') && !movingCamera) {\n e.stopPropagation()\n handleSelect(e)\n }\n }}\n onPointerEnter={(e) => {\n if ((controlMode === 'guide' || controlMode === 'select') && !movingCamera) {\n setIsHovered(true)\n }\n }}\n onPointerLeave={() => {\n setIsHovered(false)\n }}\n raycast={isInteractive ? undefined : () => null}\n scale={node?.scale ?? 1}\n >\n <planeGeometry args={[planeWidth, planeHeight]} />\n <meshStandardMaterial\n emissive={\n (controlMode === 'guide' || controlMode === 'select') && (isHovered || isSelected)\n ? '#ffffff'\n : '#000000'\n }\n emissiveIntensity={\n (controlMode === 'guide' || controlMode === 'select') && (isHovered || isSelected)\n ? 0.2\n : 0\n }\n map={texture}\n opacity={(node?.opacity ?? 100) / 100}\n polygonOffset\n polygonOffsetFactor={-1}\n polygonOffsetUnits={1}\n side={THREE.DoubleSide}\n transparent\n />\n </mesh>\n </group>\n\n {/* Manipulation handles - stay upright, only rotate with Y rotation */}\n {isSelected && controlMode === 'guide' && (\n <group>\n {/* Center origin marker for reference with XZ plane translation hit box */}\n <group position={[0, 0, 0]}>\n <mesh\n onPointerDown={handleTranslateXZDown}\n onPointerEnter={() => setHoveredHandle('translate-xz')}\n onPointerLeave={() => setHoveredHandle(null)}\n position={[0, 0, 0]}\n renderOrder={1000}\n scale={HANDLE_SCALE}\n >\n <boxGeometry args={[originHitSize, originHitSize, originHitSize]} />\n <HitMaterial />\n </mesh>\n <mesh position={[0, 0, 0]} renderOrder={1000} scale={HANDLE_SCALE}>\n <boxGeometry args={[ORIGIN_MARKER_SIZE, ORIGIN_MARKER_SIZE, ORIGIN_MARKER_SIZE]} />\n <HandleMaterial color=\"white\" handleId=\"translate-xz\" />\n </mesh>\n </group>\n\n {/* Translate X (world X) - Red arrow pointing along X axis */}\n <group position={[0, 0, 0]}>\n <mesh\n onPointerDown={handleTranslateDown('x')}\n onPointerEnter={() => setHoveredHandle('translate-x')}\n onPointerLeave={() => setHoveredHandle(null)}\n position={[arrowHitPos, 0, 0]}\n renderOrder={1000}\n rotation={[0, 0, Math.PI / 2]}\n scale={HANDLE_SCALE}\n >\n <cylinderGeometry args={[arrowHitRadius, arrowHitRadius, arrowHitLength, 8]} />\n <HitMaterial />\n </mesh>\n <mesh\n position={[arrowShaftPos, 0, 0]}\n renderOrder={1000}\n rotation={[0, 0, Math.PI / 2]}\n scale={HANDLE_SCALE}\n >\n <cylinderGeometry\n args={[ARROW_SHAFT_RADIUS, ARROW_SHAFT_RADIUS, ARROW_SHAFT_LENGTH, 16]}\n />\n <HandleMaterial color=\"#ff4444\" handleId=\"translate-x\" />\n </mesh>\n <mesh\n position={[arrowHeadPos, 0, 0]}\n renderOrder={1000}\n rotation={[0, 0, -Math.PI / 2]}\n scale={HANDLE_SCALE}\n >\n <coneGeometry args={[ARROW_HEAD_RADIUS, ARROW_HEAD_LENGTH, 16]} />\n <HandleMaterial color=\"#ff4444\" handleId=\"translate-x\" />\n </mesh>\n </group>\n\n {/* Translate Z (world Z) - Green arrow pointing along Z axis */}\n <group position={[0, 0, 0]}>\n <mesh\n onPointerDown={handleTranslateDown('y')}\n onPointerEnter={() => setHoveredHandle('translate-z')}\n onPointerLeave={() => setHoveredHandle(null)}\n position={[0, 0, arrowHitPos]}\n renderOrder={1000}\n rotation={[Math.PI / 2, 0, 0]}\n scale={HANDLE_SCALE}\n >\n <cylinderGeometry args={[arrowHitRadius, arrowHitRadius, arrowHitLength, 8]} />\n <HitMaterial />\n </mesh>\n <mesh\n position={[0, 0, arrowShaftPos]}\n renderOrder={1000}\n rotation={[Math.PI / 2, 0, 0]}\n scale={HANDLE_SCALE}\n >\n <cylinderGeometry\n args={[ARROW_SHAFT_RADIUS, ARROW_SHAFT_RADIUS, ARROW_SHAFT_LENGTH, 16]}\n />\n <HandleMaterial color=\"#44ff44\" handleId=\"translate-z\" />\n </mesh>\n <mesh\n position={[0, 0, arrowHeadPos]}\n renderOrder={1000}\n rotation={[Math.PI / 2, 0, 0]}\n scale={HANDLE_SCALE}\n >\n <coneGeometry args={[ARROW_HEAD_RADIUS, ARROW_HEAD_LENGTH, 16]} />\n <HandleMaterial color=\"#44ff44\" handleId=\"translate-z\" />\n </mesh>\n </group>\n\n {/* Rotation handles at corners - Blue curved arrows around Y axis */}\n <group\n position={[\n (planeWidth * (node?.scale ?? 1)) / 2,\n 0,\n (planeHeight * (node?.scale ?? 1)) / 2,\n ]}\n >\n <mesh\n onPointerDown={handleRotationDown}\n onPointerEnter={() => setHoveredHandle('rotation')}\n onPointerLeave={() => setHoveredHandle(null)}\n renderOrder={1000}\n rotation={[Math.PI / 2, 0, 0]}\n scale={HANDLE_SCALE}\n >\n <torusGeometry\n args={[ROTATION_HANDLE_RADIUS, rotationHitThickness, 16, 32, Math.PI / 2]}\n />\n <HitMaterial />\n </mesh>\n <mesh renderOrder={1000} rotation={[Math.PI / 2, 0, 0]} scale={HANDLE_SCALE}>\n <torusGeometry\n args={[ROTATION_HANDLE_RADIUS, ROTATION_HANDLE_THICKNESS, 16, 32, Math.PI / 2]}\n />\n <HandleMaterial color=\"#4444ff\" handleId=\"rotation\" />\n </mesh>\n </group>\n <group\n position={[\n -(planeWidth * (node?.scale ?? 1)) / 2,\n 0,\n (planeHeight * (node?.scale ?? 1)) / 2,\n ]}\n >\n <mesh\n onPointerDown={handleRotationDown}\n onPointerEnter={() => setHoveredHandle('rotation')}\n onPointerLeave={() => setHoveredHandle(null)}\n renderOrder={1000}\n rotation={[Math.PI / 2, 0, Math.PI / 2]}\n scale={HANDLE_SCALE}\n >\n <torusGeometry\n args={[ROTATION_HANDLE_RADIUS, rotationHitThickness, 16, 32, Math.PI / 2]}\n />\n <HitMaterial />\n </mesh>\n <mesh renderOrder={1000} rotation={[Math.PI / 2, 0, Math.PI / 2]} scale={HANDLE_SCALE}>\n <torusGeometry\n args={[ROTATION_HANDLE_RADIUS, ROTATION_HANDLE_THICKNESS, 16, 32, Math.PI / 2]}\n />\n <HandleMaterial color=\"#4444ff\" handleId=\"rotation\" />\n </mesh>\n </group>\n <group\n position={[\n -(planeWidth * (node?.scale ?? 1)) / 2,\n 0,\n -(planeHeight * (node?.scale ?? 1)) / 2,\n ]}\n >\n <mesh\n onPointerDown={handleRotationDown}\n onPointerEnter={() => setHoveredHandle('rotation')}\n onPointerLeave={() => setHoveredHandle(null)}\n renderOrder={1000}\n rotation={[Math.PI / 2, 0, Math.PI]}\n scale={HANDLE_SCALE}\n >\n <torusGeometry\n args={[ROTATION_HANDLE_RADIUS, rotationHitThickness, 16, 32, Math.PI / 2]}\n />\n <HitMaterial />\n </mesh>\n <mesh renderOrder={1000} rotation={[Math.PI / 2, 0, Math.PI]} scale={HANDLE_SCALE}>\n <torusGeometry\n args={[ROTATION_HANDLE_RADIUS, ROTATION_HANDLE_THICKNESS, 16, 32, Math.PI / 2]}\n />\n <HandleMaterial color=\"#4444ff\" handleId=\"rotation\" />\n </mesh>\n </group>\n <group\n position={[\n (planeWidth * (node?.scale ?? 1)) / 2,\n 0,\n -(planeHeight * (node?.scale ?? 1)) / 2,\n ]}\n >\n <mesh\n onPointerDown={handleRotationDown}\n onPointerEnter={() => setHoveredHandle('rotation')}\n onPointerLeave={() => setHoveredHandle(null)}\n renderOrder={1000}\n rotation={[Math.PI / 2, 0, -Math.PI / 2]}\n scale={HANDLE_SCALE}\n >\n <torusGeometry\n args={[ROTATION_HANDLE_RADIUS, rotationHitThickness, 16, 32, Math.PI / 2]}\n />\n <HitMaterial />\n </mesh>\n <mesh renderOrder={1000} rotation={[Math.PI / 2, 0, -Math.PI / 2]} scale={HANDLE_SCALE}>\n <torusGeometry\n args={[ROTATION_HANDLE_RADIUS, ROTATION_HANDLE_THICKNESS, 16, 32, Math.PI / 2]}\n />\n <HandleMaterial color=\"#4444ff\" handleId=\"rotation\" />\n </mesh>\n </group>\n\n {/* Scale handles at edge midpoints - Yellow cones pointing outward */}\n <group position={[(planeWidth * (node?.scale ?? 1)) / 2, 0, 0]}>\n <mesh\n onPointerDown={handleScaleDown('right')}\n onPointerEnter={() => setHoveredHandle('scale')}\n onPointerLeave={() => setHoveredHandle(null)}\n renderOrder={1000}\n rotation={[0, 0, -Math.PI / 2]}\n scale={HANDLE_SCALE}\n >\n <coneGeometry args={[scaleHitRadius, scaleHitLength, 16]} />\n <HitMaterial />\n </mesh>\n <mesh renderOrder={1000} rotation={[0, 0, -Math.PI / 2]} scale={HANDLE_SCALE}>\n <coneGeometry args={[SCALE_HANDLE_RADIUS, SCALE_HANDLE_LENGTH, 16]} />\n <HandleMaterial color=\"#ffff44\" handleId=\"scale\" />\n </mesh>\n </group>\n <group position={[-(planeWidth * (node?.scale ?? 1)) / 2, 0, 0]}>\n <mesh\n onPointerDown={handleScaleDown('left')}\n onPointerEnter={() => setHoveredHandle('scale')}\n onPointerLeave={() => setHoveredHandle(null)}\n renderOrder={1000}\n rotation={[0, 0, Math.PI / 2]}\n scale={HANDLE_SCALE}\n >\n <coneGeometry args={[scaleHitRadius, scaleHitLength, 16]} />\n <HitMaterial />\n </mesh>\n <mesh renderOrder={1000} rotation={[0, 0, Math.PI / 2]} scale={HANDLE_SCALE}>\n <coneGeometry args={[SCALE_HANDLE_RADIUS, SCALE_HANDLE_LENGTH, 16]} />\n <HandleMaterial color=\"#ffff44\" handleId=\"scale\" />\n </mesh>\n </group>\n <group position={[0, 0, (planeHeight * (node?.scale ?? 1)) / 2]}>\n <mesh\n onPointerDown={handleScaleDown('top')}\n onPointerEnter={() => setHoveredHandle('scale')}\n onPointerLeave={() => setHoveredHandle(null)}\n renderOrder={1000}\n rotation={[Math.PI / 2, 0, 0]}\n scale={HANDLE_SCALE}\n >\n <coneGeometry args={[scaleHitRadius, scaleHitLength, 16]} />\n <HitMaterial />\n </mesh>\n <mesh renderOrder={1000} rotation={[Math.PI / 2, 0, 0]} scale={HANDLE_SCALE}>\n <coneGeometry args={[SCALE_HANDLE_RADIUS, SCALE_HANDLE_LENGTH, 16]} />\n <HandleMaterial color=\"#ffff44\" handleId=\"scale\" />\n </mesh>\n </group>\n <group position={[0, 0, -(planeHeight * (node?.scale ?? 1)) / 2]}>\n <mesh\n onPointerDown={handleScaleDown('bottom')}\n onPointerEnter={() => setHoveredHandle('scale')}\n onPointerLeave={() => setHoveredHandle(null)}\n renderOrder={1000}\n rotation={[-Math.PI / 2, 0, 0]}\n scale={HANDLE_SCALE}\n >\n <coneGeometry args={[scaleHitRadius, scaleHitLength, 16]} />\n <HitMaterial />\n </mesh>\n <mesh renderOrder={1000} rotation={[-Math.PI / 2, 0, 0]} scale={HANDLE_SCALE}>\n <coneGeometry args={[SCALE_HANDLE_RADIUS, SCALE_HANDLE_LENGTH, 16]} />\n <HandleMaterial color=\"#ffff44\" handleId=\"scale\" />\n </mesh>\n </group>\n </group>\n )}\n </group>\n )\n})\n\nImageRenderer.displayName = 'ImageRenderer'\n","'use client'\n\nimport { useThree } from '@react-three/fiber'\nimport { Image } from 'lucide-react'\nimport { type RefObject, useCallback, useEffect, useRef } from 'react'\nimport * as THREE from 'three'\nimport { z } from 'zod'\nimport { useShallow } from 'zustand/shallow'\nimport { TILE_SIZE } from '../../../constants'\nimport { emitter, type ImageManipulationEvent, type ImageUpdateEvent } from '@pascal/core/events'\nimport { useEditor } from '../../../hooks'\nimport { registerComponent } from '../../../registry'\nimport type { ImageNode } from '@pascal/core'\nimport { ImageNode as ImageNodeSchema } from '@pascal/core/scenegraph/schema/nodes/image'\nimport { ImageRenderer } from './image-renderer'\n\n// ============================================================================\n// REFERENCE IMAGE NODE EDITOR\n// ============================================================================\n\n/**\n * Reference image node editor component\n * Uses useEditor hooks directly to manage image manipulation\n */\nexport function ImageNodeEditor() {\n const updateNode = useEditor((state) => state.updateNode)\n const setIsManipulatingImage = useEditor((state) => state.setIsManipulatingImage)\n\n // Track undo state changes for batch updates during manipulation\n const undoStateRef = useRef<{\n [nodeId: string]: {\n position?: [number, number]\n rotation?: [number, number, number]\n scale?: number\n }\n }>({})\n\n useEffect(() => {\n const handleImageUpdate = (event: ImageUpdateEvent) => {\n const { nodeId, updates, pushToUndo } = event\n\n // Update the node in the store\n updateNode(nodeId, updates)\n\n // If pushing to undo, clear the accumulated state for this node\n if (pushToUndo) {\n delete undoStateRef.current[nodeId]\n } else {\n // Accumulate updates during drag\n if (!undoStateRef.current[nodeId]) {\n undoStateRef.current[nodeId] = {}\n }\n Object.assign(undoStateRef.current[nodeId], updates)\n }\n }\n\n const handleManipulationStart = (event: ImageManipulationEvent) => {\n const { nodeId } = event\n // Initialize accumulated state\n undoStateRef.current[nodeId] = {}\n setIsManipulatingImage(true)\n }\n\n const handleManipulationEnd = (event: ImageManipulationEvent) => {\n setIsManipulatingImage(false)\n }\n\n // Register event listeners\n emitter.on('image:update', handleImageUpdate)\n emitter.on('image:manipulation-start', handleManipulationStart)\n emitter.on('image:manipulation-end', handleManipulationEnd)\n\n // Cleanup event listeners\n return () => {\n emitter.off('image:update', handleImageUpdate)\n emitter.off('image:manipulation-start', handleManipulationStart)\n emitter.off('image:manipulation-end', handleManipulationEnd)\n }\n }, [updateNode, setIsManipulatingImage])\n\n return null\n}\n\n// ============================================================================\n// IMAGE MANIPULATION HOOK\n// ============================================================================\n\n/**\n * Custom hook for image manipulation handlers\n * Provides all the pointer event handlers for transforming reference images\n */\nexport function useImageManipulation(\n nodeId: ImageNode['id'],\n groupRef: RefObject<THREE.Group | null>,\n setActiveHandle?: (handleId: string | null) => void,\n) {\n const { camera, gl } = useThree()\n const movingCamera = useEditor((state) => state.movingCamera)\n const controlMode = useEditor((state) => state.controlMode)\n const handleNodeSelect = useEditor((state) => state.handleNodeSelect)\n\n const { nodeRotation, nodeScale, nodePosition } = useEditor(\n useShallow((state) => {\n const handle = state.graph.getNodeById(nodeId!)\n const node = handle?.data() as ImageNode | undefined\n return {\n nodeRotation: node?.rotation || [0, 0, 0],\n nodeScale: node?.scale || 1,\n nodePosition: node?.position || [0, 0],\n }\n }),\n )\n\n const handleSelect = useCallback(\n (e?: any) => {\n const node = useEditor.getState().graph.getNodeById(nodeId)?.data() as ImageNode | undefined\n if (controlMode === 'guide' || controlMode === 'select') {\n handleNodeSelect(nodeId, e || {})\n emitter.emit('image:select', { node: node! })\n }\n },\n [controlMode, nodeId, handleNodeSelect],\n )\n\n const handleTranslateDown = useCallback(\n (axis: 'x' | 'y') => (e: any) => {\n if (e.button !== 0) return\n if (movingCamera) return\n e.stopPropagation()\n if (!groupRef.current) return\n\n const handleId = axis === 'x' ? 'translate-x' : 'translate-z'\n setActiveHandle?.(handleId)\n emitter.emit('image:manipulation-start', { nodeId })\n\n // Hierarchy: ImageRenderer Group -> NodeRenderer Inner Group -> NodeRenderer Outer Group -> Parent\n const imageGroup = groupRef.current\n if (!imageGroup?.parent?.parent) return\n\n const nodeGroup = imageGroup.parent.parent\n const parentGroup = nodeGroup.parent\n if (!parentGroup) return\n\n // 1. Calculate World Axis Direction\n const localAxis = axis === 'x' ? new THREE.Vector3(1, 0, 0) : new THREE.Vector3(0, 0, 1)\n const nodeOrigin = new THREE.Vector3().setFromMatrixPosition(nodeGroup.matrixWorld)\n // Get a point 1 unit along the axis in local space, convert to world\n const pointOnAxis = localAxis.clone().applyMatrix4(nodeGroup.matrixWorld)\n // The direction is the difference\n const worldAxis = pointOnAxis.sub(nodeOrigin).normalize()\n\n // 2. Setup Intersection Plane\n const initialMouse = new THREE.Vector3()\n const plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), -nodeOrigin.y)\n const raycaster = new THREE.Raycaster()\n raycaster.setFromCamera(e.pointer, camera)\n raycaster.ray.intersectPlane(plane, initialMouse)\n\n // 3. Calculate initial projection offset\n // This is the distance from the node origin to the clicked point along the axis\n const clickOffsetVector = initialMouse.clone().sub(nodeOrigin)\n const initialProjection = clickOffsetVector.dot(worldAxis)\n\n // Capture starting position\n const startWorldPos = nodeOrigin.clone()\n\n let lastPosition: [number, number] | null = null\n\n const handleMove = (ev: PointerEvent) => {\n const rect = gl.domElement.getBoundingClientRect()\n const mx = ((ev.clientX - rect.left) / rect.width) * 2 - 1\n const my = -((ev.clientY - rect.top) / rect.height) * 2 + 1\n const mouseVec = new THREE.Vector2(mx, my)\n\n raycaster.setFromCamera(mouseVec, camera)\n const intersect = new THREE.Vector3()\n if (!raycaster.ray.intersectPlane(plane, intersect)) return\n\n // 4. Calculate new projection\n const vectorFromStart = intersect.clone().sub(startWorldPos)\n const currentProjection = vectorFromStart.dot(worldAxis)\n\n // 5. Calculate delta (movement required)\n let delta = currentProjection - initialProjection\n\n if (ev.shiftKey) {\n delta = Math.round(delta / TILE_SIZE) * TILE_SIZE\n }\n\n // 6. Apply delta along world axis to start position\n const newWorldPos = startWorldPos.clone().add(worldAxis.clone().multiplyScalar(delta))\n\n // 7. Convert back to local space for storage\n const newLocalPos = parentGroup.worldToLocal(newWorldPos)\n\n // Store as simple X/Z\n lastPosition = [newLocalPos.x / TILE_SIZE, newLocalPos.z / TILE_SIZE]\n\n emitter.emit('image:update', {\n nodeId,\n updates: { position: lastPosition },\n pushToUndo: false,\n })\n }\n\n const handleUp = () => {\n document.removeEventListener('pointermove', handleMove)\n document.removeEventListener('pointerup', handleUp)\n setActiveHandle?.(null)\n if (lastPosition) {\n emitter.emit('image:update', {\n nodeId,\n updates: { position: lastPosition },\n pushToUndo: true,\n })\n }\n emitter.emit('image:manipulation-end', { nodeId })\n }\n\n document.addEventListener('pointermove', handleMove)\n document.addEventListener('pointerup', handleUp)\n },\n [nodeId, movingCamera, camera, gl, groupRef, setActiveHandle],\n )\n\n const handleTranslateXZDown = useCallback(\n (e: any) => {\n if (e.button !== 0) return\n if (movingCamera) return\n e.stopPropagation()\n if (!groupRef.current) return\n\n setActiveHandle?.('translate-xz')\n emitter.emit('image:manipulation-start', { nodeId })\n\n // Get the NodeRenderer's outer group (the one with the actual position)\n // Hierarchy: ImageRenderer Group -> NodeRenderer Inner Group -> NodeRenderer Outer Group -> Parent\n const imageGroup = groupRef.current\n if (!imageGroup?.parent?.parent) return\n\n const nodeGroup = imageGroup.parent.parent\n const parentGroup = nodeGroup.parent\n if (!parentGroup) return\n\n // Calculate the offset between the click point and the node's origin in world space\n const initialMouse = new THREE.Vector3()\n const plane = new THREE.Plane(\n new THREE.Vector3(0, 1, 0),\n -nodeGroup.getWorldPosition(new THREE.Vector3()).y,\n )\n const raycaster = new THREE.Raycaster()\n raycaster.setFromCamera(e.pointer, camera)\n raycaster.ray.intersectPlane(plane, initialMouse)\n\n const nodeWorldPos = new THREE.Vector3()\n nodeGroup.getWorldPosition(nodeWorldPos)\n const clickOffset = nodeWorldPos.clone().sub(initialMouse)\n\n let lastPosition: [number, number] | null = null\n\n const handleMove = (ev: PointerEvent) => {\n const rect = gl.domElement.getBoundingClientRect()\n const mx = ((ev.clientX - rect.left) / rect.width) * 2 - 1\n const my = -((ev.clientY - rect.top) / rect.height) * 2 + 1\n const mouseVec = new THREE.Vector2(mx, my)\n\n raycaster.setFromCamera(mouseVec, camera)\n const intersect = new THREE.Vector3()\n if (!raycaster.ray.intersectPlane(plane, intersect)) return\n\n // Calculate target world position\n const targetWorldPos = intersect.clone().add(clickOffset)\n\n // Convert to parent local space\n const targetLocalPos = parentGroup.worldToLocal(targetWorldPos.clone())\n\n let finalX = targetLocalPos.x\n let finalZ = targetLocalPos.z\n\n if (ev.shiftKey) {\n finalX = Math.round(finalX / TILE_SIZE) * TILE_SIZE\n finalZ = Math.round(finalZ / TILE_SIZE) * TILE_SIZE\n }\n\n lastPosition = [finalX / TILE_SIZE, finalZ / TILE_SIZE]\n emitter.emit('image:update', {\n nodeId,\n updates: { position: lastPosition },\n pushToUndo: false,\n })\n }\n\n const handleUp = () => {\n document.removeEventListener('pointermove', handleMove)\n document.removeEventListener('pointerup', handleUp)\n setActiveHandle?.(null)\n if (lastPosition) {\n emitter.emit('image:update', {\n nodeId,\n updates: { position: lastPosition },\n pushToUndo: true,\n })\n }\n emitter.emit('image:manipulation-end', { nodeId })\n }\n\n document.addEventListener('pointermove', handleMove)\n document.addEventListener('pointerup', handleUp)\n },\n [nodeId, movingCamera, camera, gl, groupRef, setActiveHandle],\n )\n\n const handleRotationDown = useCallback(\n (e: any) => {\n if (e.button !== 0) return\n if (movingCamera) return\n e.stopPropagation()\n if (!groupRef.current) return\n\n setActiveHandle?.('rotation')\n emitter.emit('image:manipulation-start', { nodeId })\n\n // Hierarchy: ImageRenderer Group -> NodeRenderer Inner Group -> NodeRenderer Outer Group -> Parent\n const imageGroup = groupRef.current\n if (!imageGroup?.parent?.parent) return\n\n const nodeGroup = imageGroup.parent.parent\n\n const nodeOrigin = new THREE.Vector3().setFromMatrixPosition(nodeGroup.matrixWorld)\n const center = nodeOrigin.clone()\n const initialMouse = new THREE.Vector3()\n const plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), -nodeOrigin.y)\n const raycaster = new THREE.Raycaster()\n raycaster.setFromCamera(e.pointer, camera)\n raycaster.ray.intersectPlane(plane, initialMouse)\n const initialVector = initialMouse.clone().sub(center)\n const initialAngle = Math.atan2(initialVector.z, initialVector.x)\n const initialYRotation = nodeRotation[1] // Y component in radians\n let lastRotation: [number, number, number] | null = null\n\n const handleMove = (ev: PointerEvent) => {\n const rect = gl.domElement.getBoundingClientRect()\n const mx = ((ev.clientX - rect.left) / rect.width) * 2 - 1\n const my = -((ev.clientY - rect.top) / rect.height) * 2 + 1\n const mouseVec = new THREE.Vector2(mx, my)\n raycaster.setFromCamera(mouseVec, camera)\n const intersect = new THREE.Vector3()\n if (!raycaster.ray.intersectPlane(plane, intersect)) return\n\n const vector = intersect.clone().sub(center)\n const angle = Math.atan2(vector.z, vector.x)\n const delta = angle - initialAngle\n let newYRotation = initialYRotation - delta // Already in radians\n\n if (ev.shiftKey) {\n // Snap to 45° increments (π/4 radians)\n newYRotation = Math.round(newYRotation / (Math.PI / 4)) * (Math.PI / 4)\n }\n\n lastRotation = [nodeRotation[0], newYRotation, nodeRotation[2]]\n emitter.emit('image:update', {\n nodeId,\n updates: { rotation: lastRotation },\n pushToUndo: false,\n })\n }\n\n const handleUp = () => {\n document.removeEventListener('pointermove', handleMove)\n document.removeEventListener('pointerup', handleUp)\n setActiveHandle?.(null)\n if (lastRotation !== null) {\n emitter.emit('image:update', {\n nodeId,\n updates: { rotation: lastRotation },\n pushToUndo: true,\n })\n }\n emitter.emit('image:manipulation-end', { nodeId })\n }\n\n document.addEventListener('pointermove', handleMove)\n document.addEventListener('pointerup', handleUp)\n },\n [nodeId, nodeRotation, movingCamera, camera, gl, groupRef, setActiveHandle],\n )\n\n const handleScaleDown = useCallback(\n (edge: 'right' | 'left' | 'top' | 'bottom') => (e: any) => {\n if (e.button !== 0) return\n if (movingCamera) return\n e.stopPropagation()\n if (!groupRef.current) return\n\n setActiveHandle?.('scale')\n emitter.emit('image:manipulation-start', { nodeId })\n\n const center = groupRef.current.position.clone()\n const initialMouse = new THREE.Vector3()\n const plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), 0)\n const raycaster = new THREE.Raycaster()\n raycaster.setFromCamera(e.pointer, camera)\n raycaster.ray.intersectPlane(plane, initialMouse)\n const initialDist = center.distanceTo(initialMouse)\n const initialScale = nodeScale\n const getLocalDir = () => {\n switch (edge) {\n case 'right':\n return new THREE.Vector3(1, 0, 0)\n case 'left':\n return new THREE.Vector3(-1, 0, 0)\n case 'top':\n return new THREE.Vector3(0, 0, 1)\n case 'bottom':\n return new THREE.Vector3(0, 0, -1)\n }\n }\n const localDir = getLocalDir()\n const worldZero = new THREE.Vector3().applyMatrix4(groupRef.current.matrixWorld)\n const worldDir = localDir\n .clone()\n .applyMatrix4(groupRef.current.matrixWorld)\n .sub(worldZero)\n .normalize()\n let lastScale: number | null = null\n\n const handleMove = (ev: PointerEvent) => {\n const rect = gl.domElement.getBoundingClientRect()\n const mx = ((ev.clientX - rect.left) / rect.width) * 2 - 1\n const my = -((ev.clientY - rect.top) / rect.height) * 2 + 1\n const mouseVec = new THREE.Vector2(mx, my)\n raycaster.setFromCamera(mouseVec, camera)\n const intersect = new THREE.Vector3()\n raycaster.ray.intersectPlane(plane, intersect)\n const delta = intersect.clone().sub(initialMouse)\n const projected = delta.dot(worldDir)\n const projectedPoint = initialMouse.clone().add(worldDir.clone().multiplyScalar(projected))\n const newDist = center.distanceTo(projectedPoint)\n let newScale = initialScale * (newDist / initialDist)\n\n if (ev.shiftKey) {\n newScale = Math.round(newScale * 10) / 10\n }\n\n lastScale = Math.max(0.1, newScale)\n emitter.emit('image:update', {\n nodeId,\n updates: { scale: lastScale },\n pushToUndo: false,\n })\n }\n\n const handleUp = () => {\n document.removeEventListener('pointermove', handleMove)\n document.removeEventListener('pointerup', handleUp)\n setActiveHandle?.(null)\n if (lastScale !== null) {\n emitter.emit('image:update', {\n nodeId,\n updates: { scale: lastScale },\n pushToUndo: true,\n })\n }\n emitter.emit('image:manipulation-end', { nodeId })\n }\n\n document.addEventListener('pointermove', handleMove)\n document.addEventListener('pointerup', handleUp)\n },\n [nodeId, nodeScale, movingCamera, camera, gl, groupRef, setActiveHandle],\n )\n\n return {\n handleSelect,\n handleTranslateDown,\n handleTranslateXZDown,\n handleRotationDown,\n handleScaleDown,\n }\n}\n\n// ============================================================================\n// REGISTER REFERENCE IMAGE COMPONENT\n// ============================================================================\n\nregisterComponent({\n nodeType: 'reference-image',\n nodeName: 'Reference Image',\n editorMode: 'guide',\n schema: ImageNodeSchema,\n nodeEditor: ImageNodeEditor,\n nodeRenderer: ImageRenderer,\n toolIcon: Image,\n})\n","\nimport { get, set } from 'idb-keyval'\n\nexport const ASSET_PREFIX = 'asset_data:'\n\n// Cache for active object URLs to prevent leaks and flickering\nconst urlCache = new Map<string, string>()\n\n/**\n * Save a file to IndexedDB and return a custom protocol URL\n */\nexport async function saveAsset(file: File): Promise<string> {\n const id = crypto.randomUUID()\n await set(`${ASSET_PREFIX}${id}`, file)\n return `asset://${id}`\n}\n\n/**\n * Load a file from IndexedDB and return an object URL\n * If the URL is not a custom protocol URL, return it as is\n */\nexport async function loadAssetUrl(url: string): Promise<string | null> {\n if (!url) return null\n \n // If it's already a blob or http URL, return as is\n if (url.startsWith('blob:') || url.startsWith('http')) {\n return url\n }\n\n // Handle our custom asset protocol\n if (url.startsWith('asset://')) {\n const id = url.replace('asset://', '')\n \n // Check cache first\n if (urlCache.has(id)) {\n return urlCache.get(id)!\n }\n\n try {\n const file = await get<File | Blob>(`${ASSET_PREFIX}${id}`)\n if (!file) {\n console.warn(`Asset not found: ${id}`)\n return null\n }\n const objectUrl = URL.createObjectURL(file)\n urlCache.set(id, objectUrl)\n return objectUrl\n } catch (error) {\n console.error('Failed to load asset:', error)\n return null\n }\n }\n\n // Legacy data URLs are returned as is (though we want to avoid them)\n return url\n}\n","'use client'\n\nimport { useGLTF } from '@react-three/drei'\nimport { useThree } from '@react-three/fiber'\nimport { memo, useEffect, useMemo, useRef, useState } from 'react'\nimport * as THREE from 'three'\nimport { MeshoptDecoder } from 'three/examples/jsm/libs/meshopt_decoder.module.js'\nimport { KTX2Loader } from 'three/examples/jsm/loaders/KTX2Loader.js'\nimport { useShallow } from 'zustand/shallow'\nimport { FLOOR_SPACING, TILE_SIZE } from '../../../constants'\nimport { useScanManipulation } from '../scan/scan-node'\nimport { useEditor } from '../../../hooks'\nimport { loadAssetUrl } from '../../../asset-storage'\nimport type { ScanNode } from '@pascal/core'\n\nconst ktx2LoaderInstance = new KTX2Loader()\nktx2LoaderInstance.setTranscoderPath('https://cdn.jsdelivr.net/gh/pmndrs/drei-assets@master/basis/')\n\nconst useGLTFKTX2 = (path: string) => {\n const gl = useThree((state) => state.gl)\n\n return useGLTF(path, true, true, (loader) => {\n ktx2LoaderInstance.detectSupport(gl)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n loader.setKTX2Loader(ktx2LoaderInstance as any)\n loader.setMeshoptDecoder(MeshoptDecoder)\n })\n}\n\nconst DEBUG = false\nconst HANDLE_SCALE = 1 // Manual scale for manipulation handles\n\n// Handle geometry dimensions - base sizes\nconst ORIGIN_MARKER_SIZE = 0.16\nconst ARROW_SHAFT_RADIUS = 0.06\nconst ARROW_SHAFT_LENGTH = 2\nconst ARROW_HEAD_RADIUS = 0.12\nconst ARROW_HEAD_LENGTH = 0.3\nconst ROTATION_HANDLE_RADIUS = 0.4\nconst ROTATION_HANDLE_THICKNESS = 0.06\nconst SCALE_HANDLE_RADIUS = 0.12\nconst SCALE_HANDLE_LENGTH = 0.3\n\n// Hit target scale factors (multipliers for base dimensions)\nconst ORIGIN_HIT_SCALE = 2.5\nconst ARROW_HIT_RADIUS_SCALE = 2.5\nconst ARROW_HIT_LENGTH_SCALE = 1.1\nconst ROTATION_HIT_SCALE = 2\nconst SCALE_HIT_SCALE = 1.5\n\ninterface ScanRendererProps {\n nodeId: ScanNode['id']\n}\n\ninterface ScanRendererContentProps extends ScanRendererProps {\n resolvedUrl: string\n}\n\nconst EMPTY_LEVELS: any[] = []\n\nconst ScanRendererContent = memo(({ nodeId, resolvedUrl }: ScanRendererContentProps) => {\n const hitAreaOpacity = DEBUG ? (0.5 as const) : 0\n\n const { levelId, nodeOpacity, nodePosition, nodeScale, nodeRotation, nodeVisible } = useEditor(\n useShallow((state) => {\n const handle = state.graph.getNodeById(nodeId)\n const node = handle?.data() as ScanNode | undefined\n return {\n levelId: state.getLevelId(nodeId),\n nodeOpacity: node?.opacity,\n nodePosition: node?.position || [0, 0],\n nodeRotation: node?.rotation || [0, 0, 0],\n nodeScale: node?.scale || 1,\n nodeVisible: node?.visible ?? true,\n }\n }),\n )\n const { scene } = useGLTFKTX2(resolvedUrl)\n const groupRef = useRef<THREE.Group>(null)\n\n // Get state from store\n const controlMode = useEditor((state) => state.controlMode)\n const movingCamera = useEditor((state) => state.movingCamera)\n const selectedNodeIds = useEditor((state) => state.selectedNodeIds)\n\n const isSelected = selectedNodeIds.includes(nodeId)\n\n // Track hover and active states for handles\n const [hoveredHandle, setHoveredHandle] = useState<string | null>(null)\n const [activeHandle, setActiveHandle] = useState<string | null>(null)\n\n // Get manipulation handlers from the builder hook\n const {\n handleSelect,\n handleTranslateDown,\n handleTranslateXZDown,\n handleRotationDown,\n handleTranslateYDown,\n handleScaleDown,\n } = useScanManipulation(nodeId, groupRef, setActiveHandle)\n\n // Get level for Y position\n const levels = useEditor((state) => {\n const building = state.scene.root.children?.[0]?.children.find((c) => c.type === 'building')\n return building ? building.children : EMPTY_LEVELS\n })\n const level = useMemo(() => levels.find((l) => l.id === levelId), [levels, levelId])\n const levelNumber = level?.level ?? 0\n\n // Track hover state for the scan itself\n const [isHovered, setIsHovered] = useState(false)\n\n // Apply opacity and visibility to scan materials\n const clonedScene = useMemo(() => {\n const cloned = scene.clone()\n cloned.traverse((child: any) => {\n if (child.isMesh) {\n // Disable raycasting when not visible\n if (!nodeVisible) {\n child.raycast = () => {}\n }\n if (child.material) {\n child.material = child.material.clone()\n child.material.transparent = (nodeOpacity ?? 100) < 100\n child.material.opacity = (nodeOpacity ?? 100) / 100\n }\n }\n })\n return cloned\n }, [scene, nodeOpacity, nodeVisible])\n // Visual states for handles\n const getHandleOpacity = (handleId: string) => {\n if (activeHandle === handleId || hoveredHandle === handleId) return 1\n return 0.6\n }\n\n const getHandleEmissiveIntensity = (handleId: string) => {\n if (activeHandle === handleId || hoveredHandle === handleId) return 0.5\n return 0.05\n }\n\n // Reusable material components\n const HitMaterial = () => (\n <meshStandardMaterial depthTest={false} opacity={hitAreaOpacity} transparent />\n )\n\n const HandleMaterial = ({ color, handleId }: { color: string; handleId: string }) => (\n <meshStandardMaterial\n color={color}\n depthTest={false}\n emissive={color}\n emissiveIntensity={getHandleEmissiveIntensity(handleId)}\n metalness={0.3}\n opacity={getHandleOpacity(handleId)}\n roughness={0.4}\n side={THREE.DoubleSide}\n transparent\n />\n )\n\n // Calculate derived dimensions from base sizes and scale factors\n const originHitSize = ORIGIN_MARKER_SIZE * ORIGIN_HIT_SCALE\n const arrowHitRadius = ARROW_SHAFT_RADIUS * ARROW_HIT_RADIUS_SCALE\n const arrowHitLength = ARROW_SHAFT_LENGTH * ARROW_HIT_LENGTH_SCALE\n const rotationHitThickness = ROTATION_HANDLE_THICKNESS * ROTATION_HIT_SCALE\n const scaleHitRadius = SCALE_HANDLE_RADIUS * SCALE_HIT_SCALE\n const scaleHitLength = SCALE_HANDLE_LENGTH * SCALE_HIT_SCALE\n\n // Calculate handle positions based on dimensions\n const originMarkerEdge = ORIGIN_MARKER_SIZE / 2\n const originHitEdge = originHitSize / 2\n\n const arrowShaftPos = originMarkerEdge + ARROW_SHAFT_LENGTH / 2\n const arrowHitPos = originHitEdge + arrowHitLength / 2\n const arrowHeadPos = originMarkerEdge + ARROW_SHAFT_LENGTH + ARROW_HEAD_LENGTH / 2\n\n // Calculate bounding box for the scan\n const bbox = useMemo(() => new THREE.Box3().setFromObject(clonedScene), [clonedScene])\n const bboxSize = useMemo(() => {\n const size = new THREE.Vector3()\n bbox.getSize(size)\n return size\n }, [bbox])\n\n // Convert grid position to world position\n const [worldX, worldZ] = useMemo(\n () => [nodePosition[0] * TILE_SIZE, nodePosition[1] * TILE_SIZE],\n [nodePosition],\n )\n\n return (\n <group\n position={[worldX, levelNumber * FLOOR_SPACING + 0.001 + (nodePosition[2] || 0), worldZ]}\n ref={groupRef}\n rotation={[0, (nodeRotation[1] * Math.PI) / 180, 0]}\n >\n {/* The 3D scan model */}\n <group scale={nodeScale}>\n <primitive\n object={clonedScene}\n onPointerDown={(e: any) => {\n if (e.button !== 0) return\n if ((controlMode === 'guide' || controlMode === 'select') && !movingCamera) {\n e.stopPropagation()\n handleSelect(e)\n }\n }}\n onPointerEnter={() => {\n if ((controlMode === 'guide' || controlMode === 'select') && !movingCamera) {\n setIsHovered(true)\n }\n }}\n onPointerLeave={() => {\n setIsHovered(false)\n }}\n raycast={nodeVisible ? undefined : () => null}\n />\n {/* Add emissive highlight when selected or hovered */}\n {(controlMode === 'guide' || controlMode === 'select') && (isHovered || isSelected) && (\n <meshStandardMaterial\n attach=\"material\"\n emissive=\"#ffffff\"\n emissiveIntensity={0.2}\n transparent\n />\n )}\n </group>\n\n {/* Manipulation handles - stay upright, only rotate with Y rotation */}\n {isSelected && controlMode === 'guide' && (\n <group>\n {/* Center origin marker for reference with XZ plane translation hit box */}\n <group position={[0, 0, 0]}>\n <mesh\n onPointerDown={handleTranslateXZDown}\n onPointerEnter={() => setHoveredHandle('translate-xz')}\n onPointerLeave={() => setHoveredHandle(null)}\n position={[0, 0, 0]}\n renderOrder={1000}\n scale={HANDLE_SCALE}\n >\n <boxGeometry args={[originHitSize, originHitSize, originHitSize]} />\n <HitMaterial />\n </mesh>\n <mesh position={[0, 0, 0]} renderOrder={1000} scale={HANDLE_SCALE}>\n <boxGeometry args={[ORIGIN_MARKER_SIZE, ORIGIN_MARKER_SIZE, ORIGIN_MARKER_SIZE]} />\n <HandleMaterial color=\"white\" handleId=\"translate-xz\" />\n </mesh>\n </group>\n\n {/* Translate X (world X) - Red arrow pointing along X axis */}\n <group position={[0, 0, 0]}>\n <mesh\n onPointerDown={handleTranslateDown('x')}\n onPointerEnter={() => setHoveredHandle('translate-x')}\n onPointerLeave={() => setHoveredHandle(null)}\n position={[arrowHitPos, 0, 0]}\n renderOrder={1000}\n rotation={[0, 0, Math.PI / 2]}\n scale={HANDLE_SCALE}\n >\n <cylinderGeometry args={[arrowHitRadius, arrowHitRadius, arrowHitLength, 8]} />\n <HitMaterial />\n </mesh>\n <mesh\n position={[arrowShaftPos, 0, 0]}\n renderOrder={1000}\n rotation={[0, 0, Math.PI / 2]}\n scale={HANDLE_SCALE}\n >\n <cylinderGeometry\n args={[ARROW_SHAFT_RADIUS, ARROW_SHAFT_RADIUS, ARROW_SHAFT_LENGTH, 16]}\n />\n <HandleMaterial color=\"#ff4444\" handleId=\"translate-x\" />\n </mesh>\n <mesh\n position={[arrowHeadPos, 0, 0]}\n renderOrder={1000}\n rotation={[0, 0, -Math.PI / 2]}\n scale={HANDLE_SCALE}\n >\n <coneGeometry args={[ARROW_HEAD_RADIUS, ARROW_HEAD_LENGTH, 16]} />\n <HandleMaterial color=\"#ff4444\" handleId=\"translate-x\" />\n </mesh>\n </group>\n\n {/* Translate Z (world Z) - Green arrow pointing along Z axis */}\n <group position={[0, 0, 0]}>\n <mesh\n onPointerDown={handleTranslateDown('z')}\n onPointerEnter={() => setHoveredHandle('translate-z')}\n onPointerLeave={() => setHoveredHandle(null)}\n position={[0, 0, arrowHitPos]}\n renderOrder={1000}\n rotation={[Math.PI / 2, 0, 0]}\n scale={HANDLE_SCALE}\n >\n <cylinderGeometry args={[arrowHitRadius, arrowHitRadius, arrowHitLength, 8]} />\n <HitMaterial />\n </mesh>\n <mesh\n position={[0, 0, arrowShaftPos]}\n renderOrder={1000}\n rotation={[Math.PI / 2, 0, 0]}\n scale={HANDLE_SCALE}\n >\n <cylinderGeometry\n args={[ARROW_SHAFT_RADIUS, ARROW_SHAFT_RADIUS, ARROW_SHAFT_LENGTH, 16]}\n />\n <HandleMaterial color=\"#44ff44\" handleId=\"translate-z\" />\n </mesh>\n <mesh\n position={[0, 0, arrowHeadPos]}\n renderOrder={1000}\n rotation={[Math.PI / 2, 0, 0]}\n scale={HANDLE_SCALE}\n >\n <coneGeometry args={[ARROW_HEAD_RADIUS, ARROW_HEAD_LENGTH, 16]} />\n <HandleMaterial color=\"#44ff44\" handleId=\"translate-z\" />\n </mesh>\n </group>\n\n {/* Translate Y (world Y) - Blue arrow pointing upward along Y axis */}\n <group position={[0, 0, 0]}>\n <mesh\n onPointerDown={handleTranslateYDown}\n onPointerEnter={() => setHoveredHandle('translate-y')}\n onPointerLeave={() => setHoveredHandle(null)}\n position={[0, arrowHitPos, 0]}\n renderOrder={1000}\n scale={HANDLE_SCALE}\n >\n <cylinderGeometry args={[arrowHitRadius, arrowHitRadius, arrowHitLength, 8]} />\n <HitMaterial />\n </mesh>\n <mesh position={[0, arrowShaftPos, 0]} renderOrder={1000} scale={HANDLE_SCALE}>\n <cylinderGeometry\n args={[ARROW_SHAFT_RADIUS, ARROW_SHAFT_RADIUS, ARROW_SHAFT_LENGTH, 16]}\n />\n <HandleMaterial color=\"#4444ff\" handleId=\"translate-y\" />\n </mesh>\n <mesh position={[0, arrowHeadPos, 0]} renderOrder={1000} scale={HANDLE_SCALE}>\n <coneGeometry args={[ARROW_HEAD_RADIUS, ARROW_HEAD_LENGTH, 16]} />\n <HandleMaterial color=\"#4444ff\" handleId=\"translate-y\" />\n </mesh>\n </group>\n\n {/* Rotation handles at corners - Cyan curved arrows around Y axis */}\n <group position={[(bboxSize.x * nodeScale) / 2, 0, (bboxSize.z * nodeScale) / 2]}>\n <mesh\n onPointerDown={handleRotationDown}\n onPointerEnter={() => setHoveredHandle('rotation')}\n onPointerLeave={() => setHoveredHandle(null)}\n renderOrder={1000}\n rotation={[Math.PI / 2, 0, 0]}\n scale={HANDLE_SCALE}\n >\n <torusGeometry\n args={[ROTATION_HANDLE_RADIUS, rotationHitThickness, 16, 32, Math.PI / 2]}\n />\n <HitMaterial />\n </mesh>\n <mesh renderOrder={1000} rotation={[Math.PI / 2, 0, 0]} scale={HANDLE_SCALE}>\n <torusGeometry\n args={[ROTATION_HANDLE_RADIUS, ROTATION_HANDLE_THICKNESS, 16, 32, Math.PI / 2]}\n />\n <HandleMaterial color=\"#44ffff\" handleId=\"rotation\" />\n </mesh>\n </group>\n <group position={[-(bboxSize.x * nodeScale) / 2, 0, (bboxSize.z * nodeScale) / 2]}>\n <mesh\n onPointerDown={handleRotationDown}\n onPointerEnter={() => setHoveredHandle('rotation')}\n onPointerLeave={() => setHoveredHandle(null)}\n renderOrder={1000}\n rotation={[Math.PI / 2, 0, Math.PI / 2]}\n scale={HANDLE_SCALE}\n >\n <torusGeometry\n args={[ROTATION_HANDLE_RADIUS, rotationHitThickness, 16, 32, Math.PI / 2]}\n />\n <HitMaterial />\n </mesh>\n <mesh renderOrder={1000} rotation={[Math.PI / 2, 0, Math.PI / 2]} scale={HANDLE_SCALE}>\n <torusGeometry\n args={[ROTATION_HANDLE_RADIUS, ROTATION_HANDLE_THICKNESS, 16, 32, Math.PI / 2]}\n />\n <HandleMaterial color=\"#44ffff\" handleId=\"rotation\" />\n </mesh>\n </group>\n <group position={[-(bboxSize.x * nodeScale) / 2, 0, -(bboxSize.z * nodeScale) / 2]}>\n <mesh\n onPointerDown={handleRotationDown}\n onPointerEnter={() => setHoveredHandle('rotation')}\n onPointerLeave={() => setHoveredHandle(null)}\n renderOrder={1000}\n rotation={[Math.PI / 2, 0, Math.PI]}\n scale={HANDLE_SCALE}\n >\n <torusGeometry\n args={[ROTATION_HANDLE_RADIUS, rotationHitThickness, 16, 32, Math.PI / 2]}\n />\n <HitMaterial />\n </mesh>\n <mesh renderOrder={1000} rotation={[Math.PI / 2, 0, Math.PI]} scale={HANDLE_SCALE}>\n <torusGeometry\n args={[ROTATION_HANDLE_RADIUS, ROTATION_HANDLE_THICKNESS, 16, 32, Math.PI / 2]}\n />\n <HandleMaterial color=\"#44ffff\" handleId=\"rotation\" />\n </mesh>\n </group>\n <group position={[(bboxSize.x * nodeScale) / 2, 0, -(bboxSize.z * nodeScale) / 2]}>\n <mesh\n onPointerDown={handleRotationDown}\n onPointerEnter={() => setHoveredHandle('rotation')}\n onPointerLeave={() => setHoveredHandle(null)}\n renderOrder={1000}\n rotation={[Math.PI / 2, 0, -Math.PI / 2]}\n scale={HANDLE_SCALE}\n >\n <torusGeometry\n args={[ROTATION_HANDLE_RADIUS, rotationHitThickness, 16, 32, Math.PI / 2]}\n />\n <HitMaterial />\n </mesh>\n <mesh renderOrder={1000} rotation={[Math.PI / 2, 0, -Math.PI / 2]} scale={HANDLE_SCALE}>\n <torusGeometry\n args={[ROTATION_HANDLE_RADIUS, ROTATION_HANDLE_THICKNESS, 16, 32, Math.PI / 2]}\n />\n <HandleMaterial color=\"#44ffff\" handleId=\"rotation\" />\n </mesh>\n </group>\n\n {/* Scale handles at edge midpoints - Yellow cones pointing outward */}\n <group position={[(bboxSize.x * nodeScale) / 2, 0, 0]}>\n <mesh\n onPointerDown={handleScaleDown}\n onPointerEnter={() => setHoveredHandle('scale')}\n onPointerLeave={() => setHoveredHandle(null)}\n renderOrder={1000}\n rotation={[0, 0, -Math.PI / 2]}\n scale={HANDLE_SCALE}\n >\n <coneGeometry args={[scaleHitRadius, scaleHitLength, 16]} />\n <HitMaterial />\n </mesh>\n <mesh renderOrder={1000} rotation={[0, 0, -Math.PI / 2]} scale={HANDLE_SCALE}>\n <coneGeometry args={[SCALE_HANDLE_RADIUS, SCALE_HANDLE_LENGTH, 16]} />\n <HandleMaterial color=\"#ffff44\" handleId=\"scale\" />\n </mesh>\n </group>\n <group position={[-(bboxSize.x * nodeScale) / 2, 0, 0]}>\n <mesh\n onPointerDown={handleScaleDown}\n onPointerEnter={() => setHoveredHandle('scale')}\n onPointerLeave={() => setHoveredHandle(null)}\n renderOrder={1000}\n rotation={[0, 0, Math.PI / 2]}\n scale={HANDLE_SCALE}\n >\n <coneGeometry args={[scaleHitRadius, scaleHitLength, 16]} />\n <HitMaterial />\n </mesh>\n <mesh renderOrder={1000} rotation={[0, 0, Math.PI / 2]} scale={HANDLE_SCALE}>\n <coneGeometry args={[SCALE_HANDLE_RADIUS, SCALE_HANDLE_LENGTH, 16]} />\n <HandleMaterial color=\"#ffff44\" handleId=\"scale\" />\n </mesh>\n </group>\n <group position={[0, 0, (bboxSize.z * nodeScale) / 2]}>\n <mesh\n onPointerDown={handleScaleDown}\n onPointerEnter={() => setHoveredHandle('scale')}\n onPointerLeave={() => setHoveredHandle(null)}\n renderOrder={1000}\n rotation={[Math.PI / 2, 0, 0]}\n scale={HANDLE_SCALE}\n >\n <coneGeometry args={[scaleHitRadius, scaleHitLength, 16]} />\n <HitMaterial />\n </mesh>\n <mesh renderOrder={1000} rotation={[Math.PI / 2, 0, 0]} scale={HANDLE_SCALE}>\n <coneGeometry args={[SCALE_HANDLE_RADIUS, SCALE_HANDLE_LENGTH, 16]} />\n <HandleMaterial color=\"#ffff44\" handleId=\"scale\" />\n </mesh>\n </group>\n <group position={[0, 0, -(bboxSize.z * nodeScale) / 2]}>\n <mesh\n onPointerDown={handleScaleDown}\n onPointerEnter={() => setHoveredHandle('scale')}\n onPointerLeave={() => setHoveredHandle(null)}\n renderOrder={1000}\n rotation={[-Math.PI / 2, 0, 0]}\n scale={HANDLE_SCALE}\n >\n <coneGeometry args={[scaleHitRadius, scaleHitLength, 16]} />\n <HitMaterial />\n </mesh>\n <mesh renderOrder={1000} rotation={[-Math.PI / 2, 0, 0]} scale={HANDLE_SCALE}>\n <coneGeometry args={[SCALE_HANDLE_RADIUS, SCALE_HANDLE_LENGTH, 16]} />\n <HandleMaterial color=\"#ffff44\" handleId=\"scale\" />\n </mesh>\n </group>\n </group>\n )}\n </group>\n )\n})\n\nScanRendererContent.displayName = 'ScanRendererContent'\n\nexport const ScanRenderer = memo(({ nodeId }: ScanRendererProps) => {\n const nodeUrl = useEditor((state) => {\n const handle = state.graph.getNodeById(nodeId)\n return (handle?.data() as ScanNode | undefined)?.url\n })\n\n const [resolvedUrl, setResolvedUrl] = useState<string | null>(null)\n\n useEffect(() => {\n let active = true\n loadAssetUrl(nodeUrl || '').then((url) => {\n if (active) setResolvedUrl(url)\n })\n return () => {\n active = false\n }\n }, [nodeUrl])\n\n if (!resolvedUrl) return null\n\n // Pre-load the GLTF to avoid suspense fallback causing flickering if this is a remount\n // (though useGLTF has its own cache, stable URL helps)\n\n return <ScanRendererContent nodeId={nodeId} resolvedUrl={resolvedUrl} />\n})\n\nScanRenderer.displayName = 'ScanRenderer'\n","'use client'\n\nimport { useThree } from '@react-three/fiber'\nimport { Box } from 'lucide-react'\nimport { type RefObject, useCallback, useEffect, useRef } from 'react'\nimport * as THREE from 'three'\nimport { z } from 'zod'\nimport { useShallow } from 'zustand/shallow'\nimport { TILE_SIZE } from '../../../constants'\nimport { emitter, type ScanManipulationEvent, type ScanUpdateEvent } from '@pascal/core/events'\nimport { useEditor } from '../../../hooks'\nimport { registerComponent } from '../../../registry'\nimport type { ScanNode } from '@pascal/core'\nimport { ScanNode as ScanNodeSchema } from '@pascal/core/scenegraph/schema/nodes/scan'\nimport { ScanRenderer } from './scan-renderer'\n\n// ============================================================================\n// SCAN NODE EDITOR\n// ============================================================================\n\n/**\n * Scan node editor component\n * Uses useEditor hooks directly to manage scan manipulation\n */\nexport function ScanNodeEditor() {\n const updateNode = useEditor((state) => state.updateNode)\n const setIsManipulatingScan = useEditor((state) => state.setIsManipulatingScan)\n\n // Track undo state changes for batch updates during manipulation\n const undoStateRef = useRef<{\n [nodeId: string]: {\n position?: [number, number, number]\n rotation?: [number, number, number]\n scale?: number\n yOffset?: number\n }\n }>({})\n\n useEffect(() => {\n const handleScanUpdate = (event: ScanUpdateEvent) => {\n const { nodeId, updates, pushToUndo } = event\n\n // Update the node in the store\n // Pass skipUndo = !pushToUndo (if pushing to undo, skipUndo is false)\n updateNode(nodeId, updates as Partial<ScanNode>, !pushToUndo)\n\n // If pushing to undo, clear the accumulated state for this node\n if (pushToUndo) {\n delete undoStateRef.current[nodeId]\n } else {\n // Accumulate updates during drag\n if (!undoStateRef.current[nodeId]) {\n undoStateRef.current[nodeId] = {}\n }\n Object.assign(undoStateRef.current[nodeId], updates)\n }\n }\n\n const handleManipulationStart = (event: ScanManipulationEvent) => {\n const { nodeId } = event\n // Initialize accumulated state\n undoStateRef.current[nodeId] = {}\n setIsManipulatingScan(true)\n }\n\n const handleManipulationEnd = (event: ScanManipulationEvent) => {\n setIsManipulatingScan(false)\n }\n\n // Register event listeners\n emitter.on('scan:update', handleScanUpdate)\n emitter.on('scan:manipulation-start', handleManipulationStart)\n emitter.on('scan:manipulation-end', handleManipulationEnd)\n\n // Cleanup event listeners\n return () => {\n emitter.off('scan:update', handleScanUpdate)\n emitter.off('scan:manipulation-start', handleManipulationStart)\n emitter.off('scan:manipulation-end', handleManipulationEnd)\n }\n }, [updateNode, setIsManipulatingScan])\n\n return null\n}\n\n// ============================================================================\n// SCAN MANIPULATION HOOK\n// ============================================================================\n\n/**\n * Custom hook for scan manipulation handlers\n * Provides all the pointer event handlers for transforming 3D scans\n */\nexport function useScanManipulation(\n nodeId: ScanNode['id'],\n groupRef: RefObject<THREE.Group | null>,\n setActiveHandle?: (handleId: string | null) => void,\n) {\n const { camera, gl } = useThree()\n const movingCamera = useEditor((state) => state.movingCamera)\n const controlMode = useEditor((state) => state.controlMode)\n const setControlMode = useEditor((state) => state.setControlMode)\n const handleNodeSelect = useEditor((state) => state.handleNodeSelect)\n\n const { nodePosition, nodeScale, nodeRotation } = useEditor(\n useShallow((state) => {\n const handle = state.graph.getNodeById(nodeId)\n const node = handle?.data() as ScanNode | undefined\n return {\n nodePosition: node?.position || [0, 0, 0],\n nodeScale: node?.scale || 1,\n nodeRotation: node?.rotation || [0, 0, 0],\n }\n }),\n )\n\n const handleSelect = useCallback(\n (e?: any) => {\n if (controlMode === 'guide' || controlMode === 'select') {\n handleNodeSelect(nodeId, e || {})\n setControlMode('guide')\n }\n },\n [controlMode, nodeId, handleNodeSelect, setControlMode],\n )\n\n const handleTranslateDown = useCallback(\n (axis: 'x' | 'z') => (e: any) => {\n if (e.button !== 0) return\n if (movingCamera) return\n e.stopPropagation()\n if (!groupRef.current) return\n\n const handleId = axis === 'x' ? 'translate-x' : 'translate-z'\n setActiveHandle?.(handleId)\n emitter.emit('scan:manipulation-start', { nodeId })\n\n const initialMouse = new THREE.Vector3()\n const plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), 0)\n const raycaster = new THREE.Raycaster()\n raycaster.setFromCamera(e.pointer, camera)\n raycaster.ray.intersectPlane(plane, initialMouse)\n const initialPosition = groupRef.current.position.clone()\n const localDir = axis === 'x' ? new THREE.Vector3(1, 0, 0) : new THREE.Vector3(0, 0, 1)\n const worldZero = new THREE.Vector3().applyMatrix4(groupRef.current.matrixWorld)\n const worldAxis = localDir\n .clone()\n .applyMatrix4(groupRef.current.matrixWorld)\n .sub(worldZero)\n .normalize()\n let lastPosition: [number, number] | null = null\n\n const handleMove = (ev: PointerEvent) => {\n const rect = gl.domElement.getBoundingClientRect()\n const mx = ((ev.clientX - rect.left) / rect.width) * 2 - 1\n const my = -((ev.clientY - rect.top) / rect.height) * 2 + 1\n const mouseVec = new THREE.Vector2(mx, my)\n raycaster.setFromCamera(mouseVec, camera)\n const intersect = new THREE.Vector3()\n raycaster.ray.intersectPlane(plane, intersect)\n const delta = intersect.clone().sub(initialMouse)\n const projected = delta.dot(worldAxis)\n const newPos = initialPosition.clone().add(worldAxis.clone().multiplyScalar(projected))\n\n let finalX = newPos.x / TILE_SIZE\n let finalZ = newPos.z / TILE_SIZE\n if (ev.shiftKey) {\n finalX = Math.round(finalX)\n finalZ = Math.round(finalZ)\n }\n\n lastPosition = [finalX, finalZ]\n emitter.emit('scan:update', {\n nodeId,\n updates: { position: [finalX, finalZ, nodePosition[2]] },\n pushToUndo: false,\n })\n }\n\n const handleUp = () => {\n document.removeEventListener('pointermove', handleMove)\n document.removeEventListener('pointerup', handleUp)\n setActiveHandle?.(null)\n if (lastPosition) {\n emitter.emit('scan:update', {\n nodeId,\n updates: { position: [lastPosition[0], lastPosition[1], nodePosition[2]] },\n pushToUndo: true,\n })\n }\n emitter.emit('scan:manipulation-end', { nodeId })\n }\n\n document.addEventListener('pointermove', handleMove)\n document.addEventListener('pointerup', handleUp)\n },\n [nodeId, movingCamera, camera, gl, groupRef, setActiveHandle],\n )\n\n const handleTranslateXZDown = useCallback(\n (e: any) => {\n if (e.button !== 0) return\n if (movingCamera) return\n e.stopPropagation()\n if (!groupRef.current) return\n\n setActiveHandle?.('translate-xz')\n emitter.emit('scan:manipulation-start', { nodeId })\n\n const initialMouse = new THREE.Vector3()\n const plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), 0)\n const raycaster = new THREE.Raycaster()\n raycaster.setFromCamera(e.pointer, camera)\n raycaster.ray.intersectPlane(plane, initialMouse)\n const initialPosition = groupRef.current.position.clone()\n let lastPosition: [number, number] | null = null\n\n const handleMove = (ev: PointerEvent) => {\n const rect = gl.domElement.getBoundingClientRect()\n const mx = ((ev.clientX - rect.left) / rect.width) * 2 - 1\n const my = -((ev.clientY - rect.top) / rect.height) * 2 + 1\n const mouseVec = new THREE.Vector2(mx, my)\n raycaster.setFromCamera(mouseVec, camera)\n const intersect = new THREE.Vector3()\n raycaster.ray.intersectPlane(plane, intersect)\n const delta = intersect.clone().sub(initialMouse)\n const newPos = initialPosition.clone().add(delta)\n\n let finalX = newPos.x / TILE_SIZE\n let finalZ = newPos.z / TILE_SIZE\n if (ev.shiftKey) {\n finalX = Math.round(finalX)\n finalZ = Math.round(finalZ)\n }\n\n lastPosition = [finalX, finalZ]\n emitter.emit('scan:update', {\n nodeId,\n updates: { position: [finalX, finalZ, nodePosition[2]] },\n pushToUndo: false,\n })\n }\n\n const handleUp = () => {\n document.removeEventListener('pointermove', handleMove)\n document.removeEventListener('pointerup', handleUp)\n setActiveHandle?.(null)\n if (lastPosition) {\n emitter.emit('scan:update', {\n nodeId,\n updates: { position: [lastPosition[0], lastPosition[1], nodePosition[2]] },\n pushToUndo: true,\n })\n }\n emitter.emit('scan:manipulation-end', { nodeId })\n }\n\n document.addEventListener('pointermove', handleMove)\n document.addEventListener('pointerup', handleUp)\n },\n [nodeId, movingCamera, camera, gl, groupRef, setActiveHandle],\n )\n\n const handleRotationDown = useCallback(\n (e: any) => {\n if (e.button !== 0) return\n if (movingCamera) return\n e.stopPropagation()\n if (!groupRef.current) return\n\n setActiveHandle?.('rotation')\n emitter.emit('scan:manipulation-start', { nodeId })\n\n const center = groupRef.current.position.clone()\n const initialMouse = new THREE.Vector3()\n const plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), 0)\n const raycaster = new THREE.Raycaster()\n raycaster.setFromCamera(e.pointer, camera)\n raycaster.ray.intersectPlane(plane, initialMouse)\n const initialVector = initialMouse.clone().sub(center)\n const initialAngle = Math.atan2(initialVector.z, initialVector.x)\n const initialRotation = nodeRotation\n let lastRotation: number | null = null\n\n const handleMove = (ev: PointerEvent) => {\n const rect = gl.domElement.getBoundingClientRect()\n const mx = ((ev.clientX - rect.left) / rect.width) * 2 - 1\n const my = -((ev.clientY - rect.top) / rect.height) * 2 + 1\n const mouseVec = new THREE.Vector2(mx, my)\n raycaster.setFromCamera(mouseVec, camera)\n const intersect = new THREE.Vector3()\n raycaster.ray.intersectPlane(plane, intersect)\n const vector = intersect.clone().sub(center)\n const angle = Math.atan2(vector.z, vector.x)\n const delta = angle - initialAngle\n let newRotation = (initialRotation[1] ?? 0) - delta * (180 / Math.PI)\n\n if (ev.shiftKey) {\n newRotation = Math.round(newRotation / 45) * 45\n }\n\n lastRotation = newRotation\n emitter.emit('scan:update', {\n nodeId,\n updates: { rotation: [initialRotation[0], lastRotation, initialRotation[2]] },\n pushToUndo: false,\n })\n }\n\n const handleUp = () => {\n document.removeEventListener('pointermove', handleMove)\n document.removeEventListener('pointerup', handleUp)\n setActiveHandle?.(null)\n if (lastRotation !== null) {\n emitter.emit('scan:update', {\n nodeId,\n updates: { rotation: [initialRotation[0], lastRotation, initialRotation[2]] },\n pushToUndo: true,\n })\n }\n emitter.emit('scan:manipulation-end', { nodeId })\n }\n\n document.addEventListener('pointermove', handleMove)\n document.addEventListener('pointerup', handleUp)\n },\n [nodeId, nodeRotation, movingCamera, camera, gl, groupRef, setActiveHandle],\n )\n\n const handleTranslateYDown = useCallback(\n (e: any) => {\n if (e.button !== 0) return\n if (movingCamera) return\n e.stopPropagation()\n if (!groupRef.current) return\n\n setActiveHandle?.('translate-y')\n emitter.emit('scan:manipulation-start', { nodeId })\n\n const initialMouseY = e.pointer.y\n const initialYOffset = nodePosition[2] ?? 0\n let lastYOffset: number | null = null\n\n const handleMove = (ev: PointerEvent) => {\n const rect = gl.domElement.getBoundingClientRect()\n const my = -((ev.clientY - rect.top) / rect.height) * 2 + 1\n const deltaY = my - initialMouseY\n // Scale the movement - adjust multiplier as needed for responsiveness\n let newYOffset = initialYOffset + deltaY * 2\n\n if (ev.shiftKey) {\n newYOffset = Math.round(newYOffset / 0.5) * 0.5\n }\n\n lastYOffset = newYOffset\n emitter.emit('scan:update', {\n nodeId,\n updates: { position: [nodePosition[0], nodePosition[1], lastYOffset] },\n pushToUndo: false,\n })\n }\n\n const handleUp = () => {\n document.removeEventListener('pointermove', handleMove)\n document.removeEventListener('pointerup', handleUp)\n setActiveHandle?.(null)\n if (lastYOffset !== null) {\n emitter.emit('scan:update', {\n nodeId,\n updates: { position: [nodePosition[0], nodePosition[1], lastYOffset] },\n pushToUndo: true,\n })\n }\n emitter.emit('scan:manipulation-end', { nodeId })\n }\n\n document.addEventListener('pointermove', handleMove)\n document.addEventListener('pointerup', handleUp)\n },\n [nodeId, nodePosition, movingCamera, camera, gl, groupRef, setActiveHandle],\n )\n\n const handleScaleDown = useCallback(\n (e: any) => {\n if (e.button !== 0) return\n if (movingCamera) return\n e.stopPropagation()\n if (!groupRef.current) return\n\n setActiveHandle?.('scale')\n emitter.emit('scan:manipulation-start', { nodeId })\n\n const center = groupRef.current.position.clone()\n const initialMouse = new THREE.Vector3()\n const plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), 0)\n const raycaster = new THREE.Raycaster()\n raycaster.setFromCamera(e.pointer, camera)\n raycaster.ray.intersectPlane(plane, initialMouse)\n const initialDist = center.distanceTo(initialMouse)\n const initialScale = nodeScale\n let lastScale: number | null = null\n\n const handleMove = (ev: PointerEvent) => {\n const rect = gl.domElement.getBoundingClientRect()\n const mx = ((ev.clientX - rect.left) / rect.width) * 2 - 1\n const my = -((ev.clientY - rect.top) / rect.height) * 2 + 1\n const mouseVec = new THREE.Vector2(mx, my)\n raycaster.setFromCamera(mouseVec, camera)\n const intersect = new THREE.Vector3()\n raycaster.ray.intersectPlane(plane, intersect)\n const newDist = center.distanceTo(intersect)\n let newScale = initialScale * (newDist / initialDist)\n\n if (ev.shiftKey) {\n newScale = Math.round(newScale * 10) / 10\n }\n\n lastScale = Math.max(0.1, newScale)\n emitter.emit('scan:update', {\n nodeId,\n updates: { scale: lastScale },\n pushToUndo: false,\n })\n }\n\n const handleUp = () => {\n document.removeEventListener('pointermove', handleMove)\n document.removeEventListener('pointerup', handleUp)\n setActiveHandle?.(null)\n if (lastScale !== null) {\n emitter.emit('scan:update', {\n nodeId,\n updates: { scale: lastScale },\n pushToUndo: true,\n })\n }\n emitter.emit('scan:manipulation-end', { nodeId })\n }\n\n document.addEventListener('pointermove', handleMove)\n document.addEventListener('pointerup', handleUp)\n },\n [nodeId, nodeScale, movingCamera, camera, gl, groupRef, setActiveHandle],\n )\n\n return {\n handleSelect,\n handleTranslateDown,\n handleTranslateXZDown,\n handleRotationDown,\n handleTranslateYDown,\n handleScaleDown,\n }\n}\n\n// ============================================================================\n// REGISTER SCAN COMPONENT\n// ============================================================================\n\nregisterComponent({\n nodeType: 'scan',\n nodeName: '3D Scan',\n editorMode: 'guide',\n schema: ScanNodeSchema,\n nodeEditor: ScanNodeEditor,\n nodeRenderer: ScanRenderer,\n toolIcon: Box,\n})\n","import { createContext } from \"react\";\n\nexport type ErrorBoundaryContextType = {\n didCatch: boolean;\n error: Error | null;\n resetErrorBoundary: (...args: unknown[]) => void;\n};\n\nexport const ErrorBoundaryContext =\n createContext<ErrorBoundaryContextType | null>(null);\n","import { Component, createElement, type ErrorInfo } from \"react\";\nimport { ErrorBoundaryContext } from \"../context/ErrorBoundaryContext\";\nimport type { ErrorBoundaryProps, FallbackProps } from \"../types\";\n\nconst isDevelopment = import.meta.env.DEV;\n\ntype ErrorBoundaryState =\n | {\n didCatch: true;\n error: Error;\n }\n | {\n didCatch: false;\n error: null;\n };\n\nconst initialState: ErrorBoundaryState = {\n didCatch: false,\n error: null,\n};\n\n/**\n * A reusable React [error boundary](https://react.dev/reference/react/Component#catching-rendering-errors-with-an-error-boundary) component.\n * Wrap this component around other React components to \"catch\" errors and render a fallback UI.\n *\n *\n * ℹ️ The component provides several ways to render a fallback: `fallback`, `fallbackRender`, and `FallbackComponent`.\n * Refer to the documentation to determine which is best for your application.\n *\n * ℹ️ This is a **client component**. You can only pass props to it that are serializeable or use it in files that have a `\"use client\";` directive.\n */\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n\n this.resetErrorBoundary = this.resetErrorBoundary.bind(this);\n this.state = initialState;\n }\n\n static getDerivedStateFromError(error: Error) {\n return { didCatch: true, error };\n }\n\n resetErrorBoundary(...args: unknown[]) {\n const { error } = this.state;\n\n if (error !== null) {\n this.props.onReset?.({\n args,\n reason: \"imperative-api\",\n });\n\n this.setState(initialState);\n }\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n this.props.onError?.(error, info);\n }\n\n componentDidUpdate(\n prevProps: ErrorBoundaryProps,\n prevState: ErrorBoundaryState,\n ) {\n const { didCatch } = this.state;\n const { resetKeys } = this.props;\n\n // There's an edge case where if the thing that triggered the error happens to *also* be in the resetKeys array,\n // we'd end up resetting the error boundary immediately.\n // This would likely trigger a second error to be thrown.\n // So we make sure that we don't check the resetKeys on the first call of cDU after the error is set.\n\n if (\n didCatch &&\n prevState.error !== null &&\n hasArrayChanged(prevProps.resetKeys, resetKeys)\n ) {\n this.props.onReset?.({\n next: resetKeys,\n prev: prevProps.resetKeys,\n reason: \"keys\",\n });\n\n this.setState(initialState);\n }\n }\n\n render() {\n const { children, fallbackRender, FallbackComponent, fallback } =\n this.props;\n const { didCatch, error } = this.state;\n\n let childToRender = children;\n\n if (didCatch) {\n const props: FallbackProps = {\n error,\n resetErrorBoundary: this.resetErrorBoundary,\n };\n\n if (typeof fallbackRender === \"function\") {\n childToRender = fallbackRender(props);\n } else if (FallbackComponent) {\n childToRender = createElement(FallbackComponent, props);\n } else if (fallback !== undefined) {\n childToRender = fallback;\n } else {\n if (isDevelopment) {\n console.error(\n \"react-error-boundary requires either a fallback, fallbackRender, or FallbackComponent prop\",\n );\n }\n\n throw error;\n }\n }\n\n return createElement(\n ErrorBoundaryContext.Provider,\n {\n value: {\n didCatch,\n error,\n resetErrorBoundary: this.resetErrorBoundary,\n },\n },\n childToRender,\n );\n }\n}\n\nfunction hasArrayChanged(a: unknown[] = [], b: unknown[] = []) {\n return (\n a.length !== b.length || a.some((item, index) => !Object.is(item, b[index]))\n );\n}\n","'use client'\n\nimport { Clone, Gltf, useGLTF } from '@react-three/drei'\nimport { useFrame } from '@react-three/fiber'\nimport { Suspense, useEffect, useMemo, useRef } from 'react'\nimport { ErrorBoundary } from 'react-error-boundary'\nimport * as THREE from 'three'\nimport type { GLTF } from 'three-stdlib'\nimport { useShallow } from 'zustand/shallow'\nimport { TILE_SIZE } from '../../../constants'\nimport { useEditor } from '../../../hooks'\nimport { getMaterial, getMaterialPreset, type MaterialName, useMaterial } from '@pascal/core/materials'\nimport type { ItemNode } from '@pascal/core'\n\ninterface ItemRendererProps {\n nodeId: ItemNode['id']\n}\n\nexport function ItemRenderer({ nodeId }: ItemRendererProps) {\n const selectedFloorId = useEditor((state) => state.selectedFloorId)\n\n const {\n nodeSize,\n isPreview,\n levelId,\n canPlace,\n nodeCategory,\n modelPosition,\n nodeSrc,\n modelScale,\n modelRotation,\n deletePreview,\n } = useEditor(\n useShallow((state) => {\n const handle = state.graph.getNodeById(nodeId)\n const node = handle?.data() as ItemNode | undefined\n return {\n nodeSize: node?.size,\n deletePreview: node?.editor?.deletePreview === true,\n isPreview: node?.editor?.preview === true,\n levelId: state.graph.index.byId.get(nodeId)?.levelId,\n canPlace: node?.editor?.canPlace !== false,\n modelPosition: node?.modelPosition,\n modelRotation: node?.modelRotation,\n nodeCategory: node?.category,\n modelScale: node?.modelScale,\n nodeSrc: node?.src,\n }\n }),\n )\n\n // Determine opacity based on selected floor\n const isActiveFloor = selectedFloorId === null || levelId === selectedFloorId\n const opacity = isActiveFloor ? 1 : 0.3\n const transparent = !isActiveFloor\n\n // Default box geometry for items without a model (scaled by TILE_SIZE for grid visualization)\n const boxGeometry = useMemo(\n () =>\n new THREE.BoxGeometry(\n (nodeSize?.[0] ?? 0) * TILE_SIZE,\n 0.05,\n (nodeSize?.[1] ?? 0) * TILE_SIZE,\n ),\n [nodeSize],\n )\n\n const previewMaterial = useMaterial(canPlace ? 'preview-valid' : 'preview-invalid')\n const ghostMaterial = useMaterial('ghost')\n const triangleGeometry = useMemo(() => {\n const geometry = new THREE.BufferGeometry().setFromPoints([\n new THREE.Vector3((-TILE_SIZE / 2) * 0.95, 0, (TILE_SIZE / 2) * 0.95),\n new THREE.Vector3((TILE_SIZE / 2) * 0.95, 0, (TILE_SIZE / 2) * 0.95),\n new THREE.Vector3(0, 0, (-TILE_SIZE / 2) * 0.95),\n ])\n geometry.setIndex([0, 1, 2])\n geometry.computeVertexNormals()\n return geometry\n }, [])\n\n return (\n <>\n {isPreview && (\n // Preview rendering with X-ray effect\n <group>\n <group position-x={(-(nodeSize?.[0] || 1) * TILE_SIZE) / 2}>\n {[...new Array(nodeSize?.[0] || 1).keys()].map((x) => (\n <mesh\n frustumCulled={false}\n geometry={triangleGeometry}\n key={`triangle-${x}`}\n material={previewMaterial}\n position-x={(x + 0.5) * TILE_SIZE}\n position-y={0.05}\n position-z={((nodeSize?.[1] || 1) * TILE_SIZE) / 2 + TILE_SIZE}\n rotation-y={Math.PI}\n />\n ))}\n </group>\n <mesh\n frustumCulled={false}\n geometry={boxGeometry}\n material={previewMaterial}\n position-y={0}\n />\n </group>\n )}\n\n <ErrorBoundary fallback={null}>\n <Suspense fallback={<LoadingItem />}>\n {nodeSrc && (\n <ModelItemRenderer\n deletePreview={deletePreview}\n isActiveFloor={isActiveFloor}\n position={modelPosition || [0, 0, 0]}\n rotation={modelRotation}\n scale={modelScale || [1, 1, 1]}\n src={nodeSrc}\n />\n )}\n </Suspense>\n </ErrorBoundary>\n </>\n )\n}\n\nfunction LoadingItem() {\n const previewMaterial = useMaterial('preview-valid')\n const group = useRef<THREE.Group>(null)\n\n useFrame((_, delta) => {\n if (group.current) {\n group.current.rotation.y += delta * 2\n }\n })\n return (\n <group ref={group}>\n <mesh material={previewMaterial} position-y={0.5} scale-y={1.5}>\n <octahedronGeometry args={[TILE_SIZE / 1.5, 0]} />\n </mesh>\n </group>\n )\n}\n\ntype GLTFResult = GLTF & {\n nodes: {\n cutout?: THREE.Mesh\n }\n}\n\nconst ModelItemRenderer = ({\n position,\n rotation,\n scale,\n src,\n deletePreview,\n isActiveFloor,\n}: {\n position?: ItemNode['modelPosition']\n rotation?: ItemNode['modelRotation']\n scale?: ItemNode['modelScale']\n src: ItemNode['src']\n deletePreview?: boolean\n isActiveFloor: boolean\n}) => {\n const { scene } = useGLTF(src)\n const ref = useRef<THREE.Group>(null)\n\n const deleteMaterial = useMaterial('delete')\n const ghostMaterial = useMaterial('ghost')\n\n useEffect(() => {\n ref.current?.traverse((child) => {\n if (child instanceof THREE.Mesh) {\n if (\n child.material instanceof THREE.Material &&\n child.material.name.toLowerCase().includes('glass')\n ) {\n child.material = getMaterial('glass')\n child.castShadow = false\n child.receiveShadow = false\n } else {\n if (\n child.material instanceof THREE.Material &&\n child.material.name.toLowerCase().includes('color_')\n ) {\n const materialName = child.material.name\n .toLowerCase()\n .replace('color_', '') as MaterialName\n const materialPreset = getMaterialPreset(materialName)\n if (materialPreset) {\n const material = getMaterial(materialName)\n child.material = material\n }\n }\n child.castShadow = true\n child.receiveShadow = true\n }\n }\n if (child.name === 'cutout') {\n child.visible = false\n }\n })\n }, [])\n\n return (\n <>\n <Clone\n inject={\n deletePreview ? (\n deleteMaterial ? (\n <primitive attach=\"material\" object={deleteMaterial} />\n ) : undefined\n ) : isActiveFloor ? undefined : ghostMaterial ? (\n <primitive attach=\"material\" object={ghostMaterial} />\n ) : undefined\n }\n object={scene}\n position={position}\n ref={ref}\n rotation={rotation}\n scale={scale}\n />\n </>\n )\n}\n","'use client'\n\nimport { useThree } from '@react-three/fiber'\nimport { Package } from 'lucide-react'\nimport { useEffect, useRef } from 'react'\nimport { z } from 'zod'\nimport { ItemRenderer } from '../item/item-renderer'\nimport { type CeilingEvent, emitter, type GridEvent, type WallEvent } from '@pascal/core/events'\nimport { useEditor } from '../../../hooks'\nimport { registerComponent } from '../../../registry'\nimport { ItemNode } from '@pascal/core/scenegraph/schema/nodes/item'\nimport type { LevelNode } from '@pascal/core/scenegraph/schema/nodes/level'\nimport { canPlaceGridItemOnWall } from '../../../utils'\n\n// ============================================================================\n// ITEM BUILDER COMPONENT\n// ============================================================================\n\n/**\n * Item builder component\n * Uses useEditor hooks and spatialGrid to manage item placement with collision detection\n */\nconst EMPTY_LEVELS: any[] = []\n\nexport function ItemNodeEditor() {\n const addNode = useEditor((state) => state.addNode)\n const updateNode = useEditor((state) => state.updateNode)\n const deleteNode = useEditor((state) => state.deleteNode)\n const selectedFloorId = useEditor((state) => state.selectedFloorId)\n const spatialGrid = useEditor((state) => state.spatialGrid)\n const selectedItem = useEditor((state) => state.selectedItem)\n const levels = useEditor((state) => {\n const building = state.scene.root.children?.[0]?.children.find((c) => c.type === 'building')\n return building ? building.children : EMPTY_LEVELS\n })\n\n const gl = useThree((state) => state.gl)\n\n // Reset cursor on unmount\n useEffect(() => {\n gl.domElement.style.cursor = 'no-drop'\n return () => {\n gl.domElement.style.cursor = ''\n }\n }, [gl])\n\n // Use ref to persist preview state across renders without triggering re-renders\n const previewStateRef = useRef<{\n previewItemId: string | null\n lastPreviewPosition: [number, number] | null\n currentRotation: number\n lastCalculatedRotation: number | null // Track last auto-calculated rotation from wall normal\n currentSide: 'front' | 'back' // Track which side of the wall the item is on\n canPlace: boolean\n }>({\n previewItemId: null,\n lastPreviewPosition: null,\n currentRotation: 0,\n lastCalculatedRotation: null,\n currentSide: 'front',\n canPlace: false,\n })\n\n // Delete preview and reset cursor when selectedItem changes (user picks a different item from catalog)\n // biome-ignore lint/correctness/useExhaustiveDependencies: We intentionally watch modelUrl to trigger on item change\n useEffect(() => {\n const previewId = previewStateRef.current.previewItemId\n if (previewId) {\n deleteNode(previewId)\n previewStateRef.current.previewItemId = null\n previewStateRef.current.lastPreviewPosition = null\n }\n gl.domElement.style.cursor = 'no-drop'\n }, [selectedItem.modelUrl, deleteNode, gl])\n\n // Right-click handler for rotation\n useEffect(() => {\n const handleContextMenu = (e: MouseEvent) => {\n const previewId = previewStateRef.current.previewItemId\n // Only handle if there's an active preview\n if (previewId && selectedFloorId) {\n e.preventDefault()\n e.stopPropagation()\n\n // Rotate by 45 degrees (Math.PI / 4 radians)\n previewStateRef.current.currentRotation += Math.PI / 4\n\n // Update preview with new rotation\n updateNode(previewId, {\n rotation: previewStateRef.current.currentRotation,\n })\n }\n }\n\n window.addEventListener('contextmenu', handleContextMenu)\n\n return () => {\n window.removeEventListener('contextmenu', handleContextMenu)\n }\n }, [selectedFloorId, updateNode])\n\n useEffect(() => {\n // Determine attachment mode from selectedItem\n const attachTo = selectedItem.attachTo\n\n let ignoreGridMove = false\n\n // ============================================================================\n // HELPER FUNCTIONS\n // ============================================================================\n\n /**\n * Calculate rotation angle from wall normal vector\n * The normal points outward from the wall surface\n */\n const calculateRotationFromNormal = (normal: [number, number, number] | undefined): number => {\n if (!normal) return 0\n // Calculate angle in X-Z plane (top-down view)\n // atan2(z, x) gives the angle the vector makes with the positive X axis\n // Add π/2 to align item's forward direction with the wall normal\n return Math.atan2(normal[2], normal[0]) - Math.PI / 2\n }\n\n /**\n * Determine which side of the wall based on the normal vector\n * In wall-local space, the wall runs along X-axis, so the normal points along Z-axis\n * Positive Z normal = 'back', Negative Z normal = 'front' (flipped due to orientation fix)\n */\n const getSideFromNormal = (normal: [number, number, number] | undefined): 'front' | 'back' => {\n if (!normal) return 'front'\n // The Z component of the normal determines which side\n // Flipped: positive Z = back, negative Z = front\n return normal[2] >= 0 ? 'back' : 'front'\n }\n\n /**\n * Adjust Z position for wall-attached items with Y size > 1\n * This pushes the item forward so it appears in front of the wall instead of half inside\n * The direction depends on which side of the wall the item is on (based on normal)\n */\n const adjustPositionForWallAttachment = (\n localPos: [number, number],\n size: [number, number],\n normal: [number, number, number] | undefined,\n ): [number, number] => {\n if (size[1] > 1) {\n // Offset by the full extra depth (size - 1) in the Z direction\n const depthOffset = size[1] - 1\n // Direction depends on which side of the wall (positive or negative Z normal)\n const direction = normal && normal[2] >= 0 ? 1 : -1\n return [localPos[0], localPos[1] + depthOffset * direction]\n }\n return localPos\n }\n\n // ============================================================================\n // GRID PLACEMENT (default behavior when no attachTo)\n // ============================================================================\n\n const handleGridClick = (e: GridEvent) => {\n if (!selectedFloorId || attachTo) return // Skip if attaching to wall/ceiling\n\n const level = levels.find((l) => l.id === selectedFloorId)\n if (!level) return\n\n const [x, y] = e.position\n\n // Check if position is occupied using spatial grid\n const canPlace = canPlaceItem(x, y, selectedFloorId)\n\n if (canPlace) {\n // Create item node using selectedItem configuration\n addNode(\n ItemNode.parse({\n type: 'item' as const,\n name: selectedItem.name || 'Item',\n position: [x, y],\n rotation: previewStateRef.current.currentRotation,\n size: selectedItem.size,\n visible: true,\n opacity: 100,\n category: 'furniture',\n src: selectedItem.modelUrl,\n modelScale: selectedItem.scale,\n modelPosition: selectedItem.position,\n modelRotation: selectedItem.rotation,\n attachTo: selectedItem.attachTo,\n children: [],\n }),\n selectedFloorId,\n )\n updateNode(previewStateRef.current.previewItemId!, {\n editor: { preview: true, canPlace: false },\n }) // As we placed an item here we can't place another\n }\n }\n\n const handleGridMove = (e: GridEvent) => {\n if (!selectedFloorId || attachTo || ignoreGridMove) return // Skip if attaching to wall/ceiling\n\n const level = levels.find((l) => l.id === selectedFloorId)\n if (!level) return\n\n const [x, y] = e.position\n const lastPos = previewStateRef.current.lastPreviewPosition\n\n // Only update if position changed\n if (!lastPos || lastPos[0] !== x || lastPos[1] !== y) {\n previewStateRef.current.lastPreviewPosition = [x, y]\n\n // Check if position is occupied using spatial grid\n const canPlace = canPlaceItem(x, y, selectedFloorId)\n gl.domElement.style.cursor = canPlace ? 'grabbing' : 'no-drop'\n\n const previewId = previewStateRef.current.previewItemId\n\n if (previewId) {\n // Update existing preview position and canPlace state\n updateNode(previewId, {\n position: [x, y] as [number, number],\n rotation: previewStateRef.current.currentRotation,\n visible: true,\n editor: { canPlace, preview: true },\n })\n } else {\n // Create new preview item using selectedItem configuration\n const newPreviewId = addNode(\n ItemNode.parse({\n type: 'item' as const,\n name: `${selectedItem.name || 'Item'} (Preview)`,\n position: [x, y] as [number, number],\n rotation: previewStateRef.current.currentRotation,\n size: selectedItem.size as [number, number],\n visible: true,\n opacity: 100,\n editor: { preview: true, canPlace },\n category: 'furniture',\n src: selectedItem.modelUrl,\n modelScale: selectedItem.scale,\n modelPosition: selectedItem.position,\n modelRotation: selectedItem.rotation,\n attachTo: selectedItem.attachTo,\n children: [] as [],\n }),\n selectedFloorId,\n )\n previewStateRef.current.previewItemId = newPreviewId\n }\n }\n }\n\n // ============================================================================\n // WALL ATTACHMENT\n // ============================================================================\n\n const handleWallClick = (e: WallEvent) => {\n if (attachTo !== 'wall' && attachTo !== 'wall-side') return\n\n const previewId = previewStateRef.current.previewItemId\n if (!previewId) return\n\n if (previewStateRef.current.canPlace) {\n // Commit the preview by setting preview: false\n updateNode(previewId, { editor: { preview: false } })\n previewStateRef.current.previewItemId = null\n previewStateRef.current.lastPreviewPosition = null\n }\n }\n\n const handleWallEnter = (e: WallEvent) => {\n if (attachTo !== 'wall' && attachTo !== 'wall-side') return\n\n // Delete any existing preview\n const previewId = previewStateRef.current.previewItemId\n if (previewId) {\n deleteNode(previewId)\n }\n\n ignoreGridMove = true\n\n // gridPosition is already in wall's local coordinate system\n const basePos: [number, number] = [e.gridPosition.x, e.gridPosition.z]\n // Adjust position for items with Y size > 1 to push them in front of wall\n const localPos = adjustPositionForWallAttachment(basePos, selectedItem.size, e.normal)\n\n // Calculate rotation from wall normal\n const rotation = calculateRotationFromNormal(e.normal)\n previewStateRef.current.currentRotation = rotation\n previewStateRef.current.lastCalculatedRotation = rotation\n\n // Determine side based on attachTo:\n // - 'wall': impacts both sides (doors, windows) → no side (undefined)\n // - 'wall-side': one side only (art, TV, etc.) → use normal to determine side\n const side = attachTo === 'wall-side' ? getSideFromNormal(e.normal) : undefined\n if (side) {\n previewStateRef.current.currentSide = side\n }\n\n // Create a temporary item to check placement (with side for collision detection)\n const tempItem = {\n position: localPos,\n rotation,\n size: selectedItem.size,\n side,\n } as any\n\n const canPlace = canPlaceGridItemOnWall(e.node, tempItem, 2)\n previewStateRef.current.canPlace = canPlace\n gl.domElement.style.cursor = canPlace ? 'grabbing' : 'no-drop'\n\n const newPreviewId = addNode(\n ItemNode.parse({\n parentId: e.node.id,\n type: 'item' as const,\n name: `${selectedItem.name || 'Item'} (Preview)`,\n position: localPos,\n rotation, // Set rotation based on wall normal\n size: selectedItem.size,\n visible: true,\n opacity: 100,\n category: 'furniture',\n src: selectedItem.modelUrl,\n modelScale: selectedItem.scale,\n modelPosition: selectedItem.position,\n modelRotation: selectedItem.rotation,\n attachTo: selectedItem.attachTo,\n side, // Set side based on wall normal (undefined for doors/windows)\n editor: { preview: true, canPlace },\n children: [],\n }),\n e.node.id, // Parent is the wall\n )\n previewStateRef.current.previewItemId = newPreviewId\n previewStateRef.current.lastPreviewPosition = basePos\n }\n\n const handleWallMove = (e: WallEvent) => {\n if (attachTo !== 'wall' && attachTo !== 'wall-side') return\n\n const previewId = previewStateRef.current.previewItemId\n const lastPos = previewStateRef.current.lastPreviewPosition\n\n // Only update if position changed\n if (lastPos && lastPos[0] === e.gridPosition.x && lastPos[1] === e.gridPosition.z) {\n return\n }\n\n ignoreGridMove = true\n\n const basePos: [number, number] = [e.gridPosition.x, e.gridPosition.z]\n previewStateRef.current.lastPreviewPosition = basePos\n // Adjust position for items with Y size > 1 to push them in front of wall\n const localPos = adjustPositionForWallAttachment(basePos, selectedItem.size, e.normal)\n\n // Calculate rotation from wall normal\n const calculatedRotation = calculateRotationFromNormal(e.normal)\n\n // Determine side based on attachTo:\n // - 'wall': impacts both sides (doors, windows) → no side (undefined)\n // - 'wall-side': one side only (art, TV, etc.) → use normal to determine side\n const side = attachTo === 'wall-side' ? getSideFromNormal(e.normal) : undefined\n if (side) {\n previewStateRef.current.currentSide = side\n }\n\n // Only update rotation if the calculated value changed\n // This preserves user's manual rotation adjustments when moving along the same wall\n let rotation = previewStateRef.current.currentRotation\n if (calculatedRotation !== previewStateRef.current.lastCalculatedRotation) {\n rotation = calculatedRotation\n previewStateRef.current.currentRotation = rotation\n previewStateRef.current.lastCalculatedRotation = calculatedRotation\n }\n\n // Create a temporary item to check placement (with side for collision detection)\n const tempItem = {\n position: localPos,\n rotation,\n size: selectedItem.size,\n side,\n } as any\n\n const canPlace = canPlaceGridItemOnWall(e.node, tempItem, 2)\n previewStateRef.current.canPlace = canPlace\n gl.domElement.style.cursor = canPlace ? 'grabbing' : 'no-drop'\n\n if (previewId) {\n // Update existing preview\n updateNode(previewId, {\n position: localPos,\n rotation,\n side,\n editor: { preview: true, canPlace },\n })\n } else {\n // Create new preview\n const newPreviewId = addNode(\n ItemNode.parse({\n parentId: e.node.id,\n type: 'item' as const,\n name: `${selectedItem.name || 'Item'} (Preview)`,\n position: localPos,\n rotation,\n size: selectedItem.size,\n visible: true,\n opacity: 100,\n category: 'furniture',\n src: selectedItem.modelUrl,\n modelScale: selectedItem.scale,\n modelPosition: selectedItem.position,\n modelRotation: selectedItem.rotation,\n attachTo: selectedItem.attachTo,\n side, // Set side based on wall normal (undefined for doors/windows)\n editor: { preview: true, canPlace },\n children: [],\n }),\n e.node.id,\n )\n previewStateRef.current.previewItemId = newPreviewId\n }\n }\n\n const handleWallLeave = (e: WallEvent) => {\n if (attachTo !== 'wall' && attachTo !== 'wall-side') return\n\n const previewId = previewStateRef.current.previewItemId\n if (previewId) {\n deleteNode(previewId)\n previewStateRef.current.previewItemId = null\n previewStateRef.current.lastPreviewPosition = null\n previewStateRef.current.lastCalculatedRotation = null\n }\n gl.domElement.style.cursor = 'no-drop'\n ignoreGridMove = false\n }\n\n // ============================================================================\n // CEILING ATTACHMENT\n // ============================================================================\n\n const handleCeilingClick = (e: CeilingEvent) => {\n if (attachTo !== 'ceiling') return\n\n const previewId = previewStateRef.current.previewItemId\n if (!previewId) return\n\n if (previewStateRef.current.canPlace) {\n // Commit the preview by setting preview: false\n updateNode(previewId, { editor: { preview: false } })\n previewStateRef.current.previewItemId = null\n previewStateRef.current.lastPreviewPosition = null\n }\n }\n\n const handleCeilingEnter = (e: CeilingEvent) => {\n if (attachTo !== 'ceiling') return\n\n // Delete any existing preview\n const previewId = previewStateRef.current.previewItemId\n if (previewId) {\n deleteNode(previewId)\n }\n\n ignoreGridMove = true\n\n // gridPosition is already in ceiling's local coordinate system\n const localPos: [number, number] = [e.gridPosition.x, e.gridPosition.z]\n\n // For ceiling, we can check if the item fits within the ceiling bounds\n const ceilingSize = e.node.size || [0, 0]\n const itemSize = selectedItem.size\n const canPlace =\n localPos[0] >= 0 &&\n localPos[1] >= 0 &&\n localPos[0] + itemSize[0] <= ceilingSize[0] &&\n localPos[1] + itemSize[1] <= ceilingSize[1]\n\n previewStateRef.current.canPlace = canPlace\n gl.domElement.style.cursor = canPlace ? 'grabbing' : 'no-drop'\n\n const newPreviewId = addNode(\n ItemNode.parse({\n parentId: e.node.id,\n type: 'item' as const,\n name: `${selectedItem.name || 'Item'} (Preview)`,\n position: localPos,\n rotation: 0,\n size: selectedItem.size,\n visible: true,\n opacity: 100,\n category: 'furniture',\n src: selectedItem.modelUrl,\n modelScale: selectedItem.scale,\n modelPosition: selectedItem.position,\n modelRotation: selectedItem.rotation,\n attachTo: selectedItem.attachTo,\n editor: { preview: true, canPlace },\n children: [],\n }),\n e.node.id, // Parent is the ceiling\n )\n previewStateRef.current.previewItemId = newPreviewId\n previewStateRef.current.lastPreviewPosition = localPos\n }\n\n const handleCeilingMove = (e: CeilingEvent) => {\n if (attachTo !== 'ceiling') return\n\n const previewId = previewStateRef.current.previewItemId\n const lastPos = previewStateRef.current.lastPreviewPosition\n\n // Only update if position changed\n if (lastPos && lastPos[0] === e.gridPosition.x && lastPos[1] === e.gridPosition.z) {\n return\n }\n\n ignoreGridMove = true\n\n const localPos: [number, number] = [e.gridPosition.x, e.gridPosition.z]\n previewStateRef.current.lastPreviewPosition = localPos\n\n // Check if item fits within ceiling bounds\n const ceilingSize = e.node.size || [0, 0]\n const itemSize = selectedItem.size\n const canPlace =\n localPos[0] >= 0 &&\n localPos[1] >= 0 &&\n localPos[0] + itemSize[0] <= ceilingSize[0] &&\n localPos[1] + itemSize[1] <= ceilingSize[1]\n\n previewStateRef.current.canPlace = canPlace\n gl.domElement.style.cursor = canPlace ? 'grabbing' : 'no-drop'\n\n if (previewId) {\n // Update existing preview\n updateNode(previewId, {\n position: localPos,\n rotation: 0,\n editor: { preview: true, canPlace },\n })\n } else {\n // Create new preview\n const newPreviewId = addNode(\n ItemNode.parse({\n parentId: e.node.id,\n type: 'item' as const,\n name: `${selectedItem.name || 'Item'} (Preview)`,\n position: localPos,\n rotation: 0,\n size: selectedItem.size,\n visible: true,\n opacity: 100,\n category: 'furniture',\n src: selectedItem.modelUrl,\n modelScale: selectedItem.scale,\n modelPosition: selectedItem.position,\n modelRotation: selectedItem.rotation,\n attachTo: selectedItem.attachTo,\n editor: { preview: true, canPlace },\n children: [],\n }),\n e.node.id,\n )\n previewStateRef.current.previewItemId = newPreviewId\n }\n }\n\n const handleCeilingLeave = (e: CeilingEvent) => {\n if (attachTo !== 'ceiling') return\n\n const previewId = previewStateRef.current.previewItemId\n if (previewId) {\n deleteNode(previewId)\n previewStateRef.current.previewItemId = null\n previewStateRef.current.lastPreviewPosition = null\n }\n gl.domElement.style.cursor = 'no-drop'\n ignoreGridMove = false\n }\n\n /**\n * Check if two bounding boxes actually overlap (not just touch)\n * Adjacent items (touching at edges) should NOT be considered overlapping\n */\n function boundsOverlap(\n bounds1: { minX: number; maxX: number; minZ: number; maxZ: number },\n bounds2: { minX: number; maxX: number; minZ: number; maxZ: number },\n ): boolean {\n // Check for overlap in both X and Z dimensions\n // Use < instead of <= so touching edges don't count as overlap\n const overlapX = bounds1.minX < bounds2.maxX && bounds1.maxX > bounds2.minX\n const overlapZ = bounds1.minZ < bounds2.maxZ && bounds1.maxZ > bounds2.minZ\n return overlapX && overlapZ\n }\n\n /**\n * Check if an item can be placed at the given position\n * Uses spatial grid to detect collisions with other objects\n */\n function canPlaceItem(x: number, y: number, levelId: string): boolean {\n const level = levels.find((l) => l.id === levelId)\n if (!level) return false\n\n // Query spatial grid for objects at this position using selectedItem size\n const [width, depth] = selectedItem.size\n const newItemBounds = {\n minX: x,\n maxX: x + width,\n minZ: y,\n maxZ: y + depth,\n }\n\n const nearbyNodeIds = spatialGrid.query(levelId, newItemBounds)\n\n // Filter out preview nodes and check for actual collisions\n // Items can be placed on slabs and next to walls, but not on other items or columns\n for (const nodeId of nearbyNodeIds) {\n const node = level.children.find(\n (child: LevelNode['children'][number]) => child.id === nodeId,\n )\n // Block placement only for non-preview items and columns (solid obstacles)\n if (node && !node.editor?.preview) {\n if (node.type === 'item') {\n // Check if there's actual overlap (not just touching)\n if (node.position && node.size) {\n const existingBounds = {\n minX: node.position[0],\n maxX: node.position[0] + node.size[0],\n minZ: node.position[1],\n maxZ: node.position[1] + node.size[1],\n }\n if (boundsOverlap(newItemBounds, existingBounds)) {\n return false\n }\n }\n } else if (node.type === 'column' && node.position) {\n // Columns are point obstacles - check if they're inside the new item bounds\n const [cx, cz] = node.position\n if (\n cx >= newItemBounds.minX &&\n cx < newItemBounds.maxX &&\n cz >= newItemBounds.minZ &&\n cz < newItemBounds.maxZ\n ) {\n return false\n }\n }\n }\n // Allow placement on slabs, next to walls, etc.\n }\n\n return true\n }\n\n // Register event listeners based on attachment mode\n emitter.on('grid:click', handleGridClick)\n emitter.on('grid:move', handleGridMove)\n\n if (attachTo === 'wall' || attachTo === 'wall-side') {\n emitter.on('wall:click', handleWallClick)\n emitter.on('wall:enter', handleWallEnter)\n emitter.on('wall:move', handleWallMove)\n emitter.on('wall:leave', handleWallLeave)\n }\n\n if (attachTo === 'ceiling') {\n emitter.on('ceiling:click', handleCeilingClick)\n emitter.on('ceiling:enter', handleCeilingEnter)\n emitter.on('ceiling:move', handleCeilingMove)\n emitter.on('ceiling:leave', handleCeilingLeave)\n }\n\n // Cleanup event listeners\n return () => {\n emitter.off('grid:click', handleGridClick)\n emitter.off('grid:move', handleGridMove)\n\n if (attachTo === 'wall' || attachTo === 'wall-side') {\n emitter.off('wall:click', handleWallClick)\n emitter.off('wall:enter', handleWallEnter)\n emitter.off('wall:move', handleWallMove)\n emitter.off('wall:leave', handleWallLeave)\n }\n\n if (attachTo === 'ceiling') {\n emitter.off('ceiling:click', handleCeilingClick)\n emitter.off('ceiling:enter', handleCeilingEnter)\n emitter.off('ceiling:move', handleCeilingMove)\n emitter.off('ceiling:leave', handleCeilingLeave)\n }\n }\n }, [addNode, updateNode, deleteNode, selectedFloorId, levels, spatialGrid, selectedItem])\n\n return null\n}\n\n// ============================================================================\n// REGISTER ITEM COMPONENT\n// ============================================================================\n\nregisterComponent({\n nodeType: 'item',\n nodeName: 'Item',\n editorMode: 'building',\n toolName: 'item',\n toolIcon: Package,\n schema: ItemNode,\n nodeEditor: ItemNodeEditor,\n nodeRenderer: ItemRenderer,\n})\n","import { Group } from 'lucide-react'\nimport { registerComponent } from '../../../registry'\nimport { GroupNode } from '@pascal/core/scenegraph/schema/nodes/group'\n\n// ============================================================================\n// REGISTER GROUP COMPONENT\n// ============================================================================\n\nregisterComponent({\n nodeType: 'group',\n nodeName: 'Group',\n editorMode: 'building',\n toolIcon: Group,\n schema: GroupNode,\n nodeEditor: () => null, // No specific editor logic for generic groups yet\n nodeRenderer: null,\n})\n","'use client'\n\nimport { Edges } from '@react-three/drei'\nimport { useMemo } from 'react'\nimport * as THREE from 'three'\nimport { useShallow } from 'zustand/shallow'\nimport { useEditor } from '../../../hooks'\nimport type { StairNode, StairSegmentNode } from '@pascal/core/scenegraph/schema/nodes/stair'\nimport type { AnyNodeId } from '@pascal/core'\n\n// ============================================================================\n// MESH COMPONENT\n// ============================================================================\n\ninterface StairSegmentMeshProps {\n segment: StairSegmentNode\n absoluteHeight?: number // The world Y height where this segment starts\n}\n\nfunction StairSegmentMesh({ segment, absoluteHeight = 0 }: StairSegmentMeshProps) {\n const { width, length, height, stepCount, segmentType, fillToFloor, thickness = 0.2 } = segment\n const debug = useEditor((state) => state.debug)\n const shape = useMemo(() => {\n const s = new THREE.Shape()\n if (segmentType === 'landing') {\n s.moveTo(0, 0)\n s.lineTo(length, 0)\n if (fillToFloor) {\n s.lineTo(length, -absoluteHeight)\n s.lineTo(0, -absoluteHeight)\n } else {\n s.lineTo(length, -thickness)\n s.lineTo(0, -thickness)\n }\n } else {\n const riserHeight = height / stepCount\n const treadDepth = length / stepCount\n\n s.moveTo(0, 0)\n for (let i = 0; i < stepCount; i++) {\n s.lineTo(i * treadDepth, (i + 1) * riserHeight)\n s.lineTo((i + 1) * treadDepth, (i + 1) * riserHeight)\n }\n\n if (fillToFloor) {\n s.lineTo(length, -absoluteHeight)\n s.lineTo(0, -absoluteHeight)\n } else {\n // Implemented sloped bottom with consistent thickness and ground handling\n const angle = Math.atan(riserHeight / treadDepth)\n // Calculate vertical offset to maintain constant perpendicular thickness\n const vOff = thickness / Math.cos(angle)\n\n // Bottom-back corner\n s.lineTo(length, height - vOff)\n\n if (absoluteHeight === 0) {\n // Ground floor logic: Calculate where the slope hits the ground (y=0)\n // Slope m = riserHeight / treadDepth\n // Line eq: y - (height - vOff) = m * (x - length)\n // Set y = 0 => x = length - (height - vOff) / m\n const m = riserHeight / treadDepth\n const xGround = length - (height - vOff) / m\n\n if (xGround > 0) {\n s.lineTo(xGround, 0)\n }\n } else {\n // Floating logic: Parallel slope\n s.lineTo(0, -vOff)\n }\n }\n }\n s.lineTo(0, 0)\n return s\n }, [length, height, stepCount, segmentType, fillToFloor, absoluteHeight, thickness, width])\n\n const extrudeSettings = useMemo(\n () => ({\n steps: 1,\n depth: width,\n bevelEnabled: false,\n }),\n [width],\n )\n\n return (\n <group>\n <mesh castShadow position={[width / 2, 0, 0]} receiveShadow rotation={[0, -Math.PI / 2, 0]}>\n <extrudeGeometry args={[shape, extrudeSettings]} />\n <meshStandardMaterial color=\"#e6b88a\" roughness={0.5} />\n {debug && (\n <Edges\n color=\"#000000\"\n key={segment.id}\n linewidth={1}\n opacity={0.1}\n renderOrder={1000}\n threshold={15}\n />\n )}\n </mesh>\n </group>\n )\n}\n\n// ============================================================================\n// STAIR SYSTEM (TRANSFORMS)\n// ============================================================================\n\ninterface StairSystemProps {\n segments: StairSegmentNode[]\n}\n\nfunction StairSystem({ segments }: StairSystemProps) {\n // We calculate the world transform for each segment\n const segmentTransforms = useMemo(() => {\n return segments.reduce<{\n transforms: { position: [number, number, number]; rotation: [number, number, number] }[]\n prevSegment: StairSegmentNode | null\n currentPos: THREE.Vector3\n currentRot: number // Radians around Y\n }>(\n (acc, segment, index) => {\n const pos = acc.currentPos.clone()\n let rot = acc.currentRot\n\n if (index > 0 && acc.prevSegment) {\n const prev = acc.prevSegment\n\n // Calculate attachment point in PREVIOUS segment's local space\n // Previous segment is centered on X, starts at Z=0, ends at Z=length\n const localAttachPos = new THREE.Vector3()\n let rotChange = 0\n\n switch (segment.attachmentSide) {\n case 'front':\n // Attach to end of run\n localAttachPos.set(0, prev.height, prev.length)\n rotChange = 0\n break\n case 'left':\n // Attach to left face (X is width)\n // Center of left face\n localAttachPos.set(prev.width / 2, prev.height, prev.length / 2)\n rotChange = Math.PI / 2\n break\n case 'right':\n // Attach to right face\n localAttachPos.set(-prev.width / 2, prev.height, prev.length / 2)\n rotChange = -Math.PI / 2\n break\n }\n\n // Rotate local attachment point by previous global rotation\n localAttachPos.applyAxisAngle(new THREE.Vector3(0, 1, 0), acc.currentRot)\n\n // Add to previous global position\n pos.add(localAttachPos)\n\n // Update rotation\n rot += rotChange\n }\n\n // Store transform for this segment\n acc.transforms.push({\n position: [pos.x, pos.y, pos.z],\n rotation: [0, rot, 0],\n })\n\n // Update accumulator for next iteration\n acc.prevSegment = segment\n acc.currentPos = pos\n acc.currentRot = rot\n\n return acc\n },\n {\n transforms: [],\n prevSegment: null,\n currentPos: new THREE.Vector3(0, 0, 0),\n currentRot: 0,\n },\n )\n }, [segments])\n\n return (\n <group>\n {segments.map((segment, index) => {\n const transform = segmentTransforms.transforms[index]\n return (\n <group\n key={segment.id}\n position={transform.position}\n rotation={transform.rotation as [number, number, number]}\n >\n <StairSegmentMesh absoluteHeight={transform.position[1]} segment={segment} />\n </group>\n )\n })}\n </group>\n )\n}\n\n// ============================================================================\n// MAIN RENDERER\n// ============================================================================\n\nexport function StairRenderer({ nodeId }: { nodeId: string }) {\n const node = useEditor(\n useShallow((state) => {\n const n = state.graph.getNodeById(nodeId as AnyNodeId)?.data()\n return n?.type === 'stair' ? (n as StairNode) : null\n }),\n )\n const debug = useEditor((state) => state.debug)\n\n if (!node) return null\n\n return (\n <group>\n {/* Visualize selection or bounding box if needed here? No, usually handled by SelectionBox or similar */}\n <StairSystem segments={node.children} />\n </group>\n )\n}\n","'use client'\n\nimport { StairsIcon } from '@phosphor-icons/react'\nimport { useEffect, useRef } from 'react'\nimport { StairRenderer } from '../stair/stair-renderer'\nimport { emitter, type GridEvent } from '@pascal/core/events'\nimport { useEditor } from '../../../hooks'\nimport { registerComponent } from '../../../registry'\nimport { StairNode, type StairSegmentNode } from '@pascal/core/scenegraph/schema/nodes/stair'\n\n// ============================================================================\n// STAIR BUILDER COMPONENT\n// ============================================================================\n\nexport function StairNodeEditor() {\n const addNode = useEditor((state) => state.addNode)\n const updateNode = useEditor((state) => state.updateNode)\n const deleteNode = useEditor((state) => state.deleteNode)\n const selectedFloorId = useEditor((state) => state.selectedFloorId)\n\n // Use ref to persist preview state across renders without triggering re-renders\n const previewStateRef = useRef<{\n previewStairId: string | null\n lastPreviewPosition: [number, number] | null\n currentRotation: number\n }>({\n previewStairId: null,\n lastPreviewPosition: null,\n currentRotation: 0,\n })\n\n // Cleanup preview on unmount\n useEffect(\n () => () => {\n const previewId = previewStateRef.current.previewStairId\n if (previewId) {\n deleteNode(previewId)\n }\n },\n [deleteNode],\n )\n\n // Right-click handler for rotation\n useEffect(() => {\n const handleContextMenu = (e: MouseEvent) => {\n const previewId = previewStateRef.current.previewStairId\n // Only handle if there's an active preview\n if (previewId && selectedFloorId) {\n e.preventDefault()\n e.stopPropagation()\n\n // Rotate by 90 degrees\n previewStateRef.current.currentRotation += Math.PI / 2\n\n // Update preview with new rotation\n updateNode(previewId, {\n rotation: previewStateRef.current.currentRotation,\n })\n }\n }\n\n window.addEventListener('contextmenu', handleContextMenu)\n return () => {\n window.removeEventListener('contextmenu', handleContextMenu)\n }\n }, [selectedFloorId, updateNode])\n\n useEffect(() => {\n const handleGridClick = (e: GridEvent) => {\n if (!selectedFloorId) return\n\n const [x, y] = e.position\n\n // Create default segment\n const defaultSegment: StairSegmentNode = {\n segmentType: 'stair',\n width: 1.0,\n length: 3.0,\n height: 2.0,\n stepCount: 10,\n attachmentSide: 'front',\n fillToFloor: true,\n thickness: 0.25,\n } as StairSegmentNode\n\n // Create stair node\n addNode(\n StairNode.parse({\n name: `Stair at ${x},${y}`,\n position: [x, y],\n rotation: previewStateRef.current.currentRotation,\n size: [1, 3], // Approximate size\n visible: true,\n opacity: 100,\n children: [defaultSegment],\n }),\n selectedFloorId,\n )\n\n // Let's just let the preview persist for continuous placement\n }\n\n const handleGridMove = (e: GridEvent) => {\n if (!selectedFloorId) return\n\n const [x, y] = e.position\n const lastPos = previewStateRef.current.lastPreviewPosition\n\n // Only update if position changed\n if (!lastPos || lastPos[0] !== x || lastPos[1] !== y) {\n previewStateRef.current.lastPreviewPosition = [x, y]\n\n const previewId = previewStateRef.current.previewStairId\n\n if (previewId) {\n // Update existing preview position\n updateNode(previewId, {\n position: [x, y] as [number, number],\n rotation: previewStateRef.current.currentRotation,\n visible: true,\n editor: { preview: true },\n })\n } else {\n // Create default segment for preview\n const defaultSegment: StairSegmentNode = {\n segmentType: 'stair',\n width: 1.0,\n length: 3.0,\n height: 2.0,\n stepCount: 10,\n attachmentSide: 'front',\n fillToFloor: true,\n thickness: 0.25,\n } as StairSegmentNode\n\n // Create new preview item\n const newPreviewId = addNode(\n StairNode.parse({\n name: 'Stair Preview',\n position: [x, y] as [number, number],\n rotation: previewStateRef.current.currentRotation,\n size: [1, 3],\n visible: true,\n opacity: 100,\n editor: { preview: true },\n children: [defaultSegment],\n }),\n selectedFloorId,\n )\n previewStateRef.current.previewStairId = newPreviewId\n }\n }\n }\n\n // Register event listeners\n emitter.on('grid:click', handleGridClick)\n emitter.on('grid:move', handleGridMove)\n\n // Cleanup event listeners\n return () => {\n emitter.off('grid:click', handleGridClick)\n emitter.off('grid:move', handleGridMove)\n }\n }, [addNode, updateNode, selectedFloorId])\n\n return null\n}\n\n// ============================================================================\n// REGISTER STAIR COMPONENT\n// ============================================================================\n\nregisterComponent({\n nodeType: 'stair',\n nodeName: 'Stair',\n editorMode: 'building',\n toolName: 'stair',\n toolIcon: StairsIcon,\n schema: StairNode,\n nodeEditor: StairNodeEditor,\n nodeRenderer: StairRenderer,\n})\n","'use client'\n\nimport { Html, Line, shaderMaterial } from '@react-three/drei'\nimport { extend, type ThreeEvent, useFrame, useThree } from '@react-three/fiber'\nimport { memo, useCallback, useMemo, useRef, useState } from 'react'\nimport * as THREE from 'three'\nimport { DoubleSide } from 'three'\nimport { useShallow } from 'zustand/react/shallow'\nimport { GRID_SIZE } from '../../../constants'\nimport { useEditor } from '../../../hooks'\nimport type { SiteNode } from '@pascal/core'\n\ninterface SiteRendererProps {\n nodeId: SiteNode['id']\n}\n\n/**\n * Site renderer component\n * Renders the property line polygon and handles for editing\n */\nexport const SiteRenderer = memo(({ nodeId }: SiteRendererProps) => {\n const materialRef = useRef<any>(null)\n const groupRef = useRef<THREE.Group>(null)\n const [draggingIndex, setDraggingIndex] = useState<number | null>(null)\n const { camera } = useThree()\n\n const { polygon, isSelected, isEditing } = useEditor(\n useShallow((state) => {\n const handle = state.graph.getNodeById(nodeId)\n const node = handle?.data() as SiteNode\n return {\n polygon: node?.polygon,\n isSelected: state.selectedNodeIds.includes(nodeId),\n isEditing: state.selectedNodeIds.includes(nodeId) && state.controlMode === 'edit',\n }\n }),\n )\n\n const updateNode = useEditor((state) => state.updateNode)\n\n // Default points if not present (fallback)\n const points = useMemo(() => {\n if (polygon?.points && polygon.points.length > 0) {\n return polygon.points\n }\n // Fallback to default square matching GRID_SIZE\n return [\n [0, 0],\n [GRID_SIZE, 0],\n [GRID_SIZE, GRID_SIZE],\n [0, GRID_SIZE],\n ] as [number, number][]\n }, [polygon])\n\n useFrame(({ clock }, delta) => {\n if (materialRef.current) {\n materialRef.current.uTime = clock.elapsedTime\n materialRef.current.lifetime += delta\n }\n })\n\n // Create geometry from points\n const { geometry, selectionGeometry } = useMemo(() => {\n if (points.length < 3) return { geometry: null, selectionGeometry: null }\n\n // Create shape (negate Z for correct orientation when rotated)\n const shapePoints = points.map(([x, y]) => new THREE.Vector2(x, -y))\n const shape = new THREE.Shape(shapePoints)\n\n const extrudeSettings = {\n depth: 10, // Height of the volume\n bevelEnabled: false,\n }\n\n const geom = new THREE.ExtrudeGeometry(shape, extrudeSettings)\n // Rotate to align with world (XY -> XZ)\n geom.rotateX(-Math.PI / 2)\n\n const selGeom = new THREE.ShapeGeometry(shape)\n selGeom.rotateX(-Math.PI / 2)\n\n // ExtrudeGeometry creates UVs, but we'll use world position in shader\n return { geometry: geom, selectionGeometry: selGeom }\n }, [points])\n\n // Drag handlers\n const onPointerDown = useCallback((e: ThreeEvent<PointerEvent>, index: number) => {\n e.stopPropagation()\n // Only left click\n if (e.button !== 0) return\n\n setDraggingIndex(index)\n const el = e.nativeEvent.target as HTMLElement\n el.setPointerCapture?.(e.pointerId)\n }, [])\n\n const onPointerUp = useCallback((e: ThreeEvent<PointerEvent>) => {\n e.stopPropagation()\n setDraggingIndex(null)\n const el = e.nativeEvent.target as HTMLElement\n el.releasePointerCapture?.(e.pointerId)\n }, [])\n\n const onPointerMove = useCallback(\n (e: ThreeEvent<PointerEvent>) => {\n if (draggingIndex === null || !groupRef.current) return\n e.stopPropagation()\n\n // Convert world point to local space\n const worldPoint = e.point.clone()\n const localPoint = groupRef.current.worldToLocal(worldPoint)\n\n // Allow free coordinate editing (round to 2 decimal places for precision)\n const x = Math.round(localPoint.x * 100) / 100\n const z = Math.round(localPoint.z * 100) / 100\n\n // Update points\n const newPoints = [...points]\n newPoints[draggingIndex] = [x, z]\n\n updateNode(nodeId, {\n polygon: {\n type: 'polygon',\n points: newPoints,\n },\n })\n },\n [draggingIndex, points, updateNode, nodeId],\n )\n\n // Drag plane (invisible) to catch move events when dragging\n const dragPlane = useMemo(\n () => (\n <mesh\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n position={[0, 0.5, 0]}\n rotation={[-Math.PI / 2, 0, 0]}\n >\n <planeGeometry args={[1000, 1000]} />\n <meshBasicMaterial color=\"red\" depthWrite={false} opacity={0} transparent />\n </mesh>\n ),\n [onPointerMove, onPointerUp],\n )\n\n if (!(geometry && selectionGeometry)) return null\n\n return (\n <group ref={groupRef}>\n {/* Visual Boundary Volume (No Raycast) */}\n <mesh\n geometry={geometry}\n // Position offset: The extrusion starts at Z=0 (local) which becomes Y=0 (world)\n // We want it slightly raised? Or at 0?\n // Existing was at 5.2 (center) with height 10 => 0.2 to 10.2\n // Extrusion of 10 at Y=0 goes 0 to 10.\n // Let's put it at 0.2 to avoid Z-fighting with floor if needed, or 0.\n position={[0, 0.2, 0]}\n raycast={() => null}\n >\n {/* @ts-expect-error - Custom shader material from extend() */}\n <siteBoundsMaterial\n color={'#d2d1f5'}\n depthWrite={false}\n opacity={0.35}\n ref={materialRef}\n side={DoubleSide}\n toneMapped={false}\n transparent\n />\n </mesh>\n\n {/* Selection Plane (Invisible, Raycastable) */}\n <mesh geometry={selectionGeometry} position={[0, 0.2, 0]}>\n <meshBasicMaterial depthWrite={false} opacity={0} transparent />\n </mesh>\n\n {/* Handles - only visible in edit mode */}\n {isEditing && (\n <>\n {/* Segments */}\n <Line\n color=\"#f59e0b\"\n depthTest={false}\n lineWidth={2}\n opacity={0.8}\n points={[\n ...points.map(([x, z]) => [x, 0.5, z] as [number, number, number]),\n [points[0][0], 0.5, points[0][1]] as [number, number, number],\n ]}\n renderOrder={9}\n transparent\n />\n\n {points.map(([x, y], i) => (\n <mesh\n castShadow\n key={i} // Slightly above ground\n onPointerDown={(e) => onPointerDown(e, i)}\n position={[x, 0.5, y]}\n receiveShadow\n renderOrder={10}\n >\n <boxGeometry args={[0.4, 0.4, 0.4]} />\n <meshBasicMaterial\n color={draggingIndex === i ? '#fbbf24' : '#f59e0b'}\n depthTest={false}\n transparent\n />\n </mesh>\n ))}\n {/* Active dragging plane */}\n {draggingIndex !== null && dragPlane}\n\n {/* Segment Measurements */}\n {points.map((p1, i) => {\n const p2 = points[(i + 1) % points.length]\n const midX = (p1[0] + p2[0]) / 2\n const midZ = (p1[1] + p2[1]) / 2\n const dist = Math.sqrt((p2[0] - p1[0]) ** 2 + (p2[1] - p1[1]) ** 2)\n\n return (\n <Html\n center\n key={`dist-${i}`}\n position={[midX, 0.5, midZ]}\n style={{ pointerEvents: 'none', userSelect: 'none' }}\n zIndexRange={[100, 0]}\n >\n <div className=\"whitespace-nowrap rounded bg-black/75 px-1.5 py-0.5 font-mono text-white text-xs backdrop-blur-sm\">\n {dist.toFixed(2)}m\n </div>\n </Html>\n )\n })}\n </>\n )}\n </group>\n )\n})\n\nconst SiteBoundsMaterial = shaderMaterial(\n {\n color: new THREE.Color('white'),\n opacity: 1.0,\n lifetime: 0,\n uTime: 0,\n },\n /* glsl */ `\n varying vec2 vUv;\n varying vec3 vWorldPosition;\n void main() {\n vUv = uv;\n vec4 worldPos = modelMatrix * vec4(position, 1.0);\n vWorldPosition = worldPos.xyz;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n`,\n /* glsl */ `\n varying vec2 vUv;\n varying vec3 vWorldPosition;\n uniform vec3 color;\n uniform float opacity;\n uniform float uTime;\n uniform float lifetime;\n\n // Simple 2D noise function\n float noise(vec2 st) {\n return fract(sin(dot(st.xy, vec2(12.9898, 78.233))) * 43758.5453123);\n }\n\n // Smooth noise\n float smoothNoise(vec2 st) {\n vec2 i = floor(st);\n vec2 f = fract(st);\n\n // Four corners in 2D of a tile\n float a = noise(i);\n float b = noise(i + vec2(1.0, 0.0));\n float c = noise(i + vec2(0.0, 1.0));\n float d = noise(i + vec2(1.0, 1.0));\n\n // Smooth interpolation\n vec2 u = f * f * (3.0 - 2.0 * f);\n\n return mix(a, b, u.x) + (c - a) * u.y * (1.0 - u.x) + (d - b) * u.x * u.y;\n }\n\n void main() {\n // Hide top and bottom faces based on world position\n // Box is centered at Y=5.2 with height 10, so top is at 10.2 and bottom is at 0.2\n float threshold = 0.1;\n if (vWorldPosition.y < (0.2 + threshold) || vWorldPosition.y > (10.2 - threshold)) {\n discard;\n }\n\n float transitionSpeed = 0.4;\n float alpha = opacity * smoothstep(0.0, transitionSpeed, lifetime);\n vec3 finalColor = color;\n\n // Make bottom edge (0 to 0.22) very strong\n // Use world height relative to base (0.2)\n float relHeight = vWorldPosition.y - 0.2;\n float heightNorm = clamp(relHeight / 10.0, 0.0, 1.0);\n \n float bottomStrength = smoothstep(0.05, 0.0, heightNorm); // Strong at bottom\n float baseAlpha = smoothstep(1.0, 0.0, heightNorm); // Fade out going up\n\n // Boost color intensity at bottom\n finalColor = mix(finalColor, finalColor * 2.0, bottomStrength);\n\n // Use world position for dots pattern to be independent of geometry UVs\n vec2 gridUv = vWorldPosition.xz * 2.0; // 2 dots per unit (approx 50cm spacing)\n\n // Get fractional part to create repeating grid\n vec2 grid = fract(gridUv);\n\n // Move to center of each grid cell (center at 0.5, 0.5)\n vec2 cellCenter = grid - 0.5;\n\n // Calculate distance from current point to cell center\n float dist = length(cellCenter);\n\n // Create circular dots with a smooth edge\n float dotSize = 0.25; // Adjust for dot size\n float dotsTexture = max(0.5, smoothstep(dotSize + 0.01, dotSize - 0.01, dist));\n\n // Fade dots at both top and bottom\n float dotsFade = max(smoothstep(0.8, 1.0, heightNorm), bottomStrength);\n alpha *= mix(dotsTexture, 1.0, dotsFade);\n alpha *= baseAlpha;\n\n // Boost alpha at bottom edge\n alpha = mix(alpha, 1.0, bottomStrength * 0.5);\n\n // Add animated noise to transparency\n vec2 noiseCoord = vWorldPosition.xz * 0.05 + uTime * 0.5;\n float noiseValue = smoothNoise(noiseCoord);\n\n // Layer multiple octaves for more interesting movement\n noiseValue += smoothNoise(noiseCoord * 2.0 - uTime * 0.15) * 0.5;\n noiseValue += smoothNoise(noiseCoord * 4.0 + uTime * 0.08) * 0.25;\n noiseValue /= 1.75; // Normalize\n\n // Apply noise to alpha (subtle effect)\n alpha *= mix(0.1, 1.0, noiseValue);\n\n gl_FragColor = vec4(finalColor, alpha);\n }\n`,\n)\n\nextend({ SiteBoundsMaterial })\n\nSiteRenderer.displayName = 'SiteRenderer'\n","// ============================================================================\n// REGISTER BUILDING COMPONENT\n// ============================================================================\n\nimport { Building2 } from 'lucide-react'\nimport { registerComponent } from '../../../registry'\nimport { SiteNode } from '@pascal/core/scenegraph/schema/nodes/site'\nimport { SiteRenderer } from './site-renderer'\n\n// ============================================================================\n// BUILDING BUILDER COMPONENT\n// ============================================================================\n\n/**\n * Building node editor component\n * Buildings don't have interactive editing UI\n */\nexport function SiteNodeEditor() {\n return null\n}\n\n// ============================================================================\n// REGISTER BUILDING COMPONENT\n// ============================================================================\n\nregisterComponent({\n nodeType: 'site',\n nodeName: 'Site',\n editorMode: 'building',\n schema: SiteNode,\n nodeEditor: SiteNodeEditor,\n nodeRenderer: SiteRenderer,\n toolIcon: Building2,\n})\n","'use client'\n\nimport { Billboard, Line } from '@react-three/drei'\nimport { type ThreeEvent, useFrame } from '@react-three/fiber'\nimport { Container, Text } from '@react-three/uikit'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport * as THREE from 'three'\nimport { useShallow } from 'zustand/shallow'\nimport { FLOOR_SPACING, TILE_SIZE } from '../../../constants'\nimport { emitter, type ZonePreviewEvent } from '@pascal/core/events'\nimport { type StoreState, useEditor } from '../../../hooks'\nimport type { Zone } from '@pascal/core/scenegraph/schema/zones'\n\n// Height offset to prevent z-fighting with floor\nconst Y_OFFSET = 0.02\n\n// Height of the extruded zone walls\nconst EXTRUDE_HEIGHT = 2.5\n\n// Convert grid coordinates to world coordinates\nconst toWorld = (x: number, z: number): [number, number] => [x * TILE_SIZE, z * TILE_SIZE]\n\nconst tmpVec3 = new THREE.Vector3()\n\n/**\n * Custom gradient shader material for extruded zone walls\n * Fades from fully transparent at bottom to semi-transparent at top\n * When hovered, the gradient becomes more opaque\n */\nconst GradientMaterial = ({\n color,\n opacity,\n height,\n hovered = false,\n}: {\n color: string\n opacity: number\n height: number\n hovered?: boolean\n}) => {\n const materialRef = useRef<THREE.ShaderMaterial>(null)\n\n // Create uniforms only once\n const uniforms = useMemo(\n () => ({\n uColor: { value: new THREE.Color(color) },\n uOpacity: { value: opacity },\n uHeight: { value: height },\n uHovered: { value: hovered ? 1.0 : 0.0 },\n }),\n [], // Empty deps - create once\n )\n\n // Update uniforms when props change\n useEffect(() => {\n if (materialRef.current) {\n materialRef.current.uniforms.uColor.value.set(color)\n materialRef.current.uniforms.uOpacity.value = opacity\n materialRef.current.uniforms.uHeight.value = height\n materialRef.current.uniforms.uHovered.value = hovered ? 1.0 : 0.0\n }\n }, [color, opacity, height, hovered])\n\n return (\n <shaderMaterial\n depthTest={false}\n depthWrite={false}\n fragmentShader={`\n uniform vec3 uColor;\n uniform float uOpacity;\n uniform float uHeight;\n uniform float uHovered;\n varying float vHeight;\n\n void main() {\n // Calculate alpha based on height (0 at bottom, 1 at top)\n float alpha = vHeight / uHeight;\n\n // When hovered, use a gentler falloff and higher minimum opacity\n float falloff = mix(alpha * alpha, alpha, uHovered * 0.5);\n float minAlpha = mix(0.0, 0.3, uHovered);\n alpha = max(falloff, minAlpha);\n\n // Boost opacity when hovered\n float finalOpacity = mix(uOpacity, uOpacity * 1.5, uHovered);\n\n gl_FragColor = vec4(uColor, alpha * finalOpacity);\n }\n `}\n ref={materialRef}\n side={THREE.DoubleSide}\n transparent\n uniforms={uniforms}\n vertexShader={`\n varying float vHeight;\n\n void main() {\n vHeight = position.y;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `}\n />\n )\n}\n/**\n * Label displayed at the center of a zone\n */\nfunction ZoneLabel({\n name,\n color,\n centerX,\n centerZ,\n levelYOffset,\n}: {\n name: string\n color: string\n centerX: number\n centerZ: number\n levelYOffset: number\n}) {\n const labelRef = useRef<THREE.Group>(null)\n\n useFrame(({ camera }) => {\n // Scale control panel based on camera distance to maintain consistent visual size\n if (labelRef.current && labelRef) {\n tmpVec3.set(centerX, levelYOffset + 2, centerZ)\n // Calculate distance from camera to the selection center\n const distance = camera.position.distanceTo(tmpVec3)\n // Use distance to calculate appropriate scale\n const scale = distance * 0.12 // Adjust multiplier for desired size\n const finalScale = Math.min(Math.max(scale, 0.5), 2) // Clamp between 0.5 and 2\n labelRef.current.scale.setScalar(finalScale)\n }\n })\n\n return (\n <group position={[centerX, levelYOffset + 1.25, centerZ]} ref={labelRef}>\n <Billboard>\n <Container\n alignItems=\"center\"\n backgroundColor=\"#21222a\"\n borderRadius={6}\n depthTest={false}\n flexDirection=\"row\"\n gap={0}\n height={40}\n opacity={0.9}\n paddingRight={16}\n renderOrder={1000}\n >\n {/* Color circle */}\n <Container\n backgroundColor={color}\n borderRadius={1000}\n height={42}\n opacity={1}\n positionLeft={-12}\n width={42}\n />\n {/* Label text */}\n <Text color=\"white\" fontSize={20} fontWeight=\"medium\">\n {name}\n </Text>\n </Container>\n </Billboard>\n </group>\n )\n}\n\n/**\n * Renders a single zone as a colored polygon on the floor\n */\nfunction ZonePolygon({\n zone,\n isSelected,\n levelYOffset,\n isInteractive,\n onSelect,\n showLabel,\n}: {\n zone: Zone\n isSelected: boolean\n levelYOffset: number\n isInteractive?: boolean\n onSelect?: (zoneId: string) => void\n showLabel?: boolean\n}) {\n const polygon = zone.polygon\n const color = zone.color || '#3b82f6'\n const [isHovered, setIsHovered] = useState(false)\n\n // Create the polygon shape and extruded wall geometry (convert grid coords to world coords)\n const { shape, linePoints, center, wallGeometry } = useMemo(() => {\n if (!polygon || polygon.length < 3)\n return { shape: null, linePoints: [], center: null, wallGeometry: null }\n\n // Convert to world coordinates\n const worldPts = polygon.map(([x, z]) => toWorld(x, z))\n\n // THREE.Shape is in X-Y plane. After rotation of -PI/2 around X:\n // - Shape X -> World X\n // - Shape Y -> World -Z (so we negate Z to get correct orientation)\n const shape = new THREE.Shape()\n shape.moveTo(worldPts[0][0], -worldPts[0][1])\n\n for (let i = 1; i < worldPts.length; i++) {\n shape.lineTo(worldPts[i][0], -worldPts[i][1])\n }\n shape.closePath()\n\n // Create line points for the border (close the loop)\n const linePoints = [\n ...worldPts.map(([x, z]) => new THREE.Vector3(x, levelYOffset + Y_OFFSET + 0.01, z)),\n new THREE.Vector3(worldPts[0][0], levelYOffset + Y_OFFSET + 0.01, worldPts[0][1]),\n ]\n\n // Calculate centroid of polygon\n let sumX = 0\n let sumZ = 0\n for (const [x, z] of worldPts) {\n sumX += x\n sumZ += z\n }\n const center = { x: sumX / worldPts.length, z: sumZ / worldPts.length }\n\n // Create extruded wall geometry from polygon edges\n // Build vertical quads for each edge of the polygon\n const vertices: number[] = []\n const numPoints = worldPts.length\n\n for (let i = 0; i < numPoints; i++) {\n const [x1, z1] = worldPts[i]\n const [x2, z2] = worldPts[(i + 1) % numPoints]\n\n // Create two triangles for each wall segment\n // Bottom-left, bottom-right, top-right triangle\n vertices.push(x1, 0, z1)\n vertices.push(x2, 0, z2)\n vertices.push(x2, EXTRUDE_HEIGHT, z2)\n\n // Bottom-left, top-right, top-left triangle\n vertices.push(x1, 0, z1)\n vertices.push(x2, EXTRUDE_HEIGHT, z2)\n vertices.push(x1, EXTRUDE_HEIGHT, z1)\n }\n\n const wallGeometry = new THREE.BufferGeometry()\n wallGeometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3))\n wallGeometry.computeVertexNormals()\n\n return { shape, linePoints, center, wallGeometry }\n }, [polygon, levelYOffset])\n\n const handleClick = useCallback(\n (e: ThreeEvent<MouseEvent>) => {\n if (!isInteractive) return\n e.stopPropagation()\n onSelect?.(zone.id)\n },\n [isInteractive, onSelect, zone.id],\n )\n\n const handlePointerEnter = useCallback(() => {\n if (isInteractive) setIsHovered(true)\n }, [isInteractive])\n\n const handlePointerLeave = useCallback(() => {\n setIsHovered(false)\n }, [])\n\n if (!shape) return null\n\n // Determine visual state based on selection and hover\n const isHighlighted = isSelected || isHovered\n const fillOpacity = isSelected ? 0.4 : isHovered ? 0.35 : 0.25\n\n return (\n <group>\n {/* Filled polygon on floor */}\n <mesh\n frustumCulled={false}\n onClick={handleClick}\n onPointerEnter={handlePointerEnter}\n onPointerLeave={handlePointerLeave}\n position={[0, levelYOffset + Y_OFFSET, 0]}\n renderOrder={999}\n rotation={[-Math.PI / 2, 0, 0]}\n >\n <shapeGeometry args={[shape]} />\n <meshBasicMaterial\n color={color}\n depthWrite={false}\n opacity={fillOpacity}\n side={THREE.DoubleSide}\n transparent\n />\n </mesh>\n\n {/* Extruded walls with gradient shader */}\n {wallGeometry && (\n <mesh\n frustumCulled={false}\n geometry={wallGeometry}\n position={[0, levelYOffset + Y_OFFSET, 0]}\n renderOrder={99_999_999_999}\n >\n <GradientMaterial\n color={color}\n height={EXTRUDE_HEIGHT}\n hovered={isHovered}\n key={color}\n opacity={fillOpacity * 0.8}\n />\n </mesh>\n )}\n\n {/* Border line */}\n <Line\n color={color}\n lineWidth={isHighlighted ? 2 : 1}\n points={linePoints}\n renderOrder={9_999_999_999}\n />\n\n {/* Label at center */}\n {showLabel && center && (\n <ZoneLabel\n centerX={center.x}\n centerZ={center.z}\n color={color}\n levelYOffset={levelYOffset}\n name={zone.name}\n />\n )}\n </group>\n )\n}\n\n/**\n * Renders the zone preview while drawing\n */\nfunction ZonePreview({ levelYOffset }: { levelYOffset: number }) {\n const [previewState, setPreviewState] = useState<ZonePreviewEvent>({ points: [] })\n\n useEffect(() => {\n const handlePreview = (event: ZonePreviewEvent) => {\n setPreviewState(event)\n }\n\n emitter.on('zone:preview', handlePreview)\n return () => {\n emitter.off('zone:preview', handlePreview)\n }\n }, [])\n\n const { points, cursorPoint } = previewState\n\n // Create line points including cursor (convert grid coords to world coords)\n const linePoints = useMemo(() => {\n if (points.length === 0) return []\n\n const pts = points.map(([x, z]) => {\n const [wx, wz] = toWorld(x, z)\n return new THREE.Vector3(wx, levelYOffset + Y_OFFSET + 0.02, wz)\n })\n\n // Add cursor point if available\n if (cursorPoint) {\n const [wx, wz] = toWorld(cursorPoint[0], cursorPoint[1])\n pts.push(new THREE.Vector3(wx, levelYOffset + Y_OFFSET + 0.02, wz))\n }\n\n return pts\n }, [points, cursorPoint, levelYOffset])\n\n // Create closing line to first point when we have 3+ points\n const closingLinePoints = useMemo(() => {\n if (points.length < 3 || !cursorPoint) return []\n\n const [cwx, cwz] = toWorld(cursorPoint[0], cursorPoint[1])\n const [fwx, fwz] = toWorld(points[0][0], points[0][1])\n return [\n new THREE.Vector3(cwx, levelYOffset + Y_OFFSET + 0.02, cwz),\n new THREE.Vector3(fwx, levelYOffset + Y_OFFSET + 0.02, fwz),\n ]\n }, [points, cursorPoint, levelYOffset])\n\n // Create preview shape when we have 3+ points\n const previewShape = useMemo(() => {\n if (points.length < 3) return null\n\n const allPoints = [...points]\n if (cursorPoint) {\n allPoints.push(cursorPoint)\n }\n\n // Convert to world coordinates\n const worldPts = allPoints.map(([x, z]) => toWorld(x, z))\n\n // THREE.Shape is in X-Y plane. After rotation of -PI/2 around X:\n // - Shape X -> World X\n // - Shape Y -> World -Z (so we negate Z to get correct orientation)\n const shape = new THREE.Shape()\n shape.moveTo(worldPts[0][0], -worldPts[0][1])\n\n for (let i = 1; i < worldPts.length; i++) {\n shape.lineTo(worldPts[i][0], -worldPts[i][1])\n }\n shape.closePath()\n\n return shape\n }, [points, cursorPoint])\n\n if (points.length === 0) return null\n\n return (\n <group>\n {/* Preview fill */}\n {previewShape && (\n <mesh\n frustumCulled={false}\n position={[0, levelYOffset + Y_OFFSET, 0]}\n rotation={[-Math.PI / 2, 0, 0]}\n >\n <shapeGeometry args={[previewShape]} />\n <meshBasicMaterial\n color=\"#3b82f6\"\n depthTest={false}\n opacity={0.15}\n side={THREE.DoubleSide}\n transparent\n />\n </mesh>\n )}\n\n {/* Main line */}\n {linePoints.length >= 2 && (\n <Line\n color=\"#3b82f6\"\n depthTest={false}\n depthWrite={false}\n lineWidth={2}\n points={linePoints}\n renderOrder={99_999}\n />\n )}\n\n {/* Closing line (dashed) */}\n {closingLinePoints.length === 2 && (\n <Line\n color=\"#3b82f6\"\n dashed\n dashScale={10}\n depthTest={false}\n lineWidth={1}\n points={closingLinePoints}\n />\n )}\n\n {/* Point markers */}\n {points.map(([x, z], index) => {\n const [wx, wz] = toWorld(x, z)\n return (\n <mesh key={index} position={[wx, levelYOffset + Y_OFFSET + 0.03, wz]}>\n <sphereGeometry args={[0.1, 16, 16]} />\n <meshBasicMaterial\n color={index === 0 ? '#22c55e' : '#3b82f6'}\n depthTest={false}\n depthWrite={false}\n />\n </mesh>\n )\n })}\n </group>\n )\n}\n\n/**\n * Main zone renderer component\n * Renders all zones for the current level and the drawing preview\n */\nexport function ZoneRenderer({ isViewer = false }: { isViewer?: boolean }) {\n const selectedFloorId = useEditor((state) => state.selectedFloorId)\n const selectedZoneId = useEditor((state) => state.selectedZoneId)\n const selectZone = useEditor((state) => state.selectZone)\n const levelMode = useEditor((state) => state.levelMode)\n const viewMode = useEditor((state) => state.viewMode)\n\n // Determine if a zone should be interactive\n // Only zones on the currently selected level are interactive in viewer mode\n const getIsInteractive = useCallback(\n (zoneLevelId: string) => isViewer && !!selectedFloorId && zoneLevelId === selectedFloorId,\n [isViewer, selectedFloorId],\n )\n\n const handleSelectZone = useCallback(\n (zoneId: string) => {\n selectZone(zoneId)\n },\n [selectZone],\n )\n\n // Get building levels for Y offset calculation\n const buildingLevels = useEditor((state) => {\n const site = state.scene.root.children?.[0]\n const building = site?.children?.find((c) => c.type === 'building')\n return building?.children ?? []\n })\n\n // Memoize level data to avoid recalculating on every render\n const levelData = useMemo(() => {\n const data: Record<string, { level: number; elevation: number }> = {}\n for (const lvl of buildingLevels) {\n if (lvl.type === 'level') {\n data[lvl.id] = {\n level: (lvl as any).level ?? 0,\n elevation: (lvl as any).elevation ?? 0,\n }\n }\n }\n return data\n }, [buildingLevels])\n\n // Get all zones from the store\n const allZones = useEditor(useShallow((state: StoreState) => state.scene.zones || []))\n\n // Filter zones based on view mode and selection\n const zones = useMemo(() => {\n // In viewer mode with a zone selected, hide all zones\n if (isViewer && selectedZoneId) {\n return []\n }\n // In viewer mode with a floor selected, only show zones for that floor\n if (isViewer && selectedFloorId) {\n return allZones.filter((c) => c.levelId === selectedFloorId)\n }\n // In full view mode (no floor selected), show all zones\n if (viewMode === 'full' || !selectedFloorId) {\n return allZones\n }\n // In level view mode, show only zones for the selected floor\n return allZones.filter((c) => c.levelId === selectedFloorId)\n }, [allZones, viewMode, selectedFloorId, isViewer, selectedZoneId])\n\n // Calculate Y offset for the current level (used for preview)\n const previewLevelYOffset = useMemo(() => {\n if (!selectedFloorId) return 0\n const data = levelData[selectedFloorId]\n if (!data) return 0\n // Elevation is always applied, levelOffset only in exploded mode\n const levelOffset = levelMode === 'exploded' ? data.level * FLOOR_SPACING : 0\n return (data.elevation || 0) + levelOffset\n }, [levelMode, selectedFloorId, levelData])\n\n // Calculate Y offset for a specific level (matches node-renderer logic)\n const getLevelYOffset = useCallback(\n (levelId: string) => {\n const data = levelData[levelId]\n if (!data) return 0\n // Elevation is always applied, levelOffset only in exploded mode\n const levelOffset = levelMode === 'exploded' ? data.level * FLOOR_SPACING : 0\n return (data.elevation || 0) + levelOffset\n },\n [levelMode, levelData],\n )\n\n // Determine if labels should be shown for a zone\n // Show labels in viewer mode when on the selected floor and no zone is selected\n const getShowLabel = useCallback(\n (zoneLevelId: string) => isViewer && !selectedZoneId,\n [isViewer, selectedFloorId, selectedZoneId],\n )\n\n return (\n <group>\n {/* Render all zones */}\n {zones.map((zone) => (\n <ZonePolygon\n isInteractive={getIsInteractive(zone.levelId)}\n isSelected={selectedZoneId === zone.id}\n key={zone.id}\n levelYOffset={getLevelYOffset(zone.levelId)}\n onSelect={handleSelectZone}\n showLabel={getShowLabel(zone.levelId)}\n zone={zone}\n />\n ))}\n\n {/* Render the drawing preview */}\n <ZonePreview levelYOffset={previewLevelYOffset} />\n </group>\n )\n}\n","function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\n/*!\n * GSAP 3.14.2\n * https://gsap.com\n *\n * @license Copyright 2008-2025, GreenSock. All rights reserved.\n * Subject to the terms at https://gsap.com/standard-license\n * @author: Jack Doyle, jack@greensock.com\n*/\n\n/* eslint-disable */\nvar _config = {\n autoSleep: 120,\n force3D: \"auto\",\n nullTargetWarn: 1,\n units: {\n lineHeight: \"\"\n }\n},\n _defaults = {\n duration: .5,\n overwrite: false,\n delay: 0\n},\n _suppressOverwrites,\n _reverting,\n _context,\n _bigNum = 1e8,\n _tinyNum = 1 / _bigNum,\n _2PI = Math.PI * 2,\n _HALF_PI = _2PI / 4,\n _gsID = 0,\n _sqrt = Math.sqrt,\n _cos = Math.cos,\n _sin = Math.sin,\n _isString = function _isString(value) {\n return typeof value === \"string\";\n},\n _isFunction = function _isFunction(value) {\n return typeof value === \"function\";\n},\n _isNumber = function _isNumber(value) {\n return typeof value === \"number\";\n},\n _isUndefined = function _isUndefined(value) {\n return typeof value === \"undefined\";\n},\n _isObject = function _isObject(value) {\n return typeof value === \"object\";\n},\n _isNotFalse = function _isNotFalse(value) {\n return value !== false;\n},\n _windowExists = function _windowExists() {\n return typeof window !== \"undefined\";\n},\n _isFuncOrString = function _isFuncOrString(value) {\n return _isFunction(value) || _isString(value);\n},\n _isTypedArray = typeof ArrayBuffer === \"function\" && ArrayBuffer.isView || function () {},\n // note: IE10 has ArrayBuffer, but NOT ArrayBuffer.isView().\n_isArray = Array.isArray,\n _randomExp = /random\\([^)]+\\)/g,\n _commaDelimExp = /,\\s*/g,\n _strictNumExp = /(?:-?\\.?\\d|\\.)+/gi,\n //only numbers (including negatives and decimals) but NOT relative values.\n_numExp = /[-+=.]*\\d+[.e\\-+]*\\d*[e\\-+]*\\d*/g,\n //finds any numbers, including ones that start with += or -=, negative numbers, and ones in scientific notation like 1e-8.\n_numWithUnitExp = /[-+=.]*\\d+[.e-]*\\d*[a-z%]*/g,\n _complexStringNumExp = /[-+=.]*\\d+\\.?\\d*(?:e-|e\\+)?\\d*/gi,\n //duplicate so that while we're looping through matches from exec(), it doesn't contaminate the lastIndex of _numExp which we use to search for colors too.\n_relExp = /[+-]=-?[.\\d]+/,\n _delimitedValueExp = /[^,'\"\\[\\]\\s]+/gi,\n // previously /[#\\-+.]*\\b[a-z\\d\\-=+%.]+/gi but didn't catch special characters.\n_unitExp = /^[+\\-=e\\s\\d]*\\d+[.\\d]*([a-z]*|%)\\s*$/i,\n _globalTimeline,\n _win,\n _coreInitted,\n _doc,\n _globals = {},\n _installScope = {},\n _coreReady,\n _install = function _install(scope) {\n return (_installScope = _merge(scope, _globals)) && gsap;\n},\n _missingPlugin = function _missingPlugin(property, value) {\n return console.warn(\"Invalid property\", property, \"set to\", value, \"Missing plugin? gsap.registerPlugin()\");\n},\n _warn = function _warn(message, suppress) {\n return !suppress && console.warn(message);\n},\n _addGlobal = function _addGlobal(name, obj) {\n return name && (_globals[name] = obj) && _installScope && (_installScope[name] = obj) || _globals;\n},\n _emptyFunc = function _emptyFunc() {\n return 0;\n},\n _startAtRevertConfig = {\n suppressEvents: true,\n isStart: true,\n kill: false\n},\n _revertConfigNoKill = {\n suppressEvents: true,\n kill: false\n},\n _revertConfig = {\n suppressEvents: true\n},\n _reservedProps = {},\n _lazyTweens = [],\n _lazyLookup = {},\n _lastRenderedFrame,\n _plugins = {},\n _effects = {},\n _nextGCFrame = 30,\n _harnessPlugins = [],\n _callbackNames = \"\",\n _harness = function _harness(targets) {\n var target = targets[0],\n harnessPlugin,\n i;\n _isObject(target) || _isFunction(target) || (targets = [targets]);\n\n if (!(harnessPlugin = (target._gsap || {}).harness)) {\n // find the first target with a harness. We assume targets passed into an animation will be of similar type, meaning the same kind of harness can be used for them all (performance optimization)\n i = _harnessPlugins.length;\n\n while (i-- && !_harnessPlugins[i].targetTest(target)) {}\n\n harnessPlugin = _harnessPlugins[i];\n }\n\n i = targets.length;\n\n while (i--) {\n targets[i] && (targets[i]._gsap || (targets[i]._gsap = new GSCache(targets[i], harnessPlugin))) || targets.splice(i, 1);\n }\n\n return targets;\n},\n _getCache = function _getCache(target) {\n return target._gsap || _harness(toArray(target))[0]._gsap;\n},\n _getProperty = function _getProperty(target, property, v) {\n return (v = target[property]) && _isFunction(v) ? target[property]() : _isUndefined(v) && target.getAttribute && target.getAttribute(property) || v;\n},\n _forEachName = function _forEachName(names, func) {\n return (names = names.split(\",\")).forEach(func) || names;\n},\n //split a comma-delimited list of names into an array, then run a forEach() function and return the split array (this is just a way to consolidate/shorten some code).\n_round = function _round(value) {\n return Math.round(value * 100000) / 100000 || 0;\n},\n _roundPrecise = function _roundPrecise(value) {\n return Math.round(value * 10000000) / 10000000 || 0;\n},\n // increased precision mostly for timing values.\n_parseRelative = function _parseRelative(start, value) {\n var operator = value.charAt(0),\n end = parseFloat(value.substr(2));\n start = parseFloat(start);\n return operator === \"+\" ? start + end : operator === \"-\" ? start - end : operator === \"*\" ? start * end : start / end;\n},\n _arrayContainsAny = function _arrayContainsAny(toSearch, toFind) {\n //searches one array to find matches for any of the items in the toFind array. As soon as one is found, it returns true. It does NOT return all the matches; it's simply a boolean search.\n var l = toFind.length,\n i = 0;\n\n for (; toSearch.indexOf(toFind[i]) < 0 && ++i < l;) {}\n\n return i < l;\n},\n _lazyRender = function _lazyRender() {\n var l = _lazyTweens.length,\n a = _lazyTweens.slice(0),\n i,\n tween;\n\n _lazyLookup = {};\n _lazyTweens.length = 0;\n\n for (i = 0; i < l; i++) {\n tween = a[i];\n tween && tween._lazy && (tween.render(tween._lazy[0], tween._lazy[1], true)._lazy = 0);\n }\n},\n _isRevertWorthy = function _isRevertWorthy(animation) {\n return !!(animation._initted || animation._startAt || animation.add);\n},\n _lazySafeRender = function _lazySafeRender(animation, time, suppressEvents, force) {\n _lazyTweens.length && !_reverting && _lazyRender();\n animation.render(time, suppressEvents, force || !!(_reverting && time < 0 && _isRevertWorthy(animation)));\n _lazyTweens.length && !_reverting && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when someone calls seek() or time() or progress(), they expect an immediate render.\n},\n _numericIfPossible = function _numericIfPossible(value) {\n var n = parseFloat(value);\n return (n || n === 0) && (value + \"\").match(_delimitedValueExp).length < 2 ? n : _isString(value) ? value.trim() : value;\n},\n _passThrough = function _passThrough(p) {\n return p;\n},\n _setDefaults = function _setDefaults(obj, defaults) {\n for (var p in defaults) {\n p in obj || (obj[p] = defaults[p]);\n }\n\n return obj;\n},\n _setKeyframeDefaults = function _setKeyframeDefaults(excludeDuration) {\n return function (obj, defaults) {\n for (var p in defaults) {\n p in obj || p === \"duration\" && excludeDuration || p === \"ease\" || (obj[p] = defaults[p]);\n }\n };\n},\n _merge = function _merge(base, toMerge) {\n for (var p in toMerge) {\n base[p] = toMerge[p];\n }\n\n return base;\n},\n _mergeDeep = function _mergeDeep(base, toMerge) {\n for (var p in toMerge) {\n p !== \"__proto__\" && p !== \"constructor\" && p !== \"prototype\" && (base[p] = _isObject(toMerge[p]) ? _mergeDeep(base[p] || (base[p] = {}), toMerge[p]) : toMerge[p]);\n }\n\n return base;\n},\n _copyExcluding = function _copyExcluding(obj, excluding) {\n var copy = {},\n p;\n\n for (p in obj) {\n p in excluding || (copy[p] = obj[p]);\n }\n\n return copy;\n},\n _inheritDefaults = function _inheritDefaults(vars) {\n var parent = vars.parent || _globalTimeline,\n func = vars.keyframes ? _setKeyframeDefaults(_isArray(vars.keyframes)) : _setDefaults;\n\n if (_isNotFalse(vars.inherit)) {\n while (parent) {\n func(vars, parent.vars.defaults);\n parent = parent.parent || parent._dp;\n }\n }\n\n return vars;\n},\n _arraysMatch = function _arraysMatch(a1, a2) {\n var i = a1.length,\n match = i === a2.length;\n\n while (match && i-- && a1[i] === a2[i]) {}\n\n return i < 0;\n},\n _addLinkedListItem = function _addLinkedListItem(parent, child, firstProp, lastProp, sortBy) {\n if (firstProp === void 0) {\n firstProp = \"_first\";\n }\n\n if (lastProp === void 0) {\n lastProp = \"_last\";\n }\n\n var prev = parent[lastProp],\n t;\n\n if (sortBy) {\n t = child[sortBy];\n\n while (prev && prev[sortBy] > t) {\n prev = prev._prev;\n }\n }\n\n if (prev) {\n child._next = prev._next;\n prev._next = child;\n } else {\n child._next = parent[firstProp];\n parent[firstProp] = child;\n }\n\n if (child._next) {\n child._next._prev = child;\n } else {\n parent[lastProp] = child;\n }\n\n child._prev = prev;\n child.parent = child._dp = parent;\n return child;\n},\n _removeLinkedListItem = function _removeLinkedListItem(parent, child, firstProp, lastProp) {\n if (firstProp === void 0) {\n firstProp = \"_first\";\n }\n\n if (lastProp === void 0) {\n lastProp = \"_last\";\n }\n\n var prev = child._prev,\n next = child._next;\n\n if (prev) {\n prev._next = next;\n } else if (parent[firstProp] === child) {\n parent[firstProp] = next;\n }\n\n if (next) {\n next._prev = prev;\n } else if (parent[lastProp] === child) {\n parent[lastProp] = prev;\n }\n\n child._next = child._prev = child.parent = null; // don't delete the _dp just so we can revert if necessary. But parent should be null to indicate the item isn't in a linked list.\n},\n _removeFromParent = function _removeFromParent(child, onlyIfParentHasAutoRemove) {\n child.parent && (!onlyIfParentHasAutoRemove || child.parent.autoRemoveChildren) && child.parent.remove && child.parent.remove(child);\n child._act = 0;\n},\n _uncache = function _uncache(animation, child) {\n if (animation && (!child || child._end > animation._dur || child._start < 0)) {\n // performance optimization: if a child animation is passed in we should only uncache if that child EXTENDS the animation (its end time is beyond the end)\n var a = animation;\n\n while (a) {\n a._dirty = 1;\n a = a.parent;\n }\n }\n\n return animation;\n},\n _recacheAncestors = function _recacheAncestors(animation) {\n var parent = animation.parent;\n\n while (parent && parent.parent) {\n //sometimes we must force a re-sort of all children and update the duration/totalDuration of all ancestor timelines immediately in case, for example, in the middle of a render loop, one tween alters another tween's timeScale which shoves its startTime before 0, forcing the parent timeline to shift around and shiftChildren() which could affect that next tween's render (startTime). Doesn't matter for the root timeline though.\n parent._dirty = 1;\n parent.totalDuration();\n parent = parent.parent;\n }\n\n return animation;\n},\n _rewindStartAt = function _rewindStartAt(tween, totalTime, suppressEvents, force) {\n return tween._startAt && (_reverting ? tween._startAt.revert(_revertConfigNoKill) : tween.vars.immediateRender && !tween.vars.autoRevert || tween._startAt.render(totalTime, true, force));\n},\n _hasNoPausedAncestors = function _hasNoPausedAncestors(animation) {\n return !animation || animation._ts && _hasNoPausedAncestors(animation.parent);\n},\n _elapsedCycleDuration = function _elapsedCycleDuration(animation) {\n return animation._repeat ? _animationCycle(animation._tTime, animation = animation.duration() + animation._rDelay) * animation : 0;\n},\n // feed in the totalTime and cycleDuration and it'll return the cycle (iteration minus 1) and if the playhead is exactly at the very END, it will NOT bump up to the next cycle.\n_animationCycle = function _animationCycle(tTime, cycleDuration) {\n var whole = Math.floor(tTime = _roundPrecise(tTime / cycleDuration));\n return tTime && whole === tTime ? whole - 1 : whole;\n},\n _parentToChildTotalTime = function _parentToChildTotalTime(parentTime, child) {\n return (parentTime - child._start) * child._ts + (child._ts >= 0 ? 0 : child._dirty ? child.totalDuration() : child._tDur);\n},\n _setEnd = function _setEnd(animation) {\n return animation._end = _roundPrecise(animation._start + (animation._tDur / Math.abs(animation._ts || animation._rts || _tinyNum) || 0));\n},\n _alignPlayhead = function _alignPlayhead(animation, totalTime) {\n // adjusts the animation's _start and _end according to the provided totalTime (only if the parent's smoothChildTiming is true and the animation isn't paused). It doesn't do any rendering or forcing things back into parent timelines, etc. - that's what totalTime() is for.\n var parent = animation._dp;\n\n if (parent && parent.smoothChildTiming && animation._ts) {\n animation._start = _roundPrecise(parent._time - (animation._ts > 0 ? totalTime / animation._ts : ((animation._dirty ? animation.totalDuration() : animation._tDur) - totalTime) / -animation._ts));\n\n _setEnd(animation);\n\n parent._dirty || _uncache(parent, animation); //for performance improvement. If the parent's cache is already dirty, it already took care of marking the ancestors as dirty too, so skip the function call here.\n }\n\n return animation;\n},\n\n/*\n_totalTimeToTime = (clampedTotalTime, duration, repeat, repeatDelay, yoyo) => {\n\tlet cycleDuration = duration + repeatDelay,\n\t\ttime = _round(clampedTotalTime % cycleDuration);\n\tif (time > duration) {\n\t\ttime = duration;\n\t}\n\treturn (yoyo && (~~(clampedTotalTime / cycleDuration) & 1)) ? duration - time : time;\n},\n*/\n_postAddChecks = function _postAddChecks(timeline, child) {\n var t;\n\n if (child._time || !child._dur && child._initted || child._start < timeline._time && (child._dur || !child.add)) {\n // in case, for example, the _start is moved on a tween that has already rendered, or if it's being inserted into a timeline BEFORE where the playhead is currently. Imagine it's at its end state, then the startTime is moved WAY later (after the end of this timeline), it should render at its beginning. Special case: if it's a timeline (has .add() method) and no duration, we can skip rendering because the user may be populating it AFTER adding it to a parent timeline (unconventional, but possible, and we wouldn't want it to get removed if the parent's autoRemoveChildren is true).\n t = _parentToChildTotalTime(timeline.rawTime(), child);\n\n if (!child._dur || _clamp(0, child.totalDuration(), t) - child._tTime > _tinyNum) {\n child.render(t, true);\n }\n } //if the timeline has already ended but the inserted tween/timeline extends the duration, we should enable this timeline again so that it renders properly. We should also align the playhead with the parent timeline's when appropriate.\n\n\n if (_uncache(timeline, child)._dp && timeline._initted && timeline._time >= timeline._dur && timeline._ts) {\n //in case any of the ancestors had completed but should now be enabled...\n if (timeline._dur < timeline.duration()) {\n t = timeline;\n\n while (t._dp) {\n t.rawTime() >= 0 && t.totalTime(t._tTime); //moves the timeline (shifts its startTime) if necessary, and also enables it. If it's currently zero, though, it may not be scheduled to render until later so there's no need to force it to align with the current playhead position. Only move to catch up with the playhead.\n\n t = t._dp;\n }\n }\n\n timeline._zTime = -_tinyNum; // helps ensure that the next render() will be forced (crossingStart = true in render()), even if the duration hasn't changed (we're adding a child which would need to get rendered). Definitely an edge case. Note: we MUST do this AFTER the loop above where the totalTime() might trigger a render() because this _addToTimeline() method gets called from the Animation constructor, BEFORE tweens even record their targets, etc. so we wouldn't want things to get triggered in the wrong order.\n }\n},\n _addToTimeline = function _addToTimeline(timeline, child, position, skipChecks) {\n child.parent && _removeFromParent(child);\n child._start = _roundPrecise((_isNumber(position) ? position : position || timeline !== _globalTimeline ? _parsePosition(timeline, position, child) : timeline._time) + child._delay);\n child._end = _roundPrecise(child._start + (child.totalDuration() / Math.abs(child.timeScale()) || 0));\n\n _addLinkedListItem(timeline, child, \"_first\", \"_last\", timeline._sort ? \"_start\" : 0);\n\n _isFromOrFromStart(child) || (timeline._recent = child);\n skipChecks || _postAddChecks(timeline, child);\n timeline._ts < 0 && _alignPlayhead(timeline, timeline._tTime); // if the timeline is reversed and the new child makes it longer, we may need to adjust the parent's _start (push it back)\n\n return timeline;\n},\n _scrollTrigger = function _scrollTrigger(animation, trigger) {\n return (_globals.ScrollTrigger || _missingPlugin(\"scrollTrigger\", trigger)) && _globals.ScrollTrigger.create(trigger, animation);\n},\n _attemptInitTween = function _attemptInitTween(tween, time, force, suppressEvents, tTime) {\n _initTween(tween, time, tTime);\n\n if (!tween._initted) {\n return 1;\n }\n\n if (!force && tween._pt && !_reverting && (tween._dur && tween.vars.lazy !== false || !tween._dur && tween.vars.lazy) && _lastRenderedFrame !== _ticker.frame) {\n _lazyTweens.push(tween);\n\n tween._lazy = [tTime, suppressEvents];\n return 1;\n }\n},\n _parentPlayheadIsBeforeStart = function _parentPlayheadIsBeforeStart(_ref) {\n var parent = _ref.parent;\n return parent && parent._ts && parent._initted && !parent._lock && (parent.rawTime() < 0 || _parentPlayheadIsBeforeStart(parent));\n},\n // check parent's _lock because when a timeline repeats/yoyos and does its artificial wrapping, we shouldn't force the ratio back to 0\n_isFromOrFromStart = function _isFromOrFromStart(_ref2) {\n var data = _ref2.data;\n return data === \"isFromStart\" || data === \"isStart\";\n},\n _renderZeroDurationTween = function _renderZeroDurationTween(tween, totalTime, suppressEvents, force) {\n var prevRatio = tween.ratio,\n ratio = totalTime < 0 || !totalTime && (!tween._start && _parentPlayheadIsBeforeStart(tween) && !(!tween._initted && _isFromOrFromStart(tween)) || (tween._ts < 0 || tween._dp._ts < 0) && !_isFromOrFromStart(tween)) ? 0 : 1,\n // if the tween or its parent is reversed and the totalTime is 0, we should go to a ratio of 0. Edge case: if a from() or fromTo() stagger tween is placed later in a timeline, the \"startAt\" zero-duration tween could initially render at a time when the parent timeline's playhead is technically BEFORE where this tween is, so make sure that any \"from\" and \"fromTo\" startAt tweens are rendered the first time at a ratio of 1.\n repeatDelay = tween._rDelay,\n tTime = 0,\n pt,\n iteration,\n prevIteration;\n\n if (repeatDelay && tween._repeat) {\n // in case there's a zero-duration tween that has a repeat with a repeatDelay\n tTime = _clamp(0, tween._tDur, totalTime);\n iteration = _animationCycle(tTime, repeatDelay);\n tween._yoyo && iteration & 1 && (ratio = 1 - ratio);\n\n if (iteration !== _animationCycle(tween._tTime, repeatDelay)) {\n // if iteration changed\n prevRatio = 1 - ratio;\n tween.vars.repeatRefresh && tween._initted && tween.invalidate();\n }\n }\n\n if (ratio !== prevRatio || _reverting || force || tween._zTime === _tinyNum || !totalTime && tween._zTime) {\n if (!tween._initted && _attemptInitTween(tween, totalTime, force, suppressEvents, tTime)) {\n // if we render the very beginning (time == 0) of a fromTo(), we must force the render (normal tweens wouldn't need to render at a time of 0 when the prevTime was also 0). This is also mandatory to make sure overwriting kicks in immediately.\n return;\n }\n\n prevIteration = tween._zTime;\n tween._zTime = totalTime || (suppressEvents ? _tinyNum : 0); // when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect.\n\n suppressEvents || (suppressEvents = totalTime && !prevIteration); // if it was rendered previously at exactly 0 (_zTime) and now the playhead is moving away, DON'T fire callbacks otherwise they'll seem like duplicates.\n\n tween.ratio = ratio;\n tween._from && (ratio = 1 - ratio);\n tween._time = 0;\n tween._tTime = tTime;\n pt = tween._pt;\n\n while (pt) {\n pt.r(ratio, pt.d);\n pt = pt._next;\n }\n\n totalTime < 0 && _rewindStartAt(tween, totalTime, suppressEvents, true);\n tween._onUpdate && !suppressEvents && _callback(tween, \"onUpdate\");\n tTime && tween._repeat && !suppressEvents && tween.parent && _callback(tween, \"onRepeat\");\n\n if ((totalTime >= tween._tDur || totalTime < 0) && tween.ratio === ratio) {\n ratio && _removeFromParent(tween, 1);\n\n if (!suppressEvents && !_reverting) {\n _callback(tween, ratio ? \"onComplete\" : \"onReverseComplete\", true);\n\n tween._prom && tween._prom();\n }\n }\n } else if (!tween._zTime) {\n tween._zTime = totalTime;\n }\n},\n _findNextPauseTween = function _findNextPauseTween(animation, prevTime, time) {\n var child;\n\n if (time > prevTime) {\n child = animation._first;\n\n while (child && child._start <= time) {\n if (child.data === \"isPause\" && child._start > prevTime) {\n return child;\n }\n\n child = child._next;\n }\n } else {\n child = animation._last;\n\n while (child && child._start >= time) {\n if (child.data === \"isPause\" && child._start < prevTime) {\n return child;\n }\n\n child = child._prev;\n }\n }\n},\n _setDuration = function _setDuration(animation, duration, skipUncache, leavePlayhead) {\n var repeat = animation._repeat,\n dur = _roundPrecise(duration) || 0,\n totalProgress = animation._tTime / animation._tDur;\n totalProgress && !leavePlayhead && (animation._time *= dur / animation._dur);\n animation._dur = dur;\n animation._tDur = !repeat ? dur : repeat < 0 ? 1e10 : _roundPrecise(dur * (repeat + 1) + animation._rDelay * repeat);\n totalProgress > 0 && !leavePlayhead && _alignPlayhead(animation, animation._tTime = animation._tDur * totalProgress);\n animation.parent && _setEnd(animation);\n skipUncache || _uncache(animation.parent, animation);\n return animation;\n},\n _onUpdateTotalDuration = function _onUpdateTotalDuration(animation) {\n return animation instanceof Timeline ? _uncache(animation) : _setDuration(animation, animation._dur);\n},\n _zeroPosition = {\n _start: 0,\n endTime: _emptyFunc,\n totalDuration: _emptyFunc\n},\n _parsePosition = function _parsePosition(animation, position, percentAnimation) {\n var labels = animation.labels,\n recent = animation._recent || _zeroPosition,\n clippedDuration = animation.duration() >= _bigNum ? recent.endTime(false) : animation._dur,\n //in case there's a child that infinitely repeats, users almost never intend for the insertion point of a new child to be based on a SUPER long value like that so we clip it and assume the most recently-added child's endTime should be used instead.\n i,\n offset,\n isPercent;\n\n if (_isString(position) && (isNaN(position) || position in labels)) {\n //if the string is a number like \"1\", check to see if there's a label with that name, otherwise interpret it as a number (absolute value).\n offset = position.charAt(0);\n isPercent = position.substr(-1) === \"%\";\n i = position.indexOf(\"=\");\n\n if (offset === \"<\" || offset === \">\") {\n i >= 0 && (position = position.replace(/=/, \"\"));\n return (offset === \"<\" ? recent._start : recent.endTime(recent._repeat >= 0)) + (parseFloat(position.substr(1)) || 0) * (isPercent ? (i < 0 ? recent : percentAnimation).totalDuration() / 100 : 1);\n }\n\n if (i < 0) {\n position in labels || (labels[position] = clippedDuration);\n return labels[position];\n }\n\n offset = parseFloat(position.charAt(i - 1) + position.substr(i + 1));\n\n if (isPercent && percentAnimation) {\n offset = offset / 100 * (_isArray(percentAnimation) ? percentAnimation[0] : percentAnimation).totalDuration();\n }\n\n return i > 1 ? _parsePosition(animation, position.substr(0, i - 1), percentAnimation) + offset : clippedDuration + offset;\n }\n\n return position == null ? clippedDuration : +position;\n},\n _createTweenType = function _createTweenType(type, params, timeline) {\n var isLegacy = _isNumber(params[1]),\n varsIndex = (isLegacy ? 2 : 1) + (type < 2 ? 0 : 1),\n vars = params[varsIndex],\n irVars,\n parent;\n\n isLegacy && (vars.duration = params[1]);\n vars.parent = timeline;\n\n if (type) {\n irVars = vars;\n parent = timeline;\n\n while (parent && !(\"immediateRender\" in irVars)) {\n // inheritance hasn't happened yet, but someone may have set a default in an ancestor timeline. We could do vars.immediateRender = _isNotFalse(_inheritDefaults(vars).immediateRender) but that'd exact a slight performance penalty because _inheritDefaults() also runs in the Tween constructor. We're paying a small kb price here to gain speed.\n irVars = parent.vars.defaults || {};\n parent = _isNotFalse(parent.vars.inherit) && parent.parent;\n }\n\n vars.immediateRender = _isNotFalse(irVars.immediateRender);\n type < 2 ? vars.runBackwards = 1 : vars.startAt = params[varsIndex - 1]; // \"from\" vars\n }\n\n return new Tween(params[0], vars, params[varsIndex + 1]);\n},\n _conditionalReturn = function _conditionalReturn(value, func) {\n return value || value === 0 ? func(value) : func;\n},\n _clamp = function _clamp(min, max, value) {\n return value < min ? min : value > max ? max : value;\n},\n getUnit = function getUnit(value, v) {\n return !_isString(value) || !(v = _unitExp.exec(value)) ? \"\" : v[1];\n},\n // note: protect against padded numbers as strings, like \"100.100\". That shouldn't return \"00\" as the unit. If it's numeric, return no unit.\nclamp = function clamp(min, max, value) {\n return _conditionalReturn(value, function (v) {\n return _clamp(min, max, v);\n });\n},\n _slice = [].slice,\n _isArrayLike = function _isArrayLike(value, nonEmpty) {\n return value && _isObject(value) && \"length\" in value && (!nonEmpty && !value.length || value.length - 1 in value && _isObject(value[0])) && !value.nodeType && value !== _win;\n},\n _flatten = function _flatten(ar, leaveStrings, accumulator) {\n if (accumulator === void 0) {\n accumulator = [];\n }\n\n return ar.forEach(function (value) {\n var _accumulator;\n\n return _isString(value) && !leaveStrings || _isArrayLike(value, 1) ? (_accumulator = accumulator).push.apply(_accumulator, toArray(value)) : accumulator.push(value);\n }) || accumulator;\n},\n // takes any value and returns an Array. If it's a string (and leaveStrings isn't true), it'll use document.querySelectorAll() and convert that to an array. It'll also accept iterables like jQuery objects.\ntoArray = function toArray(value, scope, leaveStrings) {\n return _context && !scope && _context.selector ? _context.selector(value) : _isString(value) && !leaveStrings && (_coreInitted || !_wake()) ? _slice.call((scope || _doc).querySelectorAll(value), 0) : _isArray(value) ? _flatten(value, leaveStrings) : _isArrayLike(value) ? _slice.call(value, 0) : value ? [value] : [];\n},\n selector = function selector(value) {\n value = toArray(value)[0] || _warn(\"Invalid scope\") || {};\n return function (v) {\n var el = value.current || value.nativeElement || value;\n return toArray(v, el.querySelectorAll ? el : el === value ? _warn(\"Invalid scope\") || _doc.createElement(\"div\") : value);\n };\n},\n shuffle = function shuffle(a) {\n return a.sort(function () {\n return .5 - Math.random();\n });\n},\n // alternative that's a bit faster and more reliably diverse but bigger: for (let j, v, i = a.length; i; j = (Math.random() * i) | 0, v = a[--i], a[i] = a[j], a[j] = v); return a;\n// for distributing values across an Array. Can accept a number, a function or (most commonly) an object which can contain the following properties: {base, amount, from, ease, grid, axis, length, each}. Returns a function that expects the following parameters: index, target, array.\ndistribute = function distribute(v) {\n if (_isFunction(v)) {\n return v;\n }\n\n var vars = _isObject(v) ? v : {\n each: v\n },\n //n:1 is just to indicate v was a number; we leverage that later to set v according to the length we get. If a number is passed in, we treat it like the old stagger value where 0.1, for example, would mean that things would be distributed with 0.1 between each element in the array rather than a total \"amount\" that's chunked out among them all.\n ease = _parseEase(vars.ease),\n from = vars.from || 0,\n base = parseFloat(vars.base) || 0,\n cache = {},\n isDecimal = from > 0 && from < 1,\n ratios = isNaN(from) || isDecimal,\n axis = vars.axis,\n ratioX = from,\n ratioY = from;\n\n if (_isString(from)) {\n ratioX = ratioY = {\n center: .5,\n edges: .5,\n end: 1\n }[from] || 0;\n } else if (!isDecimal && ratios) {\n ratioX = from[0];\n ratioY = from[1];\n }\n\n return function (i, target, a) {\n var l = (a || vars).length,\n distances = cache[l],\n originX,\n originY,\n x,\n y,\n d,\n j,\n max,\n min,\n wrapAt;\n\n if (!distances) {\n wrapAt = vars.grid === \"auto\" ? 0 : (vars.grid || [1, _bigNum])[1];\n\n if (!wrapAt) {\n max = -_bigNum;\n\n while (max < (max = a[wrapAt++].getBoundingClientRect().left) && wrapAt < l) {}\n\n wrapAt < l && wrapAt--;\n }\n\n distances = cache[l] = [];\n originX = ratios ? Math.min(wrapAt, l) * ratioX - .5 : from % wrapAt;\n originY = wrapAt === _bigNum ? 0 : ratios ? l * ratioY / wrapAt - .5 : from / wrapAt | 0;\n max = 0;\n min = _bigNum;\n\n for (j = 0; j < l; j++) {\n x = j % wrapAt - originX;\n y = originY - (j / wrapAt | 0);\n distances[j] = d = !axis ? _sqrt(x * x + y * y) : Math.abs(axis === \"y\" ? y : x);\n d > max && (max = d);\n d < min && (min = d);\n }\n\n from === \"random\" && shuffle(distances);\n distances.max = max - min;\n distances.min = min;\n distances.v = l = (parseFloat(vars.amount) || parseFloat(vars.each) * (wrapAt > l ? l - 1 : !axis ? Math.max(wrapAt, l / wrapAt) : axis === \"y\" ? l / wrapAt : wrapAt) || 0) * (from === \"edges\" ? -1 : 1);\n distances.b = l < 0 ? base - l : base;\n distances.u = getUnit(vars.amount || vars.each) || 0; //unit\n\n ease = ease && l < 0 ? _invertEase(ease) : ease;\n }\n\n l = (distances[i] - distances.min) / distances.max || 0;\n return _roundPrecise(distances.b + (ease ? ease(l) : l) * distances.v) + distances.u; //round in order to work around floating point errors\n };\n},\n _roundModifier = function _roundModifier(v) {\n //pass in 0.1 get a function that'll round to the nearest tenth, or 5 to round to the closest 5, or 0.001 to the closest 1000th, etc.\n var p = Math.pow(10, ((v + \"\").split(\".\")[1] || \"\").length); //to avoid floating point math errors (like 24 * 0.1 == 2.4000000000000004), we chop off at a specific number of decimal places (much faster than toFixed())\n\n return function (raw) {\n var n = _roundPrecise(Math.round(parseFloat(raw) / v) * v * p);\n\n return (n - n % 1) / p + (_isNumber(raw) ? 0 : getUnit(raw)); // n - n % 1 replaces Math.floor() in order to handle negative values properly. For example, Math.floor(-150.00000000000003) is 151!\n };\n},\n snap = function snap(snapTo, value) {\n var isArray = _isArray(snapTo),\n radius,\n is2D;\n\n if (!isArray && _isObject(snapTo)) {\n radius = isArray = snapTo.radius || _bigNum;\n\n if (snapTo.values) {\n snapTo = toArray(snapTo.values);\n\n if (is2D = !_isNumber(snapTo[0])) {\n radius *= radius; //performance optimization so we don't have to Math.sqrt() in the loop.\n }\n } else {\n snapTo = _roundModifier(snapTo.increment);\n }\n }\n\n return _conditionalReturn(value, !isArray ? _roundModifier(snapTo) : _isFunction(snapTo) ? function (raw) {\n is2D = snapTo(raw);\n return Math.abs(is2D - raw) <= radius ? is2D : raw;\n } : function (raw) {\n var x = parseFloat(is2D ? raw.x : raw),\n y = parseFloat(is2D ? raw.y : 0),\n min = _bigNum,\n closest = 0,\n i = snapTo.length,\n dx,\n dy;\n\n while (i--) {\n if (is2D) {\n dx = snapTo[i].x - x;\n dy = snapTo[i].y - y;\n dx = dx * dx + dy * dy;\n } else {\n dx = Math.abs(snapTo[i] - x);\n }\n\n if (dx < min) {\n min = dx;\n closest = i;\n }\n }\n\n closest = !radius || min <= radius ? snapTo[closest] : raw;\n return is2D || closest === raw || _isNumber(raw) ? closest : closest + getUnit(raw);\n });\n},\n random = function random(min, max, roundingIncrement, returnFunction) {\n return _conditionalReturn(_isArray(min) ? !max : roundingIncrement === true ? !!(roundingIncrement = 0) : !returnFunction, function () {\n return _isArray(min) ? min[~~(Math.random() * min.length)] : (roundingIncrement = roundingIncrement || 1e-5) && (returnFunction = roundingIncrement < 1 ? Math.pow(10, (roundingIncrement + \"\").length - 2) : 1) && Math.floor(Math.round((min - roundingIncrement / 2 + Math.random() * (max - min + roundingIncrement * .99)) / roundingIncrement) * roundingIncrement * returnFunction) / returnFunction;\n });\n},\n pipe = function pipe() {\n for (var _len = arguments.length, functions = new Array(_len), _key = 0; _key < _len; _key++) {\n functions[_key] = arguments[_key];\n }\n\n return function (value) {\n return functions.reduce(function (v, f) {\n return f(v);\n }, value);\n };\n},\n unitize = function unitize(func, unit) {\n return function (value) {\n return func(parseFloat(value)) + (unit || getUnit(value));\n };\n},\n normalize = function normalize(min, max, value) {\n return mapRange(min, max, 0, 1, value);\n},\n _wrapArray = function _wrapArray(a, wrapper, value) {\n return _conditionalReturn(value, function (index) {\n return a[~~wrapper(index)];\n });\n},\n wrap = function wrap(min, max, value) {\n // NOTE: wrap() CANNOT be an arrow function! A very odd compiling bug causes problems (unrelated to GSAP).\n var range = max - min;\n return _isArray(min) ? _wrapArray(min, wrap(0, min.length), max) : _conditionalReturn(value, function (value) {\n return (range + (value - min) % range) % range + min;\n });\n},\n wrapYoyo = function wrapYoyo(min, max, value) {\n var range = max - min,\n total = range * 2;\n return _isArray(min) ? _wrapArray(min, wrapYoyo(0, min.length - 1), max) : _conditionalReturn(value, function (value) {\n value = (total + (value - min) % total) % total || 0;\n return min + (value > range ? total - value : value);\n });\n},\n _replaceRandom = function _replaceRandom(s) {\n return s.replace(_randomExp, function (match) {\n //replaces all occurrences of random(...) in a string with the calculated random value. can be a range like random(-100, 100, 5) or an array like random([0, 100, 500])\n var arIndex = match.indexOf(\"[\") + 1,\n values = match.substring(arIndex || 7, arIndex ? match.indexOf(\"]\") : match.length - 1).split(_commaDelimExp);\n return random(arIndex ? values : +values[0], arIndex ? 0 : +values[1], +values[2] || 1e-5);\n });\n},\n mapRange = function mapRange(inMin, inMax, outMin, outMax, value) {\n var inRange = inMax - inMin,\n outRange = outMax - outMin;\n return _conditionalReturn(value, function (value) {\n return outMin + ((value - inMin) / inRange * outRange || 0);\n });\n},\n interpolate = function interpolate(start, end, progress, mutate) {\n var func = isNaN(start + end) ? 0 : function (p) {\n return (1 - p) * start + p * end;\n };\n\n if (!func) {\n var isString = _isString(start),\n master = {},\n p,\n i,\n interpolators,\n l,\n il;\n\n progress === true && (mutate = 1) && (progress = null);\n\n if (isString) {\n start = {\n p: start\n };\n end = {\n p: end\n };\n } else if (_isArray(start) && !_isArray(end)) {\n interpolators = [];\n l = start.length;\n il = l - 2;\n\n for (i = 1; i < l; i++) {\n interpolators.push(interpolate(start[i - 1], start[i])); //build the interpolators up front as a performance optimization so that when the function is called many times, it can just reuse them.\n }\n\n l--;\n\n func = function func(p) {\n p *= l;\n var i = Math.min(il, ~~p);\n return interpolators[i](p - i);\n };\n\n progress = end;\n } else if (!mutate) {\n start = _merge(_isArray(start) ? [] : {}, start);\n }\n\n if (!interpolators) {\n for (p in end) {\n _addPropTween.call(master, start, p, \"get\", end[p]);\n }\n\n func = function func(p) {\n return _renderPropTweens(p, master) || (isString ? start.p : start);\n };\n }\n }\n\n return _conditionalReturn(progress, func);\n},\n _getLabelInDirection = function _getLabelInDirection(timeline, fromTime, backward) {\n //used for nextLabel() and previousLabel()\n var labels = timeline.labels,\n min = _bigNum,\n p,\n distance,\n label;\n\n for (p in labels) {\n distance = labels[p] - fromTime;\n\n if (distance < 0 === !!backward && distance && min > (distance = Math.abs(distance))) {\n label = p;\n min = distance;\n }\n }\n\n return label;\n},\n _callback = function _callback(animation, type, executeLazyFirst) {\n var v = animation.vars,\n callback = v[type],\n prevContext = _context,\n context = animation._ctx,\n params,\n scope,\n result;\n\n if (!callback) {\n return;\n }\n\n params = v[type + \"Params\"];\n scope = v.callbackScope || animation;\n executeLazyFirst && _lazyTweens.length && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when a timeline finishes, users expect things to have rendered fully. Imagine an onUpdate on a timeline that reports/checks tweened values.\n\n context && (_context = context);\n result = params ? callback.apply(scope, params) : callback.call(scope);\n _context = prevContext;\n return result;\n},\n _interrupt = function _interrupt(animation) {\n _removeFromParent(animation);\n\n animation.scrollTrigger && animation.scrollTrigger.kill(!!_reverting);\n animation.progress() < 1 && _callback(animation, \"onInterrupt\");\n return animation;\n},\n _quickTween,\n _registerPluginQueue = [],\n _createPlugin = function _createPlugin(config) {\n if (!config) return;\n config = !config.name && config[\"default\"] || config; // UMD packaging wraps things oddly, so for example MotionPathHelper becomes {MotionPathHelper:MotionPathHelper, default:MotionPathHelper}.\n\n if (_windowExists() || config.headless) {\n // edge case: some build tools may pass in a null/undefined value\n var name = config.name,\n isFunc = _isFunction(config),\n Plugin = name && !isFunc && config.init ? function () {\n this._props = [];\n } : config,\n //in case someone passes in an object that's not a plugin, like CustomEase\n instanceDefaults = {\n init: _emptyFunc,\n render: _renderPropTweens,\n add: _addPropTween,\n kill: _killPropTweensOf,\n modifier: _addPluginModifier,\n rawVars: 0\n },\n statics = {\n targetTest: 0,\n get: 0,\n getSetter: _getSetter,\n aliases: {},\n register: 0\n };\n\n _wake();\n\n if (config !== Plugin) {\n if (_plugins[name]) {\n return;\n }\n\n _setDefaults(Plugin, _setDefaults(_copyExcluding(config, instanceDefaults), statics)); //static methods\n\n\n _merge(Plugin.prototype, _merge(instanceDefaults, _copyExcluding(config, statics))); //instance methods\n\n\n _plugins[Plugin.prop = name] = Plugin;\n\n if (config.targetTest) {\n _harnessPlugins.push(Plugin);\n\n _reservedProps[name] = 1;\n }\n\n name = (name === \"css\" ? \"CSS\" : name.charAt(0).toUpperCase() + name.substr(1)) + \"Plugin\"; //for the global name. \"motionPath\" should become MotionPathPlugin\n }\n\n _addGlobal(name, Plugin);\n\n config.register && config.register(gsap, Plugin, PropTween);\n } else {\n _registerPluginQueue.push(config);\n }\n},\n\n/*\n * --------------------------------------------------------------------------------------\n * COLORS\n * --------------------------------------------------------------------------------------\n */\n_255 = 255,\n _colorLookup = {\n aqua: [0, _255, _255],\n lime: [0, _255, 0],\n silver: [192, 192, 192],\n black: [0, 0, 0],\n maroon: [128, 0, 0],\n teal: [0, 128, 128],\n blue: [0, 0, _255],\n navy: [0, 0, 128],\n white: [_255, _255, _255],\n olive: [128, 128, 0],\n yellow: [_255, _255, 0],\n orange: [_255, 165, 0],\n gray: [128, 128, 128],\n purple: [128, 0, 128],\n green: [0, 128, 0],\n red: [_255, 0, 0],\n pink: [_255, 192, 203],\n cyan: [0, _255, _255],\n transparent: [_255, _255, _255, 0]\n},\n // possible future idea to replace the hard-coded color name values - put this in the ticker.wake() where we set the _doc:\n// let ctx = _doc.createElement(\"canvas\").getContext(\"2d\");\n// _forEachName(\"aqua,lime,silver,black,maroon,teal,blue,navy,white,olive,yellow,orange,gray,purple,green,red,pink,cyan\", color => {ctx.fillStyle = color; _colorLookup[color] = splitColor(ctx.fillStyle)});\n_hue = function _hue(h, m1, m2) {\n h += h < 0 ? 1 : h > 1 ? -1 : 0;\n return (h * 6 < 1 ? m1 + (m2 - m1) * h * 6 : h < .5 ? m2 : h * 3 < 2 ? m1 + (m2 - m1) * (2 / 3 - h) * 6 : m1) * _255 + .5 | 0;\n},\n splitColor = function splitColor(v, toHSL, forceAlpha) {\n var a = !v ? _colorLookup.black : _isNumber(v) ? [v >> 16, v >> 8 & _255, v & _255] : 0,\n r,\n g,\n b,\n h,\n s,\n l,\n max,\n min,\n d,\n wasHSL;\n\n if (!a) {\n if (v.substr(-1) === \",\") {\n //sometimes a trailing comma is included and we should chop it off (typically from a comma-delimited list of values like a textShadow:\"2px 2px 2px blue, 5px 5px 5px rgb(255,0,0)\" - in this example \"blue,\" has a trailing comma. We could strip it out inside parseComplex() but we'd need to do it to the beginning and ending values plus it wouldn't provide protection from other potential scenarios like if the user passes in a similar value.\n v = v.substr(0, v.length - 1);\n }\n\n if (_colorLookup[v]) {\n a = _colorLookup[v];\n } else if (v.charAt(0) === \"#\") {\n if (v.length < 6) {\n //for shorthand like #9F0 or #9F0F (could have alpha)\n r = v.charAt(1);\n g = v.charAt(2);\n b = v.charAt(3);\n v = \"#\" + r + r + g + g + b + b + (v.length === 5 ? v.charAt(4) + v.charAt(4) : \"\");\n }\n\n if (v.length === 9) {\n // hex with alpha, like #fd5e53ff\n a = parseInt(v.substr(1, 6), 16);\n return [a >> 16, a >> 8 & _255, a & _255, parseInt(v.substr(7), 16) / 255];\n }\n\n v = parseInt(v.substr(1), 16);\n a = [v >> 16, v >> 8 & _255, v & _255];\n } else if (v.substr(0, 3) === \"hsl\") {\n a = wasHSL = v.match(_strictNumExp);\n\n if (!toHSL) {\n h = +a[0] % 360 / 360;\n s = +a[1] / 100;\n l = +a[2] / 100;\n g = l <= .5 ? l * (s + 1) : l + s - l * s;\n r = l * 2 - g;\n a.length > 3 && (a[3] *= 1); //cast as number\n\n a[0] = _hue(h + 1 / 3, r, g);\n a[1] = _hue(h, r, g);\n a[2] = _hue(h - 1 / 3, r, g);\n } else if (~v.indexOf(\"=\")) {\n //if relative values are found, just return the raw strings with the relative prefixes in place.\n a = v.match(_numExp);\n forceAlpha && a.length < 4 && (a[3] = 1);\n return a;\n }\n } else {\n a = v.match(_strictNumExp) || _colorLookup.transparent;\n }\n\n a = a.map(Number);\n }\n\n if (toHSL && !wasHSL) {\n r = a[0] / _255;\n g = a[1] / _255;\n b = a[2] / _255;\n max = Math.max(r, g, b);\n min = Math.min(r, g, b);\n l = (max + min) / 2;\n\n if (max === min) {\n h = s = 0;\n } else {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = max === r ? (g - b) / d + (g < b ? 6 : 0) : max === g ? (b - r) / d + 2 : (r - g) / d + 4;\n h *= 60;\n }\n\n a[0] = ~~(h + .5);\n a[1] = ~~(s * 100 + .5);\n a[2] = ~~(l * 100 + .5);\n }\n\n forceAlpha && a.length < 4 && (a[3] = 1);\n return a;\n},\n _colorOrderData = function _colorOrderData(v) {\n // strips out the colors from the string, finds all the numeric slots (with units) and returns an array of those. The Array also has a \"c\" property which is an Array of the index values where the colors belong. This is to help work around issues where there's a mis-matched order of color/numeric data like drop-shadow(#f00 0px 1px 2px) and drop-shadow(0x 1px 2px #f00). This is basically a helper function used in _formatColors()\n var values = [],\n c = [],\n i = -1;\n v.split(_colorExp).forEach(function (v) {\n var a = v.match(_numWithUnitExp) || [];\n values.push.apply(values, a);\n c.push(i += a.length + 1);\n });\n values.c = c;\n return values;\n},\n _formatColors = function _formatColors(s, toHSL, orderMatchData) {\n var result = \"\",\n colors = (s + result).match(_colorExp),\n type = toHSL ? \"hsla(\" : \"rgba(\",\n i = 0,\n c,\n shell,\n d,\n l;\n\n if (!colors) {\n return s;\n }\n\n colors = colors.map(function (color) {\n return (color = splitColor(color, toHSL, 1)) && type + (toHSL ? color[0] + \",\" + color[1] + \"%,\" + color[2] + \"%,\" + color[3] : color.join(\",\")) + \")\";\n });\n\n if (orderMatchData) {\n d = _colorOrderData(s);\n c = orderMatchData.c;\n\n if (c.join(result) !== d.c.join(result)) {\n shell = s.replace(_colorExp, \"1\").split(_numWithUnitExp);\n l = shell.length - 1;\n\n for (; i < l; i++) {\n result += shell[i] + (~c.indexOf(i) ? colors.shift() || type + \"0,0,0,0)\" : (d.length ? d : colors.length ? colors : orderMatchData).shift());\n }\n }\n }\n\n if (!shell) {\n shell = s.split(_colorExp);\n l = shell.length - 1;\n\n for (; i < l; i++) {\n result += shell[i] + colors[i];\n }\n }\n\n return result + shell[l];\n},\n _colorExp = function () {\n var s = \"(?:\\\\b(?:(?:rgb|rgba|hsl|hsla)\\\\(.+?\\\\))|\\\\B#(?:[0-9a-f]{3,4}){1,2}\\\\b\",\n //we'll dynamically build this Regular Expression to conserve file size. After building it, it will be able to find rgb(), rgba(), # (hexadecimal), and named color values like red, blue, purple, etc.,\n p;\n\n for (p in _colorLookup) {\n s += \"|\" + p + \"\\\\b\";\n }\n\n return new RegExp(s + \")\", \"gi\");\n}(),\n _hslExp = /hsl[a]?\\(/,\n _colorStringFilter = function _colorStringFilter(a) {\n var combined = a.join(\" \"),\n toHSL;\n _colorExp.lastIndex = 0;\n\n if (_colorExp.test(combined)) {\n toHSL = _hslExp.test(combined);\n a[1] = _formatColors(a[1], toHSL);\n a[0] = _formatColors(a[0], toHSL, _colorOrderData(a[1])); // make sure the order of numbers/colors match with the END value.\n\n return true;\n }\n},\n\n/*\n * --------------------------------------------------------------------------------------\n * TICKER\n * --------------------------------------------------------------------------------------\n */\n_tickerActive,\n _ticker = function () {\n var _getTime = Date.now,\n _lagThreshold = 500,\n _adjustedLag = 33,\n _startTime = _getTime(),\n _lastUpdate = _startTime,\n _gap = 1000 / 240,\n _nextTime = _gap,\n _listeners = [],\n _id,\n _req,\n _raf,\n _self,\n _delta,\n _i,\n _tick = function _tick(v) {\n var elapsed = _getTime() - _lastUpdate,\n manual = v === true,\n overlap,\n dispatch,\n time,\n frame;\n\n (elapsed > _lagThreshold || elapsed < 0) && (_startTime += elapsed - _adjustedLag);\n _lastUpdate += elapsed;\n time = _lastUpdate - _startTime;\n overlap = time - _nextTime;\n\n if (overlap > 0 || manual) {\n frame = ++_self.frame;\n _delta = time - _self.time * 1000;\n _self.time = time = time / 1000;\n _nextTime += overlap + (overlap >= _gap ? 4 : _gap - overlap);\n dispatch = 1;\n }\n\n manual || (_id = _req(_tick)); //make sure the request is made before we dispatch the \"tick\" event so that timing is maintained. Otherwise, if processing the \"tick\" requires a bunch of time (like 15ms) and we're using a setTimeout() that's based on 16.7ms, it'd technically take 31.7ms between frames otherwise.\n\n if (dispatch) {\n for (_i = 0; _i < _listeners.length; _i++) {\n // use _i and check _listeners.length instead of a variable because a listener could get removed during the loop, and if that happens to an element less than the current index, it'd throw things off in the loop.\n _listeners[_i](time, _delta, frame, v);\n }\n }\n };\n\n _self = {\n time: 0,\n frame: 0,\n tick: function tick() {\n _tick(true);\n },\n deltaRatio: function deltaRatio(fps) {\n return _delta / (1000 / (fps || 60));\n },\n wake: function wake() {\n if (_coreReady) {\n if (!_coreInitted && _windowExists()) {\n _win = _coreInitted = window;\n _doc = _win.document || {};\n _globals.gsap = gsap;\n (_win.gsapVersions || (_win.gsapVersions = [])).push(gsap.version);\n\n _install(_installScope || _win.GreenSockGlobals || !_win.gsap && _win || {});\n\n _registerPluginQueue.forEach(_createPlugin);\n }\n\n _raf = typeof requestAnimationFrame !== \"undefined\" && requestAnimationFrame;\n _id && _self.sleep();\n\n _req = _raf || function (f) {\n return setTimeout(f, _nextTime - _self.time * 1000 + 1 | 0);\n };\n\n _tickerActive = 1;\n\n _tick(2);\n }\n },\n sleep: function sleep() {\n (_raf ? cancelAnimationFrame : clearTimeout)(_id);\n _tickerActive = 0;\n _req = _emptyFunc;\n },\n lagSmoothing: function lagSmoothing(threshold, adjustedLag) {\n _lagThreshold = threshold || Infinity; // zero should be interpreted as basically unlimited\n\n _adjustedLag = Math.min(adjustedLag || 33, _lagThreshold);\n },\n fps: function fps(_fps) {\n _gap = 1000 / (_fps || 240);\n _nextTime = _self.time * 1000 + _gap;\n },\n add: function add(callback, once, prioritize) {\n var func = once ? function (t, d, f, v) {\n callback(t, d, f, v);\n\n _self.remove(func);\n } : callback;\n\n _self.remove(callback);\n\n _listeners[prioritize ? \"unshift\" : \"push\"](func);\n\n _wake();\n\n return func;\n },\n remove: function remove(callback, i) {\n ~(i = _listeners.indexOf(callback)) && _listeners.splice(i, 1) && _i >= i && _i--;\n },\n _listeners: _listeners\n };\n return _self;\n}(),\n _wake = function _wake() {\n return !_tickerActive && _ticker.wake();\n},\n //also ensures the core classes are initialized.\n\n/*\n* -------------------------------------------------\n* EASING\n* -------------------------------------------------\n*/\n_easeMap = {},\n _customEaseExp = /^[\\d.\\-M][\\d.\\-,\\s]/,\n _quotesExp = /[\"']/g,\n _parseObjectInString = function _parseObjectInString(value) {\n //takes a string like \"{wiggles:10, type:anticipate})\" and turns it into a real object. Notice it ends in \")\" and includes the {} wrappers. This is because we only use this function for parsing ease configs and prioritized optimization rather than reusability.\n var obj = {},\n split = value.substr(1, value.length - 3).split(\":\"),\n key = split[0],\n i = 1,\n l = split.length,\n index,\n val,\n parsedVal;\n\n for (; i < l; i++) {\n val = split[i];\n index = i !== l - 1 ? val.lastIndexOf(\",\") : val.length;\n parsedVal = val.substr(0, index);\n obj[key] = isNaN(parsedVal) ? parsedVal.replace(_quotesExp, \"\").trim() : +parsedVal;\n key = val.substr(index + 1).trim();\n }\n\n return obj;\n},\n _valueInParentheses = function _valueInParentheses(value) {\n var open = value.indexOf(\"(\") + 1,\n close = value.indexOf(\")\"),\n nested = value.indexOf(\"(\", open);\n return value.substring(open, ~nested && nested < close ? value.indexOf(\")\", close + 1) : close);\n},\n _configEaseFromString = function _configEaseFromString(name) {\n //name can be a string like \"elastic.out(1,0.5)\", and pass in _easeMap as obj and it'll parse it out and call the actual function like _easeMap.Elastic.easeOut.config(1,0.5). It will also parse custom ease strings as long as CustomEase is loaded and registered (internally as _easeMap._CE).\n var split = (name + \"\").split(\"(\"),\n ease = _easeMap[split[0]];\n return ease && split.length > 1 && ease.config ? ease.config.apply(null, ~name.indexOf(\"{\") ? [_parseObjectInString(split[1])] : _valueInParentheses(name).split(\",\").map(_numericIfPossible)) : _easeMap._CE && _customEaseExp.test(name) ? _easeMap._CE(\"\", name) : ease;\n},\n _invertEase = function _invertEase(ease) {\n return function (p) {\n return 1 - ease(1 - p);\n };\n},\n // allow yoyoEase to be set in children and have those affected when the parent/ancestor timeline yoyos.\n_propagateYoyoEase = function _propagateYoyoEase(timeline, isYoyo) {\n var child = timeline._first,\n ease;\n\n while (child) {\n if (child instanceof Timeline) {\n _propagateYoyoEase(child, isYoyo);\n } else if (child.vars.yoyoEase && (!child._yoyo || !child._repeat) && child._yoyo !== isYoyo) {\n if (child.timeline) {\n _propagateYoyoEase(child.timeline, isYoyo);\n } else {\n ease = child._ease;\n child._ease = child._yEase;\n child._yEase = ease;\n child._yoyo = isYoyo;\n }\n }\n\n child = child._next;\n }\n},\n _parseEase = function _parseEase(ease, defaultEase) {\n return !ease ? defaultEase : (_isFunction(ease) ? ease : _easeMap[ease] || _configEaseFromString(ease)) || defaultEase;\n},\n _insertEase = function _insertEase(names, easeIn, easeOut, easeInOut) {\n if (easeOut === void 0) {\n easeOut = function easeOut(p) {\n return 1 - easeIn(1 - p);\n };\n }\n\n if (easeInOut === void 0) {\n easeInOut = function easeInOut(p) {\n return p < .5 ? easeIn(p * 2) / 2 : 1 - easeIn((1 - p) * 2) / 2;\n };\n }\n\n var ease = {\n easeIn: easeIn,\n easeOut: easeOut,\n easeInOut: easeInOut\n },\n lowercaseName;\n\n _forEachName(names, function (name) {\n _easeMap[name] = _globals[name] = ease;\n _easeMap[lowercaseName = name.toLowerCase()] = easeOut;\n\n for (var p in ease) {\n _easeMap[lowercaseName + (p === \"easeIn\" ? \".in\" : p === \"easeOut\" ? \".out\" : \".inOut\")] = _easeMap[name + \".\" + p] = ease[p];\n }\n });\n\n return ease;\n},\n _easeInOutFromOut = function _easeInOutFromOut(easeOut) {\n return function (p) {\n return p < .5 ? (1 - easeOut(1 - p * 2)) / 2 : .5 + easeOut((p - .5) * 2) / 2;\n };\n},\n _configElastic = function _configElastic(type, amplitude, period) {\n var p1 = amplitude >= 1 ? amplitude : 1,\n //note: if amplitude is < 1, we simply adjust the period for a more natural feel. Otherwise the math doesn't work right and the curve starts at 1.\n p2 = (period || (type ? .3 : .45)) / (amplitude < 1 ? amplitude : 1),\n p3 = p2 / _2PI * (Math.asin(1 / p1) || 0),\n easeOut = function easeOut(p) {\n return p === 1 ? 1 : p1 * Math.pow(2, -10 * p) * _sin((p - p3) * p2) + 1;\n },\n ease = type === \"out\" ? easeOut : type === \"in\" ? function (p) {\n return 1 - easeOut(1 - p);\n } : _easeInOutFromOut(easeOut);\n\n p2 = _2PI / p2; //precalculate to optimize\n\n ease.config = function (amplitude, period) {\n return _configElastic(type, amplitude, period);\n };\n\n return ease;\n},\n _configBack = function _configBack(type, overshoot) {\n if (overshoot === void 0) {\n overshoot = 1.70158;\n }\n\n var easeOut = function easeOut(p) {\n return p ? --p * p * ((overshoot + 1) * p + overshoot) + 1 : 0;\n },\n ease = type === \"out\" ? easeOut : type === \"in\" ? function (p) {\n return 1 - easeOut(1 - p);\n } : _easeInOutFromOut(easeOut);\n\n ease.config = function (overshoot) {\n return _configBack(type, overshoot);\n };\n\n return ease;\n}; // a cheaper (kb and cpu) but more mild way to get a parameterized weighted ease by feeding in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear.\n// _weightedEase = ratio => {\n// \tlet y = 0.5 + ratio / 2;\n// \treturn p => (2 * (1 - p) * p * y + p * p);\n// },\n// a stronger (but more expensive kb/cpu) parameterized weighted ease that lets you feed in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear.\n// _weightedEaseStrong = ratio => {\n// \tratio = .5 + ratio / 2;\n// \tlet o = 1 / 3 * (ratio < .5 ? ratio : 1 - ratio),\n// \t\tb = ratio - o,\n// \t\tc = ratio + o;\n// \treturn p => p === 1 ? p : 3 * b * (1 - p) * (1 - p) * p + 3 * c * (1 - p) * p * p + p * p * p;\n// };\n\n\n_forEachName(\"Linear,Quad,Cubic,Quart,Quint,Strong\", function (name, i) {\n var power = i < 5 ? i + 1 : i;\n\n _insertEase(name + \",Power\" + (power - 1), i ? function (p) {\n return Math.pow(p, power);\n } : function (p) {\n return p;\n }, function (p) {\n return 1 - Math.pow(1 - p, power);\n }, function (p) {\n return p < .5 ? Math.pow(p * 2, power) / 2 : 1 - Math.pow((1 - p) * 2, power) / 2;\n });\n});\n\n_easeMap.Linear.easeNone = _easeMap.none = _easeMap.Linear.easeIn;\n\n_insertEase(\"Elastic\", _configElastic(\"in\"), _configElastic(\"out\"), _configElastic());\n\n(function (n, c) {\n var n1 = 1 / c,\n n2 = 2 * n1,\n n3 = 2.5 * n1,\n easeOut = function easeOut(p) {\n return p < n1 ? n * p * p : p < n2 ? n * Math.pow(p - 1.5 / c, 2) + .75 : p < n3 ? n * (p -= 2.25 / c) * p + .9375 : n * Math.pow(p - 2.625 / c, 2) + .984375;\n };\n\n _insertEase(\"Bounce\", function (p) {\n return 1 - easeOut(1 - p);\n }, easeOut);\n})(7.5625, 2.75);\n\n_insertEase(\"Expo\", function (p) {\n return Math.pow(2, 10 * (p - 1)) * p + p * p * p * p * p * p * (1 - p);\n}); // previously 2 ** (10 * (p - 1)) but that doesn't end up with the value quite at the right spot so we do a blended ease to ensure it lands where it should perfectly.\n\n\n_insertEase(\"Circ\", function (p) {\n return -(_sqrt(1 - p * p) - 1);\n});\n\n_insertEase(\"Sine\", function (p) {\n return p === 1 ? 1 : -_cos(p * _HALF_PI) + 1;\n});\n\n_insertEase(\"Back\", _configBack(\"in\"), _configBack(\"out\"), _configBack());\n\n_easeMap.SteppedEase = _easeMap.steps = _globals.SteppedEase = {\n config: function config(steps, immediateStart) {\n if (steps === void 0) {\n steps = 1;\n }\n\n var p1 = 1 / steps,\n p2 = steps + (immediateStart ? 0 : 1),\n p3 = immediateStart ? 1 : 0,\n max = 1 - _tinyNum;\n return function (p) {\n return ((p2 * _clamp(0, max, p) | 0) + p3) * p1;\n };\n }\n};\n_defaults.ease = _easeMap[\"quad.out\"];\n\n_forEachName(\"onComplete,onUpdate,onStart,onRepeat,onReverseComplete,onInterrupt\", function (name) {\n return _callbackNames += name + \",\" + name + \"Params,\";\n});\n/*\n * --------------------------------------------------------------------------------------\n * CACHE\n * --------------------------------------------------------------------------------------\n */\n\n\nexport var GSCache = function GSCache(target, harness) {\n this.id = _gsID++;\n target._gsap = this;\n this.target = target;\n this.harness = harness;\n this.get = harness ? harness.get : _getProperty;\n this.set = harness ? harness.getSetter : _getSetter;\n};\n/*\n * --------------------------------------------------------------------------------------\n * ANIMATION\n * --------------------------------------------------------------------------------------\n */\n\nexport var Animation = /*#__PURE__*/function () {\n function Animation(vars) {\n this.vars = vars;\n this._delay = +vars.delay || 0;\n\n if (this._repeat = vars.repeat === Infinity ? -2 : vars.repeat || 0) {\n // TODO: repeat: Infinity on a timeline's children must flag that timeline internally and affect its totalDuration, otherwise it'll stop in the negative direction when reaching the start.\n this._rDelay = vars.repeatDelay || 0;\n this._yoyo = !!vars.yoyo || !!vars.yoyoEase;\n }\n\n this._ts = 1;\n\n _setDuration(this, +vars.duration, 1, 1);\n\n this.data = vars.data;\n\n if (_context) {\n this._ctx = _context;\n\n _context.data.push(this);\n }\n\n _tickerActive || _ticker.wake();\n }\n\n var _proto = Animation.prototype;\n\n _proto.delay = function delay(value) {\n if (value || value === 0) {\n this.parent && this.parent.smoothChildTiming && this.startTime(this._start + value - this._delay);\n this._delay = value;\n return this;\n }\n\n return this._delay;\n };\n\n _proto.duration = function duration(value) {\n return arguments.length ? this.totalDuration(this._repeat > 0 ? value + (value + this._rDelay) * this._repeat : value) : this.totalDuration() && this._dur;\n };\n\n _proto.totalDuration = function totalDuration(value) {\n if (!arguments.length) {\n return this._tDur;\n }\n\n this._dirty = 0;\n return _setDuration(this, this._repeat < 0 ? value : (value - this._repeat * this._rDelay) / (this._repeat + 1));\n };\n\n _proto.totalTime = function totalTime(_totalTime, suppressEvents) {\n _wake();\n\n if (!arguments.length) {\n return this._tTime;\n }\n\n var parent = this._dp;\n\n if (parent && parent.smoothChildTiming && this._ts) {\n _alignPlayhead(this, _totalTime);\n\n !parent._dp || parent.parent || _postAddChecks(parent, this); // edge case: if this is a child of a timeline that already completed, for example, we must re-activate the parent.\n //in case any of the ancestor timelines had completed but should now be enabled, we should reset their totalTime() which will also ensure that they're lined up properly and enabled. Skip for animations that are on the root (wasteful). Example: a TimelineLite.exportRoot() is performed when there's a paused tween on the root, the export will not complete until that tween is unpaused, but imagine a child gets restarted later, after all [unpaused] tweens have completed. The start of that child would get pushed out, but one of the ancestors may have completed.\n\n while (parent && parent.parent) {\n if (parent.parent._time !== parent._start + (parent._ts >= 0 ? parent._tTime / parent._ts : (parent.totalDuration() - parent._tTime) / -parent._ts)) {\n parent.totalTime(parent._tTime, true);\n }\n\n parent = parent.parent;\n }\n\n if (!this.parent && this._dp.autoRemoveChildren && (this._ts > 0 && _totalTime < this._tDur || this._ts < 0 && _totalTime > 0 || !this._tDur && !_totalTime)) {\n //if the animation doesn't have a parent, put it back into its last parent (recorded as _dp for exactly cases like this). Limit to parents with autoRemoveChildren (like globalTimeline) so that if the user manually removes an animation from a timeline and then alters its playhead, it doesn't get added back in.\n _addToTimeline(this._dp, this, this._start - this._delay);\n }\n }\n\n if (this._tTime !== _totalTime || !this._dur && !suppressEvents || this._initted && Math.abs(this._zTime) === _tinyNum || !this._initted && this._dur && _totalTime || !_totalTime && !this._initted && (this.add || this._ptLookup)) {\n // check for _ptLookup on a Tween instance to ensure it has actually finished being instantiated, otherwise if this.reverse() gets called in the Animation constructor, it could trigger a render() here even though the _targets weren't populated, thus when _init() is called there won't be any PropTweens (it'll act like the tween is non-functional)\n this._ts || (this._pTime = _totalTime); // otherwise, if an animation is paused, then the playhead is moved back to zero, then resumed, it'd revert back to the original time at the pause\n //if (!this._lock) { // avoid endless recursion (not sure we need this yet or if it's worth the performance hit)\n // this._lock = 1;\n\n _lazySafeRender(this, _totalTime, suppressEvents); // this._lock = 0;\n //}\n\n }\n\n return this;\n };\n\n _proto.time = function time(value, suppressEvents) {\n return arguments.length ? this.totalTime(Math.min(this.totalDuration(), value + _elapsedCycleDuration(this)) % (this._dur + this._rDelay) || (value ? this._dur : 0), suppressEvents) : this._time; // note: if the modulus results in 0, the playhead could be exactly at the end or the beginning, and we always defer to the END with a non-zero value, otherwise if you set the time() to the very end (duration()), it would render at the START!\n };\n\n _proto.totalProgress = function totalProgress(value, suppressEvents) {\n return arguments.length ? this.totalTime(this.totalDuration() * value, suppressEvents) : this.totalDuration() ? Math.min(1, this._tTime / this._tDur) : this.rawTime() >= 0 && this._initted ? 1 : 0;\n };\n\n _proto.progress = function progress(value, suppressEvents) {\n return arguments.length ? this.totalTime(this.duration() * (this._yoyo && !(this.iteration() & 1) ? 1 - value : value) + _elapsedCycleDuration(this), suppressEvents) : this.duration() ? Math.min(1, this._time / this._dur) : this.rawTime() > 0 ? 1 : 0;\n };\n\n _proto.iteration = function iteration(value, suppressEvents) {\n var cycleDuration = this.duration() + this._rDelay;\n\n return arguments.length ? this.totalTime(this._time + (value - 1) * cycleDuration, suppressEvents) : this._repeat ? _animationCycle(this._tTime, cycleDuration) + 1 : 1;\n } // potential future addition:\n // isPlayingBackwards() {\n // \tlet animation = this,\n // \t\torientation = 1; // 1 = forward, -1 = backward\n // \twhile (animation) {\n // \t\torientation *= animation.reversed() || (animation.repeat() && !(animation.iteration() & 1)) ? -1 : 1;\n // \t\tanimation = animation.parent;\n // \t}\n // \treturn orientation < 0;\n // }\n ;\n\n _proto.timeScale = function timeScale(value, suppressEvents) {\n if (!arguments.length) {\n return this._rts === -_tinyNum ? 0 : this._rts; // recorded timeScale. Special case: if someone calls reverse() on an animation with timeScale of 0, we assign it -_tinyNum to remember it's reversed.\n }\n\n if (this._rts === value) {\n return this;\n }\n\n var tTime = this.parent && this._ts ? _parentToChildTotalTime(this.parent._time, this) : this._tTime; // make sure to do the parentToChildTotalTime() BEFORE setting the new _ts because the old one must be used in that calculation.\n // future addition? Up side: fast and minimal file size. Down side: only works on this animation; if a timeline is reversed, for example, its childrens' onReverse wouldn't get called.\n //(+value < 0 && this._rts >= 0) && _callback(this, \"onReverse\", true);\n // prioritize rendering where the parent's playhead lines up instead of this._tTime because there could be a tween that's animating another tween's timeScale in the same rendering loop (same parent), thus if the timeScale tween renders first, it would alter _start BEFORE _tTime was set on that tick (in the rendering loop), effectively freezing it until the timeScale tween finishes.\n\n this._rts = +value || 0;\n this._ts = this._ps || value === -_tinyNum ? 0 : this._rts; // _ts is the functional timeScale which would be 0 if the animation is paused.\n\n this.totalTime(_clamp(-Math.abs(this._delay), this.totalDuration(), tTime), suppressEvents !== false);\n\n _setEnd(this); // if parent.smoothChildTiming was false, the end time didn't get updated in the _alignPlayhead() method, so do it here.\n\n\n return _recacheAncestors(this);\n };\n\n _proto.paused = function paused(value) {\n if (!arguments.length) {\n return this._ps;\n } // possible future addition - if an animation is removed from its parent and then .restart() or .play() or .resume() is called, perhaps we should force it back into the globalTimeline but be careful because what if it's already at its end? We don't want it to just persist forever and not get released for GC.\n // !this.parent && !value && this._tTime < this._tDur && this !== _globalTimeline && _globalTimeline.add(this);\n\n\n if (this._ps !== value) {\n this._ps = value;\n\n if (value) {\n this._pTime = this._tTime || Math.max(-this._delay, this.rawTime()); // if the pause occurs during the delay phase, make sure that's factored in when resuming.\n\n this._ts = this._act = 0; // _ts is the functional timeScale, so a paused tween would effectively have a timeScale of 0. We record the \"real\" timeScale as _rts (recorded time scale)\n } else {\n _wake();\n\n this._ts = this._rts; //only defer to _pTime (pauseTime) if tTime is zero. Remember, someone could pause() an animation, then scrub the playhead and resume(). If the parent doesn't have smoothChildTiming, we render at the rawTime() because the startTime won't get updated.\n\n this.totalTime(this.parent && !this.parent.smoothChildTiming ? this.rawTime() : this._tTime || this._pTime, this.progress() === 1 && Math.abs(this._zTime) !== _tinyNum && (this._tTime -= _tinyNum)); // edge case: animation.progress(1).pause().play() wouldn't render again because the playhead is already at the end, but the call to totalTime() below will add it back to its parent...and not remove it again (since removing only happens upon rendering at a new time). Offsetting the _tTime slightly is done simply to cause the final render in totalTime() that'll pop it off its timeline (if autoRemoveChildren is true, of course). Check to make sure _zTime isn't -_tinyNum to avoid an edge case where the playhead is pushed to the end but INSIDE a tween/callback, the timeline itself is paused thus halting rendering and leaving a few unrendered. When resuming, it wouldn't render those otherwise.\n }\n }\n\n return this;\n };\n\n _proto.startTime = function startTime(value) {\n if (arguments.length) {\n this._start = _roundPrecise(value);\n var parent = this.parent || this._dp;\n parent && (parent._sort || !this.parent) && _addToTimeline(parent, this, this._start - this._delay);\n return this;\n }\n\n return this._start;\n };\n\n _proto.endTime = function endTime(includeRepeats) {\n return this._start + (_isNotFalse(includeRepeats) ? this.totalDuration() : this.duration()) / Math.abs(this._ts || 1);\n };\n\n _proto.rawTime = function rawTime(wrapRepeats) {\n var parent = this.parent || this._dp; // _dp = detached parent\n\n return !parent ? this._tTime : wrapRepeats && (!this._ts || this._repeat && this._time && this.totalProgress() < 1) ? this._tTime % (this._dur + this._rDelay) : !this._ts ? this._tTime : _parentToChildTotalTime(parent.rawTime(wrapRepeats), this);\n };\n\n _proto.revert = function revert(config) {\n if (config === void 0) {\n config = _revertConfig;\n }\n\n var prevIsReverting = _reverting;\n _reverting = config;\n\n if (_isRevertWorthy(this)) {\n this.timeline && this.timeline.revert(config);\n this.totalTime(-0.01, config.suppressEvents);\n }\n\n this.data !== \"nested\" && config.kill !== false && this.kill();\n _reverting = prevIsReverting;\n return this;\n };\n\n _proto.globalTime = function globalTime(rawTime) {\n var animation = this,\n time = arguments.length ? rawTime : animation.rawTime();\n\n while (animation) {\n time = animation._start + time / (Math.abs(animation._ts) || 1);\n animation = animation._dp;\n }\n\n return !this.parent && this._sat ? this._sat.globalTime(rawTime) : time; // the _startAt tweens for .fromTo() and .from() that have immediateRender should always be FIRST in the timeline (important for context.revert()). \"_sat\" stands for _startAtTween, referring to the parent tween that created the _startAt. We must discern if that tween had immediateRender so that we can know whether or not to prioritize it in revert().\n };\n\n _proto.repeat = function repeat(value) {\n if (arguments.length) {\n this._repeat = value === Infinity ? -2 : value;\n return _onUpdateTotalDuration(this);\n }\n\n return this._repeat === -2 ? Infinity : this._repeat;\n };\n\n _proto.repeatDelay = function repeatDelay(value) {\n if (arguments.length) {\n var time = this._time;\n this._rDelay = value;\n\n _onUpdateTotalDuration(this);\n\n return time ? this.time(time) : this;\n }\n\n return this._rDelay;\n };\n\n _proto.yoyo = function yoyo(value) {\n if (arguments.length) {\n this._yoyo = value;\n return this;\n }\n\n return this._yoyo;\n };\n\n _proto.seek = function seek(position, suppressEvents) {\n return this.totalTime(_parsePosition(this, position), _isNotFalse(suppressEvents));\n };\n\n _proto.restart = function restart(includeDelay, suppressEvents) {\n this.play().totalTime(includeDelay ? -this._delay : 0, _isNotFalse(suppressEvents));\n this._dur || (this._zTime = -_tinyNum); // ensures onComplete fires on a zero-duration animation that gets restarted.\n\n return this;\n };\n\n _proto.play = function play(from, suppressEvents) {\n from != null && this.seek(from, suppressEvents);\n return this.reversed(false).paused(false);\n };\n\n _proto.reverse = function reverse(from, suppressEvents) {\n from != null && this.seek(from || this.totalDuration(), suppressEvents);\n return this.reversed(true).paused(false);\n };\n\n _proto.pause = function pause(atTime, suppressEvents) {\n atTime != null && this.seek(atTime, suppressEvents);\n return this.paused(true);\n };\n\n _proto.resume = function resume() {\n return this.paused(false);\n };\n\n _proto.reversed = function reversed(value) {\n if (arguments.length) {\n !!value !== this.reversed() && this.timeScale(-this._rts || (value ? -_tinyNum : 0)); // in case timeScale is zero, reversing would have no effect so we use _tinyNum.\n\n return this;\n }\n\n return this._rts < 0;\n };\n\n _proto.invalidate = function invalidate() {\n this._initted = this._act = 0;\n this._zTime = -_tinyNum;\n return this;\n };\n\n _proto.isActive = function isActive() {\n var parent = this.parent || this._dp,\n start = this._start,\n rawTime;\n return !!(!parent || this._ts && this._initted && parent.isActive() && (rawTime = parent.rawTime(true)) >= start && rawTime < this.endTime(true) - _tinyNum);\n };\n\n _proto.eventCallback = function eventCallback(type, callback, params) {\n var vars = this.vars;\n\n if (arguments.length > 1) {\n if (!callback) {\n delete vars[type];\n } else {\n vars[type] = callback;\n params && (vars[type + \"Params\"] = params);\n type === \"onUpdate\" && (this._onUpdate = callback);\n }\n\n return this;\n }\n\n return vars[type];\n };\n\n _proto.then = function then(onFulfilled) {\n var self = this,\n prevProm = self._prom;\n return new Promise(function (resolve) {\n var f = _isFunction(onFulfilled) ? onFulfilled : _passThrough,\n _resolve = function _resolve() {\n var _then = self.then;\n self.then = null; // temporarily null the then() method to avoid an infinite loop (see https://github.com/greensock/GSAP/issues/322)\n\n prevProm && prevProm();\n _isFunction(f) && (f = f(self)) && (f.then || f === self) && (self.then = _then);\n resolve(f);\n self.then = _then;\n };\n\n if (self._initted && self.totalProgress() === 1 && self._ts >= 0 || !self._tTime && self._ts < 0) {\n _resolve();\n } else {\n self._prom = _resolve;\n }\n });\n };\n\n _proto.kill = function kill() {\n _interrupt(this);\n };\n\n return Animation;\n}();\n\n_setDefaults(Animation.prototype, {\n _time: 0,\n _start: 0,\n _end: 0,\n _tTime: 0,\n _tDur: 0,\n _dirty: 0,\n _repeat: 0,\n _yoyo: false,\n parent: null,\n _initted: false,\n _rDelay: 0,\n _ts: 1,\n _dp: 0,\n ratio: 0,\n _zTime: -_tinyNum,\n _prom: 0,\n _ps: false,\n _rts: 1\n});\n/*\n * -------------------------------------------------\n * TIMELINE\n * -------------------------------------------------\n */\n\n\nexport var Timeline = /*#__PURE__*/function (_Animation) {\n _inheritsLoose(Timeline, _Animation);\n\n function Timeline(vars, position) {\n var _this;\n\n if (vars === void 0) {\n vars = {};\n }\n\n _this = _Animation.call(this, vars) || this;\n _this.labels = {};\n _this.smoothChildTiming = !!vars.smoothChildTiming;\n _this.autoRemoveChildren = !!vars.autoRemoveChildren;\n _this._sort = _isNotFalse(vars.sortChildren);\n _globalTimeline && _addToTimeline(vars.parent || _globalTimeline, _assertThisInitialized(_this), position);\n vars.reversed && _this.reverse();\n vars.paused && _this.paused(true);\n vars.scrollTrigger && _scrollTrigger(_assertThisInitialized(_this), vars.scrollTrigger);\n return _this;\n }\n\n var _proto2 = Timeline.prototype;\n\n _proto2.to = function to(targets, vars, position) {\n _createTweenType(0, arguments, this);\n\n return this;\n };\n\n _proto2.from = function from(targets, vars, position) {\n _createTweenType(1, arguments, this);\n\n return this;\n };\n\n _proto2.fromTo = function fromTo(targets, fromVars, toVars, position) {\n _createTweenType(2, arguments, this);\n\n return this;\n };\n\n _proto2.set = function set(targets, vars, position) {\n vars.duration = 0;\n vars.parent = this;\n _inheritDefaults(vars).repeatDelay || (vars.repeat = 0);\n vars.immediateRender = !!vars.immediateRender;\n new Tween(targets, vars, _parsePosition(this, position), 1);\n return this;\n };\n\n _proto2.call = function call(callback, params, position) {\n return _addToTimeline(this, Tween.delayedCall(0, callback, params), position);\n } //ONLY for backward compatibility! Maybe delete?\n ;\n\n _proto2.staggerTo = function staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) {\n vars.duration = duration;\n vars.stagger = vars.stagger || stagger;\n vars.onComplete = onCompleteAll;\n vars.onCompleteParams = onCompleteAllParams;\n vars.parent = this;\n new Tween(targets, vars, _parsePosition(this, position));\n return this;\n };\n\n _proto2.staggerFrom = function staggerFrom(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) {\n vars.runBackwards = 1;\n _inheritDefaults(vars).immediateRender = _isNotFalse(vars.immediateRender);\n return this.staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams);\n };\n\n _proto2.staggerFromTo = function staggerFromTo(targets, duration, fromVars, toVars, stagger, position, onCompleteAll, onCompleteAllParams) {\n toVars.startAt = fromVars;\n _inheritDefaults(toVars).immediateRender = _isNotFalse(toVars.immediateRender);\n return this.staggerTo(targets, duration, toVars, stagger, position, onCompleteAll, onCompleteAllParams);\n };\n\n _proto2.render = function render(totalTime, suppressEvents, force) {\n var prevTime = this._time,\n tDur = this._dirty ? this.totalDuration() : this._tDur,\n dur = this._dur,\n tTime = totalTime <= 0 ? 0 : _roundPrecise(totalTime),\n // if a paused timeline is resumed (or its _start is updated for another reason...which rounds it), that could result in the playhead shifting a **tiny** amount and a zero-duration child at that spot may get rendered at a different ratio, like its totalTime in render() may be 1e-17 instead of 0, for example.\n crossingStart = this._zTime < 0 !== totalTime < 0 && (this._initted || !dur),\n time,\n child,\n next,\n iteration,\n cycleDuration,\n prevPaused,\n pauseTween,\n timeScale,\n prevStart,\n prevIteration,\n yoyo,\n isYoyo;\n this !== _globalTimeline && tTime > tDur && totalTime >= 0 && (tTime = tDur);\n\n if (tTime !== this._tTime || force || crossingStart) {\n if (prevTime !== this._time && dur) {\n //if totalDuration() finds a child with a negative startTime and smoothChildTiming is true, things get shifted around internally so we need to adjust the time accordingly. For example, if a tween starts at -30 we must shift EVERYTHING forward 30 seconds and move this timeline's startTime backward by 30 seconds so that things align with the playhead (no jump).\n tTime += this._time - prevTime;\n totalTime += this._time - prevTime;\n }\n\n time = tTime;\n prevStart = this._start;\n timeScale = this._ts;\n prevPaused = !timeScale;\n\n if (crossingStart) {\n dur || (prevTime = this._zTime); //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration timeline, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect.\n\n (totalTime || !suppressEvents) && (this._zTime = totalTime);\n }\n\n if (this._repeat) {\n //adjust the time for repeats and yoyos\n yoyo = this._yoyo;\n cycleDuration = dur + this._rDelay;\n\n if (this._repeat < -1 && totalTime < 0) {\n return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force);\n }\n\n time = _roundPrecise(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!)\n\n if (tTime === tDur) {\n // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't)\n iteration = this._repeat;\n time = dur;\n } else {\n prevIteration = _roundPrecise(tTime / cycleDuration); // full decimal version of iterations, not the previous iteration (we're reusing prevIteration variable for efficiency)\n\n iteration = ~~prevIteration;\n\n if (iteration && iteration === prevIteration) {\n time = dur;\n iteration--;\n }\n\n time > dur && (time = dur);\n }\n\n prevIteration = _animationCycle(this._tTime, cycleDuration);\n !prevTime && this._tTime && prevIteration !== iteration && this._tTime - prevIteration * cycleDuration - this._dur <= 0 && (prevIteration = iteration); // edge case - if someone does addPause() at the very beginning of a repeating timeline, that pause is technically at the same spot as the end which causes this._time to get set to 0 when the totalTime would normally place the playhead at the end. See https://gsap.com/forums/topic/23823-closing-nav-animation-not-working-on-ie-and-iphone-6-maybe-other-older-browser/?tab=comments#comment-113005 also, this._tTime - prevIteration * cycleDuration - this._dur <= 0 just checks to make sure it wasn't previously in the \"repeatDelay\" portion\n\n if (yoyo && iteration & 1) {\n time = dur - time;\n isYoyo = 1;\n }\n /*\n make sure children at the end/beginning of the timeline are rendered properly. If, for example,\n a 3-second long timeline rendered at 2.9 seconds previously, and now renders at 3.2 seconds (which\n would get translated to 2.8 seconds if the timeline yoyos or 0.2 seconds if it just repeats), there\n could be a callback or a short tween that's at 2.95 or 3 seconds in which wouldn't render. So\n we need to push the timeline to the end (and/or beginning depending on its yoyo value). Also we must\n ensure that zero-duration tweens at the very beginning or end of the Timeline work.\n */\n\n\n if (iteration !== prevIteration && !this._lock) {\n var rewinding = yoyo && prevIteration & 1,\n doesWrap = rewinding === (yoyo && iteration & 1);\n iteration < prevIteration && (rewinding = !rewinding);\n prevTime = rewinding ? 0 : tTime % dur ? dur : tTime; // if the playhead is landing exactly at the end of an iteration, use that totalTime rather than only the duration, otherwise it'll skip the 2nd render since it's effectively at the same time.\n\n this._lock = 1;\n this.render(prevTime || (isYoyo ? 0 : _roundPrecise(iteration * cycleDuration)), suppressEvents, !dur)._lock = 0;\n this._tTime = tTime; // if a user gets the iteration() inside the onRepeat, for example, it should be accurate.\n\n !suppressEvents && this.parent && _callback(this, \"onRepeat\");\n\n if (this.vars.repeatRefresh && !isYoyo) {\n this.invalidate()._lock = 1;\n prevIteration = iteration; // otherwise, the onStart() may fire on the 2nd iteration.\n }\n\n if (prevTime && prevTime !== this._time || prevPaused !== !this._ts || this.vars.onRepeat && !this.parent && !this._act) {\n // if prevTime is 0 and we render at the very end, _time will be the end, thus won't match. So in this edge case, prevTime won't match _time but that's okay. If it gets killed in the onRepeat, eject as well.\n return this;\n }\n\n dur = this._dur; // in case the duration changed in the onRepeat\n\n tDur = this._tDur;\n\n if (doesWrap) {\n this._lock = 2;\n prevTime = rewinding ? dur : -0.0001;\n this.render(prevTime, true);\n this.vars.repeatRefresh && !isYoyo && this.invalidate();\n }\n\n this._lock = 0;\n\n if (!this._ts && !prevPaused) {\n return this;\n } //in order for yoyoEase to work properly when there's a stagger, we must swap out the ease in each sub-tween.\n\n\n _propagateYoyoEase(this, isYoyo);\n }\n }\n\n if (this._hasPause && !this._forcing && this._lock < 2) {\n pauseTween = _findNextPauseTween(this, _roundPrecise(prevTime), _roundPrecise(time));\n\n if (pauseTween) {\n tTime -= time - (time = pauseTween._start);\n }\n }\n\n this._tTime = tTime;\n this._time = time;\n this._act = !timeScale; //as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick.\n\n if (!this._initted) {\n this._onUpdate = this.vars.onUpdate;\n this._initted = 1;\n this._zTime = totalTime;\n prevTime = 0; // upon init, the playhead should always go forward; someone could invalidate() a completed timeline and then if they restart(), that would make child tweens render in reverse order which could lock in the wrong starting values if they build on each other, like tl.to(obj, {x: 100}).to(obj, {x: 0}).\n }\n\n if (!prevTime && tTime && dur && !suppressEvents && !prevIteration) {\n _callback(this, \"onStart\");\n\n if (this._tTime !== tTime) {\n // in case the onStart triggered a render at a different spot, eject. Like if someone did animation.pause(0.5) or something inside the onStart.\n return this;\n }\n }\n\n if (time >= prevTime && totalTime >= 0) {\n child = this._first;\n\n while (child) {\n next = child._next;\n\n if ((child._act || time >= child._start) && child._ts && pauseTween !== child) {\n if (child.parent !== this) {\n // an extreme edge case - the child's render could do something like kill() the \"next\" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe.\n return this.render(totalTime, suppressEvents, force);\n }\n\n child.render(child._ts > 0 ? (time - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (time - child._start) * child._ts, suppressEvents, force);\n\n if (time !== this._time || !this._ts && !prevPaused) {\n //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete\n pauseTween = 0;\n next && (tTime += this._zTime = -_tinyNum); // it didn't finish rendering, so flag zTime as negative so that the next time render() is called it'll be forced (to render any remaining children)\n\n break;\n }\n }\n\n child = next;\n }\n } else {\n child = this._last;\n var adjustedTime = totalTime < 0 ? totalTime : time; //when the playhead goes backward beyond the start of this timeline, we must pass that information down to the child animations so that zero-duration tweens know whether to render their starting or ending values.\n\n while (child) {\n next = child._prev;\n\n if ((child._act || adjustedTime <= child._end) && child._ts && pauseTween !== child) {\n if (child.parent !== this) {\n // an extreme edge case - the child's render could do something like kill() the \"next\" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe.\n return this.render(totalTime, suppressEvents, force);\n }\n\n child.render(child._ts > 0 ? (adjustedTime - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (adjustedTime - child._start) * child._ts, suppressEvents, force || _reverting && _isRevertWorthy(child)); // if reverting, we should always force renders of initted tweens (but remember that .fromTo() or .from() may have a _startAt but not _initted yet). If, for example, a .fromTo() tween with a stagger (which creates an internal timeline) gets reverted BEFORE some of its child tweens render for the first time, it may not properly trigger them to revert.\n\n if (time !== this._time || !this._ts && !prevPaused) {\n //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete\n pauseTween = 0;\n next && (tTime += this._zTime = adjustedTime ? -_tinyNum : _tinyNum); // it didn't finish rendering, so adjust zTime so that so that the next time render() is called it'll be forced (to render any remaining children)\n\n break;\n }\n }\n\n child = next;\n }\n }\n\n if (pauseTween && !suppressEvents) {\n this.pause();\n pauseTween.render(time >= prevTime ? 0 : -_tinyNum)._zTime = time >= prevTime ? 1 : -1;\n\n if (this._ts) {\n //the callback resumed playback! So since we may have held back the playhead due to where the pause is positioned, go ahead and jump to where it's SUPPOSED to be (if no pause happened).\n this._start = prevStart; //if the pause was at an earlier time and the user resumed in the callback, it could reposition the timeline (changing its startTime), throwing things off slightly, so we make sure the _start doesn't shift.\n\n _setEnd(this);\n\n return this.render(totalTime, suppressEvents, force);\n }\n }\n\n this._onUpdate && !suppressEvents && _callback(this, \"onUpdate\", true);\n if (tTime === tDur && this._tTime >= this.totalDuration() || !tTime && prevTime) if (prevStart === this._start || Math.abs(timeScale) !== Math.abs(this._ts)) if (!this._lock) {\n // remember, a child's callback may alter this timeline's playhead or timeScale which is why we need to add some of these checks.\n (totalTime || !dur) && (tTime === tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1); // don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative.\n\n if (!suppressEvents && !(totalTime < 0 && !prevTime) && (tTime || prevTime || !tDur)) {\n _callback(this, tTime === tDur && totalTime >= 0 ? \"onComplete\" : \"onReverseComplete\", true);\n\n this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom();\n }\n }\n }\n\n return this;\n };\n\n _proto2.add = function add(child, position) {\n var _this2 = this;\n\n _isNumber(position) || (position = _parsePosition(this, position, child));\n\n if (!(child instanceof Animation)) {\n if (_isArray(child)) {\n child.forEach(function (obj) {\n return _this2.add(obj, position);\n });\n return this;\n }\n\n if (_isString(child)) {\n return this.addLabel(child, position);\n }\n\n if (_isFunction(child)) {\n child = Tween.delayedCall(0, child);\n } else {\n return this;\n }\n }\n\n return this !== child ? _addToTimeline(this, child, position) : this; //don't allow a timeline to be added to itself as a child!\n };\n\n _proto2.getChildren = function getChildren(nested, tweens, timelines, ignoreBeforeTime) {\n if (nested === void 0) {\n nested = true;\n }\n\n if (tweens === void 0) {\n tweens = true;\n }\n\n if (timelines === void 0) {\n timelines = true;\n }\n\n if (ignoreBeforeTime === void 0) {\n ignoreBeforeTime = -_bigNum;\n }\n\n var a = [],\n child = this._first;\n\n while (child) {\n if (child._start >= ignoreBeforeTime) {\n if (child instanceof Tween) {\n tweens && a.push(child);\n } else {\n timelines && a.push(child);\n nested && a.push.apply(a, child.getChildren(true, tweens, timelines));\n }\n }\n\n child = child._next;\n }\n\n return a;\n };\n\n _proto2.getById = function getById(id) {\n var animations = this.getChildren(1, 1, 1),\n i = animations.length;\n\n while (i--) {\n if (animations[i].vars.id === id) {\n return animations[i];\n }\n }\n };\n\n _proto2.remove = function remove(child) {\n if (_isString(child)) {\n return this.removeLabel(child);\n }\n\n if (_isFunction(child)) {\n return this.killTweensOf(child);\n }\n\n child.parent === this && _removeLinkedListItem(this, child);\n\n if (child === this._recent) {\n this._recent = this._last;\n }\n\n return _uncache(this);\n };\n\n _proto2.totalTime = function totalTime(_totalTime2, suppressEvents) {\n if (!arguments.length) {\n return this._tTime;\n }\n\n this._forcing = 1;\n\n if (!this._dp && this._ts) {\n //special case for the global timeline (or any other that has no parent or detached parent).\n this._start = _roundPrecise(_ticker.time - (this._ts > 0 ? _totalTime2 / this._ts : (this.totalDuration() - _totalTime2) / -this._ts));\n }\n\n _Animation.prototype.totalTime.call(this, _totalTime2, suppressEvents);\n\n this._forcing = 0;\n return this;\n };\n\n _proto2.addLabel = function addLabel(label, position) {\n this.labels[label] = _parsePosition(this, position);\n return this;\n };\n\n _proto2.removeLabel = function removeLabel(label) {\n delete this.labels[label];\n return this;\n };\n\n _proto2.addPause = function addPause(position, callback, params) {\n var t = Tween.delayedCall(0, callback || _emptyFunc, params);\n t.data = \"isPause\";\n this._hasPause = 1;\n return _addToTimeline(this, t, _parsePosition(this, position));\n };\n\n _proto2.removePause = function removePause(position) {\n var child = this._first;\n position = _parsePosition(this, position);\n\n while (child) {\n if (child._start === position && child.data === \"isPause\") {\n _removeFromParent(child);\n }\n\n child = child._next;\n }\n };\n\n _proto2.killTweensOf = function killTweensOf(targets, props, onlyActive) {\n var tweens = this.getTweensOf(targets, onlyActive),\n i = tweens.length;\n\n while (i--) {\n _overwritingTween !== tweens[i] && tweens[i].kill(targets, props);\n }\n\n return this;\n };\n\n _proto2.getTweensOf = function getTweensOf(targets, onlyActive) {\n var a = [],\n parsedTargets = toArray(targets),\n child = this._first,\n isGlobalTime = _isNumber(onlyActive),\n // a number is interpreted as a global time. If the animation spans\n children;\n\n while (child) {\n if (child instanceof Tween) {\n if (_arrayContainsAny(child._targets, parsedTargets) && (isGlobalTime ? (!_overwritingTween || child._initted && child._ts) && child.globalTime(0) <= onlyActive && child.globalTime(child.totalDuration()) > onlyActive : !onlyActive || child.isActive())) {\n // note: if this is for overwriting, it should only be for tweens that aren't paused and are initted.\n a.push(child);\n }\n } else if ((children = child.getTweensOf(parsedTargets, onlyActive)).length) {\n a.push.apply(a, children);\n }\n\n child = child._next;\n }\n\n return a;\n } // potential future feature - targets() on timelines\n // targets() {\n // \tlet result = [];\n // \tthis.getChildren(true, true, false).forEach(t => result.push(...t.targets()));\n // \treturn result.filter((v, i) => result.indexOf(v) === i);\n // }\n ;\n\n _proto2.tweenTo = function tweenTo(position, vars) {\n vars = vars || {};\n\n var tl = this,\n endTime = _parsePosition(tl, position),\n _vars = vars,\n startAt = _vars.startAt,\n _onStart = _vars.onStart,\n onStartParams = _vars.onStartParams,\n immediateRender = _vars.immediateRender,\n initted,\n tween = Tween.to(tl, _setDefaults({\n ease: vars.ease || \"none\",\n lazy: false,\n immediateRender: false,\n time: endTime,\n overwrite: \"auto\",\n duration: vars.duration || Math.abs((endTime - (startAt && \"time\" in startAt ? startAt.time : tl._time)) / tl.timeScale()) || _tinyNum,\n onStart: function onStart() {\n tl.pause();\n\n if (!initted) {\n var duration = vars.duration || Math.abs((endTime - (startAt && \"time\" in startAt ? startAt.time : tl._time)) / tl.timeScale());\n tween._dur !== duration && _setDuration(tween, duration, 0, 1).render(tween._time, true, true);\n initted = 1;\n }\n\n _onStart && _onStart.apply(tween, onStartParams || []); //in case the user had an onStart in the vars - we don't want to overwrite it.\n }\n }, vars));\n\n return immediateRender ? tween.render(0) : tween;\n };\n\n _proto2.tweenFromTo = function tweenFromTo(fromPosition, toPosition, vars) {\n return this.tweenTo(toPosition, _setDefaults({\n startAt: {\n time: _parsePosition(this, fromPosition)\n }\n }, vars));\n };\n\n _proto2.recent = function recent() {\n return this._recent;\n };\n\n _proto2.nextLabel = function nextLabel(afterTime) {\n if (afterTime === void 0) {\n afterTime = this._time;\n }\n\n return _getLabelInDirection(this, _parsePosition(this, afterTime));\n };\n\n _proto2.previousLabel = function previousLabel(beforeTime) {\n if (beforeTime === void 0) {\n beforeTime = this._time;\n }\n\n return _getLabelInDirection(this, _parsePosition(this, beforeTime), 1);\n };\n\n _proto2.currentLabel = function currentLabel(value) {\n return arguments.length ? this.seek(value, true) : this.previousLabel(this._time + _tinyNum);\n };\n\n _proto2.shiftChildren = function shiftChildren(amount, adjustLabels, ignoreBeforeTime) {\n if (ignoreBeforeTime === void 0) {\n ignoreBeforeTime = 0;\n }\n\n var child = this._first,\n labels = this.labels,\n p;\n amount = _roundPrecise(amount);\n\n while (child) {\n if (child._start >= ignoreBeforeTime) {\n child._start += amount;\n child._end += amount;\n }\n\n child = child._next;\n }\n\n if (adjustLabels) {\n for (p in labels) {\n if (labels[p] >= ignoreBeforeTime) {\n labels[p] += amount;\n }\n }\n }\n\n return _uncache(this);\n };\n\n _proto2.invalidate = function invalidate(soft) {\n var child = this._first;\n this._lock = 0;\n\n while (child) {\n child.invalidate(soft);\n child = child._next;\n }\n\n return _Animation.prototype.invalidate.call(this, soft);\n };\n\n _proto2.clear = function clear(includeLabels) {\n if (includeLabels === void 0) {\n includeLabels = true;\n }\n\n var child = this._first,\n next;\n\n while (child) {\n next = child._next;\n this.remove(child);\n child = next;\n }\n\n this._dp && (this._time = this._tTime = this._pTime = 0);\n includeLabels && (this.labels = {});\n return _uncache(this);\n };\n\n _proto2.totalDuration = function totalDuration(value) {\n var max = 0,\n self = this,\n child = self._last,\n prevStart = _bigNum,\n prev,\n start,\n parent;\n\n if (arguments.length) {\n return self.timeScale((self._repeat < 0 ? self.duration() : self.totalDuration()) / (self.reversed() ? -value : value));\n }\n\n if (self._dirty) {\n parent = self.parent;\n\n while (child) {\n prev = child._prev; //record it here in case the tween changes position in the sequence...\n\n child._dirty && child.totalDuration(); //could change the tween._startTime, so make sure the animation's cache is clean before analyzing it.\n\n start = child._start;\n\n if (start > prevStart && self._sort && child._ts && !self._lock) {\n //in case one of the tweens shifted out of order, it needs to be re-inserted into the correct position in the sequence\n self._lock = 1; //prevent endless recursive calls - there are methods that get triggered that check duration/totalDuration when we add().\n\n _addToTimeline(self, child, start - child._delay, 1)._lock = 0;\n } else {\n prevStart = start;\n }\n\n if (start < 0 && child._ts) {\n //children aren't allowed to have negative startTimes unless smoothChildTiming is true, so adjust here if one is found.\n max -= start;\n\n if (!parent && !self._dp || parent && parent.smoothChildTiming) {\n self._start += _roundPrecise(start / self._ts);\n self._time -= start;\n self._tTime -= start;\n }\n\n self.shiftChildren(-start, false, -1e999);\n prevStart = 0;\n }\n\n child._end > max && child._ts && (max = child._end);\n child = prev;\n }\n\n _setDuration(self, self === _globalTimeline && self._time > max ? self._time : max, 1, 1);\n\n self._dirty = 0;\n }\n\n return self._tDur;\n };\n\n Timeline.updateRoot = function updateRoot(time) {\n if (_globalTimeline._ts) {\n _lazySafeRender(_globalTimeline, _parentToChildTotalTime(time, _globalTimeline));\n\n _lastRenderedFrame = _ticker.frame;\n }\n\n if (_ticker.frame >= _nextGCFrame) {\n _nextGCFrame += _config.autoSleep || 120;\n var child = _globalTimeline._first;\n if (!child || !child._ts) if (_config.autoSleep && _ticker._listeners.length < 2) {\n while (child && !child._ts) {\n child = child._next;\n }\n\n child || _ticker.sleep();\n }\n }\n };\n\n return Timeline;\n}(Animation);\n\n_setDefaults(Timeline.prototype, {\n _lock: 0,\n _hasPause: 0,\n _forcing: 0\n});\n\nvar _addComplexStringPropTween = function _addComplexStringPropTween(target, prop, start, end, setter, stringFilter, funcParam) {\n //note: we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus \"this\" would refer to the plugin.\n var pt = new PropTween(this._pt, target, prop, 0, 1, _renderComplexString, null, setter),\n index = 0,\n matchIndex = 0,\n result,\n startNums,\n color,\n endNum,\n chunk,\n startNum,\n hasRandom,\n a;\n pt.b = start;\n pt.e = end;\n start += \"\"; //ensure values are strings\n\n end += \"\";\n\n if (hasRandom = ~end.indexOf(\"random(\")) {\n end = _replaceRandom(end);\n }\n\n if (stringFilter) {\n a = [start, end];\n stringFilter(a, target, prop); //pass an array with the starting and ending values and let the filter do whatever it needs to the values.\n\n start = a[0];\n end = a[1];\n }\n\n startNums = start.match(_complexStringNumExp) || [];\n\n while (result = _complexStringNumExp.exec(end)) {\n endNum = result[0];\n chunk = end.substring(index, result.index);\n\n if (color) {\n color = (color + 1) % 5;\n } else if (chunk.substr(-5) === \"rgba(\") {\n color = 1;\n }\n\n if (endNum !== startNums[matchIndex++]) {\n startNum = parseFloat(startNums[matchIndex - 1]) || 0; //these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method.\n\n pt._pt = {\n _next: pt._pt,\n p: chunk || matchIndex === 1 ? chunk : \",\",\n //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case.\n s: startNum,\n c: endNum.charAt(1) === \"=\" ? _parseRelative(startNum, endNum) - startNum : parseFloat(endNum) - startNum,\n m: color && color < 4 ? Math.round : 0\n };\n index = _complexStringNumExp.lastIndex;\n }\n }\n\n pt.c = index < end.length ? end.substring(index, end.length) : \"\"; //we use the \"c\" of the PropTween to store the final part of the string (after the last number)\n\n pt.fp = funcParam;\n\n if (_relExp.test(end) || hasRandom) {\n pt.e = 0; //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value).\n }\n\n this._pt = pt; //start the linked list with this new PropTween. Remember, we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus \"this\" would refer to the plugin.\n\n return pt;\n},\n _addPropTween = function _addPropTween(target, prop, start, end, index, targets, modifier, stringFilter, funcParam, optional) {\n _isFunction(end) && (end = end(index || 0, target, targets));\n var currentValue = target[prop],\n parsedStart = start !== \"get\" ? start : !_isFunction(currentValue) ? currentValue : funcParam ? target[prop.indexOf(\"set\") || !_isFunction(target[\"get\" + prop.substr(3)]) ? prop : \"get\" + prop.substr(3)](funcParam) : target[prop](),\n setter = !_isFunction(currentValue) ? _setterPlain : funcParam ? _setterFuncWithParam : _setterFunc,\n pt;\n\n if (_isString(end)) {\n if (~end.indexOf(\"random(\")) {\n end = _replaceRandom(end);\n }\n\n if (end.charAt(1) === \"=\") {\n pt = _parseRelative(parsedStart, end) + (getUnit(parsedStart) || 0);\n\n if (pt || pt === 0) {\n // to avoid isNaN, like if someone passes in a value like \"!= whatever\"\n end = pt;\n }\n }\n }\n\n if (!optional || parsedStart !== end || _forceAllPropTweens) {\n if (!isNaN(parsedStart * end) && end !== \"\") {\n // fun fact: any number multiplied by \"\" is evaluated as the number 0!\n pt = new PropTween(this._pt, target, prop, +parsedStart || 0, end - (parsedStart || 0), typeof currentValue === \"boolean\" ? _renderBoolean : _renderPlain, 0, setter);\n funcParam && (pt.fp = funcParam);\n modifier && pt.modifier(modifier, this, target);\n return this._pt = pt;\n }\n\n !currentValue && !(prop in target) && _missingPlugin(prop, end);\n return _addComplexStringPropTween.call(this, target, prop, parsedStart, end, setter, stringFilter || _config.stringFilter, funcParam);\n }\n},\n //creates a copy of the vars object and processes any function-based values (putting the resulting values directly into the copy) as well as strings with \"random()\" in them. It does NOT process relative values.\n_processVars = function _processVars(vars, index, target, targets, tween) {\n _isFunction(vars) && (vars = _parseFuncOrString(vars, tween, index, target, targets));\n\n if (!_isObject(vars) || vars.style && vars.nodeType || _isArray(vars) || _isTypedArray(vars)) {\n return _isString(vars) ? _parseFuncOrString(vars, tween, index, target, targets) : vars;\n }\n\n var copy = {},\n p;\n\n for (p in vars) {\n copy[p] = _parseFuncOrString(vars[p], tween, index, target, targets);\n }\n\n return copy;\n},\n _checkPlugin = function _checkPlugin(property, vars, tween, index, target, targets) {\n var plugin, pt, ptLookup, i;\n\n if (_plugins[property] && (plugin = new _plugins[property]()).init(target, plugin.rawVars ? vars[property] : _processVars(vars[property], index, target, targets, tween), tween, index, targets) !== false) {\n tween._pt = pt = new PropTween(tween._pt, target, property, 0, 1, plugin.render, plugin, 0, plugin.priority);\n\n if (tween !== _quickTween) {\n ptLookup = tween._ptLookup[tween._targets.indexOf(target)]; //note: we can't use tween._ptLookup[index] because for staggered tweens, the index from the fullTargets array won't match what it is in each individual tween that spawns from the stagger.\n\n i = plugin._props.length;\n\n while (i--) {\n ptLookup[plugin._props[i]] = pt;\n }\n }\n }\n\n return plugin;\n},\n _overwritingTween,\n //store a reference temporarily so we can avoid overwriting itself.\n_forceAllPropTweens,\n _initTween = function _initTween(tween, time, tTime) {\n var vars = tween.vars,\n ease = vars.ease,\n startAt = vars.startAt,\n immediateRender = vars.immediateRender,\n lazy = vars.lazy,\n onUpdate = vars.onUpdate,\n runBackwards = vars.runBackwards,\n yoyoEase = vars.yoyoEase,\n keyframes = vars.keyframes,\n autoRevert = vars.autoRevert,\n dur = tween._dur,\n prevStartAt = tween._startAt,\n targets = tween._targets,\n parent = tween.parent,\n fullTargets = parent && parent.data === \"nested\" ? parent.vars.targets : targets,\n autoOverwrite = tween._overwrite === \"auto\" && !_suppressOverwrites,\n tl = tween.timeline,\n cleanVars,\n i,\n p,\n pt,\n target,\n hasPriority,\n gsData,\n harness,\n plugin,\n ptLookup,\n index,\n harnessVars,\n overwritten;\n tl && (!keyframes || !ease) && (ease = \"none\");\n tween._ease = _parseEase(ease, _defaults.ease);\n tween._yEase = yoyoEase ? _invertEase(_parseEase(yoyoEase === true ? ease : yoyoEase, _defaults.ease)) : 0;\n\n if (yoyoEase && tween._yoyo && !tween._repeat) {\n //there must have been a parent timeline with yoyo:true that is currently in its yoyo phase, so flip the eases.\n yoyoEase = tween._yEase;\n tween._yEase = tween._ease;\n tween._ease = yoyoEase;\n }\n\n tween._from = !tl && !!vars.runBackwards; //nested timelines should never run backwards - the backwards-ness is in the child tweens.\n\n if (!tl || keyframes && !vars.stagger) {\n //if there's an internal timeline, skip all the parsing because we passed that task down the chain.\n harness = targets[0] ? _getCache(targets[0]).harness : 0;\n harnessVars = harness && vars[harness.prop]; //someone may need to specify CSS-specific values AND non-CSS values, like if the element has an \"x\" property plus it's a standard DOM element. We allow people to distinguish by wrapping plugin-specific stuff in a css:{} object for example.\n\n cleanVars = _copyExcluding(vars, _reservedProps);\n\n if (prevStartAt) {\n prevStartAt._zTime < 0 && prevStartAt.progress(1); // in case it's a lazy startAt that hasn't rendered yet.\n\n time < 0 && runBackwards && immediateRender && !autoRevert ? prevStartAt.render(-1, true) : prevStartAt.revert(runBackwards && dur ? _revertConfigNoKill : _startAtRevertConfig); // if it's a \"startAt\" (not \"from()\" or runBackwards: true), we only need to do a shallow revert (keep transforms cached in CSSPlugin)\n // don't just _removeFromParent(prevStartAt.render(-1, true)) because that'll leave inline styles. We're creating a new _startAt for \"startAt\" tweens that re-capture things to ensure that if the pre-tween values changed since the tween was created, they're recorded.\n\n prevStartAt._lazy = 0;\n }\n\n if (startAt) {\n _removeFromParent(tween._startAt = Tween.set(targets, _setDefaults({\n data: \"isStart\",\n overwrite: false,\n parent: parent,\n immediateRender: true,\n lazy: !prevStartAt && _isNotFalse(lazy),\n startAt: null,\n delay: 0,\n onUpdate: onUpdate && function () {\n return _callback(tween, \"onUpdate\");\n },\n stagger: 0\n }, startAt))); //copy the properties/values into a new object to avoid collisions, like var to = {x:0}, from = {x:500}; timeline.fromTo(e, from, to).fromTo(e, to, from);\n\n\n tween._startAt._dp = 0; // don't allow it to get put back into root timeline! Like when revert() is called and totalTime() gets set.\n\n tween._startAt._sat = tween; // used in globalTime(). _sat stands for _startAtTween\n\n time < 0 && (_reverting || !immediateRender && !autoRevert) && tween._startAt.revert(_revertConfigNoKill); // rare edge case, like if a render is forced in the negative direction of a non-initted tween.\n\n if (immediateRender) {\n if (dur && time <= 0 && tTime <= 0) {\n // check tTime here because in the case of a yoyo tween whose playhead gets pushed to the end like tween.progress(1), we should allow it through so that the onComplete gets fired properly.\n time && (tween._zTime = time);\n return; //we skip initialization here so that overwriting doesn't occur until the tween actually begins. Otherwise, if you create several immediateRender:true tweens of the same target/properties to drop into a Timeline, the last one created would overwrite the first ones because they didn't get placed into the timeline yet before the first render occurs and kicks in overwriting.\n }\n }\n } else if (runBackwards && dur) {\n //from() tweens must be handled uniquely: their beginning values must be rendered but we don't want overwriting to occur yet (when time is still 0). Wait until the tween actually begins before doing all the routines like overwriting. At that time, we should render at the END of the tween to ensure that things initialize correctly (remember, from() tweens go backwards)\n if (!prevStartAt) {\n time && (immediateRender = false); //in rare cases (like if a from() tween runs and then is invalidate()-ed), immediateRender could be true but the initial forced-render gets skipped, so there's no need to force the render in this context when the _time is greater than 0\n\n p = _setDefaults({\n overwrite: false,\n data: \"isFromStart\",\n //we tag the tween with as \"isFromStart\" so that if [inside a plugin] we need to only do something at the very END of a tween, we have a way of identifying this tween as merely the one that's setting the beginning values for a \"from()\" tween. For example, clearProps in CSSPlugin should only get applied at the very END of a tween and without this tag, from(...{height:100, clearProps:\"height\", delay:1}) would wipe the height at the beginning of the tween and after 1 second, it'd kick back in.\n lazy: immediateRender && !prevStartAt && _isNotFalse(lazy),\n immediateRender: immediateRender,\n //zero-duration tweens render immediately by default, but if we're not specifically instructed to render this tween immediately, we should skip this and merely _init() to record the starting values (rendering them immediately would push them to completion which is wasteful in that case - we'd have to render(-1) immediately after)\n stagger: 0,\n parent: parent //ensures that nested tweens that had a stagger are handled properly, like gsap.from(\".class\", {y: gsap.utils.wrap([-100,100]), stagger: 0.5})\n\n }, cleanVars);\n harnessVars && (p[harness.prop] = harnessVars); // in case someone does something like .from(..., {css:{}})\n\n _removeFromParent(tween._startAt = Tween.set(targets, p));\n\n tween._startAt._dp = 0; // don't allow it to get put back into root timeline!\n\n tween._startAt._sat = tween; // used in globalTime()\n\n time < 0 && (_reverting ? tween._startAt.revert(_revertConfigNoKill) : tween._startAt.render(-1, true));\n tween._zTime = time;\n\n if (!immediateRender) {\n _initTween(tween._startAt, _tinyNum, _tinyNum); //ensures that the initial values are recorded\n\n } else if (!time) {\n return;\n }\n }\n }\n\n tween._pt = tween._ptCache = 0;\n lazy = dur && _isNotFalse(lazy) || lazy && !dur;\n\n for (i = 0; i < targets.length; i++) {\n target = targets[i];\n gsData = target._gsap || _harness(targets)[i]._gsap;\n tween._ptLookup[i] = ptLookup = {};\n _lazyLookup[gsData.id] && _lazyTweens.length && _lazyRender(); //if other tweens of the same target have recently initted but haven't rendered yet, we've got to force the render so that the starting values are correct (imagine populating a timeline with a bunch of sequential tweens and then jumping to the end)\n\n index = fullTargets === targets ? i : fullTargets.indexOf(target);\n\n if (harness && (plugin = new harness()).init(target, harnessVars || cleanVars, tween, index, fullTargets) !== false) {\n tween._pt = pt = new PropTween(tween._pt, target, plugin.name, 0, 1, plugin.render, plugin, 0, plugin.priority);\n\n plugin._props.forEach(function (name) {\n ptLookup[name] = pt;\n });\n\n plugin.priority && (hasPriority = 1);\n }\n\n if (!harness || harnessVars) {\n for (p in cleanVars) {\n if (_plugins[p] && (plugin = _checkPlugin(p, cleanVars, tween, index, target, fullTargets))) {\n plugin.priority && (hasPriority = 1);\n } else {\n ptLookup[p] = pt = _addPropTween.call(tween, target, p, \"get\", cleanVars[p], index, fullTargets, 0, vars.stringFilter);\n }\n }\n }\n\n tween._op && tween._op[i] && tween.kill(target, tween._op[i]);\n\n if (autoOverwrite && tween._pt) {\n _overwritingTween = tween;\n\n _globalTimeline.killTweensOf(target, ptLookup, tween.globalTime(time)); // make sure the overwriting doesn't overwrite THIS tween!!!\n\n\n overwritten = !tween.parent;\n _overwritingTween = 0;\n }\n\n tween._pt && lazy && (_lazyLookup[gsData.id] = 1);\n }\n\n hasPriority && _sortPropTweensByPriority(tween);\n tween._onInit && tween._onInit(tween); //plugins like RoundProps must wait until ALL of the PropTweens are instantiated. In the plugin's init() function, it sets the _onInit on the tween instance. May not be pretty/intuitive, but it's fast and keeps file size down.\n }\n\n tween._onUpdate = onUpdate;\n tween._initted = (!tween._op || tween._pt) && !overwritten; // if overwrittenProps resulted in the entire tween being killed, do NOT flag it as initted or else it may render for one tick.\n\n keyframes && time <= 0 && tl.render(_bigNum, true, true); // if there's a 0% keyframe, it'll render in the \"before\" state for any staggered/delayed animations thus when the following tween initializes, it'll use the \"before\" state instead of the \"after\" state as the initial values.\n},\n _updatePropTweens = function _updatePropTweens(tween, property, value, start, startIsRelative, ratio, time, skipRecursion) {\n var ptCache = (tween._pt && tween._ptCache || (tween._ptCache = {}))[property],\n pt,\n rootPT,\n lookup,\n i;\n\n if (!ptCache) {\n ptCache = tween._ptCache[property] = [];\n lookup = tween._ptLookup;\n i = tween._targets.length;\n\n while (i--) {\n pt = lookup[i][property];\n\n if (pt && pt.d && pt.d._pt) {\n // it's a plugin, so find the nested PropTween\n pt = pt.d._pt;\n\n while (pt && pt.p !== property && pt.fp !== property) {\n // \"fp\" is functionParam for things like setting CSS variables which require .setProperty(\"--var-name\", value)\n pt = pt._next;\n }\n }\n\n if (!pt) {\n // there is no PropTween associated with that property, so we must FORCE one to be created and ditch out of this\n // if the tween has other properties that already rendered at new positions, we'd normally have to rewind to put them back like tween.render(0, true) before forcing an _initTween(), but that can create another edge case like tweening a timeline's progress would trigger onUpdates to fire which could move other things around. It's better to just inform users that .resetTo() should ONLY be used for tweens that already have that property. For example, you can't gsap.to(...{ y: 0 }) and then tween.restTo(\"x\", 200) for example.\n _forceAllPropTweens = 1; // otherwise, when we _addPropTween() and it finds no change between the start and end values, it skips creating a PropTween (for efficiency...why tween when there's no difference?) but in this case we NEED that PropTween created so we can edit it.\n\n tween.vars[property] = \"+=0\";\n\n _initTween(tween, time);\n\n _forceAllPropTweens = 0;\n return skipRecursion ? _warn(property + \" not eligible for reset\") : 1; // if someone tries to do a quickTo() on a special property like borderRadius which must get split into 4 different properties, that's not eligible for .resetTo().\n }\n\n ptCache.push(pt);\n }\n }\n\n i = ptCache.length;\n\n while (i--) {\n rootPT = ptCache[i];\n pt = rootPT._pt || rootPT; // complex values may have nested PropTweens. We only accommodate the FIRST value.\n\n pt.s = (start || start === 0) && !startIsRelative ? start : pt.s + (start || 0) + ratio * pt.c;\n pt.c = value - pt.s;\n rootPT.e && (rootPT.e = _round(value) + getUnit(rootPT.e)); // mainly for CSSPlugin (end value)\n\n rootPT.b && (rootPT.b = pt.s + getUnit(rootPT.b)); // (beginning value)\n }\n},\n _addAliasesToVars = function _addAliasesToVars(targets, vars) {\n var harness = targets[0] ? _getCache(targets[0]).harness : 0,\n propertyAliases = harness && harness.aliases,\n copy,\n p,\n i,\n aliases;\n\n if (!propertyAliases) {\n return vars;\n }\n\n copy = _merge({}, vars);\n\n for (p in propertyAliases) {\n if (p in copy) {\n aliases = propertyAliases[p].split(\",\");\n i = aliases.length;\n\n while (i--) {\n copy[aliases[i]] = copy[p];\n }\n }\n }\n\n return copy;\n},\n // parses multiple formats, like {\"0%\": {x: 100}, {\"50%\": {x: -20}} and { x: {\"0%\": 100, \"50%\": -20} }, and an \"ease\" can be set on any object. We populate an \"allProps\" object with an Array for each property, like {x: [{}, {}], y:[{}, {}]} with data for each property tween. The objects have a \"t\" (time), \"v\", (value), and \"e\" (ease) property. This allows us to piece together a timeline later.\n_parseKeyframe = function _parseKeyframe(prop, obj, allProps, easeEach) {\n var ease = obj.ease || easeEach || \"power1.inOut\",\n p,\n a;\n\n if (_isArray(obj)) {\n a = allProps[prop] || (allProps[prop] = []); // t = time (out of 100), v = value, e = ease\n\n obj.forEach(function (value, i) {\n return a.push({\n t: i / (obj.length - 1) * 100,\n v: value,\n e: ease\n });\n });\n } else {\n for (p in obj) {\n a = allProps[p] || (allProps[p] = []);\n p === \"ease\" || a.push({\n t: parseFloat(prop),\n v: obj[p],\n e: ease\n });\n }\n }\n},\n _parseFuncOrString = function _parseFuncOrString(value, tween, i, target, targets) {\n return _isFunction(value) ? value.call(tween, i, target, targets) : _isString(value) && ~value.indexOf(\"random(\") ? _replaceRandom(value) : value;\n},\n _staggerTweenProps = _callbackNames + \"repeat,repeatDelay,yoyo,repeatRefresh,yoyoEase,autoRevert\",\n _staggerPropsToSkip = {};\n\n_forEachName(_staggerTweenProps + \",id,stagger,delay,duration,paused,scrollTrigger\", function (name) {\n return _staggerPropsToSkip[name] = 1;\n});\n/*\n * --------------------------------------------------------------------------------------\n * TWEEN\n * --------------------------------------------------------------------------------------\n */\n\n\nexport var Tween = /*#__PURE__*/function (_Animation2) {\n _inheritsLoose(Tween, _Animation2);\n\n function Tween(targets, vars, position, skipInherit) {\n var _this3;\n\n if (typeof vars === \"number\") {\n position.duration = vars;\n vars = position;\n position = null;\n }\n\n _this3 = _Animation2.call(this, skipInherit ? vars : _inheritDefaults(vars)) || this;\n var _this3$vars = _this3.vars,\n duration = _this3$vars.duration,\n delay = _this3$vars.delay,\n immediateRender = _this3$vars.immediateRender,\n stagger = _this3$vars.stagger,\n overwrite = _this3$vars.overwrite,\n keyframes = _this3$vars.keyframes,\n defaults = _this3$vars.defaults,\n scrollTrigger = _this3$vars.scrollTrigger,\n yoyoEase = _this3$vars.yoyoEase,\n parent = vars.parent || _globalTimeline,\n parsedTargets = (_isArray(targets) || _isTypedArray(targets) ? _isNumber(targets[0]) : \"length\" in vars) ? [targets] : toArray(targets),\n tl,\n i,\n copy,\n l,\n p,\n curTarget,\n staggerFunc,\n staggerVarsToMerge;\n _this3._targets = parsedTargets.length ? _harness(parsedTargets) : _warn(\"GSAP target \" + targets + \" not found. https://gsap.com\", !_config.nullTargetWarn) || [];\n _this3._ptLookup = []; //PropTween lookup. An array containing an object for each target, having keys for each tweening property\n\n _this3._overwrite = overwrite;\n\n if (keyframes || stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) {\n vars = _this3.vars;\n tl = _this3.timeline = new Timeline({\n data: \"nested\",\n defaults: defaults || {},\n targets: parent && parent.data === \"nested\" ? parent.vars.targets : parsedTargets\n }); // we need to store the targets because for staggers and keyframes, we end up creating an individual tween for each but function-based values need to know the index and the whole Array of targets.\n\n tl.kill();\n tl.parent = tl._dp = _assertThisInitialized(_this3);\n tl._start = 0;\n\n if (stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) {\n l = parsedTargets.length;\n staggerFunc = stagger && distribute(stagger);\n\n if (_isObject(stagger)) {\n //users can pass in callbacks like onStart/onComplete in the stagger object. These should fire with each individual tween.\n for (p in stagger) {\n if (~_staggerTweenProps.indexOf(p)) {\n staggerVarsToMerge || (staggerVarsToMerge = {});\n staggerVarsToMerge[p] = stagger[p];\n }\n }\n }\n\n for (i = 0; i < l; i++) {\n copy = _copyExcluding(vars, _staggerPropsToSkip);\n copy.stagger = 0;\n yoyoEase && (copy.yoyoEase = yoyoEase);\n staggerVarsToMerge && _merge(copy, staggerVarsToMerge);\n curTarget = parsedTargets[i]; //don't just copy duration or delay because if they're a string or function, we'd end up in an infinite loop because _isFuncOrString() would evaluate as true in the child tweens, entering this loop, etc. So we parse the value straight from vars and default to 0.\n\n copy.duration = +_parseFuncOrString(duration, _assertThisInitialized(_this3), i, curTarget, parsedTargets);\n copy.delay = (+_parseFuncOrString(delay, _assertThisInitialized(_this3), i, curTarget, parsedTargets) || 0) - _this3._delay;\n\n if (!stagger && l === 1 && copy.delay) {\n // if someone does delay:\"random(1, 5)\", repeat:-1, for example, the delay shouldn't be inside the repeat.\n _this3._delay = delay = copy.delay;\n _this3._start += delay;\n copy.delay = 0;\n }\n\n tl.to(curTarget, copy, staggerFunc ? staggerFunc(i, curTarget, parsedTargets) : 0);\n tl._ease = _easeMap.none;\n }\n\n tl.duration() ? duration = delay = 0 : _this3.timeline = 0; // if the timeline's duration is 0, we don't need a timeline internally!\n } else if (keyframes) {\n _inheritDefaults(_setDefaults(tl.vars.defaults, {\n ease: \"none\"\n }));\n\n tl._ease = _parseEase(keyframes.ease || vars.ease || \"none\");\n var time = 0,\n a,\n kf,\n v;\n\n if (_isArray(keyframes)) {\n keyframes.forEach(function (frame) {\n return tl.to(parsedTargets, frame, \">\");\n });\n tl.duration(); // to ensure tl._dur is cached because we tap into it for performance purposes in the render() method.\n } else {\n copy = {};\n\n for (p in keyframes) {\n p === \"ease\" || p === \"easeEach\" || _parseKeyframe(p, keyframes[p], copy, keyframes.easeEach);\n }\n\n for (p in copy) {\n a = copy[p].sort(function (a, b) {\n return a.t - b.t;\n });\n time = 0;\n\n for (i = 0; i < a.length; i++) {\n kf = a[i];\n v = {\n ease: kf.e,\n duration: (kf.t - (i ? a[i - 1].t : 0)) / 100 * duration\n };\n v[p] = kf.v;\n tl.to(parsedTargets, v, time);\n time += v.duration;\n }\n }\n\n tl.duration() < duration && tl.to({}, {\n duration: duration - tl.duration()\n }); // in case keyframes didn't go to 100%\n }\n }\n\n duration || _this3.duration(duration = tl.duration());\n } else {\n _this3.timeline = 0; //speed optimization, faster lookups (no going up the prototype chain)\n }\n\n if (overwrite === true && !_suppressOverwrites) {\n _overwritingTween = _assertThisInitialized(_this3);\n\n _globalTimeline.killTweensOf(parsedTargets);\n\n _overwritingTween = 0;\n }\n\n _addToTimeline(parent, _assertThisInitialized(_this3), position);\n\n vars.reversed && _this3.reverse();\n vars.paused && _this3.paused(true);\n\n if (immediateRender || !duration && !keyframes && _this3._start === _roundPrecise(parent._time) && _isNotFalse(immediateRender) && _hasNoPausedAncestors(_assertThisInitialized(_this3)) && parent.data !== \"nested\") {\n _this3._tTime = -_tinyNum; //forces a render without having to set the render() \"force\" parameter to true because we want to allow lazying by default (using the \"force\" parameter always forces an immediate full render)\n\n _this3.render(Math.max(0, -delay) || 0); //in case delay is negative\n\n }\n\n scrollTrigger && _scrollTrigger(_assertThisInitialized(_this3), scrollTrigger);\n return _this3;\n }\n\n var _proto3 = Tween.prototype;\n\n _proto3.render = function render(totalTime, suppressEvents, force) {\n var prevTime = this._time,\n tDur = this._tDur,\n dur = this._dur,\n isNegative = totalTime < 0,\n tTime = totalTime > tDur - _tinyNum && !isNegative ? tDur : totalTime < _tinyNum ? 0 : totalTime,\n time,\n pt,\n iteration,\n cycleDuration,\n prevIteration,\n isYoyo,\n ratio,\n timeline,\n yoyoEase;\n\n if (!dur) {\n _renderZeroDurationTween(this, totalTime, suppressEvents, force);\n } else if (tTime !== this._tTime || !totalTime || force || !this._initted && this._tTime || this._startAt && this._zTime < 0 !== isNegative || this._lazy) {\n // this senses if we're crossing over the start time, in which case we must record _zTime and force the render, but we do it in this lengthy conditional way for performance reasons (usually we can skip the calculations): this._initted && (this._zTime < 0) !== (totalTime < 0)\n time = tTime;\n timeline = this.timeline;\n\n if (this._repeat) {\n //adjust the time for repeats and yoyos\n cycleDuration = dur + this._rDelay;\n\n if (this._repeat < -1 && isNegative) {\n return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force);\n }\n\n time = _roundPrecise(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!)\n\n if (tTime === tDur) {\n // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't)\n iteration = this._repeat;\n time = dur;\n } else {\n prevIteration = _roundPrecise(tTime / cycleDuration); // full decimal version of iterations, not the previous iteration (we're reusing prevIteration variable for efficiency)\n\n iteration = ~~prevIteration;\n\n if (iteration && iteration === prevIteration) {\n time = dur;\n iteration--;\n } else if (time > dur) {\n time = dur;\n }\n }\n\n isYoyo = this._yoyo && iteration & 1;\n\n if (isYoyo) {\n yoyoEase = this._yEase;\n time = dur - time;\n }\n\n prevIteration = _animationCycle(this._tTime, cycleDuration);\n\n if (time === prevTime && !force && this._initted && iteration === prevIteration) {\n //could be during the repeatDelay part. No need to render and fire callbacks.\n this._tTime = tTime;\n return this;\n }\n\n if (iteration !== prevIteration) {\n timeline && this._yEase && _propagateYoyoEase(timeline, isYoyo); //repeatRefresh functionality\n\n if (this.vars.repeatRefresh && !isYoyo && !this._lock && time !== cycleDuration && this._initted) {\n // this._time will === cycleDuration when we render at EXACTLY the end of an iteration. Without this condition, it'd often do the repeatRefresh render TWICE (again on the very next tick).\n this._lock = force = 1; //force, otherwise if lazy is true, the _attemptInitTween() will return and we'll jump out and get caught bouncing on each tick.\n\n this.render(_roundPrecise(cycleDuration * iteration), true).invalidate()._lock = 0;\n }\n }\n }\n\n if (!this._initted) {\n if (_attemptInitTween(this, isNegative ? totalTime : time, force, suppressEvents, tTime)) {\n this._tTime = 0; // in constructor if immediateRender is true, we set _tTime to -_tinyNum to have the playhead cross the starting point but we can't leave _tTime as a negative number.\n\n return this;\n }\n\n if (prevTime !== this._time && !(force && this.vars.repeatRefresh && iteration !== prevIteration)) {\n // rare edge case - during initialization, an onUpdate in the _startAt (.fromTo()) might force this tween to render at a different spot in which case we should ditch this render() call so that it doesn't revert the values. But we also don't want to dump if we're doing a repeatRefresh render!\n return this;\n }\n\n if (dur !== this._dur) {\n // while initting, a plugin like InertiaPlugin might alter the duration, so rerun from the start to ensure everything renders as it should.\n return this.render(totalTime, suppressEvents, force);\n }\n }\n\n this._tTime = tTime;\n this._time = time;\n\n if (!this._act && this._ts) {\n this._act = 1; //as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick.\n\n this._lazy = 0;\n }\n\n this.ratio = ratio = (yoyoEase || this._ease)(time / dur);\n\n if (this._from) {\n this.ratio = ratio = 1 - ratio;\n }\n\n if (!prevTime && tTime && !suppressEvents && !prevIteration) {\n _callback(this, \"onStart\");\n\n if (this._tTime !== tTime) {\n // in case the onStart triggered a render at a different spot, eject. Like if someone did animation.pause(0.5) or something inside the onStart.\n return this;\n }\n }\n\n pt = this._pt;\n\n while (pt) {\n pt.r(ratio, pt.d);\n pt = pt._next;\n }\n\n timeline && timeline.render(totalTime < 0 ? totalTime : timeline._dur * timeline._ease(time / this._dur), suppressEvents, force) || this._startAt && (this._zTime = totalTime);\n\n if (this._onUpdate && !suppressEvents) {\n isNegative && _rewindStartAt(this, totalTime, suppressEvents, force); //note: for performance reasons, we tuck this conditional logic inside less traveled areas (most tweens don't have an onUpdate). We'd just have it at the end before the onComplete, but the values should be updated before any onUpdate is called, so we ALSO put it here and then if it's not called, we do so later near the onComplete.\n\n _callback(this, \"onUpdate\");\n }\n\n this._repeat && iteration !== prevIteration && this.vars.onRepeat && !suppressEvents && this.parent && _callback(this, \"onRepeat\");\n\n if ((tTime === this._tDur || !tTime) && this._tTime === tTime) {\n isNegative && !this._onUpdate && _rewindStartAt(this, totalTime, true, true);\n (totalTime || !dur) && (tTime === this._tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1); // don't remove if we're rendering at exactly a time of 0, as there could be autoRevert values that should get set on the next tick (if the playhead goes backward beyond the startTime, negative totalTime). Don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative.\n\n if (!suppressEvents && !(isNegative && !prevTime) && (tTime || prevTime || isYoyo)) {\n // if prevTime and tTime are zero, we shouldn't fire the onReverseComplete. This could happen if you gsap.to(... {paused:true}).play();\n _callback(this, tTime === tDur ? \"onComplete\" : \"onReverseComplete\", true);\n\n this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom();\n }\n }\n }\n\n return this;\n };\n\n _proto3.targets = function targets() {\n return this._targets;\n };\n\n _proto3.invalidate = function invalidate(soft) {\n // \"soft\" gives us a way to clear out everything EXCEPT the recorded pre-\"from\" portion of from() tweens. Otherwise, for example, if you tween.progress(1).render(0, true true).invalidate(), the \"from\" values would persist and then on the next render, the from() tweens would initialize and the current value would match the \"from\" values, thus animate from the same value to the same value (no animation). We tap into this in ScrollTrigger's refresh() where we must push a tween to completion and then back again but honor its init state in case the tween is dependent on another tween further up on the page.\n (!soft || !this.vars.runBackwards) && (this._startAt = 0);\n this._pt = this._op = this._onUpdate = this._lazy = this.ratio = 0;\n this._ptLookup = [];\n this.timeline && this.timeline.invalidate(soft);\n return _Animation2.prototype.invalidate.call(this, soft);\n };\n\n _proto3.resetTo = function resetTo(property, value, start, startIsRelative, skipRecursion) {\n _tickerActive || _ticker.wake();\n this._ts || this.play();\n var time = Math.min(this._dur, (this._dp._time - this._start) * this._ts),\n ratio;\n this._initted || _initTween(this, time);\n ratio = this._ease(time / this._dur); // don't just get tween.ratio because it may not have rendered yet.\n // possible future addition to allow an object with multiple values to update, like tween.resetTo({x: 100, y: 200}); At this point, it doesn't seem worth the added kb given the fact that most users will likely opt for the convenient gsap.quickTo() way of interacting with this method.\n // if (_isObject(property)) { // performance optimization\n // \tfor (p in property) {\n // \t\tif (_updatePropTweens(this, p, property[p], value ? value[p] : null, start, ratio, time)) {\n // \t\t\treturn this.resetTo(property, value, start, startIsRelative); // if a PropTween wasn't found for the property, it'll get forced with a re-initialization so we need to jump out and start over again.\n // \t\t}\n // \t}\n // } else {\n\n if (_updatePropTweens(this, property, value, start, startIsRelative, ratio, time, skipRecursion)) {\n return this.resetTo(property, value, start, startIsRelative, 1); // if a PropTween wasn't found for the property, it'll get forced with a re-initialization so we need to jump out and start over again.\n } //}\n\n\n _alignPlayhead(this, 0);\n\n this.parent || _addLinkedListItem(this._dp, this, \"_first\", \"_last\", this._dp._sort ? \"_start\" : 0);\n return this.render(0);\n };\n\n _proto3.kill = function kill(targets, vars) {\n if (vars === void 0) {\n vars = \"all\";\n }\n\n if (!targets && (!vars || vars === \"all\")) {\n this._lazy = this._pt = 0;\n this.parent ? _interrupt(this) : this.scrollTrigger && this.scrollTrigger.kill(!!_reverting);\n return this;\n }\n\n if (this.timeline) {\n var tDur = this.timeline.totalDuration();\n this.timeline.killTweensOf(targets, vars, _overwritingTween && _overwritingTween.vars.overwrite !== true)._first || _interrupt(this); // if nothing is left tweening, interrupt.\n\n this.parent && tDur !== this.timeline.totalDuration() && _setDuration(this, this._dur * this.timeline._tDur / tDur, 0, 1); // if a nested tween is killed that changes the duration, it should affect this tween's duration. We must use the ratio, though, because sometimes the internal timeline is stretched like for keyframes where they don't all add up to whatever the parent tween's duration was set to.\n\n return this;\n }\n\n var parsedTargets = this._targets,\n killingTargets = targets ? toArray(targets) : parsedTargets,\n propTweenLookup = this._ptLookup,\n firstPT = this._pt,\n overwrittenProps,\n curLookup,\n curOverwriteProps,\n props,\n p,\n pt,\n i;\n\n if ((!vars || vars === \"all\") && _arraysMatch(parsedTargets, killingTargets)) {\n vars === \"all\" && (this._pt = 0);\n return _interrupt(this);\n }\n\n overwrittenProps = this._op = this._op || [];\n\n if (vars !== \"all\") {\n //so people can pass in a comma-delimited list of property names\n if (_isString(vars)) {\n p = {};\n\n _forEachName(vars, function (name) {\n return p[name] = 1;\n });\n\n vars = p;\n }\n\n vars = _addAliasesToVars(parsedTargets, vars);\n }\n\n i = parsedTargets.length;\n\n while (i--) {\n if (~killingTargets.indexOf(parsedTargets[i])) {\n curLookup = propTweenLookup[i];\n\n if (vars === \"all\") {\n overwrittenProps[i] = vars;\n props = curLookup;\n curOverwriteProps = {};\n } else {\n curOverwriteProps = overwrittenProps[i] = overwrittenProps[i] || {};\n props = vars;\n }\n\n for (p in props) {\n pt = curLookup && curLookup[p];\n\n if (pt) {\n if (!(\"kill\" in pt.d) || pt.d.kill(p) === true) {\n _removeLinkedListItem(this, pt, \"_pt\");\n }\n\n delete curLookup[p];\n }\n\n if (curOverwriteProps !== \"all\") {\n curOverwriteProps[p] = 1;\n }\n }\n }\n }\n\n this._initted && !this._pt && firstPT && _interrupt(this); //if all tweening properties are killed, kill the tween. Without this line, if there's a tween with multiple targets and then you killTweensOf() each target individually, the tween would technically still remain active and fire its onComplete even though there aren't any more properties tweening.\n\n return this;\n };\n\n Tween.to = function to(targets, vars) {\n return new Tween(targets, vars, arguments[2]);\n };\n\n Tween.from = function from(targets, vars) {\n return _createTweenType(1, arguments);\n };\n\n Tween.delayedCall = function delayedCall(delay, callback, params, scope) {\n return new Tween(callback, 0, {\n immediateRender: false,\n lazy: false,\n overwrite: false,\n delay: delay,\n onComplete: callback,\n onReverseComplete: callback,\n onCompleteParams: params,\n onReverseCompleteParams: params,\n callbackScope: scope\n }); // we must use onReverseComplete too for things like timeline.add(() => {...}) which should be triggered in BOTH directions (forward and reverse)\n };\n\n Tween.fromTo = function fromTo(targets, fromVars, toVars) {\n return _createTweenType(2, arguments);\n };\n\n Tween.set = function set(targets, vars) {\n vars.duration = 0;\n vars.repeatDelay || (vars.repeat = 0);\n return new Tween(targets, vars);\n };\n\n Tween.killTweensOf = function killTweensOf(targets, props, onlyActive) {\n return _globalTimeline.killTweensOf(targets, props, onlyActive);\n };\n\n return Tween;\n}(Animation);\n\n_setDefaults(Tween.prototype, {\n _targets: [],\n _lazy: 0,\n _startAt: 0,\n _op: 0,\n _onInit: 0\n}); //add the pertinent timeline methods to Tween instances so that users can chain conveniently and create a timeline automatically. (removed due to concerns that it'd ultimately add to more confusion especially for beginners)\n// _forEachName(\"to,from,fromTo,set,call,add,addLabel,addPause\", name => {\n// \tTween.prototype[name] = function() {\n// \t\tlet tl = new Timeline();\n// \t\treturn _addToTimeline(tl, this)[name].apply(tl, toArray(arguments));\n// \t}\n// });\n//for backward compatibility. Leverage the timeline calls.\n\n\n_forEachName(\"staggerTo,staggerFrom,staggerFromTo\", function (name) {\n Tween[name] = function () {\n var tl = new Timeline(),\n params = _slice.call(arguments, 0);\n\n params.splice(name === \"staggerFromTo\" ? 5 : 4, 0, 0);\n return tl[name].apply(tl, params);\n };\n});\n/*\n * --------------------------------------------------------------------------------------\n * PROPTWEEN\n * --------------------------------------------------------------------------------------\n */\n\n\nvar _setterPlain = function _setterPlain(target, property, value) {\n return target[property] = value;\n},\n _setterFunc = function _setterFunc(target, property, value) {\n return target[property](value);\n},\n _setterFuncWithParam = function _setterFuncWithParam(target, property, value, data) {\n return target[property](data.fp, value);\n},\n _setterAttribute = function _setterAttribute(target, property, value) {\n return target.setAttribute(property, value);\n},\n _getSetter = function _getSetter(target, property) {\n return _isFunction(target[property]) ? _setterFunc : _isUndefined(target[property]) && target.setAttribute ? _setterAttribute : _setterPlain;\n},\n _renderPlain = function _renderPlain(ratio, data) {\n return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 1000000) / 1000000, data);\n},\n _renderBoolean = function _renderBoolean(ratio, data) {\n return data.set(data.t, data.p, !!(data.s + data.c * ratio), data);\n},\n _renderComplexString = function _renderComplexString(ratio, data) {\n var pt = data._pt,\n s = \"\";\n\n if (!ratio && data.b) {\n //b = beginning string\n s = data.b;\n } else if (ratio === 1 && data.e) {\n //e = ending string\n s = data.e;\n } else {\n while (pt) {\n s = pt.p + (pt.m ? pt.m(pt.s + pt.c * ratio) : Math.round((pt.s + pt.c * ratio) * 10000) / 10000) + s; //we use the \"p\" property for the text inbetween (like a suffix). And in the context of a complex string, the modifier (m) is typically just Math.round(), like for RGB colors.\n\n pt = pt._next;\n }\n\n s += data.c; //we use the \"c\" of the PropTween to store the final chunk of non-numeric text.\n }\n\n data.set(data.t, data.p, s, data);\n},\n _renderPropTweens = function _renderPropTweens(ratio, data) {\n var pt = data._pt;\n\n while (pt) {\n pt.r(ratio, pt.d);\n pt = pt._next;\n }\n},\n _addPluginModifier = function _addPluginModifier(modifier, tween, target, property) {\n var pt = this._pt,\n next;\n\n while (pt) {\n next = pt._next;\n pt.p === property && pt.modifier(modifier, tween, target);\n pt = next;\n }\n},\n _killPropTweensOf = function _killPropTweensOf(property) {\n var pt = this._pt,\n hasNonDependentRemaining,\n next;\n\n while (pt) {\n next = pt._next;\n\n if (pt.p === property && !pt.op || pt.op === property) {\n _removeLinkedListItem(this, pt, \"_pt\");\n } else if (!pt.dep) {\n hasNonDependentRemaining = 1;\n }\n\n pt = next;\n }\n\n return !hasNonDependentRemaining;\n},\n _setterWithModifier = function _setterWithModifier(target, property, value, data) {\n data.mSet(target, property, data.m.call(data.tween, value, data.mt), data);\n},\n _sortPropTweensByPriority = function _sortPropTweensByPriority(parent) {\n var pt = parent._pt,\n next,\n pt2,\n first,\n last; //sorts the PropTween linked list in order of priority because some plugins need to do their work after ALL of the PropTweens were created (like RoundPropsPlugin and ModifiersPlugin)\n\n while (pt) {\n next = pt._next;\n pt2 = first;\n\n while (pt2 && pt2.pr > pt.pr) {\n pt2 = pt2._next;\n }\n\n if (pt._prev = pt2 ? pt2._prev : last) {\n pt._prev._next = pt;\n } else {\n first = pt;\n }\n\n if (pt._next = pt2) {\n pt2._prev = pt;\n } else {\n last = pt;\n }\n\n pt = next;\n }\n\n parent._pt = first;\n}; //PropTween key: t = target, p = prop, r = renderer, d = data, s = start, c = change, op = overwriteProperty (ONLY populated when it's different than p), pr = priority, _next/_prev for the linked list siblings, set = setter, m = modifier, mSet = modifierSetter (the original setter, before a modifier was added)\n\n\nexport var PropTween = /*#__PURE__*/function () {\n function PropTween(next, target, prop, start, change, renderer, data, setter, priority) {\n this.t = target;\n this.s = start;\n this.c = change;\n this.p = prop;\n this.r = renderer || _renderPlain;\n this.d = data || this;\n this.set = setter || _setterPlain;\n this.pr = priority || 0;\n this._next = next;\n\n if (next) {\n next._prev = this;\n }\n }\n\n var _proto4 = PropTween.prototype;\n\n _proto4.modifier = function modifier(func, tween, target) {\n this.mSet = this.mSet || this.set; //in case it was already set (a PropTween can only have one modifier)\n\n this.set = _setterWithModifier;\n this.m = func;\n this.mt = target; //modifier target\n\n this.tween = tween;\n };\n\n return PropTween;\n}(); //Initialization tasks\n\n_forEachName(_callbackNames + \"parent,duration,ease,delay,overwrite,runBackwards,startAt,yoyo,immediateRender,repeat,repeatDelay,data,paused,reversed,lazy,callbackScope,stringFilter,id,yoyoEase,stagger,inherit,repeatRefresh,keyframes,autoRevert,scrollTrigger\", function (name) {\n return _reservedProps[name] = 1;\n});\n\n_globals.TweenMax = _globals.TweenLite = Tween;\n_globals.TimelineLite = _globals.TimelineMax = Timeline;\n_globalTimeline = new Timeline({\n sortChildren: false,\n defaults: _defaults,\n autoRemoveChildren: true,\n id: \"root\",\n smoothChildTiming: true\n});\n_config.stringFilter = _colorStringFilter;\n\nvar _media = [],\n _listeners = {},\n _emptyArray = [],\n _lastMediaTime = 0,\n _contextID = 0,\n _dispatch = function _dispatch(type) {\n return (_listeners[type] || _emptyArray).map(function (f) {\n return f();\n });\n},\n _onMediaChange = function _onMediaChange() {\n var time = Date.now(),\n matches = [];\n\n if (time - _lastMediaTime > 2) {\n _dispatch(\"matchMediaInit\");\n\n _media.forEach(function (c) {\n var queries = c.queries,\n conditions = c.conditions,\n match,\n p,\n anyMatch,\n toggled;\n\n for (p in queries) {\n match = _win.matchMedia(queries[p]).matches; // Firefox doesn't update the \"matches\" property of the MediaQueryList object correctly - it only does so as it calls its change handler - so we must re-create a media query here to ensure it's accurate.\n\n match && (anyMatch = 1);\n\n if (match !== conditions[p]) {\n conditions[p] = match;\n toggled = 1;\n }\n }\n\n if (toggled) {\n c.revert();\n anyMatch && matches.push(c);\n }\n });\n\n _dispatch(\"matchMediaRevert\");\n\n matches.forEach(function (c) {\n return c.onMatch(c, function (func) {\n return c.add(null, func);\n });\n });\n _lastMediaTime = time;\n\n _dispatch(\"matchMedia\");\n }\n};\n\nvar Context = /*#__PURE__*/function () {\n function Context(func, scope) {\n this.selector = scope && selector(scope);\n this.data = [];\n this._r = []; // returned/cleanup functions\n\n this.isReverted = false;\n this.id = _contextID++; // to work around issues that frameworks like Vue cause by making things into Proxies which make it impossible to do something like _media.indexOf(this) because \"this\" would no longer refer to the Context instance itself - it'd refer to a Proxy! We needed a way to identify the context uniquely\n\n func && this.add(func);\n }\n\n var _proto5 = Context.prototype;\n\n _proto5.add = function add(name, func, scope) {\n // possible future addition if we need the ability to add() an animation to a context and for whatever reason cannot create that animation inside of a context.add(() => {...}) function.\n // if (name && _isFunction(name.revert)) {\n // \tthis.data.push(name);\n // \treturn (name._ctx = this);\n // }\n if (_isFunction(name)) {\n scope = func;\n func = name;\n name = _isFunction;\n }\n\n var self = this,\n f = function f() {\n var prev = _context,\n prevSelector = self.selector,\n result;\n prev && prev !== self && prev.data.push(self);\n scope && (self.selector = selector(scope));\n _context = self;\n result = func.apply(self, arguments);\n _isFunction(result) && self._r.push(result);\n _context = prev;\n self.selector = prevSelector;\n self.isReverted = false;\n return result;\n };\n\n self.last = f;\n return name === _isFunction ? f(self, function (func) {\n return self.add(null, func);\n }) : name ? self[name] = f : f;\n };\n\n _proto5.ignore = function ignore(func) {\n var prev = _context;\n _context = null;\n func(this);\n _context = prev;\n };\n\n _proto5.getTweens = function getTweens() {\n var a = [];\n this.data.forEach(function (e) {\n return e instanceof Context ? a.push.apply(a, e.getTweens()) : e instanceof Tween && !(e.parent && e.parent.data === \"nested\") && a.push(e);\n });\n return a;\n };\n\n _proto5.clear = function clear() {\n this._r.length = this.data.length = 0;\n };\n\n _proto5.kill = function kill(revert, matchMedia) {\n var _this4 = this;\n\n if (revert) {\n (function () {\n var tweens = _this4.getTweens(),\n i = _this4.data.length,\n t;\n\n while (i--) {\n // Flip plugin tweens are very different in that they should actually be pushed to their end. The plugin replaces the timeline's .revert() method to do exactly that. But we also need to remove any of those nested tweens inside the flip timeline so that they don't get individually reverted.\n t = _this4.data[i];\n\n if (t.data === \"isFlip\") {\n t.revert();\n t.getChildren(true, true, false).forEach(function (tween) {\n return tweens.splice(tweens.indexOf(tween), 1);\n });\n }\n } // save as an object so that we can cache the globalTime for each tween to optimize performance during the sort\n\n\n tweens.map(function (t) {\n return {\n g: t._dur || t._delay || t._sat && !t._sat.vars.immediateRender ? t.globalTime(0) : -Infinity,\n t: t\n };\n }).sort(function (a, b) {\n return b.g - a.g || -Infinity;\n }).forEach(function (o) {\n return o.t.revert(revert);\n }); // note: all of the _startAt tweens should be reverted in reverse order that they were created, and they'll all have the same globalTime (-1) so the \" || -1\" in the sort keeps the order properly.\n\n i = _this4.data.length;\n\n while (i--) {\n // make sure we loop backwards so that, for example, SplitTexts that were created later on the same element get reverted first\n t = _this4.data[i];\n\n if (t instanceof Timeline) {\n if (t.data !== \"nested\") {\n t.scrollTrigger && t.scrollTrigger.revert();\n t.kill(); // don't revert() the timeline because that's duplicating efforts since we already reverted all the tweens\n }\n } else {\n !(t instanceof Tween) && t.revert && t.revert(revert);\n }\n }\n\n _this4._r.forEach(function (f) {\n return f(revert, _this4);\n });\n\n _this4.isReverted = true;\n })();\n } else {\n this.data.forEach(function (e) {\n return e.kill && e.kill();\n });\n }\n\n this.clear();\n\n if (matchMedia) {\n var i = _media.length;\n\n while (i--) {\n // previously, we checked _media.indexOf(this), but some frameworks like Vue enforce Proxy objects that make it impossible to get the proper result that way, so we must use a unique ID number instead.\n _media[i].id === this.id && _media.splice(i, 1);\n }\n }\n } // killWithCleanup() {\n // \tthis.kill();\n // \tthis._r.forEach(f => f(false, this));\n // }\n ;\n\n _proto5.revert = function revert(config) {\n this.kill(config || {});\n };\n\n return Context;\n}();\n\nvar MatchMedia = /*#__PURE__*/function () {\n function MatchMedia(scope) {\n this.contexts = [];\n this.scope = scope;\n _context && _context.data.push(this);\n }\n\n var _proto6 = MatchMedia.prototype;\n\n _proto6.add = function add(conditions, func, scope) {\n _isObject(conditions) || (conditions = {\n matches: conditions\n });\n var context = new Context(0, scope || this.scope),\n cond = context.conditions = {},\n mq,\n p,\n active;\n _context && !context.selector && (context.selector = _context.selector); // in case a context is created inside a context. Like a gsap.matchMedia() that's inside a scoped gsap.context()\n\n this.contexts.push(context);\n func = context.add(\"onMatch\", func);\n context.queries = conditions;\n\n for (p in conditions) {\n if (p === \"all\") {\n active = 1;\n } else {\n mq = _win.matchMedia(conditions[p]);\n\n if (mq) {\n _media.indexOf(context) < 0 && _media.push(context);\n (cond[p] = mq.matches) && (active = 1);\n mq.addListener ? mq.addListener(_onMediaChange) : mq.addEventListener(\"change\", _onMediaChange);\n }\n }\n }\n\n active && func(context, function (f) {\n return context.add(null, f);\n });\n return this;\n } // refresh() {\n // \tlet time = _lastMediaTime,\n // \t\tmedia = _media;\n // \t_lastMediaTime = -1;\n // \t_media = this.contexts;\n // \t_onMediaChange();\n // \t_lastMediaTime = time;\n // \t_media = media;\n // }\n ;\n\n _proto6.revert = function revert(config) {\n this.kill(config || {});\n };\n\n _proto6.kill = function kill(revert) {\n this.contexts.forEach(function (c) {\n return c.kill(revert, true);\n });\n };\n\n return MatchMedia;\n}();\n/*\n * --------------------------------------------------------------------------------------\n * GSAP\n * --------------------------------------------------------------------------------------\n */\n\n\nvar _gsap = {\n registerPlugin: function registerPlugin() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n args.forEach(function (config) {\n return _createPlugin(config);\n });\n },\n timeline: function timeline(vars) {\n return new Timeline(vars);\n },\n getTweensOf: function getTweensOf(targets, onlyActive) {\n return _globalTimeline.getTweensOf(targets, onlyActive);\n },\n getProperty: function getProperty(target, property, unit, uncache) {\n _isString(target) && (target = toArray(target)[0]); //in case selector text or an array is passed in\n\n var getter = _getCache(target || {}).get,\n format = unit ? _passThrough : _numericIfPossible;\n\n unit === \"native\" && (unit = \"\");\n return !target ? target : !property ? function (property, unit, uncache) {\n return format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache));\n } : format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache));\n },\n quickSetter: function quickSetter(target, property, unit) {\n target = toArray(target);\n\n if (target.length > 1) {\n var setters = target.map(function (t) {\n return gsap.quickSetter(t, property, unit);\n }),\n l = setters.length;\n return function (value) {\n var i = l;\n\n while (i--) {\n setters[i](value);\n }\n };\n }\n\n target = target[0] || {};\n\n var Plugin = _plugins[property],\n cache = _getCache(target),\n p = cache.harness && (cache.harness.aliases || {})[property] || property,\n // in case it's an alias, like \"rotate\" for \"rotation\".\n setter = Plugin ? function (value) {\n var p = new Plugin();\n _quickTween._pt = 0;\n p.init(target, unit ? value + unit : value, _quickTween, 0, [target]);\n p.render(1, p);\n _quickTween._pt && _renderPropTweens(1, _quickTween);\n } : cache.set(target, p);\n\n return Plugin ? setter : function (value) {\n return setter(target, p, unit ? value + unit : value, cache, 1);\n };\n },\n quickTo: function quickTo(target, property, vars) {\n var _setDefaults2;\n\n var tween = gsap.to(target, _setDefaults((_setDefaults2 = {}, _setDefaults2[property] = \"+=0.1\", _setDefaults2.paused = true, _setDefaults2.stagger = 0, _setDefaults2), vars || {})),\n func = function func(value, start, startIsRelative) {\n return tween.resetTo(property, value, start, startIsRelative);\n };\n\n func.tween = tween;\n return func;\n },\n isTweening: function isTweening(targets) {\n return _globalTimeline.getTweensOf(targets, true).length > 0;\n },\n defaults: function defaults(value) {\n value && value.ease && (value.ease = _parseEase(value.ease, _defaults.ease));\n return _mergeDeep(_defaults, value || {});\n },\n config: function config(value) {\n return _mergeDeep(_config, value || {});\n },\n registerEffect: function registerEffect(_ref3) {\n var name = _ref3.name,\n effect = _ref3.effect,\n plugins = _ref3.plugins,\n defaults = _ref3.defaults,\n extendTimeline = _ref3.extendTimeline;\n (plugins || \"\").split(\",\").forEach(function (pluginName) {\n return pluginName && !_plugins[pluginName] && !_globals[pluginName] && _warn(name + \" effect requires \" + pluginName + \" plugin.\");\n });\n\n _effects[name] = function (targets, vars, tl) {\n return effect(toArray(targets), _setDefaults(vars || {}, defaults), tl);\n };\n\n if (extendTimeline) {\n Timeline.prototype[name] = function (targets, vars, position) {\n return this.add(_effects[name](targets, _isObject(vars) ? vars : (position = vars) && {}, this), position);\n };\n }\n },\n registerEase: function registerEase(name, ease) {\n _easeMap[name] = _parseEase(ease);\n },\n parseEase: function parseEase(ease, defaultEase) {\n return arguments.length ? _parseEase(ease, defaultEase) : _easeMap;\n },\n getById: function getById(id) {\n return _globalTimeline.getById(id);\n },\n exportRoot: function exportRoot(vars, includeDelayedCalls) {\n if (vars === void 0) {\n vars = {};\n }\n\n var tl = new Timeline(vars),\n child,\n next;\n tl.smoothChildTiming = _isNotFalse(vars.smoothChildTiming);\n\n _globalTimeline.remove(tl);\n\n tl._dp = 0; //otherwise it'll get re-activated when adding children and be re-introduced into _globalTimeline's linked list (then added to itself).\n\n tl._time = tl._tTime = _globalTimeline._time;\n child = _globalTimeline._first;\n\n while (child) {\n next = child._next;\n\n if (includeDelayedCalls || !(!child._dur && child instanceof Tween && child.vars.onComplete === child._targets[0])) {\n _addToTimeline(tl, child, child._start - child._delay);\n }\n\n child = next;\n }\n\n _addToTimeline(_globalTimeline, tl, 0);\n\n return tl;\n },\n context: function context(func, scope) {\n return func ? new Context(func, scope) : _context;\n },\n matchMedia: function matchMedia(scope) {\n return new MatchMedia(scope);\n },\n matchMediaRefresh: function matchMediaRefresh() {\n return _media.forEach(function (c) {\n var cond = c.conditions,\n found,\n p;\n\n for (p in cond) {\n if (cond[p]) {\n cond[p] = false;\n found = 1;\n }\n }\n\n found && c.revert();\n }) || _onMediaChange();\n },\n addEventListener: function addEventListener(type, callback) {\n var a = _listeners[type] || (_listeners[type] = []);\n ~a.indexOf(callback) || a.push(callback);\n },\n removeEventListener: function removeEventListener(type, callback) {\n var a = _listeners[type],\n i = a && a.indexOf(callback);\n i >= 0 && a.splice(i, 1);\n },\n utils: {\n wrap: wrap,\n wrapYoyo: wrapYoyo,\n distribute: distribute,\n random: random,\n snap: snap,\n normalize: normalize,\n getUnit: getUnit,\n clamp: clamp,\n splitColor: splitColor,\n toArray: toArray,\n selector: selector,\n mapRange: mapRange,\n pipe: pipe,\n unitize: unitize,\n interpolate: interpolate,\n shuffle: shuffle\n },\n install: _install,\n effects: _effects,\n ticker: _ticker,\n updateRoot: Timeline.updateRoot,\n plugins: _plugins,\n globalTimeline: _globalTimeline,\n core: {\n PropTween: PropTween,\n globals: _addGlobal,\n Tween: Tween,\n Timeline: Timeline,\n Animation: Animation,\n getCache: _getCache,\n _removeLinkedListItem: _removeLinkedListItem,\n reverting: function reverting() {\n return _reverting;\n },\n context: function context(toAdd) {\n if (toAdd && _context) {\n _context.data.push(toAdd);\n\n toAdd._ctx = _context;\n }\n\n return _context;\n },\n suppressOverwrites: function suppressOverwrites(value) {\n return _suppressOverwrites = value;\n }\n }\n};\n\n_forEachName(\"to,from,fromTo,delayedCall,set,killTweensOf\", function (name) {\n return _gsap[name] = Tween[name];\n});\n\n_ticker.add(Timeline.updateRoot);\n\n_quickTween = _gsap.to({}, {\n duration: 0\n}); // ---- EXTRA PLUGINS --------------------------------------------------------\n\nvar _getPluginPropTween = function _getPluginPropTween(plugin, prop) {\n var pt = plugin._pt;\n\n while (pt && pt.p !== prop && pt.op !== prop && pt.fp !== prop) {\n pt = pt._next;\n }\n\n return pt;\n},\n _addModifiers = function _addModifiers(tween, modifiers) {\n var targets = tween._targets,\n p,\n i,\n pt;\n\n for (p in modifiers) {\n i = targets.length;\n\n while (i--) {\n pt = tween._ptLookup[i][p];\n\n if (pt && (pt = pt.d)) {\n if (pt._pt) {\n // is a plugin\n pt = _getPluginPropTween(pt, p);\n }\n\n pt && pt.modifier && pt.modifier(modifiers[p], tween, targets[i], p);\n }\n }\n }\n},\n _buildModifierPlugin = function _buildModifierPlugin(name, modifier) {\n return {\n name: name,\n headless: 1,\n rawVars: 1,\n //don't pre-process function-based values or \"random()\" strings.\n init: function init(target, vars, tween) {\n tween._onInit = function (tween) {\n var temp, p;\n\n if (_isString(vars)) {\n temp = {};\n\n _forEachName(vars, function (name) {\n return temp[name] = 1;\n }); //if the user passes in a comma-delimited list of property names to roundProps, like \"x,y\", we round to whole numbers.\n\n\n vars = temp;\n }\n\n if (modifier) {\n temp = {};\n\n for (p in vars) {\n temp[p] = modifier(vars[p]);\n }\n\n vars = temp;\n }\n\n _addModifiers(tween, vars);\n };\n }\n };\n}; //register core plugins\n\n\nexport var gsap = _gsap.registerPlugin({\n name: \"attr\",\n init: function init(target, vars, tween, index, targets) {\n var p, pt, v;\n this.tween = tween;\n\n for (p in vars) {\n v = target.getAttribute(p) || \"\";\n pt = this.add(target, \"setAttribute\", (v || 0) + \"\", vars[p], index, targets, 0, 0, p);\n pt.op = p;\n pt.b = v; // record the beginning value so we can revert()\n\n this._props.push(p);\n }\n },\n render: function render(ratio, data) {\n var pt = data._pt;\n\n while (pt) {\n _reverting ? pt.set(pt.t, pt.p, pt.b, pt) : pt.r(ratio, pt.d); // if reverting, go back to the original (pt.b)\n\n pt = pt._next;\n }\n }\n}, {\n name: \"endArray\",\n headless: 1,\n init: function init(target, value) {\n var i = value.length;\n\n while (i--) {\n this.add(target, i, target[i] || 0, value[i], 0, 0, 0, 0, 0, 1);\n }\n }\n}, _buildModifierPlugin(\"roundProps\", _roundModifier), _buildModifierPlugin(\"modifiers\"), _buildModifierPlugin(\"snap\", snap)) || _gsap; //to prevent the core plugins from being dropped via aggressive tree shaking, we must include them in the variable declaration in this way.\n\nTween.version = Timeline.version = gsap.version = \"3.14.2\";\n_coreReady = 1;\n_windowExists() && _wake();\nvar Power0 = _easeMap.Power0,\n Power1 = _easeMap.Power1,\n Power2 = _easeMap.Power2,\n Power3 = _easeMap.Power3,\n Power4 = _easeMap.Power4,\n Linear = _easeMap.Linear,\n Quad = _easeMap.Quad,\n Cubic = _easeMap.Cubic,\n Quart = _easeMap.Quart,\n Quint = _easeMap.Quint,\n Strong = _easeMap.Strong,\n Elastic = _easeMap.Elastic,\n Back = _easeMap.Back,\n SteppedEase = _easeMap.SteppedEase,\n Bounce = _easeMap.Bounce,\n Sine = _easeMap.Sine,\n Expo = _easeMap.Expo,\n Circ = _easeMap.Circ;\nexport { Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ };\nexport { Tween as TweenMax, Tween as TweenLite, Timeline as TimelineMax, Timeline as TimelineLite, gsap as default, wrap, wrapYoyo, distribute, random, snap, normalize, getUnit, clamp, splitColor, toArray, selector, mapRange, pipe, unitize, interpolate, shuffle }; //export some internal methods/orojects for use in CSSPlugin so that we can externalize that file and allow custom builds that exclude it.\n\nexport { _getProperty, _numExp, _numWithUnitExp, _isString, _isUndefined, _renderComplexString, _relExp, _setDefaults, _removeLinkedListItem, _forEachName, _sortPropTweensByPriority, _colorStringFilter, _replaceRandom, _checkPlugin, _plugins, _ticker, _config, _roundModifier, _round, _missingPlugin, _getSetter, _getCache, _colorExp, _parseRelative };","/*!\n * CSSPlugin 3.14.2\n * https://gsap.com\n *\n * Copyright 2008-2025, GreenSock. All rights reserved.\n * Subject to the terms at https://gsap.com/standard-license\n * @author: Jack Doyle, jack@greensock.com\n*/\n\n/* eslint-disable */\nimport { gsap, _getProperty, _numExp, _numWithUnitExp, getUnit, _isString, _isUndefined, _renderComplexString, _relExp, _forEachName, _sortPropTweensByPriority, _colorStringFilter, _checkPlugin, _replaceRandom, _plugins, GSCache, PropTween, _config, _ticker, _round, _missingPlugin, _getSetter, _getCache, _colorExp, _parseRelative, _setDefaults, _removeLinkedListItem //for the commented-out className feature.\n} from \"./gsap-core.js\";\n\nvar _win,\n _doc,\n _docElement,\n _pluginInitted,\n _tempDiv,\n _tempDivStyler,\n _recentSetterPlugin,\n _reverting,\n _windowExists = function _windowExists() {\n return typeof window !== \"undefined\";\n},\n _transformProps = {},\n _RAD2DEG = 180 / Math.PI,\n _DEG2RAD = Math.PI / 180,\n _atan2 = Math.atan2,\n _bigNum = 1e8,\n _capsExp = /([A-Z])/g,\n _horizontalExp = /(left|right|width|margin|padding|x)/i,\n _complexExp = /[\\s,\\(]\\S/,\n _propertyAliases = {\n autoAlpha: \"opacity,visibility\",\n scale: \"scaleX,scaleY\",\n alpha: \"opacity\"\n},\n _renderCSSProp = function _renderCSSProp(ratio, data) {\n return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data);\n},\n _renderPropWithEnd = function _renderPropWithEnd(ratio, data) {\n return data.set(data.t, data.p, ratio === 1 ? data.e : Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data);\n},\n _renderCSSPropWithBeginning = function _renderCSSPropWithBeginning(ratio, data) {\n return data.set(data.t, data.p, ratio ? Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u : data.b, data);\n},\n //if units change, we need a way to render the original unit/value when the tween goes all the way back to the beginning (ratio:0)\n_renderCSSPropWithBeginningAndEnd = function _renderCSSPropWithBeginningAndEnd(ratio, data) {\n return data.set(data.t, data.p, ratio === 1 ? data.e : ratio ? Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u : data.b, data);\n},\n //if units change, we need a way to render the original unit/value when the tween goes all the way back to the beginning (ratio:0)\n_renderRoundedCSSProp = function _renderRoundedCSSProp(ratio, data) {\n var value = data.s + data.c * ratio;\n data.set(data.t, data.p, ~~(value + (value < 0 ? -.5 : .5)) + data.u, data);\n},\n _renderNonTweeningValue = function _renderNonTweeningValue(ratio, data) {\n return data.set(data.t, data.p, ratio ? data.e : data.b, data);\n},\n _renderNonTweeningValueOnlyAtEnd = function _renderNonTweeningValueOnlyAtEnd(ratio, data) {\n return data.set(data.t, data.p, ratio !== 1 ? data.b : data.e, data);\n},\n _setterCSSStyle = function _setterCSSStyle(target, property, value) {\n return target.style[property] = value;\n},\n _setterCSSProp = function _setterCSSProp(target, property, value) {\n return target.style.setProperty(property, value);\n},\n _setterTransform = function _setterTransform(target, property, value) {\n return target._gsap[property] = value;\n},\n _setterScale = function _setterScale(target, property, value) {\n return target._gsap.scaleX = target._gsap.scaleY = value;\n},\n _setterScaleWithRender = function _setterScaleWithRender(target, property, value, data, ratio) {\n var cache = target._gsap;\n cache.scaleX = cache.scaleY = value;\n cache.renderTransform(ratio, cache);\n},\n _setterTransformWithRender = function _setterTransformWithRender(target, property, value, data, ratio) {\n var cache = target._gsap;\n cache[property] = value;\n cache.renderTransform(ratio, cache);\n},\n _transformProp = \"transform\",\n _transformOriginProp = _transformProp + \"Origin\",\n _saveStyle = function _saveStyle(property, isNotCSS) {\n var _this = this;\n\n var target = this.target,\n style = target.style,\n cache = target._gsap;\n\n if (property in _transformProps && style) {\n this.tfm = this.tfm || {};\n\n if (property !== \"transform\") {\n property = _propertyAliases[property] || property;\n ~property.indexOf(\",\") ? property.split(\",\").forEach(function (a) {\n return _this.tfm[a] = _get(target, a);\n }) : this.tfm[property] = cache.x ? cache[property] : _get(target, property); // note: scale would map to \"scaleX,scaleY\", thus we loop and apply them both.\n\n property === _transformOriginProp && (this.tfm.zOrigin = cache.zOrigin);\n } else {\n return _propertyAliases.transform.split(\",\").forEach(function (p) {\n return _saveStyle.call(_this, p, isNotCSS);\n });\n }\n\n if (this.props.indexOf(_transformProp) >= 0) {\n return;\n }\n\n if (cache.svg) {\n this.svgo = target.getAttribute(\"data-svg-origin\");\n this.props.push(_transformOriginProp, isNotCSS, \"\");\n }\n\n property = _transformProp;\n }\n\n (style || isNotCSS) && this.props.push(property, isNotCSS, style[property]);\n},\n _removeIndependentTransforms = function _removeIndependentTransforms(style) {\n if (style.translate) {\n style.removeProperty(\"translate\");\n style.removeProperty(\"scale\");\n style.removeProperty(\"rotate\");\n }\n},\n _revertStyle = function _revertStyle() {\n var props = this.props,\n target = this.target,\n style = target.style,\n cache = target._gsap,\n i,\n p;\n\n for (i = 0; i < props.length; i += 3) {\n // stored like this: property, isNotCSS, value\n if (!props[i + 1]) {\n props[i + 2] ? style[props[i]] = props[i + 2] : style.removeProperty(props[i].substr(0, 2) === \"--\" ? props[i] : props[i].replace(_capsExp, \"-$1\").toLowerCase());\n } else if (props[i + 1] === 2) {\n // non-CSS value (function-based)\n target[props[i]](props[i + 2]);\n } else {\n // non-CSS value (not function-based)\n target[props[i]] = props[i + 2];\n }\n }\n\n if (this.tfm) {\n for (p in this.tfm) {\n cache[p] = this.tfm[p];\n }\n\n if (cache.svg) {\n cache.renderTransform();\n target.setAttribute(\"data-svg-origin\", this.svgo || \"\");\n }\n\n i = _reverting();\n\n if ((!i || !i.isStart) && !style[_transformProp]) {\n _removeIndependentTransforms(style);\n\n if (cache.zOrigin && style[_transformOriginProp]) {\n style[_transformOriginProp] += \" \" + cache.zOrigin + \"px\"; // since we're uncaching, we must put the zOrigin back into the transformOrigin so that we can pull it out accurately when we parse again. Otherwise, we'd lose the z portion of the origin since we extract it to protect from Safari bugs.\n\n cache.zOrigin = 0;\n cache.renderTransform();\n }\n\n cache.uncache = 1; // if it's a startAt that's being reverted in the _initTween() of the core, we don't need to uncache transforms. This is purely a performance optimization.\n }\n }\n},\n _getStyleSaver = function _getStyleSaver(target, properties) {\n var saver = {\n target: target,\n props: [],\n revert: _revertStyle,\n save: _saveStyle\n };\n target._gsap || gsap.core.getCache(target); // just make sure there's a _gsap cache defined because we read from it in _saveStyle() and it's more efficient to just check it here once.\n\n properties && target.style && target.nodeType && properties.split(\",\").forEach(function (p) {\n return saver.save(p);\n }); // make sure it's a DOM node too.\n\n return saver;\n},\n _supports3D,\n _createElement = function _createElement(type, ns) {\n var e = _doc.createElementNS ? _doc.createElementNS((ns || \"http://www.w3.org/1999/xhtml\").replace(/^https/, \"http\"), type) : _doc.createElement(type); //some servers swap in https for http in the namespace which can break things, making \"style\" inaccessible.\n\n return e && e.style ? e : _doc.createElement(type); //some environments won't allow access to the element's style when created with a namespace in which case we default to the standard createElement() to work around the issue. Also note that when GSAP is embedded directly inside an SVG file, createElement() won't allow access to the style object in Firefox (see https://gsap.com/forums/topic/20215-problem-using-tweenmax-in-standalone-self-containing-svg-file-err-cannot-set-property-csstext-of-undefined/).\n},\n _getComputedProperty = function _getComputedProperty(target, property, skipPrefixFallback) {\n var cs = getComputedStyle(target);\n return cs[property] || cs.getPropertyValue(property.replace(_capsExp, \"-$1\").toLowerCase()) || cs.getPropertyValue(property) || !skipPrefixFallback && _getComputedProperty(target, _checkPropPrefix(property) || property, 1) || \"\"; //css variables may not need caps swapped out for dashes and lowercase.\n},\n _prefixes = \"O,Moz,ms,Ms,Webkit\".split(\",\"),\n _checkPropPrefix = function _checkPropPrefix(property, element, preferPrefix) {\n var e = element || _tempDiv,\n s = e.style,\n i = 5;\n\n if (property in s && !preferPrefix) {\n return property;\n }\n\n property = property.charAt(0).toUpperCase() + property.substr(1);\n\n while (i-- && !(_prefixes[i] + property in s)) {}\n\n return i < 0 ? null : (i === 3 ? \"ms\" : i >= 0 ? _prefixes[i] : \"\") + property;\n},\n _initCore = function _initCore() {\n if (_windowExists() && window.document) {\n _win = window;\n _doc = _win.document;\n _docElement = _doc.documentElement;\n _tempDiv = _createElement(\"div\") || {\n style: {}\n };\n _tempDivStyler = _createElement(\"div\");\n _transformProp = _checkPropPrefix(_transformProp);\n _transformOriginProp = _transformProp + \"Origin\";\n _tempDiv.style.cssText = \"border-width:0;line-height:0;position:absolute;padding:0\"; //make sure to override certain properties that may contaminate measurements, in case the user has overreaching style sheets.\n\n _supports3D = !!_checkPropPrefix(\"perspective\");\n _reverting = gsap.core.reverting;\n _pluginInitted = 1;\n }\n},\n _getReparentedCloneBBox = function _getReparentedCloneBBox(target) {\n //works around issues in some browsers (like Firefox) that don't correctly report getBBox() on SVG elements inside a <defs> element and/or <mask>. We try creating an SVG, adding it to the documentElement and toss the element in there so that it's definitely part of the rendering tree, then grab the bbox and if it works, we actually swap out the original getBBox() method for our own that does these extra steps whenever getBBox is needed. This helps ensure that performance is optimal (only do all these extra steps when absolutely necessary...most elements don't need it).\n var owner = target.ownerSVGElement,\n svg = _createElement(\"svg\", owner && owner.getAttribute(\"xmlns\") || \"http://www.w3.org/2000/svg\"),\n clone = target.cloneNode(true),\n bbox;\n\n clone.style.display = \"block\";\n svg.appendChild(clone);\n\n _docElement.appendChild(svg);\n\n try {\n bbox = clone.getBBox();\n } catch (e) {}\n\n svg.removeChild(clone);\n\n _docElement.removeChild(svg);\n\n return bbox;\n},\n _getAttributeFallbacks = function _getAttributeFallbacks(target, attributesArray) {\n var i = attributesArray.length;\n\n while (i--) {\n if (target.hasAttribute(attributesArray[i])) {\n return target.getAttribute(attributesArray[i]);\n }\n }\n},\n _getBBox = function _getBBox(target) {\n var bounds, cloned;\n\n try {\n bounds = target.getBBox(); //Firefox throws errors if you try calling getBBox() on an SVG element that's not rendered (like in a <symbol> or <defs>). https://bugzilla.mozilla.org/show_bug.cgi?id=612118\n } catch (error) {\n bounds = _getReparentedCloneBBox(target);\n cloned = 1;\n }\n\n bounds && (bounds.width || bounds.height) || cloned || (bounds = _getReparentedCloneBBox(target)); //some browsers (like Firefox) misreport the bounds if the element has zero width and height (it just assumes it's at x:0, y:0), thus we need to manually grab the position in that case.\n\n return bounds && !bounds.width && !bounds.x && !bounds.y ? {\n x: +_getAttributeFallbacks(target, [\"x\", \"cx\", \"x1\"]) || 0,\n y: +_getAttributeFallbacks(target, [\"y\", \"cy\", \"y1\"]) || 0,\n width: 0,\n height: 0\n } : bounds;\n},\n _isSVG = function _isSVG(e) {\n return !!(e.getCTM && (!e.parentNode || e.ownerSVGElement) && _getBBox(e));\n},\n //reports if the element is an SVG on which getBBox() actually works\n_removeProperty = function _removeProperty(target, property) {\n if (property) {\n var style = target.style,\n first2Chars;\n\n if (property in _transformProps && property !== _transformOriginProp) {\n property = _transformProp;\n }\n\n if (style.removeProperty) {\n first2Chars = property.substr(0, 2);\n\n if (first2Chars === \"ms\" || property.substr(0, 6) === \"webkit\") {\n //Microsoft and some Webkit browsers don't conform to the standard of capitalizing the first prefix character, so we adjust so that when we prefix the caps with a dash, it's correct (otherwise it'd be \"ms-transform\" instead of \"-ms-transform\" for IE9, for example)\n property = \"-\" + property;\n }\n\n style.removeProperty(first2Chars === \"--\" ? property : property.replace(_capsExp, \"-$1\").toLowerCase());\n } else {\n //note: old versions of IE use \"removeAttribute()\" instead of \"removeProperty()\"\n style.removeAttribute(property);\n }\n }\n},\n _addNonTweeningPT = function _addNonTweeningPT(plugin, target, property, beginning, end, onlySetAtEnd) {\n var pt = new PropTween(plugin._pt, target, property, 0, 1, onlySetAtEnd ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue);\n plugin._pt = pt;\n pt.b = beginning;\n pt.e = end;\n\n plugin._props.push(property);\n\n return pt;\n},\n _nonConvertibleUnits = {\n deg: 1,\n rad: 1,\n turn: 1\n},\n _nonStandardLayouts = {\n grid: 1,\n flex: 1\n},\n //takes a single value like 20px and converts it to the unit specified, like \"%\", returning only the numeric amount.\n_convertToUnit = function _convertToUnit(target, property, value, unit) {\n var curValue = parseFloat(value) || 0,\n curUnit = (value + \"\").trim().substr((curValue + \"\").length) || \"px\",\n // some browsers leave extra whitespace at the beginning of CSS variables, hence the need to trim()\n style = _tempDiv.style,\n horizontal = _horizontalExp.test(property),\n isRootSVG = target.tagName.toLowerCase() === \"svg\",\n measureProperty = (isRootSVG ? \"client\" : \"offset\") + (horizontal ? \"Width\" : \"Height\"),\n amount = 100,\n toPixels = unit === \"px\",\n toPercent = unit === \"%\",\n px,\n parent,\n cache,\n isSVG;\n\n if (unit === curUnit || !curValue || _nonConvertibleUnits[unit] || _nonConvertibleUnits[curUnit]) {\n return curValue;\n }\n\n curUnit !== \"px\" && !toPixels && (curValue = _convertToUnit(target, property, value, \"px\"));\n isSVG = target.getCTM && _isSVG(target);\n\n if ((toPercent || curUnit === \"%\") && (_transformProps[property] || ~property.indexOf(\"adius\"))) {\n px = isSVG ? target.getBBox()[horizontal ? \"width\" : \"height\"] : target[measureProperty];\n return _round(toPercent ? curValue / px * amount : curValue / 100 * px);\n }\n\n style[horizontal ? \"width\" : \"height\"] = amount + (toPixels ? curUnit : unit);\n parent = unit !== \"rem\" && ~property.indexOf(\"adius\") || unit === \"em\" && target.appendChild && !isRootSVG ? target : target.parentNode;\n\n if (isSVG) {\n parent = (target.ownerSVGElement || {}).parentNode;\n }\n\n if (!parent || parent === _doc || !parent.appendChild) {\n parent = _doc.body;\n }\n\n cache = parent._gsap;\n\n if (cache && toPercent && cache.width && horizontal && cache.time === _ticker.time && !cache.uncache) {\n return _round(curValue / cache.width * amount);\n } else {\n if (toPercent && (property === \"height\" || property === \"width\")) {\n // if we're dealing with width/height that's inside a container with padding and/or it's a flexbox/grid container, we must apply it to the target itself rather than the _tempDiv in order to ensure complete accuracy, factoring in the parent's padding.\n var v = target.style[property];\n target.style[property] = amount + unit;\n px = target[measureProperty];\n v ? target.style[property] = v : _removeProperty(target, property);\n } else {\n (toPercent || curUnit === \"%\") && !_nonStandardLayouts[_getComputedProperty(parent, \"display\")] && (style.position = _getComputedProperty(target, \"position\"));\n parent === target && (style.position = \"static\"); // like for borderRadius, if it's a % we must have it relative to the target itself but that may not have position: relative or position: absolute in which case it'd go up the chain until it finds its offsetParent (bad). position: static protects against that.\n\n parent.appendChild(_tempDiv);\n px = _tempDiv[measureProperty];\n parent.removeChild(_tempDiv);\n style.position = \"absolute\";\n }\n\n if (horizontal && toPercent) {\n cache = _getCache(parent);\n cache.time = _ticker.time;\n cache.width = parent[measureProperty];\n }\n }\n\n return _round(toPixels ? px * curValue / amount : px && curValue ? amount / px * curValue : 0);\n},\n _get = function _get(target, property, unit, uncache) {\n var value;\n _pluginInitted || _initCore();\n\n if (property in _propertyAliases && property !== \"transform\") {\n property = _propertyAliases[property];\n\n if (~property.indexOf(\",\")) {\n property = property.split(\",\")[0];\n }\n }\n\n if (_transformProps[property] && property !== \"transform\") {\n value = _parseTransform(target, uncache);\n value = property !== \"transformOrigin\" ? value[property] : value.svg ? value.origin : _firstTwoOnly(_getComputedProperty(target, _transformOriginProp)) + \" \" + value.zOrigin + \"px\";\n } else {\n value = target.style[property];\n\n if (!value || value === \"auto\" || uncache || ~(value + \"\").indexOf(\"calc(\")) {\n value = _specialProps[property] && _specialProps[property](target, property, unit) || _getComputedProperty(target, property) || _getProperty(target, property) || (property === \"opacity\" ? 1 : 0); // note: some browsers, like Firefox, don't report borderRadius correctly! Instead, it only reports every corner like borderTopLeftRadius\n }\n }\n\n return unit && !~(value + \"\").trim().indexOf(\" \") ? _convertToUnit(target, property, value, unit) + unit : value;\n},\n _tweenComplexCSSString = function _tweenComplexCSSString(target, prop, start, end) {\n // note: we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus \"this\" would refer to the plugin.\n if (!start || start === \"none\") {\n // some browsers like Safari actually PREFER the prefixed property and mis-report the unprefixed value like clipPath (BUG). In other words, even though clipPath exists in the style (\"clipPath\" in target.style) and it's set in the CSS properly (along with -webkit-clip-path), Safari reports clipPath as \"none\" whereas WebkitClipPath reports accurately like \"ellipse(100% 0% at 50% 0%)\", so in this case we must SWITCH to using the prefixed property instead. See https://gsap.com/forums/topic/18310-clippath-doesnt-work-on-ios/\n var p = _checkPropPrefix(prop, target, 1),\n s = p && _getComputedProperty(target, p, 1);\n\n if (s && s !== start) {\n prop = p;\n start = s;\n } else if (prop === \"borderColor\") {\n start = _getComputedProperty(target, \"borderTopColor\"); // Firefox bug: always reports \"borderColor\" as \"\", so we must fall back to borderTopColor. See https://gsap.com/forums/topic/24583-how-to-return-colors-that-i-had-after-reverse/\n }\n }\n\n var pt = new PropTween(this._pt, target.style, prop, 0, 1, _renderComplexString),\n index = 0,\n matchIndex = 0,\n a,\n result,\n startValues,\n startNum,\n color,\n startValue,\n endValue,\n endNum,\n chunk,\n endUnit,\n startUnit,\n endValues;\n pt.b = start;\n pt.e = end;\n start += \"\"; // ensure values are strings\n\n end += \"\";\n\n if (end.substring(0, 6) === \"var(--\") {\n end = _getComputedProperty(target, end.substring(4, end.indexOf(\")\")));\n }\n\n if (end === \"auto\") {\n startValue = target.style[prop];\n target.style[prop] = end;\n end = _getComputedProperty(target, prop) || end;\n startValue ? target.style[prop] = startValue : _removeProperty(target, prop);\n }\n\n a = [start, end];\n\n _colorStringFilter(a); // pass an array with the starting and ending values and let the filter do whatever it needs to the values. If colors are found, it returns true and then we must match where the color shows up order-wise because for things like boxShadow, sometimes the browser provides the computed values with the color FIRST, but the user provides it with the color LAST, so flip them if necessary. Same for drop-shadow().\n\n\n start = a[0];\n end = a[1];\n startValues = start.match(_numWithUnitExp) || [];\n endValues = end.match(_numWithUnitExp) || [];\n\n if (endValues.length) {\n while (result = _numWithUnitExp.exec(end)) {\n endValue = result[0];\n chunk = end.substring(index, result.index);\n\n if (color) {\n color = (color + 1) % 5;\n } else if (chunk.substr(-5) === \"rgba(\" || chunk.substr(-5) === \"hsla(\") {\n color = 1;\n }\n\n if (endValue !== (startValue = startValues[matchIndex++] || \"\")) {\n startNum = parseFloat(startValue) || 0;\n startUnit = startValue.substr((startNum + \"\").length);\n endValue.charAt(1) === \"=\" && (endValue = _parseRelative(startNum, endValue) + startUnit);\n endNum = parseFloat(endValue);\n endUnit = endValue.substr((endNum + \"\").length);\n index = _numWithUnitExp.lastIndex - endUnit.length;\n\n if (!endUnit) {\n //if something like \"perspective:300\" is passed in and we must add a unit to the end\n endUnit = endUnit || _config.units[prop] || startUnit;\n\n if (index === end.length) {\n end += endUnit;\n pt.e += endUnit;\n }\n }\n\n if (startUnit !== endUnit) {\n startNum = _convertToUnit(target, prop, startValue, endUnit) || 0;\n } // these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method.\n\n\n pt._pt = {\n _next: pt._pt,\n p: chunk || matchIndex === 1 ? chunk : \",\",\n //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case.\n s: startNum,\n c: endNum - startNum,\n m: color && color < 4 || prop === \"zIndex\" ? Math.round : 0\n };\n }\n }\n\n pt.c = index < end.length ? end.substring(index, end.length) : \"\"; //we use the \"c\" of the PropTween to store the final part of the string (after the last number)\n } else {\n pt.r = prop === \"display\" && end === \"none\" ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue;\n }\n\n _relExp.test(end) && (pt.e = 0); //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value).\n\n this._pt = pt; //start the linked list with this new PropTween. Remember, we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within another plugin too, thus \"this\" would refer to the plugin.\n\n return pt;\n},\n _keywordToPercent = {\n top: \"0%\",\n bottom: \"100%\",\n left: \"0%\",\n right: \"100%\",\n center: \"50%\"\n},\n _convertKeywordsToPercentages = function _convertKeywordsToPercentages(value) {\n var split = value.split(\" \"),\n x = split[0],\n y = split[1] || \"50%\";\n\n if (x === \"top\" || x === \"bottom\" || y === \"left\" || y === \"right\") {\n //the user provided them in the wrong order, so flip them\n value = x;\n x = y;\n y = value;\n }\n\n split[0] = _keywordToPercent[x] || x;\n split[1] = _keywordToPercent[y] || y;\n return split.join(\" \");\n},\n _renderClearProps = function _renderClearProps(ratio, data) {\n if (data.tween && data.tween._time === data.tween._dur) {\n var target = data.t,\n style = target.style,\n props = data.u,\n cache = target._gsap,\n prop,\n clearTransforms,\n i;\n\n if (props === \"all\" || props === true) {\n style.cssText = \"\";\n clearTransforms = 1;\n } else {\n props = props.split(\",\");\n i = props.length;\n\n while (--i > -1) {\n prop = props[i];\n\n if (_transformProps[prop]) {\n clearTransforms = 1;\n prop = prop === \"transformOrigin\" ? _transformOriginProp : _transformProp;\n }\n\n _removeProperty(target, prop);\n }\n }\n\n if (clearTransforms) {\n _removeProperty(target, _transformProp);\n\n if (cache) {\n cache.svg && target.removeAttribute(\"transform\");\n style.scale = style.rotate = style.translate = \"none\";\n\n _parseTransform(target, 1); // force all the cached values back to \"normal\"/identity, otherwise if there's another tween that's already set to render transforms on this element, it could display the wrong values.\n\n\n cache.uncache = 1;\n\n _removeIndependentTransforms(style);\n }\n }\n }\n},\n // note: specialProps should return 1 if (and only if) they have a non-zero priority. It indicates we need to sort the linked list.\n_specialProps = {\n clearProps: function clearProps(plugin, target, property, endValue, tween) {\n if (tween.data !== \"isFromStart\") {\n var pt = plugin._pt = new PropTween(plugin._pt, target, property, 0, 0, _renderClearProps);\n pt.u = endValue;\n pt.pr = -10;\n pt.tween = tween;\n\n plugin._props.push(property);\n\n return 1;\n }\n }\n /* className feature (about 0.4kb gzipped).\n , className(plugin, target, property, endValue, tween) {\n \tlet _renderClassName = (ratio, data) => {\n \t\t\tdata.css.render(ratio, data.css);\n \t\t\tif (!ratio || ratio === 1) {\n \t\t\t\tlet inline = data.rmv,\n \t\t\t\t\ttarget = data.t,\n \t\t\t\t\tp;\n \t\t\t\ttarget.setAttribute(\"class\", ratio ? data.e : data.b);\n \t\t\t\tfor (p in inline) {\n \t\t\t\t\t_removeProperty(target, p);\n \t\t\t\t}\n \t\t\t}\n \t\t},\n \t\t_getAllStyles = (target) => {\n \t\t\tlet styles = {},\n \t\t\t\tcomputed = getComputedStyle(target),\n \t\t\t\tp;\n \t\t\tfor (p in computed) {\n \t\t\t\tif (isNaN(p) && p !== \"cssText\" && p !== \"length\") {\n \t\t\t\t\tstyles[p] = computed[p];\n \t\t\t\t}\n \t\t\t}\n \t\t\t_setDefaults(styles, _parseTransform(target, 1));\n \t\t\treturn styles;\n \t\t},\n \t\tstartClassList = target.getAttribute(\"class\"),\n \t\tstyle = target.style,\n \t\tcssText = style.cssText,\n \t\tcache = target._gsap,\n \t\tclassPT = cache.classPT,\n \t\tinlineToRemoveAtEnd = {},\n \t\tdata = {t:target, plugin:plugin, rmv:inlineToRemoveAtEnd, b:startClassList, e:(endValue.charAt(1) !== \"=\") ? endValue : startClassList.replace(new RegExp(\"(?:\\\\s|^)\" + endValue.substr(2) + \"(?![\\\\w-])\"), \"\") + ((endValue.charAt(0) === \"+\") ? \" \" + endValue.substr(2) : \"\")},\n \t\tchangingVars = {},\n \t\tstartVars = _getAllStyles(target),\n \t\ttransformRelated = /(transform|perspective)/i,\n \t\tendVars, p;\n \tif (classPT) {\n \t\tclassPT.r(1, classPT.d);\n \t\t_removeLinkedListItem(classPT.d.plugin, classPT, \"_pt\");\n \t}\n \ttarget.setAttribute(\"class\", data.e);\n \tendVars = _getAllStyles(target, true);\n \ttarget.setAttribute(\"class\", startClassList);\n \tfor (p in endVars) {\n \t\tif (endVars[p] !== startVars[p] && !transformRelated.test(p)) {\n \t\t\tchangingVars[p] = endVars[p];\n \t\t\tif (!style[p] && style[p] !== \"0\") {\n \t\t\t\tinlineToRemoveAtEnd[p] = 1;\n \t\t\t}\n \t\t}\n \t}\n \tcache.classPT = plugin._pt = new PropTween(plugin._pt, target, \"className\", 0, 0, _renderClassName, data, 0, -11);\n \tif (style.cssText !== cssText) { //only apply if things change. Otherwise, in cases like a background-image that's pulled dynamically, it could cause a refresh. See https://gsap.com/forums/topic/20368-possible-gsap-bug-switching-classnames-in-chrome/.\n \t\tstyle.cssText = cssText; //we recorded cssText before we swapped classes and ran _getAllStyles() because in cases when a className tween is overwritten, we remove all the related tweening properties from that class change (otherwise class-specific stuff can't override properties we've directly set on the target's style object due to specificity).\n \t}\n \t_parseTransform(target, true); //to clear the caching of transforms\n \tdata.css = new gsap.plugins.css();\n \tdata.css.init(target, changingVars, tween);\n \tplugin._props.push(...data.css._props);\n \treturn 1;\n }\n */\n\n},\n\n/*\n * --------------------------------------------------------------------------------------\n * TRANSFORMS\n * --------------------------------------------------------------------------------------\n */\n_identity2DMatrix = [1, 0, 0, 1, 0, 0],\n _rotationalProperties = {},\n _isNullTransform = function _isNullTransform(value) {\n return value === \"matrix(1, 0, 0, 1, 0, 0)\" || value === \"none\" || !value;\n},\n _getComputedTransformMatrixAsArray = function _getComputedTransformMatrixAsArray(target) {\n var matrixString = _getComputedProperty(target, _transformProp);\n\n return _isNullTransform(matrixString) ? _identity2DMatrix : matrixString.substr(7).match(_numExp).map(_round);\n},\n _getMatrix = function _getMatrix(target, force2D) {\n var cache = target._gsap || _getCache(target),\n style = target.style,\n matrix = _getComputedTransformMatrixAsArray(target),\n parent,\n nextSibling,\n temp,\n addedToDOM;\n\n if (cache.svg && target.getAttribute(\"transform\")) {\n temp = target.transform.baseVal.consolidate().matrix; //ensures that even complex values like \"translate(50,60) rotate(135,0,0)\" are parsed because it mashes it into a matrix.\n\n matrix = [temp.a, temp.b, temp.c, temp.d, temp.e, temp.f];\n return matrix.join(\",\") === \"1,0,0,1,0,0\" ? _identity2DMatrix : matrix;\n } else if (matrix === _identity2DMatrix && !target.offsetParent && target !== _docElement && !cache.svg) {\n //note: if offsetParent is null, that means the element isn't in the normal document flow, like if it has display:none or one of its ancestors has display:none). Firefox returns null for getComputedStyle() if the element is in an iframe that has display:none. https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n //browsers don't report transforms accurately unless the element is in the DOM and has a display value that's not \"none\". Firefox and Microsoft browsers have a partial bug where they'll report transforms even if display:none BUT not any percentage-based values like translate(-50%, 8px) will be reported as if it's translate(0, 8px).\n temp = style.display;\n style.display = \"block\";\n parent = target.parentNode;\n\n if (!parent || !target.offsetParent && !target.getBoundingClientRect().width) {\n // note: in 3.3.0 we switched target.offsetParent to _doc.body.contains(target) to avoid [sometimes unnecessary] MutationObserver calls but that wasn't adequate because there are edge cases where nested position: fixed elements need to get reparented to accurately sense transforms. See https://github.com/greensock/GSAP/issues/388 and https://github.com/greensock/GSAP/issues/375. Note: position: fixed elements report a null offsetParent but they could also be invisible because they're in an ancestor with display: none, so we check getBoundingClientRect(). We only want to alter the DOM if we absolutely have to because it can cause iframe content to reload, like a Vimeo video.\n addedToDOM = 1; //flag\n\n nextSibling = target.nextElementSibling;\n\n _docElement.appendChild(target); //we must add it to the DOM in order to get values properly\n\n }\n\n matrix = _getComputedTransformMatrixAsArray(target);\n temp ? style.display = temp : _removeProperty(target, \"display\");\n\n if (addedToDOM) {\n nextSibling ? parent.insertBefore(target, nextSibling) : parent ? parent.appendChild(target) : _docElement.removeChild(target);\n }\n }\n\n return force2D && matrix.length > 6 ? [matrix[0], matrix[1], matrix[4], matrix[5], matrix[12], matrix[13]] : matrix;\n},\n _applySVGOrigin = function _applySVGOrigin(target, origin, originIsAbsolute, smooth, matrixArray, pluginToAddPropTweensTo) {\n var cache = target._gsap,\n matrix = matrixArray || _getMatrix(target, true),\n xOriginOld = cache.xOrigin || 0,\n yOriginOld = cache.yOrigin || 0,\n xOffsetOld = cache.xOffset || 0,\n yOffsetOld = cache.yOffset || 0,\n a = matrix[0],\n b = matrix[1],\n c = matrix[2],\n d = matrix[3],\n tx = matrix[4],\n ty = matrix[5],\n originSplit = origin.split(\" \"),\n xOrigin = parseFloat(originSplit[0]) || 0,\n yOrigin = parseFloat(originSplit[1]) || 0,\n bounds,\n determinant,\n x,\n y;\n\n if (!originIsAbsolute) {\n bounds = _getBBox(target);\n xOrigin = bounds.x + (~originSplit[0].indexOf(\"%\") ? xOrigin / 100 * bounds.width : xOrigin);\n yOrigin = bounds.y + (~(originSplit[1] || originSplit[0]).indexOf(\"%\") ? yOrigin / 100 * bounds.height : yOrigin); // if (!(\"xOrigin\" in cache) && (xOrigin || yOrigin)) { // added in 3.12.3, reverted in 3.12.4; requires more exploration\n // \txOrigin -= bounds.x;\n // \tyOrigin -= bounds.y;\n // }\n } else if (matrix !== _identity2DMatrix && (determinant = a * d - b * c)) {\n //if it's zero (like if scaleX and scaleY are zero), skip it to avoid errors with dividing by zero.\n x = xOrigin * (d / determinant) + yOrigin * (-c / determinant) + (c * ty - d * tx) / determinant;\n y = xOrigin * (-b / determinant) + yOrigin * (a / determinant) - (a * ty - b * tx) / determinant;\n xOrigin = x;\n yOrigin = y; // theory: we only had to do this for smoothing and it assumes that the previous one was not originIsAbsolute.\n }\n\n if (smooth || smooth !== false && cache.smooth) {\n tx = xOrigin - xOriginOld;\n ty = yOrigin - yOriginOld;\n cache.xOffset = xOffsetOld + (tx * a + ty * c) - tx;\n cache.yOffset = yOffsetOld + (tx * b + ty * d) - ty;\n } else {\n cache.xOffset = cache.yOffset = 0;\n }\n\n cache.xOrigin = xOrigin;\n cache.yOrigin = yOrigin;\n cache.smooth = !!smooth;\n cache.origin = origin;\n cache.originIsAbsolute = !!originIsAbsolute;\n target.style[_transformOriginProp] = \"0px 0px\"; //otherwise, if someone sets an origin via CSS, it will likely interfere with the SVG transform attribute ones (because remember, we're baking the origin into the matrix() value).\n\n if (pluginToAddPropTweensTo) {\n _addNonTweeningPT(pluginToAddPropTweensTo, cache, \"xOrigin\", xOriginOld, xOrigin);\n\n _addNonTweeningPT(pluginToAddPropTweensTo, cache, \"yOrigin\", yOriginOld, yOrigin);\n\n _addNonTweeningPT(pluginToAddPropTweensTo, cache, \"xOffset\", xOffsetOld, cache.xOffset);\n\n _addNonTweeningPT(pluginToAddPropTweensTo, cache, \"yOffset\", yOffsetOld, cache.yOffset);\n }\n\n target.setAttribute(\"data-svg-origin\", xOrigin + \" \" + yOrigin);\n},\n _parseTransform = function _parseTransform(target, uncache) {\n var cache = target._gsap || new GSCache(target);\n\n if (\"x\" in cache && !uncache && !cache.uncache) {\n return cache;\n }\n\n var style = target.style,\n invertedScaleX = cache.scaleX < 0,\n px = \"px\",\n deg = \"deg\",\n cs = getComputedStyle(target),\n origin = _getComputedProperty(target, _transformOriginProp) || \"0\",\n x,\n y,\n z,\n scaleX,\n scaleY,\n rotation,\n rotationX,\n rotationY,\n skewX,\n skewY,\n perspective,\n xOrigin,\n yOrigin,\n matrix,\n angle,\n cos,\n sin,\n a,\n b,\n c,\n d,\n a12,\n a22,\n t1,\n t2,\n t3,\n a13,\n a23,\n a33,\n a42,\n a43,\n a32;\n x = y = z = rotation = rotationX = rotationY = skewX = skewY = perspective = 0;\n scaleX = scaleY = 1;\n cache.svg = !!(target.getCTM && _isSVG(target));\n\n if (cs.translate) {\n // accommodate independent transforms by combining them into normal ones.\n if (cs.translate !== \"none\" || cs.scale !== \"none\" || cs.rotate !== \"none\") {\n style[_transformProp] = (cs.translate !== \"none\" ? \"translate3d(\" + (cs.translate + \" 0 0\").split(\" \").slice(0, 3).join(\", \") + \") \" : \"\") + (cs.rotate !== \"none\" ? \"rotate(\" + cs.rotate + \") \" : \"\") + (cs.scale !== \"none\" ? \"scale(\" + cs.scale.split(\" \").join(\",\") + \") \" : \"\") + (cs[_transformProp] !== \"none\" ? cs[_transformProp] : \"\");\n }\n\n style.scale = style.rotate = style.translate = \"none\";\n }\n\n matrix = _getMatrix(target, cache.svg);\n\n if (cache.svg) {\n if (cache.uncache) {\n // if cache.uncache is true (and maybe if origin is 0,0), we need to set element.style.transformOrigin = (cache.xOrigin - bbox.x) + \"px \" + (cache.yOrigin - bbox.y) + \"px\". Previously we let the data-svg-origin stay instead, but when introducing revert(), it complicated things.\n t2 = target.getBBox();\n origin = cache.xOrigin - t2.x + \"px \" + (cache.yOrigin - t2.y) + \"px\";\n t1 = \"\";\n } else {\n t1 = !uncache && target.getAttribute(\"data-svg-origin\"); // Remember, to work around browser inconsistencies we always force SVG elements' transformOrigin to 0,0 and offset the translation accordingly.\n }\n\n _applySVGOrigin(target, t1 || origin, !!t1 || cache.originIsAbsolute, cache.smooth !== false, matrix);\n }\n\n xOrigin = cache.xOrigin || 0;\n yOrigin = cache.yOrigin || 0;\n\n if (matrix !== _identity2DMatrix) {\n a = matrix[0]; //a11\n\n b = matrix[1]; //a21\n\n c = matrix[2]; //a31\n\n d = matrix[3]; //a41\n\n x = a12 = matrix[4];\n y = a22 = matrix[5]; //2D matrix\n\n if (matrix.length === 6) {\n scaleX = Math.sqrt(a * a + b * b);\n scaleY = Math.sqrt(d * d + c * c);\n rotation = a || b ? _atan2(b, a) * _RAD2DEG : 0; //note: if scaleX is 0, we cannot accurately measure rotation. Same for skewX with a scaleY of 0. Therefore, we default to the previously recorded value (or zero if that doesn't exist).\n\n skewX = c || d ? _atan2(c, d) * _RAD2DEG + rotation : 0;\n skewX && (scaleY *= Math.abs(Math.cos(skewX * _DEG2RAD)));\n\n if (cache.svg) {\n x -= xOrigin - (xOrigin * a + yOrigin * c);\n y -= yOrigin - (xOrigin * b + yOrigin * d);\n } //3D matrix\n\n } else {\n a32 = matrix[6];\n a42 = matrix[7];\n a13 = matrix[8];\n a23 = matrix[9];\n a33 = matrix[10];\n a43 = matrix[11];\n x = matrix[12];\n y = matrix[13];\n z = matrix[14];\n angle = _atan2(a32, a33);\n rotationX = angle * _RAD2DEG; //rotationX\n\n if (angle) {\n cos = Math.cos(-angle);\n sin = Math.sin(-angle);\n t1 = a12 * cos + a13 * sin;\n t2 = a22 * cos + a23 * sin;\n t3 = a32 * cos + a33 * sin;\n a13 = a12 * -sin + a13 * cos;\n a23 = a22 * -sin + a23 * cos;\n a33 = a32 * -sin + a33 * cos;\n a43 = a42 * -sin + a43 * cos;\n a12 = t1;\n a22 = t2;\n a32 = t3;\n } //rotationY\n\n\n angle = _atan2(-c, a33);\n rotationY = angle * _RAD2DEG;\n\n if (angle) {\n cos = Math.cos(-angle);\n sin = Math.sin(-angle);\n t1 = a * cos - a13 * sin;\n t2 = b * cos - a23 * sin;\n t3 = c * cos - a33 * sin;\n a43 = d * sin + a43 * cos;\n a = t1;\n b = t2;\n c = t3;\n } //rotationZ\n\n\n angle = _atan2(b, a);\n rotation = angle * _RAD2DEG;\n\n if (angle) {\n cos = Math.cos(angle);\n sin = Math.sin(angle);\n t1 = a * cos + b * sin;\n t2 = a12 * cos + a22 * sin;\n b = b * cos - a * sin;\n a22 = a22 * cos - a12 * sin;\n a = t1;\n a12 = t2;\n }\n\n if (rotationX && Math.abs(rotationX) + Math.abs(rotation) > 359.9) {\n //when rotationY is set, it will often be parsed as 180 degrees different than it should be, and rotationX and rotation both being 180 (it looks the same), so we adjust for that here.\n rotationX = rotation = 0;\n rotationY = 180 - rotationY;\n }\n\n scaleX = _round(Math.sqrt(a * a + b * b + c * c));\n scaleY = _round(Math.sqrt(a22 * a22 + a32 * a32));\n angle = _atan2(a12, a22);\n skewX = Math.abs(angle) > 0.0002 ? angle * _RAD2DEG : 0;\n perspective = a43 ? 1 / (a43 < 0 ? -a43 : a43) : 0;\n }\n\n if (cache.svg) {\n //sense if there are CSS transforms applied on an SVG element in which case we must overwrite them when rendering. The transform attribute is more reliable cross-browser, but we can't just remove the CSS ones because they may be applied in a CSS rule somewhere (not just inline).\n t1 = target.getAttribute(\"transform\");\n cache.forceCSS = target.setAttribute(\"transform\", \"\") || !_isNullTransform(_getComputedProperty(target, _transformProp));\n t1 && target.setAttribute(\"transform\", t1);\n }\n }\n\n if (Math.abs(skewX) > 90 && Math.abs(skewX) < 270) {\n if (invertedScaleX) {\n scaleX *= -1;\n skewX += rotation <= 0 ? 180 : -180;\n rotation += rotation <= 0 ? 180 : -180;\n } else {\n scaleY *= -1;\n skewX += skewX <= 0 ? 180 : -180;\n }\n }\n\n uncache = uncache || cache.uncache;\n cache.x = x - ((cache.xPercent = x && (!uncache && cache.xPercent || (Math.round(target.offsetWidth / 2) === Math.round(-x) ? -50 : 0))) ? target.offsetWidth * cache.xPercent / 100 : 0) + px;\n cache.y = y - ((cache.yPercent = y && (!uncache && cache.yPercent || (Math.round(target.offsetHeight / 2) === Math.round(-y) ? -50 : 0))) ? target.offsetHeight * cache.yPercent / 100 : 0) + px;\n cache.z = z + px;\n cache.scaleX = _round(scaleX);\n cache.scaleY = _round(scaleY);\n cache.rotation = _round(rotation) + deg;\n cache.rotationX = _round(rotationX) + deg;\n cache.rotationY = _round(rotationY) + deg;\n cache.skewX = skewX + deg;\n cache.skewY = skewY + deg;\n cache.transformPerspective = perspective + px;\n\n if (cache.zOrigin = parseFloat(origin.split(\" \")[2]) || !uncache && cache.zOrigin || 0) {\n style[_transformOriginProp] = _firstTwoOnly(origin);\n }\n\n cache.xOffset = cache.yOffset = 0;\n cache.force3D = _config.force3D;\n cache.renderTransform = cache.svg ? _renderSVGTransforms : _supports3D ? _renderCSSTransforms : _renderNon3DTransforms;\n cache.uncache = 0;\n return cache;\n},\n _firstTwoOnly = function _firstTwoOnly(value) {\n return (value = value.split(\" \"))[0] + \" \" + value[1];\n},\n //for handling transformOrigin values, stripping out the 3rd dimension\n_addPxTranslate = function _addPxTranslate(target, start, value) {\n var unit = getUnit(start);\n return _round(parseFloat(start) + parseFloat(_convertToUnit(target, \"x\", value + \"px\", unit))) + unit;\n},\n _renderNon3DTransforms = function _renderNon3DTransforms(ratio, cache) {\n cache.z = \"0px\";\n cache.rotationY = cache.rotationX = \"0deg\";\n cache.force3D = 0;\n\n _renderCSSTransforms(ratio, cache);\n},\n _zeroDeg = \"0deg\",\n _zeroPx = \"0px\",\n _endParenthesis = \") \",\n _renderCSSTransforms = function _renderCSSTransforms(ratio, cache) {\n var _ref = cache || this,\n xPercent = _ref.xPercent,\n yPercent = _ref.yPercent,\n x = _ref.x,\n y = _ref.y,\n z = _ref.z,\n rotation = _ref.rotation,\n rotationY = _ref.rotationY,\n rotationX = _ref.rotationX,\n skewX = _ref.skewX,\n skewY = _ref.skewY,\n scaleX = _ref.scaleX,\n scaleY = _ref.scaleY,\n transformPerspective = _ref.transformPerspective,\n force3D = _ref.force3D,\n target = _ref.target,\n zOrigin = _ref.zOrigin,\n transforms = \"\",\n use3D = force3D === \"auto\" && ratio && ratio !== 1 || force3D === true; // Safari has a bug that causes it not to render 3D transform-origin values properly, so we force the z origin to 0, record it in the cache, and then do the math here to offset the translate values accordingly (basically do the 3D transform-origin part manually)\n\n\n if (zOrigin && (rotationX !== _zeroDeg || rotationY !== _zeroDeg)) {\n var angle = parseFloat(rotationY) * _DEG2RAD,\n a13 = Math.sin(angle),\n a33 = Math.cos(angle),\n cos;\n\n angle = parseFloat(rotationX) * _DEG2RAD;\n cos = Math.cos(angle);\n x = _addPxTranslate(target, x, a13 * cos * -zOrigin);\n y = _addPxTranslate(target, y, -Math.sin(angle) * -zOrigin);\n z = _addPxTranslate(target, z, a33 * cos * -zOrigin + zOrigin);\n }\n\n if (transformPerspective !== _zeroPx) {\n transforms += \"perspective(\" + transformPerspective + _endParenthesis;\n }\n\n if (xPercent || yPercent) {\n transforms += \"translate(\" + xPercent + \"%, \" + yPercent + \"%) \";\n }\n\n if (use3D || x !== _zeroPx || y !== _zeroPx || z !== _zeroPx) {\n transforms += z !== _zeroPx || use3D ? \"translate3d(\" + x + \", \" + y + \", \" + z + \") \" : \"translate(\" + x + \", \" + y + _endParenthesis;\n }\n\n if (rotation !== _zeroDeg) {\n transforms += \"rotate(\" + rotation + _endParenthesis;\n }\n\n if (rotationY !== _zeroDeg) {\n transforms += \"rotateY(\" + rotationY + _endParenthesis;\n }\n\n if (rotationX !== _zeroDeg) {\n transforms += \"rotateX(\" + rotationX + _endParenthesis;\n }\n\n if (skewX !== _zeroDeg || skewY !== _zeroDeg) {\n transforms += \"skew(\" + skewX + \", \" + skewY + _endParenthesis;\n }\n\n if (scaleX !== 1 || scaleY !== 1) {\n transforms += \"scale(\" + scaleX + \", \" + scaleY + _endParenthesis;\n }\n\n target.style[_transformProp] = transforms || \"translate(0, 0)\";\n},\n _renderSVGTransforms = function _renderSVGTransforms(ratio, cache) {\n var _ref2 = cache || this,\n xPercent = _ref2.xPercent,\n yPercent = _ref2.yPercent,\n x = _ref2.x,\n y = _ref2.y,\n rotation = _ref2.rotation,\n skewX = _ref2.skewX,\n skewY = _ref2.skewY,\n scaleX = _ref2.scaleX,\n scaleY = _ref2.scaleY,\n target = _ref2.target,\n xOrigin = _ref2.xOrigin,\n yOrigin = _ref2.yOrigin,\n xOffset = _ref2.xOffset,\n yOffset = _ref2.yOffset,\n forceCSS = _ref2.forceCSS,\n tx = parseFloat(x),\n ty = parseFloat(y),\n a11,\n a21,\n a12,\n a22,\n temp;\n\n rotation = parseFloat(rotation);\n skewX = parseFloat(skewX);\n skewY = parseFloat(skewY);\n\n if (skewY) {\n //for performance reasons, we combine all skewing into the skewX and rotation values. Remember, a skewY of 10 degrees looks the same as a rotation of 10 degrees plus a skewX of 10 degrees.\n skewY = parseFloat(skewY);\n skewX += skewY;\n rotation += skewY;\n }\n\n if (rotation || skewX) {\n rotation *= _DEG2RAD;\n skewX *= _DEG2RAD;\n a11 = Math.cos(rotation) * scaleX;\n a21 = Math.sin(rotation) * scaleX;\n a12 = Math.sin(rotation - skewX) * -scaleY;\n a22 = Math.cos(rotation - skewX) * scaleY;\n\n if (skewX) {\n skewY *= _DEG2RAD;\n temp = Math.tan(skewX - skewY);\n temp = Math.sqrt(1 + temp * temp);\n a12 *= temp;\n a22 *= temp;\n\n if (skewY) {\n temp = Math.tan(skewY);\n temp = Math.sqrt(1 + temp * temp);\n a11 *= temp;\n a21 *= temp;\n }\n }\n\n a11 = _round(a11);\n a21 = _round(a21);\n a12 = _round(a12);\n a22 = _round(a22);\n } else {\n a11 = scaleX;\n a22 = scaleY;\n a21 = a12 = 0;\n }\n\n if (tx && !~(x + \"\").indexOf(\"px\") || ty && !~(y + \"\").indexOf(\"px\")) {\n tx = _convertToUnit(target, \"x\", x, \"px\");\n ty = _convertToUnit(target, \"y\", y, \"px\");\n }\n\n if (xOrigin || yOrigin || xOffset || yOffset) {\n tx = _round(tx + xOrigin - (xOrigin * a11 + yOrigin * a12) + xOffset);\n ty = _round(ty + yOrigin - (xOrigin * a21 + yOrigin * a22) + yOffset);\n }\n\n if (xPercent || yPercent) {\n //The SVG spec doesn't support percentage-based translation in the \"transform\" attribute, so we merge it into the translation to simulate it.\n temp = target.getBBox();\n tx = _round(tx + xPercent / 100 * temp.width);\n ty = _round(ty + yPercent / 100 * temp.height);\n }\n\n temp = \"matrix(\" + a11 + \",\" + a21 + \",\" + a12 + \",\" + a22 + \",\" + tx + \",\" + ty + \")\";\n target.setAttribute(\"transform\", temp);\n forceCSS && (target.style[_transformProp] = temp); //some browsers prioritize CSS transforms over the transform attribute. When we sense that the user has CSS transforms applied, we must overwrite them this way (otherwise some browser simply won't render the transform attribute changes!)\n},\n _addRotationalPropTween = function _addRotationalPropTween(plugin, target, property, startNum, endValue) {\n var cap = 360,\n isString = _isString(endValue),\n endNum = parseFloat(endValue) * (isString && ~endValue.indexOf(\"rad\") ? _RAD2DEG : 1),\n change = endNum - startNum,\n finalValue = startNum + change + \"deg\",\n direction,\n pt;\n\n if (isString) {\n direction = endValue.split(\"_\")[1];\n\n if (direction === \"short\") {\n change %= cap;\n\n if (change !== change % (cap / 2)) {\n change += change < 0 ? cap : -cap;\n }\n }\n\n if (direction === \"cw\" && change < 0) {\n change = (change + cap * _bigNum) % cap - ~~(change / cap) * cap;\n } else if (direction === \"ccw\" && change > 0) {\n change = (change - cap * _bigNum) % cap - ~~(change / cap) * cap;\n }\n }\n\n plugin._pt = pt = new PropTween(plugin._pt, target, property, startNum, change, _renderPropWithEnd);\n pt.e = finalValue;\n pt.u = \"deg\";\n\n plugin._props.push(property);\n\n return pt;\n},\n _assign = function _assign(target, source) {\n // Internet Explorer doesn't have Object.assign(), so we recreate it here.\n for (var p in source) {\n target[p] = source[p];\n }\n\n return target;\n},\n _addRawTransformPTs = function _addRawTransformPTs(plugin, transforms, target) {\n //for handling cases where someone passes in a whole transform string, like transform: \"scale(2, 3) rotate(20deg) translateY(30em)\"\n var startCache = _assign({}, target._gsap),\n exclude = \"perspective,force3D,transformOrigin,svgOrigin\",\n style = target.style,\n endCache,\n p,\n startValue,\n endValue,\n startNum,\n endNum,\n startUnit,\n endUnit;\n\n if (startCache.svg) {\n startValue = target.getAttribute(\"transform\");\n target.setAttribute(\"transform\", \"\");\n style[_transformProp] = transforms;\n endCache = _parseTransform(target, 1);\n\n _removeProperty(target, _transformProp);\n\n target.setAttribute(\"transform\", startValue);\n } else {\n startValue = getComputedStyle(target)[_transformProp];\n style[_transformProp] = transforms;\n endCache = _parseTransform(target, 1);\n style[_transformProp] = startValue;\n }\n\n for (p in _transformProps) {\n startValue = startCache[p];\n endValue = endCache[p];\n\n if (startValue !== endValue && exclude.indexOf(p) < 0) {\n //tweening to no perspective gives very unintuitive results - just keep the same perspective in that case.\n startUnit = getUnit(startValue);\n endUnit = getUnit(endValue);\n startNum = startUnit !== endUnit ? _convertToUnit(target, p, startValue, endUnit) : parseFloat(startValue);\n endNum = parseFloat(endValue);\n plugin._pt = new PropTween(plugin._pt, endCache, p, startNum, endNum - startNum, _renderCSSProp);\n plugin._pt.u = endUnit || 0;\n\n plugin._props.push(p);\n }\n }\n\n _assign(endCache, startCache);\n}; // handle splitting apart padding, margin, borderWidth, and borderRadius into their 4 components. Firefox, for example, won't report borderRadius correctly - it will only do borderTopLeftRadius and the other corners. We also want to handle paddingTop, marginLeft, borderRightWidth, etc.\n\n\n_forEachName(\"padding,margin,Width,Radius\", function (name, index) {\n var t = \"Top\",\n r = \"Right\",\n b = \"Bottom\",\n l = \"Left\",\n props = (index < 3 ? [t, r, b, l] : [t + l, t + r, b + r, b + l]).map(function (side) {\n return index < 2 ? name + side : \"border\" + side + name;\n });\n\n _specialProps[index > 1 ? \"border\" + name : name] = function (plugin, target, property, endValue, tween) {\n var a, vars;\n\n if (arguments.length < 4) {\n // getter, passed target, property, and unit (from _get())\n a = props.map(function (prop) {\n return _get(plugin, prop, property);\n });\n vars = a.join(\" \");\n return vars.split(a[0]).length === 5 ? a[0] : vars;\n }\n\n a = (endValue + \"\").split(\" \");\n vars = {};\n props.forEach(function (prop, i) {\n return vars[prop] = a[i] = a[i] || a[(i - 1) / 2 | 0];\n });\n plugin.init(target, vars, tween);\n };\n});\n\nexport var CSSPlugin = {\n name: \"css\",\n register: _initCore,\n targetTest: function targetTest(target) {\n return target.style && target.nodeType;\n },\n init: function init(target, vars, tween, index, targets) {\n var props = this._props,\n style = target.style,\n startAt = tween.vars.startAt,\n startValue,\n endValue,\n endNum,\n startNum,\n type,\n specialProp,\n p,\n startUnit,\n endUnit,\n relative,\n isTransformRelated,\n transformPropTween,\n cache,\n smooth,\n hasPriority,\n inlineProps,\n finalTransformValue;\n _pluginInitted || _initCore(); // we may call init() multiple times on the same plugin instance, like when adding special properties, so make sure we don't overwrite the revert data or inlineProps\n\n this.styles = this.styles || _getStyleSaver(target);\n inlineProps = this.styles.props;\n this.tween = tween;\n\n for (p in vars) {\n if (p === \"autoRound\") {\n continue;\n }\n\n endValue = vars[p];\n\n if (_plugins[p] && _checkPlugin(p, vars, tween, index, target, targets)) {\n // plugins\n continue;\n }\n\n type = typeof endValue;\n specialProp = _specialProps[p];\n\n if (type === \"function\") {\n endValue = endValue.call(tween, index, target, targets);\n type = typeof endValue;\n }\n\n if (type === \"string\" && ~endValue.indexOf(\"random(\")) {\n endValue = _replaceRandom(endValue);\n }\n\n if (specialProp) {\n specialProp(this, target, p, endValue, tween) && (hasPriority = 1);\n } else if (p.substr(0, 2) === \"--\") {\n //CSS variable\n startValue = (getComputedStyle(target).getPropertyValue(p) + \"\").trim();\n endValue += \"\";\n _colorExp.lastIndex = 0;\n\n if (!_colorExp.test(startValue)) {\n // colors don't have units\n startUnit = getUnit(startValue);\n endUnit = getUnit(endValue);\n endUnit ? startUnit !== endUnit && (startValue = _convertToUnit(target, p, startValue, endUnit) + endUnit) : startUnit && (endValue += startUnit);\n }\n\n this.add(style, \"setProperty\", startValue, endValue, index, targets, 0, 0, p);\n props.push(p);\n inlineProps.push(p, 0, style[p]);\n } else if (type !== \"undefined\") {\n if (startAt && p in startAt) {\n // in case someone hard-codes a complex value as the start, like top: \"calc(2vh / 2)\". Without this, it'd use the computed value (always in px)\n startValue = typeof startAt[p] === \"function\" ? startAt[p].call(tween, index, target, targets) : startAt[p];\n _isString(startValue) && ~startValue.indexOf(\"random(\") && (startValue = _replaceRandom(startValue));\n getUnit(startValue + \"\") || startValue === \"auto\" || (startValue += _config.units[p] || getUnit(_get(target, p)) || \"\"); // for cases when someone passes in a unitless value like {x: 100}; if we try setting translate(100, 0px) it won't work.\n\n (startValue + \"\").charAt(1) === \"=\" && (startValue = _get(target, p)); // can't work with relative values\n } else {\n startValue = _get(target, p);\n }\n\n startNum = parseFloat(startValue);\n relative = type === \"string\" && endValue.charAt(1) === \"=\" && endValue.substr(0, 2);\n relative && (endValue = endValue.substr(2));\n endNum = parseFloat(endValue);\n\n if (p in _propertyAliases) {\n if (p === \"autoAlpha\") {\n //special case where we control the visibility along with opacity. We still allow the opacity value to pass through and get tweened.\n if (startNum === 1 && _get(target, \"visibility\") === \"hidden\" && endNum) {\n //if visibility is initially set to \"hidden\", we should interpret that as intent to make opacity 0 (a convenience)\n startNum = 0;\n }\n\n inlineProps.push(\"visibility\", 0, style.visibility);\n\n _addNonTweeningPT(this, style, \"visibility\", startNum ? \"inherit\" : \"hidden\", endNum ? \"inherit\" : \"hidden\", !endNum);\n }\n\n if (p !== \"scale\" && p !== \"transform\") {\n p = _propertyAliases[p];\n ~p.indexOf(\",\") && (p = p.split(\",\")[0]);\n }\n }\n\n isTransformRelated = p in _transformProps; //--- TRANSFORM-RELATED ---\n\n if (isTransformRelated) {\n this.styles.save(p);\n finalTransformValue = endValue; // this is always the same as endValue except when it's a var(--) value, in which case we need to calculate the end value.\n\n if (type === \"string\" && endValue.substring(0, 6) === \"var(--\") {\n endValue = _getComputedProperty(target, endValue.substring(4, endValue.indexOf(\")\")));\n\n if (endValue.substring(0, 5) === \"calc(\") {\n var origPerspective = target.style.perspective;\n target.style.perspective = endValue;\n endValue = _getComputedProperty(target, \"perspective\");\n origPerspective ? target.style.perspective = origPerspective : _removeProperty(target, \"perspective\");\n }\n\n endNum = parseFloat(endValue);\n }\n\n if (!transformPropTween) {\n cache = target._gsap;\n cache.renderTransform && !vars.parseTransform || _parseTransform(target, vars.parseTransform); // if, for example, gsap.set(... {transform:\"translateX(50vw)\"}), the _get() call doesn't parse the transform, thus cache.renderTransform won't be set yet so force the parsing of the transform here.\n\n smooth = vars.smoothOrigin !== false && cache.smooth;\n transformPropTween = this._pt = new PropTween(this._pt, style, _transformProp, 0, 1, cache.renderTransform, cache, 0, -1); //the first time through, create the rendering PropTween so that it runs LAST (in the linked list, we keep adding to the beginning)\n\n transformPropTween.dep = 1; //flag it as dependent so that if things get killed/overwritten and this is the only PropTween left, we can safely kill the whole tween.\n }\n\n if (p === \"scale\") {\n this._pt = new PropTween(this._pt, cache, \"scaleY\", cache.scaleY, (relative ? _parseRelative(cache.scaleY, relative + endNum) : endNum) - cache.scaleY || 0, _renderCSSProp);\n this._pt.u = 0;\n props.push(\"scaleY\", p);\n p += \"X\";\n } else if (p === \"transformOrigin\") {\n inlineProps.push(_transformOriginProp, 0, style[_transformOriginProp]);\n endValue = _convertKeywordsToPercentages(endValue); //in case something like \"left top\" or \"bottom right\" is passed in. Convert to percentages.\n\n if (cache.svg) {\n _applySVGOrigin(target, endValue, 0, smooth, 0, this);\n } else {\n endUnit = parseFloat(endValue.split(\" \")[2]) || 0; //handle the zOrigin separately!\n\n endUnit !== cache.zOrigin && _addNonTweeningPT(this, cache, \"zOrigin\", cache.zOrigin, endUnit);\n\n _addNonTweeningPT(this, style, p, _firstTwoOnly(startValue), _firstTwoOnly(endValue));\n }\n\n continue;\n } else if (p === \"svgOrigin\") {\n _applySVGOrigin(target, endValue, 1, smooth, 0, this);\n\n continue;\n } else if (p in _rotationalProperties) {\n _addRotationalPropTween(this, cache, p, startNum, relative ? _parseRelative(startNum, relative + endValue) : endValue);\n\n continue;\n } else if (p === \"smoothOrigin\") {\n _addNonTweeningPT(this, cache, \"smooth\", cache.smooth, endValue);\n\n continue;\n } else if (p === \"force3D\") {\n cache[p] = endValue;\n continue;\n } else if (p === \"transform\") {\n _addRawTransformPTs(this, endValue, target);\n\n continue;\n }\n } else if (!(p in style)) {\n p = _checkPropPrefix(p) || p;\n }\n\n if (isTransformRelated || (endNum || endNum === 0) && (startNum || startNum === 0) && !_complexExp.test(endValue) && p in style) {\n startUnit = (startValue + \"\").substr((startNum + \"\").length);\n endNum || (endNum = 0); // protect against NaN\n\n endUnit = getUnit(endValue) || (p in _config.units ? _config.units[p] : startUnit);\n startUnit !== endUnit && (startNum = _convertToUnit(target, p, startValue, endUnit));\n this._pt = new PropTween(this._pt, isTransformRelated ? cache : style, p, startNum, (relative ? _parseRelative(startNum, relative + endNum) : endNum) - startNum, !isTransformRelated && (endUnit === \"px\" || p === \"zIndex\") && vars.autoRound !== false ? _renderRoundedCSSProp : _renderCSSProp);\n this._pt.u = endUnit || 0;\n\n if (isTransformRelated && finalTransformValue !== endValue) {\n this._pt.b = startValue;\n this._pt.e = finalTransformValue;\n this._pt.r = _renderCSSPropWithBeginningAndEnd;\n } else if (startUnit !== endUnit && endUnit !== \"%\") {\n //when the tween goes all the way back to the beginning, we need to revert it to the OLD/ORIGINAL value (with those units). We record that as a \"b\" (beginning) property and point to a render method that handles that. (performance optimization)\n this._pt.b = startValue;\n this._pt.r = _renderCSSPropWithBeginning;\n }\n } else if (!(p in style)) {\n if (p in target) {\n //maybe it's not a style - it could be a property added directly to an element in which case we'll try to animate that.\n this.add(target, p, startValue || target[p], relative ? relative + endValue : endValue, index, targets);\n } else if (p !== \"parseTransform\") {\n _missingPlugin(p, endValue);\n\n continue;\n }\n } else {\n _tweenComplexCSSString.call(this, target, p, startValue, relative ? relative + endValue : endValue);\n }\n\n isTransformRelated || (p in style ? inlineProps.push(p, 0, style[p]) : typeof target[p] === \"function\" ? inlineProps.push(p, 2, target[p]()) : inlineProps.push(p, 1, startValue || target[p]));\n props.push(p);\n }\n }\n\n hasPriority && _sortPropTweensByPriority(this);\n },\n render: function render(ratio, data) {\n if (data.tween._time || !_reverting()) {\n var pt = data._pt;\n\n while (pt) {\n pt.r(ratio, pt.d);\n pt = pt._next;\n }\n } else {\n data.styles.revert();\n }\n },\n get: _get,\n aliases: _propertyAliases,\n getSetter: function getSetter(target, property, plugin) {\n //returns a setter function that accepts target, property, value and applies it accordingly. Remember, properties like \"x\" aren't as simple as target.style.property = value because they've got to be applied to a proxy object and then merged into a transform string in a renderer.\n var p = _propertyAliases[property];\n p && p.indexOf(\",\") < 0 && (property = p);\n return property in _transformProps && property !== _transformOriginProp && (target._gsap.x || _get(target, \"x\")) ? plugin && _recentSetterPlugin === plugin ? property === \"scale\" ? _setterScale : _setterTransform : (_recentSetterPlugin = plugin || {}) && (property === \"scale\" ? _setterScaleWithRender : _setterTransformWithRender) : target.style && !_isUndefined(target.style[property]) ? _setterCSSStyle : ~property.indexOf(\"-\") ? _setterCSSProp : _getSetter(target, property);\n },\n core: {\n _removeProperty: _removeProperty,\n _getMatrix: _getMatrix\n }\n};\ngsap.utils.checkPrefix = _checkPropPrefix;\ngsap.core.getStyleSaver = _getStyleSaver;\n\n(function (positionAndScale, rotation, others, aliases) {\n var all = _forEachName(positionAndScale + \",\" + rotation + \",\" + others, function (name) {\n _transformProps[name] = 1;\n });\n\n _forEachName(rotation, function (name) {\n _config.units[name] = \"deg\";\n _rotationalProperties[name] = 1;\n });\n\n _propertyAliases[all[13]] = positionAndScale + \",\" + rotation;\n\n _forEachName(aliases, function (name) {\n var split = name.split(\":\");\n _propertyAliases[split[1]] = all[split[0]];\n });\n})(\"x,y,z,scale,scaleX,scaleY,xPercent,yPercent\", \"rotation,rotationX,rotationY,skewX,skewY\", \"transform,transformOrigin,svgOrigin,force3D,smoothOrigin,transformPerspective\", \"0:translateX,1:translateY,2:translateZ,8:rotate,8:rotationZ,8:rotateZ,9:rotateX,10:rotateY\");\n\n_forEachName(\"x,y,z,top,right,bottom,left,width,height,fontSize,padding,margin,perspective\", function (name) {\n _config.units[name] = \"px\";\n});\n\ngsap.registerPlugin(CSSPlugin);\nexport { CSSPlugin as default, _getBBox, _createElement, _checkPropPrefix as checkPrefix };","import { gsap, Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ, TweenLite, TimelineLite, TimelineMax } from \"./gsap-core.js\";\nimport { CSSPlugin } from \"./CSSPlugin.js\";\nvar gsapWithCSS = gsap.registerPlugin(CSSPlugin) || gsap,\n // to protect from tree shaking\nTweenMaxWithCSS = gsapWithCSS.core.Tween;\nexport { gsapWithCSS as gsap, gsapWithCSS as default, CSSPlugin, TweenMaxWithCSS as TweenMax, TweenLite, TimelineMax, TimelineLite, Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ };","/*!\n * @gsap/react 2.1.2\n * https://gsap.com\n *\n * Copyright 2008-2025, GreenSock. All rights reserved.\n * Subject to the terms at https://gsap.com/standard-license or for\n * Club GSAP members, the agreement issued with that membership.\n * @author: Jack Doyle, jack@greensock.com\n*/\n/* eslint-disable */\nimport { useEffect, useLayoutEffect, useRef } from \"react\";\nimport gsap from \"gsap\";\n\nlet useIsomorphicLayoutEffect = typeof document !== \"undefined\" ? useLayoutEffect : useEffect,\n isConfig = value => value && !Array.isArray(value) && typeof(value) === \"object\",\n emptyArray = [],\n defaultConfig = {},\n _gsap = gsap; // accommodates situations where different versions of GSAP may be loaded, so a user can gsap.registerPlugin(useGSAP);\n\nexport const useGSAP = (callback, dependencies = emptyArray) => {\n let config = defaultConfig;\n if (isConfig(callback)) {\n config = callback;\n callback = null;\n dependencies = \"dependencies\" in config ? config.dependencies : emptyArray;\n } else if (isConfig(dependencies)) {\n config = dependencies;\n dependencies = \"dependencies\" in config ? config.dependencies : emptyArray;\n }\n (callback && typeof callback !== \"function\") && console.warn(\"First parameter must be a function or config object\");\n const { scope, revertOnUpdate } = config,\n mounted = useRef(false),\n context = useRef(_gsap.context(() => { }, scope)),\n contextSafe = useRef((func) => context.current.add(null, func)),\n deferCleanup = dependencies && dependencies.length && !revertOnUpdate;\n deferCleanup && useIsomorphicLayoutEffect(() => {\n mounted.current = true;\n return () => context.current.revert();\n }, emptyArray);\n useIsomorphicLayoutEffect(() => {\n callback && context.current.add(callback, scope);\n if (!deferCleanup || !mounted.current) { // React renders bottom-up, thus there could be hooks with dependencies that run BEFORE the component mounts, thus cleanup wouldn't occur since a hook with an empty dependency Array would only run once the component mounts.\n return () => context.current.revert();\n }\n }, dependencies);\n return { context: context.current, contextSafe: contextSafe.current };\n};\nuseGSAP.register = core => { _gsap = core; };\nuseGSAP.headless = true; // doesn't require the window to be registered.\n","'use client'\n\nimport { useGSAP } from '@gsap/react'\nimport gsap from 'gsap'\nimport { memo, useEffect, useMemo, useRef, useState } from 'react'\nimport SunCalc from 'suncalc'\nimport * as THREE from 'three'\nimport { degToRad } from 'three/src/math/MathUtils.js'\nimport { Sky as SkyImpl } from 'three-stdlib'\nimport { useShallow } from 'zustand/shallow'\nimport { useEditor } from '../../../hooks'\n\nconst tempVec = new THREE.Vector3()\nconst yAxis = new THREE.Vector3(0, 1, 0)\n\nexport const EnvironmentRenderer = memo(() => {\n const { latitude, longitude, timeMode, staticTime } = useEditor(\n useShallow((state) => {\n const environment = state.scene.root.environment\n return {\n latitude: environment.latitude,\n longitude: environment.longitude,\n altitude: environment.altitude,\n timeMode: environment.timeMode,\n staticTime: environment.staticTime,\n }\n }),\n )\n\n const [date, setDate] = useState(new Date())\n\n // Update time based on mode\n useEffect(() => {\n if (timeMode === 'custom' && staticTime) {\n setDate(new Date(staticTime))\n return\n }\n\n // Default to 'now' behavior\n setDate(new Date())\n const timer = setInterval(() => setDate(new Date()), 60 * 1000)\n return () => clearInterval(timer)\n }, [timeMode, staticTime])\n\n const sunPosition = useMemo(() => {\n const pos = SunCalc.getPosition(date, latitude, longitude)\n const { azimuth, altitude } = pos\n\n // SunCalc azimuth: 0 is South, increasing westward\n // Scene: +X South, +Z East\n // altitude is 0 at horizon, PI/2 at zenith\n\n // Standard spherical to Cartesian (y-up):\n // x = r * cos(alt) * cos(theta)\n // z = r * cos(alt) * sin(theta)\n // y = r * sin(alt)\n\n // We want 0 rad -> +X (South)\n // We want PI/2 rad -> -Z (West) (since +Z is East)\n\n // cos(0) = 1 (x=1)\n // sin(0) = 0 (z=0) -> Correct for South (+X)\n\n // cos(PI/2) = 0 (x=0)\n // sin(PI/2) = 1. We want -1 (-Z).\n // So z = -sin(azimuth)\n\n const r = 100\n const x = r * Math.cos(altitude) * Math.cos(azimuth)\n const y = r * Math.sin(altitude)\n const z = r * Math.cos(altitude) * Math.sin(azimuth) * -1\n\n return {\n position: new THREE.Vector3(x, y, z),\n altitude,\n azimuth,\n }\n }, [date, latitude, longitude])\n\n const moonPosition = useMemo(() => {\n const pos = SunCalc.getMoonPosition(date, latitude, longitude)\n const { azimuth, altitude } = pos\n\n const r = 100\n const x = r * Math.cos(altitude) * Math.cos(azimuth)\n const y = r * Math.sin(altitude)\n const z = r * Math.cos(altitude) * Math.sin(azimuth) * -1\n\n return {\n position: new THREE.Vector3(x, y, z),\n altitude,\n azimuth,\n }\n }, [date, latitude, longitude])\n\n const lighting = useMemo(() => {\n const { altitude } = sunPosition\n // altitude is in radians.\n // -PI/2 (nadir) to PI/2 (zenith)\n\n // Helper to interpolate colors\n const lerpColor = (c1: string, c2: string, t: number) => {\n const col1 = new THREE.Color(c1)\n const col2 = new THREE.Color(c2)\n return col1.lerp(col2, t)\n }\n\n // Helper to clamp and normalize t based on range\n const getT = (val: number, min: number, max: number) =>\n Math.max(0, Math.min(1, (val - min) / (max - min)))\n\n let ambientColor = new THREE.Color('#ffffff')\n let ambientIntensity = 0.4\n let directionalColor = new THREE.Color('#ffffff')\n let directionalIntensity = 1\n\n // Civil Twilight starts at ~-6deg (-0.1 rad)\n // We start transition at Civil Dawn (-0.1) and end at full Day (0.1)\n // This puts the midpoint (Sunrise/Sunset) at ~0 altitude, where we want the golden colors.\n const dawnAltitude = -0.1\n const dayAltitude = 0.1\n\n if (altitude < dawnAltitude) {\n // Night (Below horizon)\n ambientColor = new THREE.Color('#0d1b2a') // Deep night blue\n ambientIntensity = 0.2\n directionalColor = new THREE.Color('#415a77') // Cool moonlight\n directionalIntensity = 0 // Sun is off at night\n } else if (altitude < dayAltitude) {\n // Dawn/Dusk Transition\n const t = getT(altitude, dawnAltitude, dayAltitude)\n\n // Ambient: Night Blue -> Golden Orange -> Day White\n if (t < 0.5) {\n // Night to Dawn\n const localT = t * 2\n ambientColor = lerpColor('#0d1b2a', '#e07a5f', localT)\n ambientIntensity = THREE.MathUtils.lerp(0.2, 0.5, localT)\n directionalColor = lerpColor('#415a77', '#f2cc8f', localT)\n directionalIntensity = THREE.MathUtils.lerp(0, 0.8, localT)\n } else {\n // Dawn to Day\n const localT = (t - 0.5) * 2\n ambientColor = lerpColor('#e07a5f', '#ffffff', localT)\n ambientIntensity = THREE.MathUtils.lerp(0.5, 0.4, localT) // Smooth transition to day ambient (0.4)\n directionalColor = lerpColor('#f2cc8f', '#fffcf2', localT)\n directionalIntensity = THREE.MathUtils.lerp(0.8, 1, localT)\n }\n } else {\n // Day\n ambientColor = new THREE.Color('#ffffff')\n ambientIntensity = 0.4\n directionalColor = new THREE.Color('#fffcf2') // Warm white\n directionalIntensity = 1\n }\n\n // Moon calculation\n let moonIntensity = 0\n if (moonPosition.altitude > 0) {\n // Moon is visible\n // Fade in/out near horizon\n const horizonFade = Math.max(0, Math.min(1, moonPosition.altitude / 0.1))\n moonIntensity = 0.4 * horizonFade\n }\n\n return {\n ambientColor,\n ambientIntensity,\n directionalColor,\n directionalIntensity,\n moonIntensity,\n }\n }, [sunPosition, moonPosition])\n\n const sunTexture = useMemo(() => {\n const canvas = document.createElement('canvas')\n canvas.width = 512\n canvas.height = 512\n const context = canvas.getContext('2d')!\n\n const gradient = context.createRadialGradient(256, 256, 20, 256, 256, 256)\n\n // Core\n gradient.addColorStop(0, 'rgba(255, 255, 255, 0.8)')\n gradient.addColorStop(0.1, 'rgba(255, 255, 240, 0.8)')\n\n // Corona/Glow\n gradient.addColorStop(0.2, 'rgba(255, 245, 220, 0.4)')\n gradient.addColorStop(0.4, 'rgba(255, 220, 180, 0.1)')\n gradient.addColorStop(1, 'rgba(255, 140, 0, 0)')\n\n context.fillStyle = gradient\n context.fillRect(0, 0, 512, 512)\n\n const texture = new THREE.CanvasTexture(canvas)\n return texture\n }, [])\n\n // Position sprite far away but visible\n const spritePosition = useMemo(\n () => sunPosition.position.clone().normalize().multiplyScalar(400),\n [sunPosition],\n )\n\n // const isNight = sunPosition.altitude < -0.05\n\n const keyLightRef = useRef<THREE.DirectionalLight>(null)\n const fillLightRef = useRef<THREE.DirectionalLight>(null)\n const backLightRef = useRef<THREE.DirectionalLight>(null)\n const pointLightRef = useRef<THREE.PointLight>(null)\n const moonLightRef = useRef<THREE.DirectionalLight>(null)\n\n const [sky] = useState(() => new SkyImpl())\n useGSAP(() => {\n gsap.to(sky.material.uniforms.sunPosition.value, {\n x: sunPosition.position.x,\n y: sunPosition.position.y,\n z: sunPosition.position.z,\n duration: 4,\n })\n\n // Adjusting 3 lights' positions\n if (\n !(\n keyLightRef.current &&\n fillLightRef.current &&\n backLightRef.current &&\n pointLightRef.current &&\n moonLightRef.current\n )\n )\n return\n\n const keyPos = sunPosition.position\n const radius = keyPos.length() // or use a fixed radius if you prefer\n\n // Key light: follows sun directly\n gsap.to(keyLightRef.current.position, {\n x: keyPos.x,\n y: keyPos.y,\n z: keyPos.z,\n duration: 4,\n })\n\n // Moon light: real position\n gsap.to(moonLightRef.current.position, {\n x: moonPosition.position.x,\n y: moonPosition.position.y,\n z: moonPosition.position.z,\n duration: 4,\n })\n\n // Moon intensity\n gsap.to(moonLightRef.current, {\n intensity: lighting.moonIntensity,\n duration: 4,\n })\n\n // Fill light: ~120° around Y axis, lower intensity in your material\n // Positioned opposite-ish to soften shadows\n tempVec.copy(keyPos)\n tempVec.y = 0 // project to XZ plane for rotation\n tempVec.applyAxisAngle(yAxis, degToRad(120))\n tempVec.y = keyPos.y * 0.25 // lower elevation than key\n tempVec.normalize().multiplyScalar(radius * 0.8)\n\n gsap.to(fillLightRef.current.position, {\n x: tempVec.x,\n y: tempVec.y,\n z: tempVec.z,\n duration: 4,\n })\n\n // Back light: ~200° around, higher up for rim lighting effect\n tempVec.copy(keyPos)\n tempVec.y = 0\n tempVec.applyAxisAngle(yAxis, degToRad(240))\n tempVec.y = keyPos.y * 0.5 // higher elevation\n tempVec.normalize().multiplyScalar(radius * 0.6)\n\n gsap.to(backLightRef.current.position, {\n x: tempVec.x,\n y: tempVec.y,\n z: tempVec.z,\n duration: 4,\n })\n\n gsap.to(pointLightRef.current, {\n intensity: sunPosition.altitude < 0 ? 25.5 : 0,\n duration: 4,\n delay: 2,\n })\n }, [sunPosition, moonPosition])\n\n useGSAP(() => {\n if (!(keyLightRef.current && fillLightRef.current && backLightRef.current)) return\n\n gsap.to(keyLightRef.current.color, {\n r: lighting.directionalColor.r,\n g: lighting.directionalColor.g,\n b: lighting.directionalColor.b,\n duration: 4,\n })\n gsap.to(fillLightRef.current.color, {\n r: lighting.directionalColor.r,\n g: lighting.directionalColor.g,\n b: lighting.directionalColor.b,\n duration: 4,\n })\n gsap.to(backLightRef.current.color, {\n r: lighting.directionalColor.r,\n g: lighting.directionalColor.g,\n b: lighting.directionalColor.b,\n duration: 4,\n })\n }, [lighting])\n\n return (\n <>\n {/* <Sky\n distance={1000}\n mieCoefficient={0.005}\n mieDirectionalG={0.7}\n rayleigh={isNight ? 0.1 : 3}\n sunPosition={sunPosition.position}\n turbidity={isNight ? 10 : 1}\n />\n\n <sprite position={spritePosition} scale={[60, 60, 1]}>\n <spriteMaterial\n blending={THREE.AdditiveBlending}\n depthWrite={false}\n map={sunTexture}\n opacity={isNight ? 0 : 0.8}\n toneMapped={false}\n transparent\n />\n </sprite> */}\n\n {/* <Environment preset=\"city\" /> */}\n\n <primitive\n material-uniforms-mieCoefficient-value={0.005}\n material-uniforms-mieDirectionalG-value={0.8}\n material-uniforms-rayleigh-value={0.5}\n material-uniforms-turbidity-value={10}\n object={sky}\n scale={1000}\n />\n {/* <Sky\n // azimuth={sunPosition.azimuth}\n // inclination={sunPosition.altitude}\n sunPosition={sunPosition.position}\n /> */}\n <pointLight\n castShadow\n distance={50}\n intensity={15.5}\n position={[0, 2.5, 0]}\n ref={pointLightRef}\n />\n\n <directionalLight\n castShadow\n intensity={2}\n position={[-3, 1, -3]} //lighting.directionalIntensity}\n ref={keyLightRef}\n shadow-bias={-0.000_05}\n shadow-camera-bottom={-40}\n shadow-camera-far={200}\n shadow-camera-left={-40}\n shadow-camera-right={40}\n shadow-camera-top={40}\n shadow-mapSize={[2048, 2048]}\n />\n <directionalLight\n intensity={2}\n position={[3, 1, 3]} //lighting.directionalIntensity}\n ref={fillLightRef} //sunPosition.position}\n />\n <directionalLight\n intensity={1}\n position={[-3, 1, 3]} //lighting.directionalIntensity}\n ref={backLightRef} //sunPosition.position}\n />\n <directionalLight\n castShadow\n color=\"#b0c4de\"\n intensity={0}\n position={[0, -100, 0]}\n ref={moonLightRef}\n shadow-bias={-0.000_05}\n shadow-camera-bottom={-40}\n shadow-camera-far={200}\n shadow-camera-left={-40}\n shadow-camera-right={40}\n shadow-camera-top={40}\n shadow-mapSize={[2048, 2048]}\n />\n </>\n )\n})\n","import { REVISION } from 'three'\n\nexport const version = /* @__PURE__ */ (() => parseInt(REVISION.replace(/\\D+/g, '')))()\n","import { BackSide, BoxGeometry, Mesh, ShaderMaterial, UniformsUtils, Vector3 } from 'three'\nimport { version } from '../_polyfill/constants'\n\n/**\n * Based on \"A Practical Analytic Model for Daylight\"\n * aka The Preetham Model, the de facto standard analytic skydome model\n * https://www.researchgate.net/publication/220720443_A_Practical_Analytic_Model_for_Daylight\n *\n * First implemented by Simon Wallner\n * http://www.simonwallner.at/projects/atmospheric-scattering\n *\n * Improved by Martin Upitis\n * http://blenderartists.org/forum/showthread.php?245954-preethams-sky-impementation-HDR\n *\n * Three.js integration by zz85 http://twitter.com/blurspline\n */\nconst Sky = /* @__PURE__ */ (() => {\n const SkyShader = {\n uniforms: {\n turbidity: { value: 2 },\n rayleigh: { value: 1 },\n mieCoefficient: { value: 0.005 },\n mieDirectionalG: { value: 0.8 },\n sunPosition: { value: new Vector3() },\n up: { value: new Vector3(0, 1, 0) },\n },\n\n vertexShader: /* glsl */ `\n uniform vec3 sunPosition;\n uniform float rayleigh;\n uniform float turbidity;\n uniform float mieCoefficient;\n uniform vec3 up;\n\n varying vec3 vWorldPosition;\n varying vec3 vSunDirection;\n varying float vSunfade;\n varying vec3 vBetaR;\n varying vec3 vBetaM;\n varying float vSunE;\n\n // constants for atmospheric scattering\n const float e = 2.71828182845904523536028747135266249775724709369995957;\n const float pi = 3.141592653589793238462643383279502884197169;\n\n // wavelength of used primaries, according to preetham\n const vec3 lambda = vec3( 680E-9, 550E-9, 450E-9 );\n // this pre-calcuation replaces older TotalRayleigh(vec3 lambda) function:\n // (8.0 * pow(pi, 3.0) * pow(pow(n, 2.0) - 1.0, 2.0) * (6.0 + 3.0 * pn)) / (3.0 * N * pow(lambda, vec3(4.0)) * (6.0 - 7.0 * pn))\n const vec3 totalRayleigh = vec3( 5.804542996261093E-6, 1.3562911419845635E-5, 3.0265902468824876E-5 );\n\n // mie stuff\n // K coefficient for the primaries\n const float v = 4.0;\n const vec3 K = vec3( 0.686, 0.678, 0.666 );\n // MieConst = pi * pow( ( 2.0 * pi ) / lambda, vec3( v - 2.0 ) ) * K\n const vec3 MieConst = vec3( 1.8399918514433978E14, 2.7798023919660528E14, 4.0790479543861094E14 );\n\n // earth shadow hack\n // cutoffAngle = pi / 1.95;\n const float cutoffAngle = 1.6110731556870734;\n const float steepness = 1.5;\n const float EE = 1000.0;\n\n float sunIntensity( float zenithAngleCos ) {\n zenithAngleCos = clamp( zenithAngleCos, -1.0, 1.0 );\n return EE * max( 0.0, 1.0 - pow( e, -( ( cutoffAngle - acos( zenithAngleCos ) ) / steepness ) ) );\n }\n\n vec3 totalMie( float T ) {\n float c = ( 0.2 * T ) * 10E-18;\n return 0.434 * c * MieConst;\n }\n\n void main() {\n\n vec4 worldPosition = modelMatrix * vec4( position, 1.0 );\n vWorldPosition = worldPosition.xyz;\n\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n gl_Position.z = gl_Position.w; // set z to camera.far\n\n vSunDirection = normalize( sunPosition );\n\n vSunE = sunIntensity( dot( vSunDirection, up ) );\n\n vSunfade = 1.0 - clamp( 1.0 - exp( ( sunPosition.y / 450000.0 ) ), 0.0, 1.0 );\n\n float rayleighCoefficient = rayleigh - ( 1.0 * ( 1.0 - vSunfade ) );\n\n // extinction (absorbtion + out scattering)\n // rayleigh coefficients\n vBetaR = totalRayleigh * rayleighCoefficient;\n\n // mie coefficients\n vBetaM = totalMie( turbidity ) * mieCoefficient;\n\n }\n `,\n\n fragmentShader: /* glsl */ `\n varying vec3 vWorldPosition;\n varying vec3 vSunDirection;\n varying float vSunfade;\n varying vec3 vBetaR;\n varying vec3 vBetaM;\n varying float vSunE;\n\n uniform float mieDirectionalG;\n uniform vec3 up;\n\n const vec3 cameraPos = vec3( 0.0, 0.0, 0.0 );\n\n // constants for atmospheric scattering\n const float pi = 3.141592653589793238462643383279502884197169;\n\n const float n = 1.0003; // refractive index of air\n const float N = 2.545E25; // number of molecules per unit volume for air at 288.15K and 1013mb (sea level -45 celsius)\n\n // optical length at zenith for molecules\n const float rayleighZenithLength = 8.4E3;\n const float mieZenithLength = 1.25E3;\n // 66 arc seconds -> degrees, and the cosine of that\n const float sunAngularDiameterCos = 0.999956676946448443553574619906976478926848692873900859324;\n\n // 3.0 / ( 16.0 * pi )\n const float THREE_OVER_SIXTEENPI = 0.05968310365946075;\n // 1.0 / ( 4.0 * pi )\n const float ONE_OVER_FOURPI = 0.07957747154594767;\n\n float rayleighPhase( float cosTheta ) {\n return THREE_OVER_SIXTEENPI * ( 1.0 + pow( cosTheta, 2.0 ) );\n }\n\n float hgPhase( float cosTheta, float g ) {\n float g2 = pow( g, 2.0 );\n float inverse = 1.0 / pow( 1.0 - 2.0 * g * cosTheta + g2, 1.5 );\n return ONE_OVER_FOURPI * ( ( 1.0 - g2 ) * inverse );\n }\n\n void main() {\n\n vec3 direction = normalize( vWorldPosition - cameraPos );\n\n // optical length\n // cutoff angle at 90 to avoid singularity in next formula.\n float zenithAngle = acos( max( 0.0, dot( up, direction ) ) );\n float inverse = 1.0 / ( cos( zenithAngle ) + 0.15 * pow( 93.885 - ( ( zenithAngle * 180.0 ) / pi ), -1.253 ) );\n float sR = rayleighZenithLength * inverse;\n float sM = mieZenithLength * inverse;\n\n // combined extinction factor\n vec3 Fex = exp( -( vBetaR * sR + vBetaM * sM ) );\n\n // in scattering\n float cosTheta = dot( direction, vSunDirection );\n\n float rPhase = rayleighPhase( cosTheta * 0.5 + 0.5 );\n vec3 betaRTheta = vBetaR * rPhase;\n\n float mPhase = hgPhase( cosTheta, mieDirectionalG );\n vec3 betaMTheta = vBetaM * mPhase;\n\n vec3 Lin = pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * ( 1.0 - Fex ), vec3( 1.5 ) );\n Lin *= mix( vec3( 1.0 ), pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * Fex, vec3( 1.0 / 2.0 ) ), clamp( pow( 1.0 - dot( up, vSunDirection ), 5.0 ), 0.0, 1.0 ) );\n\n // nightsky\n float theta = acos( direction.y ); // elevation --> y-axis, [-pi/2, pi/2]\n float phi = atan( direction.z, direction.x ); // azimuth --> x-axis [-pi/2, pi/2]\n vec2 uv = vec2( phi, theta ) / vec2( 2.0 * pi, pi ) + vec2( 0.5, 0.0 );\n vec3 L0 = vec3( 0.1 ) * Fex;\n\n // composition + solar disc\n float sundisk = smoothstep( sunAngularDiameterCos, sunAngularDiameterCos + 0.00002, cosTheta );\n L0 += ( vSunE * 19000.0 * Fex ) * sundisk;\n\n vec3 texColor = ( Lin + L0 ) * 0.04 + vec3( 0.0, 0.0003, 0.00075 );\n\n vec3 retColor = pow( texColor, vec3( 1.0 / ( 1.2 + ( 1.2 * vSunfade ) ) ) );\n\n gl_FragColor = vec4( retColor, 1.0 );\n\n #include <tonemapping_fragment>\n #include <${version >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>\n\n }\n `,\n }\n\n const material = new ShaderMaterial({\n name: 'SkyShader',\n fragmentShader: SkyShader.fragmentShader,\n vertexShader: SkyShader.vertexShader,\n uniforms: UniformsUtils.clone(SkyShader.uniforms),\n side: BackSide,\n depthWrite: false,\n })\n\n class Sky extends Mesh {\n constructor() {\n super(new BoxGeometry(1, 1, 1), material)\n }\n\n static SkyShader = SkyShader\n static material = material\n }\n\n return Sky\n})()\n\nexport { Sky }\n","'use client'\n\nimport { useSpring } from '@react-spring/three'\nimport { useFrame } from '@react-three/fiber'\nimport { useEffect, useMemo, useRef } from 'react'\nimport type * as THREE from 'three'\nimport { useShallow } from 'zustand/react/shallow'\nimport { useEditor } from '../../hooks'\nimport { getRenderer } from '../../registry'\nimport type { AnyNode, AnyNodeId, BaseNode } from '../../scenegraph/schema'\nimport { FLOOR_SPACING, TILE_SIZE } from '../../constants'\n\ninterface NodeRendererProps {\n nodeId: BaseNode['id']\n isViewer?: boolean // Set to true when rendering in viewer mode\n}\n\ninterface AnimatedLevelGroupProps {\n children: React.ReactNode\n basePosition: [number, number, number]\n rotation: [number, number, number]\n visible?: boolean\n name: string\n userData: any\n levelIndex: number\n}\n\n/**\n * Animated group specifically for level nodes.\n * Subscribes to levelMode changes imperatively and animates Y position with spring.\n */\nconst AnimatedLevelGroup = ({\n children,\n basePosition,\n rotation,\n visible,\n name,\n userData,\n levelIndex,\n}: AnimatedLevelGroupProps) => {\n const groupRef = useRef<THREE.Group>(null)\n\n // Calculate initial Y based on current levelMode\n const getTargetY = (levelMode: 'stacked' | 'exploded') =>\n basePosition[1] + (levelMode === 'exploded' ? levelIndex * FLOOR_SPACING : 0)\n\n // Spring for smooth Y position transitions\n const { y } = useSpring({\n y: getTargetY(useEditor.getState().levelMode),\n config: {\n mass: 1,\n tension: 170,\n friction: 26,\n },\n })\n\n // Subscribe to levelMode changes and trigger spring animation\n useEffect(() => {\n let prevLevelMode = useEditor.getState().levelMode\n const unsubscribe = useEditor.subscribe((state) => {\n if (state.levelMode !== prevLevelMode) {\n prevLevelMode = state.levelMode\n y.start(getTargetY(state.levelMode))\n }\n })\n return unsubscribe\n }, [levelIndex, basePosition, y])\n\n // Update spring target when basePosition changes\n useEffect(() => {\n y.start(getTargetY(useEditor.getState().levelMode))\n }, [basePosition, y])\n\n // Apply animated Y position to group each frame\n useFrame(() => {\n if (groupRef.current) {\n groupRef.current.position.y = y.get()\n }\n })\n\n return (\n <group\n name={name}\n position={[basePosition[0], basePosition[1], basePosition[2]]}\n ref={groupRef}\n rotation={rotation}\n userData={userData}\n visible={visible}\n >\n {children}\n </group>\n )\n}\n\nexport function NodeRenderer({ nodeId, isViewer = false }: NodeRendererProps) {\n const {\n nodeType,\n nodeVisible,\n nodePosition,\n nodeRotation,\n nodeElevation,\n nodeLevel,\n nodeChildrenIdsStr,\n } = useEditor(\n useShallow((state) => {\n const handle = state.graph.getNodeById(nodeId as AnyNodeId)\n const node = handle?.data()\n return {\n nodeType: node?.type,\n nodeVisible: (node as any)?.visible, // TODO: Type correctly\n nodeChildrenIdsStr: JSON.stringify(\n (node as any)?.children?.map((child: AnyNode) => child.id) || [],\n ), // Storing into string to avoid deep equality issues\n nodePosition: (node as any)?.position, // TODO: Type correctly\n nodeElevation: (node as any)?.elevation, // TODO: Type correctly\n nodeRotation: (node as any)?.rotation, // TODO: Type correctly - can be number or [x,y,z] tuple\n nodeLevel: (node as any)?.level, // TODO: Type correctly\n }\n }),\n )\n const nodeChildrenIds = useMemo(\n () => JSON.parse(nodeChildrenIdsStr || '[]'),\n [nodeChildrenIdsStr],\n )\n\n // Base position without level offset (level offset is handled by AnimatedLevelGroup)\n const basePosition = useMemo(() => {\n if (nodePosition) {\n const [x, y] = nodePosition\n return [x * TILE_SIZE, nodeElevation || 0, y * TILE_SIZE] as [number, number, number]\n }\n return [0, nodeElevation || 0, 0] as [number, number, number]\n }, [nodePosition, nodeElevation])\n\n const viewerDisplayMode = useEditor((state) => state.viewerDisplayMode)\n\n // Ref for the outer group to control visibility imperatively\n const groupRef = useRef<THREE.Group>(null)\n\n // For level nodes in viewer mode, subscribe to selectedFloorId changes\n // and update visibility imperatively without causing re-renders\n const isViewerLevelNode = isViewer && nodeType === 'level'\n useEffect(() => {\n if (!isViewerLevelNode) return\n\n // Update visibility based on selectedFloorId\n const updateVisibility = (selectedFloorId: string | null) => {\n if (groupRef.current) {\n const shouldBeVisible = !selectedFloorId || selectedFloorId === nodeId\n groupRef.current.visible = shouldBeVisible\n }\n }\n\n // Set initial state\n updateVisibility(useEditor.getState().selectedFloorId)\n\n // Subscribe to store changes and check if selectedFloorId changed\n let prevSelectedFloorId = useEditor.getState().selectedFloorId\n const unsubscribe = useEditor.subscribe((state) => {\n if (state.selectedFloorId !== prevSelectedFloorId) {\n prevSelectedFloorId = state.selectedFloorId\n updateVisibility(state.selectedFloorId)\n }\n })\n\n return unsubscribe\n }, [isViewerLevelNode, nodeId])\n\n // Filter nodes based on viewer display mode (only in viewer mode)\n // Note: Level visibility is now handled imperatively via subscription above\n const shouldRenderNode = useMemo(() => {\n // Viewer-specific visibility logic\n if (isViewer) {\n // Level nodes are always rendered (visibility controlled imperatively)\n if (nodeType === 'level') {\n return true\n }\n\n if (viewerDisplayMode === 'scans') {\n // Only render scan nodes\n return nodeType === 'scan'\n }\n if (viewerDisplayMode === 'objects') {\n // Render everything except scans and reference images\n return nodeType !== 'scan' && nodeType !== 'reference-image'\n }\n }\n\n // Level nodes are always rendered in editor mode\n if (nodeType === 'level') return true\n\n // Default: render everything (editor mode or when no filtering is needed)\n return true\n }, [nodeType, viewerDisplayMode, isViewer])\n\n // Try to get renderer from registry first\n const RegistryRenderer = getRenderer(nodeType || 'unknown')\n\n // Don't render if filtered out by display mode\n if (!shouldRenderNode) {\n return null\n }\n\n const rotation: [number, number, number] = Array.isArray(nodeRotation)\n ? (nodeRotation as [number, number, number])\n : [0, nodeRotation ?? 0, 0]\n\n const children = (\n <>\n {/* Use registry renderer if available, otherwise fallback to direct imports */}\n {RegistryRenderer && <RegistryRenderer nodeId={nodeId} />}\n\n {/* Recursively render children INSIDE parent group - children use relative positions */}\n {nodeChildrenIds.length > 0 &&\n nodeChildrenIds.map((childNodeId: AnyNode['id']) => (\n <NodeRenderer isViewer={isViewer} key={childNodeId} nodeId={childNodeId} />\n ))}\n </>\n )\n\n // Level nodes use AnimatedLevelGroup for smooth levelMode transitions\n if (nodeType === 'level') {\n return (\n <group ref={groupRef}>\n <AnimatedLevelGroup\n basePosition={basePosition}\n levelIndex={nodeLevel || 0}\n name={nodeId}\n rotation={rotation}\n userData={{ nodeId }}\n visible={nodeVisible}\n >\n {children}\n </AnimatedLevelGroup>\n </group>\n )\n }\n\n // Non-level nodes use a plain group\n return (\n <group ref={groupRef}>\n <group\n name={nodeId}\n position={basePosition}\n rotation={rotation}\n userData={{ nodeId }}\n visible={nodeVisible}\n >\n {children}\n </group>\n </group>\n )\n}\n","'use client'\n\nimport { useMemo } from 'react'\nimport { FrontSide, MeshPhysicalMaterial } from 'three'\nimport CustomShaderMaterial from 'three-custom-shader-material'\nimport { useShallow } from 'zustand/react/shallow'\nimport { useEditor } from '../../hooks'\nimport type { SiteNode } from '../../scenegraph/schema'\nimport { GRID_SIZE } from '../../constants'\n\n// Floor material constants\nconst FLOOR_COLOR = 'white'\nconst FLOOR_METALNESS = 0.05\nconst FLOOR_ROUGHNESS = 0.95\nconst FLOOR_SIZE = 1000\n\n// Grid fade constants\nconst FADE_DISTANCE = 40\nconst FADE_STRENGTH = 5\n\nexport function InfiniteFloor() {\n return (\n <mesh\n name=\"infinite-floor\"\n position={[0, -0.01, 0]}\n raycast={() => null}\n receiveShadow\n rotation={[-Math.PI / 2, 0, 0]}\n >\n <planeGeometry args={[FLOOR_SIZE, FLOOR_SIZE]} />\n <CustomShaderMaterial\n baseMaterial={MeshPhysicalMaterial}\n color={FLOOR_COLOR}\n depthWrite={false}\n fragmentShader={\n /* glsl */ `\n varying vec2 vUv;\n\n void main() {\n float dist = distance(vUv, vec2(0.5));\n csm_DiffuseColor.a = 1.0 - smoothstep(0.0, 0.5, dist);\n }\n `\n }\n metalness={FLOOR_METALNESS}\n roughness={FLOOR_ROUGHNESS}\n vertexShader={\n /* glsl */ `\n varying vec2 vUv;\n\n void main() {\n vUv = uv;\n }\n `\n } // Your fragment Shader\n />\n </mesh>\n )\n}\n\nexport function useGridFadeControls() {\n const polygon = useEditor(\n useShallow((state) => {\n const siteHandle = state.graph.getNodesByType('site')[0]\n const siteNode = siteHandle?.data() as SiteNode | undefined\n return siteNode?.polygon\n }),\n )\n\n const fadeDistance = useMemo(() => {\n if (!polygon?.points || polygon.points.length === 0) return FADE_DISTANCE\n\n let maxDist = 0\n const offset = GRID_SIZE / 2\n for (const point of polygon.points) {\n // Convert local site coordinates to world coordinates relative to center\n const x = point[0] - offset\n const y = point[1] - offset\n const dist = Math.sqrt(x * x + y * y)\n if (dist > maxDist) maxDist = dist\n }\n\n // Add buffer of 10m or ensure minimum of default FADE_DISTANCE\n return Math.max(FADE_DISTANCE, maxDist + 15)\n }, [polygon])\n\n return {\n fadeDistance,\n fadeStrength: FADE_STRENGTH,\n }\n}\n","import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","'use client'\n\nimport { useMemo } from 'react'\nimport * as THREE from 'three'\nimport { useThree } from '@react-three/fiber'\nimport { Line } from '@react-three/drei'\nimport { useEditor } from '@pascal/core/hooks'\n\n/**\n * Calculate oriented bounding box for a group (follows rotation)\n */\nfunction calculateWorldBounds(group: THREE.Group): {\n size: THREE.Vector3\n center: THREE.Vector3\n rotation: THREE.Euler\n} | null {\n // Force update of world matrices to ensure accurate calculation\n group.updateMatrixWorld(true)\n\n // Calculate bounding box in local space (before rotation)\n const box = new THREE.Box3()\n let hasContent = false\n\n group.traverse((child) => {\n if (child === group) return\n\n // For meshes with geometry\n if (child instanceof THREE.Mesh && child.geometry) {\n // Check if this mesh belongs to an image node - if so, exclude it from bounds\n let current: THREE.Object3D | null = child\n let isImage = false\n while (current && current !== group) {\n if (current.userData?.nodeId) {\n const node = useEditor.getState().graph.getNodeById(current.userData.nodeId)?.data()\n if (node?.type === 'reference-image') {\n isImage = true\n break\n }\n }\n current = current.parent\n }\n\n if (isImage) return\n\n const geometry = child.geometry\n\n if (!geometry.boundingBox) {\n geometry.computeBoundingBox()\n }\n\n if (geometry.boundingBox) {\n hasContent = true\n const localBox = geometry.boundingBox.clone()\n\n // Transform by the mesh's local matrix (relative to parent group)\n const relativeMatrix = new THREE.Matrix4()\n relativeMatrix.copy(child.matrix)\n\n // Accumulate parent matrices within the group\n let current = child.parent\n while (current && current !== group) {\n relativeMatrix.premultiply(current.matrix)\n current = current.parent\n }\n\n localBox.applyMatrix4(relativeMatrix)\n box.union(localBox)\n }\n }\n })\n\n if (!hasContent || box.isEmpty()) return null\n\n // Get size in local space\n const size = box.getSize(new THREE.Vector3())\n const localCenter = box.getCenter(new THREE.Vector3())\n\n // Get world position and rotation\n const worldPosition = new THREE.Vector3()\n const worldQuaternion = new THREE.Quaternion()\n const worldScale = new THREE.Vector3()\n group.matrixWorld.decompose(worldPosition, worldQuaternion, worldScale)\n\n // Convert local center to world position\n const center = localCenter.clone().applyMatrix4(group.matrixWorld)\n\n // Convert quaternion to euler for easier use\n const rotation = new THREE.Euler().setFromQuaternion(worldQuaternion)\n\n return { size, center, rotation }\n}\n\n/**\n * Generate edge line points for a box\n */\nfunction getBoxEdgePoints(size: THREE.Vector3): [number, number, number][] {\n const hx = size.x / 2\n const hy = size.y / 2\n const hz = size.z / 2\n\n // 12 edges of a box, each edge is 2 points\n // We'll create line segments for all 12 edges\n return [\n // Bottom face edges\n [-hx, -hy, -hz],\n [hx, -hy, -hz],\n [hx, -hy, -hz],\n [hx, -hy, hz],\n [hx, -hy, hz],\n [-hx, -hy, hz],\n [-hx, -hy, hz],\n [-hx, -hy, -hz],\n // Top face edges\n [-hx, hy, -hz],\n [hx, hy, -hz],\n [hx, hy, -hz],\n [hx, hy, hz],\n [hx, hy, hz],\n [-hx, hy, hz],\n [-hx, hy, hz],\n [-hx, hy, -hz],\n // Vertical edges\n [-hx, -hy, -hz],\n [-hx, hy, -hz],\n [hx, -hy, -hz],\n [hx, hy, -hz],\n [hx, -hy, hz],\n [hx, hy, hz],\n [-hx, -hy, hz],\n [-hx, hy, hz],\n ]\n}\n\ninterface SelectionBoxProps {\n size: THREE.Vector3\n center: THREE.Vector3\n rotation: THREE.Euler\n color: string\n}\n\nfunction SelectionBox({ size, center, rotation, color }: SelectionBoxProps) {\n const points = useMemo(() => getBoxEdgePoints(size), [size])\n\n return (\n <group position={center} rotation={rotation}>\n <Line\n color={color}\n dashed\n dashSize={0.2}\n depthTest={false}\n depthWrite={false}\n gapSize={0.05}\n lineWidth={1.5}\n points={points}\n renderOrder={999}\n segments\n transparent\n />\n </group>\n )\n}\n\ninterface BoundingBoxData {\n size: THREE.Vector3\n center: THREE.Vector3\n rotation: THREE.Euler\n}\n\n/**\n * SelectionControls - Shows selection bounding boxes in viewer mode.\n * This is a simplified version that only shows selection indicators without manipulation controls.\n */\nexport function SelectionControls() {\n const selectedNodeIds = useEditor((state) => state.selectedNodeIds)\n const selectedZoneId = useEditor((state) => state.selectedZoneId)\n const { scene } = useThree()\n\n // In viewer mode with a zone selected, only show combined bounds\n const isViewerZoneMode = !!selectedZoneId\n\n // Find selected THREE.Group objects by name (nodeId)\n const selectedGroups = useMemo(() => {\n if (!scene || selectedNodeIds.length === 0) return []\n return selectedNodeIds.map((id) => scene.getObjectByName(id)).filter(Boolean) as THREE.Group[]\n }, [scene, selectedNodeIds])\n\n // Calculate individual bounding boxes for each selected object\n const individualBounds = useMemo(\n () =>\n selectedGroups\n .map((group) => calculateWorldBounds(group))\n .filter(Boolean) as BoundingBoxData[],\n [selectedGroups],\n )\n\n // Calculate combined bounding box for all selected objects\n // Combined box is axis-aligned in world space (doesn't rotate)\n const combinedBounds = useMemo((): BoundingBoxData | null => {\n if (individualBounds.length === 0) return null\n\n const combinedBox = new THREE.Box3()\n\n // For each oriented bound, compute world-space AABB corners and expand\n individualBounds.forEach((bounds) => {\n const { size, center, rotation } = bounds\n\n // Create a temporary box at origin\n const halfSize = size.clone().multiplyScalar(0.5)\n const corners = [\n new THREE.Vector3(-halfSize.x, -halfSize.y, -halfSize.z),\n new THREE.Vector3(halfSize.x, -halfSize.y, -halfSize.z),\n new THREE.Vector3(-halfSize.x, halfSize.y, -halfSize.z),\n new THREE.Vector3(halfSize.x, halfSize.y, -halfSize.z),\n new THREE.Vector3(-halfSize.x, -halfSize.y, halfSize.z),\n new THREE.Vector3(halfSize.x, -halfSize.y, halfSize.z),\n new THREE.Vector3(-halfSize.x, halfSize.y, halfSize.z),\n new THREE.Vector3(halfSize.x, halfSize.y, halfSize.z),\n ]\n\n // Rotate and translate corners to world space\n const matrix = new THREE.Matrix4()\n matrix.makeRotationFromEuler(rotation)\n matrix.setPosition(center)\n\n corners.forEach((corner) => {\n corner.applyMatrix4(matrix)\n combinedBox.expandByPoint(corner)\n })\n })\n\n const size = combinedBox.getSize(new THREE.Vector3())\n const center = combinedBox.getCenter(new THREE.Vector3())\n\n return { size, center, rotation: new THREE.Euler(0, 0, 0) }\n }, [individualBounds])\n\n // Don't render anything if nothing is selected\n if (selectedNodeIds.length === 0 || !combinedBounds) return null\n\n return (\n <group>\n {/* Combined bounding box */}\n {/* In viewer zone mode: always show as the room boundary */}\n {(isViewerZoneMode || selectedNodeIds.length > 1) && (\n <SelectionBox\n center={combinedBounds.center}\n color={isViewerZoneMode ? '#f59e0b' : '#ffff00'}\n rotation={new THREE.Euler(0, 0, 0)}\n size={combinedBounds.size}\n />\n )}\n </group>\n )\n}\n","'use client'\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { Intersection, Object3D } from 'three'\nimport * as THREE from 'three'\nimport { Box3, Mesh, Plane, Raycaster, Vector2, Vector3 } from 'three'\nimport { useThree } from '@react-three/fiber'\nimport { Line } from '@react-three/drei'\nimport { useShallow } from 'zustand/react/shallow'\nimport { GRID_SIZE, TILE_SIZE } from '@pascal/core/constants'\nimport { emitter } from '@pascal/core/events'\nimport { useEditor, type StoreState } from '@pascal/core/hooks'\nimport type { Zone } from '@pascal/core/scenegraph/schema/zones'\n\n/**\n * FSM States for viewer navigation\n */\ntype ViewerState = 'idle' | 'building' | 'level' | 'zone' | 'node'\n\n/**\n * Generate edge line points for a box\n */\nfunction getBoxEdgePoints(box: Box3): [number, number, number][] {\n const min = box.min\n const max = box.max\n\n return [\n // Bottom face edges\n [min.x, min.y, min.z],\n [max.x, min.y, min.z],\n [max.x, min.y, min.z],\n [max.x, min.y, max.z],\n [max.x, min.y, max.z],\n [min.x, min.y, max.z],\n [min.x, min.y, max.z],\n [min.x, min.y, min.z],\n // Top face edges\n [min.x, max.y, min.z],\n [max.x, max.y, min.z],\n [max.x, max.y, min.z],\n [max.x, max.y, max.z],\n [max.x, max.y, max.z],\n [min.x, max.y, max.z],\n [min.x, max.y, max.z],\n [min.x, max.y, min.z],\n // Vertical edges\n [min.x, min.y, min.z],\n [min.x, max.y, min.z],\n [max.x, min.y, min.z],\n [max.x, max.y, min.z],\n [max.x, min.y, max.z],\n [max.x, max.y, max.z],\n [min.x, min.y, max.z],\n [min.x, max.y, max.z],\n ]\n}\n\ninterface HighlightBoxProps {\n box: Box3\n color: string\n}\n\n/**\n * Gradient shader material for highlight box walls\n * Fades from transparent at bottom to semi-transparent at top\n * Uses geometry bounds attribute to compute normalized height in vertex shader\n */\nconst HighlightGradientMaterial = ({\n color,\n opacity,\n}: {\n color: string\n opacity: number\n}) => {\n const materialRef = useRef<THREE.ShaderMaterial>(null)\n\n const uniforms = useMemo(\n () => ({\n uColor: { value: new THREE.Color(color) },\n uOpacity: { value: opacity },\n }),\n [],\n )\n\n useEffect(() => {\n if (materialRef.current) {\n materialRef.current.uniforms.uColor.value.set(color)\n materialRef.current.uniforms.uOpacity.value = opacity\n }\n }, [color, opacity])\n\n return (\n <shaderMaterial\n depthTest={false}\n depthWrite={false}\n fragmentShader={`\n uniform vec3 uColor;\n uniform float uOpacity;\n varying float vAlpha;\n\n void main() {\n gl_FragColor = vec4(uColor, vAlpha * uOpacity);\n }\n `}\n ref={materialRef}\n side={THREE.DoubleSide}\n transparent\n uniforms={uniforms}\n vertexShader={`\n attribute float normalizedHeight;\n varying float vAlpha;\n\n void main() {\n // Use pre-computed normalized height (0 at bottom, 1 at top)\n vAlpha = normalizedHeight * normalizedHeight; // Quadratic falloff\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `}\n />\n )\n}\n\nfunction HighlightBox({ box, color }: HighlightBoxProps) {\n const points = useMemo(() => getBoxEdgePoints(box), [box])\n\n // Create wall geometry for the box - only walls, no top/bottom caps\n const wallGeometry = useMemo(() => {\n const min = box.min\n const max = box.max\n\n // Create 4 wall planes manually for cleaner geometry\n const geometry = new THREE.BufferGeometry()\n\n // Define the 4 walls as quads (2 triangles each)\n // Wall vertices: each wall has 4 corners\n // Pattern per wall: bottom-left, bottom-right, top-right, top-left\n const vertices = new Float32Array([\n // Front wall (min.z side)\n min.x, min.y, min.z,\n max.x, min.y, min.z,\n max.x, max.y, min.z,\n min.x, max.y, min.z,\n // Back wall (max.z side)\n max.x, min.y, max.z,\n min.x, min.y, max.z,\n min.x, max.y, max.z,\n max.x, max.y, max.z,\n // Left wall (min.x side)\n min.x, min.y, max.z,\n min.x, min.y, min.z,\n min.x, max.y, min.z,\n min.x, max.y, max.z,\n // Right wall (max.x side)\n max.x, min.y, min.z,\n max.x, min.y, max.z,\n max.x, max.y, max.z,\n max.x, max.y, min.z,\n ])\n\n // Normalized height attribute: 0 at bottom, 1 at top\n // Pattern per wall: 0, 0, 1, 1 (bottom vertices = 0, top vertices = 1)\n const normalizedHeight = new Float32Array([\n // Front wall\n 0, 0, 1, 1,\n // Back wall\n 0, 0, 1, 1,\n // Left wall\n 0, 0, 1, 1,\n // Right wall\n 0, 0, 1, 1,\n ])\n\n // Indices for 4 walls (2 triangles per wall)\n const indices = new Uint16Array([\n // Front wall\n 0, 1, 2, 0, 2, 3,\n // Back wall\n 4, 5, 6, 4, 6, 7,\n // Left wall\n 8, 9, 10, 8, 10, 11,\n // Right wall\n 12, 13, 14, 12, 14, 15,\n ])\n\n geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3))\n geometry.setAttribute('normalizedHeight', new THREE.BufferAttribute(normalizedHeight, 1))\n geometry.setIndex(new THREE.BufferAttribute(indices, 1))\n geometry.computeVertexNormals()\n\n return geometry\n }, [box])\n\n return (\n <group>\n {/* Gradient fill walls */}\n <mesh geometry={wallGeometry} renderOrder={997}>\n <HighlightGradientMaterial color={color} opacity={0.3} />\n </mesh>\n\n {/* Edge lines */}\n <Line\n color={color}\n depthTest={false}\n depthWrite={false}\n lineWidth={2}\n points={points}\n renderOrder={998}\n segments\n transparent\n />\n </group>\n )\n}\n\n/**\n * LevelHoverManager - FSM-based navigation for viewer mode\n *\n * States:\n * - idle: Nothing selected, hover/click building to enter building state\n * - building: Building selected, hover/click levels (or auto-select if only one)\n * - level: Level selected, hover/click zones\n * - zone: Zone selected, hover/click nodes\n * - node: Node(s) selected\n *\n * Transitions:\n * - idle -> building: Click on building\n * - building -> level: Click on level (or auto if single level)\n * - building -> idle: Click void\n * - level -> zone: Click on zone\n * - level -> building: Click void (or auto if single level -> idle)\n * - zone -> node: Click on node\n * - zone -> level: Click outside zone (or building if single level)\n * - node -> zone: Click outside node but inside zone\n * - node -> level: Click outside zone (or building if single level)\n */\nexport function LevelHoverManager() {\n const { scene, camera, gl } = useThree()\n\n const [hoveredBox, setHoveredBox] = useState<Box3 | null>(null)\n const [hoverMode, setHoverMode] = useState<'level' | 'node' | 'building' | null>(null)\n\n const raycasterRef = useRef(new Raycaster())\n const isDrag = useRef(false)\n const downPos = useRef({ x: 0, y: 0 })\n\n // Get building ID\n const buildingId = useEditor(\n useShallow((state: StoreState) => {\n const building = state.scene.root.children?.[0]?.children.find((c) => c.type === 'building')\n return building?.id\n }),\n )\n\n // Get all visible level IDs from the scene\n const levelIds = useEditor(\n useShallow((state: StoreState) => {\n const building = state.scene.root.children?.[0]?.children.find((c) => c.type === 'building')\n if (!building) return []\n return building.children\n .filter((c) => c.type === 'level' && c.visible !== false)\n .map((l) => l.id)\n }),\n )\n\n // Derive current FSM state from editor state\n const deriveState = useCallback((): ViewerState => {\n const state = useEditor.getState()\n const hasBuilding = buildingId && state.selectedNodeIds.includes(buildingId)\n const hasFloor = !!state.selectedFloorId\n const hasZone = !!state.selectedZoneId\n const hasNodes =\n state.selectedNodeIds.length > 0 && !state.selectedNodeIds.includes(buildingId!)\n\n if (hasNodes) return 'node'\n if (hasZone) return 'zone'\n if (hasFloor) return 'level'\n if (hasBuilding) return 'building'\n return 'idle'\n }, [buildingId])\n\n // Check if we should skip level selection (only one visible level)\n const shouldSkipLevelSelection = levelIds.length === 1\n\n // Get the selected zone's polygon for boundary checking\n const selectedZonePolygon = useEditor(\n useShallow((state: StoreState) => {\n if (!state.selectedZoneId) return null\n const zone = (state.scene.zones || []).find((c) => c.id === state.selectedZoneId)\n return zone?.polygon || null\n }),\n )\n\n // Initialize viewer state on mount\n useEffect(() => {\n useEditor.setState({\n selectedFloorId: null,\n selectedZoneId: null,\n selectedNodeIds: [],\n viewMode: 'full',\n levelMode: 'stacked',\n })\n }, [])\n\n // --- State Transition Functions ---\n\n const transitionToIdle = useCallback(() => {\n emitter.emit('interaction:click', { type: 'void', id: null })\n setHoveredBox(null)\n setHoverMode(null)\n useEditor.setState({\n selectedNodeIds: [],\n selectedZoneId: null,\n selectedFloorId: null,\n levelMode: 'stacked',\n viewMode: 'full',\n })\n }, [])\n\n const transitionToBuilding = useCallback(() => {\n if (!buildingId) return\n emitter.emit('interaction:click', { type: 'building', id: buildingId })\n setHoveredBox(null)\n setHoverMode(null)\n useEditor.setState({\n selectedNodeIds: [buildingId],\n selectedZoneId: null,\n selectedFloorId: null,\n levelMode: 'exploded',\n viewMode: 'full',\n })\n }, [buildingId])\n\n const transitionToLevel = useCallback(\n (levelId: string) => {\n if (!buildingId) return\n emitter.emit('interaction:click', { type: 'level', id: levelId })\n setHoveredBox(null)\n setHoverMode(null)\n useEditor.setState({\n selectedNodeIds: [buildingId],\n selectedZoneId: null,\n selectedFloorId: levelId,\n })\n },\n [buildingId],\n )\n\n const transitionToZone = useCallback((zoneId: string, zone: Zone) => {\n emitter.emit('interaction:click', { type: 'zone', id: zoneId, data: zone })\n setHoveredBox(null)\n setHoverMode(null)\n useEditor.getState().selectZone(zoneId)\n }, [])\n\n const transitionToNode = useCallback((nodeId: string, keepZone: boolean) => {\n const nodeData = useEditor\n .getState()\n .graph.getNodeById(nodeId as any)\n ?.data()\n emitter.emit('interaction:click', { type: 'node', id: nodeId, data: nodeData })\n setHoveredBox(null)\n setHoverMode(null)\n useEditor.setState({\n selectedZoneId: keepZone ? useEditor.getState().selectedZoneId : null,\n selectedNodeIds: [nodeId],\n })\n }, [])\n\n // Go back one step in the hierarchy, respecting single-level skip\n const goBack = useCallback(() => {\n const currentState = deriveState()\n\n switch (currentState) {\n case 'node':\n // Node -> Zone (clear node selection, keep zone)\n // If no zone was selected and single level, go back to building\n if (useEditor.getState().selectedZoneId) {\n useEditor.setState({ selectedNodeIds: [] })\n } else if (shouldSkipLevelSelection) {\n transitionToBuilding()\n } else {\n useEditor.setState({ selectedNodeIds: [] })\n }\n break\n\n case 'zone':\n // Zone -> Level (to select other zones)\n useEditor.setState({ selectedZoneId: null })\n break\n\n case 'level':\n // Level -> Building, or Idle if single level (skip building)\n if (shouldSkipLevelSelection) {\n transitionToIdle()\n } else {\n transitionToBuilding()\n }\n break\n\n case 'building':\n // Building -> Idle\n transitionToIdle()\n break\n }\n }, [deriveState, shouldSkipLevelSelection, transitionToBuilding, transitionToIdle])\n\n // --- Helper Functions ---\n\n const findRoomForPoint = (x: number, z: number, zones: Zone[]): Zone | null => {\n for (const zone of zones) {\n if (isPointInPolygon(x, z, zone.polygon)) {\n return zone\n }\n }\n return null\n }\n\n const isPointInPolygon = (x: number, z: number, polygon: [number, number][]): boolean => {\n if (!polygon || polygon.length < 3) return false\n let inside = false\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const xi = polygon[i][0],\n zi = polygon[i][1]\n const xj = polygon[j][0],\n zj = polygon[j][1]\n if (zi > z !== zj > z && x < ((xj - xi) * (z - zi)) / (zj - zi) + xi) {\n inside = !inside\n }\n }\n return inside\n }\n\n const isWorldPointInSelectedPolygon = (worldX: number, worldZ: number): boolean => {\n if (!selectedZonePolygon || selectedZonePolygon.length < 3) return true\n const localX = worldX + GRID_SIZE / 2\n const localZ = worldZ + GRID_SIZE / 2\n const gridX = localX / TILE_SIZE\n const gridZ = localZ / TILE_SIZE\n return isPointInPolygon(gridX, gridZ, selectedZonePolygon)\n }\n\n const calculateBoundsExcludingImages = (object: Object3D): Box3 | null => {\n const box = new Box3()\n const graph = useEditor.getState().graph\n let hasContent = false\n\n object.updateWorldMatrix(true, true)\n\n object.traverse((child) => {\n if (child instanceof Mesh && child.geometry) {\n if (child.name === '__infinite_grid__' || child.name === '__proximity_grid__') {\n return\n }\n\n let current: Object3D | null = child\n let isImage = false\n while (current && current !== object) {\n if (current.userData?.nodeId) {\n const node = graph.getNodeById(current.userData.nodeId as any)?.data()\n if (node?.type === 'reference-image') {\n isImage = true\n break\n }\n }\n current = current.parent\n }\n\n if (isImage) return\n\n const childBox = new Box3().setFromObject(child)\n if (!childBox.isEmpty()) {\n box.union(childBox)\n hasContent = true\n }\n }\n })\n\n return hasContent ? box : null\n }\n\n // Ground plane for raycasting (y = 0)\n const groundPlane = useMemo(() => new Plane(new Vector3(0, 1, 0), 0), [])\n\n // Check if ray intersects the ground within a bounding box (XZ projection)\n const rayIntersectsGroundInBox = (raycaster: Raycaster, box: Box3): boolean => {\n const intersection = new Vector3()\n const hit = raycaster.ray.intersectPlane(groundPlane, intersection)\n if (!hit) return false\n\n // Check if the intersection point is within the box's XZ bounds\n return (\n intersection.x >= box.min.x &&\n intersection.x <= box.max.x &&\n intersection.z >= box.min.z &&\n intersection.z <= box.max.z\n )\n }\n\n const getNodeIdFromIntersection = (object: Object3D): string | null => {\n let current: Object3D | null = object\n while (current) {\n if (current.userData?.nodeId) {\n return current.userData.nodeId\n }\n current = current.parent\n }\n return null\n }\n\n const isBackgroundElement = (nodeId: string): boolean =>\n nodeId.startsWith('level_') || nodeId.startsWith('ceiling_') || nodeId.startsWith('slab_')\n\n // --- Event Handlers ---\n\n useEffect(() => {\n const canvas = gl.domElement\n\n const onPointerDown = (event: PointerEvent) => {\n isDrag.current = false\n downPos.current = { x: event.clientX, y: event.clientY }\n }\n\n const onPointerMove = (event: PointerEvent) => {\n const currentState = deriveState()\n const state = useEditor.getState()\n\n const rect = canvas.getBoundingClientRect()\n const x = ((event.clientX - rect.left) / rect.width) * 2 - 1\n const y = -((event.clientY - rect.top) / rect.height) * 2 + 1\n\n raycasterRef.current.setFromCamera(new Vector2(x, y), camera)\n\n // Hover logic based on current state\n switch (currentState) {\n case 'idle': {\n // Can only hover building (including ground within building bounds)\n if (buildingId) {\n const buildingObject = scene.getObjectByName(buildingId)\n if (buildingObject) {\n const box = calculateBoundsExcludingImages(buildingObject)\n if (box && !box.isEmpty()) {\n // Check if hovering building meshes OR ground within building footprint\n const intersects = raycasterRef.current.intersectObject(buildingObject, true)\n if (intersects.length > 0 || rayIntersectsGroundInBox(raycasterRef.current, box)) {\n setHoveredBox(box)\n setHoverMode('building')\n return\n }\n }\n }\n }\n setHoveredBox(null)\n setHoverMode(null)\n break\n }\n\n case 'building': {\n // Can hover levels (including ground within level bounds)\n // Find the closest level by intersection distance\n let closestLevelId: string | null = null\n let closestLevelBox: Box3 | null = null\n let closestDistance = Number.POSITIVE_INFINITY\n\n for (const levelId of levelIds) {\n const levelObject = scene.getObjectByName(levelId)\n if (levelObject) {\n const box = calculateBoundsExcludingImages(levelObject)\n if (box && !box.isEmpty()) {\n const intersects = raycasterRef.current.intersectObject(levelObject, true)\n if (intersects.length > 0 && intersects[0].distance < closestDistance) {\n closestDistance = intersects[0].distance\n closestLevelId = levelId\n closestLevelBox = box\n } else if (\n closestDistance === Number.POSITIVE_INFINITY &&\n rayIntersectsGroundInBox(raycasterRef.current, box)\n ) {\n // Ground click within level bounds - only use if no mesh hit yet\n closestLevelId = levelId\n closestLevelBox = box\n }\n }\n }\n }\n\n if (closestLevelId && closestLevelBox) {\n setHoveredBox(closestLevelBox)\n setHoverMode('level')\n return\n }\n\n setHoveredBox(null)\n setHoverMode(null)\n break\n }\n\n case 'level': {\n // When a level is selected, don't allow hovering other levels\n // User must go back (Escape or click void) to switch levels\n setHoveredBox(null)\n setHoverMode(null)\n break\n }\n\n case 'zone':\n case 'node': {\n // Can hover nodes within zone\n const currentFloorId = state.selectedFloorId\n const currentZoneId = state.selectedZoneId\n if (!currentFloorId) break\n\n const levelObject = scene.getObjectByName(currentFloorId)\n if (!levelObject) break\n\n const intersects = raycasterRef.current.intersectObject(levelObject, true)\n if (intersects.length > 0) {\n for (const hit of intersects) {\n const nodeId = getNodeIdFromIntersection(hit.object)\n if (nodeId && !isBackgroundElement(nodeId)) {\n const graph = useEditor.getState().graph\n const node = graph.getNodeById(nodeId as any)?.data()\n if (node?.type === 'reference-image') continue\n\n if (currentZoneId && !isWorldPointInSelectedPolygon(hit.point.x, hit.point.z)) {\n continue\n }\n\n const nodeObject = scene.getObjectByName(nodeId)\n if (nodeObject) {\n const box = new Box3().setFromObject(nodeObject)\n if (!box.isEmpty()) {\n setHoveredBox(box)\n setHoverMode('node')\n return\n }\n }\n }\n }\n }\n\n setHoveredBox(null)\n setHoverMode(null)\n break\n }\n }\n }\n\n const onClick = (event: MouseEvent) => {\n if (event.button !== 0) return\n\n const dist = Math.hypot(event.clientX - downPos.current.x, event.clientY - downPos.current.y)\n if (dist > 5) return\n\n const currentState = deriveState()\n const state = useEditor.getState()\n const hasModifierKey = event.shiftKey || event.metaKey || event.ctrlKey\n\n const rect = canvas.getBoundingClientRect()\n const x = ((event.clientX - rect.left) / rect.width) * 2 - 1\n const y = -((event.clientY - rect.top) / rect.height) * 2 + 1\n\n raycasterRef.current.setFromCamera(new Vector2(x, y), camera)\n\n switch (currentState) {\n case 'idle': {\n // Click building (including ground within building bounds) -> transition to building\n if (buildingId) {\n const buildingObject = scene.getObjectByName(buildingId)\n if (buildingObject) {\n const box = calculateBoundsExcludingImages(buildingObject)\n if (box && !box.isEmpty()) {\n const intersects = raycasterRef.current.intersectObject(buildingObject, true)\n if (intersects.length > 0 || rayIntersectsGroundInBox(raycasterRef.current, box)) {\n transitionToBuilding()\n // Auto-select level if only one\n if (shouldSkipLevelSelection) {\n transitionToLevel(levelIds[0])\n }\n return\n }\n }\n }\n }\n break\n }\n\n case 'building': {\n // Click level (including ground within level bounds) -> transition to level\n let clickedLevelId: string | null = null\n let clickedLevelDistance = Number.POSITIVE_INFINITY\n\n for (const levelId of levelIds) {\n const levelObject = scene.getObjectByName(levelId)\n if (levelObject) {\n const box = calculateBoundsExcludingImages(levelObject)\n if (box && !box.isEmpty()) {\n const intersects = raycasterRef.current.intersectObject(levelObject, true)\n if (intersects.length > 0 && intersects[0].distance < clickedLevelDistance) {\n clickedLevelDistance = intersects[0].distance\n clickedLevelId = levelId\n } else if (\n clickedLevelDistance === Number.POSITIVE_INFINITY &&\n rayIntersectsGroundInBox(raycasterRef.current, box)\n ) {\n // Ground click within level bounds - use a large distance so mesh clicks take priority\n clickedLevelId = levelId\n }\n }\n }\n }\n\n if (clickedLevelId) {\n transitionToLevel(clickedLevelId)\n return\n }\n\n // Click void -> back to idle\n transitionToIdle()\n break\n }\n\n case 'level': {\n const currentFloorId = state.selectedFloorId\n if (!currentFloorId) break\n\n const levelObject = scene.getObjectByName(currentFloorId)\n\n // Check if clicked on a zone within the current level\n if (levelObject) {\n const intersects = raycasterRef.current.intersectObject(levelObject, true)\n if (intersects.length > 0) {\n const currentRoomZones = (state.scene.zones || []).filter(\n (c) => c.levelId === currentFloorId,\n )\n\n if (currentRoomZones.length > 0) {\n const hit = intersects[0]\n const room = findRoomForPoint(hit.point.x, hit.point.z, currentRoomZones)\n if (room) {\n transitionToZone(room.id, room)\n return\n }\n }\n }\n }\n\n // Click anywhere else -> go back (no level switching allowed)\n goBack()\n break\n }\n\n case 'zone': {\n const currentFloorId = state.selectedFloorId\n const currentZoneId = state.selectedZoneId\n if (!currentFloorId) break\n\n const levelObject = scene.getObjectByName(currentFloorId)\n if (!levelObject) break\n\n const intersects = raycasterRef.current.intersectObject(levelObject, true)\n\n if (intersects.length > 0) {\n // Check if clicked on a node within zone\n for (const hit of intersects) {\n const nodeId = getNodeIdFromIntersection(hit.object)\n if (nodeId && !isBackgroundElement(nodeId)) {\n const graph = useEditor.getState().graph\n const node = graph.getNodeById(nodeId as any)?.data()\n if (node?.type === 'reference-image') continue\n\n if (currentZoneId && !isWorldPointInSelectedPolygon(hit.point.x, hit.point.z)) {\n continue\n }\n\n if (hasModifierKey) {\n state.handleNodeSelect(nodeId, {\n shiftKey: event.shiftKey,\n metaKey: event.metaKey,\n ctrlKey: event.ctrlKey,\n })\n } else {\n transitionToNode(nodeId, true)\n }\n return\n }\n }\n\n // Check if clicked on a different zone\n const currentRoomZones = (state.scene.zones || []).filter(\n (c) => c.levelId === currentFloorId,\n )\n const hit = intersects[0]\n const room = findRoomForPoint(hit.point.x, hit.point.z, currentRoomZones)\n\n if (room) {\n if (room.id !== currentZoneId) {\n // Clicked different zone -> switch\n transitionToZone(room.id, room)\n }\n // Clicked same zone background -> stay\n return\n }\n }\n\n // Clicked outside all zones -> go back\n goBack()\n break\n }\n\n case 'node': {\n const currentFloorId = state.selectedFloorId\n const currentZoneId = state.selectedZoneId\n if (!currentFloorId) break\n\n const levelObject = scene.getObjectByName(currentFloorId)\n if (!levelObject) break\n\n const intersects = raycasterRef.current.intersectObject(levelObject, true)\n\n if (intersects.length > 0) {\n // Check if clicked on another node\n for (const hit of intersects) {\n const nodeId = getNodeIdFromIntersection(hit.object)\n if (nodeId && !isBackgroundElement(nodeId)) {\n const graph = useEditor.getState().graph\n const node = graph.getNodeById(nodeId as any)?.data()\n if (node?.type === 'reference-image') continue\n\n if (currentZoneId && !isWorldPointInSelectedPolygon(hit.point.x, hit.point.z)) {\n continue\n }\n\n if (hasModifierKey) {\n state.handleNodeSelect(nodeId, {\n shiftKey: event.shiftKey,\n metaKey: event.metaKey,\n ctrlKey: event.ctrlKey,\n })\n } else {\n transitionToNode(nodeId, true)\n }\n return\n }\n }\n\n // Check if clicked inside zone but not on node\n if (currentZoneId) {\n const hit = intersects[0]\n if (isWorldPointInSelectedPolygon(hit.point.x, hit.point.z)) {\n // Clicked zone background -> go back to zone\n useEditor.setState({ selectedNodeIds: [] })\n return\n }\n }\n }\n\n // Clicked outside zone -> go back\n goBack()\n break\n }\n }\n }\n\n const throttledOnPointerMove = throttle(onPointerMove, 16)\n\n canvas.addEventListener('pointerdown', onPointerDown)\n canvas.addEventListener('pointermove', throttledOnPointerMove)\n canvas.addEventListener('click', onClick)\n\n return () => {\n canvas.removeEventListener('pointerdown', onPointerDown)\n canvas.removeEventListener('pointermove', throttledOnPointerMove)\n canvas.removeEventListener('click', onClick)\n }\n }, [\n camera,\n gl,\n scene,\n levelIds,\n buildingId,\n deriveState,\n goBack,\n shouldSkipLevelSelection,\n transitionToBuilding,\n transitionToIdle,\n transitionToLevel,\n transitionToNode,\n transitionToZone,\n ])\n\n // Clear hover when relevant state changes\n const selectedFloorId = useEditor((state) => state.selectedFloorId)\n const selectedZoneId = useEditor((state) => state.selectedZoneId)\n\n useEffect(() => {\n setHoveredBox(null)\n setHoverMode(null)\n // eslint-disable-next-line react-hooks/exhaustive-deps -- intentionally trigger on state changes\n }, [selectedFloorId, selectedZoneId])\n\n if (!(hoveredBox && hoverMode)) return null\n\n const colorMap = {\n level: '#3b82f6',\n node: '#22c55e',\n building: '#ffffff',\n }\n const color = colorMap[hoverMode]\n\n return <HighlightBox box={hoveredBox} color={color} />\n}\n\nfunction throttle<T extends (...args: any[]) => any>(\n fn: T,\n delay: number,\n): (...args: Parameters<T>) => void {\n let lastCall = 0\n\n return (...args: Parameters<T>) => {\n const now = Date.now()\n\n if (now - lastCall >= delay) {\n lastCall = now\n fn(...args)\n }\n }\n}\n","'use client'\n\nimport { useEffect, useMemo, useRef } from 'react'\nimport * as THREE from 'three'\nimport { Box3, Vector3 } from 'three'\nimport { useThree } from '@react-three/fiber'\nimport { CameraControls, CameraControlsImpl } from '@react-three/drei'\nimport { useShallow } from 'zustand/react/shallow'\nimport { emitter, type ViewApplyEvent } from '@pascal/core/events'\nimport { useEditor, type StoreState } from '@pascal/core/hooks'\nimport { FLOOR_SPACING, GRID_SIZE, TILE_SIZE } from '@pascal/core/constants'\n\n// Viewer zoom configuration\nexport const WALL_HEIGHT = 2.5 // 2.5m standard wall height\nexport const VIEWER_DEFAULT_ZOOM = 80 // Orthographic camera zoom level\nexport const VIEWER_INITIAL_CAMERA_DISTANCE = 30 // Initial camera distance from origin\nexport const VIEWER_DESELECTED_CAMERA_DISTANCE = 6 // Camera distance when no floor is selected\n\n/**\n * Calculate bounds for an object, computing XZ center at local origin (Y=0)\n * This avoids issues with animated Y positions in exploded view\n */\nfunction calculateLocalBoundsCenter(object: THREE.Object3D): { x: number; z: number } | null {\n const box = new Box3()\n let hasContent = false\n\n object.traverse((child) => {\n if (child instanceof THREE.Mesh && child.geometry) {\n // Skip grids and other background elements\n if (child.name === '__infinite_grid__' || child.name === '__proximity_grid__') {\n return\n }\n\n // Get geometry bounds\n if (!child.geometry.boundingBox) {\n child.geometry.computeBoundingBox()\n }\n\n if (child.geometry.boundingBox) {\n const childBox = child.geometry.boundingBox.clone()\n\n // Transform by the mesh's world matrix, but we'll extract XZ only\n child.updateWorldMatrix(true, false)\n childBox.applyMatrix4(child.matrixWorld)\n\n // Only expand XZ, ignore Y for centering\n box.min.x = Math.min(box.min.x, childBox.min.x)\n box.max.x = Math.max(box.max.x, childBox.max.x)\n box.min.z = Math.min(box.min.z, childBox.min.z)\n box.max.z = Math.max(box.max.z, childBox.max.z)\n hasContent = true\n }\n }\n })\n\n if (!hasContent || box.isEmpty()) return null\n\n return {\n x: (box.min.x + box.max.x) / 2,\n z: (box.min.z + box.max.z) / 2,\n }\n}\n\n/**\n * Derive FSM state from editor state (matches LevelHoverManager logic)\n */\nfunction deriveViewerState(\n buildingId: string | undefined,\n selectedNodeIds: string[],\n selectedFloorId: string | null,\n selectedZoneId: string | null,\n): 'idle' | 'building' | 'level' | 'zone' | 'node' {\n const hasBuilding = buildingId && selectedNodeIds.includes(buildingId)\n const hasFloor = !!selectedFloorId\n const hasZone = !!selectedZoneId\n const hasNodes = selectedNodeIds.length > 0 && !selectedNodeIds.includes(buildingId!)\n\n if (hasNodes) return 'node'\n if (hasZone) return 'zone'\n if (hasFloor) return 'level'\n if (hasBuilding) return 'building'\n return 'idle'\n}\n\nexport function ViewerCustomControls() {\n const cameraMode = useEditor((state) => state.cameraMode)\n const setMovingCamera = useEditor((state) => state.setMovingCamera)\n const controls = useThree((state) => state.controls)\n const { scene } = useThree()\n const controlsRef = useRef<CameraControlsImpl>(null)\n const currentLevel = useEditor((state) => state.currentLevel)\n const selectedFloorId = useEditor((state) => state.selectedFloorId)\n const levelMode = useEditor((state) => state.levelMode)\n const selectedZoneId = useEditor((state) => state.selectedZoneId)\n const selectedCollectionId = useEditor((state) => state.selectedCollectionId)\n const selectedNodeIds = useEditor((state) => state.selectedNodeIds)\n\n // Get building ID for camera focus when no level is selected\n const buildingId = useEditor(\n (state) => state.scene.root.children?.[0]?.children.find((c) => c.type === 'building')?.id,\n )\n\n // Derive current FSM state\n const viewerState = useMemo(\n () => deriveViewerState(buildingId, selectedNodeIds, selectedFloorId, selectedZoneId),\n [buildingId, selectedNodeIds, selectedFloorId, selectedZoneId],\n )\n\n // Get site node to check for camera preference\n const site = useEditor(useShallow((state) => state.scene.root.children?.[0]))\n\n // Get all zones from the store\n const allZones = useEditor(useShallow((state: StoreState) => state.scene.zones || []))\n\n // Get the selected collection's nodeIds for bounds calculation\n const collectionNodeIds = useEditor(\n useShallow((state: StoreState) => {\n if (!state.selectedCollectionId) return null\n const collection = state.scene.collections?.find((c) => c.id === state.selectedCollectionId)\n return collection?.nodeIds || null\n }),\n )\n\n // Get the selected zone's data for bounds calculation\n const selectedZoneData = useMemo(() => {\n if (!selectedZoneId) return null\n const zone = allZones.find((c) => c.id === selectedZoneId)\n if (!zone) return null\n return { polygon: zone.polygon, levelId: zone.levelId }\n }, [selectedZoneId, allZones])\n\n // Get building levels for Y offset calculation\n const buildingLevels = useEditor((state) => {\n const site = state.scene.root.children?.[0]\n const building = site?.children?.find((c) => c.type === 'building')\n return building?.children ?? []\n })\n\n // Memoize level data to avoid recalculating on every render\n const levelData = useMemo(() => {\n const data: Record<string, { level: number; elevation: number }> = {}\n for (const lvl of buildingLevels) {\n if (lvl.type === 'level') {\n data[lvl.id] = {\n level: (lvl as any).level ?? 0,\n elevation: (lvl as any).elevation ?? 0,\n }\n }\n }\n return data\n }, [buildingLevels])\n\n useEffect(() => {\n if (!controls) return\n\n const d = VIEWER_INITIAL_CAMERA_DISTANCE\n ;(controls as CameraControlsImpl).setLookAt(d, d, d, 0, 0, 0, false)\n }, [controls])\n\n // Handle View Events\n useEffect(() => {\n const handleApply = ({ camera }: ViewApplyEvent) => {\n if (!controlsRef.current) return\n const { position, target, mode } = camera\n\n // Switch mode if needed\n if (useEditor.getState().cameraMode !== mode) {\n useEditor.getState().setCameraMode(mode)\n }\n\n // Set camera\n controlsRef.current.setLookAt(\n position[0],\n position[1],\n position[2],\n target[0],\n target[1],\n target[2],\n true, // enable transition\n )\n }\n\n emitter.on('view:apply', handleApply)\n\n return () => {\n emitter.off('view:apply', handleApply)\n }\n }, [])\n\n // Focus on building in idle state (initial load) or building state (after clicking building)\n useEffect(() => {\n if (!(controls && scene && buildingId)) return\n // Only run for idle or building states\n if (viewerState !== 'idle' && viewerState !== 'building') return\n\n const cameraImpl = controls as CameraControlsImpl\n\n // If site has camera settings and we're in idle state, prioritize them for initial load\n if (viewerState === 'idle' && site?.camera) {\n const { position, target, mode } = site.camera\n\n // Switch mode if needed\n if (useEditor.getState().cameraMode !== mode) {\n useEditor.getState().setCameraMode(mode)\n }\n\n cameraImpl.setLookAt(\n position[0],\n position[1],\n position[2],\n target[0],\n target[1],\n target[2],\n false, // disable transition for initial load\n )\n cameraImpl.setBoundary() // Remove boundaries\n return\n }\n\n // Use a polling mechanism to ensure Three.js scene has updated with the building object\n let isMounted = true\n let timeoutId: ReturnType<typeof setTimeout>\n\n const checkBuilding = (retries = 0) => {\n if (!isMounted) return\n\n // Find the building object and calculate its bounds\n const buildingObject = scene.getObjectByName(buildingId)\n\n if (!buildingObject) {\n if (retries < 20) {\n // Retry for ~2 seconds (20 * 100ms)\n timeoutId = setTimeout(() => checkBuilding(retries + 1), 100)\n } else {\n // Give up and use default camera position\n const d = VIEWER_INITIAL_CAMERA_DISTANCE\n cameraImpl.setLookAt(d, d, d, 0, 0, 0, viewerState === 'building')\n cameraImpl.setBoundary()\n }\n return\n }\n\n // Calculate precise XZ center using local bounds\n const center = calculateLocalBoundsCenter(buildingObject)\n if (!center) {\n const d = VIEWER_INITIAL_CAMERA_DISTANCE\n cameraImpl.setLookAt(d, d, d, 0, 0, 0, viewerState === 'building')\n cameraImpl.setBoundary()\n return\n }\n\n // Calculate Y center from bounding box (this is less affected by animation)\n const buildingBox = new Box3().setFromObject(buildingObject)\n const boxCenter = buildingBox.getCenter(new Vector3())\n const size = buildingBox.getSize(new Vector3())\n\n // For building state (exploded view), adjust center Y to account for spread floors\n const adjustedCenterY = viewerState === 'building'\n ? boxCenter.y + (size.y * 0.3) // Shift focus slightly up to see exploded floors better\n : boxCenter.y\n\n // Use fixed default distance for consistent behavior\n const newDistance = VIEWER_INITIAL_CAMERA_DISTANCE\n\n // Position camera at 45-degree angle looking at building center (using precise XZ)\n cameraImpl.setLookAt(\n center.x + newDistance,\n adjustedCenterY + newDistance,\n center.z + newDistance,\n center.x,\n adjustedCenterY,\n center.z,\n viewerState === 'building', // animate transition when entering building state\n )\n cameraImpl.setBoundary() // Remove boundaries for free viewing\n }\n\n checkBuilding()\n\n return () => {\n isMounted = false\n clearTimeout(timeoutId)\n }\n }, [controls, scene, viewerState, buildingId, site])\n\n // Focus on level when in level state\n useEffect(() => {\n if (!(controls && scene && selectedFloorId)) return\n // Only run for level state (not zone, not node)\n if (viewerState !== 'level') return\n\n const cameraImpl = controls as CameraControlsImpl\n\n // Calculate floor Y position accounting for exploded mode\n const lvlData = levelData[selectedFloorId]\n const levelOffset = levelMode === 'exploded' ? (lvlData?.level ?? 0) * FLOOR_SPACING : 0\n const floorY = (lvlData?.elevation ?? 0) + levelOffset\n\n // Check if there's a view saved for this level\n const views = useEditor.getState().scene.views || []\n const levelView = views.find((v) => v.sceneState?.selectedLevelId === selectedFloorId)\n\n // Check if the level node has specific camera settings\n const levelNodeHandle = scene.getObjectByName(selectedFloorId)\n ? useEditor.getState().graph.getNodeById(selectedFloorId as any)\n : null\n const levelCamera = levelNodeHandle?.data()?.camera\n\n if (levelCamera) {\n const { position, target, mode } = levelCamera\n\n // Switch camera mode if needed\n if (useEditor.getState().cameraMode !== mode) {\n useEditor.getState().setCameraMode(mode)\n }\n\n cameraImpl.setLookAt(\n position[0],\n position[1],\n position[2],\n target[0],\n target[1],\n target[2],\n true,\n )\n } else if (levelView) {\n // Apply the saved view's camera position\n const { position, target, mode } = levelView.camera\n\n // Switch camera mode if needed\n if (useEditor.getState().cameraMode !== mode) {\n useEditor.getState().setCameraMode(mode)\n }\n\n cameraImpl.setLookAt(\n position[0],\n position[1],\n position[2],\n target[0],\n target[1],\n target[2],\n true,\n )\n } else {\n // No saved view - use default camera positioning\n // Find the level object to get its center (XZ only, Y is calculated separately)\n const levelObject = scene.getObjectByName(selectedFloorId)\n\n // Default target is origin at floor height\n let targetX = 0\n let targetZ = 0\n\n if (levelObject) {\n // Use precise XZ center calculation that ignores animated Y position\n const center = calculateLocalBoundsCenter(levelObject)\n if (center) {\n targetX = center.x\n targetZ = center.z\n }\n }\n\n // Use same camera distance as initial setup (VIEWER_INITIAL_CAMERA_DISTANCE)\n // Position camera at 45-degree angle, similar to building overview\n const d = VIEWER_INITIAL_CAMERA_DISTANCE\n cameraImpl.setLookAt(targetX + d, floorY + d, targetZ + d, targetX, floorY, targetZ, true)\n }\n\n // Set boundary for the floor\n const boundaryBox = new Box3(\n new Vector3(-GRID_SIZE / 2, floorY - 25, -GRID_SIZE / 2),\n new Vector3(GRID_SIZE / 2, floorY + 25, GRID_SIZE / 2),\n )\n cameraImpl.setBoundary(boundaryBox)\n }, [controls, scene, viewerState, selectedFloorId, levelMode, levelData])\n\n // Focus camera on zone bounds when in zone state\n useEffect(() => {\n if (!(controls && scene && selectedZoneId && selectedZoneData?.polygon?.length)) return\n // Only run for zone state (not node state which may have a zone selected too)\n if (viewerState !== 'zone') return\n\n const cameraImpl = controls as CameraControlsImpl\n const { polygon, levelId } = selectedZoneData\n\n // Check if there's a view saved for this zone\n const views = useEditor.getState().scene.views || []\n const zoneView = views.find((v) =>\n v.sceneState?.visibleZoneIds?.includes(selectedZoneId),\n )\n\n if (zoneView) {\n // Apply the saved view's camera position\n const { position, target, mode } = zoneView.camera\n\n // Switch camera mode if needed\n if (useEditor.getState().cameraMode !== mode) {\n useEditor.getState().setCameraMode(mode)\n }\n\n cameraImpl.setLookAt(\n position[0],\n position[1],\n position[2],\n target[0],\n target[1],\n target[2],\n true,\n )\n return\n }\n\n // No saved view - use default camera positioning based on zone polygon bounds\n // Calculate bounds from polygon points (convert grid coords to world coords)\n let minX = Number.POSITIVE_INFINITY, maxX = Number.NEGATIVE_INFINITY\n let minZ = Number.POSITIVE_INFINITY, maxZ = Number.NEGATIVE_INFINITY\n\n for (const [x, z] of polygon) {\n // Convert grid coords to world coords (grid * TILE_SIZE - GRID_SIZE/2)\n const worldX = x * TILE_SIZE - GRID_SIZE / 2\n const worldZ = z * TILE_SIZE - GRID_SIZE / 2\n minX = Math.min(minX, worldX)\n maxX = Math.max(maxX, worldX)\n minZ = Math.min(minZ, worldZ)\n maxZ = Math.max(maxZ, worldZ)\n }\n\n // Get bounds center and size (already in world coords)\n const centerX = (minX + maxX) / 2\n const centerZ = (minZ + maxZ) / 2\n const sizeX = maxX - minX\n const sizeZ = maxZ - minZ\n\n // Calculate the optimal camera distance based on the bounds size\n const maxDimension = Math.max(sizeX, sizeZ)\n const padding = 2 // Add some padding around the room\n const targetDistance = (maxDimension + padding) * 0.8\n\n // Move camera to look at the center of the zone\n const currentPosition = new Vector3()\n cameraImpl.getPosition(currentPosition)\n\n // Calculate Y offset using level data (matches node-renderer logic)\n const lvlData = levelData[levelId]\n const levelOffset = levelMode === 'exploded' ? (lvlData?.level ?? 0) * FLOOR_SPACING : 0\n const floorY = (lvlData?.elevation ?? 0) + levelOffset\n const center = new Vector3(centerX, floorY, centerZ)\n\n // Calculate new camera position maintaining the same angle\n const direction = currentPosition.clone().sub(center).normalize()\n const newDistance = Math.max(targetDistance, 8) // Minimum distance of 8\n const newPosition = center.clone().add(direction.multiplyScalar(newDistance))\n\n // Smoothly transition camera to focus on zone\n cameraImpl.setLookAt(\n newPosition.x,\n Math.max(newPosition.y, floorY + 5),\n newPosition.z,\n center.x,\n floorY,\n center.z,\n true,\n )\n }, [controls, scene, viewerState, selectedZoneId, selectedZoneData, levelData, levelMode])\n\n // Focus camera on collection bounds when a collection is selected\n useEffect(() => {\n if (!(controls && scene && selectedCollectionId && collectionNodeIds?.length)) return\n\n const cameraImpl = controls as CameraControlsImpl\n\n // Check if there's a view saved for this collection\n const views = useEditor.getState().scene.views || []\n const collectionView = views.find((v) =>\n v.sceneState?.visibleCollectionIds?.includes(selectedCollectionId),\n )\n\n if (collectionView) {\n // Apply the saved view's camera position\n const { position, target, mode } = collectionView.camera\n\n // Switch camera mode if needed\n if (useEditor.getState().cameraMode !== mode) {\n useEditor.getState().setCameraMode(mode)\n }\n\n cameraImpl.setLookAt(\n position[0],\n position[1],\n position[2],\n target[0],\n target[1],\n target[2],\n true,\n )\n return\n }\n\n // No saved view - use default camera positioning based on collection bounds\n // Calculate the combined bounding box of all nodes in the collection\n const combinedBox = new Box3()\n\n for (const nodeId of collectionNodeIds) {\n const object = scene.getObjectByName(nodeId)\n if (object) {\n const objectBox = new Box3().setFromObject(object)\n combinedBox.union(objectBox)\n }\n }\n\n if (combinedBox.isEmpty()) return\n\n // Get bounds center and size\n const center = combinedBox.getCenter(new Vector3())\n const size = combinedBox.getSize(new Vector3())\n\n // Calculate the optimal camera distance based on the bounds size\n const maxDimension = Math.max(size.x, size.z)\n const padding = 2 // Add some padding around the room\n const targetDistance = (maxDimension + padding) * 0.8\n\n // Move camera to look at the center of the collection\n const currentPosition = new Vector3()\n cameraImpl.getPosition(currentPosition)\n\n // Calculate new camera position maintaining the same angle\n const direction = currentPosition.clone().sub(center).normalize()\n const newDistance = Math.max(targetDistance, 8) // Minimum distance of 8\n const newPosition = center.clone().add(direction.multiplyScalar(newDistance))\n\n // Set floor Y based on current level\n const floorY = (levelMode === 'exploded' ? FLOOR_SPACING : WALL_HEIGHT) * currentLevel\n\n // Smoothly transition camera to focus on collection\n cameraImpl.setLookAt(\n newPosition.x,\n Math.max(newPosition.y, floorY + 5),\n newPosition.z,\n center.x,\n floorY,\n center.z,\n true,\n )\n }, [controls, scene, selectedCollectionId, collectionNodeIds, currentLevel, levelMode])\n\n // Focus on node camera when in node state\n useEffect(() => {\n if (!(controls && scene && selectedNodeIds.length === 1)) return\n // Only run when in node state\n if (viewerState !== 'node') return\n\n const nodeId = selectedNodeIds[0]\n // Skip if the selected node is the building (that's handled by building state)\n if (nodeId === buildingId) return\n\n // Access node via graph directly\n const handle = useEditor.getState().graph.getNodeById(nodeId as any)\n const node = handle?.data()\n\n if (node?.camera) {\n const { position, target, mode } = node.camera\n\n // Switch mode if needed\n if (useEditor.getState().cameraMode !== mode) {\n useEditor.getState().setCameraMode(mode)\n }\n\n // Apply camera\n const cameraImpl = controls as CameraControlsImpl\n cameraImpl.setLookAt(\n position[0],\n position[1],\n position[2],\n target[0],\n target[1],\n target[2],\n true, // enable transition\n )\n } else {\n // No saved camera for node - focus on node bounds\n const nodeObject = scene.getObjectByName(nodeId)\n if (nodeObject) {\n const cameraImpl = controls as CameraControlsImpl\n const nodeBox = new Box3().setFromObject(nodeObject)\n\n if (!nodeBox.isEmpty()) {\n const center = nodeBox.getCenter(new Vector3())\n const size = nodeBox.getSize(new Vector3())\n\n // Calculate optimal distance based on node size\n const maxDimension = Math.max(size.x, size.y, size.z)\n const targetDistance = Math.max(maxDimension * 1.5, 8)\n\n // Get current camera position to maintain angle\n const currentPosition = new Vector3()\n cameraImpl.getPosition(currentPosition)\n\n const direction = currentPosition.clone().sub(center).normalize()\n const newPosition = center.clone().add(direction.multiplyScalar(targetDistance))\n\n cameraImpl.setLookAt(\n newPosition.x,\n Math.max(newPosition.y, center.y + 3),\n newPosition.z,\n center.x,\n center.y,\n center.z,\n true,\n )\n }\n }\n }\n }, [controls, scene, viewerState, selectedNodeIds, buildingId])\n\n // Configure mouse buttons for viewer mode - always allow panning with left click\n const mouseButtons = useMemo(() => {\n // Use ZOOM for orthographic camera, DOLLY for perspective camera\n const wheelAction =\n cameraMode === 'orthographic'\n ? CameraControlsImpl.ACTION.ZOOM\n : CameraControlsImpl.ACTION.DOLLY\n\n return {\n left: CameraControlsImpl.ACTION.SCREEN_PAN,\n middle: CameraControlsImpl.ACTION.SCREEN_PAN,\n right: CameraControlsImpl.ACTION.ROTATE,\n wheel: wheelAction,\n }\n }, [cameraMode])\n\n // Restrict pitch to a reduced range suitable for architectural viewing\n // minPolarAngle: 15 degrees from top (prevents top-down view)\n // maxPolarAngle: 75 degrees from top (prevents looking below horizon)\n const minPolarAngle = Math.PI / 12 // ~15 degrees\n const maxPolarAngle = (5 * Math.PI) / 12 // ~75 degrees\n\n return (\n <CameraControls\n makeDefault\n maxDistance={200}\n maxPolarAngle={maxPolarAngle}\n minDistance={10}\n minPolarAngle={minPolarAngle}\n mouseButtons={mouseButtons}\n onEnd={() => setMovingCamera(false)}\n onStart={() => setMovingCamera(true)}\n ref={controlsRef}\n />\n )\n}\n","'use client'\n\nimport { useCallback, useEffect } from 'react'\nimport { Canvas } from '@react-three/fiber'\nimport { Bvh, OrthographicCamera, PerspectiveCamera, SoftShadows } from '@react-three/drei'\nimport { animated, useSpring } from '@react-spring/three'\nimport { emitter, type InteractionClickEvent } from '@pascal/core/events'\nimport { useEditor, type WallMode } from '@pascal/core/hooks'\nimport { EnvironmentRenderer, ZoneRenderer } from '@pascal/core/components/nodes'\nimport { NodeRenderer } from '@pascal/core/components/renderer'\nimport { InfiniteFloor } from '@pascal/core/components/viewer'\nimport { GRID_SIZE } from '@pascal/core/constants'\nimport { cn } from '../utils'\nimport { SelectionControls } from './selection-controls'\nimport { LevelHoverManager } from './level-hover-manager'\nimport { ViewerCustomControls, VIEWER_DEFAULT_ZOOM } from './viewer-custom-controls'\n\n/**\n * Lightweight subcomponent that handles selection state and iframe messaging.\n * Isolates re-renders caused by selection changes from the main Viewer tree.\n */\nfunction SelectionMessageBridge({ isEmbedded }: { isEmbedded: boolean }) {\n const selectedFloorId = useEditor((state) => state.selectedFloorId)\n const selectedNodeIds = useEditor((state) => state.selectedNodeIds)\n const selectedZoneId = useEditor((state) => state.selectedZoneId)\n\n // Notify parent window about selection changes (for embedded mode)\n useEffect(() => {\n if (!isEmbedded) return\n\n const state = useEditor.getState()\n const graph = state.graph\n\n // Enrich selected nodes with data\n const selectedNodes = selectedNodeIds.map((id) => {\n const node = graph.getNodeById(id as any)?.data()\n return node ? { id: node.id, type: node.type, name: node.name, data: node } : { id }\n })\n\n const message = {\n type: 'selection',\n selectedNodeIds,\n selectedNodes,\n selectedFloorId,\n selectedZoneId,\n }\n window.parent.postMessage(message, '*')\n }, [isEmbedded, selectedNodeIds, selectedFloorId, selectedZoneId])\n\n // Notify parent window about interaction clicks\n useEffect(() => {\n if (!isEmbedded) return\n\n const handleClick = (event: InteractionClickEvent) => {\n window.parent.postMessage(\n {\n type: 'click',\n interactionType: event.type,\n id: event.id,\n data: event.data,\n },\n '*',\n )\n }\n\n emitter.on('interaction:click', handleClick)\n return () => {\n emitter.off('interaction:click', handleClick)\n }\n }, [isEmbedded])\n\n // This component renders nothing - it only handles side effects\n return null\n}\n\nexport interface ViewerProps {\n className?: string\n /** Initial zoom level for orthographic camera (default: 80) */\n defaultZoom?: number\n /** When true, posts selection changes to parent window for iframe embedding */\n isEmbedded?: boolean\n /** Initial wall mode for viewer */\n defaultWallMode?: WallMode\n}\n\nexport default function Viewer({\n className,\n defaultZoom = VIEWER_DEFAULT_ZOOM,\n isEmbedded = false,\n defaultWallMode = 'cutaway',\n}: ViewerProps) {\n // Use individual selectors for better performance\n const building = useEditor((state) =>\n state.scene.root.children?.[0]?.children.find((c) => c.type === 'building'),\n )\n const site = useEditor((state) => state.scene.root.children?.[0])\n\n const cameraMode = useEditor((state) => state.cameraMode)\n const setCameraMode = useEditor((state) => state.setCameraMode)\n const toggleLevelMode = useEditor((state) => state.toggleLevelMode)\n const selectFloor = useEditor((state) => state.selectFloor)\n const selectZone = useEditor((state) => state.selectZone)\n\n // Reset state on mount to ensure clean start (stacked, no selection)\n useEffect(() => {\n useEditor.setState({\n selectedNodeIds: [],\n selectedFloorId: null,\n selectedZoneId: null,\n levelMode: 'stacked',\n viewMode: 'full',\n wallMode: defaultWallMode,\n })\n }, [])\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Don't handle shortcuts if user is typing in an input\n if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) {\n return\n }\n\n if (e.key === 'c' && !e.metaKey && !e.ctrlKey) {\n e.preventDefault()\n setCameraMode(cameraMode === 'perspective' ? 'orthographic' : 'perspective')\n } else if (e.key === 'l' && !e.metaKey && !e.ctrlKey) {\n e.preventDefault()\n toggleLevelMode()\n } else if (e.key === 'Escape') {\n e.preventDefault()\n e.stopPropagation()\n const state = useEditor.getState()\n\n // Progressive unselection:\n // 1. If nodes selected (including Building) -> Deselect all, go to Stacked\n if (state.selectedNodeIds.length > 0) {\n // If Building is selected, go to Site\n if (\n building &&\n site &&\n state.selectedNodeIds.length === 1 &&\n state.selectedNodeIds[0] === building.id\n ) {\n useEditor.setState({\n selectedNodeIds: [site.id],\n selectedFloorId: null,\n viewMode: 'full',\n })\n return\n }\n\n // If Site is ALREADY selected, prevent deselection (keep as root default)\n if (site && state.selectedNodeIds.length === 1 && state.selectedNodeIds[0] === site.id) {\n return\n }\n\n useEditor.setState({\n selectedNodeIds: [],\n })\n return\n }\n\n // 2. If Zone selected -> Back to Floor\n if (state.selectedZoneId) {\n selectZone(null)\n return\n }\n\n // 3. If Floor selected -> Back to Building (Exploded)\n if (state.selectedFloorId) {\n if (building) {\n useEditor.setState({\n selectedFloorId: null,\n selectedNodeIds: [building.id],\n viewMode: 'full',\n // Keep levelMode as is (likely exploded)\n })\n } else {\n selectFloor(null)\n }\n return\n }\n }\n }\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [cameraMode, setCameraMode, toggleLevelMode, selectFloor, selectZone, building, site])\n\n const onContextMenu = useCallback((e: React.MouseEvent) => {\n // Prevent browser context menu\n e.preventDefault()\n }, [])\n\n const disabledRaycast = useCallback(() => null, [])\n\n // Handle background click for progressive deselection\n const onBackgroundClick = useCallback(() => {\n // Full reset on background click\n useEditor.setState({\n selectedNodeIds: [],\n selectedZoneId: null,\n selectedFloorId: null,\n levelMode: 'stacked',\n viewMode: 'full',\n })\n }, [])\n\n return (\n <div className=\"relative h-full w-full\">\n {/* Lightweight bridge for selection state -> iframe messaging */}\n <SelectionMessageBridge isEmbedded={isEmbedded} />\n\n <Canvas className={cn('bg-[#303035]', className)} onContextMenu={onContextMenu} shadows>\n {/* <SoftShadows focus={1} samples={16} size={25} /> */}\n {cameraMode === 'perspective' ? (\n <PerspectiveCamera far={1000} fov={50} makeDefault near={0.1} position={[10, 10, 10]} />\n ) : (\n <OrthographicCamera\n far={1000}\n makeDefault\n near={-1000}\n position={[10, 10, 10]}\n zoom={defaultZoom}\n />\n )}\n <color args={['#212134']} attach=\"background\" />\n\n <Bvh>\n {/* Large background plane to capture clicks outside of floor hit targets */}\n {/* Note: LevelHoverManager handles all click logic via native DOM events, so we disable */}\n {/* R3F raycasting here to prevent onBackgroundClick from interfering with level selection */}\n <mesh\n onClick={onBackgroundClick}\n position={[0, -0.1, 0]}\n raycast={disabledRaycast}\n rotation={[-Math.PI / 2, 0, 0]}\n >\n <planeGeometry args={[1000, 1000]} />\n <meshBasicMaterial opacity={0} transparent />\n </mesh>\n\n {/* Loop through all floors and render grid + walls for each */}\n <group position={[-GRID_SIZE / 2, 0, -GRID_SIZE / 2]}>\n {building && <NodeRenderer isViewer nodeId={building.id} />}\n </group>\n\n {/* Zone polygons */}\n <group position={[-GRID_SIZE / 2, 0, -GRID_SIZE / 2]}>\n <ZoneRenderer isViewer />\n </group>\n\n {/* Selection controls without manipulation UI */}\n <SelectionControls />\n <LevelHoverManager />\n <ViewerCustomControls />\n <EnvironmentRenderer />\n {/* Infinite floor - rendered outside export group */}\n <InfiniteFloor />\n </Bvh>\n </Canvas>\n </div>\n )\n}\n\ninterface AnimatedLevelProps {\n children: React.ReactNode\n positionY?: number\n}\n\nconst AnimatedLevel: React.FC<AnimatedLevelProps> = ({ positionY, children }) => {\n const animatedProps = useSpring({\n positionY,\n config: { mass: 1, tension: 170, friction: 26 },\n })\n\n return <animated.group position-y={animatedProps.positionY}>{children}</animated.group>\n}\n","'use client'\n\nimport { useEffect, useState } from 'react'\nimport { useEditor, waitForHydration, type WallMode } from '@pascal/core/hooks'\nimport { Viewer } from './components'\n\n// Import node registrations to ensure all renderers are available\nimport '@pascal/core/components/nodes'\n\nexport interface SceneViewerProps {\n /** URL to load the scene JSON from */\n sceneUrl?: string\n /** Initial zoom level for orthographic camera (default: 80) */\n defaultZoom?: number\n /** When true, posts selection changes to parent window for iframe embedding */\n isEmbedded?: boolean\n /** Initial wall mode for viewer */\n defaultWallMode?: WallMode\n /** CSS class name for the container */\n className?: string\n /** Custom loading component */\n loadingComponent?: React.ReactNode\n /** Custom error component */\n errorComponent?: (error: string) => React.ReactNode\n /** Callback when scene is loaded */\n onSceneLoaded?: () => void\n /** Callback when an error occurs */\n onError?: (error: string) => void\n /** Callback when selection changes */\n onSelectionChange?: (selection: {\n selectedNodeIds: string[]\n selectedFloorId: string | null\n selectedZoneId: string | null\n }) => void\n}\n\n/**\n * SceneViewer - A standalone React component for viewing Pascal scenes.\n *\n * This component handles scene loading from URLs and provides a complete\n * 3D viewer with loading/error states.\n *\n * @example\n * ```tsx\n * import { SceneViewer } from '@pascal/viewer'\n *\n * function App() {\n * return (\n * <SceneViewer\n * sceneUrl=\"https://example.com/scene.json\"\n * defaultZoom={80}\n * onSelectionChange={(selection) => console.log(selection)}\n * />\n * )\n * }\n * ```\n */\nexport function SceneViewer({\n sceneUrl,\n defaultZoom = 80,\n isEmbedded = false,\n defaultWallMode = 'cutaway',\n className,\n loadingComponent,\n errorComponent,\n onSceneLoaded,\n onError,\n onSelectionChange,\n}: SceneViewerProps) {\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n // Subscribe to selection changes\n useEffect(() => {\n if (!onSelectionChange) return\n\n const unsubscribe = useEditor.subscribe((state) => {\n onSelectionChange({\n selectedNodeIds: state.selectedNodeIds as string[],\n selectedFloorId: state.selectedFloorId,\n selectedZoneId: state.selectedZoneId,\n })\n })\n\n return unsubscribe\n }, [onSelectionChange])\n\n // Load scene from URL\n useEffect(() => {\n const loadScene = async () => {\n try {\n setIsLoading(true)\n setError(null)\n\n // Wait for store to hydrate first\n await waitForHydration()\n\n // If no sceneUrl provided, use the scene from local storage (already hydrated)\n if (!sceneUrl) {\n setIsLoading(false)\n onSceneLoaded?.()\n return\n }\n\n const response = await fetch(sceneUrl)\n if (!response.ok) {\n throw new Error(`Failed to fetch scene: ${response.statusText}`)\n }\n const json = await response.json()\n\n // Load the scene transiently\n useEditor.getState().loadTransientScene(json, sceneUrl)\n\n // Reset to initial state\n useEditor.setState({\n selectedFloorId: null,\n selectedZoneId: null,\n selectedNodeIds: [],\n viewMode: 'full',\n wallMode: defaultWallMode,\n })\n\n setIsLoading(false)\n onSceneLoaded?.()\n } catch (err) {\n console.error('Error loading scene:', err)\n const errorMessage = err instanceof Error ? err.message : 'Failed to load scene'\n setError(errorMessage)\n setIsLoading(false)\n onError?.(errorMessage)\n }\n }\n\n loadScene()\n }, [sceneUrl, defaultWallMode, onSceneLoaded, onError])\n\n if (isLoading) {\n return (\n loadingComponent || (\n <div\n className={className}\n style={{\n display: 'flex',\n height: '100%',\n width: '100%',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#303035',\n color: 'white',\n }}\n >\n <div style={{ textAlign: 'center' }}>\n <div\n style={{\n width: 48,\n height: 48,\n border: '4px solid rgba(255,255,255,0.2)',\n borderTopColor: 'white',\n borderRadius: '50%',\n animation: 'spin 1s linear infinite',\n margin: '0 auto 16px',\n }}\n />\n <p style={{ color: 'rgba(255,255,255,0.6)' }}>Loading scene...</p>\n <style>{`@keyframes spin { to { transform: rotate(360deg) } }`}</style>\n </div>\n </div>\n )\n )\n }\n\n if (error) {\n return (\n errorComponent?.(error) || (\n <div\n className={className}\n style={{\n display: 'flex',\n height: '100%',\n width: '100%',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#303035',\n color: 'white',\n textAlign: 'center',\n }}\n >\n <div>\n <p style={{ color: '#f87171', fontSize: 18, marginBottom: 8 }}>Error loading scene</p>\n <p style={{ color: 'rgba(255,255,255,0.6)', fontSize: 14 }}>{error}</p>\n </div>\n </div>\n )\n )\n }\n\n return (\n <Viewer\n className={className}\n defaultWallMode={defaultWallMode}\n defaultZoom={defaultZoom}\n isEmbedded={isEmbedded}\n />\n )\n}\n"]}
|