@eyeon/map 2.0.14 → 2.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/MapViewer.css +1 -1
- package/dist/assets/index.css +1 -1
- package/dist/chunks/MapViewer.js +2335 -1997
- package/dist/chunks/MapViewer.js.map +1 -1
- package/dist/chunks/responsive.js +2534 -0
- package/dist/chunks/responsive.js.map +1 -0
- package/dist/chunks/wheelZoom.js +163 -177
- package/dist/chunks/wheelZoom.js.map +1 -1
- package/dist/core/assignment.d.ts +19 -2
- package/dist/core/assignment.d.ts.map +1 -1
- package/dist/core/entranceIcon.d.ts +17 -3
- package/dist/core/entranceIcon.d.ts.map +1 -1
- package/dist/core/hostChrome.d.ts +13 -2
- package/dist/core/hostChrome.d.ts.map +1 -1
- package/dist/core/hoverTooltip.d.ts +37 -0
- package/dist/core/hoverTooltip.d.ts.map +1 -0
- package/dist/core/import/index.d.ts +10 -1
- package/dist/core/import/index.d.ts.map +1 -1
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +227 -169
- package/dist/core/layerStyles.d.ts +32 -0
- package/dist/core/layerStyles.d.ts.map +1 -1
- package/dist/core/outdoorDecoration.d.ts.map +1 -1
- package/dist/core/publicShapes.d.ts +14 -0
- package/dist/core/publicShapes.d.ts.map +1 -1
- package/dist/core/responsive.d.ts +57 -0
- package/dist/core/responsive.d.ts.map +1 -0
- package/dist/core/routing/graph-tools.d.ts +6 -5
- package/dist/core/routing/graph-tools.d.ts.map +1 -1
- package/dist/core/routing/pathfinding.d.ts +36 -0
- package/dist/core/routing/pathfinding.d.ts.map +1 -1
- package/dist/core/shapeFill.d.ts +40 -0
- package/dist/core/shapeFill.d.ts.map +1 -0
- package/dist/core/stacking.d.ts +4 -0
- package/dist/core/stacking.d.ts.map +1 -1
- package/dist/core/types.d.ts +20 -5
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/viewerReset.d.ts +24 -0
- package/dist/core/viewerReset.d.ts.map +1 -0
- package/dist/editor/MapEditor.d.ts +10 -2
- package/dist/editor/MapEditor.d.ts.map +1 -1
- package/dist/editor/assignmentOverlay.d.ts +37 -0
- package/dist/editor/assignmentOverlay.d.ts.map +1 -0
- package/dist/editor/canvas/AssignedShapeOverlay.d.ts +8 -0
- package/dist/editor/canvas/AssignedShapeOverlay.d.ts.map +1 -0
- package/dist/editor/canvas/EditorCanvas.d.ts +6 -1
- package/dist/editor/canvas/EditorCanvas.d.ts.map +1 -1
- package/dist/editor/canvas/coords.d.ts +9 -0
- package/dist/editor/canvas/coords.d.ts.map +1 -1
- package/dist/editor/canvas/editorFill.d.ts.map +1 -1
- package/dist/editor/draftOps.d.ts +2 -1
- package/dist/editor/draftOps.d.ts.map +1 -1
- package/dist/editor/editorSectionReturn.d.ts +4 -2
- package/dist/editor/editorSectionReturn.d.ts.map +1 -1
- package/dist/editor/entranceIcon.d.ts +2 -2
- package/dist/editor/entranceIcon.d.ts.map +1 -1
- package/dist/editor/index.css +289 -29
- package/dist/editor/index.d.ts +1 -1
- package/dist/editor/index.d.ts.map +1 -1
- package/dist/editor/index.js +4963 -4450
- package/dist/editor/index.js.map +1 -1
- package/dist/editor/panels/AssignForm.d.ts +3 -1
- package/dist/editor/panels/AssignForm.d.ts.map +1 -1
- package/dist/editor/panels/BulkAssignForm.d.ts +3 -1
- package/dist/editor/panels/BulkAssignForm.d.ts.map +1 -1
- package/dist/editor/panels/ConnectorAssign.d.ts.map +1 -1
- package/dist/editor/panels/FloorsPanel.d.ts.map +1 -1
- package/dist/editor/panels/Inspector.d.ts +3 -1
- package/dist/editor/panels/Inspector.d.ts.map +1 -1
- package/dist/editor/panels/LeftRail.d.ts +4 -2
- package/dist/editor/panels/LeftRail.d.ts.map +1 -1
- package/dist/editor/panels/PreviewOverlay.d.ts +8 -3
- package/dist/editor/panels/PreviewOverlay.d.ts.map +1 -1
- package/dist/editor/previewDocument.d.ts +2 -1
- package/dist/editor/previewDocument.d.ts.map +1 -1
- package/dist/editor/routeStubs.d.ts +11 -0
- package/dist/editor/routeStubs.d.ts.map +1 -1
- package/dist/test-maps/LF - Shops At South Town.ai +4468 -1
- package/dist/test-maps/LF - Shops At South Town.svg +245 -0
- package/dist/viewer/MapViewer.d.ts +8 -1
- package/dist/viewer/MapViewer.d.ts.map +1 -1
- package/dist/viewer/camera.d.ts +19 -0
- package/dist/viewer/camera.d.ts.map +1 -1
- package/dist/viewer/components/CameraRig.d.ts +12 -1
- package/dist/viewer/components/CameraRig.d.ts.map +1 -1
- package/dist/viewer/components/LevelMeshes.d.ts +10 -2
- package/dist/viewer/components/LevelMeshes.d.ts.map +1 -1
- package/dist/viewer/components/MapScene.d.ts +14 -3
- package/dist/viewer/components/MapScene.d.ts.map +1 -1
- package/dist/viewer/components/RouteLine.d.ts +1 -8
- package/dist/viewer/components/RouteLine.d.ts.map +1 -1
- package/dist/viewer/components/SvgVectorLayer.d.ts +1 -1
- package/dist/viewer/components/SvgVectorLayer.d.ts.map +1 -1
- package/dist/viewer/index.css +242 -29
- package/dist/viewer/index.d.ts +1 -1
- package/dist/viewer/index.d.ts.map +1 -1
- package/dist/viewer/index.js +1 -1
- package/dist/viewer/pointer.d.ts +40 -4
- package/dist/viewer/pointer.d.ts.map +1 -1
- package/dist/viewer/routeFloorChanges.d.ts +35 -0
- package/dist/viewer/routeFloorChanges.d.ts.map +1 -0
- package/dist/viewer/ui/HoverTooltip.d.ts +6 -0
- package/dist/viewer/ui/HoverTooltip.d.ts.map +1 -0
- package/dist/viewer/ui/MapControls.d.ts.map +1 -1
- package/dist/viewer/ui/RuntimeChrome.d.ts +2 -1
- package/dist/viewer/ui/RuntimeChrome.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/stacking.js +0 -2118
- package/dist/chunks/stacking.js.map +0 -1
package/dist/editor/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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/ellipseDraw.ts","../../src/editor/labelText.ts","../../src/editor/entranceIcon.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/FieldResetButton.tsx","../../src/editor/hexColor.ts","../../src/editor/panels/formRows.tsx","../../src/editor/panels/AssignmentStyleFields.tsx","../../src/editor/panels/ConnectorAssign.tsx","../../src/editor/labels.ts","../../src/editor/railAssignments.ts","../../src/editor/railKiosks.ts","../../src/editor/railListCopy.ts","../../src/editor/panels/FloorsPanel.tsx","../../src/editor/panels/LeftRail.tsx","../../src/editor/panels/CatalogKioskForm.tsx","../../src/editor/shapeCopy.ts","../../src/editor/panels/AssignForm.tsx","../../src/editor/panels/BulkAssignForm.tsx","../../src/editor/panels/CopyToLevelButton.tsx","../../src/editor/panels/EntranceIconForm.tsx","../../src/editor/panels/TextLabelForm.tsx","../../src/editor/panels/Inspector.tsx","../../src/editor/panels/PreviewOverlay.tsx","../../src/editor/shapeSelection.ts","../../src/editor/previewDocument.ts","../../src/editor/editorSectionReturn.ts","../../src/editor/floorsListReturn.ts","../../src/editor/MapEditor.tsx","../../src/editor/panels/ImportReviewPanel.tsx"],"sourcesContent":["import {\n defaultViewerLevelId,\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/**\n * PORTAL default map always lands on the ground floor. Outdoor as the\n * active level hides building floors (`viewerLevelStack`).\n */\nexport function levelIdOnEnterDefaultMap(levels: StackLevel[]): number | null {\n return defaultViewerLevelId(levels);\n}\n\n/**\n * Top-right floor switcher. Edit Map lists floors then Outdoor.\n * Wayfinding lists building floors only.\n */\nexport function editorFloorControlLevels<T extends StackLevel & { name: string }>(\n section: RailSection | null,\n levels: T[],\n): Array<{ id: number; name: string }> {\n const selected =\n section === 'wayfinding'\n ? wayfindingSelectableLevels(levels)\n : editMapSelectableLevels(levels);\n return selected.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-circle'\n | 'draw-void'\n | 'draw-void-circle'\n | 'curve'\n | 'split-join'\n | 'draw-text'\n | 'draw-entrance'\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 /** Draw a toolbar separator immediately before this tool. */\n sepBefore?: boolean;\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-circle', label: 'Draw circle', 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 { id: 'draw-entrance', label: 'Entrance', draw: true, group: 'map' },\n {\n id: 'draw-void',\n label: 'Open to Below',\n draw: true,\n group: 'map',\n sepBefore: true,\n },\n {\n id: 'draw-void-circle',\n label: 'Open to Below circle',\n draw: true,\n group: 'map',\n },\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 DrawCircleIcon() {\n return (\n <svg {...ICON_PROPS}>\n <ellipse\n cx=\"8\"\n cy=\"8\"\n rx=\"5.4\"\n ry=\"5.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.55\"\n />\n </svg>\n );\n}\n\nfunction DrawOpeningIcon() {\n return (\n <svg {...ICON_PROPS}>\n <rect\n x=\"2.4\"\n y=\"2.4\"\n width=\"11.2\"\n height=\"11.2\"\n rx=\"1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <rect\n x=\"5.1\"\n y=\"5.1\"\n width=\"5.8\"\n height=\"5.8\"\n rx=\"0.6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeDasharray=\"1.6 1.15\"\n />\n </svg>\n );\n}\n\nfunction DrawOpeningCircleIcon() {\n return (\n <svg {...ICON_PROPS}>\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"5.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"2.7\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeDasharray=\"1.6 1.15\"\n />\n </svg>\n );\n}\n\nfunction CurveIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M2.3 11.6 C4.6 2.4 6.4 2.4 8 8 S11.4 13.6 13.7 4.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n <circle cx=\"2.3\" cy=\"11.6\" r=\"1.35\" fill=\"currentColor\" />\n <circle cx=\"13.7\" cy=\"4.4\" r=\"1.35\" fill=\"currentColor\" />\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 DrawEntranceIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M5.4 2.8h6.4A2.8 2.8 0 0 1 14.6 5.6v4.8a2.8 2.8 0 0 1-2.8 2.8H5.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.55\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M1.7 8h8.1M7.3 5.15 10.4 8l-3.1 2.85\"\n stroke=\"currentColor\"\n strokeWidth=\"1.55\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"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-circle': DrawCircleIcon,\n 'draw-void': DrawOpeningIcon,\n 'draw-void-circle': DrawOpeningCircleIcon,\n curve: CurveIcon,\n 'split-join': SplitJoinIcon,\n 'draw-text': DrawTextIcon,\n 'draw-entrance': DrawEntranceIcon,\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-to-place closed polygons — stores or atrium openings. */\nexport function isPolygonDrawTool(tool: EditorTool): boolean {\n return tool === 'draw-polygon' || tool === 'draw-void';\n}\n\n/** Click-drag oval / circle — stores or Open to Below. */\nexport function isEllipseDrawTool(tool: EditorTool): boolean {\n return tool === 'draw-circle' || tool === 'draw-void-circle';\n}\n\n/** Rectangle, polygon, circle, and Open to Below — plus cursor for placement. */\nexport function isShapeDrawTool(tool: EditorTool): boolean {\n return (\n tool === 'draw-unit' ||\n tool === 'draw-polygon' ||\n tool === 'draw-circle' ||\n tool === 'draw-void' ||\n tool === 'draw-void-circle'\n );\n}\n\n/** Click-to-place text or entrance stamps. */\nexport function isStampDrawTool(tool: EditorTool): boolean {\n return tool === 'draw-text' || tool === 'draw-entrance';\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, group?: 'map' | 'route'): string {\n if (group === 'route') {\n switch (tool) {\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 'pan':\n return 'Drag the map to move around. Walking paths stay on the selected floor.';\n case 'select':\n default:\n return 'Click a store to mark its destination. Drag empty space to pan. Use Create Route or Multi Route in the toolbar to draw walking paths.';\n }\n }\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-circle':\n return 'Click and drag to draw an oval. Hold Shift to keep it a circle.';\n case 'draw-void':\n return 'Draw an Open to Below to look through to the floor below. Click to place points, then click the first point or press Enter to close. Esc cancels.';\n case 'draw-void-circle':\n return 'Click and drag an oval Open to Below to look through to the floor below. Hold Shift to keep it a circle.';\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. Click existing text to select it.';\n case 'draw-entrance':\n return 'Click the map to place an entrance marker. Click an existing marker to select it.';\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\n ? mapTools.map((t) => (\n <React.Fragment key={t.id}>\n {t.sepBefore ? (\n <span className=\"eyeon-map-editor__tool-sep\" aria-hidden=\"true\" />\n ) : null}\n {renderButton(t)}\n </React.Fragment>\n ))\n : 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: number = lastCtrl ? 2 * x - lastCtrl.x : x;\n const qy: number = 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, Vec2 } from '../core';\nimport { buildGeometryFromPaths } from '../core';\n\nexport interface EllipseBounds {\n cx: number;\n cy: number;\n rx: number;\n ry: number;\n}\n\n/** Drag from corner `from` to `to`. Shift / lockCircle keeps rx === ry. */\nexport function ellipseBoundsFromDrag(\n from: Vec2,\n to: Vec2,\n lockCircle = false,\n): EllipseBounds {\n let x1 = to.x;\n let y1 = to.y;\n if (lockCircle) {\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const side = Math.max(Math.abs(dx), Math.abs(dy));\n const sx = dx === 0 ? (dy === 0 ? 1 : Math.sign(dy)) : Math.sign(dx);\n const sy = dy === 0 ? (dx === 0 ? 1 : Math.sign(dx)) : Math.sign(dy);\n x1 = from.x + sx * side;\n y1 = from.y + sy * side;\n }\n const rx = Math.abs(x1 - from.x) / 2;\n const ry = Math.abs(y1 - from.y) / 2;\n return {\n cx: (from.x + x1) / 2,\n cy: (from.y + y1) / 2,\n rx,\n ry,\n };\n}\n\nexport function ellipsePathD(bounds: EllipseBounds): string {\n const { cx, cy, rx, ry } = bounds;\n const arx = Math.max(rx, 1e-4);\n const ary = Math.max(ry, 1e-4);\n return `M ${cx - arx} ${cy} A ${arx} ${ary} 0 1 0 ${cx + arx} ${cy} A ${arx} ${ary} 0 1 0 ${cx - arx} ${cy} Z`;\n}\n\nexport function ellipseGeometry(\n from: Vec2,\n to: Vec2,\n lockCircle = false,\n): ShapeGeometry {\n return buildGeometryFromPaths([\n ellipsePathD(ellipseBoundsFromDrag(from, to, lockCircle)),\n ]);\n}\n","import type { BBox, ShapeGeometry, ShapeLabel, Vec2, ViewBox } from '../core';\nimport { geometryBBox } from '../core';\nimport { MAP_FONT_FAMILY, MAP_LABEL_LINE_HEIGHT } from '../fonts/mapFont';\nimport { polygonsToGeometry } from './geometryEdit';\n\nexport const DEFAULT_LABEL_TEXT = 'Text';\nexport const DEFAULT_LABEL_SIZE = 48;\nexport const LABEL_FONT_FAMILY = MAP_FONT_FAMILY;\nexport const LABEL_LINE_HEIGHT = MAP_LABEL_LINE_HEIGHT;\n/** Fallback advance when canvas measurement is unavailable (tests / SSR). */\nconst FALLBACK_CHAR_ADVANCE = 0.5;\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 DEFAULT_LABEL_SIZE;\n}\n\nexport function labelTextLines(text: string): string[] {\n const source = text.replace(/\\r\\n/g, '\\n').trim() || DEFAULT_LABEL_TEXT;\n return source.split('\\n');\n}\n\nlet measureCtx: CanvasRenderingContext2D | null | undefined;\n\nfunction textMeasureContext(): CanvasRenderingContext2D | null {\n if (measureCtx !== undefined) return measureCtx;\n if (typeof document === 'undefined') {\n measureCtx = null;\n return null;\n }\n const canvas = document.createElement('canvas');\n measureCtx = canvas.getContext('2d');\n return measureCtx;\n}\n\nexport function measureLabelText(\n text: string,\n size: number,\n): { width: number; height: number; lines: string[] } {\n const lines = labelTextLines(text);\n const ctx = textMeasureContext();\n let width = 0;\n if (ctx) {\n ctx.font = `${size}px ${LABEL_FONT_FAMILY}`;\n for (const line of lines) {\n width = Math.max(width, ctx.measureText(line || ' ').width);\n }\n } else {\n const longest = lines.reduce((max, line) => Math.max(max, line.length), 1);\n width = longest * size * FALLBACK_CHAR_ADVANCE;\n }\n return {\n width: Math.max(width, size * 0.2),\n height: Math.max(lines.length, 1) * size * LABEL_LINE_HEIGHT,\n lines,\n };\n}\n\nexport function labelBoxCenter(box: BBox): Vec2 {\n return { x: (box.minX + box.maxX) / 2, y: (box.minY + box.maxY) / 2 };\n}\n\nexport function textLabelPolygon(origin: Vec2, text: string, size: number): Vec2[] {\n const { width, height } = measureLabelText(text, size);\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 { ShapeGeometry, ShapeLabel, Vec2 } from '../core';\nimport {\n DEFAULT_ENTRANCE_SIZE,\n ENTRANCE_ICON_ID,\n clampEntranceSize,\n geometryBBox,\n isEntranceIcon,\n} from '../core';\nimport { polygonsToGeometry } from './geometryEdit';\nimport { isTextLabel, labelBoxCenter } from './labelText';\n\nexport {\n DEFAULT_ENTRANCE_SIZE,\n ENTRANCE_ICON_ID,\n clampEntranceSize,\n isEntranceIcon,\n};\n\nexport function isStampShape(shape: {\n kind: string;\n label?: { text?: string; imageKey?: string | null } | null;\n}): boolean {\n return isTextLabel(shape) || isEntranceIcon(shape);\n}\n\nexport function defaultEntranceLabel(size: number, color?: string): ShapeLabel {\n return {\n imageKey: ENTRANCE_ICON_ID,\n size: clampEntranceSize(size),\n color,\n rotate: 0,\n };\n}\n\nexport function entranceIconPolygon(center: Vec2, size: number): Vec2[] {\n const half = clampEntranceSize(size) / 2;\n return [\n { x: center.x - half, y: center.y - half },\n { x: center.x + half, y: center.y - half },\n { x: center.x + half, y: center.y + half },\n { x: center.x - half, y: center.y + half },\n ];\n}\n\nexport function entranceIconGeometry(center: Vec2, size: number): ShapeGeometry {\n return polygonsToGeometry([entranceIconPolygon(center, size)]);\n}\n\n/** Keep the icon centred when Size changes. */\nexport function geometryForEntranceIcon(\n geometry: ShapeGeometry,\n size: number,\n): ShapeGeometry {\n return entranceIconGeometry(labelBoxCenter(geometryBBox(geometry)), size);\n}\n","import type { Vec2 } from '../../core';\nimport { nextZoomFromWheel } from '../../core/wheelZoom';\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\nexport interface ViewBoxRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface ClientRectLike {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/**\n * Map a client (CSS pixel) point through the inverse of an SVG screen CTM.\n * Prefer {@link clientRectToViewBox} for pointer mapping — `getScreenCTM()` on\n * the root `<svg>` is wrong inside transformed admin-portal layout.\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\n/**\n * Viewport point → SVG viewBox user space, same method OrbitControls uses\n * (`getBoundingClientRect` + letterboxed viewBox). Default map zoom-to-cursor\n * works in admin-portal because of this; Edit Map must not use `getScreenCTM()`.\n *\n * Assumes `preserveAspectRatio=\"xMidYMid meet\"` (editor canvas default).\n */\nexport function clientRectToViewBox(\n rect: ClientRectLike,\n viewBox: ViewBoxRect,\n clientX: number,\n clientY: number,\n): Vec2 {\n const vbW = viewBox.width > 0 ? viewBox.width : Math.max(rect.width, 1);\n const vbH = viewBox.height > 0 ? viewBox.height : Math.max(rect.height, 1);\n const scale = Math.min(rect.width / vbW, rect.height / vbH);\n if (!(scale > 0) || !Number.isFinite(scale)) {\n return { x: viewBox.x, y: viewBox.y };\n }\n const originX = rect.left + (rect.width - vbW * scale) / 2;\n const originY = rect.top + (rect.height - vbH * scale) / 2;\n return {\n x: viewBox.x + (clientX - originX) / scale,\n y: viewBox.y + (clientY - originY) / scale,\n };\n}\n\nexport function pxPerUserFromViewBox(rect: ClientRectLike, viewBox: ViewBoxRect): number {\n const vbW = viewBox.width > 0 ? viewBox.width : Math.max(rect.width, 1);\n const vbH = viewBox.height > 0 ? viewBox.height : Math.max(rect.height, 1);\n const scale = Math.min(rect.width / vbW, rect.height / vbH);\n return scale > 0 && Number.isFinite(scale) ? scale : 1;\n}\n\nfunction readSvgViewBox(svg: SVGSVGElement): ViewBoxRect | null {\n const vb = svg.viewBox?.baseVal;\n if (vb && vb.width > 0 && vb.height > 0) {\n return { x: vb.x, y: vb.y, width: vb.width, height: vb.height };\n }\n const attr = svg.getAttribute('viewBox');\n if (!attr) return null;\n const parts = attr.trim().split(/[\\s,]+/).map(Number);\n if (parts.length !== 4 || parts.some((n) => !Number.isFinite(n))) return null;\n if (parts[2] <= 0 || parts[3] <= 0) return null;\n return { x: parts[0], y: parts[1], width: parts[2], height: parts[3] };\n}\n\nexport function clientToSvgUser(svg: SVGSVGElement, clientX: number, clientY: number): Vec2 {\n const viewBox = readSvgViewBox(svg);\n if (viewBox) {\n return clientRectToViewBox(svg.getBoundingClientRect(), viewBox, clientX, clientY);\n }\n const ctm = svg.getScreenCTM();\n if (!ctm) return { x: 0, y: 0 };\n return clientToUser(ctm, clientX, clientY);\n}\n\nexport function pxPerUserFromSvg(svg: SVGSVGElement): number {\n const viewBox = readSvgViewBox(svg);\n if (viewBox) return pxPerUserFromViewBox(svg.getBoundingClientRect(), viewBox);\n const ctm = svg.getScreenCTM();\n if (!ctm) return 1;\n return pxPerUserFromCtm(ctm);\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/** Same per-event step as PORTAL default MapViewer (three-stdlib OrbitControls). */\nexport function nextEditorZoomFromWheel(\n currentZoom: number,\n event: Pick<WheelEvent, 'deltaY'>,\n): number {\n return nextZoomFromWheel(currentZoom, event.deltaY, {\n min: EDITOR_MIN_ZOOM,\n max: EDITOR_MAX_ZOOM,\n });\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 { resolvedAssignmentBgColor, 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 === 'void') return 0.22;\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 assignment?: { bgColor?: string | null } | null,\n): string {\n if (shape.kind === 'walkable') return WALKING_PATH_COLOR;\n if (shape.kind === 'void') return shape.style?.fill ?? '#94a3b8';\n if (shape.kind === 'unit') {\n return resolvedAssignmentBgColor(assignment, theme.STORE_DEFAULT_COLOR);\n }\n return shape.style?.fill ?? '#cbd5e1';\n}\n","import { INTERACTIVE_SHAPE_KINDS, type ShapeKind } from '../../core';\nimport { isShapeDrawTool, isStampDrawTool, 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' || kind === 'void';\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 /** Map text placed with the Text tool. */\n textLabel?: boolean;\n /** Entrance stamp placed with the Entrance tool. */\n entranceIcon?: boolean;\n}): 'pointer' | 'grab' | 'grabbing' | 'cell' | undefined {\n if (args.dragging) return 'grabbing';\n if (isShapeDrawTool(args.tool)) return 'cell';\n if (args.wayfinding && args.highlightable) return 'cell';\n if (isStampDrawTool(args.tool) && (args.textLabel || args.entranceIcon)) {\n return 'pointer';\n }\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 StaticLayerTheme,\n} from '../../core';\n\nexport function OutdoorSvgUnderlay({\n url,\n imageProxyUrl,\n suppressIds,\n theme,\n}: {\n url: string;\n imageProxyUrl?: string | null;\n suppressIds?: ReadonlySet<string>;\n theme?: StaticLayerTheme | null;\n}) {\n const [svgText, setSvgText] = useState<string | null>(null);\n const suppressKey = useMemo(\n () => (suppressIds ? [...suppressIds].sort().join('\\0') : ''),\n [suppressIds],\n );\n\n useEffect(() => {\n let cancelled = false;\n const controller = new AbortController();\n const fetchUrl = resolveFetchUrl(url, imageProxyUrl);\n fetch(fetchUrl, { signal: controller.signal })\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 setSvgText(text);\n })\n .catch((err) => {\n if (cancelled) return;\n if (err instanceof DOMException && err.name === 'AbortError') return;\n setSvgText(null);\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 controller.abort();\n };\n }, [url, imageProxyUrl]);\n\n const paths = useMemo(() => {\n if (!svgText) return [];\n const blocked = suppressKey\n ? new Set(suppressKey.split('\\0').filter(Boolean))\n : undefined;\n return outdoorDecorationFromSvg(svgText, blocked, theme);\n }, [svgText, suppressKey, theme]);\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';\nimport { isStampShape } from '../entranceIcon';\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\n/** Text and entrance hit-boxes stay on Outdoor — do not ghost them onto building floors. */\nexport function isUnderlayDrawnShape(shape: {\n kind: string;\n label?: { text?: string; imageKey?: string | null } | null;\n}): boolean {\n return !isStampShape(shape);\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 anchorById: ReadonlyMap<number, CmAnchor> = new Map(\n anchors.map((anchor) => [anchor.id, anchor]),\n ),\n): RouteSnapTarget | null {\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 = anchorById.get(edge.fromAnchorId);\n const to = anchorById.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 labelAlignX,\n labelSvgTextAnchor,\n normalizeLabelAlign,\n svgIdsOwnedByShapes,\n unionViewBox,\n} from '../../core';\nimport { isEditableTypingTarget } from '../history';\nimport {\n canJoinOpenEnds,\n canPlaceNewRoute,\n canSelectShapes,\n emptyCanvasDragPans,\n isEllipseDrawTool,\n isPolygonDrawTool,\n isShapeDrawTool,\n isSplitJoinTool,\n isStampDrawTool,\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 ellipseBoundsFromDrag,\n ellipseGeometry,\n} from '../ellipseDraw';\nimport {\n DEFAULT_LABEL_TEXT,\n LABEL_FONT_FAMILY,\n LABEL_LINE_HEIGHT,\n defaultLabelSize,\n defaultTextLabel,\n isTextLabel,\n labelBoxCenter,\n labelTextLines,\n textLabelGeometry,\n} from '../labelText';\nimport {\n DEFAULT_ENTRANCE_SIZE,\n defaultEntranceLabel,\n entranceIconGeometry,\n isEntranceIcon,\n isStampShape,\n} from '../entranceIcon';\nimport { entranceIconDataUrl } from '../../specialIcons';\nimport { ensureMapFont } from '../../fonts/mapFontUrl';\nimport {\n clampEditorZoom,\n clientToSvgUser,\n EDITOR_ZOOM_ANIM_MS,\n interpolateView,\n nextEditorZoomFromWheel,\n panAfterZoom,\n panKeepingWorldAtUser,\n pxPerUserFromSvg,\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 {\n isUnderlayDrawnShape,\n isUnderlayHintShape,\n underlaySwitchHint,\n} from './underlayHint';\nimport {\n WAYFINDING_ANCHOR_HIT_PX,\n WAYFINDING_SNAP_PX,\n beginOrContinueRouteDraft,\n isWayfindingShape,\n routeRubberBand,\n routeSessionUndoKind,\n nearestRouteSnap,\n showsWayfinding,\n storeLinkOriginIds,\n wayfindingLinksShapes,\n type RouteSnapTarget,\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 HANDLE_LINE_PX = 2.25;\nconst HANDLE_LINE_HALO_PX = 4;\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 and Wayfinding floor (and\n * Outdoor) so 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 /** Floor below, clipped to openings so Edit Map previews the atrium. */\n openingUnderlayShapes?: 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 /** Shown when no floor or Outdoor is selected. */\n emptyMessage?: string;\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 (isStampShape(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 assignments,\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 openingUnderlayShapes = [],\n interactiveOnly = false,\n showGrid = true,\n routeMode = false,\n readOnly = false,\n emptyMessage = 'Choose a floor or Outdoor to edit',\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 ensureMapFont();\n const wayfindingOn = showsWayfinding(tool, routeMode);\n const svgRef = useRef<SVGSVGElement>(null);\n const viewGroupRef = useRef<SVGGElement>(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 wheelFrameRef = useRef<number | null>(null);\n const wheelSettleRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const routeHoverFrameRef = useRef<number | null>(null);\n const routeHoverClientRef = useRef<Vec2 | null>(null);\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 [drawLockCircle, setDrawLockCircle] = useState(false);\n const [polygonPoints, setPolygonPoints] = useState<Vec2[]>([]);\n const [dragAnchor, setDragAnchor] = useState<number | null>(null);\n const [dragAnchorPoint, setDragAnchorPoint] = useState<Vec2 | 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 [routePointerSnap, setRoutePointerSnap] =\n useState<RouteSnapTarget | null>(null);\n const routeHover =\n routePointerSnap?.type === 'edge'\n ? { edgeId: routePointerSnap.edgeId, point: routePointerSnap.point }\n : 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 const worldPx = (px: number) =>\n screenPxToWorld(px, viewRef.current.zoom, pxPerUser);\n\n const applyView = (nextPan: Vec2, nextZoom: number) => {\n cancelWheelWork();\n viewRef.current = { pan: nextPan, zoom: nextZoom };\n setPan(nextPan);\n setZoom(nextZoom);\n };\n\n // Wheel input can fire much faster than paint. Move the SVG group\n // imperatively once per frame, then let React reconcile once scrolling ends.\n const paintView = () => {\n wheelFrameRef.current = null;\n const { pan: nextPan, zoom: nextZoom } = viewRef.current;\n viewGroupRef.current?.setAttribute(\n 'transform',\n `translate(${nextPan.x}, ${nextPan.y}) scale(${nextZoom})`,\n );\n };\n\n const settleWheelView = () => {\n wheelSettleRef.current = null;\n const { pan: nextPan, zoom: nextZoom } = viewRef.current;\n setPan(nextPan);\n setZoom(nextZoom);\n };\n\n const scheduleWheelPaint = () => {\n if (wheelFrameRef.current == null) {\n wheelFrameRef.current = requestAnimationFrame(paintView);\n }\n if (wheelSettleRef.current != null) clearTimeout(wheelSettleRef.current);\n wheelSettleRef.current = setTimeout(settleWheelView, 80);\n };\n\n const cancelWheelWork = () => {\n if (wheelFrameRef.current != null) {\n cancelAnimationFrame(wheelFrameRef.current);\n wheelFrameRef.current = null;\n }\n if (wheelSettleRef.current != null) {\n clearTimeout(wheelSettleRef.current);\n wheelSettleRef.current = null;\n }\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 cancelWheelWork();\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(\n () => () => {\n cancelZoomAnim();\n cancelWheelWork();\n },\n [],\n );\n\n useEffect(() => {\n setDrawing([]);\n setDrawLockCircle(false);\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 setDragAnchor(null);\n setDragAnchorPoint(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n if (routeHoverFrameRef.current != null) {\n cancelAnimationFrame(routeHoverFrameRef.current);\n routeHoverFrameRef.current = null;\n }\n routeHoverClientRef.current = null;\n setRoutePointerSnap(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 clearRouteSession();\n setStubDrag(null);\n setRoutePointerSnap(null);\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 next = pxPerUserFromSvg(svg);\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 const openingShapes = useMemo(\n () => editableShapes.filter((s) => s.kind === 'void'),\n [editableShapes],\n );\n const openingClipId = `eyeon-opening-clip-${level?.id ?? 'none'}`;\n const openingHatchId = `eyeon-opening-hatch-${level?.id ?? 'none'}`;\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) && !isStampShape(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 (isStampShape(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 const { pan: currentPan, zoom: currentZoom } = viewRef.current;\n return userToWorld(\n clientToSvgUser(svg, clientX, clientY),\n currentPan,\n currentZoom,\n );\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 const displayAnchorById = useMemo(() => {\n if (dragAnchor == null || !dragAnchorPoint) return anchorById;\n const dragged = anchorById.get(dragAnchor);\n if (!dragged) return anchorById;\n const next = new Map(anchorById);\n next.set(dragAnchor, { ...dragged, ...dragAnchorPoint });\n return next;\n }, [anchorById, dragAnchor, dragAnchorPoint]);\n const connectedAnchorIds = useMemo(() => {\n const ids = new Set<number>();\n edges.forEach((edge) => {\n ids.add(edge.fromAnchorId);\n ids.add(edge.toAnchorId);\n });\n return ids;\n }, [edges]);\n const routeEdgePath = useMemo(\n () =>\n edges\n .map((edge) => {\n const from = displayAnchorById.get(edge.fromAnchorId);\n const to = displayAnchorById.get(edge.toAnchorId);\n return from && to\n ? `M ${from.x} ${from.y} L ${to.x} ${to.y}`\n : '';\n })\n .filter(Boolean)\n .join(' '),\n [displayAnchorById, edges],\n );\n const assignmentByShapeId = useMemo(\n () => new Map(assignments.map((row) => [row.shapeId, row])),\n [assignments],\n );\n\n const cancelRouteHoverFrame = () => {\n if (routeHoverFrameRef.current != null) {\n cancelAnimationFrame(routeHoverFrameRef.current);\n routeHoverFrameRef.current = null;\n }\n routeHoverClientRef.current = null;\n };\n\n const scheduleRouteHover = (clientX: number, clientY: number) => {\n routeHoverClientRef.current = { x: clientX, y: clientY };\n if (routeHoverFrameRef.current != null) return;\n routeHoverFrameRef.current = requestAnimationFrame(() => {\n routeHoverFrameRef.current = null;\n const client = routeHoverClientRef.current;\n routeHoverClientRef.current = null;\n if (!client) return;\n const world = toWorld(client.x, client.y);\n if (\n routeDraftPoint ||\n storeLinkPreview ||\n (canPlaceNewRoute(tool) && lastRouteAnchor != null)\n ) {\n setRubberCursor(world);\n }\n setRoutePointerSnap(\n nearestRouteSnap(\n world,\n anchors,\n edges,\n storeLinkOriginIds(anchors, storeLinkPreview),\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n ),\n );\n });\n };\n\n useEffect(() => () => cancelRouteHoverFrame(), []);\n\n const closePolygon = () => {\n if (polygonPoints.length < 3) {\n setPolygonPoints([]);\n setRubberCursor(null);\n setPolygonSnap(null);\n return;\n }\n onCreateShape(\n tool === 'draw-void' ? 'void' : 'unit',\n polygonsToGeometry([polygonPoints]),\n );\n setPolygonPoints([]);\n setRubberCursor(null);\n setPolygonSnap(null);\n };\n\n useEffect(() => {\n if (!isEllipseDrawTool(tool)) return;\n const onShift = (e: KeyboardEvent) => {\n if (e.key !== 'Shift') return;\n setDrawLockCircle(e.type === 'keydown');\n };\n window.addEventListener('keydown', onShift);\n window.addEventListener('keyup', onShift);\n return () => {\n window.removeEventListener('keydown', onShift);\n window.removeEventListener('keyup', onShift);\n };\n }, [tool]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (isPolygonDrawTool(tool)) {\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 e.preventDefault();\n if (e.deltaY === 0) return;\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 = nextEditorZoomFromWheel(currentZoom, e);\n if (nextZoom === currentZoom) return;\n viewRef.current = {\n pan: panAfterZoom(user, currentPan, currentZoom, nextZoom),\n zoom: nextZoom,\n };\n scheduleWheelPaint();\n };\n node.addEventListener('wheel', onWheel, { passive: false, capture: true });\n return () => {\n cancelWheelWork();\n node.removeEventListener('wheel', onWheel, { capture: true });\n };\n }, [Boolean(level)]);\n\n const beginPinch = () => {\n cancelWheelWork();\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 setDragAnchorPoint(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 setDragAnchorPoint(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 (isPolygonDrawTool(tool)) {\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 anchorById,\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(\n nextRouteChainAnchor(\n tool,\n typeof created === 'number' ? created : null,\n ),\n );\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(\n nextRouteChainAnchor(\n tool,\n typeof created === 'number' ? created : null,\n ),\n );\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-entrance') {\n onCreateShape(\n 'entrance',\n entranceIconGeometry(world, DEFAULT_ENTRANCE_SIZE),\n { label: defaultEntranceLabel(DEFAULT_ENTRANCE_SIZE, theme.STORE_TEXT_COLOR) },\n );\n return;\n }\n if (tool === 'draw-unit' || isEllipseDrawTool(tool)) {\n e.currentTarget.setPointerCapture?.(e.pointerId);\n setDrawLockCircle(e.shiftKey);\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 applyView(nextPan, viewRef.current.zoom);\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 setDragAnchorPoint(toWorld(e.clientX, e.clientY));\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 (\n (tool === 'draw-unit' || isEllipseDrawTool(tool)) &&\n drawing.length > 0\n ) {\n const world = toWorld(e.clientX, e.clientY);\n if (isEllipseDrawTool(tool)) setDrawLockCircle(e.shiftKey);\n setDrawing((prev) => {\n if (prev.length === 0) return prev;\n return [prev[0], world];\n });\n }\n if (isPolygonDrawTool(tool) && 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 scheduleRouteHover(e.clientX, e.clientY);\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 setDrawLockCircle(false);\n };\n\n const finishEllipse = (lockCircle: boolean) => {\n if (drawing.length < 2) {\n setDrawing([]);\n setDrawLockCircle(false);\n return;\n }\n const [a, b] = [drawing[0], drawing[drawing.length - 1]];\n if (dragSize(a, b) < 2) {\n setDrawing([]);\n setDrawLockCircle(false);\n return;\n }\n onCreateShape(\n tool === 'draw-void-circle' ? 'void' : 'unit',\n ellipseGeometry(a, b, lockCircle),\n );\n setDrawing([]);\n setDrawLockCircle(false);\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 const point = dragAnchorPoint ?? moved;\n if (moved && point) {\n if (Math.hypot(point.x - moved.x, point.y - moved.y) >= 0.01) {\n onMoveAnchor(moved.id, point.x, point.y);\n onHistoryGestureEnd?.();\n }\n const near = anchors\n .filter((a) => a.id !== moved.id)\n .filter((a) => Math.hypot(a.x - point.x, a.y - point.y) <= 2.5)\n .map((a) => a.id);\n if (near.length) onSelectAnchors([moved.id, ...near]);\n }\n setDragAnchor(null);\n setDragAnchorPoint(null);\n return;\n }\n if (tool === 'draw-unit') finishRect();\n if (isEllipseDrawTool(tool)) finishEllipse(e.shiftKey);\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 anchorById,\n )\n : storeLinkPreview && rubberCursor && stubExcludeIds\n ? routePointerSnap\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 ? routePointerSnap\n : null;\n const highlightedRouteEdgeId =\n routeHover?.edgeId ?? (stubSnap?.type === 'edge' ? stubSnap.edgeId : null);\n const highlightedRouteEdge =\n highlightedRouteEdgeId == null\n ? null\n : edges.find((edge) => edge.id === highlightedRouteEdgeId) ?? null;\n const highlightedRouteFrom = highlightedRouteEdge\n ? displayAnchorById.get(highlightedRouteEdge.fromAnchorId)\n : null;\n const highlightedRouteTo = highlightedRouteEdge\n ? displayAnchorById.get(highlightedRouteEdge.toAnchorId)\n : null;\n const routePlusAt =\n routeHover?.point ?? (stubSnap?.type === 'edge' ? stubSnap.point : 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 isPolygonDrawTool(tool) && polygonPoints.length > 0\n ? routeRubberBand(polygonPoints[polygonPoints.length - 1], rubberCursor)\n : null;\n const polygonClose =\n isPolygonDrawTool(tool) && 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\">{emptyMessage}</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 preserveAspectRatio=\"xMidYMid meet\"\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 : tool === 'draw-entrance'\n ? 'cell'\n : isPanning || shapeDrag\n ? 'grabbing'\n : emptyCanvasDragPans(tool)\n ? 'grab'\n : isShapeDrawTool(tool) && !readOnly\n ? 'cell'\n : undefined,\n }}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n onPointerLeave={() => {\n cancelRouteHoverFrame();\n setRoutePointerSnap(null);\n }}\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\n ref={viewGroupRef}\n className=\"eyeon-map-canvas__view\"\n transform={`translate(${pan.x}, ${pan.y}) scale(${zoom})`}\n >\n <defs>\n <pattern\n id={openingHatchId}\n patternUnits=\"userSpaceOnUse\"\n width={14}\n height={14}\n >\n <rect width=\"14\" height=\"14\" fill=\"#94a3b8\" fillOpacity=\"0.16\" />\n <path d=\"M-2 16 L16 -2\" stroke=\"#64748b\" strokeWidth=\"1.15\" />\n </pattern>\n {openingShapes.length > 0 ? (\n <clipPath id={openingClipId}>\n {openingShapes.map((shape) => (\n <path key={shape.id} d={shapePathD(shape)} />\n ))}\n </clipPath>\n ) : null}\n </defs>\n {svgUnderlayUrl ? (\n <OutdoorSvgUnderlay\n url={svgUnderlayUrl}\n imageProxyUrl={imageProxyUrl}\n suppressIds={svgSuppressIds}\n theme={theme}\n />\n ) : null}\n\n {underlayShapes.filter(isUnderlayDrawnShape).map((shape) => {\n const hintable = !wayfindingOn && 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(\n shape,\n theme,\n assignmentByShapeId.get(shape.id),\n )}\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 {openingShapes.length > 0 && openingUnderlayShapes.length > 0 ? (\n <g clipPath={`url(#${openingClipId})`} pointerEvents=\"none\">\n {openingUnderlayShapes.filter(isUnderlayDrawnShape).map((shape) => (\n <path\n key={`below-${shape.id}`}\n d={\n shape.geometry.paths.map((p) => p.d).join(' ') ||\n polygonsToPath(shape.geometry.polygons)\n }\n fill={editorShapeFill(\n shape,\n theme,\n assignmentByShapeId.get(shape.id),\n )}\n fillOpacity={0.55}\n stroke=\"#94a3b8\"\n strokeWidth={0.8 / zoom}\n />\n ))}\n </g>\n ) : null}\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 textLabel = isTextLabel(shape);\n const entranceIcon = isEntranceIcon(shape);\n const stamp = textLabel || entranceIcon;\n const cursor =\n editorSelectCursor({\n tool,\n selected,\n highlightable,\n dragging,\n wayfinding:\n wayfindingOn &&\n !readOnly &&\n isWayfindingShape(shape.kind) &&\n !stamp,\n textLabel,\n entranceIcon,\n }) ??\n (isStampDrawTool(tool) || (canSelectShapes(tool) && !readOnly)\n ? undefined\n : isShapeDrawTool(tool)\n ? 'cell'\n : '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 !stamp\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 (stamp && isStampDrawTool(tool)) {\n e.stopPropagation();\n onSelectShape(shape.id);\n onToolChange?.('select');\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 (entranceIcon) {\n const geometry =\n selected && displayGeometry\n ? displayGeometry\n : shape.geometry;\n const box = geometryBBox(geometry);\n const size = shape.label.size ?? DEFAULT_ENTRANCE_SIZE;\n const rotate = shape.label.rotate ?? 0;\n const { x: cx, y: cy } = labelBoxCenter(box);\n const iconUrl = entranceIconDataUrl(\n shape.label.color ?? theme.STORE_TEXT_COLOR,\n );\n return (\n <g\n key={shape.id}\n transform={\n rotate ? `rotate(${rotate} ${cx} ${cy})` : undefined\n }\n style={{ cursor: cursor ?? 'pointer' }}\n {...hoverHandlers}\n >\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 {iconUrl ? (\n <image\n href={iconUrl}\n x={box.minX}\n y={box.minY}\n width={box.maxX - box.minX}\n height={box.maxY - box.minY}\n style={{ pointerEvents: 'none' }}\n />\n ) : null}\n </g>\n );\n }\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 const rotate = shape.label.rotate ?? 0;\n const { x: cx, y: cy } = labelBoxCenter(box);\n const align = normalizeLabelAlign(shape.label.align);\n const textX = labelAlignX(box, align);\n const lines = labelTextLines(shape.label.text ?? '');\n const lineHeight = size * LABEL_LINE_HEIGHT;\n const blockHeight = lines.length * lineHeight;\n return (\n <g\n key={shape.id}\n transform={\n rotate ? `rotate(${rotate} ${cx} ${cy})` : undefined\n }\n style={{ cursor: cursor ?? 'pointer' }}\n {...hoverHandlers}\n >\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 fontFamily={LABEL_FONT_FAMILY}\n fontSize={size}\n fill={shape.label.color ?? theme.STORE_TEXT_COLOR}\n textAnchor={labelSvgTextAnchor(align)}\n style={{ userSelect: 'none', cursor: cursor ?? 'pointer' }}\n onPointerDown={beginShapePointerDown}\n >\n {lines.map((line, index) => (\n <tspan\n key={index}\n x={textX}\n y={cy - blockHeight / 2 + (index + 0.5) * lineHeight}\n dominantBaseline=\"central\"\n >\n {line || ' '}\n </tspan>\n ))}\n </text>\n </g>\n );\n }\n const baseOpacity = editorShapeFillOpacity(shape.kind);\n const opening = shape.kind === 'void';\n return (\n <path\n key={shape.id}\n d={shapePathD(shape)}\n fill={\n opening\n ? `url(#${openingHatchId})`\n : editorShapeFill(\n shape,\n theme,\n assignmentByShapeId.get(shape.id),\n )\n }\n fillOpacity={\n opening\n ? 1\n : editorHoverFillOpacity(\n shape.kind,\n baseOpacity,\n hovered,\n )\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 strokeDasharray={\n opening && !selected && !hovered\n ? `${6 / zoom} ${4 / zoom}`\n : undefined\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 !isStampShape(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-halo-${selectedShape.id}-${ri}-${ei}`}\n x1={from.x}\n y1={from.y}\n x2={edge.c1.x}\n y2={edge.c1.y}\n stroke=\"#fff\"\n strokeWidth={worldPx(HANDLE_LINE_HALO_PX)}\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />,\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={worldPx(HANDLE_LINE_PX)}\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />,\n <line\n key={`hl2-halo-${selectedShape.id}-${ri}-${ei}`}\n x1={to.x}\n y1={to.y}\n x2={edge.c2.x}\n y2={edge.c2.y}\n stroke=\"#fff\"\n strokeWidth={worldPx(HANDLE_LINE_HALO_PX)}\n strokeLinecap=\"round\"\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={worldPx(HANDLE_LINE_PX)}\n strokeLinecap=\"round\"\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 && routeEdgePath ? (\n <path\n d={routeEdgePath}\n fill=\"none\"\n stroke={theme.ACCENT_COLOR}\n strokeWidth={8 / zoom}\n strokeLinecap=\"round\"\n strokeOpacity={0.95}\n pointerEvents=\"none\"\n />\n ) : null}\n\n {wayfindingOn && highlightedRouteFrom && highlightedRouteTo ? (\n <g pointerEvents=\"none\">\n <line\n x1={highlightedRouteFrom.x}\n y1={highlightedRouteFrom.y}\n x2={highlightedRouteTo.x}\n y2={highlightedRouteTo.y}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(12)}\n strokeOpacity={0.22}\n strokeLinecap=\"round\"\n />\n <line\n x1={highlightedRouteFrom.x}\n y1={highlightedRouteFrom.y}\n x2={highlightedRouteTo.x}\n y2={highlightedRouteTo.y}\n stroke=\"#22c55e\"\n strokeWidth={8 / zoom}\n strokeLinecap=\"round\"\n />\n {routePlusAt && !stubDrag ? (\n <g>\n <circle\n cx={routePlusAt.x}\n cy={routePlusAt.y}\n r={worldPx(9)}\n fill=\"#fff\"\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(2)}\n />\n <path\n d={`M ${routePlusAt.x} ${routePlusAt.y - worldPx(5)} L ${routePlusAt.x} ${routePlusAt.y + worldPx(5)} M ${routePlusAt.x - worldPx(5)} ${routePlusAt.y} L ${routePlusAt.x + worldPx(5)} ${routePlusAt.y}`}\n fill=\"none\"\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(2)}\n strokeLinecap=\"round\"\n />\n </g>\n ) : null}\n </g>\n ) : null}\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 = connectedAnchorIds.has(anchor.id);\n const displayAnchor = displayAnchorById.get(anchor.id) ?? anchor;\n const nearWeld =\n selected &&\n selectedAnchorIds.some((id) => {\n if (id === anchor.id) return false;\n const other = anchorById.get(id);\n return (\n other &&\n Math.hypot(\n other.x - displayAnchor.x,\n other.y - displayAnchor.y,\n ) <= 2.5\n );\n });\n const visR = selected || shapeNode ? ANCHOR_R_SELECTED_PX : ANCHOR_R_PX;\n return (\n <g key={anchor.id}>\n <HandleDot\n cx={displayAnchor.x}\n cy={displayAnchor.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 anchorById,\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: displayAnchor.x, y: displayAnchor.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: displayAnchor.x, y: displayAnchor.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: displayAnchor.x, y: displayAnchor.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: displayAnchor.x, y: displayAnchor.y },\n });\n setRubberCursor({ x: displayAnchor.x, y: displayAnchor.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 setDragAnchorPoint({\n x: displayAnchor.x,\n y: displayAnchor.y,\n });\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 && isEllipseDrawTool(tool) && (() => {\n const bounds = ellipseBoundsFromDrag(\n drawing[0],\n drawing[drawing.length - 1],\n drawLockCircle,\n );\n return (\n <ellipse\n cx={bounds.cx}\n cy={bounds.cy}\n rx={Math.max(bounds.rx, 0)}\n ry={Math.max(bounds.ry, 0)}\n fill={\n tool === 'draw-void-circle'\n ? `url(#${openingHatchId})`\n : theme.STORE_DEFAULT_COLOR\n }\n fillOpacity={tool === 'draw-void-circle' ? 1 : 0.2}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={2 / zoom}\n strokeDasharray={`${6 / zoom} ${4 / zoom}`}\n pointerEvents=\"none\"\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 {polygonPoints.length > 0 && isPolygonDrawTool(tool) && (\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\nexport type ConnectorEdgeLike = Pick<\n CmRouteEdge,\n 'kind' | 'directed' | 'fromAnchorId' | 'toAnchorId'\n>;\n\nexport type ConnectorAnchorLike = Pick<CmAnchor, 'id' | 'shapeId' | 'connectorId'>;\n\nexport function partnerShapesForConnector<T extends { id: number }>(\n shapeId: number,\n anchors: ConnectorAnchorLike[],\n connectors: CmConnector[],\n shapes: T[],\n): T[] {\n const connector = connectorForShape(shapeId, anchors, connectors);\n if (!connector) return [];\n const ids = memberShapeIds(connector.id, anchors);\n return shapes.filter((s) => ids.includes(s.id) && s.id !== shapeId);\n}\n\nexport function levelsWithLandings<T extends { levelId: number }>(\n landings: T[],\n levels: CmLevel[],\n): CmLevel[] {\n const ids = new Set(landings.map((item) => item.levelId));\n return levels\n .filter((level) => ids.has(level.id))\n .slice()\n .sort((a, b) => a.ordering - b.ordering || a.levelIndex - b.levelIndex);\n}\n\nexport function escalatorDirectedEnds<T extends { id: number }>(\n connectorId: number,\n anchors: ConnectorAnchorLike[],\n edges: ConnectorEdgeLike[],\n shapes: T[],\n): { from: T; to: T } | null {\n const memberAnchors = anchors.filter((a) => a.connectorId === connectorId);\n const memberIds = new Set(memberAnchors.map((a) => a.id));\n const ride = edges.find(\n (edge) =>\n edge.kind === 'connector' &&\n edge.directed &&\n memberIds.has(edge.fromAnchorId) &&\n memberIds.has(edge.toAnchorId),\n );\n if (!ride) return null;\n const fromAnchor = anchors.find((a) => a.id === ride.fromAnchorId);\n const toAnchor = anchors.find((a) => a.id === ride.toAnchorId);\n const from = shapes.find((s) => s.id === fromAnchor?.shapeId);\n const to = shapes.find((s) => s.id === toAnchor?.shapeId);\n if (!from || !to) return null;\n return { from, to };\n}\n\nfunction floorName(\n levelId: number,\n levels: Array<{ id: number; name: string }>,\n): string {\n return levels.find((level) => level.id === levelId)?.name ?? 'Floor';\n}\n\nfunction landingRideId(\n shape: { key: string; levelId: number },\n levels: Array<{ id: number; name: string }>,\n): string {\n return `${floorName(shape.levelId, levels)} · ${shape.key}`;\n}\n\nexport type EscalatorRideEnds<T extends { id: number; key: string; levelId: number }> = {\n connectorId: number;\n from: T;\n to: T;\n};\n\nexport type EscalatorRideLandingLine = {\n shapeId: number;\n key: string;\n levelName: string;\n};\n\n/**\n * One sidebar row per linked ride. Boarding is `from`, exit is `to`.\n * Unlinked landings are omitted — they stay in the Unassigned list.\n */\nexport function groupEscalatorRides<T extends { id: number; key: string; levelId: number }>(\n connectors: Array<Pick<CmConnector, 'id' | 'kind'>>,\n anchors: ConnectorAnchorLike[],\n edges: ConnectorEdgeLike[],\n shapes: T[],\n): EscalatorRideEnds<T>[] {\n const rides: EscalatorRideEnds<T>[] = [];\n for (const connector of connectors) {\n if (connector.kind !== 'escalator') continue;\n const directed = escalatorDirectedEnds(connector.id, anchors, edges, shapes);\n if (directed) {\n rides.push({ connectorId: connector.id, from: directed.from, to: directed.to });\n continue;\n }\n const ids = new Set(memberShapeIds(connector.id, anchors));\n const members = shapes.filter((shape) => ids.has(shape.id));\n if (members.length < 2) continue;\n rides.push({ connectorId: connector.id, from: members[0], to: members[1] });\n }\n return rides;\n}\n\n/** Boarding on top, exit below — each with its floor name. */\nexport function escalatorRideLandingLines<\n T extends { id: number; key: string; levelId: number },\n>(\n ride: EscalatorRideEnds<T>,\n levels: Array<{ id: number; name: string }>,\n): [EscalatorRideLandingLine, EscalatorRideLandingLine] {\n return [\n {\n shapeId: ride.from.id,\n key: ride.from.key,\n levelName: floorName(ride.from.levelId, levels),\n },\n {\n shapeId: ride.to.id,\n key: ride.to.key,\n levelName: floorName(ride.to.levelId, levels),\n },\n ];\n}\n\n/** Assigned-list title: boarding → exit (escalator) or floor landings ↔ (elevator). */\nexport function connectorRideLabel(\n shape: { id: number; key: string; levelId: number },\n anchors: ConnectorAnchorLike[],\n edges: ConnectorEdgeLike[],\n connectors: CmConnector[],\n shapes: Array<{ id: number; key: string; levelId: number }>,\n levels: Array<{ id: number; name: string; ordering?: number; levelIndex?: number }> = [],\n): string | null {\n const connector = connectorForShape(shape.id, anchors, connectors);\n if (!connector) return null;\n\n if (connector.kind === 'escalator') {\n const ride = escalatorDirectedEnds(connector.id, anchors, edges, shapes);\n if (ride) {\n return `${ride.from.key} → ${ride.to.key}`;\n }\n const partners = partnerShapesForConnector(shape.id, anchors, connectors, shapes);\n if (partners.length === 1) {\n return `${shape.key} → ${partners[0].key}`;\n }\n return null;\n }\n\n const members = [shape, ...partnerShapesForConnector(shape.id, anchors, connectors, shapes)];\n if (members.length < 2) return null;\n const order = new Map(\n levels.map((level, index) => [\n level.id,\n (level.ordering ?? level.levelIndex ?? index) * 1000 + (level.levelIndex ?? index),\n ]),\n );\n const sorted = members.slice().sort((a, b) => {\n const ai = order.get(a.levelId) ?? Number.POSITIVE_INFINITY;\n const bi = order.get(b.levelId) ?? Number.POSITIVE_INFINITY;\n return ai - bi;\n });\n return sorted.map((item) => landingRideId(item, levels)).join(' ↔ ');\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 {\n bboxOf,\n geometryBBox,\n normalizeGeometrySpace,\n parseShapeAssignment,\n} 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\n/** True when another live shape already uses this ID on the floor. */\nexport function shapeKeyTakenOnLevel(\n shapes: Array<{\n id: number;\n levelId: number;\n key: string;\n orphanedAt?: string | null;\n }>,\n shapeId: number,\n levelId: number,\n key: string,\n): boolean {\n return shapes.some(\n (shape) =>\n shape.id !== shapeId &&\n shape.levelId === levelId &&\n shape.key === key &&\n !shape.orphanedAt,\n );\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 kind =\n draft.shapes.find((s) => s.id === op.assignment.shapeId)?.kind ?? 'unit';\n const assignment = parseShapeAssignment(op.assignment, kind);\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:\n incoming.connectorId !== undefined\n ? incoming.connectorId\n : 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\n/**\n * Persist order for POST /v1/map/batch.\n * Relinking an escalator coalesces landing upserts into the earlier unlink slot,\n * which would otherwise write `connector_id` before the new connector exists.\n */\nconst BATCH_PERSIST_RANK: Record<BatchOp['op'], number> = {\n upsert_building: 10,\n upsert_level: 20,\n upsert_shape: 30,\n upsert_assignment: 40,\n upsert_connector: 50,\n upsert_anchor: 60,\n upsert_edge: 70,\n update_theme: 80,\n weld_anchors: 90,\n delete_edge: 100,\n delete_anchor: 110,\n delete_assignment: 120,\n delete_shape: 130,\n delete_connector: 140,\n delete_building: 150,\n delete_level: 160,\n};\n\nexport function orderBatchOpsForPersist(ops: BatchOp[]): BatchOp[] {\n return ops\n .map((op, index) => ({ op, index }))\n .sort((a, b) => {\n const rank = BATCH_PERSIST_RANK[a.op.op] - BATCH_PERSIST_RANK[b.op.op];\n return rank !== 0 ? rank : a.index - b.index;\n })\n .map(({ op }) => op);\n}\n","import React from 'react';\n\nfunction FieldResetIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3.3 8a4.7 4.7 0 1 0 1.15-3.15\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M3.1 2.6v3.3h3.3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function FieldResetButton({\n label,\n onClick,\n disabled,\n}: {\n label: string;\n onClick: () => void;\n disabled?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n className=\"eyeon-map-rail__field-reset\"\n aria-label={`Reset ${label}`}\n title=\"Reset\"\n disabled={disabled}\n onClick={onClick}\n >\n <FieldResetIcon />\n </button>\n );\n}\n","import { isTransparentColor } from '../core/color';\n\nexport { isTransparentColor, TRANSPARENT_COLOR } from '../core/color';\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\nexport function sameHexColor(a: string, b: string): boolean {\n if (isTransparentColor(a) || isTransparentColor(b)) {\n return isTransparentColor(a) && isTransparentColor(b);\n }\n const left = normalizeHexColor(a);\n const right = normalizeHexColor(b);\n return left != null && left === right;\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport {\n assignNumberFromDraft,\n commitAssignNumberDraft,\n LABEL_ALIGNS,\n normalizeLabelAlign,\n type LabelAlign,\n} from '../../core';\nimport { FieldResetButton } from '../FieldResetButton';\nimport {\n hexColorInputValue,\n isTransparentColor,\n normalizeHexColor,\n TRANSPARENT_COLOR,\n} from '../hexColor';\n\nexport function StepperRow({\n label,\n value,\n disabled,\n extra,\n onChange,\n onStep,\n onHoldStart,\n onHoldEnd,\n}: {\n label: string;\n value: number;\n disabled: boolean;\n extra?: React.ReactNode;\n onChange: (value: number) => void;\n onStep: (delta: number) => void;\n onHoldStart: (delta: number) => void;\n onHoldEnd: () => void;\n}) {\n const [draft, setDraft] = useState(() => String(value));\n const focused = useRef(false);\n const syncDraft = useRef(false);\n\n useEffect(() => {\n if (!focused.current || syncDraft.current) {\n setDraft(String(value));\n syncDraft.current = false;\n }\n }, [value]);\n\n const commitDraft = (raw: string, persistIncomplete: boolean) => {\n const parsed = persistIncomplete\n ? commitAssignNumberDraft(raw)\n : { display: raw, render: assignNumberFromDraft(raw).render };\n setDraft(parsed.display);\n onChange(parsed.render);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">{label}</span>\n <div className=\"eyeon-map-assign__control\">\n {extra}\n <div className=\"eyeon-map-assign__stepper\">\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={`Decrease ${label}`}\n onClick={() => onStep(-1)}\n onMouseDown={() => onHoldStart(-1)}\n onMouseUp={onHoldEnd}\n onMouseLeave={onHoldEnd}\n >\n −\n </button>\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={draft}\n disabled={disabled}\n aria-label={label}\n onFocus={() => {\n focused.current = true;\n }}\n onChange={(e) => commitDraft(e.target.value, false)}\n onBlur={() => {\n focused.current = false;\n commitDraft(draft, true);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n return;\n }\n if (e.key !== 'ArrowUp' && e.key !== 'ArrowDown') return;\n e.preventDefault();\n if (disabled) return;\n syncDraft.current = true;\n onStep(e.key === 'ArrowUp' ? 1 : -1);\n }}\n />\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={`Increase ${label}`}\n onClick={() => onStep(1)}\n onMouseDown={() => onHoldStart(1)}\n onMouseUp={onHoldEnd}\n onMouseLeave={onHoldEnd}\n >\n +\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nexport function ColorSwatch({\n label,\n hex,\n swatch,\n fallback,\n disabled,\n emptyIsTransparent = true,\n onHexChange,\n onCommit,\n onPick,\n}: {\n label: string;\n hex: string;\n swatch: string;\n fallback?: string;\n disabled?: boolean;\n emptyIsTransparent?: boolean;\n onHexChange: (value: string) => void;\n onCommit: () => void;\n onPick: (hex: string) => void;\n}) {\n const lastSolid = useRef(hexColorInputValue(fallback || swatch));\n const transparent =\n isTransparentColor(swatch) ||\n (emptyIsTransparent && !hex.trim());\n\n useEffect(() => {\n const solid = normalizeHexColor(swatch);\n if (solid) lastSolid.current = solid;\n }, [swatch]);\n\n const pickerValue = hexColorInputValue(transparent ? lastSolid.current : swatch);\n\n return (\n <div className=\"eyeon-map-assign__swatch\">\n <span\n className={\n transparent\n ? 'eyeon-map-assign__swatch-well is-transparent'\n : 'eyeon-map-assign__swatch-well'\n }\n style={transparent ? undefined : { backgroundColor: hexColorInputValue(swatch) }}\n >\n <input\n type=\"color\"\n className=\"eyeon-map-assign__swatch-native\"\n disabled={disabled}\n aria-label={label}\n value={pickerValue}\n onChange={(e) => {\n lastSolid.current = e.target.value;\n onPick(e.target.value);\n }}\n />\n </span>\n <input\n type=\"text\"\n spellCheck={false}\n disabled={disabled}\n aria-label={`${label} hex`}\n placeholder=\"Transparent\"\n value={transparent ? '' : hex}\n onChange={(e) => onHexChange(e.target.value)}\n onBlur={onCommit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n }\n }}\n />\n </div>\n );\n}\n\nexport function ColorRow({\n label,\n value,\n fallback,\n disabled,\n onChange,\n onReset,\n}: {\n label: string;\n value: string;\n fallback: string;\n disabled: boolean;\n onChange: (hex: string) => void;\n onReset?: () => void;\n}) {\n const transparent = isTransparentColor(value);\n const display = transparent ? TRANSPARENT_COLOR : value.trim() ? value : fallback;\n const [hex, setHex] = useState(transparent ? '' : display);\n\n useEffect(() => {\n setHex(transparent ? '' : display);\n }, [display, transparent]);\n\n const commit = (next: string) => {\n if (!next.trim() || isTransparentColor(next)) {\n setHex('');\n onChange(TRANSPARENT_COLOR);\n return;\n }\n const normalized = normalizeHexColor(next);\n if (!normalized) {\n setHex(transparent ? '' : display);\n return;\n }\n setHex(normalized);\n onChange(normalized);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">\n {label}\n {onReset ? (\n <FieldResetButton label={label} onClick={onReset} disabled={disabled} />\n ) : null}\n </span>\n <ColorSwatch\n label={label}\n hex={hex}\n swatch={display}\n fallback={fallback}\n disabled={disabled}\n onHexChange={setHex}\n onCommit={() => commit(hex)}\n onPick={commit}\n />\n </div>\n );\n}\n\nconst ALIGN_TOOLTIPS: Record<LabelAlign, string> = {\n left: 'Left',\n center: 'Center',\n right: 'Right',\n};\n\nfunction AlignLeftIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M2 3h12v1.4H2V3zm0 4.3h8v1.4H2V7.3zm0 4.3h12v1.4H2v-1.4z\"\n />\n </svg>\n );\n}\n\nfunction AlignCenterIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M2 3h12v1.4H2V3zm2 4.3h8v1.4H4V7.3zm-2 4.3h12v1.4H2v-1.4z\"\n />\n </svg>\n );\n}\n\nfunction AlignRightIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M2 3h12v1.4H2V3zm4 4.3h8v1.4H6V7.3zm-4 4.3h12v1.4H2v-1.4z\"\n />\n </svg>\n );\n}\n\nconst ALIGN_ICONS: Record<LabelAlign, React.ReactNode> = {\n left: <AlignLeftIcon />,\n center: <AlignCenterIcon />,\n right: <AlignRightIcon />,\n};\n\nexport function AlignRow({\n value,\n disabled,\n onChange,\n}: {\n value?: LabelAlign;\n disabled: boolean;\n onChange: (align: LabelAlign) => void;\n}) {\n const align = normalizeLabelAlign(value);\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">Alignment</span>\n <div className=\"eyeon-map-assign__align\" role=\"group\" aria-label=\"Alignment\">\n {LABEL_ALIGNS.map((option) => (\n <button\n key={option}\n type=\"button\"\n className={option === align ? 'is-active' : undefined}\n disabled={disabled}\n aria-label={ALIGN_TOOLTIPS[option]}\n aria-pressed={option === align}\n data-tooltip={ALIGN_TOOLTIPS[option]}\n onClick={() => onChange(option)}\n >\n {ALIGN_ICONS[option]}\n </button>\n ))}\n </div>\n </div>\n );\n}\n\nexport function RotateIcon() {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n fill=\"currentColor\"\n d=\"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\"\n />\n </svg>\n );\n}\n\nexport function nextQuarterTurn(value: number): number {\n const angle = 45;\n let next = value;\n const remainder = next % angle;\n if (remainder !== 0) next -= remainder;\n next += angle;\n return next >= 360 ? 0 : next;\n}\n\n/** +/- drops the fraction, then steps by whole numbers. Typed decimals stay until then. */\nexport function stepWholeNumber(value: number, delta: number): number {\n if (!Number.isFinite(value)) return delta;\n if (delta > 0) return Math.floor(value) + delta;\n if (Number.isInteger(value)) return value + delta;\n return Math.floor(value);\n}\n","import React, { useEffect, useRef } from 'react';\nimport type { CmShapeAssignment } from '../../core';\nimport { ColorRow, RotateIcon, StepperRow, nextQuarterTurn } from './formRows';\n\ntype StepKey = 'size' | 'rotate' | 'offsetX' | 'offsetY';\n\nexport interface AssignmentStyleFieldsProps {\n form: Pick<\n CmShapeAssignment,\n 'size' | 'rotate' | 'offsetX' | 'offsetY' | 'bgColor' | 'textColor'\n >;\n canEdit: boolean;\n storeDefaultColor: string;\n storeTextColor: string;\n textColorLabel?: string;\n showTextColor?: boolean;\n onPatch: (partial: Partial<CmShapeAssignment>) => void;\n}\n\n/** Size, rotate, offset, and colors — shared by kiosk / store / escalator assign. */\nexport function AssignmentStyleFields({\n form,\n canEdit,\n storeDefaultColor,\n storeTextColor,\n textColorLabel = 'Text Color',\n showTextColor = true,\n onPatch,\n}: AssignmentStyleFieldsProps) {\n const formRef = useRef(form);\n formRef.current = form;\n const intervals = useRef<Partial<Record<StepKey, number>>>({});\n\n useEffect(\n () => () => {\n (Object.values(intervals.current) as number[]).forEach((id) =>\n window.clearInterval(id),\n );\n },\n [],\n );\n\n const bump = (key: StepKey, delta: number) => {\n onPatch({ [key]: (formRef.current[key] ?? 0) + delta });\n };\n\n const startHold = (key: StepKey, delta: number) => {\n stopHold(key);\n intervals.current[key] = window.setInterval(() => bump(key, delta), 200);\n };\n\n const stopHold = (key: StepKey) => {\n const id = intervals.current[key];\n if (id) {\n window.clearInterval(id);\n intervals.current[key] = undefined;\n }\n };\n\n return (\n <>\n <StepperRow\n label=\"Size\"\n value={form.size}\n disabled={!canEdit}\n onChange={(size) => onPatch({ size })}\n onStep={(delta) => bump('size', delta)}\n onHoldStart={(delta) => startHold('size', delta)}\n onHoldEnd={() => stopHold('size')}\n />\n <StepperRow\n label=\"Rotate\"\n value={form.rotate}\n disabled={!canEdit}\n extra={\n <button\n type=\"button\"\n className=\"eyeon-map-assign__rotate\"\n aria-label=\"Rotate 45 degrees\"\n disabled={!canEdit}\n onClick={() => onPatch({ rotate: nextQuarterTurn(form.rotate ?? 0) })}\n >\n <RotateIcon />\n </button>\n }\n onChange={(rotate) => onPatch({ rotate })}\n onStep={(delta) => bump('rotate', delta)}\n onHoldStart={(delta) => startHold('rotate', delta)}\n onHoldEnd={() => stopHold('rotate')}\n />\n <StepperRow\n label=\"Offset X\"\n value={form.offsetX}\n disabled={!canEdit}\n onChange={(offsetX) => onPatch({ offsetX })}\n onStep={(delta) => bump('offsetX', delta)}\n onHoldStart={(delta) => startHold('offsetX', delta)}\n onHoldEnd={() => stopHold('offsetX')}\n />\n <StepperRow\n label=\"Offset Y\"\n value={form.offsetY}\n disabled={!canEdit}\n onChange={(offsetY) => onPatch({ offsetY })}\n onStep={(delta) => bump('offsetY', delta)}\n onHoldStart={(delta) => startHold('offsetY', delta)}\n onHoldEnd={() => stopHold('offsetY')}\n />\n <ColorRow\n label=\"BG Color\"\n value={form.bgColor ?? ''}\n fallback={storeDefaultColor}\n disabled={!canEdit}\n onChange={(bgColor) => onPatch({ bgColor: bgColor || null })}\n onReset={form.bgColor ? () => onPatch({ bgColor: null }) : undefined}\n />\n {showTextColor ? (\n <ColorRow\n label={textColorLabel}\n value={form.textColor ?? ''}\n fallback={storeTextColor}\n disabled={!canEdit}\n onChange={(textColor) => onPatch({ textColor: textColor || null })}\n onReset={form.textColor ? () => onPatch({ textColor: null }) : undefined}\n />\n ) : null}\n </>\n );\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { BatchOp, CmShape, CmShapeAssignment } from '../../core';\nimport { emptyShapeAssignment, parseShapeAssignment } from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport { AssignmentStyleFields } from './AssignmentStyleFields';\nimport {\n buildElevatorShaftOps,\n buildEscalatorLinkOps,\n buildUnlinkConnectorOps,\n connectorForShape,\n connectorIdForShape,\n levelsWithLandings,\n memberShapeIds,\n resolvedConnectorKind,\n suggestEscalatorPairs,\n type ConnectorPlanContext,\n type VerticalRailKind,\n} from '../connectorAssignments';\nimport { connectorSpecialIconDataUrl } from '../../specialIcons';\n\nexport interface ConnectorAssignProps {\n shape: CmShape;\n railKind: VerticalRailKind;\n ctx: ConnectorPlanContext;\n canEdit: boolean;\n assignment?: CmShapeAssignment | null;\n storeDefaultColor: string;\n storeTextColor: string;\n onApplyOps: (ops: BatchOp[]) => void;\n onSaveAssignment?: (assignment: CmShapeAssignment) => void;\n}\n\nfunction connectorStyleAssignment(\n shape: CmShape,\n assignment: CmShapeAssignment | null | undefined,\n): CmShapeAssignment {\n const parsed = assignment\n ? parseShapeAssignment(assignment, 'connector')\n : emptyShapeAssignment(shape.id, 'connector');\n return {\n ...parsed,\n shapeId: shape.id,\n layerType: 'connector',\n };\n}\n\nexport function ConnectorAssign({\n shape,\n railKind,\n ctx,\n canEdit,\n assignment = null,\n storeDefaultColor,\n storeTextColor,\n onApplyOps,\n onSaveAssignment,\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 partner = partners[0];\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 [exitFloorId, setExitFloorId] = useState(\n partner ? String(partner.levelId) : '',\n );\n const [targetId, setTargetId] = useState(partner ? String(partner.id) : '');\n const [stopFloorId, setStopFloorId] = useState('');\n const [styleForm, setStyleForm] = useState<CmShapeAssignment>(() =>\n connectorStyleAssignment(shape, assignment),\n );\n const styleFormRef = useRef(styleForm);\n styleFormRef.current = styleForm;\n\n useEffect(() => {\n setStyleForm(connectorStyleAssignment(shape, assignment));\n }, [shape, assignment]);\n\n const patchStyle = useCallback(\n (partial: Partial<CmShapeAssignment>) => {\n const next = connectorStyleAssignment(shape, {\n ...styleFormRef.current,\n ...partial,\n shapeId: shape.id,\n });\n setStyleForm(next);\n if (!canEdit) return;\n onSaveAssignment?.(next);\n },\n [canEdit, onSaveAssignment, shape],\n );\n\n useEffect(() => {\n setExitFloorId(partner ? String(partner.levelId) : '');\n setTargetId(partner ? String(partner.id) : '');\n }, [shape.id, connector?.id, partner?.id, partner?.levelId]);\n\n const exitFloors = levelsWithLandings(candidates, ctx.levels);\n const landingsOnExitFloor = candidates.filter(\n (item) => String(item.levelId) === exitFloorId,\n );\n\n const addable = candidates.filter((item) => !memberIds.includes(item.id));\n const addFloors = levelsWithLandings(addable, ctx.levels);\n const landingsOnStopFloor = addable.filter(\n (item) => String(item.levelId) === stopFloorId,\n );\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) => {\n onApplyOps(buildEscalatorLinkOps(ctx, from, to));\n };\n\n const applyElevator = (nextMembers: CmShape[]) => {\n if (nextMembers.length < 2) return;\n onApplyOps(\n buildElevatorShaftOps(ctx, nextMembers, {\n name: connector?.name,\n accessible: connector?.accessible ?? true,\n connectorId: connector?.id,\n }),\n );\n };\n\n const pickExitLanding = (nextId: string) => {\n setTargetId(nextId);\n const to = ctx.shapes.find((s) => s.id === Number(nextId));\n if (!to || !canEdit) return;\n applyEscalator(shape, to);\n };\n\n const pickElevatorStop = (nextId: string) => {\n const next = ctx.shapes.find((s) => s.id === Number(nextId));\n if (!next || !canEdit) return;\n applyElevator([...members, shape, next]);\n setStopFloorId('');\n };\n\n const landingOptions = (\n landings: CmShape[],\n kind: VerticalRailKind,\n ) =>\n landings.map((item) => {\n const linked = connectorIdForShape(item.id, ctx.anchors) != null;\n return {\n value: String(item.id),\n label: item.key,\n hint: linked ? 'Linked' : undefined,\n iconUrl: connectorSpecialIconDataUrl(kind, linked),\n iconMuted: !linked,\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 {railKind === 'escalator' && (\n <>\n <label className=\"eyeon-map-rail__field\">\n Floor\n <ModernSelect\n ariaLabel=\"Floor\"\n value={exitFloorId}\n disabled={!canEdit || exitFloors.length === 0}\n placeholder=\"Choose a floor\"\n options={exitFloors.map((level) => ({\n value: String(level.id),\n label: level.name,\n }))}\n onChange={(nextFloor) => {\n setExitFloorId(nextFloor);\n setTargetId(\n partner && String(partner.levelId) === nextFloor\n ? String(partner.id)\n : '',\n );\n }}\n />\n </label>\n <label className=\"eyeon-map-rail__field\">\n Escalator Point\n <ModernSelect\n ariaLabel=\"Escalator Point\"\n value={targetId}\n disabled={!canEdit || !exitFloorId}\n placeholder={\n exitFloorId\n ? 'Choose an escalator on that floor'\n : 'Choose a floor first'\n }\n searchable\n options={landingOptions(landingsOnExitFloor, 'escalator')}\n onChange={pickExitLanding}\n />\n </label>\n {partner ? (\n <p className=\"eyeon-map-rail__hint\">\n Linked: {shape.key} → {partner.key} ({levelName(shape.levelId)} →{' '}\n {levelName(partner.levelId)}, {connector?.direction ?? 'up'})\n </p>\n ) : null}\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\n </button>\n </div>\n ) : null}\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)} ·{' '}\n <span className=\"eyeon-map-rail__row-id\">{item.key}</span>\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 Floor\n <ModernSelect\n ariaLabel=\"Add stop floor\"\n value={stopFloorId}\n disabled={!canEdit || addFloors.length === 0}\n placeholder=\"Choose a floor\"\n options={addFloors.map((level) => ({\n value: String(level.id),\n label: level.name,\n }))}\n onChange={setStopFloorId}\n />\n </label>\n <label className=\"eyeon-map-rail__field\">\n Elevator Point\n <ModernSelect\n ariaLabel=\"Elevator Point\"\n value=\"\"\n disabled={!canEdit || !stopFloorId}\n placeholder={\n stopFloorId\n ? 'Choose an elevator on that floor'\n : 'Choose a floor first'\n }\n searchable\n options={landingOptions(landingsOnStopFloor, 'elevator')}\n onChange={pickElevatorStop}\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\n {onSaveAssignment ? (\n <div className=\"eyeon-map-assign\">\n <div className=\"eyeon-map-inspector__heading\">Design</div>\n <AssignmentStyleFields\n form={styleForm}\n canEdit={canEdit}\n storeDefaultColor={storeDefaultColor}\n storeTextColor={storeTextColor}\n textColorLabel=\"Icon Color\"\n onPatch={patchStyle}\n />\n </div>\n ) : null}\n </div>\n );\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: 'Open to Below',\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\n/**\n * Types staff set in Edit Map. Text and entrance markers come from\n * their own tools, not this dropdown.\n */\nexport const EDITOR_TYPE_KINDS: ShapeKind[] = [\n 'unit',\n 'amenity',\n 'kiosk_screen',\n 'connector',\n 'void',\n];\n\nconst TOOL_ONLY_KINDS: ShapeKind[] = ['label', 'wall'];\n\nexport function inspectorShowsType(kind: ShapeKind): boolean {\n return !TOOL_ONLY_KINDS.includes(kind);\n}\n\n/** Type dropdown: curated kinds, and the current kind if it is outside that list. */\nexport function inspectorTypeKinds(current?: ShapeKind | null): ShapeKind[] {\n if (\n current &&\n !EDITOR_TYPE_KINDS.includes(current) &&\n inspectorShowsType(current)\n ) {\n return [...EDITOR_TYPE_KINDS, current];\n }\n return EDITOR_TYPE_KINDS;\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 { assignmentHasTarget, 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 customLabel?: string | null;\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 isStoreShapeKind(kind: string): boolean {\n return kind === 'unit' || kind === 'parking_zone';\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 &&\n assignment.targetType === 'amenity' &&\n (assignment.amenityId != null || Boolean(assignment.customLabel?.trim())),\n );\n}\n\nexport function isKioskAssigned(assignment: AssignmentLike | null | undefined): boolean {\n return Boolean(\n assignment &&\n assignment.targetType === 'kiosk' &&\n (assignment.kioskId != null || Boolean(assignment.customLabel?.trim())),\n );\n}\n\nexport function isPolygonAssigned(assignment: AssignmentLike | null | undefined): boolean {\n return assignmentHasTarget(assignment);\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 / kiosk polygons, plus unassigned of each kind. */\nexport function railAssignmentGroups<T extends AssignableShape>(\n shapes: T[],\n assignments: AssignmentLike[],\n): {\n stores: T[];\n amenities: T[];\n kiosks: T[];\n unassignedStores: T[];\n unassignedAmenities: T[];\n unassignedKiosks: T[];\n unassigned: T[];\n} {\n const byShape = assignmentByShapeId(assignments);\n const stores: T[] = [];\n const amenities: T[] = [];\n const kiosks: T[] = [];\n const unassignedStores: T[] = [];\n const unassignedAmenities: T[] = [];\n const unassignedKiosks: 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 (isKioskAssigned(assignment)) kiosks.push(shape);\n else if (isAssignableKind(shape.kind) && !isPolygonAssigned(assignment)) {\n unassigned.push(shape);\n if (isStoreShapeKind(shape.kind)) unassignedStores.push(shape);\n else if (shape.kind === 'amenity') unassignedAmenities.push(shape);\n else if (shape.kind === 'kiosk_screen') unassignedKiosks.push(shape);\n }\n }\n return {\n stores,\n amenities,\n kiosks,\n unassignedStores,\n unassignedAmenities,\n unassignedKiosks,\n unassigned,\n };\n}\n","import type { MapAssignKiosk } from '../core';\n\nexport type KioskShapeOption = {\n id: number;\n key: string;\n kind: string;\n orphanedAt?: string | null;\n};\n\nexport type CatalogKioskAssignment = {\n shapeId: number;\n kioskId?: number | null;\n};\n\nexport function isKioskScreenKind(kind: string): boolean {\n return kind === 'kiosk_screen';\n}\n\nexport function kioskScreenShapes<T extends KioskShapeOption>(shapes: T[]): T[] {\n return shapes.filter((shape) => isKioskScreenKind(shape.kind) && !shape.orphanedAt);\n}\n\nexport function catalogKioskShapeOptions(\n shapes: KioskShapeOption[],\n): Array<{ value: string; label: string }> {\n return kioskScreenShapes(shapes).map((shape) => ({\n value: String(shape.id),\n label: shape.key,\n }));\n}\n\nexport function shapeIdForCatalogKiosk(\n kioskId: number,\n assignments: CatalogKioskAssignment[],\n): number | null {\n return assignments.find((row) => row.kioskId === kioskId)?.shapeId ?? null;\n}\n\nexport function leftoverCatalogKiosks<T extends { id: number }>(\n kiosks: T[],\n assignments: CatalogKioskAssignment[],\n): T[] {\n const used = new Set(\n assignments\n .map((row) => row.kioskId)\n .filter((id): id is number => id != null),\n );\n return kiosks.filter((kiosk) => !used.has(kiosk.id));\n}\n\nexport function catalogKioskRowLabel(\n kiosk: MapAssignKiosk,\n assignedKey: string | null,\n): { title: string; id: string; tags: string[] } {\n return {\n title: kiosk.name.trim() || `Kiosk ${kiosk.id}`,\n id: `kiosk-${kiosk.id}`,\n tags: assignedKey ? [assignedKey] : ['Unlinked'],\n };\n}\n","import { compareBuildingFloors } from '../core';\n\n/** Title + tags for Map options shape lists (Stores, Amenities, …). */\nexport function railRowLabels(input: {\n key: string;\n kindLabel: string;\n levelName: string;\n assignedName?: string | null;\n /** Kind tag is only for the Unassigned module (mixed types). */\n showKindTag?: boolean;\n}): { title: string | null; id: string; tags: string[] } {\n const name = input.assignedName?.trim() || null;\n const tags = [input.levelName];\n if (input.showKindTag) tags.push(input.kindLabel);\n return { title: name, id: input.key, tags };\n}\n\nexport const RAIL_ITEM_SECTIONS = [\n 'stores',\n 'amenities',\n 'kiosks',\n 'unassigned',\n 'escalators',\n 'elevators',\n] as const;\n\nexport type RailItemSection = (typeof RAIL_ITEM_SECTIONS)[number];\n\nexport function isRailItemSection(\n section: string | null,\n): section is RailItemSection {\n return (\n section != null &&\n (RAIL_ITEM_SECTIONS as readonly string[]).includes(section)\n );\n}\n\n/** Third sidebar screen: field options for the selected list item. */\nexport function railShowsItemOptions(\n section: string | null,\n selectedCount: number,\n): boolean {\n return isRailItemSection(section) && selectedCount > 0;\n}\n\ntype RailLevel = {\n id: number;\n kind: string;\n ordering: number;\n levelIndex: number;\n};\n\n/** Outdoor first, then the lowest building floor, then each floor above it. */\nexport function railListLevelOrder<T extends RailLevel>(levels: T[]): T[] {\n const outdoor = levels.filter((level) => level.kind === 'outdoor');\n const floorsLowToHigh = levels\n .filter((level) => level.kind === 'floor')\n .slice()\n .sort(compareBuildingFloors)\n .reverse();\n return [...outdoor, ...floorsLowToHigh];\n}\n\nexport function sortShapesByRailLevel<T extends { levelId: number }>(\n shapes: T[],\n levels: RailLevel[],\n): T[] {\n const indexById = new Map(\n railListLevelOrder(levels).map((level, index) => [level.id, index]),\n );\n return shapes.slice().sort((a, b) => {\n const ai = indexById.get(a.levelId) ?? Number.POSITIVE_INFINITY;\n const bi = indexById.get(b.levelId) ?? Number.POSITIVE_INFINITY;\n return ai - bi;\n });\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’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 DEFAULT_THEME,\n amenityAssignedName,\n kioskAssignedName,\n retailerOptionLabel,\n staticLayerThemeDefaults,\n type CmAmenityCatalogItem,\n type CmAnchor,\n type CmConnector,\n type CmLevel,\n type CmRouteEdge,\n type CmBuilding,\n type CmShapeAssignment,\n type MapAssignKiosk,\n type MapAssignRetailer,\n type StaticLayerThemeKey,\n type ThemeDefaults,\n} from '../../core';\nimport { FieldResetButton } from '../FieldResetButton';\nimport {\n connectorForShape,\n connectorRideLabel,\n escalatorRideLandingLines,\n groupEscalatorRides,\n railConnectorShapes,\n} from '../connectorAssignments';\nimport {\n isTransparentColor,\n normalizeHexColor,\n sameHexColor,\n TRANSPARENT_COLOR,\n} from '../hexColor';\nimport { shapeKindLabel } from '../labels';\nimport { assignmentByShapeId, railAssignmentGroups } from '../railAssignments';\nimport {\n catalogKioskRowLabel,\n leftoverCatalogKiosks,\n shapeIdForCatalogKiosk,\n} from '../railKiosks';\nimport { connectorSpecialIconDataUrl, getAmenityByType } from '../../specialIcons';\nimport {\n railListLevelOrder,\n railRowLabels,\n railShowsItemOptions,\n sortShapesByRailLevel,\n} from '../railListCopy';\nimport {\n FloorsPanel,\n floorsScreenTitle,\n visibleFloorCount,\n type CreateLevelInput,\n type FloorsScreen,\n type UpdateLevelInput,\n} from './FloorsPanel';\nimport { ColorSwatch } from './formRows';\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<\n Pick<CmRouteEdge, 'id' | 'kind' | 'directed' | 'fromAnchorId' | 'toAnchorId'>\n >;\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 selectedShapeIds?: number[];\n onSelectShape: (id: number | null, opts?: { additive?: boolean }) => void;\n onHoverShape?: (id: number | null) => void;\n onListFocus?: () => void;\n retailers?: MapAssignRetailer[];\n kiosks?: MapAssignKiosk[];\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 /** Saved display_kiosks: pick a kiosk shape or delete. */\n catalogKioskPanel?: ReactNode;\n selectedCatalogKioskId?: number | null;\n onSelectCatalogKiosk?: (id: number | null) => void;\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 /** PORTAL: switch this center back to Classic (v1) map. */\n onUseClassicMap?: () => void;\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\nconst HOUSE_OUTDOOR_THEME = staticLayerThemeDefaults();\n\nconst OUTDOOR_COLOR_FIELDS: Array<[StaticLayerThemeKey, string]> = [\n ['GREEN_AREA_COLOR', 'Green Areas'],\n ['WATER_COLOR', 'Water'],\n ['WALKABLE_COLOR', 'Walking Paths'],\n ['PARKING_LANE_COLOR', 'Parking Lanes'],\n ['PARKING_ICON_COLOR', 'Parking Icons'],\n];\n\nfunction SettingsField({\n label,\n onReset,\n children,\n}: {\n label: string;\n onReset?: () => void;\n children: ReactNode;\n}) {\n return (\n <div className=\"eyeon-map-rail__field eyeon-map-rail__field--inline\">\n <span className=\"eyeon-map-rail__field-label\">\n {label}\n {onReset ? <FieldResetButton label={label} onClick={onReset} /> : null}\n </span>\n {children}\n </div>\n );\n}\n\nfunction ColorField({\n label,\n value,\n fallback,\n onChange,\n onReset,\n}: {\n label: string;\n value: string;\n fallback?: string;\n onChange: (hex: string) => void;\n onReset?: () => void;\n}) {\n const transparent = isTransparentColor(value) || !value.trim();\n const [hex, setHex] = useState(transparent ? '' : value);\n\n useEffect(() => {\n setHex(transparent ? '' : value);\n }, [transparent, value]);\n\n const commit = (next: string) => {\n if (!next.trim() || isTransparentColor(next)) {\n setHex('');\n if (!transparent) onChange(TRANSPARENT_COLOR);\n return;\n }\n const normalized = normalizeHexColor(next);\n if (!normalized) {\n setHex(transparent ? '' : value);\n return;\n }\n setHex(normalized);\n if (normalized !== value.toLowerCase() && normalized !== value) onChange(normalized);\n };\n\n return (\n <SettingsField label={label} onReset={onReset}>\n <ColorSwatch\n label={label}\n hex={hex}\n swatch={transparent ? TRANSPARENT_COLOR : value}\n fallback={fallback}\n onHexChange={setHex}\n onCommit={() => commit(hex)}\n onPick={commit}\n />\n </SettingsField>\n );\n}\n\nexport function LeftRail({\n section,\n onSectionChange,\n draft,\n activeLevelId,\n selectedShapeId,\n selectedShapeIds,\n onSelectShape,\n onHoverShape,\n onListFocus,\n retailers = [],\n kiosks = [],\n canFloors,\n canSettings,\n onCreateLevel,\n onUpdateLevel,\n onDeleteLevel,\n onReorderLevels,\n onAutoroute,\n theme,\n onThemeChange,\n assignPanel,\n catalogKioskPanel,\n selectedCatalogKioskId = null,\n onSelectCatalogKiosk,\n editMapPanel,\n wayfindingPanel,\n footer,\n onUseClassicMap,\n}: LeftRailProps) {\n const [floorsScreen, setFloorsScreen] = useState<FloorsScreen>({ mode: 'list' });\n\n useEffect(() => {\n if (section !== 'floors') setFloorsScreen({ mode: 'list' });\n }, [section]);\n\n useEffect(\n () => () => {\n onHoverShape?.(null);\n },\n [section, onHoverShape],\n );\n\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 kioskShapes = assigned.kiosks;\n const unassignedStoreShapes = assigned.unassignedStores;\n const unassignedAmenityShapes = assigned.unassignedAmenities;\n const unassignedKioskShapes = assigned.unassignedKiosks;\n const unassignedShapes = assigned.unassigned;\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 unlinkedEscalators = escalatorShapes.filter(\n (s) => !connectorForShape(s.id, draft.anchors, connectors),\n );\n const escalatorRides = useMemo(() => {\n const rides = groupEscalatorRides(\n connectors,\n draft.anchors,\n draft.edges,\n escalatorShapes,\n );\n const indexById = new Map(\n railListLevelOrder(draft.levels).map((level, index) => [level.id, index]),\n );\n return rides.slice().sort((a, b) => {\n const ai = indexById.get(a.from.levelId) ?? Number.POSITIVE_INFINITY;\n const bi = indexById.get(b.from.levelId) ?? Number.POSITIVE_INFINITY;\n if (ai !== bi) return ai - bi;\n return a.from.key.localeCompare(b.from.key);\n });\n }, [connectors, draft.anchors, draft.edges, draft.levels, escalatorShapes]);\n const linkedElevators = elevatorShapes.filter((s) =>\n connectorForShape(s.id, draft.anchors, connectors),\n );\n const unlinkedElevators = elevatorShapes.filter(\n (s) => !connectorForShape(s.id, draft.anchors, connectors),\n );\n const assignmentById = useMemo(\n () => assignmentByShapeId(draft.assignments),\n [draft.assignments],\n );\n const retailerById = useMemo(() => {\n const counts = new Map<string, number>();\n for (const retailer of retailers) {\n const key = retailer.name.trim().toLowerCase();\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return new Map(\n retailers.map((retailer) => {\n const duplicate =\n (counts.get(retailer.name.trim().toLowerCase()) ?? 0) > 1;\n return [\n retailer.id,\n retailerOptionLabel(retailer, duplicate),\n ] as const;\n }),\n );\n }, [retailers]);\n const amenityById = useMemo(\n () => new Map(draft.amenities.map((item) => [item.id, item.name])),\n [draft.amenities],\n );\n const kioskById = useMemo(\n () => new Map(kiosks.map((item) => [item.id, item.name])),\n [kiosks],\n );\n const assignedNameFor = (shape: {\n id: number;\n kind: string;\n key: string;\n levelId: number;\n }) => {\n const assignment = assignmentById.get(shape.id);\n if (assignment?.retailerId != null) {\n return retailerById.get(assignment.retailerId) ?? null;\n }\n if (assignment?.targetType === 'amenity' || assignment?.amenityId != null) {\n const catalogName =\n assignment.amenityId != null\n ? amenityById.get(assignment.amenityId) ?? null\n : null;\n const fromType = getAmenityByType(assignment.customLabel ?? '')?.name;\n return amenityAssignedName(assignment, catalogName ?? fromType ?? null);\n }\n if (assignment?.targetType === 'kiosk' || assignment?.kioskId != null) {\n return kioskAssignedName(\n assignment,\n assignment.kioskId != null\n ? kioskById.get(assignment.kioskId) ?? null\n : null,\n );\n }\n return connectorRideLabel(\n shape,\n draft.anchors,\n draft.edges,\n connectors,\n draft.shapes,\n draft.levels,\n );\n };\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 selectedIds =\n selectedShapeIds ?? (selectedShapeId != null ? [selectedShapeId] : []);\n const isShapeSelected = (id: number) => selectedIds.includes(id);\n const selectedCatalogKiosk =\n selectedCatalogKioskId != null\n ? kiosks.find((item) => item.id === selectedCatalogKioskId) ?? null\n : null;\n const showingCatalogKiosk =\n section === 'kiosks' && selectedCatalogKiosk != null;\n const showingItemOptions =\n railShowsItemOptions(section, selectedIds.length) || showingCatalogKiosk;\n useEffect(() => {\n if (showingItemOptions) onHoverShape?.(null);\n }, [showingItemOptions, onHoverShape]);\n const itemOptionsTitle = (() => {\n if (showingCatalogKiosk && selectedCatalogKiosk) {\n const linkedId = shapeIdForCatalogKiosk(\n selectedCatalogKiosk.id,\n draft.assignments,\n );\n const linked = linkedId\n ? draft.shapes.find((row) => row.id === linkedId)\n : null;\n return {\n key: selectedCatalogKiosk.name.trim() || `Kiosk ${selectedCatalogKiosk.id}`,\n levelName: linked?.key ?? 'Unlinked',\n };\n }\n if (!showingItemOptions || selectedIds.length !== 1) return null;\n const shape = draft.shapes.find((row) => row.id === selectedIds[0]);\n if (!shape) return null;\n return { key: shape.key, levelName: levelName(shape.levelId) };\n })();\n const selectShapeFromList = (id: number, event: { shiftKey: boolean }) => {\n onSelectCatalogKiosk?.(null);\n onSelectShape(id, { additive: event.shiftKey });\n onListFocus?.();\n };\n const leftoverKiosks = leftoverCatalogKiosks(kiosks, draft.assignments);\n\n const counts: Record<NonNullable<(typeof NAV_ITEMS)[number]['countKey']>, number> = {\n floors: visibleFloorCount(draft.levels),\n stores: storeShapes.length + unassignedStoreShapes.length,\n amenities: amenityShapes.length + unassignedAmenityShapes.length,\n kiosks:\n kioskShapes.length + unassignedKioskShapes.length + leftoverKiosks.length,\n escalators: escalatorShapes.length,\n elevators: elevatorShapes.length,\n unassigned: unassignedShapes.length,\n };\n\n const renderShapeList = (\n shapes: typeof draft.shapes,\n empty: string,\n opts?: {\n kindLabelFor?: (shape: (typeof draft.shapes)[number]) => string;\n showKindTag?: boolean;\n connectorIcon?: 'escalator' | 'elevator';\n connectorAssigned?: boolean;\n },\n ) =>\n shapes.length === 0 ? (\n <p className=\"eyeon-map-rail__hint\">{empty}</p>\n ) : (\n sortShapesByRailLevel(shapes, draft.levels).map((s) => {\n const copy = railRowLabels({\n key: s.key,\n kindLabel: opts?.kindLabelFor?.(s) ?? shapeKindLabel(s.kind),\n levelName: levelName(s.levelId),\n assignedName: assignedNameFor(s),\n showKindTag: opts?.showKindTag,\n });\n const iconUrl = opts?.connectorIcon\n ? connectorSpecialIconDataUrl(\n opts.connectorIcon,\n Boolean(opts.connectorAssigned),\n )\n : undefined;\n return (\n <button\n key={s.id}\n type=\"button\"\n className={\n isShapeSelected(s.id)\n ? 'eyeon-map-rail__row is-active'\n : 'eyeon-map-rail__row'\n }\n onMouseDown={(event) => {\n if (event.shiftKey) event.preventDefault();\n }}\n onMouseEnter={() => onHoverShape?.(s.id)}\n onMouseLeave={() => onHoverShape?.(null)}\n onClick={(event) => selectShapeFromList(s.id, event)}\n >\n {iconUrl ? (\n <img\n className={\n opts?.connectorAssigned\n ? 'eyeon-map-rail__row-icon is-assigned'\n : 'eyeon-map-rail__row-icon'\n }\n src={iconUrl}\n alt=\"\"\n />\n ) : null}\n <span className=\"eyeon-map-rail__row-copy\">\n {copy.title ? (\n <span className=\"eyeon-map-rail__row-title\">{copy.title}</span>\n ) : null}\n <span className=\"eyeon-map-rail__row-meta\">\n <span\n className={\n copy.title\n ? 'eyeon-map-rail__row-id'\n : 'eyeon-map-rail__row-id eyeon-map-rail__row-id--lead'\n }\n >\n {copy.id}\n </span>\n {copy.tags.length > 0 ? (\n <span className=\"eyeon-map-rail__tags\">\n {copy.tags.map((tag) => (\n <span key={`${s.id}-${tag}`} className=\"eyeon-map-rail__tag\">\n {tag}\n </span>\n ))}\n </span>\n ) : null}\n </span>\n </span>\n </button>\n );\n })\n );\n\n const renderEscalatorRideList = () =>\n escalatorRides.map((ride) => {\n const lines = escalatorRideLandingLines(ride, draft.levels);\n const active =\n isShapeSelected(ride.from.id) || isShapeSelected(ride.to.id);\n return (\n <button\n key={ride.connectorId}\n type=\"button\"\n className={\n active\n ? 'eyeon-map-rail__row eyeon-map-rail__row--ride is-active'\n : 'eyeon-map-rail__row eyeon-map-rail__row--ride'\n }\n onMouseDown={(event) => {\n if (event.shiftKey) event.preventDefault();\n }}\n onMouseEnter={() => onHoverShape?.(ride.from.id)}\n onMouseLeave={() => onHoverShape?.(null)}\n onClick={(event) => selectShapeFromList(ride.from.id, event)}\n >\n <span className=\"eyeon-map-rail__row-copy\">\n {lines.map((line) => (\n <span key={line.shapeId} className=\"eyeon-map-rail__row-meta\">\n <span className=\"eyeon-map-rail__row-id eyeon-map-rail__row-id--lead\">\n {line.key}\n </span>\n <span className=\"eyeon-map-rail__tags\">\n <span className=\"eyeon-map-rail__tag\">{line.levelName}</span>\n </span>\n </span>\n ))}\n </span>\n </button>\n );\n });\n\n const renderAssignedUnassigned = (\n assignedList: typeof draft.shapes,\n unassignedList: typeof draft.shapes,\n kindLabelFor?: (shape: (typeof draft.shapes)[number]) => string,\n connectorIcon?: 'escalator' | 'elevator',\n ) => (\n <>\n <div className=\"eyeon-map-rail__heading\">\n Assigned ({assignedList.length})\n </div>\n {assignedList.length > 0\n ? renderShapeList(assignedList, '', {\n kindLabelFor,\n connectorIcon,\n connectorAssigned: true,\n })\n : null}\n <div className=\"eyeon-map-rail__heading\">\n Unassigned ({unassignedList.length})\n </div>\n {unassignedList.length > 0\n ? renderShapeList(unassignedList, '', {\n kindLabelFor,\n connectorIcon,\n connectorAssigned: false,\n })\n : null}\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 if (showingCatalogKiosk) {\n onSelectCatalogKiosk?.(null);\n return;\n }\n if (showingItemOptions) {\n onSelectShape(null);\n onHoverShape?.(null);\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 ) : itemOptionsTitle ? (\n <span className=\"eyeon-map-assign__tag\">{itemOptionsTitle.key}</span>\n ) : (\n SECTION_TITLES[section]\n )}\n </div>\n {itemOptionsTitle ? (\n <span className=\"eyeon-map-rail__tag\">{itemOptionsTitle.levelName}</span>\n ) : null}\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, text, 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 map 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 {showingItemOptions\n ? assignPanel\n : renderAssignedUnassigned(storeShapes, unassignedStoreShapes)}\n </div>\n )}\n\n {section === 'amenities' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions\n ? assignPanel\n : renderAssignedUnassigned(\n amenityShapes,\n unassignedAmenityShapes,\n )}\n </div>\n )}\n\n {section === 'unassigned' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions ? (\n assignPanel\n ) : (\n <>\n <div className=\"eyeon-map-rail__heading\">\n Unassigned ({unassignedShapes.length})\n </div>\n {renderShapeList(\n unassignedShapes,\n 'Every assignable polygon has a link.',\n { showKindTag: true },\n )}\n </>\n )}\n </div>\n )}\n\n {section === 'escalators' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions ? (\n assignPanel\n ) : (\n <>\n <p className=\"eyeon-map-rail__hint\">\n Pick the boarding landing, then the floor and exit landing.\n A linked ride is one row: boarding on top, exit below. Rides\n are one-way.\n </p>\n <div className=\"eyeon-map-rail__heading\">\n Assigned ({escalatorRides.length})\n </div>\n {escalatorRides.length > 0 ? renderEscalatorRideList() : null}\n <div className=\"eyeon-map-rail__heading\">\n Unassigned ({unlinkedEscalators.length})\n </div>\n {unlinkedEscalators.length > 0\n ? renderShapeList(unlinkedEscalators, '')\n : null}\n </>\n )}\n </div>\n )}\n\n {section === 'elevators' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions ? (\n assignPanel\n ) : (\n renderAssignedUnassigned(\n linkedElevators,\n unlinkedElevators,\n undefined,\n 'elevator',\n )\n )}\n </div>\n )}\n\n {section === 'kiosks' && (\n <div className=\"eyeon-map-rail__section\">\n {showingCatalogKiosk\n ? catalogKioskPanel\n : showingItemOptions\n ? assignPanel\n : (\n <>\n {renderAssignedUnassigned(kioskShapes, unassignedKioskShapes)}\n {kiosks.length > 0 ? (\n <>\n <div className=\"eyeon-map-rail__heading\">\n Existing kiosks ({kiosks.length})\n </div>\n <p className=\"eyeon-map-rail__hint\">\n Saved kiosk devices (shared with Classic Map). Open\n one to attach or remove a New map shape — the device\n itself is not deleted.\n </p>\n {kiosks.map((kiosk) => {\n const linkedId = shapeIdForCatalogKiosk(\n kiosk.id,\n draft.assignments,\n );\n const linked = linkedId\n ? draft.shapes.find((row) => row.id === linkedId)\n : null;\n const copy = catalogKioskRowLabel(\n kiosk,\n linked?.key ?? null,\n );\n return (\n <button\n key={kiosk.id}\n type=\"button\"\n className={\n selectedCatalogKioskId === kiosk.id\n ? 'eyeon-map-rail__row is-active'\n : 'eyeon-map-rail__row'\n }\n onClick={() => {\n onSelectShape(null);\n onSelectCatalogKiosk?.(kiosk.id);\n }}\n >\n <span className=\"eyeon-map-rail__row-copy\">\n <span className=\"eyeon-map-rail__row-title\">\n {copy.title}\n </span>\n <span className=\"eyeon-map-rail__row-meta\">\n <span className=\"eyeon-map-rail__row-id\">\n {copy.id}\n </span>\n <span className=\"eyeon-map-rail__tags\">\n {copy.tags.map((tag) => (\n <span\n key={`${kiosk.id}-${tag}`}\n className=\"eyeon-map-rail__tag\"\n >\n {tag}\n </span>\n ))}\n </span>\n </span>\n </span>\n </button>\n );\n })}\n </>\n ) : null}\n </>\n )}\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 {(\n [\n ['ACCENT_COLOR', 'Highlight'],\n ['STORE_DEFAULT_COLOR', 'Stores'],\n ['MAP_BACKGROUND_COLOR', 'Background'],\n ] as const\n ).map(([key, label]) => {\n const house = DEFAULT_THEME[key];\n const customized = !sameHexColor(theme[key], house);\n return (\n <ColorField\n key={key}\n label={label}\n value={theme[key]}\n fallback={house}\n onChange={(hex) => onThemeChange({ [key]: hex })}\n onReset={\n customized\n ? () => onThemeChange({ [key]: house })\n : undefined\n }\n />\n );\n })}\n <SettingsField label=\"Stores Radius\">\n <input\n className=\"eyeon-map-rail__number-sm\"\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 </SettingsField>\n <div className=\"eyeon-map-rail__sep\" role=\"separator\" />\n {OUTDOOR_COLOR_FIELDS.map(([key, label]) => {\n const house = HOUSE_OUTDOOR_THEME[key];\n const customized = !sameHexColor(theme[key], house);\n return (\n <ColorField\n key={key}\n label={label}\n value={theme[key]}\n fallback={house}\n onChange={(hex) => onThemeChange({ [key]: hex })}\n onReset={\n customized\n ? () => onThemeChange({ [key]: house })\n : undefined\n }\n />\n );\n })}\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 {onUseClassicMap || footer ? (\n <div className=\"eyeon-map-rail__footer\">\n {onUseClassicMap ? (\n <button\n type=\"button\"\n className=\"eyeon-map-rail__classic\"\n onClick={onUseClassicMap}\n >\n Use Classic Map\n </button>\n ) : null}\n {footer}\n </div>\n ) : null}\n </aside>\n );\n}\n","import React from 'react';\nimport type { MapAssignKiosk } from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\n\n/**\n * Link a shared display_kiosks device to a New-map kiosk_screen shape.\n * Does NOT delete the physical kiosk — that would break Classic placements,\n * kiosk-electron identity, and display ads. Use Unlink / Remove from New Map.\n */\nexport function CatalogKioskForm({\n kiosk,\n shapeOptions,\n assignedShapeId,\n canEdit,\n onAssign,\n}: {\n kiosk: MapAssignKiosk;\n shapeOptions: Array<{ value: string; label: string }>;\n assignedShapeId: number | null;\n canEdit: boolean;\n onAssign: (shapeId: number | null) => void;\n}) {\n const hasShape = assignedShapeId != null;\n const empty = shapeOptions.length === 0;\n\n return (\n <div className=\"eyeon-map-assign\">\n <p className=\"eyeon-map-rail__hint\">\n Link this saved kiosk device to a kiosk shape on the New map. Removing it\n here only clears the New map placement — the device stays available for\n Classic Map, kiosk apps, and ads.\n </p>\n <ModernSelect\n ariaLabel=\"Kiosk shape\"\n value={hasShape ? String(assignedShapeId) : ''}\n disabled={!canEdit || empty}\n searchable={shapeOptions.length > 8}\n placeholder={empty ? 'No kiosk shapes on the map' : 'Choose a kiosk shape…'}\n options={shapeOptions}\n onChange={(next) => onAssign(next ? Number(next) : null)}\n />\n <div className=\"eyeon-map-assign__actions\">\n {canEdit && hasShape ? (\n <button\n type=\"button\"\n className=\"eyeon-map-assign__unassign\"\n onClick={() => onAssign(null)}\n >\n Remove from New Map\n </button>\n ) : (\n <span />\n )}\n </div>\n </div>\n );\n}\n","import type {\n BatchOp,\n CmShape,\n CmShapeAssignment,\n ShapeGeometry,\n ShapeKind,\n} from '../core';\n\n/** Short, readable prefix for staff-facing shape IDs (`unit-k4n8`). */\nconst SHAPE_KEY_PREFIX: Record<ShapeKind, string> = {\n unit: 'unit',\n amenity: 'amenity',\n kiosk_screen: 'kiosk',\n connector: 'conn',\n entrance: 'entry',\n walkable: 'walk',\n void: 'void',\n wall: 'wall',\n boundary: 'bound',\n floorplate: 'slab',\n decor: 'decor',\n label: 'text',\n zone: 'zone',\n parking_zone: 'park',\n green_area: 'green',\n water: 'water',\n parking_icon: 'picon',\n};\n\n/** No 0/O/1/I/L — keeps IDs short and easy to read. */\nexport const SHAPE_KEY_ALPHABET = 'abcdefghjkmnpqrstuvwxyz23456789';\nexport const SHAPE_KEY_SUFFIX_LENGTH = 4;\n\nexport function shapeKeyPrefix(kind: string): string {\n return SHAPE_KEY_PREFIX[kind as ShapeKind] ?? kind.replace(/_/g, '');\n}\n\nexport function randomShapeKeySuffix(\n length = SHAPE_KEY_SUFFIX_LENGTH,\n): string {\n const bytes = new Uint8Array(length);\n globalThis.crypto.getRandomValues(bytes);\n let out = '';\n for (let i = 0; i < length; i++) {\n out += SHAPE_KEY_ALPHABET[bytes[i]! % SHAPE_KEY_ALPHABET.length];\n }\n return out;\n}\n\nconst SHAPE_KEY_PATTERN = /^[a-z]+-[a-z0-9]{4}$/;\n\n/** True for the short IDs we mint (`unit-k4n8`), not SVG ids like `unit-101`. */\nexport function isAllocatedShapeKey(key: string): boolean {\n return SHAPE_KEY_PATTERN.test(key);\n}\n\nexport function liveShapeKeysOnLevel(\n shapes: Array<{\n levelId: number;\n key: string;\n orphanedAt?: string | null;\n }>,\n levelId: number,\n): string[] {\n return shapes\n .filter((shape) => shape.levelId === levelId && !shape.orphanedAt)\n .map((shape) => shape.key);\n}\n\nexport function copyDestinationLevels<T extends { id: number }>(\n levels: T[],\n currentLevelId: number,\n): T[] {\n return levels.filter((level) => level.id !== currentLevelId);\n}\n\n/**\n * Mint a short unique key for a new or copied shape.\n * `suffix` is injectable so tests can pin the random part.\n */\nexport function allocShapeKey(\n kind: string,\n taken: Iterable<string>,\n suffix: () => string = randomShapeKeySuffix,\n): string {\n const prefix = shapeKeyPrefix(kind);\n const used = taken instanceof Set ? taken : new Set(taken);\n for (let i = 0; i < 24; i++) {\n const key = `${prefix}-${suffix()}`;\n if (!used.has(key)) return key;\n }\n let n = 2;\n while (used.has(`${prefix}-${n}`)) n += 1;\n return `${prefix}-${n}`;\n}\n\nexport function cloneShapeGeometry(geometry: ShapeGeometry): ShapeGeometry {\n return {\n paths: geometry.paths.map((path) => ({ d: path.d, closed: path.closed })),\n polygons: geometry.polygons.map((ring) =>\n ring.map((point) => ({ x: point.x, y: point.y })),\n ),\n };\n}\n\nexport function copyShapeToLevelOps(args: {\n shape: CmShape;\n assignment?: CmShapeAssignment | null;\n targetLevelId: number;\n shapes: Array<{\n id: number;\n levelId: number;\n key: string;\n orphanedAt?: string | null;\n }>;\n allocId: () => number;\n allocKey?: (kind: string, taken: Iterable<string>) => string;\n}): { ops: BatchOp[]; shapeId: number; key: string } | null {\n const { shape, targetLevelId } = args;\n if (targetLevelId === shape.levelId) return null;\n const taken = liveShapeKeysOnLevel(args.shapes, targetLevelId);\n const id = args.allocId();\n const key = (args.allocKey ?? allocShapeKey)(shape.kind, taken);\n const ops: BatchOp[] = [\n {\n op: 'upsert_shape',\n shape: {\n id,\n levelId: targetLevelId,\n key,\n kind: shape.kind,\n geometry: cloneShapeGeometry(shape.geometry),\n bbox: { ...shape.bbox },\n zIndex: shape.zIndex,\n style: { ...shape.style },\n label: { ...shape.label },\n sourceSvgId: null,\n origin: 'manual',\n geometryLocked: true,\n },\n },\n ];\n if (args.assignment) {\n ops.push({\n op: 'upsert_assignment',\n assignment: { ...args.assignment, shapeId: id },\n });\n }\n return { ops, shapeId: id, key };\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\nimport type {\n AssignmentLayerType,\n CmAmenityCatalogItem,\n CmShape,\n CmShapeAssignment,\n LabelAlign,\n MapAssignKiosk,\n MapAssignRetailer,\n} from '../../core';\nimport {\n assignmentHasTarget,\n DEFAULT_LABEL_ALIGN,\n emptyShapeAssignment,\n normalizeLabelAlign,\n parseShapeAssignment,\n retailerOptionLabel,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport {\n amenityAssignOptions,\n amenityCatalogIdForType,\n amenityTypeFromCatalogId,\n} from '../../specialIcons';\nimport { isAssignableKind } from '../railAssignments';\nimport { AssignmentStyleFields } from './AssignmentStyleFields';\nimport { AlignRow } from './formRows';\n\nconst RETAIL_LAYER_TYPES: AssignmentLayerType[] = [\n 'retail_name',\n 'retail_logo',\n 'retail_text',\n];\n\nexport interface AssignFormProps {\n shape: CmShape;\n assignment: CmShapeAssignment | null;\n amenities: CmAmenityCatalogItem[];\n retailers: MapAssignRetailer[];\n kiosks?: MapAssignKiosk[];\n canEdit: boolean;\n storeDefaultColor: string;\n storeTextColor: string;\n onChange: (assignment: CmShapeAssignment) => void;\n onClear: () => void;\n copyAction?: ReactNode;\n}\n\nexport function AssignForm({\n shape,\n assignment,\n amenities,\n retailers,\n kiosks = [],\n canEdit,\n storeDefaultColor,\n storeTextColor,\n onChange,\n onClear,\n copyAction,\n}: AssignFormProps) {\n const [form, setForm] = useState<CmShapeAssignment>(() =>\n assignment\n ? parseShapeAssignment(assignment, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind),\n );\n const formRef = useRef(form);\n formRef.current = form;\n\n useEffect(() => {\n setForm(\n assignment\n ? parseShapeAssignment(assignment, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind),\n );\n }, [shape, assignment]);\n\n const commit = useCallback(\n (next: CmShapeAssignment) => {\n setForm(next);\n if (!canEdit) return;\n onChange(parseShapeAssignment(next, shape.kind));\n },\n [canEdit, onChange, shape.kind],\n );\n\n const patch = useCallback(\n (partial: Partial<CmShapeAssignment>) => {\n commit({ ...formRef.current, shapeId: shape.id, ...partial });\n },\n [commit, shape.id],\n );\n\n const nameCounts = useMemo(() => {\n const counts = new Map<string, number>();\n for (const retailer of retailers) {\n const key = retailer.name.trim().toLowerCase();\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return counts;\n }, [retailers]);\n\n const retailerOptions = useMemo(\n () =>\n retailers.map((retailer) => {\n const duplicate =\n (nameCounts.get(retailer.name.trim().toLowerCase()) ?? 0) > 1;\n return {\n value: String(retailer.id),\n label: retailerOptionLabel(retailer, duplicate),\n };\n }),\n [nameCounts, retailers],\n );\n\n const amenityOptions = useMemo(() => amenityAssignOptions(), []);\n const selectedAmenityType =\n amenityTypeFromCatalogId(form.amenityId, amenities) ||\n form.customLabel ||\n '';\n\n const kioskCatalogName = useMemo(() => {\n if (form.kioskId == null) return null;\n return kiosks.find((item) => item.id === form.kioskId)?.name ?? null;\n }, [form.kioskId, kiosks]);\n\n const showTextColor = [\n 'retail_name',\n 'retail_text',\n 'custom_text',\n 'kiosk',\n 'amenity',\n ].includes(form.layerType);\n const textColorLabel =\n form.layerType === 'kiosk' || form.layerType === 'amenity'\n ? 'Icon Color'\n : 'Text Color';\n\n const hasAssignment = assignmentHasTarget(form);\n\n if (!isAssignableKind(shape.kind)) return null;\n\n return (\n <div className=\"eyeon-map-assign\">\n {shape.kind === 'unit' || shape.kind === 'parking_zone' ? (\n <>\n <ModernSelect\n ariaLabel=\"Choose a Retailer\"\n value={form.retailerId != null ? String(form.retailerId) : ''}\n disabled={!canEdit}\n searchable\n placeholder=\"Choose a Retailer…\"\n options={retailerOptions}\n onChange={(next) => {\n const retailerId = next ? Number(next) : null;\n const retailer = retailers.find((item) => item.id === retailerId);\n const layerType = RETAIL_LAYER_TYPES.includes(form.layerType)\n ? form.layerType\n : 'retail_name';\n patch({\n targetType: retailerId ? 'retailer' : 'none',\n retailerId,\n amenityId: null,\n kioskId: null,\n unitStatus: retailerId ? 'occupied' : 'vacant',\n layerType,\n customLabel:\n layerType === 'retail_name'\n ? retailer?.name ?? null\n : form.customLabel,\n customImageKey:\n layerType === 'retail_logo'\n ? retailer?.logoKey ?? form.customImageKey\n : form.customImageKey,\n });\n }}\n />\n {form.retailerId != null ? (\n <div className=\"eyeon-map-assign__tabs\" role=\"group\" aria-label=\"Display\">\n <button\n type=\"button\"\n className={\n form.layerType === 'retail_name' ? 'is-active' : undefined\n }\n disabled={!canEdit}\n onClick={() => {\n const retailer = retailers.find(\n (item) => item.id === form.retailerId,\n );\n patch({\n layerType: 'retail_name',\n customLabel: retailer?.name ?? form.customLabel,\n });\n }}\n >\n Retail Name\n </button>\n <button\n type=\"button\"\n className={\n form.layerType === 'retail_logo' ? 'is-active' : undefined\n }\n disabled={!canEdit}\n onClick={() => {\n const retailer = retailers.find(\n (item) => item.id === form.retailerId,\n );\n patch({\n layerType: 'retail_logo',\n customImageKey:\n retailer?.logoKey ?? form.customImageKey,\n });\n }}\n >\n Retail Logo\n </button>\n <button\n type=\"button\"\n className={\n form.layerType === 'retail_text' ? 'is-active' : undefined\n }\n disabled={!canEdit}\n onClick={() => patch({ layerType: 'retail_text' })}\n >\n Custom Text\n </button>\n </div>\n ) : null}\n {form.retailerId != null && form.layerType === 'retail_text' ? (\n <>\n <label className=\"eyeon-map-rail__field\">\n Text\n <textarea\n rows={3}\n disabled={!canEdit}\n value={form.customLabel ?? ''}\n style={{\n textAlign: normalizeLabelAlign(\n form.align ?? shape.label.align,\n ),\n }}\n onChange={(e) => patch({ customLabel: e.target.value || null })}\n />\n </label>\n <AlignRow\n value={form.align ?? shape.label.align ?? DEFAULT_LABEL_ALIGN}\n disabled={!canEdit}\n onChange={(align: LabelAlign) => patch({ align })}\n />\n </>\n ) : null}\n </>\n ) : null}\n\n {shape.kind === 'amenity' ? (\n <ModernSelect\n ariaLabel=\"Choose Amenity\"\n value={selectedAmenityType}\n disabled={!canEdit}\n searchable\n placeholder=\"Choose Amenity…\"\n options={amenityOptions}\n onChange={(next) => {\n const amenityId = next\n ? amenityCatalogIdForType(next, amenities)\n : null;\n patch({\n targetType: next ? 'amenity' : 'none',\n amenityId,\n customLabel: next || null,\n retailerId: null,\n kioskId: null,\n layerType: 'amenity',\n });\n }}\n />\n ) : null}\n\n {shape.kind === 'kiosk_screen' ? (\n <KioskNameField\n value={form.customLabel ?? kioskCatalogName ?? ''}\n disabled={!canEdit}\n onChange={(name) => {\n const trimmed = name.trim();\n patch({\n targetType: trimmed ? 'kiosk' : 'none',\n kioskId: trimmed ? form.kioskId : null,\n customLabel: name === '' ? null : name,\n retailerId: null,\n amenityId: null,\n layerType: 'kiosk',\n });\n }}\n />\n ) : null}\n\n <AssignmentStyleFields\n form={form}\n canEdit={canEdit}\n storeDefaultColor={storeDefaultColor}\n storeTextColor={storeTextColor}\n textColorLabel={textColorLabel}\n showTextColor={showTextColor}\n onPatch={patch}\n />\n {canEdit ? (\n <div className=\"eyeon-map-assign__actions\">\n {copyAction}\n <button\n type=\"button\"\n className=\"eyeon-map-assign__unassign\"\n onClick={() => {\n if (!hasAssignment) return;\n onClear();\n }}\n disabled={!hasAssignment}\n >\n Unassign\n </button>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction KioskNameField({\n value,\n disabled,\n onChange,\n}: {\n value: string;\n disabled: boolean;\n onChange: (name: string) => void;\n}) {\n return (\n <label className=\"eyeon-map-rail__field\">\n Name\n <input\n type=\"text\"\n autoComplete=\"off\"\n spellCheck={false}\n disabled={disabled}\n placeholder=\"e.g. Food court entrance\"\n aria-label=\"Kiosk name\"\n maxLength={50}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n />\n </label>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport type { CmShape, CmShapeAssignment } from '../../core';\nimport {\n assignNumberFromDraft,\n bulkAssignFormState,\n DEFAULT_ASSIGNMENT_SIZE,\n emptyShapeAssignment,\n parseShapeAssignment,\n type BulkAssignPatch,\n} from '../../core';\nimport { FieldResetButton } from '../FieldResetButton';\nimport {\n isTransparentColor,\n normalizeHexColor,\n TRANSPARENT_COLOR,\n} from '../hexColor';\nimport { isAssignableKind } from '../railAssignments';\nimport { ColorSwatch } from './formRows';\n\nexport function BulkAssignForm({\n shapes,\n assignments,\n canEdit,\n storeDefaultColor,\n storeTextColor,\n onPatch,\n}: {\n shapes: CmShape[];\n assignments: CmShapeAssignment[];\n canEdit: boolean;\n storeDefaultColor: string;\n storeTextColor: string;\n onPatch: (patch: BulkAssignPatch) => void;\n}) {\n const rows = shapes\n .filter((shape) => isAssignableKind(shape.kind))\n .map((shape) => {\n const existing = assignments.find((row) => row.shapeId === shape.id);\n return existing\n ? parseShapeAssignment(existing, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind);\n });\n const common = bulkAssignFormState(rows);\n\n return (\n <div className=\"eyeon-map-assign\">\n <div className=\"eyeon-map-assign__tags\">\n {shapes.map((shape) => (\n <span key={shape.id} className=\"eyeon-map-assign__tag\">\n {shape.key}\n </span>\n ))}\n </div>\n <BulkSizeRow\n value={common.size}\n disabled={!canEdit}\n onCommit={(size) => onPatch({ size })}\n />\n <BulkColorRow\n label=\"BG Color\"\n value={common.bgColor}\n fallback={storeDefaultColor}\n mixed={common.bgColorMixed}\n disabled={!canEdit}\n onCommit={(bgColor) => onPatch({ bgColor })}\n />\n <BulkColorRow\n label=\"Text Color\"\n value={common.textColor}\n fallback={storeTextColor}\n mixed={common.textColorMixed}\n disabled={!canEdit}\n onCommit={(textColor) => onPatch({ textColor })}\n />\n </div>\n );\n}\n\nfunction BulkSizeRow({\n value,\n disabled,\n onCommit,\n}: {\n value: number | '';\n disabled: boolean;\n onCommit: (size: number) => void;\n}) {\n const [draft, setDraft] = useState(() => (value === '' ? '' : String(value)));\n const focused = useRef(false);\n\n useEffect(() => {\n if (!focused.current) setDraft(value === '' ? '' : String(value));\n }, [value]);\n\n const emitIfComplete = (raw: string, persistIncomplete: boolean) => {\n if (!raw.trim()) {\n setDraft('');\n return;\n }\n const parsed = assignNumberFromDraft(raw);\n if (!parsed.complete) {\n setDraft(raw);\n return;\n }\n setDraft(String(parsed.render));\n onCommit(parsed.render);\n if (persistIncomplete) setDraft(String(parsed.render));\n };\n\n const step = (delta: number) => {\n const base = value === '' ? DEFAULT_ASSIGNMENT_SIZE : value;\n const next = base + delta;\n setDraft(String(next));\n onCommit(next);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">Size</span>\n <div className=\"eyeon-map-assign__control\">\n <div className=\"eyeon-map-assign__stepper\">\n <button\n type=\"button\"\n disabled={disabled}\n aria-label=\"Decrease Size\"\n onClick={() => step(-1)}\n >\n −\n </button>\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={draft}\n disabled={disabled}\n aria-label=\"Size\"\n onFocus={() => {\n focused.current = true;\n }}\n onChange={(e) => emitIfComplete(e.target.value, false)}\n onBlur={() => {\n focused.current = false;\n emitIfComplete(draft, true);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n return;\n }\n if (e.key !== 'ArrowUp' && e.key !== 'ArrowDown') return;\n e.preventDefault();\n if (disabled) return;\n const delta = e.key === 'ArrowUp' ? 1 : -1;\n const parsed = assignNumberFromDraft(draft);\n const base = parsed.complete\n ? parsed.render\n : value === ''\n ? DEFAULT_ASSIGNMENT_SIZE\n : value;\n const next = base + delta;\n setDraft(String(next));\n onCommit(next);\n }}\n />\n <button\n type=\"button\"\n disabled={disabled}\n aria-label=\"Increase Size\"\n onClick={() => step(1)}\n >\n +\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nfunction BulkColorRow({\n label,\n value,\n fallback,\n mixed,\n disabled,\n onCommit,\n}: {\n label: string;\n value: string;\n fallback: string;\n mixed: boolean;\n disabled: boolean;\n onCommit: (hex: string | null) => void;\n}) {\n const transparent = !mixed && isTransparentColor(value);\n const display = mixed\n ? ''\n : transparent\n ? TRANSPARENT_COLOR\n : value.trim()\n ? value\n : fallback;\n const customized = mixed || Boolean(value.trim());\n const [hex, setHex] = useState(transparent ? '' : display);\n\n useEffect(() => {\n setHex(transparent ? '' : display);\n }, [display, transparent]);\n\n const commit = (next: string) => {\n if (!next.trim() || isTransparentColor(next)) {\n setHex('');\n if (!mixed) onCommit(TRANSPARENT_COLOR);\n return;\n }\n const normalized = normalizeHexColor(next);\n if (!normalized) {\n setHex(transparent ? '' : display);\n return;\n }\n setHex(normalized);\n onCommit(normalized);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">\n {label}\n {customized ? (\n <FieldResetButton\n label={label}\n disabled={disabled}\n onClick={() => onCommit(null)}\n />\n ) : null}\n </span>\n <ColorSwatch\n label={label}\n hex={hex}\n swatch={display}\n fallback={fallback}\n disabled={disabled}\n emptyIsTransparent={!mixed}\n onHexChange={setHex}\n onCommit={() => commit(hex)}\n onPick={commit}\n />\n </div>\n );\n}\n","import React, { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport '../../ui/modern-select.css';\n\nfunction Chevron() {\n return (\n <svg\n className=\"eyeon-map-select__chevron\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n aria-hidden\n >\n <path\n d=\"M2.5 4.5 6 8l3.5-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function CopyToLevelButton({\n destinations,\n disabled = false,\n onCopyToLevel,\n}: {\n destinations: Array<{ id: number; name: string }>;\n disabled?: boolean;\n onCopyToLevel: (levelId: number) => string | null;\n}) {\n const listId = useId();\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [menuPos, setMenuPos] = useState<{\n top: number;\n left: number;\n width: number;\n maxHeight: number;\n } | null>(null);\n\n const close = useCallback(() => {\n setOpen(false);\n setMenuPos(null);\n }, []);\n\n const updateMenuPos = useCallback(() => {\n const el = buttonRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom - 8;\n const spaceAbove = rect.top - 8;\n const maxHeight = Math.min(280, Math.max(spaceBelow, spaceAbove, 120));\n const openAbove = spaceBelow < 160 && spaceAbove > spaceBelow;\n setMenuPos({\n top: openAbove ? Math.max(8, rect.top - maxHeight - 4) : rect.bottom + 4,\n left: rect.left,\n width: Math.max(rect.width, 168),\n maxHeight,\n });\n }, []);\n\n const destinationKey = destinations.map((level) => level.id).join(',');\n useEffect(() => {\n setError(null);\n close();\n }, [close, destinationKey]);\n\n useEffect(() => {\n if (!open) return;\n updateMenuPos();\n const onDoc = (e: MouseEvent) => {\n const t = e.target as Node;\n if (buttonRef.current?.contains(t) || menuRef.current?.contains(t)) return;\n close();\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n close();\n buttonRef.current?.blur();\n }\n };\n const onMove = () => updateMenuPos();\n document.addEventListener('mousedown', onDoc);\n document.addEventListener('keydown', onKey);\n window.addEventListener('resize', onMove);\n window.addEventListener('scroll', onMove, true);\n return () => {\n document.removeEventListener('mousedown', onDoc);\n document.removeEventListener('keydown', onKey);\n window.removeEventListener('resize', onMove);\n window.removeEventListener('scroll', onMove, true);\n };\n }, [close, open, updateMenuPos]);\n\n if (destinations.length === 0) return null;\n\n const menu =\n open && menuPos && !disabled\n ? createPortal(\n <div\n ref={menuRef}\n id={listId}\n className=\"eyeon-map-select__menu\"\n role=\"listbox\"\n aria-label=\"Duplicate to floor\"\n style={{\n top: menuPos.top,\n left: menuPos.left,\n width: menuPos.width,\n maxHeight: menuPos.maxHeight,\n }}\n >\n <ul className=\"eyeon-map-select__list\">\n {destinations.map((level) => (\n <li key={level.id} role=\"option\">\n <button\n type=\"button\"\n className=\"eyeon-map-select__option\"\n onClick={() => {\n const nextError = onCopyToLevel(level.id);\n setError(nextError);\n if (!nextError) close();\n }}\n >\n {level.name}\n </button>\n </li>\n ))}\n </ul>\n </div>,\n document.body,\n )\n : null;\n\n return (\n <div className=\"eyeon-map-assign__copy-wrap\">\n <button\n ref={buttonRef}\n type=\"button\"\n className={\n open ? 'eyeon-map-assign__copy is-open' : 'eyeon-map-assign__copy'\n }\n aria-label=\"Duplicate to another floor\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listId : undefined}\n disabled={disabled}\n onClick={() => {\n if (disabled) return;\n setError(null);\n setOpen((value) => !value);\n }}\n >\n Duplicate\n <Chevron />\n </button>\n {menu}\n {error ? (\n <p className=\"eyeon-map-rail__hint\" style={{ color: '#b91c1c' }}>\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ShapeLabel } from '../../core';\nimport { DEFAULT_ENTRANCE_SIZE, clampEntranceSize } from '../entranceIcon';\nimport {\n ColorRow,\n RotateIcon,\n StepperRow,\n nextQuarterTurn,\n stepWholeNumber,\n} from './formRows';\n\nconst MIN_ICON_SIZE = 8;\ntype StepKey = 'size' | 'rotate';\n\nexport function EntranceIconForm({\n label,\n canEdit,\n storeTextColor,\n onChange,\n}: {\n label: ShapeLabel;\n canEdit: boolean;\n storeTextColor: string;\n onChange: (label: ShapeLabel, opts?: { live?: boolean }) => void;\n}) {\n const [size, setSize] = useState(label.size ?? DEFAULT_ENTRANCE_SIZE);\n const [rotate, setRotate] = useState(label.rotate ?? 0);\n const sizeRef = useRef(size);\n const rotateRef = useRef(rotate);\n sizeRef.current = size;\n rotateRef.current = rotate;\n const intervals = useRef<Partial<Record<StepKey, number>>>({});\n\n useEffect(() => {\n setSize(label.size ?? DEFAULT_ENTRANCE_SIZE);\n setRotate(label.rotate ?? 0);\n }, [label]);\n\n useEffect(\n () => () => {\n (Object.values(intervals.current) as number[]).forEach((id) =>\n window.clearInterval(id),\n );\n },\n [],\n );\n\n const commit = useCallback(\n (partial: Partial<ShapeLabel>, opts?: { live?: boolean }) => {\n if (!canEdit) return;\n const nextSize = clampEntranceSize(partial.size ?? sizeRef.current);\n const nextRotate = partial.rotate ?? rotateRef.current;\n if (partial.size != null) {\n setSize(nextSize);\n sizeRef.current = nextSize;\n }\n if (partial.rotate != null) {\n setRotate(nextRotate);\n rotateRef.current = nextRotate;\n }\n onChange(\n {\n ...label,\n ...partial,\n size: nextSize,\n rotate: nextRotate,\n },\n opts,\n );\n },\n [canEdit, label, onChange],\n );\n\n const bump = (key: StepKey, delta: number) => {\n if (key === 'size') {\n commit({\n size: clampEntranceSize(stepWholeNumber(sizeRef.current, delta)),\n });\n return;\n }\n commit({ rotate: stepWholeNumber(rotateRef.current, delta) });\n };\n\n const stopHold = (key: StepKey) => {\n const id = intervals.current[key];\n if (id) {\n window.clearInterval(id);\n intervals.current[key] = undefined;\n }\n };\n\n const startHold = (key: StepKey, delta: number) => {\n stopHold(key);\n intervals.current[key] = window.setInterval(() => bump(key, delta), 200);\n };\n\n const color = label.color ?? '';\n\n return (\n <div className=\"eyeon-map-assign\">\n <StepperRow\n label=\"Size\"\n value={size}\n disabled={!canEdit}\n onChange={(next) => commit({ size: Math.max(MIN_ICON_SIZE, next) })}\n onStep={(delta) => bump('size', delta)}\n onHoldStart={(delta) => startHold('size', delta)}\n onHoldEnd={() => stopHold('size')}\n />\n <ColorRow\n label=\"Color\"\n value={color}\n fallback={storeTextColor}\n disabled={!canEdit}\n onChange={(hex) => commit({ color: hex || undefined })}\n onReset={color ? () => commit({ color: undefined }) : undefined}\n />\n <StepperRow\n label=\"Rotate\"\n value={rotate}\n disabled={!canEdit}\n extra={\n <button\n type=\"button\"\n className=\"eyeon-map-assign__rotate\"\n aria-label=\"Rotate 45 degrees\"\n disabled={!canEdit}\n onClick={() => commit({ rotate: nextQuarterTurn(rotateRef.current) })}\n >\n <RotateIcon />\n </button>\n }\n onChange={(next) => commit({ rotate: next })}\n onStep={(delta) => bump('rotate', delta)}\n onHoldStart={(delta) => startHold('rotate', delta)}\n onHoldEnd={() => stopHold('rotate')}\n />\n </div>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n DEFAULT_LABEL_ALIGN,\n type LabelAlign,\n type ShapeLabel,\n} from '../../core';\nimport { DEFAULT_LABEL_SIZE, DEFAULT_LABEL_TEXT } from '../labelText';\nimport {\n AlignRow,\n ColorRow,\n RotateIcon,\n StepperRow,\n nextQuarterTurn,\n stepWholeNumber,\n} from './formRows';\n\nconst MIN_FONT_SIZE = 8;\ntype StepKey = 'size' | 'rotate';\n\nexport function TextLabelForm({\n label,\n canEdit,\n storeTextColor,\n onChange,\n}: {\n label: ShapeLabel;\n canEdit: boolean;\n storeTextColor: string;\n onChange: (label: ShapeLabel, opts?: { live?: boolean }) => void;\n}) {\n const [text, setText] = useState(label.text ?? '');\n const [size, setSize] = useState(label.size ?? DEFAULT_LABEL_SIZE);\n const [rotate, setRotate] = useState(label.rotate ?? 0);\n const sizeRef = useRef(size);\n const rotateRef = useRef(rotate);\n const textFocused = useRef(false);\n sizeRef.current = size;\n rotateRef.current = rotate;\n const intervals = useRef<Partial<Record<StepKey, number>>>({});\n\n useEffect(() => {\n if (!textFocused.current) setText(label.text ?? '');\n setSize(label.size ?? DEFAULT_LABEL_SIZE);\n setRotate(label.rotate ?? 0);\n }, [label]);\n\n useEffect(\n () => () => {\n (Object.values(intervals.current) as number[]).forEach((id) =>\n window.clearInterval(id),\n );\n },\n [],\n );\n\n const commit = useCallback(\n (partial: Partial<ShapeLabel>, opts?: { live?: boolean }) => {\n if (!canEdit) return;\n const nextSize = Math.max(MIN_FONT_SIZE, partial.size ?? sizeRef.current);\n const nextRotate = partial.rotate ?? rotateRef.current;\n if (partial.size != null) {\n setSize(nextSize);\n sizeRef.current = nextSize;\n }\n if (partial.rotate != null) {\n setRotate(nextRotate);\n rotateRef.current = nextRotate;\n }\n const nextText =\n partial.text === undefined\n ? text\n : partial.text === ''\n ? (label.text ?? DEFAULT_LABEL_TEXT)\n : partial.text;\n onChange(\n {\n ...label,\n ...partial,\n text: nextText,\n size: nextSize,\n rotate: nextRotate,\n },\n opts,\n );\n },\n [canEdit, label, onChange, text],\n );\n\n const bump = (key: StepKey, delta: number) => {\n if (key === 'size') {\n commit({\n size: Math.max(MIN_FONT_SIZE, stepWholeNumber(sizeRef.current, delta)),\n });\n return;\n }\n commit({ rotate: stepWholeNumber(rotateRef.current, delta) });\n };\n\n const stopHold = (key: StepKey) => {\n const id = intervals.current[key];\n if (id) {\n window.clearInterval(id);\n intervals.current[key] = undefined;\n }\n };\n\n const startHold = (key: StepKey, delta: number) => {\n stopHold(key);\n intervals.current[key] = window.setInterval(() => bump(key, delta), 200);\n };\n\n const color = label.color ?? '';\n\n return (\n <div className=\"eyeon-map-assign\">\n <label className=\"eyeon-map-rail__field\">\n Text\n <textarea\n rows={3}\n value={text}\n disabled={!canEdit}\n placeholder=\"Text on the map\"\n aria-label=\"Text\"\n style={{ textAlign: label.align ?? DEFAULT_LABEL_ALIGN }}\n onFocus={() => {\n textFocused.current = true;\n }}\n onChange={(e) => {\n const next = e.target.value;\n setText(next);\n commit({ text: next }, { live: true });\n }}\n onBlur={() => {\n textFocused.current = false;\n const next = text.trim();\n if (next !== text) setText(next);\n commit({ text: next || DEFAULT_LABEL_TEXT });\n }}\n />\n </label>\n <AlignRow\n value={label.align}\n disabled={!canEdit}\n onChange={(align: LabelAlign) => commit({ align })}\n />\n <StepperRow\n label=\"Font size\"\n value={size}\n disabled={!canEdit}\n onChange={(next) => commit({ size: Math.max(MIN_FONT_SIZE, next) })}\n onStep={(delta) => bump('size', delta)}\n onHoldStart={(delta) => startHold('size', delta)}\n onHoldEnd={() => stopHold('size')}\n />\n <ColorRow\n label=\"Text color\"\n value={color}\n fallback={storeTextColor}\n disabled={!canEdit}\n onChange={(hex) => commit({ color: hex || undefined })}\n onReset={color ? () => commit({ color: undefined }) : undefined}\n />\n <StepperRow\n label=\"Rotate\"\n value={rotate}\n disabled={!canEdit}\n extra={\n <button\n type=\"button\"\n className=\"eyeon-map-assign__rotate\"\n aria-label=\"Rotate 45 degrees\"\n disabled={!canEdit}\n onClick={() => commit({ rotate: nextQuarterTurn(rotateRef.current) })}\n >\n <RotateIcon />\n </button>\n }\n onChange={(next) => commit({ rotate: next })}\n onStep={(delta) => bump('rotate', delta)}\n onHoldStart={(delta) => startHold('rotate', delta)}\n onHoldEnd={() => stopHold('rotate')}\n />\n </div>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport type {\n BulkAssignPatch,\n CmAmenityCatalogItem,\n CmShape,\n CmShapeAssignment,\n MapAssignKiosk,\n MapAssignRetailer,\n ShapeKind,\n ShapeLabel,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport { inspectorShowsType, inspectorTypeKinds, SHAPE_KIND_LABELS } from '../labels';\nimport { isAssignableKind } from '../railAssignments';\nimport { copyDestinationLevels } from '../shapeCopy';\nimport { isEntranceIcon } from '../entranceIcon';\nimport { AssignForm } from './AssignForm';\nimport { BulkAssignForm } from './BulkAssignForm';\nimport { CopyToLevelButton } from './CopyToLevelButton';\nimport { EntranceIconForm } from './EntranceIconForm';\nimport { TextLabelForm } from './TextLabelForm';\n\nexport interface InspectorProps {\n shape: CmShape | null;\n assignment: CmShapeAssignment | null;\n amenities: CmAmenityCatalogItem[];\n retailers?: MapAssignRetailer[];\n kiosks?: MapAssignKiosk[];\n /** Other shape keys on the same level — used for uniqueness validation. */\n levelShapeKeys?: string[];\n canEdit: boolean;\n /** Retailer / amenity / kiosk assignment. Off in Edit Map (ID and Type only). */\n showAssignment?: boolean;\n /** Empty-state copy when nothing is selected. */\n emptyHint?: string;\n onRename: (key: string) => void;\n onChangeKind: (kind: ShapeKind) => void;\n onChangeLevel?: (levelId: number) => string | null;\n /** Duplicate the selected shape onto another floor or Outdoor. */\n onCopyToLevel?: (levelId: number) => string | null;\n levels?: Array<{ id: number; name: string }>;\n onDelete?: () => void;\n onClearAssignment?: () => void;\n onSaveAssignment: (assignment: CmShapeAssignment) => void;\n onUpdateLabel?: (label: ShapeLabel, opts?: { live?: boolean }) => void;\n selectedShapes?: CmShape[];\n selectedAssignments?: CmShapeAssignment[];\n onBulkAssign?: (patch: BulkAssignPatch) => void;\n storeDefaultColor: string;\n storeTextColor: string;\n}\n\nexport function Inspector({\n shape,\n assignment,\n amenities,\n retailers = [],\n kiosks = [],\n levelShapeKeys = [],\n canEdit,\n showAssignment = true,\n emptyHint = 'Pick an item from the list below, or click it on the map.',\n onRename,\n onChangeKind,\n onChangeLevel,\n onCopyToLevel,\n levels = [],\n onDelete,\n onClearAssignment,\n onSaveAssignment,\n onUpdateLabel,\n selectedShapes = [],\n selectedAssignments = [],\n onBulkAssign,\n storeDefaultColor,\n storeTextColor,\n}: InspectorProps) {\n const [key, setKey] = useState(shape?.key ?? '');\n const [keyError, setKeyError] = useState<string | null>(null);\n const [levelError, setLevelError] = useState<string | null>(null);\n\n useEffect(() => {\n setKey(shape?.key ?? '');\n setKeyError(null);\n setLevelError(null);\n }, [shape, assignment]);\n\n if (showAssignment && selectedShapes.length > 1 && onBulkAssign) {\n return (\n <div className=\"eyeon-map-inspector\">\n <BulkAssignForm\n key={selectedShapes.map((item) => item.id).join(',')}\n shapes={selectedShapes}\n assignments={selectedAssignments}\n canEdit={canEdit}\n storeDefaultColor={storeDefaultColor}\n storeTextColor={storeTextColor}\n onPatch={onBulkAssign}\n />\n </div>\n );\n }\n\n if (!shape) {\n if (!showAssignment || !emptyHint) return null;\n return (\n <div className=\"eyeon-map-inspector__empty\">\n {emptyHint}\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 ID is already used on this level.');\n return;\n }\n setKeyError(null);\n onRename(key);\n };\n\n const copyDestinations = copyDestinationLevels(levels, shape.levelId);\n const copyButton =\n canEdit && onCopyToLevel && copyDestinations.length > 0 ? (\n <CopyToLevelButton\n destinations={copyDestinations}\n onCopyToLevel={onCopyToLevel}\n />\n ) : null;\n\n if (showAssignment) {\n return (\n <div className=\"eyeon-map-inspector\">\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 {isAssignableKind(shape.kind) ? (\n <AssignForm\n shape={shape}\n assignment={assignment}\n amenities={amenities}\n retailers={retailers}\n kiosks={kiosks}\n canEdit={canEdit}\n storeDefaultColor={storeDefaultColor}\n storeTextColor={storeTextColor}\n onChange={onSaveAssignment}\n onClear={() => onClearAssignment?.()}\n copyAction={copyButton}\n />\n ) : copyButton ? (\n <div className=\"eyeon-map-assign__actions\">{copyButton}</div>\n ) : null}\n </div>\n );\n }\n\n return (\n <div className=\"eyeon-map-inspector\">\n {isEntranceIcon(shape) ? (\n onUpdateLabel ? (\n <EntranceIconForm\n label={shape.label}\n canEdit={canEdit}\n storeTextColor={storeTextColor}\n onChange={onUpdateLabel}\n />\n ) : null\n ) : shape.kind === 'label' ? (\n onUpdateLabel ? (\n <TextLabelForm\n label={shape.label}\n canEdit={canEdit}\n storeTextColor={storeTextColor}\n onChange={onUpdateLabel}\n />\n ) : null\n ) : (\n <>\n <label className=\"eyeon-map-rail__field\">\n ID\n <input\n className=\"eyeon-map-rail__id-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\n {inspectorShowsType(shape.kind) ? (\n <label className=\"eyeon-map-rail__field\">\n Type\n <ModernSelect\n ariaLabel=\"Type\"\n value={shape.kind}\n disabled={!canEdit}\n searchable={false}\n options={inspectorTypeKinds(shape.kind).map((k) => ({\n value: k,\n label: SHAPE_KIND_LABELS[k],\n }))}\n onChange={(next) => onChangeKind(next as ShapeKind)}\n />\n </label>\n ) : null}\n {shape.kind === 'void' ? (\n <p className=\"eyeon-map-rail__hint\">\n Open to Below looks through to the floor below — walkways and\n floor plates are cut out so the lower level shows through.\n </p>\n ) : null}\n </>\n )}\n\n {onChangeLevel && levels.length > 0 ? (\n <>\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">Floor</span>\n <div className=\"eyeon-map-assign__floor\">\n <ModernSelect\n ariaLabel=\"Floor\"\n value={String(shape.levelId)}\n disabled={!canEdit}\n searchable={false}\n options={levels.map((level) => ({\n value: String(level.id),\n label: level.name,\n }))}\n onChange={(next) => {\n if (!next) return;\n setLevelError(onChangeLevel(Number(next)));\n }}\n />\n </div>\n </div>\n {levelError ? (\n <p className=\"eyeon-map-rail__hint\" style={{ color: '#b91c1c' }}>\n {levelError}\n </p>\n ) : null}\n </>\n ) : null}\n\n {canEdit && (copyButton || onDelete) ? (\n <div className=\"eyeon-map-assign__actions\">\n {copyButton}\n {onDelete ? (\n <button\n type=\"button\"\n className=\"eyeon-map-assign__unassign\"\n onClick={() => onDelete()}\n >\n Delete\n </button>\n ) : null}\n </div>\n ) : null}\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 selectedShapeId,\n selectedShapeIds,\n hoveredShapeId,\n focusNonce,\n activeLevelId,\n onActiveLevelChange,\n routeOnSelect,\n imageProxyUrl,\n}: {\n document: PublishedDocument;\n /** Assign mode and public website hide search. */\n host?: Extract<MapViewerHost, 'PORTAL_ASSIGN' | 'WEBSITE'>;\n onSelectShape?: (shapeId: number | null, opts?: { additive?: boolean }) => void;\n selectedShapeId?: number | null;\n selectedShapeIds?: number[];\n hoveredShapeId?: number | null;\n focusNonce?: number;\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 selectedShapeId={selectedShapeId}\n selectedShapeIds={selectedShapeIds}\n hoveredShapeId={hoveredShapeId}\n focusNonce={focusNonce}\n activeLevelId={activeLevelId}\n onActiveLevelChange={onActiveLevelChange}\n routeOnSelect={routeOnSelect}\n imageProxyUrl={imageProxyUrl}\n />\n </Suspense>\n </div>\n );\n}\n","export type ShapeSelectOpts = { additive?: boolean };\n\n/** Plain click replaces; Shift-click toggles the id in the set. */\nexport function nextSelectedShapeIds(\n current: number[],\n id: number | null,\n opts?: ShapeSelectOpts,\n): number[] {\n if (id == null) return [];\n if (!opts?.additive) return [id];\n if (current.includes(id)) return current.filter((item) => item !== id);\n return [...current, id];\n}\n","import type { CmConnector, MapAssignRetailer, 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 retailers?: MapAssignRetailer[];\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 retailers: extras?.retailers,\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>();\nconst MAX_REMEMBERED_MAPS = 20;\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.delete(mapId);\n memory.set(mapId, restored);\n if (memory.size > MAX_REMEMBERED_MAPS) {\n const oldest = memory.keys().next().value;\n if (oldest != null) memory.delete(oldest);\n }\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 CmShapeAssignment,\n MapAssignKiosk,\n MapAssignRetailer,\n MapEditorHost,\n PublishedDocument,\n ShapeKind,\n} from '../core';\nimport type { ShapeGeometry, ShapeLabel, ShapeStyle } from '../core';\nimport { assignmentVisualPatch, applyBulkAssignPatch, DEFAULT_LABEL_ALIGN, emptyShapeAssignment, geometryBBox, hasBuildingFloors, MAP_NO_FLOORS_MESSAGE, mergeTheme, nextLowerBuildingFloor, parseShapeAssignment, viewerLevelIdAfterShapeSelect } from '../core';\nimport type { BulkAssignPatch } from '../core';\nimport { MapControls } from '../viewer/ui/MapControls';\nimport {\n editorFloorControlLevels,\n isEditorSection,\n levelIdOnEnterDefaultMap,\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 {\n applyDraftOps,\n coalesceDraftOp,\n orderBatchOpsForPersist,\n shapeKeyTakenOnLevel,\n type EditorDraftState,\n} from './draftOps';\nimport { ConnectorAssign } from './panels/ConnectorAssign';\nimport { LeftRail, type RailSection } from './panels/LeftRail';\nimport type { CreateLevelInput, UpdateLevelInput } from './panels/FloorsPanel';\nimport { CatalogKioskForm } from './panels/CatalogKioskForm';\nimport { Inspector } from './panels/Inspector';\nimport { PreviewOverlay } from './panels/PreviewOverlay';\nimport { isAssignableKind } from './railAssignments';\nimport {\n catalogKioskShapeOptions,\n isKioskScreenKind,\n shapeIdForCatalogKiosk,\n} from './railKiosks';\nimport { allocShapeKey, copyShapeToLevelOps, liveShapeKeysOnLevel } from './shapeCopy';\nimport { nextSelectedShapeIds, type ShapeSelectOpts } from './shapeSelection';\nimport { compileEditorPreview } from './previewDocument';\nimport { geometryForLabelText, DEFAULT_LABEL_SIZE } from './labelText';\nimport {\n DEFAULT_ENTRANCE_SIZE,\n geometryForEntranceIcon,\n isEntranceIcon,\n} from './entranceIcon';\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 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 /** Reload the draft from the database after discarding local edits. */\n onDiscard?: () => Promise<void> | 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 * Center retailers for the default-map assign form (v1 retailer dropdown).\n */\n retailers?: MapAssignRetailer[];\n /** Center kiosks for leftover ID-only assignments; new kiosks are named in Assign. */\n kiosks?: MapAssignKiosk[];\n /**\n * Media proxy base for remote http(s) media, same contract as v1\n * `IMAGE_PROXY_URL`. Required whenever the outdoor SVG is served from an\n * origin that does not send CORS headers. Inlined amenity data URLs skip it.\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 /** PORTAL host: pin \"Use Classic Map\" at the bottom of the left rail. */\n onUseClassicMap?: () => void;\n}\n\nexport function MapEditor({\n host = 'PORTAL',\n draft,\n canEdit = true,\n canFloors = true,\n canSettings = true,\n onBatch,\n onPublish,\n onDiscard,\n onImportSvg,\n onCreateLevel,\n onUpdateLevel,\n onDeleteLevel,\n onReorderLevels,\n onAutoroute,\n previewDocument,\n retailers = [],\n kiosks = [],\n imageProxyUrl,\n className,\n sidebarFooter,\n onUseClassicMap,\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 [selectedShapeIds, setSelectedShapeIds] = useState<number[]>([]);\n const [selectedCatalogKioskId, setSelectedCatalogKioskId] = useState<\n number | null\n >(null);\n const selectedShapeId = selectedShapeIds[0] ?? null;\n const [hoveredShapeId, setHoveredShapeId] = useState<number | null>(null);\n const [listFocusNonce, setListFocusNonce] = useState(0);\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 // Default map / Wayfinding must not stay on Outdoor — that hides floors.\n useEffect(() => {\n const exists = draft.levels.some((level) => level.id === activeLevelId);\n if (!exists) {\n setActiveLevelId(\n section === 'wayfinding'\n ? levelIdOnEnterWayfinding(draft.levels)\n : isEditorSection(section)\n ? levelIdOnEnterEditMap(draft.levels)\n : levelIdOnEnterDefaultMap(draft.levels),\n );\n return;\n }\n if (section === 'edit-map') return;\n const active = draft.levels.find((level) => level.id === activeLevelId);\n if (active?.kind !== 'outdoor') return;\n const next =\n section === 'wayfinding'\n ? levelIdOnEnterWayfinding(draft.levels)\n : levelIdOnEnterDefaultMap(draft.levels);\n if (next != null && next !== activeLevelId) setActiveLevelId(next);\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 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 openingUnderlayShapes = useMemo(() => {\n const levelsWithShapes = workingDraft.levels.map((lvl) => ({\n ...lvl,\n shapes: workingDraft.shapes.filter((shape) => shape.levelId === lvl.id),\n }));\n const lower = nextLowerBuildingFloor(levelsWithShapes, activeLevelId);\n if (!lower) return [];\n return workingDraft.shapes.filter(\n (shape) => shape.levelId === lower.id && !shape.orphanedAt,\n );\n }, [workingDraft.levels, workingDraft.shapes, 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 retailers,\n }),\n [workingDraft, previewDocument, retailers],\n );\n const levelAnchors = useMemo(\n () => workingDraft.anchors.filter((a) => a.levelId === activeLevelId),\n [activeLevelId, workingDraft.anchors],\n );\n const levelEdges = useMemo(() => {\n const anchorsById = new Map(\n workingDraft.anchors.map((anchor) => [anchor.id, anchor]),\n );\n return workingDraft.edges.filter(\n (edge) => anchorsById.get(edge.fromAnchorId)?.levelId === activeLevelId,\n );\n }, [activeLevelId, workingDraft.anchors, workingDraft.edges]);\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 setSelectedShapeIds(\n snapshot.selectedShapeId == null ? [] : [snapshot.selectedShapeId],\n );\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 = orderBatchOpsForPersist(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 handleDiscardChanges = useCallback(async () => {\n if (!canEdit || saving || !dirty) return;\n if (\n !window.confirm(\n 'Discard unsaved changes and reload the map from the database?',\n )\n ) {\n return;\n }\n canvasRef.current?.consumeRouteUndo();\n pendingOps.current = [];\n nextTempId.current = -1;\n historyGestureRef.current = false;\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n setNeedsPublish(false);\n setEditVersion((n) => n + 1);\n setSaving(true);\n try {\n await onDiscard?.();\n } finally {\n setSaving(false);\n }\n }, [canEdit, dirty, onDiscard, saving]);\n\n const handleSectionChange = useCallback(\n (next: RailSection | null) => {\n // Leave item-options (level 3) whenever the rail module changes so\n // Stores / Amenities / … always open on their list (level 2).\n setSelectedShapeIds([]);\n setSelectedCatalogKioskId(null);\n setSelectedAnchorIds([]);\n setHoveredShapeId(null);\n if (isEditorSection(section) && !isEditorSection(next)) {\n setTool('select');\n historyGestureRef.current = false;\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n setActiveLevelId(levelIdOnEnterDefaultMap(draft.levels));\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 setSelectedShapeIds([]);\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, opts?: ShapeSelectOpts) => {\n const shape = id == null ? null : workingDraft.shapes.find((s) => s.id === id);\n const additive =\n Boolean(opts?.additive) &&\n section !== 'edit-map' &&\n section !== 'wayfinding' &&\n (shape == null || isAssignableKind(shape.kind));\n setSelectedShapeIds((prev) => nextSelectedShapeIds(prev, id, { additive }));\n if (id != null) setSelectedCatalogKioskId(null);\n setHoveredShapeId(null);\n if (id == null) return;\n if (shape && !additive) {\n const nextLevelId =\n section === 'edit-map' || section === 'wayfinding'\n ? shape.levelId\n : viewerLevelIdAfterShapeSelect(\n workingDraft.levels,\n activeLevelId,\n shape.levelId,\n );\n setActiveLevelId(nextLevelId);\n }\n if (additive) return;\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 [\n activeLevelId,\n section,\n workingDraft.anchors,\n workingDraft.connectors,\n workingDraft.levels,\n workingDraft.shapes,\n ],\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 if (\n shapeKeyTakenOnLevel(\n workingDraft.shapes,\n selectedShape.id,\n selectedShape.levelId,\n key,\n )\n ) {\n return;\n }\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 handleChangeLevel = (levelId: number): string | null => {\n if (!selectedShape || !canEdit) return null;\n if (levelId === selectedShape.levelId) return null;\n if (\n shapeKeyTakenOnLevel(\n workingDraft.shapes,\n selectedShape.id,\n levelId,\n selectedShape.key,\n )\n ) {\n return 'That ID is already used on this floor.';\n }\n const ops: BatchOp[] = [\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n },\n },\n ];\n for (const anchor of workingDraft.anchors) {\n if (anchor.shapeId !== selectedShape.id || anchor.levelId === levelId) {\n continue;\n }\n ops.push({\n op: 'upsert_anchor',\n anchor: {\n id: anchor.id,\n levelId,\n shapeId: anchor.shapeId,\n kind: anchor.kind,\n x: anchor.x,\n y: anchor.y,\n connectorId: anchor.connectorId,\n },\n });\n }\n queueOpBatch(ops);\n setActiveLevelId(levelId);\n return null;\n };\n\n const handleCopyToLevel = (levelId: number): string | null => {\n if (!selectedShape || !canEdit) return null;\n const copied = copyShapeToLevelOps({\n shape: selectedShape,\n assignment: selectedAssignment,\n targetLevelId: levelId,\n shapes: workingDraft.shapes,\n allocId: () => nextTempId.current--,\n });\n if (!copied) return 'Pick a different floor.';\n queueOpBatch(copied.ops);\n setSelectedShapeIds([copied.shapeId]);\n setActiveLevelId(levelId);\n return null;\n };\n\n const handleDeleteShape = () => {\n if (!selectedShape || !canEdit) return;\n queueOp({ op: 'delete_shape', shapeId: selectedShape.id });\n setSelectedShapeIds([]);\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, opts?: { live?: boolean }) => {\n if (!selectedShape || !canEdit) return;\n if (isEntranceIcon(selectedShape)) {\n const size = label.size ?? selectedShape.label.size ?? DEFAULT_ENTRANCE_SIZE;\n const sameLabel =\n size === (selectedShape.label.size ?? DEFAULT_ENTRANCE_SIZE) &&\n (label.rotate ?? 0) === (selectedShape.label.rotate ?? 0) &&\n (label.color ?? '') === (selectedShape.label.color ?? '') &&\n (label.imageKey ?? '') === (selectedShape.label.imageKey ?? '');\n if (sameLabel) {\n if (!opts?.live) endHistoryGesture();\n return;\n }\n const geometry = geometryForEntranceIcon(selectedShape.geometry, size);\n queueOp(\n {\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 opts?.live ? 'gesture' : 'step',\n );\n if (!opts?.live) endHistoryGesture();\n return;\n }\n const size = label.size ?? selectedShape.label.size ?? DEFAULT_LABEL_SIZE;\n const sameLabel =\n (label.text ?? '') === (selectedShape.label.text ?? '') &&\n size === (selectedShape.label.size ?? DEFAULT_LABEL_SIZE) &&\n (label.rotate ?? 0) === (selectedShape.label.rotate ?? 0) &&\n (label.color ?? '') === (selectedShape.label.color ?? '') &&\n (label.align ?? DEFAULT_LABEL_ALIGN) ===\n (selectedShape.label.align ?? DEFAULT_LABEL_ALIGN);\n if (sameLabel) {\n if (!opts?.live) endHistoryGesture();\n return;\n }\n const geometry = geometryForLabelText(\n selectedShape.geometry,\n label.text ?? selectedShape.label.text ?? '',\n size,\n );\n queueOp(\n {\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 opts?.live ? 'gesture' : 'step',\n );\n if (!opts?.live) endHistoryGesture();\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 handleSaveAssignment = (assignment: CmShapeAssignment) => {\n if (!selectedShape || !canEdit) return;\n const retailer = retailers.find((item) => item.id === assignment.retailerId);\n const visuals = assignmentVisualPatch(selectedShape, assignment, retailer);\n queueOp({ op: 'upsert_assignment', assignment });\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n style: visuals.style,\n label: visuals.label,\n },\n },\n 'none',\n );\n };\n\n const handleClearAssignment = () => {\n if (!selectedShape || !canEdit) return;\n queueOp({ op: 'delete_assignment', shapeId: selectedShape.id });\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n style: { ...selectedShape.style, fill: undefined },\n label: {\n ...selectedShape.label,\n text: undefined,\n imageKey: undefined,\n size: undefined,\n rotate: undefined,\n offsetX: undefined,\n offsetY: undefined,\n color: undefined,\n },\n },\n },\n 'none',\n );\n };\n\n const handleLinkCatalogKiosk = (kioskId: number, shapeId: number | null) => {\n if (!canEdit) return;\n const kiosk = kiosks.find((item) => item.id === kioskId);\n const previousShapeId = shapeIdForCatalogKiosk(\n kioskId,\n workingDraft.assignments,\n );\n const ops: BatchOp[] = [];\n const clearShape = (id: number) => {\n const shape = workingDraft.shapes.find((row) => row.id === id);\n if (!shape) return;\n ops.push({ op: 'delete_assignment', shapeId: id });\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 style: { ...shape.style, fill: undefined },\n label: {\n ...shape.label,\n text: undefined,\n imageKey: undefined,\n size: undefined,\n rotate: undefined,\n offsetX: undefined,\n offsetY: undefined,\n color: undefined,\n },\n },\n });\n };\n if (previousShapeId != null && previousShapeId !== shapeId) {\n clearShape(previousShapeId);\n }\n if (shapeId == null) {\n if (ops.length) queueOpBatch(ops);\n return;\n }\n const shape = workingDraft.shapes.find((row) => row.id === shapeId);\n if (!shape || !isKioskScreenKind(shape.kind)) return;\n const existing = workingDraft.assignments.find((row) => row.shapeId === shapeId);\n const base = existing\n ? parseShapeAssignment(existing, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind);\n const assignment = parseShapeAssignment(\n {\n ...base,\n targetType: 'kiosk',\n kioskId,\n customLabel: kiosk?.name?.trim() || base.customLabel,\n retailerId: null,\n amenityId: null,\n layerType: 'kiosk',\n },\n shape.kind,\n );\n const visuals = assignmentVisualPatch(shape, assignment);\n ops.push({ op: 'upsert_assignment', assignment });\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 style: visuals.style,\n label: visuals.label,\n },\n });\n queueOpBatch(ops);\n };\n\n const handleBulkAssign = (patch: BulkAssignPatch) => {\n if (!canEdit || selectedShapeIds.length < 2) return;\n const ops: BatchOp[] = [];\n for (const id of selectedShapeIds) {\n const shape = workingDraft.shapes.find((item) => item.id === id);\n if (!shape || !isAssignableKind(shape.kind)) continue;\n const existing = workingDraft.assignments.find((row) => row.shapeId === id);\n const current = existing\n ? parseShapeAssignment(existing, shape.kind)\n : emptyShapeAssignment(id, shape.kind);\n const patched = applyBulkAssignPatch(current, patch);\n const retailer = retailers.find((item) => item.id === patched.retailerId);\n const visuals = assignmentVisualPatch(shape, patched, retailer);\n ops.push({ op: 'upsert_assignment', assignment: patched });\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 style: visuals.style,\n label: visuals.label,\n },\n });\n }\n if (ops.length) queueOpBatch(ops);\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 retailers={retailers}\n kiosks={kiosks}\n levelShapeKeys={levelShapes\n .filter((s) => !selectedShapeIds.includes(s.id))\n .map((s) => s.key)}\n canEdit={canEdit}\n showAssignment={section !== 'edit-map'}\n emptyHint={\n section === 'stores' ||\n section === 'amenities' ||\n section === 'kiosks' ||\n section === 'unassigned' ||\n section === 'escalators' ||\n section === 'elevators'\n ? ''\n : undefined\n }\n selectedShapes={workingDraft.shapes.filter((s) =>\n selectedShapeIds.includes(s.id),\n )}\n selectedAssignments={workingDraft.assignments.filter((row) =>\n selectedShapeIds.includes(row.shapeId),\n )}\n onRename={handleRenameShape}\n onChangeKind={handleChangeKind}\n onChangeLevel={section === 'edit-map' ? handleChangeLevel : undefined}\n onCopyToLevel={handleCopyToLevel}\n levels={editorFloorControlLevels('edit-map', workingDraft.levels)}\n onDelete={handleDeleteShape}\n onClearAssignment={handleClearAssignment}\n onUpdateLabel={handleUpdateLabel}\n onSaveAssignment={handleSaveAssignment}\n onBulkAssign={handleBulkAssign}\n storeDefaultColor={theme.STORE_DEFAULT_COLOR}\n storeTextColor={theme.STORE_TEXT_COLOR}\n />\n {section !== 'edit-map' && selectedShape && connectorRailKind ? (\n <ConnectorAssign\n shape={selectedShape}\n railKind={connectorRailKind}\n canEdit={canEdit}\n assignment={selectedAssignment}\n storeDefaultColor={theme.STORE_DEFAULT_COLOR}\n storeTextColor={theme.STORE_TEXT_COLOR}\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 onSaveAssignment={handleSaveAssignment}\n />\n ) : null}\n </>\n );\n\n const selectedCatalogKiosk =\n selectedCatalogKioskId != null\n ? kiosks.find((item) => item.id === selectedCatalogKioskId) ?? null\n : null;\n const catalogKioskPanel = selectedCatalogKiosk ? (\n <CatalogKioskForm\n kiosk={selectedCatalogKiosk}\n shapeOptions={catalogKioskShapeOptions(workingDraft.shapes)}\n assignedShapeId={shapeIdForCatalogKiosk(\n selectedCatalogKiosk.id,\n workingDraft.assignments,\n )}\n canEdit={canEdit}\n onAssign={(shapeId) =>\n handleLinkCatalogKiosk(selectedCatalogKiosk.id, shapeId)\n }\n />\n ) : null;\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 selectedShapeIds={selectedShapeIds}\n onSelectShape={handleSelectShape}\n onHoverShape={setHoveredShapeId}\n onListFocus={() => setListFocusNonce((n) => n + 1)}\n retailers={retailers}\n kiosks={kiosks}\n selectedCatalogKioskId={selectedCatalogKioskId}\n onSelectCatalogKiosk={setSelectedCatalogKioskId}\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 catalogKioskPanel={catalogKioskPanel}\n onUseClassicMap={host === 'PORTAL' ? onUseClassicMap : undefined}\n assignPanel={assignPanel}\n editMapPanel={\n <>\n {toolHint(tool, 'map') ? (\n <p className=\"eyeon-map-rail__hint\">{toolHint(tool, 'map')}</p>\n ) : null}\n {assignPanel}\n </>\n }\n wayfindingPanel={\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 ) : toolHint(tool, 'route') ? (\n <p className=\"eyeon-map-rail__hint\">{toolHint(tool, 'route')}</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__discard\"\n aria-label=\"Discard Changes\"\n onClick={() => void handleDiscardChanges()}\n disabled={!canEdit || !dirty || saving}\n >\n Discard Changes\n </button>\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 selectedShapeId={selectedShapeId}\n selectedShapeIds={selectedShapeIds}\n hoveredShapeId={hoveredShapeId}\n focusNonce={listFocusNonce}\n onSelectShape={handleSelectShape}\n activeLevelId={activeLevelId}\n onActiveLevelChange={setActiveLevelId}\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={outdoorShapes.filter((s) => !s.orphanedAt)}\n openingUnderlayShapes={openingUnderlayShapes}\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={outdoorLevel?.sourceViewbox ?? null}\n outdoorSvgUrl={\n outdoorLevel?.sourceSvgUrl ?? workingDraft.baseSvgUrl ?? null\n }\n imageProxyUrl={imageProxyUrl}\n emptyMessage={\n hasBuildingFloors(workingDraft.levels) || outdoorLevel\n ? undefined\n : MAP_NO_FLOORS_MESSAGE\n }\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 key = allocShapeKey(\n kind,\n liveShapeKeysOnLevel(workingDraft.shapes, activeLevel.id),\n );\n const id = queueOp({\n op: 'upsert_shape',\n shape: {\n levelId: activeLevel.id,\n key,\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 const takenKeys = new Set(\n liveShapeKeysOnLevel(workingDraft.shapes, activeLevel.id),\n );\n edits.forEach((edit) => {\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 const key = allocShapeKey(edit.kind, takenKeys);\n takenKeys.add(key);\n ops.push({\n op: 'upsert_shape',\n shape: {\n levelId: activeLevel.id,\n key,\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';\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","wayfindingSelectableLevels","levels","floorSwitcherLevels","editMapSelectableLevels","outdoor","level","defaultEditorFloorId","_a","levelIdOnEnterWayfinding","levelIdOnEnterEditMap","levelIdOnEnterDefaultMap","defaultViewerLevelId","editorFloorControlLevels","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","DrawCircleIcon","DrawOpeningIcon","jsxs","DrawOpeningCircleIcon","CurveIcon","SplitJoinIcon","DrawTextIcon","DrawEntranceIcon","DrawRouteIcon","CreateRouteIcon","CreateRouteMultiIcon","UndoIcon","RedoIcon","TOOL_ICONS","canSelectShapes","isSplitJoinTool","isPolygonDrawTool","isEllipseDrawTool","isShapeDrawTool","isStampDrawTool","canJoinOpenEnds","showsShapeAnchors","showsCurveHandles","emptyCanvasDragPans","nextEditorTool","next","toolHint","group","EditorToolButtons","onToolChange","canEdit","mapTools","t","routeTools","showMap","showRoute","selectTool","routeToolbar","renderButton","Icon","React","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","ellipseBoundsFromDrag","lockCircle","sx","sy","ellipsePathD","bounds","ellipseGeometry","DEFAULT_LABEL_TEXT","DEFAULT_LABEL_SIZE","LABEL_FONT_FAMILY","MAP_FONT_FAMILY","LABEL_LINE_HEIGHT","MAP_LABEL_LINE_HEIGHT","FALLBACK_CHAR_ADVANCE","isTextLabel","defaultLabelSize","_viewbox","labelTextLines","text","measureCtx","textMeasureContext","measureLabelText","size","lines","ctx","width","line","max","labelBoxCenter","box","textLabelPolygon","origin","height","textLabelGeometry","defaultTextLabel","color","geometryForLabelText","geometryBBox","isStampShape","isEntranceIcon","defaultEntranceLabel","ENTRANCE_ICON_ID","clampEntranceSize","entranceIconPolygon","center","entranceIconGeometry","geometryForEntranceIcon","clientToUser","ctm","clientX","clientY","det","clientRectToViewBox","rect","viewBox","vbW","vbH","originX","originY","pxPerUserFromViewBox","readSvgViewBox","svg","vb","attr","parts","clientToSvgUser","pxPerUserFromSvg","pxPerUserFromCtm","userToWorld","user","pan","zoom","z","EDITOR_MIN_ZOOM","EDITOR_MAX_ZOOM","clampEditorZoom","nextEditorZoomFromWheel","currentZoom","event","nextZoomFromWheel","screenPxToWorld","px","pxPerUser","panAfterZoom","nextZoom","world","panKeepingWorldAtUser","EDITOR_ZOOM_ANIM_MS","easeOutCubic","lerp","interpolateView","editorShapeFillOpacity","editorShapeFill","theme","assignment","WALKING_PATH_COLOR","resolvedAssignmentBgColor","isHoverHighlightShape","INTERACTIVE_SHAPE_KINDS","editorSelectCursor","args","editorHoverFillOpacity","base","hovered","OutdoorSvgUnderlay","url","imageProxyUrl","suppressIds","svgText","setSvgText","useState","suppressKey","useMemo","useEffect","cancelled","controller","fetchUrl","resolveFetchUrl","res","err","paths","blocked","outdoorDecorationFromSvg","index","isUnderlayHintShape","isUnderlayDrawnShape","underlaySwitchHint","WAYFINDING_SNAP_PX","WAYFINDING_ANCHOR_HIT_PX","showsWayfinding","routeMode","routeSessionUndoKind","session","beginOrContinueRouteDraft","draft","routeRubberBand","isWayfindingShape","wayfindingLinksShapes","anchorKindForShape","routeAnchorKindForShape","shapeRoutePoint","walkEdgeExists","isSnappableRouteEdge","storeLinkOriginIds","preview","ids","anchor","nearestRouteSnap","excludeIds","maxDist","anchorById","bestJunction","bestEdge","walkEdge","mapId","fromAnchorId","toAnchorId","ensureShapeRouteAnchorOps","input","allocId","existing","unit","connectShapeToRouteOps","ops","snap","junctionId","nextEdges","source","linkKind","linkRouteAnchorsOp","insertJunctionOnWalkEdgeOps","levelId","deleteRouteAnchorOps","anchorId","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","HANDLE_LINE_PX","HANDLE_LINE_HALO_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","assignments","selectedShapeId","selectedAnchorIds","baseSvgUrl","baseViewbox","outdoorSvgUrl","levelSvgUrl","underlayShapes","openingUnderlayShapes","showGrid","readOnly","emptyMessage","onSelectShape","onSelectAnchors","onCreateRoutePoint","onCreateRouteSegment","onLinkRouteAnchors","onInsertRouteJunction","onDeleteRouteAnchor","onConnectShapeToRoute","onEnsureShapeAnchor","onMoveAnchor","onCreateShape","onUpdateShapeGeometry","onBatchShapeEdits","onHistoryGestureEnd","onRouteDraftActiveChange","ref","ensureMapFont","wayfindingOn","svgRef","useRef","viewGroupRef","canvasRef","setPan","setZoom","viewRef","wheelFrameRef","wheelSettleRef","routeHoverFrameRef","routeHoverClientRef","setPxPerUser","pointersRef","pinchRef","drawing","setDrawing","drawLockCircle","setDrawLockCircle","polygonPoints","setPolygonPoints","dragAnchor","setDragAnchor","dragAnchorPoint","setDragAnchorPoint","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","routePointerSnap","setRoutePointerSnap","routeHover","underlayTip","setUnderlayTip","panStart","isPanning","setIsPanning","worldPx","applyView","nextPan","cancelWheelWork","paintView","settleWheelView","scheduleWheelPaint","zoomAnimRef","cancelZoomAnim","animateViewTo","targetPan","targetZoom","now","zoomAroundCenter","currentPan","useImperativeHandle","viewbox","unionViewBox","svgUnderlayUrl","svgSuppressIds","svgIdsOwnedByShapes","useLayoutEffect","measure","ro","editableShapes","openingShapes","openingClipId","openingHatchId","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","displayAnchorById","dragged","connectedAnchorIds","routeEdgePath","assignmentByShapeId","row","cancelRouteHoverFrame","scheduleRouteHover","client","closePolygon","onShift","onKey","node","onWheel","beginPinch","onCanvasPointerDownCapture","onCanvasPointerMoveCapture","onCanvasPointerUpCapture","wasPinching","beginPan","fromEmptySelect","insertHoveredRoutePoint","edgeId","created","removeWayfindingAnchor","placed","storeExclude","DEFAULT_ENTRANCE_SIZE","handleHit","_d","_c","midHit","_f","_e","handleTol","_h","_g","onPointerMove","screenMove","snapTol","finishRect","finishEllipse","onPointerUp","endedPan","moved","pathDFromGeometry","shapePathD","stubExcludeIds","stubSnap","lastRoutePoint","routeRubberSnap","highlightedRouteEdgeId","highlightedRouteEdge","highlightedRouteFrom","highlightedRouteTo","routePlusAt","rubberFrom","rubberTo","rubberBand","polygonFollow","polygonClose","hintable","highlightable","selected","dragging","textLabel","entranceIcon","stamp","beginShapePointerDown","worldAt","hoverHandlers","rotate","iconUrl","entranceIconDataUrl","align","normalizeLabelAlign","textX","labelAlignX","lineHeight","blockHeight","labelSvgTextAnchor","baseOpacity","opening","ri","items","ei","strokeD","clickRing","plus","h1","h2","vi","shapeNode","connected","displayAnchor","nearWeld","visR","pending","snapped","hideOnAnchor","Fragment","FAMILY_PREFIXES","normalizeId","value","parseConnectorSourceId","raw","family","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","partnerShapesForConnector","connector","levelsWithLandings","landings","escalatorDirectedEnds","memberAnchors","memberIds","ride","fromAnchor","toAnchor","floorName","landingRideId","groupEscalatorRides","rides","directed","members","escalatorRideLandingLines","connectorRideLabel","partners","order","ai","bi","connectorEdgesBetween","anchorIds","ensureLanding","linkLandingToWalk","landing","applyUnlinkLocal","unlinkConnectorOps","buildUnlinkConnectorOps","buildEscalatorLinkOps","fromShape","toShape","options","fromLevel","l","toLevel","name","existingFrom","existingTo","v","buildElevatorShaftOps","memberShapes","existingIds","keepId","suggestEscalatorPairs","groups","list","suggestions","fromName","toName","dir","geometryBbox","points","bboxOf","shapeKeyTakenOnLevel","upsertById","rows","copy","applyDraftOp","parseShapeAssignment","rest","removed","omitLevelFromDraft","removedShapeIds","removedAnchorIds","liveConnectorIds","applyDraftOps","seeded","healDraftGeometry","normalizeGeometrySpace","coalesceDraftOp","acc","BATCH_PERSIST_RANK","orderBatchOpsForPersist","rank","FieldResetIcon","FieldResetButton","onClick","normalizeHexColor","match","hex","ch","hexColorInputValue","sameHexColor","isTransparentColor","StepperRow","onChange","onStep","onHoldStart","onHoldEnd","setDraft","focused","syncDraft","commitDraft","persistIncomplete","commitAssignNumberDraft","assignNumberFromDraft","ColorSwatch","swatch","fallback","emptyIsTransparent","onHexChange","onCommit","onPick","lastSolid","transparent","solid","pickerValue","ColorRow","onReset","display","TRANSPARENT_COLOR","setHex","commit","normalized","ALIGN_TOOLTIPS","AlignLeftIcon","AlignCenterIcon","AlignRightIcon","ALIGN_ICONS","AlignRow","LABEL_ALIGNS","option","RotateIcon","nextQuarterTurn","remainder","stepWholeNumber","AssignmentStyleFields","form","storeDefaultColor","storeTextColor","textColorLabel","showTextColor","onPatch","formRef","intervals","bump","startHold","stopHold","offsetX","offsetY","bgColor","textColor","connectorStyleAssignment","emptyShapeAssignment","ConnectorAssign","railKind","onApplyOps","onSaveAssignment","partner","levelName","exitFloorId","setExitFloorId","targetId","setTargetId","stopFloorId","setStopFloorId","styleForm","setStyleForm","styleFormRef","patchStyle","useCallback","partial","exitFloors","landingsOnExitFloor","addable","addFloors","landingsOnStopFloor","applyEscalator","applyElevator","nextMembers","pickExitLanding","nextId","pickElevatorStop","landingOptions","linked","connectorSpecialIconDataUrl","ModernSelect","nextFloor","SHAPE_KIND_LABELS","EDITOR_TYPE_KINDS","TOOL_ONLY_KINDS","inspectorShowsType","inspectorTypeKinds","shapeKindLabel","ASSIGNABLE_SHAPE_KINDS","isAssignableKind","isStoreShapeKind","isRetailerAssigned","isAmenityAssigned","isKioskAssigned","isPolygonAssigned","assignmentHasTarget","railAssignmentGroups","byShape","stores","amenities","kiosks","unassignedStores","unassignedAmenities","unassignedKiosks","unassigned","isKioskScreenKind","kioskScreenShapes","catalogKioskShapeOptions","shapeIdForCatalogKiosk","kioskId","leftoverCatalogKiosks","used","kiosk","catalogKioskRowLabel","assignedKey","railRowLabels","tags","RAIL_ITEM_SECTIONS","isRailItemSection","railShowsItemOptions","selectedCount","railListLevelOrder","floorsLowToHigh","compareBuildingFloors","sortShapesByRailLevel","indexById","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","setName","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","committedIds","displayFloors","byId","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","HOUSE_OUTDOOR_THEME","staticLayerThemeDefaults","OUTDOOR_COLOR_FIELDS","SettingsField","children","ColorField","LeftRail","onSectionChange","activeLevelId","selectedShapeIds","onHoverShape","onListFocus","retailers","canSettings","onAutoroute","onThemeChange","assignPanel","catalogKioskPanel","selectedCatalogKioskId","onSelectCatalogKiosk","editMapPanel","wayfindingPanel","footer","onUseClassicMap","floorsScreen","setFloorsScreen","assigned","storeShapes","amenityShapes","kioskShapes","unassignedStoreShapes","unassignedAmenityShapes","unassignedKioskShapes","unassignedShapes","escalatorShapes","elevatorShapes","unlinkedEscalators","escalatorRides","linkedElevators","unlinkedElevators","assignmentById","retailerById","counts","retailer","duplicate","retailerOptionLabel","amenityById","kioskById","assignedNameFor","catalogName","fromType","getAmenityByType","amenityAssignedName","kioskAssignedName","activeLevel","pathCount","selectedIds","isShapeSelected","selectedCatalogKiosk","showingCatalogKiosk","showingItemOptions","itemOptionsTitle","linkedId","selectShapeFromList","leftoverKiosks","renderShapeList","empty","opts","renderEscalatorRideList","active","renderAssignedUnassigned","assignedList","unassignedList","kindLabelFor","connectorIcon","house","DEFAULT_THEME","customized","clampStoreRadius","CatalogKioskForm","shapeOptions","assignedShapeId","onAssign","hasShape","SHAPE_KEY_PREFIX","SHAPE_KEY_ALPHABET","SHAPE_KEY_SUFFIX_LENGTH","shapeKeyPrefix","randomShapeKeySuffix","length","bytes","liveShapeKeysOnLevel","copyDestinationLevels","currentLevelId","allocShapeKey","taken","suffix","prefix","cloneShapeGeometry","path","copyShapeToLevelOps","targetLevelId","RETAIL_LAYER_TYPES","AssignForm","onClear","copyAction","setForm","patch","nameCounts","retailerOptions","amenityOptions","amenityAssignOptions","selectedAmenityType","amenityTypeFromCatalogId","kioskCatalogName","hasAssignment","retailerId","layerType","DEFAULT_LABEL_ALIGN","amenityId","amenityCatalogIdForType","KioskNameField","trimmed","BulkAssignForm","common","bulkAssignFormState","BulkSizeRow","BulkColorRow","emitIfComplete","DEFAULT_ASSIGNMENT_SIZE","mixed","Chevron","CopyToLevelButton","destinations","onCopyToLevel","listId","useId","buttonRef","menuRef","setOpen","menuPos","setMenuPos","close","updateMenuPos","spaceBelow","spaceAbove","maxHeight","openAbove","destinationKey","onDoc","menu","nextError","MIN_ICON_SIZE","EntranceIconForm","setSize","setRotate","sizeRef","rotateRef","nextSize","nextRotate","MIN_FONT_SIZE","TextLabelForm","setText","textFocused","nextText","Inspector","levelShapeKeys","showAssignment","emptyHint","onRename","onChangeKind","onChangeLevel","onDelete","onClearAssignment","onUpdateLabel","selectedShapes","selectedAssignments","onBulkAssign","setKey","keyError","setKeyError","levelError","setLevelError","commitRename","copyDestinations","copyButton","PreviewOverlay","document","focusNonce","onActiveLevelChange","routeOnSelect","Suspense","MapViewer","nextSelectedShapeIds","compileEditorPreview","compileDocument","memory","MAX_REMEMBERED_MAPS","storageKey","dropLegacyStorage","markEditorSection","oldest","peekEditorSection","clearEditorSection","storage","markReturnToFloorsList","consumeReturnToFloorsList","stored","clearReturnToFloorsList","MapEditor","onBatch","onPublish","onDiscard","onImportSvg","previewDocument","className","sidebarFooter","setSection","setActiveLevelId","restoredLevel","setSelectedShapeIds","setSelectedCatalogKioskId","listFocusNonce","setListFocusNonce","setSelectedAnchorIds","setTool","editVersion","setEditVersion","needsPublish","setNeedsPublish","saving","setSaving","setHistory","routeDraftActive","setRouteDraftActive","historyRef","pendingOps","nextTempId","historyGestureRef","showMapOptions","centerSurface","isEditMap","historyMetaRef","workingDraft","mergeTheme","dirty","outdoorViewOnly","canDrawOnCanvas","outdoorLevel","outdoorShapes","levelShapes","levelsWithShapes","lvl","lower","nextLowerBuildingFloor","compiledPreview","levelAnchors","levelEdges","anchorsById","selectedAssignment","takeSnapshot","applySnapshot","recordHistoryStep","mode","queueOp","historyMode","endHistoryGesture","undo","redo","handleSaveChanges","persisted","handleDiscardChanges","handleSectionChange","handleCanvasLevelChange","nextLevel","handleSelectShape","additive","nextLevelId","viewerLevelIdAfterShapeSelect","connectorKind","handleToolChange","resolved","handleRenameShape","handleChangeLevel","queueOpBatch","handleCopyToLevel","copied","handleDeleteShape","handleUpdateShapeGeometry","handleUpdateLabel","handleChangeKind","handleSaveAssignment","visuals","assignmentVisualPatch","handleClearAssignment","handleLinkCatalogKiosk","previousShapeId","clearShape","handleBulkAssign","patched","applyBulkAssignPatch","selectedConnectorKind","connectorRailKind","toolGroup","hasBuildingFloors","MAP_NO_FLOORS_MESSAGE","id1","id2","prevAnchorId","deletedSelected","takenKeys","edit","style","MapControls","bucketLabel","change","ImportReviewPanel","diff","viewBoxChanged","blockedMessage","onApply","onCancel","remap","setRemap","buckets","added","orphaned","locked","toSourceSvgId"],"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/ellipseDraw.ts","../../src/editor/labelText.ts","../../src/editor/entranceIcon.ts","../../src/editor/canvas/coords.ts","../../src/editor/canvas/editorFill.ts","../../src/editor/canvas/editorHover.ts","../../src/editor/assignmentOverlay.ts","../../src/editor/canvas/AssignedShapeOverlay.tsx","../../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/FieldResetButton.tsx","../../src/editor/hexColor.ts","../../src/editor/panels/formRows.tsx","../../src/editor/panels/AssignmentStyleFields.tsx","../../src/editor/panels/ConnectorAssign.tsx","../../src/editor/labels.ts","../../src/editor/railAssignments.ts","../../src/editor/railKiosks.ts","../../src/editor/railListCopy.ts","../../src/editor/panels/FloorsPanel.tsx","../../src/editor/panels/LeftRail.tsx","../../src/editor/panels/CatalogKioskForm.tsx","../../src/editor/shapeCopy.ts","../../src/editor/panels/AssignForm.tsx","../../src/editor/panels/BulkAssignForm.tsx","../../src/editor/panels/CopyToLevelButton.tsx","../../src/editor/panels/EntranceIconForm.tsx","../../src/editor/panels/TextLabelForm.tsx","../../src/editor/panels/Inspector.tsx","../../src/editor/panels/PreviewOverlay.tsx","../../src/editor/shapeSelection.ts","../../src/editor/previewDocument.ts","../../src/editor/editorSectionReturn.ts","../../src/editor/floorsListReturn.ts","../../src/editor/MapEditor.tsx","../../src/editor/panels/ImportReviewPanel.tsx"],"sourcesContent":["import {\n defaultViewerLevelId,\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/**\n * PORTAL default map always lands on the ground floor. Outdoor as the\n * active level hides building floors (`viewerLevelStack`).\n */\nexport function levelIdOnEnterDefaultMap(levels: StackLevel[]): number | null {\n return defaultViewerLevelId(levels);\n}\n\n/**\n * Top-right floor switcher. Edit Map lists floors then Outdoor.\n * Wayfinding lists building floors only.\n */\nexport function editorFloorControlLevels<T extends StackLevel & { name: string }>(\n section: RailSection | null,\n levels: T[],\n): Array<{ id: number; name: string }> {\n const selected =\n section === 'wayfinding'\n ? wayfindingSelectableLevels(levels)\n : editMapSelectableLevels(levels);\n return selected.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-circle'\n | 'draw-void'\n | 'draw-void-circle'\n | 'curve'\n | 'split-join'\n | 'draw-text'\n | 'draw-entrance'\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 /** Draw a toolbar separator immediately before this tool. */\n sepBefore?: boolean;\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-circle', label: 'Draw circle', 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 { id: 'draw-entrance', label: 'Entrance', draw: true, group: 'map' },\n {\n id: 'draw-void',\n label: 'Open to Below',\n draw: true,\n group: 'map',\n sepBefore: true,\n },\n {\n id: 'draw-void-circle',\n label: 'Open to Below circle',\n draw: true,\n group: 'map',\n },\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 DrawCircleIcon() {\n return (\n <svg {...ICON_PROPS}>\n <ellipse\n cx=\"8\"\n cy=\"8\"\n rx=\"5.4\"\n ry=\"5.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.55\"\n />\n </svg>\n );\n}\n\nfunction DrawOpeningIcon() {\n return (\n <svg {...ICON_PROPS}>\n <rect\n x=\"2.4\"\n y=\"2.4\"\n width=\"11.2\"\n height=\"11.2\"\n rx=\"1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <rect\n x=\"5.1\"\n y=\"5.1\"\n width=\"5.8\"\n height=\"5.8\"\n rx=\"0.6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeDasharray=\"1.6 1.15\"\n />\n </svg>\n );\n}\n\nfunction DrawOpeningCircleIcon() {\n return (\n <svg {...ICON_PROPS}>\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"5.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"2.7\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeDasharray=\"1.6 1.15\"\n />\n </svg>\n );\n}\n\nfunction CurveIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M2.3 11.6 C4.6 2.4 6.4 2.4 8 8 S11.4 13.6 13.7 4.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n <circle cx=\"2.3\" cy=\"11.6\" r=\"1.35\" fill=\"currentColor\" />\n <circle cx=\"13.7\" cy=\"4.4\" r=\"1.35\" fill=\"currentColor\" />\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 DrawEntranceIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M5.4 2.8h6.4A2.8 2.8 0 0 1 14.6 5.6v4.8a2.8 2.8 0 0 1-2.8 2.8H5.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.55\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M1.7 8h8.1M7.3 5.15 10.4 8l-3.1 2.85\"\n stroke=\"currentColor\"\n strokeWidth=\"1.55\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"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-circle': DrawCircleIcon,\n 'draw-void': DrawOpeningIcon,\n 'draw-void-circle': DrawOpeningCircleIcon,\n curve: CurveIcon,\n 'split-join': SplitJoinIcon,\n 'draw-text': DrawTextIcon,\n 'draw-entrance': DrawEntranceIcon,\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-to-place closed polygons — stores or atrium openings. */\nexport function isPolygonDrawTool(tool: EditorTool): boolean {\n return tool === 'draw-polygon' || tool === 'draw-void';\n}\n\n/** Click-drag oval / circle — stores or Open to Below. */\nexport function isEllipseDrawTool(tool: EditorTool): boolean {\n return tool === 'draw-circle' || tool === 'draw-void-circle';\n}\n\n/** Rectangle, polygon, circle, and Open to Below — plus cursor for placement. */\nexport function isShapeDrawTool(tool: EditorTool): boolean {\n return (\n tool === 'draw-unit' ||\n tool === 'draw-polygon' ||\n tool === 'draw-circle' ||\n tool === 'draw-void' ||\n tool === 'draw-void-circle'\n );\n}\n\n/** Click-to-place text or entrance stamps. */\nexport function isStampDrawTool(tool: EditorTool): boolean {\n return tool === 'draw-text' || tool === 'draw-entrance';\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, group?: 'map' | 'route'): string {\n if (group === 'route') {\n switch (tool) {\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 'pan':\n return 'Drag the map to move around. Walking paths stay on the selected floor.';\n case 'select':\n default:\n return 'Click a store to mark its destination. Drag empty space to pan. Use Create Route or Multi Route in the toolbar to draw walking paths.';\n }\n }\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-circle':\n return 'Click and drag to draw an oval. Hold Shift to keep it a circle.';\n case 'draw-void':\n return 'Draw an Open to Below to look through to the floor below. Click to place points, then click the first point or press Enter to close. Esc cancels.';\n case 'draw-void-circle':\n return 'Click and drag an oval Open to Below to look through to the floor below. Hold Shift to keep it a circle.';\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. Click existing text to select it.';\n case 'draw-entrance':\n return 'Click the map to place an entrance marker. Click an existing marker to select it.';\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\n ? mapTools.map((t) => (\n <React.Fragment key={t.id}>\n {t.sepBefore ? (\n <span className=\"eyeon-map-editor__tool-sep\" aria-hidden=\"true\" />\n ) : null}\n {renderButton(t)}\n </React.Fragment>\n ))\n : 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: number = lastCtrl ? 2 * x - lastCtrl.x : x;\n const qy: number = 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, Vec2 } from '../core';\nimport { buildGeometryFromPaths } from '../core';\n\nexport interface EllipseBounds {\n cx: number;\n cy: number;\n rx: number;\n ry: number;\n}\n\n/** Drag from corner `from` to `to`. Shift / lockCircle keeps rx === ry. */\nexport function ellipseBoundsFromDrag(\n from: Vec2,\n to: Vec2,\n lockCircle = false,\n): EllipseBounds {\n let x1 = to.x;\n let y1 = to.y;\n if (lockCircle) {\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const side = Math.max(Math.abs(dx), Math.abs(dy));\n const sx = dx === 0 ? (dy === 0 ? 1 : Math.sign(dy)) : Math.sign(dx);\n const sy = dy === 0 ? (dx === 0 ? 1 : Math.sign(dx)) : Math.sign(dy);\n x1 = from.x + sx * side;\n y1 = from.y + sy * side;\n }\n const rx = Math.abs(x1 - from.x) / 2;\n const ry = Math.abs(y1 - from.y) / 2;\n return {\n cx: (from.x + x1) / 2,\n cy: (from.y + y1) / 2,\n rx,\n ry,\n };\n}\n\nexport function ellipsePathD(bounds: EllipseBounds): string {\n const { cx, cy, rx, ry } = bounds;\n const arx = Math.max(rx, 1e-4);\n const ary = Math.max(ry, 1e-4);\n return `M ${cx - arx} ${cy} A ${arx} ${ary} 0 1 0 ${cx + arx} ${cy} A ${arx} ${ary} 0 1 0 ${cx - arx} ${cy} Z`;\n}\n\nexport function ellipseGeometry(\n from: Vec2,\n to: Vec2,\n lockCircle = false,\n): ShapeGeometry {\n return buildGeometryFromPaths([\n ellipsePathD(ellipseBoundsFromDrag(from, to, lockCircle)),\n ]);\n}\n","import type { BBox, ShapeGeometry, ShapeLabel, Vec2, ViewBox } from '../core';\nimport { geometryBBox } from '../core';\nimport { MAP_FONT_FAMILY, MAP_LABEL_LINE_HEIGHT } from '../fonts/mapFont';\nimport { polygonsToGeometry } from './geometryEdit';\n\nexport const DEFAULT_LABEL_TEXT = 'Text';\nexport const DEFAULT_LABEL_SIZE = 48;\nexport const LABEL_FONT_FAMILY = MAP_FONT_FAMILY;\nexport const LABEL_LINE_HEIGHT = MAP_LABEL_LINE_HEIGHT;\n/** Fallback advance when canvas measurement is unavailable (tests / SSR). */\nconst FALLBACK_CHAR_ADVANCE = 0.5;\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 DEFAULT_LABEL_SIZE;\n}\n\nexport function labelTextLines(text: string): string[] {\n const source = text.replace(/\\r\\n/g, '\\n').trim() || DEFAULT_LABEL_TEXT;\n return source.split('\\n');\n}\n\nlet measureCtx: CanvasRenderingContext2D | null | undefined;\n\nfunction textMeasureContext(): CanvasRenderingContext2D | null {\n if (measureCtx !== undefined) return measureCtx;\n if (typeof document === 'undefined') {\n measureCtx = null;\n return null;\n }\n const canvas = document.createElement('canvas');\n measureCtx = canvas.getContext('2d');\n return measureCtx;\n}\n\nexport function measureLabelText(\n text: string,\n size: number,\n): { width: number; height: number; lines: string[] } {\n const lines = labelTextLines(text);\n const ctx = textMeasureContext();\n let width = 0;\n if (ctx) {\n ctx.font = `${size}px ${LABEL_FONT_FAMILY}`;\n for (const line of lines) {\n width = Math.max(width, ctx.measureText(line || ' ').width);\n }\n } else {\n const longest = lines.reduce((max, line) => Math.max(max, line.length), 1);\n width = longest * size * FALLBACK_CHAR_ADVANCE;\n }\n return {\n width: Math.max(width, size * 0.2),\n height: Math.max(lines.length, 1) * size * LABEL_LINE_HEIGHT,\n lines,\n };\n}\n\nexport function labelBoxCenter(box: BBox): Vec2 {\n return { x: (box.minX + box.maxX) / 2, y: (box.minY + box.maxY) / 2 };\n}\n\nexport function textLabelPolygon(origin: Vec2, text: string, size: number): Vec2[] {\n const { width, height } = measureLabelText(text, size);\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 { ShapeGeometry, ShapeLabel, Vec2 } from '../core';\nimport {\n DEFAULT_ENTRANCE_SIZE,\n ENTRANCE_ICON_ID,\n canonicalizeEntranceLabel,\n clampEntranceSize,\n geometryBBox,\n isEntranceIcon,\n} from '../core';\nimport { polygonsToGeometry } from './geometryEdit';\nimport { isTextLabel, labelBoxCenter } from './labelText';\n\nexport {\n DEFAULT_ENTRANCE_SIZE,\n ENTRANCE_ICON_ID,\n canonicalizeEntranceLabel,\n clampEntranceSize,\n isEntranceIcon,\n};\n\nexport function isStampShape(shape: {\n kind: string;\n label?: { text?: string; imageKey?: string | null } | null;\n}): boolean {\n return isTextLabel(shape) || isEntranceIcon(shape);\n}\n\nexport function defaultEntranceLabel(size: number, color?: string): ShapeLabel {\n return {\n imageKey: ENTRANCE_ICON_ID,\n size: clampEntranceSize(size),\n color,\n rotate: 0,\n };\n}\n\nexport function entranceIconPolygon(center: Vec2, size: number): Vec2[] {\n const half = clampEntranceSize(size) / 2;\n return [\n { x: center.x - half, y: center.y - half },\n { x: center.x + half, y: center.y - half },\n { x: center.x + half, y: center.y + half },\n { x: center.x - half, y: center.y + half },\n ];\n}\n\nexport function entranceIconGeometry(center: Vec2, size: number): ShapeGeometry {\n return polygonsToGeometry([entranceIconPolygon(center, size)]);\n}\n\n/** Keep the icon centred when Size changes. */\nexport function geometryForEntranceIcon(\n geometry: ShapeGeometry,\n size: number,\n): ShapeGeometry {\n return entranceIconGeometry(labelBoxCenter(geometryBBox(geometry)), size);\n}\n","import type { Vec2 } from '../../core';\nimport { nextZoomFromWheel } from '../../core/wheelZoom';\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\nexport interface ViewBoxRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface ClientRectLike {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/**\n * Map a client (CSS pixel) point through the inverse of an SVG screen CTM.\n * Prefer {@link clientRectToViewBox} for pointer mapping — `getScreenCTM()` on\n * the root `<svg>` is wrong inside transformed admin-portal layout.\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\n/**\n * Viewport point → SVG viewBox user space, same method OrbitControls uses\n * (`getBoundingClientRect` + letterboxed viewBox). Default map zoom-to-cursor\n * works in admin-portal because of this; Edit Map must not use `getScreenCTM()`.\n *\n * Assumes `preserveAspectRatio=\"xMidYMid meet\"` (editor canvas default).\n */\nexport function clientRectToViewBox(\n rect: ClientRectLike,\n viewBox: ViewBoxRect,\n clientX: number,\n clientY: number,\n): Vec2 {\n const vbW = viewBox.width > 0 ? viewBox.width : Math.max(rect.width, 1);\n const vbH = viewBox.height > 0 ? viewBox.height : Math.max(rect.height, 1);\n const scale = Math.min(rect.width / vbW, rect.height / vbH);\n if (!(scale > 0) || !Number.isFinite(scale)) {\n return { x: viewBox.x, y: viewBox.y };\n }\n const originX = rect.left + (rect.width - vbW * scale) / 2;\n const originY = rect.top + (rect.height - vbH * scale) / 2;\n return {\n x: viewBox.x + (clientX - originX) / scale,\n y: viewBox.y + (clientY - originY) / scale,\n };\n}\n\nexport function pxPerUserFromViewBox(rect: ClientRectLike, viewBox: ViewBoxRect): number {\n const vbW = viewBox.width > 0 ? viewBox.width : Math.max(rect.width, 1);\n const vbH = viewBox.height > 0 ? viewBox.height : Math.max(rect.height, 1);\n const scale = Math.min(rect.width / vbW, rect.height / vbH);\n return scale > 0 && Number.isFinite(scale) ? scale : 1;\n}\n\nfunction readSvgViewBox(svg: SVGSVGElement): ViewBoxRect | null {\n const vb = svg.viewBox?.baseVal;\n if (vb && vb.width > 0 && vb.height > 0) {\n return { x: vb.x, y: vb.y, width: vb.width, height: vb.height };\n }\n const attr = svg.getAttribute('viewBox');\n if (!attr) return null;\n const parts = attr.trim().split(/[\\s,]+/).map(Number);\n if (parts.length !== 4 || parts.some((n) => !Number.isFinite(n))) return null;\n if (parts[2] <= 0 || parts[3] <= 0) return null;\n return { x: parts[0], y: parts[1], width: parts[2], height: parts[3] };\n}\n\nexport function clientToSvgUser(svg: SVGSVGElement, clientX: number, clientY: number): Vec2 {\n const viewBox = readSvgViewBox(svg);\n if (viewBox) {\n return clientRectToViewBox(svg.getBoundingClientRect(), viewBox, clientX, clientY);\n }\n const ctm = svg.getScreenCTM();\n if (!ctm) return { x: 0, y: 0 };\n return clientToUser(ctm, clientX, clientY);\n}\n\nexport function pxPerUserFromSvg(svg: SVGSVGElement): number {\n const viewBox = readSvgViewBox(svg);\n if (viewBox) return pxPerUserFromViewBox(svg.getBoundingClientRect(), viewBox);\n const ctm = svg.getScreenCTM();\n if (!ctm) return 1;\n return pxPerUserFromCtm(ctm);\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/** Same per-event step as PORTAL default MapViewer (three-stdlib OrbitControls). */\nexport function nextEditorZoomFromWheel(\n currentZoom: number,\n event: Pick<WheelEvent, 'deltaY'>,\n): number {\n return nextZoomFromWheel(currentZoom, event.deltaY, {\n min: EDITOR_MIN_ZOOM,\n max: EDITOR_MAX_ZOOM,\n });\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 * Counter-scale for editor handles whose world radius was computed at\n * `sizeZoom` while the SVG group is already at `liveZoom`.\n *\n * Wheel zoom paints `scale(liveZoom)` immediately and defers React, so\n * handle radii stay at the last settled zoom. This ratio keeps those\n * circles screen-constant without re-rendering the floor.\n */\nexport function editorHandleScale(sizeZoom: number, liveZoom: number): number {\n const size = sizeZoom === 0 ? 1 : sizeZoom;\n const live = liveZoom === 0 ? 1 : liveZoom;\n return size / live;\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 {\n isTransparentColor,\n isTransparentPadKind,\n resolvedShapeFill,\n staffPadPlaceholderFill,\n WALKING_PATH_COLOR,\n} 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 === 'void') return 0.22;\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 assignment?: { bgColor?: string | null } | null,\n): string {\n if (shape.kind === 'walkable') return WALKING_PATH_COLOR;\n if (shape.kind === 'void') return shape.style?.fill ?? '#94a3b8';\n const published = resolvedShapeFill(\n shape.kind,\n theme,\n shape.style?.fill,\n assignment,\n );\n if (\n isTransparentPadKind(shape.kind) &&\n isTransparentColor(published)\n ) {\n return staffPadPlaceholderFill(shape.kind, theme);\n }\n return published;\n}\n","import { INTERACTIVE_SHAPE_KINDS, type ShapeKind } from '../../core';\nimport { isShapeDrawTool, isStampDrawTool, 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' || kind === 'void';\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 /** Map text placed with the Text tool. */\n textLabel?: boolean;\n /** Entrance stamp placed with the Entrance tool. */\n entranceIcon?: boolean;\n}): 'pointer' | 'grab' | 'grabbing' | 'cell' | undefined {\n if (args.dragging) return 'grabbing';\n if (isShapeDrawTool(args.tool)) return 'cell';\n if (args.wayfinding && args.highlightable) return 'cell';\n if (isStampDrawTool(args.tool) && (args.textLabel || args.entranceIcon)) {\n return 'pointer';\n }\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 type {\n AssignmentIconTheme,\n CmAmenityCatalogItem,\n CmShape,\n CmShapeAssignment,\n LabelAlign,\n MapAssignRetailer,\n} from '../core';\nimport {\n assignmentOverlayImageUrl,\n assignmentOverlayRenderSize,\n assignmentOverlayVisible,\n assignmentSpecialIconId,\n DEFAULT_ASSIGNMENT_SIZE,\n geometryBBox,\n normalizeLabelAlign,\n publishedShapeLabel,\n resolveFetchUrl,\n resolvedAssignmentIconColor,\n} from '../core';\nimport { getMapSpecialSvg, mapSpecialSvgToDataUrl } from '../specialIcons';\n\nexport type WayfindingAssignedOverlay = {\n shapeId: number;\n x: number;\n y: number;\n rotate: number;\n /** Text font size, or image width (logos are already scaled). */\n size: number;\n color: string;\n align: LabelAlign;\n text?: string;\n imageUrl?: string;\n iconId?: string;\n};\n\ntype OverlayShape = Pick<CmShape, 'id' | 'kind' | 'geometry' | 'label' | 'style'>;\n\n/**\n * Live editor display uses the session CDN URL, not the persisted S3 key —\n * same as `compileDocument` when `persistMediaKeys` is off.\n */\nexport function liveDisplayRetailer(\n retailer?: MapAssignRetailer | null,\n): MapAssignRetailer | null {\n if (!retailer) return null;\n const key = retailer.logoKey?.trim() ?? '';\n if (!retailer.logoUrl && /^https?:\\/\\//i.test(key)) return retailer;\n return { ...retailer, logoKey: null };\n}\n\n/**\n * Name, logo, or amenity / kiosk icon for an assigned polygon. Unassigned\n * leftover text is dropped. Used by the wayfinding canvas only.\n */\nexport function wayfindingAssignedOverlay(\n shape: OverlayShape,\n assignment: CmShapeAssignment | null | undefined,\n retailer: MapAssignRetailer | null | undefined,\n amenities: Array<Pick<CmAmenityCatalogItem, 'id' | 'code'>> = [],\n theme: AssignmentIconTheme,\n): WayfindingAssignedOverlay | null {\n if (shape.kind === 'label' || shape.kind === 'entrance') return null;\n const displayRetailer = liveDisplayRetailer(retailer);\n const label = publishedShapeLabel(shape, assignment, displayRetailer);\n if (!assignmentOverlayVisible(assignment, label)) return null;\n const box = geometryBBox(shape.geometry);\n const fontSize =\n label.size || assignment?.size || DEFAULT_ASSIGNMENT_SIZE;\n const imageUrl = assignmentOverlayImageUrl(\n assignment,\n displayRetailer,\n label,\n );\n const iconId = imageUrl\n ? undefined\n : assignmentSpecialIconId(assignment, amenities);\n const text = imageUrl || iconId ? undefined : label.text?.trim() || undefined;\n if (!imageUrl && !iconId && !text) return null;\n return {\n shapeId: shape.id,\n x: (box.minX + box.maxX) / 2 + (label.offsetX ?? 0),\n y: (box.minY + box.maxY) / 2 + (label.offsetY ?? 0),\n rotate: label.rotate ?? 0,\n size: imageUrl\n ? assignmentOverlayRenderSize(fontSize, assignment)\n : fontSize,\n color: resolvedAssignmentIconColor(\n assignment,\n theme,\n label.color,\n shape.kind,\n ),\n align: normalizeLabelAlign(label.align),\n text,\n imageUrl,\n iconId,\n };\n}\n\nexport function wayfindingAssignedOverlays(input: {\n shapes: OverlayShape[];\n /** Outdoor/base shapes shown beneath the active building floor. */\n underlayShapes?: OverlayShape[];\n assignments: CmShapeAssignment[];\n retailers?: MapAssignRetailer[];\n amenities?: Array<Pick<CmAmenityCatalogItem, 'id' | 'code'>>;\n theme: AssignmentIconTheme;\n}): WayfindingAssignedOverlay[] {\n const retailerById = new Map(\n (input.retailers ?? []).map((item) => [item.id, item]),\n );\n const assignmentByShapeId = new Map(\n input.assignments.map((row) => [row.shapeId, row]),\n );\n const amenities = input.amenities ?? [];\n const overlays: WayfindingAssignedOverlay[] = [];\n for (const shape of [...(input.underlayShapes ?? []), ...input.shapes]) {\n const assignment = assignmentByShapeId.get(shape.id);\n const retailer =\n assignment?.retailerId != null\n ? retailerById.get(assignment.retailerId) ?? null\n : null;\n const overlay = wayfindingAssignedOverlay(\n shape,\n assignment,\n retailer,\n amenities,\n input.theme,\n );\n if (overlay) overlays.push(overlay);\n }\n return overlays;\n}\n\nexport function wayfindingOverlayHref(\n overlay: Pick<WayfindingAssignedOverlay, 'imageUrl' | 'iconId' | 'color'>,\n imageProxyUrl?: string | null,\n): string | undefined {\n if (overlay.imageUrl) return resolveFetchUrl(overlay.imageUrl, imageProxyUrl);\n if (!overlay.iconId) return undefined;\n const svg = getMapSpecialSvg(overlay.iconId);\n if (!svg) return undefined;\n return mapSpecialSvgToDataUrl(svg, overlay.color);\n}\n","import React from 'react';\nimport { labelSvgTextAnchor } from '../../core';\nimport {\n LABEL_FONT_FAMILY,\n LABEL_LINE_HEIGHT,\n labelTextLines,\n} from '../labelText';\nimport {\n wayfindingOverlayHref,\n type WayfindingAssignedOverlay,\n} from '../assignmentOverlay';\n\n/** Pointer-events none so wayfinding hover / click stay on the polygon. */\nexport function AssignedShapeOverlay({\n overlay,\n imageProxyUrl,\n}: {\n overlay: WayfindingAssignedOverlay;\n imageProxyUrl?: string | null;\n}) {\n const { x, y, rotate, size, color, align, text } = overlay;\n const href = wayfindingOverlayHref(overlay, imageProxyUrl);\n const transform = rotate ? `rotate(${rotate} ${x} ${y})` : undefined;\n return (\n <g\n className=\"eyeon-map-canvas__assigned-overlay\"\n data-shape-id={overlay.shapeId}\n transform={transform}\n pointerEvents=\"none\"\n >\n {href ? (\n <image\n href={href}\n x={x - size / 2}\n y={y - size / 2}\n width={size}\n height={size}\n preserveAspectRatio=\"xMidYMid meet\"\n />\n ) : text ? (\n <AssignedOverlayText\n text={text}\n x={x}\n y={y}\n size={size}\n color={color}\n align={align}\n />\n ) : null}\n </g>\n );\n}\n\nfunction AssignedOverlayText({\n text,\n x,\n y,\n size,\n color,\n align,\n}: {\n text: string;\n x: number;\n y: number;\n size: number;\n color: string;\n align: WayfindingAssignedOverlay['align'];\n}) {\n const lines = labelTextLines(text);\n const lineHeight = size * LABEL_LINE_HEIGHT;\n const blockHeight = lines.length * lineHeight;\n return (\n <text\n fontFamily={LABEL_FONT_FAMILY}\n fontSize={size}\n fill={color}\n textAnchor={labelSvgTextAnchor(align)}\n style={{ userSelect: 'none' }}\n >\n {lines.map((line, index) => (\n <tspan\n key={index}\n x={x}\n y={y - blockHeight / 2 + (index + 0.5) * lineHeight}\n dominantBaseline=\"central\"\n >\n {line || ' '}\n </tspan>\n ))}\n </text>\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport {\n outdoorDecorationFromSvg,\n resolveFetchUrl,\n type StaticLayerTheme,\n} from '../../core';\n\nexport function OutdoorSvgUnderlay({\n url,\n imageProxyUrl,\n suppressIds,\n theme,\n}: {\n url: string;\n imageProxyUrl?: string | null;\n suppressIds?: ReadonlySet<string>;\n theme?: StaticLayerTheme | null;\n}) {\n const [svgText, setSvgText] = useState<string | null>(null);\n const suppressKey = useMemo(\n () => (suppressIds ? [...suppressIds].sort().join('\\0') : ''),\n [suppressIds],\n );\n\n useEffect(() => {\n let cancelled = false;\n const controller = new AbortController();\n const fetchUrl = resolveFetchUrl(url, imageProxyUrl);\n fetch(fetchUrl, { signal: controller.signal })\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 setSvgText(text);\n })\n .catch((err) => {\n if (cancelled) return;\n if (err instanceof DOMException && err.name === 'AbortError') return;\n setSvgText(null);\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 controller.abort();\n };\n }, [url, imageProxyUrl]);\n\n const paths = useMemo(() => {\n if (!svgText) return [];\n const blocked = suppressKey\n ? new Set(suppressKey.split('\\0').filter(Boolean))\n : undefined;\n return outdoorDecorationFromSvg(svgText, blocked, theme);\n }, [svgText, suppressKey, theme]);\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';\nimport { isStampShape } from '../entranceIcon';\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\n/** Text and entrance hit-boxes stay on Outdoor — do not ghost them onto building floors. */\nexport function isUnderlayDrawnShape(shape: {\n kind: string;\n label?: { text?: string; imageKey?: string | null } | null;\n}): boolean {\n return !isStampShape(shape);\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 routeComponentAnchorIds(\n anchorId: number,\n edges: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>>,\n): Set<number> {\n const ids = new Set([anchorId]);\n const pending = [anchorId];\n while (pending.length > 0) {\n const current = pending.pop()!;\n for (const edge of edges) {\n let next: number | null = null;\n if (edge.fromAnchorId === current) next = edge.toAnchorId;\n if (edge.toAnchorId === current) next = edge.fromAnchorId;\n if (next == null || ids.has(next)) continue;\n ids.add(next);\n pending.push(next);\n }\n }\n return ids;\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 anchorById: ReadonlyMap<number, CmAnchor> = new Map(\n anchors.map((anchor) => [anchor.id, anchor]),\n ),\n): RouteSnapTarget | null {\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 = anchorById.get(edge.fromAnchorId);\n const to = anchorById.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\n/** Snap a loose route junction onto an existing route and join the graph. */\nexport function connectRouteAnchorToRouteOps(input: {\n anchor: CmAnchor;\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n mapId: number;\n drop: Vec2;\n maxDist: number;\n allocId: () => number;\n}): BatchOp[] {\n const { anchor, anchors, edges, mapId, drop, maxDist, allocId } = input;\n const incident = edges.filter(\n (edge) =>\n edge.fromAnchorId === anchor.id || edge.toAnchorId === anchor.id,\n );\n if (anchor.shapeId != null || incident.length > 1) return [];\n\n const snap = nearestRouteSnap(\n drop,\n anchors,\n edges,\n routeComponentAnchorIds(anchor.id, edges),\n maxDist,\n );\n if (!snap) return [];\n\n if (snap.type === 'junction') {\n if (incident.length === 1) {\n const source = incident[0];\n const otherId =\n source.fromAnchorId === anchor.id\n ? source.toAnchorId\n : source.fromAnchorId;\n const ops: BatchOp[] = [];\n if (!walkEdgeExists(edges, otherId, snap.anchorId)) {\n ops.push({\n op: 'upsert_edge',\n edge: {\n ...source,\n fromAnchorId:\n source.fromAnchorId === anchor.id\n ? snap.anchorId\n : source.fromAnchorId,\n toAnchorId:\n source.toAnchorId === anchor.id\n ? snap.anchorId\n : source.toAnchorId,\n },\n });\n } else {\n ops.push({ op: 'delete_edge', edgeId: source.id });\n }\n ops.push({ op: 'delete_anchor', anchorId: anchor.id });\n return ops;\n }\n\n const link = linkRouteAnchorsOp(\n mapId,\n anchor.id,\n snap.anchorId,\n edges,\n allocId,\n );\n const ops: BatchOp[] = [\n {\n op: 'upsert_anchor',\n anchor: { ...anchor, x: snap.point.x, y: snap.point.y },\n },\n ];\n if (link) ops.push(link);\n return ops;\n }\n\n const source = edges.find((edge) => edge.id === snap.edgeId);\n if (!source) return [];\n return [\n {\n op: 'upsert_anchor',\n anchor: { ...anchor, x: snap.point.x, y: snap.point.y },\n },\n { op: 'delete_edge', edgeId: source.id },\n {\n op: 'upsert_edge',\n edge: walkEdge(\n allocId(),\n mapId,\n source.fromAnchorId,\n anchor.id,\n source.kind,\n ),\n },\n {\n op: 'upsert_edge',\n edge: walkEdge(\n allocId(),\n mapId,\n anchor.id,\n source.toAnchorId,\n source.kind,\n ),\n },\n ];\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 CmAmenityCatalogItem,\n CmAnchor,\n CmLevel,\n CmRouteEdge,\n CmShape,\n CmShapeAssignment,\n MapAssignRetailer,\n ShapeGeometry,\n ShapeKind,\n ShapeLabel,\n ThemeDefaults,\n Vec2,\n ViewBox,\n} from '../../core';\nimport {\n geometryBBox,\n INTERACTIVE_SHAPE_KINDS,\n labelAlignX,\n labelSvgTextAnchor,\n normalizeLabelAlign,\n svgIdsOwnedByShapes,\n unionViewBox,\n} from '../../core';\nimport { isEditableTypingTarget } from '../history';\nimport {\n canJoinOpenEnds,\n canPlaceNewRoute,\n canSelectShapes,\n emptyCanvasDragPans,\n isEllipseDrawTool,\n isPolygonDrawTool,\n isShapeDrawTool,\n isSplitJoinTool,\n isStampDrawTool,\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 ellipseBoundsFromDrag,\n ellipseGeometry,\n} from '../ellipseDraw';\nimport {\n DEFAULT_LABEL_TEXT,\n LABEL_FONT_FAMILY,\n LABEL_LINE_HEIGHT,\n defaultLabelSize,\n defaultTextLabel,\n isTextLabel,\n labelBoxCenter,\n labelTextLines,\n textLabelGeometry,\n} from '../labelText';\nimport {\n DEFAULT_ENTRANCE_SIZE,\n defaultEntranceLabel,\n entranceIconGeometry,\n isEntranceIcon,\n isStampShape,\n} from '../entranceIcon';\nimport { entranceIconDataUrl } from '../../specialIcons';\nimport { ensureMapFont } from '../../fonts/mapFontUrl';\nimport {\n clampEditorZoom,\n clientToSvgUser,\n EDITOR_ZOOM_ANIM_MS,\n editorHandleScale,\n interpolateView,\n nextEditorZoomFromWheel,\n panAfterZoom,\n panKeepingWorldAtUser,\n pxPerUserFromSvg,\n screenPxToWorld,\n userToWorld,\n} from './coords';\nimport { editorShapeFill, editorShapeFillOpacity } from './editorFill';\nimport {\n editorHoverFillOpacity,\n editorSelectCursor,\n isHoverHighlightShape,\n} from './editorHover';\nimport { wayfindingAssignedOverlays } from '../assignmentOverlay';\nimport { AssignedShapeOverlay } from './AssignedShapeOverlay';\nimport { OutdoorSvgUnderlay } from './OutdoorSvgUnderlay';\nimport {\n isUnderlayDrawnShape,\n isUnderlayHintShape,\n underlaySwitchHint,\n} from './underlayHint';\nimport {\n WAYFINDING_ANCHOR_HIT_PX,\n WAYFINDING_SNAP_PX,\n beginOrContinueRouteDraft,\n isWayfindingShape,\n routeRubberBand,\n routeComponentAnchorIds,\n routeSessionUndoKind,\n nearestRouteSnap,\n showsWayfinding,\n storeLinkOriginIds,\n wayfindingLinksShapes,\n type RouteSnapTarget,\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 HANDLE_LINE_PX = 2.25;\nconst HANDLE_LINE_HALO_PX = 4;\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\n/** Settled world stroke; CSS multiplies by --map-handle-scale during wheel. */\nfunction screenStrokeStyle(width: number): React.CSSProperties {\n return { ['--map-stroke-width']: width } as React.CSSProperties;\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 <g transform={`translate(${cx} ${cy})`}>\n <g className=\"eyeon-map-screen-const\">\n <circle cx={0} cy={0} r={hitR} fill=\"transparent\" />\n <circle\n cx={0}\n cy={0}\n r={r}\n fill={fill}\n fillOpacity={fillOpacity}\n stroke={stroke}\n strokeWidth={strokeWidth}\n strokeDasharray={strokeDasharray}\n />\n </g>\n </g>\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 /** Center retailers — wayfinding draws assigned names / logos from these. */\n retailers?: MapAssignRetailer[];\n /** Amenity catalog — wayfinding draws assigned amenity / kiosk icons. */\n amenities?: CmAmenityCatalogItem[];\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 and Wayfinding floor (and\n * Outdoor) so 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 /** Floor below, clipped to openings so Edit Map previews the atrium. */\n openingUnderlayShapes?: 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 onConnectRouteAnchorToRoute: (\n anchorId: number,\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 /** Shown when no floor or Outdoor is selected. */\n emptyMessage?: string;\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 (isStampShape(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 assignments,\n retailers = [],\n amenities = [],\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 openingUnderlayShapes = [],\n interactiveOnly = false,\n showGrid = true,\n routeMode = false,\n readOnly = false,\n emptyMessage = 'Choose a floor or Outdoor to edit',\n onSelectShape,\n onSelectAnchors,\n onCreateRoutePoint,\n onCreateRouteSegment,\n onLinkRouteAnchors,\n onInsertRouteJunction,\n onDeleteRouteAnchor,\n onConnectShapeToRoute,\n onConnectRouteAnchorToRoute,\n onEnsureShapeAnchor,\n onMoveAnchor,\n onCreateShape,\n onUpdateShapeGeometry,\n onBatchShapeEdits,\n onHistoryGestureEnd,\n onUndo,\n onRouteDraftActiveChange,\n onToolChange,\n}, ref) {\n ensureMapFont();\n const wayfindingOn = showsWayfinding(tool, routeMode);\n const svgRef = useRef<SVGSVGElement>(null);\n const viewGroupRef = useRef<SVGGElement>(null);\n const canvasRef = useRef<HTMLDivElement>(null);\n const [, setPan] = useState({ x: 0, y: 0 });\n const [zoom, setZoom] = useState(1);\n const viewRef = useRef({ pan: { x: 0, y: 0 }, zoom: 1 });\n /** Zoom last used to compute `worldPx` handle radii in React. */\n const sizeZoomRef = useRef(1);\n const wheelFrameRef = useRef<number | null>(null);\n const wheelSettleRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const routeHoverFrameRef = useRef<number | null>(null);\n const routeHoverClientRef = useRef<Vec2 | null>(null);\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 [drawLockCircle, setDrawLockCircle] = useState(false);\n const [polygonPoints, setPolygonPoints] = useState<Vec2[]>([]);\n const [dragAnchor, setDragAnchor] = useState<number | null>(null);\n const [dragAnchorPoint, setDragAnchorPoint] = useState<Vec2 | 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 [routePointerSnap, setRoutePointerSnap] =\n useState<RouteSnapTarget | null>(null);\n const routeHover =\n routePointerSnap?.type === 'edge'\n ? { edgeId: routePointerSnap.edgeId, point: routePointerSnap.point }\n : 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 const worldPx = (px: number) =>\n screenPxToWorld(px, viewRef.current.zoom, pxPerUser);\n\n const syncViewDom = (nextPan: Vec2, nextZoom: number) => {\n const g = viewGroupRef.current;\n if (!g) return;\n g.setAttribute(\n 'transform',\n `translate(${nextPan.x}, ${nextPan.y}) scale(${nextZoom})`,\n );\n // One CSS var — not a React re-render of every store/route node.\n g.style.setProperty(\n '--map-handle-scale',\n String(editorHandleScale(sizeZoomRef.current, nextZoom)),\n );\n };\n\n const applyView = (nextPan: Vec2, nextZoom: number) => {\n cancelWheelWork();\n viewRef.current = { pan: nextPan, zoom: nextZoom };\n setPan(nextPan);\n setZoom(nextZoom);\n };\n\n // Wheel input can fire much faster than paint. Move the SVG group\n // imperatively once per frame, then let React reconcile once scrolling ends.\n // Handle dots counter-scale in that same frame so they do not swell/shrink.\n const paintView = () => {\n wheelFrameRef.current = null;\n const { pan: nextPan, zoom: nextZoom } = viewRef.current;\n syncViewDom(nextPan, nextZoom);\n };\n\n const settleWheelView = () => {\n wheelSettleRef.current = null;\n const { pan: nextPan, zoom: nextZoom } = viewRef.current;\n setPan(nextPan);\n setZoom(nextZoom);\n };\n\n const scheduleWheelPaint = () => {\n if (wheelFrameRef.current == null) {\n wheelFrameRef.current = requestAnimationFrame(paintView);\n }\n if (wheelSettleRef.current != null) clearTimeout(wheelSettleRef.current);\n wheelSettleRef.current = setTimeout(settleWheelView, 80);\n };\n\n const cancelWheelWork = () => {\n if (wheelFrameRef.current != null) {\n cancelAnimationFrame(wheelFrameRef.current);\n wheelFrameRef.current = null;\n }\n if (wheelSettleRef.current != null) {\n clearTimeout(wheelSettleRef.current);\n wheelSettleRef.current = null;\n }\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 cancelWheelWork();\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 const renderedZoom = viewRef.current.zoom;\n useLayoutEffect(() => {\n // Every commit: mid-wheel hover re-renders recompute worldPx from live\n // viewRef, so the CSS scale must reset in that same paint.\n sizeZoomRef.current = renderedZoom;\n syncViewDom(viewRef.current.pan, viewRef.current.zoom);\n });\n\n useEffect(\n () => () => {\n cancelZoomAnim();\n cancelWheelWork();\n },\n [],\n );\n\n useEffect(() => {\n setDrawing([]);\n setDrawLockCircle(false);\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 setDragAnchor(null);\n setDragAnchorPoint(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n if (routeHoverFrameRef.current != null) {\n cancelAnimationFrame(routeHoverFrameRef.current);\n routeHoverFrameRef.current = null;\n }\n routeHoverClientRef.current = null;\n setRoutePointerSnap(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 clearRouteSession();\n setStubDrag(null);\n setRoutePointerSnap(null);\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 next = pxPerUserFromSvg(svg);\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 const openingShapes = useMemo(\n () => editableShapes.filter((s) => s.kind === 'void'),\n [editableShapes],\n );\n const openingClipId = `eyeon-opening-clip-${level?.id ?? 'none'}`;\n const openingHatchId = `eyeon-opening-hatch-${level?.id ?? 'none'}`;\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) && !isStampShape(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 (isStampShape(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 const { pan: currentPan, zoom: currentZoom } = viewRef.current;\n return userToWorld(\n clientToSvgUser(svg, clientX, clientY),\n currentPan,\n currentZoom,\n );\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 const connectedAnchorIds = useMemo(() => {\n const ids = new Set<number>();\n edges.forEach((edge) => {\n ids.add(edge.fromAnchorId);\n ids.add(edge.toAnchorId);\n });\n return ids;\n }, [edges]);\n const routeAnchorDegreeById = useMemo(() => {\n const degree = new Map<number, number>();\n edges.forEach((edge) => {\n degree.set(\n edge.fromAnchorId,\n (degree.get(edge.fromAnchorId) ?? 0) + 1,\n );\n degree.set(\n edge.toAnchorId,\n (degree.get(edge.toAnchorId) ?? 0) + 1,\n );\n });\n return degree;\n }, [edges]);\n const dragRouteExcludeIds = useMemo(\n () =>\n dragAnchor == null\n ? new Set<number>()\n : routeComponentAnchorIds(dragAnchor, edges),\n [dragAnchor, edges],\n );\n const draggingOpenRouteAnchor =\n tool === 'select' &&\n dragAnchor != null &&\n anchorById.get(dragAnchor)?.shapeId == null &&\n (routeAnchorDegreeById.get(dragAnchor) ?? 0) <= 1;\n const dragRouteSnap =\n draggingOpenRouteAnchor && dragAnchorPoint\n ? nearestRouteSnap(\n dragAnchorPoint,\n anchors,\n edges,\n dragRouteExcludeIds,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n )\n : null;\n const displayAnchorById = useMemo(() => {\n if (dragAnchor == null || !dragAnchorPoint) return anchorById;\n const dragged = anchorById.get(dragAnchor);\n if (!dragged) return anchorById;\n const next = new Map(anchorById);\n next.set(dragAnchor, {\n ...dragged,\n ...(dragRouteSnap?.point ?? dragAnchorPoint),\n });\n return next;\n }, [anchorById, dragAnchor, dragAnchorPoint, dragRouteSnap]);\n const routeEdgePath = useMemo(\n () =>\n edges\n .map((edge) => {\n const from = displayAnchorById.get(edge.fromAnchorId);\n const to = displayAnchorById.get(edge.toAnchorId);\n return from && to\n ? `M ${from.x} ${from.y} L ${to.x} ${to.y}`\n : '';\n })\n .filter(Boolean)\n .join(' '),\n [displayAnchorById, edges],\n );\n const assignmentByShapeId = useMemo(\n () => new Map(assignments.map((row) => [row.shapeId, row])),\n [assignments],\n );\n const assignedOverlays = useMemo(\n () =>\n wayfindingOn\n ? wayfindingAssignedOverlays({\n shapes: editableShapes,\n underlayShapes,\n assignments,\n retailers,\n amenities,\n theme,\n })\n : [],\n [\n amenities,\n assignments,\n editableShapes,\n retailers,\n theme,\n underlayShapes,\n wayfindingOn,\n ],\n );\n\n const cancelRouteHoverFrame = () => {\n if (routeHoverFrameRef.current != null) {\n cancelAnimationFrame(routeHoverFrameRef.current);\n routeHoverFrameRef.current = null;\n }\n routeHoverClientRef.current = null;\n };\n\n const scheduleRouteHover = (clientX: number, clientY: number) => {\n routeHoverClientRef.current = { x: clientX, y: clientY };\n if (routeHoverFrameRef.current != null) return;\n routeHoverFrameRef.current = requestAnimationFrame(() => {\n routeHoverFrameRef.current = null;\n const client = routeHoverClientRef.current;\n routeHoverClientRef.current = null;\n if (!client) return;\n const world = toWorld(client.x, client.y);\n if (\n routeDraftPoint ||\n storeLinkPreview ||\n (canPlaceNewRoute(tool) && lastRouteAnchor != null)\n ) {\n setRubberCursor(world);\n }\n setRoutePointerSnap(\n nearestRouteSnap(\n world,\n anchors,\n edges,\n storeLinkOriginIds(anchors, storeLinkPreview),\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n ),\n );\n });\n };\n\n useEffect(() => () => cancelRouteHoverFrame(), []);\n\n const closePolygon = () => {\n if (polygonPoints.length < 3) {\n setPolygonPoints([]);\n setRubberCursor(null);\n setPolygonSnap(null);\n return;\n }\n onCreateShape(\n tool === 'draw-void' ? 'void' : 'unit',\n polygonsToGeometry([polygonPoints]),\n );\n setPolygonPoints([]);\n setRubberCursor(null);\n setPolygonSnap(null);\n };\n\n useEffect(() => {\n if (!isEllipseDrawTool(tool)) return;\n const onShift = (e: KeyboardEvent) => {\n if (e.key !== 'Shift') return;\n setDrawLockCircle(e.type === 'keydown');\n };\n window.addEventListener('keydown', onShift);\n window.addEventListener('keyup', onShift);\n return () => {\n window.removeEventListener('keydown', onShift);\n window.removeEventListener('keyup', onShift);\n };\n }, [tool]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (isPolygonDrawTool(tool)) {\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 e.preventDefault();\n if (e.deltaY === 0) return;\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 = nextEditorZoomFromWheel(currentZoom, e);\n if (nextZoom === currentZoom) return;\n viewRef.current = {\n pan: panAfterZoom(user, currentPan, currentZoom, nextZoom),\n zoom: nextZoom,\n };\n scheduleWheelPaint();\n };\n node.addEventListener('wheel', onWheel, { passive: false, capture: true });\n return () => {\n cancelWheelWork();\n node.removeEventListener('wheel', onWheel, { capture: true });\n };\n }, [Boolean(level)]);\n\n const beginPinch = () => {\n cancelWheelWork();\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 setDragAnchorPoint(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 setDragAnchorPoint(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 (isPolygonDrawTool(tool)) {\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 anchorById,\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(\n nextRouteChainAnchor(\n tool,\n typeof created === 'number' ? created : null,\n ),\n );\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(\n nextRouteChainAnchor(\n tool,\n typeof created === 'number' ? created : null,\n ),\n );\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-entrance') {\n onCreateShape(\n 'entrance',\n entranceIconGeometry(world, DEFAULT_ENTRANCE_SIZE),\n { label: defaultEntranceLabel(DEFAULT_ENTRANCE_SIZE, theme.STORE_TEXT_COLOR) },\n );\n return;\n }\n if (tool === 'draw-unit' || isEllipseDrawTool(tool)) {\n e.currentTarget.setPointerCapture?.(e.pointerId);\n setDrawLockCircle(e.shiftKey);\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 applyView(nextPan, viewRef.current.zoom);\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 setDragAnchorPoint(toWorld(e.clientX, e.clientY));\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 (\n (tool === 'draw-unit' || isEllipseDrawTool(tool)) &&\n drawing.length > 0\n ) {\n const world = toWorld(e.clientX, e.clientY);\n if (isEllipseDrawTool(tool)) setDrawLockCircle(e.shiftKey);\n setDrawing((prev) => {\n if (prev.length === 0) return prev;\n return [prev[0], world];\n });\n }\n if (isPolygonDrawTool(tool) && 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 scheduleRouteHover(e.clientX, e.clientY);\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 setDrawLockCircle(false);\n };\n\n const finishEllipse = (lockCircle: boolean) => {\n if (drawing.length < 2) {\n setDrawing([]);\n setDrawLockCircle(false);\n return;\n }\n const [a, b] = [drawing[0], drawing[drawing.length - 1]];\n if (dragSize(a, b) < 2) {\n setDrawing([]);\n setDrawLockCircle(false);\n return;\n }\n onCreateShape(\n tool === 'draw-void-circle' ? 'void' : 'unit',\n ellipseGeometry(a, b, lockCircle),\n );\n setDrawing([]);\n setDrawLockCircle(false);\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 const point = dragAnchorPoint ?? moved;\n if (moved && point) {\n if (\n tool === 'select' &&\n moved.shapeId == null &&\n (routeAnchorDegreeById.get(moved.id) ?? 0) <= 1\n ) {\n const drop = toWorld(e.clientX, e.clientY);\n const snap = nearestRouteSnap(\n drop,\n anchors,\n edges,\n dragRouteExcludeIds,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n );\n if (snap) {\n onConnectRouteAnchorToRoute(\n moved.id,\n drop,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n );\n onSelectAnchors([\n snap.type === 'junction' ? snap.anchorId : moved.id,\n ]);\n setDragAnchor(null);\n setDragAnchorPoint(null);\n setRoutePointerSnap(null);\n return;\n }\n }\n if (Math.hypot(point.x - moved.x, point.y - moved.y) >= 0.01) {\n onMoveAnchor(moved.id, point.x, point.y);\n onHistoryGestureEnd?.();\n }\n const near = anchors\n .filter((a) => a.id !== moved.id)\n .filter((a) => Math.hypot(a.x - point.x, a.y - point.y) <= 2.5)\n .map((a) => a.id);\n if (near.length) onSelectAnchors([moved.id, ...near]);\n }\n setDragAnchor(null);\n setDragAnchorPoint(null);\n return;\n }\n if (tool === 'draw-unit') finishRect();\n if (isEllipseDrawTool(tool)) finishEllipse(e.shiftKey);\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 anchorById,\n )\n : storeLinkPreview && rubberCursor && stubExcludeIds\n ? routePointerSnap\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 ? routePointerSnap\n : null;\n const highlightedRouteEdgeId =\n (dragRouteSnap?.type === 'edge' ? dragRouteSnap.edgeId : null) ??\n (stubSnap?.type === 'edge' ? stubSnap.edgeId : null) ??\n routeHover?.edgeId ??\n null;\n const highlightedRouteEdge =\n highlightedRouteEdgeId == null\n ? null\n : edges.find((edge) => edge.id === highlightedRouteEdgeId) ?? null;\n const highlightedRouteFrom = highlightedRouteEdge\n ? displayAnchorById.get(highlightedRouteEdge.fromAnchorId)\n : null;\n const highlightedRouteTo = highlightedRouteEdge\n ? displayAnchorById.get(highlightedRouteEdge.toAnchorId)\n : null;\n const routePlusAt =\n (dragRouteSnap?.type === 'edge' ? dragRouteSnap.point : null) ??\n (stubSnap?.type === 'edge' ? stubSnap.point : null) ??\n routeHover?.point ??\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 isPolygonDrawTool(tool) && polygonPoints.length > 0\n ? routeRubberBand(polygonPoints[polygonPoints.length - 1], rubberCursor)\n : null;\n const polygonClose =\n isPolygonDrawTool(tool) && 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\">{emptyMessage}</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 preserveAspectRatio=\"xMidYMid meet\"\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 : tool === 'draw-entrance'\n ? 'cell'\n : isPanning || shapeDrag\n ? 'grabbing'\n : emptyCanvasDragPans(tool)\n ? 'grab'\n : isShapeDrawTool(tool) && !readOnly\n ? 'cell'\n : undefined,\n }}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n onPointerLeave={() => {\n cancelRouteHoverFrame();\n setRoutePointerSnap(null);\n }}\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\n ref={viewGroupRef}\n className=\"eyeon-map-canvas__view\"\n transform={`translate(${viewRef.current.pan.x}, ${viewRef.current.pan.y}) scale(${viewRef.current.zoom})`}\n >\n <defs>\n <pattern\n id={openingHatchId}\n patternUnits=\"userSpaceOnUse\"\n width={14}\n height={14}\n >\n <rect width=\"14\" height=\"14\" fill=\"#94a3b8\" fillOpacity=\"0.16\" />\n <path d=\"M-2 16 L16 -2\" stroke=\"#64748b\" strokeWidth=\"1.15\" />\n </pattern>\n {openingShapes.length > 0 ? (\n <clipPath id={openingClipId}>\n {openingShapes.map((shape) => (\n <path key={shape.id} d={shapePathD(shape)} />\n ))}\n </clipPath>\n ) : null}\n </defs>\n {svgUnderlayUrl ? (\n <OutdoorSvgUnderlay\n url={svgUnderlayUrl}\n imageProxyUrl={imageProxyUrl}\n suppressIds={svgSuppressIds}\n theme={theme}\n />\n ) : null}\n\n {underlayShapes.filter(isUnderlayDrawnShape).map((shape) => {\n const hintable = !wayfindingOn && 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(\n shape,\n theme,\n assignmentByShapeId.get(shape.id),\n )}\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 {openingShapes.length > 0 && openingUnderlayShapes.length > 0 ? (\n <g clipPath={`url(#${openingClipId})`} pointerEvents=\"none\">\n {openingUnderlayShapes.filter(isUnderlayDrawnShape).map((shape) => (\n <path\n key={`below-${shape.id}`}\n d={\n shape.geometry.paths.map((p) => p.d).join(' ') ||\n polygonsToPath(shape.geometry.polygons)\n }\n fill={editorShapeFill(\n shape,\n theme,\n assignmentByShapeId.get(shape.id),\n )}\n fillOpacity={0.55}\n stroke=\"#94a3b8\"\n strokeWidth={0.8 / zoom}\n />\n ))}\n </g>\n ) : null}\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 textLabel = isTextLabel(shape);\n const entranceIcon = isEntranceIcon(shape);\n const stamp = textLabel || entranceIcon;\n const cursor =\n editorSelectCursor({\n tool,\n selected,\n highlightable,\n dragging,\n wayfinding:\n wayfindingOn &&\n !readOnly &&\n isWayfindingShape(shape.kind) &&\n !stamp,\n textLabel,\n entranceIcon,\n }) ??\n (isStampDrawTool(tool) || (canSelectShapes(tool) && !readOnly)\n ? undefined\n : isShapeDrawTool(tool)\n ? 'cell'\n : '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 !stamp\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 (stamp && isStampDrawTool(tool)) {\n e.stopPropagation();\n onSelectShape(shape.id);\n onToolChange?.('select');\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 (entranceIcon) {\n const geometry =\n selected && displayGeometry\n ? displayGeometry\n : shape.geometry;\n const box = geometryBBox(geometry);\n const size = shape.label.size ?? DEFAULT_ENTRANCE_SIZE;\n const rotate = shape.label.rotate ?? 0;\n const { x: cx, y: cy } = labelBoxCenter(box);\n const iconUrl = entranceIconDataUrl(\n shape.label.color ?? theme.STORE_TEXT_COLOR,\n );\n return (\n <g\n key={shape.id}\n transform={\n rotate ? `rotate(${rotate} ${cx} ${cy})` : undefined\n }\n style={{ cursor: cursor ?? 'pointer' }}\n {...hoverHandlers}\n >\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 {iconUrl ? (\n <image\n href={iconUrl}\n x={box.minX}\n y={box.minY}\n width={box.maxX - box.minX}\n height={box.maxY - box.minY}\n style={{ pointerEvents: 'none' }}\n />\n ) : null}\n </g>\n );\n }\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 const rotate = shape.label.rotate ?? 0;\n const { x: cx, y: cy } = labelBoxCenter(box);\n const align = normalizeLabelAlign(shape.label.align);\n const textX = labelAlignX(box, align);\n const lines = labelTextLines(shape.label.text ?? '');\n const lineHeight = size * LABEL_LINE_HEIGHT;\n const blockHeight = lines.length * lineHeight;\n return (\n <g\n key={shape.id}\n transform={\n rotate ? `rotate(${rotate} ${cx} ${cy})` : undefined\n }\n style={{ cursor: cursor ?? 'pointer' }}\n {...hoverHandlers}\n >\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 fontFamily={LABEL_FONT_FAMILY}\n fontSize={size}\n fill={shape.label.color ?? theme.STORE_TEXT_COLOR}\n textAnchor={labelSvgTextAnchor(align)}\n style={{ userSelect: 'none', cursor: cursor ?? 'pointer' }}\n onPointerDown={beginShapePointerDown}\n >\n {lines.map((line, index) => (\n <tspan\n key={index}\n x={textX}\n y={cy - blockHeight / 2 + (index + 0.5) * lineHeight}\n dominantBaseline=\"central\"\n >\n {line || ' '}\n </tspan>\n ))}\n </text>\n </g>\n );\n }\n const baseOpacity = editorShapeFillOpacity(shape.kind);\n const opening = shape.kind === 'void';\n return (\n <path\n key={shape.id}\n d={shapePathD(shape)}\n fill={\n opening\n ? `url(#${openingHatchId})`\n : editorShapeFill(\n shape,\n theme,\n assignmentByShapeId.get(shape.id),\n )\n }\n fillOpacity={\n opening\n ? 1\n : editorHoverFillOpacity(\n shape.kind,\n baseOpacity,\n hovered,\n )\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 strokeDasharray={\n opening && !selected && !hovered\n ? `${6 / zoom} ${4 / zoom}`\n : undefined\n }\n onPointerDown={beginShapePointerDown}\n style={{ cursor }}\n {...hoverHandlers}\n />\n );\n })}\n\n {assignedOverlays.map((overlay) => (\n <AssignedShapeOverlay\n key={`assign-overlay-${overlay.shapeId}`}\n overlay={overlay}\n imageProxyUrl={imageProxyUrl}\n />\n ))}\n\n {/* Anchors (Select, Curve, Split / Join) + curve helpers (Curve only) */}\n {canSelectShapes(tool) &&\n selectedShape &&\n !isStampShape(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 className=\"eyeon-map-screen-const\"\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-halo-${selectedShape.id}-${ri}-${ei}`}\n x1={from.x}\n y1={from.y}\n x2={edge.c1.x}\n y2={edge.c1.y}\n stroke=\"#fff\"\n strokeWidth={worldPx(HANDLE_LINE_HALO_PX)}\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />,\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={worldPx(HANDLE_LINE_PX)}\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />,\n <line\n key={`hl2-halo-${selectedShape.id}-${ri}-${ei}`}\n x1={to.x}\n y1={to.y}\n x2={edge.c2.x}\n y2={edge.c2.y}\n stroke=\"#fff\"\n strokeWidth={worldPx(HANDLE_LINE_HALO_PX)}\n strokeLinecap=\"round\"\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={worldPx(HANDLE_LINE_PX)}\n strokeLinecap=\"round\"\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 && routeEdgePath ? (\n <path\n className=\"eyeon-map-screen-stroke\"\n d={routeEdgePath}\n fill=\"none\"\n stroke={theme.ACCENT_COLOR}\n strokeWidth={8 / zoom}\n style={screenStrokeStyle(8 / zoom)}\n strokeLinecap=\"round\"\n strokeOpacity={0.95}\n pointerEvents=\"none\"\n />\n ) : null}\n\n {wayfindingOn && highlightedRouteFrom && highlightedRouteTo ? (\n <g pointerEvents=\"none\">\n <line\n className=\"eyeon-map-screen-stroke\"\n x1={highlightedRouteFrom.x}\n y1={highlightedRouteFrom.y}\n x2={highlightedRouteTo.x}\n y2={highlightedRouteTo.y}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(12)}\n style={screenStrokeStyle(worldPx(12))}\n strokeOpacity={0.22}\n strokeLinecap=\"round\"\n />\n <line\n className=\"eyeon-map-screen-stroke\"\n x1={highlightedRouteFrom.x}\n y1={highlightedRouteFrom.y}\n x2={highlightedRouteTo.x}\n y2={highlightedRouteTo.y}\n stroke=\"#22c55e\"\n strokeWidth={8 / zoom}\n style={screenStrokeStyle(8 / zoom)}\n strokeLinecap=\"round\"\n />\n {routePlusAt && !stubDrag ? (\n <g className=\"eyeon-map-screen-const\">\n <circle\n cx={routePlusAt.x}\n cy={routePlusAt.y}\n r={worldPx(9)}\n fill=\"#fff\"\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(2)}\n />\n <path\n d={`M ${routePlusAt.x} ${routePlusAt.y - worldPx(5)} L ${routePlusAt.x} ${routePlusAt.y + worldPx(5)} M ${routePlusAt.x - worldPx(5)} ${routePlusAt.y} L ${routePlusAt.x + worldPx(5)} ${routePlusAt.y}`}\n fill=\"none\"\n stroke={theme.ACCENT_COLOR}\n strokeWidth={worldPx(2)}\n strokeLinecap=\"round\"\n />\n </g>\n ) : null}\n </g>\n ) : null}\n\n {wayfindingOn && rubberBand && (\n <g pointerEvents=\"none\">\n <line\n className=\"eyeon-map-screen-stroke\"\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 style={screenStrokeStyle(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 = connectedAnchorIds.has(anchor.id);\n const displayAnchor = displayAnchorById.get(anchor.id) ?? anchor;\n const dragConnect = dragAnchor === anchor.id && dragRouteSnap != null;\n const nearWeld =\n selected &&\n selectedAnchorIds.some((id) => {\n if (id === anchor.id) return false;\n const other = anchorById.get(id);\n return (\n other &&\n Math.hypot(\n other.x - displayAnchor.x,\n other.y - displayAnchor.y,\n ) <= 2.5\n );\n });\n const visR = selected || shapeNode ? ANCHOR_R_SELECTED_PX : ANCHOR_R_PX;\n return (\n <g key={anchor.id}>\n <HandleDot\n cx={displayAnchor.x}\n cy={displayAnchor.y}\n r={worldPx(visR)}\n hitR={worldPx(WAYFINDING_ANCHOR_HIT_PX)}\n fill={\n dragConnect\n ? '#22c55e'\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 anchorById,\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: displayAnchor.x, y: displayAnchor.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: displayAnchor.x, y: displayAnchor.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: displayAnchor.x, y: displayAnchor.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: displayAnchor.x, y: displayAnchor.y },\n });\n setRubberCursor({ x: displayAnchor.x, y: displayAnchor.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 setDragAnchorPoint({\n x: displayAnchor.x,\n y: displayAnchor.y,\n });\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 <g className=\"eyeon-map-screen-const\">\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 </g>\n <g className=\"eyeon-map-screen-const\">\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 </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 && isEllipseDrawTool(tool) && (() => {\n const bounds = ellipseBoundsFromDrag(\n drawing[0],\n drawing[drawing.length - 1],\n drawLockCircle,\n );\n return (\n <ellipse\n cx={bounds.cx}\n cy={bounds.cy}\n rx={Math.max(bounds.rx, 0)}\n ry={Math.max(bounds.ry, 0)}\n fill={\n tool === 'draw-void-circle'\n ? `url(#${openingHatchId})`\n : theme.STORE_DEFAULT_COLOR\n }\n fillOpacity={tool === 'draw-void-circle' ? 1 : 0.2}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={2 / zoom}\n strokeDasharray={`${6 / zoom} ${4 / zoom}`}\n pointerEvents=\"none\"\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 {polygonPoints.length > 0 && isPolygonDrawTool(tool) && (\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\nexport type ConnectorEdgeLike = Pick<\n CmRouteEdge,\n 'kind' | 'directed' | 'fromAnchorId' | 'toAnchorId'\n>;\n\nexport type ConnectorAnchorLike = Pick<CmAnchor, 'id' | 'shapeId' | 'connectorId'>;\n\nexport function partnerShapesForConnector<T extends { id: number }>(\n shapeId: number,\n anchors: ConnectorAnchorLike[],\n connectors: CmConnector[],\n shapes: T[],\n): T[] {\n const connector = connectorForShape(shapeId, anchors, connectors);\n if (!connector) return [];\n const ids = memberShapeIds(connector.id, anchors);\n return shapes.filter((s) => ids.includes(s.id) && s.id !== shapeId);\n}\n\nexport function levelsWithLandings<T extends { levelId: number }>(\n landings: T[],\n levels: CmLevel[],\n): CmLevel[] {\n const ids = new Set(landings.map((item) => item.levelId));\n return levels\n .filter((level) => ids.has(level.id))\n .slice()\n .sort((a, b) => a.ordering - b.ordering || a.levelIndex - b.levelIndex);\n}\n\nexport function escalatorDirectedEnds<T extends { id: number }>(\n connectorId: number,\n anchors: ConnectorAnchorLike[],\n edges: ConnectorEdgeLike[],\n shapes: T[],\n): { from: T; to: T } | null {\n const memberAnchors = anchors.filter((a) => a.connectorId === connectorId);\n const memberIds = new Set(memberAnchors.map((a) => a.id));\n const ride = edges.find(\n (edge) =>\n edge.kind === 'connector' &&\n edge.directed &&\n memberIds.has(edge.fromAnchorId) &&\n memberIds.has(edge.toAnchorId),\n );\n if (!ride) return null;\n const fromAnchor = anchors.find((a) => a.id === ride.fromAnchorId);\n const toAnchor = anchors.find((a) => a.id === ride.toAnchorId);\n const from = shapes.find((s) => s.id === fromAnchor?.shapeId);\n const to = shapes.find((s) => s.id === toAnchor?.shapeId);\n if (!from || !to) return null;\n return { from, to };\n}\n\nfunction floorName(\n levelId: number,\n levels: Array<{ id: number; name: string }>,\n): string {\n return levels.find((level) => level.id === levelId)?.name ?? 'Floor';\n}\n\nfunction landingRideId(\n shape: { key: string; levelId: number },\n levels: Array<{ id: number; name: string }>,\n): string {\n return `${floorName(shape.levelId, levels)} · ${shape.key}`;\n}\n\nexport type EscalatorRideEnds<T extends { id: number; key: string; levelId: number }> = {\n connectorId: number;\n from: T;\n to: T;\n};\n\nexport type EscalatorRideLandingLine = {\n shapeId: number;\n key: string;\n levelName: string;\n};\n\n/**\n * One sidebar row per linked ride. Boarding is `from`, exit is `to`.\n * Unlinked landings are omitted — they stay in the Unassigned list.\n */\nexport function groupEscalatorRides<T extends { id: number; key: string; levelId: number }>(\n connectors: Array<Pick<CmConnector, 'id' | 'kind'>>,\n anchors: ConnectorAnchorLike[],\n edges: ConnectorEdgeLike[],\n shapes: T[],\n): EscalatorRideEnds<T>[] {\n const rides: EscalatorRideEnds<T>[] = [];\n for (const connector of connectors) {\n if (connector.kind !== 'escalator') continue;\n const directed = escalatorDirectedEnds(connector.id, anchors, edges, shapes);\n if (directed) {\n rides.push({ connectorId: connector.id, from: directed.from, to: directed.to });\n continue;\n }\n const ids = new Set(memberShapeIds(connector.id, anchors));\n const members = shapes.filter((shape) => ids.has(shape.id));\n if (members.length < 2) continue;\n rides.push({ connectorId: connector.id, from: members[0], to: members[1] });\n }\n return rides;\n}\n\n/** Boarding on top, exit below — each with its floor name. */\nexport function escalatorRideLandingLines<\n T extends { id: number; key: string; levelId: number },\n>(\n ride: EscalatorRideEnds<T>,\n levels: Array<{ id: number; name: string }>,\n): [EscalatorRideLandingLine, EscalatorRideLandingLine] {\n return [\n {\n shapeId: ride.from.id,\n key: ride.from.key,\n levelName: floorName(ride.from.levelId, levels),\n },\n {\n shapeId: ride.to.id,\n key: ride.to.key,\n levelName: floorName(ride.to.levelId, levels),\n },\n ];\n}\n\n/** Assigned-list title: boarding → exit (escalator) or floor landings ↔ (elevator). */\nexport function connectorRideLabel(\n shape: { id: number; key: string; levelId: number },\n anchors: ConnectorAnchorLike[],\n edges: ConnectorEdgeLike[],\n connectors: CmConnector[],\n shapes: Array<{ id: number; key: string; levelId: number }>,\n levels: Array<{ id: number; name: string; ordering?: number; levelIndex?: number }> = [],\n): string | null {\n const connector = connectorForShape(shape.id, anchors, connectors);\n if (!connector) return null;\n\n if (connector.kind === 'escalator') {\n const ride = escalatorDirectedEnds(connector.id, anchors, edges, shapes);\n if (ride) {\n return `${ride.from.key} → ${ride.to.key}`;\n }\n const partners = partnerShapesForConnector(shape.id, anchors, connectors, shapes);\n if (partners.length === 1) {\n return `${shape.key} → ${partners[0].key}`;\n }\n return null;\n }\n\n const members = [shape, ...partnerShapesForConnector(shape.id, anchors, connectors, shapes)];\n if (members.length < 2) return null;\n const order = new Map(\n levels.map((level, index) => [\n level.id,\n (level.ordering ?? level.levelIndex ?? index) * 1000 + (level.levelIndex ?? index),\n ]),\n );\n const sorted = members.slice().sort((a, b) => {\n const ai = order.get(a.levelId) ?? Number.POSITIVE_INFINITY;\n const bi = order.get(b.levelId) ?? Number.POSITIVE_INFINITY;\n return ai - bi;\n });\n return sorted.map((item) => landingRideId(item, levels)).join(' ↔ ');\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 CmResponsiveOverride,\n CmRouteEdge,\n CmShape,\n CmShapeAssignment,\n ShapeGeometry,\n ThemeDefaults,\n} from '../core';\nimport {\n bboxOf,\n canonicalizeEntranceLabel,\n geometryBBox,\n mergeEntranceAwareLabel,\n normalizeGeometrySpace,\n parseShapeAssignment,\n} 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 responsiveOverrides?: CmResponsiveOverride[];\n}\n\nfunction geometryBbox(geometry?: ShapeGeometry | null): BBox {\n const points = (geometry?.polygons ?? []).flat();\n return bboxOf(points);\n}\n\n/** True when another live shape already uses this ID on the floor. */\nexport function shapeKeyTakenOnLevel(\n shapes: Array<{\n id: number;\n levelId: number;\n key: string;\n orphanedAt?: string | null;\n }>,\n shapeId: number,\n levelId: number,\n key: string,\n): boolean {\n return shapes.some(\n (shape) =>\n shape.id !== shapeId &&\n shape.levelId === levelId &&\n shape.key === key &&\n !shape.orphanedAt,\n );\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 sourceSvgId: incoming.sourceSvgId ?? existing?.sourceSvgId ?? null,\n origin: incoming.origin ?? existing?.origin ?? 'manual',\n label: mergeEntranceAwareLabel(existing?.label, incoming.label, {\n kind: incoming.kind ?? existing?.kind ?? 'unit',\n origin: incoming.origin ?? existing?.origin ?? 'manual',\n sourceSvgId:\n incoming.sourceSvgId ?? existing?.sourceSvgId ?? null,\n }),\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 kind =\n draft.shapes.find((s) => s.id === op.assignment.shapeId)?.kind ?? 'unit';\n const assignment = parseShapeAssignment(op.assignment, kind);\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:\n incoming.connectorId !== undefined\n ? incoming.connectorId\n : 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 responsiveOverrides: (draft.responsiveOverrides ?? []).filter(\n (row) => row.levelId !== levelId,\n ),\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 responsiveOverrides: draft.responsiveOverrides ?? [],\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 const label = canonicalizeEntranceLabel(shape) ?? shape.label;\n const geometryChanged = geometry !== shape.geometry;\n const labelChanged = label !== shape.label;\n if (!geometryChanged && !labelChanged) return shape;\n changed = true;\n return {\n ...shape,\n geometry,\n bbox: geometryChanged ? geometryBBox(geometry) : shape.bbox,\n label,\n };\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 const merged = { ...ops[idx].shape, ...op.shape };\n next[idx] = {\n op: 'upsert_shape',\n shape: {\n ...merged,\n label: mergeEntranceAwareLabel(\n ops[idx].shape.label,\n op.shape.label,\n {\n kind: merged.kind ?? 'unit',\n origin: merged.origin,\n sourceSvgId: merged.sourceSvgId,\n },\n ),\n },\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\n/**\n * Persist order for POST /v1/map/batch.\n * Relinking an escalator coalesces landing upserts into the earlier unlink slot,\n * which would otherwise write `connector_id` before the new connector exists.\n */\nconst BATCH_PERSIST_RANK: Record<BatchOp['op'], number> = {\n upsert_building: 10,\n upsert_level: 20,\n upsert_shape: 30,\n upsert_assignment: 40,\n upsert_connector: 50,\n upsert_anchor: 60,\n upsert_edge: 70,\n update_theme: 80,\n weld_anchors: 90,\n delete_edge: 100,\n delete_anchor: 110,\n delete_assignment: 120,\n delete_shape: 130,\n delete_connector: 140,\n delete_building: 150,\n delete_level: 160,\n};\n\nexport function orderBatchOpsForPersist(ops: BatchOp[]): BatchOp[] {\n return ops\n .map((op, index) => ({ op, index }))\n .sort((a, b) => {\n const rank = BATCH_PERSIST_RANK[a.op.op] - BATCH_PERSIST_RANK[b.op.op];\n return rank !== 0 ? rank : a.index - b.index;\n })\n .map(({ op }) => op);\n}\n","import React from 'react';\n\nfunction FieldResetIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3.3 8a4.7 4.7 0 1 0 1.15-3.15\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M3.1 2.6v3.3h3.3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function FieldResetButton({\n label,\n onClick,\n disabled,\n}: {\n label: string;\n onClick: () => void;\n disabled?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n className=\"eyeon-map-rail__field-reset\"\n aria-label={`Reset ${label}`}\n title=\"Reset\"\n disabled={disabled}\n onClick={onClick}\n >\n <FieldResetIcon />\n </button>\n );\n}\n","import { isTransparentColor } from '../core/color';\n\nexport { isTransparentColor, TRANSPARENT_COLOR } from '../core/color';\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\nexport function sameHexColor(a: string, b: string): boolean {\n if (isTransparentColor(a) || isTransparentColor(b)) {\n return isTransparentColor(a) && isTransparentColor(b);\n }\n const left = normalizeHexColor(a);\n const right = normalizeHexColor(b);\n return left != null && left === right;\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport {\n assignNumberFromDraft,\n commitAssignNumberDraft,\n LABEL_ALIGNS,\n normalizeLabelAlign,\n type LabelAlign,\n} from '../../core';\nimport { FieldResetButton } from '../FieldResetButton';\nimport {\n hexColorInputValue,\n isTransparentColor,\n normalizeHexColor,\n TRANSPARENT_COLOR,\n} from '../hexColor';\n\nexport function StepperRow({\n label,\n value,\n disabled,\n extra,\n onChange,\n onStep,\n onHoldStart,\n onHoldEnd,\n}: {\n label: string;\n value: number;\n disabled: boolean;\n extra?: React.ReactNode;\n onChange: (value: number) => void;\n onStep: (delta: number) => void;\n onHoldStart: (delta: number) => void;\n onHoldEnd: () => void;\n}) {\n const [draft, setDraft] = useState(() => String(value));\n const focused = useRef(false);\n const syncDraft = useRef(false);\n\n useEffect(() => {\n if (!focused.current || syncDraft.current) {\n setDraft(String(value));\n syncDraft.current = false;\n }\n }, [value]);\n\n const commitDraft = (raw: string, persistIncomplete: boolean) => {\n const parsed = persistIncomplete\n ? commitAssignNumberDraft(raw)\n : { display: raw, render: assignNumberFromDraft(raw).render };\n setDraft(parsed.display);\n onChange(parsed.render);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">{label}</span>\n <div className=\"eyeon-map-assign__control\">\n {extra}\n <div className=\"eyeon-map-assign__stepper\">\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={`Decrease ${label}`}\n onClick={() => onStep(-1)}\n onMouseDown={() => onHoldStart(-1)}\n onMouseUp={onHoldEnd}\n onMouseLeave={onHoldEnd}\n >\n −\n </button>\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={draft}\n disabled={disabled}\n aria-label={label}\n onFocus={() => {\n focused.current = true;\n }}\n onChange={(e) => commitDraft(e.target.value, false)}\n onBlur={() => {\n focused.current = false;\n commitDraft(draft, true);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n return;\n }\n if (e.key !== 'ArrowUp' && e.key !== 'ArrowDown') return;\n e.preventDefault();\n if (disabled) return;\n syncDraft.current = true;\n onStep(e.key === 'ArrowUp' ? 1 : -1);\n }}\n />\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={`Increase ${label}`}\n onClick={() => onStep(1)}\n onMouseDown={() => onHoldStart(1)}\n onMouseUp={onHoldEnd}\n onMouseLeave={onHoldEnd}\n >\n +\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nexport function ColorSwatch({\n label,\n hex,\n swatch,\n fallback,\n disabled,\n emptyIsTransparent = true,\n onHexChange,\n onCommit,\n onPick,\n}: {\n label: string;\n hex: string;\n swatch: string;\n fallback?: string;\n disabled?: boolean;\n emptyIsTransparent?: boolean;\n onHexChange: (value: string) => void;\n onCommit: () => void;\n onPick: (hex: string) => void;\n}) {\n const lastSolid = useRef(hexColorInputValue(fallback || swatch));\n const transparent =\n isTransparentColor(swatch) ||\n (emptyIsTransparent && !hex.trim());\n\n useEffect(() => {\n const solid = normalizeHexColor(swatch);\n if (solid) lastSolid.current = solid;\n }, [swatch]);\n\n const pickerValue = hexColorInputValue(transparent ? lastSolid.current : swatch);\n\n return (\n <div className=\"eyeon-map-assign__swatch\">\n <span\n className={\n transparent\n ? 'eyeon-map-assign__swatch-well is-transparent'\n : 'eyeon-map-assign__swatch-well'\n }\n style={transparent ? undefined : { backgroundColor: hexColorInputValue(swatch) }}\n >\n <input\n type=\"color\"\n className=\"eyeon-map-assign__swatch-native\"\n disabled={disabled}\n aria-label={label}\n value={pickerValue}\n onChange={(e) => {\n lastSolid.current = e.target.value;\n onPick(e.target.value);\n }}\n />\n </span>\n <input\n type=\"text\"\n spellCheck={false}\n disabled={disabled}\n aria-label={`${label} hex`}\n placeholder=\"Transparent\"\n value={transparent ? '' : hex}\n onChange={(e) => onHexChange(e.target.value)}\n onBlur={onCommit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n }\n }}\n />\n </div>\n );\n}\n\nexport function ColorRow({\n label,\n value,\n fallback,\n disabled,\n onChange,\n onReset,\n}: {\n label: string;\n value: string;\n fallback: string;\n disabled: boolean;\n onChange: (hex: string) => void;\n onReset?: () => void;\n}) {\n const transparent = isTransparentColor(value);\n const display = transparent ? TRANSPARENT_COLOR : value.trim() ? value : fallback;\n const [hex, setHex] = useState(transparent ? '' : display);\n\n useEffect(() => {\n setHex(transparent ? '' : display);\n }, [display, transparent]);\n\n const commit = (next: string) => {\n if (!next.trim() || isTransparentColor(next)) {\n setHex('');\n onChange(TRANSPARENT_COLOR);\n return;\n }\n const normalized = normalizeHexColor(next);\n if (!normalized) {\n setHex(transparent ? '' : display);\n return;\n }\n setHex(normalized);\n onChange(normalized);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">\n {label}\n {onReset ? (\n <FieldResetButton label={label} onClick={onReset} disabled={disabled} />\n ) : null}\n </span>\n <ColorSwatch\n label={label}\n hex={hex}\n swatch={display}\n fallback={fallback}\n disabled={disabled}\n onHexChange={setHex}\n onCommit={() => commit(hex)}\n onPick={commit}\n />\n </div>\n );\n}\n\nconst ALIGN_TOOLTIPS: Record<LabelAlign, string> = {\n left: 'Left',\n center: 'Center',\n right: 'Right',\n};\n\nfunction AlignLeftIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M2 3h12v1.4H2V3zm0 4.3h8v1.4H2V7.3zm0 4.3h12v1.4H2v-1.4z\"\n />\n </svg>\n );\n}\n\nfunction AlignCenterIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M2 3h12v1.4H2V3zm2 4.3h8v1.4H4V7.3zm-2 4.3h12v1.4H2v-1.4z\"\n />\n </svg>\n );\n}\n\nfunction AlignRightIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M2 3h12v1.4H2V3zm4 4.3h8v1.4H6V7.3zm-4 4.3h12v1.4H2v-1.4z\"\n />\n </svg>\n );\n}\n\nconst ALIGN_ICONS: Record<LabelAlign, React.ReactNode> = {\n left: <AlignLeftIcon />,\n center: <AlignCenterIcon />,\n right: <AlignRightIcon />,\n};\n\nexport function AlignRow({\n value,\n disabled,\n onChange,\n}: {\n value?: LabelAlign;\n disabled: boolean;\n onChange: (align: LabelAlign) => void;\n}) {\n const align = normalizeLabelAlign(value);\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">Alignment</span>\n <div className=\"eyeon-map-assign__align\" role=\"group\" aria-label=\"Alignment\">\n {LABEL_ALIGNS.map((option) => (\n <button\n key={option}\n type=\"button\"\n className={option === align ? 'is-active' : undefined}\n disabled={disabled}\n aria-label={ALIGN_TOOLTIPS[option]}\n aria-pressed={option === align}\n data-tooltip={ALIGN_TOOLTIPS[option]}\n onClick={() => onChange(option)}\n >\n {ALIGN_ICONS[option]}\n </button>\n ))}\n </div>\n </div>\n );\n}\n\nexport function RotateIcon() {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n fill=\"currentColor\"\n d=\"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\"\n />\n </svg>\n );\n}\n\nexport function nextQuarterTurn(value: number): number {\n const angle = 45;\n let next = value;\n const remainder = next % angle;\n if (remainder !== 0) next -= remainder;\n next += angle;\n return next >= 360 ? 0 : next;\n}\n\n/** +/- drops the fraction, then steps by whole numbers. Typed decimals stay until then. */\nexport function stepWholeNumber(value: number, delta: number): number {\n if (!Number.isFinite(value)) return delta;\n if (delta > 0) return Math.floor(value) + delta;\n if (Number.isInteger(value)) return value + delta;\n return Math.floor(value);\n}\n","import React, { useEffect, useRef } from 'react';\nimport type { CmShapeAssignment } from '../../core';\nimport { ColorRow, RotateIcon, StepperRow, nextQuarterTurn } from './formRows';\n\ntype StepKey = 'size' | 'rotate' | 'offsetX' | 'offsetY';\n\nexport interface AssignmentStyleFieldsProps {\n form: Pick<\n CmShapeAssignment,\n 'size' | 'rotate' | 'offsetX' | 'offsetY' | 'bgColor' | 'textColor'\n >;\n canEdit: boolean;\n storeDefaultColor: string;\n storeTextColor: string;\n textColorLabel?: string;\n showTextColor?: boolean;\n onPatch: (partial: Partial<CmShapeAssignment>) => void;\n}\n\n/** Size, rotate, offset, and colors — shared by kiosk / store / escalator assign. */\nexport function AssignmentStyleFields({\n form,\n canEdit,\n storeDefaultColor,\n storeTextColor,\n textColorLabel = 'Text Color',\n showTextColor = true,\n onPatch,\n}: AssignmentStyleFieldsProps) {\n const formRef = useRef(form);\n formRef.current = form;\n const intervals = useRef<Partial<Record<StepKey, number>>>({});\n\n useEffect(\n () => () => {\n (Object.values(intervals.current) as number[]).forEach((id) =>\n window.clearInterval(id),\n );\n },\n [],\n );\n\n const bump = (key: StepKey, delta: number) => {\n onPatch({ [key]: (formRef.current[key] ?? 0) + delta });\n };\n\n const startHold = (key: StepKey, delta: number) => {\n stopHold(key);\n intervals.current[key] = window.setInterval(() => bump(key, delta), 200);\n };\n\n const stopHold = (key: StepKey) => {\n const id = intervals.current[key];\n if (id) {\n window.clearInterval(id);\n intervals.current[key] = undefined;\n }\n };\n\n return (\n <>\n <StepperRow\n label=\"Size\"\n value={form.size}\n disabled={!canEdit}\n onChange={(size) => onPatch({ size })}\n onStep={(delta) => bump('size', delta)}\n onHoldStart={(delta) => startHold('size', delta)}\n onHoldEnd={() => stopHold('size')}\n />\n <StepperRow\n label=\"Rotate\"\n value={form.rotate}\n disabled={!canEdit}\n extra={\n <button\n type=\"button\"\n className=\"eyeon-map-assign__rotate\"\n aria-label=\"Rotate 45 degrees\"\n disabled={!canEdit}\n onClick={() => onPatch({ rotate: nextQuarterTurn(form.rotate ?? 0) })}\n >\n <RotateIcon />\n </button>\n }\n onChange={(rotate) => onPatch({ rotate })}\n onStep={(delta) => bump('rotate', delta)}\n onHoldStart={(delta) => startHold('rotate', delta)}\n onHoldEnd={() => stopHold('rotate')}\n />\n <StepperRow\n label=\"Offset X\"\n value={form.offsetX}\n disabled={!canEdit}\n onChange={(offsetX) => onPatch({ offsetX })}\n onStep={(delta) => bump('offsetX', delta)}\n onHoldStart={(delta) => startHold('offsetX', delta)}\n onHoldEnd={() => stopHold('offsetX')}\n />\n <StepperRow\n label=\"Offset Y\"\n value={form.offsetY}\n disabled={!canEdit}\n onChange={(offsetY) => onPatch({ offsetY })}\n onStep={(delta) => bump('offsetY', delta)}\n onHoldStart={(delta) => startHold('offsetY', delta)}\n onHoldEnd={() => stopHold('offsetY')}\n />\n <ColorRow\n label=\"BG Color\"\n value={form.bgColor ?? ''}\n fallback={storeDefaultColor}\n disabled={!canEdit}\n onChange={(bgColor) => onPatch({ bgColor: bgColor || null })}\n onReset={form.bgColor ? () => onPatch({ bgColor: null }) : undefined}\n />\n {showTextColor ? (\n <ColorRow\n label={textColorLabel}\n value={form.textColor ?? ''}\n fallback={storeTextColor}\n disabled={!canEdit}\n onChange={(textColor) => onPatch({ textColor: textColor || null })}\n onReset={form.textColor ? () => onPatch({ textColor: null }) : undefined}\n />\n ) : null}\n </>\n );\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { BatchOp, CmShape, CmShapeAssignment } from '../../core';\nimport {\n assignmentPadFillFallback,\n emptyShapeAssignment,\n parseShapeAssignment,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport { AssignmentStyleFields } from './AssignmentStyleFields';\nimport {\n buildElevatorShaftOps,\n buildEscalatorLinkOps,\n buildUnlinkConnectorOps,\n connectorForShape,\n connectorIdForShape,\n levelsWithLandings,\n memberShapeIds,\n resolvedConnectorKind,\n suggestEscalatorPairs,\n type ConnectorPlanContext,\n type VerticalRailKind,\n} from '../connectorAssignments';\nimport { connectorSpecialIconDataUrl } from '../../specialIcons';\n\nexport interface ConnectorAssignProps {\n shape: CmShape;\n railKind: VerticalRailKind;\n ctx: ConnectorPlanContext;\n canEdit: boolean;\n assignment?: CmShapeAssignment | null;\n storeDefaultColor: string;\n storeTextColor: string;\n onApplyOps: (ops: BatchOp[]) => void;\n onSaveAssignment?: (assignment: CmShapeAssignment) => void;\n}\n\nfunction connectorStyleAssignment(\n shape: CmShape,\n assignment: CmShapeAssignment | null | undefined,\n): CmShapeAssignment {\n const parsed = assignment\n ? parseShapeAssignment(assignment, 'connector')\n : emptyShapeAssignment(shape.id, 'connector');\n return {\n ...parsed,\n shapeId: shape.id,\n layerType: 'connector',\n };\n}\n\nexport function ConnectorAssign({\n shape,\n railKind,\n ctx,\n canEdit,\n assignment = null,\n storeDefaultColor,\n storeTextColor,\n onApplyOps,\n onSaveAssignment,\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 partner = partners[0];\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 [exitFloorId, setExitFloorId] = useState(\n partner ? String(partner.levelId) : '',\n );\n const [targetId, setTargetId] = useState(partner ? String(partner.id) : '');\n const [stopFloorId, setStopFloorId] = useState('');\n const [styleForm, setStyleForm] = useState<CmShapeAssignment>(() =>\n connectorStyleAssignment(shape, assignment),\n );\n const styleFormRef = useRef(styleForm);\n styleFormRef.current = styleForm;\n\n useEffect(() => {\n setStyleForm(connectorStyleAssignment(shape, assignment));\n }, [shape, assignment]);\n\n const patchStyle = useCallback(\n (partial: Partial<CmShapeAssignment>) => {\n const next = connectorStyleAssignment(shape, {\n ...styleFormRef.current,\n ...partial,\n shapeId: shape.id,\n });\n setStyleForm(next);\n if (!canEdit) return;\n onSaveAssignment?.(next);\n },\n [canEdit, onSaveAssignment, shape],\n );\n\n useEffect(() => {\n setExitFloorId(partner ? String(partner.levelId) : '');\n setTargetId(partner ? String(partner.id) : '');\n }, [shape.id, connector?.id, partner?.id, partner?.levelId]);\n\n const exitFloors = levelsWithLandings(candidates, ctx.levels);\n const landingsOnExitFloor = candidates.filter(\n (item) => String(item.levelId) === exitFloorId,\n );\n\n const addable = candidates.filter((item) => !memberIds.includes(item.id));\n const addFloors = levelsWithLandings(addable, ctx.levels);\n const landingsOnStopFloor = addable.filter(\n (item) => String(item.levelId) === stopFloorId,\n );\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) => {\n onApplyOps(buildEscalatorLinkOps(ctx, from, to));\n };\n\n const applyElevator = (nextMembers: CmShape[]) => {\n if (nextMembers.length < 2) return;\n onApplyOps(\n buildElevatorShaftOps(ctx, nextMembers, {\n name: connector?.name,\n accessible: connector?.accessible ?? true,\n connectorId: connector?.id,\n }),\n );\n };\n\n const pickExitLanding = (nextId: string) => {\n setTargetId(nextId);\n const to = ctx.shapes.find((s) => s.id === Number(nextId));\n if (!to || !canEdit) return;\n applyEscalator(shape, to);\n };\n\n const pickElevatorStop = (nextId: string) => {\n const next = ctx.shapes.find((s) => s.id === Number(nextId));\n if (!next || !canEdit) return;\n applyElevator([...members, shape, next]);\n setStopFloorId('');\n };\n\n const landingOptions = (\n landings: CmShape[],\n kind: VerticalRailKind,\n ) =>\n landings.map((item) => {\n const linked = connectorIdForShape(item.id, ctx.anchors) != null;\n return {\n value: String(item.id),\n label: item.key,\n hint: linked ? 'Linked' : undefined,\n iconUrl: connectorSpecialIconDataUrl(\n kind,\n linked,\n linked ? storeTextColor : undefined,\n ),\n iconMuted: !linked,\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 {railKind === 'escalator' && (\n <>\n <label className=\"eyeon-map-rail__field\">\n Floor\n <ModernSelect\n ariaLabel=\"Floor\"\n value={exitFloorId}\n disabled={!canEdit || exitFloors.length === 0}\n placeholder=\"Choose a floor\"\n options={exitFloors.map((level) => ({\n value: String(level.id),\n label: level.name,\n }))}\n onChange={(nextFloor) => {\n setExitFloorId(nextFloor);\n setTargetId(\n partner && String(partner.levelId) === nextFloor\n ? String(partner.id)\n : '',\n );\n }}\n />\n </label>\n <label className=\"eyeon-map-rail__field\">\n Escalator Point\n <ModernSelect\n ariaLabel=\"Escalator Point\"\n value={targetId}\n disabled={!canEdit || !exitFloorId}\n placeholder={\n exitFloorId\n ? 'Choose an escalator on that floor'\n : 'Choose a floor first'\n }\n searchable\n options={landingOptions(landingsOnExitFloor, 'escalator')}\n onChange={pickExitLanding}\n />\n </label>\n {partner ? (\n <p className=\"eyeon-map-rail__hint\">\n Linked: {shape.key} → {partner.key} ({levelName(shape.levelId)} →{' '}\n {levelName(partner.levelId)}, {connector?.direction ?? 'up'})\n </p>\n ) : null}\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\n </button>\n </div>\n ) : null}\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)} ·{' '}\n <span className=\"eyeon-map-rail__row-id\">{item.key}</span>\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 Floor\n <ModernSelect\n ariaLabel=\"Add stop floor\"\n value={stopFloorId}\n disabled={!canEdit || addFloors.length === 0}\n placeholder=\"Choose a floor\"\n options={addFloors.map((level) => ({\n value: String(level.id),\n label: level.name,\n }))}\n onChange={setStopFloorId}\n />\n </label>\n <label className=\"eyeon-map-rail__field\">\n Elevator Point\n <ModernSelect\n ariaLabel=\"Elevator Point\"\n value=\"\"\n disabled={!canEdit || !stopFloorId}\n placeholder={\n stopFloorId\n ? 'Choose an elevator on that floor'\n : 'Choose a floor first'\n }\n searchable\n options={landingOptions(landingsOnStopFloor, 'elevator')}\n onChange={pickElevatorStop}\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\n {onSaveAssignment ? (\n <div className=\"eyeon-map-assign\">\n <div className=\"eyeon-map-inspector__heading\">Design</div>\n <AssignmentStyleFields\n form={styleForm}\n canEdit={canEdit}\n storeDefaultColor={assignmentPadFillFallback(\n 'connector',\n storeDefaultColor,\n )}\n storeTextColor={storeTextColor}\n textColorLabel=\"Icon Color\"\n onPatch={patchStyle}\n />\n </div>\n ) : null}\n </div>\n );\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: 'Open to Below',\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\n/**\n * Types staff set in Edit Map. Text and entrance markers come from\n * their own tools, not this dropdown.\n */\nexport const EDITOR_TYPE_KINDS: ShapeKind[] = [\n 'unit',\n 'amenity',\n 'kiosk_screen',\n 'connector',\n 'void',\n];\n\nconst TOOL_ONLY_KINDS: ShapeKind[] = ['label', 'wall'];\n\nexport function inspectorShowsType(kind: ShapeKind): boolean {\n return !TOOL_ONLY_KINDS.includes(kind);\n}\n\n/** Type dropdown: curated kinds, and the current kind if it is outside that list. */\nexport function inspectorTypeKinds(current?: ShapeKind | null): ShapeKind[] {\n if (\n current &&\n !EDITOR_TYPE_KINDS.includes(current) &&\n inspectorShowsType(current)\n ) {\n return [...EDITOR_TYPE_KINDS, current];\n }\n return EDITOR_TYPE_KINDS;\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 { assignmentHasTarget, 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 customLabel?: string | null;\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 isStoreShapeKind(kind: string): boolean {\n return kind === 'unit' || kind === 'parking_zone';\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 &&\n assignment.targetType === 'amenity' &&\n (assignment.amenityId != null || Boolean(assignment.customLabel?.trim())),\n );\n}\n\nexport function isKioskAssigned(assignment: AssignmentLike | null | undefined): boolean {\n return Boolean(\n assignment &&\n assignment.targetType === 'kiosk' &&\n (assignment.kioskId != null || Boolean(assignment.customLabel?.trim())),\n );\n}\n\nexport function isPolygonAssigned(assignment: AssignmentLike | null | undefined): boolean {\n return assignmentHasTarget(assignment);\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 / kiosk polygons, plus unassigned of each kind. */\nexport function railAssignmentGroups<T extends AssignableShape>(\n shapes: T[],\n assignments: AssignmentLike[],\n): {\n stores: T[];\n amenities: T[];\n kiosks: T[];\n unassignedStores: T[];\n unassignedAmenities: T[];\n unassignedKiosks: T[];\n unassigned: T[];\n} {\n const byShape = assignmentByShapeId(assignments);\n const stores: T[] = [];\n const amenities: T[] = [];\n const kiosks: T[] = [];\n const unassignedStores: T[] = [];\n const unassignedAmenities: T[] = [];\n const unassignedKiosks: 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 (isKioskAssigned(assignment)) kiosks.push(shape);\n else if (isAssignableKind(shape.kind) && !isPolygonAssigned(assignment)) {\n unassigned.push(shape);\n if (isStoreShapeKind(shape.kind)) unassignedStores.push(shape);\n else if (shape.kind === 'amenity') unassignedAmenities.push(shape);\n else if (shape.kind === 'kiosk_screen') unassignedKiosks.push(shape);\n }\n }\n return {\n stores,\n amenities,\n kiosks,\n unassignedStores,\n unassignedAmenities,\n unassignedKiosks,\n unassigned,\n };\n}\n","import type { MapAssignKiosk } from '../core';\n\nexport type KioskShapeOption = {\n id: number;\n key: string;\n kind: string;\n orphanedAt?: string | null;\n};\n\nexport type CatalogKioskAssignment = {\n shapeId: number;\n kioskId?: number | null;\n};\n\nexport function isKioskScreenKind(kind: string): boolean {\n return kind === 'kiosk_screen';\n}\n\nexport function kioskScreenShapes<T extends KioskShapeOption>(shapes: T[]): T[] {\n return shapes.filter((shape) => isKioskScreenKind(shape.kind) && !shape.orphanedAt);\n}\n\nexport function catalogKioskShapeOptions(\n shapes: KioskShapeOption[],\n): Array<{ value: string; label: string }> {\n return kioskScreenShapes(shapes).map((shape) => ({\n value: String(shape.id),\n label: shape.key,\n }));\n}\n\nexport function shapeIdForCatalogKiosk(\n kioskId: number,\n assignments: CatalogKioskAssignment[],\n): number | null {\n return assignments.find((row) => row.kioskId === kioskId)?.shapeId ?? null;\n}\n\nexport function leftoverCatalogKiosks<T extends { id: number }>(\n kiosks: T[],\n assignments: CatalogKioskAssignment[],\n): T[] {\n const used = new Set(\n assignments\n .map((row) => row.kioskId)\n .filter((id): id is number => id != null),\n );\n return kiosks.filter((kiosk) => !used.has(kiosk.id));\n}\n\nexport function catalogKioskRowLabel(\n kiosk: MapAssignKiosk,\n assignedKey: string | null,\n): { title: string; id: string; tags: string[] } {\n return {\n title: kiosk.name.trim() || `Kiosk ${kiosk.id}`,\n id: `kiosk-${kiosk.id}`,\n tags: assignedKey ? [assignedKey] : ['Unlinked'],\n };\n}\n","import { compareBuildingFloors } from '../core';\n\n/** Title + tags for Map options shape lists (Stores, Amenities, …). */\nexport function railRowLabels(input: {\n key: string;\n kindLabel: string;\n levelName: string;\n assignedName?: string | null;\n /** Kind tag is only for the Unassigned module (mixed types). */\n showKindTag?: boolean;\n}): { title: string | null; id: string; tags: string[] } {\n const name = input.assignedName?.trim() || null;\n const tags = [input.levelName];\n if (input.showKindTag) tags.push(input.kindLabel);\n return { title: name, id: input.key, tags };\n}\n\nexport const RAIL_ITEM_SECTIONS = [\n 'stores',\n 'amenities',\n 'kiosks',\n 'unassigned',\n 'escalators',\n 'elevators',\n] as const;\n\nexport type RailItemSection = (typeof RAIL_ITEM_SECTIONS)[number];\n\nexport function isRailItemSection(\n section: string | null,\n): section is RailItemSection {\n return (\n section != null &&\n (RAIL_ITEM_SECTIONS as readonly string[]).includes(section)\n );\n}\n\n/** Third sidebar screen: field options for the selected list item. */\nexport function railShowsItemOptions(\n section: string | null,\n selectedCount: number,\n): boolean {\n return isRailItemSection(section) && selectedCount > 0;\n}\n\ntype RailLevel = {\n id: number;\n kind: string;\n ordering: number;\n levelIndex: number;\n};\n\n/** Outdoor first, then the lowest building floor, then each floor above it. */\nexport function railListLevelOrder<T extends RailLevel>(levels: T[]): T[] {\n const outdoor = levels.filter((level) => level.kind === 'outdoor');\n const floorsLowToHigh = levels\n .filter((level) => level.kind === 'floor')\n .slice()\n .sort(compareBuildingFloors)\n .reverse();\n return [...outdoor, ...floorsLowToHigh];\n}\n\nexport function sortShapesByRailLevel<T extends { levelId: number }>(\n shapes: T[],\n levels: RailLevel[],\n): T[] {\n const indexById = new Map(\n railListLevelOrder(levels).map((level, index) => [level.id, index]),\n );\n return shapes.slice().sort((a, b) => {\n const ai = indexById.get(a.levelId) ?? Number.POSITIVE_INFINITY;\n const bi = indexById.get(b.levelId) ?? Number.POSITIVE_INFINITY;\n return ai - bi;\n });\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, the INTERACTIVE group\n and line segments in the <code>routes</code> group go into the\n 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 line segments in the{' '}\n <code>routes</code> group replace this floor’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 DEFAULT_THEME,\n amenityAssignedName,\n kioskAssignedName,\n retailerOptionLabel,\n staticIconThemeDefaults,\n staticLayerThemeDefaults,\n type CmAmenityCatalogItem,\n type CmAnchor,\n type CmConnector,\n type CmLevel,\n type CmRouteEdge,\n type CmBuilding,\n type CmShapeAssignment,\n type MapAssignKiosk,\n type MapAssignRetailer,\n type IconThemeKey,\n type StaticLayerThemeKey,\n type ThemeDefaults,\n} from '../../core';\nimport { FieldResetButton } from '../FieldResetButton';\nimport {\n connectorForShape,\n connectorRideLabel,\n escalatorRideLandingLines,\n groupEscalatorRides,\n railConnectorShapes,\n} from '../connectorAssignments';\nimport {\n isTransparentColor,\n normalizeHexColor,\n sameHexColor,\n TRANSPARENT_COLOR,\n} from '../hexColor';\nimport { shapeKindLabel } from '../labels';\nimport { assignmentByShapeId, railAssignmentGroups } from '../railAssignments';\nimport {\n catalogKioskRowLabel,\n leftoverCatalogKiosks,\n shapeIdForCatalogKiosk,\n} from '../railKiosks';\nimport { connectorSpecialIconDataUrl, getAmenityByType } from '../../specialIcons';\nimport {\n railListLevelOrder,\n railRowLabels,\n railShowsItemOptions,\n sortShapesByRailLevel,\n} from '../railListCopy';\nimport {\n FloorsPanel,\n floorsScreenTitle,\n visibleFloorCount,\n type CreateLevelInput,\n type FloorsScreen,\n type UpdateLevelInput,\n} from './FloorsPanel';\nimport { ColorSwatch } from './formRows';\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 | 'map-responsiveness';\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<\n Pick<CmRouteEdge, 'id' | 'kind' | 'directed' | 'fromAnchorId' | 'toAnchorId'>\n >;\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 selectedShapeIds?: number[];\n onSelectShape: (id: number | null, opts?: { additive?: boolean }) => void;\n onHoverShape?: (id: number | null) => void;\n onListFocus?: () => void;\n retailers?: MapAssignRetailer[];\n kiosks?: MapAssignKiosk[];\n canFloors: boolean;\n canSettings: boolean;\n canResponsiveness?: 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 /** Saved display_kiosks: pick a kiosk shape or delete. */\n catalogKioskPanel?: ReactNode;\n selectedCatalogKioskId?: number | null;\n onSelectCatalogKiosk?: (id: number | null) => void;\n /** Draw/tools UI for Edit Map (icons + inspector). */\n editMapPanel?: ReactNode;\n /** Route tools and path stats for Wayfinding. */\n wayfindingPanel?: ReactNode;\n mapResponsivenessPanel?: ReactNode;\n footer?: ReactNode;\n /** PORTAL: switch this center back to Classic (v1) map. */\n onUseClassicMap?: () => void;\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\nfunction MapResponsivenessNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect x=\"2.5\" y=\"4\" width=\"13\" height=\"9\" rx=\"1.4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M6 13.8h6M9 13.8v1.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M5.2 10.2 8.4 7l2 2 2.6-2.8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\ntype RailNavCountKey =\n | 'floors'\n | 'stores'\n | 'amenities'\n | 'kiosks'\n | 'escalators'\n | 'elevators'\n | 'unassigned';\n\ntype RailNavItem = {\n id: RailSection;\n title: string;\n description: string;\n icon: () => React.ReactElement;\n countKey?: RailNavCountKey;\n};\n\ntype RailNavEntry = RailNavItem | { separator: true };\n\nconst RAIL_NAV: RailNavEntry[] = [\n {\n id: 'floors',\n title: 'Floors',\n description: 'Building floors and Outdoor SVG',\n icon: FloorsNavIcon,\n countKey: 'floors',\n },\n {\n id: 'stores',\n title: 'Stores',\n description: 'Retailers linked to the map',\n icon: StoresNavIcon,\n countKey: 'stores',\n },\n {\n id: 'amenities',\n title: 'Amenities',\n description: 'Amenities linked to the map',\n icon: AmenitiesNavIcon,\n countKey: 'amenities',\n },\n {\n id: 'kiosks',\n title: 'Kiosks',\n description: 'Link kiosk screens to devices',\n icon: KiosksNavIcon,\n countKey: 'kiosks',\n },\n {\n id: 'escalators',\n title: 'Escalators',\n description: 'One-way rides between floors',\n icon: EscalatorsNavIcon,\n countKey: 'escalators',\n },\n {\n id: 'elevators',\n title: 'Elevators',\n description: 'Two-way shafts across floors',\n icon: ElevatorsNavIcon,\n countKey: 'elevators',\n },\n {\n id: 'unassigned',\n title: 'Unassigned',\n description: 'Polygons with no store, amenity, or kiosk',\n icon: UnassignedNavIcon,\n countKey: 'unassigned',\n },\n { separator: true },\n {\n id: 'edit-map',\n title: 'Edit Map',\n description: 'Draw and reshape stores, text, and lines',\n icon: EditMapNavIcon,\n },\n {\n id: 'wayfinding',\n title: 'Wayfinding',\n description: 'Walking paths and route anchors',\n icon: WayfindingNavIcon,\n },\n {\n id: 'map-responsiveness',\n title: 'Map Responsiveness',\n description: 'Starting zoom and position per floor and device',\n icon: MapResponsivenessNavIcon,\n },\n { separator: true },\n {\n id: 'style',\n title: 'Settings',\n description: 'Colors and map look',\n icon: SettingsNavIcon,\n },\n];\n\nconst HIDDEN_SECTION_TITLES: Partial<Record<RailSection, string>> = {\n paths: 'Walking paths',\n selection: 'Selected',\n};\n\nfunction isRailNavSeparator(entry: RailNavEntry): entry is { separator: true } {\n return 'separator' in entry;\n}\n\nfunction railSectionTitle(section: RailSection): string {\n const item = RAIL_NAV.find(\n (entry): entry is RailNavItem => !isRailNavSeparator(entry) && entry.id === section,\n );\n return item?.title ?? HIDDEN_SECTION_TITLES[section] ?? section;\n}\n\nconst HOUSE_OUTDOOR_THEME = staticLayerThemeDefaults();\nconst HOUSE_ICON_THEME = staticIconThemeDefaults();\n\nconst OUTDOOR_COLOR_FIELDS: Array<[StaticLayerThemeKey, string]> = [\n ['GREEN_AREA_COLOR', 'Green Areas'],\n ['WATER_COLOR', 'Water'],\n ['WALKABLE_COLOR', 'Walking Paths'],\n ['PARKING_LANE_COLOR', 'Parking Lanes'],\n ['PARKING_ICON_COLOR', 'Parking Icons'],\n];\n\nconst ICON_COLOR_FIELDS: Array<[IconThemeKey, string]> = [\n ['AMENITY_ICON_COLOR', 'Amenity Icons'],\n ['KIOSK_ICON_COLOR', 'Kiosk Icons'],\n ['CONNECTOR_ICON_COLOR', 'Connection Icons'],\n];\n\nfunction SettingsField({\n label,\n onReset,\n children,\n}: {\n label: string;\n onReset?: () => void;\n children: ReactNode;\n}) {\n return (\n <div className=\"eyeon-map-rail__field eyeon-map-rail__field--inline\">\n <span className=\"eyeon-map-rail__field-label\">\n {label}\n {onReset ? <FieldResetButton label={label} onClick={onReset} /> : null}\n </span>\n {children}\n </div>\n );\n}\n\nfunction ColorField({\n label,\n value,\n fallback,\n onChange,\n onReset,\n}: {\n label: string;\n value: string;\n fallback?: string;\n onChange: (hex: string) => void;\n onReset?: () => void;\n}) {\n const transparent = isTransparentColor(value) || !value.trim();\n const [hex, setHex] = useState(transparent ? '' : value);\n\n useEffect(() => {\n setHex(transparent ? '' : value);\n }, [transparent, value]);\n\n const commit = (next: string) => {\n if (!next.trim() || isTransparentColor(next)) {\n setHex('');\n if (!transparent) onChange(TRANSPARENT_COLOR);\n return;\n }\n const normalized = normalizeHexColor(next);\n if (!normalized) {\n setHex(transparent ? '' : value);\n return;\n }\n setHex(normalized);\n if (normalized !== value.toLowerCase() && normalized !== value) onChange(normalized);\n };\n\n return (\n <SettingsField label={label} onReset={onReset}>\n <ColorSwatch\n label={label}\n hex={hex}\n swatch={transparent ? TRANSPARENT_COLOR : value}\n fallback={fallback}\n onHexChange={setHex}\n onCommit={() => commit(hex)}\n onPick={commit}\n />\n </SettingsField>\n );\n}\n\nexport function LeftRail({\n section,\n onSectionChange,\n draft,\n activeLevelId,\n selectedShapeId,\n selectedShapeIds,\n onSelectShape,\n onHoverShape,\n onListFocus,\n retailers = [],\n kiosks = [],\n canFloors,\n canSettings,\n canResponsiveness = false,\n onCreateLevel,\n onUpdateLevel,\n onDeleteLevel,\n onReorderLevels,\n onAutoroute,\n theme,\n onThemeChange,\n assignPanel,\n catalogKioskPanel,\n selectedCatalogKioskId = null,\n onSelectCatalogKiosk,\n editMapPanel,\n wayfindingPanel,\n mapResponsivenessPanel,\n footer,\n onUseClassicMap,\n}: LeftRailProps) {\n const [floorsScreen, setFloorsScreen] = useState<FloorsScreen>({ mode: 'list' });\n\n useEffect(() => {\n if (section !== 'floors') setFloorsScreen({ mode: 'list' });\n }, [section]);\n\n useEffect(\n () => () => {\n onHoverShape?.(null);\n },\n [section, onHoverShape],\n );\n\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 kioskShapes = assigned.kiosks;\n const unassignedStoreShapes = assigned.unassignedStores;\n const unassignedAmenityShapes = assigned.unassignedAmenities;\n const unassignedKioskShapes = assigned.unassignedKiosks;\n const unassignedShapes = assigned.unassigned;\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 unlinkedEscalators = escalatorShapes.filter(\n (s) => !connectorForShape(s.id, draft.anchors, connectors),\n );\n const escalatorRides = useMemo(() => {\n const rides = groupEscalatorRides(\n connectors,\n draft.anchors,\n draft.edges,\n escalatorShapes,\n );\n const indexById = new Map(\n railListLevelOrder(draft.levels).map((level, index) => [level.id, index]),\n );\n return rides.slice().sort((a, b) => {\n const ai = indexById.get(a.from.levelId) ?? Number.POSITIVE_INFINITY;\n const bi = indexById.get(b.from.levelId) ?? Number.POSITIVE_INFINITY;\n if (ai !== bi) return ai - bi;\n return a.from.key.localeCompare(b.from.key);\n });\n }, [connectors, draft.anchors, draft.edges, draft.levels, escalatorShapes]);\n const linkedElevators = elevatorShapes.filter((s) =>\n connectorForShape(s.id, draft.anchors, connectors),\n );\n const unlinkedElevators = elevatorShapes.filter(\n (s) => !connectorForShape(s.id, draft.anchors, connectors),\n );\n const assignmentById = useMemo(\n () => assignmentByShapeId(draft.assignments),\n [draft.assignments],\n );\n const retailerById = useMemo(() => {\n const counts = new Map<string, number>();\n for (const retailer of retailers) {\n const key = retailer.name.trim().toLowerCase();\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return new Map(\n retailers.map((retailer) => {\n const duplicate =\n (counts.get(retailer.name.trim().toLowerCase()) ?? 0) > 1;\n return [\n retailer.id,\n retailerOptionLabel(retailer, duplicate),\n ] as const;\n }),\n );\n }, [retailers]);\n const amenityById = useMemo(\n () => new Map(draft.amenities.map((item) => [item.id, item.name])),\n [draft.amenities],\n );\n const kioskById = useMemo(\n () => new Map(kiosks.map((item) => [item.id, item.name])),\n [kiosks],\n );\n const assignedNameFor = (shape: {\n id: number;\n kind: string;\n key: string;\n levelId: number;\n }) => {\n const assignment = assignmentById.get(shape.id);\n if (assignment?.retailerId != null) {\n return retailerById.get(assignment.retailerId) ?? null;\n }\n if (assignment?.targetType === 'amenity' || assignment?.amenityId != null) {\n const catalogName =\n assignment.amenityId != null\n ? amenityById.get(assignment.amenityId) ?? null\n : null;\n const fromType = getAmenityByType(assignment.customLabel ?? '')?.name;\n return amenityAssignedName(assignment, catalogName ?? fromType ?? null);\n }\n if (assignment?.targetType === 'kiosk' || assignment?.kioskId != null) {\n return kioskAssignedName(\n assignment,\n assignment.kioskId != null\n ? kioskById.get(assignment.kioskId) ?? null\n : null,\n );\n }\n return connectorRideLabel(\n shape,\n draft.anchors,\n draft.edges,\n connectors,\n draft.shapes,\n draft.levels,\n );\n };\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 selectedIds =\n selectedShapeIds ?? (selectedShapeId != null ? [selectedShapeId] : []);\n const isShapeSelected = (id: number) => selectedIds.includes(id);\n const selectedCatalogKiosk =\n selectedCatalogKioskId != null\n ? kiosks.find((item) => item.id === selectedCatalogKioskId) ?? null\n : null;\n const showingCatalogKiosk =\n section === 'kiosks' && selectedCatalogKiosk != null;\n const showingItemOptions =\n railShowsItemOptions(section, selectedIds.length) || showingCatalogKiosk;\n useEffect(() => {\n if (showingItemOptions) onHoverShape?.(null);\n }, [showingItemOptions, onHoverShape]);\n const itemOptionsTitle = (() => {\n if (showingCatalogKiosk && selectedCatalogKiosk) {\n const linkedId = shapeIdForCatalogKiosk(\n selectedCatalogKiosk.id,\n draft.assignments,\n );\n const linked = linkedId\n ? draft.shapes.find((row) => row.id === linkedId)\n : null;\n return {\n key: selectedCatalogKiosk.name.trim() || `Kiosk ${selectedCatalogKiosk.id}`,\n levelName: linked?.key ?? 'Unlinked',\n };\n }\n if (!showingItemOptions || selectedIds.length !== 1) return null;\n const shape = draft.shapes.find((row) => row.id === selectedIds[0]);\n if (!shape) return null;\n return { key: shape.key, levelName: levelName(shape.levelId) };\n })();\n const selectShapeFromList = (id: number, event: { shiftKey: boolean }) => {\n onSelectCatalogKiosk?.(null);\n onSelectShape(id, { additive: event.shiftKey });\n onListFocus?.();\n };\n const leftoverKiosks = leftoverCatalogKiosks(kiosks, draft.assignments);\n\n const counts: Record<RailNavCountKey, number> = {\n floors: visibleFloorCount(draft.levels),\n stores: storeShapes.length + unassignedStoreShapes.length,\n amenities: amenityShapes.length + unassignedAmenityShapes.length,\n kiosks:\n kioskShapes.length + unassignedKioskShapes.length + leftoverKiosks.length,\n escalators: escalatorShapes.length,\n elevators: elevatorShapes.length,\n unassigned: unassignedShapes.length,\n };\n\n const renderShapeList = (\n shapes: typeof draft.shapes,\n empty: string,\n opts?: {\n kindLabelFor?: (shape: (typeof draft.shapes)[number]) => string;\n showKindTag?: boolean;\n connectorIcon?: 'escalator' | 'elevator';\n connectorAssigned?: boolean;\n },\n ) =>\n shapes.length === 0 ? (\n <p className=\"eyeon-map-rail__hint\">{empty}</p>\n ) : (\n sortShapesByRailLevel(shapes, draft.levels).map((s) => {\n const copy = railRowLabels({\n key: s.key,\n kindLabel: opts?.kindLabelFor?.(s) ?? shapeKindLabel(s.kind),\n levelName: levelName(s.levelId),\n assignedName: assignedNameFor(s),\n showKindTag: opts?.showKindTag,\n });\n const iconUrl = opts?.connectorIcon\n ? connectorSpecialIconDataUrl(\n opts.connectorIcon,\n Boolean(opts.connectorAssigned),\n opts.connectorAssigned ? theme.CONNECTOR_ICON_COLOR : undefined,\n )\n : undefined;\n return (\n <button\n key={s.id}\n type=\"button\"\n className={\n isShapeSelected(s.id)\n ? 'eyeon-map-rail__row is-active'\n : 'eyeon-map-rail__row'\n }\n onMouseDown={(event) => {\n if (event.shiftKey) event.preventDefault();\n }}\n onMouseEnter={() => onHoverShape?.(s.id)}\n onMouseLeave={() => onHoverShape?.(null)}\n onClick={(event) => selectShapeFromList(s.id, event)}\n >\n {iconUrl ? (\n <img\n className={\n opts?.connectorAssigned\n ? 'eyeon-map-rail__row-icon is-assigned'\n : 'eyeon-map-rail__row-icon'\n }\n src={iconUrl}\n alt=\"\"\n />\n ) : null}\n <span className=\"eyeon-map-rail__row-copy\">\n {copy.title ? (\n <span className=\"eyeon-map-rail__row-title\">{copy.title}</span>\n ) : null}\n <span className=\"eyeon-map-rail__row-meta\">\n <span\n className={\n copy.title\n ? 'eyeon-map-rail__row-id'\n : 'eyeon-map-rail__row-id eyeon-map-rail__row-id--lead'\n }\n >\n {copy.id}\n </span>\n {copy.tags.length > 0 ? (\n <span className=\"eyeon-map-rail__tags\">\n {copy.tags.map((tag) => (\n <span key={`${s.id}-${tag}`} className=\"eyeon-map-rail__tag\">\n {tag}\n </span>\n ))}\n </span>\n ) : null}\n </span>\n </span>\n </button>\n );\n })\n );\n\n const renderEscalatorRideList = () =>\n escalatorRides.map((ride) => {\n const lines = escalatorRideLandingLines(ride, draft.levels);\n const active =\n isShapeSelected(ride.from.id) || isShapeSelected(ride.to.id);\n return (\n <button\n key={ride.connectorId}\n type=\"button\"\n className={\n active\n ? 'eyeon-map-rail__row eyeon-map-rail__row--ride is-active'\n : 'eyeon-map-rail__row eyeon-map-rail__row--ride'\n }\n onMouseDown={(event) => {\n if (event.shiftKey) event.preventDefault();\n }}\n onMouseEnter={() => onHoverShape?.(ride.from.id)}\n onMouseLeave={() => onHoverShape?.(null)}\n onClick={(event) => selectShapeFromList(ride.from.id, event)}\n >\n <span className=\"eyeon-map-rail__row-copy\">\n {lines.map((line) => (\n <span key={line.shapeId} className=\"eyeon-map-rail__row-meta\">\n <span className=\"eyeon-map-rail__row-id eyeon-map-rail__row-id--lead\">\n {line.key}\n </span>\n <span className=\"eyeon-map-rail__tags\">\n <span className=\"eyeon-map-rail__tag\">{line.levelName}</span>\n </span>\n </span>\n ))}\n </span>\n </button>\n );\n });\n\n const renderAssignedUnassigned = (\n assignedList: typeof draft.shapes,\n unassignedList: typeof draft.shapes,\n kindLabelFor?: (shape: (typeof draft.shapes)[number]) => string,\n connectorIcon?: 'escalator' | 'elevator',\n ) => (\n <>\n <div className=\"eyeon-map-rail__heading\">\n Assigned ({assignedList.length})\n </div>\n {assignedList.length > 0\n ? renderShapeList(assignedList, '', {\n kindLabelFor,\n connectorIcon,\n connectorAssigned: true,\n })\n : null}\n <div className=\"eyeon-map-rail__heading\">\n Unassigned ({unassignedList.length})\n </div>\n {unassignedList.length > 0\n ? renderShapeList(unassignedList, '', {\n kindLabelFor,\n connectorIcon,\n connectorAssigned: false,\n })\n : null}\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 if (showingCatalogKiosk) {\n onSelectCatalogKiosk?.(null);\n return;\n }\n if (showingItemOptions) {\n onSelectShape(null);\n onHoverShape?.(null);\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 ) : itemOptionsTitle ? (\n <span className=\"eyeon-map-assign__tag\">{itemOptionsTitle.key}</span>\n ) : (\n railSectionTitle(section)\n )}\n </div>\n {itemOptionsTitle ? (\n <span className=\"eyeon-map-rail__tag\">{itemOptionsTitle.levelName}</span>\n ) : null}\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 {RAIL_NAV.map((entry, index) => {\n if (isRailNavSeparator(entry)) {\n return (\n <div\n key={`sep-${index}`}\n className=\"eyeon-map-rail__nav-sep\"\n role=\"separator\"\n />\n );\n }\n const Icon = entry.icon;\n return (\n <button\n key={entry.id}\n type=\"button\"\n className=\"eyeon-map-rail__nav-item\"\n onClick={() => onSectionChange(entry.id)}\n >\n <span className=\"eyeon-map-rail__nav-icon\">\n <Icon />\n </span>\n <span className=\"eyeon-map-rail__nav-copy\">\n <span className=\"eyeon-map-rail__nav-title\">{entry.title}</span>\n <span className=\"eyeon-map-rail__nav-desc\">{entry.description}</span>\n </span>\n <span className=\"eyeon-map-rail__nav-meta\">\n {entry.countKey != null ? (\n <span className=\"eyeon-map-rail__nav-count\">\n {counts[entry.countKey]}\n </span>\n ) : null}\n <ChevronIcon />\n </span>\n </button>\n );\n })}\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 === 'map-responsiveness' && (\n <div className=\"eyeon-map-rail__section\">{mapResponsivenessPanel}</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 {showingItemOptions\n ? assignPanel\n : renderAssignedUnassigned(storeShapes, unassignedStoreShapes)}\n </div>\n )}\n\n {section === 'amenities' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions\n ? assignPanel\n : renderAssignedUnassigned(\n amenityShapes,\n unassignedAmenityShapes,\n )}\n </div>\n )}\n\n {section === 'unassigned' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions ? (\n assignPanel\n ) : (\n <>\n <div className=\"eyeon-map-rail__heading\">\n Unassigned ({unassignedShapes.length})\n </div>\n {renderShapeList(\n unassignedShapes,\n 'Every assignable polygon has a link.',\n { showKindTag: true },\n )}\n </>\n )}\n </div>\n )}\n\n {section === 'escalators' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions ? (\n assignPanel\n ) : (\n <>\n <p className=\"eyeon-map-rail__hint\">\n Pick the boarding landing, then the floor and exit landing.\n A linked ride is one row: boarding on top, exit below. Rides\n are one-way.\n </p>\n <div className=\"eyeon-map-rail__heading\">\n Assigned ({escalatorRides.length})\n </div>\n {escalatorRides.length > 0 ? renderEscalatorRideList() : null}\n <div className=\"eyeon-map-rail__heading\">\n Unassigned ({unlinkedEscalators.length})\n </div>\n {unlinkedEscalators.length > 0\n ? renderShapeList(unlinkedEscalators, '')\n : null}\n </>\n )}\n </div>\n )}\n\n {section === 'elevators' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions ? (\n assignPanel\n ) : (\n renderAssignedUnassigned(\n linkedElevators,\n unlinkedElevators,\n undefined,\n 'elevator',\n )\n )}\n </div>\n )}\n\n {section === 'kiosks' && (\n <div className=\"eyeon-map-rail__section\">\n {showingCatalogKiosk\n ? catalogKioskPanel\n : showingItemOptions\n ? assignPanel\n : (\n <>\n {renderAssignedUnassigned(kioskShapes, unassignedKioskShapes)}\n {kiosks.length > 0 ? (\n <>\n <div className=\"eyeon-map-rail__heading\">\n Existing kiosks ({kiosks.length})\n </div>\n <p className=\"eyeon-map-rail__hint\">\n Saved kiosk devices (shared with Classic Map). Open\n one to attach or remove a New map shape — the device\n itself is not deleted.\n </p>\n {kiosks.map((kiosk) => {\n const linkedId = shapeIdForCatalogKiosk(\n kiosk.id,\n draft.assignments,\n );\n const linked = linkedId\n ? draft.shapes.find((row) => row.id === linkedId)\n : null;\n const copy = catalogKioskRowLabel(\n kiosk,\n linked?.key ?? null,\n );\n return (\n <button\n key={kiosk.id}\n type=\"button\"\n className={\n selectedCatalogKioskId === kiosk.id\n ? 'eyeon-map-rail__row is-active'\n : 'eyeon-map-rail__row'\n }\n onClick={() => {\n onSelectShape(null);\n onSelectCatalogKiosk?.(kiosk.id);\n }}\n >\n <span className=\"eyeon-map-rail__row-copy\">\n <span className=\"eyeon-map-rail__row-title\">\n {copy.title}\n </span>\n <span className=\"eyeon-map-rail__row-meta\">\n <span className=\"eyeon-map-rail__row-id\">\n {copy.id}\n </span>\n <span className=\"eyeon-map-rail__tags\">\n {copy.tags.map((tag) => (\n <span\n key={`${kiosk.id}-${tag}`}\n className=\"eyeon-map-rail__tag\"\n >\n {tag}\n </span>\n ))}\n </span>\n </span>\n </span>\n </button>\n );\n })}\n </>\n ) : null}\n </>\n )}\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 {(\n [\n ['ACCENT_COLOR', 'Highlight'],\n ['STORE_DEFAULT_COLOR', 'Stores'],\n ['MAP_BACKGROUND_COLOR', 'Background'],\n ] as const\n ).map(([key, label]) => {\n const house = DEFAULT_THEME[key];\n const customized = !sameHexColor(theme[key], house);\n return (\n <ColorField\n key={key}\n label={label}\n value={theme[key]}\n fallback={house}\n onChange={(hex) => onThemeChange({ [key]: hex })}\n onReset={\n customized\n ? () => onThemeChange({ [key]: house })\n : undefined\n }\n />\n );\n })}\n <SettingsField label=\"Stores Radius\">\n <input\n className=\"eyeon-map-rail__number-sm\"\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 </SettingsField>\n <div className=\"eyeon-map-rail__sep\" role=\"separator\" />\n {OUTDOOR_COLOR_FIELDS.map(([key, label]) => {\n const house = HOUSE_OUTDOOR_THEME[key];\n const customized = !sameHexColor(theme[key], house);\n return (\n <ColorField\n key={key}\n label={label}\n value={theme[key]}\n fallback={house}\n onChange={(hex) => onThemeChange({ [key]: hex })}\n onReset={\n customized\n ? () => onThemeChange({ [key]: house })\n : undefined\n }\n />\n );\n })}\n {ICON_COLOR_FIELDS.map(([key, label]) => {\n const house = HOUSE_ICON_THEME[key];\n const customized = !sameHexColor(theme[key], house);\n return (\n <ColorField\n key={key}\n label={label}\n value={theme[key]}\n fallback={house}\n onChange={(hex) => onThemeChange({ [key]: hex })}\n onReset={\n customized\n ? () => onThemeChange({ [key]: house })\n : undefined\n }\n />\n );\n })}\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 {onUseClassicMap || footer ? (\n <div className=\"eyeon-map-rail__footer\">\n {onUseClassicMap ? (\n <button\n type=\"button\"\n className=\"eyeon-map-rail__classic\"\n onClick={onUseClassicMap}\n >\n Use Classic Map\n </button>\n ) : null}\n {footer}\n </div>\n ) : null}\n </aside>\n );\n}\n","import React from 'react';\nimport type { MapAssignKiosk } from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\n\n/**\n * Link a shared display_kiosks device to a New-map kiosk_screen shape.\n * Does NOT delete the physical kiosk — that would break Classic placements,\n * kiosk-electron identity, and display ads. Use Unlink / Remove from New Map.\n */\nexport function CatalogKioskForm({\n kiosk,\n shapeOptions,\n assignedShapeId,\n canEdit,\n onAssign,\n}: {\n kiosk: MapAssignKiosk;\n shapeOptions: Array<{ value: string; label: string }>;\n assignedShapeId: number | null;\n canEdit: boolean;\n onAssign: (shapeId: number | null) => void;\n}) {\n const hasShape = assignedShapeId != null;\n const empty = shapeOptions.length === 0;\n\n return (\n <div className=\"eyeon-map-assign\">\n <p className=\"eyeon-map-rail__hint\">\n Link this saved kiosk device to a kiosk shape on the New map. Removing it\n here only clears the New map placement — the device stays available for\n Classic Map, kiosk apps, and ads.\n </p>\n <ModernSelect\n ariaLabel=\"Kiosk shape\"\n value={hasShape ? String(assignedShapeId) : ''}\n disabled={!canEdit || empty}\n searchable={shapeOptions.length > 8}\n placeholder={empty ? 'No kiosk shapes on the map' : 'Choose a kiosk shape…'}\n options={shapeOptions}\n onChange={(next) => onAssign(next ? Number(next) : null)}\n />\n <div className=\"eyeon-map-assign__actions\">\n {canEdit && hasShape ? (\n <button\n type=\"button\"\n className=\"eyeon-map-assign__unassign\"\n onClick={() => onAssign(null)}\n >\n Remove from New Map\n </button>\n ) : (\n <span />\n )}\n </div>\n </div>\n );\n}\n","import type {\n BatchOp,\n CmShape,\n CmShapeAssignment,\n ShapeGeometry,\n ShapeKind,\n} from '../core';\n\n/** Short, readable prefix for staff-facing shape IDs (`unit-k4n8`). */\nconst SHAPE_KEY_PREFIX: Record<ShapeKind, string> = {\n unit: 'unit',\n amenity: 'amenity',\n kiosk_screen: 'kiosk',\n connector: 'conn',\n entrance: 'entry',\n walkable: 'walk',\n void: 'void',\n wall: 'wall',\n boundary: 'bound',\n floorplate: 'slab',\n decor: 'decor',\n label: 'text',\n zone: 'zone',\n parking_zone: 'park',\n green_area: 'green',\n water: 'water',\n parking_icon: 'picon',\n};\n\n/** No 0/O/1/I/L — keeps IDs short and easy to read. */\nexport const SHAPE_KEY_ALPHABET = 'abcdefghjkmnpqrstuvwxyz23456789';\nexport const SHAPE_KEY_SUFFIX_LENGTH = 4;\n\nexport function shapeKeyPrefix(kind: string): string {\n return SHAPE_KEY_PREFIX[kind as ShapeKind] ?? kind.replace(/_/g, '');\n}\n\nexport function randomShapeKeySuffix(\n length = SHAPE_KEY_SUFFIX_LENGTH,\n): string {\n const bytes = new Uint8Array(length);\n globalThis.crypto.getRandomValues(bytes);\n let out = '';\n for (let i = 0; i < length; i++) {\n out += SHAPE_KEY_ALPHABET[bytes[i]! % SHAPE_KEY_ALPHABET.length];\n }\n return out;\n}\n\nconst SHAPE_KEY_PATTERN = /^[a-z]+-[a-z0-9]{4}$/;\n\n/** True for the short IDs we mint (`unit-k4n8`), not SVG ids like `unit-101`. */\nexport function isAllocatedShapeKey(key: string): boolean {\n return SHAPE_KEY_PATTERN.test(key);\n}\n\nexport function liveShapeKeysOnLevel(\n shapes: Array<{\n levelId: number;\n key: string;\n orphanedAt?: string | null;\n }>,\n levelId: number,\n): string[] {\n return shapes\n .filter((shape) => shape.levelId === levelId && !shape.orphanedAt)\n .map((shape) => shape.key);\n}\n\nexport function copyDestinationLevels<T extends { id: number }>(\n levels: T[],\n currentLevelId: number,\n): T[] {\n return levels.filter((level) => level.id !== currentLevelId);\n}\n\n/**\n * Mint a short unique key for a new or copied shape.\n * `suffix` is injectable so tests can pin the random part.\n */\nexport function allocShapeKey(\n kind: string,\n taken: Iterable<string>,\n suffix: () => string = randomShapeKeySuffix,\n): string {\n const prefix = shapeKeyPrefix(kind);\n const used = taken instanceof Set ? taken : new Set(taken);\n for (let i = 0; i < 24; i++) {\n const key = `${prefix}-${suffix()}`;\n if (!used.has(key)) return key;\n }\n let n = 2;\n while (used.has(`${prefix}-${n}`)) n += 1;\n return `${prefix}-${n}`;\n}\n\nexport function cloneShapeGeometry(geometry: ShapeGeometry): ShapeGeometry {\n return {\n paths: geometry.paths.map((path) => ({ d: path.d, closed: path.closed })),\n polygons: geometry.polygons.map((ring) =>\n ring.map((point) => ({ x: point.x, y: point.y })),\n ),\n };\n}\n\nexport function copyShapeToLevelOps(args: {\n shape: CmShape;\n assignment?: CmShapeAssignment | null;\n targetLevelId: number;\n shapes: Array<{\n id: number;\n levelId: number;\n key: string;\n orphanedAt?: string | null;\n }>;\n allocId: () => number;\n allocKey?: (kind: string, taken: Iterable<string>) => string;\n}): { ops: BatchOp[]; shapeId: number; key: string } | null {\n const { shape, targetLevelId } = args;\n if (targetLevelId === shape.levelId) return null;\n const taken = liveShapeKeysOnLevel(args.shapes, targetLevelId);\n const id = args.allocId();\n const key = (args.allocKey ?? allocShapeKey)(shape.kind, taken);\n const ops: BatchOp[] = [\n {\n op: 'upsert_shape',\n shape: {\n id,\n levelId: targetLevelId,\n key,\n kind: shape.kind,\n geometry: cloneShapeGeometry(shape.geometry),\n bbox: { ...shape.bbox },\n zIndex: shape.zIndex,\n style: { ...shape.style },\n label: { ...shape.label },\n sourceSvgId: null,\n origin: 'manual',\n geometryLocked: true,\n },\n },\n ];\n if (args.assignment) {\n ops.push({\n op: 'upsert_assignment',\n assignment: { ...args.assignment, shapeId: id },\n });\n }\n return { ops, shapeId: id, key };\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\nimport type {\n AssignmentLayerType,\n CmAmenityCatalogItem,\n CmShape,\n CmShapeAssignment,\n LabelAlign,\n MapAssignKiosk,\n MapAssignRetailer,\n} from '../../core';\nimport {\n assignmentHasTarget,\n assignmentIconThemeFallback,\n assignmentPadFillFallback,\n DEFAULT_LABEL_ALIGN,\n emptyShapeAssignment,\n normalizeLabelAlign,\n parseShapeAssignment,\n retailerOptionLabel,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport {\n amenityAssignOptions,\n amenityCatalogIdForType,\n amenityTypeFromCatalogId,\n} from '../../specialIcons';\nimport { isAssignableKind } from '../railAssignments';\nimport { AssignmentStyleFields } from './AssignmentStyleFields';\nimport { AlignRow } from './formRows';\n\nconst RETAIL_LAYER_TYPES: AssignmentLayerType[] = [\n 'retail_name',\n 'retail_logo',\n 'retail_text',\n];\n\nexport interface AssignFormProps {\n shape: CmShape;\n assignment: CmShapeAssignment | null;\n amenities: CmAmenityCatalogItem[];\n retailers: MapAssignRetailer[];\n kiosks?: MapAssignKiosk[];\n canEdit: boolean;\n storeDefaultColor: string;\n storeTextColor: string;\n amenityIconColor: string;\n kioskIconColor: string;\n onChange: (assignment: CmShapeAssignment) => void;\n onClear: () => void;\n copyAction?: ReactNode;\n}\n\nexport function AssignForm({\n shape,\n assignment,\n amenities,\n retailers,\n kiosks = [],\n canEdit,\n storeDefaultColor,\n storeTextColor,\n amenityIconColor,\n kioskIconColor,\n onChange,\n onClear,\n copyAction,\n}: AssignFormProps) {\n const [form, setForm] = useState<CmShapeAssignment>(() =>\n assignment\n ? parseShapeAssignment(assignment, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind),\n );\n const formRef = useRef(form);\n formRef.current = form;\n\n useEffect(() => {\n setForm(\n assignment\n ? parseShapeAssignment(assignment, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind),\n );\n }, [shape, assignment]);\n\n const commit = useCallback(\n (next: CmShapeAssignment) => {\n setForm(next);\n if (!canEdit) return;\n onChange(parseShapeAssignment(next, shape.kind));\n },\n [canEdit, onChange, shape.kind],\n );\n\n const patch = useCallback(\n (partial: Partial<CmShapeAssignment>) => {\n commit({ ...formRef.current, shapeId: shape.id, ...partial });\n },\n [commit, shape.id],\n );\n\n const nameCounts = useMemo(() => {\n const counts = new Map<string, number>();\n for (const retailer of retailers) {\n const key = retailer.name.trim().toLowerCase();\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return counts;\n }, [retailers]);\n\n const retailerOptions = useMemo(\n () =>\n retailers.map((retailer) => {\n const duplicate =\n (nameCounts.get(retailer.name.trim().toLowerCase()) ?? 0) > 1;\n return {\n value: String(retailer.id),\n label: retailerOptionLabel(retailer, duplicate),\n };\n }),\n [nameCounts, retailers],\n );\n\n const amenityOptions = useMemo(() => amenityAssignOptions(), []);\n const selectedAmenityType =\n amenityTypeFromCatalogId(form.amenityId, amenities) ||\n form.customLabel ||\n '';\n\n const kioskCatalogName = useMemo(() => {\n if (form.kioskId == null) return null;\n return kiosks.find((item) => item.id === form.kioskId)?.name ?? null;\n }, [form.kioskId, kiosks]);\n\n const showTextColor = [\n 'retail_name',\n 'retail_text',\n 'custom_text',\n 'kiosk',\n 'amenity',\n ].includes(form.layerType);\n const textColorLabel =\n form.layerType === 'kiosk' || form.layerType === 'amenity'\n ? 'Icon Color'\n : 'Text Color';\n const textColorFallback = assignmentIconThemeFallback(\n form,\n {\n AMENITY_ICON_COLOR: amenityIconColor,\n KIOSK_ICON_COLOR: kioskIconColor,\n CONNECTOR_ICON_COLOR: storeTextColor,\n STORE_TEXT_COLOR: storeTextColor,\n },\n shape.kind,\n );\n\n const hasAssignment = assignmentHasTarget(form);\n\n if (!isAssignableKind(shape.kind)) return null;\n\n return (\n <div className=\"eyeon-map-assign\">\n {shape.kind === 'unit' || shape.kind === 'parking_zone' ? (\n <>\n <ModernSelect\n ariaLabel=\"Choose a Retailer\"\n value={form.retailerId != null ? String(form.retailerId) : ''}\n disabled={!canEdit}\n searchable\n placeholder=\"Choose a Retailer…\"\n options={retailerOptions}\n onChange={(next) => {\n const retailerId = next ? Number(next) : null;\n const retailer = retailers.find((item) => item.id === retailerId);\n const layerType = RETAIL_LAYER_TYPES.includes(form.layerType)\n ? form.layerType\n : 'retail_name';\n patch({\n targetType: retailerId ? 'retailer' : 'none',\n retailerId,\n amenityId: null,\n kioskId: null,\n unitStatus: retailerId ? 'occupied' : 'vacant',\n layerType,\n customLabel:\n layerType === 'retail_name'\n ? retailer?.name ?? null\n : form.customLabel,\n customImageKey:\n layerType === 'retail_logo'\n ? retailer?.logoKey ?? form.customImageKey\n : form.customImageKey,\n });\n }}\n />\n {form.retailerId != null ? (\n <div className=\"eyeon-map-assign__tabs\" role=\"group\" aria-label=\"Display\">\n <button\n type=\"button\"\n className={\n form.layerType === 'retail_name' ? 'is-active' : undefined\n }\n disabled={!canEdit}\n onClick={() => {\n const retailer = retailers.find(\n (item) => item.id === form.retailerId,\n );\n patch({\n layerType: 'retail_name',\n customLabel: retailer?.name ?? form.customLabel,\n });\n }}\n >\n Retail Name\n </button>\n <button\n type=\"button\"\n className={\n form.layerType === 'retail_logo' ? 'is-active' : undefined\n }\n disabled={!canEdit}\n onClick={() => {\n const retailer = retailers.find(\n (item) => item.id === form.retailerId,\n );\n patch({\n layerType: 'retail_logo',\n customImageKey:\n retailer?.logoKey ?? form.customImageKey,\n });\n }}\n >\n Retail Logo\n </button>\n <button\n type=\"button\"\n className={\n form.layerType === 'retail_text' ? 'is-active' : undefined\n }\n disabled={!canEdit}\n onClick={() => patch({ layerType: 'retail_text' })}\n >\n Custom Text\n </button>\n </div>\n ) : null}\n {form.retailerId != null && form.layerType === 'retail_text' ? (\n <>\n <label className=\"eyeon-map-rail__field\">\n Text\n <textarea\n rows={3}\n disabled={!canEdit}\n value={form.customLabel ?? ''}\n style={{\n textAlign: normalizeLabelAlign(\n form.align ?? shape.label.align,\n ),\n }}\n onChange={(e) => patch({ customLabel: e.target.value || null })}\n />\n </label>\n <AlignRow\n value={form.align ?? shape.label.align ?? DEFAULT_LABEL_ALIGN}\n disabled={!canEdit}\n onChange={(align: LabelAlign) => patch({ align })}\n />\n </>\n ) : null}\n </>\n ) : null}\n\n {shape.kind === 'amenity' ? (\n <ModernSelect\n ariaLabel=\"Choose Amenity\"\n value={selectedAmenityType}\n disabled={!canEdit}\n searchable\n placeholder=\"Choose Amenity…\"\n options={amenityOptions}\n onChange={(next) => {\n const amenityId = next\n ? amenityCatalogIdForType(next, amenities)\n : null;\n patch({\n targetType: next ? 'amenity' : 'none',\n amenityId,\n customLabel: next || null,\n retailerId: null,\n kioskId: null,\n layerType: 'amenity',\n });\n }}\n />\n ) : null}\n\n {shape.kind === 'kiosk_screen' ? (\n <KioskNameField\n value={form.customLabel ?? kioskCatalogName ?? ''}\n disabled={!canEdit}\n onChange={(name) => {\n const trimmed = name.trim();\n patch({\n targetType: trimmed ? 'kiosk' : 'none',\n kioskId: trimmed ? form.kioskId : null,\n customLabel: name === '' ? null : name,\n retailerId: null,\n amenityId: null,\n layerType: 'kiosk',\n });\n }}\n />\n ) : null}\n\n <AssignmentStyleFields\n form={form}\n canEdit={canEdit}\n storeDefaultColor={assignmentPadFillFallback(\n shape.kind,\n storeDefaultColor,\n )}\n storeTextColor={textColorFallback}\n textColorLabel={textColorLabel}\n showTextColor={showTextColor}\n onPatch={patch}\n />\n {canEdit ? (\n <div className=\"eyeon-map-assign__actions\">\n {copyAction}\n <button\n type=\"button\"\n className=\"eyeon-map-assign__unassign\"\n onClick={() => {\n if (!hasAssignment) return;\n onClear();\n }}\n disabled={!hasAssignment}\n >\n Unassign\n </button>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction KioskNameField({\n value,\n disabled,\n onChange,\n}: {\n value: string;\n disabled: boolean;\n onChange: (name: string) => void;\n}) {\n return (\n <label className=\"eyeon-map-rail__field\">\n Name\n <input\n type=\"text\"\n autoComplete=\"off\"\n spellCheck={false}\n disabled={disabled}\n placeholder=\"e.g. Food court entrance\"\n aria-label=\"Kiosk name\"\n maxLength={50}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n />\n </label>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport type { CmShape, CmShapeAssignment } from '../../core';\nimport {\n assignNumberFromDraft,\n assignmentIconThemeFallback,\n assignmentPadFillFallback,\n bulkAssignFormState,\n DEFAULT_ASSIGNMENT_SIZE,\n emptyShapeAssignment,\n parseShapeAssignment,\n type BulkAssignPatch,\n} from '../../core';\nimport { FieldResetButton } from '../FieldResetButton';\nimport {\n isTransparentColor,\n normalizeHexColor,\n TRANSPARENT_COLOR,\n} from '../hexColor';\nimport { isAssignableKind } from '../railAssignments';\nimport { ColorSwatch } from './formRows';\n\nexport function BulkAssignForm({\n shapes,\n assignments,\n canEdit,\n storeDefaultColor,\n storeTextColor,\n amenityIconColor,\n kioskIconColor,\n onPatch,\n}: {\n shapes: CmShape[];\n assignments: CmShapeAssignment[];\n canEdit: boolean;\n storeDefaultColor: string;\n storeTextColor: string;\n amenityIconColor: string;\n kioskIconColor: string;\n onPatch: (patch: BulkAssignPatch) => void;\n}) {\n const rows = shapes\n .filter((shape) => isAssignableKind(shape.kind))\n .map((shape) => {\n const existing = assignments.find((row) => row.shapeId === shape.id);\n return existing\n ? parseShapeAssignment(existing, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind);\n });\n const common = bulkAssignFormState(rows);\n const assignableShapes = shapes.filter((shape) => isAssignableKind(shape.kind));\n const iconOnly =\n assignableShapes.length > 0 &&\n assignableShapes.every(\n (shape) => shape.kind === 'amenity' || shape.kind === 'kiosk_screen',\n );\n const uniqueKinds = new Set(assignableShapes.map((shape) => shape.kind));\n const textColorLabel = iconOnly ? 'Icon Color' : 'Text Color';\n const textColorFallback =\n uniqueKinds.size === 1\n ? assignmentIconThemeFallback(\n rows[0],\n {\n AMENITY_ICON_COLOR: amenityIconColor,\n KIOSK_ICON_COLOR: kioskIconColor,\n CONNECTOR_ICON_COLOR: storeTextColor,\n STORE_TEXT_COLOR: storeTextColor,\n },\n assignableShapes[0]?.kind,\n )\n : storeTextColor;\n const bgColorFallback =\n uniqueKinds.size === 1\n ? assignmentPadFillFallback(assignableShapes[0]?.kind, storeDefaultColor)\n : storeDefaultColor;\n\n return (\n <div className=\"eyeon-map-assign\">\n <div className=\"eyeon-map-assign__tags\">\n {shapes.map((shape) => (\n <span key={shape.id} className=\"eyeon-map-assign__tag\">\n {shape.key}\n </span>\n ))}\n </div>\n <BulkSizeRow\n value={common.size}\n disabled={!canEdit}\n onCommit={(size) => onPatch({ size })}\n />\n <BulkColorRow\n label=\"BG Color\"\n value={common.bgColor}\n fallback={bgColorFallback}\n mixed={common.bgColorMixed}\n disabled={!canEdit}\n onCommit={(bgColor) => onPatch({ bgColor })}\n />\n <BulkColorRow\n label={textColorLabel}\n value={common.textColor}\n fallback={textColorFallback}\n mixed={common.textColorMixed}\n disabled={!canEdit}\n onCommit={(textColor) => onPatch({ textColor })}\n />\n </div>\n );\n}\n\nfunction BulkSizeRow({\n value,\n disabled,\n onCommit,\n}: {\n value: number | '';\n disabled: boolean;\n onCommit: (size: number) => void;\n}) {\n const [draft, setDraft] = useState(() => (value === '' ? '' : String(value)));\n const focused = useRef(false);\n\n useEffect(() => {\n if (!focused.current) setDraft(value === '' ? '' : String(value));\n }, [value]);\n\n const emitIfComplete = (raw: string, persistIncomplete: boolean) => {\n if (!raw.trim()) {\n setDraft('');\n return;\n }\n const parsed = assignNumberFromDraft(raw);\n if (!parsed.complete) {\n setDraft(raw);\n return;\n }\n setDraft(String(parsed.render));\n onCommit(parsed.render);\n if (persistIncomplete) setDraft(String(parsed.render));\n };\n\n const step = (delta: number) => {\n const base = value === '' ? DEFAULT_ASSIGNMENT_SIZE : value;\n const next = base + delta;\n setDraft(String(next));\n onCommit(next);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">Size</span>\n <div className=\"eyeon-map-assign__control\">\n <div className=\"eyeon-map-assign__stepper\">\n <button\n type=\"button\"\n disabled={disabled}\n aria-label=\"Decrease Size\"\n onClick={() => step(-1)}\n >\n −\n </button>\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={draft}\n disabled={disabled}\n aria-label=\"Size\"\n onFocus={() => {\n focused.current = true;\n }}\n onChange={(e) => emitIfComplete(e.target.value, false)}\n onBlur={() => {\n focused.current = false;\n emitIfComplete(draft, true);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n return;\n }\n if (e.key !== 'ArrowUp' && e.key !== 'ArrowDown') return;\n e.preventDefault();\n if (disabled) return;\n const delta = e.key === 'ArrowUp' ? 1 : -1;\n const parsed = assignNumberFromDraft(draft);\n const base = parsed.complete\n ? parsed.render\n : value === ''\n ? DEFAULT_ASSIGNMENT_SIZE\n : value;\n const next = base + delta;\n setDraft(String(next));\n onCommit(next);\n }}\n />\n <button\n type=\"button\"\n disabled={disabled}\n aria-label=\"Increase Size\"\n onClick={() => step(1)}\n >\n +\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nfunction BulkColorRow({\n label,\n value,\n fallback,\n mixed,\n disabled,\n onCommit,\n}: {\n label: string;\n value: string;\n fallback: string;\n mixed: boolean;\n disabled: boolean;\n onCommit: (hex: string | null) => void;\n}) {\n const transparent = !mixed && isTransparentColor(value);\n const display = mixed\n ? ''\n : transparent\n ? TRANSPARENT_COLOR\n : value.trim()\n ? value\n : fallback;\n const customized = mixed || Boolean(value.trim());\n const [hex, setHex] = useState(transparent ? '' : display);\n\n useEffect(() => {\n setHex(transparent ? '' : display);\n }, [display, transparent]);\n\n const commit = (next: string) => {\n if (!next.trim() || isTransparentColor(next)) {\n setHex('');\n if (!mixed) onCommit(TRANSPARENT_COLOR);\n return;\n }\n const normalized = normalizeHexColor(next);\n if (!normalized) {\n setHex(transparent ? '' : display);\n return;\n }\n setHex(normalized);\n onCommit(normalized);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">\n {label}\n {customized ? (\n <FieldResetButton\n label={label}\n disabled={disabled}\n onClick={() => onCommit(null)}\n />\n ) : null}\n </span>\n <ColorSwatch\n label={label}\n hex={hex}\n swatch={display}\n fallback={fallback}\n disabled={disabled}\n emptyIsTransparent={!mixed}\n onHexChange={setHex}\n onCommit={() => commit(hex)}\n onPick={commit}\n />\n </div>\n );\n}\n","import React, { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport '../../ui/modern-select.css';\n\nfunction Chevron() {\n return (\n <svg\n className=\"eyeon-map-select__chevron\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n aria-hidden\n >\n <path\n d=\"M2.5 4.5 6 8l3.5-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function CopyToLevelButton({\n destinations,\n disabled = false,\n onCopyToLevel,\n}: {\n destinations: Array<{ id: number; name: string }>;\n disabled?: boolean;\n onCopyToLevel: (levelId: number) => string | null;\n}) {\n const listId = useId();\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [menuPos, setMenuPos] = useState<{\n top: number;\n left: number;\n width: number;\n maxHeight: number;\n } | null>(null);\n\n const close = useCallback(() => {\n setOpen(false);\n setMenuPos(null);\n }, []);\n\n const updateMenuPos = useCallback(() => {\n const el = buttonRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom - 8;\n const spaceAbove = rect.top - 8;\n const maxHeight = Math.min(280, Math.max(spaceBelow, spaceAbove, 120));\n const openAbove = spaceBelow < 160 && spaceAbove > spaceBelow;\n setMenuPos({\n top: openAbove ? Math.max(8, rect.top - maxHeight - 4) : rect.bottom + 4,\n left: rect.left,\n width: Math.max(rect.width, 168),\n maxHeight,\n });\n }, []);\n\n const destinationKey = destinations.map((level) => level.id).join(',');\n useEffect(() => {\n setError(null);\n close();\n }, [close, destinationKey]);\n\n useEffect(() => {\n if (!open) return;\n updateMenuPos();\n const onDoc = (e: MouseEvent) => {\n const t = e.target as Node;\n if (buttonRef.current?.contains(t) || menuRef.current?.contains(t)) return;\n close();\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n close();\n buttonRef.current?.blur();\n }\n };\n const onMove = () => updateMenuPos();\n document.addEventListener('mousedown', onDoc);\n document.addEventListener('keydown', onKey);\n window.addEventListener('resize', onMove);\n window.addEventListener('scroll', onMove, true);\n return () => {\n document.removeEventListener('mousedown', onDoc);\n document.removeEventListener('keydown', onKey);\n window.removeEventListener('resize', onMove);\n window.removeEventListener('scroll', onMove, true);\n };\n }, [close, open, updateMenuPos]);\n\n if (destinations.length === 0) return null;\n\n const menu =\n open && menuPos && !disabled\n ? createPortal(\n <div\n ref={menuRef}\n id={listId}\n className=\"eyeon-map-select__menu\"\n role=\"listbox\"\n aria-label=\"Duplicate to floor\"\n style={{\n top: menuPos.top,\n left: menuPos.left,\n width: menuPos.width,\n maxHeight: menuPos.maxHeight,\n }}\n >\n <ul className=\"eyeon-map-select__list\">\n {destinations.map((level) => (\n <li key={level.id} role=\"option\">\n <button\n type=\"button\"\n className=\"eyeon-map-select__option\"\n onClick={() => {\n const nextError = onCopyToLevel(level.id);\n setError(nextError);\n if (!nextError) close();\n }}\n >\n {level.name}\n </button>\n </li>\n ))}\n </ul>\n </div>,\n document.body,\n )\n : null;\n\n return (\n <div className=\"eyeon-map-assign__copy-wrap\">\n <button\n ref={buttonRef}\n type=\"button\"\n className={\n open ? 'eyeon-map-assign__copy is-open' : 'eyeon-map-assign__copy'\n }\n aria-label=\"Duplicate to another floor\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listId : undefined}\n disabled={disabled}\n onClick={() => {\n if (disabled) return;\n setError(null);\n setOpen((value) => !value);\n }}\n >\n Duplicate\n <Chevron />\n </button>\n {menu}\n {error ? (\n <p className=\"eyeon-map-rail__hint\" style={{ color: '#b91c1c' }}>\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ShapeLabel } from '../../core';\nimport { DEFAULT_ENTRANCE_SIZE, clampEntranceSize } from '../entranceIcon';\nimport {\n ColorRow,\n RotateIcon,\n StepperRow,\n nextQuarterTurn,\n stepWholeNumber,\n} from './formRows';\n\nconst MIN_ICON_SIZE = 8;\ntype StepKey = 'size' | 'rotate';\n\nexport function EntranceIconForm({\n label,\n canEdit,\n storeTextColor,\n onChange,\n}: {\n label: ShapeLabel;\n canEdit: boolean;\n storeTextColor: string;\n onChange: (label: ShapeLabel, opts?: { live?: boolean }) => void;\n}) {\n const [size, setSize] = useState(label.size ?? DEFAULT_ENTRANCE_SIZE);\n const [rotate, setRotate] = useState(label.rotate ?? 0);\n const sizeRef = useRef(size);\n const rotateRef = useRef(rotate);\n sizeRef.current = size;\n rotateRef.current = rotate;\n const intervals = useRef<Partial<Record<StepKey, number>>>({});\n\n useEffect(() => {\n setSize(label.size ?? DEFAULT_ENTRANCE_SIZE);\n setRotate(label.rotate ?? 0);\n }, [label]);\n\n useEffect(\n () => () => {\n (Object.values(intervals.current) as number[]).forEach((id) =>\n window.clearInterval(id),\n );\n },\n [],\n );\n\n const commit = useCallback(\n (partial: Partial<ShapeLabel>, opts?: { live?: boolean }) => {\n if (!canEdit) return;\n const nextSize = clampEntranceSize(partial.size ?? sizeRef.current);\n const nextRotate = partial.rotate ?? rotateRef.current;\n if (partial.size != null) {\n setSize(nextSize);\n sizeRef.current = nextSize;\n }\n if (partial.rotate != null) {\n setRotate(nextRotate);\n rotateRef.current = nextRotate;\n }\n onChange(\n {\n ...label,\n ...partial,\n size: nextSize,\n rotate: nextRotate,\n },\n opts,\n );\n },\n [canEdit, label, onChange],\n );\n\n const bump = (key: StepKey, delta: number) => {\n if (key === 'size') {\n commit({\n size: clampEntranceSize(stepWholeNumber(sizeRef.current, delta)),\n });\n return;\n }\n commit({ rotate: stepWholeNumber(rotateRef.current, delta) });\n };\n\n const stopHold = (key: StepKey) => {\n const id = intervals.current[key];\n if (id) {\n window.clearInterval(id);\n intervals.current[key] = undefined;\n }\n };\n\n const startHold = (key: StepKey, delta: number) => {\n stopHold(key);\n intervals.current[key] = window.setInterval(() => bump(key, delta), 200);\n };\n\n const color = label.color ?? '';\n\n return (\n <div className=\"eyeon-map-assign\">\n <StepperRow\n label=\"Size\"\n value={size}\n disabled={!canEdit}\n onChange={(next) => commit({ size: Math.max(MIN_ICON_SIZE, next) })}\n onStep={(delta) => bump('size', delta)}\n onHoldStart={(delta) => startHold('size', delta)}\n onHoldEnd={() => stopHold('size')}\n />\n <ColorRow\n label=\"Color\"\n value={color}\n fallback={storeTextColor}\n disabled={!canEdit}\n onChange={(hex) => commit({ color: hex || undefined })}\n onReset={color ? () => commit({ color: undefined }) : undefined}\n />\n <StepperRow\n label=\"Rotate\"\n value={rotate}\n disabled={!canEdit}\n extra={\n <button\n type=\"button\"\n className=\"eyeon-map-assign__rotate\"\n aria-label=\"Rotate 45 degrees\"\n disabled={!canEdit}\n onClick={() => commit({ rotate: nextQuarterTurn(rotateRef.current) })}\n >\n <RotateIcon />\n </button>\n }\n onChange={(next) => commit({ rotate: next })}\n onStep={(delta) => bump('rotate', delta)}\n onHoldStart={(delta) => startHold('rotate', delta)}\n onHoldEnd={() => stopHold('rotate')}\n />\n </div>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n DEFAULT_LABEL_ALIGN,\n type LabelAlign,\n type ShapeLabel,\n} from '../../core';\nimport { DEFAULT_LABEL_SIZE, DEFAULT_LABEL_TEXT } from '../labelText';\nimport {\n AlignRow,\n ColorRow,\n RotateIcon,\n StepperRow,\n nextQuarterTurn,\n stepWholeNumber,\n} from './formRows';\n\nconst MIN_FONT_SIZE = 8;\ntype StepKey = 'size' | 'rotate';\n\nexport function TextLabelForm({\n label,\n canEdit,\n storeTextColor,\n onChange,\n}: {\n label: ShapeLabel;\n canEdit: boolean;\n storeTextColor: string;\n onChange: (label: ShapeLabel, opts?: { live?: boolean }) => void;\n}) {\n const [text, setText] = useState(label.text ?? '');\n const [size, setSize] = useState(label.size ?? DEFAULT_LABEL_SIZE);\n const [rotate, setRotate] = useState(label.rotate ?? 0);\n const sizeRef = useRef(size);\n const rotateRef = useRef(rotate);\n const textFocused = useRef(false);\n sizeRef.current = size;\n rotateRef.current = rotate;\n const intervals = useRef<Partial<Record<StepKey, number>>>({});\n\n useEffect(() => {\n if (!textFocused.current) setText(label.text ?? '');\n setSize(label.size ?? DEFAULT_LABEL_SIZE);\n setRotate(label.rotate ?? 0);\n }, [label]);\n\n useEffect(\n () => () => {\n (Object.values(intervals.current) as number[]).forEach((id) =>\n window.clearInterval(id),\n );\n },\n [],\n );\n\n const commit = useCallback(\n (partial: Partial<ShapeLabel>, opts?: { live?: boolean }) => {\n if (!canEdit) return;\n const nextSize = Math.max(MIN_FONT_SIZE, partial.size ?? sizeRef.current);\n const nextRotate = partial.rotate ?? rotateRef.current;\n if (partial.size != null) {\n setSize(nextSize);\n sizeRef.current = nextSize;\n }\n if (partial.rotate != null) {\n setRotate(nextRotate);\n rotateRef.current = nextRotate;\n }\n const nextText =\n partial.text === undefined\n ? text\n : partial.text === ''\n ? (label.text ?? DEFAULT_LABEL_TEXT)\n : partial.text;\n onChange(\n {\n ...label,\n ...partial,\n text: nextText,\n size: nextSize,\n rotate: nextRotate,\n },\n opts,\n );\n },\n [canEdit, label, onChange, text],\n );\n\n const bump = (key: StepKey, delta: number) => {\n if (key === 'size') {\n commit({\n size: Math.max(MIN_FONT_SIZE, stepWholeNumber(sizeRef.current, delta)),\n });\n return;\n }\n commit({ rotate: stepWholeNumber(rotateRef.current, delta) });\n };\n\n const stopHold = (key: StepKey) => {\n const id = intervals.current[key];\n if (id) {\n window.clearInterval(id);\n intervals.current[key] = undefined;\n }\n };\n\n const startHold = (key: StepKey, delta: number) => {\n stopHold(key);\n intervals.current[key] = window.setInterval(() => bump(key, delta), 200);\n };\n\n const color = label.color ?? '';\n\n return (\n <div className=\"eyeon-map-assign\">\n <label className=\"eyeon-map-rail__field\">\n Text\n <textarea\n rows={3}\n value={text}\n disabled={!canEdit}\n placeholder=\"Text on the map\"\n aria-label=\"Text\"\n style={{ textAlign: label.align ?? DEFAULT_LABEL_ALIGN }}\n onFocus={() => {\n textFocused.current = true;\n }}\n onChange={(e) => {\n const next = e.target.value;\n setText(next);\n commit({ text: next }, { live: true });\n }}\n onBlur={() => {\n textFocused.current = false;\n const next = text.trim();\n if (next !== text) setText(next);\n commit({ text: next || DEFAULT_LABEL_TEXT });\n }}\n />\n </label>\n <AlignRow\n value={label.align}\n disabled={!canEdit}\n onChange={(align: LabelAlign) => commit({ align })}\n />\n <StepperRow\n label=\"Font size\"\n value={size}\n disabled={!canEdit}\n onChange={(next) => commit({ size: Math.max(MIN_FONT_SIZE, next) })}\n onStep={(delta) => bump('size', delta)}\n onHoldStart={(delta) => startHold('size', delta)}\n onHoldEnd={() => stopHold('size')}\n />\n <ColorRow\n label=\"Text color\"\n value={color}\n fallback={storeTextColor}\n disabled={!canEdit}\n onChange={(hex) => commit({ color: hex || undefined })}\n onReset={color ? () => commit({ color: undefined }) : undefined}\n />\n <StepperRow\n label=\"Rotate\"\n value={rotate}\n disabled={!canEdit}\n extra={\n <button\n type=\"button\"\n className=\"eyeon-map-assign__rotate\"\n aria-label=\"Rotate 45 degrees\"\n disabled={!canEdit}\n onClick={() => commit({ rotate: nextQuarterTurn(rotateRef.current) })}\n >\n <RotateIcon />\n </button>\n }\n onChange={(next) => commit({ rotate: next })}\n onStep={(delta) => bump('rotate', delta)}\n onHoldStart={(delta) => startHold('rotate', delta)}\n onHoldEnd={() => stopHold('rotate')}\n />\n </div>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport type {\n BulkAssignPatch,\n CmAmenityCatalogItem,\n CmShape,\n CmShapeAssignment,\n MapAssignKiosk,\n MapAssignRetailer,\n ShapeKind,\n ShapeLabel,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport { inspectorShowsType, inspectorTypeKinds, SHAPE_KIND_LABELS } from '../labels';\nimport { isAssignableKind } from '../railAssignments';\nimport { copyDestinationLevels } from '../shapeCopy';\nimport { isEntranceIcon } from '../entranceIcon';\nimport { AssignForm } from './AssignForm';\nimport { BulkAssignForm } from './BulkAssignForm';\nimport { CopyToLevelButton } from './CopyToLevelButton';\nimport { EntranceIconForm } from './EntranceIconForm';\nimport { TextLabelForm } from './TextLabelForm';\n\nexport interface InspectorProps {\n shape: CmShape | null;\n assignment: CmShapeAssignment | null;\n amenities: CmAmenityCatalogItem[];\n retailers?: MapAssignRetailer[];\n kiosks?: MapAssignKiosk[];\n /** Other shape keys on the same level — used for uniqueness validation. */\n levelShapeKeys?: string[];\n canEdit: boolean;\n /** Retailer / amenity / kiosk assignment. Off in Edit Map (ID and Type only). */\n showAssignment?: boolean;\n /** Empty-state copy when nothing is selected. */\n emptyHint?: string;\n onRename: (key: string) => void;\n onChangeKind: (kind: ShapeKind) => void;\n onChangeLevel?: (levelId: number) => string | null;\n /** Duplicate the selected shape onto another floor or Outdoor. */\n onCopyToLevel?: (levelId: number) => string | null;\n levels?: Array<{ id: number; name: string }>;\n onDelete?: () => void;\n onClearAssignment?: () => void;\n onSaveAssignment: (assignment: CmShapeAssignment) => void;\n onUpdateLabel?: (label: ShapeLabel, opts?: { live?: boolean }) => void;\n selectedShapes?: CmShape[];\n selectedAssignments?: CmShapeAssignment[];\n onBulkAssign?: (patch: BulkAssignPatch) => void;\n storeDefaultColor: string;\n storeTextColor: string;\n amenityIconColor: string;\n kioskIconColor: string;\n}\n\nexport function Inspector({\n shape,\n assignment,\n amenities,\n retailers = [],\n kiosks = [],\n levelShapeKeys = [],\n canEdit,\n showAssignment = true,\n emptyHint = 'Pick an item from the list below, or click it on the map.',\n onRename,\n onChangeKind,\n onChangeLevel,\n onCopyToLevel,\n levels = [],\n onDelete,\n onClearAssignment,\n onSaveAssignment,\n onUpdateLabel,\n selectedShapes = [],\n selectedAssignments = [],\n onBulkAssign,\n storeDefaultColor,\n storeTextColor,\n amenityIconColor,\n kioskIconColor,\n}: InspectorProps) {\n const [key, setKey] = useState(shape?.key ?? '');\n const [keyError, setKeyError] = useState<string | null>(null);\n const [levelError, setLevelError] = useState<string | null>(null);\n\n useEffect(() => {\n setKey(shape?.key ?? '');\n setKeyError(null);\n setLevelError(null);\n }, [shape, assignment]);\n\n if (showAssignment && selectedShapes.length > 1 && onBulkAssign) {\n return (\n <div className=\"eyeon-map-inspector\">\n <BulkAssignForm\n key={selectedShapes.map((item) => item.id).join(',')}\n shapes={selectedShapes}\n assignments={selectedAssignments}\n canEdit={canEdit}\n storeDefaultColor={storeDefaultColor}\n storeTextColor={storeTextColor}\n amenityIconColor={amenityIconColor}\n kioskIconColor={kioskIconColor}\n onPatch={onBulkAssign}\n />\n </div>\n );\n }\n\n if (!shape) {\n if (!showAssignment || !emptyHint) return null;\n return (\n <div className=\"eyeon-map-inspector__empty\">\n {emptyHint}\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 ID is already used on this level.');\n return;\n }\n setKeyError(null);\n onRename(key);\n };\n\n const copyDestinations = copyDestinationLevels(levels, shape.levelId);\n const copyButton =\n canEdit && onCopyToLevel && copyDestinations.length > 0 ? (\n <CopyToLevelButton\n destinations={copyDestinations}\n onCopyToLevel={onCopyToLevel}\n />\n ) : null;\n\n if (showAssignment) {\n return (\n <div className=\"eyeon-map-inspector\">\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 {isAssignableKind(shape.kind) ? (\n <AssignForm\n shape={shape}\n assignment={assignment}\n amenities={amenities}\n retailers={retailers}\n kiosks={kiosks}\n canEdit={canEdit}\n storeDefaultColor={storeDefaultColor}\n storeTextColor={storeTextColor}\n amenityIconColor={amenityIconColor}\n kioskIconColor={kioskIconColor}\n onChange={onSaveAssignment}\n onClear={() => onClearAssignment?.()}\n copyAction={copyButton}\n />\n ) : copyButton ? (\n <div className=\"eyeon-map-assign__actions\">{copyButton}</div>\n ) : null}\n </div>\n );\n }\n\n return (\n <div className=\"eyeon-map-inspector\">\n {isEntranceIcon(shape) ? (\n onUpdateLabel ? (\n <EntranceIconForm\n label={shape.label}\n canEdit={canEdit}\n storeTextColor={storeTextColor}\n onChange={onUpdateLabel}\n />\n ) : null\n ) : shape.kind === 'label' ? (\n onUpdateLabel ? (\n <TextLabelForm\n label={shape.label}\n canEdit={canEdit}\n storeTextColor={storeTextColor}\n onChange={onUpdateLabel}\n />\n ) : null\n ) : (\n <>\n <label className=\"eyeon-map-rail__field\">\n ID\n <input\n className=\"eyeon-map-rail__id-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\n {inspectorShowsType(shape.kind) ? (\n <label className=\"eyeon-map-rail__field\">\n Type\n <ModernSelect\n ariaLabel=\"Type\"\n value={shape.kind}\n disabled={!canEdit}\n searchable={false}\n options={inspectorTypeKinds(shape.kind).map((k) => ({\n value: k,\n label: SHAPE_KIND_LABELS[k],\n }))}\n onChange={(next) => onChangeKind(next as ShapeKind)}\n />\n </label>\n ) : null}\n {shape.kind === 'void' ? (\n <p className=\"eyeon-map-rail__hint\">\n Open to Below looks through to the floor below — walkways and\n floor plates are cut out so the lower level shows through.\n </p>\n ) : null}\n </>\n )}\n\n {onChangeLevel && levels.length > 0 ? (\n <>\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">Floor</span>\n <div className=\"eyeon-map-assign__floor\">\n <ModernSelect\n ariaLabel=\"Floor\"\n value={String(shape.levelId)}\n disabled={!canEdit}\n searchable={false}\n options={levels.map((level) => ({\n value: String(level.id),\n label: level.name,\n }))}\n onChange={(next) => {\n if (!next) return;\n setLevelError(onChangeLevel(Number(next)));\n }}\n />\n </div>\n </div>\n {levelError ? (\n <p className=\"eyeon-map-rail__hint\" style={{ color: '#b91c1c' }}>\n {levelError}\n </p>\n ) : null}\n </>\n ) : null}\n\n {canEdit && (copyButton || onDelete) ? (\n <div className=\"eyeon-map-assign__actions\">\n {copyButton}\n {onDelete ? (\n <button\n type=\"button\"\n className=\"eyeon-map-assign__unassign\"\n onClick={() => onDelete()}\n >\n Delete\n </button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n","import React, { Suspense } from 'react';\nimport type {\n DeviceType,\n MapViewerHost,\n PublishedDocument,\n} from '../../core';\nimport { MapViewer } from '../../viewer/MapViewer';\nimport type { CameraViewSnapshot } from '../../viewer/components/CameraRig';\n\nexport function PreviewOverlay({\n document,\n host = 'PORTAL_ASSIGN',\n onSelectShape,\n selectedShapeId,\n selectedShapeIds,\n hoveredShapeId,\n focusNonce,\n activeLevelId,\n onActiveLevelChange,\n routeOnSelect,\n imageProxyUrl,\n device,\n captureCamera,\n onCameraChange,\n onCameraReset,\n}: {\n document: PublishedDocument;\n /** Assign mode and public website hide search. */\n host?: MapViewerHost;\n onSelectShape?: (shapeId: number | null, opts?: { additive?: boolean }) => void;\n selectedShapeId?: number | null;\n selectedShapeIds?: number[];\n hoveredShapeId?: number | null;\n focusNonce?: number;\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 device?: DeviceType;\n captureCamera?: boolean;\n onCameraChange?: (view: CameraViewSnapshot) => void;\n onCameraReset?: () => void;\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 selectedShapeId={selectedShapeId}\n selectedShapeIds={selectedShapeIds}\n hoveredShapeId={hoveredShapeId}\n focusNonce={focusNonce}\n activeLevelId={activeLevelId}\n onActiveLevelChange={onActiveLevelChange}\n routeOnSelect={routeOnSelect}\n imageProxyUrl={imageProxyUrl}\n device={device}\n captureCamera={captureCamera}\n onCameraChange={onCameraChange}\n onCameraReset={onCameraReset}\n />\n </Suspense>\n </div>\n );\n}\n","export type ShapeSelectOpts = { additive?: boolean };\n\n/** Plain click replaces; Shift-click toggles the id in the set. */\nexport function nextSelectedShapeIds(\n current: number[],\n id: number | null,\n opts?: ShapeSelectOpts,\n): number[] {\n if (id == null) return [];\n if (!opts?.additive) return [id];\n if (current.includes(id)) return current.filter((item) => item !== id);\n return [...current, id];\n}\n","import type {\n CmConnector,\n CmResponsiveOverride,\n MapAssignRetailer,\n PublishedDocument,\n} 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 retailers?: MapAssignRetailer[];\n responsiveOverrides?: CmResponsiveOverride[];\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 extras?.responsiveOverrides ?? draft.responsiveOverrides ?? [],\n publishedAt: extras?.publishedAt,\n retailers: extras?.retailers,\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","import type { DeviceType } from '../core';\n\nexport type RestoredEditorSection = {\n section: 'edit-map' | 'wayfinding' | 'map-responsiveness';\n levelId: number | null;\n device?: DeviceType;\n};\n\nconst memory = new Map<number, RestoredEditorSection>();\nconst MAX_REMEMBERED_MAPS = 20;\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 / Map Responsiveness 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.delete(mapId);\n memory.set(mapId, restored);\n if (memory.size > MAX_REMEMBERED_MAPS) {\n const oldest = memory.keys().next().value;\n if (oldest != null) memory.delete(oldest);\n }\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 CmShapeAssignment,\n DeviceType,\n MapAssignKiosk,\n MapAssignRetailer,\n MapEditorHost,\n PublishedDocument,\n ResponsiveCamera,\n ShapeKind,\n Vec3,\n} from '../core';\nimport type { ShapeGeometry, ShapeLabel, ShapeStyle } from '../core';\nimport { assignmentVisualPatch, applyBulkAssignPatch, DEFAULT_LABEL_ALIGN, emptyResponsiveOverrideInput, emptyShapeAssignment, geometryBBox, hasBuildingFloors, MAP_NO_FLOORS_MESSAGE, mergeResponsiveOverrides, mergeTheme, nextLowerBuildingFloor, parseShapeAssignment, poseToResponsiveFields, RESPONSIVE_DEVICE_TABS, responsiveSlotKey, viewerLevelIdAfterShapeSelect } from '../core';\nimport type { CameraViewSnapshot } from '../viewer/components/CameraRig';\nimport type { BulkAssignPatch } from '../core';\nimport { MapControls } from '../viewer/ui/MapControls';\nimport {\n editorFloorControlLevels,\n isEditorSection,\n levelIdOnEnterDefaultMap,\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 {\n applyDraftOps,\n coalesceDraftOp,\n orderBatchOpsForPersist,\n shapeKeyTakenOnLevel,\n type EditorDraftState,\n} from './draftOps';\nimport { ConnectorAssign } from './panels/ConnectorAssign';\nimport { LeftRail, type RailSection } from './panels/LeftRail';\nimport type { CreateLevelInput, UpdateLevelInput } from './panels/FloorsPanel';\nimport { CatalogKioskForm } from './panels/CatalogKioskForm';\nimport { Inspector } from './panels/Inspector';\nimport { PreviewOverlay } from './panels/PreviewOverlay';\nimport { isAssignableKind } from './railAssignments';\nimport {\n catalogKioskShapeOptions,\n isKioskScreenKind,\n shapeIdForCatalogKiosk,\n} from './railKiosks';\nimport { allocShapeKey, copyShapeToLevelOps, liveShapeKeysOnLevel } from './shapeCopy';\nimport { nextSelectedShapeIds, type ShapeSelectOpts } from './shapeSelection';\nimport { compileEditorPreview } from './previewDocument';\nimport { geometryForLabelText, DEFAULT_LABEL_SIZE } from './labelText';\nimport {\n DEFAULT_ENTRANCE_SIZE,\n canonicalizeEntranceLabel,\n geometryForEntranceIcon,\n isEntranceIcon,\n} from './entranceIcon';\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 connectRouteAnchorToRouteOps,\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 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 type ResponsiveOverrideInput = {\n levelId: number;\n device: DeviceType;\n camera: ResponsiveCamera;\n controls: Vec3;\n};\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 canResponsiveness?: boolean;\n onBatch?: (ops: BatchOp[]) => Promise<void>;\n onPublish?: () => Promise<void>;\n onSaveResponsive?: (items: ResponsiveOverrideInput[]) => Promise<void>;\n /** Reload the draft from the database after discarding local edits. */\n onDiscard?: () => Promise<void> | 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 * Center retailers for the default-map assign form (v1 retailer dropdown).\n */\n retailers?: MapAssignRetailer[];\n /** Center kiosks for leftover ID-only assignments; new kiosks are named in Assign. */\n kiosks?: MapAssignKiosk[];\n /**\n * Media proxy base for remote http(s) media, same contract as v1\n * `IMAGE_PROXY_URL`. Required whenever the outdoor SVG is served from an\n * origin that does not send CORS headers. Inlined amenity data URLs skip it.\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 /** PORTAL host: pin \"Use Classic Map\" at the bottom of the left rail. */\n onUseClassicMap?: () => void;\n}\n\nexport function MapEditor({\n host = 'PORTAL',\n draft,\n canEdit = true,\n canFloors = true,\n canSettings = true,\n canResponsiveness = false,\n onBatch,\n onPublish,\n onSaveResponsive,\n onDiscard,\n onImportSvg,\n onCreateLevel,\n onUpdateLevel,\n onDeleteLevel,\n onReorderLevels,\n onAutoroute,\n previewDocument,\n retailers = [],\n kiosks = [],\n imageProxyUrl,\n className,\n sidebarFooter,\n onUseClassicMap,\n}: MapEditorProps) {\n const restoredSection = peekEditorSection(draft.mapId);\n const [section, setSection] = useState<RailSection | null>(() => {\n if (consumeReturnToFloorsList(draft.mapId)) return 'floors';\n return restoredSection?.section ?? null;\n });\n const [responsiveDevice, setResponsiveDevice] = useState<DeviceType>(\n () => restoredSection?.device ?? 'admin_portal',\n );\n const [pendingResponsive, setPendingResponsive] = useState<\n Record<string, ResponsiveOverrideInput>\n >({});\n const [previewEpoch, setPreviewEpoch] = useState(0);\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 [selectedShapeIds, setSelectedShapeIds] = useState<number[]>([]);\n const [selectedCatalogKioskId, setSelectedCatalogKioskId] = useState<\n number | null\n >(null);\n const selectedShapeId = selectedShapeIds[0] ?? null;\n const [hoveredShapeId, setHoveredShapeId] = useState<number | null>(null);\n const [listFocusNonce, setListFocusNonce] = useState(0);\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 setPendingResponsive({});\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n }, [draft.mapId, draft.centerId]);\n\n useEffect(() => {\n if (\n section === 'edit-map' ||\n section === 'wayfinding' ||\n section === 'map-responsiveness'\n ) {\n markEditorSection(draft.mapId, {\n section,\n levelId: activeLevelId,\n device: section === 'map-responsiveness' ? responsiveDevice : undefined,\n });\n return;\n }\n clearEditorSection(draft.mapId);\n }, [activeLevelId, draft.mapId, responsiveDevice, section]);\n\n // Levels can arrive after the first render, or the active one can be deleted.\n // Default map / Wayfinding must not stay on Outdoor — that hides floors.\n useEffect(() => {\n const exists = draft.levels.some((level) => level.id === activeLevelId);\n if (!exists) {\n setActiveLevelId(\n section === 'wayfinding'\n ? levelIdOnEnterWayfinding(draft.levels)\n : isEditorSection(section)\n ? levelIdOnEnterEditMap(draft.levels)\n : levelIdOnEnterDefaultMap(draft.levels),\n );\n return;\n }\n if (section === 'edit-map') return;\n const active = draft.levels.find((level) => level.id === activeLevelId);\n if (active?.kind !== 'outdoor') return;\n const next =\n section === 'wayfinding'\n ? levelIdOnEnterWayfinding(draft.levels)\n : levelIdOnEnterDefaultMap(draft.levels);\n if (next != null && next !== activeLevelId) setActiveLevelId(next);\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 cameraDirty = Object.keys(pendingResponsive).length > 0;\n const dirty = pendingOps.current.length > 0 || needsPublish || cameraDirty;\n const canPersist =\n !saving && dirty && (canEdit || (canResponsiveness && cameraDirty));\n const isResponsiveness = section === 'map-responsiveness';\n const activeLevel = workingDraft.levels.find((l) => l.id === activeLevelId) ?? null;\n const outdoorViewOnly = wayfindingOutdoorReadOnly(section, activeLevel);\n const canDrawOnCanvas = canEdit && !outdoorViewOnly;\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 openingUnderlayShapes = useMemo(() => {\n const levelsWithShapes = workingDraft.levels.map((lvl) => ({\n ...lvl,\n shapes: workingDraft.shapes.filter((shape) => shape.levelId === lvl.id),\n }));\n const lower = nextLowerBuildingFloor(levelsWithShapes, activeLevelId);\n if (!lower) return [];\n return workingDraft.shapes.filter(\n (shape) => shape.levelId === lower.id && !shape.orphanedAt,\n );\n }, [workingDraft.levels, workingDraft.shapes, activeLevelId]);\n const mergedResponsiveOverrides = useMemo(\n () =>\n mergeResponsiveOverrides(\n workingDraft.responsiveOverrides ?? [],\n Object.values(pendingResponsive),\n ),\n [pendingResponsive, workingDraft.responsiveOverrides],\n );\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 retailers,\n responsiveOverrides: mergedResponsiveOverrides,\n }),\n [workingDraft, previewDocument, retailers, mergedResponsiveOverrides],\n );\n const levelAnchors = useMemo(\n () => workingDraft.anchors.filter((a) => a.levelId === activeLevelId),\n [activeLevelId, workingDraft.anchors],\n );\n const levelEdges = useMemo(() => {\n const anchorsById = new Map(\n workingDraft.anchors.map((anchor) => [anchor.id, anchor]),\n );\n return workingDraft.edges.filter(\n (edge) => anchorsById.get(edge.fromAnchorId)?.levelId === activeLevelId,\n );\n }, [activeLevelId, workingDraft.anchors, workingDraft.edges]);\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 setSelectedShapeIds(\n snapshot.selectedShapeId == null ? [] : [snapshot.selectedShapeId],\n );\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 (saving) return;\n const ops = canEdit ? orderBatchOpsForPersist(pendingOps.current) : [];\n const cameraItems = canResponsiveness ? Object.values(pendingResponsive) : [];\n if (!ops.length && !needsPublish && !cameraItems.length) return;\n if (!canEdit && !cameraItems.length) return;\n pendingOps.current = [];\n setEditVersion((n) => n + 1);\n setSaving(true);\n let persisted = !ops.length;\n const savedCamera = cameraItems;\n try {\n if (cameraItems.length && onSaveResponsive) {\n await onSaveResponsive(cameraItems);\n setPendingResponsive({});\n }\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 (savedCamera.length) {\n setPendingResponsive((prev) =>\n Object.keys(prev).length ? prev : Object.fromEntries(\n savedCamera.map((item) => [\n responsiveSlotKey(item.levelId, item.device),\n item,\n ]),\n ),\n );\n }\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 }, [\n canEdit,\n canResponsiveness,\n needsPublish,\n onBatch,\n onPublish,\n onSaveResponsive,\n pendingResponsive,\n saving,\n ]);\n\n const handleDiscardChanges = useCallback(async () => {\n if (saving || !dirty) return;\n if (!canEdit && !cameraDirty) return;\n if (\n !window.confirm(\n 'Discard unsaved changes and reload the map from the database?',\n )\n ) {\n return;\n }\n canvasRef.current?.consumeRouteUndo();\n pendingOps.current = [];\n nextTempId.current = -1;\n historyGestureRef.current = false;\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n setNeedsPublish(false);\n setPendingResponsive({});\n setPreviewEpoch((n) => n + 1);\n setEditVersion((n) => n + 1);\n setSaving(true);\n try {\n await onDiscard?.();\n } finally {\n setSaving(false);\n }\n }, [cameraDirty, canEdit, dirty, onDiscard, saving]);\n\n const handleSectionChange = useCallback(\n (next: RailSection | null) => {\n // Leave item-options (level 3) whenever the rail module changes so\n // Stores / Amenities / … always open on their list (level 2).\n setSelectedShapeIds([]);\n setSelectedCatalogKioskId(null);\n setSelectedAnchorIds([]);\n setHoveredShapeId(null);\n if (isEditorSection(section) && !isEditorSection(next)) {\n setTool('select');\n historyGestureRef.current = false;\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n setActiveLevelId(levelIdOnEnterDefaultMap(draft.levels));\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 } else if (next === 'map-responsiveness') {\n setActiveLevelId(levelIdOnEnterDefaultMap(draft.levels));\n }\n setSection(next);\n },\n [draft.levels, section],\n );\n\n const handleCanvasLevelChange = (levelId: number) => {\n if (levelId === activeLevelId) return;\n setSelectedShapeIds([]);\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, opts?: ShapeSelectOpts) => {\n const shape = id == null ? null : workingDraft.shapes.find((s) => s.id === id);\n const additive =\n Boolean(opts?.additive) &&\n section !== 'edit-map' &&\n section !== 'wayfinding' &&\n (shape == null || isAssignableKind(shape.kind));\n setSelectedShapeIds((prev) => nextSelectedShapeIds(prev, id, { additive }));\n if (id != null) setSelectedCatalogKioskId(null);\n setHoveredShapeId(null);\n if (id == null) return;\n if (shape && !additive) {\n const nextLevelId =\n section === 'edit-map' || section === 'wayfinding'\n ? shape.levelId\n : viewerLevelIdAfterShapeSelect(\n workingDraft.levels,\n activeLevelId,\n shape.levelId,\n );\n setActiveLevelId(nextLevelId);\n }\n if (additive) return;\n setSection((current) => {\n if (\n current === 'edit-map' ||\n current === 'wayfinding' ||\n current === 'map-responsiveness' ||\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 [\n activeLevelId,\n section,\n workingDraft.anchors,\n workingDraft.connectors,\n workingDraft.levels,\n workingDraft.shapes,\n ],\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 if (\n shapeKeyTakenOnLevel(\n workingDraft.shapes,\n selectedShape.id,\n selectedShape.levelId,\n key,\n )\n ) {\n return;\n }\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 handleChangeLevel = (levelId: number): string | null => {\n if (!selectedShape || !canEdit) return null;\n if (levelId === selectedShape.levelId) return null;\n if (\n shapeKeyTakenOnLevel(\n workingDraft.shapes,\n selectedShape.id,\n levelId,\n selectedShape.key,\n )\n ) {\n return 'That ID is already used on this floor.';\n }\n const ops: BatchOp[] = [\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n },\n },\n ];\n for (const anchor of workingDraft.anchors) {\n if (anchor.shapeId !== selectedShape.id || anchor.levelId === levelId) {\n continue;\n }\n ops.push({\n op: 'upsert_anchor',\n anchor: {\n id: anchor.id,\n levelId,\n shapeId: anchor.shapeId,\n kind: anchor.kind,\n x: anchor.x,\n y: anchor.y,\n connectorId: anchor.connectorId,\n },\n });\n }\n queueOpBatch(ops);\n setActiveLevelId(levelId);\n return null;\n };\n\n const handleCopyToLevel = (levelId: number): string | null => {\n if (!selectedShape || !canEdit) return null;\n const copied = copyShapeToLevelOps({\n shape: selectedShape,\n assignment: selectedAssignment,\n targetLevelId: levelId,\n shapes: workingDraft.shapes,\n allocId: () => nextTempId.current--,\n });\n if (!copied) return 'Pick a different floor.';\n queueOpBatch(copied.ops);\n setSelectedShapeIds([copied.shapeId]);\n setActiveLevelId(levelId);\n return null;\n };\n\n const handleDeleteShape = () => {\n if (!selectedShape || !canEdit) return;\n queueOp({ op: 'delete_shape', shapeId: selectedShape.id });\n setSelectedShapeIds([]);\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, opts?: { live?: boolean }) => {\n if (!selectedShape || !canEdit) return;\n if (isEntranceIcon(selectedShape)) {\n const nextLabel =\n canonicalizeEntranceLabel({\n ...selectedShape,\n label,\n }) ?? label;\n const size = nextLabel.size ?? selectedShape.label.size ?? DEFAULT_ENTRANCE_SIZE;\n const sameLabel =\n size === (selectedShape.label.size ?? DEFAULT_ENTRANCE_SIZE) &&\n (nextLabel.rotate ?? 0) === (selectedShape.label.rotate ?? 0) &&\n (nextLabel.color ?? '') === (selectedShape.label.color ?? '') &&\n (nextLabel.imageKey ?? '') === (selectedShape.label.imageKey ?? '');\n if (sameLabel) {\n if (!opts?.live) endHistoryGesture();\n return;\n }\n const geometry = geometryForEntranceIcon(selectedShape.geometry, size);\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n origin: selectedShape.origin,\n sourceSvgId: selectedShape.sourceSvgId,\n label: nextLabel,\n geometry,\n bbox: geometryBBox(geometry),\n },\n },\n opts?.live ? 'gesture' : 'step',\n );\n if (!opts?.live) endHistoryGesture();\n return;\n }\n const size = label.size ?? selectedShape.label.size ?? DEFAULT_LABEL_SIZE;\n const sameLabel =\n (label.text ?? '') === (selectedShape.label.text ?? '') &&\n size === (selectedShape.label.size ?? DEFAULT_LABEL_SIZE) &&\n (label.rotate ?? 0) === (selectedShape.label.rotate ?? 0) &&\n (label.color ?? '') === (selectedShape.label.color ?? '') &&\n (label.align ?? DEFAULT_LABEL_ALIGN) ===\n (selectedShape.label.align ?? DEFAULT_LABEL_ALIGN);\n if (sameLabel) {\n if (!opts?.live) endHistoryGesture();\n return;\n }\n const geometry = geometryForLabelText(\n selectedShape.geometry,\n label.text ?? selectedShape.label.text ?? '',\n size,\n );\n queueOp(\n {\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 opts?.live ? 'gesture' : 'step',\n );\n if (!opts?.live) endHistoryGesture();\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 handleSaveAssignment = (assignment: CmShapeAssignment) => {\n if (!selectedShape || !canEdit) return;\n const retailer = retailers.find((item) => item.id === assignment.retailerId);\n const visuals = assignmentVisualPatch(selectedShape, assignment, retailer);\n queueOp({ op: 'upsert_assignment', assignment });\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n style: visuals.style,\n label: visuals.label,\n },\n },\n 'none',\n );\n };\n\n const handleClearAssignment = () => {\n if (!selectedShape || !canEdit) return;\n queueOp({ op: 'delete_assignment', shapeId: selectedShape.id });\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n style: { ...selectedShape.style, fill: undefined },\n label: {\n ...selectedShape.label,\n text: undefined,\n imageKey: undefined,\n size: undefined,\n rotate: undefined,\n offsetX: undefined,\n offsetY: undefined,\n color: undefined,\n },\n },\n },\n 'none',\n );\n };\n\n const handleLinkCatalogKiosk = (kioskId: number, shapeId: number | null) => {\n if (!canEdit) return;\n const kiosk = kiosks.find((item) => item.id === kioskId);\n const previousShapeId = shapeIdForCatalogKiosk(\n kioskId,\n workingDraft.assignments,\n );\n const ops: BatchOp[] = [];\n const clearShape = (id: number) => {\n const shape = workingDraft.shapes.find((row) => row.id === id);\n if (!shape) return;\n ops.push({ op: 'delete_assignment', shapeId: id });\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 style: { ...shape.style, fill: undefined },\n label: {\n ...shape.label,\n text: undefined,\n imageKey: undefined,\n size: undefined,\n rotate: undefined,\n offsetX: undefined,\n offsetY: undefined,\n color: undefined,\n },\n },\n });\n };\n if (previousShapeId != null && previousShapeId !== shapeId) {\n clearShape(previousShapeId);\n }\n if (shapeId == null) {\n if (ops.length) queueOpBatch(ops);\n return;\n }\n const shape = workingDraft.shapes.find((row) => row.id === shapeId);\n if (!shape || !isKioskScreenKind(shape.kind)) return;\n const existing = workingDraft.assignments.find((row) => row.shapeId === shapeId);\n const base = existing\n ? parseShapeAssignment(existing, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind);\n const assignment = parseShapeAssignment(\n {\n ...base,\n targetType: 'kiosk',\n kioskId,\n customLabel: kiosk?.name?.trim() || base.customLabel,\n retailerId: null,\n amenityId: null,\n layerType: 'kiosk',\n },\n shape.kind,\n );\n const visuals = assignmentVisualPatch(shape, assignment);\n ops.push({ op: 'upsert_assignment', assignment });\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 style: visuals.style,\n label: visuals.label,\n },\n });\n queueOpBatch(ops);\n };\n\n const handleBulkAssign = (patch: BulkAssignPatch) => {\n if (!canEdit || selectedShapeIds.length < 2) return;\n const ops: BatchOp[] = [];\n for (const id of selectedShapeIds) {\n const shape = workingDraft.shapes.find((item) => item.id === id);\n if (!shape || !isAssignableKind(shape.kind)) continue;\n const existing = workingDraft.assignments.find((row) => row.shapeId === id);\n const current = existing\n ? parseShapeAssignment(existing, shape.kind)\n : emptyShapeAssignment(id, shape.kind);\n const patched = applyBulkAssignPatch(current, patch);\n const retailer = retailers.find((item) => item.id === patched.retailerId);\n const visuals = assignmentVisualPatch(shape, patched, retailer);\n ops.push({ op: 'upsert_assignment', assignment: patched });\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 style: visuals.style,\n label: visuals.label,\n },\n });\n }\n if (ops.length) queueOpBatch(ops);\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 retailers={retailers}\n kiosks={kiosks}\n levelShapeKeys={levelShapes\n .filter((s) => !selectedShapeIds.includes(s.id))\n .map((s) => s.key)}\n canEdit={canEdit}\n showAssignment={section !== 'edit-map'}\n emptyHint={\n section === 'stores' ||\n section === 'amenities' ||\n section === 'kiosks' ||\n section === 'unassigned' ||\n section === 'escalators' ||\n section === 'elevators'\n ? ''\n : undefined\n }\n selectedShapes={workingDraft.shapes.filter((s) =>\n selectedShapeIds.includes(s.id),\n )}\n selectedAssignments={workingDraft.assignments.filter((row) =>\n selectedShapeIds.includes(row.shapeId),\n )}\n onRename={handleRenameShape}\n onChangeKind={handleChangeKind}\n onChangeLevel={section === 'edit-map' ? handleChangeLevel : undefined}\n onCopyToLevel={handleCopyToLevel}\n levels={editorFloorControlLevels('edit-map', workingDraft.levels)}\n onDelete={handleDeleteShape}\n onClearAssignment={handleClearAssignment}\n onUpdateLabel={handleUpdateLabel}\n onSaveAssignment={handleSaveAssignment}\n onBulkAssign={handleBulkAssign}\n storeDefaultColor={theme.STORE_DEFAULT_COLOR}\n storeTextColor={theme.STORE_TEXT_COLOR}\n amenityIconColor={theme.AMENITY_ICON_COLOR}\n kioskIconColor={theme.KIOSK_ICON_COLOR}\n />\n {section !== 'edit-map' && selectedShape && connectorRailKind ? (\n <ConnectorAssign\n shape={selectedShape}\n railKind={connectorRailKind}\n canEdit={canEdit}\n assignment={selectedAssignment}\n storeDefaultColor={theme.STORE_DEFAULT_COLOR}\n storeTextColor={theme.CONNECTOR_ICON_COLOR}\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 onSaveAssignment={handleSaveAssignment}\n />\n ) : null}\n </>\n );\n\n const selectedCatalogKiosk =\n selectedCatalogKioskId != null\n ? kiosks.find((item) => item.id === selectedCatalogKioskId) ?? null\n : null;\n const catalogKioskPanel = selectedCatalogKiosk ? (\n <CatalogKioskForm\n kiosk={selectedCatalogKiosk}\n shapeOptions={catalogKioskShapeOptions(workingDraft.shapes)}\n assignedShapeId={shapeIdForCatalogKiosk(\n selectedCatalogKiosk.id,\n workingDraft.assignments,\n )}\n canEdit={canEdit}\n onAssign={(shapeId) =>\n handleLinkCatalogKiosk(selectedCatalogKiosk.id, shapeId)\n }\n />\n ) : null;\n\n const handleCameraChange = useCallback(\n (view: CameraViewSnapshot) => {\n if (section !== 'map-responsiveness' || activeLevelId == null) return;\n const fields = poseToResponsiveFields({\n zoom: view.zoom,\n position: view.position,\n target: view.target,\n });\n setPendingResponsive((prev) => ({\n ...prev,\n [responsiveSlotKey(activeLevelId, responsiveDevice)]: {\n levelId: activeLevelId,\n device: responsiveDevice,\n camera: fields.camera,\n controls: fields.controls,\n },\n }));\n },\n [activeLevelId, responsiveDevice, section],\n );\n\n const handleCameraReset = useCallback(() => {\n if (activeLevelId == null) return;\n setPendingResponsive((prev) => ({\n ...prev,\n [responsiveSlotKey(activeLevelId, responsiveDevice)]:\n emptyResponsiveOverrideInput(activeLevelId, responsiveDevice),\n }));\n }, [activeLevelId, responsiveDevice]);\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 selectedShapeIds={selectedShapeIds}\n onSelectShape={handleSelectShape}\n onHoverShape={setHoveredShapeId}\n onListFocus={() => setListFocusNonce((n) => n + 1)}\n retailers={retailers}\n kiosks={kiosks}\n selectedCatalogKioskId={selectedCatalogKioskId}\n onSelectCatalogKiosk={setSelectedCatalogKioskId}\n canFloors={canFloors}\n canSettings={canSettings}\n canResponsiveness={canResponsiveness}\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 catalogKioskPanel={catalogKioskPanel}\n onUseClassicMap={host === 'PORTAL' ? onUseClassicMap : undefined}\n assignPanel={assignPanel}\n editMapPanel={\n <>\n {toolHint(tool, 'map') ? (\n <p className=\"eyeon-map-rail__hint\">{toolHint(tool, 'map')}</p>\n ) : null}\n {assignPanel}\n </>\n }\n wayfindingPanel={\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 ) : toolHint(tool, 'route') ? (\n <p className=\"eyeon-map-rail__hint\">{toolHint(tool, 'route')}</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 mapResponsivenessPanel={\n <p className=\"eyeon-map-rail__hint\">\n Pan and zoom the map for each floor and device. Reset fits the\n whole floor so you can start from the default view. Save Changes\n stores that starting view for Admin Portal, website, and kiosk.\n </p>\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 {isResponsiveness ? (\n <div className=\"eyeon-map-editor__device-tabs\" role=\"tablist\" aria-label=\"Device\">\n {RESPONSIVE_DEVICE_TABS.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={responsiveDevice === tab.id}\n className={\n responsiveDevice === tab.id\n ? 'eyeon-map-editor__device-tab is-active'\n : 'eyeon-map-editor__device-tab'\n }\n onClick={() => setResponsiveDevice(tab.id)}\n >\n {tab.label}\n </button>\n ))}\n </div>\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__discard\"\n aria-label=\"Discard Changes\"\n onClick={() => void handleDiscardChanges()}\n disabled={!canPersist}\n >\n Discard Changes\n </button>\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={!canPersist}\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 key={previewEpoch}\n document={compiledPreview}\n host={isResponsiveness ? 'WEBSITE' : 'PORTAL_ASSIGN'}\n selectedShapeId={isResponsiveness ? null : selectedShapeId}\n selectedShapeIds={isResponsiveness ? [] : selectedShapeIds}\n hoveredShapeId={isResponsiveness ? null : hoveredShapeId}\n focusNonce={isResponsiveness ? undefined : listFocusNonce}\n onSelectShape={isResponsiveness ? undefined : handleSelectShape}\n activeLevelId={activeLevelId}\n onActiveLevelChange={setActiveLevelId}\n routeOnSelect={false}\n imageProxyUrl={imageProxyUrl}\n device={isResponsiveness ? responsiveDevice : undefined}\n captureCamera={isResponsiveness}\n onCameraChange={isResponsiveness ? handleCameraChange : undefined}\n onCameraReset={isResponsiveness ? handleCameraReset : undefined}\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={outdoorShapes.filter((s) => !s.orphanedAt)}\n openingUnderlayShapes={openingUnderlayShapes}\n anchors={levelAnchors}\n edges={levelEdges}\n assignments={workingDraft.assignments}\n retailers={retailers}\n amenities={workingDraft.amenities}\n theme={theme}\n tool={tool}\n selectedShapeId={selectedShapeId}\n selectedAnchorIds={selectedAnchorIds}\n baseSvgUrl={workingDraft.baseSvgUrl ?? null}\n baseViewbox={outdoorLevel?.sourceViewbox ?? null}\n outdoorSvgUrl={\n outdoorLevel?.sourceSvgUrl ?? workingDraft.baseSvgUrl ?? null\n }\n imageProxyUrl={imageProxyUrl}\n emptyMessage={\n hasBuildingFloors(workingDraft.levels) || outdoorLevel\n ? undefined\n : MAP_NO_FLOORS_MESSAGE\n }\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 onConnectRouteAnchorToRoute={(anchorId, drop, maxDist) => {\n if (!canDrawOnCanvas) return;\n const anchor = levelAnchors.find((item) => item.id === anchorId);\n if (!anchor) return;\n const ops = connectRouteAnchorToRouteOps({\n anchor,\n anchors: levelAnchors,\n edges: levelEdges,\n mapId: workingDraft.mapId,\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 key = allocShapeKey(\n kind,\n liveShapeKeysOnLevel(workingDraft.shapes, activeLevel.id),\n );\n const id = queueOp({\n op: 'upsert_shape',\n shape: {\n levelId: activeLevel.id,\n key,\n kind,\n geometry,\n bbox: geometryBBox(geometry),\n origin: 'manual',\n sourceSvgId: null,\n geometryLocked: true,\n label:\n kind === 'entrance'\n ? canonicalizeEntranceLabel({\n kind,\n origin: 'manual',\n sourceSvgId: null,\n label: extras?.label,\n }) ?? extras?.label\n : 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 const takenKeys = new Set(\n liveShapeKeysOnLevel(workingDraft.shapes, activeLevel.id),\n );\n edits.forEach((edit) => {\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 const key = allocShapeKey(edit.kind, takenKeys);\n takenKeys.add(key);\n ops.push({\n op: 'upsert_shape',\n shape: {\n levelId: activeLevel.id,\n key,\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';\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","wayfindingSelectableLevels","levels","floorSwitcherLevels","editMapSelectableLevels","outdoor","level","defaultEditorFloorId","_a","levelIdOnEnterWayfinding","levelIdOnEnterEditMap","levelIdOnEnterDefaultMap","defaultViewerLevelId","editorFloorControlLevels","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","DrawCircleIcon","DrawOpeningIcon","jsxs","DrawOpeningCircleIcon","CurveIcon","SplitJoinIcon","DrawTextIcon","DrawEntranceIcon","DrawRouteIcon","CreateRouteIcon","CreateRouteMultiIcon","UndoIcon","RedoIcon","TOOL_ICONS","canSelectShapes","isSplitJoinTool","isPolygonDrawTool","isEllipseDrawTool","isShapeDrawTool","isStampDrawTool","canJoinOpenEnds","showsShapeAnchors","showsCurveHandles","emptyCanvasDragPans","nextEditorTool","next","toolHint","group","EditorToolButtons","onToolChange","canEdit","mapTools","t","routeTools","showMap","showRoute","selectTool","routeToolbar","renderButton","Icon","React","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","d","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","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","ellipseBoundsFromDrag","lockCircle","sx","sy","ellipsePathD","bounds","ellipseGeometry","DEFAULT_LABEL_TEXT","DEFAULT_LABEL_SIZE","LABEL_FONT_FAMILY","MAP_FONT_FAMILY","LABEL_LINE_HEIGHT","MAP_LABEL_LINE_HEIGHT","FALLBACK_CHAR_ADVANCE","isTextLabel","defaultLabelSize","_viewbox","labelTextLines","text","measureCtx","textMeasureContext","measureLabelText","size","lines","ctx","width","line","max","labelBoxCenter","box","textLabelPolygon","origin","height","textLabelGeometry","defaultTextLabel","color","geometryForLabelText","geometryBBox","isStampShape","isEntranceIcon","defaultEntranceLabel","ENTRANCE_ICON_ID","clampEntranceSize","entranceIconPolygon","center","entranceIconGeometry","geometryForEntranceIcon","clientToUser","ctm","clientX","clientY","det","clientRectToViewBox","rect","viewBox","vbW","vbH","originX","originY","pxPerUserFromViewBox","readSvgViewBox","svg","vb","attr","parts","clientToSvgUser","pxPerUserFromSvg","pxPerUserFromCtm","userToWorld","user","pan","zoom","z","EDITOR_MIN_ZOOM","EDITOR_MAX_ZOOM","clampEditorZoom","nextEditorZoomFromWheel","currentZoom","event","nextZoomFromWheel","screenPxToWorld","px","pxPerUser","editorHandleScale","sizeZoom","liveZoom","panAfterZoom","nextZoom","world","panKeepingWorldAtUser","EDITOR_ZOOM_ANIM_MS","easeOutCubic","lerp","interpolateView","editorShapeFillOpacity","editorShapeFill","theme","assignment","WALKING_PATH_COLOR","published","resolvedShapeFill","isTransparentPadKind","isTransparentColor","staffPadPlaceholderFill","isHoverHighlightShape","INTERACTIVE_SHAPE_KINDS","editorSelectCursor","args","editorHoverFillOpacity","base","hovered","liveDisplayRetailer","retailer","wayfindingAssignedOverlay","amenities","displayRetailer","label","publishedShapeLabel","assignmentOverlayVisible","fontSize","DEFAULT_ASSIGNMENT_SIZE","imageUrl","assignmentOverlayImageUrl","iconId","assignmentSpecialIconId","assignmentOverlayRenderSize","resolvedAssignmentIconColor","normalizeLabelAlign","wayfindingAssignedOverlays","input","retailerById","assignmentByShapeId","row","overlays","overlay","wayfindingOverlayHref","imageProxyUrl","resolveFetchUrl","getMapSpecialSvg","mapSpecialSvgToDataUrl","AssignedShapeOverlay","rotate","align","href","transform","AssignedOverlayText","lineHeight","blockHeight","labelSvgTextAnchor","index","OutdoorSvgUnderlay","url","suppressIds","svgText","setSvgText","useState","suppressKey","useMemo","useEffect","cancelled","controller","fetchUrl","res","err","paths","blocked","outdoorDecorationFromSvg","isUnderlayHintShape","isUnderlayDrawnShape","underlaySwitchHint","WAYFINDING_SNAP_PX","WAYFINDING_ANCHOR_HIT_PX","showsWayfinding","routeMode","routeSessionUndoKind","session","beginOrContinueRouteDraft","draft","routeRubberBand","isWayfindingShape","wayfindingLinksShapes","anchorKindForShape","routeAnchorKindForShape","shapeRoutePoint","routeComponentAnchorIds","anchorId","ids","pending","walkEdgeExists","isSnappableRouteEdge","storeLinkOriginIds","preview","anchor","nearestRouteSnap","excludeIds","maxDist","anchorById","bestJunction","bestEdge","walkEdge","mapId","fromAnchorId","toAnchorId","ensureShapeRouteAnchorOps","allocId","existing","unit","connectShapeToRouteOps","ops","snap","junctionId","nextEdges","source","linkKind","connectRouteAnchorToRouteOps","incident","otherId","link","linkRouteAnchorsOp","insertJunctionOnWalkEdgeOps","levelId","deleteRouteAnchorOps","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","HANDLE_LINE_PX","HANDLE_LINE_HALO_PX","BEND_R_PX","EDGE_DRAG_PX","SPLIT_JOIN_GAP_PX","SNAP_HIT_PX","rectPolygon","dragSize","screenStrokeStyle","HandleDot","hitR","fill","stroke","strokeWidth","cursor","fillOpacity","strokeDasharray","onPointerDown","onPointerEnter","onPointerLeave","onDoubleClick","polygonsToPath","isEditableShape","interactiveOnly","EditorCanvas","assignments","retailers","selectedShapeId","selectedAnchorIds","baseSvgUrl","baseViewbox","outdoorSvgUrl","levelSvgUrl","underlayShapes","openingUnderlayShapes","showGrid","readOnly","emptyMessage","onSelectShape","onSelectAnchors","onCreateRoutePoint","onCreateRouteSegment","onLinkRouteAnchors","onInsertRouteJunction","onDeleteRouteAnchor","onConnectShapeToRoute","onConnectRouteAnchorToRoute","onEnsureShapeAnchor","onMoveAnchor","onCreateShape","onUpdateShapeGeometry","onBatchShapeEdits","onHistoryGestureEnd","onRouteDraftActiveChange","ref","ensureMapFont","wayfindingOn","svgRef","useRef","viewGroupRef","canvasRef","setPan","setZoom","viewRef","sizeZoomRef","wheelFrameRef","wheelSettleRef","routeHoverFrameRef","routeHoverClientRef","setPxPerUser","pointersRef","pinchRef","drawing","setDrawing","drawLockCircle","setDrawLockCircle","polygonPoints","setPolygonPoints","dragAnchor","setDragAnchor","dragAnchorPoint","setDragAnchorPoint","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","routePointerSnap","setRoutePointerSnap","routeHover","underlayTip","setUnderlayTip","panStart","isPanning","setIsPanning","worldPx","syncViewDom","nextPan","g","applyView","cancelWheelWork","paintView","settleWheelView","scheduleWheelPaint","zoomAnimRef","cancelZoomAnim","animateViewTo","targetPan","targetZoom","now","zoomAroundCenter","currentPan","useImperativeHandle","renderedZoom","useLayoutEffect","viewbox","unionViewBox","svgUnderlayUrl","svgSuppressIds","svgIdsOwnedByShapes","measure","ro","editableShapes","openingShapes","openingClipId","openingHatchId","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","connectedAnchorIds","routeAnchorDegreeById","degree","dragRouteExcludeIds","dragRouteSnap","displayAnchorById","dragged","routeEdgePath","assignedOverlays","cancelRouteHoverFrame","scheduleRouteHover","client","closePolygon","onShift","onKey","node","onWheel","beginPinch","onCanvasPointerDownCapture","onCanvasPointerMoveCapture","onCanvasPointerUpCapture","wasPinching","beginPan","fromEmptySelect","insertHoveredRoutePoint","edgeId","created","removeWayfindingAnchor","placed","storeExclude","DEFAULT_ENTRANCE_SIZE","handleHit","_d","_c","midHit","_f","_e","handleTol","_h","_g","onPointerMove","screenMove","snapTol","finishRect","finishEllipse","onPointerUp","endedPan","moved","pathDFromGeometry","shapePathD","stubExcludeIds","stubSnap","lastRoutePoint","routeRubberSnap","highlightedRouteEdgeId","highlightedRouteEdge","highlightedRouteFrom","highlightedRouteTo","routePlusAt","rubberFrom","rubberTo","rubberBand","polygonFollow","polygonClose","hintable","highlightable","selected","dragging","textLabel","entranceIcon","stamp","beginShapePointerDown","worldAt","hoverHandlers","iconUrl","entranceIconDataUrl","textX","labelAlignX","baseOpacity","opening","ri","items","ei","strokeD","clickRing","plus","h1","h2","vi","shapeNode","connected","displayAnchor","dragConnect","nearWeld","visR","snapped","hideOnAnchor","Fragment","FAMILY_PREFIXES","normalizeId","value","parseConnectorSourceId","raw","family","direction","role","groupParts","part","guessConnectorKind","connectorIdForShape","shapeId","connectorForShape","connectors","resolvedConnectorKind","railConnectorShapes","landingAnchor","shapeLandingPoint","geometryCentroid","inferTravelDirection","fromLevelIndex","toLevelIndex","hint","defaultConnectorName","parsed","nearestWalkAnchor","bestDist","memberShapeIds","connectorId","partnerShapesForConnector","connector","levelsWithLandings","landings","escalatorDirectedEnds","memberAnchors","memberIds","ride","fromAnchor","toAnchor","floorName","landingRideId","groupEscalatorRides","rides","directed","members","escalatorRideLandingLines","connectorRideLabel","partners","order","ai","bi","connectorEdgesBetween","anchorIds","ensureLanding","linkLandingToWalk","landing","applyUnlinkLocal","unlinkConnectorOps","buildUnlinkConnectorOps","buildEscalatorLinkOps","fromShape","toShape","options","fromLevel","l","toLevel","name","existingFrom","existingTo","v","buildElevatorShaftOps","memberShapes","existingIds","keepId","suggestEscalatorPairs","groups","list","suggestions","fromName","toName","dir","geometryBbox","points","bboxOf","shapeKeyTakenOnLevel","upsertById","rows","copy","applyDraftOp","mergeEntranceAwareLabel","parseShapeAssignment","rest","removed","omitLevelFromDraft","removedShapeIds","removedAnchorIds","liveConnectorIds","applyDraftOps","seeded","healDraftGeometry","normalizeGeometrySpace","canonicalizeEntranceLabel","geometryChanged","labelChanged","coalesceDraftOp","acc","BATCH_PERSIST_RANK","orderBatchOpsForPersist","rank","FieldResetIcon","FieldResetButton","onClick","normalizeHexColor","match","hex","ch","hexColorInputValue","sameHexColor","StepperRow","onChange","onStep","onHoldStart","onHoldEnd","setDraft","focused","syncDraft","commitDraft","persistIncomplete","commitAssignNumberDraft","assignNumberFromDraft","ColorSwatch","swatch","fallback","emptyIsTransparent","onHexChange","onCommit","onPick","lastSolid","transparent","solid","pickerValue","ColorRow","onReset","display","TRANSPARENT_COLOR","setHex","commit","normalized","ALIGN_TOOLTIPS","AlignLeftIcon","AlignCenterIcon","AlignRightIcon","ALIGN_ICONS","AlignRow","LABEL_ALIGNS","option","RotateIcon","nextQuarterTurn","remainder","stepWholeNumber","AssignmentStyleFields","form","storeDefaultColor","storeTextColor","textColorLabel","showTextColor","onPatch","formRef","intervals","bump","startHold","stopHold","offsetX","offsetY","bgColor","textColor","connectorStyleAssignment","emptyShapeAssignment","ConnectorAssign","railKind","onApplyOps","onSaveAssignment","partner","levelName","exitFloorId","setExitFloorId","targetId","setTargetId","stopFloorId","setStopFloorId","styleForm","setStyleForm","styleFormRef","patchStyle","useCallback","partial","exitFloors","landingsOnExitFloor","addable","addFloors","landingsOnStopFloor","applyEscalator","applyElevator","nextMembers","pickExitLanding","nextId","pickElevatorStop","landingOptions","linked","connectorSpecialIconDataUrl","ModernSelect","nextFloor","assignmentPadFillFallback","SHAPE_KIND_LABELS","EDITOR_TYPE_KINDS","TOOL_ONLY_KINDS","inspectorShowsType","inspectorTypeKinds","shapeKindLabel","ASSIGNABLE_SHAPE_KINDS","isAssignableKind","isStoreShapeKind","isRetailerAssigned","isAmenityAssigned","isKioskAssigned","isPolygonAssigned","assignmentHasTarget","railAssignmentGroups","byShape","stores","kiosks","unassignedStores","unassignedAmenities","unassignedKiosks","unassigned","isKioskScreenKind","kioskScreenShapes","catalogKioskShapeOptions","shapeIdForCatalogKiosk","kioskId","leftoverCatalogKiosks","used","kiosk","catalogKioskRowLabel","assignedKey","railRowLabels","tags","RAIL_ITEM_SECTIONS","isRailItemSection","railShowsItemOptions","selectedCount","railListLevelOrder","floorsLowToHigh","compareBuildingFloors","sortShapesByRailLevel","indexById","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","setName","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","committedIds","displayFloors","byId","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","BackIcon","ChevronIcon","NAV_ICON_PROPS","FloorsNavIcon","StoresNavIcon","AmenitiesNavIcon","KiosksNavIcon","EscalatorsNavIcon","ElevatorsNavIcon","SettingsNavIcon","UnassignedNavIcon","EditMapNavIcon","WayfindingNavIcon","MapResponsivenessNavIcon","RAIL_NAV","HIDDEN_SECTION_TITLES","isRailNavSeparator","entry","railSectionTitle","HOUSE_OUTDOOR_THEME","staticLayerThemeDefaults","HOUSE_ICON_THEME","staticIconThemeDefaults","OUTDOOR_COLOR_FIELDS","ICON_COLOR_FIELDS","SettingsField","children","ColorField","LeftRail","onSectionChange","activeLevelId","selectedShapeIds","onHoverShape","onListFocus","canSettings","canResponsiveness","onAutoroute","onThemeChange","assignPanel","catalogKioskPanel","selectedCatalogKioskId","onSelectCatalogKiosk","editMapPanel","wayfindingPanel","mapResponsivenessPanel","footer","onUseClassicMap","floorsScreen","setFloorsScreen","assigned","storeShapes","amenityShapes","kioskShapes","unassignedStoreShapes","unassignedAmenityShapes","unassignedKioskShapes","unassignedShapes","escalatorShapes","elevatorShapes","unlinkedEscalators","escalatorRides","linkedElevators","unlinkedElevators","assignmentById","counts","duplicate","retailerOptionLabel","amenityById","kioskById","assignedNameFor","catalogName","fromType","getAmenityByType","amenityAssignedName","kioskAssignedName","activeLevel","pathCount","selectedIds","isShapeSelected","selectedCatalogKiosk","showingCatalogKiosk","showingItemOptions","itemOptionsTitle","linkedId","selectShapeFromList","leftoverKiosks","renderShapeList","empty","opts","renderEscalatorRideList","active","renderAssignedUnassigned","assignedList","unassignedList","kindLabelFor","connectorIcon","house","DEFAULT_THEME","customized","clampStoreRadius","CatalogKioskForm","shapeOptions","assignedShapeId","onAssign","hasShape","SHAPE_KEY_PREFIX","SHAPE_KEY_ALPHABET","SHAPE_KEY_SUFFIX_LENGTH","shapeKeyPrefix","randomShapeKeySuffix","length","bytes","liveShapeKeysOnLevel","copyDestinationLevels","currentLevelId","allocShapeKey","taken","suffix","prefix","cloneShapeGeometry","path","copyShapeToLevelOps","targetLevelId","RETAIL_LAYER_TYPES","AssignForm","amenityIconColor","kioskIconColor","onClear","copyAction","setForm","patch","nameCounts","retailerOptions","amenityOptions","amenityAssignOptions","selectedAmenityType","amenityTypeFromCatalogId","kioskCatalogName","textColorFallback","assignmentIconThemeFallback","hasAssignment","retailerId","layerType","DEFAULT_LABEL_ALIGN","amenityId","amenityCatalogIdForType","KioskNameField","trimmed","BulkAssignForm","common","bulkAssignFormState","assignableShapes","iconOnly","uniqueKinds","bgColorFallback","BulkSizeRow","BulkColorRow","emitIfComplete","mixed","Chevron","CopyToLevelButton","destinations","onCopyToLevel","listId","useId","buttonRef","menuRef","setOpen","menuPos","setMenuPos","close","updateMenuPos","spaceBelow","spaceAbove","maxHeight","openAbove","destinationKey","onDoc","menu","nextError","MIN_ICON_SIZE","EntranceIconForm","setSize","setRotate","sizeRef","rotateRef","nextSize","nextRotate","MIN_FONT_SIZE","TextLabelForm","setText","textFocused","nextText","Inspector","levelShapeKeys","showAssignment","emptyHint","onRename","onChangeKind","onChangeLevel","onDelete","onClearAssignment","onUpdateLabel","selectedShapes","selectedAssignments","onBulkAssign","setKey","keyError","setKeyError","levelError","setLevelError","commitRename","copyDestinations","copyButton","PreviewOverlay","document","focusNonce","onActiveLevelChange","routeOnSelect","device","captureCamera","onCameraChange","onCameraReset","Suspense","MapViewer","nextSelectedShapeIds","compileEditorPreview","compileDocument","memory","MAX_REMEMBERED_MAPS","storageKey","dropLegacyStorage","markEditorSection","oldest","peekEditorSection","clearEditorSection","storage","markReturnToFloorsList","consumeReturnToFloorsList","stored","clearReturnToFloorsList","MapEditor","onBatch","onPublish","onSaveResponsive","onDiscard","onImportSvg","previewDocument","className","sidebarFooter","restoredSection","setSection","responsiveDevice","setResponsiveDevice","pendingResponsive","setPendingResponsive","previewEpoch","setPreviewEpoch","setActiveLevelId","restoredLevel","setSelectedShapeIds","setSelectedCatalogKioskId","listFocusNonce","setListFocusNonce","setSelectedAnchorIds","setTool","editVersion","setEditVersion","needsPublish","setNeedsPublish","saving","setSaving","setHistory","routeDraftActive","setRouteDraftActive","historyRef","pendingOps","nextTempId","historyGestureRef","showMapOptions","centerSurface","isEditMap","historyMetaRef","workingDraft","mergeTheme","cameraDirty","dirty","canPersist","isResponsiveness","outdoorViewOnly","canDrawOnCanvas","outdoorLevel","outdoorShapes","levelShapes","levelsWithShapes","lvl","lower","nextLowerBuildingFloor","mergedResponsiveOverrides","mergeResponsiveOverrides","compiledPreview","levelAnchors","levelEdges","anchorsById","selectedAssignment","takeSnapshot","applySnapshot","recordHistoryStep","mode","queueOp","historyMode","endHistoryGesture","undo","redo","handleSaveChanges","cameraItems","persisted","savedCamera","responsiveSlotKey","handleDiscardChanges","handleSectionChange","handleCanvasLevelChange","nextLevel","handleSelectShape","additive","nextLevelId","viewerLevelIdAfterShapeSelect","connectorKind","handleToolChange","resolved","handleRenameShape","handleChangeLevel","queueOpBatch","handleCopyToLevel","copied","handleDeleteShape","handleUpdateShapeGeometry","handleUpdateLabel","nextLabel","handleChangeKind","handleSaveAssignment","visuals","assignmentVisualPatch","handleClearAssignment","handleLinkCatalogKiosk","previousShapeId","clearShape","handleBulkAssign","patched","applyBulkAssignPatch","selectedConnectorKind","connectorRailKind","handleCameraChange","view","fields","poseToResponsiveFields","handleCameraReset","emptyResponsiveOverrideInput","toolGroup","RESPONSIVE_DEVICE_TABS","tab","hasBuildingFloors","MAP_NO_FLOORS_MESSAGE","id1","id2","prevAnchorId","deletedSelected","takenKeys","edit","style","MapControls","bucketLabel","change","ImportReviewPanel","diff","viewBoxChanged","blockedMessage","onApply","onCancel","remap","setRemap","buckets","added","orphaned","locked","toSourceSvgId"],"mappings":"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"}
|