@eyeon/map 2.0.1 → 2.0.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.
Files changed (139) hide show
  1. package/README.md +18 -1
  2. package/dist/assets/MapViewer.css +1 -1
  3. package/dist/assets/index.css +1 -1
  4. package/dist/chunks/MapViewer.js +1988 -358
  5. package/dist/chunks/MapViewer.js.map +1 -1
  6. package/dist/chunks/graph-tools.js +202 -109
  7. package/dist/chunks/graph-tools.js.map +1 -1
  8. package/dist/chunks/stacking.js +1426 -0
  9. package/dist/chunks/stacking.js.map +1 -0
  10. package/dist/core/filletPolygon.d.ts +10 -0
  11. package/dist/core/filletPolygon.d.ts.map +1 -0
  12. package/dist/core/geometry/index.d.ts +41 -4
  13. package/dist/core/geometry/index.d.ts.map +1 -1
  14. package/dist/core/hostChrome.d.ts +20 -0
  15. package/dist/core/hostChrome.d.ts.map +1 -0
  16. package/dist/core/import/index.d.ts +52 -3
  17. package/dist/core/import/index.d.ts.map +1 -1
  18. package/dist/core/import/svgStyle.d.ts +21 -0
  19. package/dist/core/import/svgStyle.d.ts.map +1 -0
  20. package/dist/core/import/svgTransform.d.ts +49 -0
  21. package/dist/core/import/svgTransform.d.ts.map +1 -0
  22. package/dist/core/index.d.ts +6 -0
  23. package/dist/core/index.d.ts.map +1 -1
  24. package/dist/core/index.js +89 -279
  25. package/dist/core/index.js.map +1 -1
  26. package/dist/core/layerStyles.d.ts +44 -0
  27. package/dist/core/layerStyles.d.ts.map +1 -0
  28. package/dist/core/mediaUrl.d.ts +3 -0
  29. package/dist/core/mediaUrl.d.ts.map +1 -0
  30. package/dist/core/outdoorDecoration.d.ts +16 -0
  31. package/dist/core/outdoorDecoration.d.ts.map +1 -0
  32. package/dist/core/publish/index.d.ts +8 -2
  33. package/dist/core/publish/index.d.ts.map +1 -1
  34. package/dist/core/routing/graph-tools.d.ts +28 -2
  35. package/dist/core/routing/graph-tools.d.ts.map +1 -1
  36. package/dist/core/routing/pathfinding.d.ts.map +1 -1
  37. package/dist/core/stacking.d.ts +61 -0
  38. package/dist/core/stacking.d.ts.map +1 -0
  39. package/dist/core/types.d.ts +31 -0
  40. package/dist/core/types.d.ts.map +1 -1
  41. package/dist/editor/MapEditor.d.ts +28 -16
  42. package/dist/editor/MapEditor.d.ts.map +1 -1
  43. package/dist/editor/canvas/EditorCanvas.d.ts +56 -6
  44. package/dist/editor/canvas/EditorCanvas.d.ts.map +1 -1
  45. package/dist/editor/canvas/OutdoorSvgUnderlay.d.ts +7 -0
  46. package/dist/editor/canvas/OutdoorSvgUnderlay.d.ts.map +1 -0
  47. package/dist/editor/canvas/coords.d.ts +51 -0
  48. package/dist/editor/canvas/coords.d.ts.map +1 -0
  49. package/dist/editor/canvas/editorFill.d.ts +10 -0
  50. package/dist/editor/canvas/editorFill.d.ts.map +1 -0
  51. package/dist/editor/canvas/editorHover.d.ts +14 -0
  52. package/dist/editor/canvas/editorHover.d.ts.map +1 -0
  53. package/dist/editor/canvas/underlayHint.d.ts +5 -0
  54. package/dist/editor/canvas/underlayHint.d.ts.map +1 -0
  55. package/dist/editor/connectorAssignments.d.ts +64 -0
  56. package/dist/editor/connectorAssignments.d.ts.map +1 -0
  57. package/dist/editor/draftOps.d.ts +22 -0
  58. package/dist/editor/draftOps.d.ts.map +1 -0
  59. package/dist/editor/editorSectionReturn.d.ts +12 -0
  60. package/dist/editor/editorSectionReturn.d.ts.map +1 -0
  61. package/dist/editor/floorsListReturn.d.ts +5 -0
  62. package/dist/editor/floorsListReturn.d.ts.map +1 -0
  63. package/dist/editor/geometryEdit.d.ts +54 -0
  64. package/dist/editor/geometryEdit.d.ts.map +1 -0
  65. package/dist/editor/hexColor.d.ts +4 -0
  66. package/dist/editor/hexColor.d.ts.map +1 -0
  67. package/dist/editor/history.d.ts +31 -0
  68. package/dist/editor/history.d.ts.map +1 -0
  69. package/dist/editor/index.css +1497 -143
  70. package/dist/editor/index.d.ts +9 -3
  71. package/dist/editor/index.d.ts.map +1 -1
  72. package/dist/editor/index.js +6377 -601
  73. package/dist/editor/index.js.map +1 -1
  74. package/dist/editor/labelText.d.ts +15 -0
  75. package/dist/editor/labelText.d.ts.map +1 -0
  76. package/dist/editor/labels.d.ts +5 -0
  77. package/dist/editor/labels.d.ts.map +1 -0
  78. package/dist/editor/panels/ConnectorAssign.d.ts +12 -0
  79. package/dist/editor/panels/ConnectorAssign.d.ts.map +1 -0
  80. package/dist/editor/panels/FloorsPanel.d.ts +64 -0
  81. package/dist/editor/panels/FloorsPanel.d.ts.map +1 -0
  82. package/dist/editor/panels/ImportReviewPanel.d.ts +22 -0
  83. package/dist/editor/panels/ImportReviewPanel.d.ts.map +1 -0
  84. package/dist/editor/panels/Inspector.d.ts +6 -3
  85. package/dist/editor/panels/Inspector.d.ts.map +1 -1
  86. package/dist/editor/panels/LeftRail.d.ts +26 -11
  87. package/dist/editor/panels/LeftRail.d.ts.map +1 -1
  88. package/dist/editor/panels/PreviewOverlay.d.ts +11 -2
  89. package/dist/editor/panels/PreviewOverlay.d.ts.map +1 -1
  90. package/dist/editor/pathRings.d.ts +79 -0
  91. package/dist/editor/pathRings.d.ts.map +1 -0
  92. package/dist/editor/portalSurface.d.ts +37 -0
  93. package/dist/editor/portalSurface.d.ts.map +1 -0
  94. package/dist/editor/previewDocument.d.ts +9 -0
  95. package/dist/editor/previewDocument.d.ts.map +1 -0
  96. package/dist/editor/railAssignments.d.ts +22 -0
  97. package/dist/editor/railAssignments.d.ts.map +1 -0
  98. package/dist/editor/routeStubs.d.ts +103 -0
  99. package/dist/editor/routeStubs.d.ts.map +1 -0
  100. package/dist/editor/snapPoint.d.ts +5 -0
  101. package/dist/editor/snapPoint.d.ts.map +1 -0
  102. package/dist/editor/splitJoin.d.ts +78 -0
  103. package/dist/editor/splitJoin.d.ts.map +1 -0
  104. package/dist/editor/tools.d.ts +49 -0
  105. package/dist/editor/tools.d.ts.map +1 -0
  106. package/dist/test-maps/shops-at-south-town/BASE - Shops At South Town.ai +26703 -28
  107. package/dist/test-maps/shops-at-south-town/LF - Shops At South Town.ai +4459 -0
  108. package/dist/test-maps/shops-at-south-town/SVG/BASE - Shops At South Town.svg +567 -0
  109. package/dist/test-maps/shops-at-south-town/SVG/LF - Shops At South Town.svg +238 -0
  110. package/dist/test-maps/shops-at-south-town/SVG/UF - Shops At South Town.svg +276 -0
  111. package/dist/test-maps/shops-at-south-town/UF - Shops At South Town.ai +4131 -1
  112. package/dist/ui/ModernSelect.d.ts +14 -0
  113. package/dist/ui/ModernSelect.d.ts.map +1 -0
  114. package/dist/ui/selectSearch.d.ts +9 -0
  115. package/dist/ui/selectSearch.d.ts.map +1 -0
  116. package/dist/viewer/MapViewer.d.ts +14 -3
  117. package/dist/viewer/MapViewer.d.ts.map +1 -1
  118. package/dist/viewer/camera.d.ts +37 -0
  119. package/dist/viewer/camera.d.ts.map +1 -0
  120. package/dist/viewer/components/CameraRig.d.ts +18 -0
  121. package/dist/viewer/components/CameraRig.d.ts.map +1 -0
  122. package/dist/viewer/components/LevelMeshes.d.ts +6 -1
  123. package/dist/viewer/components/LevelMeshes.d.ts.map +1 -1
  124. package/dist/viewer/components/MapScene.d.ts +6 -1
  125. package/dist/viewer/components/MapScene.d.ts.map +1 -1
  126. package/dist/viewer/components/SvgVectorLayer.d.ts +18 -0
  127. package/dist/viewer/components/SvgVectorLayer.d.ts.map +1 -0
  128. package/dist/viewer/index.css +236 -37
  129. package/dist/viewer/index.d.ts +4 -0
  130. package/dist/viewer/index.d.ts.map +1 -1
  131. package/dist/viewer/index.js +9 -4
  132. package/dist/viewer/index.js.map +1 -1
  133. package/dist/viewer/ui/MapControls.d.ts +22 -0
  134. package/dist/viewer/ui/MapControls.d.ts.map +1 -0
  135. package/dist/viewer/ui/RuntimeChrome.d.ts +3 -3
  136. package/dist/viewer/ui/RuntimeChrome.d.ts.map +1 -1
  137. package/package.json +7 -3
  138. package/dist/chunks/pathfinding.js +0 -343
  139. package/dist/chunks/pathfinding.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/editor/canvas/EditorCanvas.tsx","../../src/editor/panels/LeftRail.tsx","../../src/editor/panels/Inspector.tsx","../../src/editor/panels/PreviewOverlay.tsx","../../src/editor/MapEditor.tsx"],"sourcesContent":["import React, { useMemo, useRef, useState } from 'react';\nimport type {\n CmAnchor,\n CmLevel,\n CmRouteEdge,\n CmShape,\n CmShapeAssignment,\n ShapeGeometry,\n ShapeKind,\n ThemeDefaults,\n Vec2,\n} from '../../core';\nimport { snapAngle } from '../../core';\n\nexport interface EditorCanvasProps {\n level: CmLevel | null;\n shapes: CmShape[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n assignments: CmShapeAssignment[];\n theme: ThemeDefaults;\n tool: 'select' | 'draw-unit' | 'draw-route' | 'pan';\n baseAngle: number;\n selectedShapeId: number | null;\n selectedAnchorIds: number[];\n baseSvgUrl: string | null;\n onSelectShape: (id: number | null) => void;\n onSelectAnchors: (ids: number[]) => void;\n onCreateRoutePoint: (point: Vec2, prevAnchorId: number | null) => void;\n onMoveAnchor: (anchorId: number, x: number, y: number) => void;\n onCreateShape: (kind: ShapeKind, geometry: ShapeGeometry) => void;\n}\n\nfunction polygonsToPath(polygons: Vec2[][]): string {\n return polygons\n .map((poly) => {\n if (poly.length === 0) return '';\n let d = `M ${poly[0].x} ${poly[0].y}`;\n for (let i = 1; i < poly.length; i++) d += ` L ${poly[i].x} ${poly[i].y}`;\n d += ' Z';\n return d;\n })\n .join(' ');\n}\n\nexport function EditorCanvas({\n level,\n shapes,\n anchors,\n edges,\n theme,\n tool,\n baseAngle,\n selectedShapeId,\n selectedAnchorIds,\n baseSvgUrl,\n onSelectShape,\n onSelectAnchors,\n onCreateRoutePoint,\n onMoveAnchor,\n onCreateShape,\n}: EditorCanvasProps) {\n const svgRef = useRef<SVGSVGElement>(null);\n const [pan, setPan] = useState({ x: 0, y: 0 });\n const [zoom, setZoom] = useState(1);\n const [drawing, setDrawing] = useState<Vec2[]>([]);\n const [dragAnchor, setDragAnchor] = useState<number | null>(null);\n const [lastRouteAnchor, setLastRouteAnchor] = useState<number | null>(null);\n const panStart = useRef<{ x: number; y: number; panX: number; panY: number } | null>(null);\n\n const viewbox = level?.sourceViewbox ?? { x: 0, y: 0, width: 1000, height: 800 };\n\n const toWorld = (clientX: number, clientY: number): Vec2 => {\n const svg = svgRef.current;\n if (!svg) return { x: 0, y: 0 };\n const rect = svg.getBoundingClientRect();\n const x = (clientX - rect.left - pan.x) / zoom;\n const y = (clientY - rect.top - pan.y) / zoom;\n return { x: x + viewbox.x, y: y + viewbox.y };\n };\n\n const anchorById = useMemo(\n () => new Map(anchors.map((a) => [a.id, a])),\n [anchors],\n );\n\n const onPointerDown = (e: React.PointerEvent) => {\n if (tool === 'pan' || e.button === 1) {\n panStart.current = { x: e.clientX, y: e.clientY, panX: pan.x, panY: pan.y };\n return;\n }\n const world = toWorld(e.clientX, e.clientY);\n if (tool === 'draw-route') {\n const snapped = lastRouteAnchor\n ? snapAngle(anchorById.get(lastRouteAnchor) ?? world, world, baseAngle)\n : world;\n onCreateRoutePoint(snapped, lastRouteAnchor);\n return;\n }\n if (tool === 'draw-unit') {\n setDrawing([world]);\n }\n };\n\n const onPointerMove = (e: React.PointerEvent) => {\n if (panStart.current) {\n setPan({\n x: panStart.current.panX + (e.clientX - panStart.current.x),\n y: panStart.current.panY + (e.clientY - panStart.current.y),\n });\n return;\n }\n if (dragAnchor != null) {\n const world = toWorld(e.clientX, e.clientY);\n onMoveAnchor(dragAnchor, world.x, world.y);\n return;\n }\n if (tool === 'draw-unit' && drawing.length > 0) {\n const world = toWorld(e.clientX, e.clientY);\n setDrawing((d) => [...d.slice(0, -1), d[d.length - 1], world].slice(0, -0) || [...d.slice(0, -1), world]);\n // keep last point updating\n setDrawing((prev) => {\n if (prev.length === 0) return prev;\n return [...prev.slice(0, -1), world];\n });\n }\n };\n\n const onPointerUp = () => {\n panStart.current = null;\n if (dragAnchor != null) {\n // weld hint: select nearby anchors after drop\n const moved = anchors.find((a) => a.id === dragAnchor);\n if (moved) {\n const near = anchors\n .filter((a) => a.id !== moved.id)\n .filter((a) => Math.hypot(a.x - moved.x, a.y - moved.y) <= 2.5)\n .map((a) => a.id);\n if (near.length) onSelectAnchors([moved.id, ...near]);\n }\n setDragAnchor(null);\n }\n };\n\n const finishPolygon = () => {\n if (drawing.length < 3) {\n setDrawing([]);\n return;\n }\n const geometry: ShapeGeometry = {\n paths: [\n {\n d: polygonsToPath([drawing]),\n closed: true,\n },\n ],\n polygons: [drawing],\n };\n onCreateShape('unit', geometry);\n setDrawing([]);\n };\n\n return (\n <div\n className=\"eyeon-map-canvas\"\n onWheel={(e) => {\n e.preventDefault();\n setZoom((z) => Math.min(8, Math.max(0.2, z * (e.deltaY > 0 ? 0.9 : 1.1))));\n }}\n >\n <svg\n ref={svgRef}\n className=\"eyeon-map-canvas__svg\"\n viewBox={`${viewbox.x} ${viewbox.y} ${viewbox.width} ${viewbox.height}`}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onDoubleClick={() => {\n if (tool === 'draw-unit') finishPolygon();\n }}\n >\n <g transform={`translate(${pan.x / zoom}, ${pan.y / zoom}) scale(${zoom})`}>\n {baseSvgUrl && (\n <image\n href={baseSvgUrl}\n x={viewbox.x}\n y={viewbox.y}\n width={viewbox.width}\n height={viewbox.height}\n opacity={0.85}\n />\n )}\n\n {shapes.map((shape) => (\n <path\n key={shape.id}\n d={\n shape.geometry.paths.map((p) => p.d).join(' ') ||\n polygonsToPath(shape.geometry.polygons)\n }\n fill={\n shape.style.fill ??\n (shape.kind === 'walkable'\n ? theme.WALKABLE_COLOR\n : shape.kind === 'unit'\n ? theme.STORE_DEFAULT_COLOR\n : '#cbd5e1')\n }\n fillOpacity={shape.kind === 'amenity' ? 0.15 : 0.85}\n stroke={selectedShapeId === shape.id ? theme.ACCENT_COLOR : '#64748b'}\n strokeWidth={selectedShapeId === shape.id ? 2.5 / zoom : 1 / zoom}\n onClick={(e) => {\n e.stopPropagation();\n if (tool === 'select') onSelectShape(shape.id);\n }}\n style={{ cursor: tool === 'select' ? 'pointer' : 'default' }}\n />\n ))}\n\n {edges.map((edge) => {\n const a = anchorById.get(edge.fromAnchorId);\n const b = anchorById.get(edge.toAnchorId);\n if (!a || !b) return null;\n return (\n <line\n key={edge.id}\n x1={a.x}\n y1={a.y}\n x2={b.x}\n y2={b.y}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={2 / zoom}\n strokeLinecap=\"round\"\n />\n );\n })}\n\n {anchors.map((anchor) => {\n const selected = selectedAnchorIds.includes(anchor.id);\n const nearWeld =\n selected &&\n selectedAnchorIds.some((id) => {\n if (id === anchor.id) return false;\n const other = anchorById.get(id);\n return other && Math.hypot(other.x - anchor.x, other.y - anchor.y) <= 2.5;\n });\n return (\n <circle\n key={anchor.id}\n cx={anchor.x}\n cy={anchor.y}\n r={(selected ? 5 : 3.5) / zoom}\n fill={nearWeld ? '#22c55e' : selected ? theme.ACCENT_COLOR : '#0f172a'}\n stroke=\"#fff\"\n strokeWidth={1 / zoom}\n onPointerDown={(e) => {\n e.stopPropagation();\n if (tool === 'draw-route') {\n setLastRouteAnchor(anchor.id);\n onCreateRoutePoint(anchor, lastRouteAnchor);\n return;\n }\n if (tool === 'select') {\n onSelectAnchors(\n e.shiftKey\n ? selectedAnchorIds.includes(anchor.id)\n ? selectedAnchorIds.filter((id) => id !== anchor.id)\n : [...selectedAnchorIds, anchor.id]\n : [anchor.id],\n );\n setDragAnchor(anchor.id);\n }\n }}\n style={{ cursor: 'grab' }}\n />\n );\n })}\n\n {drawing.length > 1 && (\n <polyline\n points={drawing.map((p) => `${p.x},${p.y}`).join(' ')}\n fill=\"none\"\n stroke={theme.ACCENT_COLOR}\n strokeWidth={2 / zoom}\n strokeDasharray={`${6 / zoom} ${4 / zoom}`}\n />\n )}\n </g>\n </svg>\n {!level && (\n <div className=\"eyeon-map-canvas__empty\">Select or create a level to begin</div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type {\n CmAmenityCatalogItem,\n CmLevel,\n CmBuilding,\n ThemeDefaults,\n} from '../../core';\n\nexport type RailTab =\n | 'levels'\n | 'shapes'\n | 'routes'\n | 'amenities'\n | 'kiosks'\n | 'theme';\n\nexport interface LeftRailDraft {\n buildings: CmBuilding[];\n levels: CmLevel[];\n shapes: Array<{ id: number; levelId: number; key: string; kind: string }>;\n anchors: Array<{ id: number; levelId: number }>;\n edges: Array<{ id: number }>;\n amenities: CmAmenityCatalogItem[];\n}\n\nexport interface LeftRailProps {\n tab: RailTab;\n onTabChange: (tab: RailTab) => void;\n draft: LeftRailDraft;\n activeLevelId: number | null;\n onSelectLevel: (id: number) => void;\n canFloors: boolean;\n canSettings: boolean;\n onImportSvg?: (levelId: number, file: File) => Promise<void>;\n onAutoroute?: (levelId: number) => Promise<void>;\n theme: ThemeDefaults;\n onThemeChange: (partial: Partial<ThemeDefaults>) => void;\n}\n\nconst TABS: Array<{ id: RailTab; label: string }> = [\n { id: 'levels', label: 'Levels' },\n { id: 'shapes', label: 'Shapes' },\n { id: 'routes', label: 'Routes' },\n { id: 'amenities', label: 'Amenities' },\n { id: 'kiosks', label: 'Kiosks' },\n { id: 'theme', label: 'Theme' },\n];\n\nexport function LeftRail({\n tab,\n onTabChange,\n draft,\n activeLevelId,\n onSelectLevel,\n canFloors,\n canSettings,\n onImportSvg,\n onAutoroute,\n theme,\n onThemeChange,\n}: LeftRailProps) {\n return (\n <aside className=\"eyeon-map-rail\">\n <nav className=\"eyeon-map-rail__tabs\">\n {TABS.map((t) => (\n <button\n key={t.id}\n type=\"button\"\n className={tab === t.id ? 'is-active' : ''}\n onClick={() => onTabChange(t.id)}\n >\n {t.label}\n </button>\n ))}\n </nav>\n\n <div className=\"eyeon-map-rail__body\">\n {tab === 'levels' && (\n <div className=\"eyeon-map-rail__section\">\n <div className=\"eyeon-map-rail__heading\">Buildings</div>\n {draft.buildings.map((b) => (\n <div key={b.id} className=\"eyeon-map-rail__group\">\n <div className=\"eyeon-map-rail__group-title\">{b.name}</div>\n {draft.levels\n .filter((l) => l.buildingId === b.id)\n .map((l) => (\n <button\n key={l.id}\n type=\"button\"\n className={\n l.id === activeLevelId\n ? 'eyeon-map-rail__row is-active'\n : 'eyeon-map-rail__row'\n }\n onClick={() => onSelectLevel(l.id)}\n >\n {l.name}\n </button>\n ))}\n </div>\n ))}\n <div className=\"eyeon-map-rail__heading\">Outdoor</div>\n {draft.levels\n .filter((l) => l.kind === 'outdoor')\n .map((l) => (\n <button\n key={l.id}\n type=\"button\"\n className={\n l.id === activeLevelId\n ? 'eyeon-map-rail__row is-active'\n : 'eyeon-map-rail__row'\n }\n onClick={() => onSelectLevel(l.id)}\n >\n {l.name}\n </button>\n ))}\n\n {canFloors && activeLevelId != null && (\n <div className=\"eyeon-map-rail__actions\">\n <label className=\"eyeon-map-rail__file\">\n Import SVG\n <input\n type=\"file\"\n accept=\".svg,image/svg+xml\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file && onImportSvg) void onImportSvg(activeLevelId, file);\n }}\n />\n </label>\n <button type=\"button\" onClick={() => onAutoroute?.(activeLevelId)}>\n Auto-route\n </button>\n </div>\n )}\n </div>\n )}\n\n {tab === 'shapes' && (\n <div className=\"eyeon-map-rail__section\">\n <div className=\"eyeon-map-rail__heading\">\n Shapes ({draft.shapes.filter((s) => s.levelId === activeLevelId).length})\n </div>\n {draft.shapes\n .filter((s) => s.levelId === activeLevelId)\n .map((s) => (\n <div key={s.id} className=\"eyeon-map-rail__row\">\n <span className=\"eyeon-map-rail__muted\">{s.kind}</span> {s.key}\n </div>\n ))}\n </div>\n )}\n\n {tab === 'routes' && (\n <div className=\"eyeon-map-rail__section\">\n <div className=\"eyeon-map-rail__heading\">Anchors / Edges</div>\n <p className=\"eyeon-map-rail__hint\">\n Draw routes on the canvas. Drag anchors onto each other to weld. Green\n highlight means a weld is available.\n </p>\n <div className=\"eyeon-map-rail__stat\">\n {draft.anchors.filter((a) => a.levelId === activeLevelId).length} anchors ·{' '}\n {draft.edges.length} edges\n </div>\n </div>\n )}\n\n {tab === 'amenities' && (\n <div className=\"eyeon-map-rail__section\">\n <div className=\"eyeon-map-rail__heading\">Amenity catalog</div>\n {draft.amenities.map((a) => (\n <div key={a.id} className=\"eyeon-map-rail__row\">\n {a.name}\n <span className=\"eyeon-map-rail__muted\">{a.code}</span>\n </div>\n ))}\n </div>\n )}\n\n {tab === 'kiosks' && (\n <div className=\"eyeon-map-rail__section\">\n <p className=\"eyeon-map-rail__hint\">\n Assign a kiosk_screen shape to a display_kiosks device in the inspector.\n </p>\n </div>\n )}\n\n {tab === 'theme' && canSettings && (\n <div className=\"eyeon-map-rail__section\">\n <div className=\"eyeon-map-rail__heading\">Theme</div>\n <label className=\"eyeon-map-rail__field\">\n Style\n <select\n value={theme.MAP_STYLE}\n onChange={(e) =>\n onThemeChange({ MAP_STYLE: e.target.value as '2D' | '3D' })\n }\n >\n <option value=\"2D\">2D</option>\n <option value=\"3D\">3D</option>\n </select>\n </label>\n {(\n [\n ['ACCENT_COLOR', 'Accent'],\n ['STORE_DEFAULT_COLOR', 'Store fill'],\n ['MAP_BACKGROUND_COLOR', 'Background'],\n ['WALL_COLOR', 'Walls'],\n ['PARKING_ZONE_COLOR', 'Parking'],\n ['GREEN_AREA_COLOR', 'Green'],\n ['WATER_COLOR', 'Water'],\n ] as const\n ).map(([key, label]) => (\n <label key={key} className=\"eyeon-map-rail__field\">\n {label}\n <input\n type=\"color\"\n value={theme[key]}\n onChange={(e) => onThemeChange({ [key]: e.target.value })}\n />\n </label>\n ))}\n </div>\n )}\n </div>\n </aside>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport type {\n CmAmenityCatalogItem,\n CmShape,\n CmShapeAssignment,\n ShapeKind,\n UnitStatus,\n} from '../../core';\n\nconst SHAPE_KINDS: ShapeKind[] = [\n 'unit',\n 'amenity',\n 'kiosk_screen',\n 'connector',\n 'entrance',\n 'walkable',\n 'void',\n 'wall',\n 'boundary',\n 'floorplate',\n 'decor',\n 'label',\n 'zone',\n 'parking_zone',\n 'green_area',\n 'water',\n 'parking_icon',\n];\n\nconst UNIT_STATUSES: UnitStatus[] = [\n 'occupied',\n 'vacant',\n 'coming_soon',\n 'under_renovation',\n];\n\nexport interface InspectorProps {\n shape: CmShape | null;\n assignment: CmShapeAssignment | null;\n amenities: CmAmenityCatalogItem[];\n canEdit: boolean;\n onRename: (key: string) => void;\n onChangeKind: (kind: ShapeKind) => void;\n onSaveAssignment: (assignment: CmShapeAssignment) => void;\n undoCount: number;\n}\n\nexport function Inspector({\n shape,\n assignment,\n amenities,\n canEdit,\n onRename,\n onChangeKind,\n onSaveAssignment,\n undoCount,\n}: InspectorProps) {\n const [key, setKey] = useState(shape?.key ?? '');\n const [retailerId, setRetailerId] = useState<string>(\n assignment?.retailerId?.toString() ?? '',\n );\n const [amenityId, setAmenityId] = useState<string>(\n assignment?.amenityId?.toString() ?? '',\n );\n const [kioskId, setKioskId] = useState<string>(\n assignment?.kioskId?.toString() ?? '',\n );\n const [unitStatus, setUnitStatus] = useState<UnitStatus>(\n assignment?.unitStatus ?? 'vacant',\n );\n const [unitNumber, setUnitNumber] = useState(assignment?.unitNumber ?? '');\n const [customLabel, setCustomLabel] = useState(assignment?.customLabel ?? '');\n\n useEffect(() => {\n setKey(shape?.key ?? '');\n setRetailerId(assignment?.retailerId?.toString() ?? '');\n setAmenityId(assignment?.amenityId?.toString() ?? '');\n setKioskId(assignment?.kioskId?.toString() ?? '');\n setUnitStatus(assignment?.unitStatus ?? 'vacant');\n setUnitNumber(assignment?.unitNumber ?? '');\n setCustomLabel(assignment?.customLabel ?? '');\n }, [shape, assignment]);\n\n if (!shape) {\n return (\n <aside className=\"eyeon-map-inspector\">\n <div className=\"eyeon-map-inspector__empty\">\n Select a shape or anchor\n <div className=\"eyeon-map-rail__muted\">Undo stack: {undoCount}</div>\n </div>\n </aside>\n );\n }\n\n return (\n <aside className=\"eyeon-map-inspector\">\n <div className=\"eyeon-map-inspector__heading\">Shape</div>\n\n <label className=\"eyeon-map-rail__field\">\n Key / ID\n <input\n value={key}\n disabled={!canEdit}\n onChange={(e) => setKey(e.target.value)}\n onBlur={() => {\n if (key && key !== shape.key) onRename(key);\n }}\n />\n </label>\n\n <label className=\"eyeon-map-rail__field\">\n Kind\n <select\n value={shape.kind}\n disabled={!canEdit}\n onChange={(e) => onChangeKind(e.target.value as ShapeKind)}\n >\n {SHAPE_KINDS.map((k) => (\n <option key={k} value={k}>\n {k}\n </option>\n ))}\n </select>\n </label>\n\n <div className=\"eyeon-map-inspector__heading\">Assignment</div>\n\n {(shape.kind === 'unit' || shape.kind === 'parking_zone') && (\n <>\n <label className=\"eyeon-map-rail__field\">\n Retailer ID\n <input\n value={retailerId}\n disabled={!canEdit}\n onChange={(e) => setRetailerId(e.target.value)}\n />\n </label>\n <label className=\"eyeon-map-rail__field\">\n Status\n <select\n value={unitStatus}\n disabled={!canEdit}\n onChange={(e) => setUnitStatus(e.target.value as UnitStatus)}\n >\n {UNIT_STATUSES.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))}\n </select>\n </label>\n <label className=\"eyeon-map-rail__field\">\n Unit number\n <input\n value={unitNumber}\n disabled={!canEdit}\n onChange={(e) => setUnitNumber(e.target.value)}\n />\n </label>\n </>\n )}\n\n {shape.kind === 'amenity' && (\n <label className=\"eyeon-map-rail__field\">\n Amenity\n <select\n value={amenityId}\n disabled={!canEdit}\n onChange={(e) => setAmenityId(e.target.value)}\n >\n <option value=\"\">—</option>\n {amenities.map((a) => (\n <option key={a.id} value={a.id}>\n {a.name}\n </option>\n ))}\n </select>\n </label>\n )}\n\n {shape.kind === 'kiosk_screen' && (\n <label className=\"eyeon-map-rail__field\">\n Kiosk device ID\n <input\n value={kioskId}\n disabled={!canEdit}\n onChange={(e) => setKioskId(e.target.value)}\n />\n </label>\n )}\n\n <label className=\"eyeon-map-rail__field\">\n Custom label\n <input\n value={customLabel}\n disabled={!canEdit}\n onChange={(e) => setCustomLabel(e.target.value)}\n />\n </label>\n\n {canEdit && (\n <button\n type=\"button\"\n className=\"eyeon-map-inspector__save\"\n onClick={() =>\n onSaveAssignment({\n shapeId: shape.id,\n targetType: retailerId\n ? 'retailer'\n : amenityId\n ? 'amenity'\n : kioskId\n ? 'kiosk'\n : 'none',\n retailerId: retailerId ? Number(retailerId) : null,\n amenityId: amenityId ? Number(amenityId) : null,\n kioskId: kioskId ? Number(kioskId) : null,\n unitStatus,\n unitNumber: unitNumber || null,\n customLabel: customLabel || null,\n customImageKey: assignment?.customImageKey ?? null,\n })\n }\n >\n Save assignment\n </button>\n )}\n </aside>\n );\n}\n","import React, { Suspense } from 'react';\nimport type { PublishedDocument } from '../../core';\nimport { MapViewer } from '../../viewer/MapViewer';\n\nexport function PreviewOverlay({ document }: { document: PublishedDocument }) {\n return (\n <div className=\"eyeon-map-preview\">\n <Suspense fallback={<div className=\"eyeon-map-preview__loading\">Loading preview…</div>}>\n <MapViewer document={document} role=\"PORTAL_PREVIEW\" />\n </Suspense>\n </div>\n );\n}\n","import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport type {\n BatchOp,\n CmAmenityCatalogItem,\n CmAnchor,\n CmBuilding,\n CmLevel,\n CmRouteEdge,\n CmShape,\n CmShapeAssignment,\n PublishedDocument,\n ShapeKind,\n ThemeDefaults,\n} from '../core';\nimport { DEFAULT_THEME, snapAngle, weldAnchors } from '../core';\nimport { EditorCanvas } from './canvas/EditorCanvas';\nimport { LeftRail, type RailTab } from './panels/LeftRail';\nimport { Inspector } from './panels/Inspector';\nimport { PreviewOverlay } from './panels/PreviewOverlay';\nimport './editor.css';\n\nexport interface EditorDraftState {\n mapId: number;\n centerId: number;\n theme: Partial<ThemeDefaults>;\n buildings: CmBuilding[];\n levels: CmLevel[];\n shapes: CmShape[];\n assignments: CmShapeAssignment[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n amenities: CmAmenityCatalogItem[];\n baseSvgUrl?: string | null;\n}\n\nexport interface MapEditorProps {\n draft: EditorDraftState;\n webApiURI: string;\n canEdit?: boolean;\n canFloors?: boolean;\n canSettings?: boolean;\n onBatch?: (ops: BatchOp[]) => Promise<void>;\n onPublish?: () => Promise<void>;\n onImportSvg?: (levelId: number, file: File) => Promise<void>;\n onAutoroute?: (levelId: number) => Promise<void>;\n previewDocument?: PublishedDocument | null;\n className?: string;\n}\n\nexport function MapEditor({\n draft,\n canEdit = true,\n canFloors = true,\n canSettings = true,\n onBatch,\n onPublish,\n onImportSvg,\n onAutoroute,\n previewDocument,\n className,\n}: MapEditorProps) {\n const [tab, setTab] = useState<RailTab>('levels');\n const [activeLevelId, setActiveLevelId] = useState<number | null>(\n draft.levels[0]?.id ?? null,\n );\n const [selectedShapeId, setSelectedShapeId] = useState<number | null>(null);\n const [selectedAnchorIds, setSelectedAnchorIds] = useState<number[]>([]);\n const [tool, setTool] = useState<'select' | 'draw-unit' | 'draw-route' | 'pan'>('select');\n const [preview, setPreview] = useState(false);\n const [baseAngle, setBaseAngle] = useState(0);\n const [undoStack, setUndoStack] = useState<BatchOp[][]>([]);\n const pendingOps = useRef<BatchOp[]>([]);\n\n const theme = useMemo(\n () => ({ ...DEFAULT_THEME, ...draft.theme }),\n [draft.theme],\n );\n\n const activeLevel = draft.levels.find((l) => l.id === activeLevelId) ?? null;\n const levelShapes = draft.shapes.filter((s) => s.levelId === activeLevelId);\n const levelAnchors = draft.anchors.filter((a) => a.levelId === activeLevelId);\n const levelEdges = draft.edges.filter((e) => {\n const a = draft.anchors.find((x) => x.id === e.fromAnchorId);\n return a?.levelId === activeLevelId;\n });\n const selectedShape = levelShapes.find((s) => s.id === selectedShapeId) ?? null;\n const selectedAssignment =\n draft.assignments.find((a) => a.shapeId === selectedShapeId) ?? null;\n\n const flushOps = useCallback(\n async (ops: BatchOp[]) => {\n if (!ops.length || !onBatch) return;\n setUndoStack((s) => [...s, ops]);\n await onBatch(ops);\n pendingOps.current = [];\n },\n [onBatch],\n );\n\n const handleWeldSelected = async () => {\n if (selectedAnchorIds.length < 2) return;\n const anchors = levelAnchors.map((a) => ({ ...a }));\n const edges = draft.edges.map((e) => ({ ...e }));\n const result = weldAnchors(anchors, edges, selectedAnchorIds);\n if (!result) return;\n await flushOps([\n {\n op: 'weld_anchors',\n anchorIds: selectedAnchorIds,\n },\n ]);\n setSelectedAnchorIds([result.survivingAnchorId]);\n };\n\n const handleRenameShape = async (key: string) => {\n if (!selectedShape || !canEdit) return;\n await flushOps([\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key,\n kind: selectedShape.kind,\n },\n },\n ]);\n };\n\n const handleChangeKind = async (kind: ShapeKind) => {\n if (!selectedShape || !canEdit) return;\n await flushOps([\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind,\n },\n },\n ]);\n };\n\n return (\n <div className={`eyeon-map-editor ${className ?? ''}`}>\n <LeftRail\n tab={tab}\n onTabChange={setTab}\n draft={draft}\n activeLevelId={activeLevelId}\n onSelectLevel={setActiveLevelId}\n canFloors={canFloors}\n canSettings={canSettings}\n onImportSvg={onImportSvg}\n onAutoroute={onAutoroute}\n theme={theme}\n onThemeChange={async (partial) => {\n if (!canSettings) return;\n await flushOps([{ op: 'update_theme', theme: partial }]);\n }}\n />\n\n <div className=\"eyeon-map-editor__center\">\n <div className=\"eyeon-map-editor__toolbar\">\n <div className=\"eyeon-map-editor__tools\">\n {(['select', 'pan', 'draw-unit', 'draw-route'] as const).map((t) => (\n <button\n key={t}\n type=\"button\"\n className={tool === t ? 'is-active' : ''}\n onClick={() => setTool(t)}\n disabled={!canEdit && t.startsWith('draw')}\n >\n {t}\n </button>\n ))}\n <button type=\"button\" onClick={handleWeldSelected} disabled={selectedAnchorIds.length < 2}>\n Weld anchors\n </button>\n <label className=\"eyeon-map-editor__angle\">\n Base °\n <input\n type=\"number\"\n value={baseAngle}\n onChange={(e) => setBaseAngle(Number(e.target.value) || 0)}\n />\n </label>\n </div>\n <div className=\"eyeon-map-editor__actions\">\n <button type=\"button\" onClick={() => setPreview((p) => !p)}>\n {preview ? 'Edit' : 'Preview'}\n </button>\n <button\n type=\"button\"\n className=\"eyeon-map-editor__publish\"\n onClick={() => onPublish?.()}\n disabled={!canEdit}\n >\n Publish\n </button>\n </div>\n </div>\n\n <div className=\"eyeon-map-editor__canvas-wrap\">\n {preview && previewDocument ? (\n <PreviewOverlay document={previewDocument} />\n ) : (\n <EditorCanvas\n level={activeLevel}\n shapes={levelShapes}\n anchors={levelAnchors}\n edges={levelEdges}\n assignments={draft.assignments}\n theme={theme}\n tool={tool}\n baseAngle={baseAngle}\n selectedShapeId={selectedShapeId}\n selectedAnchorIds={selectedAnchorIds}\n baseSvgUrl={\n activeLevel?.kind === 'outdoor' ? draft.baseSvgUrl ?? null : null\n }\n onSelectShape={setSelectedShapeId}\n onSelectAnchors={setSelectedAnchorIds}\n onCreateRoutePoint={async (point, prevAnchorId) => {\n if (!activeLevel || !canEdit) return;\n const snapped = prevAnchorId\n ? snapAngle(\n levelAnchors.find((a) => a.id === prevAnchorId) ?? point,\n point,\n baseAngle,\n )\n : point;\n await flushOps([\n {\n op: 'upsert_anchor',\n anchor: {\n levelId: activeLevel.id,\n x: snapped.x,\n y: snapped.y,\n kind: 'junction',\n },\n },\n ]);\n }}\n onMoveAnchor={async (anchorId, x, y) => {\n if (!canEdit) return;\n const anchor = levelAnchors.find((a) => a.id === anchorId);\n if (!anchor) return;\n await flushOps([\n {\n op: 'upsert_anchor',\n anchor: { ...anchor, x, y },\n },\n ]);\n }}\n onCreateShape={async (kind, geometry) => {\n if (!activeLevel || !canEdit) return;\n await flushOps([\n {\n op: 'upsert_shape',\n shape: {\n levelId: activeLevel.id,\n key: `${kind}-${Date.now()}`,\n kind,\n geometry,\n },\n },\n ]);\n }}\n />\n )}\n </div>\n </div>\n\n <Inspector\n shape={selectedShape}\n assignment={selectedAssignment}\n amenities={draft.amenities}\n canEdit={canEdit}\n onRename={handleRenameShape}\n onChangeKind={handleChangeKind}\n onSaveAssignment={async (assignment) => {\n if (!canEdit) return;\n await flushOps([{ op: 'upsert_assignment', assignment }]);\n }}\n undoCount={undoStack.length}\n />\n </div>\n );\n}\n\nexport default MapEditor;\n"],"names":["polygonsToPath","polygons","poly","d","i","EditorCanvas","level","shapes","anchors","edges","theme","tool","baseAngle","selectedShapeId","selectedAnchorIds","baseSvgUrl","onSelectShape","onSelectAnchors","onCreateRoutePoint","onMoveAnchor","onCreateShape","svgRef","useRef","pan","setPan","useState","zoom","setZoom","drawing","setDrawing","dragAnchor","setDragAnchor","lastRouteAnchor","setLastRouteAnchor","panStart","viewbox","toWorld","clientX","clientY","svg","rect","x","y","anchorById","useMemo","a","onPointerDown","world","snapped","snapAngle","onPointerMove","prev","onPointerUp","moved","near","finishPolygon","geometry","jsxs","z","jsx","shape","p","e","edge","b","anchor","selected","nearWeld","id","other","TABS","LeftRail","tab","onTabChange","draft","activeLevelId","onSelectLevel","canFloors","canSettings","onImportSvg","onAutoroute","onThemeChange","l","file","_a","s","key","label","SHAPE_KINDS","UNIT_STATUSES","Inspector","assignment","amenities","canEdit","onRename","onChangeKind","onSaveAssignment","undoCount","setKey","retailerId","setRetailerId","amenityId","setAmenityId","_b","kioskId","setKioskId","_c","unitStatus","setUnitStatus","unitNumber","setUnitNumber","customLabel","setCustomLabel","useEffect","k","Fragment","PreviewOverlay","document","Suspense","MapViewer","MapEditor","onBatch","onPublish","previewDocument","className","setTab","setActiveLevelId","setSelectedShapeId","setSelectedAnchorIds","setTool","preview","setPreview","setBaseAngle","undoStack","setUndoStack","pendingOps","DEFAULT_THEME","activeLevel","levelShapes","levelAnchors","levelEdges","selectedShape","selectedAssignment","flushOps","useCallback","ops","handleWeldSelected","result","weldAnchors","handleRenameShape","handleChangeKind","kind","partial","t","point","prevAnchorId","anchorId"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/editor/portalSurface.ts","../../src/editor/history.ts","../../src/editor/tools.tsx","../../src/editor/pathRings.ts","../../src/editor/geometryEdit.ts","../../src/editor/splitJoin.ts","../../src/editor/snapPoint.ts","../../src/editor/labelText.ts","../../src/editor/canvas/coords.ts","../../src/editor/canvas/editorFill.ts","../../src/editor/canvas/editorHover.ts","../../src/editor/canvas/OutdoorSvgUnderlay.tsx","../../src/editor/canvas/underlayHint.ts","../../src/editor/routeStubs.ts","../../src/editor/canvas/EditorCanvas.tsx","../../src/editor/connectorAssignments.ts","../../src/editor/draftOps.ts","../../src/editor/panels/ConnectorAssign.tsx","../../src/editor/hexColor.ts","../../src/editor/labels.ts","../../src/editor/railAssignments.ts","../../src/editor/panels/FloorsPanel.tsx","../../src/editor/panels/LeftRail.tsx","../../src/editor/panels/Inspector.tsx","../../src/editor/panels/PreviewOverlay.tsx","../../src/editor/previewDocument.ts","../../src/editor/editorSectionReturn.ts","../../src/editor/floorsListReturn.ts","../../src/editor/MapEditor.tsx","../../src/editor/panels/ImportReviewPanel.tsx"],"sourcesContent":["import {\n floorSwitcherLevels,\n type MapEditorHost,\n type StackLevel,\n} from '../core';\nimport type { RailSection } from './panels/LeftRail';\n\n/** What occupies the PORTAL center pane (rail is always Map options). */\nexport type PortalCenterSurface = 'viewer' | 'editor';\n\n/** Geometry canvas: Edit Map (shapes) or Wayfinding (routes). */\nexport function isEditorSection(section: RailSection | null): boolean {\n return section === 'edit-map' || section === 'wayfinding';\n}\n\n/**\n * PORTAL default is MapViewer (assign on the real map, no editor grid).\n * Edit Map and Wayfinding swap in EditorCanvas + grid. Non-PORTAL editor\n * hosts stay on the geometry canvas.\n */\nexport function portalCenterSurface(\n host: MapEditorHost,\n section: RailSection | null,\n): PortalCenterSurface {\n if (host === 'PORTAL' && !isEditorSection(section)) return 'viewer';\n return 'editor';\n}\n\n/** Building floors only — Outdoor is not routed. */\nexport function wayfindingSelectableLevels<T extends StackLevel>(levels: T[]): T[] {\n return floorSwitcherLevels(levels);\n}\n\n/** Floors in admin list order, then Outdoor at the bottom. */\nexport function editMapSelectableLevels<T extends StackLevel>(levels: T[]): T[] {\n const outdoor = levels.filter((level) => level.kind === 'outdoor');\n return [...floorSwitcherLevels(levels), ...outdoor];\n}\n\n/** Lowest building floor (bottom of the Floors list). */\nexport function defaultEditorFloorId(levels: StackLevel[]): number | null {\n return floorSwitcherLevels(levels).at(-1)?.id ?? null;\n}\n\n/**\n * Wayfinding always opens on the ground floor (bottom of the Floors list),\n * not Outdoor or the floor last used in Edit Map.\n */\nexport function levelIdOnEnterWayfinding(levels: StackLevel[]): number | null {\n return (\n defaultEditorFloorId(levels) ??\n levels.find((level) => level.kind === 'outdoor')?.id ??\n null\n );\n}\n\n/** Edit Map opens on the lowest building floor; Outdoor only if there are no floors. */\nexport function levelIdOnEnterEditMap(levels: StackLevel[]): number | null {\n return (\n defaultEditorFloorId(levels) ??\n levels.find((level) => level.kind === 'outdoor')?.id ??\n null\n );\n}\n\n/** Top-right floor switcher: floors, then Outdoor. Same list in Edit Map and Wayfinding. */\nexport function editorFloorControlLevels<T extends StackLevel & { name: string }>(\n _section: RailSection | null,\n levels: T[],\n): Array<{ id: number; name: string }> {\n return editMapSelectableLevels(levels).map((level) => ({\n id: level.id,\n name: level.kind === 'outdoor' ? 'Outdoor' : level.name,\n }));\n}\n\n/** Outdoor can be viewed in Wayfinding but routes and drawing stay off. */\nexport function wayfindingOutdoorReadOnly(\n section: RailSection | null,\n level: { kind?: string } | null | undefined,\n): boolean {\n return section === 'wayfinding' && level?.kind === 'outdoor';\n}\n","import type { BatchOp } from '../core';\n\nexport const EDITOR_HISTORY_LIMIT = 100;\n\nexport type EditorHistorySnapshot = {\n ops: BatchOp[];\n nextTempId: number;\n selectedShapeId: number | null;\n selectedAnchorIds: number[];\n};\n\nexport type EditorHistory = {\n past: EditorHistorySnapshot[];\n future: EditorHistorySnapshot[];\n};\n\nexport function emptyEditorHistory(): EditorHistory {\n return { past: [], future: [] };\n}\n\nexport function cloneHistorySnapshot(\n snapshot: EditorHistorySnapshot,\n): EditorHistorySnapshot {\n return {\n ops: snapshot.ops.map((op) => JSON.parse(JSON.stringify(op)) as BatchOp),\n nextTempId: snapshot.nextTempId,\n selectedShapeId: snapshot.selectedShapeId,\n selectedAnchorIds: [...snapshot.selectedAnchorIds],\n };\n}\n\nexport function pushEditorHistory(\n history: EditorHistory,\n current: EditorHistorySnapshot,\n): EditorHistory {\n return {\n past: [...history.past, cloneHistorySnapshot(current)].slice(-EDITOR_HISTORY_LIMIT),\n future: [],\n };\n}\n\nexport function undoEditorHistory(\n history: EditorHistory,\n current: EditorHistorySnapshot,\n): { history: EditorHistory; restored: EditorHistorySnapshot } | null {\n if (history.past.length === 0) return null;\n const restored = history.past[history.past.length - 1];\n return {\n history: {\n past: history.past.slice(0, -1),\n future: [...history.future, cloneHistorySnapshot(current)],\n },\n restored: cloneHistorySnapshot(restored),\n };\n}\n\nexport function redoEditorHistory(\n history: EditorHistory,\n current: EditorHistorySnapshot,\n): { history: EditorHistory; restored: EditorHistorySnapshot } | null {\n if (history.future.length === 0) return null;\n const restored = history.future[history.future.length - 1];\n return {\n history: {\n past: [...history.past, cloneHistorySnapshot(current)],\n future: history.future.slice(0, -1),\n },\n restored: cloneHistorySnapshot(restored),\n };\n}\n\nexport function isEditableTypingTarget(target: EventTarget | null): boolean {\n if (target == null || typeof target !== 'object') return false;\n const el = target as { tagName?: string; isContentEditable?: boolean };\n const tag = el.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true;\n return Boolean(el.isContentEditable);\n}\n\ntype HotkeyEvent = Pick<\n KeyboardEvent,\n 'key' | 'metaKey' | 'ctrlKey' | 'shiftKey' | 'altKey'\n>;\n\n/** Ctrl/Cmd+Z — Windows, Linux, and macOS undo. */\nexport function isEditorUndoHotkey(e: HotkeyEvent): boolean {\n if (e.altKey || e.shiftKey) return false;\n if (!(e.metaKey || e.ctrlKey)) return false;\n return e.key === 'z' || e.key === 'Z';\n}\n\n/** Ctrl/Cmd+Shift+Z or Ctrl/Cmd+Y — redo on every desktop OS. */\nexport function isEditorRedoHotkey(e: HotkeyEvent): boolean {\n if (e.altKey) return false;\n if (!(e.metaKey || e.ctrlKey)) return false;\n const key = e.key.toLowerCase();\n if (key === 'z' && e.shiftKey) return true;\n return key === 'y' && !e.shiftKey;\n}\n","import React from 'react';\n\nexport type EditorTool =\n | 'select'\n | 'pan'\n | 'draw-unit'\n | 'draw-polygon'\n | 'draw-line'\n | 'curve'\n | 'split-join'\n | 'draw-text'\n | 'draw-route'\n | 'create-route'\n | 'create-route-multi';\n\nexport const EDITOR_TOOLS: Array<{\n id: EditorTool;\n label: string;\n draw?: boolean;\n /** Route tools sit after a separator, apart from shape tools. */\n group?: 'map' | 'route';\n /** When set, the label is shown beside the icon instead of only as a tooltip. */\n caption?: string;\n}> = [\n { id: 'select', label: 'Select', group: 'map' },\n { id: 'pan', label: 'Pan', group: 'map' },\n { id: 'draw-unit', label: 'Draw rectangle', draw: true, group: 'map' },\n { id: 'draw-polygon', label: 'Draw polygon', draw: true, group: 'map' },\n { id: 'draw-line', label: 'Draw line', draw: true, group: 'map' },\n { id: 'curve', label: 'Curve', draw: true, group: 'map' },\n { id: 'split-join', label: 'Split / Join', draw: true, group: 'map' },\n { id: 'draw-text', label: 'Text', draw: true, group: 'map' },\n {\n id: 'draw-route',\n label: 'Wayfinding Routes',\n draw: true,\n group: 'route',\n },\n {\n id: 'create-route',\n label: 'Create Route',\n draw: true,\n group: 'route',\n },\n {\n id: 'create-route-multi',\n label: 'Multi Route',\n draw: true,\n group: 'route',\n },\n];\n\nexport function isRouteTool(tool: string): boolean {\n return (\n tool === 'draw-route' ||\n tool === 'create-route' ||\n tool === 'create-route-multi'\n );\n}\n\n/** Empty-canvas clicks start a new path with Create Route or Multi Route. */\nexport function canPlaceNewRoute(tool: string): boolean {\n return tool === 'create-route' || tool === 'create-route-multi';\n}\n\n/** Multi Route keeps adding segments until Esc or another tool. */\nexport function canChainRoute(tool: string): boolean {\n return tool === 'create-route-multi';\n}\n\n/** After a segment is committed, keep the end only for Multi Route. */\nexport function nextRouteChainAnchor(\n tool: string,\n endAnchorId: number | null | undefined,\n): number | null {\n if (!canChainRoute(tool)) return null;\n return typeof endAnchorId === 'number' ? endAnchorId : null;\n}\n\nconst ICON_PROPS = {\n width: 16,\n height: 16,\n viewBox: '0 0 16 16',\n fill: 'none',\n 'aria-hidden': true,\n} as const;\n\nfunction SelectIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M3.2 2.4 12.4 8.1l-4.1.6 1.8 4.6-1.8.7-1.8-4.6-2.6 2.4z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\nfunction PanIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M4.15 8.05V6.7a.95.95 0 0 1 1.9 0V8.15M6.05 7.2V4.1a.95.95 0 1 1 1.9 0V7.05M7.95 6.9V3.2a.95.95 0 1 1 1.9 0V6.95M9.85 7V3.9a.95.95 0 1 1 1.9 0v5.05c0 2.05-1.5 3.4-3.6 3.4-1.75 0-3.15-1.05-3.35-2.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.45\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction DrawRectIcon() {\n return (\n <svg {...ICON_PROPS}>\n <rect\n x=\"2.5\"\n y=\"3.5\"\n width=\"11\"\n height=\"9\"\n rx=\"1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n />\n </svg>\n );\n}\n\nfunction DrawPolygonIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M8 2.5 13.2 6.2 11.2 12.5H4.8L2.8 6.2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction DrawLineIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M3 12.5 13 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"3\" cy=\"12.5\" r=\"1.4\" fill=\"currentColor\" />\n <circle cx=\"13\" cy=\"3.5\" r=\"1.4\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction CurveIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M2.5 12C5.8 12 10.2 4 13.5 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.55\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M2.5 12H5.6M13.5 4H10.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.15\"\n strokeLinecap=\"round\"\n opacity=\"0.75\"\n />\n <circle cx=\"2.5\" cy=\"12\" r=\"1.35\" fill=\"currentColor\" />\n <circle cx=\"13.5\" cy=\"4\" r=\"1.35\" fill=\"currentColor\" />\n <circle\n cx=\"5.6\"\n cy=\"12\"\n r=\"1.15\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.15\"\n />\n <circle\n cx=\"10.4\"\n cy=\"4\"\n r=\"1.15\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.15\"\n />\n </svg>\n );\n}\n\nfunction SplitJoinIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M1.7 8H5.2M10.8 8h3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.55\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"6.15\" cy=\"8\" r=\"1.25\" fill=\"currentColor\" />\n <circle cx=\"9.85\" cy=\"8\" r=\"1.25\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction DrawTextIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M3 4.2h10M8 4.2V13\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M5.2 13h5.6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction DrawRouteIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M3.5 12.5c2.2-3.4 3.2-3.6 4.5-3.6 1.6 0 2.2 1.8 4.5 1.8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"3.5\" cy=\"12.5\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"8\" cy=\"8.9\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"12.5\" cy=\"10.7\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction CreateRouteIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M2.8 12c1.7-2.6 3-3.3 4.8-3.3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"2.8\" cy=\"12\" r=\"1.35\" fill=\"currentColor\" />\n <path\n d=\"M11.2 3.4v6.2M8.1 6.5h6.2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction CreateRouteMultiIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M2.8 12.2 6.2 6.4 9.6 9.6 13.2 3.6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"2.8\" cy=\"12.2\" r=\"1.35\" fill=\"currentColor\" />\n <circle cx=\"6.2\" cy=\"6.4\" r=\"1.35\" fill=\"currentColor\" />\n <circle cx=\"9.6\" cy=\"9.6\" r=\"1.35\" fill=\"currentColor\" />\n <circle cx=\"13.2\" cy=\"3.6\" r=\"1.35\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction UndoIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M3.5 7.5H9a3.5 3.5 0 1 1 0 7H7.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M6 4.5 3 7.5 6 10.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction RedoIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M12.5 7.5H7a3.5 3.5 0 1 0 0 7h1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M10 4.5 13 7.5 10 10.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nconst TOOL_ICONS: Record<EditorTool, () => React.ReactElement> = {\n select: SelectIcon,\n pan: PanIcon,\n 'draw-unit': DrawRectIcon,\n 'draw-polygon': DrawPolygonIcon,\n 'draw-line': DrawLineIcon,\n curve: CurveIcon,\n 'split-join': SplitJoinIcon,\n 'draw-text': DrawTextIcon,\n 'draw-route': DrawRouteIcon,\n 'create-route': CreateRouteIcon,\n 'create-route-multi': CreateRouteMultiIcon,\n};\n\n/** Select and Curve can click a shape to make it the edit target. */\nexport function canSelectShapes(tool: EditorTool): boolean {\n return tool === 'select' || tool === 'curve' || tool === 'split-join';\n}\n\nexport function isSplitJoinTool(tool: EditorTool): boolean {\n return tool === 'split-join';\n}\n\n/** Click two open ends to join them — Select after a split, or Split / Join. */\nexport function canJoinOpenEnds(tool: EditorTool): boolean {\n return tool === 'select' || tool === 'split-join';\n}\n\n/** Corner anchors — Select, Curve, and Split / Join. */\nexport function showsShapeAnchors(tool: EditorTool): boolean {\n return tool === 'select' || tool === 'curve' || tool === 'split-join';\n}\n\n/** Midpoint bend dots and cubic handles — only the Curve tool. */\nexport function showsCurveHandles(tool: EditorTool): boolean {\n return tool === 'curve';\n}\n\n/** Empty-canvas drag pans in Select, Curve, Pan, and Wayfinding edit. */\nexport function emptyCanvasDragPans(tool: EditorTool): boolean {\n return (\n tool === 'select' ||\n tool === 'curve' ||\n tool === 'split-join' ||\n tool === 'pan' ||\n tool === 'draw-route'\n );\n}\n\n/** Create Route or Multi Route again returns to Select. */\nexport function nextEditorTool(current: EditorTool, next: EditorTool): EditorTool {\n if (next === current && canPlaceNewRoute(next)) return 'select';\n return next;\n}\n\nexport function toolHint(tool: EditorTool): string {\n switch (tool) {\n case 'pan':\n return 'Drag the map to move around.';\n case 'draw-unit':\n return 'Click and drag to draw a store rectangle.';\n case 'draw-polygon':\n return 'Click to place points. Hover an existing anchor to snap to it. Click the first point or press Enter to close. Esc cancels.';\n case 'draw-line':\n return 'Click and drag to draw a line.';\n case 'curve':\n return 'Select a shape to see its anchors. Drag a midpoint to pull an arch, then use the two handles to fine-tune. Double-click a handle to flatten it back to a line.';\n case 'split-join':\n return 'Click a wall to split it open. Click an open end to switch to Select and join it to another end. To merge, click the shared wall on each store.';\n case 'draw-text':\n return 'Click the map to place text. Select it to edit the wording.';\n case 'draw-route':\n return '';\n case 'create-route':\n return 'Click two points to create one route. Click two more to add another. Esc or Undo steps back.';\n case 'create-route-multi':\n return 'Keep clicking to add connected routes. Esc or Undo steps back without changing the tool.';\n case 'select':\n default:\n return 'Click a shape to select it. Drag empty space to pan. Drag a shape to move it. Hover a side to highlight it, then click to add an anchor. Click and drag a side to move both ends and expand the shape. Double-click an anchor to delete it. Click two open endpoints to join them.';\n }\n}\n\nexport interface EditorToolButtonsProps {\n tool: EditorTool;\n onToolChange: (tool: EditorTool) => void;\n canEdit: boolean;\n /** Omit to show every tool. PORTAL Edit Map is `map`; Wayfinding is `route`. */\n group?: 'map' | 'route';\n}\n\nexport function EditorToolButtons({\n tool,\n onToolChange,\n canEdit,\n group,\n}: EditorToolButtonsProps) {\n const mapTools = EDITOR_TOOLS.filter((t) => t.group !== 'route');\n const routeTools = EDITOR_TOOLS.filter(\n (t) => t.group === 'route' && t.id !== 'draw-route',\n );\n const showMap = group !== 'route';\n const showRoute = group !== 'map';\n const selectTool = EDITOR_TOOLS.find((t) => t.id === 'select');\n const routeToolbar =\n group === 'route' && selectTool ? [selectTool, ...routeTools] : routeTools;\n\n const renderButton = (t: (typeof EDITOR_TOOLS)[number]) => {\n const Icon = TOOL_ICONS[t.id];\n return (\n <button\n key={t.id}\n type=\"button\"\n className={`eyeon-map-editor__tool-icon${t.caption ? ' eyeon-map-editor__tool-icon--labeled' : ''}${tool === t.id ? ' is-active' : ''}`}\n data-tooltip={t.caption ? undefined : t.label}\n aria-label={t.label}\n aria-pressed={tool === t.id}\n onClick={() => onToolChange(t.id)}\n disabled={!canEdit && t.draw}\n >\n <Icon />\n {t.caption ? (\n <span className=\"eyeon-map-editor__tool-caption\">{t.caption}</span>\n ) : null}\n </button>\n );\n };\n\n return (\n <div className=\"eyeon-map-editor__tool-icons\" role=\"toolbar\" aria-label=\"Map tools\">\n {showMap ? mapTools.map(renderButton) : null}\n {showMap && showRoute ? (\n <span className=\"eyeon-map-editor__tool-sep\" aria-hidden=\"true\" />\n ) : null}\n {showRoute ? routeToolbar.map(renderButton) : null}\n </div>\n );\n}\n\nexport interface EditorHistoryButtonsProps {\n canUndo: boolean;\n canRedo: boolean;\n disabled?: boolean;\n onUndo: () => void;\n onRedo: () => void;\n}\n\nexport function EditorHistoryButtons({\n canUndo,\n canRedo,\n disabled = false,\n onUndo,\n onRedo,\n}: EditorHistoryButtonsProps) {\n return (\n <div className=\"eyeon-map-editor__history\" role=\"group\" aria-label=\"Undo and redo\">\n <button\n type=\"button\"\n className=\"eyeon-map-editor__tool-icon\"\n data-tooltip=\"Undo\"\n aria-label=\"Undo\"\n onClick={onUndo}\n disabled={disabled || !canUndo}\n >\n <UndoIcon />\n </button>\n <button\n type=\"button\"\n className=\"eyeon-map-editor__tool-icon\"\n data-tooltip=\"Redo\"\n aria-label=\"Redo\"\n onClick={onRedo}\n disabled={disabled || !canRedo}\n >\n <RedoIcon />\n </button>\n </div>\n );\n}\n","import type { ShapeGeometry, Vec2 } from '../core';\nimport {\n approximateCubic,\n buildGeometryFromPaths,\n distance,\n projectOntoSegment,\n tokenizePathData,\n} from '../core';\n\nexport type PathEdge =\n | { kind: 'line' }\n | { kind: 'cubic'; c1: Vec2; c2: Vec2 };\n\n/** One closed or open subpath as corner anchors + one edge between each pair. */\nexport interface PathRing {\n closed: boolean;\n anchors: Vec2[];\n /** `edges[i]` runs from `anchors[i]` to the next anchor (wraps when closed). */\n edges: PathEdge[];\n}\n\nconst EPS = 1e-4;\n\nexport function vecEq(a: Vec2, b: Vec2, eps = EPS): boolean {\n return Math.abs(a.x - b.x) <= eps && Math.abs(a.y - b.y) <= eps;\n}\n\nexport function cloneVec(p: Vec2): Vec2 {\n return { x: p.x, y: p.y };\n}\n\nexport function addVec(a: Vec2, b: Vec2): Vec2 {\n return { x: a.x + b.x, y: a.y + b.y };\n}\n\nexport function subVec(a: Vec2, b: Vec2): Vec2 {\n return { x: a.x - b.x, y: a.y - b.y };\n}\n\nexport function scaleVec(a: Vec2, s: number): Vec2 {\n return { x: a.x * s, y: a.y * s };\n}\n\nexport function lerpVec(a: Vec2, b: Vec2, t: number): Vec2 {\n return { x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t };\n}\n\nexport function edgeCount(ring: PathRing): number {\n if (ring.anchors.length < 2) return 0;\n return ring.closed ? ring.anchors.length : ring.anchors.length - 1;\n}\n\nexport function edgeFrom(ring: PathRing, edgeIndex: number): Vec2 {\n return ring.anchors[edgeIndex];\n}\n\nexport function edgeTo(ring: PathRing, edgeIndex: number): Vec2 {\n return ring.anchors[(edgeIndex + 1) % ring.anchors.length];\n}\n\nexport function edgeToPathD(ring: PathRing, edgeIndex: number): string {\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex];\n if (edge?.kind === 'cubic') {\n return `M ${from.x} ${from.y} C ${edge.c1.x} ${edge.c1.y} ${edge.c2.x} ${edge.c2.y} ${to.x} ${to.y}`;\n }\n return `M ${from.x} ${from.y} L ${to.x} ${to.y}`;\n}\n\nexport function fmtCoord(n: number): string {\n const r = Math.round(n * 1000) / 1000;\n return Object.is(r, -0) ? '0' : String(r);\n}\n\nexport function ringFromPolygon(poly: Vec2[], closed = true): PathRing {\n const anchors = poly.map(cloneVec);\n if (\n anchors.length > 1 &&\n vecEq(anchors[0], anchors[anchors.length - 1])\n ) {\n anchors.pop();\n }\n const edges: PathEdge[] = anchors.map(() => ({ kind: 'line' }));\n if (!closed && edges.length > 0) edges.pop();\n return { closed, anchors, edges };\n}\n\n/**\n * Quadratic (p0, q, p2) → cubic handles.\n */\nexport function quadraticToCubic(p0: Vec2, q: Vec2, p2: Vec2): {\n c1: Vec2;\n c2: Vec2;\n} {\n return {\n c1: lerpVec(p0, q, 2 / 3),\n c2: lerpVec(p2, q, 2 / 3),\n };\n}\n\n/**\n * Symmetric cubic that passes through `pull` at t = 0.5.\n * Used when the user drags a straight side into an arch.\n */\nexport function cubicHandlesForPull(from: Vec2, to: Vec2, pull: Vec2): {\n c1: Vec2;\n c2: Vec2;\n} {\n const mid = lerpVec(from, to, 0.5);\n const offset = scaleVec(subVec(pull, mid), 4 / 3);\n const chord = subVec(to, from);\n return {\n c1: addVec(addVec(from, scaleVec(chord, 1 / 3)), offset),\n c2: addVec(addVec(from, scaleVec(chord, 2 / 3)), offset),\n };\n}\n\nexport function cubicPoint(p0: Vec2, c1: Vec2, c2: Vec2, p3: Vec2, t: number): Vec2 {\n const u = 1 - t;\n return {\n x: u * u * u * p0.x + 3 * u * u * t * c1.x + 3 * u * t * t * c2.x + t * t * t * p3.x,\n y: u * u * u * p0.y + 3 * u * u * t * c1.y + 3 * u * t * t * c2.y + t * t * t * p3.y,\n };\n}\n\nexport function splitCubic(\n p0: Vec2,\n c1: Vec2,\n c2: Vec2,\n p3: Vec2,\n t: number,\n): {\n left: { c1: Vec2; c2: Vec2; to: Vec2 };\n right: { c1: Vec2; c2: Vec2; to: Vec2 };\n} {\n const a = lerpVec(p0, c1, t);\n const b = lerpVec(c1, c2, t);\n const c = lerpVec(c2, p3, t);\n const d = lerpVec(a, b, t);\n const e = lerpVec(b, c, t);\n const mid = lerpVec(d, e, t);\n return {\n left: { c1: a, c2: d, to: mid },\n right: { c1: e, c2: c, to: p3 },\n };\n}\n\n/**\n * Split an SVG elliptical arc into cubics (one per ≤90° sweep) so Edit Map\n * can treat each arch as two anchors + two handles.\n */\nexport function ellipticalArcToCubics(\n p0: Vec2,\n rx: number,\n ry: number,\n xAxisRotationDeg: number,\n largeArc: boolean,\n sweep: boolean,\n p1: Vec2,\n): Array<{ c1: Vec2; c2: Vec2; to: Vec2 }> {\n if (vecEq(p0, p1)) return [];\n let arx = Math.abs(rx);\n let ary = Math.abs(ry);\n if (arx === 0 || ary === 0 || !Number.isFinite(arx) || !Number.isFinite(ary)) {\n return [];\n }\n\n const phi = ((xAxisRotationDeg % 360) * Math.PI) / 180;\n const cosPhi = Math.cos(phi);\n const sinPhi = Math.sin(phi);\n const dx2 = (p0.x - p1.x) / 2;\n const dy2 = (p0.y - p1.y) / 2;\n const x1p = cosPhi * dx2 + sinPhi * dy2;\n const y1p = -sinPhi * dx2 + cosPhi * dy2;\n const lambda = (x1p * x1p) / (arx * arx) + (y1p * y1p) / (ary * ary);\n if (lambda > 1) {\n const scale = Math.sqrt(lambda);\n arx *= scale;\n ary *= scale;\n }\n const rxSq = arx * arx;\n const rySq = ary * ary;\n const numerator = rxSq * rySq - rxSq * y1p * y1p - rySq * x1p * x1p;\n const denominator = rxSq * y1p * y1p + rySq * x1p * x1p;\n const factor =\n Math.sqrt(Math.max(0, numerator / denominator)) * (largeArc === sweep ? -1 : 1);\n const cxp = (factor * arx * y1p) / ary;\n const cyp = (-factor * ary * x1p) / arx;\n const cx = cosPhi * cxp - sinPhi * cyp + (p0.x + p1.x) / 2;\n const cy = sinPhi * cxp + cosPhi * cyp + (p0.y + p1.y) / 2;\n const ux = (x1p - cxp) / arx;\n const uy = (y1p - cyp) / ary;\n const vx = (-x1p - cxp) / arx;\n const vy = (-y1p - cyp) / ary;\n const theta1 = Math.atan2(uy, ux);\n let deltaTheta = Math.atan2(ux * vy - uy * vx, ux * vx + uy * vy);\n if (!sweep && deltaTheta > 0) deltaTheta -= 2 * Math.PI;\n else if (sweep && deltaTheta < 0) deltaTheta += 2 * Math.PI;\n\n const ellipsePoint = (theta: number): Vec2 => {\n const cosT = Math.cos(theta);\n const sinT = Math.sin(theta);\n return {\n x: cx + arx * cosPhi * cosT - ary * sinPhi * sinT,\n y: cy + arx * sinPhi * cosT + ary * cosPhi * sinT,\n };\n };\n const ellipseDeriv = (theta: number): Vec2 => {\n const cosT = Math.cos(theta);\n const sinT = Math.sin(theta);\n const dx = -arx * sinT;\n const dy = ary * cosT;\n return {\n x: cosPhi * dx - sinPhi * dy,\n y: sinPhi * dx + cosPhi * dy,\n };\n };\n\n const out: Array<{ c1: Vec2; c2: Vec2; to: Vec2 }> = [];\n let t0 = theta1;\n let remaining = deltaTheta;\n while (Math.abs(remaining) > 1e-8) {\n const step =\n Math.sign(remaining) * Math.min(Math.abs(remaining), Math.PI / 2);\n const t1 = t0 + step;\n const k = (4 / 3) * Math.tan(step / 4);\n const start = ellipsePoint(t0);\n const end = ellipsePoint(t1);\n const d0 = ellipseDeriv(t0);\n const d1 = ellipseDeriv(t1);\n out.push({\n c1: { x: start.x + k * d0.x, y: start.y + k * d0.y },\n c2: { x: end.x - k * d1.x, y: end.y - k * d1.y },\n to: end,\n });\n t0 = t1;\n remaining -= step;\n }\n if (out.length > 0) {\n out[out.length - 1].to = cloneVec(p1);\n }\n return out;\n}\n\nexport function parsePathToRings(d: string): PathRing[] {\n const tokens = tokenizePathData(d);\n const rings: PathRing[] = [];\n let anchors: Vec2[] = [];\n let edges: PathEdge[] = [];\n let x = 0;\n let y = 0;\n let startX = 0;\n let startY = 0;\n let lastCtrl: Vec2 | null = null;\n let i = 0;\n let cmd = '';\n let started = false;\n\n const readNum = () => Number(tokens[i++]);\n\n const flush = (closed: boolean) => {\n if (\n closed &&\n anchors.length > 1 &&\n vecEq(anchors[0], anchors[anchors.length - 1])\n ) {\n anchors.pop();\n }\n const expected = closed ? anchors.length : Math.max(0, anchors.length - 1);\n while (edges.length > expected) edges.pop();\n while (edges.length < expected) edges.push({ kind: 'line' });\n if (anchors.length >= 2) {\n rings.push({\n closed,\n anchors: anchors.map(cloneVec),\n edges: edges.map((edge) =>\n edge.kind === 'line'\n ? { kind: 'line' }\n : { kind: 'cubic', c1: cloneVec(edge.c1), c2: cloneVec(edge.c2) },\n ),\n });\n }\n anchors = [];\n edges = [];\n started = false;\n };\n\n const pushAnchor = (p: Vec2): boolean => {\n if (anchors.length > 0 && vecEq(anchors[anchors.length - 1], p)) return false;\n anchors.push(cloneVec(p));\n return true;\n };\n\n while (i < tokens.length) {\n const t = tokens[i];\n if (/[a-zA-Z]/.test(t)) {\n cmd = t;\n i++;\n }\n\n switch (cmd) {\n case 'M':\n case 'm': {\n const isRel = cmd === 'm';\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n if (started) flush(false);\n x = nx;\n y = ny;\n startX = x;\n startY = y;\n pushAnchor({ x, y });\n started = true;\n lastCtrl = null;\n cmd = isRel ? 'l' : 'L';\n break;\n }\n case 'L':\n case 'l': {\n const isRel = cmd === 'l';\n x = isRel ? x + readNum() : readNum();\n y = isRel ? y + readNum() : readNum();\n if (pushAnchor({ x, y })) edges.push({ kind: 'line' });\n lastCtrl = null;\n break;\n }\n case 'H':\n case 'h': {\n x = cmd === 'h' ? x + readNum() : readNum();\n if (pushAnchor({ x, y })) edges.push({ kind: 'line' });\n lastCtrl = null;\n break;\n }\n case 'V':\n case 'v': {\n y = cmd === 'v' ? y + readNum() : readNum();\n if (pushAnchor({ x, y })) edges.push({ kind: 'line' });\n lastCtrl = null;\n break;\n }\n case 'C':\n case 'c': {\n const isRel = cmd === 'c';\n const x1 = isRel ? x + readNum() : readNum();\n const y1 = isRel ? y + readNum() : readNum();\n const x2 = isRel ? x + readNum() : readNum();\n const y2 = isRel ? y + readNum() : readNum();\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n if (pushAnchor({ x: nx, y: ny })) {\n edges.push({\n kind: 'cubic',\n c1: { x: x1, y: y1 },\n c2: { x: x2, y: y2 },\n });\n }\n lastCtrl = { x: x2, y: y2 };\n x = nx;\n y = ny;\n break;\n }\n case 'S':\n case 's': {\n const isRel = cmd === 's';\n const c1 = lastCtrl\n ? { x: 2 * x - lastCtrl.x, y: 2 * y - lastCtrl.y }\n : { x, y };\n const x2 = isRel ? x + readNum() : readNum();\n const y2 = isRel ? y + readNum() : readNum();\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n if (pushAnchor({ x: nx, y: ny })) {\n edges.push({\n kind: 'cubic',\n c1,\n c2: { x: x2, y: y2 },\n });\n }\n lastCtrl = { x: x2, y: y2 };\n x = nx;\n y = ny;\n break;\n }\n case 'Q':\n case 'q': {\n const isRel = cmd === 'q';\n const qx = isRel ? x + readNum() : readNum();\n const qy = isRel ? y + readNum() : readNum();\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n const { c1, c2 } = quadraticToCubic({ x, y }, { x: qx, y: qy }, { x: nx, y: ny });\n if (pushAnchor({ x: nx, y: ny })) {\n edges.push({ kind: 'cubic', c1, c2 });\n }\n lastCtrl = { x: qx, y: qy };\n x = nx;\n y = ny;\n break;\n }\n case 'T':\n case 't': {\n const isRel = cmd === 't';\n const qx = lastCtrl ? 2 * x - lastCtrl.x : x;\n const qy = lastCtrl ? 2 * y - lastCtrl.y : y;\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n const { c1, c2 } = quadraticToCubic({ x, y }, { x: qx, y: qy }, { x: nx, y: ny });\n if (pushAnchor({ x: nx, y: ny })) {\n edges.push({ kind: 'cubic', c1, c2 });\n }\n lastCtrl = { x: qx, y: qy };\n x = nx;\n y = ny;\n break;\n }\n case 'A':\n case 'a': {\n const isRel = cmd === 'a';\n const rx = readNum();\n const ry = readNum();\n const rot = readNum();\n const largeArc = readNum() !== 0;\n const sweep = readNum() !== 0;\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n const cubics = ellipticalArcToCubics(\n { x, y },\n rx,\n ry,\n rot,\n largeArc,\n sweep,\n { x: nx, y: ny },\n );\n if (cubics.length === 0) {\n if (pushAnchor({ x: nx, y: ny })) edges.push({ kind: 'line' });\n } else {\n for (const cubic of cubics) {\n if (pushAnchor(cubic.to)) {\n edges.push({ kind: 'cubic', c1: cubic.c1, c2: cubic.c2 });\n }\n }\n }\n lastCtrl = null;\n x = nx;\n y = ny;\n break;\n }\n case 'Z':\n case 'z': {\n if (!vecEq({ x, y }, { x: startX, y: startY })) {\n edges.push({ kind: 'line' });\n }\n x = startX;\n y = startY;\n flush(true);\n lastCtrl = null;\n break;\n }\n default:\n i++;\n break;\n }\n }\n\n if (started) flush(false);\n return rings;\n}\n\nexport function ringToPathD(ring: PathRing): string {\n if (ring.anchors.length === 0) return '';\n const a0 = ring.anchors[0];\n let d = `M ${fmtCoord(a0.x)} ${fmtCoord(a0.y)}`;\n const n = edgeCount(ring);\n for (let i = 0; i < n; i++) {\n const to = edgeTo(ring, i);\n const edge = ring.edges[i];\n const closingLine =\n ring.closed && i === n - 1 && (!edge || edge.kind === 'line');\n if (closingLine) continue;\n if (!edge || edge.kind === 'line') {\n d += ` L ${fmtCoord(to.x)} ${fmtCoord(to.y)}`;\n } else {\n d += ` C ${fmtCoord(edge.c1.x)} ${fmtCoord(edge.c1.y)} ${fmtCoord(edge.c2.x)} ${fmtCoord(edge.c2.y)} ${fmtCoord(to.x)} ${fmtCoord(to.y)}`;\n }\n }\n if (ring.closed) d += ' Z';\n return d;\n}\n\nexport function ringsToGeometry(rings: PathRing[]): ShapeGeometry {\n const ds = rings\n .filter((ring) => ring.anchors.length >= 2)\n .map(ringToPathD)\n .filter(Boolean);\n if (ds.length === 0) {\n return { paths: [], polygons: [] };\n }\n const geometry = buildGeometryFromPaths(ds);\n return {\n ...geometry,\n polygons: geometry.polygons.map((poly) =>\n poly.length > 1 && vecEq(poly[0], poly[poly.length - 1])\n ? poly.slice(0, -1)\n : poly,\n ),\n };\n}\n\nconst ARCH_CORNER_RAD = (28 * Math.PI) / 180;\nconst MIN_ARCH_POINTS = 4;\nconst MIN_ARCH_BULGE = 3;\nconst MIN_ARCH_BULGE_RATIO = 0.035;\n/** Wider than a semicircle (0.5) is a loop, not a storefront arch. */\nconst MAX_ARCH_BULGE_RATIO = 0.65;\n\nfunction signedTurn(prev: Vec2, cur: Vec2, next: Vec2): number {\n const ax = cur.x - prev.x;\n const ay = cur.y - prev.y;\n const bx = next.x - cur.x;\n const by = next.y - cur.y;\n return Math.atan2(ax * by - ay * bx, ax * bx + ay * by);\n}\n\nfunction runLooksLikeArch(pts: Vec2[]): boolean {\n if (pts.length < MIN_ARCH_POINTS) return false;\n const a = pts[0];\n const b = pts[pts.length - 1];\n const chord = distance(a, b);\n if (chord < EPS) return false;\n let maxDev = 0;\n let side = 0;\n for (let i = 1; i < pts.length - 1; i++) {\n const proj = projectOntoSegment(pts[i], a, b);\n maxDev = Math.max(maxDev, proj.distance);\n const s = Math.sign(\n (b.x - a.x) * (pts[i].y - a.y) - (b.y - a.y) * (pts[i].x - a.x),\n );\n if (s === 0) continue;\n if (side === 0) side = s;\n else if (s !== side) return false;\n }\n if (maxDev < Math.max(MIN_ARCH_BULGE, chord * MIN_ARCH_BULGE_RATIO)) {\n return false;\n }\n if (maxDev > chord * MAX_ARCH_BULGE_RATIO) {\n return false;\n }\n for (let i = 1; i < pts.length - 1; i++) {\n if (Math.abs(signedTurn(pts[i - 1], pts[i], pts[i + 1])) > ARCH_CORNER_RAD) {\n return false;\n }\n }\n return true;\n}\n\nfunction fitCubicThroughRun(pts: Vec2[]): PathEdge {\n const from = pts[0];\n const to = pts[pts.length - 1];\n let pull = pts[Math.floor(pts.length / 2)];\n let maxDev = 0;\n for (let i = 1; i < pts.length - 1; i++) {\n const d = projectOntoSegment(pts[i], from, to).distance;\n if (d > maxDev) {\n maxDev = d;\n pull = pts[i];\n }\n }\n const { c1, c2 } = cubicHandlesForPull(from, to, pull);\n return { kind: 'cubic', c1, c2 };\n}\n\n/**\n * Designer SVGs often flatten an arch into many short lines. Collapse those\n * runs to one cubic (2 anchors + 2 handles) when the bulge is unambiguous.\n */\nfunction cubicDeviationFromChord(from: Vec2, c1: Vec2, c2: Vec2, to: Vec2): number {\n const samples = approximateCubic(from, c1, c2, to, 16);\n let maxDev = 0;\n for (const point of samples) {\n maxDev = Math.max(maxDev, projectOntoSegment(point, from, to).distance);\n }\n return maxDev;\n}\n\n/** A cubic whose bulge is much longer than its chord is a leftover loop, not an arch. */\nexport function cubicIsRunaway(from: Vec2, c1: Vec2, c2: Vec2, to: Vec2): boolean {\n const chord = distance(from, to);\n const dev = cubicDeviationFromChord(from, c1, c2, to);\n if (chord < EPS) return dev > EPS;\n return dev > chord * MAX_ARCH_BULGE_RATIO;\n}\n\nfunction flattenRunawayCubics(ring: PathRing): PathRing {\n const n = edgeCount(ring);\n let changed = false;\n const edges = ring.edges.map((edge, i) => {\n if (i >= n || edge.kind !== 'cubic') return edge;\n if (!cubicIsRunaway(edgeFrom(ring, i), edge.c1, edge.c2, edgeTo(ring, i))) {\n return edge;\n }\n changed = true;\n return { kind: 'line' as const };\n });\n return changed ? { ...ring, edges } : ring;\n}\n\nexport function collapseLineRunsToCubics(ring: PathRing): PathRing {\n const n = ring.anchors.length;\n if (n < MIN_ARCH_POINTS) return ring;\n const idx = (i: number) => ((i % n) + n) % n;\n\n const incoming = (i: number) =>\n ring.closed ? ring.edges[idx(i - 1)] : i > 0 ? ring.edges[i - 1] : undefined;\n const outgoing = (i: number) =>\n ring.closed ? ring.edges[i] : i < n - 1 ? ring.edges[i] : undefined;\n\n const isSharp = (i: number): boolean => {\n if (!ring.closed && (i === 0 || i === n - 1)) return true;\n if (incoming(i)?.kind === 'cubic' || outgoing(i)?.kind === 'cubic') {\n return true;\n }\n return (\n Math.abs(\n signedTurn(ring.anchors[idx(i - 1)], ring.anchors[i], ring.anchors[idx(i + 1)]),\n ) > ARCH_CORNER_RAD\n );\n };\n\n let start = 0;\n if (ring.closed) {\n const sharp = [...Array(n).keys()].find(isSharp);\n if (sharp == null) return ring;\n start = sharp;\n }\n\n const outA: Vec2[] = [];\n const outE: PathEdge[] = [];\n const walk = ring.closed ? n : n - 1;\n\n const emitRun = (fromW: number, toW: number) => {\n const pts: Vec2[] = [];\n for (let w = fromW; w <= toW; w++) {\n pts.push(ring.anchors[idx(start + w)]);\n }\n const linesOnly = pts.slice(0, -1).every((_, k) => {\n const edge = ring.edges[idx(start + fromW + k)];\n return !edge || edge.kind === 'line';\n });\n if (outA.length === 0) outA.push(cloneVec(pts[0]));\n if (linesOnly && runLooksLikeArch(pts)) {\n outA.push(cloneVec(pts[pts.length - 1]));\n outE.push(fitCubicThroughRun(pts));\n return;\n }\n for (let k = 1; k < pts.length; k++) {\n outA.push(cloneVec(pts[k]));\n outE.push(ring.edges[idx(start + fromW + k - 1)] ?? { kind: 'line' });\n }\n };\n\n let last = 0;\n for (let w = 1; w <= walk; w++) {\n const i = idx(start + w);\n if (w === walk || isSharp(i)) {\n emitRun(last, w);\n last = w;\n }\n }\n\n if (\n ring.closed &&\n outA.length > 1 &&\n vecEq(outA[0], outA[outA.length - 1])\n ) {\n outA.pop();\n }\n const expected = ring.closed ? outA.length : Math.max(0, outA.length - 1);\n while (outE.length > expected) outE.pop();\n if (outA.length < 2) return ring;\n return { closed: ring.closed, anchors: outA, edges: outE };\n}\n\nexport function geometryToRings(geometry: ShapeGeometry): PathRing[] {\n const fromPaths = geometry.paths.flatMap((p) => parsePathToRings(p.d));\n const source = fromPaths.some((ring) => ring.anchors.length >= 2)\n ? fromPaths.filter((ring) => ring.anchors.length >= 2)\n : geometry.polygons\n .filter((poly) => poly.length >= 2)\n .map((poly) => ringFromPolygon(poly, true));\n return source.map((ring) => flattenRunawayCubics(collapseLineRunsToCubics(ring)));\n}\n\n/** Closest point on one ring edge — keeps the add-anchor preview on the line. */\nexport function pointOnRingEdge(ring: PathRing, edgeIndex: number, point: Vec2): Vec2 {\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n if (edge.kind === 'cubic') {\n return nearestTOnCubic(point, from, edge.c1, edge.c2, to).point;\n }\n return projectOntoSegment(point, from, to).point;\n}\n\nexport function nearestTOnCubic(\n point: Vec2,\n p0: Vec2,\n c1: Vec2,\n c2: Vec2,\n p3: Vec2,\n): { t: number; point: Vec2; distance: number } {\n const samples = approximateCubic(p0, c1, c2, p3, 16);\n let bestT = 0;\n let bestPt = samples[0];\n let bestD = distance(point, samples[0]);\n for (let i = 1; i < samples.length; i++) {\n const d = distance(point, samples[i]);\n if (d < bestD) {\n bestD = d;\n bestPt = samples[i];\n bestT = i / (samples.length - 1);\n }\n }\n return { t: bestT, point: bestPt, distance: bestD };\n}\n","import type { ShapeGeometry, Vec2 } from '../core';\nimport { geometryBBox, projectOntoSegment } from '../core';\nimport {\n addVec,\n cloneVec,\n cubicHandlesForPull,\n cubicPoint,\n edgeCount,\n edgeFrom,\n edgeTo,\n geometryToRings,\n nearestTOnCubic,\n ringsToGeometry,\n splitCubic,\n subVec,\n type PathRing,\n} from './pathRings';\n\nfunction clonePolygons(polygons: Vec2[][]): Vec2[][] {\n return polygons.map((poly) => poly.map((p) => ({ x: p.x, y: p.y })));\n}\n\n/** Rebuild absolute path `d` strings from polygon rings (lossy for beziers). */\nexport function polygonsToPathD(polygons: Vec2[][]): string {\n return polygons\n .map((poly) => {\n if (poly.length === 0) return '';\n let d = `M ${poly[0].x} ${poly[0].y}`;\n for (let i = 1; i < poly.length; i++) {\n d += ` L ${poly[i].x} ${poly[i].y}`;\n }\n d += ' Z';\n return d;\n })\n .join(' ');\n}\n\nexport function polygonsToGeometry(polygons: Vec2[][]): ShapeGeometry {\n const cleaned = polygons\n .map((poly) => {\n if (\n poly.length > 1 &&\n poly[0].x === poly[poly.length - 1].x &&\n poly[0].y === poly[poly.length - 1].y\n ) {\n return poly.slice(0, -1);\n }\n return poly;\n })\n .filter((poly) => poly.length >= 3);\n return {\n paths: cleaned.map((poly) => ({\n d: polygonsToPathD([poly]),\n closed: true,\n })),\n polygons: cleaned,\n };\n}\n\nfunction commitRings(rings: PathRing[]): ShapeGeometry {\n return ringsToGeometry(rings);\n}\n\nfunction incomingEdgeIndex(ring: PathRing, anchorIndex: number): number | null {\n if (ring.closed) {\n return (anchorIndex - 1 + ring.anchors.length) % ring.anchors.length;\n }\n return anchorIndex > 0 ? anchorIndex - 1 : null;\n}\n\nfunction outgoingEdgeIndex(ring: PathRing, anchorIndex: number): number | null {\n if (ring.closed) return anchorIndex;\n return anchorIndex < ring.anchors.length - 1 ? anchorIndex : null;\n}\n\nexport function translateGeometry(\n geometry: ShapeGeometry,\n dx: number,\n dy: number,\n): ShapeGeometry {\n const delta = { x: dx, y: dy };\n const rings = geometryToRings(geometry).map((ring) => ({\n closed: ring.closed,\n anchors: ring.anchors.map((p) => addVec(p, delta)),\n edges: ring.edges.map((edge) =>\n edge.kind === 'line'\n ? { kind: 'line' as const }\n : {\n kind: 'cubic' as const,\n c1: addVec(edge.c1, delta),\n c2: addVec(edge.c2, delta),\n },\n ),\n }));\n if (rings.length === 0) {\n const polygons = clonePolygons(geometry.polygons).map((poly) =>\n poly.map((p) => ({ x: p.x + dx, y: p.y + dy })),\n );\n return polygonsToGeometry(polygons);\n }\n return commitRings(rings);\n}\n\n/** Slide one side: both endpoints (and that edge's handles) move together. */\nexport function translateEdge(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n delta: Vec2,\n): ShapeGeometry {\n if (delta.x === 0 && delta.y === 0) return geometry;\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n if (!ring || edgeIndex < 0 || edgeIndex >= edgeCount(ring)) return geometry;\n const fromIdx = edgeIndex;\n const toIdx = (edgeIndex + 1) % ring.anchors.length;\n ring.anchors[fromIdx] = addVec(ring.anchors[fromIdx], delta);\n ring.anchors[toIdx] = addVec(ring.anchors[toIdx], delta);\n const edge = ring.edges[edgeIndex];\n if (edge?.kind === 'cubic') {\n edge.c1 = addVec(edge.c1, delta);\n edge.c2 = addVec(edge.c2, delta);\n }\n const incoming = incomingEdgeIndex(ring, fromIdx);\n if (incoming != null && incoming !== edgeIndex) {\n const prev = ring.edges[incoming];\n if (prev?.kind === 'cubic') prev.c2 = addVec(prev.c2, delta);\n }\n const outgoing = outgoingEdgeIndex(ring, toIdx);\n if (outgoing != null && outgoing !== edgeIndex) {\n const next = ring.edges[outgoing];\n if (next?.kind === 'cubic') next.c1 = addVec(next.c1, delta);\n }\n return commitRings(rings);\n}\n\nexport function moveVertex(\n geometry: ShapeGeometry,\n polygonIndex: number,\n vertexIndex: number,\n point: Vec2,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[polygonIndex];\n if (!ring || vertexIndex < 0 || vertexIndex >= ring.anchors.length) {\n return geometry;\n }\n const prev = ring.anchors[vertexIndex];\n const delta = subVec(point, prev);\n ring.anchors[vertexIndex] = cloneVec(point);\n const incoming = incomingEdgeIndex(ring, vertexIndex);\n const outgoing = outgoingEdgeIndex(ring, vertexIndex);\n if (incoming != null) {\n const edge = ring.edges[incoming];\n if (edge?.kind === 'cubic') edge.c2 = addVec(edge.c2, delta);\n }\n if (outgoing != null) {\n const edge = ring.edges[outgoing];\n if (edge?.kind === 'cubic') edge.c1 = addVec(edge.c1, delta);\n }\n return commitRings(rings);\n}\n\nexport function moveHandle(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n handle: 1 | 2,\n point: Vec2,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n const edge = ring?.edges[edgeIndex];\n if (!edge || edge.kind !== 'cubic') return geometry;\n if (handle === 1) edge.c1 = cloneVec(point);\n else edge.c2 = cloneVec(point);\n return commitRings(rings);\n}\n\n/** Drop both handles so the arch becomes a straight side. */\nexport function flattenCubicEdge(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n const edge = ring?.edges[edgeIndex];\n if (!edge || edge.kind !== 'cubic') return geometry;\n ring.edges[edgeIndex] = { kind: 'line' };\n return commitRings(rings);\n}\n\n/** Pull a straight side into a cubic arch (or reshape a cubic from its chord). */\nexport function bendEdgeToCubic(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n pull: Vec2,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n if (!ring || edgeIndex < 0 || edgeIndex >= edgeCount(ring)) return geometry;\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const { c1, c2 } = cubicHandlesForPull(from, to, pull);\n ring.edges[edgeIndex] = { kind: 'cubic', c1, c2 };\n return commitRings(rings);\n}\n\n/**\n * Insert a vertex after `vertexIndex` on the given ring (before the next point).\n */\nexport function insertVertex(\n geometry: ShapeGeometry,\n polygonIndex: number,\n afterVertexIndex: number,\n point: Vec2,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[polygonIndex];\n if (!ring || afterVertexIndex < 0 || afterVertexIndex >= ring.anchors.length) {\n return geometry;\n }\n const edgeIndex = outgoingEdgeIndex(ring, afterVertexIndex);\n if (edgeIndex == null) return geometry;\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n\n if (edge.kind === 'cubic') {\n const { t } = nearestTOnCubic(point, from, edge.c1, edge.c2, to);\n const splitT = Math.min(0.95, Math.max(0.05, t));\n const split = splitCubic(from, edge.c1, edge.c2, to, splitT);\n ring.anchors.splice(afterVertexIndex + 1, 0, cloneVec(split.left.to));\n ring.edges.splice(edgeIndex, 1, { kind: 'cubic', c1: split.left.c1, c2: split.left.c2 }, {\n kind: 'cubic',\n c1: split.right.c1,\n c2: split.right.c2,\n });\n } else {\n ring.anchors.splice(afterVertexIndex + 1, 0, cloneVec(point));\n ring.edges.splice(edgeIndex, 1, { kind: 'line' }, { kind: 'line' });\n }\n return commitRings(rings);\n}\n\n/** Remove a vertex; refuses to go below 3 points on a closed ring. */\nexport function removeVertex(\n geometry: ShapeGeometry,\n polygonIndex: number,\n vertexIndex: number,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[polygonIndex];\n if (!ring) return geometry;\n const min = ring.closed ? 3 : 2;\n if (ring.anchors.length <= min) return geometry;\n if (vertexIndex < 0 || vertexIndex >= ring.anchors.length) return geometry;\n\n const n = ring.anchors.length;\n if (ring.closed) {\n ring.anchors.splice(vertexIndex, 1);\n ring.edges.splice(vertexIndex, 1);\n const join = vertexIndex === 0 ? ring.anchors.length - 1 : vertexIndex - 1;\n if (ring.edges[join]) ring.edges[join] = { kind: 'line' };\n } else if (vertexIndex === 0) {\n ring.anchors.splice(0, 1);\n ring.edges.splice(0, 1);\n } else if (vertexIndex === n - 1) {\n ring.anchors.pop();\n ring.edges.pop();\n } else {\n ring.anchors.splice(vertexIndex, 1);\n ring.edges.splice(vertexIndex, 1);\n ring.edges[vertexIndex - 1] = { kind: 'line' };\n }\n return commitRings(rings);\n}\n\nexport interface VertexHit {\n polygonIndex: number;\n vertexIndex: number;\n point: Vec2;\n distance: number;\n}\n\n/** Nearest path anchor within `tolerance` world units, or null. */\nexport function hitTestVertex(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n): VertexHit | null {\n let best: VertexHit | null = null;\n geometryToRings(geometry).forEach((ring, polygonIndex) => {\n ring.anchors.forEach((vertex, vertexIndex) => {\n const distance = Math.hypot(vertex.x - point.x, vertex.y - point.y);\n if (distance <= tolerance && (!best || distance < best.distance)) {\n best = {\n polygonIndex,\n vertexIndex,\n point: { x: vertex.x, y: vertex.y },\n distance,\n };\n }\n });\n });\n return best;\n}\n\nexport interface HandleHit {\n ringIndex: number;\n edgeIndex: number;\n handle: 1 | 2;\n point: Vec2;\n distance: number;\n}\n\nexport function hitTestHandle(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n): HandleHit | null {\n let best: HandleHit | null = null;\n geometryToRings(geometry).forEach((ring, ringIndex) => {\n const n = edgeCount(ring);\n for (let edgeIndex = 0; edgeIndex < n; edgeIndex++) {\n const edge = ring.edges[edgeIndex];\n if (edge?.kind !== 'cubic') continue;\n for (const handle of [1, 2] as const) {\n const hp = handle === 1 ? edge.c1 : edge.c2;\n const distance = Math.hypot(hp.x - point.x, hp.y - point.y);\n if (distance <= tolerance && (!best || distance < best.distance)) {\n best = { ringIndex, edgeIndex, handle, point: cloneVec(hp), distance };\n }\n }\n }\n });\n return best;\n}\n\nexport interface EdgeHit {\n polygonIndex: number;\n /** Insert after this vertex index. */\n afterVertexIndex: number;\n point: Vec2;\n distance: number;\n kind: 'line' | 'cubic';\n}\n\nfunction hitEdge(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n preferMidpoint: boolean,\n): EdgeHit | null {\n let best: EdgeHit | null = null;\n geometryToRings(geometry).forEach((ring, polygonIndex) => {\n const n = edgeCount(ring);\n for (let i = 0; i < n; i++) {\n const a = edgeFrom(ring, i);\n const b = edgeTo(ring, i);\n const edge = ring.edges[i] ?? { kind: 'line' as const };\n let candidate: Vec2;\n let dist: number;\n if (preferMidpoint) {\n candidate =\n edge.kind === 'cubic'\n ? cubicPoint(a, edge.c1, edge.c2, b, 0.5)\n : { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n dist = Math.hypot(candidate.x - point.x, candidate.y - point.y);\n } else if (edge.kind === 'cubic') {\n const near = nearestTOnCubic(point, a, edge.c1, edge.c2, b);\n candidate = near.point;\n dist = near.distance;\n } else {\n const proj = projectOntoSegment(point, a, b);\n candidate = proj.point;\n dist = proj.distance;\n }\n if (dist <= tolerance && (!best || dist < best.distance)) {\n best = {\n polygonIndex,\n afterVertexIndex: i,\n point: candidate,\n distance: dist,\n kind: edge.kind,\n };\n }\n }\n });\n return best;\n}\n\n/** Nearest edge midpoint within tolerance for insert. */\nexport function hitTestEdgeMidpoint(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n): EdgeHit | null {\n return hitEdge(geometry, point, tolerance, true);\n}\n\n/** Nearest point on any edge (for dragging a line into an arch). */\nexport function hitTestEdge(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n): EdgeHit | null {\n return hitEdge(geometry, point, tolerance, false);\n}\n\nexport function geometryWithBBox(geometry: ShapeGeometry): {\n geometry: ShapeGeometry;\n bbox: ReturnType<typeof geometryBBox>;\n} {\n return { geometry, bbox: geometryBBox(geometry) };\n}\n\nexport {\n geometryToRings,\n edgeCount,\n edgeFrom,\n edgeTo,\n edgeToPathD,\n pointOnRingEdge,\n ringToPathD,\n} from './pathRings';\nexport type { PathRing, PathEdge } from './pathRings';\n","import type { ShapeGeometry, ShapeKind, ShapeStyle, Vec2 } from '../core';\nimport { DEFAULT_WELD_TOLERANCE, distance, projectOntoSegment } from '../core';\nimport {\n cloneVec,\n edgeCount,\n edgeFrom,\n edgeTo,\n geometryToRings,\n nearestTOnCubic,\n ringsToGeometry,\n splitCubic,\n vecEq,\n type PathEdge,\n type PathRing,\n} from './pathRings';\nimport { hitTestEdge } from './geometryEdit';\n\nconst SHARED_EDGE_TOL = 4;\n\nexport type OpenEndId = {\n shapeId: number;\n ringIndex: number;\n end: 'start' | 'end';\n};\n\nexport type OpenEndHit = OpenEndId & { point: Vec2; distance: number };\n\nexport type SplitJoinEdgeHit = {\n shapeId: number;\n ringIndex: number;\n edgeIndex: number;\n point: Vec2;\n shared: boolean;\n distance: number;\n};\n\nexport type ShapeGeo = {\n id: number;\n kind: ShapeKind;\n style?: ShapeStyle;\n geometry: ShapeGeometry;\n};\n\nexport type ShapeBatchEdit =\n | { action: 'update'; shapeId: number; geometry: ShapeGeometry }\n | {\n action: 'create';\n kind: ShapeKind;\n geometry: ShapeGeometry;\n style?: ShapeStyle;\n }\n | { action: 'delete'; shapeId: number };\n\nexport function canSplitJoinKind(kind: ShapeKind): boolean {\n return kind === 'unit' || kind === 'amenity' || kind === 'parking_zone';\n}\n\nexport function sameOpenEnd(a: OpenEndId, b: OpenEndId): boolean {\n return a.shapeId === b.shapeId && a.ringIndex === b.ringIndex && a.end === b.end;\n}\n\nfunction cloneEdge(edge: PathEdge): PathEdge {\n return edge.kind === 'line'\n ? { kind: 'line' }\n : { kind: 'cubic', c1: cloneVec(edge.c1), c2: cloneVec(edge.c2) };\n}\n\nfunction cloneRing(ring: PathRing): PathRing {\n return {\n closed: ring.closed,\n anchors: ring.anchors.map(cloneVec),\n edges: ring.edges.map(cloneEdge),\n };\n}\n\nfunction reverseEdge(edge: PathEdge): PathEdge {\n if (edge.kind === 'line') return { kind: 'line' };\n return { kind: 'cubic', c1: cloneVec(edge.c2), c2: cloneVec(edge.c1) };\n}\n\nfunction reverseRing(ring: PathRing): PathRing {\n return {\n closed: ring.closed,\n anchors: ring.anchors.map(cloneVec).reverse(),\n edges: ring.edges.map(cloneEdge).reverse().map(reverseEdge),\n };\n}\n\nfunction maybeCloseCoincident(ring: PathRing, tol: number): PathRing {\n if (ring.closed || ring.anchors.length < 3) return ring;\n const first = ring.anchors[0];\n const last = ring.anchors[ring.anchors.length - 1];\n if (!vecEq(first, last, tol)) return ring;\n const next = cloneRing(ring);\n next.anchors.pop();\n next.closed = true;\n const expected = next.anchors.length;\n while (next.edges.length > expected) next.edges.pop();\n while (next.edges.length < expected) next.edges.push({ kind: 'line' });\n return next;\n}\n\nexport function listOpenEnds(geometry: ShapeGeometry): Array<{\n ringIndex: number;\n end: 'start' | 'end';\n point: Vec2;\n}> {\n const out: Array<{ ringIndex: number; end: 'start' | 'end'; point: Vec2 }> = [];\n geometryToRings(geometry).forEach((ring, ringIndex) => {\n if (ring.closed || ring.anchors.length < 2) return;\n out.push({\n ringIndex,\n end: 'start',\n point: cloneVec(ring.anchors[0]),\n });\n out.push({\n ringIndex,\n end: 'end',\n point: cloneVec(ring.anchors[ring.anchors.length - 1]),\n });\n });\n return out;\n}\n\nfunction distToRingEdge(ring: PathRing, edgeIndex: number, point: Vec2): number {\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n if (edge.kind === 'cubic') {\n return nearestTOnCubic(point, from, edge.c1, edge.c2, to).distance;\n }\n return projectOntoSegment(point, from, to).distance;\n}\n\nfunction pointOnRingBoundary(point: Vec2, ring: PathRing, tol: number): boolean {\n const n = edgeCount(ring);\n for (let i = 0; i < n; i++) {\n if (distToRingEdge(ring, i, point) <= tol) return true;\n }\n return false;\n}\n\nexport function edgeLiesOnOtherShape(\n from: Vec2,\n to: Vec2,\n others: Array<{ geometry: ShapeGeometry }>,\n tol = SHARED_EDGE_TOL,\n): boolean {\n const mid = { x: (from.x + to.x) / 2, y: (from.y + to.y) / 2 };\n for (const other of others) {\n const rings = geometryToRings(other.geometry);\n const onBoundary = rings.some(\n (ring) =>\n pointOnRingBoundary(from, ring, tol) &&\n pointOnRingBoundary(to, ring, tol) &&\n pointOnRingBoundary(mid, ring, tol),\n );\n if (onBoundary) return true;\n const open = listOpenEnds(other.geometry);\n if (open.length >= 2) {\n const near = (p: Vec2) =>\n open.some((end) => distance(end.point, p) <= tol);\n if (near(from) && near(to)) return true;\n }\n }\n return false;\n}\n\nfunction cutPointsOnLine(\n from: Vec2,\n to: Vec2,\n point: Vec2,\n gap: number,\n): { p1: Vec2; p2: Vec2 } | null {\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const len = Math.hypot(dx, dy);\n if (len < 1e-6) return null;\n const half = Math.min(Math.max(gap, 0.35) / 2, len * 0.2);\n if (half < 0.12) return null;\n const ux = dx / len;\n const uy = dy / len;\n const proj = projectOntoSegment(point, from, to).point;\n let t = (proj.x - from.x) * ux + (proj.y - from.y) * uy;\n t = Math.min(len - half, Math.max(half, t));\n return {\n p1: { x: from.x + ux * (t - half), y: from.y + uy * (t - half) },\n p2: { x: from.x + ux * (t + half), y: from.y + uy * (t + half) },\n };\n}\n\nfunction cutPointsOnCubic(\n from: Vec2,\n edge: Extract<PathEdge, { kind: 'cubic' }>,\n to: Vec2,\n point: Vec2,\n gap: number,\n): {\n p1: Vec2;\n p2: Vec2;\n leftEdge: PathEdge;\n rightEdge: PathEdge;\n} | null {\n const { t } = nearestTOnCubic(point, from, edge.c1, edge.c2, to);\n const chord = Math.hypot(to.x - from.x, to.y - from.y);\n const dt =\n chord > 1e-6\n ? Math.min(0.04, Math.max(0.006, gap / (2 * chord)))\n : 0.015;\n const t1 = Math.min(0.92, Math.max(0.04, t - dt));\n const t2 = Math.min(0.96, Math.max(t1 + 0.012, t + dt));\n if (t2 - t1 < 0.01) return null;\n const first = splitCubic(from, edge.c1, edge.c2, to, t1);\n const local = (t2 - t1) / Math.max(1e-6, 1 - t1);\n const second = splitCubic(\n first.left.to,\n first.right.c1,\n first.right.c2,\n to,\n local,\n );\n return {\n p1: cloneVec(first.left.to),\n p2: cloneVec(second.left.to),\n leftEdge: { kind: 'cubic', c1: first.left.c1, c2: first.left.c2 },\n rightEdge: { kind: 'cubic', c1: second.right.c1, c2: second.right.c2 },\n };\n}\n\nfunction rebuildOpenFromClosedCut(\n ring: PathRing,\n edgeIndex: number,\n p1: Vec2,\n p2: Vec2,\n leftEdge: PathEdge,\n rightEdge: PathEdge,\n): PathRing {\n const n = ring.anchors.length;\n const fromIdx = edgeIndex;\n const toIdx = (edgeIndex + 1) % n;\n const anchors = [cloneVec(p2), cloneVec(ring.anchors[toIdx])];\n const edges: PathEdge[] = [cloneEdge(rightEdge)];\n let i = toIdx;\n while (i !== fromIdx) {\n const next = (i + 1) % n;\n edges.push(cloneEdge(ring.edges[i]));\n anchors.push(cloneVec(ring.anchors[next]));\n i = next;\n }\n anchors.push(cloneVec(p1));\n edges.push(cloneEdge(leftEdge));\n return { closed: false, anchors, edges };\n}\n\nfunction splitOpenRingAtCut(\n ring: PathRing,\n edgeIndex: number,\n p1: Vec2,\n p2: Vec2,\n leftEdge: PathEdge,\n rightEdge: PathEdge,\n): PathRing[] {\n const fromIdx = edgeIndex;\n const toIdx = edgeIndex + 1;\n const left: PathRing = {\n closed: false,\n anchors: [...ring.anchors.slice(0, fromIdx + 1).map(cloneVec), cloneVec(p1)],\n edges: [\n ...ring.edges.slice(0, fromIdx).map(cloneEdge),\n cloneEdge(leftEdge),\n ],\n };\n const right: PathRing = {\n closed: false,\n anchors: [cloneVec(p2), ...ring.anchors.slice(toIdx).map(cloneVec)],\n edges: [cloneEdge(rightEdge), ...ring.edges.slice(toIdx).map(cloneEdge)],\n };\n return [left, right].filter((item) => item.anchors.length >= 2);\n}\n\nexport function openWholeEdge(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n): ShapeGeometry {\n const rings = geometryToRings(geometry).map(cloneRing);\n const ring = rings[ringIndex];\n if (!ring || edgeIndex < 0 || edgeIndex >= edgeCount(ring)) return geometry;\n\n if (ring.closed) {\n const n = ring.anchors.length;\n if (n < 3) return geometry;\n const fromIdx = edgeIndex;\n const toIdx = (edgeIndex + 1) % n;\n const anchors = [cloneVec(ring.anchors[toIdx])];\n const edges: PathEdge[] = [];\n let i = toIdx;\n while (i !== fromIdx) {\n const next = (i + 1) % n;\n edges.push(cloneEdge(ring.edges[i]));\n anchors.push(cloneVec(ring.anchors[next]));\n i = next;\n }\n rings[ringIndex] = { closed: false, anchors, edges };\n return ringsToGeometry(rings);\n }\n\n if (edgeIndex === 0) {\n ring.anchors.shift();\n ring.edges.shift();\n if (ring.anchors.length < 2) rings.splice(ringIndex, 1);\n return ringsToGeometry(rings);\n }\n if (edgeIndex === ring.edges.length - 1) {\n ring.anchors.pop();\n ring.edges.pop();\n if (ring.anchors.length < 2) rings.splice(ringIndex, 1);\n return ringsToGeometry(rings);\n }\n\n const left: PathRing = {\n closed: false,\n anchors: ring.anchors.slice(0, edgeIndex + 1).map(cloneVec),\n edges: ring.edges.slice(0, edgeIndex).map(cloneEdge),\n };\n const right: PathRing = {\n closed: false,\n anchors: ring.anchors.slice(edgeIndex + 1).map(cloneVec),\n edges: ring.edges.slice(edgeIndex + 1).map(cloneEdge),\n };\n const next = [left, right].filter((item) => item.anchors.length >= 2);\n rings.splice(ringIndex, 1, ...next);\n return ringsToGeometry(rings);\n}\n\nexport function cutEdgeOpen(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n point: Vec2,\n gap: number,\n): ShapeGeometry {\n const rings = geometryToRings(geometry).map(cloneRing);\n const ring = rings[ringIndex];\n if (!ring || edgeIndex < 0 || edgeIndex >= edgeCount(ring)) return geometry;\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n\n let p1: Vec2;\n let p2: Vec2;\n let leftEdge: PathEdge;\n let rightEdge: PathEdge;\n\n if (edge.kind === 'cubic') {\n const cut = cutPointsOnCubic(from, edge, to, point, gap);\n if (!cut) return openWholeEdge(geometry, ringIndex, edgeIndex);\n p1 = cut.p1;\n p2 = cut.p2;\n leftEdge = cut.leftEdge;\n rightEdge = cut.rightEdge;\n } else {\n const cut = cutPointsOnLine(from, to, point, gap);\n if (!cut) return openWholeEdge(geometry, ringIndex, edgeIndex);\n p1 = cut.p1;\n p2 = cut.p2;\n leftEdge = { kind: 'line' };\n rightEdge = { kind: 'line' };\n }\n\n if (ring.closed) {\n rings[ringIndex] = rebuildOpenFromClosedCut(\n ring,\n edgeIndex,\n p1,\n p2,\n leftEdge,\n rightEdge,\n );\n return ringsToGeometry(rings);\n }\n\n const pieces = splitOpenRingAtCut(\n ring,\n edgeIndex,\n p1,\n p2,\n leftEdge,\n rightEdge,\n );\n rings.splice(ringIndex, 1, ...pieces);\n return ringsToGeometry(rings);\n}\n\nfunction concatOpenRings(left: PathRing, right: PathRing, tol: number): PathRing {\n const leftEnd = left.anchors[left.anchors.length - 1];\n const rightStart = right.anchors[0];\n const weld = vecEq(leftEnd, rightStart, tol);\n const anchors = weld\n ? [...left.anchors.map(cloneVec), ...right.anchors.slice(1).map(cloneVec)]\n : [...left.anchors.map(cloneVec), ...right.anchors.map(cloneVec)];\n const edges = weld\n ? [...left.edges.map(cloneEdge), ...right.edges.map(cloneEdge)]\n : [...left.edges.map(cloneEdge), { kind: 'line' as const }, ...right.edges.map(cloneEdge)];\n return maybeCloseCoincident({ closed: false, anchors, edges }, tol);\n}\n\nfunction closeOpenRing(ring: PathRing, tol: number): PathRing {\n const coincident = vecEq(\n ring.anchors[0],\n ring.anchors[ring.anchors.length - 1],\n tol,\n );\n if (coincident) return maybeCloseCoincident(ring, tol);\n return {\n closed: true,\n anchors: ring.anchors.map(cloneVec),\n edges: [...ring.edges.map(cloneEdge), { kind: 'line' }],\n };\n}\n\nexport function joinOpenEndpoints(\n geometry: ShapeGeometry,\n a: { ringIndex: number; end: 'start' | 'end' },\n b: { ringIndex: number; end: 'start' | 'end' },\n tol = DEFAULT_WELD_TOLERANCE,\n): ShapeGeometry {\n const rings = geometryToRings(geometry).map(cloneRing);\n const ra = rings[a.ringIndex];\n const rb = rings[b.ringIndex];\n if (!ra || !rb || ra.closed || rb.closed) return geometry;\n\n if (a.ringIndex === b.ringIndex) {\n if (a.end === b.end) return geometry;\n rings[a.ringIndex] = closeOpenRing(ra, tol);\n return ringsToGeometry(rings);\n }\n\n const left = a.end === 'end' ? cloneRing(ra) : reverseRing(ra);\n const right = b.end === 'start' ? cloneRing(rb) : reverseRing(rb);\n const joined = concatOpenRings(left, right, tol);\n const keep = Math.min(a.ringIndex, b.ringIndex);\n const drop = Math.max(a.ringIndex, b.ringIndex);\n rings[keep] = joined;\n rings.splice(drop, 1);\n return ringsToGeometry(rings);\n}\n\nfunction joinAcrossShapes(\n shapes: ShapeGeo[],\n a: OpenEndId,\n b: OpenEndId,\n tol: number,\n): { shapes: ShapeGeo[]; deleteIds: number[] } {\n const ia = shapes.findIndex((s) => s.id === a.shapeId);\n const ib = shapes.findIndex((s) => s.id === b.shapeId);\n if (ia < 0 || ib < 0) return { shapes, deleteIds: [] };\n\n if (a.shapeId === b.shapeId) {\n const next = shapes.slice();\n next[ia] = {\n ...next[ia],\n geometry: joinOpenEndpoints(next[ia].geometry, a, b, tol),\n };\n return { shapes: next, deleteIds: [] };\n }\n\n const ringsA = geometryToRings(shapes[ia].geometry).map(cloneRing);\n const ringsB = geometryToRings(shapes[ib].geometry).map(cloneRing);\n const offset = ringsA.length;\n const merged = ringsToGeometry([...ringsA, ...ringsB]);\n const joined = joinOpenEndpoints(\n merged,\n a,\n { ringIndex: b.ringIndex + offset, end: b.end },\n tol,\n );\n const next = shapes\n .filter((s) => s.id !== b.shapeId)\n .map((s) => (s.id === a.shapeId ? { ...s, geometry: joined } : s));\n return { shapes: next, deleteIds: [b.shapeId] };\n}\n\nexport function weldCoincidentOpenEnds(\n shapes: ShapeGeo[],\n tol = DEFAULT_WELD_TOLERANCE,\n): { shapes: ShapeGeo[]; deleteIds: number[] } {\n let current = shapes;\n const deleteIds: number[] = [];\n for (let n = 0; n < 24; n++) {\n const ends: OpenEndHit[] = [];\n for (const shape of current) {\n for (const end of listOpenEnds(shape.geometry)) {\n ends.push({\n shapeId: shape.id,\n ringIndex: end.ringIndex,\n end: end.end,\n point: end.point,\n distance: 0,\n });\n }\n }\n let best: { a: OpenEndHit; b: OpenEndHit; dist: number } | null = null;\n for (let i = 0; i < ends.length; i++) {\n for (let j = i + 1; j < ends.length; j++) {\n const a = ends[i];\n const b = ends[j];\n if (a.shapeId === b.shapeId && a.ringIndex === b.ringIndex) continue;\n const dist = distance(a.point, b.point);\n const pairTol = a.shapeId === b.shapeId ? Math.min(tol, 0.75) : tol;\n if (dist <= pairTol && (!best || dist < best.dist)) {\n best = { a, b, dist };\n }\n }\n }\n if (!best) break;\n const joined = joinAcrossShapes(current, best.a, best.b, tol);\n current = joined.shapes;\n deleteIds.push(...joined.deleteIds);\n }\n return { shapes: current, deleteIds };\n}\n\nexport function forkClosedRings(shape: ShapeGeo): {\n keep: ShapeGeo;\n extras: ShapeGeometry[];\n} {\n const rings = geometryToRings(shape.geometry);\n const closed = rings.filter((ring) => ring.closed && ring.anchors.length >= 3);\n const opens = rings.filter((ring) => !ring.closed && ring.anchors.length >= 2);\n if (closed.length <= 1) {\n return { keep: shape, extras: [] };\n }\n return {\n keep: {\n ...shape,\n geometry: ringsToGeometry([closed[0], ...opens]),\n },\n extras: closed.slice(1).map((ring) => ringsToGeometry([ring])),\n };\n}\n\nfunction finishEdits(\n before: ShapeGeo[],\n working: ShapeGeo[],\n extraDeletes: number[],\n): ShapeBatchEdit[] {\n const welded = weldCoincidentOpenEnds(working);\n const deleteSet = new Set([...extraDeletes, ...welded.deleteIds]);\n const extras: Array<{ fromId: number; geometry: ShapeGeometry; kind: ShapeKind; style?: ShapeStyle }> =\n [];\n const kept: ShapeGeo[] = [];\n for (const shape of welded.shapes) {\n if (deleteSet.has(shape.id)) continue;\n const forked = forkClosedRings(shape);\n kept.push(forked.keep);\n for (const geometry of forked.extras) {\n extras.push({\n fromId: shape.id,\n geometry,\n kind: shape.kind,\n style: shape.style,\n });\n }\n }\n\n const edits: ShapeBatchEdit[] = [];\n const beforeById = new Map(before.map((s) => [s.id, s]));\n for (const shape of kept) {\n const prev = beforeById.get(shape.id);\n if (!prev) continue;\n if (JSON.stringify(prev.geometry) !== JSON.stringify(shape.geometry)) {\n edits.push({\n action: 'update',\n shapeId: shape.id,\n geometry: shape.geometry,\n });\n }\n }\n for (const extra of extras) {\n edits.push({\n action: 'create',\n kind: extra.kind,\n geometry: extra.geometry,\n style: extra.style,\n });\n }\n for (const id of deleteSet) {\n if (beforeById.has(id)) edits.push({ action: 'delete', shapeId: id });\n }\n return edits;\n}\n\nexport function applySplitJoinCut(\n shapes: ShapeGeo[],\n hit: { shapeId: number; ringIndex: number; edgeIndex: number; point: Vec2 },\n gap: number,\n): ShapeBatchEdit[] {\n const target = shapes.find((s) => s.id === hit.shapeId);\n if (!target) return [];\n const others = shapes.filter((s) => s.id !== hit.shapeId);\n const rings = geometryToRings(target.geometry);\n const ring = rings[hit.ringIndex];\n if (!ring) return [];\n const from = edgeFrom(ring, hit.edgeIndex);\n const to = edgeTo(ring, hit.edgeIndex);\n const shared = edgeLiesOnOtherShape(from, to, others);\n const nextGeo = shared\n ? openWholeEdge(target.geometry, hit.ringIndex, hit.edgeIndex)\n : cutEdgeOpen(target.geometry, hit.ringIndex, hit.edgeIndex, hit.point, gap);\n const next = shapes.map((s) =>\n s.id === hit.shapeId ? { ...s, geometry: nextGeo } : s,\n );\n return finishEdits(shapes, next, []);\n}\n\nexport function applySplitJoinJoin(\n shapes: ShapeGeo[],\n a: OpenEndId,\n b: OpenEndId,\n): ShapeBatchEdit[] {\n if (sameOpenEnd(a, b)) return [];\n const joined = joinAcrossShapes(shapes, a, b, DEFAULT_WELD_TOLERANCE);\n return finishEdits(shapes, joined.shapes, joined.deleteIds);\n}\n\nexport function hitOpenEnd(\n shapes: ShapeGeo[],\n point: Vec2,\n tol: number,\n skip?: OpenEndId | null,\n): OpenEndHit | null {\n let best: OpenEndHit | null = null;\n for (const shape of shapes) {\n for (const end of listOpenEnds(shape.geometry)) {\n const id: OpenEndId = {\n shapeId: shape.id,\n ringIndex: end.ringIndex,\n end: end.end,\n };\n if (skip && sameOpenEnd(skip, id)) continue;\n const dist = distance(point, end.point);\n if (dist > tol) continue;\n const preferOther =\n skip &&\n (shape.id !== skip.shapeId || end.ringIndex !== skip.ringIndex);\n const bestPrefer =\n best &&\n skip &&\n (best.shapeId !== skip.shapeId || best.ringIndex !== skip.ringIndex);\n if (\n !best ||\n (preferOther && !bestPrefer) ||\n (preferOther === bestPrefer && dist < best.distance)\n ) {\n best = { ...id, point: end.point, distance: dist };\n }\n }\n }\n return best;\n}\n\nexport function hitSplitJoinEdge(\n shapes: ShapeGeo[],\n point: Vec2,\n tol: number,\n): SplitJoinEdgeHit | null {\n let best: SplitJoinEdgeHit | null = null;\n for (const shape of shapes) {\n const hit = hitTestEdge(shape.geometry, point, tol);\n if (!hit) continue;\n if (!best || hit.distance < best.distance) {\n const rings = geometryToRings(shape.geometry);\n const ring = rings[hit.polygonIndex];\n const from = ring ? edgeFrom(ring, hit.afterVertexIndex) : point;\n const to = ring ? edgeTo(ring, hit.afterVertexIndex) : point;\n best = {\n shapeId: shape.id,\n ringIndex: hit.polygonIndex,\n edgeIndex: hit.afterVertexIndex,\n point: hit.point,\n shared: edgeLiesOnOtherShape(\n from,\n to,\n shapes.filter((s) => s.id !== shape.id),\n ),\n distance: hit.distance,\n };\n }\n }\n return best;\n}\n\nexport function previewCutPoints(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n point: Vec2,\n gap: number,\n): { p1: Vec2; p2: Vec2 } | null {\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n if (!ring) return null;\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n if (edge.kind === 'cubic') {\n const cut = cutPointsOnCubic(from, edge, to, point, gap);\n return cut ? { p1: cut.p1, p2: cut.p2 } : null;\n }\n return cutPointsOnLine(from, to, point, gap);\n}\n","import type { Vec2 } from '../core';\n\n/** Closest candidate within `tol` world units, or null. */\nexport function nearestSnapPoint(\n point: Vec2,\n candidates: Vec2[],\n tol: number,\n): Vec2 | null {\n let best: { point: Vec2; distance: number } | null = null;\n for (const candidate of candidates) {\n const distance = Math.hypot(candidate.x - point.x, candidate.y - point.y);\n if (distance <= tol && (!best || distance < best.distance)) {\n best = { point: candidate, distance };\n }\n }\n return best ? { x: best.point.x, y: best.point.y } : null;\n}\n\nexport function sameSnapPoint(a: Vec2 | null, b: Vec2 | null, eps = 1e-4): boolean {\n if (!a || !b) return false;\n return Math.abs(a.x - b.x) <= eps && Math.abs(a.y - b.y) <= eps;\n}\n","import type { ShapeGeometry, ShapeLabel, Vec2, ViewBox } from '../core';\nimport { geometryBBox } from '../core';\nimport { polygonsToGeometry } from './geometryEdit';\n\nexport const DEFAULT_LABEL_TEXT = 'Text';\n\nexport function isTextLabel(shape: {\n kind: string;\n label?: { text?: string } | null;\n}): boolean {\n return shape.kind === 'label' && Boolean(shape.label?.text?.trim());\n}\n\nexport function defaultLabelSize(viewbox: ViewBox): number {\n return Math.max(14, Math.min(viewbox.width, viewbox.height) * 0.016);\n}\n\nexport function textLabelPolygon(origin: Vec2, text: string, size: number): Vec2[] {\n const display = text.trim() || DEFAULT_LABEL_TEXT;\n const width = Math.max(display.length, 1) * size * 0.62;\n const height = size * 1.25;\n return [\n { x: origin.x, y: origin.y - height },\n { x: origin.x + width, y: origin.y - height },\n { x: origin.x + width, y: origin.y },\n { x: origin.x, y: origin.y },\n ];\n}\n\nexport function textLabelGeometry(\n origin: Vec2,\n text: string,\n size: number,\n): ShapeGeometry {\n return polygonsToGeometry([textLabelPolygon(origin, text, size)]);\n}\n\nexport function defaultTextLabel(text: string, size: number, color?: string): ShapeLabel {\n return {\n text: text.trim() || DEFAULT_LABEL_TEXT,\n size,\n color,\n autoFit: true,\n };\n}\n\n/** Keep the box anchored at the current bottom-left when the string changes. */\nexport function geometryForLabelText(\n geometry: ShapeGeometry,\n text: string,\n size: number,\n): ShapeGeometry {\n const box = geometryBBox(geometry);\n return textLabelGeometry({ x: box.minX, y: box.maxY }, text, size);\n}\n","import type { Vec2 } from '../../core';\n\n/** 2D affine matrix in DOMMatrix / SVGMatrix layout (a c e / b d f). */\nexport interface Affine2 {\n a: number;\n b: number;\n c: number;\n d: number;\n e: number;\n f: number;\n}\n\n/**\n * Map a client (CSS pixel) point through the inverse of an SVG screen CTM.\n * That converts pointer coordinates into SVG user / viewBox space so pan\n * deltas match what is drawn, even when the viewBox is larger than the\n * canvas CSS box (or letterboxed by preserveAspectRatio).\n */\nexport function clientToUser(ctm: Affine2, clientX: number, clientY: number): Vec2 {\n const det = ctm.a * ctm.d - ctm.b * ctm.c;\n if (det === 0) return { x: 0, y: 0 };\n const x = clientX - ctm.e;\n const y = clientY - ctm.f;\n return {\n x: (ctm.d * x - ctm.c * y) / det,\n y: (-ctm.b * x + ctm.a * y) / det,\n };\n}\n\nexport function clientToSvgUser(svg: SVGSVGElement, clientX: number, clientY: number): Vec2 {\n const ctm = svg.getScreenCTM();\n if (!ctm) return { x: 0, y: 0 };\n return clientToUser(ctm, clientX, clientY);\n}\n\n/** Invert `translate(pan) scale(zoom)` so a user-space point becomes world geometry. */\nexport function userToWorld(user: Vec2, pan: Vec2, zoom: number): Vec2 {\n const z = zoom === 0 ? 1 : zoom;\n return {\n x: (user.x - pan.x) / z,\n y: (user.y - pan.y) / z,\n };\n}\n\nexport const EDITOR_MIN_ZOOM = 0.2;\n/** High enough that designers can park on a single storefront or route node. */\nexport const EDITOR_MAX_ZOOM = 128;\n\nexport function clampEditorZoom(zoom: number): number {\n return Math.min(EDITOR_MAX_ZOOM, Math.max(EDITOR_MIN_ZOOM, zoom));\n}\n\n/** CSS pixels per SVG user unit from a screen CTM (ignores translation). */\nexport function pxPerUserFromCtm(ctm: Affine2): number {\n return Math.hypot(ctm.a, ctm.b);\n}\n\n/** World-space length that draws as `px` CSS pixels after `scale(zoom)`. */\nexport function screenPxToWorld(px: number, zoom: number, pxPerUser: number): number {\n const z = zoom === 0 ? 1 : zoom;\n const scale = pxPerUser > 0 ? pxPerUser : 1;\n return px / (scale * z);\n}\n\n/**\n * Next pan so `user` (cursor or pinch midpoint in viewBox space) stays over\n * the same world point after `zoom` → `nextZoom`. Without this, SVG\n * `scale()` pivots around the viewBox origin (top-left).\n */\nexport function panAfterZoom(\n user: Vec2,\n pan: Vec2,\n zoom: number,\n nextZoom: number,\n): Vec2 {\n const world = userToWorld(user, pan, zoom);\n return {\n x: user.x - nextZoom * world.x,\n y: user.y - nextZoom * world.y,\n };\n}\n\n/** Pan that keeps a known world point under `user` at `zoom`. */\nexport function panKeepingWorldAtUser(user: Vec2, world: Vec2, zoom: number): Vec2 {\n return {\n x: user.x - zoom * world.x,\n y: user.y - zoom * world.y,\n };\n}\n\nexport const EDITOR_ZOOM_ANIM_MS = 240;\n\nexport function easeOutCubic(t: number): number {\n const x = Math.min(1, Math.max(0, t));\n return 1 - (1 - x) ** 3;\n}\n\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\n/** Interpolate pan + zoom for a smooth +/− / Reset. */\nexport function interpolateView(\n from: { pan: Vec2; zoom: number },\n to: { pan: Vec2; zoom: number },\n t: number,\n): { pan: Vec2; zoom: number } {\n const e = easeOutCubic(t);\n return {\n pan: {\n x: lerp(from.pan.x, to.pan.x, e),\n y: lerp(from.pan.y, to.pan.y, e),\n },\n zoom: lerp(from.zoom, to.zoom, e),\n };\n}\n","import type { ShapeKind, ThemeDefaults } from '../../core';\nimport { WALKING_PATH_COLOR } from '../../core';\n\n/** Edit Map fills stay translucent so the grid shows through for alignment. */\nexport function editorShapeFillOpacity(kind: ShapeKind): number {\n if (kind === 'amenity') return 0.15;\n if (kind === 'unit' || kind === 'parking_zone') return 0.38;\n return 0.3;\n}\n\nexport function editorShapeFill(\n shape: { kind: ShapeKind; style?: { fill?: string } },\n theme: ThemeDefaults,\n): string {\n if (shape.kind === 'walkable') return WALKING_PATH_COLOR;\n return (\n shape.style?.fill ??\n (shape.kind === 'unit' ? theme.STORE_DEFAULT_COLOR : '#cbd5e1')\n );\n}\n","import { INTERACTIVE_SHAPE_KINDS, type ShapeKind } from '../../core';\nimport type { EditorTool } from '../tools';\n\n/** Stores and other assignable items — pointer + highlight, not the pan hand. */\nexport function isHoverHighlightShape(kind: ShapeKind): boolean {\n return INTERACTIVE_SHAPE_KINDS.includes(kind) || kind === 'label';\n}\n\nexport function editorSelectCursor(args: {\n tool: EditorTool;\n selected: boolean;\n highlightable: boolean;\n dragging?: boolean;\n /** Wayfinding: + cursor — click places an orange store destination. */\n wayfinding?: boolean;\n}): 'pointer' | 'grab' | 'grabbing' | 'cell' | undefined {\n if (args.dragging) return 'grabbing';\n if (args.wayfinding && args.highlightable) return 'cell';\n if (args.tool === 'curve' || args.tool === 'split-join') {\n if (args.selected) return undefined;\n if (args.highlightable) return 'pointer';\n return undefined;\n }\n if (args.tool !== 'select') return undefined;\n if (args.selected) return 'grab';\n if (args.highlightable) return 'pointer';\n return undefined;\n}\n\nexport function editorHoverFillOpacity(\n kind: ShapeKind,\n base: number,\n hovered: boolean,\n): number {\n if (!hovered || !isHoverHighlightShape(kind)) return base;\n return Math.min(0.72, base + 0.24);\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport {\n outdoorDecorationFromSvg,\n resolveFetchUrl,\n type OutdoorDecorationPath,\n} from '../../core';\n\nexport function OutdoorSvgUnderlay({\n url,\n imageProxyUrl,\n suppressIds,\n}: {\n url: string;\n imageProxyUrl?: string | null;\n suppressIds?: ReadonlySet<string>;\n}) {\n const [paths, setPaths] = useState<OutdoorDecorationPath[]>([]);\n const suppressKey = useMemo(\n () => (suppressIds ? [...suppressIds].sort().join('\\0') : ''),\n [suppressIds],\n );\n\n useEffect(() => {\n let cancelled = false;\n const fetchUrl = resolveFetchUrl(url, imageProxyUrl);\n const blocked = suppressKey\n ? new Set(suppressKey.split('\\0').filter(Boolean))\n : undefined;\n fetch(fetchUrl)\n .then((res) => {\n if (!res.ok) throw new Error(`SVG fetch ${res.status}`);\n return res.text();\n })\n .then((text) => {\n if (cancelled) return;\n setPaths(outdoorDecorationFromSvg(text, blocked));\n })\n .catch((err) => {\n if (cancelled) return;\n setPaths([]);\n console.warn(\n `[eyeon-map] Outdoor SVG failed to load from ${fetchUrl}. ` +\n 'If this is a cross-origin error, pass `imageProxyUrl` to MapEditor.',\n err,\n );\n });\n return () => {\n cancelled = true;\n };\n }, [url, imageProxyUrl, suppressKey]);\n\n if (paths.length === 0) return null;\n\n return (\n <g className=\"eyeon-map-canvas__outdoor-svg\" pointerEvents=\"none\">\n {paths.map((item, index) => (\n <path\n key={`${item.id}-${index}`}\n d={item.d}\n fill={item.fill ?? 'none'}\n stroke={item.stroke ?? 'none'}\n strokeWidth={item.strokeWidth ?? 0}\n opacity={item.opacity ?? 1}\n />\n ))}\n </g>\n );\n}\n","import type { ShapeKind } from '../../core';\nimport { INTERACTIVE_SHAPE_KINDS } from '../../core';\n\n/** Outdoor underlay items that look clickable on a floor. */\nexport function isUnderlayHintShape(kind: ShapeKind): boolean {\n return INTERACTIVE_SHAPE_KINDS.includes(kind);\n}\n\nexport function underlaySwitchHint(kind: ShapeKind): string {\n if (kind === 'unit' || kind === 'parking_zone') {\n return 'Outdoor store — click to switch to Outdoor and edit';\n }\n if (kind === 'amenity') {\n return 'Outdoor amenity — click to switch to Outdoor and edit';\n }\n if (kind === 'kiosk_screen') {\n return 'Outdoor kiosk — click to switch to Outdoor and edit';\n }\n return 'Outdoor item — click to switch to Outdoor and edit';\n}\n","import type {\n AnchorKind,\n BatchOp,\n CmAnchor,\n CmRouteEdge,\n CmShape,\n ShapeKind,\n Vec2,\n} from '../core';\nimport {\n DEFAULT_WELD_TOLERANCE,\n INTERACTIVE_SHAPE_KINDS,\n distance,\n geometryBBox,\n projectOntoSegment,\n routeAnchorKindForShape,\n} from '../core';\n\nexport const WAYFINDING_SNAP_PX = 28;\n/**\n * One pick radius (CSS pixels) for wayfinding: the anchor dot, the + on a\n * route, and click-to-connect. On-route and off-route use the same circle.\n */\nexport const WAYFINDING_ANCHOR_HIT_PX = 10;\n\nexport function showsWayfinding(tool: string, routeMode = false): boolean {\n if (\n tool === 'draw-route' ||\n tool === 'create-route' ||\n tool === 'create-route-multi'\n ) {\n return true;\n }\n return routeMode && tool === 'select';\n}\n\n/**\n * First empty Create Route click is a preview. A second click commits both\n * ends. Leaving the tool drops the draft so a lone start is never kept.\n */\n/** Esc and Undo share this: a lone preview start is local; anything else undoes. */\nexport function routeSessionUndoKind(session: {\n routeDraftPoint: Vec2 | null;\n storeLinkPreview: unknown;\n}): 'clear-only' | 'clear-and-undo' {\n if (session.routeDraftPoint != null && session.storeLinkPreview == null) {\n return 'clear-only';\n }\n return 'clear-and-undo';\n}\n\nexport function beginOrContinueRouteDraft(\n draft: Vec2 | null,\n world: Vec2,\n): { nextDraft: Vec2 | null; start: Vec2 | null; end: Vec2 | null } {\n if (!draft) return { nextDraft: world, start: null, end: null };\n return { nextDraft: null, start: draft, end: world };\n}\n\n/** Preview line from a started route/store-link to the cursor or snap. */\nexport function routeRubberBand(\n from: Vec2 | null | undefined,\n to: Vec2 | null | undefined,\n): { from: Vec2; to: Vec2 } | null {\n if (!from || !to) return null;\n if (distance(from, to) <= 0.01) return null;\n return { from, to };\n}\n\nexport function isWayfindingShape(kind: ShapeKind): boolean {\n return INTERACTIVE_SHAPE_KINDS.includes(kind);\n}\n\n/** Outdoor pad sites are not routed — helpers and store links stay indoor. */\nexport function wayfindingLinksShapes(\n level: { kind?: string } | null | undefined,\n): boolean {\n return level?.kind !== 'outdoor';\n}\n\nexport function anchorKindForShape(kind: ShapeKind): AnchorKind {\n return routeAnchorKindForShape(kind);\n}\n\nexport function shapeRoutePoint(shape: Pick<CmShape, 'geometry'>): Vec2 {\n const box = geometryBBox(shape.geometry);\n if (box.maxX > box.minX || box.maxY > box.minY) {\n return {\n x: (box.minX + box.maxX) / 2,\n y: (box.minY + box.maxY) / 2,\n };\n }\n const first = shape.geometry.polygons[0]?.[0];\n return first ?? { x: 0, y: 0 };\n}\n\nexport function shapeRouteAnchor(\n shapeId: number,\n anchors: Array<Pick<CmAnchor, 'id' | 'shapeId'>>,\n): Pick<CmAnchor, 'id' | 'shapeId'> | undefined {\n return anchors.find((anchor) => anchor.shapeId === shapeId);\n}\n\nexport function anchorHasEdge(\n anchorId: number,\n edges: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>>,\n): boolean {\n return edges.some(\n (edge) => edge.fromAnchorId === anchorId || edge.toAnchorId === anchorId,\n );\n}\n\nexport function walkEdgeExists(\n edges: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>>,\n a: number,\n b: number,\n): boolean {\n return edges.some(\n (edge) =>\n (edge.fromAnchorId === a && edge.toAnchorId === b) ||\n (edge.fromAnchorId === b && edge.toAnchorId === a),\n );\n}\n\nexport type RouteSnapTarget =\n | { type: 'junction'; anchorId: number; point: Vec2; distance: number }\n | {\n type: 'edge';\n edgeId: number;\n fromAnchorId: number;\n toAnchorId: number;\n point: Vec2;\n distance: number;\n };\n\nfunction isSnappableRouteEdge(edge: Pick<CmRouteEdge, 'kind'>): boolean {\n return (\n edge.kind === 'walk' ||\n edge.kind === 'unit_link' ||\n edge.kind === 'entrance_link'\n );\n}\n\n/** The orange point we are linking from — not every destination on that store. */\nexport function storeLinkOriginIds(\n anchors: Array<Pick<CmAnchor, 'id' | 'shapeId' | 'x' | 'y'>>,\n preview: { shapeId: number; origin: Vec2 } | null | undefined,\n): Set<number> {\n if (!preview) return new Set();\n const ids = new Set<number>();\n for (const anchor of anchors) {\n if (\n anchor.shapeId === preview.shapeId &&\n distance(anchor, preview.origin) <= DEFAULT_WELD_TOLERANCE\n ) {\n ids.add(anchor.id);\n }\n }\n return ids;\n}\n\n/**\n * Nearest route point or edge within `maxDist` (same circular hit on and off\n * the path). An existing anchor wins only when the cursor is inside that\n * circle; otherwise a mid-edge hit stays a split so the + can sit close to\n * a neighboring point.\n */\nexport function nearestRouteSnap(\n point: Vec2,\n anchors: CmAnchor[],\n edges: CmRouteEdge[],\n excludeIds: ReadonlySet<number>,\n maxDist: number,\n): RouteSnapTarget | null {\n const byId = new Map(anchors.map((anchor) => [anchor.id, anchor]));\n let bestJunction: RouteSnapTarget | null = null;\n let bestEdge: RouteSnapTarget | null = null;\n\n for (const anchor of anchors) {\n if (excludeIds.has(anchor.id)) continue;\n const d = distance(anchor, point);\n if (d > maxDist) continue;\n if (!bestJunction || d < bestJunction.distance) {\n bestJunction = {\n type: 'junction',\n anchorId: anchor.id,\n point: { x: anchor.x, y: anchor.y },\n distance: d,\n };\n }\n }\n\n for (const edge of edges) {\n if (!isSnappableRouteEdge(edge)) continue;\n if (excludeIds.has(edge.fromAnchorId) || excludeIds.has(edge.toAnchorId)) {\n continue;\n }\n const from = byId.get(edge.fromAnchorId);\n const to = byId.get(edge.toAnchorId);\n if (!from || !to) continue;\n const hit = projectOntoSegment(point, from, to);\n if (hit.distance > maxDist) continue;\n if (!bestEdge || hit.distance < bestEdge.distance) {\n bestEdge = {\n type: 'edge',\n edgeId: edge.id,\n fromAnchorId: edge.fromAnchorId,\n toAnchorId: edge.toAnchorId,\n point: hit.point,\n distance: hit.distance,\n };\n }\n }\n\n return bestJunction ?? bestEdge;\n}\n\nexport interface ConnectShapeToRouteInput {\n shape: CmShape;\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n mapId: number;\n from: Vec2;\n drop: Vec2;\n maxDist: number;\n allocId: () => number;\n}\n\nfunction walkEdge(\n id: number,\n mapId: number,\n fromAnchorId: number,\n toAnchorId: number,\n kind: CmRouteEdge['kind'] = 'walk',\n): CmRouteEdge {\n return {\n id,\n mapId,\n fromAnchorId,\n toAnchorId,\n weight: null,\n directed: false,\n accessible: true,\n kind,\n };\n}\n\n/** Create a store/amenity route point at the click. Another click elsewhere adds another. */\nexport function ensureShapeRouteAnchorOps(input: {\n shape: CmShape;\n anchors: CmAnchor[];\n allocId: () => number;\n point?: Vec2;\n}): { ops: BatchOp[]; anchorId: number } {\n const { shape, anchors, allocId } = input;\n const point = input.point ?? shapeRoutePoint(shape);\n const existing = anchors.find(\n (anchor) =>\n anchor.shapeId === shape.id &&\n distance(anchor, point) <= DEFAULT_WELD_TOLERANCE,\n );\n if (existing) return { ops: [], anchorId: existing.id };\n const unit: CmAnchor = {\n id: allocId(),\n levelId: shape.levelId,\n shapeId: shape.id,\n kind: anchorKindForShape(shape.kind),\n x: point.x,\n y: point.y,\n connectorId: null,\n };\n return { ops: [{ op: 'upsert_anchor', anchor: unit }], anchorId: unit.id };\n}\n\n/**\n * Ensure the shape has a destination anchor, then hook it to the walking path\n * at `drop` (existing junction or a split in a walk edge).\n */\nexport function connectShapeToRouteOps(input: ConnectShapeToRouteInput): BatchOp[] {\n const { shape, anchors, edges, mapId, from, drop, maxDist, allocId } = input;\n const ops: BatchOp[] = [];\n let unit =\n anchors.find(\n (anchor) =>\n anchor.shapeId === shape.id &&\n distance(anchor, from) <= DEFAULT_WELD_TOLERANCE,\n ) ?? null;\n\n if (!unit) {\n unit = {\n id: allocId(),\n levelId: shape.levelId,\n shapeId: shape.id,\n kind: anchorKindForShape(shape.kind),\n x: from.x,\n y: from.y,\n connectorId: null,\n };\n ops.push({ op: 'upsert_anchor', anchor: unit });\n }\n\n const snap = nearestRouteSnap(\n drop,\n anchors,\n edges,\n new Set([unit.id]),\n maxDist,\n );\n if (!snap) return ops;\n if (distance(unit, snap.point) <= DEFAULT_WELD_TOLERANCE) return ops;\n\n let junctionId: number;\n const nextEdges = edges.slice();\n\n if (snap.type === 'junction') {\n junctionId = snap.anchorId;\n } else {\n const source = edges.find((edge) => edge.id === snap.edgeId);\n if (!source) return ops;\n junctionId = allocId();\n ops.push({\n op: 'upsert_anchor',\n anchor: {\n id: junctionId,\n levelId: shape.levelId,\n shapeId: null,\n kind: 'junction',\n x: snap.point.x,\n y: snap.point.y,\n connectorId: null,\n },\n });\n ops.push({ op: 'delete_edge', edgeId: source.id });\n const left = walkEdge(allocId(), mapId, source.fromAnchorId, junctionId, source.kind);\n const right = walkEdge(allocId(), mapId, junctionId, source.toAnchorId, source.kind);\n ops.push({ op: 'upsert_edge', edge: left });\n ops.push({ op: 'upsert_edge', edge: right });\n nextEdges.push(left, right);\n }\n\n if (walkEdgeExists(nextEdges, unit.id, junctionId)) return ops;\n\n const linkKind = unit.kind === 'entrance' ? 'entrance_link' : 'unit_link';\n ops.push({\n op: 'upsert_edge',\n edge: walkEdge(allocId(), mapId, unit.id, junctionId, linkKind),\n });\n return ops;\n}\n\nexport function linkRouteAnchorsOp(\n mapId: number,\n fromAnchorId: number,\n toAnchorId: number,\n edges: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>>,\n allocId: () => number,\n): BatchOp | null {\n if (fromAnchorId === toAnchorId) return null;\n if (walkEdgeExists(edges, fromAnchorId, toAnchorId)) return null;\n return {\n op: 'upsert_edge',\n edge: walkEdge(allocId(), mapId, fromAnchorId, toAnchorId),\n };\n}\n\nexport function insertJunctionOnWalkEdgeOps(input: {\n levelId: number;\n mapId: number;\n edge: CmRouteEdge;\n point: Vec2;\n allocId: () => number;\n}): { ops: BatchOp[]; junctionId: number } {\n const { levelId, mapId, edge, point, allocId } = input;\n const junctionId = allocId();\n return {\n junctionId,\n ops: [\n {\n op: 'upsert_anchor',\n anchor: {\n id: junctionId,\n levelId,\n shapeId: null,\n kind: 'junction',\n x: point.x,\n y: point.y,\n connectorId: null,\n },\n },\n { op: 'delete_edge', edgeId: edge.id },\n {\n op: 'upsert_edge',\n edge: walkEdge(allocId(), mapId, edge.fromAnchorId, junctionId, edge.kind),\n },\n {\n op: 'upsert_edge',\n edge: walkEdge(allocId(), mapId, junctionId, edge.toAnchorId, edge.kind),\n },\n ],\n };\n}\n\n/**\n * Remove a route point. A 2-way corridor is healed so the path stays joined.\n */\nexport function deleteRouteAnchorOps(\n anchorId: number,\n mapId: number,\n edges: CmRouteEdge[],\n allocId: () => number,\n): BatchOp[] {\n const incident = edges.filter(\n (edge) => edge.fromAnchorId === anchorId || edge.toAnchorId === anchorId,\n );\n const ops: BatchOp[] = incident.map((edge) => ({\n op: 'delete_edge' as const,\n edgeId: edge.id,\n }));\n const walkNeighbors = [\n ...new Set(\n incident\n .filter((edge) => edge.kind === 'walk')\n .map((edge) =>\n edge.fromAnchorId === anchorId ? edge.toAnchorId : edge.fromAnchorId,\n ),\n ),\n ];\n if (\n walkNeighbors.length === 2 &&\n !walkEdgeExists(edges, walkNeighbors[0], walkNeighbors[1])\n ) {\n ops.push({\n op: 'upsert_edge',\n edge: walkEdge(allocId(), mapId, walkNeighbors[0], walkNeighbors[1]),\n });\n }\n ops.push({ op: 'delete_anchor', anchorId });\n return ops;\n}\n","import React, {\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type {\n CmAnchor,\n CmLevel,\n CmRouteEdge,\n CmShape,\n CmShapeAssignment,\n ShapeGeometry,\n ShapeKind,\n ShapeLabel,\n ThemeDefaults,\n Vec2,\n ViewBox,\n} from '../../core';\nimport {\n geometryBBox,\n INTERACTIVE_SHAPE_KINDS,\n svgIdsOwnedByShapes,\n unionViewBox,\n} from '../../core';\nimport { isEditableTypingTarget } from '../history';\nimport {\n canJoinOpenEnds,\n canPlaceNewRoute,\n canSelectShapes,\n emptyCanvasDragPans,\n isSplitJoinTool,\n nextRouteChainAnchor,\n showsCurveHandles,\n showsShapeAnchors,\n type EditorTool,\n} from '../tools';\nimport {\n applySplitJoinCut,\n applySplitJoinJoin,\n canSplitJoinKind,\n hitOpenEnd,\n hitSplitJoinEdge,\n listOpenEnds,\n previewCutPoints,\n sameOpenEnd,\n type OpenEndHit,\n type OpenEndId,\n type ShapeBatchEdit,\n type ShapeGeo,\n type SplitJoinEdgeHit,\n} from '../splitJoin';\nimport { nearestSnapPoint, sameSnapPoint } from '../snapPoint';\nimport {\n bendEdgeToCubic,\n flattenCubicEdge,\n edgeCount,\n edgeFrom,\n edgeTo,\n edgeToPathD,\n geometryToRings,\n pointOnRingEdge,\n ringToPathD,\n hitTestEdge,\n hitTestEdgeMidpoint,\n hitTestHandle,\n hitTestVertex,\n insertVertex,\n moveHandle,\n moveVertex,\n polygonsToGeometry,\n removeVertex,\n translateEdge,\n translateGeometry,\n} from '../geometryEdit';\nimport {\n DEFAULT_LABEL_TEXT,\n defaultLabelSize,\n defaultTextLabel,\n isTextLabel,\n textLabelGeometry,\n} from '../labelText';\nimport {\n clampEditorZoom,\n clientToSvgUser,\n EDITOR_ZOOM_ANIM_MS,\n interpolateView,\n panAfterZoom,\n panKeepingWorldAtUser,\n pxPerUserFromCtm,\n screenPxToWorld,\n userToWorld,\n} from './coords';\nimport { editorShapeFill, editorShapeFillOpacity } from './editorFill';\nimport {\n editorHoverFillOpacity,\n editorSelectCursor,\n isHoverHighlightShape,\n} from './editorHover';\nimport { OutdoorSvgUnderlay } from './OutdoorSvgUnderlay';\nimport { isUnderlayHintShape, underlaySwitchHint } from './underlayHint';\nimport {\n WAYFINDING_ANCHOR_HIT_PX,\n WAYFINDING_SNAP_PX,\n anchorHasEdge,\n beginOrContinueRouteDraft,\n isWayfindingShape,\n routeRubberBand,\n routeSessionUndoKind,\n nearestRouteSnap,\n showsWayfinding,\n storeLinkOriginIds,\n wayfindingLinksShapes,\n} from '../routeStubs';\n\nconst ANCHOR_R_PX = 9;\nconst ANCHOR_R_SELECTED_PX = 11;\nconst ANCHOR_HIT_PX = 16;\nconst ANCHOR_STROKE_PX = 2;\n/** Store / amenity / kiosk route points — distinct from selected (accent) junctions. */\nconst SHAPE_ROUTE_ANCHOR_FILL = '#ea580c';\nconst VERTEX_R_PX = 7;\nconst VERTEX_R_SELECTED_PX = 9;\nconst VERTEX_HIT_PX = 14;\nconst VERTEX_STROKE_PX = 2;\nconst HANDLE_R_PX = 5;\nconst HANDLE_R_SELECTED_PX = 6;\nconst HANDLE_HIT_PX = 12;\nconst BEND_R_PX = 4;\nconst EDGE_DRAG_PX = 4;\n/** Hover / cut pair — tight enough to read as one break, not two far dots. */\nconst SPLIT_JOIN_GAP_PX = 7;\nconst SNAP_HIT_PX = 16;\n\nfunction rectPolygon(a: Vec2, b: Vec2): Vec2[] {\n return [\n { x: a.x, y: a.y },\n { x: b.x, y: a.y },\n { x: b.x, y: b.y },\n { x: a.x, y: b.y },\n ];\n}\n\nfunction dragSize(a: Vec2, b: Vec2): number {\n return Math.hypot(b.x - a.x, b.y - a.y);\n}\n\nfunction HandleDot({\n cx,\n cy,\n r,\n hitR,\n fill,\n stroke,\n strokeWidth,\n cursor,\n fillOpacity = 1,\n strokeDasharray,\n onPointerDown,\n onPointerEnter,\n onPointerLeave,\n onDoubleClick,\n}: {\n cx: number;\n cy: number;\n r: number;\n hitR: number;\n fill: string;\n stroke: string;\n strokeWidth: number;\n cursor: string;\n fillOpacity?: number;\n strokeDasharray?: string;\n onPointerDown?: (e: React.PointerEvent<SVGGElement>) => void;\n onPointerEnter?: (e: React.PointerEvent<SVGGElement>) => void;\n onPointerLeave?: (e: React.PointerEvent<SVGGElement>) => void;\n onDoubleClick?: (e: React.MouseEvent<SVGGElement>) => void;\n}) {\n return (\n <g\n onPointerDown={onPointerDown}\n onPointerEnter={onPointerEnter}\n onPointerLeave={onPointerLeave}\n onMouseDown={(e) => e.preventDefault()}\n onDoubleClick={onDoubleClick}\n style={{ cursor }}\n >\n <circle cx={cx} cy={cy} r={hitR} fill=\"transparent\" />\n <circle\n cx={cx}\n cy={cy}\n r={r}\n fill={fill}\n fillOpacity={fillOpacity}\n stroke={stroke}\n strokeWidth={strokeWidth}\n strokeDasharray={strokeDasharray}\n />\n </g>\n );\n}\n\nexport interface EditorCanvasProps {\n level: CmLevel | null;\n shapes: CmShape[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n assignments: CmShapeAssignment[];\n theme: ThemeDefaults;\n tool: EditorTool;\n selectedShapeId: number | null;\n selectedAnchorIds: number[];\n /** Outdoor SVG underlay (designer-owned). */\n baseSvgUrl: string | null;\n baseViewbox?: ViewBox | null;\n /**\n * Live outdoor SVG. Drawn on every Edit Map floor (and Outdoor) so\n * green areas, parking lanes, and icons match the assign view.\n */\n outdoorSvgUrl?: string | null;\n /** Same proxy as MapViewer — required when the SVG is cross-origin. */\n imageProxyUrl?: string | null;\n /** @deprecated Use outdoorSvgUrl. Kept so existing hosts keep compiling. */\n levelSvgUrl?: string | null;\n /** Outdoor/base shapes drawn behind the active building floor (non-interactive). */\n underlayShapes?: CmShape[];\n /** When true (outdoor), only interactive shapes are editable. */\n interactiveOnly?: boolean;\n /** Graph-paper grid. PORTAL only mounts this canvas after Edit Map. */\n showGrid?: boolean;\n /** Wayfinding section: Select also shows and edits the route graph. */\n routeMode?: boolean;\n /** Pan and zoom only — used for Outdoor in Wayfinding. */\n readOnly?: boolean;\n onSelectShape: (id: number | null) => void;\n onSelectAnchors: (ids: number[]) => void;\n onCreateRoutePoint: (\n point: Vec2,\n prevAnchorId: number | null,\n ) => number | null | void;\n /** First committed Create Route segment (two points + one edge). */\n onCreateRouteSegment: (start: Vec2, end: Vec2) => number | null | void;\n /** Connect two existing junctions with a walk edge. */\n onLinkRouteAnchors?: (fromAnchorId: number, toAnchorId: number) => void;\n onInsertRouteJunction: (edgeId: number, point: Vec2) => number | null | void;\n /** Esc on a route draft uses the same path as the Undo control. */\n onUndo?: () => void;\n onRouteDraftActiveChange?: (active: boolean) => void;\n /** Esc on Multi Route (or Create Route) used to return to Select. */\n onToolChange?: (tool: EditorTool) => void;\n onDeleteRouteAnchor: (anchorId: number) => void;\n onConnectShapeToRoute: (\n shapeId: number,\n from: Vec2,\n drop: Vec2,\n maxDist: number,\n ) => void;\n /** Click inside a store to place its orange destination at that point. */\n onEnsureShapeAnchor: (shapeId: number, point: Vec2) => number | null | void;\n onMoveAnchor: (anchorId: number, x: number, y: number) => void;\n onCreateShape: (\n kind: ShapeKind,\n geometry: ShapeGeometry,\n extras?: { label?: ShapeLabel },\n ) => void;\n onUpdateShapeGeometry: (\n shapeId: number,\n geometry: ShapeGeometry,\n opts?: { live?: boolean },\n ) => void;\n onBatchShapeEdits?: (edits: ShapeBatchEdit[]) => void;\n /** End a live drag so the next edit starts a new undo step. */\n onHistoryGestureEnd?: () => void;\n}\n\nexport interface EditorCanvasHandle {\n consumeRouteUndo: () => 'clear-only' | 'clear-and-undo';\n zoomIn: () => void;\n zoomOut: () => void;\n resetView: () => void;\n}\n\nfunction polygonsToPath(polygons: Vec2[][]): string {\n return polygons\n .map((poly) => {\n if (poly.length === 0) return '';\n let d = `M ${poly[0].x} ${poly[0].y}`;\n for (let i = 1; i < poly.length; i++) d += ` L ${poly[i].x} ${poly[i].y}`;\n d += ' Z';\n return d;\n })\n .join(' ');\n}\n\nfunction isEditableShape(shape: CmShape, interactiveOnly: boolean): boolean {\n if (shape.orphanedAt) return false;\n if (isTextLabel(shape)) return true;\n if (!interactiveOnly) return true;\n return INTERACTIVE_SHAPE_KINDS.includes(shape.kind);\n}\n\nexport const EditorCanvas = React.forwardRef<EditorCanvasHandle, EditorCanvasProps>(\nfunction EditorCanvas({\n level,\n shapes,\n anchors,\n edges,\n theme,\n tool,\n selectedShapeId,\n selectedAnchorIds,\n baseSvgUrl,\n baseViewbox = null,\n outdoorSvgUrl = null,\n imageProxyUrl = null,\n levelSvgUrl = null,\n underlayShapes = [],\n interactiveOnly = false,\n showGrid = true,\n routeMode = false,\n readOnly = false,\n onSelectShape,\n onSelectAnchors,\n onCreateRoutePoint,\n onCreateRouteSegment,\n onLinkRouteAnchors,\n onInsertRouteJunction,\n onDeleteRouteAnchor,\n onConnectShapeToRoute,\n onEnsureShapeAnchor,\n onMoveAnchor,\n onCreateShape,\n onUpdateShapeGeometry,\n onBatchShapeEdits,\n onHistoryGestureEnd,\n onUndo,\n onRouteDraftActiveChange,\n onToolChange,\n}, ref) {\n const wayfindingOn = showsWayfinding(tool, routeMode);\n const svgRef = useRef<SVGSVGElement>(null);\n const canvasRef = useRef<HTMLDivElement>(null);\n const [pan, setPan] = useState({ x: 0, y: 0 });\n const [zoom, setZoom] = useState(1);\n const viewRef = useRef({ pan: { x: 0, y: 0 }, zoom: 1 });\n const [pxPerUser, setPxPerUser] = useState(1);\n const pointersRef = useRef(new Map<number, Vec2>());\n const pinchRef = useRef<{\n startDist: number;\n startZoom: number;\n world: Vec2;\n } | null>(null);\n const [drawing, setDrawing] = useState<Vec2[]>([]);\n const [polygonPoints, setPolygonPoints] = useState<Vec2[]>([]);\n const [dragAnchor, setDragAnchor] = useState<number | null>(null);\n const [lastRouteAnchor, setLastRouteAnchor] = useState<number | null>(null);\n const [routeDraftPoint, setRouteDraftPoint] = useState<Vec2 | null>(null);\n const [storeLinkPreview, setStoreLinkPreview] = useState<{\n shapeId: number;\n origin: Vec2;\n } | null>(null);\n const [rubberCursor, setRubberCursor] = useState<Vec2 | null>(null);\n const [splitJoinPending, setSplitJoinPending] = useState<OpenEndId | null>(\n null,\n );\n const [splitJoinHover, setSplitJoinHover] = useState<SplitJoinEdgeHit | null>(\n null,\n );\n const [splitJoinSnapEnd, setSplitJoinSnapEnd] = useState<OpenEndHit | null>(\n null,\n );\n const [polygonSnap, setPolygonSnap] = useState<Vec2 | null>(null);\n const clearRouteSession = () => {\n setRouteDraftPoint(null);\n setLastRouteAnchor(null);\n setStoreLinkPreview(null);\n setRubberCursor(null);\n };\n useEffect(() => {\n onRouteDraftActiveChange?.(routeDraftPoint != null);\n }, [onRouteDraftActiveChange, routeDraftPoint]);\n useEffect(() => {\n if (lastRouteAnchor == null) return;\n if (anchors.some((anchor) => anchor.id === lastRouteAnchor)) return;\n setLastRouteAnchor(null);\n setRubberCursor(null);\n }, [anchors, lastRouteAnchor]);\n const [stubDrag, setStubDrag] = useState<{\n shapeId: number;\n origin: Vec2;\n cursor: Vec2;\n clientX: number;\n clientY: number;\n } | null>(null);\n const [shapeDrag, setShapeDrag] = useState<{\n shapeId: number;\n start: Vec2;\n originGeometry: ShapeGeometry;\n } | null>(null);\n const [shapeOffset, setShapeOffset] = useState<Vec2>({ x: 0, y: 0 });\n const [vertexDrag, setVertexDrag] = useState<{\n type: 'anchor';\n shapeId: number;\n polygonIndex: number;\n vertexIndex: number;\n } | {\n type: 'handle';\n shapeId: number;\n ringIndex: number;\n edgeIndex: number;\n handle: 1 | 2;\n } | {\n type: 'bend';\n shapeId: number;\n ringIndex: number;\n edgeIndex: number;\n } | null>(null);\n const [selectedVertex, setSelectedVertex] = useState<{\n polygonIndex: number;\n vertexIndex: number;\n } | null>(null);\n const [selectedHandle, setSelectedHandle] = useState<{\n ringIndex: number;\n edgeIndex: number;\n handle: 1 | 2;\n } | null>(null);\n const [hoveredEdge, setHoveredEdge] = useState<{\n ringIndex: number;\n edgeIndex: number;\n point: Vec2;\n } | null>(null);\n const [edgePress, setEdgePress] = useState<{\n shapeId: number;\n ringIndex: number;\n edgeIndex: number;\n start: Vec2;\n clientX: number;\n clientY: number;\n insertAt: Vec2;\n originGeometry: ShapeGeometry;\n dragging: boolean;\n } | null>(null);\n const [hoveredShapeId, setHoveredShapeId] = useState<number | null>(null);\n const [hoveredAnchorId, setHoveredAnchorId] = useState<number | null>(null);\n const [routeHover, setRouteHover] = useState<{\n edgeId: number;\n point: Vec2;\n } | null>(null);\n const [underlayTip, setUnderlayTip] = useState<{\n x: number;\n y: number;\n text: string;\n } | null>(null);\n const panStart = useRef<{\n x: number;\n y: number;\n panX: number;\n panY: number;\n clientX: number;\n clientY: number;\n fromEmptySelect: boolean;\n } | null>(null);\n const [isPanning, setIsPanning] = useState(false);\n\n viewRef.current = { pan, zoom };\n\n const worldPx = (px: number) => screenPxToWorld(px, zoom, pxPerUser);\n\n const applyView = (nextPan: Vec2, nextZoom: number) => {\n viewRef.current = { pan: nextPan, zoom: nextZoom };\n setPan(nextPan);\n setZoom(nextZoom);\n };\n\n const zoomAnimRef = useRef<number | null>(null);\n const cancelZoomAnim = () => {\n if (zoomAnimRef.current == null) return;\n cancelAnimationFrame(zoomAnimRef.current);\n zoomAnimRef.current = null;\n };\n\n const animateViewTo = (targetPan: Vec2, targetZoom: number) => {\n cancelZoomAnim();\n const from = {\n pan: { ...viewRef.current.pan },\n zoom: viewRef.current.zoom,\n };\n const to = { pan: targetPan, zoom: targetZoom };\n if (\n from.zoom === to.zoom &&\n from.pan.x === to.pan.x &&\n from.pan.y === to.pan.y\n ) {\n return;\n }\n const started = performance.now();\n const step = (now: number) => {\n const t = Math.min(1, (now - started) / EDITOR_ZOOM_ANIM_MS);\n const next = interpolateView(from, to, t);\n applyView(next.pan, next.zoom);\n if (t < 1) {\n zoomAnimRef.current = requestAnimationFrame(step);\n return;\n }\n zoomAnimRef.current = null;\n };\n zoomAnimRef.current = requestAnimationFrame(step);\n };\n\n const zoomAroundCenter = (factor: number) => {\n const svg = svgRef.current;\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n const user = clientToSvgUser(\n svg,\n rect.left + rect.width / 2,\n rect.top + rect.height / 2,\n );\n const { pan: currentPan, zoom: currentZoom } = viewRef.current;\n const nextZoom = clampEditorZoom(currentZoom * factor);\n if (nextZoom === currentZoom) return;\n animateViewTo(panAfterZoom(user, currentPan, currentZoom, nextZoom), nextZoom);\n };\n\n useImperativeHandle(ref, () => ({\n consumeRouteUndo: () => {\n const kind = routeSessionUndoKind({\n routeDraftPoint,\n storeLinkPreview,\n });\n clearRouteSession();\n return kind;\n },\n zoomIn: () => zoomAroundCenter(1.25),\n zoomOut: () => zoomAroundCenter(0.8),\n resetView: () => animateViewTo({ x: 0, y: 0 }, 1),\n }));\n\n useEffect(() => () => cancelZoomAnim(), []);\n\n useEffect(() => {\n setDrawing([]);\n setPolygonPoints([]);\n setLastRouteAnchor(null);\n setRouteDraftPoint(null);\n setStoreLinkPreview(null);\n setRubberCursor(null);\n setStubDrag(null);\n setHoveredShapeId(null);\n setHoveredAnchorId(null);\n setShapeDrag(null);\n setVertexDrag(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n setRouteHover(null);\n setEdgePress(null);\n setSplitJoinHover(null);\n if (!canJoinOpenEnds(tool)) {\n setSplitJoinPending(null);\n setSplitJoinSnapEnd(null);\n }\n setPolygonSnap(null);\n setShapeOffset({ x: 0, y: 0 });\n }, [tool]);\n\n useEffect(() => {\n setSelectedVertex(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n setEdgePress(null);\n setUnderlayTip(null);\n setHoveredShapeId(null);\n setShapeDrag(null);\n setVertexDrag(null);\n setShapeOffset({ x: 0, y: 0 });\n }, [selectedShapeId]);\n\n useEffect(() => {\n setUnderlayTip(null);\n setHoveredShapeId(null);\n setHoveredAnchorId(null);\n }, [level?.id]);\n\n const viewbox = unionViewBox(level?.sourceViewbox, baseViewbox);\n const svgUnderlayUrl =\n outdoorSvgUrl ?? levelSvgUrl ?? (level?.kind === 'outdoor' ? baseSvgUrl : null);\n const svgSuppressIds = useMemo(\n () =>\n svgIdsOwnedByShapes([...underlayShapes, ...shapes], {\n omitStaticLayers: interactiveOnly,\n }),\n [underlayShapes, shapes, interactiveOnly],\n );\n\n useLayoutEffect(() => {\n const svg = svgRef.current;\n if (!svg) return;\n const measure = () => {\n const ctm = svg.getScreenCTM();\n if (!ctm) return;\n const next = pxPerUserFromCtm(ctm);\n setPxPerUser((prev) => (Math.abs(prev - next) < 1e-6 ? prev : next));\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(svg);\n return () => ro.disconnect();\n }, [level?.id, viewbox.x, viewbox.y, viewbox.width, viewbox.height]);\n\n const editableShapes = useMemo(\n () => shapes.filter((s) => isEditableShape(s, interactiveOnly)),\n [shapes, interactiveOnly],\n );\n\n const selectedShape =\n editableShapes.find((s) => s.id === selectedShapeId) ?? null;\n\n const displayGeometry = useMemo(() => {\n if (!selectedShape) return null;\n if (shapeDrag && shapeDrag.shapeId === selectedShape.id) {\n return translateGeometry(shapeDrag.originGeometry, shapeOffset.x, shapeOffset.y);\n }\n return selectedShape.geometry;\n }, [selectedShape, shapeDrag, shapeOffset]);\n\n const splitJoinShapes = useMemo<ShapeGeo[]>(\n () =>\n editableShapes\n .filter((s) => canSplitJoinKind(s.kind) && !isTextLabel(s))\n .map((s) => ({\n id: s.id,\n kind: s.kind,\n style: s.style,\n geometry: s.geometry,\n })),\n [editableShapes],\n );\n\n const polygonAnchorCandidates = useMemo(() => {\n const pts: Vec2[] = [];\n for (const shape of editableShapes) {\n if (isTextLabel(shape)) continue;\n for (const ring of geometryToRings(shape.geometry)) {\n pts.push(...ring.anchors);\n }\n }\n return pts;\n }, [editableShapes]);\n\n const nearSplitJoinAnchor = (world: Vec2, tol: number): boolean => {\n if (hitOpenEnd(splitJoinShapes, world, tol)) return true;\n return splitJoinShapes.some(\n (shape) => hitTestVertex(shape.geometry, world, tol) != null,\n );\n };\n\n const snapPolygonPoint = (world: Vec2): Vec2 | null => {\n const own = polygonPoints.length >= 3 ? [polygonPoints[0]] : [];\n return nearestSnapPoint(\n world,\n [...own, ...polygonAnchorCandidates],\n worldPx(SNAP_HIT_PX),\n );\n };\n\n const commitSplitJoinEdits = (edits: ShapeBatchEdit[]) => {\n if (!edits.length) return;\n onBatchShapeEdits?.(edits);\n const deleted = new Set(\n edits.filter((e) => e.action === 'delete').map((e) => e.shapeId),\n );\n if (selectedShapeId != null && deleted.has(selectedShapeId)) {\n const survivor = edits.find((e) => e.action === 'update');\n onSelectShape(survivor && survivor.action === 'update' ? survivor.shapeId : null);\n }\n };\n\n const tryJoinOpenEnd = (world: Vec2): boolean => {\n if (!canJoinOpenEnds(tool) || readOnly) return false;\n const endHit =\n splitJoinSnapEnd ??\n hitOpenEnd(splitJoinShapes, world, worldPx(SNAP_HIT_PX), splitJoinPending);\n if (!endHit) return false;\n if (!splitJoinPending) {\n setSplitJoinPending(endHit);\n onSelectShape(endHit.shapeId);\n if (isSplitJoinTool(tool)) onToolChange?.('select');\n return true;\n }\n if (sameOpenEnd(splitJoinPending, endHit)) {\n setSplitJoinPending(null);\n setSplitJoinSnapEnd(null);\n return true;\n }\n commitSplitJoinEdits(applySplitJoinJoin(splitJoinShapes, splitJoinPending, endHit));\n setSplitJoinPending(null);\n setSplitJoinHover(null);\n setSplitJoinSnapEnd(null);\n return true;\n };\n\n const handleSplitJoinAt = (world: Vec2): boolean => {\n if (tryJoinOpenEnd(world)) return true;\n if (!isSplitJoinTool(tool) || readOnly) return false;\n const endTol = worldPx(SNAP_HIT_PX);\n const edgeTol = worldPx(VERTEX_HIT_PX);\n const edgeHit = hitSplitJoinEdge(splitJoinShapes, world, edgeTol);\n if (edgeHit && !nearSplitJoinAnchor(world, endTol)) {\n commitSplitJoinEdits(\n applySplitJoinCut(splitJoinShapes, edgeHit, worldPx(SPLIT_JOIN_GAP_PX)),\n );\n setSplitJoinPending(null);\n setSplitJoinHover(null);\n setSplitJoinSnapEnd(null);\n onSelectShape(edgeHit.shapeId);\n return true;\n }\n if (splitJoinPending) {\n setSplitJoinPending(null);\n setSplitJoinSnapEnd(null);\n return true;\n }\n return false;\n };\n\n const toWorld = (clientX: number, clientY: number): Vec2 => {\n const svg = svgRef.current;\n if (!svg) return { x: 0, y: 0 };\n return userToWorld(clientToSvgUser(svg, clientX, clientY), pan, zoom);\n };\n\n const moveUnderlayTip = (e: React.PointerEvent, kind: ShapeKind) => {\n const rect = canvasRef.current?.getBoundingClientRect();\n if (!rect) return;\n setUnderlayTip({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n text: underlaySwitchHint(kind),\n });\n };\n\n const insertAnchorOnEdge = (\n shape: CmShape,\n ringIndex: number,\n edgeIndex: number,\n point: Vec2,\n ) => {\n const next = insertVertex(shape.geometry, ringIndex, edgeIndex, point);\n onUpdateShapeGeometry(shape.id, next);\n setSelectedVertex({\n polygonIndex: ringIndex,\n vertexIndex: edgeIndex + 1,\n });\n setSelectedHandle(null);\n setHoveredEdge(null);\n };\n\n const beginEdgePress = (\n ringIndex: number,\n edgeIndex: number,\n insertAt: Vec2,\n e: React.PointerEvent,\n ) => {\n if (!selectedShape) return;\n e.stopPropagation();\n e.currentTarget.setPointerCapture?.(e.pointerId);\n setEdgePress({\n shapeId: selectedShape.id,\n ringIndex,\n edgeIndex,\n start: toWorld(e.clientX, e.clientY),\n clientX: e.clientX,\n clientY: e.clientY,\n insertAt,\n originGeometry: displayGeometry ?? selectedShape.geometry,\n dragging: false,\n });\n };\n\n const deleteShapeAnchor = (ringIndex: number, vertexIndex: number) => {\n if (!selectedShape) return;\n const next = removeVertex(selectedShape.geometry, ringIndex, vertexIndex);\n if (next === selectedShape.geometry) return;\n onUpdateShapeGeometry(selectedShape.id, next);\n setSelectedVertex(null);\n setSelectedHandle(null);\n setVertexDrag(null);\n };\n\n const beginSplitJoinVertexDrag = (\n world: Vec2,\n e: React.PointerEvent,\n ): boolean => {\n if (!selectedShape || !displayGeometry) return false;\n const vertexHit = hitTestVertex(\n displayGeometry,\n world,\n worldPx(VERTEX_HIT_PX),\n );\n if (!vertexHit) return false;\n if (hitOpenEnd(splitJoinShapes, vertexHit.point, worldPx(4))) return false;\n if (e.detail >= 2) {\n deleteShapeAnchor(vertexHit.polygonIndex, vertexHit.vertexIndex);\n return true;\n }\n setSelectedVertex({\n polygonIndex: vertexHit.polygonIndex,\n vertexIndex: vertexHit.vertexIndex,\n });\n setSelectedHandle(null);\n setVertexDrag({\n type: 'anchor',\n shapeId: selectedShape.id,\n polygonIndex: vertexHit.polygonIndex,\n vertexIndex: vertexHit.vertexIndex,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n return true;\n };\n\n const deleteShapeHandle = (ringIndex: number, edgeIndex: number) => {\n if (!selectedShape) return;\n const next = flattenCubicEdge(selectedShape.geometry, ringIndex, edgeIndex);\n if (next === selectedShape.geometry) return;\n onUpdateShapeGeometry(selectedShape.id, next);\n setSelectedHandle(null);\n setVertexDrag(null);\n };\n\n const hoverEdgeAt = (\n ringIndex: number,\n edgeIndex: number,\n clientX: number,\n clientY: number,\n ) => {\n if (!selectedShape) return;\n const world = toWorld(clientX, clientY);\n const ring = geometryToRings(displayGeometry ?? selectedShape.geometry)[\n ringIndex\n ];\n setHoveredEdge({\n ringIndex,\n edgeIndex,\n point: ring ? pointOnRingEdge(ring, edgeIndex, world) : world,\n });\n };\n\n const anchorById = useMemo(\n () => new Map(anchors.map((a) => [a.id, a])),\n [anchors],\n );\n\n const closePolygon = () => {\n if (polygonPoints.length < 3) {\n setPolygonPoints([]);\n setRubberCursor(null);\n setPolygonSnap(null);\n return;\n }\n onCreateShape('unit', polygonsToGeometry([polygonPoints]));\n setPolygonPoints([]);\n setRubberCursor(null);\n setPolygonSnap(null);\n };\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (tool === 'draw-polygon') {\n if (e.key === 'Enter') {\n e.preventDefault();\n closePolygon();\n } else if (e.key === 'Escape') {\n setPolygonPoints([]);\n setRubberCursor(null);\n setPolygonSnap(null);\n }\n }\n if (\n e.key === 'Escape' &&\n !isEditableTypingTarget(e.target) &&\n splitJoinPending != null\n ) {\n e.preventDefault();\n setSplitJoinPending(null);\n setSplitJoinHover(null);\n setSplitJoinSnapEnd(null);\n return;\n }\n if (\n e.key === 'Escape' &&\n !isEditableTypingTarget(e.target) &&\n (canPlaceNewRoute(tool) ||\n storeLinkPreview != null ||\n routeDraftPoint != null ||\n lastRouteAnchor != null)\n ) {\n e.preventDefault();\n onUndo?.();\n }\n if (\n (e.key === 'Backspace' || e.key === 'Delete') &&\n selectedShape &&\n showsShapeAnchors(tool) &&\n selectedVertex\n ) {\n e.preventDefault();\n const next = removeVertex(\n selectedShape.geometry,\n selectedVertex.polygonIndex,\n selectedVertex.vertexIndex,\n );\n if (next !== selectedShape.geometry) {\n onUpdateShapeGeometry(selectedShape.id, next);\n setSelectedVertex(null);\n }\n }\n if (\n (e.key === 'Backspace' || e.key === 'Delete') &&\n selectedShape &&\n showsCurveHandles(tool) &&\n selectedHandle\n ) {\n e.preventDefault();\n const next = flattenCubicEdge(\n selectedShape.geometry,\n selectedHandle.ringIndex,\n selectedHandle.edgeIndex,\n );\n if (next !== selectedShape.geometry) {\n onUpdateShapeGeometry(selectedShape.id, next);\n setSelectedHandle(null);\n }\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n tool,\n polygonPoints,\n selectedShape,\n selectedVertex,\n selectedHandle,\n storeLinkPreview,\n routeDraftPoint,\n lastRouteAnchor,\n splitJoinPending,\n onUndo,\n ]);\n\n useEffect(() => {\n const node = canvasRef.current;\n if (!node) return;\n const onWheel = (e: WheelEvent) => {\n if (e.deltaY === 0) return;\n e.preventDefault();\n const svg = svgRef.current;\n if (!svg) return;\n cancelZoomAnim();\n const user = clientToSvgUser(svg, e.clientX, e.clientY);\n const { pan: currentPan, zoom: currentZoom } = viewRef.current;\n const nextZoom = clampEditorZoom(currentZoom * (e.deltaY > 0 ? 0.9 : 1.1));\n if (nextZoom === currentZoom) return;\n applyView(panAfterZoom(user, currentPan, currentZoom, nextZoom), nextZoom);\n };\n node.addEventListener('wheel', onWheel, { passive: false });\n return () => node.removeEventListener('wheel', onWheel);\n }, [Boolean(level)]);\n\n const beginPinch = () => {\n cancelZoomAnim();\n const svg = svgRef.current;\n const pts = [...pointersRef.current.values()];\n if (!svg || pts.length < 2) return;\n const mid = { x: (pts[0].x + pts[1].x) / 2, y: (pts[0].y + pts[1].y) / 2 };\n const user = clientToSvgUser(svg, mid.x, mid.y);\n const { pan: currentPan, zoom: currentZoom } = viewRef.current;\n pinchRef.current = {\n startDist: Math.max(1, Math.hypot(pts[1].x - pts[0].x, pts[1].y - pts[0].y)),\n startZoom: currentZoom,\n world: userToWorld(user, currentPan, currentZoom),\n };\n panStart.current = null;\n setIsPanning(false);\n setDrawing([]);\n setShapeDrag(null);\n setVertexDrag(null);\n setDragAnchor(null);\n };\n\n const onCanvasPointerDownCapture = (e: React.PointerEvent) => {\n pointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n if (pointersRef.current.size < 2) return;\n e.preventDefault();\n e.stopPropagation();\n beginPinch();\n };\n\n const onCanvasPointerMoveCapture = (e: React.PointerEvent) => {\n if (pointersRef.current.has(e.pointerId)) {\n pointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n }\n if (!pinchRef.current || pointersRef.current.size < 2) return;\n const svg = svgRef.current;\n if (!svg) return;\n e.stopPropagation();\n const pts = [...pointersRef.current.values()];\n const dist = Math.hypot(pts[1].x - pts[0].x, pts[1].y - pts[0].y);\n const mid = { x: (pts[0].x + pts[1].x) / 2, y: (pts[0].y + pts[1].y) / 2 };\n const user = clientToSvgUser(svg, mid.x, mid.y);\n const nextZoom = clampEditorZoom(\n pinchRef.current.startZoom * (dist / pinchRef.current.startDist),\n );\n applyView(panKeepingWorldAtUser(user, pinchRef.current.world, nextZoom), nextZoom);\n };\n\n const onCanvasPointerUpCapture = (e: React.PointerEvent) => {\n const wasPinching = pinchRef.current != null;\n pointersRef.current.delete(e.pointerId);\n if (pointersRef.current.size < 2) pinchRef.current = null;\n if (wasPinching) e.stopPropagation();\n };\n\n const beginPan = (e: React.PointerEvent, fromEmptySelect: boolean) => {\n cancelZoomAnim();\n const svg = svgRef.current;\n const user = svg\n ? clientToSvgUser(svg, e.clientX, e.clientY)\n : { x: e.clientX, y: e.clientY };\n panStart.current = {\n x: user.x,\n y: user.y,\n panX: viewRef.current.pan.x,\n panY: viewRef.current.pan.y,\n clientX: e.clientX,\n clientY: e.clientY,\n fromEmptySelect,\n };\n setIsPanning(true);\n e.currentTarget.setPointerCapture?.(e.pointerId);\n };\n\n const insertHoveredRoutePoint = (edgeId: number, point: Vec2) => {\n const created = onInsertRouteJunction(edgeId, point);\n if (canPlaceNewRoute(tool) && typeof created === 'number') {\n if (routeDraftPoint) {\n onCreateRoutePoint(routeDraftPoint, created);\n setRouteDraftPoint(null);\n setLastRouteAnchor(nextRouteChainAnchor(tool, created));\n } else if (lastRouteAnchor != null && lastRouteAnchor !== created) {\n onLinkRouteAnchors?.(lastRouteAnchor, created);\n setLastRouteAnchor(nextRouteChainAnchor(tool, created));\n } else {\n setLastRouteAnchor(created);\n }\n }\n onSelectAnchors(typeof created === 'number' ? [created] : []);\n };\n\n const removeWayfindingAnchor = (anchorId: number) => {\n if (readOnly || !wayfindingOn) return;\n onDeleteRouteAnchor(anchorId);\n setLastRouteAnchor((prev) => (prev === anchorId ? null : prev));\n setDragAnchor(null);\n setStoreLinkPreview(null);\n setRouteDraftPoint(null);\n setRubberCursor(null);\n setHoveredAnchorId((id) => (id === anchorId ? null : id));\n };\n\n const onPointerDown = (e: React.PointerEvent) => {\n if (pinchRef.current) return;\n if (readOnly || tool === 'pan' || e.button === 1) {\n beginPan(e, false);\n return;\n }\n const world = toWorld(e.clientX, e.clientY);\n\n if (isSplitJoinTool(tool)) {\n if (beginSplitJoinVertexDrag(world, e)) return;\n if (handleSplitJoinAt(world)) return;\n beginPan(e, true);\n return;\n }\n\n if (tool === 'draw-polygon') {\n const placed = snapPolygonPoint(world) ?? polygonSnap ?? world;\n if (polygonPoints.length >= 3) {\n const first = polygonPoints[0];\n if (Math.hypot(placed.x - first.x, placed.y - first.y) <= worldPx(SNAP_HIT_PX)) {\n closePolygon();\n return;\n }\n }\n setPolygonPoints((prev) => [...prev, placed]);\n setRubberCursor(placed);\n setPolygonSnap(null);\n return;\n }\n\n if (wayfindingOn) {\n const storeExclude = storeLinkOriginIds(anchors, storeLinkPreview);\n const snap = nearestRouteSnap(\n world,\n anchors,\n edges,\n storeExclude,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n );\n if (storeLinkPreview) {\n if (snap?.type === 'edge' || snap?.type === 'junction') {\n onConnectShapeToRoute(\n storeLinkPreview.shapeId,\n storeLinkPreview.origin,\n snap.point,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n );\n }\n setStoreLinkPreview(null);\n setRubberCursor(null);\n return;\n }\n if (snap?.type === 'edge') {\n insertHoveredRoutePoint(snap.edgeId, snap.point);\n return;\n }\n if (snap?.type === 'junction') {\n if (canPlaceNewRoute(tool)) {\n if (routeDraftPoint) {\n onCreateRoutePoint(routeDraftPoint, snap.anchorId);\n setRouteDraftPoint(null);\n setLastRouteAnchor(nextRouteChainAnchor(tool, snap.anchorId));\n } else if (lastRouteAnchor != null && lastRouteAnchor !== snap.anchorId) {\n onLinkRouteAnchors?.(lastRouteAnchor, snap.anchorId);\n setLastRouteAnchor(nextRouteChainAnchor(tool, snap.anchorId));\n } else {\n setLastRouteAnchor(snap.anchorId);\n }\n }\n onSelectAnchors([snap.anchorId]);\n return;\n }\n if (canPlaceNewRoute(tool)) {\n if (lastRouteAnchor != null) {\n const created = onCreateRoutePoint(world, lastRouteAnchor);\n setLastRouteAnchor(nextRouteChainAnchor(tool, created));\n setRubberCursor(world);\n return;\n }\n const next = beginOrContinueRouteDraft(routeDraftPoint, world);\n setRouteDraftPoint(next.nextDraft);\n setRubberCursor(world);\n if (next.start && next.end) {\n const created = onCreateRouteSegment(next.start, next.end);\n setLastRouteAnchor(nextRouteChainAnchor(tool, created));\n }\n return;\n }\n beginPan(e, true);\n return;\n }\n if (tool === 'draw-text') {\n const size = defaultLabelSize(viewbox);\n onCreateShape(\n 'label',\n textLabelGeometry(world, DEFAULT_LABEL_TEXT, size),\n { label: defaultTextLabel(DEFAULT_LABEL_TEXT, size, theme.STORE_TEXT_COLOR) },\n );\n return;\n }\n if (tool === 'draw-unit' || tool === 'draw-line') {\n e.currentTarget.setPointerCapture?.(e.pointerId);\n setDrawing([world, world]);\n return;\n }\n\n if (showsCurveHandles(tool) && selectedShape && displayGeometry) {\n const handleHit = hitTestHandle(displayGeometry, world, worldPx(HANDLE_HIT_PX));\n if (handleHit) {\n if (e.detail >= 2) {\n deleteShapeHandle(handleHit.ringIndex, handleHit.edgeIndex);\n return;\n }\n setSelectedHandle({\n ringIndex: handleHit.ringIndex,\n edgeIndex: handleHit.edgeIndex,\n handle: handleHit.handle,\n });\n setSelectedVertex(null);\n setVertexDrag({\n type: 'handle',\n shapeId: selectedShape.id,\n ringIndex: handleHit.ringIndex,\n edgeIndex: handleHit.edgeIndex,\n handle: handleHit.handle,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n return;\n }\n const midHit = hitTestEdgeMidpoint(\n displayGeometry,\n world,\n worldPx(HANDLE_HIT_PX),\n );\n if (midHit && midHit.kind === 'line') {\n setSelectedVertex(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n setVertexDrag({\n type: 'bend',\n shapeId: selectedShape.id,\n ringIndex: midHit.polygonIndex,\n edgeIndex: midHit.afterVertexIndex,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n return;\n }\n }\n\n if (canJoinOpenEnds(tool) && tryJoinOpenEnd(world)) return;\n\n if (showsShapeAnchors(tool) && selectedShape && displayGeometry) {\n const handleTol = worldPx(VERTEX_HIT_PX);\n const hit = hitTestVertex(displayGeometry, world, handleTol);\n if (hit) {\n if (e.detail >= 2) {\n deleteShapeAnchor(hit.polygonIndex, hit.vertexIndex);\n return;\n }\n setSelectedVertex({\n polygonIndex: hit.polygonIndex,\n vertexIndex: hit.vertexIndex,\n });\n setSelectedHandle(null);\n setVertexDrag({\n type: 'anchor',\n shapeId: selectedShape.id,\n polygonIndex: hit.polygonIndex,\n vertexIndex: hit.vertexIndex,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n return;\n }\n }\n\n if (tool === 'select' && selectedShape && displayGeometry) {\n const edgeHit = hitTestEdge(displayGeometry, world, worldPx(VERTEX_HIT_PX));\n if (edgeHit) {\n beginEdgePress(\n edgeHit.polygonIndex,\n edgeHit.afterVertexIndex,\n edgeHit.point,\n e,\n );\n return;\n }\n }\n\n if (emptyCanvasDragPans(tool)) {\n beginPan(e, tool === 'select');\n }\n };\n\n const onPointerMove = (e: React.PointerEvent) => {\n if (pinchRef.current) return;\n if (panStart.current) {\n const svg = svgRef.current;\n if (!svg) return;\n const user = clientToSvgUser(svg, e.clientX, e.clientY);\n const nextPan = {\n x: panStart.current.panX + (user.x - panStart.current.x),\n y: panStart.current.panY + (user.y - panStart.current.y),\n };\n viewRef.current = { pan: nextPan, zoom: viewRef.current.zoom };\n setPan(nextPan);\n return;\n }\n if (edgePress && selectedShape) {\n const world = toWorld(e.clientX, e.clientY);\n const screenMove = Math.hypot(\n e.clientX - edgePress.clientX,\n e.clientY - edgePress.clientY,\n );\n if (!edgePress.dragging && screenMove < EDGE_DRAG_PX) return;\n if (!edgePress.dragging) {\n setEdgePress({ ...edgePress, dragging: true });\n setHoveredEdge(null);\n }\n const next = translateEdge(\n edgePress.originGeometry,\n edgePress.ringIndex,\n edgePress.edgeIndex,\n { x: world.x - edgePress.start.x, y: world.y - edgePress.start.y },\n );\n onUpdateShapeGeometry(selectedShape.id, next, { live: true });\n return;\n }\n if (stubDrag) {\n const world = toWorld(e.clientX, e.clientY);\n setStubDrag({ ...stubDrag, cursor: world });\n return;\n }\n if (dragAnchor != null) {\n const world = toWorld(e.clientX, e.clientY);\n onMoveAnchor(dragAnchor, world.x, world.y);\n return;\n }\n if (vertexDrag && selectedShape) {\n try {\n svgRef.current?.setPointerCapture?.(e.pointerId);\n } catch {\n /* capture may already be held */\n }\n const world = toWorld(e.clientX, e.clientY);\n const next =\n vertexDrag.type === 'handle'\n ? moveHandle(\n selectedShape.geometry,\n vertexDrag.ringIndex,\n vertexDrag.edgeIndex,\n vertexDrag.handle,\n world,\n )\n : vertexDrag.type === 'bend'\n ? bendEdgeToCubic(\n selectedShape.geometry,\n vertexDrag.ringIndex,\n vertexDrag.edgeIndex,\n world,\n )\n : moveVertex(\n selectedShape.geometry,\n vertexDrag.polygonIndex,\n vertexDrag.vertexIndex,\n world,\n );\n onUpdateShapeGeometry(selectedShape.id, next, { live: true });\n return;\n }\n if (shapeDrag) {\n const world = toWorld(e.clientX, e.clientY);\n setShapeOffset({\n x: world.x - shapeDrag.start.x,\n y: world.y - shapeDrag.start.y,\n });\n return;\n }\n if ((tool === 'draw-unit' || tool === 'draw-line') && drawing.length > 0) {\n const world = toWorld(e.clientX, e.clientY);\n setDrawing((prev) => {\n if (prev.length === 0) return prev;\n return [prev[0], world];\n });\n }\n if (tool === 'draw-polygon' && polygonPoints.length > 0) {\n const world = toWorld(e.clientX, e.clientY);\n const snap = snapPolygonPoint(world);\n setPolygonSnap(snap);\n setRubberCursor(snap ?? world);\n }\n if (wayfindingOn && !stubDrag && dragAnchor == null) {\n const world = toWorld(e.clientX, e.clientY);\n if (\n routeDraftPoint ||\n storeLinkPreview ||\n (canPlaceNewRoute(tool) && lastRouteAnchor != null)\n ) {\n setRubberCursor(world);\n }\n const storeExclude = storeLinkOriginIds(anchors, storeLinkPreview);\n const snap = nearestRouteSnap(\n world,\n anchors,\n edges,\n storeExclude,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n );\n setRouteHover(\n snap?.type === 'edge'\n ? { edgeId: snap.edgeId, point: snap.point }\n : null,\n );\n }\n if (canJoinOpenEnds(tool) && !readOnly) {\n const world = toWorld(e.clientX, e.clientY);\n const snapTol = worldPx(SNAP_HIT_PX);\n const endHit = hitOpenEnd(\n splitJoinShapes,\n world,\n snapTol,\n splitJoinPending,\n );\n if (endHit && splitJoinPending) {\n setSplitJoinSnapEnd(endHit);\n setRubberCursor(endHit.point);\n setSplitJoinHover(null);\n } else {\n setSplitJoinSnapEnd(null);\n setRubberCursor(splitJoinPending ? world : null);\n setSplitJoinHover(\n isSplitJoinTool(tool) && !nearSplitJoinAnchor(world, snapTol)\n ? hitSplitJoinEdge(splitJoinShapes, world, worldPx(VERTEX_HIT_PX))\n : null,\n );\n }\n }\n };\n\n const finishRect = () => {\n if (drawing.length < 2) {\n setDrawing([]);\n return;\n }\n const [a, b] = [drawing[0], drawing[drawing.length - 1]];\n if (dragSize(a, b) < 2) {\n setDrawing([]);\n return;\n }\n const poly = rectPolygon(a, b);\n onCreateShape('unit', polygonsToGeometry([poly]));\n setDrawing([]);\n };\n\n const finishLine = () => {\n if (drawing.length < 2) {\n setDrawing([]);\n return;\n }\n const [a, b] = [drawing[0], drawing[drawing.length - 1]];\n if (dragSize(a, b) < 2) {\n setDrawing([]);\n return;\n }\n const geometry: ShapeGeometry = {\n paths: [{ d: `M ${a.x} ${a.y} L ${b.x} ${b.y}`, closed: false }],\n polygons: [],\n };\n onCreateShape('wall', geometry);\n setDrawing([]);\n };\n\n const onPointerUp = (e: React.PointerEvent) => {\n if (pinchRef.current) return;\n const endedPan = panStart.current;\n panStart.current = null;\n setIsPanning(false);\n if (endedPan?.fromEmptySelect) {\n const moved = Math.hypot(\n e.clientX - endedPan.clientX,\n e.clientY - endedPan.clientY,\n );\n if (moved < 4) {\n onSelectShape(null);\n onSelectAnchors([]);\n setSelectedVertex(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n setSplitJoinPending(null);\n setSplitJoinSnapEnd(null);\n setRubberCursor(null);\n }\n }\n onHistoryGestureEnd?.();\n if (stubDrag) {\n try {\n svgRef.current?.releasePointerCapture?.(e.pointerId);\n } catch {\n /* capture may already be released */\n }\n const moved = Math.hypot(\n e.clientX - stubDrag.clientX,\n e.clientY - stubDrag.clientY,\n );\n if (moved >= 4) {\n onConnectShapeToRoute(\n stubDrag.shapeId,\n stubDrag.origin,\n stubDrag.cursor,\n worldPx(WAYFINDING_SNAP_PX),\n );\n }\n setStubDrag(null);\n return;\n }\n if (edgePress) {\n if (!edgePress.dragging && selectedShape) {\n insertAnchorOnEdge(\n selectedShape,\n edgePress.ringIndex,\n edgePress.edgeIndex,\n edgePress.insertAt,\n );\n }\n setEdgePress(null);\n return;\n }\n if (vertexDrag) {\n setVertexDrag(null);\n return;\n }\n if (shapeDrag && selectedShape) {\n const next = translateGeometry(\n shapeDrag.originGeometry,\n shapeOffset.x,\n shapeOffset.y,\n );\n if (Math.hypot(shapeOffset.x, shapeOffset.y) >= 0.5) {\n onUpdateShapeGeometry(selectedShape.id, next);\n }\n setShapeDrag(null);\n setShapeOffset({ x: 0, y: 0 });\n return;\n }\n if (dragAnchor != null) {\n const moved = anchors.find((a) => a.id === dragAnchor);\n if (moved) {\n const near = anchors\n .filter((a) => a.id !== moved.id)\n .filter((a) => Math.hypot(a.x - moved.x, a.y - moved.y) <= 2.5)\n .map((a) => a.id);\n if (near.length) onSelectAnchors([moved.id, ...near]);\n }\n setDragAnchor(null);\n return;\n }\n if (tool === 'draw-unit') finishRect();\n if (tool === 'draw-line') finishLine();\n };\n\n const pathDFromGeometry = (geometry: CmShape['geometry']): string => {\n const rings = geometryToRings(geometry);\n if (rings.length > 0) {\n return rings.map(ringToPathD).join(' ');\n }\n return (\n geometry.paths.map((p) => p.d).join(' ') ||\n polygonsToPath(geometry.polygons)\n );\n };\n\n const shapePathD = (shape: CmShape): string => {\n if (\n selectedShapeId === shape.id &&\n displayGeometry &&\n shapeDrag?.shapeId === shape.id\n ) {\n return pathDFromGeometry(displayGeometry);\n }\n return pathDFromGeometry(shape.geometry);\n };\n\n const stubExcludeIds = stubDrag\n ? storeLinkOriginIds(anchors, stubDrag)\n : storeLinkPreview\n ? storeLinkOriginIds(anchors, storeLinkPreview)\n : null;\n const stubSnap =\n stubDrag && stubExcludeIds\n ? nearestRouteSnap(\n stubDrag.cursor,\n anchors,\n edges,\n stubExcludeIds,\n worldPx(WAYFINDING_SNAP_PX),\n )\n : storeLinkPreview && rubberCursor && stubExcludeIds\n ? nearestRouteSnap(\n rubberCursor,\n anchors,\n edges,\n stubExcludeIds,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n )\n : null;\n const lastRoutePoint =\n lastRouteAnchor != null ? anchorById.get(lastRouteAnchor) : undefined;\n const routeRubberSnap =\n !stubDrag &&\n !storeLinkPreview &&\n rubberCursor &&\n (routeDraftPoint ||\n (canPlaceNewRoute(tool) && lastRouteAnchor != null))\n ? nearestRouteSnap(\n rubberCursor,\n anchors,\n edges,\n new Set(),\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n )\n : null;\n const rubberFrom =\n stubDrag?.origin ??\n storeLinkPreview?.origin ??\n routeDraftPoint ??\n (canPlaceNewRoute(tool) && lastRoutePoint\n ? { x: lastRoutePoint.x, y: lastRoutePoint.y }\n : null);\n const rubberTo =\n stubDrag != null\n ? stubSnap?.point ?? stubDrag.cursor\n : stubSnap?.point ??\n routeRubberSnap?.point ??\n routeHover?.point ??\n rubberCursor;\n const rubberBand =\n (stubDrag != null ||\n storeLinkPreview != null ||\n routeDraftPoint != null ||\n (canPlaceNewRoute(tool) && lastRouteAnchor != null && rubberCursor != null))\n ? routeRubberBand(rubberFrom, rubberTo)\n : null;\n const polygonFollow =\n tool === 'draw-polygon' && polygonPoints.length > 0\n ? routeRubberBand(polygonPoints[polygonPoints.length - 1], rubberCursor)\n : null;\n const polygonClose =\n tool === 'draw-polygon' && polygonPoints.length >= 2\n ? routeRubberBand(rubberCursor, polygonPoints[0])\n : null;\n\n if (!level) {\n return (\n <div className={`eyeon-map-canvas${showGrid ? ' eyeon-map-canvas--grid' : ''}`}>\n <div className=\"eyeon-map-canvas__empty\">\n Choose a floor or Outdoor to edit\n </div>\n </div>\n );\n }\n\n return (\n <div\n ref={canvasRef}\n className={`eyeon-map-canvas${showGrid ? ' eyeon-map-canvas--grid' : ''}`}\n onPointerDownCapture={onCanvasPointerDownCapture}\n onPointerMoveCapture={onCanvasPointerMoveCapture}\n onPointerUpCapture={onCanvasPointerUpCapture}\n onPointerCancelCapture={onCanvasPointerUpCapture}\n >\n <svg\n ref={svgRef}\n className={`eyeon-map-canvas__svg${routeHover && !stubDrag ? ' is-adding-route-point' : ''}`}\n viewBox={`${viewbox.x} ${viewbox.y} ${viewbox.width} ${viewbox.height}`}\n style={{\n cursor:\n routeHover && !stubDrag\n ? 'none'\n : dragAnchor != null || stubDrag\n ? 'grabbing'\n : edgePress?.dragging\n ? 'grabbing'\n : hoveredEdge\n ? 'none'\n : tool === 'draw-text'\n ? 'text'\n : isPanning || shapeDrag\n ? 'grabbing'\n : emptyCanvasDragPans(tool)\n ? 'grab'\n : undefined,\n }}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n onPointerLeave={() => setRouteHover(null)}\n onMouseDown={(e) => {\n if (tool !== 'draw-text') e.preventDefault();\n }}\n onDoubleClick={(e) => {\n e.preventDefault();\n window.getSelection()?.removeAllRanges();\n }}\n >\n <g transform={`translate(${pan.x}, ${pan.y}) scale(${zoom})`}>\n {svgUnderlayUrl && !wayfindingOn ? (\n <OutdoorSvgUnderlay\n url={svgUnderlayUrl}\n imageProxyUrl={imageProxyUrl}\n suppressIds={svgSuppressIds}\n />\n ) : null}\n\n {!wayfindingOn &&\n underlayShapes.map((shape) => {\n const hintable = isUnderlayHintShape(shape.kind);\n const hovered = hintable && hoveredShapeId === shape.id;\n return (\n <path\n key={`base-${shape.id}`}\n d={\n shape.geometry.paths.map((p) => p.d).join(' ') ||\n polygonsToPath(shape.geometry.polygons)\n }\n fill={editorShapeFill(shape, theme)}\n fillOpacity={hovered ? 0.4 : hintable ? 0.22 : 0.32}\n stroke={hovered ? theme.ACCENT_COLOR : '#94a3b8'}\n strokeWidth={(hovered ? 2 : 1) / zoom}\n strokeDasharray={hintable ? `${5 / zoom} ${4 / zoom}` : undefined}\n pointerEvents={hintable ? 'auto' : 'none'}\n style={{ cursor: hintable ? 'pointer' : undefined }}\n onPointerEnter={\n hintable\n ? (e) => {\n setHoveredShapeId(shape.id);\n moveUnderlayTip(e, shape.kind);\n }\n : undefined\n }\n onPointerMove={\n hintable ? (e) => moveUnderlayTip(e, shape.kind) : undefined\n }\n onPointerLeave={\n hintable\n ? () => {\n setHoveredShapeId((id) => (id === shape.id ? null : id));\n setUnderlayTip(null);\n }\n : undefined\n }\n onPointerDown={\n hintable\n ? (e) => {\n e.stopPropagation();\n setUnderlayTip(null);\n onSelectShape(shape.id);\n }\n : undefined\n }\n />\n );\n })}\n\n {editableShapes.map((shape) => {\n const highlightable = isHoverHighlightShape(shape.kind);\n const selected = selectedShapeId === shape.id;\n const hovered = highlightable && hoveredShapeId === shape.id && !selected;\n const dragging = shapeDrag?.shapeId === shape.id;\n const cursor =\n editorSelectCursor({\n tool,\n selected,\n highlightable,\n dragging,\n wayfinding:\n wayfindingOn &&\n !readOnly &&\n isWayfindingShape(shape.kind) &&\n !isTextLabel(shape),\n }) ?? (canSelectShapes(tool) && !readOnly ? undefined : 'default');\n const beginShapePointerDown = (e: React.PointerEvent) => {\n if (readOnly) return;\n if (storeLinkPreview) return;\n if (\n wayfindingOn &&\n wayfindingLinksShapes(level) &&\n isWayfindingShape(shape.kind) &&\n !isTextLabel(shape)\n ) {\n e.stopPropagation();\n const origin = toWorld(e.clientX, e.clientY);\n onEnsureShapeAnchor(shape.id, origin);\n setRouteDraftPoint(null);\n setLastRouteAnchor(null);\n setStoreLinkPreview({ shapeId: shape.id, origin });\n setRubberCursor(origin);\n return;\n }\n if (!canSelectShapes(tool)) return;\n e.stopPropagation();\n const worldAt = toWorld(e.clientX, e.clientY);\n if (isSplitJoinTool(tool)) {\n if (beginSplitJoinVertexDrag(worldAt, e)) return;\n if (\n !canSplitJoinKind(shape.kind) ||\n !handleSplitJoinAt(worldAt)\n ) {\n onSelectShape(shape.id);\n }\n return;\n }\n if (tryJoinOpenEnd(worldAt)) return;\n onSelectShape(shape.id);\n if (tool !== 'select') return;\n const canDrag = selected || highlightable;\n if (!canDrag) return;\n const world = toWorld(e.clientX, e.clientY);\n const geometry =\n selected && displayGeometry\n ? displayGeometry\n : shape.geometry;\n setShapeDrag({\n shapeId: shape.id,\n start: world,\n originGeometry: geometry,\n });\n setShapeOffset({ x: 0, y: 0 });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n };\n const hoverHandlers = highlightable\n ? {\n onPointerEnter: () => setHoveredShapeId(shape.id),\n onPointerLeave: () =>\n setHoveredShapeId((id) => (id === shape.id ? null : id)),\n }\n : undefined;\n if (isTextLabel(shape)) {\n const geometry =\n selected && displayGeometry\n ? displayGeometry\n : shape.geometry;\n const box = geometryBBox(geometry);\n const size = shape.label.size ?? defaultLabelSize(viewbox);\n return (\n <g key={shape.id} style={{ cursor: cursor ?? 'default' }} {...hoverHandlers}>\n <path\n d={shapePathD({ ...shape, geometry })}\n fill=\"transparent\"\n stroke={\n selected || hovered ? theme.ACCENT_COLOR : 'transparent'\n }\n strokeWidth={selected || hovered ? 1.5 / zoom : 0}\n onPointerDown={beginShapePointerDown}\n />\n <text\n x={box.minX}\n y={box.maxY}\n fontSize={size}\n fill={shape.label.color ?? theme.STORE_TEXT_COLOR}\n style={{ userSelect: 'none' }}\n onPointerDown={beginShapePointerDown}\n >\n {shape.label.text}\n </text>\n </g>\n );\n }\n const baseOpacity = editorShapeFillOpacity(shape.kind);\n return (\n <path\n key={shape.id}\n d={shapePathD(shape)}\n fill={editorShapeFill(shape, theme)}\n fillOpacity={editorHoverFillOpacity(\n shape.kind,\n baseOpacity,\n hovered,\n )}\n stroke={\n selected || hovered ? theme.ACCENT_COLOR : '#64748b'\n }\n strokeWidth={\n selected ? 2.5 / zoom : hovered ? 2 / zoom : 1 / zoom\n }\n onPointerDown={beginShapePointerDown}\n style={{ cursor }}\n {...hoverHandlers}\n />\n );\n })}\n\n {/* Anchors (Select, Curve, Split / Join) + curve helpers (Curve only) */}\n {canSelectShapes(tool) &&\n selectedShape &&\n !isTextLabel(selectedShape) &&\n geometryToRings(displayGeometry ?? selectedShape.geometry).map(\n (ring, ri) => {\n const n = edgeCount(ring);\n const items: React.ReactNode[] = [];\n for (let ei = 0; ei < n; ei++) {\n const edge = ring.edges[ei];\n const from = edgeFrom(ring, ei);\n const to = edgeTo(ring, ei);\n const hovered =\n hoveredEdge?.ringIndex === ri && hoveredEdge.edgeIndex === ei;\n const strokeD = edgeToPathD(ring, ei);\n if (tool === 'select') {\n items.push(\n <path\n key={`edge-hit-${selectedShape.id}-${ri}-${ei}`}\n d={strokeD}\n fill=\"none\"\n stroke=\"transparent\"\n strokeWidth={worldPx(VERTEX_HIT_PX * 2)}\n strokeLinecap=\"round\"\n style={{\n cursor: edgePress?.dragging ? 'grabbing' : 'none',\n }}\n onPointerEnter={(e) =>\n hoverEdgeAt(ri, ei, e.clientX, e.clientY)\n }\n onPointerMove={(e) =>\n hoverEdgeAt(ri, ei, e.clientX, e.clientY)\n }\n onPointerLeave={() =>\n setHoveredEdge((prev) =>\n prev?.ringIndex === ri && prev.edgeIndex === ei\n ? null\n : prev,\n )\n }\n onPointerDown={(e) => {\n if (tool !== 'select') return;\n const world = toWorld(e.clientX, e.clientY);\n const clickRing = geometryToRings(\n displayGeometry ?? selectedShape.geometry,\n )[ri];\n beginEdgePress(\n ri,\n ei,\n clickRing\n ? pointOnRingEdge(clickRing, ei, world)\n : world,\n e,\n );\n }}\n />,\n );\n if (hovered && hoveredEdge && !edgePress?.dragging) {\n const preview = hoveredEdge.point;\n const plus = worldPx(5);\n items.push(\n <path\n key={`edge-glow-${selectedShape.id}-${ri}-${ei}`}\n d={strokeD}\n fill=\"none\"\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(14)}\n strokeOpacity={0.22}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n pointerEvents=\"none\"\n />,\n <path\n key={`edge-hi-${selectedShape.id}-${ri}-${ei}`}\n d={strokeD}\n fill=\"none\"\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(3.5)}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n pointerEvents=\"none\"\n />,\n <g\n key={`edge-add-${selectedShape.id}-${ri}-${ei}`}\n pointerEvents=\"none\"\n >\n <circle\n cx={preview.x}\n cy={preview.y}\n r={worldPx(9)}\n fill=\"#fff\"\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(2)}\n />\n <path\n d={`M ${preview.x} ${preview.y - plus} L ${preview.x} ${preview.y + plus} M ${preview.x - plus} ${preview.y} L ${preview.x + plus} ${preview.y}`}\n fill=\"none\"\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(2)}\n strokeLinecap=\"round\"\n />\n </g>,\n );\n }\n }\n if (!showsCurveHandles(tool)) continue;\n if (edge?.kind === 'cubic') {\n const h1 = selectedHandle?.ringIndex === ri &&\n selectedHandle.edgeIndex === ei &&\n selectedHandle.handle === 1;\n const h2 = selectedHandle?.ringIndex === ri &&\n selectedHandle.edgeIndex === ei &&\n selectedHandle.handle === 2;\n items.push(\n <line\n key={`hl1-${selectedShape.id}-${ri}-${ei}`}\n x1={from.x}\n y1={from.y}\n x2={edge.c1.x}\n y2={edge.c1.y}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={1 / zoom}\n strokeOpacity={0.55}\n pointerEvents=\"none\"\n />,\n <line\n key={`hl2-${selectedShape.id}-${ri}-${ei}`}\n x1={to.x}\n y1={to.y}\n x2={edge.c2.x}\n y2={edge.c2.y}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={1 / zoom}\n strokeOpacity={0.55}\n pointerEvents=\"none\"\n />,\n <HandleDot\n key={`h1-${selectedShape.id}-${ri}-${ei}`}\n cx={edge.c1.x}\n cy={edge.c1.y}\n r={worldPx(h1 ? HANDLE_R_SELECTED_PX : HANDLE_R_PX)}\n hitR={worldPx(HANDLE_HIT_PX)}\n fill={h1 ? theme.ACCENT_COLOR : '#fff'}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n onDoubleClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n if (!showsCurveHandles(tool)) return;\n deleteShapeHandle(ri, ei);\n }}\n onPointerDown={(e) => {\n if (!showsCurveHandles(tool)) return;\n e.stopPropagation();\n if (e.detail >= 2) {\n deleteShapeHandle(ri, ei);\n return;\n }\n setSelectedHandle({\n ringIndex: ri,\n edgeIndex: ei,\n handle: 1,\n });\n setSelectedVertex(null);\n setVertexDrag({\n type: 'handle',\n shapeId: selectedShape.id,\n ringIndex: ri,\n edgeIndex: ei,\n handle: 1,\n });\n }}\n />,\n <HandleDot\n key={`h2-${selectedShape.id}-${ri}-${ei}`}\n cx={edge.c2.x}\n cy={edge.c2.y}\n r={worldPx(h2 ? HANDLE_R_SELECTED_PX : HANDLE_R_PX)}\n hitR={worldPx(HANDLE_HIT_PX)}\n fill={h2 ? theme.ACCENT_COLOR : '#fff'}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n onDoubleClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n if (!showsCurveHandles(tool)) return;\n deleteShapeHandle(ri, ei);\n }}\n onPointerDown={(e) => {\n if (!showsCurveHandles(tool)) return;\n e.stopPropagation();\n if (e.detail >= 2) {\n deleteShapeHandle(ri, ei);\n return;\n }\n setSelectedHandle({\n ringIndex: ri,\n edgeIndex: ei,\n handle: 2,\n });\n setSelectedVertex(null);\n setVertexDrag({\n type: 'handle',\n shapeId: selectedShape.id,\n ringIndex: ri,\n edgeIndex: ei,\n handle: 2,\n });\n }}\n />,\n );\n } else {\n const mid = {\n x: (from.x + to.x) / 2,\n y: (from.y + to.y) / 2,\n };\n items.push(\n <HandleDot\n key={`bend-${selectedShape.id}-${ri}-${ei}`}\n cx={mid.x}\n cy={mid.y}\n r={worldPx(BEND_R_PX)}\n hitR={worldPx(HANDLE_HIT_PX)}\n fill=\"#fff\"\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"grab\"\n onPointerDown={(e) => {\n if (!showsCurveHandles(tool)) return;\n e.stopPropagation();\n setSelectedVertex(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n setVertexDrag({\n type: 'bend',\n shapeId: selectedShape.id,\n ringIndex: ri,\n edgeIndex: ei,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n }}\n />,\n );\n }\n }\n if (!showsShapeAnchors(tool)) return items;\n ring.anchors.forEach((vertex, vi) => {\n if (\n canJoinOpenEnds(tool) &&\n !ring.closed &&\n (vi === 0 || vi === ring.anchors.length - 1)\n ) {\n return;\n }\n const selected =\n selectedVertex?.polygonIndex === ri &&\n selectedVertex?.vertexIndex === vi;\n items.push(\n <HandleDot\n key={`v-${selectedShape.id}-${ri}-${vi}`}\n cx={vertex.x}\n cy={vertex.y}\n r={worldPx(selected ? VERTEX_R_SELECTED_PX : VERTEX_R_PX)}\n hitR={worldPx(VERTEX_HIT_PX)}\n fill={selected ? theme.ACCENT_COLOR : '#fff'}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n onDoubleClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n if (!showsShapeAnchors(tool)) return;\n deleteShapeAnchor(ri, vi);\n }}\n onPointerDown={(e) => {\n if (!showsShapeAnchors(tool)) return;\n e.stopPropagation();\n if (e.detail >= 2) {\n deleteShapeAnchor(ri, vi);\n return;\n }\n setSelectedVertex({ polygonIndex: ri, vertexIndex: vi });\n setSelectedHandle(null);\n setVertexDrag({\n type: 'anchor',\n shapeId: selectedShape.id,\n polygonIndex: ri,\n vertexIndex: vi,\n });\n }}\n />,\n );\n });\n return items;\n },\n )}\n\n {wayfindingOn &&\n edges.map((edge) => {\n const a = anchorById.get(edge.fromAnchorId);\n const b = anchorById.get(edge.toAnchorId);\n if (!a || !b) return null;\n const hoverJoin =\n routeHover?.edgeId === edge.id ||\n (stubSnap?.type === 'edge' && stubSnap.edgeId === edge.id);\n const plusAt =\n routeHover?.edgeId === edge.id\n ? routeHover.point\n : stubSnap?.type === 'edge' && stubSnap.edgeId === edge.id\n ? stubSnap.point\n : null;\n return (\n <g key={edge.id} pointerEvents=\"none\">\n {hoverJoin && (\n <line\n x1={a.x}\n y1={a.y}\n x2={b.x}\n y2={b.y}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(12)}\n strokeOpacity={0.22}\n strokeLinecap=\"round\"\n />\n )}\n <line\n x1={a.x}\n y1={a.y}\n x2={b.x}\n y2={b.y}\n stroke={hoverJoin ? '#22c55e' : theme.ACCENT_COLOR}\n strokeWidth={8 / zoom}\n strokeLinecap=\"round\"\n strokeOpacity={hoverJoin ? 1 : 0.95}\n />\n {plusAt && !stubDrag && (\n <g>\n <circle\n cx={plusAt.x}\n cy={plusAt.y}\n r={worldPx(9)}\n fill=\"#fff\"\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(2)}\n />\n <path\n d={`M ${plusAt.x} ${plusAt.y - worldPx(5)} L ${plusAt.x} ${plusAt.y + worldPx(5)} M ${plusAt.x - worldPx(5)} ${plusAt.y} L ${plusAt.x + worldPx(5)} ${plusAt.y}`}\n fill=\"none\"\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(2)}\n strokeLinecap=\"round\"\n />\n </g>\n )}\n </g>\n );\n })}\n\n {wayfindingOn && rubberBand && (\n <g pointerEvents=\"none\">\n <line\n x1={rubberBand.from.x}\n y1={rubberBand.from.y}\n x2={rubberBand.to.x}\n y2={rubberBand.to.y}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={8 / zoom}\n strokeOpacity={0.85}\n strokeLinecap=\"round\"\n />\n {(stubDrag || storeLinkPreview) && (\n <HandleDot\n cx={rubberBand.to.x}\n cy={rubberBand.to.y}\n r={worldPx(stubSnap ? ANCHOR_R_SELECTED_PX : ANCHOR_R_PX)}\n hitR={worldPx(ANCHOR_HIT_PX)}\n fill={stubSnap ? '#22c55e' : theme.ACCENT_COLOR}\n fillOpacity={0.85}\n stroke=\"#fff\"\n strokeWidth={worldPx(ANCHOR_STROKE_PX)}\n cursor=\"grabbing\"\n />\n )}\n </g>\n )}\n\n {wayfindingOn && routeDraftPoint && (\n <HandleDot\n cx={routeDraftPoint.x}\n cy={routeDraftPoint.y}\n r={worldPx(ANCHOR_R_PX)}\n hitR={worldPx(ANCHOR_HIT_PX)}\n fill=\"#0f172a\"\n fillOpacity={1}\n stroke=\"#fff\"\n strokeWidth={worldPx(ANCHOR_STROKE_PX)}\n cursor=\"default\"\n />\n )}\n\n {wayfindingOn &&\n anchors\n .filter((anchor) => wayfindingLinksShapes(level) || anchor.shapeId == null)\n .map((anchor) => {\n const selected = selectedAnchorIds.includes(anchor.id);\n const hovered = hoveredAnchorId === anchor.id;\n const shapeNode = anchor.shapeId != null;\n const connected = anchorHasEdge(anchor.id, edges);\n const nearWeld =\n selected &&\n selectedAnchorIds.some((id) => {\n if (id === anchor.id) return false;\n const other = anchorById.get(id);\n return other && Math.hypot(other.x - anchor.x, other.y - anchor.y) <= 2.5;\n });\n const visR = selected || shapeNode ? ANCHOR_R_SELECTED_PX : ANCHOR_R_PX;\n return (\n <g key={anchor.id}>\n <HandleDot\n cx={anchor.x}\n cy={anchor.y}\n r={worldPx(visR)}\n hitR={worldPx(WAYFINDING_ANCHOR_HIT_PX)}\n fill={\n nearWeld\n ? '#22c55e'\n : shapeNode\n ? hovered\n ? '#f97316'\n : SHAPE_ROUTE_ANCHOR_FILL\n : selected\n ? hovered\n ? '#3b82f6'\n : theme.ACCENT_COLOR\n : hovered\n ? '#334155'\n : '#0f172a'\n }\n fillOpacity={1}\n stroke={selected && shapeNode ? theme.ACCENT_COLOR : '#fff'}\n strokeWidth={worldPx(ANCHOR_STROKE_PX)}\n cursor={\n readOnly\n ? 'default'\n : dragAnchor === anchor.id\n ? 'grabbing'\n : 'pointer'\n }\n onPointerEnter={() => {\n if (!readOnly) setHoveredAnchorId(anchor.id);\n }}\n onPointerLeave={() =>\n setHoveredAnchorId((id) => (id === anchor.id ? null : id))\n }\n onDoubleClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n removeWayfindingAnchor(anchor.id);\n }}\n onPointerDown={(e) => {\n e.stopPropagation();\n if (readOnly || !wayfindingOn) return;\n if (e.detail >= 2) {\n removeWayfindingAnchor(anchor.id);\n return;\n }\n const world = toWorld(e.clientX, e.clientY);\n const storeExclude = storeLinkOriginIds(anchors, storeLinkPreview);\n const snap = nearestRouteSnap(\n world,\n anchors,\n edges,\n storeExclude,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n );\n if (storeLinkPreview) {\n if (\n storeExclude.has(anchor.id) &&\n snap?.type !== 'edge' &&\n snap?.type !== 'junction'\n ) {\n return;\n }\n if (snap?.type === 'edge' || snap?.type === 'junction') {\n onConnectShapeToRoute(\n storeLinkPreview.shapeId,\n storeLinkPreview.origin,\n snap.point,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n );\n setStoreLinkPreview(null);\n setRubberCursor(null);\n return;\n }\n if (storeExclude.has(anchor.id)) return;\n onConnectShapeToRoute(\n storeLinkPreview.shapeId,\n storeLinkPreview.origin,\n { x: anchor.x, y: anchor.y },\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n );\n setStoreLinkPreview(null);\n setRubberCursor(null);\n return;\n }\n if (snap?.type === 'edge') {\n insertHoveredRoutePoint(snap.edgeId, snap.point);\n return;\n }\n if (canPlaceNewRoute(tool) && routeDraftPoint) {\n onCreateRoutePoint(routeDraftPoint, anchor.id);\n setRouteDraftPoint(null);\n setLastRouteAnchor(nextRouteChainAnchor(tool, anchor.id));\n setRubberCursor({ x: anchor.x, y: anchor.y });\n onSelectAnchors([anchor.id]);\n return;\n }\n if (\n canPlaceNewRoute(tool) &&\n lastRouteAnchor != null &&\n lastRouteAnchor !== anchor.id\n ) {\n onLinkRouteAnchors?.(lastRouteAnchor, anchor.id);\n setLastRouteAnchor(nextRouteChainAnchor(tool, anchor.id));\n setRubberCursor({ x: anchor.x, y: anchor.y });\n onSelectAnchors([anchor.id]);\n return;\n }\n if (shapeNode && !connected) {\n setRouteDraftPoint(null);\n setLastRouteAnchor(null);\n setStoreLinkPreview({\n shapeId: anchor.shapeId!,\n origin: { x: anchor.x, y: anchor.y },\n });\n setRubberCursor({ x: anchor.x, y: anchor.y });\n return;\n }\n setLastRouteAnchor(anchor.id);\n onSelectAnchors(\n e.shiftKey\n ? selectedAnchorIds.includes(anchor.id)\n ? selectedAnchorIds.filter((id) => id !== anchor.id)\n : [...selectedAnchorIds, anchor.id]\n : [anchor.id],\n );\n setDragAnchor(anchor.id);\n e.currentTarget.setPointerCapture?.(e.pointerId);\n }}\n />\n </g>\n );\n })}\n\n {canJoinOpenEnds(tool) &&\n !readOnly &&\n splitJoinShapes.flatMap((shape) => {\n const rings = geometryToRings(shape.geometry);\n const items: React.ReactNode[] = [];\n if (isSplitJoinTool(tool)) {\n rings.forEach((ring, ri) => {\n const n = edgeCount(ring);\n for (let ei = 0; ei < n; ei++) {\n const hovered =\n splitJoinHover?.shapeId === shape.id &&\n splitJoinHover.ringIndex === ri &&\n splitJoinHover.edgeIndex === ei;\n items.push(\n <path\n key={`sj-hit-${shape.id}-${ri}-${ei}`}\n d={edgeToPathD(ring, ei)}\n fill=\"none\"\n stroke={hovered ? theme.ACCENT_COLOR : 'transparent'}\n strokeWidth={worldPx(hovered ? 10 : VERTEX_HIT_PX * 2)}\n strokeOpacity={hovered ? 0.28 : 1}\n strokeLinecap=\"round\"\n style={{ cursor: 'cell' }}\n onPointerLeave={() =>\n setSplitJoinHover((prev) =>\n prev?.shapeId === shape.id &&\n prev.ringIndex === ri &&\n prev.edgeIndex === ei\n ? null\n : prev,\n )\n }\n onPointerDown={(e) => {\n e.stopPropagation();\n handleSplitJoinAt(toWorld(e.clientX, e.clientY));\n }}\n />,\n );\n }\n });\n }\n listOpenEnds(shape.geometry).forEach((end) => {\n const id = {\n shapeId: shape.id,\n ringIndex: end.ringIndex,\n end: end.end,\n };\n const pending =\n splitJoinPending != null && sameOpenEnd(splitJoinPending, id);\n const snapped =\n splitJoinSnapEnd != null && sameOpenEnd(splitJoinSnapEnd, id);\n items.push(\n <HandleDot\n key={`sj-end-${shape.id}-${end.ringIndex}-${end.end}`}\n cx={end.point.x}\n cy={end.point.y}\n r={worldPx(VERTEX_R_PX)}\n hitR={worldPx(SNAP_HIT_PX)}\n fill={pending || snapped ? theme.ACCENT_COLOR : '#fff'}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"pointer\"\n onPointerDown={(e) => {\n e.stopPropagation();\n tryJoinOpenEnd(end.point);\n }}\n />,\n );\n });\n return items;\n })}\n\n {isSplitJoinTool(tool) &&\n splitJoinHover &&\n !splitJoinHover.shared &&\n !splitJoinSnapEnd &&\n !nearSplitJoinAnchor(splitJoinHover.point, worldPx(SNAP_HIT_PX)) &&\n (() => {\n const shape = splitJoinShapes.find(\n (s) => s.id === splitJoinHover.shapeId,\n );\n if (!shape) return null;\n const preview = previewCutPoints(\n shape.geometry,\n splitJoinHover.ringIndex,\n splitJoinHover.edgeIndex,\n splitJoinHover.point,\n worldPx(SPLIT_JOIN_GAP_PX),\n );\n if (!preview) return null;\n const hideOnAnchor = worldPx(VERTEX_R_PX + 2);\n if (\n nearSplitJoinAnchor(preview.p1, hideOnAnchor) ||\n nearSplitJoinAnchor(preview.p2, hideOnAnchor)\n ) {\n return null;\n }\n return (\n <g pointerEvents=\"none\">\n <circle\n cx={preview.p1.x}\n cy={preview.p1.y}\n r={worldPx(BEND_R_PX)}\n fill=\"#fff\"\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n />\n <circle\n cx={preview.p2.x}\n cy={preview.p2.y}\n r={worldPx(BEND_R_PX)}\n fill=\"#fff\"\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n />\n </g>\n );\n })()}\n\n {canJoinOpenEnds(tool) &&\n splitJoinPending &&\n rubberCursor &&\n (() => {\n const shape = splitJoinShapes.find(\n (s) => s.id === splitJoinPending.shapeId,\n );\n const from = shape\n ? listOpenEnds(shape.geometry).find(\n (end) =>\n end.ringIndex === splitJoinPending.ringIndex &&\n end.end === splitJoinPending.end,\n )?.point\n : null;\n if (!from) return null;\n const snapped = splitJoinSnapEnd != null;\n return (\n <line\n x1={from.x}\n y1={from.y}\n x2={rubberCursor.x}\n y2={rubberCursor.y}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={(snapped ? 2.6 : 2) / zoom}\n strokeDasharray={\n snapped ? undefined : `${6 / zoom} ${4 / zoom}`\n }\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />\n );\n })()}\n\n {drawing.length > 1 && tool === 'draw-unit' && (\n <rect\n x={Math.min(drawing[0].x, drawing[1].x)}\n y={Math.min(drawing[0].y, drawing[1].y)}\n width={Math.abs(drawing[1].x - drawing[0].x)}\n height={Math.abs(drawing[1].y - drawing[0].y)}\n fill={theme.STORE_DEFAULT_COLOR}\n fillOpacity={0.2}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={2 / zoom}\n strokeDasharray={`${6 / zoom} ${4 / zoom}`}\n />\n )}\n {drawing.length > 1 && tool === 'draw-line' && (\n <line\n x1={drawing[0].x}\n y1={drawing[0].y}\n x2={drawing[1].x}\n y2={drawing[1].y}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={2 / zoom}\n strokeDasharray={`${6 / zoom} ${4 / zoom}`}\n strokeLinecap=\"round\"\n />\n )}\n {polygonPoints.length > 0 && tool === 'draw-polygon' && (\n <>\n <polyline\n points={polygonPoints.map((p) => `${p.x},${p.y}`).join(' ')}\n fill=\"none\"\n stroke={theme.ACCENT_COLOR}\n strokeWidth={2 / zoom}\n strokeDasharray={`${6 / zoom} ${4 / zoom}`}\n />\n {polygonFollow && (\n <line\n x1={polygonFollow.from.x}\n y1={polygonFollow.from.y}\n x2={polygonFollow.to.x}\n y2={polygonFollow.to.y}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={(polygonSnap ? 2.6 : 2) / zoom}\n strokeDasharray={\n polygonSnap ? undefined : `${6 / zoom} ${4 / zoom}`\n }\n strokeLinecap=\"round\"\n />\n )}\n {polygonClose && (\n <line\n x1={polygonClose.from.x}\n y1={polygonClose.from.y}\n x2={polygonClose.to.x}\n y2={polygonClose.to.y}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={2 / zoom}\n strokeOpacity={polygonSnap ? 0.7 : 0.4}\n strokeDasharray={\n polygonSnap ? undefined : `${6 / zoom} ${4 / zoom}`\n }\n strokeLinecap=\"round\"\n />\n )}\n {polygonPoints.map((p, i) => {\n const snapped = sameSnapPoint(polygonSnap, p);\n return (\n <HandleDot\n key={`pp-${i}`}\n cx={p.x}\n cy={p.y}\n r={worldPx(i === 0 ? VERTEX_R_SELECTED_PX : VERTEX_R_PX)}\n hitR={worldPx(SNAP_HIT_PX)}\n fill={i === 0 || snapped ? theme.ACCENT_COLOR : '#fff'}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n />\n );\n })}\n {polygonSnap &&\n !polygonPoints.some((p) => sameSnapPoint(polygonSnap, p)) && (\n <HandleDot\n cx={polygonSnap.x}\n cy={polygonSnap.y}\n r={worldPx(VERTEX_R_PX)}\n hitR={worldPx(SNAP_HIT_PX)}\n fill={theme.ACCENT_COLOR}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n />\n )}\n </>\n )}\n </g>\n </svg>\n {underlayTip ? (\n <div\n className=\"eyeon-map-canvas__underlay-tip\"\n style={{ left: underlayTip.x, top: underlayTip.y }}\n role=\"tooltip\"\n >\n {underlayTip.text}\n </div>\n ) : null}\n </div>\n );\n});\n\nEditorCanvas.displayName = 'EditorCanvas';\n","import type {\n BatchOp,\n CmAnchor,\n CmConnector,\n CmLevel,\n CmRouteEdge,\n CmShape,\n ConnectorDirection,\n ConnectorKind,\n Vec2,\n} from '../core';\nimport { distance, geometryCentroid } from '../core';\n\nexport type VerticalRailKind = 'escalator' | 'elevator';\n\nexport interface ParsedConnectorSource {\n family: ConnectorKind;\n group: string;\n direction?: 'up' | 'down';\n role?: 'start' | 'end';\n}\n\nconst FAMILY_PREFIXES: Array<{ prefix: string; family: ConnectorKind }> = [\n { prefix: 'escalator', family: 'escalator' },\n { prefix: 'elevator', family: 'elevator' },\n { prefix: 'travelator', family: 'travelator' },\n { prefix: 'stairs', family: 'stairs' },\n { prefix: 'ramp', family: 'ramp' },\n];\n\nfunction normalizeId(value: string | null | undefined): string {\n return (value ?? '').trim().toLowerCase().replace(/_/g, '-');\n}\n\n/** Parse v1-style ids: `escalator-5-up-start`, `elevator-2`. */\nexport function parseConnectorSourceId(\n value: string | null | undefined,\n): ParsedConnectorSource | null {\n const raw = normalizeId(value);\n if (!raw) return null;\n const family = FAMILY_PREFIXES.find(\n (item) => raw === item.prefix || raw.startsWith(`${item.prefix}-`),\n );\n if (!family) return null;\n const rest = raw.slice(family.prefix.length).replace(/^-+/, '');\n const parts = rest.split('-').filter(Boolean);\n let direction: 'up' | 'down' | undefined;\n let role: 'start' | 'end' | undefined;\n const groupParts: string[] = [];\n for (const part of parts) {\n if (part === 'up' || part === 'down') direction = part;\n else if (part === 'start' || part === 'end') role = part;\n else groupParts.push(part);\n }\n return {\n family: family.family,\n group: groupParts.join('-') || '1',\n direction,\n role,\n };\n}\n\nexport function guessConnectorKind(shape: {\n kind: string;\n key: string;\n sourceSvgId?: string | null;\n}): ConnectorKind | null {\n return (\n parseConnectorSourceId(shape.sourceSvgId)?.family ??\n parseConnectorSourceId(shape.key)?.family ??\n null\n );\n}\n\nexport function connectorIdForShape(\n shapeId: number,\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n): number | null {\n for (const anchor of anchors) {\n if (anchor.shapeId === shapeId && anchor.connectorId != null) {\n return anchor.connectorId;\n }\n }\n return null;\n}\n\nexport function connectorForShape(\n shapeId: number,\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n connectors: CmConnector[],\n): CmConnector | null {\n const id = connectorIdForShape(shapeId, anchors);\n if (id == null) return null;\n return connectors.find((item) => item.id === id) ?? null;\n}\n\nexport function resolvedConnectorKind(\n shape: { id: number; kind: string; key: string; sourceSvgId?: string | null },\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n connectors: CmConnector[],\n): ConnectorKind | null {\n return connectorForShape(shape.id, anchors, connectors)?.kind ?? guessConnectorKind(shape);\n}\n\nexport function railConnectorShapes<\n T extends { id: number; kind: string; key: string; sourceSvgId?: string | null; orphanedAt?: string | null },\n>(\n shapes: T[],\n kind: VerticalRailKind,\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n connectors: CmConnector[],\n): T[] {\n return shapes.filter((shape) => {\n if (shape.orphanedAt) return false;\n if (shape.kind !== 'connector' && guessConnectorKind(shape) !== kind) return false;\n return resolvedConnectorKind(shape, anchors, connectors) === kind;\n });\n}\n\nexport function landingAnchor(\n shapeId: number,\n anchors: CmAnchor[],\n): CmAnchor | undefined {\n return (\n anchors.find((a) => a.shapeId === shapeId && a.kind === 'connector') ??\n anchors.find((a) => a.shapeId === shapeId && a.connectorId != null) ??\n anchors.find((a) => a.shapeId === shapeId)\n );\n}\n\nexport function shapeLandingPoint(shape: Pick<CmShape, 'geometry'>): Vec2 {\n const c = geometryCentroid(shape.geometry);\n if (Number.isFinite(c.x) && Number.isFinite(c.y)) return c;\n const first = shape.geometry.polygons[0]?.[0];\n return first ?? { x: 0, y: 0 };\n}\n\nexport function inferTravelDirection(\n fromLevelIndex: number,\n toLevelIndex: number,\n hint?: 'up' | 'down',\n): ConnectorDirection {\n if (hint) return hint;\n if (toLevelIndex > fromLevelIndex) return 'up';\n if (toLevelIndex < fromLevelIndex) return 'down';\n return 'both';\n}\n\nexport function defaultConnectorName(\n kind: VerticalRailKind,\n shapes: Array<{ key: string; sourceSvgId?: string | null }>,\n): string {\n for (const shape of shapes) {\n const parsed =\n parseConnectorSourceId(shape.sourceSvgId) ?? parseConnectorSourceId(shape.key);\n if (parsed) {\n const label = kind === 'elevator' ? 'Elevator' : 'Escalator';\n return parsed.group && parsed.group !== '1' ? `${label} ${parsed.group}` : label;\n }\n }\n return kind === 'elevator' ? 'Elevator' : 'Escalator';\n}\n\nexport function nearestWalkAnchor(\n anchors: CmAnchor[],\n levelId: number,\n point: Vec2,\n excludeIds: ReadonlySet<number> = new Set(),\n): CmAnchor | null {\n let best: CmAnchor | null = null;\n let bestDist = Infinity;\n for (const anchor of anchors) {\n if (anchor.levelId !== levelId || excludeIds.has(anchor.id)) continue;\n if (anchor.kind !== 'junction' && anchor.kind !== 'unit') continue;\n const d = distance(anchor, point);\n if (d < bestDist) {\n best = anchor;\n bestDist = d;\n }\n }\n return best;\n}\n\nexport function memberShapeIds(\n connectorId: number,\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n): number[] {\n const ids = new Set<number>();\n for (const anchor of anchors) {\n if (anchor.connectorId === connectorId && anchor.shapeId != null) {\n ids.add(anchor.shapeId);\n }\n }\n return [...ids];\n}\n\nfunction connectorEdgesBetween(\n edges: CmRouteEdge[],\n anchorIds: ReadonlySet<number>,\n): CmRouteEdge[] {\n return edges.filter(\n (edge) =>\n edge.kind === 'connector' &&\n anchorIds.has(edge.fromAnchorId) &&\n anchorIds.has(edge.toAnchorId),\n );\n}\n\nexport interface ConnectorPlanContext {\n mapId: number;\n levels: CmLevel[];\n shapes: CmShape[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n connectors: CmConnector[];\n allocId: () => number;\n}\n\nfunction ensureLanding(\n ctx: ConnectorPlanContext,\n shape: CmShape,\n connectorId: number,\n ops: BatchOp[],\n): CmAnchor {\n const existing = landingAnchor(shape.id, ctx.anchors);\n const point = existing\n ? { x: existing.x, y: existing.y }\n : shapeLandingPoint(shape);\n if (existing) {\n if (existing.connectorId !== connectorId || existing.kind !== 'connector') {\n const next: CmAnchor = {\n ...existing,\n kind: 'connector',\n connectorId,\n };\n ops.push({ op: 'upsert_anchor', anchor: next });\n ctx.anchors = ctx.anchors.map((a) => (a.id === next.id ? next : a));\n return next;\n }\n return existing;\n }\n const created: CmAnchor = {\n id: ctx.allocId(),\n levelId: shape.levelId,\n shapeId: shape.id,\n kind: 'connector',\n x: point.x,\n y: point.y,\n connectorId,\n };\n ops.push({ op: 'upsert_anchor', anchor: created });\n ctx.anchors = [...ctx.anchors, created];\n return created;\n}\n\nfunction linkLandingToWalk(\n ctx: ConnectorPlanContext,\n landing: CmAnchor,\n ops: BatchOp[],\n) {\n const near = nearestWalkAnchor(ctx.anchors, landing.levelId, landing, new Set([landing.id]));\n if (!near) return;\n const exists = ctx.edges.some(\n (e) =>\n (e.fromAnchorId === landing.id && e.toAnchorId === near.id) ||\n (e.fromAnchorId === near.id && e.toAnchorId === landing.id),\n );\n if (exists) return;\n const edge: CmRouteEdge = {\n id: ctx.allocId(),\n mapId: ctx.mapId,\n fromAnchorId: landing.id,\n toAnchorId: near.id,\n weight: null,\n directed: false,\n accessible: true,\n kind: 'walk',\n };\n ops.push({ op: 'upsert_edge', edge });\n ctx.edges = [...ctx.edges, edge];\n}\n\nfunction applyUnlinkLocal(ctx: ConnectorPlanContext, connectorId: number): BatchOp[] {\n const memberAnchors = ctx.anchors.filter((a) => a.connectorId === connectorId);\n const ids = new Set(memberAnchors.map((a) => a.id));\n const ops: BatchOp[] = [];\n for (const edge of connectorEdgesBetween(ctx.edges, ids)) {\n ops.push({ op: 'delete_edge', edgeId: edge.id });\n }\n ctx.edges = ctx.edges.filter(\n (e) =>\n !(e.kind === 'connector' && ids.has(e.fromAnchorId) && ids.has(e.toAnchorId)),\n );\n for (const anchor of memberAnchors) {\n ops.push({\n op: 'upsert_anchor',\n anchor: { ...anchor, connectorId: null },\n });\n }\n ctx.anchors = ctx.anchors.map((a) =>\n a.connectorId === connectorId ? { ...a, connectorId: null } : a,\n );\n ctx.connectors = ctx.connectors.filter((c) => c.id !== connectorId);\n ops.push({ op: 'delete_connector', connectorId });\n return ops;\n}\n\nfunction unlinkConnectorOps(ctx: ConnectorPlanContext, connectorId: number): BatchOp[] {\n return applyUnlinkLocal(ctx, connectorId);\n}\n\nexport function buildUnlinkConnectorOps(\n ctx: ConnectorPlanContext,\n connectorId: number,\n): BatchOp[] {\n return unlinkConnectorOps(ctx, connectorId);\n}\n\nexport function buildEscalatorLinkOps(\n ctx: ConnectorPlanContext,\n fromShape: CmShape,\n toShape: CmShape,\n options?: { name?: string; direction?: 'up' | 'down' },\n): BatchOp[] {\n const fromLevel = ctx.levels.find((l) => l.id === fromShape.levelId);\n const toLevel = ctx.levels.find((l) => l.id === toShape.levelId);\n const direction = inferTravelDirection(\n fromLevel?.levelIndex ?? 0,\n toLevel?.levelIndex ?? 0,\n options?.direction ??\n parseConnectorSourceId(fromShape.sourceSvgId)?.direction ??\n parseConnectorSourceId(toShape.sourceSvgId)?.direction,\n );\n const name =\n options?.name ?? defaultConnectorName('escalator', [fromShape, toShape]);\n\n const existingFrom = connectorIdForShape(fromShape.id, ctx.anchors);\n const existingTo = connectorIdForShape(toShape.id, ctx.anchors);\n const ops: BatchOp[] = [];\n const working: ConnectorPlanContext = {\n ...ctx,\n anchors: ctx.anchors.slice(),\n edges: ctx.edges.slice(),\n connectors: ctx.connectors.slice(),\n };\n\n for (const id of new Set([existingFrom, existingTo].filter((v): v is number => v != null))) {\n ops.push(...applyUnlinkLocal(working, id));\n }\n\n const connectorId = working.allocId();\n const connector: CmConnector = {\n id: connectorId,\n mapId: working.mapId,\n kind: 'escalator',\n name,\n direction,\n accessible: false,\n };\n ops.push({ op: 'upsert_connector', connector });\n working.connectors = [...working.connectors, connector];\n\n const fromAnchor = ensureLanding(working, fromShape, connectorId, ops);\n const toAnchor = ensureLanding(working, toShape, connectorId, ops);\n linkLandingToWalk(working, fromAnchor, ops);\n linkLandingToWalk(working, toAnchor, ops);\n\n ops.push({\n op: 'upsert_edge',\n edge: {\n id: working.allocId(),\n mapId: working.mapId,\n fromAnchorId: fromAnchor.id,\n toAnchorId: toAnchor.id,\n weight: null,\n directed: true,\n accessible: false,\n kind: 'connector',\n },\n });\n return ops;\n}\n\nexport function buildElevatorShaftOps(\n ctx: ConnectorPlanContext,\n memberShapes: CmShape[],\n options?: { name?: string; accessible?: boolean; connectorId?: number },\n): BatchOp[] {\n const unique = new Map(memberShapes.map((s) => [s.id, s]));\n const members = [...unique.values()];\n if (members.length < 2) return [];\n\n const ops: BatchOp[] = [];\n const working: ConnectorPlanContext = {\n ...ctx,\n anchors: ctx.anchors.slice(),\n edges: ctx.edges.slice(),\n connectors: ctx.connectors.slice(),\n };\n const existingIds = new Set(\n members\n .map((s) => connectorIdForShape(s.id, working.anchors))\n .filter((id): id is number => id != null),\n );\n const keepId =\n options?.connectorId ??\n (existingIds.size === 1 ? [...existingIds][0] : undefined);\n\n for (const id of existingIds) {\n if (id === keepId) {\n const memberAnchors = working.anchors.filter((a) => a.connectorId === id);\n const ids = new Set(memberAnchors.map((a) => a.id));\n for (const edge of connectorEdgesBetween(working.edges, ids)) {\n ops.push({ op: 'delete_edge', edgeId: edge.id });\n working.edges = working.edges.filter((e) => e.id !== edge.id);\n }\n continue;\n }\n ops.push(...applyUnlinkLocal(working, id));\n }\n\n const connectorId = keepId ?? working.allocId();\n const connector: CmConnector = {\n id: connectorId,\n mapId: working.mapId,\n kind: 'elevator',\n name: options?.name ?? defaultConnectorName('elevator', members),\n direction: 'both',\n accessible: options?.accessible ?? true,\n };\n ops.push({ op: 'upsert_connector', connector });\n\n const landings = members.map((shape) => ensureLanding(working, shape, connectorId, ops));\n for (const landing of landings) linkLandingToWalk(working, landing, ops);\n\n for (let i = 0; i < landings.length; i++) {\n for (let j = i + 1; j < landings.length; j++) {\n ops.push({\n op: 'upsert_edge',\n edge: {\n id: working.allocId(),\n mapId: working.mapId,\n fromAnchorId: landings[i].id,\n toAnchorId: landings[j].id,\n weight: null,\n directed: false,\n accessible: connector.accessible,\n kind: 'connector',\n },\n });\n }\n }\n return ops;\n}\n\nexport function suggestEscalatorPairs(\n shapes: CmShape[],\n levels: CmLevel[],\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n): Array<{ fromShapeId: number; toShapeId: number; label: string }> {\n const groups = new Map<string, CmShape[]>();\n for (const shape of shapes) {\n if (shape.orphanedAt) continue;\n if (guessConnectorKind(shape) !== 'escalator') continue;\n if (connectorIdForShape(shape.id, anchors) != null) continue;\n const parsed =\n parseConnectorSourceId(shape.sourceSvgId) ?? parseConnectorSourceId(shape.key);\n if (!parsed) continue;\n const key = `${parsed.group}:${parsed.direction ?? ''}`;\n const list = groups.get(key) ?? [];\n list.push(shape);\n groups.set(key, list);\n }\n const suggestions: Array<{ fromShapeId: number; toShapeId: number; label: string }> = [];\n for (const [key, group] of groups) {\n if (group.length !== 2) continue;\n if (group[0].levelId === group[1].levelId) continue;\n const parsed =\n parseConnectorSourceId(group[0].sourceSvgId) ?? parseConnectorSourceId(group[0].key);\n const start =\n group.find((s) => parseConnectorSourceId(s.sourceSvgId)?.role === 'start') ??\n group[0];\n const end = group.find((s) => s.id !== start.id)!;\n const fromName = levels.find((l) => l.id === start.levelId)?.name ?? 'Floor';\n const toName = levels.find((l) => l.id === end.levelId)?.name ?? 'Floor';\n const dir = parsed?.direction ? ` ${parsed.direction}` : '';\n suggestions.push({\n fromShapeId: start.id,\n toShapeId: end.id,\n label: `Escalator ${key.split(':')[0]}${dir}: ${fromName} → ${toName}`,\n });\n }\n return suggestions;\n}\n","import type {\n BatchOp,\n BBox,\n CmAmenityCatalogItem,\n CmAnchor,\n CmBuilding,\n CmConnector,\n CmLevel,\n CmRouteEdge,\n CmShape,\n CmShapeAssignment,\n ShapeGeometry,\n ThemeDefaults,\n} from '../core';\nimport { bboxOf, geometryBBox, normalizeGeometrySpace } from '../core';\n\nexport interface EditorDraftState {\n mapId: number;\n centerId: number;\n theme: Partial<ThemeDefaults>;\n buildings: CmBuilding[];\n levels: CmLevel[];\n shapes: CmShape[];\n assignments: CmShapeAssignment[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n connectors: CmConnector[];\n amenities: CmAmenityCatalogItem[];\n baseSvgUrl?: string | null;\n}\n\nfunction geometryBbox(geometry?: ShapeGeometry | null): BBox {\n const points = (geometry?.polygons ?? []).flat();\n return bboxOf(points);\n}\n\nfunction upsertById<T extends { id: number }>(\n rows: T[],\n next: T,\n): T[] {\n const idx = rows.findIndex((row) => row.id === next.id);\n if (idx < 0) return [...rows, next];\n const copy = rows.slice();\n copy[idx] = next;\n return copy;\n}\n\nexport function applyDraftOp(\n draft: EditorDraftState,\n op: BatchOp,\n): EditorDraftState {\n switch (op.op) {\n case 'upsert_shape': {\n const incoming = op.shape;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.shapes.find((s) => s.id === id);\n const geometry = incoming.geometry ?? existing?.geometry ?? {\n paths: [],\n polygons: [],\n };\n const shape: CmShape = {\n id,\n levelId: incoming.levelId ?? existing?.levelId ?? 0,\n key: incoming.key ?? existing?.key ?? `shape-${id}`,\n kind: incoming.kind ?? existing?.kind ?? 'unit',\n geometry,\n bbox:\n incoming.bbox ??\n (incoming.geometry != null\n ? geometryBbox(geometry)\n : existing?.bbox) ??\n geometryBbox(geometry),\n zIndex: incoming.zIndex ?? existing?.zIndex ?? 0,\n style: incoming.style ?? existing?.style ?? {},\n label: incoming.label ?? existing?.label ?? {},\n sourceSvgId: incoming.sourceSvgId ?? existing?.sourceSvgId ?? null,\n origin: incoming.origin ?? existing?.origin ?? 'manual',\n geometryLocked:\n incoming.geometryLocked ??\n (incoming.geometry != null ? true : existing?.geometryLocked) ??\n false,\n orphanedAt: incoming.orphanedAt ?? existing?.orphanedAt ?? null,\n };\n return { ...draft, shapes: upsertById(draft.shapes, shape) };\n }\n case 'delete_shape':\n return {\n ...draft,\n shapes: draft.shapes.filter((s) => s.id !== op.shapeId),\n assignments: draft.assignments.filter((a) => a.shapeId !== op.shapeId),\n };\n case 'upsert_assignment': {\n const assignment: CmShapeAssignment = {\n shapeId: op.assignment.shapeId,\n targetType: op.assignment.targetType ?? 'none',\n retailerId: op.assignment.retailerId ?? null,\n amenityId: op.assignment.amenityId ?? null,\n kioskId: op.assignment.kioskId ?? null,\n unitStatus: op.assignment.unitStatus ?? 'vacant',\n unitNumber: op.assignment.unitNumber ?? null,\n customLabel: op.assignment.customLabel ?? null,\n customImageKey: op.assignment.customImageKey ?? null,\n };\n const rest = draft.assignments.filter((a) => a.shapeId !== assignment.shapeId);\n return { ...draft, assignments: [...rest, assignment] };\n }\n case 'delete_assignment':\n return {\n ...draft,\n assignments: draft.assignments.filter((a) => a.shapeId !== op.shapeId),\n };\n case 'upsert_anchor': {\n const incoming = op.anchor;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.anchors.find((a) => a.id === id);\n const anchor: CmAnchor = {\n id,\n levelId: incoming.levelId ?? existing?.levelId ?? 0,\n shapeId: incoming.shapeId ?? existing?.shapeId ?? null,\n kind: incoming.kind ?? existing?.kind ?? 'junction',\n x: incoming.x ?? existing?.x ?? 0,\n y: incoming.y ?? existing?.y ?? 0,\n connectorId: incoming.connectorId ?? existing?.connectorId ?? null,\n };\n return { ...draft, anchors: upsertById(draft.anchors, anchor) };\n }\n case 'delete_anchor':\n return {\n ...draft,\n anchors: draft.anchors.filter((a) => a.id !== op.anchorId),\n edges: draft.edges.filter(\n (e) => e.fromAnchorId !== op.anchorId && e.toAnchorId !== op.anchorId,\n ),\n };\n case 'upsert_edge': {\n const incoming = op.edge;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.edges.find((e) => e.id === id);\n const edge: CmRouteEdge = {\n id,\n mapId: incoming.mapId ?? existing?.mapId ?? draft.mapId,\n fromAnchorId: incoming.fromAnchorId ?? existing?.fromAnchorId ?? 0,\n toAnchorId: incoming.toAnchorId ?? existing?.toAnchorId ?? 0,\n weight: incoming.weight ?? existing?.weight ?? null,\n directed: incoming.directed ?? existing?.directed ?? false,\n accessible: incoming.accessible ?? existing?.accessible ?? true,\n kind: incoming.kind ?? existing?.kind ?? 'walk',\n };\n return { ...draft, edges: upsertById(draft.edges, edge) };\n }\n case 'delete_edge':\n return { ...draft, edges: draft.edges.filter((e) => e.id !== op.edgeId) };\n case 'weld_anchors': {\n const ids = (op.anchorIds ?? []).filter((id) => Number.isFinite(id));\n if (ids.length < 2) return draft;\n const keep = ids[0];\n const removed = new Set(ids.slice(1));\n const edges = draft.edges\n .map((e) => ({\n ...e,\n fromAnchorId: removed.has(e.fromAnchorId) ? keep : e.fromAnchorId,\n toAnchorId: removed.has(e.toAnchorId) ? keep : e.toAnchorId,\n }))\n .filter((e) => e.fromAnchorId !== e.toAnchorId);\n return {\n ...draft,\n anchors: draft.anchors.filter((a) => !removed.has(a.id)),\n edges,\n };\n }\n case 'update_theme':\n return { ...draft, theme: { ...draft.theme, ...op.theme } };\n case 'upsert_connector': {\n const incoming = op.connector;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.connectors.find((c) => c.id === id);\n const connector: CmConnector = {\n id,\n mapId: incoming.mapId ?? existing?.mapId ?? draft.mapId,\n kind: incoming.kind ?? existing?.kind ?? 'escalator',\n name: incoming.name ?? existing?.name ?? 'Connector',\n direction: incoming.direction ?? existing?.direction ?? 'both',\n accessible: incoming.accessible ?? existing?.accessible ?? false,\n };\n return { ...draft, connectors: upsertById(draft.connectors, connector) };\n }\n case 'delete_connector':\n return {\n ...draft,\n connectors: draft.connectors.filter((c) => c.id !== op.connectorId),\n anchors: draft.anchors.map((a) =>\n a.connectorId === op.connectorId ? { ...a, connectorId: null } : a,\n ),\n };\n case 'delete_level':\n return omitLevelFromDraft(draft, op.levelId);\n default:\n return draft;\n }\n}\n\n/** Drop a floor/outdoor level and every draft row that lived on it. */\nexport function omitLevelFromDraft(\n draft: EditorDraftState,\n levelId: number,\n): EditorDraftState {\n const removedShapeIds = new Set(\n draft.shapes.filter((shape) => shape.levelId === levelId).map((shape) => shape.id),\n );\n const removedAnchorIds = new Set(\n draft.anchors.filter((anchor) => anchor.levelId === levelId).map((anchor) => anchor.id),\n );\n const anchors = draft.anchors.filter((anchor) => anchor.levelId !== levelId);\n const liveConnectorIds = new Set(\n anchors\n .map((anchor) => anchor.connectorId)\n .filter((id): id is number => id != null),\n );\n return {\n ...draft,\n levels: draft.levels.filter((level) => level.id !== levelId),\n shapes: draft.shapes.filter((shape) => shape.levelId !== levelId),\n assignments: draft.assignments.filter((row) => !removedShapeIds.has(row.shapeId)),\n anchors,\n edges: draft.edges.filter(\n (edge) =>\n !removedAnchorIds.has(edge.fromAnchorId) &&\n !removedAnchorIds.has(edge.toAnchorId),\n ),\n connectors: draft.connectors.filter((connector) => liveConnectorIds.has(connector.id)),\n };\n}\n\nexport function applyDraftOps(\n draft: EditorDraftState,\n ops: BatchOp[],\n): EditorDraftState {\n const seeded = {\n ...healDraftGeometry(draft),\n connectors: draft.connectors ?? [],\n };\n return ops.reduce(applyDraftOp, seeded);\n}\n\n/**\n * Rebuild `polygons` from `paths` on rows written before the Y-flip removal,\n * so the canvas outline and its vertex handles agree without a re-import.\n */\nfunction healDraftGeometry(draft: EditorDraftState): EditorDraftState {\n let changed = false;\n const shapes = draft.shapes.map((shape) => {\n const geometry = normalizeGeometrySpace(shape.geometry);\n if (geometry === shape.geometry) return shape;\n changed = true;\n return { ...shape, geometry, bbox: geometryBBox(geometry) };\n });\n return changed ? { ...draft, shapes } : draft;\n}\n\n/** Collapse repeated updates to the same entity so Save Changes sends one op each. */\nexport function coalesceDraftOp(ops: BatchOp[], op: BatchOp): BatchOp[] {\n if (op.op === 'update_theme') {\n const prev = ops.filter((item) => item.op === 'update_theme');\n const rest = ops.filter((item) => item.op !== 'update_theme');\n const theme = prev.reduce(\n (acc, item) => (item.op === 'update_theme' ? { ...acc, ...item.theme } : acc),\n {} as Record<string, unknown>,\n );\n return [...rest, { op: 'update_theme', theme: { ...theme, ...op.theme } }];\n }\n\n if (op.op === 'upsert_shape' && op.shape.id != null) {\n const idx = ops.findIndex(\n (item) => item.op === 'upsert_shape' && item.shape.id === op.shape.id,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_shape') {\n const next = ops.slice();\n next[idx] = {\n op: 'upsert_shape',\n shape: { ...ops[idx].shape, ...op.shape },\n };\n return next;\n }\n }\n\n if (op.op === 'upsert_anchor' && op.anchor.id != null) {\n const idx = ops.findIndex(\n (item) => item.op === 'upsert_anchor' && item.anchor.id === op.anchor.id,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_anchor') {\n const next = ops.slice();\n next[idx] = {\n op: 'upsert_anchor',\n anchor: { ...ops[idx].anchor, ...op.anchor },\n };\n return next;\n }\n }\n\n if (op.op === 'upsert_connector' && op.connector.id != null) {\n const idx = ops.findIndex(\n (item) => item.op === 'upsert_connector' && item.connector.id === op.connector.id,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_connector') {\n const next = ops.slice();\n next[idx] = {\n op: 'upsert_connector',\n connector: { ...ops[idx].connector, ...op.connector },\n };\n return next;\n }\n }\n\n if (op.op === 'upsert_assignment') {\n const idx = ops.findIndex(\n (item) =>\n item.op === 'upsert_assignment' &&\n item.assignment.shapeId === op.assignment.shapeId,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_assignment') {\n const next = ops.slice();\n next[idx] = { op: 'upsert_assignment', assignment: op.assignment };\n return next;\n }\n }\n\n return [...ops, op];\n}\n","import React, { useMemo, useState } from 'react';\nimport type { BatchOp, CmShape } from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect.tsx';\nimport {\n buildElevatorShaftOps,\n buildEscalatorLinkOps,\n buildUnlinkConnectorOps,\n connectorForShape,\n memberShapeIds,\n resolvedConnectorKind,\n suggestEscalatorPairs,\n type ConnectorPlanContext,\n type VerticalRailKind,\n} from '../connectorAssignments';\n\nexport interface ConnectorAssignProps {\n shape: CmShape;\n railKind: VerticalRailKind;\n ctx: ConnectorPlanContext;\n canEdit: boolean;\n onApplyOps: (ops: BatchOp[]) => void;\n}\n\nexport function ConnectorAssign({\n shape,\n railKind,\n ctx,\n canEdit,\n onApplyOps,\n}: ConnectorAssignProps) {\n const connector = connectorForShape(shape.id, ctx.anchors, ctx.connectors);\n const memberIds = connector ? memberShapeIds(connector.id, ctx.anchors) : [];\n const members = ctx.shapes.filter((s) => memberIds.includes(s.id));\n const partners = members.filter((s) => s.id !== shape.id);\n const levelName = (levelId: number) =>\n ctx.levels.find((l) => l.id === levelId)?.name ?? 'Floor';\n\n const candidates = useMemo(\n () =>\n ctx.shapes.filter((item) => {\n if (item.id === shape.id || item.orphanedAt) return false;\n if (item.levelId === shape.levelId) return false;\n return resolvedConnectorKind(item, ctx.anchors, ctx.connectors) === railKind;\n }),\n [ctx.anchors, ctx.connectors, ctx.shapes, railKind, shape.id, shape.levelId],\n );\n\n const [targetId, setTargetId] = useState<string>(\n partners[0]?.id != null ? String(partners[0].id) : '',\n );\n const [name, setName] = useState(connector?.name ?? '');\n\n const suggestions =\n railKind === 'escalator'\n ? suggestEscalatorPairs(ctx.shapes, ctx.levels, ctx.anchors).filter(\n (item) => item.fromShapeId === shape.id || item.toShapeId === shape.id,\n )\n : [];\n\n const applyEscalator = (from: CmShape, to: CmShape, nextName?: string) => {\n onApplyOps(\n buildEscalatorLinkOps(ctx, from, to, {\n name: nextName || name || undefined,\n }),\n );\n };\n\n const applyElevator = (nextMembers: CmShape[]) => {\n if (nextMembers.length < 2) return;\n onApplyOps(\n buildElevatorShaftOps(ctx, nextMembers, {\n name: name || connector?.name,\n accessible: connector?.accessible ?? true,\n connectorId: connector?.id,\n }),\n );\n };\n\n return (\n <div className=\"eyeon-map-inspector\">\n <div className=\"eyeon-map-inspector__heading\">\n {railKind === 'escalator' ? 'Escalator ride' : 'Elevator shaft'}\n </div>\n {railKind === 'escalator' ? (\n <p className=\"eyeon-map-rail__hint\">\n People board this landing and get off at a different place on another\n floor. Travel is one-way.\n </p>\n ) : (\n <p className=\"eyeon-map-rail__hint\">\n One shaft, many floors. Riders can go between any linked landings in\n both directions.\n </p>\n )}\n\n <label className=\"eyeon-map-rail__field\">\n Name\n <input\n value={name}\n disabled={!canEdit}\n placeholder={railKind === 'elevator' ? 'Elevator' : 'Escalator'}\n onChange={(e) => setName(e.target.value)}\n onBlur={() => {\n if (!canEdit || !connector || !name.trim() || name.trim() === connector.name) {\n return;\n }\n onApplyOps([\n {\n op: 'upsert_connector',\n connector: { ...connector, name: name.trim() },\n },\n ]);\n }}\n />\n </label>\n\n {railKind === 'escalator' && (\n <>\n <label className=\"eyeon-map-rail__field\">\n Exits at\n <ModernSelect\n ariaLabel=\"Exits at\"\n value={targetId}\n disabled={!canEdit}\n placeholder=\"Choose a landing on another floor\"\n searchable\n options={candidates.map((item) => ({\n value: String(item.id),\n label: `${levelName(item.levelId)} · ${item.key}`,\n }))}\n onChange={setTargetId}\n />\n </label>\n {partners[0] ? (\n <p className=\"eyeon-map-rail__hint\">\n Linked: {levelName(shape.levelId)} → {levelName(partners[0].levelId)} (\n {connector?.direction ?? 'up'})\n </p>\n ) : null}\n {canEdit && (\n <div className=\"eyeon-map-rail__actions\">\n <button\n type=\"button\"\n disabled={!targetId}\n onClick={() => {\n const to = ctx.shapes.find((s) => s.id === Number(targetId));\n if (!to) return;\n applyEscalator(shape, to);\n }}\n >\n {connector ? 'Update ride' : 'Link ride'}\n </button>\n {connector ? (\n <button\n type=\"button\"\n onClick={() => onApplyOps(buildUnlinkConnectorOps(ctx, connector.id))}\n >\n Unlink\n </button>\n ) : null}\n </div>\n )}\n {suggestions.length > 0 && canEdit && !connector ? (\n <>\n <div className=\"eyeon-map-rail__heading\">Suggested from SVG</div>\n {suggestions.map((item) => (\n <button\n key={`${item.fromShapeId}-${item.toShapeId}`}\n type=\"button\"\n className=\"eyeon-map-rail__row\"\n onClick={() => {\n const from = ctx.shapes.find((s) => s.id === item.fromShapeId);\n const to = ctx.shapes.find((s) => s.id === item.toShapeId);\n if (!from || !to) return;\n applyEscalator(from, to);\n }}\n >\n <span>{item.label}</span>\n </button>\n ))}\n </>\n ) : null}\n </>\n )}\n\n {railKind === 'elevator' && (\n <>\n <div className=\"eyeon-map-rail__heading\">Stops</div>\n {members.map((item) => (\n <div key={item.id} className=\"eyeon-map-rail__row\">\n <span>\n {levelName(item.levelId)} · {item.key}\n </span>\n {canEdit && members.length > 2 && item.id !== shape.id ? (\n <button\n type=\"button\"\n className=\"eyeon-map-rail__muted\"\n onClick={() => applyElevator(members.filter((s) => s.id !== item.id))}\n >\n Remove\n </button>\n ) : null}\n </div>\n ))}\n {members.length === 0 ? (\n <p className=\"eyeon-map-rail__hint\">This landing is not in a shaft yet.</p>\n ) : null}\n <label className=\"eyeon-map-rail__field\">\n Add a stop on another floor\n <ModernSelect\n ariaLabel=\"Add a stop on another floor\"\n value=\"\"\n disabled={!canEdit}\n placeholder=\"Choose a landing\"\n searchable\n options={candidates\n .filter((item) => !memberIds.includes(item.id))\n .map((item) => ({\n value: String(item.id),\n label: `${levelName(item.levelId)} · ${item.key}`,\n }))}\n onChange={(nextId) => {\n const next = ctx.shapes.find((s) => s.id === Number(nextId));\n if (!next) return;\n applyElevator([...members, shape, next]);\n }}\n />\n </label>\n {canEdit && connector ? (\n <div className=\"eyeon-map-rail__actions\">\n <button\n type=\"button\"\n onClick={() => onApplyOps(buildUnlinkConnectorOps(ctx, connector.id))}\n >\n Unlink shaft\n </button>\n </div>\n ) : null}\n </>\n )}\n </div>\n );\n}\n","/** Normalize `#rgb` / `#rrggbb` (with or without `#`) for `<input type=\"color\">`. */\nexport function normalizeHexColor(value: string): string | null {\n const match = value.trim().match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);\n if (!match) return null;\n let hex = match[1].toLowerCase();\n if (hex.length === 3) {\n hex = hex\n .split('')\n .map((ch) => ch + ch)\n .join('');\n }\n return `#${hex}`;\n}\n\nexport function hexColorInputValue(value: string): string {\n return normalizeHexColor(value) ?? '#000000';\n}\n","import type { ShapeKind, UnitStatus } from '../core';\n\nexport const SHAPE_KIND_LABELS: Record<ShapeKind, string> = {\n unit: 'Store',\n amenity: 'Amenity',\n kiosk_screen: 'Kiosk',\n connector: 'Connector',\n entrance: 'Entrance',\n walkable: 'Walkway',\n void: 'Opening',\n wall: 'Wall',\n boundary: 'Boundary',\n floorplate: 'Floor plate',\n decor: 'Decor',\n label: 'Label',\n zone: 'Zone',\n parking_zone: 'Parking',\n green_area: 'Green area',\n water: 'Water',\n parking_icon: 'Parking icon',\n};\n\nexport const UNIT_STATUS_LABELS: Record<UnitStatus, string> = {\n occupied: 'Occupied',\n vacant: 'Vacant',\n coming_soon: 'Coming soon',\n under_renovation: 'Under renovation',\n};\n\nexport function shapeKindLabel(kind: string): string {\n return SHAPE_KIND_LABELS[kind as ShapeKind] ?? kind;\n}\n","import type { CmShapeAssignment } from '../core';\n\nexport const ASSIGNABLE_SHAPE_KINDS = [\n 'unit',\n 'parking_zone',\n 'amenity',\n 'kiosk_screen',\n] as const;\n\nexport type AssignableShapeKind = (typeof ASSIGNABLE_SHAPE_KINDS)[number];\n\nexport type AssignmentLike = Pick<\n CmShapeAssignment,\n 'shapeId' | 'targetType' | 'retailerId' | 'amenityId' | 'kioskId'\n>;\n\nexport type AssignableShape = {\n id: number;\n kind: string;\n orphanedAt?: string | null;\n};\n\nexport function isAssignableKind(kind: string): kind is AssignableShapeKind {\n return (ASSIGNABLE_SHAPE_KINDS as readonly string[]).includes(kind);\n}\n\nexport function isRetailerAssigned(assignment: AssignmentLike | null | undefined): boolean {\n return Boolean(\n assignment && assignment.targetType === 'retailer' && assignment.retailerId != null,\n );\n}\n\nexport function isAmenityAssigned(assignment: AssignmentLike | null | undefined): boolean {\n return Boolean(\n assignment && assignment.targetType === 'amenity' && assignment.amenityId != null,\n );\n}\n\nexport function isKioskAssigned(assignment: AssignmentLike | null | undefined): boolean {\n return Boolean(assignment && assignment.targetType === 'kiosk' && assignment.kioskId != null);\n}\n\nexport function isPolygonAssigned(assignment: AssignmentLike | null | undefined): boolean {\n return (\n isRetailerAssigned(assignment) ||\n isAmenityAssigned(assignment) ||\n isKioskAssigned(assignment)\n );\n}\n\nexport function assignmentByShapeId(\n assignments: AssignmentLike[],\n): Map<number, AssignmentLike> {\n return new Map(assignments.map((item) => [item.shapeId, item]));\n}\n\n/** Assigned store / amenity polygons, and assignable polygons with no link. */\nexport function railAssignmentGroups<T extends AssignableShape>(\n shapes: T[],\n assignments: AssignmentLike[],\n): { stores: T[]; amenities: T[]; unassigned: T[] } {\n const byShape = assignmentByShapeId(assignments);\n const stores: T[] = [];\n const amenities: T[] = [];\n const unassigned: T[] = [];\n for (const shape of shapes) {\n if (shape.orphanedAt) continue;\n const assignment = byShape.get(shape.id) ?? null;\n if (isRetailerAssigned(assignment)) stores.push(shape);\n else if (isAmenityAssigned(assignment)) amenities.push(shape);\n else if (isAssignableKind(shape.kind) && !isPolygonAssigned(assignment)) {\n unassigned.push(shape);\n }\n }\n return { stores, amenities, unassigned };\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { compareBuildingFloors, type CmBuilding, type CmLevel } from '../../core';\n\nexport type CreateLevelInput = {\n name: string;\n kind: 'outdoor' | 'floor';\n buildingId?: number | null;\n file?: File;\n onProgress?: (percent: number) => void;\n};\n\nexport type UpdateLevelInput = {\n levelId: number;\n name?: string;\n file?: File;\n onProgress?: (percent: number) => void;\n};\n\nexport type FloorsScreen =\n | { mode: 'list' }\n | { mode: 'add-base' }\n | { mode: 'add-floor' }\n | { mode: 'edit'; levelId: number };\n\nexport function floorsScreenTitle(\n screen: FloorsScreen,\n levels: Array<{ id: number; kind: string }>,\n): string {\n if (screen.mode === 'add-base') return 'Add Outdoor SVG';\n if (screen.mode === 'add-floor') return 'Add Floor';\n if (screen.mode === 'edit') {\n const level = levels.find((l) => l.id === screen.levelId);\n return level?.kind === 'outdoor' ? 'Edit Outdoor' : 'Edit Floor';\n }\n return 'Floors';\n}\n\n/** Building floors only — Outdoor is a separate item and is not counted. */\nexport function visibleFloorCount(levels: Array<{ kind: string }>): number {\n return levels.filter((l) => l.kind === 'floor').length;\n}\n\n/** Insert `movedId` before or after `targetId`. Used by live floor reorder. */\nexport function placeLevelId(\n ids: number[],\n movedId: number,\n targetId: number,\n place: 'before' | 'after',\n): number[] {\n if (movedId === targetId) return ids;\n const from = ids.indexOf(movedId);\n if (from < 0) return ids;\n const without = ids.filter((id) => id !== movedId);\n const target = without.indexOf(targetId);\n if (target < 0) return ids;\n const next = [...without];\n next.splice(place === 'after' ? target + 1 : target, 0, movedId);\n return next;\n}\n\n/** Move `movedId` to `toIndex` in the list with that id removed. */\nexport function moveLevelId(ids: number[], movedId: number, toIndex: number): number[] {\n const from = ids.indexOf(movedId);\n if (from < 0) return ids;\n const without = ids.filter((id) => id !== movedId);\n const clamped = Math.max(0, Math.min(toIndex, without.length));\n const next = [...without];\n next.splice(clamped, 0, movedId);\n return next;\n}\n\n/** Slot index from pointer Y. Uses the list box, not live row midpoints. */\nexport function insertIndexFromY(\n clientY: number,\n listTop: number,\n rowHeight: number,\n count: number,\n): number {\n if (count <= 1 || rowHeight <= 0) return 0;\n const index = Math.round((clientY - listTop - rowHeight / 2) / rowHeight);\n return Math.max(0, Math.min(count - 1, index));\n}\n\n/** Overlay Y for the drop line. Null when the item would stay put. */\nexport function dropLineTop(\n fromIndex: number,\n dropIndex: number,\n rowHeight: number,\n rowInnerHeight: number,\n): number | null {\n if (fromIndex < 0 || dropIndex === fromIndex || rowHeight <= 0) return null;\n if (dropIndex < fromIndex) return dropIndex * rowHeight;\n return dropIndex * rowHeight + rowInnerHeight;\n}\n\nfunction sameIdOrder(a: number[], b: number[]): boolean {\n return a.length === b.length && a.every((id, i) => id === b[i]);\n}\n\ntype FloorDrag = {\n id: number;\n pointerId: number;\n offsetX: number;\n offsetY: number;\n width: number;\n height: number;\n name: string;\n x: number;\n y: number;\n listTop: number;\n listLeft: number;\n listBottom: number;\n rowHeight: number;\n originIds: number[];\n dropIndex: number;\n};\n\nexport interface FloorsPanelProps {\n levels: CmLevel[];\n buildings: CmBuilding[];\n /** Shapes already imported per level — drives delete and re-import copy. */\n levelShapeCounts?: Record<number, number>;\n canFloors: boolean;\n screen: FloorsScreen;\n onScreenChange: (screen: FloorsScreen) => void;\n onCreateLevel?: (input: CreateLevelInput) => Promise<number | void>;\n onUpdateLevel?: (input: UpdateLevelInput) => Promise<void>;\n onDeleteLevel?: (levelId: number) => Promise<void>;\n onReorderLevels?: (orderedIds: number[]) => Promise<void>;\n}\n\nfunction formatBytes(size: number): string {\n if (size < 1024) return `${size} B`;\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`;\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction svgFileName(key: string | null | undefined): string | null {\n if (!key) return null;\n const part = key.split('/').pop()?.trim();\n return part || null;\n}\n\nfunction isSvgFile(next: File): boolean {\n return next.name.toLowerCase().endsWith('.svg') || next.type === 'image/svg+xml';\n}\n\nfunction GripIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" aria-hidden=\"true\">\n <path\n d=\"M3 5h12M3 9h12M3 13h12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\n/** Same glyph as admin-portal Deals/Retailers (`Trash2` from react-feather). */\nfunction TrashIcon() {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"3 6 5 6 21 6\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" />\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" />\n </svg>\n );\n}\n\nexport function deleteConfirmCopy(\n level: { kind: string; name: string },\n shapeCount = 0,\n) {\n const isOutdoor = level.kind === 'outdoor';\n const shapes =\n shapeCount === 1 ? '1 shape' : `${shapeCount} shapes`;\n return {\n title: isOutdoor ? 'Delete Outdoor SVG?' : `Delete “${level.name}”?`,\n body: isOutdoor\n ? `The stored outdoor SVG, its ${shapes} and every assignment on them are removed. Building floors are not affected.`\n : `This floor and its ${shapes} are removed, along with the retailer, amenity and kiosk assignments on them.`,\n action: isOutdoor ? 'Delete Outdoor' : 'Delete floor',\n };\n}\n\nexport function FloorsPanel({\n levels,\n buildings,\n levelShapeCounts,\n canFloors,\n screen,\n onScreenChange,\n onCreateLevel,\n onUpdateLevel,\n onDeleteLevel,\n onReorderLevels,\n}: FloorsPanelProps) {\n const [name, setName] = useState('');\n const [file, setFile] = useState<File | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [progress, setProgress] = useState<number | null>(null);\n const [dragOver, setDragOver] = useState(false);\n const [confirmDeleteId, setConfirmDeleteId] = useState<number | null>(null);\n const [deleting, setDeleting] = useState(false);\n const [drag, setDrag] = useState<FloorDrag | null>(null);\n const [dropIndex, setDropIndex] = useState<number | null>(null);\n const [previewIds, setPreviewIds] = useState<number[] | null>(null);\n const [previewFailed, setPreviewFailed] = useState(false);\n const [localPreviewUrl, setLocalPreviewUrl] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const floorListRef = useRef<HTMLDivElement>(null);\n const ghostRef = useRef<HTMLDivElement>(null);\n const previewIdsRef = useRef<number[] | null>(null);\n const dragRef = useRef<FloorDrag | null>(null);\n\n const outdoor = useMemo(\n () => levels.find((l) => l.kind === 'outdoor') ?? null,\n [levels],\n );\n const outdoorReady = Boolean(outdoor?.sourceSvgKey || outdoor?.sourceSvgUrl);\n const shapeCount = (levelId: number) => levelShapeCounts?.[levelId] ?? 0;\n const buildingFloors = useMemo(\n () =>\n levels\n .filter((l) => l.kind === 'floor')\n .slice()\n .sort(compareBuildingFloors),\n [levels],\n );\n const committedIds = useMemo(\n () => buildingFloors.map((level) => level.id),\n [buildingFloors],\n );\n const displayFloors = useMemo(() => {\n // Keep committed order on screen while dragging so sibling rows stay put.\n const ids = drag != null ? committedIds : (previewIds ?? committedIds);\n const byId = new Map(buildingFloors.map((level) => [level.id, level]));\n return ids\n .map((id) => byId.get(id))\n .filter((level): level is CmLevel => level != null);\n }, [buildingFloors, committedIds, drag, previewIds]);\n const editing =\n screen.mode === 'edit'\n ? levels.find((l) => l.id === screen.levelId) ?? null\n : null;\n const isOutdoorForm =\n screen.mode === 'add-base' || editing?.kind === 'outdoor';\n const canManage = canFloors && !!onCreateLevel && !!onUpdateLevel;\n const canReorder = canManage && !!onReorderLevels && buildingFloors.length > 1;\n\n useEffect(() => {\n if (screen.mode === 'add-base' || editing?.kind === 'outdoor') {\n setName('Outdoor');\n setFile(null);\n } else if (screen.mode === 'add-floor') {\n setName('');\n setFile(null);\n } else if (screen.mode === 'edit' && editing) {\n setName(editing.name);\n setFile(null);\n }\n setError(null);\n setConfirmDeleteId(null);\n setDeleting(false);\n setProgress(null);\n setPreviewFailed(false);\n }, [screen, editing?.id, editing?.kind, editing?.name]);\n\n useEffect(() => {\n if (confirmDeleteId == null) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && !deleting) setConfirmDeleteId(null);\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [confirmDeleteId, deleting]);\n\n useEffect(() => {\n if (!file) {\n setLocalPreviewUrl(null);\n return;\n }\n const url = URL.createObjectURL(file);\n setLocalPreviewUrl(url);\n setPreviewFailed(false);\n return () => URL.revokeObjectURL(url);\n }, [file]);\n\n previewIdsRef.current = previewIds;\n dragRef.current = drag;\n\n useEffect(() => {\n if (drag != null || previewIds == null) return;\n if (sameIdOrder(committedIds, previewIds)) setPreviewIds(null);\n }, [committedIds, drag, previewIds]);\n\n const takeSvgFile = (next: File | null | undefined) => {\n if (!next) return;\n if (!isSvgFile(next)) {\n setError('Choose an SVG file.');\n return;\n }\n setError(null);\n setFile(next);\n };\n\n const openEdit = (level: CmLevel) => {\n onScreenChange({ mode: 'edit', levelId: level.id });\n };\n\n const submit = async (picked?: File | null) => {\n const svgFile = picked ?? file;\n if (isOutdoorForm) {\n if (!svgFile && (screen.mode === 'add-base' || !editing?.sourceSvgKey)) {\n setError('Choose an SVG file.');\n return;\n }\n } else if (!name.trim()) {\n setError('Enter a title.');\n return;\n }\n if (screen.mode === 'add-floor' && !svgFile) {\n setError('Choose an SVG file.');\n return;\n }\n setBusy(true);\n setError(null);\n if (svgFile) setProgress(0);\n try {\n if (screen.mode === 'add-base') {\n await onCreateLevel?.({\n name: 'Outdoor',\n kind: 'outdoor',\n file: svgFile ?? undefined,\n onProgress: setProgress,\n });\n } else if (screen.mode === 'add-floor') {\n await onCreateLevel?.({\n name: name.trim(),\n kind: 'floor',\n buildingId: buildings[0]?.id ?? null,\n file: svgFile ?? undefined,\n onProgress: setProgress,\n });\n } else if (screen.mode === 'edit' && editing) {\n await onUpdateLevel?.({\n levelId: editing.id,\n name: editing.kind === 'outdoor' ? 'Outdoor' : name.trim(),\n file: svgFile ?? undefined,\n onProgress: setProgress,\n });\n }\n setProgress(100);\n onScreenChange({ mode: 'list' });\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not save floor.');\n setProgress(null);\n } finally {\n setBusy(false);\n }\n };\n\n const remove = async (level: CmLevel) => {\n if (!onDeleteLevel || deleting) return;\n setDeleting(true);\n setError(null);\n try {\n await onDeleteLevel(level.id);\n setConfirmDeleteId(null);\n onScreenChange({ mode: 'list' });\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not delete floor.');\n } finally {\n setDeleting(false);\n }\n };\n\n const renderDeleteModal = () => {\n const level = levels.find((l) => l.id === confirmDeleteId);\n if (!level) return null;\n const copy = deleteConfirmCopy(level, shapeCount(level.id));\n return (\n <div className=\"eyeon-map-modal\" role=\"presentation\">\n <div\n className=\"eyeon-map-modal__backdrop\"\n onClick={() => (deleting ? undefined : setConfirmDeleteId(null))}\n />\n <div\n className=\"eyeon-map-modal__card\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"eyeon-map-delete-title\"\n aria-describedby=\"eyeon-map-delete-body\"\n >\n <h3 className=\"eyeon-map-modal__title\" id=\"eyeon-map-delete-title\">\n {copy.title}\n </h3>\n <p className=\"eyeon-map-modal__body\" id=\"eyeon-map-delete-body\">\n {copy.body} This cannot be undone.\n </p>\n {error ? <div className=\"eyeon-map-floors__error\">{error}</div> : null}\n <div className=\"eyeon-map-modal__actions\">\n <button\n type=\"button\"\n className=\"eyeon-map-modal__cancel\"\n disabled={deleting}\n onClick={() => setConfirmDeleteId(null)}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"eyeon-map-floors__danger\"\n disabled={deleting}\n autoFocus\n onClick={() => void remove(level)}\n >\n {deleting ? (\n <>\n <span className=\"eyeon-map-floors__spinner\" aria-hidden=\"true\" />\n Deleting…\n </>\n ) : (\n copy.action\n )}\n </button>\n </div>\n </div>\n </div>\n );\n };\n\n const renderRowDelete = (level: CmLevel) => {\n if (!canManage || !onDeleteLevel) return null;\n return (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__icon-danger\"\n title={`Delete ${level.kind === 'outdoor' ? 'Outdoor SVG' : level.name}`}\n aria-label={`Delete ${level.kind === 'outdoor' ? 'Outdoor SVG' : level.name}`}\n disabled={busy || deleting}\n onClick={(e) => {\n e.stopPropagation();\n setConfirmDeleteId(level.id);\n }}\n >\n <TrashIcon />\n </button>\n );\n };\n\n const applyGhost = (x: number, y: number) => {\n const ghost = ghostRef.current;\n if (!ghost) return;\n ghost.style.left = `${x}px`;\n ghost.style.top = `${y}px`;\n };\n\n const previewMoveToY = (clientY: number) => {\n const current = dragRef.current;\n if (!current) return;\n const index = insertIndexFromY(\n clientY,\n current.listTop,\n current.rowHeight,\n current.originIds.length,\n );\n if (current.dropIndex !== index) {\n current.dropIndex = index;\n setDropIndex(index);\n }\n const next = moveLevelId(current.originIds, current.id, index);\n const ids = previewIdsRef.current ?? current.originIds;\n if (!sameIdOrder(ids, next)) setPreviewIds(next);\n };\n\n const persistPreview = async () => {\n const nextIds = previewIdsRef.current;\n if (!onReorderLevels || nextIds == null) return;\n if (sameIdOrder(nextIds, committedIds)) {\n setPreviewIds(null);\n return;\n }\n try {\n await onReorderLevels(nextIds);\n } catch (e) {\n setPreviewIds(null);\n setError(e instanceof Error ? e.message : 'Could not reorder floors.');\n }\n };\n\n const endDrag = () => {\n if (!dragRef.current) return;\n dragRef.current = null;\n setDrag(null);\n setDropIndex(null);\n void persistPreview();\n };\n\n useEffect(() => {\n if (!drag) return;\n const onMove = (e: PointerEvent) => {\n const current = dragRef.current;\n if (!current || e.pointerId !== current.pointerId) return;\n const x = current.listLeft;\n const maxY = current.listBottom - current.height;\n const y = Math.max(current.listTop, Math.min(maxY, e.clientY - current.offsetY));\n current.x = x;\n current.y = y;\n applyGhost(x, y);\n previewMoveToY(e.clientY);\n };\n const onUp = (e: PointerEvent) => {\n const current = dragRef.current;\n if (!current || e.pointerId !== current.pointerId) return;\n endDrag();\n };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onUp);\n return () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n };\n }, [Boolean(drag)]);\n\n const startDrag = (level: CmLevel, e: React.PointerEvent<HTMLButtonElement>) => {\n const row = e.currentTarget.closest('.eyeon-map-floors__row');\n const list = floorListRef.current;\n if (!(row instanceof HTMLElement) || !list) return;\n const rect = row.getBoundingClientRect();\n const listRect = list.getBoundingClientRect();\n const rowHeight = rect.height + 2;\n e.preventDefault();\n e.stopPropagation();\n const next: FloorDrag = {\n id: level.id,\n pointerId: e.pointerId,\n offsetX: e.clientX - rect.left,\n offsetY: e.clientY - rect.top,\n width: rect.width,\n height: rect.height,\n name: level.name,\n x: listRect.left,\n y: rect.top,\n listTop: listRect.top,\n listLeft: listRect.left,\n listBottom: listRect.bottom,\n rowHeight,\n originIds: committedIds,\n dropIndex: committedIds.indexOf(level.id),\n };\n dragRef.current = next;\n setDrag(next);\n setDropIndex(committedIds.indexOf(level.id));\n setPreviewIds(committedIds);\n };\n\n const lineTop =\n drag && dropIndex != null\n ? dropLineTop(\n drag.originIds.indexOf(drag.id),\n dropIndex,\n drag.rowHeight,\n drag.height,\n )\n : null;\n\n if (screen.mode !== 'list') {\n const hasExistingSvg = Boolean(editing?.sourceSvgKey || editing?.sourceSvgUrl);\n const showEditPreview = screen.mode === 'edit' && hasExistingSvg;\n const previewUrl = localPreviewUrl ?? (showEditPreview ? editing?.sourceSvgUrl ?? null : null);\n const previewFallback =\n file?.name ?? svgFileName(editing?.sourceSvgKey) ?? 'SVG on file';\n const importedCount = editing ? shapeCount(editing.id) : 0;\n const showReimportNotice =\n !isOutdoorForm && screen.mode === 'edit' && importedCount > 0;\n const primaryLabel = isOutdoorForm ? 'Upload' : 'Import';\n const primaryBusyLabel = isOutdoorForm ? 'Uploading' : 'Importing';\n\n return (\n <div className=\"eyeon-map-floors\">\n {!isOutdoorForm && (\n <label className=\"eyeon-map-rail__field\">\n Title\n <input\n value={name}\n disabled={busy || !canManage}\n onChange={(e) => setName(e.target.value)}\n />\n </label>\n )}\n {showEditPreview ? (\n <div className=\"eyeon-map-rail__field eyeon-map-floors__svg-field\">\n SVG\n <div className=\"eyeon-map-floors__preview-card\">\n {previewUrl && !previewFailed ? (\n <img\n className=\"eyeon-map-floors__preview-img\"\n src={previewUrl}\n alt={file?.name ?? editing?.name ?? 'SVG preview'}\n onError={() => setPreviewFailed(true)}\n />\n ) : (\n <div className=\"eyeon-map-floors__preview-fallback\">{previewFallback}</div>\n )}\n </div>\n {file ? (\n <span className=\"eyeon-map-floors__drop-meta\">\n {file.name}\n {isOutdoorForm\n ? ` · ${formatBytes(file.size)} · Ready to upload`\n : ` · ${formatBytes(file.size)}`}\n </span>\n ) : null}\n {!isOutdoorForm ? (\n <p className=\"eyeon-map-rail__hint\">\n Floor SVGs are read for geometry only — no copy of the file is kept.\n </p>\n ) : (\n <p className=\"eyeon-map-rail__hint\">\n The outdoor SVG is stored and drawn live, so decoration stays\n designer-owned. Only its interactive polygons are imported.\n </p>\n )}\n <input\n ref={fileInputRef}\n hidden\n type=\"file\"\n accept=\".svg,image/svg+xml\"\n disabled={busy || deleting || !canManage}\n onChange={(e) => {\n takeSvgFile(e.target.files?.[0] ?? null);\n e.target.value = '';\n }}\n />\n <button\n type=\"button\"\n className=\"eyeon-map-floors__change\"\n disabled={busy || deleting || !canManage}\n onClick={() => fileInputRef.current?.click()}\n >\n {isOutdoorForm ? 'Replace SVG' : 'Re-import SVG'}\n </button>\n </div>\n ) : (\n <div className=\"eyeon-map-rail__field\">\n {isOutdoorForm ? 'SVG file' : 'Floor SVG to import'}\n <label\n className={[\n 'eyeon-map-floors__drop',\n dragOver ? 'is-over' : '',\n file ? 'has-file' : '',\n busy ? 'is-busy' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onDragOver={(e) => {\n e.preventDefault();\n if (!busy) setDragOver(true);\n }}\n onDragLeave={() => setDragOver(false)}\n onDrop={(e) => {\n e.preventDefault();\n setDragOver(false);\n if (busy || !canManage) return;\n takeSvgFile(e.dataTransfer.files?.[0]);\n }}\n >\n <input\n type=\"file\"\n accept=\".svg,image/svg+xml\"\n disabled={busy || deleting || !canManage}\n onChange={(e) => {\n takeSvgFile(e.target.files?.[0] ?? null);\n e.target.value = '';\n }}\n />\n <span className=\"eyeon-map-floors__drop-title\">\n {file ? file.name : 'Choose SVG or drop it here'}\n </span>\n <span className=\"eyeon-map-floors__drop-meta\">\n {file\n ? isOutdoorForm\n ? `${formatBytes(file.size)} · Ready to upload`\n : `${formatBytes(file.size)} · Ready to import`\n : 'SVG only'}\n </span>\n </label>\n {!isOutdoorForm && !showReimportNotice ? (\n <p className=\"eyeon-map-rail__hint\">\n The file is read for geometry only. Shapes, layer names and walking\n paths go into the database; the SVG itself is not stored.\n </p>\n ) : null}\n </div>\n )}\n {showReimportNotice ? (\n <div className=\"eyeon-map-floors__notice\">\n <p className=\"eyeon-map-floors__notice-title\">\n Re-importing replaces the {importedCount} shape\n {importedCount === 1 ? '' : 's'} on this floor\n </p>\n <ul className=\"eyeon-map-floors__notice-list\">\n <li>\n Layers that keep the same Illustrator ID are redrawn from the new file\n and keep their retailer, amenity and kiosk assignments.\n </li>\n <li>\n Shapes you reshaped in Edit Map keep your geometry — the new file is\n ignored for those.\n </li>\n <li>\n IDs missing from the new file are hidden rather than deleted, so you can\n move their assignments onto a renamed layer.\n </li>\n <li>\n New IDs come in unassigned, and <code>route-path</code> layers replace\n this floor&rsquo;s walking paths.\n </li>\n <li>\n The artboard must stay the same size, otherwise the import is rejected.\n </li>\n </ul>\n </div>\n ) : null}\n {progress != null && (\n <div\n className=\"eyeon-map-floors__progress\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={progress}\n >\n <div className=\"eyeon-map-floors__progress-track\">\n <div\n className=\"eyeon-map-floors__progress-bar\"\n style={{ width: `${Math.min(100, Math.max(0, progress))}%` }}\n />\n </div>\n <span className=\"eyeon-map-floors__progress-label\">{progress}%</span>\n </div>\n )}\n {error ? <div className=\"eyeon-map-floors__error\">{error}</div> : null}\n {screen.mode === 'edit' && editing ? (\n <div className=\"eyeon-map-floors__edit-actions\">\n <div className=\"eyeon-map-floors__edit-row\">\n {onDeleteLevel && canManage ? (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__danger\"\n disabled={busy || deleting}\n onClick={() => setConfirmDeleteId(editing.id)}\n >\n Delete\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-floors__primary\"\n disabled={\n busy ||\n deleting ||\n !canManage ||\n (editing.kind !== 'outdoor' && !name.trim())\n }\n onClick={() => void submit()}\n >\n {busy\n ? progress != null\n ? `${primaryBusyLabel} ${progress}%`\n : 'Saving…'\n : file\n ? isOutdoorForm\n ? 'Upload & Save'\n : 'Import & Save'\n : 'Save Changes'}\n </button>\n </div>\n </div>\n ) : (\n <div className=\"eyeon-map-rail__actions\">\n <button\n type=\"button\"\n className=\"eyeon-map-floors__primary\"\n disabled={\n busy ||\n deleting ||\n !canManage ||\n (isOutdoorForm ? !file : !name.trim() || !file)\n }\n onClick={() => void submit()}\n >\n {busy\n ? progress != null\n ? `${primaryBusyLabel} ${progress}%`\n : `${primaryBusyLabel}…`\n : primaryLabel}\n </button>\n </div>\n )}\n {renderDeleteModal()}\n </div>\n );\n }\n\n return (\n <div className={['eyeon-map-floors', drag ? 'is-reordering' : ''].filter(Boolean).join(' ')}>\n <div className=\"eyeon-map-floors__block\">\n {canManage && (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__add\"\n onClick={() => onScreenChange({ mode: 'add-floor' })}\n >\n Add Floor\n </button>\n )}\n {displayFloors.length === 0 ? (\n <p className=\"eyeon-map-rail__hint\">No floors yet.</p>\n ) : (\n <div ref={floorListRef} className=\"eyeon-map-floors__list\">\n {displayFloors.map((level) => (\n <div\n key={level.id}\n data-floor-id={level.id}\n className=\"eyeon-map-floors__entry\"\n >\n <div\n className={[\n 'eyeon-map-floors__row',\n drag?.id === level.id ? 'is-placeholder' : '',\n confirmDeleteId === level.id ? 'is-confirm' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {canReorder ? (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__grip\"\n title=\"Drag to reorder\"\n aria-label={`Reorder ${level.name}`}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => {\n if (e.button !== 0) return;\n startDrag(level, e);\n }}\n >\n <GripIcon />\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-floors__item\"\n onClick={() => {\n if (drag) return;\n openEdit(level);\n }}\n >\n {level.name}\n </button>\n {renderRowDelete(level)}\n </div>\n </div>\n ))}\n {lineTop == null ? null : (\n <div\n className=\"eyeon-map-floors__drop-line\"\n style={{ top: lineTop }}\n />\n )}\n </div>\n )}\n </div>\n\n <div className=\"eyeon-map-floors__block\">\n {outdoorReady && outdoor ? (\n <div className=\"eyeon-map-floors__entry\">\n <div\n className={[\n 'eyeon-map-floors__row',\n confirmDeleteId === outdoor.id ? 'is-confirm' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <button\n type=\"button\"\n className=\"eyeon-map-floors__item\"\n onClick={() => openEdit(outdoor)}\n >\n Outdoor SVG\n </button>\n {renderRowDelete(outdoor)}\n </div>\n </div>\n ) : canManage ? (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__add\"\n onClick={() => onScreenChange({ mode: 'add-base' })}\n >\n Add Outdoor SVG\n </button>\n ) : null}\n </div>\n {error ? <div className=\"eyeon-map-floors__error\">{error}</div> : null}\n {renderDeleteModal()}\n {drag\n ? createPortal(\n <div\n ref={ghostRef}\n className=\"eyeon-map-floors__row eyeon-map-floors__row--ghost\"\n style={{\n left: drag.x,\n top: drag.y,\n width: drag.width,\n height: drag.height,\n }}\n >\n <span className=\"eyeon-map-floors__grip\" aria-hidden=\"true\">\n <GripIcon />\n </span>\n <span className=\"eyeon-map-floors__item\">{drag.name}</span>\n <span className=\"eyeon-map-floors__icon-danger\" aria-hidden=\"true\">\n <TrashIcon />\n </span>\n </div>,\n document.body,\n )\n : null}\n </div>\n );\n}\n","import React, { useEffect, useMemo, useState, type ReactNode } from 'react';\nimport {\n clampStoreRadius,\n type CmAmenityCatalogItem,\n type CmAnchor,\n type CmConnector,\n type CmLevel,\n type CmBuilding,\n type CmShapeAssignment,\n type ThemeDefaults,\n} from '../../core';\nimport {\n connectorForShape,\n railConnectorShapes,\n} from '../connectorAssignments';\nimport { hexColorInputValue, normalizeHexColor } from '../hexColor';\nimport { shapeKindLabel } from '../labels';\nimport { railAssignmentGroups } from '../railAssignments';\nimport { ModernSelect } from '../../ui/ModernSelect.tsx';\nimport {\n FloorsPanel,\n floorsScreenTitle,\n visibleFloorCount,\n type CreateLevelInput,\n type FloorsScreen,\n type UpdateLevelInput,\n} from './FloorsPanel';\n\nexport type RailSection =\n | 'floors'\n | 'stores'\n | 'amenities'\n | 'kiosks'\n | 'escalators'\n | 'elevators'\n | 'paths'\n | 'style'\n | 'selection'\n | 'unassigned'\n | 'edit-map'\n | 'wayfinding';\n\n/** @deprecated Use RailSection */\nexport type RailTab = RailSection;\n\nexport interface LeftRailDraft {\n buildings: CmBuilding[];\n levels: CmLevel[];\n shapes: Array<{\n id: number;\n levelId: number;\n key: string;\n kind: string;\n sourceSvgId?: string | null;\n orphanedAt?: string | null;\n }>;\n anchors: Array<Pick<CmAnchor, 'id' | 'levelId' | 'shapeId' | 'connectorId'>>;\n edges: Array<{ id: number }>;\n connectors: CmConnector[];\n amenities: CmAmenityCatalogItem[];\n assignments: CmShapeAssignment[];\n}\n\nexport interface LeftRailProps {\n section: RailSection | null;\n onSectionChange: (section: RailSection | null) => void;\n draft: LeftRailDraft;\n activeLevelId: number | null;\n selectedShapeId: number | null;\n onSelectShape: (id: number) => void;\n canFloors: boolean;\n canSettings: boolean;\n onImportSvg?: (levelId: number, file: File) => Promise<void>;\n onCreateLevel?: (input: CreateLevelInput) => Promise<number | void>;\n onUpdateLevel?: (input: UpdateLevelInput) => Promise<void>;\n onDeleteLevel?: (levelId: number) => Promise<void>;\n onReorderLevels?: (orderedIds: number[]) => Promise<void>;\n onAutoroute?: (levelId: number) => Promise<void>;\n theme: ThemeDefaults;\n onThemeChange: (partial: Partial<ThemeDefaults>) => void;\n assignPanel: ReactNode;\n /** Draw/tools UI for Edit Map (icons + inspector). */\n editMapPanel?: ReactNode;\n /** Route tools and path stats for Wayfinding. */\n wayfindingPanel?: ReactNode;\n footer?: ReactNode;\n}\n\nconst NAV_ITEMS: Array<{\n id: RailSection;\n label: string;\n description: string;\n countKey?: 'floors' | 'stores' | 'amenities' | 'kiosks' | 'escalators' | 'elevators' | 'unassigned';\n}> = [\n {\n id: 'floors',\n label: 'Floors',\n description: 'Building floors and Outdoor SVG',\n countKey: 'floors',\n },\n {\n id: 'stores',\n label: 'Stores',\n description: 'Retailers linked to the map',\n countKey: 'stores',\n },\n {\n id: 'amenities',\n label: 'Amenities',\n description: 'Amenities linked to the map',\n countKey: 'amenities',\n },\n {\n id: 'kiosks',\n label: 'Kiosks',\n description: 'Link kiosk screens to devices',\n countKey: 'kiosks',\n },\n {\n id: 'escalators',\n label: 'Escalators',\n description: 'One-way rides between floors',\n countKey: 'escalators',\n },\n {\n id: 'elevators',\n label: 'Elevators',\n description: 'Two-way shafts across floors',\n countKey: 'elevators',\n },\n {\n id: 'unassigned',\n label: 'Unassigned',\n description: 'Polygons with no store, amenity, or kiosk',\n countKey: 'unassigned',\n },\n];\n\nconst SECTION_TITLES: Record<RailSection, string> = {\n floors: 'Floors',\n stores: 'Stores',\n amenities: 'Amenities',\n kiosks: 'Kiosks',\n escalators: 'Escalators',\n elevators: 'Elevators',\n paths: 'Walking paths',\n style: 'Settings',\n selection: 'Selected',\n unassigned: 'Unassigned',\n 'edit-map': 'Edit Map',\n wayfinding: 'Wayfinding',\n};\n\nfunction BackIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M10.2 2.6 4.8 8l5.4 5.4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ChevronIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M5.8 2.6 11.2 8l-5.4 5.4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nconst NAV_ICON_PROPS = {\n width: 18,\n height: 18,\n viewBox: '0 0 18 18',\n fill: 'none',\n 'aria-hidden': true,\n} as const;\n\nfunction FloorsNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M3 12.5 9 15.5 15 12.5M3 9.2 9 12.2 15 9.2M9 2.5 3 5.5 9 8.5 15 5.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction StoresNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M3.5 7.2 4.4 14h9.2l.9-6.8H3.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3 7.2 4.6 4h8.8L15 7.2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M7 14V9.6h4V14\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\nfunction AmenitiesNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M9 15.2s5.2-3.6 5.2-7.1A5.2 5.2 0 0 0 9 2.8a5.2 5.2 0 0 0-5.2 5.3c0 3.5 5.2 7.1 5.2 7.1Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"9\" cy=\"8\" r=\"1.6\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction KiosksNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect\n x=\"2.5\"\n y=\"3\"\n width=\"13\"\n height=\"8.5\"\n rx=\"1.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path d=\"M7 15h4M9 11.5V15\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction EscalatorsNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M3 15h4V11h4V7h4V3h3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ElevatorsNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect x=\"4\" y=\"2.8\" width=\"10\" height=\"12.4\" rx=\"1.4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M9 5.4 7.2 7.6h3.6Zm0 7.2 1.8-2.2H7.2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction SettingsNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS} viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <path\n d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction UnassignedNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect\n x=\"3\"\n y=\"3\"\n width=\"12\"\n height=\"12\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeDasharray=\"2.4 2\"\n />\n </svg>\n );\n}\n\nfunction EditMapNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect\n x=\"3\"\n y=\"3.5\"\n width=\"12\"\n height=\"11\"\n rx=\"1.6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M6 11.2 11.4 5.8l1.8 1.8L7.8 13H6z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction WayfindingNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M3.4 13.4c2.4-3.6 3.5-3.8 5-3.8 1.8 0 2.5 2 5.2 2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"3.4\" cy=\"13.4\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"8.4\" cy=\"9.6\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"13.6\" cy=\"11.6\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nconst NAV_ICONS: Partial<Record<RailSection, () => React.ReactElement>> = {\n floors: FloorsNavIcon,\n stores: StoresNavIcon,\n amenities: AmenitiesNavIcon,\n kiosks: KiosksNavIcon,\n escalators: EscalatorsNavIcon,\n elevators: ElevatorsNavIcon,\n style: SettingsNavIcon,\n unassigned: UnassignedNavIcon,\n 'edit-map': EditMapNavIcon,\n wayfinding: WayfindingNavIcon,\n};\n\nfunction ColorField({\n label,\n value,\n onChange,\n}: {\n label: string;\n value: string;\n onChange: (hex: string) => void;\n}) {\n const [hex, setHex] = useState(value);\n\n useEffect(() => {\n setHex(value);\n }, [value]);\n\n const commit = (next: string) => {\n const normalized = normalizeHexColor(next);\n if (!normalized) {\n setHex(value);\n return;\n }\n setHex(normalized);\n if (normalized !== value.toLowerCase() && normalized !== value) onChange(normalized);\n };\n\n return (\n <div className=\"eyeon-map-rail__field eyeon-map-rail__field--color\">\n <span>{label}</span>\n <div className=\"eyeon-map-rail__color-row\">\n <input\n type=\"text\"\n spellCheck={false}\n value={hex}\n aria-label={`${label} hex color`}\n onChange={(e) => setHex(e.target.value)}\n onBlur={() => commit(hex)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n }\n }}\n />\n <input\n type=\"color\"\n value={hexColorInputValue(value)}\n aria-label={label}\n onChange={(e) => onChange(e.target.value)}\n />\n </div>\n </div>\n );\n}\n\nexport function LeftRail({\n section,\n onSectionChange,\n draft,\n activeLevelId,\n selectedShapeId,\n onSelectShape,\n canFloors,\n canSettings,\n onCreateLevel,\n onUpdateLevel,\n onDeleteLevel,\n onReorderLevels,\n onAutoroute,\n theme,\n onThemeChange,\n assignPanel,\n editMapPanel,\n wayfindingPanel,\n footer,\n}: LeftRailProps) {\n const [floorsScreen, setFloorsScreen] = useState<FloorsScreen>({ mode: 'list' });\n\n useEffect(() => {\n if (section !== 'floors') setFloorsScreen({ mode: 'list' });\n }, [section]);\n\n const levelShapes = draft.shapes.filter((s) => s.levelId === activeLevelId);\n const assigned = useMemo(\n () => railAssignmentGroups(draft.shapes, draft.assignments),\n [draft.shapes, draft.assignments],\n );\n const storeShapes = assigned.stores;\n const amenityShapes = assigned.amenities;\n const unassignedShapes = assigned.unassigned;\n const kioskShapes = levelShapes.filter((s) => s.kind === 'kiosk_screen');\n const connectors = draft.connectors ?? [];\n const escalatorShapes = railConnectorShapes(draft.shapes, 'escalator', draft.anchors, connectors);\n const elevatorShapes = railConnectorShapes(draft.shapes, 'elevator', draft.anchors, connectors);\n const activeLevel = draft.levels.find((l) => l.id === activeLevelId);\n const pathCount = draft.anchors.filter((a) => a.levelId === activeLevelId).length;\n const levelName = (levelId: number) =>\n draft.levels.find((l) => l.id === levelId)?.name ?? 'Floor';\n const levelShapeCounts = useMemo(() => {\n const counts: Record<number, number> = {};\n for (const shape of draft.shapes) {\n if (shape.orphanedAt) continue;\n counts[shape.levelId] = (counts[shape.levelId] ?? 0) + 1;\n }\n return counts;\n }, [draft.shapes]);\n\n const counts: Record<NonNullable<(typeof NAV_ITEMS)[number]['countKey']>, number> = {\n floors: visibleFloorCount(draft.levels),\n stores: storeShapes.length,\n amenities: amenityShapes.length,\n kiosks: kioskShapes.length,\n escalators: escalatorShapes.length,\n elevators: elevatorShapes.length,\n unassigned: unassignedShapes.length,\n };\n\n const renderShapeList = (\n shapes: typeof levelShapes,\n empty: string,\n ) =>\n shapes.length === 0 ? (\n <p className=\"eyeon-map-rail__hint\">{empty}</p>\n ) : (\n shapes.map((s) => (\n <button\n key={s.id}\n type=\"button\"\n className={\n s.id === selectedShapeId\n ? 'eyeon-map-rail__row is-active'\n : 'eyeon-map-rail__row'\n }\n onClick={() => onSelectShape(s.id)}\n >\n <span>{s.key}</span>\n <span className=\"eyeon-map-rail__muted\">\n {levelName(s.levelId)} · {shapeKindLabel(s.kind)}\n </span>\n </button>\n ))\n );\n\n return (\n <aside className=\"eyeon-map-rail\">\n {section ? (\n <div className=\"eyeon-map-rail__header\">\n <button\n type=\"button\"\n className=\"eyeon-map-rail__back\"\n onClick={() => {\n if (section === 'floors' && floorsScreen.mode !== 'list') {\n setFloorsScreen({ mode: 'list' });\n return;\n }\n onSectionChange(null);\n }}\n aria-label=\"Back\"\n >\n <BackIcon />\n </button>\n <div className=\"eyeon-map-rail__header-title\">\n {section === 'floors'\n ? floorsScreenTitle(floorsScreen, draft.levels)\n : SECTION_TITLES[section]}\n </div>\n </div>\n ) : (\n <div className=\"eyeon-map-rail__header\">\n <div className=\"eyeon-map-rail__header-title\">Map options</div>\n </div>\n )}\n\n <div className=\"eyeon-map-rail__body\">\n {!section && (\n <nav className=\"eyeon-map-rail__nav\" aria-label=\"Map options\">\n {NAV_ITEMS.map((item) => {\n const Icon = NAV_ICONS[item.id];\n return (\n <button\n key={item.id}\n type=\"button\"\n className=\"eyeon-map-rail__nav-item\"\n onClick={() => onSectionChange(item.id)}\n >\n {Icon ? (\n <span className=\"eyeon-map-rail__nav-icon\">\n <Icon />\n </span>\n ) : null}\n <span className=\"eyeon-map-rail__nav-copy\">\n <span className=\"eyeon-map-rail__nav-title\">{item.label}</span>\n <span className=\"eyeon-map-rail__nav-desc\">{item.description}</span>\n </span>\n <span className=\"eyeon-map-rail__nav-meta\">\n {item.countKey != null ? (\n <span className=\"eyeon-map-rail__nav-count\">{counts[item.countKey]}</span>\n ) : null}\n <ChevronIcon />\n </span>\n </button>\n );\n })}\n <div className=\"eyeon-map-rail__nav-sep\" role=\"separator\" />\n <button\n type=\"button\"\n className=\"eyeon-map-rail__nav-item\"\n onClick={() => onSectionChange('edit-map')}\n >\n <span className=\"eyeon-map-rail__nav-icon\">\n <EditMapNavIcon />\n </span>\n <span className=\"eyeon-map-rail__nav-copy\">\n <span className=\"eyeon-map-rail__nav-title\">Edit Map</span>\n <span className=\"eyeon-map-rail__nav-desc\">\n Draw and reshape stores, labels, and lines\n </span>\n </span>\n <span className=\"eyeon-map-rail__nav-meta\">\n <ChevronIcon />\n </span>\n </button>\n <button\n type=\"button\"\n className=\"eyeon-map-rail__nav-item\"\n onClick={() => onSectionChange('wayfinding')}\n >\n <span className=\"eyeon-map-rail__nav-icon\">\n <WayfindingNavIcon />\n </span>\n <span className=\"eyeon-map-rail__nav-copy\">\n <span className=\"eyeon-map-rail__nav-title\">Wayfinding</span>\n <span className=\"eyeon-map-rail__nav-desc\">\n Walking paths and route anchors\n </span>\n </span>\n <span className=\"eyeon-map-rail__nav-meta\">\n <ChevronIcon />\n </span>\n </button>\n <div className=\"eyeon-map-rail__nav-sep\" role=\"separator\" />\n <button\n type=\"button\"\n className=\"eyeon-map-rail__nav-item\"\n onClick={() => onSectionChange('style')}\n >\n <span className=\"eyeon-map-rail__nav-icon\">\n <SettingsNavIcon />\n </span>\n <span className=\"eyeon-map-rail__nav-copy\">\n <span className=\"eyeon-map-rail__nav-title\">Settings</span>\n <span className=\"eyeon-map-rail__nav-desc\">Colors and 2D / 3D look</span>\n </span>\n <span className=\"eyeon-map-rail__nav-meta\">\n <ChevronIcon />\n </span>\n </button>\n </nav>\n )}\n\n {section === 'edit-map' && (\n <div className=\"eyeon-map-rail__section\">{editMapPanel}</div>\n )}\n\n {section === 'wayfinding' && (\n <div className=\"eyeon-map-rail__section\">{wayfindingPanel}</div>\n )}\n\n {section === 'floors' && (\n <FloorsPanel\n levels={draft.levels}\n buildings={draft.buildings}\n levelShapeCounts={levelShapeCounts}\n canFloors={canFloors}\n screen={floorsScreen}\n onScreenChange={setFloorsScreen}\n onCreateLevel={\n onCreateLevel\n ? async (input) => {\n const id = await onCreateLevel(input);\n setFloorsScreen({ mode: 'list' });\n return id;\n }\n : undefined\n }\n onUpdateLevel={onUpdateLevel}\n onDeleteLevel={onDeleteLevel}\n onReorderLevels={onReorderLevels}\n />\n )}\n\n {section === 'stores' && (\n <div className=\"eyeon-map-rail__section\">\n <p className=\"eyeon-map-rail__hint\">\n Only spaces linked to a retailer. Click one here or on the map to\n change the assignment.\n </p>\n {assignPanel}\n <div className=\"eyeon-map-rail__heading\">\n Assigned stores ({storeShapes.length})\n </div>\n {renderShapeList(storeShapes, 'No stores are assigned yet.')}\n </div>\n )}\n\n {section === 'amenities' && (\n <div className=\"eyeon-map-rail__section\">\n <p className=\"eyeon-map-rail__hint\">\n Only amenities linked to a catalog item. Click one to change the\n assignment, or browse the catalog below.\n </p>\n {assignPanel}\n <div className=\"eyeon-map-rail__heading\">\n Assigned amenities ({amenityShapes.length})\n </div>\n {renderShapeList(amenityShapes, 'No amenities are assigned yet.')}\n {draft.amenities.length > 0 && (\n <>\n <div className=\"eyeon-map-rail__heading\">Amenity catalog</div>\n {draft.amenities.map((a) => (\n <div key={a.id} className=\"eyeon-map-rail__row\">\n <span>{a.name}</span>\n <span className=\"eyeon-map-rail__muted\">{a.code}</span>\n </div>\n ))}\n </>\n )}\n </div>\n )}\n\n {section === 'unassigned' && (\n <div className=\"eyeon-map-rail__section\">\n <p className=\"eyeon-map-rail__hint\">\n Store, amenity, and kiosk polygons that are not linked yet. Click\n one to assign it.\n </p>\n {assignPanel}\n <div className=\"eyeon-map-rail__heading\">\n Unassigned ({unassignedShapes.length})\n </div>\n {renderShapeList(unassignedShapes, 'Every assignable polygon has a link.')}\n </div>\n )}\n\n {section === 'escalators' && (\n <div className=\"eyeon-map-rail__section\">\n <p className=\"eyeon-map-rail__hint\">\n Pick the boarding landing, then the exit landing on another floor.\n Rides are one-way, like a real escalator.\n </p>\n {assignPanel}\n <div className=\"eyeon-map-rail__heading\">\n Escalators ({escalatorShapes.length})\n </div>\n {escalatorShapes.length === 0 ? (\n <p className=\"eyeon-map-rail__hint\">\n No escalator shapes yet. Import a floor SVG or draw a connector\n in Edit Map.\n </p>\n ) : (\n escalatorShapes.map((s) => {\n const linked = connectorForShape(s.id, draft.anchors, connectors);\n return (\n <button\n key={s.id}\n type=\"button\"\n className={\n s.id === selectedShapeId\n ? 'eyeon-map-rail__row is-active'\n : 'eyeon-map-rail__row'\n }\n onClick={() => onSelectShape(s.id)}\n >\n <span>{s.key}</span>\n <span className=\"eyeon-map-rail__muted\">\n {levelName(s.levelId)} · {linked ? linked.name : 'Not linked'}\n </span>\n </button>\n );\n })\n )}\n </div>\n )}\n\n {section === 'elevators' && (\n <div className=\"eyeon-map-rail__section\">\n <p className=\"eyeon-map-rail__hint\">\n Group elevator doors on each floor into one shaft. Travel is\n two-way between every stop.\n </p>\n {assignPanel}\n <div className=\"eyeon-map-rail__heading\">\n Elevators ({elevatorShapes.length})\n </div>\n {elevatorShapes.length === 0 ? (\n <p className=\"eyeon-map-rail__hint\">\n No elevator shapes yet. Import a floor SVG or draw a connector\n in Edit Map.\n </p>\n ) : (\n elevatorShapes.map((s) => {\n const linked = connectorForShape(s.id, draft.anchors, connectors);\n return (\n <button\n key={s.id}\n type=\"button\"\n className={\n s.id === selectedShapeId\n ? 'eyeon-map-rail__row is-active'\n : 'eyeon-map-rail__row'\n }\n onClick={() => onSelectShape(s.id)}\n >\n <span>{s.key}</span>\n <span className=\"eyeon-map-rail__muted\">\n {levelName(s.levelId)} · {linked ? linked.name : 'Not linked'}\n </span>\n </button>\n );\n })\n )}\n </div>\n )}\n\n {section === 'kiosks' && (\n <div className=\"eyeon-map-rail__section\">\n <p className=\"eyeon-map-rail__hint\">\n Select a kiosk screen on the map, then enter its device ID.\n </p>\n {assignPanel}\n <div className=\"eyeon-map-rail__heading\">On this floor ({kioskShapes.length})</div>\n {renderShapeList(kioskShapes, 'No kiosk screens on this floor yet.')}\n </div>\n )}\n\n {section === 'paths' && (\n <div className=\"eyeon-map-rail__section\">\n <p className=\"eyeon-map-rail__hint\">\n Use Wayfinding to place the walking path, then drag each faded\n store point onto that path to hook the store in.\n </p>\n <div className=\"eyeon-map-rail__stat\">\n {pathCount} path points · {draft.edges.length} connections\n </div>\n {canFloors && activeLevelId != null && (\n <div className=\"eyeon-map-rail__actions\">\n <button type=\"button\" onClick={() => onAutoroute?.(activeLevelId)}>\n Suggest walking paths\n </button>\n </div>\n )}\n </div>\n )}\n\n {section === 'style' && (\n <div className=\"eyeon-map-rail__section\">\n {!canSettings ? (\n <p className=\"eyeon-map-rail__hint\">\n You do not have permission to change map colors.\n </p>\n ) : (\n <>\n <p className=\"eyeon-map-rail__hint\">\n These colors apply on the public map after Save Changes.\n </p>\n <label className=\"eyeon-map-rail__field\">\n View\n <ModernSelect\n ariaLabel=\"View\"\n value={theme.MAP_STYLE}\n searchable={false}\n options={[\n { value: '2D', label: '2D' },\n { value: '3D', label: '3D' },\n ]}\n onChange={(next) =>\n onThemeChange({ MAP_STYLE: next as '2D' | '3D' })\n }\n />\n </label>\n {(\n [\n ['ACCENT_COLOR', 'Highlight'],\n ['STORE_DEFAULT_COLOR', 'Stores'],\n ['MAP_BACKGROUND_COLOR', 'Background'],\n ['WALL_COLOR', 'Walls'],\n ] as const\n ).map(([key, label]) => (\n <ColorField\n key={key}\n label={label}\n value={theme[key]}\n onChange={(hex) => onThemeChange({ [key]: hex })}\n />\n ))}\n <label className=\"eyeon-map-rail__field\">\n Stores radius\n <input\n type=\"number\"\n min={0}\n step={1}\n inputMode=\"decimal\"\n value={theme.STORE_RADIUS}\n aria-label=\"Stores radius\"\n onChange={(e) =>\n onThemeChange({ STORE_RADIUS: clampStoreRadius(e.target.value) })\n }\n />\n </label>\n <p className=\"eyeon-map-rail__hint\">\n Rounds store corners on the public map. Edit Map keeps sharp\n corners.\n </p>\n <p className=\"eyeon-map-rail__hint\">\n Green areas, parking lanes, and walking paths use fixed house\n colors from the map library — not editable here.\n </p>\n </>\n )}\n </div>\n )}\n\n {section === 'selection' && (\n <div className=\"eyeon-map-rail__section\">\n <p className=\"eyeon-map-rail__hint\">\n {activeLevel\n ? `Editing a shape on ${activeLevel.name}.`\n : 'Editing the selected shape.'}\n </p>\n {assignPanel}\n </div>\n )}\n </div>\n\n {footer ? <div className=\"eyeon-map-rail__footer\">{footer}</div> : null}\n </aside>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport type {\n CmAmenityCatalogItem,\n CmShape,\n CmShapeAssignment,\n ShapeKind,\n ShapeLabel,\n UnitStatus,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect.tsx';\nimport { SHAPE_KIND_LABELS, UNIT_STATUS_LABELS } from '../labels';\n\nconst SHAPE_KINDS = Object.keys(SHAPE_KIND_LABELS) as ShapeKind[];\nconst UNIT_STATUSES = Object.keys(UNIT_STATUS_LABELS) as UnitStatus[];\n\nexport interface InspectorProps {\n shape: CmShape | null;\n assignment: CmShapeAssignment | null;\n amenities: CmAmenityCatalogItem[];\n /** Other shape keys on the same level — used for uniqueness validation. */\n levelShapeKeys?: string[];\n canEdit: boolean;\n onRename: (key: string) => void;\n onChangeKind: (kind: ShapeKind) => void;\n onDelete?: () => void;\n onSaveAssignment: (assignment: CmShapeAssignment) => void;\n onUpdateLabel?: (label: ShapeLabel) => void;\n}\n\nexport function Inspector({\n shape,\n assignment,\n amenities,\n levelShapeKeys = [],\n canEdit,\n onRename,\n onChangeKind,\n onDelete,\n onSaveAssignment,\n onUpdateLabel,\n}: InspectorProps) {\n const [key, setKey] = useState(shape?.key ?? '');\n const [keyError, setKeyError] = useState<string | null>(null);\n const [retailerId, setRetailerId] = useState<string>(\n assignment?.retailerId?.toString() ?? '',\n );\n const [amenityId, setAmenityId] = useState<string>(\n assignment?.amenityId?.toString() ?? '',\n );\n const [kioskId, setKioskId] = useState<string>(\n assignment?.kioskId?.toString() ?? '',\n );\n const [unitStatus, setUnitStatus] = useState<UnitStatus>(\n assignment?.unitStatus ?? 'vacant',\n );\n const [unitNumber, setUnitNumber] = useState(assignment?.unitNumber ?? '');\n const [customLabel, setCustomLabel] = useState(assignment?.customLabel ?? '');\n const [labelText, setLabelText] = useState(shape?.label.text ?? '');\n\n useEffect(() => {\n setKey(shape?.key ?? '');\n setKeyError(null);\n setRetailerId(assignment?.retailerId?.toString() ?? '');\n setAmenityId(assignment?.amenityId?.toString() ?? '');\n setKioskId(assignment?.kioskId?.toString() ?? '');\n setUnitStatus(assignment?.unitStatus ?? 'vacant');\n setUnitNumber(assignment?.unitNumber ?? '');\n setCustomLabel(assignment?.customLabel ?? '');\n setLabelText(shape?.label.text ?? '');\n }, [shape, assignment]);\n\n if (!shape) {\n return (\n <div className=\"eyeon-map-inspector__empty\">\n Pick an item from the list below, or click it on the map.\n </div>\n );\n }\n\n const commitRename = () => {\n if (!key || key === shape.key) {\n setKeyError(null);\n return;\n }\n if (levelShapeKeys.includes(key)) {\n setKeyError('That name is already used on this level.');\n return;\n }\n setKeyError(null);\n onRename(key);\n };\n\n return (\n <div className=\"eyeon-map-inspector\">\n <div className=\"eyeon-map-inspector__heading\">Selected</div>\n\n <label className=\"eyeon-map-rail__field\">\n Name\n <input\n value={key}\n disabled={!canEdit}\n onChange={(e) => {\n setKey(e.target.value);\n setKeyError(null);\n }}\n onBlur={commitRename}\n />\n </label>\n {keyError ? (\n <p className=\"eyeon-map-rail__hint\" style={{ color: '#b91c1c' }}>\n {keyError}\n </p>\n ) : null}\n {shape.geometryLocked ? (\n <p className=\"eyeon-map-rail__hint\">\n Geometry locked — outdoor re-uploads will not overwrite this shape.\n </p>\n ) : null}\n\n <label className=\"eyeon-map-rail__field\">\n Type\n <ModernSelect\n ariaLabel=\"Type\"\n value={shape.kind}\n disabled={!canEdit}\n searchable\n options={SHAPE_KINDS.map((k) => ({\n value: k,\n label: SHAPE_KIND_LABELS[k],\n }))}\n onChange={(next) => onChangeKind(next as ShapeKind)}\n />\n </label>\n\n {shape.kind === 'label' && (\n <label className=\"eyeon-map-rail__field\">\n Text\n <input\n value={labelText}\n disabled={!canEdit}\n placeholder=\"Text on the map\"\n onChange={(e) => setLabelText(e.target.value)}\n onBlur={() => {\n if (!onUpdateLabel) return;\n const next = labelText.trim();\n if (!next || next === (shape.label.text ?? '')) return;\n onUpdateLabel({ ...shape.label, text: next });\n }}\n />\n </label>\n )}\n\n {shape.kind !== 'label' &&\n shape.kind !== 'connector' &&\n (shape.kind === 'unit' || shape.kind === 'parking_zone') && (\n <>\n <div className=\"eyeon-map-inspector__heading\">Store</div>\n <label className=\"eyeon-map-rail__field\">\n Retailer ID\n <input\n value={retailerId}\n disabled={!canEdit}\n onChange={(e) => setRetailerId(e.target.value)}\n />\n </label>\n <label className=\"eyeon-map-rail__field\">\n Status\n <ModernSelect\n ariaLabel=\"Status\"\n value={unitStatus}\n disabled={!canEdit}\n searchable={false}\n options={UNIT_STATUSES.map((s) => ({\n value: s,\n label: UNIT_STATUS_LABELS[s],\n }))}\n onChange={(next) => setUnitStatus(next as UnitStatus)}\n />\n </label>\n <label className=\"eyeon-map-rail__field\">\n Unit number\n <input\n value={unitNumber}\n disabled={!canEdit}\n onChange={(e) => setUnitNumber(e.target.value)}\n />\n </label>\n </>\n )}\n\n {shape.kind !== 'label' && shape.kind !== 'connector' && shape.kind === 'amenity' && (\n <>\n <div className=\"eyeon-map-inspector__heading\">Amenity</div>\n <label className=\"eyeon-map-rail__field\">\n Linked amenity\n <ModernSelect\n ariaLabel=\"Linked amenity\"\n value={amenityId}\n disabled={!canEdit}\n placeholder=\"Not assigned\"\n searchable\n options={[\n { value: '', label: 'Not assigned' },\n ...amenities.map((a) => ({\n value: String(a.id),\n label: a.name,\n })),\n ]}\n onChange={setAmenityId}\n />\n </label>\n </>\n )}\n\n {shape.kind !== 'label' && shape.kind !== 'connector' && shape.kind === 'kiosk_screen' && (\n <>\n <div className=\"eyeon-map-inspector__heading\">Kiosk</div>\n <label className=\"eyeon-map-rail__field\">\n Kiosk device ID\n <input\n value={kioskId}\n disabled={!canEdit}\n onChange={(e) => setKioskId(e.target.value)}\n />\n </label>\n </>\n )}\n\n {shape.kind !== 'label' && shape.kind !== 'connector' ? (\n <label className=\"eyeon-map-rail__field\">\n Label on map\n <input\n value={customLabel}\n disabled={!canEdit}\n placeholder=\"Optional\"\n onChange={(e) => setCustomLabel(e.target.value)}\n />\n </label>\n ) : null}\n\n {canEdit && (\n <div className=\"eyeon-map-rail__actions\">\n {shape.kind !== 'label' && shape.kind !== 'connector' ? (\n <button\n type=\"button\"\n className=\"eyeon-map-inspector__save\"\n onClick={() =>\n onSaveAssignment({\n shapeId: shape.id,\n targetType: retailerId\n ? 'retailer'\n : amenityId\n ? 'amenity'\n : kioskId\n ? 'kiosk'\n : 'none',\n retailerId: retailerId ? Number(retailerId) : null,\n amenityId: amenityId ? Number(amenityId) : null,\n kioskId: kioskId ? Number(kioskId) : null,\n unitStatus,\n unitNumber: unitNumber || null,\n customLabel: customLabel || null,\n customImageKey: assignment?.customImageKey ?? null,\n })\n }\n >\n Save\n </button>\n ) : null}\n {onDelete ? (\n <button\n type=\"button\"\n className=\"eyeon-map-inspector__delete\"\n onClick={() => {\n if (window.confirm(`Delete shape “${shape.key}”?`)) onDelete();\n }}\n >\n Delete\n </button>\n ) : null}\n </div>\n )}\n </div>\n );\n}\n","import React, { Suspense } from 'react';\nimport type { MapViewerHost, PublishedDocument } from '../../core';\nimport { MapViewer } from '../../viewer/MapViewer';\n\nexport function PreviewOverlay({\n document,\n host = 'PORTAL_ASSIGN',\n onSelectShape,\n activeLevelId,\n onActiveLevelChange,\n routeOnSelect,\n imageProxyUrl,\n}: {\n document: PublishedDocument;\n /** Assign mode hides search. Public preview can be added later as WEBSITE. */\n host?: Extract<MapViewerHost, 'PORTAL_ASSIGN' | 'WEBSITE'>;\n onSelectShape?: (shapeId: number) => void;\n activeLevelId?: number | null;\n onActiveLevelChange?: (levelId: number) => void;\n /** Default true (public navigate). False when assigning in PORTAL. */\n routeOnSelect?: boolean;\n /** Without this the outdoor SVG is fetched cross-origin and CORS blocks it. */\n imageProxyUrl?: string | null;\n}) {\n return (\n <div className=\"eyeon-map-preview\">\n <Suspense fallback={<div className=\"eyeon-map-preview__loading\">Loading preview…</div>}>\n {/* Viewer chrome stays on the canvas — never in the Map options rail. */}\n <MapViewer\n document={document}\n host={host}\n onSelectShape={onSelectShape}\n activeLevelId={activeLevelId}\n onActiveLevelChange={onActiveLevelChange}\n routeOnSelect={routeOnSelect}\n imageProxyUrl={imageProxyUrl}\n />\n </Suspense>\n </div>\n );\n}\n","import type { CmConnector, PublishedDocument } from '../core';\nimport { compileDocument } from '../core';\nimport type { EditorDraftState } from './draftOps';\n\nexport function compileEditorPreview(\n draft: EditorDraftState,\n extras?: {\n revisionId?: number;\n revisionNumber?: number;\n connectors?: CmConnector[];\n publishedAt?: string;\n },\n): PublishedDocument {\n const outdoor = draft.levels.find((level) => level.kind === 'outdoor');\n return compileDocument({\n revisionId: extras?.revisionId ?? 0,\n revisionNumber: extras?.revisionNumber ?? 0,\n centerId: draft.centerId,\n mapId: draft.mapId,\n theme: draft.theme,\n baseSvgUrl: draft.baseSvgUrl ?? outdoor?.sourceSvgUrl ?? null,\n baseViewbox: outdoor?.sourceViewbox ?? null,\n buildings: draft.buildings,\n levels: draft.levels,\n shapes: draft.shapes.filter((s) => !s.orphanedAt),\n assignments: draft.assignments,\n anchors: draft.anchors,\n edges: draft.edges,\n connectors: extras?.connectors ?? draft.connectors ?? [],\n amenities: draft.amenities,\n responsiveOverrides: [],\n publishedAt: extras?.publishedAt,\n /** Prefer already-resolved CDN URLs on draft levels (outdoor SVG). */\n resolveSvgUrl: (key) => {\n if (!key) return null;\n const match = draft.levels.find(\n (l) => l.sourceSvgKey === key || l.sourceSvgUrl === key,\n );\n return match?.sourceSvgUrl ?? key;\n },\n });\n}\n","const memory = new Map<number, RestoredEditorSection>();\n\nexport type RestoredEditorSection = {\n section: 'edit-map' | 'wayfinding';\n levelId: number | null;\n};\n\nconst storageKey = (mapId: number) => `eyeon-map-editor-section:${mapId}`;\n\nfunction dropLegacyStorage(mapId: number): void {\n try {\n sessionStorage.removeItem(storageKey(mapId));\n } catch {\n /* private mode / SSR */\n }\n}\n\n/**\n * Keep Edit Map / Wayfinding open across an in-page remount (save).\n * Memory only — a full page refresh returns to Map options.\n */\nexport function markEditorSection(\n mapId: number,\n restored: RestoredEditorSection,\n): void {\n memory.set(mapId, restored);\n dropLegacyStorage(mapId);\n}\n\nexport function peekEditorSection(mapId: number): RestoredEditorSection | null {\n dropLegacyStorage(mapId);\n return memory.get(mapId) ?? null;\n}\n\nexport function clearEditorSection(mapId: number): void {\n memory.delete(mapId);\n dropLegacyStorage(mapId);\n}\n","const memory = new Set<number>();\n\nconst storageKey = (mapId: number) => `eyeon-map-return-floors:${mapId}`;\n\nfunction storage(): Storage | null {\n try {\n return sessionStorage;\n } catch {\n return null;\n }\n}\n\n/** Remember to reopen the floors list after a remount (reload after add). */\nexport function markReturnToFloorsList(mapId: number): void {\n memory.add(mapId);\n storage()?.setItem(storageKey(mapId), '1');\n}\n\nexport function consumeReturnToFloorsList(mapId: number): boolean {\n const stored = storage()?.getItem(storageKey(mapId)) === '1';\n const pending = memory.has(mapId) || stored;\n clearReturnToFloorsList(mapId);\n return pending;\n}\n\nexport function clearReturnToFloorsList(mapId: number): void {\n memory.delete(mapId);\n storage()?.removeItem(storageKey(mapId));\n}\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport type {\n BatchOp,\n MapEditorHost,\n PublishedDocument,\n ShapeKind,\n} from '../core';\nimport type { ShapeGeometry, ShapeLabel, ShapeStyle } from '../core';\nimport { geometryBBox, mergeTheme } from '../core';\nimport { MapControls } from '../viewer/ui/MapControls';\nimport {\n editorFloorControlLevels,\n isEditorSection,\n levelIdOnEnterEditMap,\n levelIdOnEnterWayfinding,\n portalCenterSurface,\n wayfindingOutdoorReadOnly,\n} from './portalSurface';\nimport { EditorCanvas, type EditorCanvasHandle } from './canvas/EditorCanvas';\nimport {\n resolvedConnectorKind,\n type VerticalRailKind,\n} from './connectorAssignments';\nimport { applyDraftOps, coalesceDraftOp, type EditorDraftState } from './draftOps';\nimport { ConnectorAssign } from './panels/ConnectorAssign';\nimport { LeftRail, type RailSection } from './panels/LeftRail';\nimport type { CreateLevelInput, UpdateLevelInput } from './panels/FloorsPanel';\nimport { Inspector } from './panels/Inspector';\nimport { PreviewOverlay } from './panels/PreviewOverlay';\nimport { compileEditorPreview } from './previewDocument';\nimport { geometryForLabelText } from './labelText';\nimport {\n cloneHistorySnapshot,\n emptyEditorHistory,\n isEditableTypingTarget,\n isEditorRedoHotkey,\n isEditorUndoHotkey,\n pushEditorHistory,\n redoEditorHistory,\n undoEditorHistory,\n type EditorHistorySnapshot,\n} from './history';\nimport {\n connectShapeToRouteOps,\n deleteRouteAnchorOps,\n ensureShapeRouteAnchorOps,\n insertJunctionOnWalkEdgeOps,\n linkRouteAnchorsOp,\n showsWayfinding,\n walkEdgeExists,\n} from './routeStubs';\nimport {\n clearEditorSection,\n markEditorSection,\n peekEditorSection,\n} from './editorSectionReturn';\nimport {\n clearReturnToFloorsList,\n consumeReturnToFloorsList,\n markReturnToFloorsList,\n} from './floorsListReturn';\nimport {\n EditorHistoryButtons,\n EditorToolButtons,\n canPlaceNewRoute,\n nextEditorTool,\n toolHint,\n type EditorTool,\n} from './tools';\nimport './editor.css';\n\nexport type { EditorDraftState } from './draftOps';\nexport type { MapEditorHost } from '../core';\nexport type { EditorTool } from './tools';\n\nexport interface MapEditorProps {\n /**\n * Where the editor is embedded. `PORTAL` (default) always includes Map\n * options (LeftRail: Floors, Kiosks, Settings, plus Edit Map — never viewer\n * chrome). Default center is MapViewer (click-to-assign, no grid). Edit\n * Map swaps in the geometry canvas and editor grid. `WEBSITE` is canvas +\n * toolbar only — public sites should use `MapViewer`, not this editor.\n */\n host?: MapEditorHost;\n draft: EditorDraftState;\n webApiURI: string;\n canEdit?: boolean;\n canFloors?: boolean;\n canSettings?: boolean;\n onBatch?: (ops: BatchOp[]) => Promise<void>;\n onPublish?: () => Promise<void>;\n onImportSvg?: (levelId: number, file: File) => Promise<void>;\n onCreateLevel?: (input: CreateLevelInput) => Promise<number | void>;\n onUpdateLevel?: (input: UpdateLevelInput) => Promise<void>;\n onDeleteLevel?: (levelId: number) => Promise<void>;\n onReorderLevels?: (orderedIds: number[]) => Promise<void>;\n onAutoroute?: (levelId: number) => Promise<void>;\n previewDocument?: PublishedDocument | null;\n /**\n * Media proxy base, same contract as v1 `IMAGE_PROXY_URL` (base + encoded\n * URL). Required whenever the outdoor SVG is served from a origin that does\n * not send CORS headers, otherwise its decoration silently fails to load.\n */\n imageProxyUrl?: string | null;\n className?: string;\n /** Quiet extra actions under the left rail (e.g. developer Classic Map). */\n sidebarFooter?: ReactNode;\n}\n\nexport function MapEditor({\n host = 'PORTAL',\n draft,\n canEdit = true,\n canFloors = true,\n canSettings = true,\n onBatch,\n onPublish,\n onImportSvg,\n onCreateLevel,\n onUpdateLevel,\n onDeleteLevel,\n onReorderLevels,\n onAutoroute,\n previewDocument,\n imageProxyUrl,\n className,\n sidebarFooter,\n}: MapEditorProps) {\n const [section, setSection] = useState<RailSection | null>(() => {\n if (consumeReturnToFloorsList(draft.mapId)) return 'floors';\n return peekEditorSection(draft.mapId)?.section ?? null;\n });\n const [activeLevelId, setActiveLevelId] = useState<number | null>(() => {\n const restoredLevel = peekEditorSection(draft.mapId)?.levelId;\n if (\n restoredLevel != null &&\n draft.levels.some((level) => level.id === restoredLevel)\n ) {\n return restoredLevel;\n }\n return levelIdOnEnterEditMap(draft.levels);\n });\n const [selectedShapeId, setSelectedShapeId] = useState<number | null>(null);\n const [selectedAnchorIds, setSelectedAnchorIds] = useState<number[]>([]);\n const [tool, setTool] = useState<EditorTool>('select');\n const [editVersion, setEditVersion] = useState(0);\n const [needsPublish, setNeedsPublish] = useState(false);\n const [saving, setSaving] = useState(false);\n const [history, setHistory] = useState(emptyEditorHistory);\n const [routeDraftActive, setRouteDraftActive] = useState(false);\n const canvasRef = useRef<EditorCanvasHandle>(null);\n const historyRef = useRef(history);\n const pendingOps = useRef<BatchOp[]>([]);\n const nextTempId = useRef(-1);\n const historyGestureRef = useRef(false);\n historyRef.current = history;\n const showMapOptions = host === 'PORTAL';\n const centerSurface = portalCenterSurface(host, section);\n const isEditMap = centerSurface === 'editor';\n const historyMetaRef = useRef({\n isEditMap,\n selectedShapeId,\n selectedAnchorIds,\n });\n historyMetaRef.current = { isEditMap, selectedShapeId, selectedAnchorIds };\n\n useEffect(() => {\n pendingOps.current = [];\n nextTempId.current = -1;\n historyGestureRef.current = false;\n setEditVersion(0);\n setNeedsPublish(false);\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n }, [draft.mapId, draft.centerId]);\n\n useEffect(() => {\n if (section === 'edit-map' || section === 'wayfinding') {\n markEditorSection(draft.mapId, { section, levelId: activeLevelId });\n return;\n }\n clearEditorSection(draft.mapId);\n }, [activeLevelId, draft.mapId, section]);\n\n // Levels can arrive after the first render, or the active one can be deleted.\n useEffect(() => {\n if (draft.levels.some((level) => level.id === activeLevelId)) return;\n setActiveLevelId(\n section === 'wayfinding'\n ? levelIdOnEnterWayfinding(draft.levels)\n : levelIdOnEnterEditMap(draft.levels),\n );\n }, [draft.levels, activeLevelId, section]);\n\n const workingDraft = useMemo(\n () => applyDraftOps(draft, pendingOps.current),\n [draft, editVersion],\n );\n\n const theme = useMemo(\n () => mergeTheme(workingDraft.theme),\n [workingDraft.theme],\n );\n\n const dirty = pendingOps.current.length > 0 || needsPublish;\n const activeLevel = workingDraft.levels.find((l) => l.id === activeLevelId) ?? null;\n const outdoorViewOnly = wayfindingOutdoorReadOnly(section, activeLevel);\n const canDrawOnCanvas = canEdit && !outdoorViewOnly;\n const hideOutdoorUnderlay =\n section === 'wayfinding' && activeLevel?.kind !== 'outdoor';\n const outdoorLevel = workingDraft.levels.find((l) => l.kind === 'outdoor') ?? null;\n const outdoorShapes =\n outdoorLevel && activeLevel?.kind === 'floor'\n ? workingDraft.shapes.filter((s) => s.levelId === outdoorLevel.id)\n : [];\n const levelShapes = workingDraft.shapes.filter((s) => s.levelId === activeLevelId);\n const compiledPreview = useMemo(\n () =>\n compileEditorPreview(workingDraft, {\n revisionId: previewDocument?.revisionId,\n revisionNumber: previewDocument?.revisionNumber,\n connectors: workingDraft.connectors,\n publishedAt: previewDocument?.publishedAt,\n }),\n [workingDraft, previewDocument],\n );\n const levelAnchors = workingDraft.anchors.filter((a) => a.levelId === activeLevelId);\n const levelEdges = workingDraft.edges.filter((e) => {\n const a = workingDraft.anchors.find((x) => x.id === e.fromAnchorId);\n return a?.levelId === activeLevelId;\n });\n const selectedShape =\n workingDraft.shapes.find((s) => s.id === selectedShapeId) ?? null;\n const selectedAssignment =\n workingDraft.assignments.find((a) => a.shapeId === selectedShapeId) ?? null;\n\n const takeSnapshot = (): EditorHistorySnapshot =>\n cloneHistorySnapshot({\n ops: pendingOps.current,\n nextTempId: nextTempId.current,\n selectedShapeId: historyMetaRef.current.selectedShapeId,\n selectedAnchorIds: historyMetaRef.current.selectedAnchorIds,\n });\n\n const applySnapshot = (snapshot: EditorHistorySnapshot) => {\n pendingOps.current = snapshot.ops;\n nextTempId.current = snapshot.nextTempId;\n setSelectedShapeId(snapshot.selectedShapeId);\n setSelectedAnchorIds(snapshot.selectedAnchorIds);\n setEditVersion((n) => n + 1);\n };\n\n const recordHistoryStep = (mode: 'step' | 'gesture' | 'none') => {\n if (!historyMetaRef.current.isEditMap || mode === 'none') return;\n if (mode === 'gesture') {\n if (historyGestureRef.current) return;\n historyGestureRef.current = true;\n }\n const next = pushEditorHistory(historyRef.current, takeSnapshot());\n historyRef.current = next;\n setHistory(next);\n };\n\n const queueOp = useCallback(\n (op: BatchOp, historyMode: 'step' | 'gesture' | 'none' = 'step'): number | null => {\n recordHistoryStep(historyMode);\n let next = op;\n if (next.op === 'upsert_shape' && next.shape.id == null) {\n const id = nextTempId.current--;\n next = { ...next, shape: { ...next.shape, id } };\n }\n if (next.op === 'upsert_anchor' && next.anchor.id == null) {\n const id = nextTempId.current--;\n next = { ...next, anchor: { ...next.anchor, id } };\n }\n if (next.op === 'upsert_edge' && next.edge.id == null) {\n const id = nextTempId.current--;\n next = { ...next, edge: { ...next.edge, id } };\n }\n if (next.op === 'upsert_connector' && next.connector.id == null) {\n const id = nextTempId.current--;\n next = { ...next, connector: { ...next.connector, id } };\n }\n pendingOps.current = coalesceDraftOp(pendingOps.current, next);\n setEditVersion((n) => n + 1);\n if (next.op === 'upsert_shape') return next.shape.id ?? null;\n if (next.op === 'upsert_anchor') return next.anchor.id ?? null;\n if (next.op === 'upsert_edge') return next.edge.id ?? null;\n if (next.op === 'upsert_connector') return next.connector.id ?? null;\n return null;\n },\n [],\n );\n\n const endHistoryGesture = useCallback(() => {\n historyGestureRef.current = false;\n }, []);\n\n const undo = useCallback(() => {\n if (!historyMetaRef.current.isEditMap || !canEdit || saving) return;\n const routeKind = canvasRef.current?.consumeRouteUndo();\n if (routeKind === 'clear-only') return;\n const next = undoEditorHistory(historyRef.current, takeSnapshot());\n if (!next) return;\n historyGestureRef.current = false;\n applySnapshot(next.restored);\n historyRef.current = next.history;\n setHistory(next.history);\n }, [canEdit, saving]);\n\n const redo = useCallback(() => {\n if (!historyMetaRef.current.isEditMap || !canEdit || saving) return;\n const next = redoEditorHistory(historyRef.current, takeSnapshot());\n if (!next) return;\n historyGestureRef.current = false;\n applySnapshot(next.restored);\n historyRef.current = next.history;\n setHistory(next.history);\n }, [canEdit, saving]);\n\n const handleSaveChanges = useCallback(async () => {\n if (!canEdit || saving) return;\n const ops = pendingOps.current;\n if (!ops.length && !needsPublish) return;\n pendingOps.current = [];\n setEditVersion((n) => n + 1);\n setSaving(true);\n let persisted = !ops.length;\n try {\n if (ops.length && onBatch) {\n await onBatch(ops);\n persisted = true;\n }\n await onPublish?.();\n setNeedsPublish(false);\n historyGestureRef.current = false;\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n } catch {\n if (!persisted) {\n pendingOps.current = ops;\n setEditVersion((n) => n + 1);\n } else {\n setNeedsPublish(true);\n }\n } finally {\n setSaving(false);\n }\n }, [canEdit, needsPublish, onBatch, onPublish, saving]);\n\n const handleSectionChange = useCallback(\n (next: RailSection | null) => {\n if (section === 'edit-map' || next === 'edit-map') {\n setSelectedShapeId(null);\n setSelectedAnchorIds([]);\n }\n if (isEditorSection(section) && !isEditorSection(next)) {\n setTool('select');\n historyGestureRef.current = false;\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n } else if (next === 'edit-map') {\n setTool('select');\n setActiveLevelId(levelIdOnEnterEditMap(draft.levels));\n } else if (next === 'wayfinding') {\n setTool('select');\n setActiveLevelId(levelIdOnEnterWayfinding(draft.levels));\n }\n setSection(next);\n },\n [draft.levels, section],\n );\n\n const handleCanvasLevelChange = (levelId: number) => {\n if (levelId === activeLevelId) return;\n setSelectedShapeId(null);\n setSelectedAnchorIds([]);\n setActiveLevelId(levelId);\n const nextLevel = workingDraft.levels.find((level) => level.id === levelId);\n if (wayfindingOutdoorReadOnly(section, nextLevel)) setTool('select');\n };\n\n useEffect(() => {\n if (!isEditMap || !canEdit) return;\n const onKey = (e: KeyboardEvent) => {\n if (isEditableTypingTarget(e.target)) return;\n if (isEditorUndoHotkey(e)) {\n e.preventDefault();\n undo();\n return;\n }\n if (isEditorRedoHotkey(e)) {\n e.preventDefault();\n redo();\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [canEdit, isEditMap, redo, undo]);\n\n const handleSelectShape = useCallback(\n (id: number | null) => {\n setSelectedShapeId(id);\n if (id == null) return;\n const shape = workingDraft.shapes.find((s) => s.id === id);\n if (shape) setActiveLevelId(shape.levelId);\n setSection((current) => {\n if (\n current === 'edit-map' ||\n current === 'wayfinding' ||\n current === 'unassigned' ||\n current === 'escalators' ||\n current === 'elevators'\n ) {\n return current;\n }\n const connectorKind = shape\n ? resolvedConnectorKind(shape, workingDraft.anchors, workingDraft.connectors)\n : null;\n if (connectorKind === 'escalator') return 'escalators';\n if (connectorKind === 'elevator') return 'elevators';\n if (shape?.kind === 'unit' || shape?.kind === 'parking_zone') return 'stores';\n if (shape?.kind === 'amenity') return 'amenities';\n if (shape?.kind === 'kiosk_screen') return 'kiosks';\n return 'selection';\n });\n },\n [workingDraft.anchors, workingDraft.connectors, workingDraft.shapes],\n );\n\n const handleToolChange = (next: EditorTool) => {\n const resolved = nextEditorTool(tool, next);\n setTool(resolved);\n if (!showsWayfinding(resolved, section === 'wayfinding')) setSelectedAnchorIds([]);\n };\n\n const handleRenameShape = (key: string) => {\n if (!selectedShape || !canEdit) return;\n const clash = workingDraft.shapes.some(\n (s) =>\n s.id !== selectedShape.id &&\n s.levelId === selectedShape.levelId &&\n s.key === key &&\n !s.orphanedAt,\n );\n if (clash) return;\n queueOp({\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key,\n kind: selectedShape.kind,\n },\n });\n };\n\n const handleDeleteShape = () => {\n if (!selectedShape || !canEdit) return;\n queueOp({ op: 'delete_shape', shapeId: selectedShape.id });\n setSelectedShapeId(null);\n };\n\n const handleUpdateShapeGeometry = (\n shapeId: number,\n geometry: ShapeGeometry,\n opts?: { live?: boolean },\n ) => {\n if (!canDrawOnCanvas) return;\n const shape = workingDraft.shapes.find((s) => s.id === shapeId);\n if (!shape) return;\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: shape.id,\n levelId: shape.levelId,\n key: shape.key,\n kind: shape.kind,\n geometry,\n bbox: geometryBBox(geometry),\n geometryLocked: true,\n },\n },\n opts?.live ? 'gesture' : 'step',\n );\n };\n\n const handleUpdateLabel = (label: ShapeLabel) => {\n if (!selectedShape || !canEdit) return;\n const size = label.size ?? selectedShape.label.size ?? 16;\n const geometry = geometryForLabelText(\n selectedShape.geometry,\n label.text ?? '',\n size,\n );\n queueOp({\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n label,\n geometry,\n bbox: geometryBBox(geometry),\n },\n });\n };\n\n const handleChangeKind = (kind: ShapeKind) => {\n if (!selectedShape || !canEdit) return;\n queueOp({\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind,\n },\n });\n };\n\n const queueOpBatch = (ops: BatchOp[]) => {\n ops.forEach((op, index) => queueOp(op, index === 0 ? 'step' : 'none'));\n };\n\n const selectedConnectorKind = selectedShape\n ? resolvedConnectorKind(selectedShape, workingDraft.anchors, workingDraft.connectors)\n : null;\n const connectorRailKind: VerticalRailKind | null =\n selectedConnectorKind === 'escalator' || selectedConnectorKind === 'elevator'\n ? selectedConnectorKind\n : null;\n\n const assignPanel = (\n <>\n <Inspector\n shape={selectedShape}\n assignment={selectedAssignment}\n amenities={workingDraft.amenities}\n levelShapeKeys={levelShapes\n .filter((s) => s.id !== selectedShapeId)\n .map((s) => s.key)}\n canEdit={canEdit}\n onRename={handleRenameShape}\n onChangeKind={handleChangeKind}\n onDelete={handleDeleteShape}\n onUpdateLabel={handleUpdateLabel}\n onSaveAssignment={(assignment) => {\n if (!canEdit) return;\n queueOp({ op: 'upsert_assignment', assignment });\n }}\n />\n {selectedShape && connectorRailKind ? (\n <ConnectorAssign\n shape={selectedShape}\n railKind={connectorRailKind}\n canEdit={canEdit}\n ctx={{\n mapId: workingDraft.mapId,\n levels: workingDraft.levels,\n shapes: workingDraft.shapes,\n anchors: workingDraft.anchors,\n edges: workingDraft.edges,\n connectors: workingDraft.connectors,\n allocId: () => nextTempId.current--,\n }}\n onApplyOps={queueOpBatch}\n />\n ) : null}\n </>\n );\n\n const toolGroup = section === 'wayfinding' ? 'route' : section === 'edit-map' ? 'map' : undefined;\n\n return (\n <div className={`eyeon-map-editor eyeon-map-editor--${host} ${className ?? ''}`}>\n {showMapOptions ? (\n <LeftRail\n section={section}\n onSectionChange={handleSectionChange}\n draft={workingDraft}\n activeLevelId={activeLevelId}\n selectedShapeId={selectedShapeId}\n onSelectShape={(id) => handleSelectShape(id)}\n canFloors={canFloors}\n canSettings={canSettings}\n onImportSvg={onImportSvg}\n onCreateLevel={\n onCreateLevel\n ? async (input) => {\n markReturnToFloorsList(draft.mapId);\n try {\n const id = await onCreateLevel(input);\n setSection('floors');\n clearReturnToFloorsList(draft.mapId);\n return id;\n } catch (error) {\n clearReturnToFloorsList(draft.mapId);\n throw error;\n }\n }\n : undefined\n }\n onUpdateLevel={onUpdateLevel}\n onDeleteLevel={onDeleteLevel}\n onReorderLevels={onReorderLevels}\n onAutoroute={onAutoroute}\n theme={theme}\n onThemeChange={(partial) => {\n if (!canSettings) return;\n queueOp(\n { op: 'update_theme', theme: { ...workingDraft.theme, ...partial } },\n 'none',\n );\n }}\n footer={sidebarFooter}\n assignPanel={assignPanel}\n editMapPanel={\n <>\n <EditorToolButtons\n tool={tool}\n onToolChange={handleToolChange}\n canEdit={canEdit}\n group=\"map\"\n />\n {toolHint(tool) ? (\n <p className=\"eyeon-map-rail__hint\">{toolHint(tool)}</p>\n ) : null}\n {assignPanel}\n </>\n }\n wayfindingPanel={\n <>\n <EditorToolButtons\n tool={tool}\n onToolChange={handleToolChange}\n canEdit={canDrawOnCanvas}\n group=\"route\"\n />\n {outdoorViewOnly ? (\n <p className=\"eyeon-map-rail__hint\">\n Outdoor is view-only in Wayfinding. Switch to a floor to edit routes.\n </p>\n ) : canPlaceNewRoute(tool) && toolHint(tool) ? (\n <p className=\"eyeon-map-rail__hint\">{toolHint(tool)}</p>\n ) : null}\n <div className=\"eyeon-map-rail__tool-extras\">\n <div className=\"eyeon-map-rail__stat\">\n {levelAnchors.length} path points · {levelEdges.length} connections\n </div>\n {canFloors && activeLevelId != null && !outdoorViewOnly && (\n <div className=\"eyeon-map-rail__actions\">\n <button type=\"button\" onClick={() => onAutoroute?.(activeLevelId)}>\n Suggest walking paths\n </button>\n </div>\n )}\n </div>\n </>\n }\n />\n ) : null}\n\n <div className=\"eyeon-map-editor__center\">\n <div className=\"eyeon-map-editor__toolbar\">\n <div className=\"eyeon-map-editor__tools\">\n {isEditMap ? (\n <EditorToolButtons\n tool={tool}\n onToolChange={handleToolChange}\n canEdit={canDrawOnCanvas}\n group={toolGroup}\n />\n ) : null}\n </div>\n <div className=\"eyeon-map-editor__actions\">\n {isEditMap ? (\n <EditorHistoryButtons\n canUndo={history.past.length > 0 || routeDraftActive}\n canRedo={history.future.length > 0}\n disabled={!canEdit || saving}\n onUndo={undo}\n onRedo={redo}\n />\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-editor__save\"\n aria-label={dirty ? 'Save Changes (unsaved edits)' : 'Save Changes'}\n onClick={() => void handleSaveChanges()}\n disabled={!canEdit || !dirty || saving}\n >\n {dirty ? (\n <span className=\"eyeon-map-editor__save-badge\" aria-hidden=\"true\" />\n ) : null}\n {saving ? 'Saving…' : 'Save Changes'}\n </button>\n </div>\n </div>\n\n {centerSurface === 'viewer' ? (\n <PreviewOverlay\n document={compiledPreview}\n host=\"PORTAL_ASSIGN\"\n onSelectShape={handleSelectShape}\n routeOnSelect={false}\n imageProxyUrl={imageProxyUrl}\n />\n ) : (\n <>\n <div className=\"eyeon-map-editor__canvas-wrap\">\n <EditorCanvas\n ref={canvasRef}\n level={activeLevel}\n shapes={levelShapes.filter((s) => !s.orphanedAt)}\n underlayShapes={\n hideOutdoorUnderlay\n ? []\n : outdoorShapes.filter((s) => !s.orphanedAt)\n }\n anchors={levelAnchors}\n edges={levelEdges}\n assignments={workingDraft.assignments}\n theme={theme}\n tool={tool}\n selectedShapeId={selectedShapeId}\n selectedAnchorIds={selectedAnchorIds}\n baseSvgUrl={workingDraft.baseSvgUrl ?? null}\n baseViewbox={\n hideOutdoorUnderlay\n ? null\n : outdoorLevel?.sourceViewbox ?? null\n }\n outdoorSvgUrl={\n hideOutdoorUnderlay\n ? null\n : outdoorLevel?.sourceSvgUrl ?? workingDraft.baseSvgUrl ?? null\n }\n imageProxyUrl={imageProxyUrl}\n interactiveOnly={activeLevel?.kind === 'outdoor'}\n showGrid\n routeMode={section === 'wayfinding'}\n readOnly={outdoorViewOnly}\n onUndo={undo}\n onRouteDraftActiveChange={setRouteDraftActive}\n onToolChange={handleToolChange}\n onSelectShape={handleSelectShape}\n onSelectAnchors={setSelectedAnchorIds}\n onCreateRouteSegment={(start, end) => {\n if (!activeLevel || !canDrawOnCanvas) return null;\n const id1 = nextTempId.current--;\n const id2 = nextTempId.current--;\n queueOpBatch([\n {\n op: 'upsert_anchor',\n anchor: {\n id: id1,\n levelId: activeLevel.id,\n x: start.x,\n y: start.y,\n kind: 'junction',\n },\n },\n {\n op: 'upsert_anchor',\n anchor: {\n id: id2,\n levelId: activeLevel.id,\n x: end.x,\n y: end.y,\n kind: 'junction',\n },\n },\n {\n op: 'upsert_edge',\n edge: {\n mapId: workingDraft.mapId,\n fromAnchorId: id1,\n toAnchorId: id2,\n kind: 'walk',\n },\n },\n ]);\n return id2;\n }}\n onCreateRoutePoint={(point, prevAnchorId) => {\n if (!activeLevel || !canDrawOnCanvas) return null;\n const id = queueOp({\n op: 'upsert_anchor',\n anchor: {\n levelId: activeLevel.id,\n x: point.x,\n y: point.y,\n kind: 'junction',\n },\n });\n if (\n id != null &&\n prevAnchorId != null &&\n !walkEdgeExists(levelEdges, prevAnchorId, id)\n ) {\n queueOp(\n {\n op: 'upsert_edge',\n edge: {\n mapId: workingDraft.mapId,\n fromAnchorId: prevAnchorId,\n toAnchorId: id,\n kind: 'walk',\n },\n },\n 'none',\n );\n }\n return id;\n }}\n onLinkRouteAnchors={(fromAnchorId, toAnchorId) => {\n if (!canDrawOnCanvas) return;\n const op = linkRouteAnchorsOp(\n workingDraft.mapId,\n fromAnchorId,\n toAnchorId,\n levelEdges,\n () => nextTempId.current--,\n );\n if (op) queueOp(op);\n }}\n onInsertRouteJunction={(edgeId, point) => {\n if (!canDrawOnCanvas || !activeLevel) return null;\n const edge = levelEdges.find((item) => item.id === edgeId);\n if (!edge) return null;\n const { ops, junctionId } = insertJunctionOnWalkEdgeOps({\n levelId: activeLevel.id,\n mapId: workingDraft.mapId,\n edge,\n point,\n allocId: () => nextTempId.current--,\n });\n if (ops.length) queueOpBatch(ops);\n return junctionId;\n }}\n onDeleteRouteAnchor={(anchorId) => {\n if (!canDrawOnCanvas) return;\n const ops = deleteRouteAnchorOps(\n anchorId,\n workingDraft.mapId,\n levelEdges,\n () => nextTempId.current--,\n );\n if (ops.length) queueOpBatch(ops);\n setSelectedAnchorIds((ids) =>\n ids.filter((id) => id !== anchorId),\n );\n }}\n onEnsureShapeAnchor={(shapeId, point) => {\n if (!canDrawOnCanvas) return null;\n const target = levelShapes.find((item) => item.id === shapeId);\n if (!target) return null;\n const { ops, anchorId } = ensureShapeRouteAnchorOps({\n shape: target,\n anchors: levelAnchors,\n allocId: () => nextTempId.current--,\n point,\n });\n if (ops.length) queueOpBatch(ops);\n setSelectedAnchorIds([anchorId]);\n return anchorId;\n }}\n onConnectShapeToRoute={(shapeId, from, drop, maxDist) => {\n if (!canDrawOnCanvas) return;\n const target = levelShapes.find((item) => item.id === shapeId);\n if (!target) return;\n const ops = connectShapeToRouteOps({\n shape: target,\n anchors: levelAnchors,\n edges: levelEdges,\n mapId: workingDraft.mapId,\n from,\n drop,\n maxDist,\n allocId: () => nextTempId.current--,\n });\n if (ops.length) queueOpBatch(ops);\n }}\n onHistoryGestureEnd={endHistoryGesture}\n onMoveAnchor={(anchorId, x, y) => {\n if (!canDrawOnCanvas) return;\n const anchor = levelAnchors.find((a) => a.id === anchorId);\n if (!anchor) return;\n queueOp(\n {\n op: 'upsert_anchor',\n anchor: { ...anchor, x, y },\n },\n 'gesture',\n );\n }}\n onCreateShape={(kind, geometry, extras) => {\n if (!activeLevel || !canDrawOnCanvas) return;\n const id = queueOp({\n op: 'upsert_shape',\n shape: {\n levelId: activeLevel.id,\n key: `${kind}-${Date.now()}`,\n kind,\n geometry,\n bbox: geometryBBox(geometry),\n origin: 'manual',\n geometryLocked: true,\n label: extras?.label,\n },\n });\n if (id != null) handleSelectShape(id);\n }}\n onUpdateShapeGeometry={handleUpdateShapeGeometry}\n onBatchShapeEdits={(edits) => {\n if (!activeLevel || !canDrawOnCanvas || edits.length === 0) {\n return;\n }\n const ops: BatchOp[] = [];\n let deletedSelected = false;\n edits.forEach((edit, index) => {\n if (edit.action === 'update') {\n const shape = workingDraft.shapes.find(\n (s) => s.id === edit.shapeId,\n );\n if (!shape) return;\n ops.push({\n op: 'upsert_shape',\n shape: {\n id: shape.id,\n levelId: shape.levelId,\n key: shape.key,\n kind: shape.kind,\n geometry: edit.geometry,\n bbox: geometryBBox(edit.geometry),\n geometryLocked: true,\n },\n });\n return;\n }\n if (edit.action === 'create') {\n const style: ShapeStyle | undefined = edit.style;\n ops.push({\n op: 'upsert_shape',\n shape: {\n levelId: activeLevel.id,\n key: `${edit.kind}-${Date.now()}-${index}`,\n kind: edit.kind,\n geometry: edit.geometry,\n bbox: geometryBBox(edit.geometry),\n style,\n origin: 'manual',\n geometryLocked: true,\n },\n });\n return;\n }\n if (edit.shapeId === selectedShapeId) deletedSelected = true;\n ops.push({ op: 'delete_shape', shapeId: edit.shapeId });\n });\n if (ops.length) queueOpBatch(ops);\n if (deletedSelected) {\n const survivor = edits.find((e) => e.action === 'update');\n handleSelectShape(\n survivor && survivor.action === 'update'\n ? survivor.shapeId\n : null,\n );\n }\n }}\n />\n <MapControls\n levels={workingDraft.levels}\n floorOptions={editorFloorControlLevels(section, workingDraft.levels)}\n alwaysShowFloors\n activeLevelId={activeLevelId}\n onActiveLevelChange={handleCanvasLevelChange}\n onZoomIn={() => canvasRef.current?.zoomIn()}\n onZoomOut={() => canvasRef.current?.zoomOut()}\n onReset={() => canvasRef.current?.resetView()}\n />\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n\nexport default MapEditor;\n","import React, { useMemo, useState } from 'react';\nimport type { ImportDiff, ImportDiffItem } from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect.tsx';\n\nexport interface ImportReviewProps {\n diff: ImportDiff;\n viewBoxChanged?: boolean;\n blockedMessage?: string | null;\n busy?: boolean;\n onApply: (payload: {\n acceptAll: boolean;\n remap: Array<{ fromShapeId: number; toSourceSvgId: string }>;\n }) => Promise<void> | void;\n onCancel?: () => void;\n}\n\nfunction bucketLabel(change: ImportDiffItem['change']): string {\n switch (change) {\n case 'added':\n return 'Added';\n case 'removed':\n return 'Orphaned';\n case 'moved':\n return 'Moved';\n case 'kind_changed':\n return 'Kind changed';\n default:\n return 'Unchanged';\n }\n}\n\n/**\n * Outdoor (or floor) re-upload review — shows added / orphaned / locked / drifted\n * buckets before apply. Host wires POST .../import + .../import/apply.\n */\nexport function ImportReviewPanel({\n diff,\n viewBoxChanged = false,\n blockedMessage,\n busy = false,\n onApply,\n onCancel,\n}: ImportReviewProps) {\n const [remap, setRemap] = useState<Record<number, string>>({});\n\n const buckets = useMemo(() => {\n const added = diff.items.filter((i) => i.change === 'added');\n const orphaned = diff.items.filter((i) => i.change === 'removed');\n const locked = diff.items.filter(\n (i) => i.geometryLocked && i.change !== 'removed' && i.change !== 'added',\n );\n const moved = diff.items.filter((i) => i.change === 'moved');\n return { added, orphaned, locked, moved };\n }, [diff.items]);\n\n if (viewBoxChanged) {\n return (\n <div className=\"eyeon-map-import-review\">\n <div className=\"eyeon-map-floors__error\">\n {blockedMessage ??\n 'SVG viewBox changed — restore the original artboard before re-uploading.'}\n </div>\n {onCancel ? (\n <button type=\"button\" onClick={onCancel} disabled={busy}>\n Close\n </button>\n ) : null}\n </div>\n );\n }\n\n return (\n <div className=\"eyeon-map-import-review\">\n <p className=\"eyeon-map-rail__hint\">\n Review changes before applying. Orphaned shapes keep their retailer\n assignments — remap them onto a newly added id if the designer renamed\n a store.\n </p>\n\n {buckets.added.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Added ({buckets.added.length})\n </div>\n {buckets.added.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row\">\n <span>{item.sourceSvgId}</span>\n <span className=\"eyeon-map-rail__muted\">{item.newKind}</span>\n </div>\n ))}\n </section>\n )}\n\n {buckets.orphaned.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Orphaned ({buckets.orphaned.length})\n </div>\n {buckets.orphaned.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row eyeon-map-import-review__remap\">\n <span>{item.sourceSvgId}</span>\n <label className=\"eyeon-map-rail__field\">\n Remap to\n <ModernSelect\n ariaLabel={`Remap ${item.sourceSvgId}`}\n value={remap[item.existingShapeId!] ?? ''}\n disabled={busy || buckets.added.length === 0}\n placeholder=\"Keep orphaned\"\n searchable\n options={[\n { value: '', label: 'Keep orphaned' },\n ...buckets.added.map((a) => ({\n value: a.sourceSvgId,\n label: a.sourceSvgId,\n })),\n ]}\n onChange={(next) =>\n setRemap((prev) => ({\n ...prev,\n [item.existingShapeId!]: next,\n }))\n }\n />\n </label>\n </div>\n ))}\n </section>\n )}\n\n {buckets.locked.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Geometry locked ({buckets.locked.length})\n </div>\n <p className=\"eyeon-map-rail__hint\">\n Portal edits win — kind/style may update, geometry will not.\n </p>\n {buckets.locked.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row\">\n <span>{item.sourceSvgId}</span>\n <span className=\"eyeon-map-rail__muted\">{bucketLabel(item.change)}</span>\n </div>\n ))}\n </section>\n )}\n\n {buckets.moved.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Moved ({buckets.moved.length})\n </div>\n <p className=\"eyeon-map-rail__hint\">\n Centroid drifted — check nearby walking paths after apply.\n </p>\n {buckets.moved.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row\">\n <span>{item.sourceSvgId}</span>\n </div>\n ))}\n </section>\n )}\n\n {diff.items.length === 0 && (\n <p className=\"eyeon-map-rail__hint\">No shape changes detected.</p>\n )}\n\n <div className=\"eyeon-map-rail__actions\">\n {onCancel ? (\n <button type=\"button\" disabled={busy} onClick={onCancel}>\n Cancel\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-floors__primary\"\n disabled={busy}\n onClick={() =>\n void onApply({\n acceptAll: true,\n remap: Object.entries(remap)\n .filter(([, to]) => Boolean(to))\n .map(([from, toSourceSvgId]) => ({\n fromShapeId: Number(from),\n toSourceSvgId,\n })),\n })\n }\n >\n {busy ? 'Applying…' : 'Apply import'}\n </button>\n </div>\n </div>\n );\n}\n"],"names":["isEditorSection","section","portalCenterSurface","host","editMapSelectableLevels","levels","outdoor","level","floorSwitcherLevels","defaultEditorFloorId","_a","levelIdOnEnterWayfinding","levelIdOnEnterEditMap","editorFloorControlLevels","_section","wayfindingOutdoorReadOnly","emptyEditorHistory","cloneHistorySnapshot","snapshot","op","pushEditorHistory","history","current","undoEditorHistory","restored","redoEditorHistory","isEditableTypingTarget","target","el","tag","isEditorUndoHotkey","isEditorRedoHotkey","key","EDITOR_TOOLS","canPlaceNewRoute","tool","canChainRoute","nextRouteChainAnchor","endAnchorId","ICON_PROPS","SelectIcon","jsx","PanIcon","DrawRectIcon","DrawPolygonIcon","DrawLineIcon","jsxs","CurveIcon","SplitJoinIcon","DrawTextIcon","DrawRouteIcon","CreateRouteIcon","CreateRouteMultiIcon","UndoIcon","RedoIcon","TOOL_ICONS","canSelectShapes","isSplitJoinTool","canJoinOpenEnds","showsShapeAnchors","showsCurveHandles","emptyCanvasDragPans","nextEditorTool","next","toolHint","EditorToolButtons","onToolChange","canEdit","group","mapTools","t","routeTools","showMap","showRoute","selectTool","routeToolbar","renderButton","Icon","EditorHistoryButtons","canUndo","canRedo","disabled","onUndo","onRedo","EPS","vecEq","a","b","eps","cloneVec","p","addVec","subVec","scaleVec","s","lerpVec","edgeCount","ring","edgeFrom","edgeIndex","edgeTo","edgeToPathD","from","to","edge","fmtCoord","n","r","ringFromPolygon","poly","closed","anchors","edges","quadraticToCubic","p0","q","p2","cubicHandlesForPull","pull","mid","offset","chord","cubicPoint","c1","c2","p3","u","splitCubic","c","e","ellipticalArcToCubics","rx","ry","xAxisRotationDeg","largeArc","sweep","p1","arx","ary","phi","cosPhi","sinPhi","dx2","dy2","x1p","y1p","lambda","scale","rxSq","rySq","numerator","denominator","factor","cxp","cyp","cx","cy","ux","uy","vx","vy","theta1","deltaTheta","ellipsePoint","theta","cosT","sinT","ellipseDeriv","dx","dy","out","t0","remaining","step","t1","k","start","end","d0","d1","parsePathToRings","d","tokens","tokenizePathData","rings","x","y","startX","startY","lastCtrl","i","cmd","started","readNum","flush","expected","pushAnchor","isRel","nx","ny","x1","y1","x2","y2","qx","qy","rot","cubics","cubic","ringToPathD","a0","ringsToGeometry","ds","geometry","buildGeometryFromPaths","ARCH_CORNER_RAD","MIN_ARCH_POINTS","MIN_ARCH_BULGE","MIN_ARCH_BULGE_RATIO","MAX_ARCH_BULGE_RATIO","signedTurn","prev","cur","ax","ay","bx","by","runLooksLikeArch","pts","distance","maxDev","side","proj","projectOntoSegment","fitCubicThroughRun","cubicDeviationFromChord","samples","approximateCubic","point","cubicIsRunaway","dev","flattenRunawayCubics","changed","collapseLineRunsToCubics","idx","incoming","outgoing","isSharp","_b","sharp","outA","outE","walk","emitRun","fromW","toW","w","linesOnly","_","last","geometryToRings","fromPaths","pointOnRingEdge","nearestTOnCubic","bestT","bestPt","bestD","clonePolygons","polygons","polygonsToPathD","polygonsToGeometry","cleaned","commitRings","incomingEdgeIndex","anchorIndex","outgoingEdgeIndex","translateGeometry","delta","translateEdge","ringIndex","fromIdx","toIdx","moveVertex","polygonIndex","vertexIndex","moveHandle","handle","flattenCubicEdge","bendEdgeToCubic","insertVertex","afterVertexIndex","splitT","split","removeVertex","min","join","hitTestVertex","tolerance","best","vertex","hitTestHandle","hp","hitEdge","preferMidpoint","candidate","dist","near","hitTestEdgeMidpoint","hitTestEdge","SHARED_EDGE_TOL","canSplitJoinKind","kind","sameOpenEnd","cloneEdge","cloneRing","reverseEdge","reverseRing","maybeCloseCoincident","tol","first","listOpenEnds","distToRingEdge","pointOnRingBoundary","edgeLiesOnOtherShape","others","other","open","cutPointsOnLine","gap","len","half","cutPointsOnCubic","dt","t2","local","second","rebuildOpenFromClosedCut","leftEdge","rightEdge","splitOpenRingAtCut","left","right","item","openWholeEdge","cutEdgeOpen","cut","pieces","concatOpenRings","leftEnd","rightStart","weld","closeOpenRing","joinOpenEndpoints","DEFAULT_WELD_TOLERANCE","ra","rb","joined","keep","drop","joinAcrossShapes","shapes","ia","ib","ringsA","ringsB","merged","weldCoincidentOpenEnds","deleteIds","ends","shape","j","pairTol","forkClosedRings","opens","finishEdits","before","working","extraDeletes","welded","deleteSet","extras","kept","forked","edits","beforeById","extra","id","applySplitJoinCut","hit","nextGeo","applySplitJoinJoin","hitOpenEnd","skip","preferOther","bestPrefer","hitSplitJoinEdge","previewCutPoints","nearestSnapPoint","candidates","sameSnapPoint","DEFAULT_LABEL_TEXT","isTextLabel","defaultLabelSize","viewbox","textLabelPolygon","origin","text","size","display","width","height","textLabelGeometry","defaultTextLabel","color","geometryForLabelText","box","geometryBBox","clientToUser","ctm","clientX","clientY","det","clientToSvgUser","svg","userToWorld","user","pan","zoom","z","EDITOR_MIN_ZOOM","EDITOR_MAX_ZOOM","clampEditorZoom","pxPerUserFromCtm","screenPxToWorld","px","pxPerUser","panAfterZoom","nextZoom","world","panKeepingWorldAtUser","EDITOR_ZOOM_ANIM_MS","easeOutCubic","lerp","interpolateView","editorShapeFillOpacity","editorShapeFill","theme","WALKING_PATH_COLOR","isHoverHighlightShape","INTERACTIVE_SHAPE_KINDS","editorSelectCursor","args","editorHoverFillOpacity","base","hovered","OutdoorSvgUnderlay","url","imageProxyUrl","suppressIds","paths","setPaths","useState","suppressKey","useMemo","useEffect","cancelled","fetchUrl","resolveFetchUrl","blocked","res","outdoorDecorationFromSvg","err","index","isUnderlayHintShape","underlaySwitchHint","WAYFINDING_SNAP_PX","WAYFINDING_ANCHOR_HIT_PX","showsWayfinding","routeMode","routeSessionUndoKind","session","beginOrContinueRouteDraft","draft","routeRubberBand","isWayfindingShape","wayfindingLinksShapes","anchorKindForShape","routeAnchorKindForShape","shapeRoutePoint","anchorHasEdge","anchorId","walkEdgeExists","isSnappableRouteEdge","storeLinkOriginIds","preview","ids","anchor","nearestRouteSnap","excludeIds","maxDist","byId","bestJunction","bestEdge","walkEdge","mapId","fromAnchorId","toAnchorId","ensureShapeRouteAnchorOps","input","allocId","existing","unit","connectShapeToRouteOps","ops","snap","junctionId","nextEdges","source","linkKind","linkRouteAnchorsOp","insertJunctionOnWalkEdgeOps","levelId","deleteRouteAnchorOps","incident","walkNeighbors","ANCHOR_R_PX","ANCHOR_R_SELECTED_PX","ANCHOR_HIT_PX","ANCHOR_STROKE_PX","SHAPE_ROUTE_ANCHOR_FILL","VERTEX_R_PX","VERTEX_R_SELECTED_PX","VERTEX_HIT_PX","VERTEX_STROKE_PX","HANDLE_R_PX","HANDLE_R_SELECTED_PX","HANDLE_HIT_PX","BEND_R_PX","EDGE_DRAG_PX","SPLIT_JOIN_GAP_PX","SNAP_HIT_PX","rectPolygon","dragSize","HandleDot","hitR","fill","stroke","strokeWidth","cursor","fillOpacity","strokeDasharray","onPointerDown","onPointerEnter","onPointerLeave","onDoubleClick","polygonsToPath","isEditableShape","interactiveOnly","EditorCanvas","React","selectedShapeId","selectedAnchorIds","baseSvgUrl","baseViewbox","outdoorSvgUrl","levelSvgUrl","underlayShapes","showGrid","readOnly","onSelectShape","onSelectAnchors","onCreateRoutePoint","onCreateRouteSegment","onLinkRouteAnchors","onInsertRouteJunction","onDeleteRouteAnchor","onConnectShapeToRoute","onEnsureShapeAnchor","onMoveAnchor","onCreateShape","onUpdateShapeGeometry","onBatchShapeEdits","onHistoryGestureEnd","onRouteDraftActiveChange","ref","wayfindingOn","svgRef","useRef","canvasRef","setPan","setZoom","viewRef","setPxPerUser","pointersRef","pinchRef","drawing","setDrawing","polygonPoints","setPolygonPoints","dragAnchor","setDragAnchor","lastRouteAnchor","setLastRouteAnchor","routeDraftPoint","setRouteDraftPoint","storeLinkPreview","setStoreLinkPreview","rubberCursor","setRubberCursor","splitJoinPending","setSplitJoinPending","splitJoinHover","setSplitJoinHover","splitJoinSnapEnd","setSplitJoinSnapEnd","polygonSnap","setPolygonSnap","clearRouteSession","stubDrag","setStubDrag","shapeDrag","setShapeDrag","shapeOffset","setShapeOffset","vertexDrag","setVertexDrag","selectedVertex","setSelectedVertex","selectedHandle","setSelectedHandle","hoveredEdge","setHoveredEdge","edgePress","setEdgePress","hoveredShapeId","setHoveredShapeId","hoveredAnchorId","setHoveredAnchorId","routeHover","setRouteHover","underlayTip","setUnderlayTip","panStart","isPanning","setIsPanning","worldPx","applyView","nextPan","zoomAnimRef","cancelZoomAnim","animateViewTo","targetPan","targetZoom","now","zoomAroundCenter","rect","currentPan","currentZoom","useImperativeHandle","unionViewBox","svgUnderlayUrl","svgSuppressIds","svgIdsOwnedByShapes","useLayoutEffect","measure","ro","editableShapes","selectedShape","displayGeometry","splitJoinShapes","polygonAnchorCandidates","nearSplitJoinAnchor","snapPolygonPoint","own","commitSplitJoinEdits","deleted","survivor","tryJoinOpenEnd","endHit","handleSplitJoinAt","endTol","edgeTol","edgeHit","toWorld","moveUnderlayTip","insertAnchorOnEdge","beginEdgePress","insertAt","deleteShapeAnchor","beginSplitJoinVertexDrag","vertexHit","deleteShapeHandle","hoverEdgeAt","anchorById","closePolygon","onKey","node","onWheel","beginPinch","onCanvasPointerDownCapture","onCanvasPointerMoveCapture","onCanvasPointerUpCapture","wasPinching","beginPan","fromEmptySelect","insertHoveredRoutePoint","edgeId","created","removeWayfindingAnchor","placed","storeExclude","handleHit","_d","_c","midHit","_f","_e","handleTol","_h","_g","onPointerMove","screenMove","snapTol","finishRect","finishLine","onPointerUp","endedPan","moved","pathDFromGeometry","shapePathD","stubExcludeIds","stubSnap","lastRoutePoint","routeRubberSnap","rubberFrom","rubberTo","rubberBand","polygonFollow","polygonClose","hintable","highlightable","selected","dragging","beginShapePointerDown","worldAt","hoverHandlers","baseOpacity","ri","items","ei","strokeD","clickRing","plus","h1","h2","vi","hoverJoin","plusAt","shapeNode","connected","nearWeld","visR","pending","snapped","hideOnAnchor","Fragment","FAMILY_PREFIXES","normalizeId","value","parseConnectorSourceId","raw","family","parts","direction","role","groupParts","part","guessConnectorKind","connectorIdForShape","shapeId","connectorForShape","connectors","resolvedConnectorKind","railConnectorShapes","landingAnchor","shapeLandingPoint","geometryCentroid","inferTravelDirection","fromLevelIndex","toLevelIndex","hint","defaultConnectorName","parsed","label","nearestWalkAnchor","bestDist","memberShapeIds","connectorId","connectorEdgesBetween","anchorIds","ensureLanding","ctx","linkLandingToWalk","landing","applyUnlinkLocal","memberAnchors","unlinkConnectorOps","buildUnlinkConnectorOps","buildEscalatorLinkOps","fromShape","toShape","options","fromLevel","l","toLevel","name","existingFrom","existingTo","v","connector","fromAnchor","toAnchor","buildElevatorShaftOps","memberShapes","members","existingIds","keepId","landings","suggestEscalatorPairs","groups","list","suggestions","fromName","toName","dir","geometryBbox","points","bboxOf","upsertById","rows","row","copy","applyDraftOp","assignment","rest","removed","omitLevelFromDraft","removedShapeIds","removedAnchorIds","liveConnectorIds","applyDraftOps","seeded","healDraftGeometry","normalizeGeometrySpace","coalesceDraftOp","acc","ConnectorAssign","railKind","onApplyOps","memberIds","partners","levelName","targetId","setTargetId","setName","applyEscalator","nextName","applyElevator","nextMembers","ModernSelect","nextId","normalizeHexColor","match","hex","ch","hexColorInputValue","SHAPE_KIND_LABELS","UNIT_STATUS_LABELS","shapeKindLabel","ASSIGNABLE_SHAPE_KINDS","isAssignableKind","isRetailerAssigned","isAmenityAssigned","isKioskAssigned","isPolygonAssigned","assignmentByShapeId","assignments","railAssignmentGroups","byShape","stores","amenities","unassigned","floorsScreenTitle","screen","visibleFloorCount","moveLevelId","movedId","toIndex","without","clamped","insertIndexFromY","listTop","rowHeight","count","dropLineTop","fromIndex","dropIndex","rowInnerHeight","sameIdOrder","formatBytes","svgFileName","isSvgFile","GripIcon","TrashIcon","deleteConfirmCopy","shapeCount","isOutdoor","FloorsPanel","buildings","levelShapeCounts","canFloors","onScreenChange","onCreateLevel","onUpdateLevel","onDeleteLevel","onReorderLevels","file","setFile","busy","setBusy","error","setError","progress","setProgress","dragOver","setDragOver","confirmDeleteId","setConfirmDeleteId","deleting","setDeleting","drag","setDrag","setDropIndex","previewIds","setPreviewIds","previewFailed","setPreviewFailed","localPreviewUrl","setLocalPreviewUrl","fileInputRef","floorListRef","ghostRef","previewIdsRef","dragRef","outdoorReady","buildingFloors","compareBuildingFloors","committedIds","displayFloors","editing","isOutdoorForm","canManage","canReorder","takeSvgFile","openEdit","submit","picked","svgFile","remove","renderDeleteModal","renderRowDelete","applyGhost","ghost","previewMoveToY","persistPreview","nextIds","endDrag","onMove","maxY","onUp","startDrag","listRect","lineTop","hasExistingSvg","showEditPreview","previewUrl","previewFallback","importedCount","showReimportNotice","primaryLabel","primaryBusyLabel","createPortal","NAV_ITEMS","SECTION_TITLES","BackIcon","ChevronIcon","NAV_ICON_PROPS","FloorsNavIcon","StoresNavIcon","AmenitiesNavIcon","KiosksNavIcon","EscalatorsNavIcon","ElevatorsNavIcon","SettingsNavIcon","UnassignedNavIcon","EditMapNavIcon","WayfindingNavIcon","NAV_ICONS","ColorField","onChange","setHex","commit","normalized","LeftRail","onSectionChange","activeLevelId","canSettings","onAutoroute","onThemeChange","assignPanel","editMapPanel","wayfindingPanel","footer","floorsScreen","setFloorsScreen","levelShapes","assigned","storeShapes","amenityShapes","unassignedShapes","kioskShapes","escalatorShapes","elevatorShapes","activeLevel","pathCount","counts","renderShapeList","empty","linked","clampStoreRadius","SHAPE_KINDS","UNIT_STATUSES","Inspector","levelShapeKeys","onRename","onChangeKind","onDelete","onSaveAssignment","onUpdateLabel","setKey","keyError","setKeyError","retailerId","setRetailerId","amenityId","setAmenityId","kioskId","setKioskId","unitStatus","setUnitStatus","unitNumber","setUnitNumber","customLabel","setCustomLabel","labelText","setLabelText","PreviewOverlay","document","onActiveLevelChange","routeOnSelect","Suspense","MapViewer","compileEditorPreview","compileDocument","memory","storageKey","dropLegacyStorage","markEditorSection","peekEditorSection","clearEditorSection","storage","markReturnToFloorsList","consumeReturnToFloorsList","stored","clearReturnToFloorsList","MapEditor","onBatch","onPublish","onImportSvg","previewDocument","className","sidebarFooter","setSection","setActiveLevelId","restoredLevel","setSelectedShapeId","setSelectedAnchorIds","setTool","editVersion","setEditVersion","needsPublish","setNeedsPublish","saving","setSaving","setHistory","routeDraftActive","setRouteDraftActive","historyRef","pendingOps","nextTempId","historyGestureRef","showMapOptions","centerSurface","isEditMap","historyMetaRef","workingDraft","mergeTheme","dirty","outdoorViewOnly","canDrawOnCanvas","hideOutdoorUnderlay","outdoorLevel","outdoorShapes","compiledPreview","levelAnchors","levelEdges","selectedAssignment","takeSnapshot","applySnapshot","recordHistoryStep","mode","queueOp","useCallback","historyMode","endHistoryGesture","undo","redo","handleSaveChanges","persisted","handleSectionChange","handleCanvasLevelChange","nextLevel","handleSelectShape","connectorKind","handleToolChange","resolved","handleRenameShape","handleDeleteShape","handleUpdateShapeGeometry","opts","handleUpdateLabel","handleChangeKind","queueOpBatch","selectedConnectorKind","connectorRailKind","toolGroup","partial","id1","id2","prevAnchorId","deletedSelected","edit","style","MapControls","bucketLabel","change","ImportReviewPanel","diff","viewBoxChanged","blockedMessage","onApply","onCancel","remap","setRemap","buckets","added","orphaned","locked","toSourceSvgId"],"mappings":"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"}