@eyeon/map 2.0.4 → 2.0.6

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.
@@ -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 = lastCtrl ? 2 * x - lastCtrl.x : x;\n const qy = lastCtrl ? 2 * y - lastCtrl.y : y;\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n const { c1, c2 } = quadraticToCubic({ x, y }, { x: qx, y: qy }, { x: nx, y: ny });\n if (pushAnchor({ x: nx, y: ny })) {\n edges.push({ kind: 'cubic', c1, c2 });\n }\n lastCtrl = { x: qx, y: qy };\n x = nx;\n y = ny;\n break;\n }\n case 'A':\n case 'a': {\n const isRel = cmd === 'a';\n const rx = readNum();\n const ry = readNum();\n const rot = readNum();\n const largeArc = readNum() !== 0;\n const sweep = readNum() !== 0;\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n const cubics = ellipticalArcToCubics(\n { x, y },\n rx,\n ry,\n rot,\n largeArc,\n sweep,\n { x: nx, y: ny },\n );\n if (cubics.length === 0) {\n if (pushAnchor({ x: nx, y: ny })) edges.push({ kind: 'line' });\n } else {\n for (const cubic of cubics) {\n if (pushAnchor(cubic.to)) {\n edges.push({ kind: 'cubic', c1: cubic.c1, c2: cubic.c2 });\n }\n }\n }\n lastCtrl = null;\n x = nx;\n y = ny;\n break;\n }\n case 'Z':\n case 'z': {\n if (!vecEq({ x, y }, { x: startX, y: startY })) {\n edges.push({ kind: 'line' });\n }\n x = startX;\n y = startY;\n flush(true);\n lastCtrl = null;\n break;\n }\n default:\n i++;\n break;\n }\n }\n\n if (started) flush(false);\n return rings;\n}\n\nexport function ringToPathD(ring: PathRing): string {\n if (ring.anchors.length === 0) return '';\n const a0 = ring.anchors[0];\n let d = `M ${fmtCoord(a0.x)} ${fmtCoord(a0.y)}`;\n const n = edgeCount(ring);\n for (let i = 0; i < n; i++) {\n const to = edgeTo(ring, i);\n const edge = ring.edges[i];\n const closingLine =\n ring.closed && i === n - 1 && (!edge || edge.kind === 'line');\n if (closingLine) continue;\n if (!edge || edge.kind === 'line') {\n d += ` L ${fmtCoord(to.x)} ${fmtCoord(to.y)}`;\n } else {\n d += ` C ${fmtCoord(edge.c1.x)} ${fmtCoord(edge.c1.y)} ${fmtCoord(edge.c2.x)} ${fmtCoord(edge.c2.y)} ${fmtCoord(to.x)} ${fmtCoord(to.y)}`;\n }\n }\n if (ring.closed) d += ' Z';\n return d;\n}\n\nexport function ringsToGeometry(rings: PathRing[]): ShapeGeometry {\n const ds = rings\n .filter((ring) => ring.anchors.length >= 2)\n .map(ringToPathD)\n .filter(Boolean);\n if (ds.length === 0) {\n return { paths: [], polygons: [] };\n }\n const geometry = buildGeometryFromPaths(ds);\n return {\n ...geometry,\n polygons: geometry.polygons.map((poly) =>\n poly.length > 1 && vecEq(poly[0], poly[poly.length - 1])\n ? poly.slice(0, -1)\n : poly,\n ),\n };\n}\n\nconst ARCH_CORNER_RAD = (28 * Math.PI) / 180;\nconst MIN_ARCH_POINTS = 4;\nconst MIN_ARCH_BULGE = 3;\nconst MIN_ARCH_BULGE_RATIO = 0.035;\n/** Wider than a semicircle (0.5) is a loop, not a storefront arch. */\nconst MAX_ARCH_BULGE_RATIO = 0.65;\n\nfunction signedTurn(prev: Vec2, cur: Vec2, next: Vec2): number {\n const ax = cur.x - prev.x;\n const ay = cur.y - prev.y;\n const bx = next.x - cur.x;\n const by = next.y - cur.y;\n return Math.atan2(ax * by - ay * bx, ax * bx + ay * by);\n}\n\nfunction runLooksLikeArch(pts: Vec2[]): boolean {\n if (pts.length < MIN_ARCH_POINTS) return false;\n const a = pts[0];\n const b = pts[pts.length - 1];\n const chord = distance(a, b);\n if (chord < EPS) return false;\n let maxDev = 0;\n let side = 0;\n for (let i = 1; i < pts.length - 1; i++) {\n const proj = projectOntoSegment(pts[i], a, b);\n maxDev = Math.max(maxDev, proj.distance);\n const s = Math.sign(\n (b.x - a.x) * (pts[i].y - a.y) - (b.y - a.y) * (pts[i].x - a.x),\n );\n if (s === 0) continue;\n if (side === 0) side = s;\n else if (s !== side) return false;\n }\n if (maxDev < Math.max(MIN_ARCH_BULGE, chord * MIN_ARCH_BULGE_RATIO)) {\n return false;\n }\n if (maxDev > chord * MAX_ARCH_BULGE_RATIO) {\n return false;\n }\n for (let i = 1; i < pts.length - 1; i++) {\n if (Math.abs(signedTurn(pts[i - 1], pts[i], pts[i + 1])) > ARCH_CORNER_RAD) {\n return false;\n }\n }\n return true;\n}\n\nfunction fitCubicThroughRun(pts: Vec2[]): PathEdge {\n const from = pts[0];\n const to = pts[pts.length - 1];\n let pull = pts[Math.floor(pts.length / 2)];\n let maxDev = 0;\n for (let i = 1; i < pts.length - 1; i++) {\n const d = projectOntoSegment(pts[i], from, to).distance;\n if (d > maxDev) {\n maxDev = d;\n pull = pts[i];\n }\n }\n const { c1, c2 } = cubicHandlesForPull(from, to, pull);\n return { kind: 'cubic', c1, c2 };\n}\n\n/**\n * Designer SVGs often flatten an arch into many short lines. Collapse those\n * runs to one cubic (2 anchors + 2 handles) when the bulge is unambiguous.\n */\nfunction cubicDeviationFromChord(from: Vec2, c1: Vec2, c2: Vec2, to: Vec2): number {\n const samples = approximateCubic(from, c1, c2, to, 16);\n let maxDev = 0;\n for (const point of samples) {\n maxDev = Math.max(maxDev, projectOntoSegment(point, from, to).distance);\n }\n return maxDev;\n}\n\n/** A cubic whose bulge is much longer than its chord is a leftover loop, not an arch. */\nexport function cubicIsRunaway(from: Vec2, c1: Vec2, c2: Vec2, to: Vec2): boolean {\n const chord = distance(from, to);\n const dev = cubicDeviationFromChord(from, c1, c2, to);\n if (chord < EPS) return dev > EPS;\n return dev > chord * MAX_ARCH_BULGE_RATIO;\n}\n\nfunction flattenRunawayCubics(ring: PathRing): PathRing {\n const n = edgeCount(ring);\n let changed = false;\n const edges = ring.edges.map((edge, i) => {\n if (i >= n || edge.kind !== 'cubic') return edge;\n if (!cubicIsRunaway(edgeFrom(ring, i), edge.c1, edge.c2, edgeTo(ring, i))) {\n return edge;\n }\n changed = true;\n return { kind: 'line' as const };\n });\n return changed ? { ...ring, edges } : ring;\n}\n\nexport function collapseLineRunsToCubics(ring: PathRing): PathRing {\n const n = ring.anchors.length;\n if (n < MIN_ARCH_POINTS) return ring;\n const idx = (i: number) => ((i % n) + n) % n;\n\n const incoming = (i: number) =>\n ring.closed ? ring.edges[idx(i - 1)] : i > 0 ? ring.edges[i - 1] : undefined;\n const outgoing = (i: number) =>\n ring.closed ? ring.edges[i] : i < n - 1 ? ring.edges[i] : undefined;\n\n const isSharp = (i: number): boolean => {\n if (!ring.closed && (i === 0 || i === n - 1)) return true;\n if (incoming(i)?.kind === 'cubic' || outgoing(i)?.kind === 'cubic') {\n return true;\n }\n return (\n Math.abs(\n signedTurn(ring.anchors[idx(i - 1)], ring.anchors[i], ring.anchors[idx(i + 1)]),\n ) > ARCH_CORNER_RAD\n );\n };\n\n let start = 0;\n if (ring.closed) {\n const sharp = [...Array(n).keys()].find(isSharp);\n if (sharp == null) return ring;\n start = sharp;\n }\n\n const outA: Vec2[] = [];\n const outE: PathEdge[] = [];\n const walk = ring.closed ? n : n - 1;\n\n const emitRun = (fromW: number, toW: number) => {\n const pts: Vec2[] = [];\n for (let w = fromW; w <= toW; w++) {\n pts.push(ring.anchors[idx(start + w)]);\n }\n const linesOnly = pts.slice(0, -1).every((_, k) => {\n const edge = ring.edges[idx(start + fromW + k)];\n return !edge || edge.kind === 'line';\n });\n if (outA.length === 0) outA.push(cloneVec(pts[0]));\n if (linesOnly && runLooksLikeArch(pts)) {\n outA.push(cloneVec(pts[pts.length - 1]));\n outE.push(fitCubicThroughRun(pts));\n return;\n }\n for (let k = 1; k < pts.length; k++) {\n outA.push(cloneVec(pts[k]));\n outE.push(ring.edges[idx(start + fromW + k - 1)] ?? { kind: 'line' });\n }\n };\n\n let last = 0;\n for (let w = 1; w <= walk; w++) {\n const i = idx(start + w);\n if (w === walk || isSharp(i)) {\n emitRun(last, w);\n last = w;\n }\n }\n\n if (\n ring.closed &&\n outA.length > 1 &&\n vecEq(outA[0], outA[outA.length - 1])\n ) {\n outA.pop();\n }\n const expected = ring.closed ? outA.length : Math.max(0, outA.length - 1);\n while (outE.length > expected) outE.pop();\n if (outA.length < 2) return ring;\n return { closed: ring.closed, anchors: outA, edges: outE };\n}\n\nexport function geometryToRings(geometry: ShapeGeometry): PathRing[] {\n const fromPaths = geometry.paths.flatMap((p) => parsePathToRings(p.d));\n const source = fromPaths.some((ring) => ring.anchors.length >= 2)\n ? fromPaths.filter((ring) => ring.anchors.length >= 2)\n : geometry.polygons\n .filter((poly) => poly.length >= 2)\n .map((poly) => ringFromPolygon(poly, true));\n return source.map((ring) => flattenRunawayCubics(collapseLineRunsToCubics(ring)));\n}\n\n/** Closest point on one ring edge — keeps the add-anchor preview on the line. */\nexport function pointOnRingEdge(ring: PathRing, edgeIndex: number, point: Vec2): Vec2 {\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n if (edge.kind === 'cubic') {\n return nearestTOnCubic(point, from, edge.c1, edge.c2, to).point;\n }\n return projectOntoSegment(point, from, to).point;\n}\n\nexport function nearestTOnCubic(\n point: Vec2,\n p0: Vec2,\n c1: Vec2,\n c2: Vec2,\n p3: Vec2,\n): { t: number; point: Vec2; distance: number } {\n const samples = approximateCubic(p0, c1, c2, p3, 16);\n let bestT = 0;\n let bestPt = samples[0];\n let bestD = distance(point, samples[0]);\n for (let i = 1; i < samples.length; i++) {\n const d = distance(point, samples[i]);\n if (d < bestD) {\n bestD = d;\n bestPt = samples[i];\n bestT = i / (samples.length - 1);\n }\n }\n return { t: bestT, point: bestPt, distance: bestD };\n}\n","import type { ShapeGeometry, Vec2 } from '../core';\nimport { geometryBBox, projectOntoSegment } from '../core';\nimport {\n addVec,\n cloneVec,\n cubicHandlesForPull,\n cubicPoint,\n edgeCount,\n edgeFrom,\n edgeTo,\n geometryToRings,\n nearestTOnCubic,\n ringsToGeometry,\n splitCubic,\n subVec,\n type PathRing,\n} from './pathRings';\n\nfunction clonePolygons(polygons: Vec2[][]): Vec2[][] {\n return polygons.map((poly) => poly.map((p) => ({ x: p.x, y: p.y })));\n}\n\n/** Rebuild absolute path `d` strings from polygon rings (lossy for beziers). */\nexport function polygonsToPathD(polygons: Vec2[][]): string {\n return polygons\n .map((poly) => {\n if (poly.length === 0) return '';\n let d = `M ${poly[0].x} ${poly[0].y}`;\n for (let i = 1; i < poly.length; i++) {\n d += ` L ${poly[i].x} ${poly[i].y}`;\n }\n d += ' Z';\n return d;\n })\n .join(' ');\n}\n\nexport function polygonsToGeometry(polygons: Vec2[][]): ShapeGeometry {\n const cleaned = polygons\n .map((poly) => {\n if (\n poly.length > 1 &&\n poly[0].x === poly[poly.length - 1].x &&\n poly[0].y === poly[poly.length - 1].y\n ) {\n return poly.slice(0, -1);\n }\n return poly;\n })\n .filter((poly) => poly.length >= 3);\n return {\n paths: cleaned.map((poly) => ({\n d: polygonsToPathD([poly]),\n closed: true,\n })),\n polygons: cleaned,\n };\n}\n\nfunction commitRings(rings: PathRing[]): ShapeGeometry {\n return ringsToGeometry(rings);\n}\n\nfunction incomingEdgeIndex(ring: PathRing, anchorIndex: number): number | null {\n if (ring.closed) {\n return (anchorIndex - 1 + ring.anchors.length) % ring.anchors.length;\n }\n return anchorIndex > 0 ? anchorIndex - 1 : null;\n}\n\nfunction outgoingEdgeIndex(ring: PathRing, anchorIndex: number): number | null {\n if (ring.closed) return anchorIndex;\n return anchorIndex < ring.anchors.length - 1 ? anchorIndex : null;\n}\n\nexport function translateGeometry(\n geometry: ShapeGeometry,\n dx: number,\n dy: number,\n): ShapeGeometry {\n const delta = { x: dx, y: dy };\n const rings = geometryToRings(geometry).map((ring) => ({\n closed: ring.closed,\n anchors: ring.anchors.map((p) => addVec(p, delta)),\n edges: ring.edges.map((edge) =>\n edge.kind === 'line'\n ? { kind: 'line' as const }\n : {\n kind: 'cubic' as const,\n c1: addVec(edge.c1, delta),\n c2: addVec(edge.c2, delta),\n },\n ),\n }));\n if (rings.length === 0) {\n const polygons = clonePolygons(geometry.polygons).map((poly) =>\n poly.map((p) => ({ x: p.x + dx, y: p.y + dy })),\n );\n return polygonsToGeometry(polygons);\n }\n return commitRings(rings);\n}\n\n/** Slide one side: both endpoints (and that edge's handles) move together. */\nexport function translateEdge(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n delta: Vec2,\n): ShapeGeometry {\n if (delta.x === 0 && delta.y === 0) return geometry;\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n if (!ring || edgeIndex < 0 || edgeIndex >= edgeCount(ring)) return geometry;\n const fromIdx = edgeIndex;\n const toIdx = (edgeIndex + 1) % ring.anchors.length;\n ring.anchors[fromIdx] = addVec(ring.anchors[fromIdx], delta);\n ring.anchors[toIdx] = addVec(ring.anchors[toIdx], delta);\n const edge = ring.edges[edgeIndex];\n if (edge?.kind === 'cubic') {\n edge.c1 = addVec(edge.c1, delta);\n edge.c2 = addVec(edge.c2, delta);\n }\n const incoming = incomingEdgeIndex(ring, fromIdx);\n if (incoming != null && incoming !== edgeIndex) {\n const prev = ring.edges[incoming];\n if (prev?.kind === 'cubic') prev.c2 = addVec(prev.c2, delta);\n }\n const outgoing = outgoingEdgeIndex(ring, toIdx);\n if (outgoing != null && outgoing !== edgeIndex) {\n const next = ring.edges[outgoing];\n if (next?.kind === 'cubic') next.c1 = addVec(next.c1, delta);\n }\n return commitRings(rings);\n}\n\nexport function moveVertex(\n geometry: ShapeGeometry,\n polygonIndex: number,\n vertexIndex: number,\n point: Vec2,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[polygonIndex];\n if (!ring || vertexIndex < 0 || vertexIndex >= ring.anchors.length) {\n return geometry;\n }\n const prev = ring.anchors[vertexIndex];\n const delta = subVec(point, prev);\n ring.anchors[vertexIndex] = cloneVec(point);\n const incoming = incomingEdgeIndex(ring, vertexIndex);\n const outgoing = outgoingEdgeIndex(ring, vertexIndex);\n if (incoming != null) {\n const edge = ring.edges[incoming];\n if (edge?.kind === 'cubic') edge.c2 = addVec(edge.c2, delta);\n }\n if (outgoing != null) {\n const edge = ring.edges[outgoing];\n if (edge?.kind === 'cubic') edge.c1 = addVec(edge.c1, delta);\n }\n return commitRings(rings);\n}\n\nexport function moveHandle(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n handle: 1 | 2,\n point: Vec2,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n const edge = ring?.edges[edgeIndex];\n if (!edge || edge.kind !== 'cubic') return geometry;\n if (handle === 1) edge.c1 = cloneVec(point);\n else edge.c2 = cloneVec(point);\n return commitRings(rings);\n}\n\n/** Drop both handles so the arch becomes a straight side. */\nexport function flattenCubicEdge(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n const edge = ring?.edges[edgeIndex];\n if (!edge || edge.kind !== 'cubic') return geometry;\n ring.edges[edgeIndex] = { kind: 'line' };\n return commitRings(rings);\n}\n\n/** Pull a straight side into a cubic arch (or reshape a cubic from its chord). */\nexport function bendEdgeToCubic(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n pull: Vec2,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n if (!ring || edgeIndex < 0 || edgeIndex >= edgeCount(ring)) return geometry;\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const { c1, c2 } = cubicHandlesForPull(from, to, pull);\n ring.edges[edgeIndex] = { kind: 'cubic', c1, c2 };\n return commitRings(rings);\n}\n\n/**\n * Insert a vertex after `vertexIndex` on the given ring (before the next point).\n */\nexport function insertVertex(\n geometry: ShapeGeometry,\n polygonIndex: number,\n afterVertexIndex: number,\n point: Vec2,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[polygonIndex];\n if (!ring || afterVertexIndex < 0 || afterVertexIndex >= ring.anchors.length) {\n return geometry;\n }\n const edgeIndex = outgoingEdgeIndex(ring, afterVertexIndex);\n if (edgeIndex == null) return geometry;\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n\n if (edge.kind === 'cubic') {\n const { t } = nearestTOnCubic(point, from, edge.c1, edge.c2, to);\n const splitT = Math.min(0.95, Math.max(0.05, t));\n const split = splitCubic(from, edge.c1, edge.c2, to, splitT);\n ring.anchors.splice(afterVertexIndex + 1, 0, cloneVec(split.left.to));\n ring.edges.splice(edgeIndex, 1, { kind: 'cubic', c1: split.left.c1, c2: split.left.c2 }, {\n kind: 'cubic',\n c1: split.right.c1,\n c2: split.right.c2,\n });\n } else {\n ring.anchors.splice(afterVertexIndex + 1, 0, cloneVec(point));\n ring.edges.splice(edgeIndex, 1, { kind: 'line' }, { kind: 'line' });\n }\n return commitRings(rings);\n}\n\n/** Remove a vertex; refuses to go below 3 points on a closed ring. */\nexport function removeVertex(\n geometry: ShapeGeometry,\n polygonIndex: number,\n vertexIndex: number,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[polygonIndex];\n if (!ring) return geometry;\n const min = ring.closed ? 3 : 2;\n if (ring.anchors.length <= min) return geometry;\n if (vertexIndex < 0 || vertexIndex >= ring.anchors.length) return geometry;\n\n const n = ring.anchors.length;\n if (ring.closed) {\n ring.anchors.splice(vertexIndex, 1);\n ring.edges.splice(vertexIndex, 1);\n const join = vertexIndex === 0 ? ring.anchors.length - 1 : vertexIndex - 1;\n if (ring.edges[join]) ring.edges[join] = { kind: 'line' };\n } else if (vertexIndex === 0) {\n ring.anchors.splice(0, 1);\n ring.edges.splice(0, 1);\n } else if (vertexIndex === n - 1) {\n ring.anchors.pop();\n ring.edges.pop();\n } else {\n ring.anchors.splice(vertexIndex, 1);\n ring.edges.splice(vertexIndex, 1);\n ring.edges[vertexIndex - 1] = { kind: 'line' };\n }\n return commitRings(rings);\n}\n\nexport interface VertexHit {\n polygonIndex: number;\n vertexIndex: number;\n point: Vec2;\n distance: number;\n}\n\n/** Nearest path anchor within `tolerance` world units, or null. */\nexport function hitTestVertex(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n): VertexHit | null {\n let best: VertexHit | null = null;\n geometryToRings(geometry).forEach((ring, polygonIndex) => {\n ring.anchors.forEach((vertex, vertexIndex) => {\n const distance = Math.hypot(vertex.x - point.x, vertex.y - point.y);\n if (distance <= tolerance && (!best || distance < best.distance)) {\n best = {\n polygonIndex,\n vertexIndex,\n point: { x: vertex.x, y: vertex.y },\n distance,\n };\n }\n });\n });\n return best;\n}\n\nexport interface HandleHit {\n ringIndex: number;\n edgeIndex: number;\n handle: 1 | 2;\n point: Vec2;\n distance: number;\n}\n\nexport function hitTestHandle(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n): HandleHit | null {\n let best: HandleHit | null = null;\n geometryToRings(geometry).forEach((ring, ringIndex) => {\n const n = edgeCount(ring);\n for (let edgeIndex = 0; edgeIndex < n; edgeIndex++) {\n const edge = ring.edges[edgeIndex];\n if (edge?.kind !== 'cubic') continue;\n for (const handle of [1, 2] as const) {\n const hp = handle === 1 ? edge.c1 : edge.c2;\n const distance = Math.hypot(hp.x - point.x, hp.y - point.y);\n if (distance <= tolerance && (!best || distance < best.distance)) {\n best = { ringIndex, edgeIndex, handle, point: cloneVec(hp), distance };\n }\n }\n }\n });\n return best;\n}\n\nexport interface EdgeHit {\n polygonIndex: number;\n /** Insert after this vertex index. */\n afterVertexIndex: number;\n point: Vec2;\n distance: number;\n kind: 'line' | 'cubic';\n}\n\nfunction hitEdge(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n preferMidpoint: boolean,\n): EdgeHit | null {\n let best: EdgeHit | null = null;\n geometryToRings(geometry).forEach((ring, polygonIndex) => {\n const n = edgeCount(ring);\n for (let i = 0; i < n; i++) {\n const a = edgeFrom(ring, i);\n const b = edgeTo(ring, i);\n const edge = ring.edges[i] ?? { kind: 'line' as const };\n let candidate: Vec2;\n let dist: number;\n if (preferMidpoint) {\n candidate =\n edge.kind === 'cubic'\n ? cubicPoint(a, edge.c1, edge.c2, b, 0.5)\n : { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n dist = Math.hypot(candidate.x - point.x, candidate.y - point.y);\n } else if (edge.kind === 'cubic') {\n const near = nearestTOnCubic(point, a, edge.c1, edge.c2, b);\n candidate = near.point;\n dist = near.distance;\n } else {\n const proj = projectOntoSegment(point, a, b);\n candidate = proj.point;\n dist = proj.distance;\n }\n if (dist <= tolerance && (!best || dist < best.distance)) {\n best = {\n polygonIndex,\n afterVertexIndex: i,\n point: candidate,\n distance: dist,\n kind: edge.kind,\n };\n }\n }\n });\n return best;\n}\n\n/** Nearest edge midpoint within tolerance for insert. */\nexport function hitTestEdgeMidpoint(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n): EdgeHit | null {\n return hitEdge(geometry, point, tolerance, true);\n}\n\n/** Nearest point on any edge (for dragging a line into an arch). */\nexport function hitTestEdge(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n): EdgeHit | null {\n return hitEdge(geometry, point, tolerance, false);\n}\n\nexport function geometryWithBBox(geometry: ShapeGeometry): {\n geometry: ShapeGeometry;\n bbox: ReturnType<typeof geometryBBox>;\n} {\n return { geometry, bbox: geometryBBox(geometry) };\n}\n\nexport {\n geometryToRings,\n edgeCount,\n edgeFrom,\n edgeTo,\n edgeToPathD,\n pointOnRingEdge,\n ringToPathD,\n} from './pathRings';\nexport type { PathRing, PathEdge } from './pathRings';\n","import type { ShapeGeometry, ShapeKind, ShapeStyle, Vec2 } from '../core';\nimport { DEFAULT_WELD_TOLERANCE, distance, projectOntoSegment } from '../core';\nimport {\n cloneVec,\n edgeCount,\n edgeFrom,\n edgeTo,\n geometryToRings,\n nearestTOnCubic,\n ringsToGeometry,\n splitCubic,\n vecEq,\n type PathEdge,\n type PathRing,\n} from './pathRings';\nimport { hitTestEdge } from './geometryEdit';\n\nconst SHARED_EDGE_TOL = 4;\n\nexport type OpenEndId = {\n shapeId: number;\n ringIndex: number;\n end: 'start' | 'end';\n};\n\nexport type OpenEndHit = OpenEndId & { point: Vec2; distance: number };\n\nexport type SplitJoinEdgeHit = {\n shapeId: number;\n ringIndex: number;\n edgeIndex: number;\n point: Vec2;\n shared: boolean;\n distance: number;\n};\n\nexport type ShapeGeo = {\n id: number;\n kind: ShapeKind;\n style?: ShapeStyle;\n geometry: ShapeGeometry;\n};\n\nexport type ShapeBatchEdit =\n | { action: 'update'; shapeId: number; geometry: ShapeGeometry }\n | {\n action: 'create';\n kind: ShapeKind;\n geometry: ShapeGeometry;\n style?: ShapeStyle;\n }\n | { action: 'delete'; shapeId: number };\n\nexport function canSplitJoinKind(kind: ShapeKind): boolean {\n return kind === 'unit' || kind === 'amenity' || kind === 'parking_zone';\n}\n\nexport function sameOpenEnd(a: OpenEndId, b: OpenEndId): boolean {\n return a.shapeId === b.shapeId && a.ringIndex === b.ringIndex && a.end === b.end;\n}\n\nfunction cloneEdge(edge: PathEdge): PathEdge {\n return edge.kind === 'line'\n ? { kind: 'line' }\n : { kind: 'cubic', c1: cloneVec(edge.c1), c2: cloneVec(edge.c2) };\n}\n\nfunction cloneRing(ring: PathRing): PathRing {\n return {\n closed: ring.closed,\n anchors: ring.anchors.map(cloneVec),\n edges: ring.edges.map(cloneEdge),\n };\n}\n\nfunction reverseEdge(edge: PathEdge): PathEdge {\n if (edge.kind === 'line') return { kind: 'line' };\n return { kind: 'cubic', c1: cloneVec(edge.c2), c2: cloneVec(edge.c1) };\n}\n\nfunction reverseRing(ring: PathRing): PathRing {\n return {\n closed: ring.closed,\n anchors: ring.anchors.map(cloneVec).reverse(),\n edges: ring.edges.map(cloneEdge).reverse().map(reverseEdge),\n };\n}\n\nfunction maybeCloseCoincident(ring: PathRing, tol: number): PathRing {\n if (ring.closed || ring.anchors.length < 3) return ring;\n const first = ring.anchors[0];\n const last = ring.anchors[ring.anchors.length - 1];\n if (!vecEq(first, last, tol)) return ring;\n const next = cloneRing(ring);\n next.anchors.pop();\n next.closed = true;\n const expected = next.anchors.length;\n while (next.edges.length > expected) next.edges.pop();\n while (next.edges.length < expected) next.edges.push({ kind: 'line' });\n return next;\n}\n\nexport function listOpenEnds(geometry: ShapeGeometry): Array<{\n ringIndex: number;\n end: 'start' | 'end';\n point: Vec2;\n}> {\n const out: Array<{ ringIndex: number; end: 'start' | 'end'; point: Vec2 }> = [];\n geometryToRings(geometry).forEach((ring, ringIndex) => {\n if (ring.closed || ring.anchors.length < 2) return;\n out.push({\n ringIndex,\n end: 'start',\n point: cloneVec(ring.anchors[0]),\n });\n out.push({\n ringIndex,\n end: 'end',\n point: cloneVec(ring.anchors[ring.anchors.length - 1]),\n });\n });\n return out;\n}\n\nfunction distToRingEdge(ring: PathRing, edgeIndex: number, point: Vec2): number {\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n if (edge.kind === 'cubic') {\n return nearestTOnCubic(point, from, edge.c1, edge.c2, to).distance;\n }\n return projectOntoSegment(point, from, to).distance;\n}\n\nfunction pointOnRingBoundary(point: Vec2, ring: PathRing, tol: number): boolean {\n const n = edgeCount(ring);\n for (let i = 0; i < n; i++) {\n if (distToRingEdge(ring, i, point) <= tol) return true;\n }\n return false;\n}\n\nexport function edgeLiesOnOtherShape(\n from: Vec2,\n to: Vec2,\n others: Array<{ geometry: ShapeGeometry }>,\n tol = SHARED_EDGE_TOL,\n): boolean {\n const mid = { x: (from.x + to.x) / 2, y: (from.y + to.y) / 2 };\n for (const other of others) {\n const rings = geometryToRings(other.geometry);\n const onBoundary = rings.some(\n (ring) =>\n pointOnRingBoundary(from, ring, tol) &&\n pointOnRingBoundary(to, ring, tol) &&\n pointOnRingBoundary(mid, ring, tol),\n );\n if (onBoundary) return true;\n const open = listOpenEnds(other.geometry);\n if (open.length >= 2) {\n const near = (p: Vec2) =>\n open.some((end) => distance(end.point, p) <= tol);\n if (near(from) && near(to)) return true;\n }\n }\n return false;\n}\n\nfunction cutPointsOnLine(\n from: Vec2,\n to: Vec2,\n point: Vec2,\n gap: number,\n): { p1: Vec2; p2: Vec2 } | null {\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const len = Math.hypot(dx, dy);\n if (len < 1e-6) return null;\n const half = Math.min(Math.max(gap, 0.35) / 2, len * 0.2);\n if (half < 0.12) return null;\n const ux = dx / len;\n const uy = dy / len;\n const proj = projectOntoSegment(point, from, to).point;\n let t = (proj.x - from.x) * ux + (proj.y - from.y) * uy;\n t = Math.min(len - half, Math.max(half, t));\n return {\n p1: { x: from.x + ux * (t - half), y: from.y + uy * (t - half) },\n p2: { x: from.x + ux * (t + half), y: from.y + uy * (t + half) },\n };\n}\n\nfunction cutPointsOnCubic(\n from: Vec2,\n edge: Extract<PathEdge, { kind: 'cubic' }>,\n to: Vec2,\n point: Vec2,\n gap: number,\n): {\n p1: Vec2;\n p2: Vec2;\n leftEdge: PathEdge;\n rightEdge: PathEdge;\n} | null {\n const { t } = nearestTOnCubic(point, from, edge.c1, edge.c2, to);\n const chord = Math.hypot(to.x - from.x, to.y - from.y);\n const dt =\n chord > 1e-6\n ? Math.min(0.04, Math.max(0.006, gap / (2 * chord)))\n : 0.015;\n const t1 = Math.min(0.92, Math.max(0.04, t - dt));\n const t2 = Math.min(0.96, Math.max(t1 + 0.012, t + dt));\n if (t2 - t1 < 0.01) return null;\n const first = splitCubic(from, edge.c1, edge.c2, to, t1);\n const local = (t2 - t1) / Math.max(1e-6, 1 - t1);\n const second = splitCubic(\n first.left.to,\n first.right.c1,\n first.right.c2,\n to,\n local,\n );\n return {\n p1: cloneVec(first.left.to),\n p2: cloneVec(second.left.to),\n leftEdge: { kind: 'cubic', c1: first.left.c1, c2: first.left.c2 },\n rightEdge: { kind: 'cubic', c1: second.right.c1, c2: second.right.c2 },\n };\n}\n\nfunction rebuildOpenFromClosedCut(\n ring: PathRing,\n edgeIndex: number,\n p1: Vec2,\n p2: Vec2,\n leftEdge: PathEdge,\n rightEdge: PathEdge,\n): PathRing {\n const n = ring.anchors.length;\n const fromIdx = edgeIndex;\n const toIdx = (edgeIndex + 1) % n;\n const anchors = [cloneVec(p2), cloneVec(ring.anchors[toIdx])];\n const edges: PathEdge[] = [cloneEdge(rightEdge)];\n let i = toIdx;\n while (i !== fromIdx) {\n const next = (i + 1) % n;\n edges.push(cloneEdge(ring.edges[i]));\n anchors.push(cloneVec(ring.anchors[next]));\n i = next;\n }\n anchors.push(cloneVec(p1));\n edges.push(cloneEdge(leftEdge));\n return { closed: false, anchors, edges };\n}\n\nfunction splitOpenRingAtCut(\n ring: PathRing,\n edgeIndex: number,\n p1: Vec2,\n p2: Vec2,\n leftEdge: PathEdge,\n rightEdge: PathEdge,\n): PathRing[] {\n const fromIdx = edgeIndex;\n const toIdx = edgeIndex + 1;\n const left: PathRing = {\n closed: false,\n anchors: [...ring.anchors.slice(0, fromIdx + 1).map(cloneVec), cloneVec(p1)],\n edges: [\n ...ring.edges.slice(0, fromIdx).map(cloneEdge),\n cloneEdge(leftEdge),\n ],\n };\n const right: PathRing = {\n closed: false,\n anchors: [cloneVec(p2), ...ring.anchors.slice(toIdx).map(cloneVec)],\n edges: [cloneEdge(rightEdge), ...ring.edges.slice(toIdx).map(cloneEdge)],\n };\n return [left, right].filter((item) => item.anchors.length >= 2);\n}\n\nexport function openWholeEdge(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n): ShapeGeometry {\n const rings = geometryToRings(geometry).map(cloneRing);\n const ring = rings[ringIndex];\n if (!ring || edgeIndex < 0 || edgeIndex >= edgeCount(ring)) return geometry;\n\n if (ring.closed) {\n const n = ring.anchors.length;\n if (n < 3) return geometry;\n const fromIdx = edgeIndex;\n const toIdx = (edgeIndex + 1) % n;\n const anchors = [cloneVec(ring.anchors[toIdx])];\n const edges: PathEdge[] = [];\n let i = toIdx;\n while (i !== fromIdx) {\n const next = (i + 1) % n;\n edges.push(cloneEdge(ring.edges[i]));\n anchors.push(cloneVec(ring.anchors[next]));\n i = next;\n }\n rings[ringIndex] = { closed: false, anchors, edges };\n return ringsToGeometry(rings);\n }\n\n if (edgeIndex === 0) {\n ring.anchors.shift();\n ring.edges.shift();\n if (ring.anchors.length < 2) rings.splice(ringIndex, 1);\n return ringsToGeometry(rings);\n }\n if (edgeIndex === ring.edges.length - 1) {\n ring.anchors.pop();\n ring.edges.pop();\n if (ring.anchors.length < 2) rings.splice(ringIndex, 1);\n return ringsToGeometry(rings);\n }\n\n const left: PathRing = {\n closed: false,\n anchors: ring.anchors.slice(0, edgeIndex + 1).map(cloneVec),\n edges: ring.edges.slice(0, edgeIndex).map(cloneEdge),\n };\n const right: PathRing = {\n closed: false,\n anchors: ring.anchors.slice(edgeIndex + 1).map(cloneVec),\n edges: ring.edges.slice(edgeIndex + 1).map(cloneEdge),\n };\n const next = [left, right].filter((item) => item.anchors.length >= 2);\n rings.splice(ringIndex, 1, ...next);\n return ringsToGeometry(rings);\n}\n\nexport function cutEdgeOpen(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n point: Vec2,\n gap: number,\n): ShapeGeometry {\n const rings = geometryToRings(geometry).map(cloneRing);\n const ring = rings[ringIndex];\n if (!ring || edgeIndex < 0 || edgeIndex >= edgeCount(ring)) return geometry;\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n\n let p1: Vec2;\n let p2: Vec2;\n let leftEdge: PathEdge;\n let rightEdge: PathEdge;\n\n if (edge.kind === 'cubic') {\n const cut = cutPointsOnCubic(from, edge, to, point, gap);\n if (!cut) return openWholeEdge(geometry, ringIndex, edgeIndex);\n p1 = cut.p1;\n p2 = cut.p2;\n leftEdge = cut.leftEdge;\n rightEdge = cut.rightEdge;\n } else {\n const cut = cutPointsOnLine(from, to, point, gap);\n if (!cut) return openWholeEdge(geometry, ringIndex, edgeIndex);\n p1 = cut.p1;\n p2 = cut.p2;\n leftEdge = { kind: 'line' };\n rightEdge = { kind: 'line' };\n }\n\n if (ring.closed) {\n rings[ringIndex] = rebuildOpenFromClosedCut(\n ring,\n edgeIndex,\n p1,\n p2,\n leftEdge,\n rightEdge,\n );\n return ringsToGeometry(rings);\n }\n\n const pieces = splitOpenRingAtCut(\n ring,\n edgeIndex,\n p1,\n p2,\n leftEdge,\n rightEdge,\n );\n rings.splice(ringIndex, 1, ...pieces);\n return ringsToGeometry(rings);\n}\n\nfunction concatOpenRings(left: PathRing, right: PathRing, tol: number): PathRing {\n const leftEnd = left.anchors[left.anchors.length - 1];\n const rightStart = right.anchors[0];\n const weld = vecEq(leftEnd, rightStart, tol);\n const anchors = weld\n ? [...left.anchors.map(cloneVec), ...right.anchors.slice(1).map(cloneVec)]\n : [...left.anchors.map(cloneVec), ...right.anchors.map(cloneVec)];\n const edges = weld\n ? [...left.edges.map(cloneEdge), ...right.edges.map(cloneEdge)]\n : [...left.edges.map(cloneEdge), { kind: 'line' as const }, ...right.edges.map(cloneEdge)];\n return maybeCloseCoincident({ closed: false, anchors, edges }, tol);\n}\n\nfunction closeOpenRing(ring: PathRing, tol: number): PathRing {\n const coincident = vecEq(\n ring.anchors[0],\n ring.anchors[ring.anchors.length - 1],\n tol,\n );\n if (coincident) return maybeCloseCoincident(ring, tol);\n return {\n closed: true,\n anchors: ring.anchors.map(cloneVec),\n edges: [...ring.edges.map(cloneEdge), { kind: 'line' }],\n };\n}\n\nexport function joinOpenEndpoints(\n geometry: ShapeGeometry,\n a: { ringIndex: number; end: 'start' | 'end' },\n b: { ringIndex: number; end: 'start' | 'end' },\n tol = DEFAULT_WELD_TOLERANCE,\n): ShapeGeometry {\n const rings = geometryToRings(geometry).map(cloneRing);\n const ra = rings[a.ringIndex];\n const rb = rings[b.ringIndex];\n if (!ra || !rb || ra.closed || rb.closed) return geometry;\n\n if (a.ringIndex === b.ringIndex) {\n if (a.end === b.end) return geometry;\n rings[a.ringIndex] = closeOpenRing(ra, tol);\n return ringsToGeometry(rings);\n }\n\n const left = a.end === 'end' ? cloneRing(ra) : reverseRing(ra);\n const right = b.end === 'start' ? cloneRing(rb) : reverseRing(rb);\n const joined = concatOpenRings(left, right, tol);\n const keep = Math.min(a.ringIndex, b.ringIndex);\n const drop = Math.max(a.ringIndex, b.ringIndex);\n rings[keep] = joined;\n rings.splice(drop, 1);\n return ringsToGeometry(rings);\n}\n\nfunction joinAcrossShapes(\n shapes: ShapeGeo[],\n a: OpenEndId,\n b: OpenEndId,\n tol: number,\n): { shapes: ShapeGeo[]; deleteIds: number[] } {\n const ia = shapes.findIndex((s) => s.id === a.shapeId);\n const ib = shapes.findIndex((s) => s.id === b.shapeId);\n if (ia < 0 || ib < 0) return { shapes, deleteIds: [] };\n\n if (a.shapeId === b.shapeId) {\n const next = shapes.slice();\n next[ia] = {\n ...next[ia],\n geometry: joinOpenEndpoints(next[ia].geometry, a, b, tol),\n };\n return { shapes: next, deleteIds: [] };\n }\n\n const ringsA = geometryToRings(shapes[ia].geometry).map(cloneRing);\n const ringsB = geometryToRings(shapes[ib].geometry).map(cloneRing);\n const offset = ringsA.length;\n const merged = ringsToGeometry([...ringsA, ...ringsB]);\n const joined = joinOpenEndpoints(\n merged,\n a,\n { ringIndex: b.ringIndex + offset, end: b.end },\n tol,\n );\n const next = shapes\n .filter((s) => s.id !== b.shapeId)\n .map((s) => (s.id === a.shapeId ? { ...s, geometry: joined } : s));\n return { shapes: next, deleteIds: [b.shapeId] };\n}\n\nexport function weldCoincidentOpenEnds(\n shapes: ShapeGeo[],\n tol = DEFAULT_WELD_TOLERANCE,\n): { shapes: ShapeGeo[]; deleteIds: number[] } {\n let current = shapes;\n const deleteIds: number[] = [];\n for (let n = 0; n < 24; n++) {\n const ends: OpenEndHit[] = [];\n for (const shape of current) {\n for (const end of listOpenEnds(shape.geometry)) {\n ends.push({\n shapeId: shape.id,\n ringIndex: end.ringIndex,\n end: end.end,\n point: end.point,\n distance: 0,\n });\n }\n }\n let best: { a: OpenEndHit; b: OpenEndHit; dist: number } | null = null;\n for (let i = 0; i < ends.length; i++) {\n for (let j = i + 1; j < ends.length; j++) {\n const a = ends[i];\n const b = ends[j];\n if (a.shapeId === b.shapeId && a.ringIndex === b.ringIndex) continue;\n const dist = distance(a.point, b.point);\n const pairTol = a.shapeId === b.shapeId ? Math.min(tol, 0.75) : tol;\n if (dist <= pairTol && (!best || dist < best.dist)) {\n best = { a, b, dist };\n }\n }\n }\n if (!best) break;\n const joined = joinAcrossShapes(current, best.a, best.b, tol);\n current = joined.shapes;\n deleteIds.push(...joined.deleteIds);\n }\n return { shapes: current, deleteIds };\n}\n\nexport function forkClosedRings(shape: ShapeGeo): {\n keep: ShapeGeo;\n extras: ShapeGeometry[];\n} {\n const rings = geometryToRings(shape.geometry);\n const closed = rings.filter((ring) => ring.closed && ring.anchors.length >= 3);\n const opens = rings.filter((ring) => !ring.closed && ring.anchors.length >= 2);\n if (closed.length <= 1) {\n return { keep: shape, extras: [] };\n }\n return {\n keep: {\n ...shape,\n geometry: ringsToGeometry([closed[0], ...opens]),\n },\n extras: closed.slice(1).map((ring) => ringsToGeometry([ring])),\n };\n}\n\nfunction finishEdits(\n before: ShapeGeo[],\n working: ShapeGeo[],\n extraDeletes: number[],\n): ShapeBatchEdit[] {\n const welded = weldCoincidentOpenEnds(working);\n const deleteSet = new Set([...extraDeletes, ...welded.deleteIds]);\n const extras: Array<{ fromId: number; geometry: ShapeGeometry; kind: ShapeKind; style?: ShapeStyle }> =\n [];\n const kept: ShapeGeo[] = [];\n for (const shape of welded.shapes) {\n if (deleteSet.has(shape.id)) continue;\n const forked = forkClosedRings(shape);\n kept.push(forked.keep);\n for (const geometry of forked.extras) {\n extras.push({\n fromId: shape.id,\n geometry,\n kind: shape.kind,\n style: shape.style,\n });\n }\n }\n\n const edits: ShapeBatchEdit[] = [];\n const beforeById = new Map(before.map((s) => [s.id, s]));\n for (const shape of kept) {\n const prev = beforeById.get(shape.id);\n if (!prev) continue;\n if (JSON.stringify(prev.geometry) !== JSON.stringify(shape.geometry)) {\n edits.push({\n action: 'update',\n shapeId: shape.id,\n geometry: shape.geometry,\n });\n }\n }\n for (const extra of extras) {\n edits.push({\n action: 'create',\n kind: extra.kind,\n geometry: extra.geometry,\n style: extra.style,\n });\n }\n for (const id of deleteSet) {\n if (beforeById.has(id)) edits.push({ action: 'delete', shapeId: id });\n }\n return edits;\n}\n\nexport function applySplitJoinCut(\n shapes: ShapeGeo[],\n hit: { shapeId: number; ringIndex: number; edgeIndex: number; point: Vec2 },\n gap: number,\n): ShapeBatchEdit[] {\n const target = shapes.find((s) => s.id === hit.shapeId);\n if (!target) return [];\n const others = shapes.filter((s) => s.id !== hit.shapeId);\n const rings = geometryToRings(target.geometry);\n const ring = rings[hit.ringIndex];\n if (!ring) return [];\n const from = edgeFrom(ring, hit.edgeIndex);\n const to = edgeTo(ring, hit.edgeIndex);\n const shared = edgeLiesOnOtherShape(from, to, others);\n const nextGeo = shared\n ? openWholeEdge(target.geometry, hit.ringIndex, hit.edgeIndex)\n : cutEdgeOpen(target.geometry, hit.ringIndex, hit.edgeIndex, hit.point, gap);\n const next = shapes.map((s) =>\n s.id === hit.shapeId ? { ...s, geometry: nextGeo } : s,\n );\n return finishEdits(shapes, next, []);\n}\n\nexport function applySplitJoinJoin(\n shapes: ShapeGeo[],\n a: OpenEndId,\n b: OpenEndId,\n): ShapeBatchEdit[] {\n if (sameOpenEnd(a, b)) return [];\n const joined = joinAcrossShapes(shapes, a, b, DEFAULT_WELD_TOLERANCE);\n return finishEdits(shapes, joined.shapes, joined.deleteIds);\n}\n\nexport function hitOpenEnd(\n shapes: ShapeGeo[],\n point: Vec2,\n tol: number,\n skip?: OpenEndId | null,\n): OpenEndHit | null {\n let best: OpenEndHit | null = null;\n for (const shape of shapes) {\n for (const end of listOpenEnds(shape.geometry)) {\n const id: OpenEndId = {\n shapeId: shape.id,\n ringIndex: end.ringIndex,\n end: end.end,\n };\n if (skip && sameOpenEnd(skip, id)) continue;\n const dist = distance(point, end.point);\n if (dist > tol) continue;\n const preferOther =\n skip &&\n (shape.id !== skip.shapeId || end.ringIndex !== skip.ringIndex);\n const bestPrefer =\n best &&\n skip &&\n (best.shapeId !== skip.shapeId || best.ringIndex !== skip.ringIndex);\n if (\n !best ||\n (preferOther && !bestPrefer) ||\n (preferOther === bestPrefer && dist < best.distance)\n ) {\n best = { ...id, point: end.point, distance: dist };\n }\n }\n }\n return best;\n}\n\nexport function hitSplitJoinEdge(\n shapes: ShapeGeo[],\n point: Vec2,\n tol: number,\n): SplitJoinEdgeHit | null {\n let best: SplitJoinEdgeHit | null = null;\n for (const shape of shapes) {\n const hit = hitTestEdge(shape.geometry, point, tol);\n if (!hit) continue;\n if (!best || hit.distance < best.distance) {\n const rings = geometryToRings(shape.geometry);\n const ring = rings[hit.polygonIndex];\n const from = ring ? edgeFrom(ring, hit.afterVertexIndex) : point;\n const to = ring ? edgeTo(ring, hit.afterVertexIndex) : point;\n best = {\n shapeId: shape.id,\n ringIndex: hit.polygonIndex,\n edgeIndex: hit.afterVertexIndex,\n point: hit.point,\n shared: edgeLiesOnOtherShape(\n from,\n to,\n shapes.filter((s) => s.id !== shape.id),\n ),\n distance: hit.distance,\n };\n }\n }\n return best;\n}\n\nexport function previewCutPoints(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n point: Vec2,\n gap: number,\n): { p1: Vec2; p2: Vec2 } | null {\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n if (!ring) return null;\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n if (edge.kind === 'cubic') {\n const cut = cutPointsOnCubic(from, edge, to, point, gap);\n return cut ? { p1: cut.p1, p2: cut.p2 } : null;\n }\n return cutPointsOnLine(from, to, point, gap);\n}\n","import type { Vec2 } from '../core';\n\n/** Closest candidate within `tol` world units, or null. */\nexport function nearestSnapPoint(\n point: Vec2,\n candidates: Vec2[],\n tol: number,\n): Vec2 | null {\n let best: { point: Vec2; distance: number } | null = null;\n for (const candidate of candidates) {\n const distance = Math.hypot(candidate.x - point.x, candidate.y - point.y);\n if (distance <= tol && (!best || distance < best.distance)) {\n best = { point: candidate, distance };\n }\n }\n return best ? { x: best.point.x, y: best.point.y } : null;\n}\n\nexport function sameSnapPoint(a: Vec2 | null, b: Vec2 | null, eps = 1e-4): boolean {\n if (!a || !b) return false;\n return Math.abs(a.x - b.x) <= eps && Math.abs(a.y - b.y) <= eps;\n}\n","import type { ShapeGeometry, 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 { outdoorDecorationFromSvg, resolveFetchUrl } 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?: Partial<Record<string, string>> | 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(nextRouteChainAnchor(tool, created));\n setRubberCursor(world);\n return;\n }\n const next = beginOrContinueRouteDraft(routeDraftPoint, world);\n setRouteDraftPoint(next.nextDraft);\n setRubberCursor(world);\n if (next.start && next.end) {\n const created = onCreateRouteSegment(next.start, next.end);\n setLastRouteAnchor(nextRouteChainAnchor(tool, created));\n }\n return;\n }\n beginPan(e, true);\n return;\n }\n if (tool === 'draw-text') {\n const size = defaultLabelSize(viewbox);\n onCreateShape(\n 'label',\n textLabelGeometry(world, DEFAULT_LABEL_TEXT, size),\n { label: defaultTextLabel(DEFAULT_LABEL_TEXT, size, theme.STORE_TEXT_COLOR) },\n );\n return;\n }\n if (tool === 'draw-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 { createPortal } from 'react-dom';\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 [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n const nativeRef = useRef<HTMLInputElement>(null);\n const lastSolid = useRef(\n hexColorInputValue(fallback || swatch),\n );\n const transparent =\n isTransparentColor(swatch) ||\n (emptyIsTransparent && !hex.trim());\n const [menu, setMenu] = useState<{ top: number; left: number } | null>(null);\n\n useEffect(() => {\n const solid = normalizeHexColor(swatch);\n if (solid) lastSolid.current = solid;\n }, [swatch]);\n\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target as Node;\n if (rootRef.current?.contains(target) || popoverRef.current?.contains(target)) {\n return;\n }\n setOpen(false);\n };\n const onKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false);\n };\n const close = () => setOpen(false);\n document.addEventListener('pointerdown', onPointerDown);\n document.addEventListener('keydown', onKey);\n document.addEventListener('scroll', close, true);\n return () => {\n document.removeEventListener('pointerdown', onPointerDown);\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('scroll', close, true);\n };\n }, [open]);\n\n const pickerValue = hexColorInputValue(transparent ? lastSolid.current : swatch);\n\n return (\n <div className=\"eyeon-map-assign__swatch\" ref={rootRef}>\n <input\n ref={nativeRef}\n type=\"color\"\n className=\"eyeon-map-assign__swatch-native\"\n disabled={disabled}\n tabIndex={-1}\n aria-hidden=\"true\"\n value={pickerValue}\n onChange={(e) => {\n lastSolid.current = e.target.value;\n onPick(e.target.value);\n }}\n />\n <button\n type=\"button\"\n className={\n transparent\n ? 'eyeon-map-assign__swatch-well is-transparent'\n : 'eyeon-map-assign__swatch-well'\n }\n disabled={disabled}\n aria-label={label}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n style={transparent ? undefined : { backgroundColor: hexColorInputValue(swatch) }}\n onClick={(event) => {\n if (open) {\n setOpen(false);\n return;\n }\n const rect = event.currentTarget.getBoundingClientRect();\n setMenu({ top: rect.bottom + 4, left: rect.left });\n setOpen(true);\n }}\n />\n {open && menu\n ? createPortal(\n <div\n ref={popoverRef}\n className=\"eyeon-map-assign__color-popover\"\n role=\"dialog\"\n aria-label={`${label} picker`}\n style={{ top: menu.top, left: menu.left }}\n >\n <button\n type=\"button\"\n className={\n transparent\n ? 'eyeon-map-assign__color-popover-well is-transparent'\n : 'eyeon-map-assign__color-popover-well'\n }\n disabled={disabled}\n aria-label={`Pick ${label}`}\n style={\n transparent\n ? undefined\n : { backgroundColor: pickerValue }\n }\n onClick={() => nativeRef.current?.click()}\n />\n <label>\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={transparent}\n onChange={(e) => {\n if (e.target.checked) {\n onPick(TRANSPARENT_COLOR);\n return;\n }\n onPick(lastSolid.current);\n }}\n />\n Transparent\n </label>\n </div>,\n document.body,\n )\n : null}\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={onChange}\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.tsx';\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 { floorSwitcherLevels } 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 = floorSwitcherLevels(levels).slice().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&rsquo;s walking paths.\n </li>\n <li>\n The artboard must stay the same size, otherwise the import is rejected.\n </li>\n </ul>\n </div>\n ) : null}\n {progress != null && (\n <div\n className=\"eyeon-map-floors__progress\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={progress}\n >\n <div className=\"eyeon-map-floors__progress-track\">\n <div\n className=\"eyeon-map-floors__progress-bar\"\n style={{ width: `${Math.min(100, Math.max(0, progress))}%` }}\n />\n </div>\n <span className=\"eyeon-map-floors__progress-label\">{progress}%</span>\n </div>\n )}\n {error ? <div className=\"eyeon-map-floors__error\">{error}</div> : null}\n {screen.mode === 'edit' && editing ? (\n <div className=\"eyeon-map-floors__edit-actions\">\n <div className=\"eyeon-map-floors__edit-row\">\n {onDeleteLevel && canManage ? (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__danger\"\n disabled={busy || deleting}\n onClick={() => setConfirmDeleteId(editing.id)}\n >\n Delete\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-floors__primary\"\n disabled={\n busy ||\n deleting ||\n !canManage ||\n (editing.kind !== 'outdoor' && !name.trim())\n }\n onClick={() => void submit()}\n >\n {busy\n ? progress != null\n ? `${primaryBusyLabel} ${progress}%`\n : 'Saving…'\n : file\n ? isOutdoorForm\n ? 'Upload & Save'\n : 'Import & Save'\n : 'Save Changes'}\n </button>\n </div>\n </div>\n ) : (\n <div className=\"eyeon-map-rail__actions\">\n <button\n type=\"button\"\n className=\"eyeon-map-floors__primary\"\n disabled={\n busy ||\n deleting ||\n !canManage ||\n (isOutdoorForm ? !file : !name.trim() || !file)\n }\n onClick={() => void submit()}\n >\n {busy\n ? progress != null\n ? `${primaryBusyLabel} ${progress}%`\n : `${primaryBusyLabel}…`\n : primaryLabel}\n </button>\n </div>\n )}\n {renderDeleteModal()}\n </div>\n );\n }\n\n return (\n <div className={['eyeon-map-floors', drag ? 'is-reordering' : ''].filter(Boolean).join(' ')}>\n <div className=\"eyeon-map-floors__block\">\n {canManage && (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__add\"\n onClick={() => onScreenChange({ mode: 'add-floor' })}\n >\n Add Floor\n </button>\n )}\n {displayFloors.length === 0 ? (\n <p className=\"eyeon-map-rail__hint\">No floors yet.</p>\n ) : (\n <div ref={floorListRef} className=\"eyeon-map-floors__list\">\n {displayFloors.map((level) => (\n <div\n key={level.id}\n data-floor-id={level.id}\n className=\"eyeon-map-floors__entry\"\n >\n <div\n className={[\n 'eyeon-map-floors__row',\n drag?.id === level.id ? 'is-placeholder' : '',\n confirmDeleteId === level.id ? 'is-confirm' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {canReorder ? (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__grip\"\n title=\"Drag to reorder\"\n aria-label={`Reorder ${level.name}`}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => {\n if (e.button !== 0) return;\n startDrag(level, e);\n }}\n >\n <GripIcon />\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-floors__item\"\n onClick={() => {\n if (drag) return;\n openEdit(level);\n }}\n >\n {level.name}\n </button>\n {renderRowDelete(level)}\n </div>\n </div>\n ))}\n {lineTop == null ? null : (\n <div\n className=\"eyeon-map-floors__drop-line\"\n style={{ top: lineTop }}\n />\n )}\n </div>\n )}\n </div>\n\n <div className=\"eyeon-map-floors__block\">\n {outdoorReady && outdoor ? (\n <div className=\"eyeon-map-floors__entry\">\n <div\n className={[\n 'eyeon-map-floors__row',\n confirmDeleteId === outdoor.id ? 'is-confirm' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <button\n type=\"button\"\n className=\"eyeon-map-floors__item\"\n onClick={() => openEdit(outdoor)}\n >\n Outdoor SVG\n </button>\n {renderRowDelete(outdoor)}\n </div>\n </div>\n ) : canManage ? (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__add\"\n onClick={() => onScreenChange({ mode: 'add-base' })}\n >\n Add Outdoor SVG\n </button>\n ) : null}\n </div>\n {error ? <div className=\"eyeon-map-floors__error\">{error}</div> : null}\n {renderDeleteModal()}\n {drag\n ? createPortal(\n <div\n ref={ghostRef}\n className=\"eyeon-map-floors__row eyeon-map-floors__row--ghost\"\n style={{\n left: drag.x,\n top: drag.y,\n width: drag.width,\n height: drag.height,\n }}\n >\n <span className=\"eyeon-map-floors__grip\" aria-hidden=\"true\">\n <GripIcon />\n </span>\n <span className=\"eyeon-map-floors__item\">{drag.name}</span>\n <span className=\"eyeon-map-floors__icon-danger\" aria-hidden=\"true\">\n <TrashIcon />\n </span>\n </div>,\n document.body,\n )\n : null}\n </div>\n );\n}\n","import React, { useEffect, useMemo, useState, type ReactNode } from 'react';\nimport {\n clampStoreRadius,\n 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={onChange}\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.tsx';\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.tsx';\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?.logoUrl ?? null\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: retailer?.logoUrl ?? 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={(next) => onCommit(next)}\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.tsx';\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, same contract as v1 `IMAGE_PROXY_URL` (base + encoded\n * URL). Required whenever the outdoor SVG is served from a origin that does\n * not send CORS headers, otherwise its decoration silently fails to load.\n */\n imageProxyUrl?: string | null;\n className?: string;\n /** Quiet extra actions under the left rail (e.g. developer Classic Map). */\n sidebarFooter?: ReactNode;\n /** 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.tsx';\n\nexport interface ImportReviewProps {\n diff: ImportDiff;\n viewBoxChanged?: boolean;\n blockedMessage?: string | null;\n busy?: boolean;\n onApply: (payload: {\n acceptAll: boolean;\n remap: Array<{ fromShapeId: number; toSourceSvgId: string }>;\n }) => Promise<void> | void;\n onCancel?: () => void;\n}\n\nfunction bucketLabel(change: ImportDiffItem['change']): string {\n switch (change) {\n case 'added':\n return 'Added';\n case 'removed':\n return 'Orphaned';\n case 'moved':\n return 'Moved';\n case 'kind_changed':\n return 'Kind changed';\n default:\n return 'Unchanged';\n }\n}\n\n/**\n * Outdoor (or floor) re-upload review — shows added / orphaned / locked / drifted\n * buckets before apply. Host wires POST .../import + .../import/apply.\n */\nexport function ImportReviewPanel({\n diff,\n viewBoxChanged = false,\n blockedMessage,\n busy = false,\n onApply,\n onCancel,\n}: ImportReviewProps) {\n const [remap, setRemap] = useState<Record<number, string>>({});\n\n const buckets = useMemo(() => {\n const added = diff.items.filter((i) => i.change === 'added');\n const orphaned = diff.items.filter((i) => i.change === 'removed');\n const locked = diff.items.filter(\n (i) => i.geometryLocked && i.change !== 'removed' && i.change !== 'added',\n );\n const moved = diff.items.filter((i) => i.change === 'moved');\n return { added, orphaned, locked, moved };\n }, [diff.items]);\n\n if (viewBoxChanged) {\n return (\n <div className=\"eyeon-map-import-review\">\n <div className=\"eyeon-map-floors__error\">\n {blockedMessage ??\n 'SVG viewBox changed — restore the original artboard before re-uploading.'}\n </div>\n {onCancel ? (\n <button type=\"button\" onClick={onCancel} disabled={busy}>\n Close\n </button>\n ) : null}\n </div>\n );\n }\n\n return (\n <div className=\"eyeon-map-import-review\">\n <p className=\"eyeon-map-rail__hint\">\n Review changes before applying. Orphaned shapes keep their retailer\n assignments — remap them onto a newly added id if the designer renamed\n a store.\n </p>\n\n {buckets.added.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Added ({buckets.added.length})\n </div>\n {buckets.added.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row\">\n <span>{item.sourceSvgId}</span>\n <span className=\"eyeon-map-rail__muted\">{item.newKind}</span>\n </div>\n ))}\n </section>\n )}\n\n {buckets.orphaned.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Orphaned ({buckets.orphaned.length})\n </div>\n {buckets.orphaned.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row eyeon-map-import-review__remap\">\n <span>{item.sourceSvgId}</span>\n <label className=\"eyeon-map-rail__field\">\n Remap to\n <ModernSelect\n ariaLabel={`Remap ${item.sourceSvgId}`}\n value={remap[item.existingShapeId!] ?? ''}\n disabled={busy || buckets.added.length === 0}\n placeholder=\"Keep orphaned\"\n searchable\n options={[\n { value: '', label: 'Keep orphaned' },\n ...buckets.added.map((a) => ({\n value: a.sourceSvgId,\n label: a.sourceSvgId,\n })),\n ]}\n onChange={(next) =>\n setRemap((prev) => ({\n ...prev,\n [item.existingShapeId!]: next,\n }))\n }\n />\n </label>\n </div>\n ))}\n </section>\n )}\n\n {buckets.locked.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Geometry locked ({buckets.locked.length})\n </div>\n <p className=\"eyeon-map-rail__hint\">\n Portal edits win — kind/style may update, geometry will not.\n </p>\n {buckets.locked.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row\">\n <span>{item.sourceSvgId}</span>\n <span className=\"eyeon-map-rail__muted\">{bucketLabel(item.change)}</span>\n </div>\n ))}\n </section>\n )}\n\n {buckets.moved.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Moved ({buckets.moved.length})\n </div>\n <p className=\"eyeon-map-rail__hint\">\n Centroid drifted — check nearby walking paths after apply.\n </p>\n {buckets.moved.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row\">\n <span>{item.sourceSvgId}</span>\n </div>\n ))}\n </section>\n )}\n\n {diff.items.length === 0 && (\n <p className=\"eyeon-map-rail__hint\">No shape changes detected.</p>\n )}\n\n <div className=\"eyeon-map-rail__actions\">\n {onCancel ? (\n <button type=\"button\" disabled={busy} onClick={onCancel}>\n Cancel\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-floors__primary\"\n disabled={busy}\n onClick={() =>\n void onApply({\n acceptAll: true,\n remap: Object.entries(remap)\n .filter(([, to]) => Boolean(to))\n .map(([from, toSourceSvgId]) => ({\n fromShapeId: Number(from),\n toSourceSvgId,\n })),\n })\n }\n >\n {busy ? 'Applying…' : 'Apply import'}\n </button>\n </div>\n </div>\n );\n}\n"],"names":["isEditorSection","section","portalCenterSurface","host","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","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","c","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","setOpen","rootRef","popoverRef","nativeRef","lastSolid","transparent","menu","setMenu","solid","close","pickerValue","createPortal","TRANSPARENT_COLOR","ColorRow","onReset","display","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","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","compareBuildingFloors","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","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","menuPos","setMenuPos","updateMenuPos","spaceBelow","spaceAbove","maxHeight","openAbove","destinationKey","onDoc","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/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 { createPortal } from 'react-dom';\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 [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n const nativeRef = useRef<HTMLInputElement>(null);\n const lastSolid = useRef(\n hexColorInputValue(fallback || swatch),\n );\n const transparent =\n isTransparentColor(swatch) ||\n (emptyIsTransparent && !hex.trim());\n const [menu, setMenu] = useState<{ top: number; left: number } | null>(null);\n\n useEffect(() => {\n const solid = normalizeHexColor(swatch);\n if (solid) lastSolid.current = solid;\n }, [swatch]);\n\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target as Node;\n if (rootRef.current?.contains(target) || popoverRef.current?.contains(target)) {\n return;\n }\n setOpen(false);\n };\n const onKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false);\n };\n const close = () => setOpen(false);\n document.addEventListener('pointerdown', onPointerDown);\n document.addEventListener('keydown', onKey);\n document.addEventListener('scroll', close, true);\n return () => {\n document.removeEventListener('pointerdown', onPointerDown);\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('scroll', close, true);\n };\n }, [open]);\n\n const pickerValue = hexColorInputValue(transparent ? lastSolid.current : swatch);\n\n return (\n <div className=\"eyeon-map-assign__swatch\" ref={rootRef}>\n <input\n ref={nativeRef}\n type=\"color\"\n className=\"eyeon-map-assign__swatch-native\"\n disabled={disabled}\n tabIndex={-1}\n aria-hidden=\"true\"\n value={pickerValue}\n onChange={(e) => {\n lastSolid.current = e.target.value;\n onPick(e.target.value);\n }}\n />\n <button\n type=\"button\"\n className={\n transparent\n ? 'eyeon-map-assign__swatch-well is-transparent'\n : 'eyeon-map-assign__swatch-well'\n }\n disabled={disabled}\n aria-label={label}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n style={transparent ? undefined : { backgroundColor: hexColorInputValue(swatch) }}\n onClick={(event) => {\n if (open) {\n setOpen(false);\n return;\n }\n const rect = event.currentTarget.getBoundingClientRect();\n setMenu({ top: rect.bottom + 4, left: rect.left });\n setOpen(true);\n }}\n />\n {open && menu\n ? createPortal(\n <div\n ref={popoverRef}\n className=\"eyeon-map-assign__color-popover\"\n role=\"dialog\"\n aria-label={`${label} picker`}\n style={{ top: menu.top, left: menu.left }}\n >\n <button\n type=\"button\"\n className={\n transparent\n ? 'eyeon-map-assign__color-popover-well is-transparent'\n : 'eyeon-map-assign__color-popover-well'\n }\n disabled={disabled}\n aria-label={`Pick ${label}`}\n style={\n transparent\n ? undefined\n : { backgroundColor: pickerValue }\n }\n onClick={() => nativeRef.current?.click()}\n />\n <label>\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={transparent}\n onChange={(e) => {\n if (e.target.checked) {\n onPick(TRANSPARENT_COLOR);\n return;\n }\n onPick(lastSolid.current);\n }}\n />\n Transparent\n </label>\n </div>,\n document.body,\n )\n : null}\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={onChange}\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&rsquo;s walking paths.\n </li>\n <li>\n The artboard must stay the same size, otherwise the import is rejected.\n </li>\n </ul>\n </div>\n ) : null}\n {progress != null && (\n <div\n className=\"eyeon-map-floors__progress\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={progress}\n >\n <div className=\"eyeon-map-floors__progress-track\">\n <div\n className=\"eyeon-map-floors__progress-bar\"\n style={{ width: `${Math.min(100, Math.max(0, progress))}%` }}\n />\n </div>\n <span className=\"eyeon-map-floors__progress-label\">{progress}%</span>\n </div>\n )}\n {error ? <div className=\"eyeon-map-floors__error\">{error}</div> : null}\n {screen.mode === 'edit' && editing ? (\n <div className=\"eyeon-map-floors__edit-actions\">\n <div className=\"eyeon-map-floors__edit-row\">\n {onDeleteLevel && canManage ? (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__danger\"\n disabled={busy || deleting}\n onClick={() => setConfirmDeleteId(editing.id)}\n >\n Delete\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-floors__primary\"\n disabled={\n busy ||\n deleting ||\n !canManage ||\n (editing.kind !== 'outdoor' && !name.trim())\n }\n onClick={() => void submit()}\n >\n {busy\n ? progress != null\n ? `${primaryBusyLabel} ${progress}%`\n : 'Saving…'\n : file\n ? isOutdoorForm\n ? 'Upload & Save'\n : 'Import & Save'\n : 'Save Changes'}\n </button>\n </div>\n </div>\n ) : (\n <div className=\"eyeon-map-rail__actions\">\n <button\n type=\"button\"\n className=\"eyeon-map-floors__primary\"\n disabled={\n busy ||\n deleting ||\n !canManage ||\n (isOutdoorForm ? !file : !name.trim() || !file)\n }\n onClick={() => void submit()}\n >\n {busy\n ? progress != null\n ? `${primaryBusyLabel} ${progress}%`\n : `${primaryBusyLabel}…`\n : primaryLabel}\n </button>\n </div>\n )}\n {renderDeleteModal()}\n </div>\n );\n }\n\n return (\n <div className={['eyeon-map-floors', drag ? 'is-reordering' : ''].filter(Boolean).join(' ')}>\n <div className=\"eyeon-map-floors__block\">\n {canManage && (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__add\"\n onClick={() => onScreenChange({ mode: 'add-floor' })}\n >\n Add Floor\n </button>\n )}\n {displayFloors.length === 0 ? (\n <p className=\"eyeon-map-rail__hint\">No floors yet.</p>\n ) : (\n <div ref={floorListRef} className=\"eyeon-map-floors__list\">\n {displayFloors.map((level) => (\n <div\n key={level.id}\n data-floor-id={level.id}\n className=\"eyeon-map-floors__entry\"\n >\n <div\n className={[\n 'eyeon-map-floors__row',\n drag?.id === level.id ? 'is-placeholder' : '',\n confirmDeleteId === level.id ? 'is-confirm' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {canReorder ? (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__grip\"\n title=\"Drag to reorder\"\n aria-label={`Reorder ${level.name}`}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => {\n if (e.button !== 0) return;\n startDrag(level, e);\n }}\n >\n <GripIcon />\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-floors__item\"\n onClick={() => {\n if (drag) return;\n openEdit(level);\n }}\n >\n {level.name}\n </button>\n {renderRowDelete(level)}\n </div>\n </div>\n ))}\n {lineTop == null ? null : (\n <div\n className=\"eyeon-map-floors__drop-line\"\n style={{ top: lineTop }}\n />\n )}\n </div>\n )}\n </div>\n\n <div className=\"eyeon-map-floors__block\">\n {outdoorReady && outdoor ? (\n <div className=\"eyeon-map-floors__entry\">\n <div\n className={[\n 'eyeon-map-floors__row',\n confirmDeleteId === outdoor.id ? 'is-confirm' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <button\n type=\"button\"\n className=\"eyeon-map-floors__item\"\n onClick={() => openEdit(outdoor)}\n >\n Outdoor SVG\n </button>\n {renderRowDelete(outdoor)}\n </div>\n </div>\n ) : canManage ? (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__add\"\n onClick={() => onScreenChange({ mode: 'add-base' })}\n >\n Add Outdoor SVG\n </button>\n ) : null}\n </div>\n {error ? <div className=\"eyeon-map-floors__error\">{error}</div> : null}\n {renderDeleteModal()}\n {drag\n ? createPortal(\n <div\n ref={ghostRef}\n className=\"eyeon-map-floors__row eyeon-map-floors__row--ghost\"\n style={{\n left: drag.x,\n top: drag.y,\n width: drag.width,\n height: drag.height,\n }}\n >\n <span className=\"eyeon-map-floors__grip\" aria-hidden=\"true\">\n <GripIcon />\n </span>\n <span className=\"eyeon-map-floors__item\">{drag.name}</span>\n <span className=\"eyeon-map-floors__icon-danger\" aria-hidden=\"true\">\n <TrashIcon />\n </span>\n </div>,\n document.body,\n )\n : null}\n </div>\n );\n}\n","import React, { useEffect, useMemo, useState, type ReactNode } from 'react';\nimport {\n clampStoreRadius,\n 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={onChange}\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={(next) => onCommit(next)}\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, same contract as v1 `IMAGE_PROXY_URL` (base + encoded\n * URL). Required whenever the outdoor SVG is served from a origin that does\n * not send CORS headers, otherwise its decoration silently fails to load.\n */\n imageProxyUrl?: string | null;\n className?: string;\n /** Quiet extra actions under the left rail (e.g. developer Classic Map). */\n sidebarFooter?: ReactNode;\n /** 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","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","c","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","setOpen","rootRef","popoverRef","nativeRef","lastSolid","transparent","menu","setMenu","solid","close","pickerValue","createPortal","TRANSPARENT_COLOR","ColorRow","onReset","display","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","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","menuPos","setMenuPos","updateMenuPos","spaceBelow","spaceAbove","maxHeight","openAbove","destinationKey","onDoc","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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"}