@eyeon/map 2.0.19 → 2.0.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/assets/MapViewer.css +1 -1
  2. package/dist/assets/index.css +1 -1
  3. package/dist/chunks/MapViewer.js +449 -446
  4. package/dist/chunks/MapViewer.js.map +1 -1
  5. package/dist/chunks/responsive.js +967 -929
  6. package/dist/chunks/responsive.js.map +1 -1
  7. package/dist/chunks/wheelZoom.js +33 -33
  8. package/dist/chunks/wheelZoom.js.map +1 -1
  9. package/dist/core/assignment.d.ts +6 -2
  10. package/dist/core/assignment.d.ts.map +1 -1
  11. package/dist/core/index.js +185 -183
  12. package/dist/core/layerStyles.d.ts +19 -5
  13. package/dist/core/layerStyles.d.ts.map +1 -1
  14. package/dist/core/types.d.ts +1 -1
  15. package/dist/core/types.d.ts.map +1 -1
  16. package/dist/editor/GridPrefsControl.d.ts +16 -0
  17. package/dist/editor/GridPrefsControl.d.ts.map +1 -0
  18. package/dist/editor/MapEditor.d.ts +17 -1
  19. package/dist/editor/MapEditor.d.ts.map +1 -1
  20. package/dist/editor/canvas/EditorCanvas.d.ts +5 -1
  21. package/dist/editor/canvas/EditorCanvas.d.ts.map +1 -1
  22. package/dist/editor/canvas/editorHover.d.ts +12 -0
  23. package/dist/editor/canvas/editorHover.d.ts.map +1 -1
  24. package/dist/editor/dirty.d.ts +24 -0
  25. package/dist/editor/dirty.d.ts.map +1 -0
  26. package/dist/editor/draftOps.d.ts.map +1 -1
  27. package/dist/editor/geometryEdit.d.ts +2 -0
  28. package/dist/editor/geometryEdit.d.ts.map +1 -1
  29. package/dist/editor/index.css +70 -4
  30. package/dist/editor/index.d.ts +1 -0
  31. package/dist/editor/index.d.ts.map +1 -1
  32. package/dist/editor/index.js +4326 -3923
  33. package/dist/editor/index.js.map +1 -1
  34. package/dist/editor/labels.d.ts.map +1 -1
  35. package/dist/editor/ortho.d.ts +20 -0
  36. package/dist/editor/ortho.d.ts.map +1 -0
  37. package/dist/editor/panels/AssignForm.d.ts.map +1 -1
  38. package/dist/editor/panels/EntranceIconForm.d.ts.map +1 -1
  39. package/dist/editor/panels/LeftRail.d.ts +1 -1
  40. package/dist/editor/panels/LeftRail.d.ts.map +1 -1
  41. package/dist/editor/railAssignments.d.ts +5 -1
  42. package/dist/editor/railAssignments.d.ts.map +1 -1
  43. package/dist/editor/railListCopy.d.ts +1 -1
  44. package/dist/editor/railListCopy.d.ts.map +1 -1
  45. package/dist/editor/routeStubs.d.ts +10 -0
  46. package/dist/editor/routeStubs.d.ts.map +1 -1
  47. package/dist/editor/shapeCopy.d.ts.map +1 -1
  48. package/dist/editor/tools.d.ts +12 -4
  49. package/dist/editor/tools.d.ts.map +1 -1
  50. package/dist/viewer/components/SvgVectorLayer.d.ts.map +1 -1
  51. package/dist/viewer/index.js +2 -2
  52. package/dist/viewer/pointer.d.ts.map +1 -1
  53. package/package.json +4 -4
  54. package/dist/test-maps/shops-at-south-town/BASE - Shops At South Town.ai +42 -26689
  55. package/dist/test-maps/shops-at-south-town/LF - Shops At South Town.ai +0 -4459
  56. package/dist/test-maps/shops-at-south-town/SVG/BASE - Shops At South Town.svg +0 -567
  57. package/dist/test-maps/shops-at-south-town/SVG/LF - Shops At South Town.svg +0 -238
  58. package/dist/test-maps/shops-at-south-town/SVG/escalator.svg +0 -13
  59. package/dist/test-maps/shops-at-south-town/UF - Shops At South Town.ai +2 -4130
@@ -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/assignmentOverlay.ts","../../src/editor/canvas/AssignedShapeOverlay.tsx","../../src/editor/canvas/OutdoorSvgUnderlay.tsx","../../src/editor/canvas/underlayHint.ts","../../src/editor/routeStubs.ts","../../src/editor/canvas/EditorCanvas.tsx","../../src/editor/connectorAssignments.ts","../../src/editor/draftOps.ts","../../src/editor/FieldResetButton.tsx","../../src/editor/hexColor.ts","../../src/editor/panels/formRows.tsx","../../src/editor/panels/AssignmentStyleFields.tsx","../../src/editor/panels/ConnectorAssign.tsx","../../src/editor/labels.ts","../../src/editor/railAssignments.ts","../../src/editor/railKiosks.ts","../../src/editor/railListCopy.ts","../../src/editor/panels/FloorsPanel.tsx","../../src/editor/panels/LeftRail.tsx","../../src/editor/panels/CatalogKioskForm.tsx","../../src/editor/shapeCopy.ts","../../src/editor/panels/AssignForm.tsx","../../src/editor/panels/BulkAssignForm.tsx","../../src/editor/panels/CopyToLevelButton.tsx","../../src/editor/panels/EntranceIconForm.tsx","../../src/editor/panels/TextLabelForm.tsx","../../src/editor/panels/Inspector.tsx","../../src/editor/panels/PreviewOverlay.tsx","../../src/editor/shapeSelection.ts","../../src/editor/previewDocument.ts","../../src/editor/editorSectionReturn.ts","../../src/editor/floorsListReturn.ts","../../src/editor/MapEditor.tsx","../../src/editor/panels/ImportReviewPanel.tsx"],"sourcesContent":["import {\n defaultViewerLevelId,\n floorSwitcherLevels,\n type MapEditorHost,\n type StackLevel,\n} from '../core';\nimport type { RailSection } from './panels/LeftRail';\n\n/** What occupies the PORTAL center pane (rail is always Map options). */\nexport type PortalCenterSurface = 'viewer' | 'editor';\n\n/** Geometry canvas: Edit Map (shapes) or Wayfinding (routes). */\nexport function isEditorSection(section: RailSection | null): boolean {\n return section === 'edit-map' || section === 'wayfinding';\n}\n\n/**\n * PORTAL default is MapViewer (assign on the real map, no editor grid).\n * Edit Map and Wayfinding swap in EditorCanvas + grid. Non-PORTAL editor\n * hosts stay on the geometry canvas.\n */\nexport function portalCenterSurface(\n host: MapEditorHost,\n section: RailSection | null,\n): PortalCenterSurface {\n if (host === 'PORTAL' && !isEditorSection(section)) return 'viewer';\n return 'editor';\n}\n\n/** Building floors only — Outdoor is not routed. */\nexport function wayfindingSelectableLevels<T extends StackLevel>(levels: T[]): T[] {\n return floorSwitcherLevels(levels);\n}\n\n/** Floors in admin list order, then Outdoor at the bottom. */\nexport function editMapSelectableLevels<T extends StackLevel>(levels: T[]): T[] {\n const outdoor = levels.filter((level) => level.kind === 'outdoor');\n return [...floorSwitcherLevels(levels), ...outdoor];\n}\n\n/** Lowest building floor (bottom of the Floors list). */\nexport function defaultEditorFloorId(levels: StackLevel[]): number | null {\n return floorSwitcherLevels(levels).at(-1)?.id ?? null;\n}\n\n/**\n * Wayfinding always opens on the ground floor (bottom of the Floors list),\n * not Outdoor or the floor last used in Edit Map.\n */\nexport function levelIdOnEnterWayfinding(levels: StackLevel[]): number | null {\n return (\n defaultEditorFloorId(levels) ??\n levels.find((level) => level.kind === 'outdoor')?.id ??\n null\n );\n}\n\n/** Edit Map opens on the lowest building floor; Outdoor only if there are no floors. */\nexport function levelIdOnEnterEditMap(levels: StackLevel[]): number | null {\n return (\n defaultEditorFloorId(levels) ??\n levels.find((level) => level.kind === 'outdoor')?.id ??\n null\n );\n}\n\n/**\n * PORTAL default map always lands on the ground floor. Outdoor as the\n * active level hides building floors (`viewerLevelStack`).\n */\nexport function levelIdOnEnterDefaultMap(levels: StackLevel[]): number | null {\n return defaultViewerLevelId(levels);\n}\n\n/**\n * Top-right floor switcher. Edit Map lists floors then Outdoor.\n * Wayfinding lists building floors only.\n */\nexport function editorFloorControlLevels<T extends StackLevel & { name: string }>(\n section: RailSection | null,\n levels: T[],\n): Array<{ id: number; name: string }> {\n const selected =\n section === 'wayfinding'\n ? wayfindingSelectableLevels(levels)\n : editMapSelectableLevels(levels);\n return selected.map((level) => ({\n id: level.id,\n name: level.kind === 'outdoor' ? 'Outdoor' : level.name,\n }));\n}\n\n/** Outdoor can be viewed in Wayfinding but routes and drawing stay off. */\nexport function wayfindingOutdoorReadOnly(\n section: RailSection | null,\n level: { kind?: string } | null | undefined,\n): boolean {\n return section === 'wayfinding' && level?.kind === 'outdoor';\n}\n","import type { BatchOp } from '../core';\n\nexport const EDITOR_HISTORY_LIMIT = 100;\n\nexport type EditorHistorySnapshot = {\n ops: BatchOp[];\n nextTempId: number;\n selectedShapeId: number | null;\n selectedAnchorIds: number[];\n};\n\nexport type EditorHistory = {\n past: EditorHistorySnapshot[];\n future: EditorHistorySnapshot[];\n};\n\nexport function emptyEditorHistory(): EditorHistory {\n return { past: [], future: [] };\n}\n\nexport function cloneHistorySnapshot(\n snapshot: EditorHistorySnapshot,\n): EditorHistorySnapshot {\n return {\n ops: snapshot.ops.map((op) => JSON.parse(JSON.stringify(op)) as BatchOp),\n nextTempId: snapshot.nextTempId,\n selectedShapeId: snapshot.selectedShapeId,\n selectedAnchorIds: [...snapshot.selectedAnchorIds],\n };\n}\n\nexport function pushEditorHistory(\n history: EditorHistory,\n current: EditorHistorySnapshot,\n): EditorHistory {\n return {\n past: [...history.past, cloneHistorySnapshot(current)].slice(-EDITOR_HISTORY_LIMIT),\n future: [],\n };\n}\n\nexport function undoEditorHistory(\n history: EditorHistory,\n current: EditorHistorySnapshot,\n): { history: EditorHistory; restored: EditorHistorySnapshot } | null {\n if (history.past.length === 0) return null;\n const restored = history.past[history.past.length - 1];\n return {\n history: {\n past: history.past.slice(0, -1),\n future: [...history.future, cloneHistorySnapshot(current)],\n },\n restored: cloneHistorySnapshot(restored),\n };\n}\n\nexport function redoEditorHistory(\n history: EditorHistory,\n current: EditorHistorySnapshot,\n): { history: EditorHistory; restored: EditorHistorySnapshot } | null {\n if (history.future.length === 0) return null;\n const restored = history.future[history.future.length - 1];\n return {\n history: {\n past: [...history.past, cloneHistorySnapshot(current)],\n future: history.future.slice(0, -1),\n },\n restored: cloneHistorySnapshot(restored),\n };\n}\n\nexport function isEditableTypingTarget(target: EventTarget | null): boolean {\n if (target == null || typeof target !== 'object') return false;\n const el = target as { tagName?: string; isContentEditable?: boolean };\n const tag = el.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true;\n return Boolean(el.isContentEditable);\n}\n\ntype HotkeyEvent = Pick<\n KeyboardEvent,\n 'key' | 'metaKey' | 'ctrlKey' | 'shiftKey' | 'altKey'\n>;\n\n/** Ctrl/Cmd+Z — Windows, Linux, and macOS undo. */\nexport function isEditorUndoHotkey(e: HotkeyEvent): boolean {\n if (e.altKey || e.shiftKey) return false;\n if (!(e.metaKey || e.ctrlKey)) return false;\n return e.key === 'z' || e.key === 'Z';\n}\n\n/** Ctrl/Cmd+Shift+Z or Ctrl/Cmd+Y — redo on every desktop OS. */\nexport function isEditorRedoHotkey(e: HotkeyEvent): boolean {\n if (e.altKey) return false;\n if (!(e.metaKey || e.ctrlKey)) return false;\n const key = e.key.toLowerCase();\n if (key === 'z' && e.shiftKey) return true;\n return key === 'y' && !e.shiftKey;\n}\n","import React from 'react';\n\nexport type EditorTool =\n | 'select'\n | 'pan'\n | 'draw-unit'\n | 'draw-polygon'\n | 'draw-circle'\n | 'draw-void'\n | 'draw-void-circle'\n | 'curve'\n | 'split-join'\n | 'draw-text'\n | 'draw-entrance'\n | 'draw-route'\n | 'create-route'\n | 'create-route-multi';\n\nexport const EDITOR_TOOLS: Array<{\n id: EditorTool;\n label: string;\n draw?: boolean;\n /** Route tools sit after a separator, apart from shape tools. */\n group?: 'map' | 'route';\n /** When set, the label is shown beside the icon instead of only as a tooltip. */\n caption?: string;\n /** Draw a toolbar separator immediately before this tool. */\n sepBefore?: boolean;\n}> = [\n { id: 'select', label: 'Select', group: 'map' },\n { id: 'pan', label: 'Pan', group: 'map' },\n { id: 'draw-unit', label: 'Draw rectangle', draw: true, group: 'map' },\n { id: 'draw-polygon', label: 'Draw polygon', draw: true, group: 'map' },\n { id: 'draw-circle', label: 'Draw circle', draw: true, group: 'map' },\n { id: 'curve', label: 'Curve', draw: true, group: 'map' },\n { id: 'split-join', label: 'Split / Join', draw: true, group: 'map' },\n { id: 'draw-text', label: 'Text', draw: true, group: 'map' },\n { id: 'draw-entrance', label: 'Entrance', draw: true, group: 'map' },\n {\n id: 'draw-void',\n label: 'Open to Below',\n draw: true,\n group: 'map',\n sepBefore: true,\n },\n {\n id: 'draw-void-circle',\n label: 'Open to Below circle',\n draw: true,\n group: 'map',\n },\n {\n id: 'draw-route',\n label: 'Wayfinding Routes',\n draw: true,\n group: 'route',\n },\n {\n id: 'create-route',\n label: 'Create Route',\n draw: true,\n group: 'route',\n },\n {\n id: 'create-route-multi',\n label: 'Multi Route',\n draw: true,\n group: 'route',\n },\n];\n\nexport function isRouteTool(tool: string): boolean {\n return (\n tool === 'draw-route' ||\n tool === 'create-route' ||\n tool === 'create-route-multi'\n );\n}\n\n/** Empty-canvas clicks start a new path with Create Route or Multi Route. */\nexport function canPlaceNewRoute(tool: string): boolean {\n return tool === 'create-route' || tool === 'create-route-multi';\n}\n\n/** Multi Route keeps adding segments until Esc or another tool. */\nexport function canChainRoute(tool: string): boolean {\n return tool === 'create-route-multi';\n}\n\n/** After a segment is committed, keep the end only for Multi Route. */\nexport function nextRouteChainAnchor(\n tool: string,\n endAnchorId: number | null | undefined,\n): number | null {\n if (!canChainRoute(tool)) return null;\n return typeof endAnchorId === 'number' ? endAnchorId : null;\n}\n\nconst ICON_PROPS = {\n width: 16,\n height: 16,\n viewBox: '0 0 16 16',\n fill: 'none',\n 'aria-hidden': true,\n} as const;\n\nfunction SelectIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M3.2 2.4 12.4 8.1l-4.1.6 1.8 4.6-1.8.7-1.8-4.6-2.6 2.4z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\nfunction PanIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M4.15 8.05V6.7a.95.95 0 0 1 1.9 0V8.15M6.05 7.2V4.1a.95.95 0 1 1 1.9 0V7.05M7.95 6.9V3.2a.95.95 0 1 1 1.9 0V6.95M9.85 7V3.9a.95.95 0 1 1 1.9 0v5.05c0 2.05-1.5 3.4-3.6 3.4-1.75 0-3.15-1.05-3.35-2.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.45\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction DrawRectIcon() {\n return (\n <svg {...ICON_PROPS}>\n <rect\n x=\"2.5\"\n y=\"3.5\"\n width=\"11\"\n height=\"9\"\n rx=\"1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n />\n </svg>\n );\n}\n\nfunction DrawPolygonIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M8 2.5 13.2 6.2 11.2 12.5H4.8L2.8 6.2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction DrawCircleIcon() {\n return (\n <svg {...ICON_PROPS}>\n <ellipse\n cx=\"8\"\n cy=\"8\"\n rx=\"5.4\"\n ry=\"5.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.55\"\n />\n </svg>\n );\n}\n\nfunction DrawOpeningIcon() {\n return (\n <svg {...ICON_PROPS}>\n <rect\n x=\"2.4\"\n y=\"2.4\"\n width=\"11.2\"\n height=\"11.2\"\n rx=\"1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <rect\n x=\"5.1\"\n y=\"5.1\"\n width=\"5.8\"\n height=\"5.8\"\n rx=\"0.6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeDasharray=\"1.6 1.15\"\n />\n </svg>\n );\n}\n\nfunction DrawOpeningCircleIcon() {\n return (\n <svg {...ICON_PROPS}>\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"5.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"2.7\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeDasharray=\"1.6 1.15\"\n />\n </svg>\n );\n}\n\nfunction CurveIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M2.3 11.6 C4.6 2.4 6.4 2.4 8 8 S11.4 13.6 13.7 4.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n <circle cx=\"2.3\" cy=\"11.6\" r=\"1.35\" fill=\"currentColor\" />\n <circle cx=\"13.7\" cy=\"4.4\" r=\"1.35\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction SplitJoinIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M1.7 8H5.2M10.8 8h3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.55\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"6.15\" cy=\"8\" r=\"1.25\" fill=\"currentColor\" />\n <circle cx=\"9.85\" cy=\"8\" r=\"1.25\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction DrawTextIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M3 4.2h10M8 4.2V13\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M5.2 13h5.6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction DrawEntranceIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M5.4 2.8h6.4A2.8 2.8 0 0 1 14.6 5.6v4.8a2.8 2.8 0 0 1-2.8 2.8H5.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.55\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M1.7 8h8.1M7.3 5.15 10.4 8l-3.1 2.85\"\n stroke=\"currentColor\"\n strokeWidth=\"1.55\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction DrawRouteIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M3.5 12.5c2.2-3.4 3.2-3.6 4.5-3.6 1.6 0 2.2 1.8 4.5 1.8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"3.5\" cy=\"12.5\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"8\" cy=\"8.9\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"12.5\" cy=\"10.7\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction CreateRouteIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M2.8 12c1.7-2.6 3-3.3 4.8-3.3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"2.8\" cy=\"12\" r=\"1.35\" fill=\"currentColor\" />\n <path\n d=\"M11.2 3.4v6.2M8.1 6.5h6.2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction CreateRouteMultiIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M2.8 12.2 6.2 6.4 9.6 9.6 13.2 3.6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"2.8\" cy=\"12.2\" r=\"1.35\" fill=\"currentColor\" />\n <circle cx=\"6.2\" cy=\"6.4\" r=\"1.35\" fill=\"currentColor\" />\n <circle cx=\"9.6\" cy=\"9.6\" r=\"1.35\" fill=\"currentColor\" />\n <circle cx=\"13.2\" cy=\"3.6\" r=\"1.35\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction UndoIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M3.5 7.5H9a3.5 3.5 0 1 1 0 7H7.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M6 4.5 3 7.5 6 10.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction RedoIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M12.5 7.5H7a3.5 3.5 0 1 0 0 7h1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M10 4.5 13 7.5 10 10.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nconst TOOL_ICONS: Record<EditorTool, () => React.ReactElement> = {\n select: SelectIcon,\n pan: PanIcon,\n 'draw-unit': DrawRectIcon,\n 'draw-polygon': DrawPolygonIcon,\n 'draw-circle': DrawCircleIcon,\n 'draw-void': DrawOpeningIcon,\n 'draw-void-circle': DrawOpeningCircleIcon,\n curve: CurveIcon,\n 'split-join': SplitJoinIcon,\n 'draw-text': DrawTextIcon,\n 'draw-entrance': DrawEntranceIcon,\n 'draw-route': DrawRouteIcon,\n 'create-route': CreateRouteIcon,\n 'create-route-multi': CreateRouteMultiIcon,\n};\n\n/** Select and Curve can click a shape to make it the edit target. */\nexport function canSelectShapes(tool: EditorTool): boolean {\n return tool === 'select' || tool === 'curve' || tool === 'split-join';\n}\n\nexport function isSplitJoinTool(tool: EditorTool): boolean {\n return tool === 'split-join';\n}\n\n/** Click-to-place closed polygons — stores or atrium openings. */\nexport function isPolygonDrawTool(tool: EditorTool): boolean {\n return tool === 'draw-polygon' || tool === 'draw-void';\n}\n\n/** Click-drag oval / circle — stores or Open to Below. */\nexport function isEllipseDrawTool(tool: EditorTool): boolean {\n return tool === 'draw-circle' || tool === 'draw-void-circle';\n}\n\n/** Rectangle, polygon, circle, and Open to Below — plus cursor for placement. */\nexport function isShapeDrawTool(tool: EditorTool): boolean {\n return (\n tool === 'draw-unit' ||\n tool === 'draw-polygon' ||\n tool === 'draw-circle' ||\n tool === 'draw-void' ||\n tool === 'draw-void-circle'\n );\n}\n\n/** Click-to-place text or entrance stamps. */\nexport function isStampDrawTool(tool: EditorTool): boolean {\n return tool === 'draw-text' || tool === 'draw-entrance';\n}\n\n/** Click two open ends to join them — Select after a split, or Split / Join. */\nexport function canJoinOpenEnds(tool: EditorTool): boolean {\n return tool === 'select' || tool === 'split-join';\n}\n\n/** Corner anchors — Select, Curve, and Split / Join. */\nexport function showsShapeAnchors(tool: EditorTool): boolean {\n return tool === 'select' || tool === 'curve' || tool === 'split-join';\n}\n\n/** Midpoint bend dots and cubic handles — only the Curve tool. */\nexport function showsCurveHandles(tool: EditorTool): boolean {\n return tool === 'curve';\n}\n\n/** Empty-canvas drag pans in Select, Curve, Pan, and Wayfinding edit. */\nexport function emptyCanvasDragPans(tool: EditorTool): boolean {\n return (\n tool === 'select' ||\n tool === 'curve' ||\n tool === 'split-join' ||\n tool === 'pan' ||\n tool === 'draw-route'\n );\n}\n\n/** Create Route or Multi Route again returns to Select. */\nexport function nextEditorTool(current: EditorTool, next: EditorTool): EditorTool {\n if (next === current && canPlaceNewRoute(next)) return 'select';\n return next;\n}\n\nexport function toolHint(tool: EditorTool, group?: 'map' | 'route'): string {\n if (group === 'route') {\n switch (tool) {\n case 'create-route':\n return 'Click two points to create one route. Click two more to add another. Esc or Undo steps back.';\n case 'create-route-multi':\n return 'Keep clicking to add connected routes. Esc or Undo steps back without changing the tool.';\n case 'pan':\n return 'Drag the map to move around. Walking paths stay on the selected floor.';\n case 'select':\n default:\n return 'Click a store to mark its destination. Drag empty space to pan. Use Create Route or Multi Route in the toolbar to draw walking paths.';\n }\n }\n switch (tool) {\n case 'pan':\n return 'Drag the map to move around.';\n case 'draw-unit':\n return 'Click and drag to draw a store rectangle.';\n case 'draw-polygon':\n return 'Click to place points. Hover an existing anchor to snap to it. Click the first point or press Enter to close. Esc cancels.';\n case 'draw-circle':\n return 'Click and drag to draw an oval. Hold Shift to keep it a circle.';\n case 'draw-void':\n return 'Draw an Open to Below to look through to the floor below. Click to place points, then click the first point or press Enter to close. Esc cancels.';\n case 'draw-void-circle':\n return 'Click and drag an oval Open to Below to look through to the floor below. Hold Shift to keep it a circle.';\n case 'curve':\n return 'Select a shape to see its anchors. Drag a midpoint to pull an arch, then use the two handles to fine-tune. Double-click a handle to flatten it back to a line.';\n case 'split-join':\n return 'Click a wall to split it open. Click an open end to switch to Select and join it to another end. To merge, click the shared wall on each store.';\n case 'draw-text':\n return 'Click the map to place text. Click existing text to select it.';\n case 'draw-entrance':\n return 'Click the map to place an entrance marker. Click an existing marker to select it.';\n case 'draw-route':\n return '';\n case 'create-route':\n return 'Click two points to create one route. Click two more to add another. Esc or Undo steps back.';\n case 'create-route-multi':\n return 'Keep clicking to add connected routes. Esc or Undo steps back without changing the tool.';\n case 'select':\n default:\n return 'Click a shape to select it. Drag empty space to pan. Drag a shape to move it. Hover a side to highlight it, then click to add an anchor. Click and drag a side to move both ends and expand the shape. Double-click an anchor to delete it. Click two open endpoints to join them.';\n }\n}\n\nexport interface EditorToolButtonsProps {\n tool: EditorTool;\n onToolChange: (tool: EditorTool) => void;\n canEdit: boolean;\n /** Omit to show every tool. PORTAL Edit Map is `map`; Wayfinding is `route`. */\n group?: 'map' | 'route';\n}\n\nexport function EditorToolButtons({\n tool,\n onToolChange,\n canEdit,\n group,\n}: EditorToolButtonsProps) {\n const mapTools = EDITOR_TOOLS.filter((t) => t.group !== 'route');\n const routeTools = EDITOR_TOOLS.filter(\n (t) => t.group === 'route' && t.id !== 'draw-route',\n );\n const showMap = group !== 'route';\n const showRoute = group !== 'map';\n const selectTool = EDITOR_TOOLS.find((t) => t.id === 'select');\n const routeToolbar =\n group === 'route' && selectTool ? [selectTool, ...routeTools] : routeTools;\n\n const renderButton = (t: (typeof EDITOR_TOOLS)[number]) => {\n const Icon = TOOL_ICONS[t.id];\n return (\n <button\n key={t.id}\n type=\"button\"\n className={`eyeon-map-editor__tool-icon${t.caption ? ' eyeon-map-editor__tool-icon--labeled' : ''}${tool === t.id ? ' is-active' : ''}`}\n data-tooltip={t.caption ? undefined : t.label}\n aria-label={t.label}\n aria-pressed={tool === t.id}\n onClick={() => onToolChange(t.id)}\n disabled={!canEdit && t.draw}\n >\n <Icon />\n {t.caption ? (\n <span className=\"eyeon-map-editor__tool-caption\">{t.caption}</span>\n ) : null}\n </button>\n );\n };\n\n return (\n <div className=\"eyeon-map-editor__tool-icons\" role=\"toolbar\" aria-label=\"Map tools\">\n {showMap\n ? mapTools.map((t) => (\n <React.Fragment key={t.id}>\n {t.sepBefore ? (\n <span className=\"eyeon-map-editor__tool-sep\" aria-hidden=\"true\" />\n ) : null}\n {renderButton(t)}\n </React.Fragment>\n ))\n : null}\n {showMap && showRoute ? (\n <span className=\"eyeon-map-editor__tool-sep\" aria-hidden=\"true\" />\n ) : null}\n {showRoute ? routeToolbar.map(renderButton) : null}\n </div>\n );\n}\n\nexport interface EditorHistoryButtonsProps {\n canUndo: boolean;\n canRedo: boolean;\n disabled?: boolean;\n onUndo: () => void;\n onRedo: () => void;\n}\n\nexport function EditorHistoryButtons({\n canUndo,\n canRedo,\n disabled = false,\n onUndo,\n onRedo,\n}: EditorHistoryButtonsProps) {\n return (\n <div className=\"eyeon-map-editor__history\" role=\"group\" aria-label=\"Undo and redo\">\n <button\n type=\"button\"\n className=\"eyeon-map-editor__tool-icon\"\n data-tooltip=\"Undo\"\n aria-label=\"Undo\"\n onClick={onUndo}\n disabled={disabled || !canUndo}\n >\n <UndoIcon />\n </button>\n <button\n type=\"button\"\n className=\"eyeon-map-editor__tool-icon\"\n data-tooltip=\"Redo\"\n aria-label=\"Redo\"\n onClick={onRedo}\n disabled={disabled || !canRedo}\n >\n <RedoIcon />\n </button>\n </div>\n );\n}\n","import type { ShapeGeometry, Vec2 } from '../core';\nimport {\n approximateCubic,\n buildGeometryFromPaths,\n distance,\n projectOntoSegment,\n tokenizePathData,\n} from '../core';\n\nexport type PathEdge =\n | { kind: 'line' }\n | { kind: 'cubic'; c1: Vec2; c2: Vec2 };\n\n/** One closed or open subpath as corner anchors + one edge between each pair. */\nexport interface PathRing {\n closed: boolean;\n anchors: Vec2[];\n /** `edges[i]` runs from `anchors[i]` to the next anchor (wraps when closed). */\n edges: PathEdge[];\n}\n\nconst EPS = 1e-4;\n\nexport function vecEq(a: Vec2, b: Vec2, eps = EPS): boolean {\n return Math.abs(a.x - b.x) <= eps && Math.abs(a.y - b.y) <= eps;\n}\n\nexport function cloneVec(p: Vec2): Vec2 {\n return { x: p.x, y: p.y };\n}\n\nexport function addVec(a: Vec2, b: Vec2): Vec2 {\n return { x: a.x + b.x, y: a.y + b.y };\n}\n\nexport function subVec(a: Vec2, b: Vec2): Vec2 {\n return { x: a.x - b.x, y: a.y - b.y };\n}\n\nexport function scaleVec(a: Vec2, s: number): Vec2 {\n return { x: a.x * s, y: a.y * s };\n}\n\nexport function lerpVec(a: Vec2, b: Vec2, t: number): Vec2 {\n return { x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t };\n}\n\nexport function edgeCount(ring: PathRing): number {\n if (ring.anchors.length < 2) return 0;\n return ring.closed ? ring.anchors.length : ring.anchors.length - 1;\n}\n\nexport function edgeFrom(ring: PathRing, edgeIndex: number): Vec2 {\n return ring.anchors[edgeIndex];\n}\n\nexport function edgeTo(ring: PathRing, edgeIndex: number): Vec2 {\n return ring.anchors[(edgeIndex + 1) % ring.anchors.length];\n}\n\nexport function edgeToPathD(ring: PathRing, edgeIndex: number): string {\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex];\n if (edge?.kind === 'cubic') {\n return `M ${from.x} ${from.y} C ${edge.c1.x} ${edge.c1.y} ${edge.c2.x} ${edge.c2.y} ${to.x} ${to.y}`;\n }\n return `M ${from.x} ${from.y} L ${to.x} ${to.y}`;\n}\n\nexport function fmtCoord(n: number): string {\n const r = Math.round(n * 1000) / 1000;\n return Object.is(r, -0) ? '0' : String(r);\n}\n\nexport function ringFromPolygon(poly: Vec2[], closed = true): PathRing {\n const anchors = poly.map(cloneVec);\n if (\n anchors.length > 1 &&\n vecEq(anchors[0], anchors[anchors.length - 1])\n ) {\n anchors.pop();\n }\n const edges: PathEdge[] = anchors.map(() => ({ kind: 'line' }));\n if (!closed && edges.length > 0) edges.pop();\n return { closed, anchors, edges };\n}\n\n/**\n * Quadratic (p0, q, p2) → cubic handles.\n */\nexport function quadraticToCubic(p0: Vec2, q: Vec2, p2: Vec2): {\n c1: Vec2;\n c2: Vec2;\n} {\n return {\n c1: lerpVec(p0, q, 2 / 3),\n c2: lerpVec(p2, q, 2 / 3),\n };\n}\n\n/**\n * Symmetric cubic that passes through `pull` at t = 0.5.\n * Used when the user drags a straight side into an arch.\n */\nexport function cubicHandlesForPull(from: Vec2, to: Vec2, pull: Vec2): {\n c1: Vec2;\n c2: Vec2;\n} {\n const mid = lerpVec(from, to, 0.5);\n const offset = scaleVec(subVec(pull, mid), 4 / 3);\n const chord = subVec(to, from);\n return {\n c1: addVec(addVec(from, scaleVec(chord, 1 / 3)), offset),\n c2: addVec(addVec(from, scaleVec(chord, 2 / 3)), offset),\n };\n}\n\nexport function cubicPoint(p0: Vec2, c1: Vec2, c2: Vec2, p3: Vec2, t: number): Vec2 {\n const u = 1 - t;\n return {\n x: u * u * u * p0.x + 3 * u * u * t * c1.x + 3 * u * t * t * c2.x + t * t * t * p3.x,\n y: u * u * u * p0.y + 3 * u * u * t * c1.y + 3 * u * t * t * c2.y + t * t * t * p3.y,\n };\n}\n\nexport function splitCubic(\n p0: Vec2,\n c1: Vec2,\n c2: Vec2,\n p3: Vec2,\n t: number,\n): {\n left: { c1: Vec2; c2: Vec2; to: Vec2 };\n right: { c1: Vec2; c2: Vec2; to: Vec2 };\n} {\n const a = lerpVec(p0, c1, t);\n const b = lerpVec(c1, c2, t);\n const c = lerpVec(c2, p3, t);\n const d = lerpVec(a, b, t);\n const e = lerpVec(b, c, t);\n const mid = lerpVec(d, e, t);\n return {\n left: { c1: a, c2: d, to: mid },\n right: { c1: e, c2: c, to: p3 },\n };\n}\n\n/**\n * Split an SVG elliptical arc into cubics (one per ≤90° sweep) so Edit Map\n * can treat each arch as two anchors + two handles.\n */\nexport function ellipticalArcToCubics(\n p0: Vec2,\n rx: number,\n ry: number,\n xAxisRotationDeg: number,\n largeArc: boolean,\n sweep: boolean,\n p1: Vec2,\n): Array<{ c1: Vec2; c2: Vec2; to: Vec2 }> {\n if (vecEq(p0, p1)) return [];\n let arx = Math.abs(rx);\n let ary = Math.abs(ry);\n if (arx === 0 || ary === 0 || !Number.isFinite(arx) || !Number.isFinite(ary)) {\n return [];\n }\n\n const phi = ((xAxisRotationDeg % 360) * Math.PI) / 180;\n const cosPhi = Math.cos(phi);\n const sinPhi = Math.sin(phi);\n const dx2 = (p0.x - p1.x) / 2;\n const dy2 = (p0.y - p1.y) / 2;\n const x1p = cosPhi * dx2 + sinPhi * dy2;\n const y1p = -sinPhi * dx2 + cosPhi * dy2;\n const lambda = (x1p * x1p) / (arx * arx) + (y1p * y1p) / (ary * ary);\n if (lambda > 1) {\n const scale = Math.sqrt(lambda);\n arx *= scale;\n ary *= scale;\n }\n const rxSq = arx * arx;\n const rySq = ary * ary;\n const numerator = rxSq * rySq - rxSq * y1p * y1p - rySq * x1p * x1p;\n const denominator = rxSq * y1p * y1p + rySq * x1p * x1p;\n const factor =\n Math.sqrt(Math.max(0, numerator / denominator)) * (largeArc === sweep ? -1 : 1);\n const cxp = (factor * arx * y1p) / ary;\n const cyp = (-factor * ary * x1p) / arx;\n const cx = cosPhi * cxp - sinPhi * cyp + (p0.x + p1.x) / 2;\n const cy = sinPhi * cxp + cosPhi * cyp + (p0.y + p1.y) / 2;\n const ux = (x1p - cxp) / arx;\n const uy = (y1p - cyp) / ary;\n const vx = (-x1p - cxp) / arx;\n const vy = (-y1p - cyp) / ary;\n const theta1 = Math.atan2(uy, ux);\n let deltaTheta = Math.atan2(ux * vy - uy * vx, ux * vx + uy * vy);\n if (!sweep && deltaTheta > 0) deltaTheta -= 2 * Math.PI;\n else if (sweep && deltaTheta < 0) deltaTheta += 2 * Math.PI;\n\n const ellipsePoint = (theta: number): Vec2 => {\n const cosT = Math.cos(theta);\n const sinT = Math.sin(theta);\n return {\n x: cx + arx * cosPhi * cosT - ary * sinPhi * sinT,\n y: cy + arx * sinPhi * cosT + ary * cosPhi * sinT,\n };\n };\n const ellipseDeriv = (theta: number): Vec2 => {\n const cosT = Math.cos(theta);\n const sinT = Math.sin(theta);\n const dx = -arx * sinT;\n const dy = ary * cosT;\n return {\n x: cosPhi * dx - sinPhi * dy,\n y: sinPhi * dx + cosPhi * dy,\n };\n };\n\n const out: Array<{ c1: Vec2; c2: Vec2; to: Vec2 }> = [];\n let t0 = theta1;\n let remaining = deltaTheta;\n while (Math.abs(remaining) > 1e-8) {\n const step =\n Math.sign(remaining) * Math.min(Math.abs(remaining), Math.PI / 2);\n const t1 = t0 + step;\n const k = (4 / 3) * Math.tan(step / 4);\n const start = ellipsePoint(t0);\n const end = ellipsePoint(t1);\n const d0 = ellipseDeriv(t0);\n const d1 = ellipseDeriv(t1);\n out.push({\n c1: { x: start.x + k * d0.x, y: start.y + k * d0.y },\n c2: { x: end.x - k * d1.x, y: end.y - k * d1.y },\n to: end,\n });\n t0 = t1;\n remaining -= step;\n }\n if (out.length > 0) {\n out[out.length - 1].to = cloneVec(p1);\n }\n return out;\n}\n\nexport function parsePathToRings(d: string): PathRing[] {\n const tokens = tokenizePathData(d);\n const rings: PathRing[] = [];\n let anchors: Vec2[] = [];\n let edges: PathEdge[] = [];\n let x = 0;\n let y = 0;\n let startX = 0;\n let startY = 0;\n let lastCtrl: Vec2 | null = null;\n let i = 0;\n let cmd = '';\n let started = false;\n\n const readNum = () => Number(tokens[i++]);\n\n const flush = (closed: boolean) => {\n if (\n closed &&\n anchors.length > 1 &&\n vecEq(anchors[0], anchors[anchors.length - 1])\n ) {\n anchors.pop();\n }\n const expected = closed ? anchors.length : Math.max(0, anchors.length - 1);\n while (edges.length > expected) edges.pop();\n while (edges.length < expected) edges.push({ kind: 'line' });\n if (anchors.length >= 2) {\n rings.push({\n closed,\n anchors: anchors.map(cloneVec),\n edges: edges.map((edge) =>\n edge.kind === 'line'\n ? { kind: 'line' }\n : { kind: 'cubic', c1: cloneVec(edge.c1), c2: cloneVec(edge.c2) },\n ),\n });\n }\n anchors = [];\n edges = [];\n started = false;\n };\n\n const pushAnchor = (p: Vec2): boolean => {\n if (anchors.length > 0 && vecEq(anchors[anchors.length - 1], p)) return false;\n anchors.push(cloneVec(p));\n return true;\n };\n\n while (i < tokens.length) {\n const t = tokens[i];\n if (/[a-zA-Z]/.test(t)) {\n cmd = t;\n i++;\n }\n\n switch (cmd) {\n case 'M':\n case 'm': {\n const isRel = cmd === 'm';\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n if (started) flush(false);\n x = nx;\n y = ny;\n startX = x;\n startY = y;\n pushAnchor({ x, y });\n started = true;\n lastCtrl = null;\n cmd = isRel ? 'l' : 'L';\n break;\n }\n case 'L':\n case 'l': {\n const isRel = cmd === 'l';\n x = isRel ? x + readNum() : readNum();\n y = isRel ? y + readNum() : readNum();\n if (pushAnchor({ x, y })) edges.push({ kind: 'line' });\n lastCtrl = null;\n break;\n }\n case 'H':\n case 'h': {\n x = cmd === 'h' ? x + readNum() : readNum();\n if (pushAnchor({ x, y })) edges.push({ kind: 'line' });\n lastCtrl = null;\n break;\n }\n case 'V':\n case 'v': {\n y = cmd === 'v' ? y + readNum() : readNum();\n if (pushAnchor({ x, y })) edges.push({ kind: 'line' });\n lastCtrl = null;\n break;\n }\n case 'C':\n case 'c': {\n const isRel = cmd === 'c';\n const x1 = isRel ? x + readNum() : readNum();\n const y1 = isRel ? y + readNum() : readNum();\n const x2 = isRel ? x + readNum() : readNum();\n const y2 = isRel ? y + readNum() : readNum();\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n if (pushAnchor({ x: nx, y: ny })) {\n edges.push({\n kind: 'cubic',\n c1: { x: x1, y: y1 },\n c2: { x: x2, y: y2 },\n });\n }\n lastCtrl = { x: x2, y: y2 };\n x = nx;\n y = ny;\n break;\n }\n case 'S':\n case 's': {\n const isRel = cmd === 's';\n const c1 = lastCtrl\n ? { x: 2 * x - lastCtrl.x, y: 2 * y - lastCtrl.y }\n : { x, y };\n const x2 = isRel ? x + readNum() : readNum();\n const y2 = isRel ? y + readNum() : readNum();\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n if (pushAnchor({ x: nx, y: ny })) {\n edges.push({\n kind: 'cubic',\n c1,\n c2: { x: x2, y: y2 },\n });\n }\n lastCtrl = { x: x2, y: y2 };\n x = nx;\n y = ny;\n break;\n }\n case 'Q':\n case 'q': {\n const isRel = cmd === 'q';\n const qx = isRel ? x + readNum() : readNum();\n const qy = isRel ? y + readNum() : readNum();\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n const { c1, c2 } = quadraticToCubic({ x, y }, { x: qx, y: qy }, { x: nx, y: ny });\n if (pushAnchor({ x: nx, y: ny })) {\n edges.push({ kind: 'cubic', c1, c2 });\n }\n lastCtrl = { x: qx, y: qy };\n x = nx;\n y = ny;\n break;\n }\n case 'T':\n case 't': {\n const isRel = cmd === 't';\n const qx: number = lastCtrl ? 2 * x - lastCtrl.x : x;\n const qy: number = lastCtrl ? 2 * y - lastCtrl.y : y;\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n const { c1, c2 } = quadraticToCubic({ x, y }, { x: qx, y: qy }, { x: nx, y: ny });\n if (pushAnchor({ x: nx, y: ny })) {\n edges.push({ kind: 'cubic', c1, c2 });\n }\n lastCtrl = { x: qx, y: qy };\n x = nx;\n y = ny;\n break;\n }\n case 'A':\n case 'a': {\n const isRel = cmd === 'a';\n const rx = readNum();\n const ry = readNum();\n const rot = readNum();\n const largeArc = readNum() !== 0;\n const sweep = readNum() !== 0;\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n const cubics = ellipticalArcToCubics(\n { x, y },\n rx,\n ry,\n rot,\n largeArc,\n sweep,\n { x: nx, y: ny },\n );\n if (cubics.length === 0) {\n if (pushAnchor({ x: nx, y: ny })) edges.push({ kind: 'line' });\n } else {\n for (const cubic of cubics) {\n if (pushAnchor(cubic.to)) {\n edges.push({ kind: 'cubic', c1: cubic.c1, c2: cubic.c2 });\n }\n }\n }\n lastCtrl = null;\n x = nx;\n y = ny;\n break;\n }\n case 'Z':\n case 'z': {\n if (!vecEq({ x, y }, { x: startX, y: startY })) {\n edges.push({ kind: 'line' });\n }\n x = startX;\n y = startY;\n flush(true);\n lastCtrl = null;\n break;\n }\n default:\n i++;\n break;\n }\n }\n\n if (started) flush(false);\n return rings;\n}\n\nexport function ringToPathD(ring: PathRing): string {\n if (ring.anchors.length === 0) return '';\n const a0 = ring.anchors[0];\n let d = `M ${fmtCoord(a0.x)} ${fmtCoord(a0.y)}`;\n const n = edgeCount(ring);\n for (let i = 0; i < n; i++) {\n const to = edgeTo(ring, i);\n const edge = ring.edges[i];\n const closingLine =\n ring.closed && i === n - 1 && (!edge || edge.kind === 'line');\n if (closingLine) continue;\n if (!edge || edge.kind === 'line') {\n d += ` L ${fmtCoord(to.x)} ${fmtCoord(to.y)}`;\n } else {\n d += ` C ${fmtCoord(edge.c1.x)} ${fmtCoord(edge.c1.y)} ${fmtCoord(edge.c2.x)} ${fmtCoord(edge.c2.y)} ${fmtCoord(to.x)} ${fmtCoord(to.y)}`;\n }\n }\n if (ring.closed) d += ' Z';\n return d;\n}\n\nexport function ringsToGeometry(rings: PathRing[]): ShapeGeometry {\n const ds = rings\n .filter((ring) => ring.anchors.length >= 2)\n .map(ringToPathD)\n .filter(Boolean);\n if (ds.length === 0) {\n return { paths: [], polygons: [] };\n }\n const geometry = buildGeometryFromPaths(ds);\n return {\n ...geometry,\n polygons: geometry.polygons.map((poly) =>\n poly.length > 1 && vecEq(poly[0], poly[poly.length - 1])\n ? poly.slice(0, -1)\n : poly,\n ),\n };\n}\n\nconst ARCH_CORNER_RAD = (28 * Math.PI) / 180;\nconst MIN_ARCH_POINTS = 4;\nconst MIN_ARCH_BULGE = 3;\nconst MIN_ARCH_BULGE_RATIO = 0.035;\n/** Wider than a semicircle (0.5) is a loop, not a storefront arch. */\nconst MAX_ARCH_BULGE_RATIO = 0.65;\n\nfunction signedTurn(prev: Vec2, cur: Vec2, next: Vec2): number {\n const ax = cur.x - prev.x;\n const ay = cur.y - prev.y;\n const bx = next.x - cur.x;\n const by = next.y - cur.y;\n return Math.atan2(ax * by - ay * bx, ax * bx + ay * by);\n}\n\nfunction runLooksLikeArch(pts: Vec2[]): boolean {\n if (pts.length < MIN_ARCH_POINTS) return false;\n const a = pts[0];\n const b = pts[pts.length - 1];\n const chord = distance(a, b);\n if (chord < EPS) return false;\n let maxDev = 0;\n let side = 0;\n for (let i = 1; i < pts.length - 1; i++) {\n const proj = projectOntoSegment(pts[i], a, b);\n maxDev = Math.max(maxDev, proj.distance);\n const s = Math.sign(\n (b.x - a.x) * (pts[i].y - a.y) - (b.y - a.y) * (pts[i].x - a.x),\n );\n if (s === 0) continue;\n if (side === 0) side = s;\n else if (s !== side) return false;\n }\n if (maxDev < Math.max(MIN_ARCH_BULGE, chord * MIN_ARCH_BULGE_RATIO)) {\n return false;\n }\n if (maxDev > chord * MAX_ARCH_BULGE_RATIO) {\n return false;\n }\n for (let i = 1; i < pts.length - 1; i++) {\n if (Math.abs(signedTurn(pts[i - 1], pts[i], pts[i + 1])) > ARCH_CORNER_RAD) {\n return false;\n }\n }\n return true;\n}\n\nfunction fitCubicThroughRun(pts: Vec2[]): PathEdge {\n const from = pts[0];\n const to = pts[pts.length - 1];\n let pull = pts[Math.floor(pts.length / 2)];\n let maxDev = 0;\n for (let i = 1; i < pts.length - 1; i++) {\n const d = projectOntoSegment(pts[i], from, to).distance;\n if (d > maxDev) {\n maxDev = d;\n pull = pts[i];\n }\n }\n const { c1, c2 } = cubicHandlesForPull(from, to, pull);\n return { kind: 'cubic', c1, c2 };\n}\n\n/**\n * Designer SVGs often flatten an arch into many short lines. Collapse those\n * runs to one cubic (2 anchors + 2 handles) when the bulge is unambiguous.\n */\nfunction cubicDeviationFromChord(from: Vec2, c1: Vec2, c2: Vec2, to: Vec2): number {\n const samples = approximateCubic(from, c1, c2, to, 16);\n let maxDev = 0;\n for (const point of samples) {\n maxDev = Math.max(maxDev, projectOntoSegment(point, from, to).distance);\n }\n return maxDev;\n}\n\n/** A cubic whose bulge is much longer than its chord is a leftover loop, not an arch. */\nexport function cubicIsRunaway(from: Vec2, c1: Vec2, c2: Vec2, to: Vec2): boolean {\n const chord = distance(from, to);\n const dev = cubicDeviationFromChord(from, c1, c2, to);\n if (chord < EPS) return dev > EPS;\n return dev > chord * MAX_ARCH_BULGE_RATIO;\n}\n\nfunction flattenRunawayCubics(ring: PathRing): PathRing {\n const n = edgeCount(ring);\n let changed = false;\n const edges = ring.edges.map((edge, i) => {\n if (i >= n || edge.kind !== 'cubic') return edge;\n if (!cubicIsRunaway(edgeFrom(ring, i), edge.c1, edge.c2, edgeTo(ring, i))) {\n return edge;\n }\n changed = true;\n return { kind: 'line' as const };\n });\n return changed ? { ...ring, edges } : ring;\n}\n\nexport function collapseLineRunsToCubics(ring: PathRing): PathRing {\n const n = ring.anchors.length;\n if (n < MIN_ARCH_POINTS) return ring;\n const idx = (i: number) => ((i % n) + n) % n;\n\n const incoming = (i: number) =>\n ring.closed ? ring.edges[idx(i - 1)] : i > 0 ? ring.edges[i - 1] : undefined;\n const outgoing = (i: number) =>\n ring.closed ? ring.edges[i] : i < n - 1 ? ring.edges[i] : undefined;\n\n const isSharp = (i: number): boolean => {\n if (!ring.closed && (i === 0 || i === n - 1)) return true;\n if (incoming(i)?.kind === 'cubic' || outgoing(i)?.kind === 'cubic') {\n return true;\n }\n return (\n Math.abs(\n signedTurn(ring.anchors[idx(i - 1)], ring.anchors[i], ring.anchors[idx(i + 1)]),\n ) > ARCH_CORNER_RAD\n );\n };\n\n let start = 0;\n if (ring.closed) {\n const sharp = [...Array(n).keys()].find(isSharp);\n if (sharp == null) return ring;\n start = sharp;\n }\n\n const outA: Vec2[] = [];\n const outE: PathEdge[] = [];\n const walk = ring.closed ? n : n - 1;\n\n const emitRun = (fromW: number, toW: number) => {\n const pts: Vec2[] = [];\n for (let w = fromW; w <= toW; w++) {\n pts.push(ring.anchors[idx(start + w)]);\n }\n const linesOnly = pts.slice(0, -1).every((_, k) => {\n const edge = ring.edges[idx(start + fromW + k)];\n return !edge || edge.kind === 'line';\n });\n if (outA.length === 0) outA.push(cloneVec(pts[0]));\n if (linesOnly && runLooksLikeArch(pts)) {\n outA.push(cloneVec(pts[pts.length - 1]));\n outE.push(fitCubicThroughRun(pts));\n return;\n }\n for (let k = 1; k < pts.length; k++) {\n outA.push(cloneVec(pts[k]));\n outE.push(ring.edges[idx(start + fromW + k - 1)] ?? { kind: 'line' });\n }\n };\n\n let last = 0;\n for (let w = 1; w <= walk; w++) {\n const i = idx(start + w);\n if (w === walk || isSharp(i)) {\n emitRun(last, w);\n last = w;\n }\n }\n\n if (\n ring.closed &&\n outA.length > 1 &&\n vecEq(outA[0], outA[outA.length - 1])\n ) {\n outA.pop();\n }\n const expected = ring.closed ? outA.length : Math.max(0, outA.length - 1);\n while (outE.length > expected) outE.pop();\n if (outA.length < 2) return ring;\n return { closed: ring.closed, anchors: outA, edges: outE };\n}\n\nexport function geometryToRings(geometry: ShapeGeometry): PathRing[] {\n const fromPaths = geometry.paths.flatMap((p) => parsePathToRings(p.d));\n const source = fromPaths.some((ring) => ring.anchors.length >= 2)\n ? fromPaths.filter((ring) => ring.anchors.length >= 2)\n : geometry.polygons\n .filter((poly) => poly.length >= 2)\n .map((poly) => ringFromPolygon(poly, true));\n return source.map((ring) => flattenRunawayCubics(collapseLineRunsToCubics(ring)));\n}\n\n/** Closest point on one ring edge — keeps the add-anchor preview on the line. */\nexport function pointOnRingEdge(ring: PathRing, edgeIndex: number, point: Vec2): Vec2 {\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n if (edge.kind === 'cubic') {\n return nearestTOnCubic(point, from, edge.c1, edge.c2, to).point;\n }\n return projectOntoSegment(point, from, to).point;\n}\n\nexport function nearestTOnCubic(\n point: Vec2,\n p0: Vec2,\n c1: Vec2,\n c2: Vec2,\n p3: Vec2,\n): { t: number; point: Vec2; distance: number } {\n const samples = approximateCubic(p0, c1, c2, p3, 16);\n let bestT = 0;\n let bestPt = samples[0];\n let bestD = distance(point, samples[0]);\n for (let i = 1; i < samples.length; i++) {\n const d = distance(point, samples[i]);\n if (d < bestD) {\n bestD = d;\n bestPt = samples[i];\n bestT = i / (samples.length - 1);\n }\n }\n return { t: bestT, point: bestPt, distance: bestD };\n}\n","import type { ShapeGeometry, Vec2 } from '../core';\nimport { geometryBBox, projectOntoSegment } from '../core';\nimport {\n addVec,\n cloneVec,\n cubicHandlesForPull,\n cubicPoint,\n edgeCount,\n edgeFrom,\n edgeTo,\n geometryToRings,\n nearestTOnCubic,\n ringsToGeometry,\n splitCubic,\n subVec,\n type PathRing,\n} from './pathRings';\n\nfunction clonePolygons(polygons: Vec2[][]): Vec2[][] {\n return polygons.map((poly) => poly.map((p) => ({ x: p.x, y: p.y })));\n}\n\n/** Rebuild absolute path `d` strings from polygon rings (lossy for beziers). */\nexport function polygonsToPathD(polygons: Vec2[][]): string {\n return polygons\n .map((poly) => {\n if (poly.length === 0) return '';\n let d = `M ${poly[0].x} ${poly[0].y}`;\n for (let i = 1; i < poly.length; i++) {\n d += ` L ${poly[i].x} ${poly[i].y}`;\n }\n d += ' Z';\n return d;\n })\n .join(' ');\n}\n\nexport function polygonsToGeometry(polygons: Vec2[][]): ShapeGeometry {\n const cleaned = polygons\n .map((poly) => {\n if (\n poly.length > 1 &&\n poly[0].x === poly[poly.length - 1].x &&\n poly[0].y === poly[poly.length - 1].y\n ) {\n return poly.slice(0, -1);\n }\n return poly;\n })\n .filter((poly) => poly.length >= 3);\n return {\n paths: cleaned.map((poly) => ({\n d: polygonsToPathD([poly]),\n closed: true,\n })),\n polygons: cleaned,\n };\n}\n\nfunction commitRings(rings: PathRing[]): ShapeGeometry {\n return ringsToGeometry(rings);\n}\n\nfunction incomingEdgeIndex(ring: PathRing, anchorIndex: number): number | null {\n if (ring.closed) {\n return (anchorIndex - 1 + ring.anchors.length) % ring.anchors.length;\n }\n return anchorIndex > 0 ? anchorIndex - 1 : null;\n}\n\nfunction outgoingEdgeIndex(ring: PathRing, anchorIndex: number): number | null {\n if (ring.closed) return anchorIndex;\n return anchorIndex < ring.anchors.length - 1 ? anchorIndex : null;\n}\n\nexport function translateGeometry(\n geometry: ShapeGeometry,\n dx: number,\n dy: number,\n): ShapeGeometry {\n const delta = { x: dx, y: dy };\n const rings = geometryToRings(geometry).map((ring) => ({\n closed: ring.closed,\n anchors: ring.anchors.map((p) => addVec(p, delta)),\n edges: ring.edges.map((edge) =>\n edge.kind === 'line'\n ? { kind: 'line' as const }\n : {\n kind: 'cubic' as const,\n c1: addVec(edge.c1, delta),\n c2: addVec(edge.c2, delta),\n },\n ),\n }));\n if (rings.length === 0) {\n const polygons = clonePolygons(geometry.polygons).map((poly) =>\n poly.map((p) => ({ x: p.x + dx, y: p.y + dy })),\n );\n return polygonsToGeometry(polygons);\n }\n return commitRings(rings);\n}\n\n/** Slide one side: both endpoints (and that edge's handles) move together. */\nexport function translateEdge(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n delta: Vec2,\n): ShapeGeometry {\n if (delta.x === 0 && delta.y === 0) return geometry;\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n if (!ring || edgeIndex < 0 || edgeIndex >= edgeCount(ring)) return geometry;\n const fromIdx = edgeIndex;\n const toIdx = (edgeIndex + 1) % ring.anchors.length;\n ring.anchors[fromIdx] = addVec(ring.anchors[fromIdx], delta);\n ring.anchors[toIdx] = addVec(ring.anchors[toIdx], delta);\n const edge = ring.edges[edgeIndex];\n if (edge?.kind === 'cubic') {\n edge.c1 = addVec(edge.c1, delta);\n edge.c2 = addVec(edge.c2, delta);\n }\n const incoming = incomingEdgeIndex(ring, fromIdx);\n if (incoming != null && incoming !== edgeIndex) {\n const prev = ring.edges[incoming];\n if (prev?.kind === 'cubic') prev.c2 = addVec(prev.c2, delta);\n }\n const outgoing = outgoingEdgeIndex(ring, toIdx);\n if (outgoing != null && outgoing !== edgeIndex) {\n const next = ring.edges[outgoing];\n if (next?.kind === 'cubic') next.c1 = addVec(next.c1, delta);\n }\n return commitRings(rings);\n}\n\nexport function moveVertex(\n geometry: ShapeGeometry,\n polygonIndex: number,\n vertexIndex: number,\n point: Vec2,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[polygonIndex];\n if (!ring || vertexIndex < 0 || vertexIndex >= ring.anchors.length) {\n return geometry;\n }\n const prev = ring.anchors[vertexIndex];\n const delta = subVec(point, prev);\n ring.anchors[vertexIndex] = cloneVec(point);\n const incoming = incomingEdgeIndex(ring, vertexIndex);\n const outgoing = outgoingEdgeIndex(ring, vertexIndex);\n if (incoming != null) {\n const edge = ring.edges[incoming];\n if (edge?.kind === 'cubic') edge.c2 = addVec(edge.c2, delta);\n }\n if (outgoing != null) {\n const edge = ring.edges[outgoing];\n if (edge?.kind === 'cubic') edge.c1 = addVec(edge.c1, delta);\n }\n return commitRings(rings);\n}\n\nexport function moveHandle(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n handle: 1 | 2,\n point: Vec2,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n const edge = ring?.edges[edgeIndex];\n if (!edge || edge.kind !== 'cubic') return geometry;\n if (handle === 1) edge.c1 = cloneVec(point);\n else edge.c2 = cloneVec(point);\n return commitRings(rings);\n}\n\n/** Drop both handles so the arch becomes a straight side. */\nexport function flattenCubicEdge(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n const edge = ring?.edges[edgeIndex];\n if (!edge || edge.kind !== 'cubic') return geometry;\n ring.edges[edgeIndex] = { kind: 'line' };\n return commitRings(rings);\n}\n\n/** Pull a straight side into a cubic arch (or reshape a cubic from its chord). */\nexport function bendEdgeToCubic(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n pull: Vec2,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n if (!ring || edgeIndex < 0 || edgeIndex >= edgeCount(ring)) return geometry;\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const { c1, c2 } = cubicHandlesForPull(from, to, pull);\n ring.edges[edgeIndex] = { kind: 'cubic', c1, c2 };\n return commitRings(rings);\n}\n\n/**\n * Insert a vertex after `vertexIndex` on the given ring (before the next point).\n */\nexport function insertVertex(\n geometry: ShapeGeometry,\n polygonIndex: number,\n afterVertexIndex: number,\n point: Vec2,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[polygonIndex];\n if (!ring || afterVertexIndex < 0 || afterVertexIndex >= ring.anchors.length) {\n return geometry;\n }\n const edgeIndex = outgoingEdgeIndex(ring, afterVertexIndex);\n if (edgeIndex == null) return geometry;\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n\n if (edge.kind === 'cubic') {\n const { t } = nearestTOnCubic(point, from, edge.c1, edge.c2, to);\n const splitT = Math.min(0.95, Math.max(0.05, t));\n const split = splitCubic(from, edge.c1, edge.c2, to, splitT);\n ring.anchors.splice(afterVertexIndex + 1, 0, cloneVec(split.left.to));\n ring.edges.splice(edgeIndex, 1, { kind: 'cubic', c1: split.left.c1, c2: split.left.c2 }, {\n kind: 'cubic',\n c1: split.right.c1,\n c2: split.right.c2,\n });\n } else {\n ring.anchors.splice(afterVertexIndex + 1, 0, cloneVec(point));\n ring.edges.splice(edgeIndex, 1, { kind: 'line' }, { kind: 'line' });\n }\n return commitRings(rings);\n}\n\n/** Remove a vertex; refuses to go below 3 points on a closed ring. */\nexport function removeVertex(\n geometry: ShapeGeometry,\n polygonIndex: number,\n vertexIndex: number,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[polygonIndex];\n if (!ring) return geometry;\n const min = ring.closed ? 3 : 2;\n if (ring.anchors.length <= min) return geometry;\n if (vertexIndex < 0 || vertexIndex >= ring.anchors.length) return geometry;\n\n const n = ring.anchors.length;\n if (ring.closed) {\n ring.anchors.splice(vertexIndex, 1);\n ring.edges.splice(vertexIndex, 1);\n const join = vertexIndex === 0 ? ring.anchors.length - 1 : vertexIndex - 1;\n if (ring.edges[join]) ring.edges[join] = { kind: 'line' };\n } else if (vertexIndex === 0) {\n ring.anchors.splice(0, 1);\n ring.edges.splice(0, 1);\n } else if (vertexIndex === n - 1) {\n ring.anchors.pop();\n ring.edges.pop();\n } else {\n ring.anchors.splice(vertexIndex, 1);\n ring.edges.splice(vertexIndex, 1);\n ring.edges[vertexIndex - 1] = { kind: 'line' };\n }\n return commitRings(rings);\n}\n\nexport interface VertexHit {\n polygonIndex: number;\n vertexIndex: number;\n point: Vec2;\n distance: number;\n}\n\n/** Nearest path anchor within `tolerance` world units, or null. */\nexport function hitTestVertex(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n): VertexHit | null {\n let best: VertexHit | null = null;\n geometryToRings(geometry).forEach((ring, polygonIndex) => {\n ring.anchors.forEach((vertex, vertexIndex) => {\n const distance = Math.hypot(vertex.x - point.x, vertex.y - point.y);\n if (distance <= tolerance && (!best || distance < best.distance)) {\n best = {\n polygonIndex,\n vertexIndex,\n point: { x: vertex.x, y: vertex.y },\n distance,\n };\n }\n });\n });\n return best;\n}\n\nexport interface HandleHit {\n ringIndex: number;\n edgeIndex: number;\n handle: 1 | 2;\n point: Vec2;\n distance: number;\n}\n\nexport function hitTestHandle(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n): HandleHit | null {\n let best: HandleHit | null = null;\n geometryToRings(geometry).forEach((ring, ringIndex) => {\n const n = edgeCount(ring);\n for (let edgeIndex = 0; edgeIndex < n; edgeIndex++) {\n const edge = ring.edges[edgeIndex];\n if (edge?.kind !== 'cubic') continue;\n for (const handle of [1, 2] as const) {\n const hp = handle === 1 ? edge.c1 : edge.c2;\n const distance = Math.hypot(hp.x - point.x, hp.y - point.y);\n if (distance <= tolerance && (!best || distance < best.distance)) {\n best = { ringIndex, edgeIndex, handle, point: cloneVec(hp), distance };\n }\n }\n }\n });\n return best;\n}\n\nexport interface EdgeHit {\n polygonIndex: number;\n /** Insert after this vertex index. */\n afterVertexIndex: number;\n point: Vec2;\n distance: number;\n kind: 'line' | 'cubic';\n}\n\nfunction hitEdge(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n preferMidpoint: boolean,\n): EdgeHit | null {\n let best: EdgeHit | null = null;\n geometryToRings(geometry).forEach((ring, polygonIndex) => {\n const n = edgeCount(ring);\n for (let i = 0; i < n; i++) {\n const a = edgeFrom(ring, i);\n const b = edgeTo(ring, i);\n const edge = ring.edges[i] ?? { kind: 'line' as const };\n let candidate: Vec2;\n let dist: number;\n if (preferMidpoint) {\n candidate =\n edge.kind === 'cubic'\n ? cubicPoint(a, edge.c1, edge.c2, b, 0.5)\n : { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n dist = Math.hypot(candidate.x - point.x, candidate.y - point.y);\n } else if (edge.kind === 'cubic') {\n const near = nearestTOnCubic(point, a, edge.c1, edge.c2, b);\n candidate = near.point;\n dist = near.distance;\n } else {\n const proj = projectOntoSegment(point, a, b);\n candidate = proj.point;\n dist = proj.distance;\n }\n if (dist <= tolerance && (!best || dist < best.distance)) {\n best = {\n polygonIndex,\n afterVertexIndex: i,\n point: candidate,\n distance: dist,\n kind: edge.kind,\n };\n }\n }\n });\n return best;\n}\n\n/** Nearest edge midpoint within tolerance for insert. */\nexport function hitTestEdgeMidpoint(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n): EdgeHit | null {\n return hitEdge(geometry, point, tolerance, true);\n}\n\n/** Nearest point on any edge (for dragging a line into an arch). */\nexport function hitTestEdge(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n): EdgeHit | null {\n return hitEdge(geometry, point, tolerance, false);\n}\n\nexport function geometryWithBBox(geometry: ShapeGeometry): {\n geometry: ShapeGeometry;\n bbox: ReturnType<typeof geometryBBox>;\n} {\n return { geometry, bbox: geometryBBox(geometry) };\n}\n\nexport {\n geometryToRings,\n edgeCount,\n edgeFrom,\n edgeTo,\n edgeToPathD,\n pointOnRingEdge,\n ringToPathD,\n} from './pathRings';\nexport type { PathRing, PathEdge } from './pathRings';\n","import type { ShapeGeometry, ShapeKind, ShapeStyle, Vec2 } from '../core';\nimport { DEFAULT_WELD_TOLERANCE, distance, projectOntoSegment } from '../core';\nimport {\n cloneVec,\n edgeCount,\n edgeFrom,\n edgeTo,\n geometryToRings,\n nearestTOnCubic,\n ringsToGeometry,\n splitCubic,\n vecEq,\n type PathEdge,\n type PathRing,\n} from './pathRings';\nimport { hitTestEdge } from './geometryEdit';\n\nconst SHARED_EDGE_TOL = 4;\n\nexport type OpenEndId = {\n shapeId: number;\n ringIndex: number;\n end: 'start' | 'end';\n};\n\nexport type OpenEndHit = OpenEndId & { point: Vec2; distance: number };\n\nexport type SplitJoinEdgeHit = {\n shapeId: number;\n ringIndex: number;\n edgeIndex: number;\n point: Vec2;\n shared: boolean;\n distance: number;\n};\n\nexport type ShapeGeo = {\n id: number;\n kind: ShapeKind;\n style?: ShapeStyle;\n geometry: ShapeGeometry;\n};\n\nexport type ShapeBatchEdit =\n | { action: 'update'; shapeId: number; geometry: ShapeGeometry }\n | {\n action: 'create';\n kind: ShapeKind;\n geometry: ShapeGeometry;\n style?: ShapeStyle;\n }\n | { action: 'delete'; shapeId: number };\n\nexport function canSplitJoinKind(kind: ShapeKind): boolean {\n return kind === 'unit' || kind === 'amenity' || kind === 'parking_zone';\n}\n\nexport function sameOpenEnd(a: OpenEndId, b: OpenEndId): boolean {\n return a.shapeId === b.shapeId && a.ringIndex === b.ringIndex && a.end === b.end;\n}\n\nfunction cloneEdge(edge: PathEdge): PathEdge {\n return edge.kind === 'line'\n ? { kind: 'line' }\n : { kind: 'cubic', c1: cloneVec(edge.c1), c2: cloneVec(edge.c2) };\n}\n\nfunction cloneRing(ring: PathRing): PathRing {\n return {\n closed: ring.closed,\n anchors: ring.anchors.map(cloneVec),\n edges: ring.edges.map(cloneEdge),\n };\n}\n\nfunction reverseEdge(edge: PathEdge): PathEdge {\n if (edge.kind === 'line') return { kind: 'line' };\n return { kind: 'cubic', c1: cloneVec(edge.c2), c2: cloneVec(edge.c1) };\n}\n\nfunction reverseRing(ring: PathRing): PathRing {\n return {\n closed: ring.closed,\n anchors: ring.anchors.map(cloneVec).reverse(),\n edges: ring.edges.map(cloneEdge).reverse().map(reverseEdge),\n };\n}\n\nfunction maybeCloseCoincident(ring: PathRing, tol: number): PathRing {\n if (ring.closed || ring.anchors.length < 3) return ring;\n const first = ring.anchors[0];\n const last = ring.anchors[ring.anchors.length - 1];\n if (!vecEq(first, last, tol)) return ring;\n const next = cloneRing(ring);\n next.anchors.pop();\n next.closed = true;\n const expected = next.anchors.length;\n while (next.edges.length > expected) next.edges.pop();\n while (next.edges.length < expected) next.edges.push({ kind: 'line' });\n return next;\n}\n\nexport function listOpenEnds(geometry: ShapeGeometry): Array<{\n ringIndex: number;\n end: 'start' | 'end';\n point: Vec2;\n}> {\n const out: Array<{ ringIndex: number; end: 'start' | 'end'; point: Vec2 }> = [];\n geometryToRings(geometry).forEach((ring, ringIndex) => {\n if (ring.closed || ring.anchors.length < 2) return;\n out.push({\n ringIndex,\n end: 'start',\n point: cloneVec(ring.anchors[0]),\n });\n out.push({\n ringIndex,\n end: 'end',\n point: cloneVec(ring.anchors[ring.anchors.length - 1]),\n });\n });\n return out;\n}\n\nfunction distToRingEdge(ring: PathRing, edgeIndex: number, point: Vec2): number {\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n if (edge.kind === 'cubic') {\n return nearestTOnCubic(point, from, edge.c1, edge.c2, to).distance;\n }\n return projectOntoSegment(point, from, to).distance;\n}\n\nfunction pointOnRingBoundary(point: Vec2, ring: PathRing, tol: number): boolean {\n const n = edgeCount(ring);\n for (let i = 0; i < n; i++) {\n if (distToRingEdge(ring, i, point) <= tol) return true;\n }\n return false;\n}\n\nexport function edgeLiesOnOtherShape(\n from: Vec2,\n to: Vec2,\n others: Array<{ geometry: ShapeGeometry }>,\n tol = SHARED_EDGE_TOL,\n): boolean {\n const mid = { x: (from.x + to.x) / 2, y: (from.y + to.y) / 2 };\n for (const other of others) {\n const rings = geometryToRings(other.geometry);\n const onBoundary = rings.some(\n (ring) =>\n pointOnRingBoundary(from, ring, tol) &&\n pointOnRingBoundary(to, ring, tol) &&\n pointOnRingBoundary(mid, ring, tol),\n );\n if (onBoundary) return true;\n const open = listOpenEnds(other.geometry);\n if (open.length >= 2) {\n const near = (p: Vec2) =>\n open.some((end) => distance(end.point, p) <= tol);\n if (near(from) && near(to)) return true;\n }\n }\n return false;\n}\n\nfunction cutPointsOnLine(\n from: Vec2,\n to: Vec2,\n point: Vec2,\n gap: number,\n): { p1: Vec2; p2: Vec2 } | null {\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const len = Math.hypot(dx, dy);\n if (len < 1e-6) return null;\n const half = Math.min(Math.max(gap, 0.35) / 2, len * 0.2);\n if (half < 0.12) return null;\n const ux = dx / len;\n const uy = dy / len;\n const proj = projectOntoSegment(point, from, to).point;\n let t = (proj.x - from.x) * ux + (proj.y - from.y) * uy;\n t = Math.min(len - half, Math.max(half, t));\n return {\n p1: { x: from.x + ux * (t - half), y: from.y + uy * (t - half) },\n p2: { x: from.x + ux * (t + half), y: from.y + uy * (t + half) },\n };\n}\n\nfunction cutPointsOnCubic(\n from: Vec2,\n edge: Extract<PathEdge, { kind: 'cubic' }>,\n to: Vec2,\n point: Vec2,\n gap: number,\n): {\n p1: Vec2;\n p2: Vec2;\n leftEdge: PathEdge;\n rightEdge: PathEdge;\n} | null {\n const { t } = nearestTOnCubic(point, from, edge.c1, edge.c2, to);\n const chord = Math.hypot(to.x - from.x, to.y - from.y);\n const dt =\n chord > 1e-6\n ? Math.min(0.04, Math.max(0.006, gap / (2 * chord)))\n : 0.015;\n const t1 = Math.min(0.92, Math.max(0.04, t - dt));\n const t2 = Math.min(0.96, Math.max(t1 + 0.012, t + dt));\n if (t2 - t1 < 0.01) return null;\n const first = splitCubic(from, edge.c1, edge.c2, to, t1);\n const local = (t2 - t1) / Math.max(1e-6, 1 - t1);\n const second = splitCubic(\n first.left.to,\n first.right.c1,\n first.right.c2,\n to,\n local,\n );\n return {\n p1: cloneVec(first.left.to),\n p2: cloneVec(second.left.to),\n leftEdge: { kind: 'cubic', c1: first.left.c1, c2: first.left.c2 },\n rightEdge: { kind: 'cubic', c1: second.right.c1, c2: second.right.c2 },\n };\n}\n\nfunction rebuildOpenFromClosedCut(\n ring: PathRing,\n edgeIndex: number,\n p1: Vec2,\n p2: Vec2,\n leftEdge: PathEdge,\n rightEdge: PathEdge,\n): PathRing {\n const n = ring.anchors.length;\n const fromIdx = edgeIndex;\n const toIdx = (edgeIndex + 1) % n;\n const anchors = [cloneVec(p2), cloneVec(ring.anchors[toIdx])];\n const edges: PathEdge[] = [cloneEdge(rightEdge)];\n let i = toIdx;\n while (i !== fromIdx) {\n const next = (i + 1) % n;\n edges.push(cloneEdge(ring.edges[i]));\n anchors.push(cloneVec(ring.anchors[next]));\n i = next;\n }\n anchors.push(cloneVec(p1));\n edges.push(cloneEdge(leftEdge));\n return { closed: false, anchors, edges };\n}\n\nfunction splitOpenRingAtCut(\n ring: PathRing,\n edgeIndex: number,\n p1: Vec2,\n p2: Vec2,\n leftEdge: PathEdge,\n rightEdge: PathEdge,\n): PathRing[] {\n const fromIdx = edgeIndex;\n const toIdx = edgeIndex + 1;\n const left: PathRing = {\n closed: false,\n anchors: [...ring.anchors.slice(0, fromIdx + 1).map(cloneVec), cloneVec(p1)],\n edges: [\n ...ring.edges.slice(0, fromIdx).map(cloneEdge),\n cloneEdge(leftEdge),\n ],\n };\n const right: PathRing = {\n closed: false,\n anchors: [cloneVec(p2), ...ring.anchors.slice(toIdx).map(cloneVec)],\n edges: [cloneEdge(rightEdge), ...ring.edges.slice(toIdx).map(cloneEdge)],\n };\n return [left, right].filter((item) => item.anchors.length >= 2);\n}\n\nexport function openWholeEdge(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n): ShapeGeometry {\n const rings = geometryToRings(geometry).map(cloneRing);\n const ring = rings[ringIndex];\n if (!ring || edgeIndex < 0 || edgeIndex >= edgeCount(ring)) return geometry;\n\n if (ring.closed) {\n const n = ring.anchors.length;\n if (n < 3) return geometry;\n const fromIdx = edgeIndex;\n const toIdx = (edgeIndex + 1) % n;\n const anchors = [cloneVec(ring.anchors[toIdx])];\n const edges: PathEdge[] = [];\n let i = toIdx;\n while (i !== fromIdx) {\n const next = (i + 1) % n;\n edges.push(cloneEdge(ring.edges[i]));\n anchors.push(cloneVec(ring.anchors[next]));\n i = next;\n }\n rings[ringIndex] = { closed: false, anchors, edges };\n return ringsToGeometry(rings);\n }\n\n if (edgeIndex === 0) {\n ring.anchors.shift();\n ring.edges.shift();\n if (ring.anchors.length < 2) rings.splice(ringIndex, 1);\n return ringsToGeometry(rings);\n }\n if (edgeIndex === ring.edges.length - 1) {\n ring.anchors.pop();\n ring.edges.pop();\n if (ring.anchors.length < 2) rings.splice(ringIndex, 1);\n return ringsToGeometry(rings);\n }\n\n const left: PathRing = {\n closed: false,\n anchors: ring.anchors.slice(0, edgeIndex + 1).map(cloneVec),\n edges: ring.edges.slice(0, edgeIndex).map(cloneEdge),\n };\n const right: PathRing = {\n closed: false,\n anchors: ring.anchors.slice(edgeIndex + 1).map(cloneVec),\n edges: ring.edges.slice(edgeIndex + 1).map(cloneEdge),\n };\n const next = [left, right].filter((item) => item.anchors.length >= 2);\n rings.splice(ringIndex, 1, ...next);\n return ringsToGeometry(rings);\n}\n\nexport function cutEdgeOpen(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n point: Vec2,\n gap: number,\n): ShapeGeometry {\n const rings = geometryToRings(geometry).map(cloneRing);\n const ring = rings[ringIndex];\n if (!ring || edgeIndex < 0 || edgeIndex >= edgeCount(ring)) return geometry;\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n\n let p1: Vec2;\n let p2: Vec2;\n let leftEdge: PathEdge;\n let rightEdge: PathEdge;\n\n if (edge.kind === 'cubic') {\n const cut = cutPointsOnCubic(from, edge, to, point, gap);\n if (!cut) return openWholeEdge(geometry, ringIndex, edgeIndex);\n p1 = cut.p1;\n p2 = cut.p2;\n leftEdge = cut.leftEdge;\n rightEdge = cut.rightEdge;\n } else {\n const cut = cutPointsOnLine(from, to, point, gap);\n if (!cut) return openWholeEdge(geometry, ringIndex, edgeIndex);\n p1 = cut.p1;\n p2 = cut.p2;\n leftEdge = { kind: 'line' };\n rightEdge = { kind: 'line' };\n }\n\n if (ring.closed) {\n rings[ringIndex] = rebuildOpenFromClosedCut(\n ring,\n edgeIndex,\n p1,\n p2,\n leftEdge,\n rightEdge,\n );\n return ringsToGeometry(rings);\n }\n\n const pieces = splitOpenRingAtCut(\n ring,\n edgeIndex,\n p1,\n p2,\n leftEdge,\n rightEdge,\n );\n rings.splice(ringIndex, 1, ...pieces);\n return ringsToGeometry(rings);\n}\n\nfunction concatOpenRings(left: PathRing, right: PathRing, tol: number): PathRing {\n const leftEnd = left.anchors[left.anchors.length - 1];\n const rightStart = right.anchors[0];\n const weld = vecEq(leftEnd, rightStart, tol);\n const anchors = weld\n ? [...left.anchors.map(cloneVec), ...right.anchors.slice(1).map(cloneVec)]\n : [...left.anchors.map(cloneVec), ...right.anchors.map(cloneVec)];\n const edges = weld\n ? [...left.edges.map(cloneEdge), ...right.edges.map(cloneEdge)]\n : [...left.edges.map(cloneEdge), { kind: 'line' as const }, ...right.edges.map(cloneEdge)];\n return maybeCloseCoincident({ closed: false, anchors, edges }, tol);\n}\n\nfunction closeOpenRing(ring: PathRing, tol: number): PathRing {\n const coincident = vecEq(\n ring.anchors[0],\n ring.anchors[ring.anchors.length - 1],\n tol,\n );\n if (coincident) return maybeCloseCoincident(ring, tol);\n return {\n closed: true,\n anchors: ring.anchors.map(cloneVec),\n edges: [...ring.edges.map(cloneEdge), { kind: 'line' }],\n };\n}\n\nexport function joinOpenEndpoints(\n geometry: ShapeGeometry,\n a: { ringIndex: number; end: 'start' | 'end' },\n b: { ringIndex: number; end: 'start' | 'end' },\n tol = DEFAULT_WELD_TOLERANCE,\n): ShapeGeometry {\n const rings = geometryToRings(geometry).map(cloneRing);\n const ra = rings[a.ringIndex];\n const rb = rings[b.ringIndex];\n if (!ra || !rb || ra.closed || rb.closed) return geometry;\n\n if (a.ringIndex === b.ringIndex) {\n if (a.end === b.end) return geometry;\n rings[a.ringIndex] = closeOpenRing(ra, tol);\n return ringsToGeometry(rings);\n }\n\n const left = a.end === 'end' ? cloneRing(ra) : reverseRing(ra);\n const right = b.end === 'start' ? cloneRing(rb) : reverseRing(rb);\n const joined = concatOpenRings(left, right, tol);\n const keep = Math.min(a.ringIndex, b.ringIndex);\n const drop = Math.max(a.ringIndex, b.ringIndex);\n rings[keep] = joined;\n rings.splice(drop, 1);\n return ringsToGeometry(rings);\n}\n\nfunction joinAcrossShapes(\n shapes: ShapeGeo[],\n a: OpenEndId,\n b: OpenEndId,\n tol: number,\n): { shapes: ShapeGeo[]; deleteIds: number[] } {\n const ia = shapes.findIndex((s) => s.id === a.shapeId);\n const ib = shapes.findIndex((s) => s.id === b.shapeId);\n if (ia < 0 || ib < 0) return { shapes, deleteIds: [] };\n\n if (a.shapeId === b.shapeId) {\n const next = shapes.slice();\n next[ia] = {\n ...next[ia],\n geometry: joinOpenEndpoints(next[ia].geometry, a, b, tol),\n };\n return { shapes: next, deleteIds: [] };\n }\n\n const ringsA = geometryToRings(shapes[ia].geometry).map(cloneRing);\n const ringsB = geometryToRings(shapes[ib].geometry).map(cloneRing);\n const offset = ringsA.length;\n const merged = ringsToGeometry([...ringsA, ...ringsB]);\n const joined = joinOpenEndpoints(\n merged,\n a,\n { ringIndex: b.ringIndex + offset, end: b.end },\n tol,\n );\n const next = shapes\n .filter((s) => s.id !== b.shapeId)\n .map((s) => (s.id === a.shapeId ? { ...s, geometry: joined } : s));\n return { shapes: next, deleteIds: [b.shapeId] };\n}\n\nexport function weldCoincidentOpenEnds(\n shapes: ShapeGeo[],\n tol = DEFAULT_WELD_TOLERANCE,\n): { shapes: ShapeGeo[]; deleteIds: number[] } {\n let current = shapes;\n const deleteIds: number[] = [];\n for (let n = 0; n < 24; n++) {\n const ends: OpenEndHit[] = [];\n for (const shape of current) {\n for (const end of listOpenEnds(shape.geometry)) {\n ends.push({\n shapeId: shape.id,\n ringIndex: end.ringIndex,\n end: end.end,\n point: end.point,\n distance: 0,\n });\n }\n }\n let best: { a: OpenEndHit; b: OpenEndHit; dist: number } | null = null;\n for (let i = 0; i < ends.length; i++) {\n for (let j = i + 1; j < ends.length; j++) {\n const a = ends[i];\n const b = ends[j];\n if (a.shapeId === b.shapeId && a.ringIndex === b.ringIndex) continue;\n const dist = distance(a.point, b.point);\n const pairTol = a.shapeId === b.shapeId ? Math.min(tol, 0.75) : tol;\n if (dist <= pairTol && (!best || dist < best.dist)) {\n best = { a, b, dist };\n }\n }\n }\n if (!best) break;\n const joined = joinAcrossShapes(current, best.a, best.b, tol);\n current = joined.shapes;\n deleteIds.push(...joined.deleteIds);\n }\n return { shapes: current, deleteIds };\n}\n\nexport function forkClosedRings(shape: ShapeGeo): {\n keep: ShapeGeo;\n extras: ShapeGeometry[];\n} {\n const rings = geometryToRings(shape.geometry);\n const closed = rings.filter((ring) => ring.closed && ring.anchors.length >= 3);\n const opens = rings.filter((ring) => !ring.closed && ring.anchors.length >= 2);\n if (closed.length <= 1) {\n return { keep: shape, extras: [] };\n }\n return {\n keep: {\n ...shape,\n geometry: ringsToGeometry([closed[0], ...opens]),\n },\n extras: closed.slice(1).map((ring) => ringsToGeometry([ring])),\n };\n}\n\nfunction finishEdits(\n before: ShapeGeo[],\n working: ShapeGeo[],\n extraDeletes: number[],\n): ShapeBatchEdit[] {\n const welded = weldCoincidentOpenEnds(working);\n const deleteSet = new Set([...extraDeletes, ...welded.deleteIds]);\n const extras: Array<{ fromId: number; geometry: ShapeGeometry; kind: ShapeKind; style?: ShapeStyle }> =\n [];\n const kept: ShapeGeo[] = [];\n for (const shape of welded.shapes) {\n if (deleteSet.has(shape.id)) continue;\n const forked = forkClosedRings(shape);\n kept.push(forked.keep);\n for (const geometry of forked.extras) {\n extras.push({\n fromId: shape.id,\n geometry,\n kind: shape.kind,\n style: shape.style,\n });\n }\n }\n\n const edits: ShapeBatchEdit[] = [];\n const beforeById = new Map(before.map((s) => [s.id, s]));\n for (const shape of kept) {\n const prev = beforeById.get(shape.id);\n if (!prev) continue;\n if (JSON.stringify(prev.geometry) !== JSON.stringify(shape.geometry)) {\n edits.push({\n action: 'update',\n shapeId: shape.id,\n geometry: shape.geometry,\n });\n }\n }\n for (const extra of extras) {\n edits.push({\n action: 'create',\n kind: extra.kind,\n geometry: extra.geometry,\n style: extra.style,\n });\n }\n for (const id of deleteSet) {\n if (beforeById.has(id)) edits.push({ action: 'delete', shapeId: id });\n }\n return edits;\n}\n\nexport function applySplitJoinCut(\n shapes: ShapeGeo[],\n hit: { shapeId: number; ringIndex: number; edgeIndex: number; point: Vec2 },\n gap: number,\n): ShapeBatchEdit[] {\n const target = shapes.find((s) => s.id === hit.shapeId);\n if (!target) return [];\n const others = shapes.filter((s) => s.id !== hit.shapeId);\n const rings = geometryToRings(target.geometry);\n const ring = rings[hit.ringIndex];\n if (!ring) return [];\n const from = edgeFrom(ring, hit.edgeIndex);\n const to = edgeTo(ring, hit.edgeIndex);\n const shared = edgeLiesOnOtherShape(from, to, others);\n const nextGeo = shared\n ? openWholeEdge(target.geometry, hit.ringIndex, hit.edgeIndex)\n : cutEdgeOpen(target.geometry, hit.ringIndex, hit.edgeIndex, hit.point, gap);\n const next = shapes.map((s) =>\n s.id === hit.shapeId ? { ...s, geometry: nextGeo } : s,\n );\n return finishEdits(shapes, next, []);\n}\n\nexport function applySplitJoinJoin(\n shapes: ShapeGeo[],\n a: OpenEndId,\n b: OpenEndId,\n): ShapeBatchEdit[] {\n if (sameOpenEnd(a, b)) return [];\n const joined = joinAcrossShapes(shapes, a, b, DEFAULT_WELD_TOLERANCE);\n return finishEdits(shapes, joined.shapes, joined.deleteIds);\n}\n\nexport function hitOpenEnd(\n shapes: ShapeGeo[],\n point: Vec2,\n tol: number,\n skip?: OpenEndId | null,\n): OpenEndHit | null {\n let best: OpenEndHit | null = null;\n for (const shape of shapes) {\n for (const end of listOpenEnds(shape.geometry)) {\n const id: OpenEndId = {\n shapeId: shape.id,\n ringIndex: end.ringIndex,\n end: end.end,\n };\n if (skip && sameOpenEnd(skip, id)) continue;\n const dist = distance(point, end.point);\n if (dist > tol) continue;\n const preferOther =\n skip &&\n (shape.id !== skip.shapeId || end.ringIndex !== skip.ringIndex);\n const bestPrefer =\n best &&\n skip &&\n (best.shapeId !== skip.shapeId || best.ringIndex !== skip.ringIndex);\n if (\n !best ||\n (preferOther && !bestPrefer) ||\n (preferOther === bestPrefer && dist < best.distance)\n ) {\n best = { ...id, point: end.point, distance: dist };\n }\n }\n }\n return best;\n}\n\nexport function hitSplitJoinEdge(\n shapes: ShapeGeo[],\n point: Vec2,\n tol: number,\n): SplitJoinEdgeHit | null {\n let best: SplitJoinEdgeHit | null = null;\n for (const shape of shapes) {\n const hit = hitTestEdge(shape.geometry, point, tol);\n if (!hit) continue;\n if (!best || hit.distance < best.distance) {\n const rings = geometryToRings(shape.geometry);\n const ring = rings[hit.polygonIndex];\n const from = ring ? edgeFrom(ring, hit.afterVertexIndex) : point;\n const to = ring ? edgeTo(ring, hit.afterVertexIndex) : point;\n best = {\n shapeId: shape.id,\n ringIndex: hit.polygonIndex,\n edgeIndex: hit.afterVertexIndex,\n point: hit.point,\n shared: edgeLiesOnOtherShape(\n from,\n to,\n shapes.filter((s) => s.id !== shape.id),\n ),\n distance: hit.distance,\n };\n }\n }\n return best;\n}\n\nexport function previewCutPoints(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n point: Vec2,\n gap: number,\n): { p1: Vec2; p2: Vec2 } | null {\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n if (!ring) return null;\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n if (edge.kind === 'cubic') {\n const cut = cutPointsOnCubic(from, edge, to, point, gap);\n return cut ? { p1: cut.p1, p2: cut.p2 } : null;\n }\n return cutPointsOnLine(from, to, point, gap);\n}\n","import type { Vec2 } from '../core';\n\n/** Closest candidate within `tol` world units, or null. */\nexport function nearestSnapPoint(\n point: Vec2,\n candidates: Vec2[],\n tol: number,\n): Vec2 | null {\n let best: { point: Vec2; distance: number } | null = null;\n for (const candidate of candidates) {\n const distance = Math.hypot(candidate.x - point.x, candidate.y - point.y);\n if (distance <= tol && (!best || distance < best.distance)) {\n best = { point: candidate, distance };\n }\n }\n return best ? { x: best.point.x, y: best.point.y } : null;\n}\n\nexport function sameSnapPoint(a: Vec2 | null, b: Vec2 | null, eps = 1e-4): boolean {\n if (!a || !b) return false;\n return Math.abs(a.x - b.x) <= eps && Math.abs(a.y - b.y) <= eps;\n}\n","import type { ShapeGeometry, Vec2 } from '../core';\nimport { buildGeometryFromPaths } from '../core';\n\nexport interface EllipseBounds {\n cx: number;\n cy: number;\n rx: number;\n ry: number;\n}\n\n/** Drag from corner `from` to `to`. Shift / lockCircle keeps rx === ry. */\nexport function ellipseBoundsFromDrag(\n from: Vec2,\n to: Vec2,\n lockCircle = false,\n): EllipseBounds {\n let x1 = to.x;\n let y1 = to.y;\n if (lockCircle) {\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const side = Math.max(Math.abs(dx), Math.abs(dy));\n const sx = dx === 0 ? (dy === 0 ? 1 : Math.sign(dy)) : Math.sign(dx);\n const sy = dy === 0 ? (dx === 0 ? 1 : Math.sign(dx)) : Math.sign(dy);\n x1 = from.x + sx * side;\n y1 = from.y + sy * side;\n }\n const rx = Math.abs(x1 - from.x) / 2;\n const ry = Math.abs(y1 - from.y) / 2;\n return {\n cx: (from.x + x1) / 2,\n cy: (from.y + y1) / 2,\n rx,\n ry,\n };\n}\n\nexport function ellipsePathD(bounds: EllipseBounds): string {\n const { cx, cy, rx, ry } = bounds;\n const arx = Math.max(rx, 1e-4);\n const ary = Math.max(ry, 1e-4);\n return `M ${cx - arx} ${cy} A ${arx} ${ary} 0 1 0 ${cx + arx} ${cy} A ${arx} ${ary} 0 1 0 ${cx - arx} ${cy} Z`;\n}\n\nexport function ellipseGeometry(\n from: Vec2,\n to: Vec2,\n lockCircle = false,\n): ShapeGeometry {\n return buildGeometryFromPaths([\n ellipsePathD(ellipseBoundsFromDrag(from, to, lockCircle)),\n ]);\n}\n","import type { BBox, ShapeGeometry, ShapeLabel, Vec2, ViewBox } from '../core';\nimport { geometryBBox } from '../core';\nimport { MAP_FONT_FAMILY, MAP_LABEL_LINE_HEIGHT } from '../fonts/mapFont';\nimport { polygonsToGeometry } from './geometryEdit';\n\nexport const DEFAULT_LABEL_TEXT = 'Text';\nexport const DEFAULT_LABEL_SIZE = 48;\nexport const LABEL_FONT_FAMILY = MAP_FONT_FAMILY;\nexport const LABEL_LINE_HEIGHT = MAP_LABEL_LINE_HEIGHT;\n/** Fallback advance when canvas measurement is unavailable (tests / SSR). */\nconst FALLBACK_CHAR_ADVANCE = 0.5;\n\nexport function isTextLabel(shape: {\n kind: string;\n label?: { text?: string } | null;\n}): boolean {\n return shape.kind === 'label' && Boolean(shape.label?.text?.trim());\n}\n\nexport function defaultLabelSize(_viewbox?: ViewBox): number {\n return DEFAULT_LABEL_SIZE;\n}\n\nexport function labelTextLines(text: string): string[] {\n const source = text.replace(/\\r\\n/g, '\\n').trim() || DEFAULT_LABEL_TEXT;\n return source.split('\\n');\n}\n\nlet measureCtx: CanvasRenderingContext2D | null | undefined;\n\nfunction textMeasureContext(): CanvasRenderingContext2D | null {\n if (measureCtx !== undefined) return measureCtx;\n if (typeof document === 'undefined') {\n measureCtx = null;\n return null;\n }\n const canvas = document.createElement('canvas');\n measureCtx = canvas.getContext('2d');\n return measureCtx;\n}\n\nexport function measureLabelText(\n text: string,\n size: number,\n): { width: number; height: number; lines: string[] } {\n const lines = labelTextLines(text);\n const ctx = textMeasureContext();\n let width = 0;\n if (ctx) {\n ctx.font = `${size}px ${LABEL_FONT_FAMILY}`;\n for (const line of lines) {\n width = Math.max(width, ctx.measureText(line || ' ').width);\n }\n } else {\n const longest = lines.reduce((max, line) => Math.max(max, line.length), 1);\n width = longest * size * FALLBACK_CHAR_ADVANCE;\n }\n return {\n width: Math.max(width, size * 0.2),\n height: Math.max(lines.length, 1) * size * LABEL_LINE_HEIGHT,\n lines,\n };\n}\n\nexport function labelBoxCenter(box: BBox): Vec2 {\n return { x: (box.minX + box.maxX) / 2, y: (box.minY + box.maxY) / 2 };\n}\n\nexport function textLabelPolygon(origin: Vec2, text: string, size: number): Vec2[] {\n const { width, height } = measureLabelText(text, size);\n return [\n { x: origin.x, y: origin.y - height },\n { x: origin.x + width, y: origin.y - height },\n { x: origin.x + width, y: origin.y },\n { x: origin.x, y: origin.y },\n ];\n}\n\nexport function textLabelGeometry(\n origin: Vec2,\n text: string,\n size: number,\n): ShapeGeometry {\n return polygonsToGeometry([textLabelPolygon(origin, text, size)]);\n}\n\nexport function defaultTextLabel(text: string, size: number, color?: string): ShapeLabel {\n return {\n text: text.trim() || DEFAULT_LABEL_TEXT,\n size,\n color,\n autoFit: true,\n };\n}\n\n/** Keep the box anchored at the current bottom-left when the string changes. */\nexport function geometryForLabelText(\n geometry: ShapeGeometry,\n text: string,\n size: number,\n): ShapeGeometry {\n const box = geometryBBox(geometry);\n return textLabelGeometry({ x: box.minX, y: box.maxY }, text, size);\n}\n","import type { ShapeGeometry, ShapeLabel, Vec2 } from '../core';\nimport {\n DEFAULT_ENTRANCE_SIZE,\n ENTRANCE_ICON_ID,\n canonicalizeEntranceLabel,\n clampEntranceSize,\n geometryBBox,\n isEntranceIcon,\n} from '../core';\nimport { polygonsToGeometry } from './geometryEdit';\nimport { isTextLabel, labelBoxCenter } from './labelText';\n\nexport {\n DEFAULT_ENTRANCE_SIZE,\n ENTRANCE_ICON_ID,\n canonicalizeEntranceLabel,\n clampEntranceSize,\n isEntranceIcon,\n};\n\nexport function isStampShape(shape: {\n kind: string;\n label?: { text?: string; imageKey?: string | null } | null;\n}): boolean {\n return isTextLabel(shape) || isEntranceIcon(shape);\n}\n\nexport function defaultEntranceLabel(size: number, color?: string): ShapeLabel {\n return {\n imageKey: ENTRANCE_ICON_ID,\n size: clampEntranceSize(size),\n color,\n rotate: 0,\n };\n}\n\nexport function entranceIconPolygon(center: Vec2, size: number): Vec2[] {\n const half = clampEntranceSize(size) / 2;\n return [\n { x: center.x - half, y: center.y - half },\n { x: center.x + half, y: center.y - half },\n { x: center.x + half, y: center.y + half },\n { x: center.x - half, y: center.y + half },\n ];\n}\n\nexport function entranceIconGeometry(center: Vec2, size: number): ShapeGeometry {\n return polygonsToGeometry([entranceIconPolygon(center, size)]);\n}\n\n/** Keep the icon centred when Size changes. */\nexport function geometryForEntranceIcon(\n geometry: ShapeGeometry,\n size: number,\n): ShapeGeometry {\n return entranceIconGeometry(labelBoxCenter(geometryBBox(geometry)), size);\n}\n","import type { Vec2 } from '../../core';\nimport { nextZoomFromWheel } from '../../core/wheelZoom';\n\n/** 2D affine matrix in DOMMatrix / SVGMatrix layout (a c e / b d f). */\nexport interface Affine2 {\n a: number;\n b: number;\n c: number;\n d: number;\n e: number;\n f: number;\n}\n\nexport interface ViewBoxRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface ClientRectLike {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/**\n * Map a client (CSS pixel) point through the inverse of an SVG screen CTM.\n * Prefer {@link clientRectToViewBox} for pointer mapping — `getScreenCTM()` on\n * the root `<svg>` is wrong inside transformed admin-portal layout.\n */\nexport function clientToUser(ctm: Affine2, clientX: number, clientY: number): Vec2 {\n const det = ctm.a * ctm.d - ctm.b * ctm.c;\n if (det === 0) return { x: 0, y: 0 };\n const x = clientX - ctm.e;\n const y = clientY - ctm.f;\n return {\n x: (ctm.d * x - ctm.c * y) / det,\n y: (-ctm.b * x + ctm.a * y) / det,\n };\n}\n\n/**\n * Viewport point → SVG viewBox user space, same method OrbitControls uses\n * (`getBoundingClientRect` + letterboxed viewBox). Default map zoom-to-cursor\n * works in admin-portal because of this; Edit Map must not use `getScreenCTM()`.\n *\n * Assumes `preserveAspectRatio=\"xMidYMid meet\"` (editor canvas default).\n */\nexport function clientRectToViewBox(\n rect: ClientRectLike,\n viewBox: ViewBoxRect,\n clientX: number,\n clientY: number,\n): Vec2 {\n const vbW = viewBox.width > 0 ? viewBox.width : Math.max(rect.width, 1);\n const vbH = viewBox.height > 0 ? viewBox.height : Math.max(rect.height, 1);\n const scale = Math.min(rect.width / vbW, rect.height / vbH);\n if (!(scale > 0) || !Number.isFinite(scale)) {\n return { x: viewBox.x, y: viewBox.y };\n }\n const originX = rect.left + (rect.width - vbW * scale) / 2;\n const originY = rect.top + (rect.height - vbH * scale) / 2;\n return {\n x: viewBox.x + (clientX - originX) / scale,\n y: viewBox.y + (clientY - originY) / scale,\n };\n}\n\nexport function pxPerUserFromViewBox(rect: ClientRectLike, viewBox: ViewBoxRect): number {\n const vbW = viewBox.width > 0 ? viewBox.width : Math.max(rect.width, 1);\n const vbH = viewBox.height > 0 ? viewBox.height : Math.max(rect.height, 1);\n const scale = Math.min(rect.width / vbW, rect.height / vbH);\n return scale > 0 && Number.isFinite(scale) ? scale : 1;\n}\n\nfunction readSvgViewBox(svg: SVGSVGElement): ViewBoxRect | null {\n const vb = svg.viewBox?.baseVal;\n if (vb && vb.width > 0 && vb.height > 0) {\n return { x: vb.x, y: vb.y, width: vb.width, height: vb.height };\n }\n const attr = svg.getAttribute('viewBox');\n if (!attr) return null;\n const parts = attr.trim().split(/[\\s,]+/).map(Number);\n if (parts.length !== 4 || parts.some((n) => !Number.isFinite(n))) return null;\n if (parts[2] <= 0 || parts[3] <= 0) return null;\n return { x: parts[0], y: parts[1], width: parts[2], height: parts[3] };\n}\n\nexport function clientToSvgUser(svg: SVGSVGElement, clientX: number, clientY: number): Vec2 {\n const viewBox = readSvgViewBox(svg);\n if (viewBox) {\n return clientRectToViewBox(svg.getBoundingClientRect(), viewBox, clientX, clientY);\n }\n const ctm = svg.getScreenCTM();\n if (!ctm) return { x: 0, y: 0 };\n return clientToUser(ctm, clientX, clientY);\n}\n\nexport function pxPerUserFromSvg(svg: SVGSVGElement): number {\n const viewBox = readSvgViewBox(svg);\n if (viewBox) return pxPerUserFromViewBox(svg.getBoundingClientRect(), viewBox);\n const ctm = svg.getScreenCTM();\n if (!ctm) return 1;\n return pxPerUserFromCtm(ctm);\n}\n\n/** Invert `translate(pan) scale(zoom)` so a user-space point becomes world geometry. */\nexport function userToWorld(user: Vec2, pan: Vec2, zoom: number): Vec2 {\n const z = zoom === 0 ? 1 : zoom;\n return {\n x: (user.x - pan.x) / z,\n y: (user.y - pan.y) / z,\n };\n}\n\nexport const EDITOR_MIN_ZOOM = 0.2;\n/** High enough that designers can park on a single storefront or route node. */\nexport const EDITOR_MAX_ZOOM = 128;\n\nexport function clampEditorZoom(zoom: number): number {\n return Math.min(EDITOR_MAX_ZOOM, Math.max(EDITOR_MIN_ZOOM, zoom));\n}\n\n/** Same per-event step as PORTAL default MapViewer (three-stdlib OrbitControls). */\nexport function nextEditorZoomFromWheel(\n currentZoom: number,\n event: Pick<WheelEvent, 'deltaY'>,\n): number {\n return nextZoomFromWheel(currentZoom, event.deltaY, {\n min: EDITOR_MIN_ZOOM,\n max: EDITOR_MAX_ZOOM,\n });\n}\n\n/** CSS pixels per SVG user unit from a screen CTM (ignores translation). */\nexport function pxPerUserFromCtm(ctm: Affine2): number {\n return Math.hypot(ctm.a, ctm.b);\n}\n\n/** World-space length that draws as `px` CSS pixels after `scale(zoom)`. */\nexport function screenPxToWorld(px: number, zoom: number, pxPerUser: number): number {\n const z = zoom === 0 ? 1 : zoom;\n const scale = pxPerUser > 0 ? pxPerUser : 1;\n return px / (scale * z);\n}\n\n/**\n * Counter-scale for editor handles whose world radius was computed at\n * `sizeZoom` while the SVG group is already at `liveZoom`.\n *\n * Wheel zoom paints `scale(liveZoom)` immediately and defers React, so\n * handle radii stay at the last settled zoom. This ratio keeps those\n * circles screen-constant without re-rendering the floor.\n */\nexport function editorHandleScale(sizeZoom: number, liveZoom: number): number {\n const size = sizeZoom === 0 ? 1 : sizeZoom;\n const live = liveZoom === 0 ? 1 : liveZoom;\n return size / live;\n}\n\n/**\n * Next pan so `user` (cursor or pinch midpoint in viewBox space) stays over\n * the same world point after `zoom` → `nextZoom`. Without this, SVG\n * `scale()` pivots around the viewBox origin (top-left).\n */\nexport function panAfterZoom(\n user: Vec2,\n pan: Vec2,\n zoom: number,\n nextZoom: number,\n): Vec2 {\n const world = userToWorld(user, pan, zoom);\n return {\n x: user.x - nextZoom * world.x,\n y: user.y - nextZoom * world.y,\n };\n}\n\n/** Pan that keeps a known world point under `user` at `zoom`. */\nexport function panKeepingWorldAtUser(user: Vec2, world: Vec2, zoom: number): Vec2 {\n return {\n x: user.x - zoom * world.x,\n y: user.y - zoom * world.y,\n };\n}\n\nexport const EDITOR_ZOOM_ANIM_MS = 240;\n\nexport function easeOutCubic(t: number): number {\n const x = Math.min(1, Math.max(0, t));\n return 1 - (1 - x) ** 3;\n}\n\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\n/** Interpolate pan + zoom for a smooth +/− / Reset. */\nexport function interpolateView(\n from: { pan: Vec2; zoom: number },\n to: { pan: Vec2; zoom: number },\n t: number,\n): { pan: Vec2; zoom: number } {\n const e = easeOutCubic(t);\n return {\n pan: {\n x: lerp(from.pan.x, to.pan.x, e),\n y: lerp(from.pan.y, to.pan.y, e),\n },\n zoom: lerp(from.zoom, to.zoom, e),\n };\n}\n","import type { ShapeKind, ThemeDefaults } from '../../core';\nimport {\n isTransparentColor,\n isTransparentPadKind,\n resolvedShapeFill,\n staffPadPlaceholderFill,\n WALKING_PATH_COLOR,\n} from '../../core';\n\n/** Edit Map fills stay translucent so the grid shows through for alignment. */\nexport function editorShapeFillOpacity(kind: ShapeKind): number {\n if (kind === 'void') return 0.22;\n if (kind === 'amenity') return 0.15;\n if (kind === 'unit' || kind === 'parking_zone') return 0.38;\n return 0.3;\n}\n\nexport function editorShapeFill(\n shape: { kind: ShapeKind; style?: { fill?: string } },\n theme: ThemeDefaults,\n assignment?: { bgColor?: string | null } | null,\n): string {\n if (shape.kind === 'walkable') return WALKING_PATH_COLOR;\n if (shape.kind === 'void') return shape.style?.fill ?? '#94a3b8';\n const published = resolvedShapeFill(\n shape.kind,\n theme,\n shape.style?.fill,\n assignment,\n );\n if (\n isTransparentPadKind(shape.kind) &&\n isTransparentColor(published)\n ) {\n return staffPadPlaceholderFill(shape.kind, theme);\n }\n return published;\n}\n","import {\n darkenShapeFill,\n INTERACTIVE_SHAPE_KINDS,\n type ShapeKind,\n} from '../../core';\nimport { isShapeDrawTool, isStampDrawTool, type EditorTool } from '../tools';\n\n/** Wayfinding / vertex chrome — not a customer Style color. */\nexport const EDITOR_GUIDE_COLOR = '#2563eb';\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\n/** Hover and selection share the same darker shade of the shape fill. */\nexport function editorShapeEmphasisColor(\n fill: string,\n emphasized: boolean,\n): string {\n if (!emphasized) return fill;\n return darkenShapeFill(fill);\n}\n","import type {\n AssignmentIconTheme,\n CmAmenityCatalogItem,\n CmShape,\n CmShapeAssignment,\n LabelAlign,\n MapAssignRetailer,\n} from '../core';\nimport {\n assignmentOverlayImageUrl,\n assignmentOverlayRenderSize,\n assignmentOverlayVisible,\n assignmentSpecialIconId,\n DEFAULT_ASSIGNMENT_SIZE,\n geometryBBox,\n normalizeLabelAlign,\n publishedShapeLabel,\n resolveFetchUrl,\n resolvedAssignmentIconColor,\n} from '../core';\nimport { getMapSpecialSvg, mapSpecialSvgToDataUrl } from '../specialIcons';\n\nexport type WayfindingAssignedOverlay = {\n shapeId: number;\n x: number;\n y: number;\n rotate: number;\n /** Text font size, or image width (logos are already scaled). */\n size: number;\n color: string;\n align: LabelAlign;\n text?: string;\n imageUrl?: string;\n iconId?: string;\n};\n\ntype OverlayShape = Pick<CmShape, 'id' | 'kind' | 'geometry' | 'label' | 'style'>;\n\n/**\n * Live editor display uses the session CDN URL, not the persisted S3 key —\n * same as `compileDocument` when `persistMediaKeys` is off.\n */\nexport function liveDisplayRetailer(\n retailer?: MapAssignRetailer | null,\n): MapAssignRetailer | null {\n if (!retailer) return null;\n const key = retailer.logoKey?.trim() ?? '';\n if (!retailer.logoUrl && /^https?:\\/\\//i.test(key)) return retailer;\n return { ...retailer, logoKey: null };\n}\n\n/**\n * Name, logo, or amenity / kiosk icon for an assigned polygon. Unassigned\n * leftover text is dropped. Used by the wayfinding canvas only.\n */\nexport function wayfindingAssignedOverlay(\n shape: OverlayShape,\n assignment: CmShapeAssignment | null | undefined,\n retailer: MapAssignRetailer | null | undefined,\n amenities: Array<Pick<CmAmenityCatalogItem, 'id' | 'code'>> = [],\n theme: AssignmentIconTheme,\n): WayfindingAssignedOverlay | null {\n if (shape.kind === 'label' || shape.kind === 'entrance') return null;\n const displayRetailer = liveDisplayRetailer(retailer);\n const label = publishedShapeLabel(shape, assignment, displayRetailer);\n if (!assignmentOverlayVisible(assignment, label)) return null;\n const box = geometryBBox(shape.geometry);\n const fontSize =\n label.size || assignment?.size || DEFAULT_ASSIGNMENT_SIZE;\n const imageUrl = assignmentOverlayImageUrl(\n assignment,\n displayRetailer,\n label,\n );\n const iconId = imageUrl\n ? undefined\n : assignmentSpecialIconId(assignment, amenities);\n const text = imageUrl || iconId ? undefined : label.text?.trim() || undefined;\n if (!imageUrl && !iconId && !text) return null;\n return {\n shapeId: shape.id,\n x: (box.minX + box.maxX) / 2 + (label.offsetX ?? 0),\n y: (box.minY + box.maxY) / 2 + (label.offsetY ?? 0),\n rotate: label.rotate ?? 0,\n size: imageUrl\n ? assignmentOverlayRenderSize(fontSize, assignment)\n : fontSize,\n color: resolvedAssignmentIconColor(\n assignment,\n theme,\n label.color,\n shape.kind,\n ),\n align: normalizeLabelAlign(label.align),\n text,\n imageUrl,\n iconId,\n };\n}\n\nexport function wayfindingAssignedOverlays(input: {\n shapes: OverlayShape[];\n /** Outdoor/base shapes shown beneath the active building floor. */\n underlayShapes?: OverlayShape[];\n assignments: CmShapeAssignment[];\n retailers?: MapAssignRetailer[];\n amenities?: Array<Pick<CmAmenityCatalogItem, 'id' | 'code'>>;\n theme: AssignmentIconTheme;\n}): WayfindingAssignedOverlay[] {\n const retailerById = new Map(\n (input.retailers ?? []).map((item) => [item.id, item]),\n );\n const assignmentByShapeId = new Map(\n input.assignments.map((row) => [row.shapeId, row]),\n );\n const amenities = input.amenities ?? [];\n const overlays: WayfindingAssignedOverlay[] = [];\n for (const shape of [...(input.underlayShapes ?? []), ...input.shapes]) {\n const assignment = assignmentByShapeId.get(shape.id);\n const retailer =\n assignment?.retailerId != null\n ? retailerById.get(assignment.retailerId) ?? null\n : null;\n const overlay = wayfindingAssignedOverlay(\n shape,\n assignment,\n retailer,\n amenities,\n input.theme,\n );\n if (overlay) overlays.push(overlay);\n }\n return overlays;\n}\n\nexport function wayfindingOverlayHref(\n overlay: Pick<WayfindingAssignedOverlay, 'imageUrl' | 'iconId' | 'color'>,\n imageProxyUrl?: string | null,\n): string | undefined {\n if (overlay.imageUrl) return resolveFetchUrl(overlay.imageUrl, imageProxyUrl);\n if (!overlay.iconId) return undefined;\n const svg = getMapSpecialSvg(overlay.iconId);\n if (!svg) return undefined;\n return mapSpecialSvgToDataUrl(svg, overlay.color);\n}\n","import React from 'react';\nimport { labelSvgTextAnchor } from '../../core';\nimport {\n LABEL_FONT_FAMILY,\n LABEL_LINE_HEIGHT,\n labelTextLines,\n} from '../labelText';\nimport {\n wayfindingOverlayHref,\n type WayfindingAssignedOverlay,\n} from '../assignmentOverlay';\n\n/** Pointer-events none so wayfinding hover / click stay on the polygon. */\nexport function AssignedShapeOverlay({\n overlay,\n imageProxyUrl,\n}: {\n overlay: WayfindingAssignedOverlay;\n imageProxyUrl?: string | null;\n}) {\n const { x, y, rotate, size, color, align, text } = overlay;\n const href = wayfindingOverlayHref(overlay, imageProxyUrl);\n const transform = rotate ? `rotate(${rotate} ${x} ${y})` : undefined;\n return (\n <g\n className=\"eyeon-map-canvas__assigned-overlay\"\n data-shape-id={overlay.shapeId}\n transform={transform}\n pointerEvents=\"none\"\n >\n {href ? (\n <image\n href={href}\n x={x - size / 2}\n y={y - size / 2}\n width={size}\n height={size}\n preserveAspectRatio=\"xMidYMid meet\"\n />\n ) : text ? (\n <AssignedOverlayText\n text={text}\n x={x}\n y={y}\n size={size}\n color={color}\n align={align}\n />\n ) : null}\n </g>\n );\n}\n\nfunction AssignedOverlayText({\n text,\n x,\n y,\n size,\n color,\n align,\n}: {\n text: string;\n x: number;\n y: number;\n size: number;\n color: string;\n align: WayfindingAssignedOverlay['align'];\n}) {\n const lines = labelTextLines(text);\n const lineHeight = size * LABEL_LINE_HEIGHT;\n const blockHeight = lines.length * lineHeight;\n return (\n <text\n fontFamily={LABEL_FONT_FAMILY}\n fontSize={size}\n fill={color}\n textAnchor={labelSvgTextAnchor(align)}\n style={{ userSelect: 'none' }}\n >\n {lines.map((line, index) => (\n <tspan\n key={index}\n x={x}\n y={y - blockHeight / 2 + (index + 0.5) * lineHeight}\n dominantBaseline=\"central\"\n >\n {line || ' '}\n </tspan>\n ))}\n </text>\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport {\n outdoorDecorationFromSvg,\n resolveFetchUrl,\n type StaticLayerTheme,\n} from '../../core';\n\nexport function OutdoorSvgUnderlay({\n url,\n imageProxyUrl,\n suppressIds,\n theme,\n}: {\n url: string;\n imageProxyUrl?: string | null;\n suppressIds?: ReadonlySet<string>;\n theme?: StaticLayerTheme | null;\n}) {\n const [svgText, setSvgText] = useState<string | null>(null);\n const suppressKey = useMemo(\n () => (suppressIds ? [...suppressIds].sort().join('\\0') : ''),\n [suppressIds],\n );\n\n useEffect(() => {\n let cancelled = false;\n const controller = new AbortController();\n const fetchUrl = resolveFetchUrl(url, imageProxyUrl);\n fetch(fetchUrl, { signal: controller.signal })\n .then((res) => {\n if (!res.ok) throw new Error(`SVG fetch ${res.status}`);\n return res.text();\n })\n .then((text) => {\n if (cancelled) return;\n setSvgText(text);\n })\n .catch((err) => {\n if (cancelled) return;\n if (err instanceof DOMException && err.name === 'AbortError') return;\n setSvgText(null);\n console.warn(\n `[eyeon-map] Outdoor SVG failed to load from ${fetchUrl}. ` +\n 'If this is a cross-origin error, pass `imageProxyUrl` to MapEditor.',\n err,\n );\n });\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [url, imageProxyUrl]);\n\n const paths = useMemo(() => {\n if (!svgText) return [];\n const blocked = suppressKey\n ? new Set(suppressKey.split('\\0').filter(Boolean))\n : undefined;\n return outdoorDecorationFromSvg(svgText, blocked, theme);\n }, [svgText, suppressKey, theme]);\n\n if (paths.length === 0) return null;\n\n return (\n <g className=\"eyeon-map-canvas__outdoor-svg\" pointerEvents=\"none\">\n {paths.map((item, index) => (\n <path\n key={`${item.id}-${index}`}\n d={item.d}\n fill={item.fill ?? 'none'}\n stroke={item.stroke ?? 'none'}\n strokeWidth={item.strokeWidth ?? 0}\n opacity={item.opacity ?? 1}\n />\n ))}\n </g>\n );\n}\n","import type { ShapeKind } from '../../core';\nimport { INTERACTIVE_SHAPE_KINDS } from '../../core';\nimport { isStampShape } from '../entranceIcon';\n\n/** Outdoor underlay items that look clickable on a floor. */\nexport function isUnderlayHintShape(kind: ShapeKind): boolean {\n return INTERACTIVE_SHAPE_KINDS.includes(kind);\n}\n\n/** Text and entrance hit-boxes stay on Outdoor — do not ghost them onto building floors. */\nexport function isUnderlayDrawnShape(shape: {\n kind: string;\n label?: { text?: string; imageKey?: string | null } | null;\n}): boolean {\n return !isStampShape(shape);\n}\n\nexport function underlaySwitchHint(kind: ShapeKind): string {\n if (kind === 'unit' || kind === 'parking_zone') {\n return 'Outdoor store — click to switch to Outdoor and edit';\n }\n if (kind === 'amenity') {\n return 'Outdoor amenity — click to switch to Outdoor and edit';\n }\n if (kind === 'kiosk_screen') {\n return 'Outdoor kiosk — click to switch to Outdoor and edit';\n }\n return 'Outdoor item — click to switch to Outdoor and edit';\n}\n","import type {\n AnchorKind,\n BatchOp,\n CmAnchor,\n CmRouteEdge,\n CmShape,\n ShapeKind,\n Vec2,\n} from '../core';\nimport {\n DEFAULT_WELD_TOLERANCE,\n INTERACTIVE_SHAPE_KINDS,\n distance,\n geometryBBox,\n projectOntoSegment,\n routeAnchorKindForShape,\n} from '../core';\n\nexport const WAYFINDING_SNAP_PX = 28;\n/**\n * One pick radius (CSS pixels) for wayfinding: the anchor dot, the + on a\n * route, and click-to-connect. On-route and off-route use the same circle.\n */\nexport const WAYFINDING_ANCHOR_HIT_PX = 10;\n\nexport function showsWayfinding(tool: string, routeMode = false): boolean {\n if (\n tool === 'draw-route' ||\n tool === 'create-route' ||\n tool === 'create-route-multi'\n ) {\n return true;\n }\n return routeMode && tool === 'select';\n}\n\n/**\n * First empty Create Route click is a preview. A second click commits both\n * ends. Leaving the tool drops the draft so a lone start is never kept.\n */\n/** Esc and Undo share this: a lone preview start is local; anything else undoes. */\nexport function routeSessionUndoKind(session: {\n routeDraftPoint: Vec2 | null;\n storeLinkPreview: unknown;\n}): 'clear-only' | 'clear-and-undo' {\n if (session.routeDraftPoint != null && session.storeLinkPreview == null) {\n return 'clear-only';\n }\n return 'clear-and-undo';\n}\n\nexport function beginOrContinueRouteDraft(\n draft: Vec2 | null,\n world: Vec2,\n): { nextDraft: Vec2 | null; start: Vec2 | null; end: Vec2 | null } {\n if (!draft) return { nextDraft: world, start: null, end: null };\n return { nextDraft: null, start: draft, end: world };\n}\n\n/** Preview line from a started route/store-link to the cursor or snap. */\nexport function routeRubberBand(\n from: Vec2 | null | undefined,\n to: Vec2 | null | undefined,\n): { from: Vec2; to: Vec2 } | null {\n if (!from || !to) return null;\n if (distance(from, to) <= 0.01) return null;\n return { from, to };\n}\n\nexport function isWayfindingShape(kind: ShapeKind): boolean {\n return INTERACTIVE_SHAPE_KINDS.includes(kind);\n}\n\n/** Outdoor pad sites are not routed — helpers and store links stay indoor. */\nexport function wayfindingLinksShapes(\n level: { kind?: string } | null | undefined,\n): boolean {\n return level?.kind !== 'outdoor';\n}\n\nexport function anchorKindForShape(kind: ShapeKind): AnchorKind {\n return routeAnchorKindForShape(kind);\n}\n\nexport function shapeRoutePoint(shape: Pick<CmShape, 'geometry'>): Vec2 {\n const box = geometryBBox(shape.geometry);\n if (box.maxX > box.minX || box.maxY > box.minY) {\n return {\n x: (box.minX + box.maxX) / 2,\n y: (box.minY + box.maxY) / 2,\n };\n }\n const first = shape.geometry.polygons[0]?.[0];\n return first ?? { x: 0, y: 0 };\n}\n\nexport function shapeRouteAnchor(\n shapeId: number,\n anchors: Array<Pick<CmAnchor, 'id' | 'shapeId'>>,\n): Pick<CmAnchor, 'id' | 'shapeId'> | undefined {\n return anchors.find((anchor) => anchor.shapeId === shapeId);\n}\n\nexport function anchorHasEdge(\n anchorId: number,\n edges: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>>,\n): boolean {\n return edges.some(\n (edge) => edge.fromAnchorId === anchorId || edge.toAnchorId === anchorId,\n );\n}\n\nexport function routeComponentAnchorIds(\n anchorId: number,\n edges: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>>,\n): Set<number> {\n const ids = new Set([anchorId]);\n const pending = [anchorId];\n while (pending.length > 0) {\n const current = pending.pop()!;\n for (const edge of edges) {\n let next: number | null = null;\n if (edge.fromAnchorId === current) next = edge.toAnchorId;\n if (edge.toAnchorId === current) next = edge.fromAnchorId;\n if (next == null || ids.has(next)) continue;\n ids.add(next);\n pending.push(next);\n }\n }\n return ids;\n}\n\nexport function walkEdgeExists(\n edges: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>>,\n a: number,\n b: number,\n): boolean {\n return edges.some(\n (edge) =>\n (edge.fromAnchorId === a && edge.toAnchorId === b) ||\n (edge.fromAnchorId === b && edge.toAnchorId === a),\n );\n}\n\nexport type RouteSnapTarget =\n | { type: 'junction'; anchorId: number; point: Vec2; distance: number }\n | {\n type: 'edge';\n edgeId: number;\n fromAnchorId: number;\n toAnchorId: number;\n point: Vec2;\n distance: number;\n };\n\nfunction isSnappableRouteEdge(edge: Pick<CmRouteEdge, 'kind'>): boolean {\n return (\n edge.kind === 'walk' ||\n edge.kind === 'unit_link' ||\n edge.kind === 'entrance_link'\n );\n}\n\n/** The orange point we are linking from — not every destination on that store. */\nexport function storeLinkOriginIds(\n anchors: Array<Pick<CmAnchor, 'id' | 'shapeId' | 'x' | 'y'>>,\n preview: { shapeId: number; origin: Vec2 } | null | undefined,\n): Set<number> {\n if (!preview) return new Set();\n const ids = new Set<number>();\n for (const anchor of anchors) {\n if (\n anchor.shapeId === preview.shapeId &&\n distance(anchor, preview.origin) <= DEFAULT_WELD_TOLERANCE\n ) {\n ids.add(anchor.id);\n }\n }\n return ids;\n}\n\n/**\n * Nearest route point or edge within `maxDist` (same circular hit on and off\n * the path). An existing anchor wins only when the cursor is inside that\n * circle; otherwise a mid-edge hit stays a split so the + can sit close to\n * a neighboring point.\n */\nexport function nearestRouteSnap(\n point: Vec2,\n anchors: CmAnchor[],\n edges: CmRouteEdge[],\n excludeIds: ReadonlySet<number>,\n maxDist: number,\n anchorById: ReadonlyMap<number, CmAnchor> = new Map(\n anchors.map((anchor) => [anchor.id, anchor]),\n ),\n): RouteSnapTarget | null {\n let bestJunction: RouteSnapTarget | null = null;\n let bestEdge: RouteSnapTarget | null = null;\n\n for (const anchor of anchors) {\n if (excludeIds.has(anchor.id)) continue;\n const d = distance(anchor, point);\n if (d > maxDist) continue;\n if (!bestJunction || d < bestJunction.distance) {\n bestJunction = {\n type: 'junction',\n anchorId: anchor.id,\n point: { x: anchor.x, y: anchor.y },\n distance: d,\n };\n }\n }\n\n for (const edge of edges) {\n if (!isSnappableRouteEdge(edge)) continue;\n if (excludeIds.has(edge.fromAnchorId) || excludeIds.has(edge.toAnchorId)) {\n continue;\n }\n const from = anchorById.get(edge.fromAnchorId);\n const to = anchorById.get(edge.toAnchorId);\n if (!from || !to) continue;\n const hit = projectOntoSegment(point, from, to);\n if (hit.distance > maxDist) continue;\n if (!bestEdge || hit.distance < bestEdge.distance) {\n bestEdge = {\n type: 'edge',\n edgeId: edge.id,\n fromAnchorId: edge.fromAnchorId,\n toAnchorId: edge.toAnchorId,\n point: hit.point,\n distance: hit.distance,\n };\n }\n }\n\n return bestJunction ?? bestEdge;\n}\n\nexport interface ConnectShapeToRouteInput {\n shape: CmShape;\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n mapId: number;\n from: Vec2;\n drop: Vec2;\n maxDist: number;\n allocId: () => number;\n}\n\nfunction walkEdge(\n id: number,\n mapId: number,\n fromAnchorId: number,\n toAnchorId: number,\n kind: CmRouteEdge['kind'] = 'walk',\n): CmRouteEdge {\n return {\n id,\n mapId,\n fromAnchorId,\n toAnchorId,\n weight: null,\n directed: false,\n accessible: true,\n kind,\n };\n}\n\n/** Create a store/amenity route point at the click. Another click elsewhere adds another. */\nexport function ensureShapeRouteAnchorOps(input: {\n shape: CmShape;\n anchors: CmAnchor[];\n allocId: () => number;\n point?: Vec2;\n}): { ops: BatchOp[]; anchorId: number } {\n const { shape, anchors, allocId } = input;\n const point = input.point ?? shapeRoutePoint(shape);\n const existing = anchors.find(\n (anchor) =>\n anchor.shapeId === shape.id &&\n distance(anchor, point) <= DEFAULT_WELD_TOLERANCE,\n );\n if (existing) return { ops: [], anchorId: existing.id };\n const unit: CmAnchor = {\n id: allocId(),\n levelId: shape.levelId,\n shapeId: shape.id,\n kind: anchorKindForShape(shape.kind),\n x: point.x,\n y: point.y,\n connectorId: null,\n };\n return { ops: [{ op: 'upsert_anchor', anchor: unit }], anchorId: unit.id };\n}\n\n/**\n * Ensure the shape has a destination anchor, then hook it to the walking path\n * at `drop` (existing junction or a split in a walk edge).\n */\nexport function connectShapeToRouteOps(input: ConnectShapeToRouteInput): BatchOp[] {\n const { shape, anchors, edges, mapId, from, drop, maxDist, allocId } = input;\n const ops: BatchOp[] = [];\n let unit =\n anchors.find(\n (anchor) =>\n anchor.shapeId === shape.id &&\n distance(anchor, from) <= DEFAULT_WELD_TOLERANCE,\n ) ?? null;\n\n if (!unit) {\n unit = {\n id: allocId(),\n levelId: shape.levelId,\n shapeId: shape.id,\n kind: anchorKindForShape(shape.kind),\n x: from.x,\n y: from.y,\n connectorId: null,\n };\n ops.push({ op: 'upsert_anchor', anchor: unit });\n }\n\n const snap = nearestRouteSnap(\n drop,\n anchors,\n edges,\n new Set([unit.id]),\n maxDist,\n );\n if (!snap) return ops;\n if (distance(unit, snap.point) <= DEFAULT_WELD_TOLERANCE) return ops;\n\n let junctionId: number;\n const nextEdges = edges.slice();\n\n if (snap.type === 'junction') {\n junctionId = snap.anchorId;\n } else {\n const source = edges.find((edge) => edge.id === snap.edgeId);\n if (!source) return ops;\n junctionId = allocId();\n ops.push({\n op: 'upsert_anchor',\n anchor: {\n id: junctionId,\n levelId: shape.levelId,\n shapeId: null,\n kind: 'junction',\n x: snap.point.x,\n y: snap.point.y,\n connectorId: null,\n },\n });\n ops.push({ op: 'delete_edge', edgeId: source.id });\n const left = walkEdge(allocId(), mapId, source.fromAnchorId, junctionId, source.kind);\n const right = walkEdge(allocId(), mapId, junctionId, source.toAnchorId, source.kind);\n ops.push({ op: 'upsert_edge', edge: left });\n ops.push({ op: 'upsert_edge', edge: right });\n nextEdges.push(left, right);\n }\n\n if (walkEdgeExists(nextEdges, unit.id, junctionId)) return ops;\n\n const linkKind = unit.kind === 'entrance' ? 'entrance_link' : 'unit_link';\n ops.push({\n op: 'upsert_edge',\n edge: walkEdge(allocId(), mapId, unit.id, junctionId, linkKind),\n });\n return ops;\n}\n\n/** Snap a loose route junction onto an existing route and join the graph. */\nexport function connectRouteAnchorToRouteOps(input: {\n anchor: CmAnchor;\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n mapId: number;\n drop: Vec2;\n maxDist: number;\n allocId: () => number;\n}): BatchOp[] {\n const { anchor, anchors, edges, mapId, drop, maxDist, allocId } = input;\n const incident = edges.filter(\n (edge) =>\n edge.fromAnchorId === anchor.id || edge.toAnchorId === anchor.id,\n );\n if (anchor.shapeId != null || incident.length > 1) return [];\n\n const snap = nearestRouteSnap(\n drop,\n anchors,\n edges,\n routeComponentAnchorIds(anchor.id, edges),\n maxDist,\n );\n if (!snap) return [];\n\n if (snap.type === 'junction') {\n if (incident.length === 1) {\n const source = incident[0];\n const otherId =\n source.fromAnchorId === anchor.id\n ? source.toAnchorId\n : source.fromAnchorId;\n const ops: BatchOp[] = [];\n if (!walkEdgeExists(edges, otherId, snap.anchorId)) {\n ops.push({\n op: 'upsert_edge',\n edge: {\n ...source,\n fromAnchorId:\n source.fromAnchorId === anchor.id\n ? snap.anchorId\n : source.fromAnchorId,\n toAnchorId:\n source.toAnchorId === anchor.id\n ? snap.anchorId\n : source.toAnchorId,\n },\n });\n } else {\n ops.push({ op: 'delete_edge', edgeId: source.id });\n }\n ops.push({ op: 'delete_anchor', anchorId: anchor.id });\n return ops;\n }\n\n const link = linkRouteAnchorsOp(\n mapId,\n anchor.id,\n snap.anchorId,\n edges,\n allocId,\n );\n const ops: BatchOp[] = [\n {\n op: 'upsert_anchor',\n anchor: { ...anchor, x: snap.point.x, y: snap.point.y },\n },\n ];\n if (link) ops.push(link);\n return ops;\n }\n\n const source = edges.find((edge) => edge.id === snap.edgeId);\n if (!source) return [];\n return [\n {\n op: 'upsert_anchor',\n anchor: { ...anchor, x: snap.point.x, y: snap.point.y },\n },\n { op: 'delete_edge', edgeId: source.id },\n {\n op: 'upsert_edge',\n edge: walkEdge(\n allocId(),\n mapId,\n source.fromAnchorId,\n anchor.id,\n source.kind,\n ),\n },\n {\n op: 'upsert_edge',\n edge: walkEdge(\n allocId(),\n mapId,\n anchor.id,\n source.toAnchorId,\n source.kind,\n ),\n },\n ];\n}\n\nexport function linkRouteAnchorsOp(\n mapId: number,\n fromAnchorId: number,\n toAnchorId: number,\n edges: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>>,\n allocId: () => number,\n): BatchOp | null {\n if (fromAnchorId === toAnchorId) return null;\n if (walkEdgeExists(edges, fromAnchorId, toAnchorId)) return null;\n return {\n op: 'upsert_edge',\n edge: walkEdge(allocId(), mapId, fromAnchorId, toAnchorId),\n };\n}\n\nexport function insertJunctionOnWalkEdgeOps(input: {\n levelId: number;\n mapId: number;\n edge: CmRouteEdge;\n point: Vec2;\n allocId: () => number;\n}): { ops: BatchOp[]; junctionId: number } {\n const { levelId, mapId, edge, point, allocId } = input;\n const junctionId = allocId();\n return {\n junctionId,\n ops: [\n {\n op: 'upsert_anchor',\n anchor: {\n id: junctionId,\n levelId,\n shapeId: null,\n kind: 'junction',\n x: point.x,\n y: point.y,\n connectorId: null,\n },\n },\n { op: 'delete_edge', edgeId: edge.id },\n {\n op: 'upsert_edge',\n edge: walkEdge(allocId(), mapId, edge.fromAnchorId, junctionId, edge.kind),\n },\n {\n op: 'upsert_edge',\n edge: walkEdge(allocId(), mapId, junctionId, edge.toAnchorId, edge.kind),\n },\n ],\n };\n}\n\n/**\n * Remove a route point. A 2-way corridor is healed so the path stays joined.\n */\nexport function deleteRouteAnchorOps(\n anchorId: number,\n mapId: number,\n edges: CmRouteEdge[],\n allocId: () => number,\n): BatchOp[] {\n const incident = edges.filter(\n (edge) => edge.fromAnchorId === anchorId || edge.toAnchorId === anchorId,\n );\n const ops: BatchOp[] = incident.map((edge) => ({\n op: 'delete_edge' as const,\n edgeId: edge.id,\n }));\n const walkNeighbors = [\n ...new Set(\n incident\n .filter((edge) => edge.kind === 'walk')\n .map((edge) =>\n edge.fromAnchorId === anchorId ? edge.toAnchorId : edge.fromAnchorId,\n ),\n ),\n ];\n if (\n walkNeighbors.length === 2 &&\n !walkEdgeExists(edges, walkNeighbors[0], walkNeighbors[1])\n ) {\n ops.push({\n op: 'upsert_edge',\n edge: walkEdge(allocId(), mapId, walkNeighbors[0], walkNeighbors[1]),\n });\n }\n ops.push({ op: 'delete_anchor', anchorId });\n return ops;\n}\n","import React, {\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type {\n CmAmenityCatalogItem,\n CmAnchor,\n CmLevel,\n CmRouteEdge,\n CmShape,\n CmShapeAssignment,\n MapAssignRetailer,\n ShapeGeometry,\n ShapeKind,\n ShapeLabel,\n ThemeDefaults,\n Vec2,\n ViewBox,\n} from '../../core';\nimport {\n geometryBBox,\n INTERACTIVE_SHAPE_KINDS,\n labelAlignX,\n labelSvgTextAnchor,\n normalizeLabelAlign,\n svgIdsOwnedByShapes,\n unionViewBox,\n} from '../../core';\nimport { isEditableTypingTarget } from '../history';\nimport {\n canJoinOpenEnds,\n canPlaceNewRoute,\n canSelectShapes,\n emptyCanvasDragPans,\n isEllipseDrawTool,\n isPolygonDrawTool,\n isShapeDrawTool,\n isSplitJoinTool,\n isStampDrawTool,\n nextRouteChainAnchor,\n showsCurveHandles,\n showsShapeAnchors,\n type EditorTool,\n} from '../tools';\nimport {\n applySplitJoinCut,\n applySplitJoinJoin,\n canSplitJoinKind,\n hitOpenEnd,\n hitSplitJoinEdge,\n listOpenEnds,\n previewCutPoints,\n sameOpenEnd,\n type OpenEndHit,\n type OpenEndId,\n type ShapeBatchEdit,\n type ShapeGeo,\n type SplitJoinEdgeHit,\n} from '../splitJoin';\nimport { nearestSnapPoint, sameSnapPoint } from '../snapPoint';\nimport {\n bendEdgeToCubic,\n flattenCubicEdge,\n edgeCount,\n edgeFrom,\n edgeTo,\n edgeToPathD,\n geometryToRings,\n pointOnRingEdge,\n ringToPathD,\n hitTestEdge,\n hitTestEdgeMidpoint,\n hitTestHandle,\n hitTestVertex,\n insertVertex,\n moveHandle,\n moveVertex,\n polygonsToGeometry,\n removeVertex,\n translateEdge,\n translateGeometry,\n} from '../geometryEdit';\nimport {\n ellipseBoundsFromDrag,\n ellipseGeometry,\n} from '../ellipseDraw';\nimport {\n DEFAULT_LABEL_TEXT,\n LABEL_FONT_FAMILY,\n LABEL_LINE_HEIGHT,\n defaultLabelSize,\n defaultTextLabel,\n isTextLabel,\n labelBoxCenter,\n labelTextLines,\n textLabelGeometry,\n} from '../labelText';\nimport {\n DEFAULT_ENTRANCE_SIZE,\n defaultEntranceLabel,\n entranceIconGeometry,\n isEntranceIcon,\n isStampShape,\n} from '../entranceIcon';\nimport { entranceIconDataUrl } from '../../specialIcons';\nimport { ensureMapFont } from '../../fonts/mapFontUrl';\nimport {\n clampEditorZoom,\n clientToSvgUser,\n EDITOR_ZOOM_ANIM_MS,\n editorHandleScale,\n interpolateView,\n nextEditorZoomFromWheel,\n panAfterZoom,\n panKeepingWorldAtUser,\n pxPerUserFromSvg,\n screenPxToWorld,\n userToWorld,\n} from './coords';\nimport { editorShapeFill, editorShapeFillOpacity } from './editorFill';\nimport {\n EDITOR_GUIDE_COLOR,\n editorHoverFillOpacity,\n editorSelectCursor,\n editorShapeEmphasisColor,\n isHoverHighlightShape,\n} from './editorHover';\nimport { wayfindingAssignedOverlays } from '../assignmentOverlay';\nimport { AssignedShapeOverlay } from './AssignedShapeOverlay';\nimport { OutdoorSvgUnderlay } from './OutdoorSvgUnderlay';\nimport {\n isUnderlayDrawnShape,\n isUnderlayHintShape,\n underlaySwitchHint,\n} from './underlayHint';\nimport {\n WAYFINDING_ANCHOR_HIT_PX,\n WAYFINDING_SNAP_PX,\n beginOrContinueRouteDraft,\n isWayfindingShape,\n routeRubberBand,\n routeComponentAnchorIds,\n routeSessionUndoKind,\n nearestRouteSnap,\n showsWayfinding,\n storeLinkOriginIds,\n wayfindingLinksShapes,\n type RouteSnapTarget,\n} from '../routeStubs';\n\nconst ANCHOR_R_PX = 9;\nconst ANCHOR_R_SELECTED_PX = 11;\nconst ANCHOR_HIT_PX = 16;\nconst ANCHOR_STROKE_PX = 2;\n/** Store / amenity / kiosk route points — distinct from selected (accent) junctions. */\nconst SHAPE_ROUTE_ANCHOR_FILL = '#ea580c';\nconst VERTEX_R_PX = 7;\nconst VERTEX_R_SELECTED_PX = 9;\nconst VERTEX_HIT_PX = 14;\nconst VERTEX_STROKE_PX = 2;\nconst HANDLE_R_PX = 5;\nconst HANDLE_R_SELECTED_PX = 6;\nconst HANDLE_HIT_PX = 12;\nconst HANDLE_LINE_PX = 2.25;\nconst HANDLE_LINE_HALO_PX = 4;\nconst BEND_R_PX = 4;\nconst EDGE_DRAG_PX = 4;\n/** Hover / cut pair — tight enough to read as one break, not two far dots. */\nconst SPLIT_JOIN_GAP_PX = 7;\nconst SNAP_HIT_PX = 16;\n\nfunction rectPolygon(a: Vec2, b: Vec2): Vec2[] {\n return [\n { x: a.x, y: a.y },\n { x: b.x, y: a.y },\n { x: b.x, y: b.y },\n { x: a.x, y: b.y },\n ];\n}\n\nfunction dragSize(a: Vec2, b: Vec2): number {\n return Math.hypot(b.x - a.x, b.y - a.y);\n}\n\n/** Settled world stroke; CSS multiplies by --map-handle-scale during wheel. */\nfunction screenStrokeStyle(width: number): React.CSSProperties {\n return { ['--map-stroke-width']: width } as React.CSSProperties;\n}\n\nfunction HandleDot({\n cx,\n cy,\n r,\n hitR,\n fill,\n stroke,\n strokeWidth,\n cursor,\n fillOpacity = 1,\n strokeDasharray,\n onPointerDown,\n onPointerEnter,\n onPointerLeave,\n onDoubleClick,\n}: {\n cx: number;\n cy: number;\n r: number;\n hitR: number;\n fill: string;\n stroke: string;\n strokeWidth: number;\n cursor: string;\n fillOpacity?: number;\n strokeDasharray?: string;\n onPointerDown?: (e: React.PointerEvent<SVGGElement>) => void;\n onPointerEnter?: (e: React.PointerEvent<SVGGElement>) => void;\n onPointerLeave?: (e: React.PointerEvent<SVGGElement>) => void;\n onDoubleClick?: (e: React.MouseEvent<SVGGElement>) => void;\n}) {\n return (\n <g\n onPointerDown={onPointerDown}\n onPointerEnter={onPointerEnter}\n onPointerLeave={onPointerLeave}\n onMouseDown={(e) => e.preventDefault()}\n onDoubleClick={onDoubleClick}\n style={{ cursor }}\n >\n <g transform={`translate(${cx} ${cy})`}>\n <g className=\"eyeon-map-screen-const\">\n <circle cx={0} cy={0} r={hitR} fill=\"transparent\" />\n <circle\n cx={0}\n cy={0}\n r={r}\n fill={fill}\n fillOpacity={fillOpacity}\n stroke={stroke}\n strokeWidth={strokeWidth}\n strokeDasharray={strokeDasharray}\n />\n </g>\n </g>\n </g>\n );\n}\n\nexport interface EditorCanvasProps {\n level: CmLevel | null;\n shapes: CmShape[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n assignments: CmShapeAssignment[];\n /** Center retailers — wayfinding draws assigned names / logos from these. */\n retailers?: MapAssignRetailer[];\n /** Amenity catalog — wayfinding draws assigned amenity / kiosk icons. */\n amenities?: CmAmenityCatalogItem[];\n theme: ThemeDefaults;\n tool: EditorTool;\n selectedShapeId: number | null;\n selectedAnchorIds: number[];\n /** Outdoor SVG underlay (designer-owned). */\n baseSvgUrl: string | null;\n baseViewbox?: ViewBox | null;\n /**\n * Live outdoor SVG. Drawn on every Edit Map and Wayfinding floor (and\n * Outdoor) so green areas, parking lanes, and icons match the assign view.\n */\n outdoorSvgUrl?: string | null;\n /** Same proxy as MapViewer — required when the SVG is cross-origin. */\n imageProxyUrl?: string | null;\n /** @deprecated Use outdoorSvgUrl. Kept so existing hosts keep compiling. */\n levelSvgUrl?: string | null;\n /** Outdoor/base shapes drawn behind the active building floor (non-interactive). */\n underlayShapes?: CmShape[];\n /** Floor below, clipped to openings so Edit Map previews the atrium. */\n openingUnderlayShapes?: CmShape[];\n /** When true (outdoor), only interactive shapes are editable. */\n interactiveOnly?: boolean;\n /** Graph-paper grid. PORTAL only mounts this canvas after Edit Map. */\n showGrid?: boolean;\n /** Wayfinding section: Select also shows and edits the route graph. */\n routeMode?: boolean;\n /** Pan and zoom only — used for Outdoor in Wayfinding. */\n readOnly?: boolean;\n onSelectShape: (id: number | null) => void;\n onSelectAnchors: (ids: number[]) => void;\n onCreateRoutePoint: (\n point: Vec2,\n prevAnchorId: number | null,\n ) => number | null | void;\n /** First committed Create Route segment (two points + one edge). */\n onCreateRouteSegment: (start: Vec2, end: Vec2) => number | null | void;\n /** Connect two existing junctions with a walk edge. */\n onLinkRouteAnchors?: (fromAnchorId: number, toAnchorId: number) => void;\n onInsertRouteJunction: (edgeId: number, point: Vec2) => number | null | void;\n /** Esc on a route draft uses the same path as the Undo control. */\n onUndo?: () => void;\n onRouteDraftActiveChange?: (active: boolean) => void;\n /** Esc on Multi Route (or Create Route) used to return to Select. */\n onToolChange?: (tool: EditorTool) => void;\n onDeleteRouteAnchor: (anchorId: number) => void;\n onConnectShapeToRoute: (\n shapeId: number,\n from: Vec2,\n drop: Vec2,\n maxDist: number,\n ) => void;\n onConnectRouteAnchorToRoute: (\n anchorId: number,\n drop: Vec2,\n maxDist: number,\n ) => void;\n /** Click inside a store to place its orange destination at that point. */\n onEnsureShapeAnchor: (shapeId: number, point: Vec2) => number | null | void;\n onMoveAnchor: (anchorId: number, x: number, y: number) => void;\n onCreateShape: (\n kind: ShapeKind,\n geometry: ShapeGeometry,\n extras?: { label?: ShapeLabel },\n ) => void;\n onUpdateShapeGeometry: (\n shapeId: number,\n geometry: ShapeGeometry,\n opts?: { live?: boolean },\n ) => void;\n onBatchShapeEdits?: (edits: ShapeBatchEdit[]) => void;\n /** End a live drag so the next edit starts a new undo step. */\n onHistoryGestureEnd?: () => void;\n /** Shown when no floor or Outdoor is selected. */\n emptyMessage?: string;\n}\n\nexport interface EditorCanvasHandle {\n consumeRouteUndo: () => 'clear-only' | 'clear-and-undo';\n zoomIn: () => void;\n zoomOut: () => void;\n resetView: () => void;\n}\n\nfunction polygonsToPath(polygons: Vec2[][]): string {\n return polygons\n .map((poly) => {\n if (poly.length === 0) return '';\n let d = `M ${poly[0].x} ${poly[0].y}`;\n for (let i = 1; i < poly.length; i++) d += ` L ${poly[i].x} ${poly[i].y}`;\n d += ' Z';\n return d;\n })\n .join(' ');\n}\n\nfunction isEditableShape(shape: CmShape, interactiveOnly: boolean): boolean {\n if (shape.orphanedAt) return false;\n if (isStampShape(shape)) return true;\n if (!interactiveOnly) return true;\n return INTERACTIVE_SHAPE_KINDS.includes(shape.kind);\n}\n\nexport const EditorCanvas = React.forwardRef<EditorCanvasHandle, EditorCanvasProps>(\nfunction EditorCanvas({\n level,\n shapes,\n anchors,\n edges,\n assignments,\n retailers = [],\n amenities = [],\n theme,\n tool,\n selectedShapeId,\n selectedAnchorIds,\n baseSvgUrl,\n baseViewbox = null,\n outdoorSvgUrl = null,\n imageProxyUrl = null,\n levelSvgUrl = null,\n underlayShapes = [],\n openingUnderlayShapes = [],\n interactiveOnly = false,\n showGrid = true,\n routeMode = false,\n readOnly = false,\n emptyMessage = 'Choose a floor or Outdoor to edit',\n onSelectShape,\n onSelectAnchors,\n onCreateRoutePoint,\n onCreateRouteSegment,\n onLinkRouteAnchors,\n onInsertRouteJunction,\n onDeleteRouteAnchor,\n onConnectShapeToRoute,\n onConnectRouteAnchorToRoute,\n onEnsureShapeAnchor,\n onMoveAnchor,\n onCreateShape,\n onUpdateShapeGeometry,\n onBatchShapeEdits,\n onHistoryGestureEnd,\n onUndo,\n onRouteDraftActiveChange,\n onToolChange,\n}, ref) {\n ensureMapFont();\n const wayfindingOn = showsWayfinding(tool, routeMode);\n const svgRef = useRef<SVGSVGElement>(null);\n const viewGroupRef = useRef<SVGGElement>(null);\n const canvasRef = useRef<HTMLDivElement>(null);\n const [, setPan] = useState({ x: 0, y: 0 });\n const [zoom, setZoom] = useState(1);\n const viewRef = useRef({ pan: { x: 0, y: 0 }, zoom: 1 });\n /** Zoom last used to compute `worldPx` handle radii in React. */\n const sizeZoomRef = useRef(1);\n const wheelFrameRef = useRef<number | null>(null);\n const wheelSettleRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const routeHoverFrameRef = useRef<number | null>(null);\n const routeHoverClientRef = useRef<Vec2 | null>(null);\n const [pxPerUser, setPxPerUser] = useState(1);\n const pointersRef = useRef(new Map<number, Vec2>());\n const pinchRef = useRef<{\n startDist: number;\n startZoom: number;\n world: Vec2;\n } | null>(null);\n const [drawing, setDrawing] = useState<Vec2[]>([]);\n const [drawLockCircle, setDrawLockCircle] = useState(false);\n const [polygonPoints, setPolygonPoints] = useState<Vec2[]>([]);\n const [dragAnchor, setDragAnchor] = useState<number | null>(null);\n const [dragAnchorPoint, setDragAnchorPoint] = useState<Vec2 | null>(null);\n const [lastRouteAnchor, setLastRouteAnchor] = useState<number | null>(null);\n const [routeDraftPoint, setRouteDraftPoint] = useState<Vec2 | null>(null);\n const [storeLinkPreview, setStoreLinkPreview] = useState<{\n shapeId: number;\n origin: Vec2;\n } | null>(null);\n const [rubberCursor, setRubberCursor] = useState<Vec2 | null>(null);\n const [splitJoinPending, setSplitJoinPending] = useState<OpenEndId | null>(\n null,\n );\n const [splitJoinHover, setSplitJoinHover] = useState<SplitJoinEdgeHit | null>(\n null,\n );\n const [splitJoinSnapEnd, setSplitJoinSnapEnd] = useState<OpenEndHit | null>(\n null,\n );\n const [polygonSnap, setPolygonSnap] = useState<Vec2 | null>(null);\n const clearRouteSession = () => {\n setRouteDraftPoint(null);\n setLastRouteAnchor(null);\n setStoreLinkPreview(null);\n setRubberCursor(null);\n };\n useEffect(() => {\n onRouteDraftActiveChange?.(routeDraftPoint != null);\n }, [onRouteDraftActiveChange, routeDraftPoint]);\n useEffect(() => {\n if (lastRouteAnchor == null) return;\n if (anchors.some((anchor) => anchor.id === lastRouteAnchor)) return;\n setLastRouteAnchor(null);\n setRubberCursor(null);\n }, [anchors, lastRouteAnchor]);\n const [stubDrag, setStubDrag] = useState<{\n shapeId: number;\n origin: Vec2;\n cursor: Vec2;\n clientX: number;\n clientY: number;\n } | null>(null);\n const [shapeDrag, setShapeDrag] = useState<{\n shapeId: number;\n start: Vec2;\n originGeometry: ShapeGeometry;\n } | null>(null);\n const [shapeOffset, setShapeOffset] = useState<Vec2>({ x: 0, y: 0 });\n const [vertexDrag, setVertexDrag] = useState<{\n type: 'anchor';\n shapeId: number;\n polygonIndex: number;\n vertexIndex: number;\n } | {\n type: 'handle';\n shapeId: number;\n ringIndex: number;\n edgeIndex: number;\n handle: 1 | 2;\n } | {\n type: 'bend';\n shapeId: number;\n ringIndex: number;\n edgeIndex: number;\n } | null>(null);\n const [selectedVertex, setSelectedVertex] = useState<{\n polygonIndex: number;\n vertexIndex: number;\n } | null>(null);\n const [selectedHandle, setSelectedHandle] = useState<{\n ringIndex: number;\n edgeIndex: number;\n handle: 1 | 2;\n } | null>(null);\n const [hoveredEdge, setHoveredEdge] = useState<{\n ringIndex: number;\n edgeIndex: number;\n point: Vec2;\n } | null>(null);\n const [edgePress, setEdgePress] = useState<{\n shapeId: number;\n ringIndex: number;\n edgeIndex: number;\n start: Vec2;\n clientX: number;\n clientY: number;\n insertAt: Vec2;\n originGeometry: ShapeGeometry;\n dragging: boolean;\n } | null>(null);\n const [hoveredShapeId, setHoveredShapeId] = useState<number | null>(null);\n const [hoveredAnchorId, setHoveredAnchorId] = useState<number | null>(null);\n const [routePointerSnap, setRoutePointerSnap] =\n useState<RouteSnapTarget | null>(null);\n const routeHover =\n routePointerSnap?.type === 'edge'\n ? { edgeId: routePointerSnap.edgeId, point: routePointerSnap.point }\n : null;\n const [underlayTip, setUnderlayTip] = useState<{\n x: number;\n y: number;\n text: string;\n } | null>(null);\n const panStart = useRef<{\n x: number;\n y: number;\n panX: number;\n panY: number;\n clientX: number;\n clientY: number;\n fromEmptySelect: boolean;\n } | null>(null);\n const [isPanning, setIsPanning] = useState(false);\n\n const worldPx = (px: number) =>\n screenPxToWorld(px, viewRef.current.zoom, pxPerUser);\n\n const syncViewDom = (nextPan: Vec2, nextZoom: number) => {\n const g = viewGroupRef.current;\n if (!g) return;\n g.setAttribute(\n 'transform',\n `translate(${nextPan.x}, ${nextPan.y}) scale(${nextZoom})`,\n );\n // One CSS var — not a React re-render of every store/route node.\n g.style.setProperty(\n '--map-handle-scale',\n String(editorHandleScale(sizeZoomRef.current, nextZoom)),\n );\n };\n\n const applyView = (nextPan: Vec2, nextZoom: number) => {\n cancelWheelWork();\n viewRef.current = { pan: nextPan, zoom: nextZoom };\n setPan(nextPan);\n setZoom(nextZoom);\n };\n\n // Wheel input can fire much faster than paint. Move the SVG group\n // imperatively once per frame, then let React reconcile once scrolling ends.\n // Handle dots counter-scale in that same frame so they do not swell/shrink.\n const paintView = () => {\n wheelFrameRef.current = null;\n const { pan: nextPan, zoom: nextZoom } = viewRef.current;\n syncViewDom(nextPan, nextZoom);\n };\n\n const settleWheelView = () => {\n wheelSettleRef.current = null;\n const { pan: nextPan, zoom: nextZoom } = viewRef.current;\n setPan(nextPan);\n setZoom(nextZoom);\n };\n\n const scheduleWheelPaint = () => {\n if (wheelFrameRef.current == null) {\n wheelFrameRef.current = requestAnimationFrame(paintView);\n }\n if (wheelSettleRef.current != null) clearTimeout(wheelSettleRef.current);\n wheelSettleRef.current = setTimeout(settleWheelView, 80);\n };\n\n const cancelWheelWork = () => {\n if (wheelFrameRef.current != null) {\n cancelAnimationFrame(wheelFrameRef.current);\n wheelFrameRef.current = null;\n }\n if (wheelSettleRef.current != null) {\n clearTimeout(wheelSettleRef.current);\n wheelSettleRef.current = null;\n }\n };\n\n const zoomAnimRef = useRef<number | null>(null);\n const cancelZoomAnim = () => {\n if (zoomAnimRef.current == null) return;\n cancelAnimationFrame(zoomAnimRef.current);\n zoomAnimRef.current = null;\n };\n\n const animateViewTo = (targetPan: Vec2, targetZoom: number) => {\n cancelWheelWork();\n cancelZoomAnim();\n const from = {\n pan: { ...viewRef.current.pan },\n zoom: viewRef.current.zoom,\n };\n const to = { pan: targetPan, zoom: targetZoom };\n if (\n from.zoom === to.zoom &&\n from.pan.x === to.pan.x &&\n from.pan.y === to.pan.y\n ) {\n return;\n }\n const started = performance.now();\n const step = (now: number) => {\n const t = Math.min(1, (now - started) / EDITOR_ZOOM_ANIM_MS);\n const next = interpolateView(from, to, t);\n applyView(next.pan, next.zoom);\n if (t < 1) {\n zoomAnimRef.current = requestAnimationFrame(step);\n return;\n }\n zoomAnimRef.current = null;\n };\n zoomAnimRef.current = requestAnimationFrame(step);\n };\n\n const zoomAroundCenter = (factor: number) => {\n const svg = svgRef.current;\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n const user = clientToSvgUser(\n svg,\n rect.left + rect.width / 2,\n rect.top + rect.height / 2,\n );\n const { pan: currentPan, zoom: currentZoom } = viewRef.current;\n const nextZoom = clampEditorZoom(currentZoom * factor);\n if (nextZoom === currentZoom) return;\n animateViewTo(panAfterZoom(user, currentPan, currentZoom, nextZoom), nextZoom);\n };\n\n useImperativeHandle(ref, () => ({\n consumeRouteUndo: () => {\n const kind = routeSessionUndoKind({\n routeDraftPoint,\n storeLinkPreview,\n });\n clearRouteSession();\n return kind;\n },\n zoomIn: () => zoomAroundCenter(1.25),\n zoomOut: () => zoomAroundCenter(0.8),\n resetView: () => animateViewTo({ x: 0, y: 0 }, 1),\n }));\n\n const renderedZoom = viewRef.current.zoom;\n useLayoutEffect(() => {\n // Every commit: mid-wheel hover re-renders recompute worldPx from live\n // viewRef, so the CSS scale must reset in that same paint.\n sizeZoomRef.current = renderedZoom;\n syncViewDom(viewRef.current.pan, viewRef.current.zoom);\n });\n\n useEffect(\n () => () => {\n cancelZoomAnim();\n cancelWheelWork();\n },\n [],\n );\n\n useEffect(() => {\n setDrawing([]);\n setDrawLockCircle(false);\n setPolygonPoints([]);\n setLastRouteAnchor(null);\n setRouteDraftPoint(null);\n setStoreLinkPreview(null);\n setRubberCursor(null);\n setStubDrag(null);\n setHoveredShapeId(null);\n setHoveredAnchorId(null);\n setShapeDrag(null);\n setVertexDrag(null);\n setDragAnchor(null);\n setDragAnchorPoint(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n if (routeHoverFrameRef.current != null) {\n cancelAnimationFrame(routeHoverFrameRef.current);\n routeHoverFrameRef.current = null;\n }\n routeHoverClientRef.current = null;\n setRoutePointerSnap(null);\n setEdgePress(null);\n setSplitJoinHover(null);\n if (!canJoinOpenEnds(tool)) {\n setSplitJoinPending(null);\n setSplitJoinSnapEnd(null);\n }\n setPolygonSnap(null);\n setShapeOffset({ x: 0, y: 0 });\n }, [tool]);\n\n useEffect(() => {\n setSelectedVertex(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n setEdgePress(null);\n setUnderlayTip(null);\n setHoveredShapeId(null);\n setShapeDrag(null);\n setVertexDrag(null);\n setShapeOffset({ x: 0, y: 0 });\n }, [selectedShapeId]);\n\n useEffect(() => {\n clearRouteSession();\n setStubDrag(null);\n setRoutePointerSnap(null);\n setUnderlayTip(null);\n setHoveredShapeId(null);\n setHoveredAnchorId(null);\n }, [level?.id]);\n\n const viewbox = unionViewBox(level?.sourceViewbox, baseViewbox);\n const svgUnderlayUrl =\n outdoorSvgUrl ?? levelSvgUrl ?? (level?.kind === 'outdoor' ? baseSvgUrl : null);\n const svgSuppressIds = useMemo(\n () =>\n svgIdsOwnedByShapes([...underlayShapes, ...shapes], {\n omitStaticLayers: interactiveOnly,\n }),\n [underlayShapes, shapes, interactiveOnly],\n );\n\n useLayoutEffect(() => {\n const svg = svgRef.current;\n if (!svg) return;\n const measure = () => {\n const next = pxPerUserFromSvg(svg);\n setPxPerUser((prev) => (Math.abs(prev - next) < 1e-6 ? prev : next));\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(svg);\n return () => ro.disconnect();\n }, [level?.id, viewbox.x, viewbox.y, viewbox.width, viewbox.height]);\n\n const editableShapes = useMemo(\n () => shapes.filter((s) => isEditableShape(s, interactiveOnly)),\n [shapes, interactiveOnly],\n );\n const openingShapes = useMemo(\n () => editableShapes.filter((s) => s.kind === 'void'),\n [editableShapes],\n );\n const openingClipId = `eyeon-opening-clip-${level?.id ?? 'none'}`;\n const openingHatchId = `eyeon-opening-hatch-${level?.id ?? 'none'}`;\n\n const selectedShape =\n editableShapes.find((s) => s.id === selectedShapeId) ?? null;\n\n const displayGeometry = useMemo(() => {\n if (!selectedShape) return null;\n if (shapeDrag && shapeDrag.shapeId === selectedShape.id) {\n return translateGeometry(shapeDrag.originGeometry, shapeOffset.x, shapeOffset.y);\n }\n return selectedShape.geometry;\n }, [selectedShape, shapeDrag, shapeOffset]);\n\n const splitJoinShapes = useMemo<ShapeGeo[]>(\n () =>\n editableShapes\n .filter((s) => canSplitJoinKind(s.kind) && !isStampShape(s))\n .map((s) => ({\n id: s.id,\n kind: s.kind,\n style: s.style,\n geometry: s.geometry,\n })),\n [editableShapes],\n );\n\n const polygonAnchorCandidates = useMemo(() => {\n const pts: Vec2[] = [];\n for (const shape of editableShapes) {\n if (isStampShape(shape)) continue;\n for (const ring of geometryToRings(shape.geometry)) {\n pts.push(...ring.anchors);\n }\n }\n return pts;\n }, [editableShapes]);\n\n const nearSplitJoinAnchor = (world: Vec2, tol: number): boolean => {\n if (hitOpenEnd(splitJoinShapes, world, tol)) return true;\n return splitJoinShapes.some(\n (shape) => hitTestVertex(shape.geometry, world, tol) != null,\n );\n };\n\n const snapPolygonPoint = (world: Vec2): Vec2 | null => {\n const own = polygonPoints.length >= 3 ? [polygonPoints[0]] : [];\n return nearestSnapPoint(\n world,\n [...own, ...polygonAnchorCandidates],\n worldPx(SNAP_HIT_PX),\n );\n };\n\n const commitSplitJoinEdits = (edits: ShapeBatchEdit[]) => {\n if (!edits.length) return;\n onBatchShapeEdits?.(edits);\n const deleted = new Set(\n edits.filter((e) => e.action === 'delete').map((e) => e.shapeId),\n );\n if (selectedShapeId != null && deleted.has(selectedShapeId)) {\n const survivor = edits.find((e) => e.action === 'update');\n onSelectShape(survivor && survivor.action === 'update' ? survivor.shapeId : null);\n }\n };\n\n const tryJoinOpenEnd = (world: Vec2): boolean => {\n if (!canJoinOpenEnds(tool) || readOnly) return false;\n const endHit =\n splitJoinSnapEnd ??\n hitOpenEnd(splitJoinShapes, world, worldPx(SNAP_HIT_PX), splitJoinPending);\n if (!endHit) return false;\n if (!splitJoinPending) {\n setSplitJoinPending(endHit);\n onSelectShape(endHit.shapeId);\n if (isSplitJoinTool(tool)) onToolChange?.('select');\n return true;\n }\n if (sameOpenEnd(splitJoinPending, endHit)) {\n setSplitJoinPending(null);\n setSplitJoinSnapEnd(null);\n return true;\n }\n commitSplitJoinEdits(applySplitJoinJoin(splitJoinShapes, splitJoinPending, endHit));\n setSplitJoinPending(null);\n setSplitJoinHover(null);\n setSplitJoinSnapEnd(null);\n return true;\n };\n\n const handleSplitJoinAt = (world: Vec2): boolean => {\n if (tryJoinOpenEnd(world)) return true;\n if (!isSplitJoinTool(tool) || readOnly) return false;\n const endTol = worldPx(SNAP_HIT_PX);\n const edgeTol = worldPx(VERTEX_HIT_PX);\n const edgeHit = hitSplitJoinEdge(splitJoinShapes, world, edgeTol);\n if (edgeHit && !nearSplitJoinAnchor(world, endTol)) {\n commitSplitJoinEdits(\n applySplitJoinCut(splitJoinShapes, edgeHit, worldPx(SPLIT_JOIN_GAP_PX)),\n );\n setSplitJoinPending(null);\n setSplitJoinHover(null);\n setSplitJoinSnapEnd(null);\n onSelectShape(edgeHit.shapeId);\n return true;\n }\n if (splitJoinPending) {\n setSplitJoinPending(null);\n setSplitJoinSnapEnd(null);\n return true;\n }\n return false;\n };\n\n const toWorld = (clientX: number, clientY: number): Vec2 => {\n const svg = svgRef.current;\n if (!svg) return { x: 0, y: 0 };\n const { pan: currentPan, zoom: currentZoom } = viewRef.current;\n return userToWorld(\n clientToSvgUser(svg, clientX, clientY),\n currentPan,\n currentZoom,\n );\n };\n\n const moveUnderlayTip = (e: React.PointerEvent, kind: ShapeKind) => {\n const rect = canvasRef.current?.getBoundingClientRect();\n if (!rect) return;\n setUnderlayTip({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n text: underlaySwitchHint(kind),\n });\n };\n\n const insertAnchorOnEdge = (\n shape: CmShape,\n ringIndex: number,\n edgeIndex: number,\n point: Vec2,\n ) => {\n const next = insertVertex(shape.geometry, ringIndex, edgeIndex, point);\n onUpdateShapeGeometry(shape.id, next);\n setSelectedVertex({\n polygonIndex: ringIndex,\n vertexIndex: edgeIndex + 1,\n });\n setSelectedHandle(null);\n setHoveredEdge(null);\n };\n\n const beginEdgePress = (\n ringIndex: number,\n edgeIndex: number,\n insertAt: Vec2,\n e: React.PointerEvent,\n ) => {\n if (!selectedShape) return;\n e.stopPropagation();\n e.currentTarget.setPointerCapture?.(e.pointerId);\n setEdgePress({\n shapeId: selectedShape.id,\n ringIndex,\n edgeIndex,\n start: toWorld(e.clientX, e.clientY),\n clientX: e.clientX,\n clientY: e.clientY,\n insertAt,\n originGeometry: displayGeometry ?? selectedShape.geometry,\n dragging: false,\n });\n };\n\n const deleteShapeAnchor = (ringIndex: number, vertexIndex: number) => {\n if (!selectedShape) return;\n const next = removeVertex(selectedShape.geometry, ringIndex, vertexIndex);\n if (next === selectedShape.geometry) return;\n onUpdateShapeGeometry(selectedShape.id, next);\n setSelectedVertex(null);\n setSelectedHandle(null);\n setVertexDrag(null);\n };\n\n const beginSplitJoinVertexDrag = (\n world: Vec2,\n e: React.PointerEvent,\n ): boolean => {\n if (!selectedShape || !displayGeometry) return false;\n const vertexHit = hitTestVertex(\n displayGeometry,\n world,\n worldPx(VERTEX_HIT_PX),\n );\n if (!vertexHit) return false;\n if (hitOpenEnd(splitJoinShapes, vertexHit.point, worldPx(4))) return false;\n if (e.detail >= 2) {\n deleteShapeAnchor(vertexHit.polygonIndex, vertexHit.vertexIndex);\n return true;\n }\n setSelectedVertex({\n polygonIndex: vertexHit.polygonIndex,\n vertexIndex: vertexHit.vertexIndex,\n });\n setSelectedHandle(null);\n setVertexDrag({\n type: 'anchor',\n shapeId: selectedShape.id,\n polygonIndex: vertexHit.polygonIndex,\n vertexIndex: vertexHit.vertexIndex,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n return true;\n };\n\n const deleteShapeHandle = (ringIndex: number, edgeIndex: number) => {\n if (!selectedShape) return;\n const next = flattenCubicEdge(selectedShape.geometry, ringIndex, edgeIndex);\n if (next === selectedShape.geometry) return;\n onUpdateShapeGeometry(selectedShape.id, next);\n setSelectedHandle(null);\n setVertexDrag(null);\n };\n\n const hoverEdgeAt = (\n ringIndex: number,\n edgeIndex: number,\n clientX: number,\n clientY: number,\n ) => {\n if (!selectedShape) return;\n const world = toWorld(clientX, clientY);\n const ring = geometryToRings(displayGeometry ?? selectedShape.geometry)[\n ringIndex\n ];\n setHoveredEdge({\n ringIndex,\n edgeIndex,\n point: ring ? pointOnRingEdge(ring, edgeIndex, world) : world,\n });\n };\n\n const anchorById = useMemo(\n () => new Map(anchors.map((a) => [a.id, a])),\n [anchors],\n );\n const connectedAnchorIds = useMemo(() => {\n const ids = new Set<number>();\n edges.forEach((edge) => {\n ids.add(edge.fromAnchorId);\n ids.add(edge.toAnchorId);\n });\n return ids;\n }, [edges]);\n const routeAnchorDegreeById = useMemo(() => {\n const degree = new Map<number, number>();\n edges.forEach((edge) => {\n degree.set(\n edge.fromAnchorId,\n (degree.get(edge.fromAnchorId) ?? 0) + 1,\n );\n degree.set(\n edge.toAnchorId,\n (degree.get(edge.toAnchorId) ?? 0) + 1,\n );\n });\n return degree;\n }, [edges]);\n const dragRouteExcludeIds = useMemo(\n () =>\n dragAnchor == null\n ? new Set<number>()\n : routeComponentAnchorIds(dragAnchor, edges),\n [dragAnchor, edges],\n );\n const draggingOpenRouteAnchor =\n tool === 'select' &&\n dragAnchor != null &&\n anchorById.get(dragAnchor)?.shapeId == null &&\n (routeAnchorDegreeById.get(dragAnchor) ?? 0) <= 1;\n const dragRouteSnap =\n draggingOpenRouteAnchor && dragAnchorPoint\n ? nearestRouteSnap(\n dragAnchorPoint,\n anchors,\n edges,\n dragRouteExcludeIds,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n )\n : null;\n const displayAnchorById = useMemo(() => {\n if (dragAnchor == null || !dragAnchorPoint) return anchorById;\n const dragged = anchorById.get(dragAnchor);\n if (!dragged) return anchorById;\n const next = new Map(anchorById);\n next.set(dragAnchor, {\n ...dragged,\n ...(dragRouteSnap?.point ?? dragAnchorPoint),\n });\n return next;\n }, [anchorById, dragAnchor, dragAnchorPoint, dragRouteSnap]);\n const routeEdgePath = useMemo(\n () =>\n edges\n .map((edge) => {\n const from = displayAnchorById.get(edge.fromAnchorId);\n const to = displayAnchorById.get(edge.toAnchorId);\n return from && to\n ? `M ${from.x} ${from.y} L ${to.x} ${to.y}`\n : '';\n })\n .filter(Boolean)\n .join(' '),\n [displayAnchorById, edges],\n );\n const assignmentByShapeId = useMemo(\n () => new Map(assignments.map((row) => [row.shapeId, row])),\n [assignments],\n );\n const assignedOverlays = useMemo(\n () =>\n wayfindingOn\n ? wayfindingAssignedOverlays({\n shapes: editableShapes,\n underlayShapes,\n assignments,\n retailers,\n amenities,\n theme,\n })\n : [],\n [\n amenities,\n assignments,\n editableShapes,\n retailers,\n theme,\n underlayShapes,\n wayfindingOn,\n ],\n );\n\n const cancelRouteHoverFrame = () => {\n if (routeHoverFrameRef.current != null) {\n cancelAnimationFrame(routeHoverFrameRef.current);\n routeHoverFrameRef.current = null;\n }\n routeHoverClientRef.current = null;\n };\n\n const scheduleRouteHover = (clientX: number, clientY: number) => {\n routeHoverClientRef.current = { x: clientX, y: clientY };\n if (routeHoverFrameRef.current != null) return;\n routeHoverFrameRef.current = requestAnimationFrame(() => {\n routeHoverFrameRef.current = null;\n const client = routeHoverClientRef.current;\n routeHoverClientRef.current = null;\n if (!client) return;\n const world = toWorld(client.x, client.y);\n if (\n routeDraftPoint ||\n storeLinkPreview ||\n (canPlaceNewRoute(tool) && lastRouteAnchor != null)\n ) {\n setRubberCursor(world);\n }\n setRoutePointerSnap(\n nearestRouteSnap(\n world,\n anchors,\n edges,\n storeLinkOriginIds(anchors, storeLinkPreview),\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n ),\n );\n });\n };\n\n useEffect(() => () => cancelRouteHoverFrame(), []);\n\n const closePolygon = () => {\n if (polygonPoints.length < 3) {\n setPolygonPoints([]);\n setRubberCursor(null);\n setPolygonSnap(null);\n return;\n }\n onCreateShape(\n tool === 'draw-void' ? 'void' : 'unit',\n polygonsToGeometry([polygonPoints]),\n );\n setPolygonPoints([]);\n setRubberCursor(null);\n setPolygonSnap(null);\n };\n\n useEffect(() => {\n if (!isEllipseDrawTool(tool)) return;\n const onShift = (e: KeyboardEvent) => {\n if (e.key !== 'Shift') return;\n setDrawLockCircle(e.type === 'keydown');\n };\n window.addEventListener('keydown', onShift);\n window.addEventListener('keyup', onShift);\n return () => {\n window.removeEventListener('keydown', onShift);\n window.removeEventListener('keyup', onShift);\n };\n }, [tool]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (isPolygonDrawTool(tool)) {\n if (e.key === 'Enter') {\n e.preventDefault();\n closePolygon();\n } else if (e.key === 'Escape') {\n setPolygonPoints([]);\n setRubberCursor(null);\n setPolygonSnap(null);\n }\n }\n if (\n e.key === 'Escape' &&\n !isEditableTypingTarget(e.target) &&\n splitJoinPending != null\n ) {\n e.preventDefault();\n setSplitJoinPending(null);\n setSplitJoinHover(null);\n setSplitJoinSnapEnd(null);\n return;\n }\n if (\n e.key === 'Escape' &&\n !isEditableTypingTarget(e.target) &&\n (canPlaceNewRoute(tool) ||\n storeLinkPreview != null ||\n routeDraftPoint != null ||\n lastRouteAnchor != null)\n ) {\n e.preventDefault();\n onUndo?.();\n }\n if (\n (e.key === 'Backspace' || e.key === 'Delete') &&\n selectedShape &&\n showsShapeAnchors(tool) &&\n selectedVertex\n ) {\n e.preventDefault();\n const next = removeVertex(\n selectedShape.geometry,\n selectedVertex.polygonIndex,\n selectedVertex.vertexIndex,\n );\n if (next !== selectedShape.geometry) {\n onUpdateShapeGeometry(selectedShape.id, next);\n setSelectedVertex(null);\n }\n }\n if (\n (e.key === 'Backspace' || e.key === 'Delete') &&\n selectedShape &&\n showsCurveHandles(tool) &&\n selectedHandle\n ) {\n e.preventDefault();\n const next = flattenCubicEdge(\n selectedShape.geometry,\n selectedHandle.ringIndex,\n selectedHandle.edgeIndex,\n );\n if (next !== selectedShape.geometry) {\n onUpdateShapeGeometry(selectedShape.id, next);\n setSelectedHandle(null);\n }\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n tool,\n polygonPoints,\n selectedShape,\n selectedVertex,\n selectedHandle,\n storeLinkPreview,\n routeDraftPoint,\n lastRouteAnchor,\n splitJoinPending,\n onUndo,\n ]);\n\n useEffect(() => {\n const node = canvasRef.current;\n if (!node) return;\n const onWheel = (e: WheelEvent) => {\n e.preventDefault();\n if (e.deltaY === 0) return;\n const svg = svgRef.current;\n if (!svg) return;\n cancelZoomAnim();\n const user = clientToSvgUser(svg, e.clientX, e.clientY);\n const { pan: currentPan, zoom: currentZoom } = viewRef.current;\n const nextZoom = nextEditorZoomFromWheel(currentZoom, e);\n if (nextZoom === currentZoom) return;\n viewRef.current = {\n pan: panAfterZoom(user, currentPan, currentZoom, nextZoom),\n zoom: nextZoom,\n };\n scheduleWheelPaint();\n };\n node.addEventListener('wheel', onWheel, { passive: false, capture: true });\n return () => {\n cancelWheelWork();\n node.removeEventListener('wheel', onWheel, { capture: true });\n };\n }, [Boolean(level)]);\n\n const beginPinch = () => {\n cancelWheelWork();\n cancelZoomAnim();\n const svg = svgRef.current;\n const pts = [...pointersRef.current.values()];\n if (!svg || pts.length < 2) return;\n const mid = { x: (pts[0].x + pts[1].x) / 2, y: (pts[0].y + pts[1].y) / 2 };\n const user = clientToSvgUser(svg, mid.x, mid.y);\n const { pan: currentPan, zoom: currentZoom } = viewRef.current;\n pinchRef.current = {\n startDist: Math.max(1, Math.hypot(pts[1].x - pts[0].x, pts[1].y - pts[0].y)),\n startZoom: currentZoom,\n world: userToWorld(user, currentPan, currentZoom),\n };\n panStart.current = null;\n setIsPanning(false);\n setDrawing([]);\n setShapeDrag(null);\n setVertexDrag(null);\n setDragAnchor(null);\n setDragAnchorPoint(null);\n };\n\n const onCanvasPointerDownCapture = (e: React.PointerEvent) => {\n pointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n if (pointersRef.current.size < 2) return;\n e.preventDefault();\n e.stopPropagation();\n beginPinch();\n };\n\n const onCanvasPointerMoveCapture = (e: React.PointerEvent) => {\n if (pointersRef.current.has(e.pointerId)) {\n pointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n }\n if (!pinchRef.current || pointersRef.current.size < 2) return;\n const svg = svgRef.current;\n if (!svg) return;\n e.stopPropagation();\n const pts = [...pointersRef.current.values()];\n const dist = Math.hypot(pts[1].x - pts[0].x, pts[1].y - pts[0].y);\n const mid = { x: (pts[0].x + pts[1].x) / 2, y: (pts[0].y + pts[1].y) / 2 };\n const user = clientToSvgUser(svg, mid.x, mid.y);\n const nextZoom = clampEditorZoom(\n pinchRef.current.startZoom * (dist / pinchRef.current.startDist),\n );\n applyView(panKeepingWorldAtUser(user, pinchRef.current.world, nextZoom), nextZoom);\n };\n\n const onCanvasPointerUpCapture = (e: React.PointerEvent) => {\n const wasPinching = pinchRef.current != null;\n pointersRef.current.delete(e.pointerId);\n if (pointersRef.current.size < 2) pinchRef.current = null;\n if (wasPinching) e.stopPropagation();\n };\n\n const beginPan = (e: React.PointerEvent, fromEmptySelect: boolean) => {\n cancelZoomAnim();\n const svg = svgRef.current;\n const user = svg\n ? clientToSvgUser(svg, e.clientX, e.clientY)\n : { x: e.clientX, y: e.clientY };\n panStart.current = {\n x: user.x,\n y: user.y,\n panX: viewRef.current.pan.x,\n panY: viewRef.current.pan.y,\n clientX: e.clientX,\n clientY: e.clientY,\n fromEmptySelect,\n };\n setIsPanning(true);\n e.currentTarget.setPointerCapture?.(e.pointerId);\n };\n\n const insertHoveredRoutePoint = (edgeId: number, point: Vec2) => {\n const created = onInsertRouteJunction(edgeId, point);\n if (canPlaceNewRoute(tool) && typeof created === 'number') {\n if (routeDraftPoint) {\n onCreateRoutePoint(routeDraftPoint, created);\n setRouteDraftPoint(null);\n setLastRouteAnchor(nextRouteChainAnchor(tool, created));\n } else if (lastRouteAnchor != null && lastRouteAnchor !== created) {\n onLinkRouteAnchors?.(lastRouteAnchor, created);\n setLastRouteAnchor(nextRouteChainAnchor(tool, created));\n } else {\n setLastRouteAnchor(created);\n }\n }\n onSelectAnchors(typeof created === 'number' ? [created] : []);\n };\n\n const removeWayfindingAnchor = (anchorId: number) => {\n if (readOnly || !wayfindingOn) return;\n onDeleteRouteAnchor(anchorId);\n setLastRouteAnchor((prev) => (prev === anchorId ? null : prev));\n setDragAnchor(null);\n setDragAnchorPoint(null);\n setStoreLinkPreview(null);\n setRouteDraftPoint(null);\n setRubberCursor(null);\n setHoveredAnchorId((id) => (id === anchorId ? null : id));\n };\n\n const onPointerDown = (e: React.PointerEvent) => {\n if (pinchRef.current) return;\n if (readOnly || tool === 'pan' || e.button === 1) {\n beginPan(e, false);\n return;\n }\n const world = toWorld(e.clientX, e.clientY);\n\n if (isSplitJoinTool(tool)) {\n if (beginSplitJoinVertexDrag(world, e)) return;\n if (handleSplitJoinAt(world)) return;\n beginPan(e, true);\n return;\n }\n\n if (isPolygonDrawTool(tool)) {\n const placed = snapPolygonPoint(world) ?? polygonSnap ?? world;\n if (polygonPoints.length >= 3) {\n const first = polygonPoints[0];\n if (Math.hypot(placed.x - first.x, placed.y - first.y) <= worldPx(SNAP_HIT_PX)) {\n closePolygon();\n return;\n }\n }\n setPolygonPoints((prev) => [...prev, placed]);\n setRubberCursor(placed);\n setPolygonSnap(null);\n return;\n }\n\n if (wayfindingOn) {\n const storeExclude = storeLinkOriginIds(anchors, storeLinkPreview);\n const snap = nearestRouteSnap(\n world,\n anchors,\n edges,\n storeExclude,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n );\n if (storeLinkPreview) {\n if (snap?.type === 'edge' || snap?.type === 'junction') {\n onConnectShapeToRoute(\n storeLinkPreview.shapeId,\n storeLinkPreview.origin,\n snap.point,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n );\n }\n setStoreLinkPreview(null);\n setRubberCursor(null);\n return;\n }\n if (snap?.type === 'edge') {\n insertHoveredRoutePoint(snap.edgeId, snap.point);\n return;\n }\n if (snap?.type === 'junction') {\n if (canPlaceNewRoute(tool)) {\n if (routeDraftPoint) {\n onCreateRoutePoint(routeDraftPoint, snap.anchorId);\n setRouteDraftPoint(null);\n setLastRouteAnchor(nextRouteChainAnchor(tool, snap.anchorId));\n } else if (lastRouteAnchor != null && lastRouteAnchor !== snap.anchorId) {\n onLinkRouteAnchors?.(lastRouteAnchor, snap.anchorId);\n setLastRouteAnchor(nextRouteChainAnchor(tool, snap.anchorId));\n } else {\n setLastRouteAnchor(snap.anchorId);\n }\n }\n onSelectAnchors([snap.anchorId]);\n return;\n }\n if (canPlaceNewRoute(tool)) {\n if (lastRouteAnchor != null) {\n const created = onCreateRoutePoint(world, lastRouteAnchor);\n setLastRouteAnchor(\n nextRouteChainAnchor(\n tool,\n typeof created === 'number' ? created : null,\n ),\n );\n setRubberCursor(world);\n return;\n }\n const next = beginOrContinueRouteDraft(routeDraftPoint, world);\n setRouteDraftPoint(next.nextDraft);\n setRubberCursor(world);\n if (next.start && next.end) {\n const created = onCreateRouteSegment(next.start, next.end);\n setLastRouteAnchor(\n nextRouteChainAnchor(\n tool,\n typeof created === 'number' ? created : null,\n ),\n );\n }\n return;\n }\n beginPan(e, true);\n return;\n }\n if (tool === 'draw-text') {\n const size = defaultLabelSize(viewbox);\n onCreateShape(\n 'label',\n textLabelGeometry(world, DEFAULT_LABEL_TEXT, size),\n { label: defaultTextLabel(DEFAULT_LABEL_TEXT, size, theme.STORE_TEXT_COLOR) },\n );\n return;\n }\n if (tool === 'draw-entrance') {\n onCreateShape(\n 'entrance',\n entranceIconGeometry(world, DEFAULT_ENTRANCE_SIZE),\n { label: defaultEntranceLabel(DEFAULT_ENTRANCE_SIZE, theme.STORE_TEXT_COLOR) },\n );\n return;\n }\n if (tool === 'draw-unit' || isEllipseDrawTool(tool)) {\n e.currentTarget.setPointerCapture?.(e.pointerId);\n setDrawLockCircle(e.shiftKey);\n setDrawing([world, world]);\n return;\n }\n\n if (showsCurveHandles(tool) && selectedShape && displayGeometry) {\n const handleHit = hitTestHandle(displayGeometry, world, worldPx(HANDLE_HIT_PX));\n if (handleHit) {\n if (e.detail >= 2) {\n deleteShapeHandle(handleHit.ringIndex, handleHit.edgeIndex);\n return;\n }\n setSelectedHandle({\n ringIndex: handleHit.ringIndex,\n edgeIndex: handleHit.edgeIndex,\n handle: handleHit.handle,\n });\n setSelectedVertex(null);\n setVertexDrag({\n type: 'handle',\n shapeId: selectedShape.id,\n ringIndex: handleHit.ringIndex,\n edgeIndex: handleHit.edgeIndex,\n handle: handleHit.handle,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n return;\n }\n const midHit = hitTestEdgeMidpoint(\n displayGeometry,\n world,\n worldPx(HANDLE_HIT_PX),\n );\n if (midHit && midHit.kind === 'line') {\n setSelectedVertex(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n setVertexDrag({\n type: 'bend',\n shapeId: selectedShape.id,\n ringIndex: midHit.polygonIndex,\n edgeIndex: midHit.afterVertexIndex,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n return;\n }\n }\n\n if (canJoinOpenEnds(tool) && tryJoinOpenEnd(world)) return;\n\n if (showsShapeAnchors(tool) && selectedShape && displayGeometry) {\n const handleTol = worldPx(VERTEX_HIT_PX);\n const hit = hitTestVertex(displayGeometry, world, handleTol);\n if (hit) {\n if (e.detail >= 2) {\n deleteShapeAnchor(hit.polygonIndex, hit.vertexIndex);\n return;\n }\n setSelectedVertex({\n polygonIndex: hit.polygonIndex,\n vertexIndex: hit.vertexIndex,\n });\n setSelectedHandle(null);\n setVertexDrag({\n type: 'anchor',\n shapeId: selectedShape.id,\n polygonIndex: hit.polygonIndex,\n vertexIndex: hit.vertexIndex,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n return;\n }\n }\n\n if (tool === 'select' && selectedShape && displayGeometry) {\n const edgeHit = hitTestEdge(displayGeometry, world, worldPx(VERTEX_HIT_PX));\n if (edgeHit) {\n beginEdgePress(\n edgeHit.polygonIndex,\n edgeHit.afterVertexIndex,\n edgeHit.point,\n e,\n );\n return;\n }\n }\n\n if (emptyCanvasDragPans(tool)) {\n beginPan(e, tool === 'select');\n }\n };\n\n const onPointerMove = (e: React.PointerEvent) => {\n if (pinchRef.current) return;\n if (panStart.current) {\n const svg = svgRef.current;\n if (!svg) return;\n const user = clientToSvgUser(svg, e.clientX, e.clientY);\n const nextPan = {\n x: panStart.current.panX + (user.x - panStart.current.x),\n y: panStart.current.panY + (user.y - panStart.current.y),\n };\n applyView(nextPan, viewRef.current.zoom);\n return;\n }\n if (edgePress && selectedShape) {\n const world = toWorld(e.clientX, e.clientY);\n const screenMove = Math.hypot(\n e.clientX - edgePress.clientX,\n e.clientY - edgePress.clientY,\n );\n if (!edgePress.dragging && screenMove < EDGE_DRAG_PX) return;\n if (!edgePress.dragging) {\n setEdgePress({ ...edgePress, dragging: true });\n setHoveredEdge(null);\n }\n const next = translateEdge(\n edgePress.originGeometry,\n edgePress.ringIndex,\n edgePress.edgeIndex,\n { x: world.x - edgePress.start.x, y: world.y - edgePress.start.y },\n );\n onUpdateShapeGeometry(selectedShape.id, next, { live: true });\n return;\n }\n if (stubDrag) {\n const world = toWorld(e.clientX, e.clientY);\n setStubDrag({ ...stubDrag, cursor: world });\n return;\n }\n if (dragAnchor != null) {\n setDragAnchorPoint(toWorld(e.clientX, e.clientY));\n return;\n }\n if (vertexDrag && selectedShape) {\n try {\n svgRef.current?.setPointerCapture?.(e.pointerId);\n } catch {\n /* capture may already be held */\n }\n const world = toWorld(e.clientX, e.clientY);\n const next =\n vertexDrag.type === 'handle'\n ? moveHandle(\n selectedShape.geometry,\n vertexDrag.ringIndex,\n vertexDrag.edgeIndex,\n vertexDrag.handle,\n world,\n )\n : vertexDrag.type === 'bend'\n ? bendEdgeToCubic(\n selectedShape.geometry,\n vertexDrag.ringIndex,\n vertexDrag.edgeIndex,\n world,\n )\n : moveVertex(\n selectedShape.geometry,\n vertexDrag.polygonIndex,\n vertexDrag.vertexIndex,\n world,\n );\n onUpdateShapeGeometry(selectedShape.id, next, { live: true });\n return;\n }\n if (shapeDrag) {\n const world = toWorld(e.clientX, e.clientY);\n setShapeOffset({\n x: world.x - shapeDrag.start.x,\n y: world.y - shapeDrag.start.y,\n });\n return;\n }\n if (\n (tool === 'draw-unit' || isEllipseDrawTool(tool)) &&\n drawing.length > 0\n ) {\n const world = toWorld(e.clientX, e.clientY);\n if (isEllipseDrawTool(tool)) setDrawLockCircle(e.shiftKey);\n setDrawing((prev) => {\n if (prev.length === 0) return prev;\n return [prev[0], world];\n });\n }\n if (isPolygonDrawTool(tool) && polygonPoints.length > 0) {\n const world = toWorld(e.clientX, e.clientY);\n const snap = snapPolygonPoint(world);\n setPolygonSnap(snap);\n setRubberCursor(snap ?? world);\n }\n if (wayfindingOn && !stubDrag && dragAnchor == null) {\n scheduleRouteHover(e.clientX, e.clientY);\n }\n if (canJoinOpenEnds(tool) && !readOnly) {\n const world = toWorld(e.clientX, e.clientY);\n const snapTol = worldPx(SNAP_HIT_PX);\n const endHit = hitOpenEnd(\n splitJoinShapes,\n world,\n snapTol,\n splitJoinPending,\n );\n if (endHit && splitJoinPending) {\n setSplitJoinSnapEnd(endHit);\n setRubberCursor(endHit.point);\n setSplitJoinHover(null);\n } else {\n setSplitJoinSnapEnd(null);\n setRubberCursor(splitJoinPending ? world : null);\n setSplitJoinHover(\n isSplitJoinTool(tool) && !nearSplitJoinAnchor(world, snapTol)\n ? hitSplitJoinEdge(splitJoinShapes, world, worldPx(VERTEX_HIT_PX))\n : null,\n );\n }\n }\n };\n\n const finishRect = () => {\n if (drawing.length < 2) {\n setDrawing([]);\n return;\n }\n const [a, b] = [drawing[0], drawing[drawing.length - 1]];\n if (dragSize(a, b) < 2) {\n setDrawing([]);\n return;\n }\n const poly = rectPolygon(a, b);\n onCreateShape('unit', polygonsToGeometry([poly]));\n setDrawing([]);\n setDrawLockCircle(false);\n };\n\n const finishEllipse = (lockCircle: boolean) => {\n if (drawing.length < 2) {\n setDrawing([]);\n setDrawLockCircle(false);\n return;\n }\n const [a, b] = [drawing[0], drawing[drawing.length - 1]];\n if (dragSize(a, b) < 2) {\n setDrawing([]);\n setDrawLockCircle(false);\n return;\n }\n onCreateShape(\n tool === 'draw-void-circle' ? 'void' : 'unit',\n ellipseGeometry(a, b, lockCircle),\n );\n setDrawing([]);\n setDrawLockCircle(false);\n };\n\n const onPointerUp = (e: React.PointerEvent) => {\n if (pinchRef.current) return;\n const endedPan = panStart.current;\n panStart.current = null;\n setIsPanning(false);\n if (endedPan?.fromEmptySelect) {\n const moved = Math.hypot(\n e.clientX - endedPan.clientX,\n e.clientY - endedPan.clientY,\n );\n if (moved < 4) {\n onSelectShape(null);\n onSelectAnchors([]);\n setSelectedVertex(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n setSplitJoinPending(null);\n setSplitJoinSnapEnd(null);\n setRubberCursor(null);\n }\n }\n onHistoryGestureEnd?.();\n if (stubDrag) {\n try {\n svgRef.current?.releasePointerCapture?.(e.pointerId);\n } catch {\n /* capture may already be released */\n }\n const moved = Math.hypot(\n e.clientX - stubDrag.clientX,\n e.clientY - stubDrag.clientY,\n );\n if (moved >= 4) {\n onConnectShapeToRoute(\n stubDrag.shapeId,\n stubDrag.origin,\n stubDrag.cursor,\n worldPx(WAYFINDING_SNAP_PX),\n );\n }\n setStubDrag(null);\n return;\n }\n if (edgePress) {\n if (!edgePress.dragging && selectedShape) {\n insertAnchorOnEdge(\n selectedShape,\n edgePress.ringIndex,\n edgePress.edgeIndex,\n edgePress.insertAt,\n );\n }\n setEdgePress(null);\n return;\n }\n if (vertexDrag) {\n setVertexDrag(null);\n return;\n }\n if (shapeDrag && selectedShape) {\n const next = translateGeometry(\n shapeDrag.originGeometry,\n shapeOffset.x,\n shapeOffset.y,\n );\n if (Math.hypot(shapeOffset.x, shapeOffset.y) >= 0.5) {\n onUpdateShapeGeometry(selectedShape.id, next);\n }\n setShapeDrag(null);\n setShapeOffset({ x: 0, y: 0 });\n return;\n }\n if (dragAnchor != null) {\n const moved = anchors.find((a) => a.id === dragAnchor);\n const point = dragAnchorPoint ?? moved;\n if (moved && point) {\n if (\n tool === 'select' &&\n moved.shapeId == null &&\n (routeAnchorDegreeById.get(moved.id) ?? 0) <= 1\n ) {\n const drop = toWorld(e.clientX, e.clientY);\n const snap = nearestRouteSnap(\n drop,\n anchors,\n edges,\n dragRouteExcludeIds,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n );\n if (snap) {\n onConnectRouteAnchorToRoute(\n moved.id,\n drop,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n );\n onSelectAnchors([\n snap.type === 'junction' ? snap.anchorId : moved.id,\n ]);\n setDragAnchor(null);\n setDragAnchorPoint(null);\n setRoutePointerSnap(null);\n return;\n }\n }\n if (Math.hypot(point.x - moved.x, point.y - moved.y) >= 0.01) {\n onMoveAnchor(moved.id, point.x, point.y);\n onHistoryGestureEnd?.();\n }\n const near = anchors\n .filter((a) => a.id !== moved.id)\n .filter((a) => Math.hypot(a.x - point.x, a.y - point.y) <= 2.5)\n .map((a) => a.id);\n if (near.length) onSelectAnchors([moved.id, ...near]);\n }\n setDragAnchor(null);\n setDragAnchorPoint(null);\n return;\n }\n if (tool === 'draw-unit') finishRect();\n if (isEllipseDrawTool(tool)) finishEllipse(e.shiftKey);\n };\n\n const pathDFromGeometry = (geometry: CmShape['geometry']): string => {\n const rings = geometryToRings(geometry);\n if (rings.length > 0) {\n return rings.map(ringToPathD).join(' ');\n }\n return (\n geometry.paths.map((p) => p.d).join(' ') ||\n polygonsToPath(geometry.polygons)\n );\n };\n\n const shapePathD = (shape: CmShape): string => {\n if (\n selectedShapeId === shape.id &&\n displayGeometry &&\n shapeDrag?.shapeId === shape.id\n ) {\n return pathDFromGeometry(displayGeometry);\n }\n return pathDFromGeometry(shape.geometry);\n };\n\n const stubExcludeIds = stubDrag\n ? storeLinkOriginIds(anchors, stubDrag)\n : storeLinkPreview\n ? storeLinkOriginIds(anchors, storeLinkPreview)\n : null;\n const stubSnap =\n stubDrag && stubExcludeIds\n ? nearestRouteSnap(\n stubDrag.cursor,\n anchors,\n edges,\n stubExcludeIds,\n worldPx(WAYFINDING_SNAP_PX),\n anchorById,\n )\n : storeLinkPreview && rubberCursor && stubExcludeIds\n ? routePointerSnap\n : null;\n const lastRoutePoint =\n lastRouteAnchor != null ? anchorById.get(lastRouteAnchor) : undefined;\n const routeRubberSnap =\n !stubDrag &&\n !storeLinkPreview &&\n rubberCursor &&\n (routeDraftPoint ||\n (canPlaceNewRoute(tool) && lastRouteAnchor != null))\n ? routePointerSnap\n : null;\n const highlightedRouteEdgeId =\n (dragRouteSnap?.type === 'edge' ? dragRouteSnap.edgeId : null) ??\n (stubSnap?.type === 'edge' ? stubSnap.edgeId : null) ??\n routeHover?.edgeId ??\n null;\n const highlightedRouteEdge =\n highlightedRouteEdgeId == null\n ? null\n : edges.find((edge) => edge.id === highlightedRouteEdgeId) ?? null;\n const highlightedRouteFrom = highlightedRouteEdge\n ? displayAnchorById.get(highlightedRouteEdge.fromAnchorId)\n : null;\n const highlightedRouteTo = highlightedRouteEdge\n ? displayAnchorById.get(highlightedRouteEdge.toAnchorId)\n : null;\n const routePlusAt =\n (dragRouteSnap?.type === 'edge' ? dragRouteSnap.point : null) ??\n (stubSnap?.type === 'edge' ? stubSnap.point : null) ??\n routeHover?.point ??\n null;\n const rubberFrom =\n stubDrag?.origin ??\n storeLinkPreview?.origin ??\n routeDraftPoint ??\n (canPlaceNewRoute(tool) && lastRoutePoint\n ? { x: lastRoutePoint.x, y: lastRoutePoint.y }\n : null);\n const rubberTo =\n stubDrag != null\n ? stubSnap?.point ?? stubDrag.cursor\n : stubSnap?.point ??\n routeRubberSnap?.point ??\n routeHover?.point ??\n rubberCursor;\n const rubberBand =\n (stubDrag != null ||\n storeLinkPreview != null ||\n routeDraftPoint != null ||\n (canPlaceNewRoute(tool) && lastRouteAnchor != null && rubberCursor != null))\n ? routeRubberBand(rubberFrom, rubberTo)\n : null;\n const polygonFollow =\n isPolygonDrawTool(tool) && polygonPoints.length > 0\n ? routeRubberBand(polygonPoints[polygonPoints.length - 1], rubberCursor)\n : null;\n const polygonClose =\n isPolygonDrawTool(tool) && polygonPoints.length >= 2\n ? routeRubberBand(rubberCursor, polygonPoints[0])\n : null;\n\n if (!level) {\n return (\n <div className={`eyeon-map-canvas${showGrid ? ' eyeon-map-canvas--grid' : ''}`}>\n <div className=\"eyeon-map-canvas__empty\">{emptyMessage}</div>\n </div>\n );\n }\n\n return (\n <div\n ref={canvasRef}\n className={`eyeon-map-canvas${showGrid ? ' eyeon-map-canvas--grid' : ''}`}\n onPointerDownCapture={onCanvasPointerDownCapture}\n onPointerMoveCapture={onCanvasPointerMoveCapture}\n onPointerUpCapture={onCanvasPointerUpCapture}\n onPointerCancelCapture={onCanvasPointerUpCapture}\n >\n <svg\n ref={svgRef}\n className={`eyeon-map-canvas__svg${routeHover && !stubDrag ? ' is-adding-route-point' : ''}`}\n viewBox={`${viewbox.x} ${viewbox.y} ${viewbox.width} ${viewbox.height}`}\n preserveAspectRatio=\"xMidYMid meet\"\n style={{\n cursor:\n routeHover && !stubDrag\n ? 'none'\n : dragAnchor != null || stubDrag\n ? 'grabbing'\n : edgePress?.dragging\n ? 'grabbing'\n : hoveredEdge\n ? 'none'\n : tool === 'draw-text'\n ? 'text'\n : tool === 'draw-entrance'\n ? 'cell'\n : isPanning || shapeDrag\n ? 'grabbing'\n : emptyCanvasDragPans(tool)\n ? 'grab'\n : isShapeDrawTool(tool) && !readOnly\n ? 'cell'\n : undefined,\n }}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n onPointerLeave={() => {\n cancelRouteHoverFrame();\n setRoutePointerSnap(null);\n }}\n onMouseDown={(e) => {\n if (tool !== 'draw-text') e.preventDefault();\n }}\n onDoubleClick={(e) => {\n e.preventDefault();\n window.getSelection()?.removeAllRanges();\n }}\n >\n <g\n ref={viewGroupRef}\n className=\"eyeon-map-canvas__view\"\n transform={`translate(${viewRef.current.pan.x}, ${viewRef.current.pan.y}) scale(${viewRef.current.zoom})`}\n >\n <defs>\n <pattern\n id={openingHatchId}\n patternUnits=\"userSpaceOnUse\"\n width={14}\n height={14}\n >\n <rect width=\"14\" height=\"14\" fill=\"#94a3b8\" fillOpacity=\"0.16\" />\n <path d=\"M-2 16 L16 -2\" stroke=\"#64748b\" strokeWidth=\"1.15\" />\n </pattern>\n {openingShapes.length > 0 ? (\n <clipPath id={openingClipId}>\n {openingShapes.map((shape) => (\n <path key={shape.id} d={shapePathD(shape)} />\n ))}\n </clipPath>\n ) : null}\n </defs>\n {svgUnderlayUrl ? (\n <OutdoorSvgUnderlay\n url={svgUnderlayUrl}\n imageProxyUrl={imageProxyUrl}\n suppressIds={svgSuppressIds}\n theme={theme}\n />\n ) : null}\n\n {underlayShapes.filter(isUnderlayDrawnShape).map((shape) => {\n const hintable = !wayfindingOn && isUnderlayHintShape(shape.kind);\n const hovered = hintable && hoveredShapeId === shape.id;\n const publishedFill = editorShapeFill(\n shape,\n theme,\n assignmentByShapeId.get(shape.id),\n );\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={editorShapeEmphasisColor(publishedFill, hovered)}\n fillOpacity={hovered ? 0.4 : hintable ? 0.22 : 0.32}\n stroke={hovered ? editorShapeEmphasisColor(publishedFill, true) : '#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 const emphasisStroke = editorShapeEmphasisColor(\n shape.label.color ?? theme.STORE_TEXT_COLOR,\n selected || hovered,\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 ? emphasisStroke : '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 const emphasisStroke = editorShapeEmphasisColor(\n shape.label.color ?? theme.STORE_TEXT_COLOR,\n selected || hovered,\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 ? emphasisStroke : '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 const emphasized = selected || hovered;\n const publishedFill = editorShapeFill(\n shape,\n theme,\n assignmentByShapeId.get(shape.id),\n );\n const emphasisFill = editorShapeEmphasisColor(\n opening ? '#94a3b8' : publishedFill,\n emphasized,\n );\n return (\n <path\n key={shape.id}\n d={shapePathD(shape)}\n fill={\n opening\n ? `url(#${openingHatchId})`\n : editorShapeEmphasisColor(publishedFill, emphasized)\n }\n fillOpacity={\n opening\n ? 1\n : editorHoverFillOpacity(\n shape.kind,\n baseOpacity,\n emphasized,\n )\n }\n stroke={emphasized ? emphasisFill : '#64748b'}\n strokeWidth={\n selected ? 2.5 / zoom : hovered ? 2 / zoom : 1 / zoom\n }\n strokeDasharray={\n opening && !selected && !hovered\n ? `${6 / zoom} ${4 / zoom}`\n : undefined\n }\n onPointerDown={beginShapePointerDown}\n style={{ cursor }}\n {...hoverHandlers}\n />\n );\n })}\n\n {assignedOverlays.map((overlay) => (\n <AssignedShapeOverlay\n key={`assign-overlay-${overlay.shapeId}`}\n overlay={overlay}\n imageProxyUrl={imageProxyUrl}\n />\n ))}\n\n {/* Anchors (Select, Curve, Split / Join) + curve helpers (Curve only) */}\n {canSelectShapes(tool) &&\n selectedShape &&\n !isStampShape(selectedShape) &&\n geometryToRings(displayGeometry ?? selectedShape.geometry).map(\n (ring, ri) => {\n const n = edgeCount(ring);\n const items: React.ReactNode[] = [];\n for (let ei = 0; ei < n; ei++) {\n const edge = ring.edges[ei];\n const from = edgeFrom(ring, ei);\n const to = edgeTo(ring, ei);\n const hovered =\n hoveredEdge?.ringIndex === ri && hoveredEdge.edgeIndex === ei;\n const strokeD = edgeToPathD(ring, ei);\n if (tool === 'select') {\n items.push(\n <path\n key={`edge-hit-${selectedShape.id}-${ri}-${ei}`}\n d={strokeD}\n fill=\"none\"\n stroke=\"transparent\"\n strokeWidth={worldPx(VERTEX_HIT_PX * 2)}\n strokeLinecap=\"round\"\n style={{\n cursor: edgePress?.dragging ? 'grabbing' : 'none',\n }}\n onPointerEnter={(e) =>\n hoverEdgeAt(ri, ei, e.clientX, e.clientY)\n }\n onPointerMove={(e) =>\n hoverEdgeAt(ri, ei, e.clientX, e.clientY)\n }\n onPointerLeave={() =>\n setHoveredEdge((prev) =>\n prev?.ringIndex === ri && prev.edgeIndex === ei\n ? null\n : prev,\n )\n }\n onPointerDown={(e) => {\n if (tool !== 'select') return;\n const world = toWorld(e.clientX, e.clientY);\n const clickRing = geometryToRings(\n displayGeometry ?? selectedShape.geometry,\n )[ri];\n beginEdgePress(\n ri,\n ei,\n clickRing\n ? pointOnRingEdge(clickRing, ei, world)\n : world,\n e,\n );\n }}\n />,\n );\n if (hovered && hoveredEdge && !edgePress?.dragging) {\n const preview = hoveredEdge.point;\n const plus = worldPx(5);\n items.push(\n <path\n key={`edge-glow-${selectedShape.id}-${ri}-${ei}`}\n d={strokeD}\n fill=\"none\"\n stroke={EDITOR_GUIDE_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={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(3.5)}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n pointerEvents=\"none\"\n />,\n <g\n key={`edge-add-${selectedShape.id}-${ri}-${ei}`}\n className=\"eyeon-map-screen-const\"\n pointerEvents=\"none\"\n >\n <circle\n cx={preview.x}\n cy={preview.y}\n r={worldPx(9)}\n fill=\"#fff\"\n stroke={EDITOR_GUIDE_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={EDITOR_GUIDE_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={EDITOR_GUIDE_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={EDITOR_GUIDE_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 ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_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 ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_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={EDITOR_GUIDE_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 ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n onDoubleClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n if (!showsShapeAnchors(tool)) return;\n deleteShapeAnchor(ri, vi);\n }}\n onPointerDown={(e) => {\n if (!showsShapeAnchors(tool)) return;\n e.stopPropagation();\n if (e.detail >= 2) {\n deleteShapeAnchor(ri, vi);\n return;\n }\n setSelectedVertex({ polygonIndex: ri, vertexIndex: vi });\n setSelectedHandle(null);\n setVertexDrag({\n type: 'anchor',\n shapeId: selectedShape.id,\n polygonIndex: ri,\n vertexIndex: vi,\n });\n }}\n />,\n );\n });\n return items;\n },\n )}\n\n {wayfindingOn && routeEdgePath ? (\n <path\n className=\"eyeon-map-screen-stroke\"\n d={routeEdgePath}\n fill=\"none\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={8 / zoom}\n style={screenStrokeStyle(8 / zoom)}\n strokeLinecap=\"round\"\n strokeOpacity={0.95}\n pointerEvents=\"none\"\n />\n ) : null}\n\n {wayfindingOn && highlightedRouteFrom && highlightedRouteTo ? (\n <g pointerEvents=\"none\">\n <line\n className=\"eyeon-map-screen-stroke\"\n x1={highlightedRouteFrom.x}\n y1={highlightedRouteFrom.y}\n x2={highlightedRouteTo.x}\n y2={highlightedRouteTo.y}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(12)}\n style={screenStrokeStyle(worldPx(12))}\n strokeOpacity={0.22}\n strokeLinecap=\"round\"\n />\n <line\n className=\"eyeon-map-screen-stroke\"\n x1={highlightedRouteFrom.x}\n y1={highlightedRouteFrom.y}\n x2={highlightedRouteTo.x}\n y2={highlightedRouteTo.y}\n stroke=\"#22c55e\"\n strokeWidth={8 / zoom}\n style={screenStrokeStyle(8 / zoom)}\n strokeLinecap=\"round\"\n />\n {routePlusAt && !stubDrag ? (\n <g className=\"eyeon-map-screen-const\">\n <circle\n cx={routePlusAt.x}\n cy={routePlusAt.y}\n r={worldPx(9)}\n fill=\"#fff\"\n stroke={EDITOR_GUIDE_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={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(2)}\n strokeLinecap=\"round\"\n />\n </g>\n ) : null}\n </g>\n ) : null}\n\n {wayfindingOn && rubberBand && (\n <g pointerEvents=\"none\">\n <line\n className=\"eyeon-map-screen-stroke\"\n x1={rubberBand.from.x}\n y1={rubberBand.from.y}\n x2={rubberBand.to.x}\n y2={rubberBand.to.y}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={8 / zoom}\n style={screenStrokeStyle(8 / zoom)}\n strokeOpacity={0.85}\n strokeLinecap=\"round\"\n />\n {(stubDrag || storeLinkPreview) && (\n <HandleDot\n cx={rubberBand.to.x}\n cy={rubberBand.to.y}\n r={worldPx(stubSnap ? ANCHOR_R_SELECTED_PX : ANCHOR_R_PX)}\n hitR={worldPx(ANCHOR_HIT_PX)}\n fill={stubSnap ? '#22c55e' : EDITOR_GUIDE_COLOR}\n fillOpacity={0.85}\n stroke=\"#fff\"\n strokeWidth={worldPx(ANCHOR_STROKE_PX)}\n cursor=\"grabbing\"\n />\n )}\n </g>\n )}\n\n {wayfindingOn && routeDraftPoint && (\n <HandleDot\n cx={routeDraftPoint.x}\n cy={routeDraftPoint.y}\n r={worldPx(ANCHOR_R_PX)}\n hitR={worldPx(ANCHOR_HIT_PX)}\n fill=\"#0f172a\"\n fillOpacity={1}\n stroke=\"#fff\"\n strokeWidth={worldPx(ANCHOR_STROKE_PX)}\n cursor=\"default\"\n />\n )}\n\n {wayfindingOn &&\n anchors\n .filter((anchor) => wayfindingLinksShapes(level) || anchor.shapeId == null)\n .map((anchor) => {\n const selected = selectedAnchorIds.includes(anchor.id);\n const hovered = hoveredAnchorId === anchor.id;\n const shapeNode = anchor.shapeId != null;\n const connected = connectedAnchorIds.has(anchor.id);\n const displayAnchor = displayAnchorById.get(anchor.id) ?? anchor;\n const dragConnect = dragAnchor === anchor.id && dragRouteSnap != null;\n const nearWeld =\n selected &&\n selectedAnchorIds.some((id) => {\n if (id === anchor.id) return false;\n const other = anchorById.get(id);\n return (\n other &&\n Math.hypot(\n other.x - displayAnchor.x,\n other.y - displayAnchor.y,\n ) <= 2.5\n );\n });\n const visR = selected || shapeNode ? ANCHOR_R_SELECTED_PX : ANCHOR_R_PX;\n return (\n <g key={anchor.id}>\n <HandleDot\n cx={displayAnchor.x}\n cy={displayAnchor.y}\n r={worldPx(visR)}\n hitR={worldPx(WAYFINDING_ANCHOR_HIT_PX)}\n fill={\n dragConnect\n ? '#22c55e'\n : nearWeld\n ? '#22c55e'\n : shapeNode\n ? hovered\n ? '#f97316'\n : SHAPE_ROUTE_ANCHOR_FILL\n : selected\n ? hovered\n ? '#3b82f6'\n : EDITOR_GUIDE_COLOR\n : hovered\n ? '#334155'\n : '#0f172a'\n }\n fillOpacity={1}\n stroke={selected && shapeNode ? EDITOR_GUIDE_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 ? EDITOR_GUIDE_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 ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"pointer\"\n onPointerDown={(e) => {\n e.stopPropagation();\n tryJoinOpenEnd(end.point);\n }}\n />,\n );\n });\n return items;\n })}\n\n {isSplitJoinTool(tool) &&\n splitJoinHover &&\n !splitJoinHover.shared &&\n !splitJoinSnapEnd &&\n !nearSplitJoinAnchor(splitJoinHover.point, worldPx(SNAP_HIT_PX)) &&\n (() => {\n const shape = splitJoinShapes.find(\n (s) => s.id === splitJoinHover.shapeId,\n );\n if (!shape) return null;\n const preview = previewCutPoints(\n shape.geometry,\n splitJoinHover.ringIndex,\n splitJoinHover.edgeIndex,\n splitJoinHover.point,\n worldPx(SPLIT_JOIN_GAP_PX),\n );\n if (!preview) return null;\n const hideOnAnchor = worldPx(VERTEX_R_PX + 2);\n if (\n nearSplitJoinAnchor(preview.p1, hideOnAnchor) ||\n nearSplitJoinAnchor(preview.p2, hideOnAnchor)\n ) {\n return null;\n }\n return (\n <g pointerEvents=\"none\">\n <g className=\"eyeon-map-screen-const\">\n <circle\n cx={preview.p1.x}\n cy={preview.p1.y}\n r={worldPx(BEND_R_PX)}\n fill=\"#fff\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n />\n </g>\n <g className=\"eyeon-map-screen-const\">\n <circle\n cx={preview.p2.x}\n cy={preview.p2.y}\n r={worldPx(BEND_R_PX)}\n fill=\"#fff\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n />\n </g>\n </g>\n );\n })()}\n\n {canJoinOpenEnds(tool) &&\n splitJoinPending &&\n rubberCursor &&\n (() => {\n const shape = splitJoinShapes.find(\n (s) => s.id === splitJoinPending.shapeId,\n );\n const from = shape\n ? listOpenEnds(shape.geometry).find(\n (end) =>\n end.ringIndex === splitJoinPending.ringIndex &&\n end.end === splitJoinPending.end,\n )?.point\n : null;\n if (!from) return null;\n const snapped = splitJoinSnapEnd != null;\n return (\n <line\n x1={from.x}\n y1={from.y}\n x2={rubberCursor.x}\n y2={rubberCursor.y}\n stroke={EDITOR_GUIDE_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={EDITOR_GUIDE_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={EDITOR_GUIDE_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={EDITOR_GUIDE_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={EDITOR_GUIDE_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={EDITOR_GUIDE_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 ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_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={EDITOR_GUIDE_COLOR}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n />\n )}\n </>\n )}\n </g>\n </svg>\n {underlayTip ? (\n <div\n className=\"eyeon-map-canvas__underlay-tip\"\n style={{ left: underlayTip.x, top: underlayTip.y }}\n role=\"tooltip\"\n >\n {underlayTip.text}\n </div>\n ) : null}\n </div>\n );\n});\n\nEditorCanvas.displayName = 'EditorCanvas';\n","import type {\n BatchOp,\n CmAnchor,\n CmConnector,\n CmLevel,\n CmRouteEdge,\n CmShape,\n ConnectorDirection,\n ConnectorKind,\n Vec2,\n} from '../core';\nimport { distance, geometryCentroid } from '../core';\n\nexport type VerticalRailKind = 'escalator' | 'elevator';\n\nexport interface ParsedConnectorSource {\n family: ConnectorKind;\n group: string;\n direction?: 'up' | 'down';\n role?: 'start' | 'end';\n}\n\nconst FAMILY_PREFIXES: Array<{ prefix: string; family: ConnectorKind }> = [\n { prefix: 'escalator', family: 'escalator' },\n { prefix: 'elevator', family: 'elevator' },\n { prefix: 'travelator', family: 'travelator' },\n { prefix: 'stairs', family: 'stairs' },\n { prefix: 'ramp', family: 'ramp' },\n];\n\nfunction normalizeId(value: string | null | undefined): string {\n return (value ?? '').trim().toLowerCase().replace(/_/g, '-');\n}\n\n/** Parse v1-style ids: `escalator-5-up-start`, `elevator-2`. */\nexport function parseConnectorSourceId(\n value: string | null | undefined,\n): ParsedConnectorSource | null {\n const raw = normalizeId(value);\n if (!raw) return null;\n const family = FAMILY_PREFIXES.find(\n (item) => raw === item.prefix || raw.startsWith(`${item.prefix}-`),\n );\n if (!family) return null;\n const rest = raw.slice(family.prefix.length).replace(/^-+/, '');\n const parts = rest.split('-').filter(Boolean);\n let direction: 'up' | 'down' | undefined;\n let role: 'start' | 'end' | undefined;\n const groupParts: string[] = [];\n for (const part of parts) {\n if (part === 'up' || part === 'down') direction = part;\n else if (part === 'start' || part === 'end') role = part;\n else groupParts.push(part);\n }\n return {\n family: family.family,\n group: groupParts.join('-') || '1',\n direction,\n role,\n };\n}\n\nexport function guessConnectorKind(shape: {\n kind: string;\n key: string;\n sourceSvgId?: string | null;\n}): ConnectorKind | null {\n return (\n parseConnectorSourceId(shape.sourceSvgId)?.family ??\n parseConnectorSourceId(shape.key)?.family ??\n null\n );\n}\n\nexport function connectorIdForShape(\n shapeId: number,\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n): number | null {\n for (const anchor of anchors) {\n if (anchor.shapeId === shapeId && anchor.connectorId != null) {\n return anchor.connectorId;\n }\n }\n return null;\n}\n\nexport function connectorForShape(\n shapeId: number,\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n connectors: CmConnector[],\n): CmConnector | null {\n const id = connectorIdForShape(shapeId, anchors);\n if (id == null) return null;\n return connectors.find((item) => item.id === id) ?? null;\n}\n\nexport function resolvedConnectorKind(\n shape: { id: number; kind: string; key: string; sourceSvgId?: string | null },\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n connectors: CmConnector[],\n): ConnectorKind | null {\n return connectorForShape(shape.id, anchors, connectors)?.kind ?? guessConnectorKind(shape);\n}\n\nexport function railConnectorShapes<\n T extends { id: number; kind: string; key: string; sourceSvgId?: string | null; orphanedAt?: string | null },\n>(\n shapes: T[],\n kind: VerticalRailKind,\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n connectors: CmConnector[],\n): T[] {\n return shapes.filter((shape) => {\n if (shape.orphanedAt) return false;\n if (shape.kind !== 'connector' && guessConnectorKind(shape) !== kind) return false;\n return resolvedConnectorKind(shape, anchors, connectors) === kind;\n });\n}\n\nexport function landingAnchor(\n shapeId: number,\n anchors: CmAnchor[],\n): CmAnchor | undefined {\n return (\n anchors.find((a) => a.shapeId === shapeId && a.kind === 'connector') ??\n anchors.find((a) => a.shapeId === shapeId && a.connectorId != null) ??\n anchors.find((a) => a.shapeId === shapeId)\n );\n}\n\nexport function shapeLandingPoint(shape: Pick<CmShape, 'geometry'>): Vec2 {\n const c = geometryCentroid(shape.geometry);\n if (Number.isFinite(c.x) && Number.isFinite(c.y)) return c;\n const first = shape.geometry.polygons[0]?.[0];\n return first ?? { x: 0, y: 0 };\n}\n\nexport function inferTravelDirection(\n fromLevelIndex: number,\n toLevelIndex: number,\n hint?: 'up' | 'down',\n): ConnectorDirection {\n if (hint) return hint;\n if (toLevelIndex > fromLevelIndex) return 'up';\n if (toLevelIndex < fromLevelIndex) return 'down';\n return 'both';\n}\n\nexport function defaultConnectorName(\n kind: VerticalRailKind,\n shapes: Array<{ key: string; sourceSvgId?: string | null }>,\n): string {\n for (const shape of shapes) {\n const parsed =\n parseConnectorSourceId(shape.sourceSvgId) ?? parseConnectorSourceId(shape.key);\n if (parsed) {\n const label = kind === 'elevator' ? 'Elevator' : 'Escalator';\n return parsed.group && parsed.group !== '1' ? `${label} ${parsed.group}` : label;\n }\n }\n return kind === 'elevator' ? 'Elevator' : 'Escalator';\n}\n\nexport function nearestWalkAnchor(\n anchors: CmAnchor[],\n levelId: number,\n point: Vec2,\n excludeIds: ReadonlySet<number> = new Set(),\n): CmAnchor | null {\n let best: CmAnchor | null = null;\n let bestDist = Infinity;\n for (const anchor of anchors) {\n if (anchor.levelId !== levelId || excludeIds.has(anchor.id)) continue;\n if (anchor.kind !== 'junction' && anchor.kind !== 'unit') continue;\n const d = distance(anchor, point);\n if (d < bestDist) {\n best = anchor;\n bestDist = d;\n }\n }\n return best;\n}\n\nexport function memberShapeIds(\n connectorId: number,\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n): number[] {\n const ids = new Set<number>();\n for (const anchor of anchors) {\n if (anchor.connectorId === connectorId && anchor.shapeId != null) {\n ids.add(anchor.shapeId);\n }\n }\n return [...ids];\n}\n\nexport type ConnectorEdgeLike = Pick<\n CmRouteEdge,\n 'kind' | 'directed' | 'fromAnchorId' | 'toAnchorId'\n>;\n\nexport type ConnectorAnchorLike = Pick<CmAnchor, 'id' | 'shapeId' | 'connectorId'>;\n\nexport function partnerShapesForConnector<T extends { id: number }>(\n shapeId: number,\n anchors: ConnectorAnchorLike[],\n connectors: CmConnector[],\n shapes: T[],\n): T[] {\n const connector = connectorForShape(shapeId, anchors, connectors);\n if (!connector) return [];\n const ids = memberShapeIds(connector.id, anchors);\n return shapes.filter((s) => ids.includes(s.id) && s.id !== shapeId);\n}\n\nexport function levelsWithLandings<T extends { levelId: number }>(\n landings: T[],\n levels: CmLevel[],\n): CmLevel[] {\n const ids = new Set(landings.map((item) => item.levelId));\n return levels\n .filter((level) => ids.has(level.id))\n .slice()\n .sort((a, b) => a.ordering - b.ordering || a.levelIndex - b.levelIndex);\n}\n\nexport function escalatorDirectedEnds<T extends { id: number }>(\n connectorId: number,\n anchors: ConnectorAnchorLike[],\n edges: ConnectorEdgeLike[],\n shapes: T[],\n): { from: T; to: T } | null {\n const memberAnchors = anchors.filter((a) => a.connectorId === connectorId);\n const memberIds = new Set(memberAnchors.map((a) => a.id));\n const ride = edges.find(\n (edge) =>\n edge.kind === 'connector' &&\n edge.directed &&\n memberIds.has(edge.fromAnchorId) &&\n memberIds.has(edge.toAnchorId),\n );\n if (!ride) return null;\n const fromAnchor = anchors.find((a) => a.id === ride.fromAnchorId);\n const toAnchor = anchors.find((a) => a.id === ride.toAnchorId);\n const from = shapes.find((s) => s.id === fromAnchor?.shapeId);\n const to = shapes.find((s) => s.id === toAnchor?.shapeId);\n if (!from || !to) return null;\n return { from, to };\n}\n\nfunction floorName(\n levelId: number,\n levels: Array<{ id: number; name: string }>,\n): string {\n return levels.find((level) => level.id === levelId)?.name ?? 'Floor';\n}\n\nfunction landingRideId(\n shape: { key: string; levelId: number },\n levels: Array<{ id: number; name: string }>,\n): string {\n return `${floorName(shape.levelId, levels)} · ${shape.key}`;\n}\n\nexport type EscalatorRideEnds<T extends { id: number; key: string; levelId: number }> = {\n connectorId: number;\n from: T;\n to: T;\n};\n\nexport type EscalatorRideLandingLine = {\n shapeId: number;\n key: string;\n levelName: string;\n};\n\n/**\n * One sidebar row per linked ride. Boarding is `from`, exit is `to`.\n * Unlinked landings are omitted — they stay in the Unassigned list.\n */\nexport function groupEscalatorRides<T extends { id: number; key: string; levelId: number }>(\n connectors: Array<Pick<CmConnector, 'id' | 'kind'>>,\n anchors: ConnectorAnchorLike[],\n edges: ConnectorEdgeLike[],\n shapes: T[],\n): EscalatorRideEnds<T>[] {\n const rides: EscalatorRideEnds<T>[] = [];\n for (const connector of connectors) {\n if (connector.kind !== 'escalator') continue;\n const directed = escalatorDirectedEnds(connector.id, anchors, edges, shapes);\n if (directed) {\n rides.push({ connectorId: connector.id, from: directed.from, to: directed.to });\n continue;\n }\n const ids = new Set(memberShapeIds(connector.id, anchors));\n const members = shapes.filter((shape) => ids.has(shape.id));\n if (members.length < 2) continue;\n rides.push({ connectorId: connector.id, from: members[0], to: members[1] });\n }\n return rides;\n}\n\n/** Boarding on top, exit below — each with its floor name. */\nexport function escalatorRideLandingLines<\n T extends { id: number; key: string; levelId: number },\n>(\n ride: EscalatorRideEnds<T>,\n levels: Array<{ id: number; name: string }>,\n): [EscalatorRideLandingLine, EscalatorRideLandingLine] {\n return [\n {\n shapeId: ride.from.id,\n key: ride.from.key,\n levelName: floorName(ride.from.levelId, levels),\n },\n {\n shapeId: ride.to.id,\n key: ride.to.key,\n levelName: floorName(ride.to.levelId, levels),\n },\n ];\n}\n\n/** Assigned-list title: boarding → exit (escalator) or floor landings ↔ (elevator). */\nexport function connectorRideLabel(\n shape: { id: number; key: string; levelId: number },\n anchors: ConnectorAnchorLike[],\n edges: ConnectorEdgeLike[],\n connectors: CmConnector[],\n shapes: Array<{ id: number; key: string; levelId: number }>,\n levels: Array<{ id: number; name: string; ordering?: number; levelIndex?: number }> = [],\n): string | null {\n const connector = connectorForShape(shape.id, anchors, connectors);\n if (!connector) return null;\n\n if (connector.kind === 'escalator') {\n const ride = escalatorDirectedEnds(connector.id, anchors, edges, shapes);\n if (ride) {\n return `${ride.from.key} → ${ride.to.key}`;\n }\n const partners = partnerShapesForConnector(shape.id, anchors, connectors, shapes);\n if (partners.length === 1) {\n return `${shape.key} → ${partners[0].key}`;\n }\n return null;\n }\n\n const members = [shape, ...partnerShapesForConnector(shape.id, anchors, connectors, shapes)];\n if (members.length < 2) return null;\n const order = new Map(\n levels.map((level, index) => [\n level.id,\n (level.ordering ?? level.levelIndex ?? index) * 1000 + (level.levelIndex ?? index),\n ]),\n );\n const sorted = members.slice().sort((a, b) => {\n const ai = order.get(a.levelId) ?? Number.POSITIVE_INFINITY;\n const bi = order.get(b.levelId) ?? Number.POSITIVE_INFINITY;\n return ai - bi;\n });\n return sorted.map((item) => landingRideId(item, levels)).join(' ↔ ');\n}\n\nfunction connectorEdgesBetween(\n edges: CmRouteEdge[],\n anchorIds: ReadonlySet<number>,\n): CmRouteEdge[] {\n return edges.filter(\n (edge) =>\n edge.kind === 'connector' &&\n anchorIds.has(edge.fromAnchorId) &&\n anchorIds.has(edge.toAnchorId),\n );\n}\n\nexport interface ConnectorPlanContext {\n mapId: number;\n levels: CmLevel[];\n shapes: CmShape[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n connectors: CmConnector[];\n allocId: () => number;\n}\n\nfunction ensureLanding(\n ctx: ConnectorPlanContext,\n shape: CmShape,\n connectorId: number,\n ops: BatchOp[],\n): CmAnchor {\n const existing = landingAnchor(shape.id, ctx.anchors);\n const point = existing\n ? { x: existing.x, y: existing.y }\n : shapeLandingPoint(shape);\n if (existing) {\n if (existing.connectorId !== connectorId || existing.kind !== 'connector') {\n const next: CmAnchor = {\n ...existing,\n kind: 'connector',\n connectorId,\n };\n ops.push({ op: 'upsert_anchor', anchor: next });\n ctx.anchors = ctx.anchors.map((a) => (a.id === next.id ? next : a));\n return next;\n }\n return existing;\n }\n const created: CmAnchor = {\n id: ctx.allocId(),\n levelId: shape.levelId,\n shapeId: shape.id,\n kind: 'connector',\n x: point.x,\n y: point.y,\n connectorId,\n };\n ops.push({ op: 'upsert_anchor', anchor: created });\n ctx.anchors = [...ctx.anchors, created];\n return created;\n}\n\nfunction linkLandingToWalk(\n ctx: ConnectorPlanContext,\n landing: CmAnchor,\n ops: BatchOp[],\n) {\n const near = nearestWalkAnchor(ctx.anchors, landing.levelId, landing, new Set([landing.id]));\n if (!near) return;\n const exists = ctx.edges.some(\n (e) =>\n (e.fromAnchorId === landing.id && e.toAnchorId === near.id) ||\n (e.fromAnchorId === near.id && e.toAnchorId === landing.id),\n );\n if (exists) return;\n const edge: CmRouteEdge = {\n id: ctx.allocId(),\n mapId: ctx.mapId,\n fromAnchorId: landing.id,\n toAnchorId: near.id,\n weight: null,\n directed: false,\n accessible: true,\n kind: 'walk',\n };\n ops.push({ op: 'upsert_edge', edge });\n ctx.edges = [...ctx.edges, edge];\n}\n\nfunction applyUnlinkLocal(ctx: ConnectorPlanContext, connectorId: number): BatchOp[] {\n const memberAnchors = ctx.anchors.filter((a) => a.connectorId === connectorId);\n const ids = new Set(memberAnchors.map((a) => a.id));\n const ops: BatchOp[] = [];\n for (const edge of connectorEdgesBetween(ctx.edges, ids)) {\n ops.push({ op: 'delete_edge', edgeId: edge.id });\n }\n ctx.edges = ctx.edges.filter(\n (e) =>\n !(e.kind === 'connector' && ids.has(e.fromAnchorId) && ids.has(e.toAnchorId)),\n );\n for (const anchor of memberAnchors) {\n ops.push({\n op: 'upsert_anchor',\n anchor: { ...anchor, connectorId: null },\n });\n }\n ctx.anchors = ctx.anchors.map((a) =>\n a.connectorId === connectorId ? { ...a, connectorId: null } : a,\n );\n ctx.connectors = ctx.connectors.filter((c) => c.id !== connectorId);\n ops.push({ op: 'delete_connector', connectorId });\n return ops;\n}\n\nfunction unlinkConnectorOps(ctx: ConnectorPlanContext, connectorId: number): BatchOp[] {\n return applyUnlinkLocal(ctx, connectorId);\n}\n\nexport function buildUnlinkConnectorOps(\n ctx: ConnectorPlanContext,\n connectorId: number,\n): BatchOp[] {\n return unlinkConnectorOps(ctx, connectorId);\n}\n\nexport function buildEscalatorLinkOps(\n ctx: ConnectorPlanContext,\n fromShape: CmShape,\n toShape: CmShape,\n options?: { name?: string; direction?: 'up' | 'down' },\n): BatchOp[] {\n const fromLevel = ctx.levels.find((l) => l.id === fromShape.levelId);\n const toLevel = ctx.levels.find((l) => l.id === toShape.levelId);\n const direction = inferTravelDirection(\n fromLevel?.levelIndex ?? 0,\n toLevel?.levelIndex ?? 0,\n options?.direction ??\n parseConnectorSourceId(fromShape.sourceSvgId)?.direction ??\n parseConnectorSourceId(toShape.sourceSvgId)?.direction,\n );\n const name =\n options?.name ?? defaultConnectorName('escalator', [fromShape, toShape]);\n\n const existingFrom = connectorIdForShape(fromShape.id, ctx.anchors);\n const existingTo = connectorIdForShape(toShape.id, ctx.anchors);\n const ops: BatchOp[] = [];\n const working: ConnectorPlanContext = {\n ...ctx,\n anchors: ctx.anchors.slice(),\n edges: ctx.edges.slice(),\n connectors: ctx.connectors.slice(),\n };\n\n for (const id of new Set([existingFrom, existingTo].filter((v): v is number => v != null))) {\n ops.push(...applyUnlinkLocal(working, id));\n }\n\n const connectorId = working.allocId();\n const connector: CmConnector = {\n id: connectorId,\n mapId: working.mapId,\n kind: 'escalator',\n name,\n direction,\n accessible: false,\n };\n ops.push({ op: 'upsert_connector', connector });\n working.connectors = [...working.connectors, connector];\n\n const fromAnchor = ensureLanding(working, fromShape, connectorId, ops);\n const toAnchor = ensureLanding(working, toShape, connectorId, ops);\n linkLandingToWalk(working, fromAnchor, ops);\n linkLandingToWalk(working, toAnchor, ops);\n\n ops.push({\n op: 'upsert_edge',\n edge: {\n id: working.allocId(),\n mapId: working.mapId,\n fromAnchorId: fromAnchor.id,\n toAnchorId: toAnchor.id,\n weight: null,\n directed: true,\n accessible: false,\n kind: 'connector',\n },\n });\n return ops;\n}\n\nexport function buildElevatorShaftOps(\n ctx: ConnectorPlanContext,\n memberShapes: CmShape[],\n options?: { name?: string; accessible?: boolean; connectorId?: number },\n): BatchOp[] {\n const unique = new Map(memberShapes.map((s) => [s.id, s]));\n const members = [...unique.values()];\n if (members.length < 2) return [];\n\n const ops: BatchOp[] = [];\n const working: ConnectorPlanContext = {\n ...ctx,\n anchors: ctx.anchors.slice(),\n edges: ctx.edges.slice(),\n connectors: ctx.connectors.slice(),\n };\n const existingIds = new Set(\n members\n .map((s) => connectorIdForShape(s.id, working.anchors))\n .filter((id): id is number => id != null),\n );\n const keepId =\n options?.connectorId ??\n (existingIds.size === 1 ? [...existingIds][0] : undefined);\n\n for (const id of existingIds) {\n if (id === keepId) {\n const memberAnchors = working.anchors.filter((a) => a.connectorId === id);\n const ids = new Set(memberAnchors.map((a) => a.id));\n for (const edge of connectorEdgesBetween(working.edges, ids)) {\n ops.push({ op: 'delete_edge', edgeId: edge.id });\n working.edges = working.edges.filter((e) => e.id !== edge.id);\n }\n continue;\n }\n ops.push(...applyUnlinkLocal(working, id));\n }\n\n const connectorId = keepId ?? working.allocId();\n const connector: CmConnector = {\n id: connectorId,\n mapId: working.mapId,\n kind: 'elevator',\n name: options?.name ?? defaultConnectorName('elevator', members),\n direction: 'both',\n accessible: options?.accessible ?? true,\n };\n ops.push({ op: 'upsert_connector', connector });\n\n const landings = members.map((shape) => ensureLanding(working, shape, connectorId, ops));\n for (const landing of landings) linkLandingToWalk(working, landing, ops);\n\n for (let i = 0; i < landings.length; i++) {\n for (let j = i + 1; j < landings.length; j++) {\n ops.push({\n op: 'upsert_edge',\n edge: {\n id: working.allocId(),\n mapId: working.mapId,\n fromAnchorId: landings[i].id,\n toAnchorId: landings[j].id,\n weight: null,\n directed: false,\n accessible: connector.accessible,\n kind: 'connector',\n },\n });\n }\n }\n return ops;\n}\n\nexport function suggestEscalatorPairs(\n shapes: CmShape[],\n levels: CmLevel[],\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n): Array<{ fromShapeId: number; toShapeId: number; label: string }> {\n const groups = new Map<string, CmShape[]>();\n for (const shape of shapes) {\n if (shape.orphanedAt) continue;\n if (guessConnectorKind(shape) !== 'escalator') continue;\n if (connectorIdForShape(shape.id, anchors) != null) continue;\n const parsed =\n parseConnectorSourceId(shape.sourceSvgId) ?? parseConnectorSourceId(shape.key);\n if (!parsed) continue;\n const key = `${parsed.group}:${parsed.direction ?? ''}`;\n const list = groups.get(key) ?? [];\n list.push(shape);\n groups.set(key, list);\n }\n const suggestions: Array<{ fromShapeId: number; toShapeId: number; label: string }> = [];\n for (const [key, group] of groups) {\n if (group.length !== 2) continue;\n if (group[0].levelId === group[1].levelId) continue;\n const parsed =\n parseConnectorSourceId(group[0].sourceSvgId) ?? parseConnectorSourceId(group[0].key);\n const start =\n group.find((s) => parseConnectorSourceId(s.sourceSvgId)?.role === 'start') ??\n group[0];\n const end = group.find((s) => s.id !== start.id)!;\n const fromName = levels.find((l) => l.id === start.levelId)?.name ?? 'Floor';\n const toName = levels.find((l) => l.id === end.levelId)?.name ?? 'Floor';\n const dir = parsed?.direction ? ` ${parsed.direction}` : '';\n suggestions.push({\n fromShapeId: start.id,\n toShapeId: end.id,\n label: `Escalator ${key.split(':')[0]}${dir}: ${fromName} → ${toName}`,\n });\n }\n return suggestions;\n}\n","import type {\n BatchOp,\n BBox,\n CmAmenityCatalogItem,\n CmAnchor,\n CmBuilding,\n CmConnector,\n CmLevel,\n CmResponsiveOverride,\n CmRouteEdge,\n CmShape,\n CmShapeAssignment,\n ShapeGeometry,\n ThemeDefaults,\n} from '../core';\nimport {\n bboxOf,\n canonicalizeEntranceLabel,\n geometryBBox,\n mergeEntranceAwareLabel,\n normalizeGeometrySpace,\n parseShapeAssignment,\n} from '../core';\n\nexport interface EditorDraftState {\n mapId: number;\n centerId: number;\n theme: Partial<ThemeDefaults>;\n buildings: CmBuilding[];\n levels: CmLevel[];\n shapes: CmShape[];\n assignments: CmShapeAssignment[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n connectors: CmConnector[];\n amenities: CmAmenityCatalogItem[];\n baseSvgUrl?: string | null;\n responsiveOverrides?: CmResponsiveOverride[];\n}\n\nfunction geometryBbox(geometry?: ShapeGeometry | null): BBox {\n const points = (geometry?.polygons ?? []).flat();\n return bboxOf(points);\n}\n\n/** True when another live shape already uses this ID on the floor. */\nexport function shapeKeyTakenOnLevel(\n shapes: Array<{\n id: number;\n levelId: number;\n key: string;\n orphanedAt?: string | null;\n }>,\n shapeId: number,\n levelId: number,\n key: string,\n): boolean {\n return shapes.some(\n (shape) =>\n shape.id !== shapeId &&\n shape.levelId === levelId &&\n shape.key === key &&\n !shape.orphanedAt,\n );\n}\n\nfunction upsertById<T extends { id: number }>(\n rows: T[],\n next: T,\n): T[] {\n const idx = rows.findIndex((row) => row.id === next.id);\n if (idx < 0) return [...rows, next];\n const copy = rows.slice();\n copy[idx] = next;\n return copy;\n}\n\nexport function applyDraftOp(\n draft: EditorDraftState,\n op: BatchOp,\n): EditorDraftState {\n switch (op.op) {\n case 'upsert_shape': {\n const incoming = op.shape;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.shapes.find((s) => s.id === id);\n const geometry = incoming.geometry ?? existing?.geometry ?? {\n paths: [],\n polygons: [],\n };\n const shape: CmShape = {\n id,\n levelId: incoming.levelId ?? existing?.levelId ?? 0,\n key: incoming.key ?? existing?.key ?? `shape-${id}`,\n kind: incoming.kind ?? existing?.kind ?? 'unit',\n geometry,\n bbox:\n incoming.bbox ??\n (incoming.geometry != null\n ? geometryBbox(geometry)\n : existing?.bbox) ??\n geometryBbox(geometry),\n zIndex: incoming.zIndex ?? existing?.zIndex ?? 0,\n style: incoming.style ?? existing?.style ?? {},\n sourceSvgId: incoming.sourceSvgId ?? existing?.sourceSvgId ?? null,\n origin: incoming.origin ?? existing?.origin ?? 'manual',\n label: mergeEntranceAwareLabel(existing?.label, incoming.label, {\n kind: incoming.kind ?? existing?.kind ?? 'unit',\n origin: incoming.origin ?? existing?.origin ?? 'manual',\n sourceSvgId:\n incoming.sourceSvgId ?? existing?.sourceSvgId ?? null,\n }),\n geometryLocked:\n incoming.geometryLocked ??\n (incoming.geometry != null ? true : existing?.geometryLocked) ??\n false,\n orphanedAt: incoming.orphanedAt ?? existing?.orphanedAt ?? null,\n };\n return { ...draft, shapes: upsertById(draft.shapes, shape) };\n }\n case 'delete_shape':\n return {\n ...draft,\n shapes: draft.shapes.filter((s) => s.id !== op.shapeId),\n assignments: draft.assignments.filter((a) => a.shapeId !== op.shapeId),\n };\n case 'upsert_assignment': {\n const kind =\n draft.shapes.find((s) => s.id === op.assignment.shapeId)?.kind ?? 'unit';\n const assignment = parseShapeAssignment(op.assignment, kind);\n const rest = draft.assignments.filter((a) => a.shapeId !== assignment.shapeId);\n return { ...draft, assignments: [...rest, assignment] };\n }\n case 'delete_assignment':\n return {\n ...draft,\n assignments: draft.assignments.filter((a) => a.shapeId !== op.shapeId),\n };\n case 'upsert_anchor': {\n const incoming = op.anchor;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.anchors.find((a) => a.id === id);\n const anchor: CmAnchor = {\n id,\n levelId: incoming.levelId ?? existing?.levelId ?? 0,\n shapeId: incoming.shapeId ?? existing?.shapeId ?? null,\n kind: incoming.kind ?? existing?.kind ?? 'junction',\n x: incoming.x ?? existing?.x ?? 0,\n y: incoming.y ?? existing?.y ?? 0,\n connectorId:\n incoming.connectorId !== undefined\n ? incoming.connectorId\n : existing?.connectorId ?? null,\n };\n return { ...draft, anchors: upsertById(draft.anchors, anchor) };\n }\n case 'delete_anchor':\n return {\n ...draft,\n anchors: draft.anchors.filter((a) => a.id !== op.anchorId),\n edges: draft.edges.filter(\n (e) => e.fromAnchorId !== op.anchorId && e.toAnchorId !== op.anchorId,\n ),\n };\n case 'upsert_edge': {\n const incoming = op.edge;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.edges.find((e) => e.id === id);\n const edge: CmRouteEdge = {\n id,\n mapId: incoming.mapId ?? existing?.mapId ?? draft.mapId,\n fromAnchorId: incoming.fromAnchorId ?? existing?.fromAnchorId ?? 0,\n toAnchorId: incoming.toAnchorId ?? existing?.toAnchorId ?? 0,\n weight: incoming.weight ?? existing?.weight ?? null,\n directed: incoming.directed ?? existing?.directed ?? false,\n accessible: incoming.accessible ?? existing?.accessible ?? true,\n kind: incoming.kind ?? existing?.kind ?? 'walk',\n };\n return { ...draft, edges: upsertById(draft.edges, edge) };\n }\n case 'delete_edge':\n return { ...draft, edges: draft.edges.filter((e) => e.id !== op.edgeId) };\n case 'weld_anchors': {\n const ids = (op.anchorIds ?? []).filter((id) => Number.isFinite(id));\n if (ids.length < 2) return draft;\n const keep = ids[0];\n const removed = new Set(ids.slice(1));\n const edges = draft.edges\n .map((e) => ({\n ...e,\n fromAnchorId: removed.has(e.fromAnchorId) ? keep : e.fromAnchorId,\n toAnchorId: removed.has(e.toAnchorId) ? keep : e.toAnchorId,\n }))\n .filter((e) => e.fromAnchorId !== e.toAnchorId);\n return {\n ...draft,\n anchors: draft.anchors.filter((a) => !removed.has(a.id)),\n edges,\n };\n }\n case 'update_theme':\n return { ...draft, theme: { ...draft.theme, ...op.theme } };\n case 'upsert_connector': {\n const incoming = op.connector;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.connectors.find((c) => c.id === id);\n const connector: CmConnector = {\n id,\n mapId: incoming.mapId ?? existing?.mapId ?? draft.mapId,\n kind: incoming.kind ?? existing?.kind ?? 'escalator',\n name: incoming.name ?? existing?.name ?? 'Connector',\n direction: incoming.direction ?? existing?.direction ?? 'both',\n accessible: incoming.accessible ?? existing?.accessible ?? false,\n };\n return { ...draft, connectors: upsertById(draft.connectors, connector) };\n }\n case 'delete_connector':\n return {\n ...draft,\n connectors: draft.connectors.filter((c) => c.id !== op.connectorId),\n anchors: draft.anchors.map((a) =>\n a.connectorId === op.connectorId ? { ...a, connectorId: null } : a,\n ),\n };\n case 'delete_level':\n return omitLevelFromDraft(draft, op.levelId);\n default:\n return draft;\n }\n}\n\n/** Drop a floor/outdoor level and every draft row that lived on it. */\nexport function omitLevelFromDraft(\n draft: EditorDraftState,\n levelId: number,\n): EditorDraftState {\n const removedShapeIds = new Set(\n draft.shapes.filter((shape) => shape.levelId === levelId).map((shape) => shape.id),\n );\n const removedAnchorIds = new Set(\n draft.anchors.filter((anchor) => anchor.levelId === levelId).map((anchor) => anchor.id),\n );\n const anchors = draft.anchors.filter((anchor) => anchor.levelId !== levelId);\n const liveConnectorIds = new Set(\n anchors\n .map((anchor) => anchor.connectorId)\n .filter((id): id is number => id != null),\n );\n return {\n ...draft,\n levels: draft.levels.filter((level) => level.id !== levelId),\n shapes: draft.shapes.filter((shape) => shape.levelId !== levelId),\n assignments: draft.assignments.filter((row) => !removedShapeIds.has(row.shapeId)),\n anchors,\n edges: draft.edges.filter(\n (edge) =>\n !removedAnchorIds.has(edge.fromAnchorId) &&\n !removedAnchorIds.has(edge.toAnchorId),\n ),\n connectors: draft.connectors.filter((connector) => liveConnectorIds.has(connector.id)),\n responsiveOverrides: (draft.responsiveOverrides ?? []).filter(\n (row) => row.levelId !== levelId,\n ),\n };\n}\n\nexport function applyDraftOps(\n draft: EditorDraftState,\n ops: BatchOp[],\n): EditorDraftState {\n const seeded = {\n ...healDraftGeometry(draft),\n connectors: draft.connectors ?? [],\n responsiveOverrides: draft.responsiveOverrides ?? [],\n };\n return ops.reduce(applyDraftOp, seeded);\n}\n\n/**\n * Rebuild `polygons` from `paths` on rows written before the Y-flip removal,\n * so the canvas outline and its vertex handles agree without a re-import.\n */\nfunction healDraftGeometry(draft: EditorDraftState): EditorDraftState {\n let changed = false;\n const shapes = draft.shapes.map((shape) => {\n const geometry = normalizeGeometrySpace(shape.geometry);\n const label = canonicalizeEntranceLabel(shape) ?? shape.label;\n const geometryChanged = geometry !== shape.geometry;\n const labelChanged = label !== shape.label;\n if (!geometryChanged && !labelChanged) return shape;\n changed = true;\n return {\n ...shape,\n geometry,\n bbox: geometryChanged ? geometryBBox(geometry) : shape.bbox,\n label,\n };\n });\n return changed ? { ...draft, shapes } : draft;\n}\n\n/** Collapse repeated updates to the same entity so Save Changes sends one op each. */\nexport function coalesceDraftOp(ops: BatchOp[], op: BatchOp): BatchOp[] {\n if (op.op === 'update_theme') {\n const prev = ops.filter((item) => item.op === 'update_theme');\n const rest = ops.filter((item) => item.op !== 'update_theme');\n const theme = prev.reduce(\n (acc, item) => (item.op === 'update_theme' ? { ...acc, ...item.theme } : acc),\n {} as Record<string, unknown>,\n );\n return [...rest, { op: 'update_theme', theme: { ...theme, ...op.theme } }];\n }\n\n if (op.op === 'upsert_shape' && op.shape.id != null) {\n const idx = ops.findIndex(\n (item) => item.op === 'upsert_shape' && item.shape.id === op.shape.id,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_shape') {\n const next = ops.slice();\n const merged = { ...ops[idx].shape, ...op.shape };\n next[idx] = {\n op: 'upsert_shape',\n shape: {\n ...merged,\n label: mergeEntranceAwareLabel(\n ops[idx].shape.label,\n op.shape.label,\n {\n kind: merged.kind ?? 'unit',\n origin: merged.origin,\n sourceSvgId: merged.sourceSvgId,\n },\n ),\n },\n };\n return next;\n }\n }\n\n if (op.op === 'upsert_anchor' && op.anchor.id != null) {\n const idx = ops.findIndex(\n (item) => item.op === 'upsert_anchor' && item.anchor.id === op.anchor.id,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_anchor') {\n const next = ops.slice();\n next[idx] = {\n op: 'upsert_anchor',\n anchor: { ...ops[idx].anchor, ...op.anchor },\n };\n return next;\n }\n }\n\n if (op.op === 'upsert_connector' && op.connector.id != null) {\n const idx = ops.findIndex(\n (item) => item.op === 'upsert_connector' && item.connector.id === op.connector.id,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_connector') {\n const next = ops.slice();\n next[idx] = {\n op: 'upsert_connector',\n connector: { ...ops[idx].connector, ...op.connector },\n };\n return next;\n }\n }\n\n if (op.op === 'upsert_assignment') {\n const idx = ops.findIndex(\n (item) =>\n item.op === 'upsert_assignment' &&\n item.assignment.shapeId === op.assignment.shapeId,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_assignment') {\n const next = ops.slice();\n next[idx] = { op: 'upsert_assignment', assignment: op.assignment };\n return next;\n }\n }\n\n return [...ops, op];\n}\n\n/**\n * Persist order for POST /v1/map/batch.\n * Relinking an escalator coalesces landing upserts into the earlier unlink slot,\n * which would otherwise write `connector_id` before the new connector exists.\n */\nconst BATCH_PERSIST_RANK: Record<BatchOp['op'], number> = {\n upsert_building: 10,\n upsert_level: 20,\n upsert_shape: 30,\n upsert_assignment: 40,\n upsert_connector: 50,\n upsert_anchor: 60,\n upsert_edge: 70,\n update_theme: 80,\n weld_anchors: 90,\n delete_edge: 100,\n delete_anchor: 110,\n delete_assignment: 120,\n delete_shape: 130,\n delete_connector: 140,\n delete_building: 150,\n delete_level: 160,\n};\n\nexport function orderBatchOpsForPersist(ops: BatchOp[]): BatchOp[] {\n return ops\n .map((op, index) => ({ op, index }))\n .sort((a, b) => {\n const rank = BATCH_PERSIST_RANK[a.op.op] - BATCH_PERSIST_RANK[b.op.op];\n return rank !== 0 ? rank : a.index - b.index;\n })\n .map(({ op }) => op);\n}\n","import React from 'react';\n\nfunction FieldResetIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3.3 8a4.7 4.7 0 1 0 1.15-3.15\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M3.1 2.6v3.3h3.3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function FieldResetButton({\n label,\n onClick,\n disabled,\n}: {\n label: string;\n onClick: () => void;\n disabled?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n className=\"eyeon-map-rail__field-reset\"\n aria-label={`Reset ${label}`}\n title=\"Reset\"\n disabled={disabled}\n onClick={onClick}\n >\n <FieldResetIcon />\n </button>\n );\n}\n","import { isTransparentColor } from '../core/color';\n\nexport { isTransparentColor, TRANSPARENT_COLOR } from '../core/color';\n\n/** Normalize `#rgb` / `#rrggbb` (with or without `#`) for `<input type=\"color\">`. */\nexport function normalizeHexColor(value: string): string | null {\n const match = value.trim().match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);\n if (!match) return null;\n let hex = match[1].toLowerCase();\n if (hex.length === 3) {\n hex = hex\n .split('')\n .map((ch) => ch + ch)\n .join('');\n }\n return `#${hex}`;\n}\n\nexport function hexColorInputValue(value: string): string {\n return normalizeHexColor(value) ?? '#000000';\n}\n\nexport function sameHexColor(a: string, b: string): boolean {\n if (isTransparentColor(a) || isTransparentColor(b)) {\n return isTransparentColor(a) && isTransparentColor(b);\n }\n const left = normalizeHexColor(a);\n const right = normalizeHexColor(b);\n return left != null && left === right;\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport {\n assignNumberFromDraft,\n commitAssignNumberDraft,\n LABEL_ALIGNS,\n normalizeLabelAlign,\n type LabelAlign,\n} from '../../core';\nimport { FieldResetButton } from '../FieldResetButton';\nimport {\n hexColorInputValue,\n isTransparentColor,\n normalizeHexColor,\n TRANSPARENT_COLOR,\n} from '../hexColor';\n\nexport function StepperRow({\n label,\n value,\n disabled,\n extra,\n onChange,\n onStep,\n onHoldStart,\n onHoldEnd,\n}: {\n label: string;\n value: number;\n disabled: boolean;\n extra?: React.ReactNode;\n onChange: (value: number) => void;\n onStep: (delta: number) => void;\n onHoldStart: (delta: number) => void;\n onHoldEnd: () => void;\n}) {\n const [draft, setDraft] = useState(() => String(value));\n const focused = useRef(false);\n const syncDraft = useRef(false);\n\n useEffect(() => {\n if (!focused.current || syncDraft.current) {\n setDraft(String(value));\n syncDraft.current = false;\n }\n }, [value]);\n\n const commitDraft = (raw: string, persistIncomplete: boolean) => {\n const parsed = persistIncomplete\n ? commitAssignNumberDraft(raw)\n : { display: raw, render: assignNumberFromDraft(raw).render };\n setDraft(parsed.display);\n onChange(parsed.render);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">{label}</span>\n <div className=\"eyeon-map-assign__control\">\n {extra}\n <div className=\"eyeon-map-assign__stepper\">\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={`Decrease ${label}`}\n onClick={() => onStep(-1)}\n onMouseDown={() => onHoldStart(-1)}\n onMouseUp={onHoldEnd}\n onMouseLeave={onHoldEnd}\n >\n −\n </button>\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={draft}\n disabled={disabled}\n aria-label={label}\n onFocus={() => {\n focused.current = true;\n }}\n onChange={(e) => commitDraft(e.target.value, false)}\n onBlur={() => {\n focused.current = false;\n commitDraft(draft, true);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n return;\n }\n if (e.key !== 'ArrowUp' && e.key !== 'ArrowDown') return;\n e.preventDefault();\n if (disabled) return;\n syncDraft.current = true;\n onStep(e.key === 'ArrowUp' ? 1 : -1);\n }}\n />\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={`Increase ${label}`}\n onClick={() => onStep(1)}\n onMouseDown={() => onHoldStart(1)}\n onMouseUp={onHoldEnd}\n onMouseLeave={onHoldEnd}\n >\n +\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nexport function ColorSwatch({\n label,\n hex,\n swatch,\n fallback,\n disabled,\n emptyIsTransparent = true,\n onHexChange,\n onCommit,\n onPick,\n}: {\n label: string;\n hex: string;\n swatch: string;\n fallback?: string;\n disabled?: boolean;\n emptyIsTransparent?: boolean;\n onHexChange: (value: string) => void;\n onCommit: () => void;\n onPick: (hex: string) => void;\n}) {\n const lastSolid = useRef(hexColorInputValue(fallback || swatch));\n const transparent =\n isTransparentColor(swatch) ||\n (emptyIsTransparent && !hex.trim());\n\n useEffect(() => {\n const solid = normalizeHexColor(swatch);\n if (solid) lastSolid.current = solid;\n }, [swatch]);\n\n const pickerValue = hexColorInputValue(transparent ? lastSolid.current : swatch);\n\n return (\n <div className=\"eyeon-map-assign__swatch\">\n <span\n className={\n transparent\n ? 'eyeon-map-assign__swatch-well is-transparent'\n : 'eyeon-map-assign__swatch-well'\n }\n style={transparent ? undefined : { backgroundColor: hexColorInputValue(swatch) }}\n >\n <input\n type=\"color\"\n className=\"eyeon-map-assign__swatch-native\"\n disabled={disabled}\n aria-label={label}\n value={pickerValue}\n onChange={(e) => {\n lastSolid.current = e.target.value;\n onPick(e.target.value);\n }}\n />\n </span>\n <input\n type=\"text\"\n spellCheck={false}\n disabled={disabled}\n aria-label={`${label} hex`}\n placeholder=\"Transparent\"\n value={transparent ? '' : hex}\n onChange={(e) => onHexChange(e.target.value)}\n onBlur={onCommit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n }\n }}\n />\n </div>\n );\n}\n\nexport function ColorRow({\n label,\n value,\n fallback,\n disabled,\n onChange,\n onReset,\n}: {\n label: string;\n value: string;\n fallback: string;\n disabled: boolean;\n onChange: (hex: string) => void;\n onReset?: () => void;\n}) {\n const transparent = isTransparentColor(value);\n const display = transparent ? TRANSPARENT_COLOR : value.trim() ? value : fallback;\n const [hex, setHex] = useState(transparent ? '' : display);\n\n useEffect(() => {\n setHex(transparent ? '' : display);\n }, [display, transparent]);\n\n const commit = (next: string) => {\n if (!next.trim() || isTransparentColor(next)) {\n setHex('');\n onChange(TRANSPARENT_COLOR);\n return;\n }\n const normalized = normalizeHexColor(next);\n if (!normalized) {\n setHex(transparent ? '' : display);\n return;\n }\n setHex(normalized);\n onChange(normalized);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">\n {label}\n {onReset ? (\n <FieldResetButton label={label} onClick={onReset} disabled={disabled} />\n ) : null}\n </span>\n <ColorSwatch\n label={label}\n hex={hex}\n swatch={display}\n fallback={fallback}\n disabled={disabled}\n onHexChange={setHex}\n onCommit={() => commit(hex)}\n onPick={commit}\n />\n </div>\n );\n}\n\nconst ALIGN_TOOLTIPS: Record<LabelAlign, string> = {\n left: 'Left',\n center: 'Center',\n right: 'Right',\n};\n\nfunction AlignLeftIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M2 3h12v1.4H2V3zm0 4.3h8v1.4H2V7.3zm0 4.3h12v1.4H2v-1.4z\"\n />\n </svg>\n );\n}\n\nfunction AlignCenterIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M2 3h12v1.4H2V3zm2 4.3h8v1.4H4V7.3zm-2 4.3h12v1.4H2v-1.4z\"\n />\n </svg>\n );\n}\n\nfunction AlignRightIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M2 3h12v1.4H2V3zm4 4.3h8v1.4H6V7.3zm-4 4.3h12v1.4H2v-1.4z\"\n />\n </svg>\n );\n}\n\nconst ALIGN_ICONS: Record<LabelAlign, React.ReactNode> = {\n left: <AlignLeftIcon />,\n center: <AlignCenterIcon />,\n right: <AlignRightIcon />,\n};\n\nexport function AlignRow({\n value,\n disabled,\n onChange,\n}: {\n value?: LabelAlign;\n disabled: boolean;\n onChange: (align: LabelAlign) => void;\n}) {\n const align = normalizeLabelAlign(value);\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">Alignment</span>\n <div className=\"eyeon-map-assign__align\" role=\"group\" aria-label=\"Alignment\">\n {LABEL_ALIGNS.map((option) => (\n <button\n key={option}\n type=\"button\"\n className={option === align ? 'is-active' : undefined}\n disabled={disabled}\n aria-label={ALIGN_TOOLTIPS[option]}\n aria-pressed={option === align}\n data-tooltip={ALIGN_TOOLTIPS[option]}\n onClick={() => onChange(option)}\n >\n {ALIGN_ICONS[option]}\n </button>\n ))}\n </div>\n </div>\n );\n}\n\nexport function RotateIcon() {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n fill=\"currentColor\"\n d=\"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\"\n />\n </svg>\n );\n}\n\nexport function nextQuarterTurn(value: number): number {\n const angle = 45;\n let next = value;\n const remainder = next % angle;\n if (remainder !== 0) next -= remainder;\n next += angle;\n return next >= 360 ? 0 : next;\n}\n\n/** +/- drops the fraction, then steps by whole numbers. Typed decimals stay until then. */\nexport function stepWholeNumber(value: number, delta: number): number {\n if (!Number.isFinite(value)) return delta;\n if (delta > 0) return Math.floor(value) + delta;\n if (Number.isInteger(value)) return value + delta;\n return Math.floor(value);\n}\n","import React, { useEffect, useRef } from 'react';\nimport type { CmShapeAssignment } from '../../core';\nimport { ColorRow, RotateIcon, StepperRow, nextQuarterTurn } from './formRows';\n\ntype StepKey = 'size' | 'rotate' | 'offsetX' | 'offsetY';\n\nexport interface AssignmentStyleFieldsProps {\n form: Pick<\n CmShapeAssignment,\n 'size' | 'rotate' | 'offsetX' | 'offsetY' | 'bgColor' | 'textColor'\n >;\n canEdit: boolean;\n storeDefaultColor: string;\n storeTextColor: string;\n textColorLabel?: string;\n showTextColor?: boolean;\n onPatch: (partial: Partial<CmShapeAssignment>) => void;\n}\n\n/** Size, rotate, offset, and colors — shared by kiosk / store / escalator assign. */\nexport function AssignmentStyleFields({\n form,\n canEdit,\n storeDefaultColor,\n storeTextColor,\n textColorLabel = 'Text Color',\n showTextColor = true,\n onPatch,\n}: AssignmentStyleFieldsProps) {\n const formRef = useRef(form);\n formRef.current = form;\n const intervals = useRef<Partial<Record<StepKey, number>>>({});\n\n useEffect(\n () => () => {\n (Object.values(intervals.current) as number[]).forEach((id) =>\n window.clearInterval(id),\n );\n },\n [],\n );\n\n const bump = (key: StepKey, delta: number) => {\n onPatch({ [key]: (formRef.current[key] ?? 0) + delta });\n };\n\n const startHold = (key: StepKey, delta: number) => {\n stopHold(key);\n intervals.current[key] = window.setInterval(() => bump(key, delta), 200);\n };\n\n const stopHold = (key: StepKey) => {\n const id = intervals.current[key];\n if (id) {\n window.clearInterval(id);\n intervals.current[key] = undefined;\n }\n };\n\n return (\n <>\n <StepperRow\n label=\"Size\"\n value={form.size}\n disabled={!canEdit}\n onChange={(size) => onPatch({ size })}\n onStep={(delta) => bump('size', delta)}\n onHoldStart={(delta) => startHold('size', delta)}\n onHoldEnd={() => stopHold('size')}\n />\n <StepperRow\n label=\"Rotate\"\n value={form.rotate}\n disabled={!canEdit}\n extra={\n <button\n type=\"button\"\n className=\"eyeon-map-assign__rotate\"\n aria-label=\"Rotate 45 degrees\"\n disabled={!canEdit}\n onClick={() => onPatch({ rotate: nextQuarterTurn(form.rotate ?? 0) })}\n >\n <RotateIcon />\n </button>\n }\n onChange={(rotate) => onPatch({ rotate })}\n onStep={(delta) => bump('rotate', delta)}\n onHoldStart={(delta) => startHold('rotate', delta)}\n onHoldEnd={() => stopHold('rotate')}\n />\n <StepperRow\n label=\"Offset X\"\n value={form.offsetX}\n disabled={!canEdit}\n onChange={(offsetX) => onPatch({ offsetX })}\n onStep={(delta) => bump('offsetX', delta)}\n onHoldStart={(delta) => startHold('offsetX', delta)}\n onHoldEnd={() => stopHold('offsetX')}\n />\n <StepperRow\n label=\"Offset Y\"\n value={form.offsetY}\n disabled={!canEdit}\n onChange={(offsetY) => onPatch({ offsetY })}\n onStep={(delta) => bump('offsetY', delta)}\n onHoldStart={(delta) => startHold('offsetY', delta)}\n onHoldEnd={() => stopHold('offsetY')}\n />\n <ColorRow\n label=\"BG Color\"\n value={form.bgColor ?? ''}\n fallback={storeDefaultColor}\n disabled={!canEdit}\n onChange={(bgColor) => onPatch({ bgColor: bgColor || null })}\n onReset={form.bgColor ? () => onPatch({ bgColor: null }) : undefined}\n />\n {showTextColor ? (\n <ColorRow\n label={textColorLabel}\n value={form.textColor ?? ''}\n fallback={storeTextColor}\n disabled={!canEdit}\n onChange={(textColor) => onPatch({ textColor: textColor || null })}\n onReset={form.textColor ? () => onPatch({ textColor: null }) : undefined}\n />\n ) : null}\n </>\n );\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { BatchOp, CmShape, CmShapeAssignment } from '../../core';\nimport {\n assignmentPadFillFallback,\n emptyShapeAssignment,\n parseShapeAssignment,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport { AssignmentStyleFields } from './AssignmentStyleFields';\nimport {\n buildElevatorShaftOps,\n buildEscalatorLinkOps,\n buildUnlinkConnectorOps,\n connectorForShape,\n connectorIdForShape,\n levelsWithLandings,\n memberShapeIds,\n resolvedConnectorKind,\n 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 applyEscalator = (from: CmShape, to: CmShape) => {\n onApplyOps(buildEscalatorLinkOps(ctx, from, to));\n };\n\n const applyElevator = (nextMembers: CmShape[]) => {\n if (nextMembers.length < 2) return;\n onApplyOps(\n buildElevatorShaftOps(ctx, nextMembers, {\n name: connector?.name,\n accessible: connector?.accessible ?? true,\n connectorId: connector?.id,\n }),\n );\n };\n\n const pickExitLanding = (nextId: string) => {\n setTargetId(nextId);\n const to = ctx.shapes.find((s) => s.id === Number(nextId));\n if (!to || !canEdit) return;\n applyEscalator(shape, to);\n };\n\n const pickElevatorStop = (nextId: string) => {\n const next = ctx.shapes.find((s) => s.id === Number(nextId));\n if (!next || !canEdit) return;\n applyElevator([...members, shape, next]);\n setStopFloorId('');\n };\n\n const landingOptions = (\n landings: CmShape[],\n kind: VerticalRailKind,\n ) =>\n landings.map((item) => {\n const linked = connectorIdForShape(item.id, ctx.anchors) != null;\n return {\n value: String(item.id),\n label: item.key,\n hint: linked ? 'Linked' : undefined,\n iconUrl: connectorSpecialIconDataUrl(\n kind,\n linked,\n linked ? storeTextColor : undefined,\n ),\n iconMuted: !linked,\n };\n });\n\n return (\n <div className=\"eyeon-map-inspector\">\n <div className=\"eyeon-map-inspector__heading\">\n {railKind === 'escalator' ? 'Escalator ride' : 'Elevator shaft'}\n </div>\n {railKind === 'escalator' ? (\n <p className=\"eyeon-map-rail__hint\">\n People board this landing and get off at a different place on another\n floor. Travel is one-way.\n </p>\n ) : (\n <p className=\"eyeon-map-rail__hint\">\n One shaft, many floors. Riders can go between any linked landings in\n both directions.\n </p>\n )}\n\n {railKind === 'escalator' && (\n <>\n <label className=\"eyeon-map-rail__field\">\n Floor\n <ModernSelect\n ariaLabel=\"Floor\"\n value={exitFloorId}\n disabled={!canEdit || exitFloors.length === 0}\n placeholder=\"Choose a floor\"\n options={exitFloors.map((level) => ({\n value: String(level.id),\n label: level.name,\n }))}\n onChange={(nextFloor) => {\n setExitFloorId(nextFloor);\n setTargetId(\n partner && String(partner.levelId) === nextFloor\n ? String(partner.id)\n : '',\n );\n }}\n />\n </label>\n <label className=\"eyeon-map-rail__field\">\n Escalator Point\n <ModernSelect\n ariaLabel=\"Escalator Point\"\n value={targetId}\n disabled={!canEdit || !exitFloorId}\n placeholder={\n exitFloorId\n ? 'Choose an escalator on that floor'\n : 'Choose a floor first'\n }\n searchable\n options={landingOptions(landingsOnExitFloor, 'escalator')}\n onChange={pickExitLanding}\n />\n </label>\n {partner ? (\n <p className=\"eyeon-map-rail__hint\">\n Linked: {shape.key} → {partner.key} ({levelName(shape.levelId)} →{' '}\n {levelName(partner.levelId)}, {connector?.direction ?? 'up'})\n </p>\n ) : null}\n {canEdit && connector ? (\n <div className=\"eyeon-map-rail__actions\">\n <button\n type=\"button\"\n onClick={() => onApplyOps(buildUnlinkConnectorOps(ctx, connector.id))}\n >\n Unlink\n </button>\n </div>\n ) : null}\n </>\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 <>\n <div className=\"eyeon-map-rail__heading eyeon-map-rail__heading--section\">\n Design\n </div>\n <div className=\"eyeon-map-assign\">\n <AssignmentStyleFields\n form={styleForm}\n canEdit={canEdit}\n storeDefaultColor={assignmentPadFillFallback(\n 'connector',\n storeDefaultColor,\n )}\n storeTextColor={storeTextColor}\n textColorLabel=\"Icon Color\"\n onPatch={patchStyle}\n />\n </div>\n </>\n ) : null}\n </div>\n );\n}\n","import type { ShapeKind, UnitStatus } from '../core';\n\nexport const SHAPE_KIND_LABELS: Record<ShapeKind, string> = {\n unit: 'Store',\n amenity: 'Amenity',\n kiosk_screen: 'Kiosk',\n connector: 'Connector',\n entrance: 'Entrance',\n walkable: 'Walkway',\n void: 'Open to Below',\n wall: 'Wall',\n boundary: 'Boundary',\n floorplate: 'Floor plate',\n decor: 'Decor',\n label: 'Label',\n zone: 'Zone',\n parking_zone: 'Parking',\n green_area: 'Green area',\n water: 'Water',\n parking_icon: 'Parking icon',\n};\n\n/**\n * Types staff set in Edit Map. Text and entrance markers come from\n * their own tools, not this dropdown.\n */\nexport const EDITOR_TYPE_KINDS: ShapeKind[] = [\n 'unit',\n 'amenity',\n 'kiosk_screen',\n 'connector',\n 'void',\n];\n\nconst TOOL_ONLY_KINDS: ShapeKind[] = ['label', 'wall'];\n\nexport function inspectorShowsType(kind: ShapeKind): boolean {\n return !TOOL_ONLY_KINDS.includes(kind);\n}\n\n/** Type dropdown: curated kinds, and the current kind if it is outside that list. */\nexport function inspectorTypeKinds(current?: ShapeKind | null): ShapeKind[] {\n if (\n current &&\n !EDITOR_TYPE_KINDS.includes(current) &&\n inspectorShowsType(current)\n ) {\n return [...EDITOR_TYPE_KINDS, current];\n }\n return EDITOR_TYPE_KINDS;\n}\n\nexport const UNIT_STATUS_LABELS: Record<UnitStatus, string> = {\n occupied: 'Occupied',\n vacant: 'Vacant',\n coming_soon: 'Coming soon',\n under_renovation: 'Under renovation',\n};\n\nexport function shapeKindLabel(kind: string): string {\n return SHAPE_KIND_LABELS[kind as ShapeKind] ?? kind;\n}\n","import { assignmentHasTarget, type CmShapeAssignment } from '../core';\n\nexport const ASSIGNABLE_SHAPE_KINDS = [\n 'unit',\n 'parking_zone',\n 'amenity',\n 'kiosk_screen',\n] as const;\n\nexport type AssignableShapeKind = (typeof ASSIGNABLE_SHAPE_KINDS)[number];\n\nexport type AssignmentLike = Pick<\n CmShapeAssignment,\n 'shapeId' | 'targetType' | 'retailerId' | 'amenityId' | 'kioskId'\n> & {\n customLabel?: string | null;\n};\n\nexport type AssignableShape = {\n id: number;\n kind: string;\n orphanedAt?: string | null;\n};\n\nexport function isAssignableKind(kind: string): kind is AssignableShapeKind {\n return (ASSIGNABLE_SHAPE_KINDS as readonly string[]).includes(kind);\n}\n\nexport function isStoreShapeKind(kind: string): boolean {\n return kind === 'unit' || kind === 'parking_zone';\n}\n\nexport function isRetailerAssigned(assignment: AssignmentLike | null | undefined): boolean {\n return Boolean(\n assignment && assignment.targetType === 'retailer' && assignment.retailerId != null,\n );\n}\n\nexport function isAmenityAssigned(assignment: AssignmentLike | null | undefined): boolean {\n return Boolean(\n assignment &&\n assignment.targetType === 'amenity' &&\n (assignment.amenityId != null || Boolean(assignment.customLabel?.trim())),\n );\n}\n\nexport function isKioskAssigned(assignment: AssignmentLike | null | undefined): boolean {\n return Boolean(\n assignment &&\n assignment.targetType === 'kiosk' &&\n (assignment.kioskId != null || Boolean(assignment.customLabel?.trim())),\n );\n}\n\nexport function isPolygonAssigned(assignment: AssignmentLike | null | undefined): boolean {\n return assignmentHasTarget(assignment);\n}\n\nexport function assignmentByShapeId(\n assignments: AssignmentLike[],\n): Map<number, AssignmentLike> {\n return new Map(assignments.map((item) => [item.shapeId, item]));\n}\n\n/** Assigned store / amenity / kiosk polygons, plus unassigned of each kind. */\nexport function railAssignmentGroups<T extends AssignableShape>(\n shapes: T[],\n assignments: AssignmentLike[],\n): {\n stores: T[];\n amenities: T[];\n kiosks: T[];\n unassignedStores: T[];\n unassignedAmenities: T[];\n unassignedKiosks: T[];\n unassigned: T[];\n} {\n const byShape = assignmentByShapeId(assignments);\n const stores: T[] = [];\n const amenities: T[] = [];\n const kiosks: T[] = [];\n const unassignedStores: T[] = [];\n const unassignedAmenities: T[] = [];\n const unassignedKiosks: T[] = [];\n const unassigned: T[] = [];\n for (const shape of shapes) {\n if (shape.orphanedAt) continue;\n const assignment = byShape.get(shape.id) ?? null;\n if (isRetailerAssigned(assignment)) stores.push(shape);\n else if (isAmenityAssigned(assignment)) amenities.push(shape);\n else if (isKioskAssigned(assignment)) kiosks.push(shape);\n else if (isAssignableKind(shape.kind) && !isPolygonAssigned(assignment)) {\n unassigned.push(shape);\n if (isStoreShapeKind(shape.kind)) unassignedStores.push(shape);\n else if (shape.kind === 'amenity') unassignedAmenities.push(shape);\n else if (shape.kind === 'kiosk_screen') unassignedKiosks.push(shape);\n }\n }\n return {\n stores,\n amenities,\n kiosks,\n unassignedStores,\n unassignedAmenities,\n unassignedKiosks,\n unassigned,\n };\n}\n","import type { MapAssignKiosk } from '../core';\n\nexport type KioskShapeOption = {\n id: number;\n key: string;\n kind: string;\n orphanedAt?: string | null;\n};\n\nexport type CatalogKioskAssignment = {\n shapeId: number;\n kioskId?: number | null;\n};\n\nexport function isKioskScreenKind(kind: string): boolean {\n return kind === 'kiosk_screen';\n}\n\nexport function kioskScreenShapes<T extends KioskShapeOption>(shapes: T[]): T[] {\n return shapes.filter((shape) => isKioskScreenKind(shape.kind) && !shape.orphanedAt);\n}\n\nexport function catalogKioskShapeOptions(\n shapes: KioskShapeOption[],\n): Array<{ value: string; label: string }> {\n return kioskScreenShapes(shapes).map((shape) => ({\n value: String(shape.id),\n label: shape.key,\n }));\n}\n\nexport function shapeIdForCatalogKiosk(\n kioskId: number,\n assignments: CatalogKioskAssignment[],\n): number | null {\n return assignments.find((row) => row.kioskId === kioskId)?.shapeId ?? null;\n}\n\nexport function leftoverCatalogKiosks<T extends { id: number }>(\n kiosks: T[],\n assignments: CatalogKioskAssignment[],\n): T[] {\n const used = new Set(\n assignments\n .map((row) => row.kioskId)\n .filter((id): id is number => id != null),\n );\n return kiosks.filter((kiosk) => !used.has(kiosk.id));\n}\n\nexport function catalogKioskRowLabel(\n kiosk: MapAssignKiosk,\n assignedKey: string | null,\n): { title: string; id: string; tags: string[] } {\n return {\n title: kiosk.name.trim() || `Kiosk ${kiosk.id}`,\n id: `kiosk-${kiosk.id}`,\n tags: assignedKey ? [assignedKey] : ['Unlinked'],\n };\n}\n","import { compareBuildingFloors } from '../core';\n\n/** Title + tags for Map options shape lists (Stores, Amenities, …). */\nexport function railRowLabels(input: {\n key: string;\n kindLabel: string;\n levelName: string;\n assignedName?: string | null;\n /** Kind tag is only for the Unassigned module (mixed types). */\n showKindTag?: boolean;\n}): { title: string | null; id: string; tags: string[] } {\n const name = input.assignedName?.trim() || null;\n const tags = [input.levelName];\n if (input.showKindTag) tags.push(input.kindLabel);\n return { title: name, id: input.key, tags };\n}\n\nexport const RAIL_ITEM_SECTIONS = [\n 'stores',\n 'amenities',\n 'kiosks',\n 'unassigned',\n 'escalators',\n 'elevators',\n] as const;\n\nexport type RailItemSection = (typeof RAIL_ITEM_SECTIONS)[number];\n\nexport function isRailItemSection(\n section: string | null,\n): section is RailItemSection {\n return (\n section != null &&\n (RAIL_ITEM_SECTIONS as readonly string[]).includes(section)\n );\n}\n\n/** Third sidebar screen: field options for the selected list item. */\nexport function railShowsItemOptions(\n section: string | null,\n selectedCount: number,\n): boolean {\n return isRailItemSection(section) && selectedCount > 0;\n}\n\ntype RailLevel = {\n id: number;\n kind: string;\n ordering: number;\n levelIndex: number;\n};\n\n/** Outdoor first, then the lowest building floor, then each floor above it. */\nexport function railListLevelOrder<T extends RailLevel>(levels: T[]): T[] {\n const outdoor = levels.filter((level) => level.kind === 'outdoor');\n const floorsLowToHigh = levels\n .filter((level) => level.kind === 'floor')\n .slice()\n .sort(compareBuildingFloors)\n .reverse();\n return [...outdoor, ...floorsLowToHigh];\n}\n\nexport function sortShapesByRailLevel<T extends { levelId: number }>(\n shapes: T[],\n levels: RailLevel[],\n): T[] {\n const indexById = new Map(\n railListLevelOrder(levels).map((level, index) => [level.id, index]),\n );\n return shapes.slice().sort((a, b) => {\n const ai = indexById.get(a.levelId) ?? Number.POSITIVE_INFINITY;\n const bi = indexById.get(b.levelId) ?? Number.POSITIVE_INFINITY;\n return ai - bi;\n });\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { compareBuildingFloors, type CmBuilding, type CmLevel } from '../../core';\n\nexport type CreateLevelInput = {\n name: string;\n kind: 'outdoor' | 'floor';\n buildingId?: number | null;\n file?: File;\n onProgress?: (percent: number) => void;\n};\n\nexport type UpdateLevelInput = {\n levelId: number;\n name?: string;\n file?: File;\n onProgress?: (percent: number) => void;\n};\n\nexport type FloorsScreen =\n | { mode: 'list' }\n | { mode: 'add-base' }\n | { mode: 'add-floor' }\n | { mode: 'edit'; levelId: number };\n\nexport function floorsScreenTitle(\n screen: FloorsScreen,\n levels: Array<{ id: number; kind: string }>,\n): string {\n if (screen.mode === 'add-base') return 'Add Outdoor SVG';\n if (screen.mode === 'add-floor') return 'Add Floor';\n if (screen.mode === 'edit') {\n const level = levels.find((l) => l.id === screen.levelId);\n return level?.kind === 'outdoor' ? 'Edit Outdoor' : 'Edit Floor';\n }\n return 'Floors';\n}\n\n/** Building floors only — Outdoor is a separate item and is not counted. */\nexport function visibleFloorCount(levels: Array<{ kind: string }>): number {\n return levels.filter((l) => l.kind === 'floor').length;\n}\n\n/** Insert `movedId` before or after `targetId`. Used by live floor reorder. */\nexport function placeLevelId(\n ids: number[],\n movedId: number,\n targetId: number,\n place: 'before' | 'after',\n): number[] {\n if (movedId === targetId) return ids;\n const from = ids.indexOf(movedId);\n if (from < 0) return ids;\n const without = ids.filter((id) => id !== movedId);\n const target = without.indexOf(targetId);\n if (target < 0) return ids;\n const next = [...without];\n next.splice(place === 'after' ? target + 1 : target, 0, movedId);\n return next;\n}\n\n/** Move `movedId` to `toIndex` in the list with that id removed. */\nexport function moveLevelId(ids: number[], movedId: number, toIndex: number): number[] {\n const from = ids.indexOf(movedId);\n if (from < 0) return ids;\n const without = ids.filter((id) => id !== movedId);\n const clamped = Math.max(0, Math.min(toIndex, without.length));\n const next = [...without];\n next.splice(clamped, 0, movedId);\n return next;\n}\n\n/** Slot index from pointer Y. Uses the list box, not live row midpoints. */\nexport function insertIndexFromY(\n clientY: number,\n listTop: number,\n rowHeight: number,\n count: number,\n): number {\n if (count <= 1 || rowHeight <= 0) return 0;\n const index = Math.round((clientY - listTop - rowHeight / 2) / rowHeight);\n return Math.max(0, Math.min(count - 1, index));\n}\n\n/** Overlay Y for the drop line. Null when the item would stay put. */\nexport function dropLineTop(\n fromIndex: number,\n dropIndex: number,\n rowHeight: number,\n rowInnerHeight: number,\n): number | null {\n if (fromIndex < 0 || dropIndex === fromIndex || rowHeight <= 0) return null;\n if (dropIndex < fromIndex) return dropIndex * rowHeight;\n return dropIndex * rowHeight + rowInnerHeight;\n}\n\nfunction sameIdOrder(a: number[], b: number[]): boolean {\n return a.length === b.length && a.every((id, i) => id === b[i]);\n}\n\ntype FloorDrag = {\n id: number;\n pointerId: number;\n offsetX: number;\n offsetY: number;\n width: number;\n height: number;\n name: string;\n x: number;\n y: number;\n listTop: number;\n listLeft: number;\n listBottom: number;\n rowHeight: number;\n originIds: number[];\n dropIndex: number;\n};\n\nexport interface FloorsPanelProps {\n levels: CmLevel[];\n buildings: CmBuilding[];\n /** Shapes already imported per level — drives delete and re-import copy. */\n levelShapeCounts?: Record<number, number>;\n canFloors: boolean;\n screen: FloorsScreen;\n onScreenChange: (screen: FloorsScreen) => void;\n onCreateLevel?: (input: CreateLevelInput) => Promise<number | void>;\n onUpdateLevel?: (input: UpdateLevelInput) => Promise<void>;\n onDeleteLevel?: (levelId: number) => Promise<void>;\n onReorderLevels?: (orderedIds: number[]) => Promise<void>;\n}\n\nfunction formatBytes(size: number): string {\n if (size < 1024) return `${size} B`;\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`;\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction svgFileName(key: string | null | undefined): string | null {\n if (!key) return null;\n const part = key.split('/').pop()?.trim();\n return part || null;\n}\n\nfunction isSvgFile(next: File): boolean {\n return next.name.toLowerCase().endsWith('.svg') || next.type === 'image/svg+xml';\n}\n\nfunction GripIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" aria-hidden=\"true\">\n <path\n d=\"M3 5h12M3 9h12M3 13h12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\n/** Same glyph as admin-portal Deals/Retailers (`Trash2` from react-feather). */\nfunction TrashIcon() {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"3 6 5 6 21 6\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" />\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" />\n </svg>\n );\n}\n\nexport function deleteConfirmCopy(\n level: { kind: string; name: string },\n shapeCount = 0,\n) {\n const isOutdoor = level.kind === 'outdoor';\n const shapes =\n shapeCount === 1 ? '1 shape' : `${shapeCount} shapes`;\n return {\n title: isOutdoor ? 'Delete Outdoor SVG?' : `Delete “${level.name}”?`,\n body: isOutdoor\n ? `The stored outdoor SVG, its ${shapes} and every assignment on them are removed. Building floors are not affected.`\n : `This floor and its ${shapes} are removed, along with the retailer, amenity and kiosk assignments on them.`,\n action: isOutdoor ? 'Delete Outdoor' : 'Delete floor',\n };\n}\n\nexport function FloorsPanel({\n levels,\n buildings,\n levelShapeCounts,\n canFloors,\n screen,\n onScreenChange,\n onCreateLevel,\n onUpdateLevel,\n onDeleteLevel,\n onReorderLevels,\n}: FloorsPanelProps) {\n const [name, setName] = useState('');\n const [file, setFile] = useState<File | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [progress, setProgress] = useState<number | null>(null);\n const [dragOver, setDragOver] = useState(false);\n const [confirmDeleteId, setConfirmDeleteId] = useState<number | null>(null);\n const [deleting, setDeleting] = useState(false);\n const [drag, setDrag] = useState<FloorDrag | null>(null);\n const [dropIndex, setDropIndex] = useState<number | null>(null);\n const [previewIds, setPreviewIds] = useState<number[] | null>(null);\n const [previewFailed, setPreviewFailed] = useState(false);\n const [localPreviewUrl, setLocalPreviewUrl] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const floorListRef = useRef<HTMLDivElement>(null);\n const ghostRef = useRef<HTMLDivElement>(null);\n const previewIdsRef = useRef<number[] | null>(null);\n const dragRef = useRef<FloorDrag | null>(null);\n\n const outdoor = useMemo(\n () => levels.find((l) => l.kind === 'outdoor') ?? null,\n [levels],\n );\n const outdoorReady = Boolean(outdoor?.sourceSvgKey || outdoor?.sourceSvgUrl);\n const shapeCount = (levelId: number) => levelShapeCounts?.[levelId] ?? 0;\n const buildingFloors = useMemo(\n () =>\n levels\n .filter((l) => l.kind === 'floor')\n .slice()\n .sort(compareBuildingFloors),\n [levels],\n );\n const committedIds = useMemo(\n () => buildingFloors.map((level) => level.id),\n [buildingFloors],\n );\n const displayFloors = useMemo(() => {\n // Keep committed order on screen while dragging so sibling rows stay put.\n const ids = drag != null ? committedIds : (previewIds ?? committedIds);\n const byId = new Map(buildingFloors.map((level) => [level.id, level]));\n return ids\n .map((id) => byId.get(id))\n .filter((level): level is CmLevel => level != null);\n }, [buildingFloors, committedIds, drag, previewIds]);\n const editing =\n screen.mode === 'edit'\n ? levels.find((l) => l.id === screen.levelId) ?? null\n : null;\n const isOutdoorForm =\n screen.mode === 'add-base' || editing?.kind === 'outdoor';\n const canManage = canFloors && !!onCreateLevel && !!onUpdateLevel;\n const canReorder = canManage && !!onReorderLevels && buildingFloors.length > 1;\n\n useEffect(() => {\n if (screen.mode === 'add-base' || editing?.kind === 'outdoor') {\n setName('Outdoor');\n setFile(null);\n } else if (screen.mode === 'add-floor') {\n setName('');\n setFile(null);\n } else if (screen.mode === 'edit' && editing) {\n setName(editing.name);\n setFile(null);\n }\n setError(null);\n setConfirmDeleteId(null);\n setDeleting(false);\n setProgress(null);\n setPreviewFailed(false);\n }, [screen, editing?.id, editing?.kind, editing?.name]);\n\n useEffect(() => {\n if (confirmDeleteId == null) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && !deleting) setConfirmDeleteId(null);\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [confirmDeleteId, deleting]);\n\n useEffect(() => {\n if (!file) {\n setLocalPreviewUrl(null);\n return;\n }\n const url = URL.createObjectURL(file);\n setLocalPreviewUrl(url);\n setPreviewFailed(false);\n return () => URL.revokeObjectURL(url);\n }, [file]);\n\n previewIdsRef.current = previewIds;\n dragRef.current = drag;\n\n useEffect(() => {\n if (drag != null || previewIds == null) return;\n if (sameIdOrder(committedIds, previewIds)) setPreviewIds(null);\n }, [committedIds, drag, previewIds]);\n\n const takeSvgFile = (next: File | null | undefined) => {\n if (!next) return;\n if (!isSvgFile(next)) {\n setError('Choose an SVG file.');\n return;\n }\n setError(null);\n setFile(next);\n };\n\n const openEdit = (level: CmLevel) => {\n onScreenChange({ mode: 'edit', levelId: level.id });\n };\n\n const submit = async (picked?: File | null) => {\n const svgFile = picked ?? file;\n if (isOutdoorForm) {\n if (!svgFile && (screen.mode === 'add-base' || !editing?.sourceSvgKey)) {\n setError('Choose an SVG file.');\n return;\n }\n } else if (!name.trim()) {\n setError('Enter a title.');\n return;\n }\n if (screen.mode === 'add-floor' && !svgFile) {\n setError('Choose an SVG file.');\n return;\n }\n setBusy(true);\n setError(null);\n if (svgFile) setProgress(0);\n try {\n if (screen.mode === 'add-base') {\n await onCreateLevel?.({\n name: 'Outdoor',\n kind: 'outdoor',\n file: svgFile ?? undefined,\n onProgress: setProgress,\n });\n } else if (screen.mode === 'add-floor') {\n await onCreateLevel?.({\n name: name.trim(),\n kind: 'floor',\n buildingId: buildings[0]?.id ?? null,\n file: svgFile ?? undefined,\n onProgress: setProgress,\n });\n } else if (screen.mode === 'edit' && editing) {\n await onUpdateLevel?.({\n levelId: editing.id,\n name: editing.kind === 'outdoor' ? 'Outdoor' : name.trim(),\n file: svgFile ?? undefined,\n onProgress: setProgress,\n });\n }\n setProgress(100);\n onScreenChange({ mode: 'list' });\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not save floor.');\n setProgress(null);\n } finally {\n setBusy(false);\n }\n };\n\n const remove = async (level: CmLevel) => {\n if (!onDeleteLevel || deleting) return;\n setDeleting(true);\n setError(null);\n try {\n await onDeleteLevel(level.id);\n setConfirmDeleteId(null);\n onScreenChange({ mode: 'list' });\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not delete floor.');\n } finally {\n setDeleting(false);\n }\n };\n\n const renderDeleteModal = () => {\n const level = levels.find((l) => l.id === confirmDeleteId);\n if (!level) return null;\n const copy = deleteConfirmCopy(level, shapeCount(level.id));\n return (\n <div className=\"eyeon-map-modal\" role=\"presentation\">\n <div\n className=\"eyeon-map-modal__backdrop\"\n onClick={() => (deleting ? undefined : setConfirmDeleteId(null))}\n />\n <div\n className=\"eyeon-map-modal__card\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"eyeon-map-delete-title\"\n aria-describedby=\"eyeon-map-delete-body\"\n >\n <h3 className=\"eyeon-map-modal__title\" id=\"eyeon-map-delete-title\">\n {copy.title}\n </h3>\n <p className=\"eyeon-map-modal__body\" id=\"eyeon-map-delete-body\">\n {copy.body} This cannot be undone.\n </p>\n {error ? <div className=\"eyeon-map-floors__error\">{error}</div> : null}\n <div className=\"eyeon-map-modal__actions\">\n <button\n type=\"button\"\n className=\"eyeon-map-modal__cancel\"\n disabled={deleting}\n onClick={() => setConfirmDeleteId(null)}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"eyeon-map-floors__danger\"\n disabled={deleting}\n autoFocus\n onClick={() => void remove(level)}\n >\n {deleting ? (\n <>\n <span className=\"eyeon-map-floors__spinner\" aria-hidden=\"true\" />\n Deleting…\n </>\n ) : (\n copy.action\n )}\n </button>\n </div>\n </div>\n </div>\n );\n };\n\n const renderRowDelete = (level: CmLevel) => {\n if (!canManage || !onDeleteLevel) return null;\n return (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__icon-danger\"\n title={`Delete ${level.kind === 'outdoor' ? 'Outdoor SVG' : level.name}`}\n aria-label={`Delete ${level.kind === 'outdoor' ? 'Outdoor SVG' : level.name}`}\n disabled={busy || deleting}\n onClick={(e) => {\n e.stopPropagation();\n setConfirmDeleteId(level.id);\n }}\n >\n <TrashIcon />\n </button>\n );\n };\n\n const applyGhost = (x: number, y: number) => {\n const ghost = ghostRef.current;\n if (!ghost) return;\n ghost.style.left = `${x}px`;\n ghost.style.top = `${y}px`;\n };\n\n const previewMoveToY = (clientY: number) => {\n const current = dragRef.current;\n if (!current) return;\n const index = insertIndexFromY(\n clientY,\n current.listTop,\n current.rowHeight,\n current.originIds.length,\n );\n if (current.dropIndex !== index) {\n current.dropIndex = index;\n setDropIndex(index);\n }\n const next = moveLevelId(current.originIds, current.id, index);\n const ids = previewIdsRef.current ?? current.originIds;\n if (!sameIdOrder(ids, next)) setPreviewIds(next);\n };\n\n const persistPreview = async () => {\n const nextIds = previewIdsRef.current;\n if (!onReorderLevels || nextIds == null) return;\n if (sameIdOrder(nextIds, committedIds)) {\n setPreviewIds(null);\n return;\n }\n try {\n await onReorderLevels(nextIds);\n } catch (e) {\n setPreviewIds(null);\n setError(e instanceof Error ? e.message : 'Could not reorder floors.');\n }\n };\n\n const endDrag = () => {\n if (!dragRef.current) return;\n dragRef.current = null;\n setDrag(null);\n setDropIndex(null);\n void persistPreview();\n };\n\n useEffect(() => {\n if (!drag) return;\n const onMove = (e: PointerEvent) => {\n const current = dragRef.current;\n if (!current || e.pointerId !== current.pointerId) return;\n const x = current.listLeft;\n const maxY = current.listBottom - current.height;\n const y = Math.max(current.listTop, Math.min(maxY, e.clientY - current.offsetY));\n current.x = x;\n current.y = y;\n applyGhost(x, y);\n previewMoveToY(e.clientY);\n };\n const onUp = (e: PointerEvent) => {\n const current = dragRef.current;\n if (!current || e.pointerId !== current.pointerId) return;\n endDrag();\n };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onUp);\n return () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n };\n }, [Boolean(drag)]);\n\n const startDrag = (level: CmLevel, e: React.PointerEvent<HTMLButtonElement>) => {\n const row = e.currentTarget.closest('.eyeon-map-floors__row');\n const list = floorListRef.current;\n if (!(row instanceof HTMLElement) || !list) return;\n const rect = row.getBoundingClientRect();\n const listRect = list.getBoundingClientRect();\n const rowHeight = rect.height + 2;\n e.preventDefault();\n e.stopPropagation();\n const next: FloorDrag = {\n id: level.id,\n pointerId: e.pointerId,\n offsetX: e.clientX - rect.left,\n offsetY: e.clientY - rect.top,\n width: rect.width,\n height: rect.height,\n name: level.name,\n x: listRect.left,\n y: rect.top,\n listTop: listRect.top,\n listLeft: listRect.left,\n listBottom: listRect.bottom,\n rowHeight,\n originIds: committedIds,\n dropIndex: committedIds.indexOf(level.id),\n };\n dragRef.current = next;\n setDrag(next);\n setDropIndex(committedIds.indexOf(level.id));\n setPreviewIds(committedIds);\n };\n\n const lineTop =\n drag && dropIndex != null\n ? dropLineTop(\n drag.originIds.indexOf(drag.id),\n dropIndex,\n drag.rowHeight,\n drag.height,\n )\n : null;\n\n if (screen.mode !== 'list') {\n const hasExistingSvg = Boolean(editing?.sourceSvgKey || editing?.sourceSvgUrl);\n const showEditPreview = screen.mode === 'edit' && hasExistingSvg;\n const previewUrl = localPreviewUrl ?? (showEditPreview ? editing?.sourceSvgUrl ?? null : null);\n const previewFallback =\n file?.name ?? svgFileName(editing?.sourceSvgKey) ?? 'SVG on file';\n const importedCount = editing ? shapeCount(editing.id) : 0;\n const showReimportNotice =\n !isOutdoorForm && screen.mode === 'edit' && importedCount > 0;\n const primaryLabel = isOutdoorForm ? 'Upload' : 'Import';\n const primaryBusyLabel = isOutdoorForm ? 'Uploading' : 'Importing';\n\n return (\n <div className=\"eyeon-map-floors\">\n {!isOutdoorForm && (\n <label className=\"eyeon-map-rail__field\">\n Title\n <input\n value={name}\n disabled={busy || !canManage}\n onChange={(e) => setName(e.target.value)}\n />\n </label>\n )}\n {showEditPreview ? (\n <div className=\"eyeon-map-rail__field eyeon-map-floors__svg-field\">\n SVG\n <div className=\"eyeon-map-floors__preview-card\">\n {previewUrl && !previewFailed ? (\n <img\n className=\"eyeon-map-floors__preview-img\"\n src={previewUrl}\n alt={file?.name ?? editing?.name ?? 'SVG preview'}\n onError={() => setPreviewFailed(true)}\n />\n ) : (\n <div className=\"eyeon-map-floors__preview-fallback\">{previewFallback}</div>\n )}\n </div>\n {file ? (\n <span className=\"eyeon-map-floors__drop-meta\">\n {file.name}\n {isOutdoorForm\n ? ` · ${formatBytes(file.size)} · Ready to upload`\n : ` · ${formatBytes(file.size)}`}\n </span>\n ) : null}\n {!isOutdoorForm ? (\n <p className=\"eyeon-map-rail__hint\">\n Floor SVGs are read for geometry only — no copy of the file is kept.\n </p>\n ) : (\n <p className=\"eyeon-map-rail__hint\">\n The outdoor SVG is stored and drawn live, so decoration stays\n designer-owned. Only its interactive polygons are imported.\n </p>\n )}\n <input\n ref={fileInputRef}\n hidden\n type=\"file\"\n accept=\".svg,image/svg+xml\"\n disabled={busy || deleting || !canManage}\n onChange={(e) => {\n takeSvgFile(e.target.files?.[0] ?? null);\n e.target.value = '';\n }}\n />\n <button\n type=\"button\"\n className=\"eyeon-map-floors__change\"\n disabled={busy || deleting || !canManage}\n onClick={() => fileInputRef.current?.click()}\n >\n {isOutdoorForm ? 'Replace SVG' : 'Re-import SVG'}\n </button>\n </div>\n ) : (\n <div className=\"eyeon-map-rail__field\">\n {isOutdoorForm ? 'SVG file' : 'Floor SVG to import'}\n <label\n className={[\n 'eyeon-map-floors__drop',\n dragOver ? 'is-over' : '',\n file ? 'has-file' : '',\n busy ? 'is-busy' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onDragOver={(e) => {\n e.preventDefault();\n if (!busy) setDragOver(true);\n }}\n onDragLeave={() => setDragOver(false)}\n onDrop={(e) => {\n e.preventDefault();\n setDragOver(false);\n if (busy || !canManage) return;\n takeSvgFile(e.dataTransfer.files?.[0]);\n }}\n >\n <input\n type=\"file\"\n accept=\".svg,image/svg+xml\"\n disabled={busy || deleting || !canManage}\n onChange={(e) => {\n takeSvgFile(e.target.files?.[0] ?? null);\n e.target.value = '';\n }}\n />\n <span className=\"eyeon-map-floors__drop-title\">\n {file ? file.name : 'Choose SVG or drop it here'}\n </span>\n <span className=\"eyeon-map-floors__drop-meta\">\n {file\n ? isOutdoorForm\n ? `${formatBytes(file.size)} · Ready to upload`\n : `${formatBytes(file.size)} · Ready to import`\n : 'SVG only'}\n </span>\n </label>\n {!isOutdoorForm && !showReimportNotice ? (\n <p className=\"eyeon-map-rail__hint\">\n The file is read for geometry only. Shapes, the INTERACTIVE group\n and line segments in the <code>routes</code> group go into the\n database; the SVG itself is not stored.\n </p>\n ) : null}\n </div>\n )}\n {showReimportNotice ? (\n <div className=\"eyeon-map-floors__notice\">\n <p className=\"eyeon-map-floors__notice-title\">\n Re-importing replaces the {importedCount} shape\n {importedCount === 1 ? '' : 's'} on this floor\n </p>\n <ul className=\"eyeon-map-floors__notice-list\">\n <li>\n Layers that keep the same Illustrator ID are redrawn from the new file\n and keep their retailer, amenity and kiosk assignments.\n </li>\n <li>\n Shapes you reshaped in Edit Map keep your geometry — the new file is\n ignored for those.\n </li>\n <li>\n IDs missing from the new file are hidden rather than deleted, so you can\n move their assignments onto a renamed layer.\n </li>\n <li>\n New IDs come in unassigned, and line segments in the{' '}\n <code>routes</code> group replace this floor&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 clampRouteThickness,\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 | 'map-responsiveness';\n\n/** @deprecated Use RailSection */\nexport type RailTab = RailSection;\n\nexport interface LeftRailDraft {\n buildings: CmBuilding[];\n levels: CmLevel[];\n shapes: Array<{\n id: number;\n levelId: number;\n key: string;\n kind: string;\n sourceSvgId?: string | null;\n orphanedAt?: string | null;\n }>;\n anchors: Array<Pick<CmAnchor, 'id' | 'levelId' | 'shapeId' | 'connectorId'>>;\n edges: Array<\n Pick<CmRouteEdge, 'id' | 'kind' | 'directed' | 'fromAnchorId' | 'toAnchorId'>\n >;\n connectors: CmConnector[];\n amenities: CmAmenityCatalogItem[];\n assignments: CmShapeAssignment[];\n}\n\nexport interface LeftRailProps {\n section: RailSection | null;\n onSectionChange: (section: RailSection | null) => void;\n draft: LeftRailDraft;\n activeLevelId: number | null;\n selectedShapeId: number | null;\n selectedShapeIds?: number[];\n onSelectShape: (id: number | null, opts?: { additive?: boolean }) => void;\n onHoverShape?: (id: number | null) => void;\n onListFocus?: () => void;\n retailers?: MapAssignRetailer[];\n kiosks?: MapAssignKiosk[];\n canFloors: boolean;\n canSettings: boolean;\n canResponsiveness?: boolean;\n onImportSvg?: (levelId: number, file: File) => Promise<void>;\n onCreateLevel?: (input: CreateLevelInput) => Promise<number | void>;\n onUpdateLevel?: (input: UpdateLevelInput) => Promise<void>;\n onDeleteLevel?: (levelId: number) => Promise<void>;\n onReorderLevels?: (orderedIds: number[]) => Promise<void>;\n onAutoroute?: (levelId: number) => Promise<void>;\n theme: ThemeDefaults;\n onThemeChange: (partial: Partial<ThemeDefaults>) => void;\n assignPanel: ReactNode;\n /** Saved display_kiosks: pick a kiosk shape or delete. */\n catalogKioskPanel?: ReactNode;\n selectedCatalogKioskId?: number | null;\n onSelectCatalogKiosk?: (id: number | null) => void;\n /** Draw/tools UI for Edit Map (icons + inspector). */\n editMapPanel?: ReactNode;\n /** Route tools and path stats for Wayfinding. */\n wayfindingPanel?: ReactNode;\n mapResponsivenessPanel?: ReactNode;\n footer?: ReactNode;\n /** PORTAL: switch this center back to Classic (v1) map. */\n onUseClassicMap?: () => void;\n}\n\nfunction BackIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M10.2 2.6 4.8 8l5.4 5.4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ChevronIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M5.8 2.6 11.2 8l-5.4 5.4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nconst NAV_ICON_PROPS = {\n width: 18,\n height: 18,\n viewBox: '0 0 18 18',\n fill: 'none',\n 'aria-hidden': true,\n} as const;\n\nfunction FloorsNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M3 12.5 9 15.5 15 12.5M3 9.2 9 12.2 15 9.2M9 2.5 3 5.5 9 8.5 15 5.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction StoresNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M3.5 7.2 4.4 14h9.2l.9-6.8H3.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3 7.2 4.6 4h8.8L15 7.2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M7 14V9.6h4V14\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\nfunction AmenitiesNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M9 15.2s5.2-3.6 5.2-7.1A5.2 5.2 0 0 0 9 2.8a5.2 5.2 0 0 0-5.2 5.3c0 3.5 5.2 7.1 5.2 7.1Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"9\" cy=\"8\" r=\"1.6\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction KiosksNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect\n x=\"2.5\"\n y=\"3\"\n width=\"13\"\n height=\"8.5\"\n rx=\"1.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path d=\"M7 15h4M9 11.5V15\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction EscalatorsNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M3 15h4V11h4V7h4V3h3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ElevatorsNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect x=\"4\" y=\"2.8\" width=\"10\" height=\"12.4\" rx=\"1.4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M9 5.4 7.2 7.6h3.6Zm0 7.2 1.8-2.2H7.2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction SettingsNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS} viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <path\n d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction UnassignedNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect\n x=\"3\"\n y=\"3\"\n width=\"12\"\n height=\"12\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeDasharray=\"2.4 2\"\n />\n </svg>\n );\n}\n\nfunction EditMapNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect\n x=\"3\"\n y=\"3.5\"\n width=\"12\"\n height=\"11\"\n rx=\"1.6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M6 11.2 11.4 5.8l1.8 1.8L7.8 13H6z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction WayfindingNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M3.4 13.4c2.4-3.6 3.5-3.8 5-3.8 1.8 0 2.5 2 5.2 2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"3.4\" cy=\"13.4\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"8.4\" cy=\"9.6\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"13.6\" cy=\"11.6\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction MapResponsivenessNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect x=\"2.5\" y=\"4\" width=\"13\" height=\"9\" rx=\"1.4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M6 13.8h6M9 13.8v1.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M5.2 10.2 8.4 7l2 2 2.6-2.8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\ntype RailNavCountKey =\n | 'floors'\n | 'stores'\n | 'amenities'\n | 'kiosks'\n | 'escalators'\n | 'elevators'\n | 'unassigned';\n\ntype RailNavItem = {\n id: RailSection;\n title: string;\n description: string;\n icon: () => React.ReactElement;\n countKey?: RailNavCountKey;\n};\n\ntype RailNavEntry = RailNavItem | { separator: true };\n\nconst RAIL_NAV: RailNavEntry[] = [\n {\n id: 'floors',\n title: 'Floors',\n description: 'Building floors and Outdoor SVG',\n icon: FloorsNavIcon,\n countKey: 'floors',\n },\n {\n id: 'stores',\n title: 'Stores',\n description: 'Retailers linked to the map',\n icon: StoresNavIcon,\n countKey: 'stores',\n },\n {\n id: 'amenities',\n title: 'Amenities',\n description: 'Amenities linked to the map',\n icon: AmenitiesNavIcon,\n countKey: 'amenities',\n },\n {\n id: 'kiosks',\n title: 'Kiosks',\n description: 'Link kiosk screens to devices',\n icon: KiosksNavIcon,\n countKey: 'kiosks',\n },\n {\n id: 'escalators',\n title: 'Escalators',\n description: 'One-way rides between floors',\n icon: EscalatorsNavIcon,\n countKey: 'escalators',\n },\n {\n id: 'elevators',\n title: 'Elevators',\n description: 'Two-way shafts across floors',\n icon: ElevatorsNavIcon,\n countKey: 'elevators',\n },\n {\n id: 'unassigned',\n title: 'Unassigned',\n description: 'Polygons with no store, amenity, or kiosk',\n icon: UnassignedNavIcon,\n countKey: 'unassigned',\n },\n { separator: true },\n {\n id: 'edit-map',\n title: 'Edit Map',\n description: 'Draw and reshape stores, text, and lines',\n icon: EditMapNavIcon,\n },\n {\n id: 'wayfinding',\n title: 'Wayfinding',\n description: 'Walking paths and route anchors',\n icon: WayfindingNavIcon,\n },\n {\n id: 'map-responsiveness',\n title: 'Map Responsiveness',\n description: 'Starting zoom and position per floor and device',\n icon: MapResponsivenessNavIcon,\n },\n { separator: true },\n {\n id: 'style',\n title: 'Settings',\n description: 'Colors and map look',\n icon: SettingsNavIcon,\n },\n];\n\nconst HIDDEN_SECTION_TITLES: Partial<Record<RailSection, string>> = {\n paths: 'Walking paths',\n selection: 'Selected',\n};\n\nfunction isRailNavSeparator(entry: RailNavEntry): entry is { separator: true } {\n return 'separator' in entry;\n}\n\nfunction railSectionTitle(section: RailSection): string {\n const item = RAIL_NAV.find(\n (entry): entry is RailNavItem => !isRailNavSeparator(entry) && entry.id === section,\n );\n return item?.title ?? HIDDEN_SECTION_TITLES[section] ?? section;\n}\n\nconst HOUSE_OUTDOOR_THEME = staticLayerThemeDefaults();\n\nconst OUTDOOR_COLOR_FIELDS: Array<[StaticLayerThemeKey, string]> = [\n ['GREEN_AREA_COLOR', 'Green Areas'],\n ['WATER_COLOR', 'Water'],\n ['WALKABLE_COLOR', 'Walking Paths'],\n ['PARKING_LANE_COLOR', 'Parking Lanes'],\n ['PARKING_ICON_COLOR', 'Parking Icons'],\n];\n\nfunction SettingsField({\n label,\n onReset,\n children,\n}: {\n label: string;\n onReset?: () => void;\n children: ReactNode;\n}) {\n return (\n <div className=\"eyeon-map-rail__field eyeon-map-rail__field--inline\">\n <span className=\"eyeon-map-rail__field-label\">\n {label}\n {onReset ? <FieldResetButton label={label} onClick={onReset} /> : null}\n </span>\n {children}\n </div>\n );\n}\n\nfunction ColorField({\n label,\n value,\n fallback,\n onChange,\n onReset,\n}: {\n label: string;\n value: string;\n fallback?: string;\n onChange: (hex: string) => void;\n onReset?: () => void;\n}) {\n const transparent = isTransparentColor(value) || !value.trim();\n const [hex, setHex] = useState(transparent ? '' : value);\n\n useEffect(() => {\n setHex(transparent ? '' : value);\n }, [transparent, value]);\n\n const commit = (next: string) => {\n if (!next.trim() || isTransparentColor(next)) {\n setHex('');\n if (!transparent) onChange(TRANSPARENT_COLOR);\n return;\n }\n const normalized = normalizeHexColor(next);\n if (!normalized) {\n setHex(transparent ? '' : value);\n return;\n }\n setHex(normalized);\n if (normalized !== value.toLowerCase() && normalized !== value) onChange(normalized);\n };\n\n return (\n <SettingsField label={label} onReset={onReset}>\n <ColorSwatch\n label={label}\n hex={hex}\n swatch={transparent ? TRANSPARENT_COLOR : value}\n fallback={fallback}\n onHexChange={setHex}\n onCommit={() => commit(hex)}\n onPick={commit}\n />\n </SettingsField>\n );\n}\n\nexport function LeftRail({\n section,\n onSectionChange,\n draft,\n activeLevelId,\n selectedShapeId,\n selectedShapeIds,\n onSelectShape,\n onHoverShape,\n onListFocus,\n retailers = [],\n kiosks = [],\n canFloors,\n canSettings,\n canResponsiveness = false,\n onCreateLevel,\n onUpdateLevel,\n onDeleteLevel,\n onReorderLevels,\n onAutoroute,\n theme,\n onThemeChange,\n assignPanel,\n catalogKioskPanel,\n selectedCatalogKioskId = null,\n onSelectCatalogKiosk,\n editMapPanel,\n wayfindingPanel,\n mapResponsivenessPanel,\n footer,\n onUseClassicMap,\n}: LeftRailProps) {\n const [floorsScreen, setFloorsScreen] = useState<FloorsScreen>({ mode: 'list' });\n\n useEffect(() => {\n if (section !== 'floors') setFloorsScreen({ mode: 'list' });\n }, [section]);\n\n useEffect(\n () => () => {\n onHoverShape?.(null);\n },\n [section, onHoverShape],\n );\n\n const assigned = useMemo(\n () => railAssignmentGroups(draft.shapes, draft.assignments),\n [draft.shapes, draft.assignments],\n );\n const storeShapes = assigned.stores;\n const amenityShapes = assigned.amenities;\n const kioskShapes = assigned.kiosks;\n const unassignedStoreShapes = assigned.unassignedStores;\n const unassignedAmenityShapes = assigned.unassignedAmenities;\n const unassignedKioskShapes = assigned.unassignedKiosks;\n const unassignedShapes = assigned.unassigned;\n const connectors = draft.connectors ?? [];\n const escalatorShapes = railConnectorShapes(draft.shapes, 'escalator', draft.anchors, connectors);\n const elevatorShapes = railConnectorShapes(draft.shapes, 'elevator', draft.anchors, connectors);\n const unlinkedEscalators = escalatorShapes.filter(\n (s) => !connectorForShape(s.id, draft.anchors, connectors),\n );\n const escalatorRides = useMemo(() => {\n const rides = groupEscalatorRides(\n connectors,\n draft.anchors,\n draft.edges,\n escalatorShapes,\n );\n const indexById = new Map(\n railListLevelOrder(draft.levels).map((level, index) => [level.id, index]),\n );\n return rides.slice().sort((a, b) => {\n const ai = indexById.get(a.from.levelId) ?? Number.POSITIVE_INFINITY;\n const bi = indexById.get(b.from.levelId) ?? Number.POSITIVE_INFINITY;\n if (ai !== bi) return ai - bi;\n return a.from.key.localeCompare(b.from.key);\n });\n }, [connectors, draft.anchors, draft.edges, draft.levels, escalatorShapes]);\n const linkedElevators = elevatorShapes.filter((s) =>\n connectorForShape(s.id, draft.anchors, connectors),\n );\n const unlinkedElevators = elevatorShapes.filter(\n (s) => !connectorForShape(s.id, draft.anchors, connectors),\n );\n const assignmentById = useMemo(\n () => assignmentByShapeId(draft.assignments),\n [draft.assignments],\n );\n const retailerById = useMemo(() => {\n const counts = new Map<string, number>();\n for (const retailer of retailers) {\n const key = retailer.name.trim().toLowerCase();\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return new Map(\n retailers.map((retailer) => {\n const duplicate =\n (counts.get(retailer.name.trim().toLowerCase()) ?? 0) > 1;\n return [\n retailer.id,\n retailerOptionLabel(retailer, duplicate),\n ] as const;\n }),\n );\n }, [retailers]);\n const amenityById = useMemo(\n () => new Map(draft.amenities.map((item) => [item.id, item.name])),\n [draft.amenities],\n );\n const kioskById = useMemo(\n () => new Map(kiosks.map((item) => [item.id, item.name])),\n [kiosks],\n );\n const assignedNameFor = (shape: {\n id: number;\n kind: string;\n key: string;\n levelId: number;\n }) => {\n const assignment = assignmentById.get(shape.id);\n if (assignment?.retailerId != null) {\n return retailerById.get(assignment.retailerId) ?? null;\n }\n if (assignment?.targetType === 'amenity' || assignment?.amenityId != null) {\n const catalogName =\n assignment.amenityId != null\n ? amenityById.get(assignment.amenityId) ?? null\n : null;\n const fromType = getAmenityByType(assignment.customLabel ?? '')?.name;\n return amenityAssignedName(assignment, catalogName ?? fromType ?? null);\n }\n if (assignment?.targetType === 'kiosk' || assignment?.kioskId != null) {\n return kioskAssignedName(\n assignment,\n assignment.kioskId != null\n ? kioskById.get(assignment.kioskId) ?? null\n : null,\n );\n }\n return connectorRideLabel(\n shape,\n draft.anchors,\n draft.edges,\n connectors,\n draft.shapes,\n draft.levels,\n );\n };\n const activeLevel = draft.levels.find((l) => l.id === activeLevelId);\n const pathCount = draft.anchors.filter((a) => a.levelId === activeLevelId).length;\n const levelName = (levelId: number) =>\n draft.levels.find((l) => l.id === levelId)?.name ?? 'Floor';\n const levelShapeCounts = useMemo(() => {\n const counts: Record<number, number> = {};\n for (const shape of draft.shapes) {\n if (shape.orphanedAt) continue;\n counts[shape.levelId] = (counts[shape.levelId] ?? 0) + 1;\n }\n return counts;\n }, [draft.shapes]);\n\n const selectedIds =\n selectedShapeIds ?? (selectedShapeId != null ? [selectedShapeId] : []);\n const isShapeSelected = (id: number) => selectedIds.includes(id);\n const selectedCatalogKiosk =\n selectedCatalogKioskId != null\n ? kiosks.find((item) => item.id === selectedCatalogKioskId) ?? null\n : null;\n const showingCatalogKiosk =\n section === 'kiosks' && selectedCatalogKiosk != null;\n const showingItemOptions =\n railShowsItemOptions(section, selectedIds.length) || showingCatalogKiosk;\n useEffect(() => {\n if (showingItemOptions) onHoverShape?.(null);\n }, [showingItemOptions, onHoverShape]);\n const itemOptionsTitle = (() => {\n if (showingCatalogKiosk && selectedCatalogKiosk) {\n const linkedId = shapeIdForCatalogKiosk(\n selectedCatalogKiosk.id,\n draft.assignments,\n );\n const linked = linkedId\n ? draft.shapes.find((row) => row.id === linkedId)\n : null;\n return {\n key: selectedCatalogKiosk.name.trim() || `Kiosk ${selectedCatalogKiosk.id}`,\n levelName: linked?.key ?? 'Unlinked',\n };\n }\n if (!showingItemOptions || selectedIds.length !== 1) return null;\n const shape = draft.shapes.find((row) => row.id === selectedIds[0]);\n if (!shape) return null;\n return { key: shape.key, levelName: levelName(shape.levelId) };\n })();\n const selectShapeFromList = (id: number, event: { shiftKey: boolean }) => {\n onSelectCatalogKiosk?.(null);\n onSelectShape(id, { additive: event.shiftKey });\n onListFocus?.();\n };\n const leftoverKiosks = leftoverCatalogKiosks(kiosks, draft.assignments);\n\n const counts: Record<RailNavCountKey, number> = {\n floors: visibleFloorCount(draft.levels),\n stores: storeShapes.length + unassignedStoreShapes.length,\n amenities: amenityShapes.length + unassignedAmenityShapes.length,\n kiosks:\n kioskShapes.length + unassignedKioskShapes.length + leftoverKiosks.length,\n escalators: escalatorShapes.length,\n elevators: elevatorShapes.length,\n unassigned: unassignedShapes.length,\n };\n\n const renderShapeList = (\n shapes: typeof draft.shapes,\n empty: string,\n opts?: {\n kindLabelFor?: (shape: (typeof draft.shapes)[number]) => string;\n showKindTag?: boolean;\n connectorIcon?: 'escalator' | 'elevator';\n connectorAssigned?: boolean;\n },\n ) =>\n shapes.length === 0 ? (\n <p className=\"eyeon-map-rail__hint\">{empty}</p>\n ) : (\n sortShapesByRailLevel(shapes, draft.levels).map((s) => {\n const copy = railRowLabels({\n key: s.key,\n kindLabel: opts?.kindLabelFor?.(s) ?? shapeKindLabel(s.kind),\n levelName: levelName(s.levelId),\n assignedName: assignedNameFor(s),\n showKindTag: opts?.showKindTag,\n });\n const iconUrl = opts?.connectorIcon\n ? connectorSpecialIconDataUrl(\n opts.connectorIcon,\n Boolean(opts.connectorAssigned),\n opts.connectorAssigned ? theme.CONNECTOR_ICON_COLOR : undefined,\n )\n : undefined;\n return (\n <button\n key={s.id}\n type=\"button\"\n className={\n isShapeSelected(s.id)\n ? 'eyeon-map-rail__row is-active'\n : 'eyeon-map-rail__row'\n }\n onMouseDown={(event) => {\n if (event.shiftKey) event.preventDefault();\n }}\n onMouseEnter={() => onHoverShape?.(s.id)}\n onMouseLeave={() => onHoverShape?.(null)}\n onClick={(event) => selectShapeFromList(s.id, event)}\n >\n {iconUrl ? (\n <img\n className={\n opts?.connectorAssigned\n ? 'eyeon-map-rail__row-icon is-assigned'\n : 'eyeon-map-rail__row-icon'\n }\n src={iconUrl}\n alt=\"\"\n />\n ) : null}\n <span className=\"eyeon-map-rail__row-copy\">\n {copy.title ? (\n <span className=\"eyeon-map-rail__row-title\">{copy.title}</span>\n ) : null}\n <span className=\"eyeon-map-rail__row-meta\">\n <span\n className={\n copy.title\n ? 'eyeon-map-rail__row-id'\n : 'eyeon-map-rail__row-id eyeon-map-rail__row-id--lead'\n }\n >\n {copy.id}\n </span>\n {copy.tags.length > 0 ? (\n <span className=\"eyeon-map-rail__tags\">\n {copy.tags.map((tag) => (\n <span key={`${s.id}-${tag}`} className=\"eyeon-map-rail__tag\">\n {tag}\n </span>\n ))}\n </span>\n ) : null}\n </span>\n </span>\n </button>\n );\n })\n );\n\n const renderEscalatorRideList = () =>\n escalatorRides.map((ride) => {\n const lines = escalatorRideLandingLines(ride, draft.levels);\n const active =\n isShapeSelected(ride.from.id) || isShapeSelected(ride.to.id);\n return (\n <button\n key={ride.connectorId}\n type=\"button\"\n className={\n active\n ? 'eyeon-map-rail__row eyeon-map-rail__row--ride is-active'\n : 'eyeon-map-rail__row eyeon-map-rail__row--ride'\n }\n onMouseDown={(event) => {\n if (event.shiftKey) event.preventDefault();\n }}\n onMouseEnter={() => onHoverShape?.(ride.from.id)}\n onMouseLeave={() => onHoverShape?.(null)}\n onClick={(event) => selectShapeFromList(ride.from.id, event)}\n >\n <span className=\"eyeon-map-rail__row-copy\">\n {lines.map((line) => (\n <span key={line.shapeId} className=\"eyeon-map-rail__row-meta\">\n <span className=\"eyeon-map-rail__row-id eyeon-map-rail__row-id--lead\">\n {line.key}\n </span>\n <span className=\"eyeon-map-rail__tags\">\n <span className=\"eyeon-map-rail__tag\">{line.levelName}</span>\n </span>\n </span>\n ))}\n </span>\n </button>\n );\n });\n\n const renderAssignedUnassigned = (\n assignedList: typeof draft.shapes,\n unassignedList: typeof draft.shapes,\n kindLabelFor?: (shape: (typeof draft.shapes)[number]) => string,\n connectorIcon?: 'escalator' | 'elevator',\n ) => (\n <>\n <div className=\"eyeon-map-rail__heading\">\n Assigned ({assignedList.length})\n </div>\n {assignedList.length > 0\n ? renderShapeList(assignedList, '', {\n kindLabelFor,\n connectorIcon,\n connectorAssigned: true,\n })\n : null}\n <div className=\"eyeon-map-rail__heading\">\n Unassigned ({unassignedList.length})\n </div>\n {unassignedList.length > 0\n ? renderShapeList(unassignedList, '', {\n kindLabelFor,\n connectorIcon,\n connectorAssigned: false,\n })\n : null}\n </>\n );\n\n return (\n <aside className=\"eyeon-map-rail\">\n {section ? (\n <div className=\"eyeon-map-rail__header\">\n <button\n type=\"button\"\n className=\"eyeon-map-rail__back\"\n onClick={() => {\n if (section === 'floors' && floorsScreen.mode !== 'list') {\n setFloorsScreen({ mode: 'list' });\n return;\n }\n if (showingCatalogKiosk) {\n onSelectCatalogKiosk?.(null);\n return;\n }\n if (showingItemOptions) {\n onSelectShape(null);\n onHoverShape?.(null);\n return;\n }\n onSectionChange(null);\n }}\n aria-label=\"Back\"\n >\n <BackIcon />\n </button>\n <div className=\"eyeon-map-rail__header-title\">\n {section === 'floors' ? (\n floorsScreenTitle(floorsScreen, draft.levels)\n ) : itemOptionsTitle ? (\n <span className=\"eyeon-map-assign__tag\">{itemOptionsTitle.key}</span>\n ) : (\n railSectionTitle(section)\n )}\n </div>\n {itemOptionsTitle ? (\n <span className=\"eyeon-map-rail__tag\">{itemOptionsTitle.levelName}</span>\n ) : null}\n </div>\n ) : (\n <div className=\"eyeon-map-rail__header\">\n <div className=\"eyeon-map-rail__header-title\">Configure Center Map</div>\n </div>\n )}\n\n <div className=\"eyeon-map-rail__body\">\n {!section && (\n <nav className=\"eyeon-map-rail__nav\" aria-label=\"Map options\">\n {RAIL_NAV.map((entry, index) => {\n if (isRailNavSeparator(entry)) {\n return (\n <div\n key={`sep-${index}`}\n className=\"eyeon-map-rail__nav-sep\"\n role=\"separator\"\n />\n );\n }\n const Icon = entry.icon;\n return (\n <button\n key={entry.id}\n type=\"button\"\n className=\"eyeon-map-rail__nav-item\"\n onClick={() => onSectionChange(entry.id)}\n >\n <span className=\"eyeon-map-rail__nav-icon\">\n <Icon />\n </span>\n <span className=\"eyeon-map-rail__nav-copy\">\n <span className=\"eyeon-map-rail__nav-title\">{entry.title}</span>\n <span className=\"eyeon-map-rail__nav-desc\">{entry.description}</span>\n </span>\n <span className=\"eyeon-map-rail__nav-meta\">\n {entry.countKey != null ? (\n <span className=\"eyeon-map-rail__nav-count\">\n {counts[entry.countKey]}\n </span>\n ) : null}\n <ChevronIcon />\n </span>\n </button>\n );\n })}\n </nav>\n )}\n\n {section === 'edit-map' && (\n <div className=\"eyeon-map-rail__section\">{editMapPanel}</div>\n )}\n\n {section === 'wayfinding' && (\n <div className=\"eyeon-map-rail__section\">{wayfindingPanel}</div>\n )}\n\n {section === 'map-responsiveness' && (\n <div className=\"eyeon-map-rail__section\">{mapResponsivenessPanel}</div>\n )}\n\n {section === 'floors' && (\n <FloorsPanel\n levels={draft.levels}\n buildings={draft.buildings}\n levelShapeCounts={levelShapeCounts}\n canFloors={canFloors}\n screen={floorsScreen}\n onScreenChange={setFloorsScreen}\n onCreateLevel={\n onCreateLevel\n ? async (input) => {\n const id = await onCreateLevel(input);\n setFloorsScreen({ mode: 'list' });\n return id;\n }\n : undefined\n }\n onUpdateLevel={onUpdateLevel}\n onDeleteLevel={onDeleteLevel}\n onReorderLevels={onReorderLevels}\n />\n )}\n\n {section === 'stores' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions\n ? assignPanel\n : renderAssignedUnassigned(storeShapes, unassignedStoreShapes)}\n </div>\n )}\n\n {section === 'amenities' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions\n ? assignPanel\n : renderAssignedUnassigned(\n amenityShapes,\n unassignedAmenityShapes,\n )}\n </div>\n )}\n\n {section === 'unassigned' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions ? (\n assignPanel\n ) : (\n <>\n <div className=\"eyeon-map-rail__heading\">\n Unassigned ({unassignedShapes.length})\n </div>\n {renderShapeList(\n unassignedShapes,\n 'Every assignable polygon has a link.',\n { showKindTag: true },\n )}\n </>\n )}\n </div>\n )}\n\n {section === 'escalators' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions ? (\n assignPanel\n ) : (\n <>\n <p className=\"eyeon-map-rail__hint\">\n Pick the boarding landing, then the floor and exit landing.\n A linked ride is one row: boarding on top, exit below. Rides\n are one-way.\n </p>\n <div className=\"eyeon-map-rail__heading\">\n Assigned ({escalatorRides.length})\n </div>\n {escalatorRides.length > 0 ? renderEscalatorRideList() : null}\n <div className=\"eyeon-map-rail__heading\">\n Unassigned ({unlinkedEscalators.length})\n </div>\n {unlinkedEscalators.length > 0\n ? renderShapeList(unlinkedEscalators, '')\n : null}\n </>\n )}\n </div>\n )}\n\n {section === 'elevators' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions ? (\n assignPanel\n ) : (\n renderAssignedUnassigned(\n linkedElevators,\n unlinkedElevators,\n undefined,\n 'elevator',\n )\n )}\n </div>\n )}\n\n {section === 'kiosks' && (\n <div className=\"eyeon-map-rail__section\">\n {showingCatalogKiosk\n ? catalogKioskPanel\n : showingItemOptions\n ? assignPanel\n : (\n <>\n {renderAssignedUnassigned(kioskShapes, unassignedKioskShapes)}\n {leftoverKiosks.length > 0 ? (\n <>\n <div className=\"eyeon-map-rail__heading\">\n Existing kiosks ({leftoverKiosks.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 {leftoverKiosks.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 <div className=\"eyeon-map-rail__heading\">Map Settings</div>\n {(\n [\n ['MAP_BACKGROUND_COLOR', 'Background'],\n ['STORE_DEFAULT_COLOR', 'Stores'],\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__heading eyeon-map-rail__heading--section\">\n Route Settings\n </div>\n <ColorField\n label=\"Route Path\"\n value={theme.ROUTE_COLOR}\n fallback={DEFAULT_THEME.ROUTE_COLOR}\n onChange={(hex) => onThemeChange({ ROUTE_COLOR: hex })}\n onReset={\n sameHexColor(theme.ROUTE_COLOR, DEFAULT_THEME.ROUTE_COLOR)\n ? undefined\n : () =>\n onThemeChange({ ROUTE_COLOR: DEFAULT_THEME.ROUTE_COLOR })\n }\n />\n <SettingsField\n label=\"Route Thickness\"\n onReset={\n theme.ROUTE_THICKNESS === DEFAULT_THEME.ROUTE_THICKNESS\n ? undefined\n : () =>\n onThemeChange({\n ROUTE_THICKNESS: DEFAULT_THEME.ROUTE_THICKNESS,\n })\n }\n >\n <input\n className=\"eyeon-map-rail__number-sm\"\n type=\"number\"\n min={1}\n step={1}\n inputMode=\"decimal\"\n value={theme.ROUTE_THICKNESS}\n aria-label=\"Route Thickness\"\n onChange={(e) =>\n onThemeChange({\n ROUTE_THICKNESS: clampRouteThickness(e.target.value),\n })\n }\n />\n </SettingsField>\n <div className=\"eyeon-map-rail__heading eyeon-map-rail__heading--section\">\n Outdoor Settings\n </div>\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 } from 'react';\nimport type {\n AssignmentLayerType,\n CmAmenityCatalogItem,\n CmShape,\n CmShapeAssignment,\n LabelAlign,\n MapAssignKiosk,\n MapAssignRetailer,\n} from '../../core';\nimport {\n assignmentHasTarget,\n assignmentIconThemeFallback,\n assignmentPadFillFallback,\n DEFAULT_LABEL_ALIGN,\n emptyShapeAssignment,\n normalizeLabelAlign,\n parseShapeAssignment,\n retailerOptionLabel,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport {\n amenityAssignOptions,\n amenityCatalogIdForType,\n amenityTypeFromCatalogId,\n} from '../../specialIcons';\nimport { isAssignableKind } from '../railAssignments';\nimport { AssignmentStyleFields } from './AssignmentStyleFields';\nimport { AlignRow } from './formRows';\n\nconst RETAIL_LAYER_TYPES: AssignmentLayerType[] = [\n 'retail_name',\n 'retail_logo',\n 'retail_text',\n];\n\nexport interface AssignFormProps {\n shape: CmShape;\n assignment: CmShapeAssignment | null;\n amenities: CmAmenityCatalogItem[];\n retailers: MapAssignRetailer[];\n kiosks?: MapAssignKiosk[];\n canEdit: boolean;\n storeDefaultColor: string;\n storeTextColor: string;\n amenityIconColor: string;\n kioskIconColor: string;\n onChange: (assignment: CmShapeAssignment) => void;\n onClear: () => void;\n}\n\nexport function AssignForm({\n shape,\n assignment,\n amenities,\n retailers,\n kiosks = [],\n canEdit,\n storeDefaultColor,\n storeTextColor,\n amenityIconColor,\n kioskIconColor,\n onChange,\n onClear,\n}: AssignFormProps) {\n const [form, setForm] = useState<CmShapeAssignment>(() =>\n assignment\n ? parseShapeAssignment(assignment, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind),\n );\n const formRef = useRef(form);\n formRef.current = form;\n\n useEffect(() => {\n setForm(\n assignment\n ? parseShapeAssignment(assignment, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind),\n );\n }, [shape, assignment]);\n\n const commit = useCallback(\n (next: CmShapeAssignment) => {\n setForm(next);\n if (!canEdit) return;\n onChange(parseShapeAssignment(next, shape.kind));\n },\n [canEdit, onChange, shape.kind],\n );\n\n const patch = useCallback(\n (partial: Partial<CmShapeAssignment>) => {\n commit({ ...formRef.current, shapeId: shape.id, ...partial });\n },\n [commit, shape.id],\n );\n\n const nameCounts = useMemo(() => {\n const counts = new Map<string, number>();\n for (const retailer of retailers) {\n const key = retailer.name.trim().toLowerCase();\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return counts;\n }, [retailers]);\n\n const retailerOptions = useMemo(\n () =>\n retailers.map((retailer) => {\n const duplicate =\n (nameCounts.get(retailer.name.trim().toLowerCase()) ?? 0) > 1;\n return {\n value: String(retailer.id),\n label: retailerOptionLabel(retailer, duplicate),\n };\n }),\n [nameCounts, retailers],\n );\n\n const amenityOptions = useMemo(() => amenityAssignOptions(), []);\n const selectedAmenityType =\n amenityTypeFromCatalogId(form.amenityId, amenities) ||\n form.customLabel ||\n '';\n\n const kioskCatalogName = useMemo(() => {\n if (form.kioskId == null) return null;\n return kiosks.find((item) => item.id === form.kioskId)?.name ?? null;\n }, [form.kioskId, kiosks]);\n\n const showTextColor = [\n 'retail_name',\n 'retail_text',\n 'custom_text',\n 'kiosk',\n 'amenity',\n ].includes(form.layerType);\n const textColorLabel =\n form.layerType === 'kiosk' || form.layerType === 'amenity'\n ? 'Icon Color'\n : 'Text Color';\n const textColorFallback = assignmentIconThemeFallback(\n form,\n {\n AMENITY_ICON_COLOR: amenityIconColor,\n KIOSK_ICON_COLOR: kioskIconColor,\n CONNECTOR_ICON_COLOR: storeTextColor,\n STORE_TEXT_COLOR: storeTextColor,\n },\n shape.kind,\n );\n\n const hasAssignment = assignmentHasTarget(form);\n\n if (!isAssignableKind(shape.kind)) return null;\n\n return (\n <div className=\"eyeon-map-assign\">\n {shape.kind === 'unit' || shape.kind === 'parking_zone' ? (\n <>\n <ModernSelect\n ariaLabel=\"Choose a Retailer\"\n value={form.retailerId != null ? String(form.retailerId) : ''}\n disabled={!canEdit}\n searchable\n placeholder=\"Choose a Retailer…\"\n options={retailerOptions}\n onChange={(next) => {\n const retailerId = next ? Number(next) : null;\n const retailer = retailers.find((item) => item.id === retailerId);\n const layerType = RETAIL_LAYER_TYPES.includes(form.layerType)\n ? form.layerType\n : 'retail_name';\n patch({\n targetType: retailerId ? 'retailer' : 'none',\n retailerId,\n amenityId: null,\n kioskId: null,\n unitStatus: retailerId ? 'occupied' : 'vacant',\n layerType,\n customLabel:\n layerType === 'retail_name'\n ? retailer?.name ?? null\n : form.customLabel,\n customImageKey:\n layerType === 'retail_logo'\n ? retailer?.logoKey ?? form.customImageKey\n : form.customImageKey,\n });\n }}\n />\n {form.retailerId != null ? (\n <div className=\"eyeon-map-assign__tabs\" role=\"group\" aria-label=\"Display\">\n <button\n type=\"button\"\n className={\n form.layerType === 'retail_name' ? 'is-active' : undefined\n }\n disabled={!canEdit}\n onClick={() => {\n const retailer = retailers.find(\n (item) => item.id === form.retailerId,\n );\n patch({\n layerType: 'retail_name',\n customLabel: retailer?.name ?? form.customLabel,\n });\n }}\n >\n Retail Name\n </button>\n <button\n type=\"button\"\n className={\n form.layerType === 'retail_logo' ? 'is-active' : undefined\n }\n disabled={!canEdit}\n onClick={() => {\n const retailer = retailers.find(\n (item) => item.id === form.retailerId,\n );\n patch({\n layerType: 'retail_logo',\n customImageKey:\n retailer?.logoKey ?? form.customImageKey,\n });\n }}\n >\n Retail Logo\n </button>\n <button\n type=\"button\"\n className={\n form.layerType === 'retail_text' ? 'is-active' : undefined\n }\n disabled={!canEdit}\n onClick={() => patch({ layerType: 'retail_text' })}\n >\n Custom Text\n </button>\n </div>\n ) : null}\n {form.retailerId != null && form.layerType === 'retail_text' ? (\n <>\n <label className=\"eyeon-map-rail__field\">\n Text\n <textarea\n rows={3}\n disabled={!canEdit}\n value={form.customLabel ?? ''}\n style={{\n textAlign: normalizeLabelAlign(\n form.align ?? shape.label.align,\n ),\n }}\n onChange={(e) => patch({ customLabel: e.target.value || null })}\n />\n </label>\n <AlignRow\n value={form.align ?? shape.label.align ?? DEFAULT_LABEL_ALIGN}\n disabled={!canEdit}\n onChange={(align: LabelAlign) => patch({ align })}\n />\n </>\n ) : null}\n </>\n ) : null}\n\n {shape.kind === 'amenity' ? (\n <ModernSelect\n ariaLabel=\"Choose Amenity\"\n value={selectedAmenityType}\n disabled={!canEdit}\n searchable\n placeholder=\"Choose Amenity…\"\n options={amenityOptions}\n onChange={(next) => {\n const amenityId = next\n ? amenityCatalogIdForType(next, amenities)\n : null;\n patch({\n targetType: next ? 'amenity' : 'none',\n amenityId,\n customLabel: next || null,\n retailerId: null,\n kioskId: null,\n layerType: 'amenity',\n });\n }}\n />\n ) : null}\n\n {shape.kind === 'kiosk_screen' ? (\n <KioskNameField\n value={form.customLabel ?? kioskCatalogName ?? ''}\n disabled={!canEdit}\n onChange={(name) => {\n const trimmed = name.trim();\n patch({\n targetType: trimmed ? 'kiosk' : 'none',\n kioskId: trimmed ? form.kioskId : null,\n customLabel: name === '' ? null : name,\n retailerId: null,\n amenityId: null,\n layerType: 'kiosk',\n });\n }}\n />\n ) : null}\n\n <AssignmentStyleFields\n form={form}\n canEdit={canEdit}\n storeDefaultColor={assignmentPadFillFallback(\n shape.kind,\n storeDefaultColor,\n )}\n storeTextColor={textColorFallback}\n textColorLabel={textColorLabel}\n showTextColor={showTextColor}\n onPatch={patch}\n />\n {canEdit ? (\n <div className=\"eyeon-map-assign__actions eyeon-map-assign__actions--end\">\n <button\n type=\"button\"\n className=\"eyeon-map-assign__unassign\"\n onClick={() => {\n if (!hasAssignment) return;\n onClear();\n }}\n disabled={!hasAssignment}\n >\n Unassign\n </button>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction KioskNameField({\n value,\n disabled,\n onChange,\n}: {\n value: string;\n disabled: boolean;\n onChange: (name: string) => void;\n}) {\n return (\n <label className=\"eyeon-map-rail__field\">\n Name\n <input\n type=\"text\"\n autoComplete=\"off\"\n spellCheck={false}\n disabled={disabled}\n placeholder=\"e.g. Food court entrance\"\n aria-label=\"Kiosk name\"\n maxLength={50}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n />\n </label>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport type { CmShape, CmShapeAssignment } from '../../core';\nimport {\n assignNumberFromDraft,\n assignmentIconThemeFallback,\n assignmentPadFillFallback,\n bulkAssignFormState,\n DEFAULT_ASSIGNMENT_SIZE,\n emptyShapeAssignment,\n parseShapeAssignment,\n type BulkAssignPatch,\n} from '../../core';\nimport { FieldResetButton } from '../FieldResetButton';\nimport {\n isTransparentColor,\n normalizeHexColor,\n TRANSPARENT_COLOR,\n} from '../hexColor';\nimport { isAssignableKind } from '../railAssignments';\nimport { ColorSwatch } from './formRows';\n\nexport function BulkAssignForm({\n shapes,\n assignments,\n canEdit,\n storeDefaultColor,\n storeTextColor,\n amenityIconColor,\n kioskIconColor,\n onPatch,\n}: {\n shapes: CmShape[];\n assignments: CmShapeAssignment[];\n canEdit: boolean;\n storeDefaultColor: string;\n storeTextColor: string;\n amenityIconColor: string;\n kioskIconColor: string;\n onPatch: (patch: BulkAssignPatch) => void;\n}) {\n const rows = shapes\n .filter((shape) => isAssignableKind(shape.kind))\n .map((shape) => {\n const existing = assignments.find((row) => row.shapeId === shape.id);\n return existing\n ? parseShapeAssignment(existing, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind);\n });\n const common = bulkAssignFormState(rows);\n const assignableShapes = shapes.filter((shape) => isAssignableKind(shape.kind));\n const iconOnly =\n assignableShapes.length > 0 &&\n assignableShapes.every(\n (shape) => shape.kind === 'amenity' || shape.kind === 'kiosk_screen',\n );\n const uniqueKinds = new Set(assignableShapes.map((shape) => shape.kind));\n const textColorLabel = iconOnly ? 'Icon Color' : 'Text Color';\n const textColorFallback =\n uniqueKinds.size === 1\n ? assignmentIconThemeFallback(\n rows[0],\n {\n AMENITY_ICON_COLOR: amenityIconColor,\n KIOSK_ICON_COLOR: kioskIconColor,\n CONNECTOR_ICON_COLOR: storeTextColor,\n STORE_TEXT_COLOR: storeTextColor,\n },\n assignableShapes[0]?.kind,\n )\n : storeTextColor;\n const bgColorFallback =\n uniqueKinds.size === 1\n ? assignmentPadFillFallback(assignableShapes[0]?.kind, storeDefaultColor)\n : storeDefaultColor;\n\n return (\n <div className=\"eyeon-map-assign\">\n <div className=\"eyeon-map-assign__tags\">\n {shapes.map((shape) => (\n <span key={shape.id} className=\"eyeon-map-assign__tag\">\n {shape.key}\n </span>\n ))}\n </div>\n <BulkSizeRow\n value={common.size}\n disabled={!canEdit}\n onCommit={(size) => onPatch({ size })}\n />\n <BulkColorRow\n label=\"BG Color\"\n value={common.bgColor}\n fallback={bgColorFallback}\n mixed={common.bgColorMixed}\n disabled={!canEdit}\n onCommit={(bgColor) => onPatch({ bgColor })}\n />\n <BulkColorRow\n label={textColorLabel}\n value={common.textColor}\n fallback={textColorFallback}\n mixed={common.textColorMixed}\n disabled={!canEdit}\n onCommit={(textColor) => onPatch({ textColor })}\n />\n </div>\n );\n}\n\nfunction BulkSizeRow({\n value,\n disabled,\n onCommit,\n}: {\n value: number | '';\n disabled: boolean;\n onCommit: (size: number) => void;\n}) {\n const [draft, setDraft] = useState(() => (value === '' ? '' : String(value)));\n const focused = useRef(false);\n\n useEffect(() => {\n if (!focused.current) setDraft(value === '' ? '' : String(value));\n }, [value]);\n\n const emitIfComplete = (raw: string, persistIncomplete: boolean) => {\n if (!raw.trim()) {\n setDraft('');\n return;\n }\n const parsed = assignNumberFromDraft(raw);\n if (!parsed.complete) {\n setDraft(raw);\n return;\n }\n setDraft(String(parsed.render));\n onCommit(parsed.render);\n if (persistIncomplete) setDraft(String(parsed.render));\n };\n\n const step = (delta: number) => {\n const base = value === '' ? DEFAULT_ASSIGNMENT_SIZE : value;\n const next = base + delta;\n setDraft(String(next));\n onCommit(next);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">Size</span>\n <div className=\"eyeon-map-assign__control\">\n <div className=\"eyeon-map-assign__stepper\">\n <button\n type=\"button\"\n disabled={disabled}\n aria-label=\"Decrease Size\"\n onClick={() => step(-1)}\n >\n −\n </button>\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={draft}\n disabled={disabled}\n aria-label=\"Size\"\n onFocus={() => {\n focused.current = true;\n }}\n onChange={(e) => emitIfComplete(e.target.value, false)}\n onBlur={() => {\n focused.current = false;\n emitIfComplete(draft, true);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n return;\n }\n if (e.key !== 'ArrowUp' && e.key !== 'ArrowDown') return;\n e.preventDefault();\n if (disabled) return;\n const delta = e.key === 'ArrowUp' ? 1 : -1;\n const parsed = assignNumberFromDraft(draft);\n const base = parsed.complete\n ? parsed.render\n : value === ''\n ? DEFAULT_ASSIGNMENT_SIZE\n : value;\n const next = base + delta;\n setDraft(String(next));\n onCommit(next);\n }}\n />\n <button\n type=\"button\"\n disabled={disabled}\n aria-label=\"Increase Size\"\n onClick={() => step(1)}\n >\n +\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nfunction BulkColorRow({\n label,\n value,\n fallback,\n mixed,\n disabled,\n onCommit,\n}: {\n label: string;\n value: string;\n fallback: string;\n mixed: boolean;\n disabled: boolean;\n onCommit: (hex: string | null) => void;\n}) {\n const transparent = !mixed && isTransparentColor(value);\n const display = mixed\n ? ''\n : transparent\n ? TRANSPARENT_COLOR\n : value.trim()\n ? value\n : fallback;\n const customized = mixed || Boolean(value.trim());\n const [hex, setHex] = useState(transparent ? '' : display);\n\n useEffect(() => {\n setHex(transparent ? '' : display);\n }, [display, transparent]);\n\n const commit = (next: string) => {\n if (!next.trim() || isTransparentColor(next)) {\n setHex('');\n if (!mixed) onCommit(TRANSPARENT_COLOR);\n return;\n }\n const normalized = normalizeHexColor(next);\n if (!normalized) {\n setHex(transparent ? '' : display);\n return;\n }\n setHex(normalized);\n onCommit(normalized);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">\n {label}\n {customized ? (\n <FieldResetButton\n label={label}\n disabled={disabled}\n onClick={() => onCommit(null)}\n />\n ) : null}\n </span>\n <ColorSwatch\n label={label}\n hex={hex}\n swatch={display}\n fallback={fallback}\n disabled={disabled}\n emptyIsTransparent={!mixed}\n onHexChange={setHex}\n onCommit={() => commit(hex)}\n onPick={commit}\n />\n </div>\n );\n}\n","import React, { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport '../../ui/modern-select.css';\n\nfunction Chevron() {\n return (\n <svg\n className=\"eyeon-map-select__chevron\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n aria-hidden\n >\n <path\n d=\"M2.5 4.5 6 8l3.5-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function CopyToLevelButton({\n destinations,\n disabled = false,\n onCopyToLevel,\n}: {\n destinations: Array<{ id: number; name: string }>;\n disabled?: boolean;\n onCopyToLevel: (levelId: number) => string | null;\n}) {\n const listId = useId();\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [menuPos, setMenuPos] = useState<{\n top: number;\n left: number;\n width: number;\n maxHeight: number;\n } | null>(null);\n\n const close = useCallback(() => {\n setOpen(false);\n setMenuPos(null);\n }, []);\n\n const updateMenuPos = useCallback(() => {\n const el = buttonRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom - 8;\n const spaceAbove = rect.top - 8;\n const maxHeight = Math.min(280, Math.max(spaceBelow, spaceAbove, 120));\n const openAbove = spaceBelow < 160 && spaceAbove > spaceBelow;\n setMenuPos({\n top: openAbove ? Math.max(8, rect.top - maxHeight - 4) : rect.bottom + 4,\n left: rect.left,\n width: Math.max(rect.width, 168),\n maxHeight,\n });\n }, []);\n\n const destinationKey = destinations.map((level) => level.id).join(',');\n useEffect(() => {\n setError(null);\n close();\n }, [close, destinationKey]);\n\n useEffect(() => {\n if (!open) return;\n updateMenuPos();\n const onDoc = (e: MouseEvent) => {\n const t = e.target as Node;\n if (buttonRef.current?.contains(t) || menuRef.current?.contains(t)) return;\n close();\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n close();\n buttonRef.current?.blur();\n }\n };\n const onMove = () => updateMenuPos();\n document.addEventListener('mousedown', onDoc);\n document.addEventListener('keydown', onKey);\n window.addEventListener('resize', onMove);\n window.addEventListener('scroll', onMove, true);\n return () => {\n document.removeEventListener('mousedown', onDoc);\n document.removeEventListener('keydown', onKey);\n window.removeEventListener('resize', onMove);\n window.removeEventListener('scroll', onMove, true);\n };\n }, [close, open, updateMenuPos]);\n\n if (destinations.length === 0) return null;\n\n const menu =\n open && menuPos && !disabled\n ? createPortal(\n <div\n ref={menuRef}\n id={listId}\n className=\"eyeon-map-select__menu\"\n role=\"listbox\"\n aria-label=\"Duplicate to floor\"\n style={{\n top: menuPos.top,\n left: menuPos.left,\n width: menuPos.width,\n maxHeight: menuPos.maxHeight,\n }}\n >\n <ul className=\"eyeon-map-select__list\">\n {destinations.map((level) => (\n <li key={level.id} role=\"option\">\n <button\n type=\"button\"\n className=\"eyeon-map-select__option\"\n onClick={() => {\n const nextError = onCopyToLevel(level.id);\n setError(nextError);\n if (!nextError) close();\n }}\n >\n {level.name}\n </button>\n </li>\n ))}\n </ul>\n </div>,\n document.body,\n )\n : null;\n\n return (\n <div className=\"eyeon-map-assign__copy-wrap\">\n <button\n ref={buttonRef}\n type=\"button\"\n className={\n open ? 'eyeon-map-assign__copy is-open' : 'eyeon-map-assign__copy'\n }\n aria-label=\"Duplicate to another floor\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listId : undefined}\n disabled={disabled}\n onClick={() => {\n if (disabled) return;\n setError(null);\n setOpen((value) => !value);\n }}\n >\n Duplicate\n <Chevron />\n </button>\n {menu}\n {error ? (\n <p className=\"eyeon-map-rail__hint\" style={{ color: '#b91c1c' }}>\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ShapeLabel } from '../../core';\nimport { DEFAULT_ENTRANCE_SIZE, clampEntranceSize } from '../entranceIcon';\nimport {\n ColorRow,\n RotateIcon,\n StepperRow,\n nextQuarterTurn,\n stepWholeNumber,\n} from './formRows';\n\nconst MIN_ICON_SIZE = 8;\ntype StepKey = 'size' | 'rotate';\n\nexport function EntranceIconForm({\n label,\n canEdit,\n storeTextColor,\n onChange,\n}: {\n label: ShapeLabel;\n canEdit: boolean;\n storeTextColor: string;\n onChange: (label: ShapeLabel, opts?: { live?: boolean }) => void;\n}) {\n const [size, setSize] = useState(label.size ?? DEFAULT_ENTRANCE_SIZE);\n const [rotate, setRotate] = useState(label.rotate ?? 0);\n const sizeRef = useRef(size);\n const rotateRef = useRef(rotate);\n sizeRef.current = size;\n rotateRef.current = rotate;\n const intervals = useRef<Partial<Record<StepKey, number>>>({});\n\n useEffect(() => {\n setSize(label.size ?? DEFAULT_ENTRANCE_SIZE);\n setRotate(label.rotate ?? 0);\n }, [label]);\n\n useEffect(\n () => () => {\n (Object.values(intervals.current) as number[]).forEach((id) =>\n window.clearInterval(id),\n );\n },\n [],\n );\n\n const commit = useCallback(\n (partial: Partial<ShapeLabel>, opts?: { live?: boolean }) => {\n if (!canEdit) return;\n const nextSize = clampEntranceSize(partial.size ?? sizeRef.current);\n const nextRotate = partial.rotate ?? rotateRef.current;\n if (partial.size != null) {\n setSize(nextSize);\n sizeRef.current = nextSize;\n }\n if (partial.rotate != null) {\n setRotate(nextRotate);\n rotateRef.current = nextRotate;\n }\n onChange(\n {\n ...label,\n ...partial,\n size: nextSize,\n rotate: nextRotate,\n },\n opts,\n );\n },\n [canEdit, label, onChange],\n );\n\n const bump = (key: StepKey, delta: number) => {\n if (key === 'size') {\n commit({\n size: clampEntranceSize(stepWholeNumber(sizeRef.current, delta)),\n });\n return;\n }\n commit({ rotate: stepWholeNumber(rotateRef.current, delta) });\n };\n\n const stopHold = (key: StepKey) => {\n const id = intervals.current[key];\n if (id) {\n window.clearInterval(id);\n intervals.current[key] = undefined;\n }\n };\n\n const startHold = (key: StepKey, delta: number) => {\n stopHold(key);\n intervals.current[key] = window.setInterval(() => bump(key, delta), 200);\n };\n\n const color = label.color ?? '';\n\n return (\n <div className=\"eyeon-map-assign\">\n <StepperRow\n label=\"Size\"\n value={size}\n disabled={!canEdit}\n onChange={(next) => commit({ size: Math.max(MIN_ICON_SIZE, next) })}\n onStep={(delta) => bump('size', delta)}\n onHoldStart={(delta) => startHold('size', delta)}\n onHoldEnd={() => stopHold('size')}\n />\n <ColorRow\n label=\"Color\"\n value={color}\n fallback={storeTextColor}\n disabled={!canEdit}\n onChange={(hex) => commit({ color: hex || undefined })}\n onReset={color ? () => commit({ color: undefined }) : undefined}\n />\n <StepperRow\n label=\"Rotate\"\n value={rotate}\n disabled={!canEdit}\n extra={\n <button\n type=\"button\"\n className=\"eyeon-map-assign__rotate\"\n aria-label=\"Rotate 45 degrees\"\n disabled={!canEdit}\n onClick={() => commit({ rotate: nextQuarterTurn(rotateRef.current) })}\n >\n <RotateIcon />\n </button>\n }\n onChange={(next) => commit({ rotate: next })}\n onStep={(delta) => bump('rotate', delta)}\n onHoldStart={(delta) => startHold('rotate', delta)}\n onHoldEnd={() => stopHold('rotate')}\n />\n </div>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n DEFAULT_LABEL_ALIGN,\n type LabelAlign,\n type ShapeLabel,\n} from '../../core';\nimport { DEFAULT_LABEL_SIZE, DEFAULT_LABEL_TEXT } from '../labelText';\nimport {\n AlignRow,\n ColorRow,\n RotateIcon,\n StepperRow,\n nextQuarterTurn,\n stepWholeNumber,\n} from './formRows';\n\nconst MIN_FONT_SIZE = 8;\ntype StepKey = 'size' | 'rotate';\n\nexport function TextLabelForm({\n label,\n canEdit,\n storeTextColor,\n onChange,\n}: {\n label: ShapeLabel;\n canEdit: boolean;\n storeTextColor: string;\n onChange: (label: ShapeLabel, opts?: { live?: boolean }) => void;\n}) {\n const [text, setText] = useState(label.text ?? '');\n const [size, setSize] = useState(label.size ?? DEFAULT_LABEL_SIZE);\n const [rotate, setRotate] = useState(label.rotate ?? 0);\n const sizeRef = useRef(size);\n const rotateRef = useRef(rotate);\n const textFocused = useRef(false);\n sizeRef.current = size;\n rotateRef.current = rotate;\n const intervals = useRef<Partial<Record<StepKey, number>>>({});\n\n useEffect(() => {\n if (!textFocused.current) setText(label.text ?? '');\n setSize(label.size ?? DEFAULT_LABEL_SIZE);\n setRotate(label.rotate ?? 0);\n }, [label]);\n\n useEffect(\n () => () => {\n (Object.values(intervals.current) as number[]).forEach((id) =>\n window.clearInterval(id),\n );\n },\n [],\n );\n\n const commit = useCallback(\n (partial: Partial<ShapeLabel>, opts?: { live?: boolean }) => {\n if (!canEdit) return;\n const nextSize = Math.max(MIN_FONT_SIZE, partial.size ?? sizeRef.current);\n const nextRotate = partial.rotate ?? rotateRef.current;\n if (partial.size != null) {\n setSize(nextSize);\n sizeRef.current = nextSize;\n }\n if (partial.rotate != null) {\n setRotate(nextRotate);\n rotateRef.current = nextRotate;\n }\n const nextText =\n partial.text === undefined\n ? text\n : partial.text === ''\n ? (label.text ?? DEFAULT_LABEL_TEXT)\n : partial.text;\n onChange(\n {\n ...label,\n ...partial,\n text: nextText,\n size: nextSize,\n rotate: nextRotate,\n },\n opts,\n );\n },\n [canEdit, label, onChange, text],\n );\n\n const bump = (key: StepKey, delta: number) => {\n if (key === 'size') {\n commit({\n size: Math.max(MIN_FONT_SIZE, stepWholeNumber(sizeRef.current, delta)),\n });\n return;\n }\n commit({ rotate: stepWholeNumber(rotateRef.current, delta) });\n };\n\n const stopHold = (key: StepKey) => {\n const id = intervals.current[key];\n if (id) {\n window.clearInterval(id);\n intervals.current[key] = undefined;\n }\n };\n\n const startHold = (key: StepKey, delta: number) => {\n stopHold(key);\n intervals.current[key] = window.setInterval(() => bump(key, delta), 200);\n };\n\n const color = label.color ?? '';\n\n return (\n <div className=\"eyeon-map-assign\">\n <label className=\"eyeon-map-rail__field\">\n Text\n <textarea\n rows={3}\n value={text}\n disabled={!canEdit}\n placeholder=\"Text on the map\"\n aria-label=\"Text\"\n style={{ textAlign: label.align ?? DEFAULT_LABEL_ALIGN }}\n onFocus={() => {\n textFocused.current = true;\n }}\n onChange={(e) => {\n const next = e.target.value;\n setText(next);\n commit({ text: next }, { live: true });\n }}\n onBlur={() => {\n textFocused.current = false;\n const next = text.trim();\n if (next !== text) setText(next);\n commit({ text: next || DEFAULT_LABEL_TEXT });\n }}\n />\n </label>\n <AlignRow\n value={label.align}\n disabled={!canEdit}\n onChange={(align: LabelAlign) => commit({ align })}\n />\n <StepperRow\n label=\"Font size\"\n value={size}\n disabled={!canEdit}\n onChange={(next) => commit({ size: Math.max(MIN_FONT_SIZE, next) })}\n onStep={(delta) => bump('size', delta)}\n onHoldStart={(delta) => startHold('size', delta)}\n onHoldEnd={() => stopHold('size')}\n />\n <ColorRow\n label=\"Text color\"\n value={color}\n fallback={storeTextColor}\n disabled={!canEdit}\n onChange={(hex) => commit({ color: hex || undefined })}\n onReset={color ? () => commit({ color: undefined }) : undefined}\n />\n <StepperRow\n label=\"Rotate\"\n value={rotate}\n disabled={!canEdit}\n extra={\n <button\n type=\"button\"\n className=\"eyeon-map-assign__rotate\"\n aria-label=\"Rotate 45 degrees\"\n disabled={!canEdit}\n onClick={() => commit({ rotate: nextQuarterTurn(rotateRef.current) })}\n >\n <RotateIcon />\n </button>\n }\n onChange={(next) => commit({ rotate: next })}\n onStep={(delta) => bump('rotate', delta)}\n onHoldStart={(delta) => startHold('rotate', delta)}\n onHoldEnd={() => stopHold('rotate')}\n />\n </div>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport type {\n BulkAssignPatch,\n CmAmenityCatalogItem,\n CmShape,\n CmShapeAssignment,\n MapAssignKiosk,\n MapAssignRetailer,\n ShapeKind,\n ShapeLabel,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport { inspectorShowsType, inspectorTypeKinds, SHAPE_KIND_LABELS } from '../labels';\nimport { isAssignableKind } from '../railAssignments';\nimport { copyDestinationLevels } from '../shapeCopy';\nimport { isEntranceIcon } from '../entranceIcon';\nimport { AssignForm } from './AssignForm';\nimport { BulkAssignForm } from './BulkAssignForm';\nimport { CopyToLevelButton } from './CopyToLevelButton';\nimport { EntranceIconForm } from './EntranceIconForm';\nimport { TextLabelForm } from './TextLabelForm';\n\nexport interface InspectorProps {\n shape: CmShape | null;\n assignment: CmShapeAssignment | null;\n amenities: CmAmenityCatalogItem[];\n retailers?: MapAssignRetailer[];\n kiosks?: MapAssignKiosk[];\n /** Other shape keys on the same level — used for uniqueness validation. */\n levelShapeKeys?: string[];\n canEdit: boolean;\n /** Retailer / amenity / kiosk assignment. Off in Edit Map (ID and Type only). */\n showAssignment?: boolean;\n /** Empty-state copy when nothing is selected. */\n emptyHint?: string;\n onRename: (key: string) => void;\n onChangeKind: (kind: ShapeKind) => void;\n onChangeLevel?: (levelId: number) => string | null;\n /** Duplicate geometry onto another floor. Edit Map only — not assign. */\n onCopyToLevel?: (levelId: number) => string | null;\n levels?: Array<{ id: number; name: string }>;\n onDelete?: () => void;\n onClearAssignment?: () => void;\n onSaveAssignment: (assignment: CmShapeAssignment) => void;\n onUpdateLabel?: (label: ShapeLabel, opts?: { live?: boolean }) => void;\n selectedShapes?: CmShape[];\n selectedAssignments?: CmShapeAssignment[];\n onBulkAssign?: (patch: BulkAssignPatch) => void;\n storeDefaultColor: string;\n storeTextColor: string;\n amenityIconColor: string;\n kioskIconColor: string;\n}\n\nexport function Inspector({\n shape,\n assignment,\n amenities,\n retailers = [],\n kiosks = [],\n levelShapeKeys = [],\n canEdit,\n showAssignment = true,\n emptyHint = 'Pick an item from the list below, or click it on the map.',\n onRename,\n onChangeKind,\n onChangeLevel,\n onCopyToLevel,\n levels = [],\n onDelete,\n onClearAssignment,\n onSaveAssignment,\n onUpdateLabel,\n selectedShapes = [],\n selectedAssignments = [],\n onBulkAssign,\n storeDefaultColor,\n storeTextColor,\n amenityIconColor,\n kioskIconColor,\n}: InspectorProps) {\n const [key, setKey] = useState(shape?.key ?? '');\n const [keyError, setKeyError] = useState<string | null>(null);\n const [levelError, setLevelError] = useState<string | null>(null);\n\n useEffect(() => {\n setKey(shape?.key ?? '');\n setKeyError(null);\n setLevelError(null);\n }, [shape, assignment]);\n\n if (showAssignment && selectedShapes.length > 1 && onBulkAssign) {\n return (\n <div className=\"eyeon-map-inspector\">\n <BulkAssignForm\n key={selectedShapes.map((item) => item.id).join(',')}\n shapes={selectedShapes}\n assignments={selectedAssignments}\n canEdit={canEdit}\n storeDefaultColor={storeDefaultColor}\n storeTextColor={storeTextColor}\n amenityIconColor={amenityIconColor}\n kioskIconColor={kioskIconColor}\n onPatch={onBulkAssign}\n />\n </div>\n );\n }\n\n if (!shape) {\n if (!showAssignment || !emptyHint) return null;\n return (\n <div className=\"eyeon-map-inspector__empty\">\n {emptyHint}\n </div>\n );\n }\n\n const commitRename = () => {\n if (!key || key === shape.key) {\n setKeyError(null);\n return;\n }\n if (levelShapeKeys.includes(key)) {\n setKeyError('That ID is already used on this level.');\n return;\n }\n setKeyError(null);\n onRename(key);\n };\n\n const copyDestinations = copyDestinationLevels(levels, shape.levelId);\n const copyButton =\n !showAssignment &&\n canEdit &&\n onCopyToLevel &&\n copyDestinations.length > 0 ? (\n <CopyToLevelButton\n destinations={copyDestinations}\n onCopyToLevel={onCopyToLevel}\n />\n ) : null;\n\n if (showAssignment) {\n return (\n <div className=\"eyeon-map-inspector\">\n {shape.geometryLocked ? (\n <p className=\"eyeon-map-rail__hint\">\n Geometry locked — outdoor re-uploads will not overwrite this shape.\n </p>\n ) : null}\n {isAssignableKind(shape.kind) ? (\n <AssignForm\n shape={shape}\n assignment={assignment}\n amenities={amenities}\n retailers={retailers}\n kiosks={kiosks}\n canEdit={canEdit}\n storeDefaultColor={storeDefaultColor}\n storeTextColor={storeTextColor}\n amenityIconColor={amenityIconColor}\n kioskIconColor={kioskIconColor}\n onChange={onSaveAssignment}\n onClear={() => onClearAssignment?.()}\n />\n ) : null}\n </div>\n );\n }\n\n return (\n <div className=\"eyeon-map-inspector\">\n {isEntranceIcon(shape) ? (\n onUpdateLabel ? (\n <EntranceIconForm\n label={shape.label}\n canEdit={canEdit}\n storeTextColor={storeTextColor}\n onChange={onUpdateLabel}\n />\n ) : null\n ) : shape.kind === 'label' ? (\n onUpdateLabel ? (\n <TextLabelForm\n label={shape.label}\n canEdit={canEdit}\n storeTextColor={storeTextColor}\n onChange={onUpdateLabel}\n />\n ) : null\n ) : (\n <>\n <label className=\"eyeon-map-rail__field\">\n ID\n <input\n className=\"eyeon-map-rail__id-input\"\n value={key}\n disabled={!canEdit}\n onChange={(e) => {\n setKey(e.target.value);\n setKeyError(null);\n }}\n onBlur={commitRename}\n />\n </label>\n {keyError ? (\n <p className=\"eyeon-map-rail__hint\" style={{ color: '#b91c1c' }}>\n {keyError}\n </p>\n ) : null}\n\n {inspectorShowsType(shape.kind) ? (\n <label className=\"eyeon-map-rail__field\">\n Type\n <ModernSelect\n ariaLabel=\"Type\"\n value={shape.kind}\n disabled={!canEdit}\n searchable={false}\n options={inspectorTypeKinds(shape.kind).map((k) => ({\n value: k,\n label: SHAPE_KIND_LABELS[k],\n }))}\n onChange={(next) => onChangeKind(next as ShapeKind)}\n />\n </label>\n ) : null}\n {shape.kind === 'void' ? (\n <p className=\"eyeon-map-rail__hint\">\n Open to Below looks through to the floor below — walkways and\n floor plates are cut out so the lower level shows through.\n </p>\n ) : null}\n </>\n )}\n\n {onChangeLevel && levels.length > 0 ? (\n <>\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">Floor</span>\n <div className=\"eyeon-map-assign__floor\">\n <ModernSelect\n ariaLabel=\"Floor\"\n value={String(shape.levelId)}\n disabled={!canEdit}\n searchable={false}\n options={levels.map((level) => ({\n value: String(level.id),\n label: level.name,\n }))}\n onChange={(next) => {\n if (!next) return;\n setLevelError(onChangeLevel(Number(next)));\n }}\n />\n </div>\n </div>\n {levelError ? (\n <p className=\"eyeon-map-rail__hint\" style={{ color: '#b91c1c' }}>\n {levelError}\n </p>\n ) : null}\n </>\n ) : null}\n\n {canEdit && (copyButton || onDelete) ? (\n <div className=\"eyeon-map-assign__actions\">\n {copyButton}\n {onDelete ? (\n <button\n type=\"button\"\n className=\"eyeon-map-assign__unassign\"\n onClick={() => onDelete()}\n >\n Delete\n </button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n","import React, { Suspense } from 'react';\nimport type {\n DeviceType,\n MapViewerHost,\n PublishedDocument,\n} from '../../core';\nimport { MapViewer } from '../../viewer/MapViewer';\nimport type { CameraViewSnapshot } from '../../viewer/components/CameraRig';\n\nexport function PreviewOverlay({\n document,\n host = 'PORTAL_ASSIGN',\n onSelectShape,\n selectedShapeId,\n selectedShapeIds,\n hoveredShapeId,\n focusNonce,\n activeLevelId,\n onActiveLevelChange,\n routeOnSelect,\n imageProxyUrl,\n device,\n captureCamera,\n onCameraChange,\n onCameraReset,\n}: {\n document: PublishedDocument;\n /** Assign mode and public website hide search. */\n host?: MapViewerHost;\n onSelectShape?: (shapeId: number | null, opts?: { additive?: boolean }) => void;\n selectedShapeId?: number | null;\n selectedShapeIds?: number[];\n hoveredShapeId?: number | null;\n focusNonce?: number;\n activeLevelId?: number | null;\n onActiveLevelChange?: (levelId: number) => void;\n /** Default true (public navigate). False when assigning in PORTAL. */\n routeOnSelect?: boolean;\n /** Without this the outdoor SVG is fetched cross-origin and CORS blocks it. */\n imageProxyUrl?: string | null;\n device?: DeviceType;\n captureCamera?: boolean;\n onCameraChange?: (view: CameraViewSnapshot) => void;\n onCameraReset?: () => void;\n}) {\n return (\n <div className=\"eyeon-map-preview\">\n <Suspense fallback={<div className=\"eyeon-map-preview__loading\">Loading preview…</div>}>\n {/* Viewer chrome stays on the canvas — never in the Map options rail. */}\n <MapViewer\n document={document}\n host={host}\n onSelectShape={onSelectShape}\n selectedShapeId={selectedShapeId}\n selectedShapeIds={selectedShapeIds}\n hoveredShapeId={hoveredShapeId}\n focusNonce={focusNonce}\n activeLevelId={activeLevelId}\n onActiveLevelChange={onActiveLevelChange}\n routeOnSelect={routeOnSelect}\n imageProxyUrl={imageProxyUrl}\n device={device}\n captureCamera={captureCamera}\n onCameraChange={onCameraChange}\n onCameraReset={onCameraReset}\n />\n </Suspense>\n </div>\n );\n}\n","export type ShapeSelectOpts = { additive?: boolean };\n\n/** Plain click replaces; Shift-click toggles the id in the set. */\nexport function nextSelectedShapeIds(\n current: number[],\n id: number | null,\n opts?: ShapeSelectOpts,\n): number[] {\n if (id == null) return [];\n if (!opts?.additive) return [id];\n if (current.includes(id)) return current.filter((item) => item !== id);\n return [...current, id];\n}\n","import type {\n CmConnector,\n CmResponsiveOverride,\n MapAssignRetailer,\n PublishedDocument,\n} from '../core';\nimport { compileDocument } from '../core';\nimport type { EditorDraftState } from './draftOps';\n\nexport function compileEditorPreview(\n draft: EditorDraftState,\n extras?: {\n revisionId?: number;\n revisionNumber?: number;\n connectors?: CmConnector[];\n publishedAt?: string;\n retailers?: MapAssignRetailer[];\n responsiveOverrides?: CmResponsiveOverride[];\n },\n): PublishedDocument {\n const outdoor = draft.levels.find((level) => level.kind === 'outdoor');\n return compileDocument({\n revisionId: extras?.revisionId ?? 0,\n revisionNumber: extras?.revisionNumber ?? 0,\n centerId: draft.centerId,\n mapId: draft.mapId,\n theme: draft.theme,\n baseSvgUrl: draft.baseSvgUrl ?? outdoor?.sourceSvgUrl ?? null,\n baseViewbox: outdoor?.sourceViewbox ?? null,\n buildings: draft.buildings,\n levels: draft.levels,\n shapes: draft.shapes.filter((s) => !s.orphanedAt),\n assignments: draft.assignments,\n anchors: draft.anchors,\n edges: draft.edges,\n connectors: extras?.connectors ?? draft.connectors ?? [],\n amenities: draft.amenities,\n responsiveOverrides:\n extras?.responsiveOverrides ?? draft.responsiveOverrides ?? [],\n publishedAt: extras?.publishedAt,\n retailers: extras?.retailers,\n /** Prefer already-resolved CDN URLs on draft levels (outdoor SVG). */\n resolveSvgUrl: (key) => {\n if (!key) return null;\n const match = draft.levels.find(\n (l) => l.sourceSvgKey === key || l.sourceSvgUrl === key,\n );\n return match?.sourceSvgUrl ?? key;\n },\n });\n}\n","import type { DeviceType } from '../core';\n\nexport type RestoredEditorSection = {\n section: 'edit-map' | 'wayfinding' | 'map-responsiveness';\n levelId: number | null;\n device?: DeviceType;\n};\n\nconst memory = new Map<number, RestoredEditorSection>();\nconst MAX_REMEMBERED_MAPS = 20;\n\nconst storageKey = (mapId: number) => `eyeon-map-editor-section:${mapId}`;\n\nfunction dropLegacyStorage(mapId: number): void {\n try {\n sessionStorage.removeItem(storageKey(mapId));\n } catch {\n /* private mode / SSR */\n }\n}\n\n/**\n * Keep Edit Map / Wayfinding / Map Responsiveness open across an in-page remount (save).\n * Memory only — a full page refresh returns to Map options.\n */\nexport function markEditorSection(\n mapId: number,\n restored: RestoredEditorSection,\n): void {\n memory.delete(mapId);\n memory.set(mapId, restored);\n if (memory.size > MAX_REMEMBERED_MAPS) {\n const oldest = memory.keys().next().value;\n if (oldest != null) memory.delete(oldest);\n }\n dropLegacyStorage(mapId);\n}\n\nexport function peekEditorSection(mapId: number): RestoredEditorSection | null {\n dropLegacyStorage(mapId);\n return memory.get(mapId) ?? null;\n}\n\nexport function clearEditorSection(mapId: number): void {\n memory.delete(mapId);\n dropLegacyStorage(mapId);\n}\n","const memory = new Set<number>();\n\nconst storageKey = (mapId: number) => `eyeon-map-return-floors:${mapId}`;\n\nfunction storage(): Storage | null {\n try {\n return sessionStorage;\n } catch {\n return null;\n }\n}\n\n/** Remember to reopen the floors list after a remount (reload after add). */\nexport function markReturnToFloorsList(mapId: number): void {\n memory.add(mapId);\n storage()?.setItem(storageKey(mapId), '1');\n}\n\nexport function consumeReturnToFloorsList(mapId: number): boolean {\n const stored = storage()?.getItem(storageKey(mapId)) === '1';\n const pending = memory.has(mapId) || stored;\n clearReturnToFloorsList(mapId);\n return pending;\n}\n\nexport function clearReturnToFloorsList(mapId: number): void {\n memory.delete(mapId);\n storage()?.removeItem(storageKey(mapId));\n}\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport type {\n BatchOp,\n CmShapeAssignment,\n DeviceType,\n MapAssignKiosk,\n MapAssignRetailer,\n MapEditorHost,\n PublishedDocument,\n ResponsiveCamera,\n ShapeKind,\n Vec3,\n} from '../core';\nimport type { ShapeGeometry, ShapeLabel, ShapeStyle } from '../core';\nimport { assignmentVisualPatch, applyBulkAssignPatch, DEFAULT_LABEL_ALIGN, emptyResponsiveOverrideInput, emptyShapeAssignment, geometryBBox, hasBuildingFloors, MAP_NO_FLOORS_MESSAGE, mergeResponsiveOverrides, mergeTheme, nextLowerBuildingFloor, parseShapeAssignment, poseToResponsiveFields, RESPONSIVE_DEVICE_TABS, responsiveSlotKey, viewerLevelIdAfterShapeSelect } from '../core';\nimport type { CameraViewSnapshot } from '../viewer/components/CameraRig';\nimport type { BulkAssignPatch } from '../core';\nimport { MapControls } from '../viewer/ui/MapControls';\nimport {\n editorFloorControlLevels,\n isEditorSection,\n levelIdOnEnterDefaultMap,\n levelIdOnEnterEditMap,\n levelIdOnEnterWayfinding,\n portalCenterSurface,\n wayfindingOutdoorReadOnly,\n} from './portalSurface';\nimport { EditorCanvas, type EditorCanvasHandle } from './canvas/EditorCanvas';\nimport {\n resolvedConnectorKind,\n type VerticalRailKind,\n} from './connectorAssignments';\nimport {\n applyDraftOps,\n coalesceDraftOp,\n orderBatchOpsForPersist,\n shapeKeyTakenOnLevel,\n type EditorDraftState,\n} from './draftOps';\nimport { ConnectorAssign } from './panels/ConnectorAssign';\nimport { LeftRail, type RailSection } from './panels/LeftRail';\nimport type { CreateLevelInput, UpdateLevelInput } from './panels/FloorsPanel';\nimport { CatalogKioskForm } from './panels/CatalogKioskForm';\nimport { Inspector } from './panels/Inspector';\nimport { PreviewOverlay } from './panels/PreviewOverlay';\nimport { isAssignableKind } from './railAssignments';\nimport {\n catalogKioskShapeOptions,\n isKioskScreenKind,\n shapeIdForCatalogKiosk,\n} from './railKiosks';\nimport { allocShapeKey, copyShapeToLevelOps, liveShapeKeysOnLevel } from './shapeCopy';\nimport { nextSelectedShapeIds, type ShapeSelectOpts } from './shapeSelection';\nimport { compileEditorPreview } from './previewDocument';\nimport { geometryForLabelText, DEFAULT_LABEL_SIZE } from './labelText';\nimport {\n DEFAULT_ENTRANCE_SIZE,\n canonicalizeEntranceLabel,\n geometryForEntranceIcon,\n isEntranceIcon,\n} from './entranceIcon';\nimport {\n cloneHistorySnapshot,\n emptyEditorHistory,\n isEditableTypingTarget,\n isEditorRedoHotkey,\n isEditorUndoHotkey,\n pushEditorHistory,\n redoEditorHistory,\n undoEditorHistory,\n type EditorHistorySnapshot,\n} from './history';\nimport {\n connectRouteAnchorToRouteOps,\n connectShapeToRouteOps,\n deleteRouteAnchorOps,\n ensureShapeRouteAnchorOps,\n insertJunctionOnWalkEdgeOps,\n linkRouteAnchorsOp,\n showsWayfinding,\n walkEdgeExists,\n} from './routeStubs';\nimport {\n clearEditorSection,\n markEditorSection,\n peekEditorSection,\n} from './editorSectionReturn';\nimport {\n clearReturnToFloorsList,\n consumeReturnToFloorsList,\n markReturnToFloorsList,\n} from './floorsListReturn';\nimport {\n EditorHistoryButtons,\n EditorToolButtons,\n nextEditorTool,\n toolHint,\n type EditorTool,\n} from './tools';\nimport './editor.css';\n\nexport type { EditorDraftState } from './draftOps';\nexport type { MapEditorHost } from '../core';\nexport type { EditorTool } from './tools';\n\nexport type ResponsiveOverrideInput = {\n levelId: number;\n device: DeviceType;\n camera: ResponsiveCamera;\n controls: Vec3;\n};\n\nexport interface MapEditorProps {\n /**\n * Where the editor is embedded. `PORTAL` (default) always includes Map\n * options (LeftRail: Floors, Kiosks, Settings, plus Edit Map — never viewer\n * chrome). Default center is MapViewer (click-to-assign, no grid). Edit\n * Map swaps in the geometry canvas and editor grid. `WEBSITE` is canvas +\n * toolbar only — public sites should use `MapViewer`, not this editor.\n */\n host?: MapEditorHost;\n draft: EditorDraftState;\n webApiURI: string;\n canEdit?: boolean;\n canFloors?: boolean;\n canSettings?: boolean;\n canResponsiveness?: boolean;\n onBatch?: (ops: BatchOp[]) => Promise<void>;\n onPublish?: () => Promise<void>;\n onSaveResponsive?: (items: ResponsiveOverrideInput[]) => Promise<void>;\n /** Reload the draft from the database after discarding local edits. */\n onDiscard?: () => Promise<void> | void;\n onImportSvg?: (levelId: number, file: File) => Promise<void>;\n onCreateLevel?: (input: CreateLevelInput) => Promise<number | void>;\n onUpdateLevel?: (input: UpdateLevelInput) => Promise<void>;\n onDeleteLevel?: (levelId: number) => Promise<void>;\n onReorderLevels?: (orderedIds: number[]) => Promise<void>;\n onAutoroute?: (levelId: number) => Promise<void>;\n previewDocument?: PublishedDocument | null;\n /**\n * Center retailers for the default-map assign form (v1 retailer dropdown).\n */\n retailers?: MapAssignRetailer[];\n /** Center kiosks for leftover ID-only assignments; new kiosks are named in Assign. */\n kiosks?: MapAssignKiosk[];\n /**\n * Media proxy base for remote http(s) media, same contract as v1\n * `IMAGE_PROXY_URL`. Required whenever the outdoor SVG is served from an\n * origin that does not send CORS headers. Inlined amenity data URLs skip it.\n */\n imageProxyUrl?: string | null;\n className?: string;\n /** Quiet extra actions under the left rail (e.g. developer Classic Map). */\n sidebarFooter?: ReactNode;\n /** PORTAL host: pin \"Use Classic Map\" at the bottom of the left rail. */\n onUseClassicMap?: () => void;\n}\n\nexport function MapEditor({\n host = 'PORTAL',\n draft,\n canEdit = true,\n canFloors = true,\n canSettings = true,\n canResponsiveness = false,\n onBatch,\n onPublish,\n onSaveResponsive,\n onDiscard,\n onImportSvg,\n onCreateLevel,\n onUpdateLevel,\n onDeleteLevel,\n onReorderLevels,\n onAutoroute,\n previewDocument,\n retailers = [],\n kiosks = [],\n imageProxyUrl,\n className,\n sidebarFooter,\n onUseClassicMap,\n}: MapEditorProps) {\n const restoredSection = peekEditorSection(draft.mapId);\n const [section, setSection] = useState<RailSection | null>(() => {\n if (consumeReturnToFloorsList(draft.mapId)) return 'floors';\n return restoredSection?.section ?? null;\n });\n const [responsiveDevice, setResponsiveDevice] = useState<DeviceType>(\n () => restoredSection?.device ?? 'admin_portal',\n );\n const [pendingResponsive, setPendingResponsive] = useState<\n Record<string, ResponsiveOverrideInput>\n >({});\n const [previewEpoch, setPreviewEpoch] = useState(0);\n const [activeLevelId, setActiveLevelId] = useState<number | null>(() => {\n const restoredLevel = peekEditorSection(draft.mapId)?.levelId;\n if (\n restoredLevel != null &&\n draft.levels.some((level) => level.id === restoredLevel)\n ) {\n return restoredLevel;\n }\n return levelIdOnEnterEditMap(draft.levels);\n });\n const [selectedShapeIds, setSelectedShapeIds] = useState<number[]>([]);\n const [selectedCatalogKioskId, setSelectedCatalogKioskId] = useState<\n number | null\n >(null);\n const selectedShapeId = selectedShapeIds[0] ?? null;\n const [hoveredShapeId, setHoveredShapeId] = useState<number | null>(null);\n const [listFocusNonce, setListFocusNonce] = useState(0);\n const [selectedAnchorIds, setSelectedAnchorIds] = useState<number[]>([]);\n const [tool, setTool] = useState<EditorTool>('select');\n const [editVersion, setEditVersion] = useState(0);\n const [needsPublish, setNeedsPublish] = useState(false);\n const [saving, setSaving] = useState(false);\n const [history, setHistory] = useState(emptyEditorHistory);\n const [routeDraftActive, setRouteDraftActive] = useState(false);\n const canvasRef = useRef<EditorCanvasHandle>(null);\n const historyRef = useRef(history);\n const pendingOps = useRef<BatchOp[]>([]);\n const nextTempId = useRef(-1);\n const historyGestureRef = useRef(false);\n historyRef.current = history;\n const showMapOptions = host === 'PORTAL';\n const centerSurface = portalCenterSurface(host, section);\n const isEditMap = centerSurface === 'editor';\n const historyMetaRef = useRef({\n isEditMap,\n selectedShapeId,\n selectedAnchorIds,\n });\n historyMetaRef.current = { isEditMap, selectedShapeId, selectedAnchorIds };\n\n useEffect(() => {\n pendingOps.current = [];\n nextTempId.current = -1;\n historyGestureRef.current = false;\n setEditVersion(0);\n setNeedsPublish(false);\n setPendingResponsive({});\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n }, [draft.mapId, draft.centerId]);\n\n useEffect(() => {\n if (\n section === 'edit-map' ||\n section === 'wayfinding' ||\n section === 'map-responsiveness'\n ) {\n markEditorSection(draft.mapId, {\n section,\n levelId: activeLevelId,\n device: section === 'map-responsiveness' ? responsiveDevice : undefined,\n });\n return;\n }\n clearEditorSection(draft.mapId);\n }, [activeLevelId, draft.mapId, responsiveDevice, section]);\n\n // Levels can arrive after the first render, or the active one can be deleted.\n // Default map / Wayfinding must not stay on Outdoor — that hides floors.\n useEffect(() => {\n const exists = draft.levels.some((level) => level.id === activeLevelId);\n if (!exists) {\n setActiveLevelId(\n section === 'wayfinding'\n ? levelIdOnEnterWayfinding(draft.levels)\n : isEditorSection(section)\n ? levelIdOnEnterEditMap(draft.levels)\n : levelIdOnEnterDefaultMap(draft.levels),\n );\n return;\n }\n if (section === 'edit-map') return;\n const active = draft.levels.find((level) => level.id === activeLevelId);\n if (active?.kind !== 'outdoor') return;\n const next =\n section === 'wayfinding'\n ? levelIdOnEnterWayfinding(draft.levels)\n : levelIdOnEnterDefaultMap(draft.levels);\n if (next != null && next !== activeLevelId) setActiveLevelId(next);\n }, [draft.levels, activeLevelId, section]);\n\n const workingDraft = useMemo(\n () => applyDraftOps(draft, pendingOps.current),\n [draft, editVersion],\n );\n\n const theme = useMemo(\n () => mergeTheme(workingDraft.theme),\n [workingDraft.theme],\n );\n\n const cameraDirty = Object.keys(pendingResponsive).length > 0;\n const dirty = pendingOps.current.length > 0 || needsPublish || cameraDirty;\n const canPersist =\n !saving && dirty && (canEdit || (canResponsiveness && cameraDirty));\n const isResponsiveness = section === 'map-responsiveness';\n const activeLevel = workingDraft.levels.find((l) => l.id === activeLevelId) ?? null;\n const outdoorViewOnly = wayfindingOutdoorReadOnly(section, activeLevel);\n const canDrawOnCanvas = canEdit && !outdoorViewOnly;\n const outdoorLevel = workingDraft.levels.find((l) => l.kind === 'outdoor') ?? null;\n const outdoorShapes =\n outdoorLevel && activeLevel?.kind === 'floor'\n ? workingDraft.shapes.filter((s) => s.levelId === outdoorLevel.id)\n : [];\n const levelShapes = workingDraft.shapes.filter((s) => s.levelId === activeLevelId);\n const openingUnderlayShapes = useMemo(() => {\n const levelsWithShapes = workingDraft.levels.map((lvl) => ({\n ...lvl,\n shapes: workingDraft.shapes.filter((shape) => shape.levelId === lvl.id),\n }));\n const lower = nextLowerBuildingFloor(levelsWithShapes, activeLevelId);\n if (!lower) return [];\n return workingDraft.shapes.filter(\n (shape) => shape.levelId === lower.id && !shape.orphanedAt,\n );\n }, [workingDraft.levels, workingDraft.shapes, activeLevelId]);\n const mergedResponsiveOverrides = useMemo(\n () =>\n mergeResponsiveOverrides(\n workingDraft.responsiveOverrides ?? [],\n Object.values(pendingResponsive),\n ),\n [pendingResponsive, workingDraft.responsiveOverrides],\n );\n const compiledPreview = useMemo(\n () =>\n compileEditorPreview(workingDraft, {\n revisionId: previewDocument?.revisionId,\n revisionNumber: previewDocument?.revisionNumber,\n connectors: workingDraft.connectors,\n publishedAt: previewDocument?.publishedAt,\n retailers,\n responsiveOverrides: mergedResponsiveOverrides,\n }),\n [workingDraft, previewDocument, retailers, mergedResponsiveOverrides],\n );\n const levelAnchors = useMemo(\n () => workingDraft.anchors.filter((a) => a.levelId === activeLevelId),\n [activeLevelId, workingDraft.anchors],\n );\n const levelEdges = useMemo(() => {\n const anchorsById = new Map(\n workingDraft.anchors.map((anchor) => [anchor.id, anchor]),\n );\n return workingDraft.edges.filter(\n (edge) => anchorsById.get(edge.fromAnchorId)?.levelId === activeLevelId,\n );\n }, [activeLevelId, workingDraft.anchors, workingDraft.edges]);\n const selectedShape =\n workingDraft.shapes.find((s) => s.id === selectedShapeId) ?? null;\n const selectedAssignment =\n workingDraft.assignments.find((a) => a.shapeId === selectedShapeId) ?? null;\n\n const takeSnapshot = (): EditorHistorySnapshot =>\n cloneHistorySnapshot({\n ops: pendingOps.current,\n nextTempId: nextTempId.current,\n selectedShapeId: historyMetaRef.current.selectedShapeId,\n selectedAnchorIds: historyMetaRef.current.selectedAnchorIds,\n });\n\n const applySnapshot = (snapshot: EditorHistorySnapshot) => {\n pendingOps.current = snapshot.ops;\n nextTempId.current = snapshot.nextTempId;\n setSelectedShapeIds(\n snapshot.selectedShapeId == null ? [] : [snapshot.selectedShapeId],\n );\n setSelectedAnchorIds(snapshot.selectedAnchorIds);\n setEditVersion((n) => n + 1);\n };\n\n const recordHistoryStep = (mode: 'step' | 'gesture' | 'none') => {\n if (!historyMetaRef.current.isEditMap || mode === 'none') return;\n if (mode === 'gesture') {\n if (historyGestureRef.current) return;\n historyGestureRef.current = true;\n }\n const next = pushEditorHistory(historyRef.current, takeSnapshot());\n historyRef.current = next;\n setHistory(next);\n };\n\n const queueOp = useCallback(\n (op: BatchOp, historyMode: 'step' | 'gesture' | 'none' = 'step'): number | null => {\n recordHistoryStep(historyMode);\n let next = op;\n if (next.op === 'upsert_shape' && next.shape.id == null) {\n const id = nextTempId.current--;\n next = { ...next, shape: { ...next.shape, id } };\n }\n if (next.op === 'upsert_anchor' && next.anchor.id == null) {\n const id = nextTempId.current--;\n next = { ...next, anchor: { ...next.anchor, id } };\n }\n if (next.op === 'upsert_edge' && next.edge.id == null) {\n const id = nextTempId.current--;\n next = { ...next, edge: { ...next.edge, id } };\n }\n if (next.op === 'upsert_connector' && next.connector.id == null) {\n const id = nextTempId.current--;\n next = { ...next, connector: { ...next.connector, id } };\n }\n pendingOps.current = coalesceDraftOp(pendingOps.current, next);\n setEditVersion((n) => n + 1);\n if (next.op === 'upsert_shape') return next.shape.id ?? null;\n if (next.op === 'upsert_anchor') return next.anchor.id ?? null;\n if (next.op === 'upsert_edge') return next.edge.id ?? null;\n if (next.op === 'upsert_connector') return next.connector.id ?? null;\n return null;\n },\n [],\n );\n\n const endHistoryGesture = useCallback(() => {\n historyGestureRef.current = false;\n }, []);\n\n const undo = useCallback(() => {\n if (!historyMetaRef.current.isEditMap || !canEdit || saving) return;\n const routeKind = canvasRef.current?.consumeRouteUndo();\n if (routeKind === 'clear-only') return;\n const next = undoEditorHistory(historyRef.current, takeSnapshot());\n if (!next) return;\n historyGestureRef.current = false;\n applySnapshot(next.restored);\n historyRef.current = next.history;\n setHistory(next.history);\n }, [canEdit, saving]);\n\n const redo = useCallback(() => {\n if (!historyMetaRef.current.isEditMap || !canEdit || saving) return;\n const next = redoEditorHistory(historyRef.current, takeSnapshot());\n if (!next) return;\n historyGestureRef.current = false;\n applySnapshot(next.restored);\n historyRef.current = next.history;\n setHistory(next.history);\n }, [canEdit, saving]);\n\n const handleSaveChanges = useCallback(async () => {\n if (saving) return;\n const ops = canEdit ? orderBatchOpsForPersist(pendingOps.current) : [];\n const cameraItems = canResponsiveness ? Object.values(pendingResponsive) : [];\n if (!ops.length && !needsPublish && !cameraItems.length) return;\n if (!canEdit && !cameraItems.length) return;\n pendingOps.current = [];\n setEditVersion((n) => n + 1);\n setSaving(true);\n let persisted = !ops.length;\n const savedCamera = cameraItems;\n try {\n if (cameraItems.length && onSaveResponsive) {\n await onSaveResponsive(cameraItems);\n setPendingResponsive({});\n }\n if (ops.length && onBatch) {\n await onBatch(ops);\n persisted = true;\n }\n await onPublish?.();\n setNeedsPublish(false);\n historyGestureRef.current = false;\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n } catch {\n if (savedCamera.length) {\n setPendingResponsive((prev) =>\n Object.keys(prev).length ? prev : Object.fromEntries(\n savedCamera.map((item) => [\n responsiveSlotKey(item.levelId, item.device),\n item,\n ]),\n ),\n );\n }\n if (!persisted) {\n pendingOps.current = ops;\n setEditVersion((n) => n + 1);\n } else {\n setNeedsPublish(true);\n }\n } finally {\n setSaving(false);\n }\n }, [\n canEdit,\n canResponsiveness,\n needsPublish,\n onBatch,\n onPublish,\n onSaveResponsive,\n pendingResponsive,\n saving,\n ]);\n\n const handleDiscardChanges = useCallback(async () => {\n if (saving || !dirty) return;\n if (!canEdit && !cameraDirty) return;\n if (\n !window.confirm(\n 'Discard unsaved changes and reload the map from the database?',\n )\n ) {\n return;\n }\n canvasRef.current?.consumeRouteUndo();\n pendingOps.current = [];\n nextTempId.current = -1;\n historyGestureRef.current = false;\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n setNeedsPublish(false);\n setPendingResponsive({});\n setPreviewEpoch((n) => n + 1);\n setEditVersion((n) => n + 1);\n setSaving(true);\n try {\n await onDiscard?.();\n } finally {\n setSaving(false);\n }\n }, [cameraDirty, canEdit, dirty, onDiscard, saving]);\n\n const handleSectionChange = useCallback(\n (next: RailSection | null) => {\n // Leave item-options (level 3) whenever the rail module changes so\n // Stores / Amenities / … always open on their list (level 2).\n setSelectedShapeIds([]);\n setSelectedCatalogKioskId(null);\n setSelectedAnchorIds([]);\n setHoveredShapeId(null);\n if (isEditorSection(section) && !isEditorSection(next)) {\n setTool('select');\n historyGestureRef.current = false;\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n setActiveLevelId(levelIdOnEnterDefaultMap(draft.levels));\n } else if (next === 'edit-map') {\n setTool('select');\n setActiveLevelId(levelIdOnEnterEditMap(draft.levels));\n } else if (next === 'wayfinding') {\n setTool('select');\n setActiveLevelId(levelIdOnEnterWayfinding(draft.levels));\n } else if (next === 'map-responsiveness') {\n setActiveLevelId(levelIdOnEnterDefaultMap(draft.levels));\n }\n setSection(next);\n },\n [draft.levels, section],\n );\n\n const handleCanvasLevelChange = (levelId: number) => {\n if (levelId === activeLevelId) return;\n setSelectedShapeIds([]);\n setSelectedAnchorIds([]);\n setActiveLevelId(levelId);\n const nextLevel = workingDraft.levels.find((level) => level.id === levelId);\n if (wayfindingOutdoorReadOnly(section, nextLevel)) setTool('select');\n };\n\n useEffect(() => {\n if (!isEditMap || !canEdit) return;\n const onKey = (e: KeyboardEvent) => {\n if (isEditableTypingTarget(e.target)) return;\n if (isEditorUndoHotkey(e)) {\n e.preventDefault();\n undo();\n return;\n }\n if (isEditorRedoHotkey(e)) {\n e.preventDefault();\n redo();\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [canEdit, isEditMap, redo, undo]);\n\n const handleSelectShape = useCallback(\n (id: number | null, opts?: ShapeSelectOpts) => {\n const shape = id == null ? null : workingDraft.shapes.find((s) => s.id === id);\n const additive =\n Boolean(opts?.additive) &&\n section !== 'edit-map' &&\n section !== 'wayfinding' &&\n (shape == null || isAssignableKind(shape.kind));\n setSelectedShapeIds((prev) => nextSelectedShapeIds(prev, id, { additive }));\n if (id != null) setSelectedCatalogKioskId(null);\n setHoveredShapeId(null);\n if (id == null) return;\n if (shape && !additive) {\n const nextLevelId =\n section === 'edit-map' || section === 'wayfinding'\n ? shape.levelId\n : viewerLevelIdAfterShapeSelect(\n workingDraft.levels,\n activeLevelId,\n shape.levelId,\n );\n setActiveLevelId(nextLevelId);\n }\n if (additive) return;\n setSection((current) => {\n if (\n current === 'edit-map' ||\n current === 'wayfinding' ||\n current === 'map-responsiveness' ||\n current === 'unassigned' ||\n current === 'escalators' ||\n current === 'elevators'\n ) {\n return current;\n }\n const connectorKind = shape\n ? resolvedConnectorKind(shape, workingDraft.anchors, workingDraft.connectors)\n : null;\n if (connectorKind === 'escalator') return 'escalators';\n if (connectorKind === 'elevator') return 'elevators';\n if (shape?.kind === 'unit' || shape?.kind === 'parking_zone') return 'stores';\n if (shape?.kind === 'amenity') return 'amenities';\n if (shape?.kind === 'kiosk_screen') return 'kiosks';\n return 'selection';\n });\n },\n [\n activeLevelId,\n section,\n workingDraft.anchors,\n workingDraft.connectors,\n workingDraft.levels,\n workingDraft.shapes,\n ],\n );\n\n const handleToolChange = (next: EditorTool) => {\n const resolved = nextEditorTool(tool, next);\n setTool(resolved);\n if (!showsWayfinding(resolved, section === 'wayfinding')) setSelectedAnchorIds([]);\n };\n\n const handleRenameShape = (key: string) => {\n if (!selectedShape || !canEdit) return;\n if (\n shapeKeyTakenOnLevel(\n workingDraft.shapes,\n selectedShape.id,\n selectedShape.levelId,\n key,\n )\n ) {\n return;\n }\n queueOp({\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key,\n kind: selectedShape.kind,\n },\n });\n };\n\n const handleChangeLevel = (levelId: number): string | null => {\n if (!selectedShape || !canEdit) return null;\n if (levelId === selectedShape.levelId) return null;\n if (\n shapeKeyTakenOnLevel(\n workingDraft.shapes,\n selectedShape.id,\n levelId,\n selectedShape.key,\n )\n ) {\n return 'That ID is already used on this floor.';\n }\n const ops: BatchOp[] = [\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n },\n },\n ];\n for (const anchor of workingDraft.anchors) {\n if (anchor.shapeId !== selectedShape.id || anchor.levelId === levelId) {\n continue;\n }\n ops.push({\n op: 'upsert_anchor',\n anchor: {\n id: anchor.id,\n levelId,\n shapeId: anchor.shapeId,\n kind: anchor.kind,\n x: anchor.x,\n y: anchor.y,\n connectorId: anchor.connectorId,\n },\n });\n }\n queueOpBatch(ops);\n setActiveLevelId(levelId);\n return null;\n };\n\n const handleCopyToLevel = (levelId: number): string | null => {\n if (!selectedShape || !canEdit) return null;\n const copied = copyShapeToLevelOps({\n shape: selectedShape,\n assignment: selectedAssignment,\n targetLevelId: levelId,\n shapes: workingDraft.shapes,\n allocId: () => nextTempId.current--,\n });\n if (!copied) return 'Pick a different floor.';\n queueOpBatch(copied.ops);\n setSelectedShapeIds([copied.shapeId]);\n setActiveLevelId(levelId);\n return null;\n };\n\n const handleDeleteShape = () => {\n if (!selectedShape || !canEdit) return;\n queueOp({ op: 'delete_shape', shapeId: selectedShape.id });\n setSelectedShapeIds([]);\n };\n\n const handleUpdateShapeGeometry = (\n shapeId: number,\n geometry: ShapeGeometry,\n opts?: { live?: boolean },\n ) => {\n if (!canDrawOnCanvas) return;\n const shape = workingDraft.shapes.find((s) => s.id === shapeId);\n if (!shape) return;\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: shape.id,\n levelId: shape.levelId,\n key: shape.key,\n kind: shape.kind,\n geometry,\n bbox: geometryBBox(geometry),\n geometryLocked: true,\n },\n },\n opts?.live ? 'gesture' : 'step',\n );\n };\n\n const handleUpdateLabel = (label: ShapeLabel, opts?: { live?: boolean }) => {\n if (!selectedShape || !canEdit) return;\n if (isEntranceIcon(selectedShape)) {\n const nextLabel =\n canonicalizeEntranceLabel({\n ...selectedShape,\n label,\n }) ?? label;\n const size = nextLabel.size ?? selectedShape.label.size ?? DEFAULT_ENTRANCE_SIZE;\n const sameLabel =\n size === (selectedShape.label.size ?? DEFAULT_ENTRANCE_SIZE) &&\n (nextLabel.rotate ?? 0) === (selectedShape.label.rotate ?? 0) &&\n (nextLabel.color ?? '') === (selectedShape.label.color ?? '') &&\n (nextLabel.imageKey ?? '') === (selectedShape.label.imageKey ?? '');\n if (sameLabel) {\n if (!opts?.live) endHistoryGesture();\n return;\n }\n const geometry = geometryForEntranceIcon(selectedShape.geometry, size);\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n origin: selectedShape.origin,\n sourceSvgId: selectedShape.sourceSvgId,\n label: nextLabel,\n geometry,\n bbox: geometryBBox(geometry),\n },\n },\n opts?.live ? 'gesture' : 'step',\n );\n if (!opts?.live) endHistoryGesture();\n return;\n }\n const size = label.size ?? selectedShape.label.size ?? DEFAULT_LABEL_SIZE;\n const sameLabel =\n (label.text ?? '') === (selectedShape.label.text ?? '') &&\n size === (selectedShape.label.size ?? DEFAULT_LABEL_SIZE) &&\n (label.rotate ?? 0) === (selectedShape.label.rotate ?? 0) &&\n (label.color ?? '') === (selectedShape.label.color ?? '') &&\n (label.align ?? DEFAULT_LABEL_ALIGN) ===\n (selectedShape.label.align ?? DEFAULT_LABEL_ALIGN);\n if (sameLabel) {\n if (!opts?.live) endHistoryGesture();\n return;\n }\n const geometry = geometryForLabelText(\n selectedShape.geometry,\n label.text ?? selectedShape.label.text ?? '',\n size,\n );\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n label,\n geometry,\n bbox: geometryBBox(geometry),\n },\n },\n opts?.live ? 'gesture' : 'step',\n );\n if (!opts?.live) endHistoryGesture();\n };\n\n const handleChangeKind = (kind: ShapeKind) => {\n if (!selectedShape || !canEdit) return;\n queueOp({\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind,\n },\n });\n };\n\n const handleSaveAssignment = (assignment: CmShapeAssignment) => {\n if (!selectedShape || !canEdit) return;\n const retailer = retailers.find((item) => item.id === assignment.retailerId);\n const visuals = assignmentVisualPatch(selectedShape, assignment, retailer);\n queueOp({ op: 'upsert_assignment', assignment });\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n style: visuals.style,\n label: visuals.label,\n },\n },\n 'none',\n );\n };\n\n const handleClearAssignment = () => {\n if (!selectedShape || !canEdit) return;\n queueOp({ op: 'delete_assignment', shapeId: selectedShape.id });\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n style: { ...selectedShape.style, fill: undefined },\n label: {\n ...selectedShape.label,\n text: undefined,\n imageKey: undefined,\n size: undefined,\n rotate: undefined,\n offsetX: undefined,\n offsetY: undefined,\n color: undefined,\n },\n },\n },\n 'none',\n );\n };\n\n const handleLinkCatalogKiosk = (kioskId: number, shapeId: number | null) => {\n if (!canEdit) return;\n const kiosk = kiosks.find((item) => item.id === kioskId);\n const previousShapeId = shapeIdForCatalogKiosk(\n kioskId,\n workingDraft.assignments,\n );\n const ops: BatchOp[] = [];\n const clearShape = (id: number) => {\n const shape = workingDraft.shapes.find((row) => row.id === id);\n if (!shape) return;\n ops.push({ op: 'delete_assignment', shapeId: id });\n ops.push({\n op: 'upsert_shape',\n shape: {\n id: shape.id,\n levelId: shape.levelId,\n key: shape.key,\n kind: shape.kind,\n style: { ...shape.style, fill: undefined },\n label: {\n ...shape.label,\n text: undefined,\n imageKey: undefined,\n size: undefined,\n rotate: undefined,\n offsetX: undefined,\n offsetY: undefined,\n color: undefined,\n },\n },\n });\n };\n if (previousShapeId != null && previousShapeId !== shapeId) {\n clearShape(previousShapeId);\n }\n if (shapeId == null) {\n if (ops.length) queueOpBatch(ops);\n return;\n }\n const shape = workingDraft.shapes.find((row) => row.id === shapeId);\n if (!shape || !isKioskScreenKind(shape.kind)) return;\n const existing = workingDraft.assignments.find((row) => row.shapeId === shapeId);\n const base = existing\n ? parseShapeAssignment(existing, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind);\n const assignment = parseShapeAssignment(\n {\n ...base,\n targetType: 'kiosk',\n kioskId,\n customLabel: kiosk?.name?.trim() || base.customLabel,\n retailerId: null,\n amenityId: null,\n layerType: 'kiosk',\n },\n shape.kind,\n );\n const visuals = assignmentVisualPatch(shape, assignment);\n ops.push({ op: 'upsert_assignment', assignment });\n ops.push({\n op: 'upsert_shape',\n shape: {\n id: shape.id,\n levelId: shape.levelId,\n key: shape.key,\n kind: shape.kind,\n style: visuals.style,\n label: visuals.label,\n },\n });\n queueOpBatch(ops);\n };\n\n const handleBulkAssign = (patch: BulkAssignPatch) => {\n if (!canEdit || selectedShapeIds.length < 2) return;\n const ops: BatchOp[] = [];\n for (const id of selectedShapeIds) {\n const shape = workingDraft.shapes.find((item) => item.id === id);\n if (!shape || !isAssignableKind(shape.kind)) continue;\n const existing = workingDraft.assignments.find((row) => row.shapeId === id);\n const current = existing\n ? parseShapeAssignment(existing, shape.kind)\n : emptyShapeAssignment(id, shape.kind);\n const patched = applyBulkAssignPatch(current, patch);\n const retailer = retailers.find((item) => item.id === patched.retailerId);\n const visuals = assignmentVisualPatch(shape, patched, retailer);\n ops.push({ op: 'upsert_assignment', assignment: patched });\n ops.push({\n op: 'upsert_shape',\n shape: {\n id: shape.id,\n levelId: shape.levelId,\n key: shape.key,\n kind: shape.kind,\n style: visuals.style,\n label: visuals.label,\n },\n });\n }\n if (ops.length) queueOpBatch(ops);\n };\n\n const queueOpBatch = (ops: BatchOp[]) => {\n ops.forEach((op, index) => queueOp(op, index === 0 ? 'step' : 'none'));\n };\n\n const selectedConnectorKind = selectedShape\n ? resolvedConnectorKind(selectedShape, workingDraft.anchors, workingDraft.connectors)\n : null;\n const connectorRailKind: VerticalRailKind | null =\n selectedConnectorKind === 'escalator' || selectedConnectorKind === 'elevator'\n ? selectedConnectorKind\n : null;\n\n const assignPanel = (\n <>\n <Inspector\n shape={selectedShape}\n assignment={selectedAssignment}\n amenities={workingDraft.amenities}\n retailers={retailers}\n kiosks={kiosks}\n levelShapeKeys={levelShapes\n .filter((s) => !selectedShapeIds.includes(s.id))\n .map((s) => s.key)}\n canEdit={canEdit}\n showAssignment={section !== 'edit-map'}\n emptyHint={\n section === 'stores' ||\n section === 'amenities' ||\n section === 'kiosks' ||\n section === 'unassigned' ||\n section === 'escalators' ||\n section === 'elevators'\n ? ''\n : undefined\n }\n selectedShapes={workingDraft.shapes.filter((s) =>\n selectedShapeIds.includes(s.id),\n )}\n selectedAssignments={workingDraft.assignments.filter((row) =>\n selectedShapeIds.includes(row.shapeId),\n )}\n onRename={handleRenameShape}\n onChangeKind={handleChangeKind}\n onChangeLevel={section === 'edit-map' ? handleChangeLevel : undefined}\n onCopyToLevel={section === 'edit-map' ? handleCopyToLevel : undefined}\n levels={editorFloorControlLevels('edit-map', workingDraft.levels)}\n onDelete={handleDeleteShape}\n onClearAssignment={handleClearAssignment}\n onUpdateLabel={handleUpdateLabel}\n onSaveAssignment={handleSaveAssignment}\n onBulkAssign={handleBulkAssign}\n storeDefaultColor={theme.STORE_DEFAULT_COLOR}\n storeTextColor={theme.STORE_TEXT_COLOR}\n amenityIconColor={theme.AMENITY_ICON_COLOR}\n kioskIconColor={theme.KIOSK_ICON_COLOR}\n />\n {section !== 'edit-map' && selectedShape && connectorRailKind ? (\n <ConnectorAssign\n shape={selectedShape}\n railKind={connectorRailKind}\n canEdit={canEdit}\n assignment={selectedAssignment}\n storeDefaultColor={theme.STORE_DEFAULT_COLOR}\n storeTextColor={theme.CONNECTOR_ICON_COLOR}\n ctx={{\n mapId: workingDraft.mapId,\n levels: workingDraft.levels,\n shapes: workingDraft.shapes,\n anchors: workingDraft.anchors,\n edges: workingDraft.edges,\n connectors: workingDraft.connectors,\n allocId: () => nextTempId.current--,\n }}\n onApplyOps={queueOpBatch}\n onSaveAssignment={handleSaveAssignment}\n />\n ) : null}\n </>\n );\n\n const selectedCatalogKiosk =\n selectedCatalogKioskId != null\n ? kiosks.find((item) => item.id === selectedCatalogKioskId) ?? null\n : null;\n const catalogKioskPanel = selectedCatalogKiosk ? (\n <CatalogKioskForm\n kiosk={selectedCatalogKiosk}\n shapeOptions={catalogKioskShapeOptions(workingDraft.shapes)}\n assignedShapeId={shapeIdForCatalogKiosk(\n selectedCatalogKiosk.id,\n workingDraft.assignments,\n )}\n canEdit={canEdit}\n onAssign={(shapeId) =>\n handleLinkCatalogKiosk(selectedCatalogKiosk.id, shapeId)\n }\n />\n ) : null;\n\n const handleCameraChange = useCallback(\n (view: CameraViewSnapshot) => {\n if (section !== 'map-responsiveness' || activeLevelId == null) return;\n const fields = poseToResponsiveFields({\n zoom: view.zoom,\n position: view.position,\n target: view.target,\n });\n setPendingResponsive((prev) => ({\n ...prev,\n [responsiveSlotKey(activeLevelId, responsiveDevice)]: {\n levelId: activeLevelId,\n device: responsiveDevice,\n camera: fields.camera,\n controls: fields.controls,\n },\n }));\n },\n [activeLevelId, responsiveDevice, section],\n );\n\n const handleCameraReset = useCallback(() => {\n if (activeLevelId == null) return;\n setPendingResponsive((prev) => ({\n ...prev,\n [responsiveSlotKey(activeLevelId, responsiveDevice)]:\n emptyResponsiveOverrideInput(activeLevelId, responsiveDevice),\n }));\n }, [activeLevelId, responsiveDevice]);\n\n const toolGroup = section === 'wayfinding' ? 'route' : section === 'edit-map' ? 'map' : undefined;\n\n return (\n <div className={`eyeon-map-editor eyeon-map-editor--${host} ${className ?? ''}`}>\n {showMapOptions ? (\n <LeftRail\n section={section}\n onSectionChange={handleSectionChange}\n draft={workingDraft}\n activeLevelId={activeLevelId}\n selectedShapeId={selectedShapeId}\n selectedShapeIds={selectedShapeIds}\n onSelectShape={handleSelectShape}\n onHoverShape={setHoveredShapeId}\n onListFocus={() => setListFocusNonce((n) => n + 1)}\n retailers={retailers}\n kiosks={kiosks}\n selectedCatalogKioskId={selectedCatalogKioskId}\n onSelectCatalogKiosk={setSelectedCatalogKioskId}\n canFloors={canFloors}\n canSettings={canSettings}\n canResponsiveness={canResponsiveness}\n onImportSvg={onImportSvg}\n onCreateLevel={\n onCreateLevel\n ? async (input) => {\n markReturnToFloorsList(draft.mapId);\n try {\n const id = await onCreateLevel(input);\n setSection('floors');\n clearReturnToFloorsList(draft.mapId);\n return id;\n } catch (error) {\n clearReturnToFloorsList(draft.mapId);\n throw error;\n }\n }\n : undefined\n }\n onUpdateLevel={onUpdateLevel}\n onDeleteLevel={onDeleteLevel}\n onReorderLevels={onReorderLevels}\n onAutoroute={onAutoroute}\n theme={theme}\n onThemeChange={(partial) => {\n if (!canSettings) return;\n queueOp(\n { op: 'update_theme', theme: { ...workingDraft.theme, ...partial } },\n 'none',\n );\n }}\n footer={sidebarFooter}\n catalogKioskPanel={catalogKioskPanel}\n onUseClassicMap={host === 'PORTAL' ? onUseClassicMap : undefined}\n assignPanel={assignPanel}\n editMapPanel={\n <>\n {toolHint(tool, 'map') ? (\n <p className=\"eyeon-map-rail__hint\">{toolHint(tool, 'map')}</p>\n ) : null}\n {assignPanel}\n </>\n }\n wayfindingPanel={\n <>\n {outdoorViewOnly ? (\n <p className=\"eyeon-map-rail__hint\">\n Outdoor is view-only in Wayfinding. Switch to a floor to edit routes.\n </p>\n ) : toolHint(tool, 'route') ? (\n <p className=\"eyeon-map-rail__hint\">{toolHint(tool, 'route')}</p>\n ) : null}\n <div className=\"eyeon-map-rail__tool-extras\">\n <div className=\"eyeon-map-rail__stat\">\n {levelAnchors.length} path points · {levelEdges.length} connections\n </div>\n {canFloors && activeLevelId != null && !outdoorViewOnly && (\n <div className=\"eyeon-map-rail__actions\">\n <button type=\"button\" onClick={() => onAutoroute?.(activeLevelId)}>\n Suggest walking paths\n </button>\n </div>\n )}\n </div>\n </>\n }\n mapResponsivenessPanel={\n <p className=\"eyeon-map-rail__hint\">\n Pan and zoom the map for each floor and device. Reset fits the\n whole floor so you can start from the default view. Save Changes\n stores that starting view for Admin Portal, website, and kiosk.\n </p>\n }\n />\n ) : null}\n\n <div className=\"eyeon-map-editor__center\">\n <div className=\"eyeon-map-editor__toolbar\">\n <div className=\"eyeon-map-editor__tools\">\n {isResponsiveness ? (\n <div className=\"eyeon-map-editor__device-tabs\" role=\"tablist\" aria-label=\"Device\">\n {RESPONSIVE_DEVICE_TABS.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={responsiveDevice === tab.id}\n className={\n responsiveDevice === tab.id\n ? 'eyeon-map-editor__device-tab is-active'\n : 'eyeon-map-editor__device-tab'\n }\n onClick={() => setResponsiveDevice(tab.id)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n ) : isEditMap ? (\n <EditorToolButtons\n tool={tool}\n onToolChange={handleToolChange}\n canEdit={canDrawOnCanvas}\n group={toolGroup}\n />\n ) : null}\n </div>\n <div className=\"eyeon-map-editor__actions\">\n {isEditMap ? (\n <EditorHistoryButtons\n canUndo={history.past.length > 0 || routeDraftActive}\n canRedo={history.future.length > 0}\n disabled={!canEdit || saving}\n onUndo={undo}\n onRedo={redo}\n />\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-editor__discard\"\n aria-label=\"Discard Changes\"\n onClick={() => void handleDiscardChanges()}\n disabled={!canPersist}\n >\n Discard Changes\n </button>\n <button\n type=\"button\"\n className=\"eyeon-map-editor__save\"\n aria-label={dirty ? 'Save Changes (unsaved edits)' : 'Save Changes'}\n onClick={() => void handleSaveChanges()}\n disabled={!canPersist}\n >\n {dirty ? (\n <span className=\"eyeon-map-editor__save-badge\" aria-hidden=\"true\" />\n ) : null}\n {saving ? 'Saving…' : 'Save Changes'}\n </button>\n </div>\n </div>\n\n {centerSurface === 'viewer' ? (\n <PreviewOverlay\n key={previewEpoch}\n document={compiledPreview}\n host={isResponsiveness ? 'WEBSITE' : 'PORTAL_ASSIGN'}\n selectedShapeId={isResponsiveness ? null : selectedShapeId}\n selectedShapeIds={isResponsiveness ? [] : selectedShapeIds}\n hoveredShapeId={isResponsiveness ? null : hoveredShapeId}\n focusNonce={isResponsiveness ? undefined : listFocusNonce}\n onSelectShape={isResponsiveness ? undefined : handleSelectShape}\n activeLevelId={activeLevelId}\n onActiveLevelChange={setActiveLevelId}\n routeOnSelect={false}\n imageProxyUrl={imageProxyUrl}\n device={isResponsiveness ? responsiveDevice : undefined}\n captureCamera={isResponsiveness}\n onCameraChange={isResponsiveness ? handleCameraChange : undefined}\n onCameraReset={isResponsiveness ? handleCameraReset : undefined}\n />\n ) : (\n <>\n <div className=\"eyeon-map-editor__canvas-wrap\">\n <EditorCanvas\n ref={canvasRef}\n level={activeLevel}\n shapes={levelShapes.filter((s) => !s.orphanedAt)}\n underlayShapes={outdoorShapes.filter((s) => !s.orphanedAt)}\n openingUnderlayShapes={openingUnderlayShapes}\n anchors={levelAnchors}\n edges={levelEdges}\n assignments={workingDraft.assignments}\n retailers={retailers}\n amenities={workingDraft.amenities}\n theme={theme}\n tool={tool}\n selectedShapeId={selectedShapeId}\n selectedAnchorIds={selectedAnchorIds}\n baseSvgUrl={workingDraft.baseSvgUrl ?? null}\n baseViewbox={outdoorLevel?.sourceViewbox ?? null}\n outdoorSvgUrl={\n outdoorLevel?.sourceSvgUrl ?? workingDraft.baseSvgUrl ?? null\n }\n imageProxyUrl={imageProxyUrl}\n emptyMessage={\n hasBuildingFloors(workingDraft.levels) || outdoorLevel\n ? undefined\n : MAP_NO_FLOORS_MESSAGE\n }\n interactiveOnly={activeLevel?.kind === 'outdoor'}\n showGrid\n routeMode={section === 'wayfinding'}\n readOnly={outdoorViewOnly}\n onUndo={undo}\n onRouteDraftActiveChange={setRouteDraftActive}\n onToolChange={handleToolChange}\n onSelectShape={handleSelectShape}\n onSelectAnchors={setSelectedAnchorIds}\n onCreateRouteSegment={(start, end) => {\n if (!activeLevel || !canDrawOnCanvas) return null;\n const id1 = nextTempId.current--;\n const id2 = nextTempId.current--;\n queueOpBatch([\n {\n op: 'upsert_anchor',\n anchor: {\n id: id1,\n levelId: activeLevel.id,\n x: start.x,\n y: start.y,\n kind: 'junction',\n },\n },\n {\n op: 'upsert_anchor',\n anchor: {\n id: id2,\n levelId: activeLevel.id,\n x: end.x,\n y: end.y,\n kind: 'junction',\n },\n },\n {\n op: 'upsert_edge',\n edge: {\n mapId: workingDraft.mapId,\n fromAnchorId: id1,\n toAnchorId: id2,\n kind: 'walk',\n },\n },\n ]);\n return id2;\n }}\n onCreateRoutePoint={(point, prevAnchorId) => {\n if (!activeLevel || !canDrawOnCanvas) return null;\n const id = queueOp({\n op: 'upsert_anchor',\n anchor: {\n levelId: activeLevel.id,\n x: point.x,\n y: point.y,\n kind: 'junction',\n },\n });\n if (\n id != null &&\n prevAnchorId != null &&\n !walkEdgeExists(levelEdges, prevAnchorId, id)\n ) {\n queueOp(\n {\n op: 'upsert_edge',\n edge: {\n mapId: workingDraft.mapId,\n fromAnchorId: prevAnchorId,\n toAnchorId: id,\n kind: 'walk',\n },\n },\n 'none',\n );\n }\n return id;\n }}\n onLinkRouteAnchors={(fromAnchorId, toAnchorId) => {\n if (!canDrawOnCanvas) return;\n const op = linkRouteAnchorsOp(\n workingDraft.mapId,\n fromAnchorId,\n toAnchorId,\n levelEdges,\n () => nextTempId.current--,\n );\n if (op) queueOp(op);\n }}\n onInsertRouteJunction={(edgeId, point) => {\n if (!canDrawOnCanvas || !activeLevel) return null;\n const edge = levelEdges.find((item) => item.id === edgeId);\n if (!edge) return null;\n const { ops, junctionId } = insertJunctionOnWalkEdgeOps({\n levelId: activeLevel.id,\n mapId: workingDraft.mapId,\n edge,\n point,\n allocId: () => nextTempId.current--,\n });\n if (ops.length) queueOpBatch(ops);\n return junctionId;\n }}\n onDeleteRouteAnchor={(anchorId) => {\n if (!canDrawOnCanvas) return;\n const ops = deleteRouteAnchorOps(\n anchorId,\n workingDraft.mapId,\n levelEdges,\n () => nextTempId.current--,\n );\n if (ops.length) queueOpBatch(ops);\n setSelectedAnchorIds((ids) =>\n ids.filter((id) => id !== anchorId),\n );\n }}\n onEnsureShapeAnchor={(shapeId, point) => {\n if (!canDrawOnCanvas) return null;\n const target = levelShapes.find((item) => item.id === shapeId);\n if (!target) return null;\n const { ops, anchorId } = ensureShapeRouteAnchorOps({\n shape: target,\n anchors: levelAnchors,\n allocId: () => nextTempId.current--,\n point,\n });\n if (ops.length) queueOpBatch(ops);\n setSelectedAnchorIds([anchorId]);\n return anchorId;\n }}\n onConnectShapeToRoute={(shapeId, from, drop, maxDist) => {\n if (!canDrawOnCanvas) return;\n const target = levelShapes.find((item) => item.id === shapeId);\n if (!target) return;\n const ops = connectShapeToRouteOps({\n shape: target,\n anchors: levelAnchors,\n edges: levelEdges,\n mapId: workingDraft.mapId,\n from,\n drop,\n maxDist,\n allocId: () => nextTempId.current--,\n });\n if (ops.length) queueOpBatch(ops);\n }}\n onConnectRouteAnchorToRoute={(anchorId, drop, maxDist) => {\n if (!canDrawOnCanvas) return;\n const anchor = levelAnchors.find((item) => item.id === anchorId);\n if (!anchor) return;\n const ops = connectRouteAnchorToRouteOps({\n anchor,\n anchors: levelAnchors,\n edges: levelEdges,\n mapId: workingDraft.mapId,\n drop,\n maxDist,\n allocId: () => nextTempId.current--,\n });\n if (ops.length) queueOpBatch(ops);\n }}\n onHistoryGestureEnd={endHistoryGesture}\n onMoveAnchor={(anchorId, x, y) => {\n if (!canDrawOnCanvas) return;\n const anchor = levelAnchors.find((a) => a.id === anchorId);\n if (!anchor) return;\n queueOp(\n {\n op: 'upsert_anchor',\n anchor: { ...anchor, x, y },\n },\n 'gesture',\n );\n }}\n onCreateShape={(kind, geometry, extras) => {\n if (!activeLevel || !canDrawOnCanvas) return;\n const key = allocShapeKey(\n kind,\n liveShapeKeysOnLevel(workingDraft.shapes, activeLevel.id),\n );\n const id = queueOp({\n op: 'upsert_shape',\n shape: {\n levelId: activeLevel.id,\n key,\n kind,\n geometry,\n bbox: geometryBBox(geometry),\n origin: 'manual',\n sourceSvgId: null,\n geometryLocked: true,\n label:\n kind === 'entrance'\n ? canonicalizeEntranceLabel({\n kind,\n origin: 'manual',\n sourceSvgId: null,\n label: extras?.label,\n }) ?? extras?.label\n : extras?.label,\n },\n });\n if (id != null) handleSelectShape(id);\n }}\n onUpdateShapeGeometry={handleUpdateShapeGeometry}\n onBatchShapeEdits={(edits) => {\n if (!activeLevel || !canDrawOnCanvas || edits.length === 0) {\n return;\n }\n const ops: BatchOp[] = [];\n let deletedSelected = false;\n const takenKeys = new Set(\n liveShapeKeysOnLevel(workingDraft.shapes, activeLevel.id),\n );\n edits.forEach((edit) => {\n if (edit.action === 'update') {\n const shape = workingDraft.shapes.find(\n (s) => s.id === edit.shapeId,\n );\n if (!shape) return;\n ops.push({\n op: 'upsert_shape',\n shape: {\n id: shape.id,\n levelId: shape.levelId,\n key: shape.key,\n kind: shape.kind,\n geometry: edit.geometry,\n bbox: geometryBBox(edit.geometry),\n geometryLocked: true,\n },\n });\n return;\n }\n if (edit.action === 'create') {\n const style: ShapeStyle | undefined = edit.style;\n const key = allocShapeKey(edit.kind, takenKeys);\n takenKeys.add(key);\n ops.push({\n op: 'upsert_shape',\n shape: {\n levelId: activeLevel.id,\n key,\n kind: edit.kind,\n geometry: edit.geometry,\n bbox: geometryBBox(edit.geometry),\n style,\n origin: 'manual',\n geometryLocked: true,\n },\n });\n return;\n }\n if (edit.shapeId === selectedShapeId) deletedSelected = true;\n ops.push({ op: 'delete_shape', shapeId: edit.shapeId });\n });\n if (ops.length) queueOpBatch(ops);\n if (deletedSelected) {\n const survivor = edits.find((e) => e.action === 'update');\n handleSelectShape(\n survivor && survivor.action === 'update'\n ? survivor.shapeId\n : null,\n );\n }\n }}\n />\n <MapControls\n levels={workingDraft.levels}\n floorOptions={editorFloorControlLevels(section, workingDraft.levels)}\n alwaysShowFloors\n activeLevelId={activeLevelId}\n onActiveLevelChange={handleCanvasLevelChange}\n onZoomIn={() => canvasRef.current?.zoomIn()}\n onZoomOut={() => canvasRef.current?.zoomOut()}\n onReset={() => canvasRef.current?.resetView()}\n />\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n\nexport default MapEditor;\n","import React, { useMemo, useState } from 'react';\nimport type { ImportDiff, ImportDiffItem } from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\n\nexport interface ImportReviewProps {\n diff: ImportDiff;\n viewBoxChanged?: boolean;\n blockedMessage?: string | null;\n busy?: boolean;\n onApply: (payload: {\n acceptAll: boolean;\n remap: Array<{ fromShapeId: number; toSourceSvgId: string }>;\n }) => Promise<void> | void;\n onCancel?: () => void;\n}\n\nfunction bucketLabel(change: ImportDiffItem['change']): string {\n switch (change) {\n case 'added':\n return 'Added';\n case 'removed':\n return 'Orphaned';\n case 'moved':\n return 'Moved';\n case 'kind_changed':\n return 'Kind changed';\n default:\n return 'Unchanged';\n }\n}\n\n/**\n * Outdoor (or floor) re-upload review — shows added / orphaned / locked / drifted\n * buckets before apply. Host wires POST .../import + .../import/apply.\n */\nexport function ImportReviewPanel({\n diff,\n viewBoxChanged = false,\n blockedMessage,\n busy = false,\n onApply,\n onCancel,\n}: ImportReviewProps) {\n const [remap, setRemap] = useState<Record<number, string>>({});\n\n const buckets = useMemo(() => {\n const added = diff.items.filter((i) => i.change === 'added');\n const orphaned = diff.items.filter((i) => i.change === 'removed');\n const locked = diff.items.filter(\n (i) => i.geometryLocked && i.change !== 'removed' && i.change !== 'added',\n );\n const moved = diff.items.filter((i) => i.change === 'moved');\n return { added, orphaned, locked, moved };\n }, [diff.items]);\n\n if (viewBoxChanged) {\n return (\n <div className=\"eyeon-map-import-review\">\n <div className=\"eyeon-map-floors__error\">\n {blockedMessage ??\n 'SVG viewBox changed — restore the original artboard before re-uploading.'}\n </div>\n {onCancel ? (\n <button type=\"button\" onClick={onCancel} disabled={busy}>\n Close\n </button>\n ) : null}\n </div>\n );\n }\n\n return (\n <div className=\"eyeon-map-import-review\">\n <p className=\"eyeon-map-rail__hint\">\n Review changes before applying. Orphaned shapes keep their retailer\n assignments — remap them onto a newly added id if the designer renamed\n a store.\n </p>\n\n {buckets.added.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Added ({buckets.added.length})\n </div>\n {buckets.added.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row\">\n <span>{item.sourceSvgId}</span>\n <span className=\"eyeon-map-rail__muted\">{item.newKind}</span>\n </div>\n ))}\n </section>\n )}\n\n {buckets.orphaned.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Orphaned ({buckets.orphaned.length})\n </div>\n {buckets.orphaned.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row eyeon-map-import-review__remap\">\n <span>{item.sourceSvgId}</span>\n <label className=\"eyeon-map-rail__field\">\n Remap to\n <ModernSelect\n ariaLabel={`Remap ${item.sourceSvgId}`}\n value={remap[item.existingShapeId!] ?? ''}\n disabled={busy || buckets.added.length === 0}\n placeholder=\"Keep orphaned\"\n searchable\n options={[\n { value: '', label: 'Keep orphaned' },\n ...buckets.added.map((a) => ({\n value: a.sourceSvgId,\n label: a.sourceSvgId,\n })),\n ]}\n onChange={(next) =>\n setRemap((prev) => ({\n ...prev,\n [item.existingShapeId!]: next,\n }))\n }\n />\n </label>\n </div>\n ))}\n </section>\n )}\n\n {buckets.locked.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Geometry locked ({buckets.locked.length})\n </div>\n <p className=\"eyeon-map-rail__hint\">\n Portal edits win — kind/style may update, geometry will not.\n </p>\n {buckets.locked.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row\">\n <span>{item.sourceSvgId}</span>\n <span className=\"eyeon-map-rail__muted\">{bucketLabel(item.change)}</span>\n </div>\n ))}\n </section>\n )}\n\n {buckets.moved.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Moved ({buckets.moved.length})\n </div>\n <p className=\"eyeon-map-rail__hint\">\n Centroid drifted — check nearby walking paths after apply.\n </p>\n {buckets.moved.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row\">\n <span>{item.sourceSvgId}</span>\n </div>\n ))}\n </section>\n )}\n\n {diff.items.length === 0 && (\n <p className=\"eyeon-map-rail__hint\">No shape changes detected.</p>\n )}\n\n <div className=\"eyeon-map-rail__actions\">\n {onCancel ? (\n <button type=\"button\" disabled={busy} onClick={onCancel}>\n Cancel\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-floors__primary\"\n disabled={busy}\n onClick={() =>\n void onApply({\n acceptAll: true,\n remap: Object.entries(remap)\n .filter(([, to]) => Boolean(to))\n .map(([from, toSourceSvgId]) => ({\n fromShapeId: Number(from),\n toSourceSvgId,\n })),\n })\n }\n >\n {busy ? 'Applying…' : 'Apply import'}\n </button>\n </div>\n </div>\n );\n}\n"],"names":["isEditorSection","section","portalCenterSurface","host","wayfindingSelectableLevels","levels","floorSwitcherLevels","editMapSelectableLevels","outdoor","level","defaultEditorFloorId","_a","levelIdOnEnterWayfinding","levelIdOnEnterEditMap","levelIdOnEnterDefaultMap","defaultViewerLevelId","editorFloorControlLevels","wayfindingOutdoorReadOnly","emptyEditorHistory","cloneHistorySnapshot","snapshot","op","pushEditorHistory","history","current","undoEditorHistory","restored","redoEditorHistory","isEditableTypingTarget","target","el","tag","isEditorUndoHotkey","isEditorRedoHotkey","key","EDITOR_TOOLS","canPlaceNewRoute","tool","canChainRoute","nextRouteChainAnchor","endAnchorId","ICON_PROPS","SelectIcon","jsx","PanIcon","DrawRectIcon","DrawPolygonIcon","DrawCircleIcon","DrawOpeningIcon","jsxs","DrawOpeningCircleIcon","CurveIcon","SplitJoinIcon","DrawTextIcon","DrawEntranceIcon","DrawRouteIcon","CreateRouteIcon","CreateRouteMultiIcon","UndoIcon","RedoIcon","TOOL_ICONS","canSelectShapes","isSplitJoinTool","isPolygonDrawTool","isEllipseDrawTool","isShapeDrawTool","isStampDrawTool","canJoinOpenEnds","showsShapeAnchors","showsCurveHandles","emptyCanvasDragPans","nextEditorTool","next","toolHint","group","EditorToolButtons","onToolChange","canEdit","mapTools","t","routeTools","showMap","showRoute","selectTool","routeToolbar","renderButton","Icon","React","EditorHistoryButtons","canUndo","canRedo","disabled","onUndo","onRedo","EPS","vecEq","a","b","eps","cloneVec","p","addVec","subVec","scaleVec","s","lerpVec","edgeCount","ring","edgeFrom","edgeIndex","edgeTo","edgeToPathD","from","to","edge","fmtCoord","n","r","ringFromPolygon","poly","closed","anchors","edges","quadraticToCubic","p0","q","p2","cubicHandlesForPull","pull","mid","offset","chord","cubicPoint","c1","c2","p3","u","splitCubic","c","d","e","ellipticalArcToCubics","rx","ry","xAxisRotationDeg","largeArc","sweep","p1","arx","ary","phi","cosPhi","sinPhi","dx2","dy2","x1p","y1p","lambda","scale","rxSq","rySq","numerator","denominator","factor","cxp","cyp","cx","cy","ux","uy","vx","vy","theta1","deltaTheta","ellipsePoint","theta","cosT","sinT","ellipseDeriv","dx","dy","out","t0","remaining","step","t1","k","start","end","d0","d1","parsePathToRings","tokens","tokenizePathData","rings","x","y","startX","startY","lastCtrl","i","cmd","started","readNum","flush","expected","pushAnchor","isRel","nx","ny","x1","y1","x2","y2","qx","qy","rot","cubics","cubic","ringToPathD","a0","ringsToGeometry","ds","geometry","buildGeometryFromPaths","ARCH_CORNER_RAD","MIN_ARCH_POINTS","MIN_ARCH_BULGE","MIN_ARCH_BULGE_RATIO","MAX_ARCH_BULGE_RATIO","signedTurn","prev","cur","ax","ay","bx","by","runLooksLikeArch","pts","distance","maxDev","side","proj","projectOntoSegment","fitCubicThroughRun","cubicDeviationFromChord","samples","approximateCubic","point","cubicIsRunaway","dev","flattenRunawayCubics","changed","collapseLineRunsToCubics","idx","incoming","outgoing","isSharp","_b","sharp","outA","outE","walk","emitRun","fromW","toW","w","linesOnly","_","last","geometryToRings","fromPaths","pointOnRingEdge","nearestTOnCubic","bestT","bestPt","bestD","clonePolygons","polygons","polygonsToPathD","polygonsToGeometry","cleaned","commitRings","incomingEdgeIndex","anchorIndex","outgoingEdgeIndex","translateGeometry","delta","translateEdge","ringIndex","fromIdx","toIdx","moveVertex","polygonIndex","vertexIndex","moveHandle","handle","flattenCubicEdge","bendEdgeToCubic","insertVertex","afterVertexIndex","splitT","split","removeVertex","min","join","hitTestVertex","tolerance","best","vertex","hitTestHandle","hp","hitEdge","preferMidpoint","candidate","dist","near","hitTestEdgeMidpoint","hitTestEdge","SHARED_EDGE_TOL","canSplitJoinKind","kind","sameOpenEnd","cloneEdge","cloneRing","reverseEdge","reverseRing","maybeCloseCoincident","tol","first","listOpenEnds","distToRingEdge","pointOnRingBoundary","edgeLiesOnOtherShape","others","other","open","cutPointsOnLine","gap","len","half","cutPointsOnCubic","dt","t2","local","second","rebuildOpenFromClosedCut","leftEdge","rightEdge","splitOpenRingAtCut","left","right","item","openWholeEdge","cutEdgeOpen","cut","pieces","concatOpenRings","leftEnd","rightStart","weld","closeOpenRing","joinOpenEndpoints","DEFAULT_WELD_TOLERANCE","ra","rb","joined","keep","drop","joinAcrossShapes","shapes","ia","ib","ringsA","ringsB","merged","weldCoincidentOpenEnds","deleteIds","ends","shape","j","pairTol","forkClosedRings","opens","finishEdits","before","working","extraDeletes","welded","deleteSet","extras","kept","forked","edits","beforeById","extra","id","applySplitJoinCut","hit","nextGeo","applySplitJoinJoin","hitOpenEnd","skip","preferOther","bestPrefer","hitSplitJoinEdge","previewCutPoints","nearestSnapPoint","candidates","sameSnapPoint","ellipseBoundsFromDrag","lockCircle","sx","sy","ellipsePathD","bounds","ellipseGeometry","DEFAULT_LABEL_TEXT","DEFAULT_LABEL_SIZE","LABEL_FONT_FAMILY","MAP_FONT_FAMILY","LABEL_LINE_HEIGHT","MAP_LABEL_LINE_HEIGHT","FALLBACK_CHAR_ADVANCE","isTextLabel","defaultLabelSize","_viewbox","labelTextLines","text","measureCtx","textMeasureContext","measureLabelText","size","lines","ctx","width","line","max","labelBoxCenter","box","textLabelPolygon","origin","height","textLabelGeometry","defaultTextLabel","color","geometryForLabelText","geometryBBox","isStampShape","isEntranceIcon","defaultEntranceLabel","ENTRANCE_ICON_ID","clampEntranceSize","entranceIconPolygon","center","entranceIconGeometry","geometryForEntranceIcon","clientToUser","ctm","clientX","clientY","det","clientRectToViewBox","rect","viewBox","vbW","vbH","originX","originY","pxPerUserFromViewBox","readSvgViewBox","svg","vb","attr","parts","clientToSvgUser","pxPerUserFromSvg","pxPerUserFromCtm","userToWorld","user","pan","zoom","z","EDITOR_MIN_ZOOM","EDITOR_MAX_ZOOM","clampEditorZoom","nextEditorZoomFromWheel","currentZoom","event","nextZoomFromWheel","screenPxToWorld","px","pxPerUser","editorHandleScale","sizeZoom","liveZoom","panAfterZoom","nextZoom","world","panKeepingWorldAtUser","EDITOR_ZOOM_ANIM_MS","easeOutCubic","lerp","interpolateView","editorShapeFillOpacity","editorShapeFill","theme","assignment","WALKING_PATH_COLOR","published","resolvedShapeFill","isTransparentPadKind","isTransparentColor","staffPadPlaceholderFill","EDITOR_GUIDE_COLOR","isHoverHighlightShape","INTERACTIVE_SHAPE_KINDS","editorSelectCursor","args","editorHoverFillOpacity","base","hovered","editorShapeEmphasisColor","fill","emphasized","darkenShapeFill","liveDisplayRetailer","retailer","wayfindingAssignedOverlay","amenities","displayRetailer","label","publishedShapeLabel","assignmentOverlayVisible","fontSize","DEFAULT_ASSIGNMENT_SIZE","imageUrl","assignmentOverlayImageUrl","iconId","assignmentSpecialIconId","assignmentOverlayRenderSize","resolvedAssignmentIconColor","normalizeLabelAlign","wayfindingAssignedOverlays","input","retailerById","assignmentByShapeId","row","overlays","overlay","wayfindingOverlayHref","imageProxyUrl","resolveFetchUrl","getMapSpecialSvg","mapSpecialSvgToDataUrl","AssignedShapeOverlay","rotate","align","href","transform","AssignedOverlayText","lineHeight","blockHeight","labelSvgTextAnchor","index","OutdoorSvgUnderlay","url","suppressIds","svgText","setSvgText","useState","suppressKey","useMemo","useEffect","cancelled","controller","fetchUrl","res","err","paths","blocked","outdoorDecorationFromSvg","isUnderlayHintShape","isUnderlayDrawnShape","underlaySwitchHint","WAYFINDING_SNAP_PX","WAYFINDING_ANCHOR_HIT_PX","showsWayfinding","routeMode","routeSessionUndoKind","session","beginOrContinueRouteDraft","draft","routeRubberBand","isWayfindingShape","wayfindingLinksShapes","anchorKindForShape","routeAnchorKindForShape","shapeRoutePoint","routeComponentAnchorIds","anchorId","ids","pending","walkEdgeExists","isSnappableRouteEdge","storeLinkOriginIds","preview","anchor","nearestRouteSnap","excludeIds","maxDist","anchorById","bestJunction","bestEdge","walkEdge","mapId","fromAnchorId","toAnchorId","ensureShapeRouteAnchorOps","allocId","existing","unit","connectShapeToRouteOps","ops","snap","junctionId","nextEdges","source","linkKind","connectRouteAnchorToRouteOps","incident","otherId","link","linkRouteAnchorsOp","insertJunctionOnWalkEdgeOps","levelId","deleteRouteAnchorOps","walkNeighbors","ANCHOR_R_PX","ANCHOR_R_SELECTED_PX","ANCHOR_HIT_PX","ANCHOR_STROKE_PX","SHAPE_ROUTE_ANCHOR_FILL","VERTEX_R_PX","VERTEX_R_SELECTED_PX","VERTEX_HIT_PX","VERTEX_STROKE_PX","HANDLE_R_PX","HANDLE_R_SELECTED_PX","HANDLE_HIT_PX","HANDLE_LINE_PX","HANDLE_LINE_HALO_PX","BEND_R_PX","EDGE_DRAG_PX","SPLIT_JOIN_GAP_PX","SNAP_HIT_PX","rectPolygon","dragSize","screenStrokeStyle","HandleDot","hitR","stroke","strokeWidth","cursor","fillOpacity","strokeDasharray","onPointerDown","onPointerEnter","onPointerLeave","onDoubleClick","polygonsToPath","isEditableShape","interactiveOnly","EditorCanvas","assignments","retailers","selectedShapeId","selectedAnchorIds","baseSvgUrl","baseViewbox","outdoorSvgUrl","levelSvgUrl","underlayShapes","openingUnderlayShapes","showGrid","readOnly","emptyMessage","onSelectShape","onSelectAnchors","onCreateRoutePoint","onCreateRouteSegment","onLinkRouteAnchors","onInsertRouteJunction","onDeleteRouteAnchor","onConnectShapeToRoute","onConnectRouteAnchorToRoute","onEnsureShapeAnchor","onMoveAnchor","onCreateShape","onUpdateShapeGeometry","onBatchShapeEdits","onHistoryGestureEnd","onRouteDraftActiveChange","ref","ensureMapFont","wayfindingOn","svgRef","useRef","viewGroupRef","canvasRef","setPan","setZoom","viewRef","sizeZoomRef","wheelFrameRef","wheelSettleRef","routeHoverFrameRef","routeHoverClientRef","setPxPerUser","pointersRef","pinchRef","drawing","setDrawing","drawLockCircle","setDrawLockCircle","polygonPoints","setPolygonPoints","dragAnchor","setDragAnchor","dragAnchorPoint","setDragAnchorPoint","lastRouteAnchor","setLastRouteAnchor","routeDraftPoint","setRouteDraftPoint","storeLinkPreview","setStoreLinkPreview","rubberCursor","setRubberCursor","splitJoinPending","setSplitJoinPending","splitJoinHover","setSplitJoinHover","splitJoinSnapEnd","setSplitJoinSnapEnd","polygonSnap","setPolygonSnap","clearRouteSession","stubDrag","setStubDrag","shapeDrag","setShapeDrag","shapeOffset","setShapeOffset","vertexDrag","setVertexDrag","selectedVertex","setSelectedVertex","selectedHandle","setSelectedHandle","hoveredEdge","setHoveredEdge","edgePress","setEdgePress","hoveredShapeId","setHoveredShapeId","hoveredAnchorId","setHoveredAnchorId","routePointerSnap","setRoutePointerSnap","routeHover","underlayTip","setUnderlayTip","panStart","isPanning","setIsPanning","worldPx","syncViewDom","nextPan","g","applyView","cancelWheelWork","paintView","settleWheelView","scheduleWheelPaint","zoomAnimRef","cancelZoomAnim","animateViewTo","targetPan","targetZoom","now","zoomAroundCenter","currentPan","useImperativeHandle","renderedZoom","useLayoutEffect","viewbox","unionViewBox","svgUnderlayUrl","svgSuppressIds","svgIdsOwnedByShapes","measure","ro","editableShapes","openingShapes","openingClipId","openingHatchId","selectedShape","displayGeometry","splitJoinShapes","polygonAnchorCandidates","nearSplitJoinAnchor","snapPolygonPoint","own","commitSplitJoinEdits","deleted","survivor","tryJoinOpenEnd","endHit","handleSplitJoinAt","endTol","edgeTol","edgeHit","toWorld","moveUnderlayTip","insertAnchorOnEdge","beginEdgePress","insertAt","deleteShapeAnchor","beginSplitJoinVertexDrag","vertexHit","deleteShapeHandle","hoverEdgeAt","connectedAnchorIds","routeAnchorDegreeById","degree","dragRouteExcludeIds","dragRouteSnap","displayAnchorById","dragged","routeEdgePath","assignedOverlays","cancelRouteHoverFrame","scheduleRouteHover","client","closePolygon","onShift","onKey","node","onWheel","beginPinch","onCanvasPointerDownCapture","onCanvasPointerMoveCapture","onCanvasPointerUpCapture","wasPinching","beginPan","fromEmptySelect","insertHoveredRoutePoint","edgeId","created","removeWayfindingAnchor","placed","storeExclude","DEFAULT_ENTRANCE_SIZE","handleHit","_d","_c","midHit","_f","_e","handleTol","_h","_g","onPointerMove","screenMove","snapTol","finishRect","finishEllipse","onPointerUp","endedPan","moved","pathDFromGeometry","shapePathD","stubExcludeIds","stubSnap","lastRoutePoint","routeRubberSnap","highlightedRouteEdgeId","highlightedRouteEdge","highlightedRouteFrom","highlightedRouteTo","routePlusAt","rubberFrom","rubberTo","rubberBand","polygonFollow","polygonClose","hintable","publishedFill","highlightable","selected","dragging","textLabel","entranceIcon","stamp","beginShapePointerDown","worldAt","hoverHandlers","iconUrl","entranceIconDataUrl","emphasisStroke","textX","labelAlignX","baseOpacity","opening","emphasisFill","ri","items","ei","strokeD","clickRing","plus","h1","h2","vi","shapeNode","connected","displayAnchor","dragConnect","nearWeld","visR","snapped","hideOnAnchor","Fragment","FAMILY_PREFIXES","normalizeId","value","parseConnectorSourceId","raw","family","direction","role","groupParts","part","guessConnectorKind","connectorIdForShape","shapeId","connectorForShape","connectors","resolvedConnectorKind","railConnectorShapes","landingAnchor","shapeLandingPoint","geometryCentroid","inferTravelDirection","fromLevelIndex","toLevelIndex","hint","defaultConnectorName","parsed","nearestWalkAnchor","bestDist","memberShapeIds","connectorId","partnerShapesForConnector","connector","levelsWithLandings","landings","escalatorDirectedEnds","memberAnchors","memberIds","ride","fromAnchor","toAnchor","floorName","landingRideId","groupEscalatorRides","rides","directed","members","escalatorRideLandingLines","connectorRideLabel","partners","order","ai","bi","connectorEdgesBetween","anchorIds","ensureLanding","linkLandingToWalk","landing","applyUnlinkLocal","unlinkConnectorOps","buildUnlinkConnectorOps","buildEscalatorLinkOps","fromShape","toShape","options","fromLevel","l","toLevel","name","existingFrom","existingTo","v","buildElevatorShaftOps","memberShapes","existingIds","keepId","geometryBbox","points","bboxOf","shapeKeyTakenOnLevel","upsertById","rows","copy","applyDraftOp","mergeEntranceAwareLabel","parseShapeAssignment","rest","removed","omitLevelFromDraft","removedShapeIds","removedAnchorIds","liveConnectorIds","applyDraftOps","seeded","healDraftGeometry","normalizeGeometrySpace","canonicalizeEntranceLabel","geometryChanged","labelChanged","coalesceDraftOp","acc","BATCH_PERSIST_RANK","orderBatchOpsForPersist","rank","FieldResetIcon","FieldResetButton","onClick","normalizeHexColor","match","hex","ch","hexColorInputValue","sameHexColor","StepperRow","onChange","onStep","onHoldStart","onHoldEnd","setDraft","focused","syncDraft","commitDraft","persistIncomplete","commitAssignNumberDraft","assignNumberFromDraft","ColorSwatch","swatch","fallback","emptyIsTransparent","onHexChange","onCommit","onPick","lastSolid","transparent","solid","pickerValue","ColorRow","onReset","display","TRANSPARENT_COLOR","setHex","commit","normalized","ALIGN_TOOLTIPS","AlignLeftIcon","AlignCenterIcon","AlignRightIcon","ALIGN_ICONS","AlignRow","LABEL_ALIGNS","option","RotateIcon","nextQuarterTurn","remainder","stepWholeNumber","AssignmentStyleFields","form","storeDefaultColor","storeTextColor","textColorLabel","showTextColor","onPatch","formRef","intervals","bump","startHold","stopHold","offsetX","offsetY","bgColor","textColor","connectorStyleAssignment","emptyShapeAssignment","ConnectorAssign","railKind","onApplyOps","onSaveAssignment","partner","levelName","exitFloorId","setExitFloorId","targetId","setTargetId","stopFloorId","setStopFloorId","styleForm","setStyleForm","styleFormRef","patchStyle","useCallback","partial","exitFloors","landingsOnExitFloor","addable","addFloors","landingsOnStopFloor","applyEscalator","applyElevator","nextMembers","pickExitLanding","nextId","pickElevatorStop","landingOptions","linked","connectorSpecialIconDataUrl","ModernSelect","nextFloor","assignmentPadFillFallback","SHAPE_KIND_LABELS","EDITOR_TYPE_KINDS","TOOL_ONLY_KINDS","inspectorShowsType","inspectorTypeKinds","shapeKindLabel","ASSIGNABLE_SHAPE_KINDS","isAssignableKind","isStoreShapeKind","isRetailerAssigned","isAmenityAssigned","isKioskAssigned","isPolygonAssigned","assignmentHasTarget","railAssignmentGroups","byShape","stores","kiosks","unassignedStores","unassignedAmenities","unassignedKiosks","unassigned","isKioskScreenKind","kioskScreenShapes","catalogKioskShapeOptions","shapeIdForCatalogKiosk","kioskId","leftoverCatalogKiosks","used","kiosk","catalogKioskRowLabel","assignedKey","railRowLabels","tags","RAIL_ITEM_SECTIONS","isRailItemSection","railShowsItemOptions","selectedCount","railListLevelOrder","floorsLowToHigh","compareBuildingFloors","sortShapesByRailLevel","indexById","floorsScreenTitle","screen","visibleFloorCount","moveLevelId","movedId","toIndex","without","clamped","insertIndexFromY","listTop","rowHeight","count","dropLineTop","fromIndex","dropIndex","rowInnerHeight","sameIdOrder","formatBytes","svgFileName","isSvgFile","GripIcon","TrashIcon","deleteConfirmCopy","shapeCount","isOutdoor","FloorsPanel","buildings","levelShapeCounts","canFloors","onScreenChange","onCreateLevel","onUpdateLevel","onDeleteLevel","onReorderLevels","setName","file","setFile","busy","setBusy","error","setError","progress","setProgress","dragOver","setDragOver","confirmDeleteId","setConfirmDeleteId","deleting","setDeleting","drag","setDrag","setDropIndex","previewIds","setPreviewIds","previewFailed","setPreviewFailed","localPreviewUrl","setLocalPreviewUrl","fileInputRef","floorListRef","ghostRef","previewIdsRef","dragRef","outdoorReady","buildingFloors","committedIds","displayFloors","byId","editing","isOutdoorForm","canManage","canReorder","takeSvgFile","openEdit","submit","picked","svgFile","remove","renderDeleteModal","renderRowDelete","applyGhost","ghost","previewMoveToY","persistPreview","nextIds","endDrag","onMove","maxY","onUp","startDrag","list","listRect","lineTop","hasExistingSvg","showEditPreview","previewUrl","previewFallback","importedCount","showReimportNotice","primaryLabel","primaryBusyLabel","createPortal","BackIcon","ChevronIcon","NAV_ICON_PROPS","FloorsNavIcon","StoresNavIcon","AmenitiesNavIcon","KiosksNavIcon","EscalatorsNavIcon","ElevatorsNavIcon","SettingsNavIcon","UnassignedNavIcon","EditMapNavIcon","WayfindingNavIcon","MapResponsivenessNavIcon","RAIL_NAV","HIDDEN_SECTION_TITLES","isRailNavSeparator","entry","railSectionTitle","HOUSE_OUTDOOR_THEME","staticLayerThemeDefaults","OUTDOOR_COLOR_FIELDS","SettingsField","children","ColorField","LeftRail","onSectionChange","activeLevelId","selectedShapeIds","onHoverShape","onListFocus","canSettings","canResponsiveness","onAutoroute","onThemeChange","assignPanel","catalogKioskPanel","selectedCatalogKioskId","onSelectCatalogKiosk","editMapPanel","wayfindingPanel","mapResponsivenessPanel","footer","onUseClassicMap","floorsScreen","setFloorsScreen","assigned","storeShapes","amenityShapes","kioskShapes","unassignedStoreShapes","unassignedAmenityShapes","unassignedKioskShapes","unassignedShapes","escalatorShapes","elevatorShapes","unlinkedEscalators","escalatorRides","linkedElevators","unlinkedElevators","assignmentById","counts","duplicate","retailerOptionLabel","amenityById","kioskById","assignedNameFor","catalogName","fromType","getAmenityByType","amenityAssignedName","kioskAssignedName","activeLevel","pathCount","selectedIds","isShapeSelected","selectedCatalogKiosk","showingCatalogKiosk","showingItemOptions","itemOptionsTitle","linkedId","selectShapeFromList","leftoverKiosks","renderShapeList","empty","opts","renderEscalatorRideList","active","renderAssignedUnassigned","assignedList","unassignedList","kindLabelFor","connectorIcon","house","DEFAULT_THEME","customized","clampStoreRadius","clampRouteThickness","CatalogKioskForm","shapeOptions","assignedShapeId","onAssign","hasShape","SHAPE_KEY_PREFIX","SHAPE_KEY_ALPHABET","SHAPE_KEY_SUFFIX_LENGTH","shapeKeyPrefix","randomShapeKeySuffix","length","bytes","liveShapeKeysOnLevel","copyDestinationLevels","currentLevelId","allocShapeKey","taken","suffix","prefix","cloneShapeGeometry","path","copyShapeToLevelOps","targetLevelId","RETAIL_LAYER_TYPES","AssignForm","amenityIconColor","kioskIconColor","onClear","setForm","patch","nameCounts","retailerOptions","amenityOptions","amenityAssignOptions","selectedAmenityType","amenityTypeFromCatalogId","kioskCatalogName","textColorFallback","assignmentIconThemeFallback","hasAssignment","retailerId","layerType","DEFAULT_LABEL_ALIGN","amenityId","amenityCatalogIdForType","KioskNameField","trimmed","BulkAssignForm","common","bulkAssignFormState","assignableShapes","iconOnly","uniqueKinds","bgColorFallback","BulkSizeRow","BulkColorRow","emitIfComplete","mixed","Chevron","CopyToLevelButton","destinations","onCopyToLevel","listId","useId","buttonRef","menuRef","setOpen","menuPos","setMenuPos","close","updateMenuPos","spaceBelow","spaceAbove","maxHeight","openAbove","destinationKey","onDoc","menu","nextError","MIN_ICON_SIZE","EntranceIconForm","setSize","setRotate","sizeRef","rotateRef","nextSize","nextRotate","MIN_FONT_SIZE","TextLabelForm","setText","textFocused","nextText","Inspector","levelShapeKeys","showAssignment","emptyHint","onRename","onChangeKind","onChangeLevel","onDelete","onClearAssignment","onUpdateLabel","selectedShapes","selectedAssignments","onBulkAssign","setKey","keyError","setKeyError","levelError","setLevelError","commitRename","copyDestinations","copyButton","PreviewOverlay","document","focusNonce","onActiveLevelChange","routeOnSelect","device","captureCamera","onCameraChange","onCameraReset","Suspense","MapViewer","nextSelectedShapeIds","compileEditorPreview","compileDocument","memory","MAX_REMEMBERED_MAPS","storageKey","dropLegacyStorage","markEditorSection","oldest","peekEditorSection","clearEditorSection","storage","markReturnToFloorsList","consumeReturnToFloorsList","stored","clearReturnToFloorsList","MapEditor","onBatch","onPublish","onSaveResponsive","onDiscard","onImportSvg","previewDocument","className","sidebarFooter","restoredSection","setSection","responsiveDevice","setResponsiveDevice","pendingResponsive","setPendingResponsive","previewEpoch","setPreviewEpoch","setActiveLevelId","restoredLevel","setSelectedShapeIds","setSelectedCatalogKioskId","listFocusNonce","setListFocusNonce","setSelectedAnchorIds","setTool","editVersion","setEditVersion","needsPublish","setNeedsPublish","saving","setSaving","setHistory","routeDraftActive","setRouteDraftActive","historyRef","pendingOps","nextTempId","historyGestureRef","showMapOptions","centerSurface","isEditMap","historyMetaRef","workingDraft","mergeTheme","cameraDirty","dirty","canPersist","isResponsiveness","outdoorViewOnly","canDrawOnCanvas","outdoorLevel","outdoorShapes","levelShapes","levelsWithShapes","lvl","lower","nextLowerBuildingFloor","mergedResponsiveOverrides","mergeResponsiveOverrides","compiledPreview","levelAnchors","levelEdges","anchorsById","selectedAssignment","takeSnapshot","applySnapshot","recordHistoryStep","mode","queueOp","historyMode","endHistoryGesture","undo","redo","handleSaveChanges","cameraItems","persisted","savedCamera","responsiveSlotKey","handleDiscardChanges","handleSectionChange","handleCanvasLevelChange","nextLevel","handleSelectShape","additive","nextLevelId","viewerLevelIdAfterShapeSelect","connectorKind","handleToolChange","resolved","handleRenameShape","handleChangeLevel","queueOpBatch","handleCopyToLevel","copied","handleDeleteShape","handleUpdateShapeGeometry","handleUpdateLabel","nextLabel","handleChangeKind","handleSaveAssignment","visuals","assignmentVisualPatch","handleClearAssignment","handleLinkCatalogKiosk","previousShapeId","clearShape","handleBulkAssign","patched","applyBulkAssignPatch","selectedConnectorKind","connectorRailKind","handleCameraChange","view","fields","poseToResponsiveFields","handleCameraReset","emptyResponsiveOverrideInput","toolGroup","RESPONSIVE_DEVICE_TABS","tab","hasBuildingFloors","MAP_NO_FLOORS_MESSAGE","id1","id2","prevAnchorId","deletedSelected","takenKeys","edit","style","MapControls","bucketLabel","change","ImportReviewPanel","diff","viewBoxChanged","blockedMessage","onApply","onCancel","remap","setRemap","buckets","added","orphaned","locked","toSourceSvgId"],"mappings":"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"}
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/ortho.ts","../../src/editor/ellipseDraw.ts","../../src/editor/labelText.ts","../../src/editor/entranceIcon.ts","../../src/editor/canvas/coords.ts","../../src/editor/canvas/editorFill.ts","../../src/editor/canvas/editorHover.ts","../../src/editor/assignmentOverlay.ts","../../src/editor/canvas/AssignedShapeOverlay.tsx","../../src/editor/canvas/OutdoorSvgUnderlay.tsx","../../src/editor/canvas/underlayHint.ts","../../src/editor/routeStubs.ts","../../src/editor/canvas/EditorCanvas.tsx","../../src/editor/dirty.ts","../../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/GridPrefsControl.tsx","../../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 | '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-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 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 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. */\nexport function isPolygonDrawTool(tool: EditorTool): boolean {\n return tool === 'draw-polygon';\n}\n\n/**\n * Points placed for a store that is not closed yet. Undo removes the last\n * one and leaves earlier finished stores in history.\n */\nexport function popPolygonDraftPoint<T>(points: readonly T[]): {\n points: T[];\n consumed: boolean;\n} {\n if (points.length === 0) return { points: [...points], consumed: false };\n return { points: points.slice(0, -1), consumed: true };\n}\n\n/** Click-drag oval / circle. */\nexport function isEllipseDrawTool(tool: EditorTool): boolean {\n return tool === 'draw-circle';\n}\n\n/** Rectangle, polygon, and circle — plus cursor for placement. */\nexport function isShapeDrawTool(tool: EditorTool): boolean {\n return tool === 'draw-unit' || tool === 'draw-polygon' || tool === 'draw-circle';\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. Double-click a walking path to delete it. 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. Hold Shift to draw a straight horizontal or vertical line. Hover an existing anchor to snap to it. Click the first point or press Enter to close. Undo removes the last point. Esc cancels.';\n case 'draw-circle':\n return 'Click and drag to draw an oval. 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, or hold Space to pan while another tool is active. 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. Hold Shift while dragging an anchor to keep the line straight. 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\n/** Connected corners used to keep a dragged anchor horizontal or vertical. */\nexport function vertexNeighborPoints(\n geometry: ShapeGeometry,\n polygonIndex: number,\n vertexIndex: number,\n): Vec2[] {\n const rings = geometryToRings(geometry);\n const ring = rings[polygonIndex];\n if (!ring || ring.anchors.length < 2) return [];\n if (vertexIndex < 0 || vertexIndex >= ring.anchors.length) return [];\n const count = ring.anchors.length;\n const prev = ring.anchors[(vertexIndex - 1 + count) % count];\n const next = ring.anchors[(vertexIndex + 1) % count];\n const points = [cloneVec(prev)];\n if (prev.x !== next.x || prev.y !== next.y) points.push(cloneVec(next));\n return points;\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 { Vec2 } from '../core';\n\nexport type OrthoAxis = 'horizontal' | 'vertical';\n\nexport interface OrthoConstraint {\n point: Vec2;\n axis: OrthoAxis;\n /** Point the guide line passes through. */\n through: Vec2;\n}\n\n/** Snap `cursor` to the dominant 0° or 90° axis through `origin`. */\nexport function constrainOrthogonal(origin: Vec2, cursor: Vec2): OrthoConstraint {\n const dx = Math.abs(cursor.x - origin.x);\n const dy = Math.abs(cursor.y - origin.y);\n if (dx >= dy) {\n return {\n point: { x: cursor.x, y: origin.y },\n axis: 'horizontal',\n through: origin,\n };\n }\n return {\n point: { x: origin.x, y: cursor.y },\n axis: 'vertical',\n through: origin,\n };\n}\n\n/**\n * Move a dragged anchor onto the nearest horizontal or vertical line through\n * one of its connected neighbors.\n */\nexport function constrainVertexOrthogonal(\n cursor: Vec2,\n neighbors: readonly Vec2[],\n): OrthoConstraint | null {\n let best: (OrthoConstraint & { dist: number }) | null = null;\n for (const neighbor of neighbors) {\n const options: OrthoConstraint[] = [\n {\n point: { x: cursor.x, y: neighbor.y },\n axis: 'horizontal',\n through: neighbor,\n },\n {\n point: { x: neighbor.x, y: cursor.y },\n axis: 'vertical',\n through: neighbor,\n },\n ];\n for (const option of options) {\n const dist = Math.hypot(option.point.x - cursor.x, option.point.y - cursor.y);\n if (\n !best ||\n dist < best.dist - 1e-6 ||\n (Math.abs(dist - best.dist) <= 1e-6 && option.axis === 'horizontal' && best.axis !== 'horizontal')\n ) {\n best = { ...option, dist };\n }\n }\n }\n if (!best) return null;\n return { point: best.point, axis: best.axis, through: best.through };\n}\n\nexport function isSpacePanKey(event: { key: string; code?: string }): boolean {\n return event.key === ' ' || event.code === 'Space';\n}\n","import type { ShapeGeometry, Vec2 } from '../core';\nimport { buildGeometryFromPaths } from '../core';\n\nexport interface EllipseBounds {\n cx: number;\n cy: number;\n rx: number;\n ry: number;\n}\n\n/** Drag from corner `from` to `to`. Shift / lockCircle keeps rx === ry. */\nexport function ellipseBoundsFromDrag(\n from: Vec2,\n to: Vec2,\n lockCircle = false,\n): EllipseBounds {\n let x1 = to.x;\n let y1 = to.y;\n if (lockCircle) {\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const side = Math.max(Math.abs(dx), Math.abs(dy));\n const sx = dx === 0 ? (dy === 0 ? 1 : Math.sign(dy)) : Math.sign(dx);\n const sy = dy === 0 ? (dx === 0 ? 1 : Math.sign(dx)) : Math.sign(dy);\n x1 = from.x + sx * side;\n y1 = from.y + sy * side;\n }\n const rx = Math.abs(x1 - from.x) / 2;\n const ry = Math.abs(y1 - from.y) / 2;\n return {\n cx: (from.x + x1) / 2,\n cy: (from.y + y1) / 2,\n rx,\n ry,\n };\n}\n\nexport function ellipsePathD(bounds: EllipseBounds): string {\n const { cx, cy, rx, ry } = bounds;\n const arx = Math.max(rx, 1e-4);\n const ary = Math.max(ry, 1e-4);\n return `M ${cx - arx} ${cy} A ${arx} ${ary} 0 1 0 ${cx + arx} ${cy} A ${arx} ${ary} 0 1 0 ${cx - arx} ${cy} Z`;\n}\n\nexport function ellipseGeometry(\n from: Vec2,\n to: Vec2,\n lockCircle = false,\n): ShapeGeometry {\n return buildGeometryFromPaths([\n ellipsePathD(ellipseBoundsFromDrag(from, to, lockCircle)),\n ]);\n}\n","import type { BBox, ShapeGeometry, ShapeLabel, Vec2, ViewBox } from '../core';\nimport { geometryBBox } from '../core';\nimport { MAP_FONT_FAMILY, MAP_LABEL_LINE_HEIGHT } from '../fonts/mapFont';\nimport { polygonsToGeometry } from './geometryEdit';\n\nexport const DEFAULT_LABEL_TEXT = 'Text';\nexport const DEFAULT_LABEL_SIZE = 48;\nexport const LABEL_FONT_FAMILY = MAP_FONT_FAMILY;\nexport const LABEL_LINE_HEIGHT = MAP_LABEL_LINE_HEIGHT;\n/** Fallback advance when canvas measurement is unavailable (tests / SSR). */\nconst FALLBACK_CHAR_ADVANCE = 0.5;\n\nexport function isTextLabel(shape: {\n kind: string;\n label?: { text?: string } | null;\n}): boolean {\n return shape.kind === 'label' && Boolean(shape.label?.text?.trim());\n}\n\nexport function defaultLabelSize(_viewbox?: ViewBox): number {\n return DEFAULT_LABEL_SIZE;\n}\n\nexport function labelTextLines(text: string): string[] {\n const source = text.replace(/\\r\\n/g, '\\n').trim() || DEFAULT_LABEL_TEXT;\n return source.split('\\n');\n}\n\nlet measureCtx: CanvasRenderingContext2D | null | undefined;\n\nfunction textMeasureContext(): CanvasRenderingContext2D | null {\n if (measureCtx !== undefined) return measureCtx;\n if (typeof document === 'undefined') {\n measureCtx = null;\n return null;\n }\n const canvas = document.createElement('canvas');\n measureCtx = canvas.getContext('2d');\n return measureCtx;\n}\n\nexport function measureLabelText(\n text: string,\n size: number,\n): { width: number; height: number; lines: string[] } {\n const lines = labelTextLines(text);\n const ctx = textMeasureContext();\n let width = 0;\n if (ctx) {\n ctx.font = `${size}px ${LABEL_FONT_FAMILY}`;\n for (const line of lines) {\n width = Math.max(width, ctx.measureText(line || ' ').width);\n }\n } else {\n const longest = lines.reduce((max, line) => Math.max(max, line.length), 1);\n width = longest * size * FALLBACK_CHAR_ADVANCE;\n }\n return {\n width: Math.max(width, size * 0.2),\n height: Math.max(lines.length, 1) * size * LABEL_LINE_HEIGHT,\n lines,\n };\n}\n\nexport function labelBoxCenter(box: BBox): Vec2 {\n return { x: (box.minX + box.maxX) / 2, y: (box.minY + box.maxY) / 2 };\n}\n\nexport function textLabelPolygon(origin: Vec2, text: string, size: number): Vec2[] {\n const { width, height } = measureLabelText(text, size);\n return [\n { x: origin.x, y: origin.y - height },\n { x: origin.x + width, y: origin.y - height },\n { x: origin.x + width, y: origin.y },\n { x: origin.x, y: origin.y },\n ];\n}\n\nexport function textLabelGeometry(\n origin: Vec2,\n text: string,\n size: number,\n): ShapeGeometry {\n return polygonsToGeometry([textLabelPolygon(origin, text, size)]);\n}\n\nexport function defaultTextLabel(text: string, size: number, color?: string): ShapeLabel {\n return {\n text: text.trim() || DEFAULT_LABEL_TEXT,\n size,\n color,\n autoFit: true,\n };\n}\n\n/** Keep the box anchored at the current bottom-left when the string changes. */\nexport function geometryForLabelText(\n geometry: ShapeGeometry,\n text: string,\n size: number,\n): ShapeGeometry {\n const box = geometryBBox(geometry);\n return textLabelGeometry({ x: box.minX, y: box.maxY }, text, size);\n}\n","import type { ShapeGeometry, ShapeLabel, Vec2 } from '../core';\nimport {\n DEFAULT_ENTRANCE_SIZE,\n ENTRANCE_ICON_ID,\n canonicalizeEntranceLabel,\n clampEntranceSize,\n geometryBBox,\n isEntranceIcon,\n} from '../core';\nimport { polygonsToGeometry } from './geometryEdit';\nimport { isTextLabel, labelBoxCenter } from './labelText';\n\nexport {\n DEFAULT_ENTRANCE_SIZE,\n ENTRANCE_ICON_ID,\n canonicalizeEntranceLabel,\n clampEntranceSize,\n isEntranceIcon,\n};\n\nexport function isStampShape(shape: {\n kind: string;\n label?: { text?: string; imageKey?: string | null } | null;\n}): boolean {\n return isTextLabel(shape) || isEntranceIcon(shape);\n}\n\nexport function defaultEntranceLabel(size: number, color?: string): ShapeLabel {\n return {\n imageKey: ENTRANCE_ICON_ID,\n size: clampEntranceSize(size),\n color,\n rotate: 0,\n };\n}\n\nexport function entranceIconPolygon(center: Vec2, size: number): Vec2[] {\n const half = clampEntranceSize(size) / 2;\n return [\n { x: center.x - half, y: center.y - half },\n { x: center.x + half, y: center.y - half },\n { x: center.x + half, y: center.y + half },\n { x: center.x - half, y: center.y + half },\n ];\n}\n\nexport function entranceIconGeometry(center: Vec2, size: number): ShapeGeometry {\n return polygonsToGeometry([entranceIconPolygon(center, size)]);\n}\n\n/** Keep the icon centred when Size changes. */\nexport function geometryForEntranceIcon(\n geometry: ShapeGeometry,\n size: number,\n): ShapeGeometry {\n return entranceIconGeometry(labelBoxCenter(geometryBBox(geometry)), size);\n}\n","import type { Vec2 } from '../../core';\nimport { nextZoomFromWheel } from '../../core/wheelZoom';\n\n/** 2D affine matrix in DOMMatrix / SVGMatrix layout (a c e / b d f). */\nexport interface Affine2 {\n a: number;\n b: number;\n c: number;\n d: number;\n e: number;\n f: number;\n}\n\nexport interface ViewBoxRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface ClientRectLike {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/**\n * Map a client (CSS pixel) point through the inverse of an SVG screen CTM.\n * Prefer {@link clientRectToViewBox} for pointer mapping — `getScreenCTM()` on\n * the root `<svg>` is wrong inside transformed admin-portal layout.\n */\nexport function clientToUser(ctm: Affine2, clientX: number, clientY: number): Vec2 {\n const det = ctm.a * ctm.d - ctm.b * ctm.c;\n if (det === 0) return { x: 0, y: 0 };\n const x = clientX - ctm.e;\n const y = clientY - ctm.f;\n return {\n x: (ctm.d * x - ctm.c * y) / det,\n y: (-ctm.b * x + ctm.a * y) / det,\n };\n}\n\n/**\n * Viewport point → SVG viewBox user space, same method OrbitControls uses\n * (`getBoundingClientRect` + letterboxed viewBox). Default map zoom-to-cursor\n * works in admin-portal because of this; Edit Map must not use `getScreenCTM()`.\n *\n * Assumes `preserveAspectRatio=\"xMidYMid meet\"` (editor canvas default).\n */\nexport function clientRectToViewBox(\n rect: ClientRectLike,\n viewBox: ViewBoxRect,\n clientX: number,\n clientY: number,\n): Vec2 {\n const vbW = viewBox.width > 0 ? viewBox.width : Math.max(rect.width, 1);\n const vbH = viewBox.height > 0 ? viewBox.height : Math.max(rect.height, 1);\n const scale = Math.min(rect.width / vbW, rect.height / vbH);\n if (!(scale > 0) || !Number.isFinite(scale)) {\n return { x: viewBox.x, y: viewBox.y };\n }\n const originX = rect.left + (rect.width - vbW * scale) / 2;\n const originY = rect.top + (rect.height - vbH * scale) / 2;\n return {\n x: viewBox.x + (clientX - originX) / scale,\n y: viewBox.y + (clientY - originY) / scale,\n };\n}\n\nexport function pxPerUserFromViewBox(rect: ClientRectLike, viewBox: ViewBoxRect): number {\n const vbW = viewBox.width > 0 ? viewBox.width : Math.max(rect.width, 1);\n const vbH = viewBox.height > 0 ? viewBox.height : Math.max(rect.height, 1);\n const scale = Math.min(rect.width / vbW, rect.height / vbH);\n return scale > 0 && Number.isFinite(scale) ? scale : 1;\n}\n\nfunction readSvgViewBox(svg: SVGSVGElement): ViewBoxRect | null {\n const vb = svg.viewBox?.baseVal;\n if (vb && vb.width > 0 && vb.height > 0) {\n return { x: vb.x, y: vb.y, width: vb.width, height: vb.height };\n }\n const attr = svg.getAttribute('viewBox');\n if (!attr) return null;\n const parts = attr.trim().split(/[\\s,]+/).map(Number);\n if (parts.length !== 4 || parts.some((n) => !Number.isFinite(n))) return null;\n if (parts[2] <= 0 || parts[3] <= 0) return null;\n return { x: parts[0], y: parts[1], width: parts[2], height: parts[3] };\n}\n\nexport function clientToSvgUser(svg: SVGSVGElement, clientX: number, clientY: number): Vec2 {\n const viewBox = readSvgViewBox(svg);\n if (viewBox) {\n return clientRectToViewBox(svg.getBoundingClientRect(), viewBox, clientX, clientY);\n }\n const ctm = svg.getScreenCTM();\n if (!ctm) return { x: 0, y: 0 };\n return clientToUser(ctm, clientX, clientY);\n}\n\nexport function pxPerUserFromSvg(svg: SVGSVGElement): number {\n const viewBox = readSvgViewBox(svg);\n if (viewBox) return pxPerUserFromViewBox(svg.getBoundingClientRect(), viewBox);\n const ctm = svg.getScreenCTM();\n if (!ctm) return 1;\n return pxPerUserFromCtm(ctm);\n}\n\n/** Invert `translate(pan) scale(zoom)` so a user-space point becomes world geometry. */\nexport function userToWorld(user: Vec2, pan: Vec2, zoom: number): Vec2 {\n const z = zoom === 0 ? 1 : zoom;\n return {\n x: (user.x - pan.x) / z,\n y: (user.y - pan.y) / z,\n };\n}\n\nexport const EDITOR_MIN_ZOOM = 0.2;\n/** High enough that designers can park on a single storefront or route node. */\nexport const EDITOR_MAX_ZOOM = 128;\n\nexport function clampEditorZoom(zoom: number): number {\n return Math.min(EDITOR_MAX_ZOOM, Math.max(EDITOR_MIN_ZOOM, zoom));\n}\n\n/** Same per-event step as PORTAL default MapViewer (three-stdlib OrbitControls). */\nexport function nextEditorZoomFromWheel(\n currentZoom: number,\n event: Pick<WheelEvent, 'deltaY'>,\n): number {\n return nextZoomFromWheel(currentZoom, event.deltaY, {\n min: EDITOR_MIN_ZOOM,\n max: EDITOR_MAX_ZOOM,\n });\n}\n\n/** CSS pixels per SVG user unit from a screen CTM (ignores translation). */\nexport function pxPerUserFromCtm(ctm: Affine2): number {\n return Math.hypot(ctm.a, ctm.b);\n}\n\n/** World-space length that draws as `px` CSS pixels after `scale(zoom)`. */\nexport function screenPxToWorld(px: number, zoom: number, pxPerUser: number): number {\n const z = zoom === 0 ? 1 : zoom;\n const scale = pxPerUser > 0 ? pxPerUser : 1;\n return px / (scale * z);\n}\n\n/**\n * Counter-scale for editor handles whose world radius was computed at\n * `sizeZoom` while the SVG group is already at `liveZoom`.\n *\n * Wheel zoom paints `scale(liveZoom)` immediately and defers React, so\n * handle radii stay at the last settled zoom. This ratio keeps those\n * circles screen-constant without re-rendering the floor.\n */\nexport function editorHandleScale(sizeZoom: number, liveZoom: number): number {\n const size = sizeZoom === 0 ? 1 : sizeZoom;\n const live = liveZoom === 0 ? 1 : liveZoom;\n return size / live;\n}\n\n/**\n * Next pan so `user` (cursor or pinch midpoint in viewBox space) stays over\n * the same world point after `zoom` → `nextZoom`. Without this, SVG\n * `scale()` pivots around the viewBox origin (top-left).\n */\nexport function panAfterZoom(\n user: Vec2,\n pan: Vec2,\n zoom: number,\n nextZoom: number,\n): Vec2 {\n const world = userToWorld(user, pan, zoom);\n return {\n x: user.x - nextZoom * world.x,\n y: user.y - nextZoom * world.y,\n };\n}\n\n/** Pan that keeps a known world point under `user` at `zoom`. */\nexport function panKeepingWorldAtUser(user: Vec2, world: Vec2, zoom: number): Vec2 {\n return {\n x: user.x - zoom * world.x,\n y: user.y - zoom * world.y,\n };\n}\n\nexport const EDITOR_ZOOM_ANIM_MS = 240;\n\nexport function easeOutCubic(t: number): number {\n const x = Math.min(1, Math.max(0, t));\n return 1 - (1 - x) ** 3;\n}\n\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\n/** Interpolate pan + zoom for a smooth +/− / Reset. */\nexport function interpolateView(\n from: { pan: Vec2; zoom: number },\n to: { pan: Vec2; zoom: number },\n t: number,\n): { pan: Vec2; zoom: number } {\n const e = easeOutCubic(t);\n return {\n pan: {\n x: lerp(from.pan.x, to.pan.x, e),\n y: lerp(from.pan.y, to.pan.y, e),\n },\n zoom: lerp(from.zoom, to.zoom, e),\n };\n}\n","import type { ShapeKind, ThemeDefaults } from '../../core';\nimport {\n isTransparentColor,\n isTransparentPadKind,\n resolvedShapeFill,\n staffPadPlaceholderFill,\n WALKING_PATH_COLOR,\n} from '../../core';\n\n/** Edit Map fills stay translucent so the grid shows through for alignment. */\nexport function editorShapeFillOpacity(kind: ShapeKind): number {\n if (kind === 'void') return 0.22;\n if (kind === 'amenity') return 0.15;\n if (kind === 'unit' || kind === 'parking_zone' || kind === 'custom') return 0.38;\n return 0.3;\n}\n\nexport function editorShapeFill(\n shape: { kind: ShapeKind; style?: { fill?: string } },\n theme: ThemeDefaults,\n assignment?: { bgColor?: string | null } | null,\n): string {\n if (shape.kind === 'walkable') return WALKING_PATH_COLOR;\n if (shape.kind === 'void') return shape.style?.fill ?? '#94a3b8';\n const published = resolvedShapeFill(\n shape.kind,\n theme,\n shape.style?.fill,\n assignment,\n );\n if (\n isTransparentPadKind(shape.kind) &&\n isTransparentColor(published)\n ) {\n return staffPadPlaceholderFill(shape.kind, theme);\n }\n return published;\n}\n","import {\n darkenShapeFill,\n INTERACTIVE_SHAPE_KINDS,\n type ShapeKind,\n} from '../../core';\nimport {\n canPlaceNewRoute,\n emptyCanvasDragPans,\n isShapeDrawTool,\n isStampDrawTool,\n type EditorTool,\n} from '../tools';\n\n/** Wayfinding / vertex chrome — not a customer Style color. */\nexport const EDITOR_GUIDE_COLOR = '#2563eb';\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\n/** Cursor for the map surface. Space pan wins over the active tool. */\nexport function editorMapCursor(args: {\n tool: EditorTool;\n readOnly?: boolean;\n spaceHeld?: boolean;\n panning?: boolean;\n shapeDragging?: boolean;\n routeEdgeHover?: boolean;\n anchorDragging?: boolean;\n edgeDragging?: boolean;\n edgeHover?: boolean;\n}): string | undefined {\n if (args.spaceHeld && !args.panning) return 'grab';\n if (args.spaceHeld && args.panning) return 'grabbing';\n if (args.routeEdgeHover) return 'none';\n if (args.anchorDragging) return 'grabbing';\n if (args.edgeDragging) return 'grabbing';\n if (args.edgeHover) return 'none';\n if (args.tool === 'draw-text') return 'text';\n if (args.tool === 'draw-entrance') return 'cell';\n if (args.panning || args.shapeDragging) return 'grabbing';\n if (emptyCanvasDragPans(args.tool)) return 'grab';\n if (isShapeDrawTool(args.tool) && !args.readOnly) return 'cell';\n if (canPlaceNewRoute(args.tool) && !args.readOnly) return 'crosshair';\n return undefined;\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\n/** Hover and selection share the same darker shade of the shape fill. */\nexport function editorShapeEmphasisColor(\n fill: string,\n emphasized: boolean,\n): string {\n if (!emphasized) return fill;\n return darkenShapeFill(fill);\n}\n","import type {\n AssignmentIconTheme,\n CmAmenityCatalogItem,\n CmShape,\n CmShapeAssignment,\n LabelAlign,\n MapAssignRetailer,\n} from '../core';\nimport {\n assignmentOverlayImageUrl,\n assignmentOverlayRenderSize,\n assignmentOverlayVisible,\n assignmentSpecialIconId,\n DEFAULT_ASSIGNMENT_SIZE,\n geometryBBox,\n normalizeLabelAlign,\n publishedShapeLabel,\n resolveFetchUrl,\n resolvedAssignmentIconColor,\n} from '../core';\nimport { getMapSpecialSvg, mapSpecialSvgToDataUrl } from '../specialIcons';\n\nexport type WayfindingAssignedOverlay = {\n shapeId: number;\n x: number;\n y: number;\n rotate: number;\n /** Text font size, or image width (logos are already scaled). */\n size: number;\n color: string;\n align: LabelAlign;\n text?: string;\n imageUrl?: string;\n iconId?: string;\n};\n\ntype OverlayShape = Pick<CmShape, 'id' | 'kind' | 'geometry' | 'label' | 'style'>;\n\n/**\n * Live editor display uses the session CDN URL, not the persisted S3 key —\n * same as `compileDocument` when `persistMediaKeys` is off.\n */\nexport function liveDisplayRetailer(\n retailer?: MapAssignRetailer | null,\n): MapAssignRetailer | null {\n if (!retailer) return null;\n const key = retailer.logoKey?.trim() ?? '';\n if (!retailer.logoUrl && /^https?:\\/\\//i.test(key)) return retailer;\n return { ...retailer, logoKey: null };\n}\n\n/**\n * Name, logo, or amenity / kiosk icon for an assigned polygon. Unassigned\n * leftover text is dropped. Used by the wayfinding canvas only.\n */\nexport function wayfindingAssignedOverlay(\n shape: OverlayShape,\n assignment: CmShapeAssignment | null | undefined,\n retailer: MapAssignRetailer | null | undefined,\n amenities: Array<Pick<CmAmenityCatalogItem, 'id' | 'code'>> = [],\n theme: AssignmentIconTheme,\n): WayfindingAssignedOverlay | null {\n if (shape.kind === 'label' || shape.kind === 'entrance') return null;\n const displayRetailer = liveDisplayRetailer(retailer);\n const label = publishedShapeLabel(shape, assignment, displayRetailer);\n if (!assignmentOverlayVisible(assignment, label)) return null;\n const box = geometryBBox(shape.geometry);\n const fontSize =\n label.size || assignment?.size || DEFAULT_ASSIGNMENT_SIZE;\n const imageUrl = assignmentOverlayImageUrl(\n assignment,\n displayRetailer,\n label,\n );\n const iconId = imageUrl\n ? undefined\n : assignmentSpecialIconId(assignment, amenities);\n const text = imageUrl || iconId ? undefined : label.text?.trim() || undefined;\n if (!imageUrl && !iconId && !text) return null;\n return {\n shapeId: shape.id,\n x: (box.minX + box.maxX) / 2 + (label.offsetX ?? 0),\n y: (box.minY + box.maxY) / 2 + (label.offsetY ?? 0),\n rotate: label.rotate ?? 0,\n size: imageUrl\n ? assignmentOverlayRenderSize(fontSize, assignment)\n : fontSize,\n color: resolvedAssignmentIconColor(\n assignment,\n theme,\n label.color,\n shape.kind,\n ),\n align: normalizeLabelAlign(label.align),\n text,\n imageUrl,\n iconId,\n };\n}\n\nexport function wayfindingAssignedOverlays(input: {\n shapes: OverlayShape[];\n /** Outdoor/base shapes shown beneath the active building floor. */\n underlayShapes?: OverlayShape[];\n assignments: CmShapeAssignment[];\n retailers?: MapAssignRetailer[];\n amenities?: Array<Pick<CmAmenityCatalogItem, 'id' | 'code'>>;\n theme: AssignmentIconTheme;\n}): WayfindingAssignedOverlay[] {\n const retailerById = new Map(\n (input.retailers ?? []).map((item) => [item.id, item]),\n );\n const assignmentByShapeId = new Map(\n input.assignments.map((row) => [row.shapeId, row]),\n );\n const amenities = input.amenities ?? [];\n const overlays: WayfindingAssignedOverlay[] = [];\n for (const shape of [...(input.underlayShapes ?? []), ...input.shapes]) {\n const assignment = assignmentByShapeId.get(shape.id);\n const retailer =\n assignment?.retailerId != null\n ? retailerById.get(assignment.retailerId) ?? null\n : null;\n const overlay = wayfindingAssignedOverlay(\n shape,\n assignment,\n retailer,\n amenities,\n input.theme,\n );\n if (overlay) overlays.push(overlay);\n }\n return overlays;\n}\n\nexport function wayfindingOverlayHref(\n overlay: Pick<WayfindingAssignedOverlay, 'imageUrl' | 'iconId' | 'color'>,\n imageProxyUrl?: string | null,\n): string | undefined {\n if (overlay.imageUrl) return resolveFetchUrl(overlay.imageUrl, imageProxyUrl);\n if (!overlay.iconId) return undefined;\n const svg = getMapSpecialSvg(overlay.iconId);\n if (!svg) return undefined;\n return mapSpecialSvgToDataUrl(svg, overlay.color);\n}\n","import React from 'react';\nimport { labelSvgTextAnchor } from '../../core';\nimport {\n LABEL_FONT_FAMILY,\n LABEL_LINE_HEIGHT,\n labelTextLines,\n} from '../labelText';\nimport {\n wayfindingOverlayHref,\n type WayfindingAssignedOverlay,\n} from '../assignmentOverlay';\n\n/** Pointer-events none so wayfinding hover / click stay on the polygon. */\nexport function AssignedShapeOverlay({\n overlay,\n imageProxyUrl,\n}: {\n overlay: WayfindingAssignedOverlay;\n imageProxyUrl?: string | null;\n}) {\n const { x, y, rotate, size, color, align, text } = overlay;\n const href = wayfindingOverlayHref(overlay, imageProxyUrl);\n const transform = rotate ? `rotate(${rotate} ${x} ${y})` : undefined;\n return (\n <g\n className=\"eyeon-map-canvas__assigned-overlay\"\n data-shape-id={overlay.shapeId}\n transform={transform}\n pointerEvents=\"none\"\n >\n {href ? (\n <image\n href={href}\n x={x - size / 2}\n y={y - size / 2}\n width={size}\n height={size}\n preserveAspectRatio=\"xMidYMid meet\"\n />\n ) : text ? (\n <AssignedOverlayText\n text={text}\n x={x}\n y={y}\n size={size}\n color={color}\n align={align}\n />\n ) : null}\n </g>\n );\n}\n\nfunction AssignedOverlayText({\n text,\n x,\n y,\n size,\n color,\n align,\n}: {\n text: string;\n x: number;\n y: number;\n size: number;\n color: string;\n align: WayfindingAssignedOverlay['align'];\n}) {\n const lines = labelTextLines(text);\n const lineHeight = size * LABEL_LINE_HEIGHT;\n const blockHeight = lines.length * lineHeight;\n return (\n <text\n fontFamily={LABEL_FONT_FAMILY}\n fontSize={size}\n fill={color}\n textAnchor={labelSvgTextAnchor(align)}\n style={{ userSelect: 'none' }}\n >\n {lines.map((line, index) => (\n <tspan\n key={index}\n x={x}\n y={y - blockHeight / 2 + (index + 0.5) * lineHeight}\n dominantBaseline=\"central\"\n >\n {line || ' '}\n </tspan>\n ))}\n </text>\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport {\n outdoorDecorationFromSvg,\n resolveFetchUrl,\n type StaticLayerTheme,\n} from '../../core';\n\nexport function OutdoorSvgUnderlay({\n url,\n imageProxyUrl,\n suppressIds,\n theme,\n}: {\n url: string;\n imageProxyUrl?: string | null;\n suppressIds?: ReadonlySet<string>;\n theme?: StaticLayerTheme | null;\n}) {\n const [svgText, setSvgText] = useState<string | null>(null);\n const suppressKey = useMemo(\n () => (suppressIds ? [...suppressIds].sort().join('\\0') : ''),\n [suppressIds],\n );\n\n useEffect(() => {\n let cancelled = false;\n const controller = new AbortController();\n const fetchUrl = resolveFetchUrl(url, imageProxyUrl);\n fetch(fetchUrl, { signal: controller.signal })\n .then((res) => {\n if (!res.ok) throw new Error(`SVG fetch ${res.status}`);\n return res.text();\n })\n .then((text) => {\n if (cancelled) return;\n setSvgText(text);\n })\n .catch((err) => {\n if (cancelled) return;\n if (err instanceof DOMException && err.name === 'AbortError') return;\n setSvgText(null);\n console.warn(\n `[eyeon-map] Outdoor SVG failed to load from ${fetchUrl}. ` +\n 'If this is a cross-origin error, pass `imageProxyUrl` to MapEditor.',\n err,\n );\n });\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [url, imageProxyUrl]);\n\n const paths = useMemo(() => {\n if (!svgText) return [];\n const blocked = suppressKey\n ? new Set(suppressKey.split('\\0').filter(Boolean))\n : undefined;\n return outdoorDecorationFromSvg(svgText, blocked, theme);\n }, [svgText, suppressKey, theme]);\n\n if (paths.length === 0) return null;\n\n return (\n <g className=\"eyeon-map-canvas__outdoor-svg\" pointerEvents=\"none\">\n {paths.map((item, index) => (\n <path\n key={`${item.id}-${index}`}\n d={item.d}\n fill={item.fill ?? 'none'}\n stroke={item.stroke ?? 'none'}\n strokeWidth={item.strokeWidth ?? 0}\n opacity={item.opacity ?? 1}\n />\n ))}\n </g>\n );\n}\n","import type { ShapeKind } from '../../core';\nimport { INTERACTIVE_SHAPE_KINDS } from '../../core';\nimport { isStampShape } from '../entranceIcon';\n\n/** Outdoor underlay items that look clickable on a floor. */\nexport function isUnderlayHintShape(kind: ShapeKind): boolean {\n return INTERACTIVE_SHAPE_KINDS.includes(kind);\n}\n\n/** Text and entrance hit-boxes stay on Outdoor — do not ghost them onto building floors. */\nexport function isUnderlayDrawnShape(shape: {\n kind: string;\n label?: { text?: string; imageKey?: string | null } | null;\n}): boolean {\n return !isStampShape(shape);\n}\n\nexport function underlaySwitchHint(kind: ShapeKind): string {\n if (kind === 'unit' || kind === 'parking_zone') {\n return 'Outdoor store — click to switch to Outdoor and edit';\n }\n if (kind === 'amenity') {\n return 'Outdoor amenity — click to switch to Outdoor and edit';\n }\n if (kind === 'kiosk_screen') {\n return 'Outdoor kiosk — click to switch to Outdoor and edit';\n }\n return 'Outdoor item — click to switch to Outdoor and edit';\n}\n","import type {\n AnchorKind,\n BatchOp,\n CmAnchor,\n CmRouteEdge,\n CmShape,\n ShapeKind,\n Vec2,\n} from '../core';\nimport {\n DEFAULT_WELD_TOLERANCE,\n INTERACTIVE_SHAPE_KINDS,\n distance,\n geometryBBox,\n projectOntoSegment,\n routeAnchorKindForShape,\n} from '../core';\n\nexport const WAYFINDING_SNAP_PX = 28;\n/**\n * One pick radius (CSS pixels) for wayfinding: the anchor dot, the + on a\n * route, and click-to-connect. On-route and off-route use the same circle.\n */\nexport const WAYFINDING_ANCHOR_HIT_PX = 10;\n/**\n * Hold a midpoint insert until a second click can delete the line instead.\n * Must stay inside a typical OS double-click window.\n */\nexport const ROUTE_EDGE_CLICK_MS = 320;\n\nexport function showsWayfinding(tool: string, routeMode = false): boolean {\n if (\n tool === 'draw-route' ||\n tool === 'create-route' ||\n tool === 'create-route-multi'\n ) {\n return true;\n }\n return routeMode && tool === 'select';\n}\n\n/**\n * First empty Create Route click is a preview. A second click commits both\n * ends. Leaving the tool drops the draft so a lone start is never kept.\n */\n/** Esc and Undo share this: a lone preview start is local; anything else undoes. */\nexport function routeSessionUndoKind(session: {\n routeDraftPoint: Vec2 | null;\n storeLinkPreview: unknown;\n}): 'clear-only' | 'clear-and-undo' {\n if (session.routeDraftPoint != null && session.storeLinkPreview == null) {\n return 'clear-only';\n }\n return 'clear-and-undo';\n}\n\nexport function beginOrContinueRouteDraft(\n draft: Vec2 | null,\n world: Vec2,\n): { nextDraft: Vec2 | null; start: Vec2 | null; end: Vec2 | null } {\n if (!draft) return { nextDraft: world, start: null, end: null };\n return { nextDraft: null, start: draft, end: world };\n}\n\n/** Preview line from a started route/store-link to the cursor or snap. */\nexport function routeRubberBand(\n from: Vec2 | null | undefined,\n to: Vec2 | null | undefined,\n): { from: Vec2; to: Vec2 } | null {\n if (!from || !to) return null;\n if (distance(from, to) <= 0.01) return null;\n return { from, to };\n}\n\nexport function isWayfindingShape(kind: ShapeKind): boolean {\n return INTERACTIVE_SHAPE_KINDS.includes(kind);\n}\n\n/** Outdoor pad sites are not routed — helpers and store links stay indoor. */\nexport function wayfindingLinksShapes(\n level: { kind?: string } | null | undefined,\n): boolean {\n return level?.kind !== 'outdoor';\n}\n\nexport function anchorKindForShape(kind: ShapeKind): AnchorKind {\n return routeAnchorKindForShape(kind);\n}\n\nexport function shapeRoutePoint(shape: Pick<CmShape, 'geometry'>): Vec2 {\n const box = geometryBBox(shape.geometry);\n if (box.maxX > box.minX || box.maxY > box.minY) {\n return {\n x: (box.minX + box.maxX) / 2,\n y: (box.minY + box.maxY) / 2,\n };\n }\n const first = shape.geometry.polygons[0]?.[0];\n return first ?? { x: 0, y: 0 };\n}\n\nexport function shapeRouteAnchor(\n shapeId: number,\n anchors: Array<Pick<CmAnchor, 'id' | 'shapeId'>>,\n): Pick<CmAnchor, 'id' | 'shapeId'> | undefined {\n return anchors.find((anchor) => anchor.shapeId === shapeId);\n}\n\nexport function anchorHasEdge(\n anchorId: number,\n edges: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>>,\n): boolean {\n return edges.some(\n (edge) => edge.fromAnchorId === anchorId || edge.toAnchorId === anchorId,\n );\n}\n\nexport function routeComponentAnchorIds(\n anchorId: number,\n edges: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>>,\n): Set<number> {\n const ids = new Set([anchorId]);\n const pending = [anchorId];\n while (pending.length > 0) {\n const current = pending.pop()!;\n for (const edge of edges) {\n let next: number | null = null;\n if (edge.fromAnchorId === current) next = edge.toAnchorId;\n if (edge.toAnchorId === current) next = edge.fromAnchorId;\n if (next == null || ids.has(next)) continue;\n ids.add(next);\n pending.push(next);\n }\n }\n return ids;\n}\n\nexport function walkEdgeExists(\n edges: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>>,\n a: number,\n b: number,\n): boolean {\n return edges.some(\n (edge) =>\n (edge.fromAnchorId === a && edge.toAnchorId === b) ||\n (edge.fromAnchorId === b && edge.toAnchorId === a),\n );\n}\n\nexport type RouteSnapTarget =\n | { type: 'junction'; anchorId: number; point: Vec2; distance: number }\n | {\n type: 'edge';\n edgeId: number;\n fromAnchorId: number;\n toAnchorId: number;\n point: Vec2;\n distance: number;\n };\n\nfunction isSnappableRouteEdge(edge: Pick<CmRouteEdge, 'kind'>): boolean {\n return (\n edge.kind === 'walk' ||\n edge.kind === 'unit_link' ||\n edge.kind === 'entrance_link'\n );\n}\n\n/** The orange point we are linking from — not every destination on that store. */\nexport function storeLinkOriginIds(\n anchors: Array<Pick<CmAnchor, 'id' | 'shapeId' | 'x' | 'y'>>,\n preview: { shapeId: number; origin: Vec2 } | null | undefined,\n): Set<number> {\n if (!preview) return new Set();\n const ids = new Set<number>();\n for (const anchor of anchors) {\n if (\n anchor.shapeId === preview.shapeId &&\n distance(anchor, preview.origin) <= DEFAULT_WELD_TOLERANCE\n ) {\n ids.add(anchor.id);\n }\n }\n return ids;\n}\n\n/**\n * Nearest route point or edge within `maxDist` (same circular hit on and off\n * the path). An existing anchor wins only when the cursor is inside that\n * circle; otherwise a mid-edge hit stays a split so the + can sit close to\n * a neighboring point.\n */\nexport function nearestRouteSnap(\n point: Vec2,\n anchors: CmAnchor[],\n edges: CmRouteEdge[],\n excludeIds: ReadonlySet<number>,\n maxDist: number,\n anchorById: ReadonlyMap<number, CmAnchor> = new Map(\n anchors.map((anchor) => [anchor.id, anchor]),\n ),\n): RouteSnapTarget | null {\n let bestJunction: RouteSnapTarget | null = null;\n let bestEdge: RouteSnapTarget | null = null;\n\n for (const anchor of anchors) {\n if (excludeIds.has(anchor.id)) continue;\n const d = distance(anchor, point);\n if (d > maxDist) continue;\n if (!bestJunction || d < bestJunction.distance) {\n bestJunction = {\n type: 'junction',\n anchorId: anchor.id,\n point: { x: anchor.x, y: anchor.y },\n distance: d,\n };\n }\n }\n\n for (const edge of edges) {\n if (!isSnappableRouteEdge(edge)) continue;\n if (excludeIds.has(edge.fromAnchorId) || excludeIds.has(edge.toAnchorId)) {\n continue;\n }\n const from = anchorById.get(edge.fromAnchorId);\n const to = anchorById.get(edge.toAnchorId);\n if (!from || !to) continue;\n const hit = projectOntoSegment(point, from, to);\n if (hit.distance > maxDist) continue;\n if (!bestEdge || hit.distance < bestEdge.distance) {\n bestEdge = {\n type: 'edge',\n edgeId: edge.id,\n fromAnchorId: edge.fromAnchorId,\n toAnchorId: edge.toAnchorId,\n point: hit.point,\n distance: hit.distance,\n };\n }\n }\n\n return bestJunction ?? bestEdge;\n}\n\nexport interface ConnectShapeToRouteInput {\n shape: CmShape;\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n mapId: number;\n from: Vec2;\n drop: Vec2;\n maxDist: number;\n allocId: () => number;\n}\n\nfunction walkEdge(\n id: number,\n mapId: number,\n fromAnchorId: number,\n toAnchorId: number,\n kind: CmRouteEdge['kind'] = 'walk',\n): CmRouteEdge {\n return {\n id,\n mapId,\n fromAnchorId,\n toAnchorId,\n weight: null,\n directed: false,\n accessible: true,\n kind,\n };\n}\n\n/** Create a store/amenity route point at the click. Another click elsewhere adds another. */\nexport function ensureShapeRouteAnchorOps(input: {\n shape: CmShape;\n anchors: CmAnchor[];\n allocId: () => number;\n point?: Vec2;\n}): { ops: BatchOp[]; anchorId: number } {\n const { shape, anchors, allocId } = input;\n const point = input.point ?? shapeRoutePoint(shape);\n const existing = anchors.find(\n (anchor) =>\n anchor.shapeId === shape.id &&\n distance(anchor, point) <= DEFAULT_WELD_TOLERANCE,\n );\n if (existing) return { ops: [], anchorId: existing.id };\n const unit: CmAnchor = {\n id: allocId(),\n levelId: shape.levelId,\n shapeId: shape.id,\n kind: anchorKindForShape(shape.kind),\n x: point.x,\n y: point.y,\n connectorId: null,\n };\n return { ops: [{ op: 'upsert_anchor', anchor: unit }], anchorId: unit.id };\n}\n\n/**\n * Ensure the shape has a destination anchor, then hook it to the walking path\n * at `drop` (existing junction or a split in a walk edge).\n */\nexport function connectShapeToRouteOps(input: ConnectShapeToRouteInput): BatchOp[] {\n const { shape, anchors, edges, mapId, from, drop, maxDist, allocId } = input;\n const ops: BatchOp[] = [];\n let unit =\n anchors.find(\n (anchor) =>\n anchor.shapeId === shape.id &&\n distance(anchor, from) <= DEFAULT_WELD_TOLERANCE,\n ) ?? null;\n\n if (!unit) {\n unit = {\n id: allocId(),\n levelId: shape.levelId,\n shapeId: shape.id,\n kind: anchorKindForShape(shape.kind),\n x: from.x,\n y: from.y,\n connectorId: null,\n };\n ops.push({ op: 'upsert_anchor', anchor: unit });\n }\n\n const snap = nearestRouteSnap(\n drop,\n anchors,\n edges,\n new Set([unit.id]),\n maxDist,\n );\n if (!snap) return ops;\n if (distance(unit, snap.point) <= DEFAULT_WELD_TOLERANCE) return ops;\n\n let junctionId: number;\n const nextEdges = edges.slice();\n\n if (snap.type === 'junction') {\n junctionId = snap.anchorId;\n } else {\n const source = edges.find((edge) => edge.id === snap.edgeId);\n if (!source) return ops;\n junctionId = allocId();\n ops.push({\n op: 'upsert_anchor',\n anchor: {\n id: junctionId,\n levelId: shape.levelId,\n shapeId: null,\n kind: 'junction',\n x: snap.point.x,\n y: snap.point.y,\n connectorId: null,\n },\n });\n ops.push({ op: 'delete_edge', edgeId: source.id });\n const left = walkEdge(allocId(), mapId, source.fromAnchorId, junctionId, source.kind);\n const right = walkEdge(allocId(), mapId, junctionId, source.toAnchorId, source.kind);\n ops.push({ op: 'upsert_edge', edge: left });\n ops.push({ op: 'upsert_edge', edge: right });\n nextEdges.push(left, right);\n }\n\n if (walkEdgeExists(nextEdges, unit.id, junctionId)) return ops;\n\n const linkKind = unit.kind === 'entrance' ? 'entrance_link' : 'unit_link';\n ops.push({\n op: 'upsert_edge',\n edge: walkEdge(allocId(), mapId, unit.id, junctionId, linkKind),\n });\n return ops;\n}\n\n/** Snap a loose route junction onto an existing route and join the graph. */\nexport function connectRouteAnchorToRouteOps(input: {\n anchor: CmAnchor;\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n mapId: number;\n drop: Vec2;\n maxDist: number;\n allocId: () => number;\n}): BatchOp[] {\n const { anchor, anchors, edges, mapId, drop, maxDist, allocId } = input;\n const incident = edges.filter(\n (edge) =>\n edge.fromAnchorId === anchor.id || edge.toAnchorId === anchor.id,\n );\n if (anchor.shapeId != null || incident.length > 1) return [];\n\n const snap = nearestRouteSnap(\n drop,\n anchors,\n edges,\n routeComponentAnchorIds(anchor.id, edges),\n maxDist,\n );\n if (!snap) return [];\n\n if (snap.type === 'junction') {\n if (incident.length === 1) {\n const source = incident[0];\n const otherId =\n source.fromAnchorId === anchor.id\n ? source.toAnchorId\n : source.fromAnchorId;\n const ops: BatchOp[] = [];\n if (!walkEdgeExists(edges, otherId, snap.anchorId)) {\n ops.push({\n op: 'upsert_edge',\n edge: {\n ...source,\n fromAnchorId:\n source.fromAnchorId === anchor.id\n ? snap.anchorId\n : source.fromAnchorId,\n toAnchorId:\n source.toAnchorId === anchor.id\n ? snap.anchorId\n : source.toAnchorId,\n },\n });\n } else {\n ops.push({ op: 'delete_edge', edgeId: source.id });\n }\n ops.push({ op: 'delete_anchor', anchorId: anchor.id });\n return ops;\n }\n\n const link = linkRouteAnchorsOp(\n mapId,\n anchor.id,\n snap.anchorId,\n edges,\n allocId,\n );\n const ops: BatchOp[] = [\n {\n op: 'upsert_anchor',\n anchor: { ...anchor, x: snap.point.x, y: snap.point.y },\n },\n ];\n if (link) ops.push(link);\n return ops;\n }\n\n const source = edges.find((edge) => edge.id === snap.edgeId);\n if (!source) return [];\n return [\n {\n op: 'upsert_anchor',\n anchor: { ...anchor, x: snap.point.x, y: snap.point.y },\n },\n { op: 'delete_edge', edgeId: source.id },\n {\n op: 'upsert_edge',\n edge: walkEdge(\n allocId(),\n mapId,\n source.fromAnchorId,\n anchor.id,\n source.kind,\n ),\n },\n {\n op: 'upsert_edge',\n edge: walkEdge(\n allocId(),\n mapId,\n anchor.id,\n source.toAnchorId,\n source.kind,\n ),\n },\n ];\n}\n\nexport function linkRouteAnchorsOp(\n mapId: number,\n fromAnchorId: number,\n toAnchorId: number,\n edges: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>>,\n allocId: () => number,\n): BatchOp | null {\n if (fromAnchorId === toAnchorId) return null;\n if (walkEdgeExists(edges, fromAnchorId, toAnchorId)) return null;\n return {\n op: 'upsert_edge',\n edge: walkEdge(allocId(), mapId, fromAnchorId, toAnchorId),\n };\n}\n\nexport function insertJunctionOnWalkEdgeOps(input: {\n levelId: number;\n mapId: number;\n edge: CmRouteEdge;\n point: Vec2;\n allocId: () => number;\n}): { ops: BatchOp[]; junctionId: number } {\n const { levelId, mapId, edge, point, allocId } = input;\n const junctionId = allocId();\n return {\n junctionId,\n ops: [\n {\n op: 'upsert_anchor',\n anchor: {\n id: junctionId,\n levelId,\n shapeId: null,\n kind: 'junction',\n x: point.x,\n y: point.y,\n connectorId: null,\n },\n },\n { op: 'delete_edge', edgeId: edge.id },\n {\n op: 'upsert_edge',\n edge: walkEdge(allocId(), mapId, edge.fromAnchorId, junctionId, edge.kind),\n },\n {\n op: 'upsert_edge',\n edge: walkEdge(allocId(), mapId, junctionId, edge.toAnchorId, edge.kind),\n },\n ],\n };\n}\n\n/**\n * Remove a walking path. Endpoints that still join other routes stay;\n * endpoints that would be left with no connections are removed too.\n */\nexport function deleteRouteEdgeOps(\n edgeId: number,\n edges: Array<Pick<CmRouteEdge, 'id' | 'fromAnchorId' | 'toAnchorId'>>,\n): BatchOp[] {\n const edge = edges.find((item) => item.id === edgeId);\n if (!edge) return [];\n const remaining = edges.filter((item) => item.id !== edgeId);\n const ops: BatchOp[] = [{ op: 'delete_edge', edgeId }];\n for (const anchorId of [edge.fromAnchorId, edge.toAnchorId]) {\n if (!anchorHasEdge(anchorId, remaining)) {\n ops.push({ op: 'delete_anchor', anchorId });\n }\n }\n return ops;\n}\n\n/**\n * Remove a route point. A 2-way corridor is healed so the path stays joined.\n */\nexport function deleteRouteAnchorOps(\n anchorId: number,\n mapId: number,\n edges: CmRouteEdge[],\n allocId: () => number,\n): BatchOp[] {\n const incident = edges.filter(\n (edge) => edge.fromAnchorId === anchorId || edge.toAnchorId === anchorId,\n );\n const ops: BatchOp[] = incident.map((edge) => ({\n op: 'delete_edge' as const,\n edgeId: edge.id,\n }));\n const walkNeighbors = [\n ...new Set(\n incident\n .filter((edge) => edge.kind === 'walk')\n .map((edge) =>\n edge.fromAnchorId === anchorId ? edge.toAnchorId : edge.fromAnchorId,\n ),\n ),\n ];\n if (\n walkNeighbors.length === 2 &&\n !walkEdgeExists(edges, walkNeighbors[0], walkNeighbors[1])\n ) {\n ops.push({\n op: 'upsert_edge',\n edge: walkEdge(allocId(), mapId, walkNeighbors[0], walkNeighbors[1]),\n });\n }\n ops.push({ op: 'delete_anchor', anchorId });\n return ops;\n}\n","import React, {\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type {\n CmAmenityCatalogItem,\n CmAnchor,\n CmLevel,\n CmRouteEdge,\n CmShape,\n CmShapeAssignment,\n MapAssignRetailer,\n ShapeGeometry,\n ShapeKind,\n ShapeLabel,\n ThemeDefaults,\n Vec2,\n ViewBox,\n} from '../../core';\nimport {\n geometryBBox,\n INTERACTIVE_SHAPE_KINDS,\n labelAlignX,\n labelSvgTextAnchor,\n normalizeLabelAlign,\n svgIdsOwnedByShapes,\n unionViewBox,\n} from '../../core';\nimport { isEditableTypingTarget } from '../history';\nimport {\n canJoinOpenEnds,\n canPlaceNewRoute,\n canSelectShapes,\n emptyCanvasDragPans,\n isEllipseDrawTool,\n isPolygonDrawTool,\n popPolygonDraftPoint,\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 constrainOrthogonal,\n constrainVertexOrthogonal,\n isSpacePanKey,\n type OrthoConstraint,\n} from '../ortho';\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 vertexNeighborPoints,\n polygonsToGeometry,\n removeVertex,\n translateEdge,\n translateGeometry,\n} from '../geometryEdit';\nimport {\n ellipseBoundsFromDrag,\n ellipseGeometry,\n} from '../ellipseDraw';\nimport {\n DEFAULT_LABEL_TEXT,\n LABEL_FONT_FAMILY,\n LABEL_LINE_HEIGHT,\n defaultLabelSize,\n defaultTextLabel,\n isTextLabel,\n labelBoxCenter,\n labelTextLines,\n textLabelGeometry,\n} from '../labelText';\nimport {\n DEFAULT_ENTRANCE_SIZE,\n defaultEntranceLabel,\n entranceIconGeometry,\n isEntranceIcon,\n isStampShape,\n} from '../entranceIcon';\nimport { entranceIconDataUrl } from '../../specialIcons';\nimport { ensureMapFont } from '../../fonts/mapFontUrl';\nimport {\n clampEditorZoom,\n clientToSvgUser,\n EDITOR_ZOOM_ANIM_MS,\n editorHandleScale,\n interpolateView,\n nextEditorZoomFromWheel,\n panAfterZoom,\n panKeepingWorldAtUser,\n pxPerUserFromSvg,\n screenPxToWorld,\n userToWorld,\n} from './coords';\nimport { editorShapeFill, editorShapeFillOpacity } from './editorFill';\nimport {\n EDITOR_GUIDE_COLOR,\n editorHoverFillOpacity,\n editorMapCursor,\n editorSelectCursor,\n editorShapeEmphasisColor,\n isHoverHighlightShape,\n} from './editorHover';\nimport { wayfindingAssignedOverlays } from '../assignmentOverlay';\nimport { AssignedShapeOverlay } from './AssignedShapeOverlay';\nimport { OutdoorSvgUnderlay } from './OutdoorSvgUnderlay';\nimport {\n isUnderlayDrawnShape,\n isUnderlayHintShape,\n underlaySwitchHint,\n} from './underlayHint';\nimport {\n WAYFINDING_ANCHOR_HIT_PX,\n WAYFINDING_SNAP_PX,\n ROUTE_EDGE_CLICK_MS,\n anchorHasEdge,\n beginOrContinueRouteDraft,\n isWayfindingShape,\n routeRubberBand,\n routeComponentAnchorIds,\n routeSessionUndoKind,\n nearestRouteSnap,\n showsWayfinding,\n storeLinkOriginIds,\n wayfindingLinksShapes,\n type RouteSnapTarget,\n} from '../routeStubs';\n\nconst ANCHOR_R_PX = 9;\nconst ANCHOR_R_SELECTED_PX = 11;\nconst ANCHOR_HIT_PX = 16;\nconst ANCHOR_STROKE_PX = 2;\n/** Store / amenity / kiosk route points — distinct from selected (accent) junctions. */\nconst SHAPE_ROUTE_ANCHOR_FILL = '#ea580c';\nconst VERTEX_R_PX = 7;\nconst VERTEX_R_SELECTED_PX = 9;\nconst VERTEX_HIT_PX = 14;\nconst VERTEX_STROKE_PX = 2;\nconst HANDLE_R_PX = 5;\nconst HANDLE_R_SELECTED_PX = 6;\nconst HANDLE_HIT_PX = 12;\nconst HANDLE_LINE_PX = 2.25;\nconst HANDLE_LINE_HALO_PX = 4;\nconst BEND_R_PX = 4;\nconst EDGE_DRAG_PX = 4;\n/** Hover / cut pair — tight enough to read as one break, not two far dots. */\nconst SPLIT_JOIN_GAP_PX = 7;\nconst SNAP_HIT_PX = 16;\n\nfunction rectPolygon(a: Vec2, b: Vec2): Vec2[] {\n return [\n { x: a.x, y: a.y },\n { x: b.x, y: a.y },\n { x: b.x, y: b.y },\n { x: a.x, y: b.y },\n ];\n}\n\nfunction dragSize(a: Vec2, b: Vec2): number {\n return Math.hypot(b.x - a.x, b.y - a.y);\n}\n\n/** Settled world stroke; CSS multiplies by --map-handle-scale during wheel. */\nfunction screenStrokeStyle(width: number): React.CSSProperties {\n return { ['--map-stroke-width']: width } as React.CSSProperties;\n}\n\nfunction HandleDot({\n cx,\n cy,\n r,\n hitR,\n fill,\n stroke,\n strokeWidth,\n cursor,\n fillOpacity = 1,\n strokeDasharray,\n onPointerDown,\n onPointerEnter,\n onPointerLeave,\n onDoubleClick,\n}: {\n cx: number;\n cy: number;\n r: number;\n hitR: number;\n fill: string;\n stroke: string;\n strokeWidth: number;\n cursor: string;\n fillOpacity?: number;\n strokeDasharray?: string;\n onPointerDown?: (e: React.PointerEvent<SVGGElement>) => void;\n onPointerEnter?: (e: React.PointerEvent<SVGGElement>) => void;\n onPointerLeave?: (e: React.PointerEvent<SVGGElement>) => void;\n onDoubleClick?: (e: React.MouseEvent<SVGGElement>) => void;\n}) {\n return (\n <g\n onPointerDown={onPointerDown}\n onPointerEnter={onPointerEnter}\n onPointerLeave={onPointerLeave}\n onMouseDown={(e) => e.preventDefault()}\n onDoubleClick={onDoubleClick}\n style={{ cursor }}\n >\n <g transform={`translate(${cx} ${cy})`}>\n <g className=\"eyeon-map-screen-const\">\n <circle cx={0} cy={0} r={hitR} fill=\"transparent\" />\n <circle\n cx={0}\n cy={0}\n r={r}\n fill={fill}\n fillOpacity={fillOpacity}\n stroke={stroke}\n strokeWidth={strokeWidth}\n strokeDasharray={strokeDasharray}\n />\n </g>\n </g>\n </g>\n );\n}\n\nexport interface EditorCanvasProps {\n level: CmLevel | null;\n shapes: CmShape[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n assignments: CmShapeAssignment[];\n /** Center retailers — wayfinding draws assigned names / logos from these. */\n retailers?: MapAssignRetailer[];\n /** Amenity catalog — wayfinding draws assigned amenity / kiosk icons. */\n amenities?: CmAmenityCatalogItem[];\n theme: ThemeDefaults;\n tool: EditorTool;\n selectedShapeId: number | null;\n selectedAnchorIds: number[];\n /** Outdoor SVG underlay (designer-owned). */\n baseSvgUrl: string | null;\n baseViewbox?: ViewBox | null;\n /**\n * Live outdoor SVG. Drawn on every Edit Map and Wayfinding floor (and\n * Outdoor) so green areas, parking lanes, and icons match the assign view.\n */\n outdoorSvgUrl?: string | null;\n /** Same proxy as MapViewer — required when the SVG is cross-origin. */\n imageProxyUrl?: string | null;\n /** @deprecated Use outdoorSvgUrl. Kept so existing hosts keep compiling. */\n levelSvgUrl?: string | null;\n /** Outdoor/base shapes drawn behind the active building floor (non-interactive). */\n underlayShapes?: CmShape[];\n /** Floor below, clipped to openings so Edit Map previews the atrium. */\n openingUnderlayShapes?: CmShape[];\n /** When true (outdoor), only interactive shapes are editable. */\n interactiveOnly?: boolean;\n /** Graph-paper grid. PORTAL only mounts this canvas after Edit Map. Always above shapes. */\n showGrid?: boolean;\n /** 0–1 strength of the grid lines. */\n gridOpacity?: number;\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 /** Double-click a walking path to remove it and any leftover endpoints. */\n onDeleteRouteEdge: (edgeId: number) => void;\n onConnectShapeToRoute: (\n shapeId: number,\n from: Vec2,\n drop: Vec2,\n maxDist: number,\n ) => void;\n onConnectRouteAnchorToRoute: (\n anchorId: number,\n drop: Vec2,\n maxDist: number,\n ) => void;\n /** Click inside a store to place its orange destination at that point. */\n onEnsureShapeAnchor: (shapeId: number, point: Vec2) => number | null | void;\n onMoveAnchor: (anchorId: number, x: number, y: number) => void;\n onCreateShape: (\n kind: ShapeKind,\n geometry: ShapeGeometry,\n extras?: { label?: ShapeLabel },\n ) => void;\n onUpdateShapeGeometry: (\n shapeId: number,\n geometry: ShapeGeometry,\n opts?: { live?: boolean },\n ) => void;\n onBatchShapeEdits?: (edits: ShapeBatchEdit[]) => void;\n /** End a live drag so the next edit starts a new undo step. */\n onHistoryGestureEnd?: () => void;\n /** Shown when no floor or Outdoor is selected. */\n emptyMessage?: string;\n}\n\nexport interface EditorCanvasHandle {\n consumeRouteUndo: () => 'clear-only' | 'clear-and-undo';\n zoomIn: () => void;\n zoomOut: () => void;\n resetView: () => void;\n}\n\nfunction polygonsToPath(polygons: Vec2[][]): string {\n return polygons\n .map((poly) => {\n if (poly.length === 0) return '';\n let d = `M ${poly[0].x} ${poly[0].y}`;\n for (let i = 1; i < poly.length; i++) d += ` L ${poly[i].x} ${poly[i].y}`;\n d += ' Z';\n return d;\n })\n .join(' ');\n}\n\nfunction isEditableShape(shape: CmShape, interactiveOnly: boolean): boolean {\n if (shape.orphanedAt) return false;\n if (isStampShape(shape)) return true;\n if (!interactiveOnly) return true;\n return INTERACTIVE_SHAPE_KINDS.includes(shape.kind);\n}\n\nfunction editorCanvasClass(showGrid: boolean): string {\n if (!showGrid) return 'eyeon-map-canvas';\n return 'eyeon-map-canvas eyeon-map-canvas--grid';\n}\n\nfunction editorCanvasStyle(\n showGrid: boolean,\n gridOpacity: number,\n): React.CSSProperties | undefined {\n if (!showGrid) return undefined;\n return {\n '--eyeon-map-grid-opacity': String(gridOpacity),\n } as React.CSSProperties;\n}\n\nexport const EditorCanvas = React.forwardRef<EditorCanvasHandle, EditorCanvasProps>(\nfunction EditorCanvas({\n level,\n shapes,\n anchors,\n edges,\n assignments,\n retailers = [],\n amenities = [],\n theme,\n tool,\n selectedShapeId,\n selectedAnchorIds,\n baseSvgUrl,\n baseViewbox = null,\n outdoorSvgUrl = null,\n imageProxyUrl = null,\n levelSvgUrl = null,\n underlayShapes = [],\n openingUnderlayShapes = [],\n interactiveOnly = false,\n showGrid = true,\n gridOpacity = 0.13,\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 onDeleteRouteEdge,\n onConnectShapeToRoute,\n onConnectRouteAnchorToRoute,\n onEnsureShapeAnchor,\n onMoveAnchor,\n onCreateShape,\n onUpdateShapeGeometry,\n onBatchShapeEdits,\n onHistoryGestureEnd,\n onUndo,\n onRouteDraftActiveChange,\n onToolChange,\n}, ref) {\n ensureMapFont();\n const wayfindingOn = showsWayfinding(tool, routeMode);\n const svgRef = useRef<SVGSVGElement>(null);\n const viewGroupRef = useRef<SVGGElement>(null);\n const canvasRef = useRef<HTMLDivElement>(null);\n const [, setPan] = useState({ x: 0, y: 0 });\n const [zoom, setZoom] = useState(1);\n const viewRef = useRef({ pan: { x: 0, y: 0 }, zoom: 1 });\n /** Zoom last used to compute `worldPx` handle radii in React. */\n const sizeZoomRef = useRef(1);\n const wheelFrameRef = useRef<number | null>(null);\n const wheelSettleRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const routeHoverFrameRef = useRef<number | null>(null);\n const routeHoverClientRef = useRef<Vec2 | null>(null);\n const pendingRouteInsertRef = useRef<{\n edgeId: number;\n point: Vec2;\n timer: ReturnType<typeof setTimeout>;\n } | 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 [spaceHeld, setSpaceHeld] = useState(false);\n const spaceHeldRef = useRef(false);\n const [axisGuide, setAxisGuide] = useState<OrthoConstraint | null>(null);\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?.(\n routeDraftPoint != null || polygonPoints.length > 0 || drawing.length > 0,\n );\n }, [drawing.length, onRouteDraftActiveChange, polygonPoints.length, routeDraftPoint]);\n useEffect(() => {\n if (lastRouteAnchor == null) return;\n if (anchors.some((anchor) => anchor.id === lastRouteAnchor)) return;\n setLastRouteAnchor(null);\n setRubberCursor(null);\n }, [anchors, lastRouteAnchor]);\n const [stubDrag, setStubDrag] = useState<{\n shapeId: number;\n origin: Vec2;\n cursor: Vec2;\n clientX: number;\n clientY: number;\n } | null>(null);\n const [shapeDrag, setShapeDrag] = useState<{\n shapeId: number;\n start: Vec2;\n originGeometry: ShapeGeometry;\n } | null>(null);\n const [shapeOffset, setShapeOffset] = useState<Vec2>({ x: 0, y: 0 });\n const [vertexDrag, setVertexDrag] = useState<{\n type: 'anchor';\n shapeId: number;\n polygonIndex: number;\n vertexIndex: number;\n } | {\n type: 'handle';\n shapeId: number;\n ringIndex: number;\n edgeIndex: number;\n handle: 1 | 2;\n } | {\n type: 'bend';\n shapeId: number;\n ringIndex: number;\n edgeIndex: number;\n } | null>(null);\n const [selectedVertex, setSelectedVertex] = useState<{\n polygonIndex: number;\n vertexIndex: number;\n } | null>(null);\n const [selectedHandle, setSelectedHandle] = useState<{\n ringIndex: number;\n edgeIndex: number;\n handle: 1 | 2;\n } | null>(null);\n const [hoveredEdge, setHoveredEdge] = useState<{\n ringIndex: number;\n edgeIndex: number;\n point: Vec2;\n } | null>(null);\n const [edgePress, setEdgePress] = useState<{\n shapeId: number;\n ringIndex: number;\n edgeIndex: number;\n start: Vec2;\n clientX: number;\n clientY: number;\n insertAt: Vec2;\n originGeometry: ShapeGeometry;\n dragging: boolean;\n } | null>(null);\n const [hoveredShapeId, setHoveredShapeId] = useState<number | null>(null);\n const [hoveredAnchorId, setHoveredAnchorId] = useState<number | null>(null);\n const [routePointerSnap, setRoutePointerSnap] =\n useState<RouteSnapTarget | null>(null);\n const routeHover =\n routePointerSnap?.type === 'edge'\n ? { edgeId: routePointerSnap.edgeId, point: routePointerSnap.point }\n : null;\n const [underlayTip, setUnderlayTip] = useState<{\n x: number;\n y: number;\n text: string;\n } | null>(null);\n const panStart = useRef<{\n x: number;\n y: number;\n panX: number;\n panY: number;\n clientX: number;\n clientY: number;\n fromEmptySelect: boolean;\n } | null>(null);\n const [isPanning, setIsPanning] = useState(false);\n\n const worldPx = (px: number) =>\n screenPxToWorld(px, viewRef.current.zoom, pxPerUser);\n\n const syncViewDom = (nextPan: Vec2, nextZoom: number) => {\n const g = viewGroupRef.current;\n if (!g) return;\n g.setAttribute(\n 'transform',\n `translate(${nextPan.x}, ${nextPan.y}) scale(${nextZoom})`,\n );\n // One CSS var — not a React re-render of every store/route node.\n g.style.setProperty(\n '--map-handle-scale',\n String(editorHandleScale(sizeZoomRef.current, nextZoom)),\n );\n };\n\n const applyView = (nextPan: Vec2, nextZoom: number) => {\n cancelWheelWork();\n viewRef.current = { pan: nextPan, zoom: nextZoom };\n setPan(nextPan);\n setZoom(nextZoom);\n };\n\n // Wheel input can fire much faster than paint. Move the SVG group\n // imperatively once per frame, then let React reconcile once scrolling ends.\n // Handle dots counter-scale in that same frame so they do not swell/shrink.\n const paintView = () => {\n wheelFrameRef.current = null;\n const { pan: nextPan, zoom: nextZoom } = viewRef.current;\n syncViewDom(nextPan, nextZoom);\n };\n\n const settleWheelView = () => {\n wheelSettleRef.current = null;\n const { pan: nextPan, zoom: nextZoom } = viewRef.current;\n setPan(nextPan);\n setZoom(nextZoom);\n };\n\n const scheduleWheelPaint = () => {\n if (wheelFrameRef.current == null) {\n wheelFrameRef.current = requestAnimationFrame(paintView);\n }\n if (wheelSettleRef.current != null) clearTimeout(wheelSettleRef.current);\n wheelSettleRef.current = setTimeout(settleWheelView, 80);\n };\n\n const cancelWheelWork = () => {\n if (wheelFrameRef.current != null) {\n cancelAnimationFrame(wheelFrameRef.current);\n wheelFrameRef.current = null;\n }\n if (wheelSettleRef.current != null) {\n clearTimeout(wheelSettleRef.current);\n wheelSettleRef.current = null;\n }\n };\n\n const zoomAnimRef = useRef<number | null>(null);\n const cancelZoomAnim = () => {\n if (zoomAnimRef.current == null) return;\n cancelAnimationFrame(zoomAnimRef.current);\n zoomAnimRef.current = null;\n };\n\n const animateViewTo = (targetPan: Vec2, targetZoom: number) => {\n cancelWheelWork();\n cancelZoomAnim();\n const from = {\n pan: { ...viewRef.current.pan },\n zoom: viewRef.current.zoom,\n };\n const to = { pan: targetPan, zoom: targetZoom };\n if (\n from.zoom === to.zoom &&\n from.pan.x === to.pan.x &&\n from.pan.y === to.pan.y\n ) {\n return;\n }\n const started = performance.now();\n const step = (now: number) => {\n const t = Math.min(1, (now - started) / EDITOR_ZOOM_ANIM_MS);\n const next = interpolateView(from, to, t);\n applyView(next.pan, next.zoom);\n if (t < 1) {\n zoomAnimRef.current = requestAnimationFrame(step);\n return;\n }\n zoomAnimRef.current = null;\n };\n zoomAnimRef.current = requestAnimationFrame(step);\n };\n\n const zoomAroundCenter = (factor: number) => {\n const svg = svgRef.current;\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n const user = clientToSvgUser(\n svg,\n rect.left + rect.width / 2,\n rect.top + rect.height / 2,\n );\n const { pan: currentPan, zoom: currentZoom } = viewRef.current;\n const nextZoom = clampEditorZoom(currentZoom * factor);\n if (nextZoom === currentZoom) return;\n animateViewTo(panAfterZoom(user, currentPan, currentZoom, nextZoom), nextZoom);\n };\n\n useImperativeHandle(ref, () => ({\n consumeRouteUndo: () => {\n const polygon = popPolygonDraftPoint(polygonPoints);\n if (polygon.consumed) {\n setPolygonPoints(polygon.points);\n setPolygonSnap(null);\n setAxisGuide(null);\n if (polygon.points.length === 0) setRubberCursor(null);\n return 'clear-only';\n }\n if (drawing.length > 0) {\n setDrawing([]);\n setDrawLockCircle(false);\n return 'clear-only';\n }\n const kind = routeSessionUndoKind({\n routeDraftPoint,\n storeLinkPreview,\n });\n clearRouteSession();\n return kind;\n },\n zoomIn: () => zoomAroundCenter(1.25),\n zoomOut: () => zoomAroundCenter(0.8),\n resetView: () => animateViewTo({ x: 0, y: 0 }, 1),\n }));\n\n const renderedZoom = viewRef.current.zoom;\n useLayoutEffect(() => {\n // Every commit: mid-wheel hover re-renders recompute worldPx from live\n // viewRef, so the CSS scale must reset in that same paint.\n sizeZoomRef.current = renderedZoom;\n syncViewDom(viewRef.current.pan, viewRef.current.zoom);\n });\n\n useEffect(\n () => () => {\n cancelZoomAnim();\n cancelWheelWork();\n const pending = pendingRouteInsertRef.current;\n if (pending) clearTimeout(pending.timer);\n pendingRouteInsertRef.current = null;\n },\n [],\n );\n\n useEffect(() => {\n setDrawing([]);\n setDrawLockCircle(false);\n setPolygonPoints([]);\n setLastRouteAnchor(null);\n setRouteDraftPoint(null);\n setStoreLinkPreview(null);\n setRubberCursor(null);\n setStubDrag(null);\n setHoveredShapeId(null);\n setHoveredAnchorId(null);\n setShapeDrag(null);\n setVertexDrag(null);\n setDragAnchor(null);\n setDragAnchorPoint(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n if (routeHoverFrameRef.current != null) {\n cancelAnimationFrame(routeHoverFrameRef.current);\n routeHoverFrameRef.current = null;\n }\n routeHoverClientRef.current = null;\n setRoutePointerSnap(null);\n setEdgePress(null);\n setSplitJoinHover(null);\n if (!canJoinOpenEnds(tool)) {\n setSplitJoinPending(null);\n setSplitJoinSnapEnd(null);\n }\n setPolygonSnap(null);\n setShapeOffset({ x: 0, y: 0 });\n }, [tool]);\n\n useEffect(() => {\n setSelectedVertex(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n setEdgePress(null);\n setUnderlayTip(null);\n setHoveredShapeId(null);\n setShapeDrag(null);\n setVertexDrag(null);\n setShapeOffset({ x: 0, y: 0 });\n }, [selectedShapeId]);\n\n useEffect(() => {\n clearRouteSession();\n setStubDrag(null);\n setRoutePointerSnap(null);\n setUnderlayTip(null);\n setHoveredShapeId(null);\n setHoveredAnchorId(null);\n }, [level?.id]);\n\n const viewbox = unionViewBox(level?.sourceViewbox, baseViewbox);\n const svgUnderlayUrl =\n outdoorSvgUrl ?? levelSvgUrl ?? (level?.kind === 'outdoor' ? baseSvgUrl : null);\n const svgSuppressIds = useMemo(\n () =>\n svgIdsOwnedByShapes([...underlayShapes, ...shapes], {\n omitStaticLayers: interactiveOnly,\n }),\n [underlayShapes, shapes, interactiveOnly],\n );\n\n useLayoutEffect(() => {\n const svg = svgRef.current;\n if (!svg) return;\n const measure = () => {\n const next = pxPerUserFromSvg(svg);\n setPxPerUser((prev) => (Math.abs(prev - next) < 1e-6 ? prev : next));\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(svg);\n return () => ro.disconnect();\n }, [level?.id, viewbox.x, viewbox.y, viewbox.width, viewbox.height]);\n\n const editableShapes = useMemo(\n () => shapes.filter((s) => isEditableShape(s, interactiveOnly)),\n [shapes, interactiveOnly],\n );\n const openingShapes = useMemo(\n () => editableShapes.filter((s) => s.kind === 'void'),\n [editableShapes],\n );\n const openingClipId = `eyeon-opening-clip-${level?.id ?? 'none'}`;\n const openingHatchId = `eyeon-opening-hatch-${level?.id ?? 'none'}`;\n\n const selectedShape =\n editableShapes.find((s) => s.id === selectedShapeId) ?? null;\n\n const displayGeometry = useMemo(() => {\n if (!selectedShape) return null;\n if (shapeDrag && shapeDrag.shapeId === selectedShape.id) {\n return translateGeometry(shapeDrag.originGeometry, shapeOffset.x, shapeOffset.y);\n }\n return selectedShape.geometry;\n }, [selectedShape, shapeDrag, shapeOffset]);\n\n const splitJoinShapes = useMemo<ShapeGeo[]>(\n () =>\n editableShapes\n .filter((s) => canSplitJoinKind(s.kind) && !isStampShape(s))\n .map((s) => ({\n id: s.id,\n kind: s.kind,\n style: s.style,\n geometry: s.geometry,\n })),\n [editableShapes],\n );\n\n const polygonAnchorCandidates = useMemo(() => {\n const pts: Vec2[] = [];\n for (const shape of editableShapes) {\n if (isStampShape(shape)) continue;\n for (const ring of geometryToRings(shape.geometry)) {\n pts.push(...ring.anchors);\n }\n }\n return pts;\n }, [editableShapes]);\n\n const nearSplitJoinAnchor = (world: Vec2, tol: number): boolean => {\n if (hitOpenEnd(splitJoinShapes, world, tol)) return true;\n return splitJoinShapes.some(\n (shape) => hitTestVertex(shape.geometry, world, tol) != null,\n );\n };\n\n const snapPolygonPoint = (world: Vec2): Vec2 | null => {\n const own = polygonPoints.length >= 3 ? [polygonPoints[0]] : [];\n return nearestSnapPoint(\n world,\n [...own, ...polygonAnchorCandidates],\n worldPx(SNAP_HIT_PX),\n );\n };\n\n const commitSplitJoinEdits = (edits: ShapeBatchEdit[]) => {\n if (!edits.length) return;\n onBatchShapeEdits?.(edits);\n const deleted = new Set(\n edits.filter((e) => e.action === 'delete').map((e) => e.shapeId),\n );\n if (selectedShapeId != null && deleted.has(selectedShapeId)) {\n const survivor = edits.find((e) => e.action === 'update');\n onSelectShape(survivor && survivor.action === 'update' ? survivor.shapeId : null);\n }\n };\n\n const tryJoinOpenEnd = (world: Vec2): boolean => {\n if (!canJoinOpenEnds(tool) || readOnly) return false;\n const endHit =\n splitJoinSnapEnd ??\n hitOpenEnd(splitJoinShapes, world, worldPx(SNAP_HIT_PX), splitJoinPending);\n if (!endHit) return false;\n if (!splitJoinPending) {\n setSplitJoinPending(endHit);\n onSelectShape(endHit.shapeId);\n if (isSplitJoinTool(tool)) onToolChange?.('select');\n return true;\n }\n if (sameOpenEnd(splitJoinPending, endHit)) {\n setSplitJoinPending(null);\n setSplitJoinSnapEnd(null);\n return true;\n }\n commitSplitJoinEdits(applySplitJoinJoin(splitJoinShapes, splitJoinPending, endHit));\n setSplitJoinPending(null);\n setSplitJoinHover(null);\n setSplitJoinSnapEnd(null);\n return true;\n };\n\n const handleSplitJoinAt = (world: Vec2): boolean => {\n if (tryJoinOpenEnd(world)) return true;\n if (!isSplitJoinTool(tool) || readOnly) return false;\n const endTol = worldPx(SNAP_HIT_PX);\n const edgeTol = worldPx(VERTEX_HIT_PX);\n const edgeHit = hitSplitJoinEdge(splitJoinShapes, world, edgeTol);\n if (edgeHit && !nearSplitJoinAnchor(world, endTol)) {\n commitSplitJoinEdits(\n applySplitJoinCut(splitJoinShapes, edgeHit, worldPx(SPLIT_JOIN_GAP_PX)),\n );\n setSplitJoinPending(null);\n setSplitJoinHover(null);\n setSplitJoinSnapEnd(null);\n onSelectShape(edgeHit.shapeId);\n return true;\n }\n if (splitJoinPending) {\n setSplitJoinPending(null);\n setSplitJoinSnapEnd(null);\n return true;\n }\n return false;\n };\n\n const toWorld = (clientX: number, clientY: number): Vec2 => {\n const svg = svgRef.current;\n if (!svg) return { x: 0, y: 0 };\n const { pan: currentPan, zoom: currentZoom } = viewRef.current;\n return userToWorld(\n clientToSvgUser(svg, clientX, clientY),\n currentPan,\n currentZoom,\n );\n };\n\n const moveUnderlayTip = (e: React.PointerEvent, kind: ShapeKind) => {\n const rect = canvasRef.current?.getBoundingClientRect();\n if (!rect) return;\n setUnderlayTip({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n text: underlaySwitchHint(kind),\n });\n };\n\n const insertAnchorOnEdge = (\n shape: CmShape,\n ringIndex: number,\n edgeIndex: number,\n point: Vec2,\n ) => {\n const next = insertVertex(shape.geometry, ringIndex, edgeIndex, point);\n onUpdateShapeGeometry(shape.id, next);\n setSelectedVertex({\n polygonIndex: ringIndex,\n vertexIndex: edgeIndex + 1,\n });\n setSelectedHandle(null);\n setHoveredEdge(null);\n };\n\n const beginEdgePress = (\n ringIndex: number,\n edgeIndex: number,\n insertAt: Vec2,\n e: React.PointerEvent,\n ) => {\n if (!selectedShape) return;\n e.stopPropagation();\n e.currentTarget.setPointerCapture?.(e.pointerId);\n setEdgePress({\n shapeId: selectedShape.id,\n ringIndex,\n edgeIndex,\n start: toWorld(e.clientX, e.clientY),\n clientX: e.clientX,\n clientY: e.clientY,\n insertAt,\n originGeometry: displayGeometry ?? selectedShape.geometry,\n dragging: false,\n });\n };\n\n const deleteShapeAnchor = (ringIndex: number, vertexIndex: number) => {\n if (!selectedShape) return;\n const next = removeVertex(selectedShape.geometry, ringIndex, vertexIndex);\n if (next === selectedShape.geometry) return;\n onUpdateShapeGeometry(selectedShape.id, next);\n setSelectedVertex(null);\n setSelectedHandle(null);\n setVertexDrag(null);\n };\n\n const beginSplitJoinVertexDrag = (\n world: Vec2,\n e: React.PointerEvent,\n ): boolean => {\n if (!selectedShape || !displayGeometry) return false;\n const vertexHit = hitTestVertex(\n displayGeometry,\n world,\n worldPx(VERTEX_HIT_PX),\n );\n if (!vertexHit) return false;\n if (hitOpenEnd(splitJoinShapes, vertexHit.point, worldPx(4))) return false;\n if (e.detail >= 2) {\n deleteShapeAnchor(vertexHit.polygonIndex, vertexHit.vertexIndex);\n return true;\n }\n setSelectedVertex({\n polygonIndex: vertexHit.polygonIndex,\n vertexIndex: vertexHit.vertexIndex,\n });\n setSelectedHandle(null);\n setVertexDrag({\n type: 'anchor',\n shapeId: selectedShape.id,\n polygonIndex: vertexHit.polygonIndex,\n vertexIndex: vertexHit.vertexIndex,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n return true;\n };\n\n const deleteShapeHandle = (ringIndex: number, edgeIndex: number) => {\n if (!selectedShape) return;\n const next = flattenCubicEdge(selectedShape.geometry, ringIndex, edgeIndex);\n if (next === selectedShape.geometry) return;\n onUpdateShapeGeometry(selectedShape.id, next);\n setSelectedHandle(null);\n setVertexDrag(null);\n };\n\n const hoverEdgeAt = (\n ringIndex: number,\n edgeIndex: number,\n clientX: number,\n clientY: number,\n ) => {\n if (!selectedShape) return;\n const world = toWorld(clientX, clientY);\n const ring = geometryToRings(displayGeometry ?? selectedShape.geometry)[\n ringIndex\n ];\n setHoveredEdge({\n ringIndex,\n edgeIndex,\n point: ring ? pointOnRingEdge(ring, edgeIndex, world) : world,\n });\n };\n\n const anchorById = useMemo(\n () => new Map(anchors.map((a) => [a.id, a])),\n [anchors],\n );\n const connectedAnchorIds = useMemo(() => {\n const ids = new Set<number>();\n edges.forEach((edge) => {\n ids.add(edge.fromAnchorId);\n ids.add(edge.toAnchorId);\n });\n return ids;\n }, [edges]);\n const routeAnchorDegreeById = useMemo(() => {\n const degree = new Map<number, number>();\n edges.forEach((edge) => {\n degree.set(\n edge.fromAnchorId,\n (degree.get(edge.fromAnchorId) ?? 0) + 1,\n );\n degree.set(\n edge.toAnchorId,\n (degree.get(edge.toAnchorId) ?? 0) + 1,\n );\n });\n return degree;\n }, [edges]);\n const dragRouteExcludeIds = useMemo(\n () =>\n dragAnchor == null\n ? new Set<number>()\n : routeComponentAnchorIds(dragAnchor, edges),\n [dragAnchor, edges],\n );\n const draggingOpenRouteAnchor =\n tool === 'select' &&\n dragAnchor != null &&\n anchorById.get(dragAnchor)?.shapeId == null &&\n (routeAnchorDegreeById.get(dragAnchor) ?? 0) <= 1;\n const dragRouteSnap =\n draggingOpenRouteAnchor && dragAnchorPoint\n ? nearestRouteSnap(\n dragAnchorPoint,\n anchors,\n edges,\n dragRouteExcludeIds,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n )\n : null;\n const displayAnchorById = useMemo(() => {\n if (dragAnchor == null || !dragAnchorPoint) return anchorById;\n const dragged = anchorById.get(dragAnchor);\n if (!dragged) return anchorById;\n const next = new Map(anchorById);\n next.set(dragAnchor, {\n ...dragged,\n ...(dragRouteSnap?.point ?? dragAnchorPoint),\n });\n return next;\n }, [anchorById, dragAnchor, dragAnchorPoint, dragRouteSnap]);\n const routeEdgePath = useMemo(\n () =>\n edges\n .map((edge) => {\n const from = displayAnchorById.get(edge.fromAnchorId);\n const to = displayAnchorById.get(edge.toAnchorId);\n return from && to\n ? `M ${from.x} ${from.y} L ${to.x} ${to.y}`\n : '';\n })\n .filter(Boolean)\n .join(' '),\n [displayAnchorById, edges],\n );\n const assignmentByShapeId = useMemo(\n () => new Map(assignments.map((row) => [row.shapeId, row])),\n [assignments],\n );\n const assignedOverlays = useMemo(\n () =>\n wayfindingOn\n ? wayfindingAssignedOverlays({\n shapes: editableShapes,\n underlayShapes,\n assignments,\n retailers,\n amenities,\n theme,\n })\n : [],\n [\n amenities,\n assignments,\n editableShapes,\n retailers,\n theme,\n underlayShapes,\n wayfindingOn,\n ],\n );\n\n const cancelRouteHoverFrame = () => {\n if (routeHoverFrameRef.current != null) {\n cancelAnimationFrame(routeHoverFrameRef.current);\n routeHoverFrameRef.current = null;\n }\n routeHoverClientRef.current = null;\n };\n\n const scheduleRouteHover = (clientX: number, clientY: number) => {\n routeHoverClientRef.current = { x: clientX, y: clientY };\n if (routeHoverFrameRef.current != null) return;\n routeHoverFrameRef.current = requestAnimationFrame(() => {\n routeHoverFrameRef.current = null;\n const client = routeHoverClientRef.current;\n routeHoverClientRef.current = null;\n if (!client) return;\n const world = toWorld(client.x, client.y);\n if (\n routeDraftPoint ||\n storeLinkPreview ||\n (canPlaceNewRoute(tool) && lastRouteAnchor != null)\n ) {\n setRubberCursor(world);\n }\n setRoutePointerSnap(\n nearestRouteSnap(\n world,\n anchors,\n edges,\n storeLinkOriginIds(anchors, storeLinkPreview),\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n ),\n );\n });\n };\n\n useEffect(() => () => cancelRouteHoverFrame(), []);\n\n const closePolygon = () => {\n if (polygonPoints.length < 3) {\n setPolygonPoints([]);\n setRubberCursor(null);\n setPolygonSnap(null);\n return;\n }\n onCreateShape('unit', polygonsToGeometry([polygonPoints]));\n setPolygonPoints([]);\n setRubberCursor(null);\n setPolygonSnap(null);\n };\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Shift') {\n const down = e.type === 'keydown';\n if (isEllipseDrawTool(tool)) setDrawLockCircle(down);\n if (!down) setAxisGuide(null);\n return;\n }\n if (!isSpacePanKey(e)) return;\n if (isEditableTypingTarget(e.target)) return;\n e.preventDefault();\n if (e.type === 'keydown' && e.repeat) return;\n const down = e.type === 'keydown';\n spaceHeldRef.current = down;\n setSpaceHeld(down);\n };\n window.addEventListener('keydown', onKey);\n window.addEventListener('keyup', onKey);\n return () => {\n window.removeEventListener('keydown', onKey);\n window.removeEventListener('keyup', onKey);\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 setAxisGuide(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) {\n e.preventDefault();\n e.stopPropagation();\n beginPinch();\n return;\n }\n // Space pan wins over shape, vertex, and route drags, including a press\n // that starts on the selected store.\n if (!spaceHeldRef.current || e.button !== 0) return;\n e.preventDefault();\n e.stopPropagation();\n beginPan(e, false);\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 const captureNode = svgRef.current ?? e.currentTarget;\n captureNode.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 cancelPendingRouteInsert = () => {\n const pending = pendingRouteInsertRef.current;\n if (!pending) return;\n clearTimeout(pending.timer);\n pendingRouteInsertRef.current = null;\n };\n\n const flushPendingRouteInsert = () => {\n const pending = pendingRouteInsertRef.current;\n if (!pending) return;\n clearTimeout(pending.timer);\n pendingRouteInsertRef.current = null;\n insertHoveredRoutePoint(pending.edgeId, pending.point);\n };\n\n const schedulePendingRouteInsert = (edgeId: number, point: Vec2) => {\n cancelPendingRouteInsert();\n pendingRouteInsertRef.current = {\n edgeId,\n point,\n timer: setTimeout(() => {\n const pending = pendingRouteInsertRef.current;\n pendingRouteInsertRef.current = null;\n if (pending) insertHoveredRoutePoint(pending.edgeId, pending.point);\n }, ROUTE_EDGE_CLICK_MS),\n };\n };\n\n const removeWayfindingEdge = (edgeId: number) => {\n if (readOnly || !wayfindingOn) return;\n cancelPendingRouteInsert();\n const edge = edges.find((item) => item.id === edgeId);\n onDeleteRouteEdge(edgeId);\n if (edge) {\n const remaining = edges.filter((item) => item.id !== edgeId);\n const orphans = [edge.fromAnchorId, edge.toAnchorId].filter(\n (id) => !anchorHasEdge(id, remaining),\n );\n setLastRouteAnchor((prev) =>\n prev != null && orphans.includes(prev) ? null : prev,\n );\n }\n setRoutePointerSnap(null);\n };\n\n const removeWayfindingAnchor = (anchorId: number) => {\n if (readOnly || !wayfindingOn) return;\n cancelPendingRouteInsert();\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 (spaceHeldRef.current) {\n beginPan(e, false);\n return;\n }\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 snapped = snapPolygonPoint(world) ?? polygonSnap;\n const constrained =\n e.shiftKey && !snapped && polygonPoints.length > 0\n ? constrainOrthogonal(polygonPoints[polygonPoints.length - 1], world)\n : null;\n const placed = snapped ?? constrained?.point ?? world;\n setAxisGuide(constrained);\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 (e.detail >= 2) {\n const pendingId = pendingRouteInsertRef.current?.edgeId;\n const edgeId =\n pendingId ?? (snap?.type === 'edge' ? snap.edgeId : null);\n if (edgeId != null) {\n removeWayfindingEdge(edgeId);\n return;\n }\n }\n if (snap?.type === 'edge') {\n const deferInsert =\n !canPlaceNewRoute(tool) &&\n routeDraftPoint == null &&\n lastRouteAnchor == null &&\n storeLinkPreview == null;\n if (deferInsert) {\n schedulePendingRouteInsert(snap.edgeId, snap.point);\n } else {\n flushPendingRouteInsert();\n insertHoveredRoutePoint(snap.edgeId, snap.point);\n }\n return;\n }\n flushPendingRouteInsert();\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 constrained =\n e.shiftKey && vertexDrag.type === 'anchor'\n ? constrainVertexOrthogonal(\n world,\n vertexNeighborPoints(\n selectedShape.geometry,\n vertexDrag.polygonIndex,\n vertexDrag.vertexIndex,\n ),\n )\n : null;\n const point = constrained?.point ?? world;\n setAxisGuide(vertexDrag.type === 'anchor' ? constrained : null);\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 point,\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 if (snap) {\n setPolygonSnap(snap);\n setRubberCursor(snap);\n setAxisGuide(null);\n } else if (e.shiftKey) {\n const constrained = constrainOrthogonal(\n polygonPoints[polygonPoints.length - 1],\n world,\n );\n setPolygonSnap(null);\n setRubberCursor(constrained.point);\n setAxisGuide(constrained);\n } else {\n setPolygonSnap(null);\n setRubberCursor(world);\n setAxisGuide(null);\n }\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('unit', ellipseGeometry(a, b, lockCircle));\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 (!e.shiftKey) setAxisGuide(null);\n if (endedPan?.fromEmptySelect) {\n const moved = Math.hypot(\n e.clientX - endedPan.clientX,\n e.clientY - endedPan.clientY,\n );\n if (moved < 4) {\n onSelectShape(null);\n onSelectAnchors([]);\n setSelectedVertex(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n setSplitJoinPending(null);\n setSplitJoinSnapEnd(null);\n setRubberCursor(null);\n }\n }\n onHistoryGestureEnd?.();\n if (stubDrag) {\n try {\n svgRef.current?.releasePointerCapture?.(e.pointerId);\n } catch {\n /* capture may already be released */\n }\n const moved = Math.hypot(\n e.clientX - stubDrag.clientX,\n e.clientY - stubDrag.clientY,\n );\n if (moved >= 4) {\n onConnectShapeToRoute(\n stubDrag.shapeId,\n stubDrag.origin,\n stubDrag.cursor,\n worldPx(WAYFINDING_SNAP_PX),\n );\n }\n setStubDrag(null);\n return;\n }\n if (edgePress) {\n if (!edgePress.dragging && selectedShape) {\n insertAnchorOnEdge(\n selectedShape,\n edgePress.ringIndex,\n edgePress.edgeIndex,\n edgePress.insertAt,\n );\n }\n setEdgePress(null);\n return;\n }\n if (vertexDrag) {\n setVertexDrag(null);\n return;\n }\n if (shapeDrag && selectedShape) {\n const next = translateGeometry(\n shapeDrag.originGeometry,\n shapeOffset.x,\n shapeOffset.y,\n );\n if (Math.hypot(shapeOffset.x, shapeOffset.y) >= 0.5) {\n onUpdateShapeGeometry(selectedShape.id, next);\n }\n setShapeDrag(null);\n setShapeOffset({ x: 0, y: 0 });\n return;\n }\n if (dragAnchor != null) {\n const moved = anchors.find((a) => a.id === dragAnchor);\n const point = dragAnchorPoint ?? moved;\n if (moved && point) {\n if (\n tool === 'select' &&\n moved.shapeId == null &&\n (routeAnchorDegreeById.get(moved.id) ?? 0) <= 1\n ) {\n const drop = toWorld(e.clientX, e.clientY);\n const snap = nearestRouteSnap(\n drop,\n anchors,\n edges,\n dragRouteExcludeIds,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n );\n if (snap) {\n onConnectRouteAnchorToRoute(\n moved.id,\n drop,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n );\n onSelectAnchors([\n snap.type === 'junction' ? snap.anchorId : moved.id,\n ]);\n setDragAnchor(null);\n setDragAnchorPoint(null);\n setRoutePointerSnap(null);\n return;\n }\n }\n if (Math.hypot(point.x - moved.x, point.y - moved.y) >= 0.01) {\n onMoveAnchor(moved.id, point.x, point.y);\n onHistoryGestureEnd?.();\n }\n const near = anchors\n .filter((a) => a.id !== moved.id)\n .filter((a) => Math.hypot(a.x - point.x, a.y - point.y) <= 2.5)\n .map((a) => a.id);\n if (near.length) onSelectAnchors([moved.id, ...near]);\n }\n setDragAnchor(null);\n setDragAnchorPoint(null);\n return;\n }\n if (tool === 'draw-unit') finishRect();\n if (isEllipseDrawTool(tool)) finishEllipse(e.shiftKey);\n };\n\n const pathDFromGeometry = (geometry: CmShape['geometry']): string => {\n const rings = geometryToRings(geometry);\n if (rings.length > 0) {\n return rings.map(ringToPathD).join(' ');\n }\n return (\n geometry.paths.map((p) => p.d).join(' ') ||\n polygonsToPath(geometry.polygons)\n );\n };\n\n const shapePathD = (shape: CmShape): string => {\n if (\n selectedShapeId === shape.id &&\n displayGeometry &&\n shapeDrag?.shapeId === shape.id\n ) {\n return pathDFromGeometry(displayGeometry);\n }\n return pathDFromGeometry(shape.geometry);\n };\n\n const stubExcludeIds = stubDrag\n ? storeLinkOriginIds(anchors, stubDrag)\n : storeLinkPreview\n ? storeLinkOriginIds(anchors, storeLinkPreview)\n : null;\n const stubSnap =\n stubDrag && stubExcludeIds\n ? nearestRouteSnap(\n stubDrag.cursor,\n anchors,\n edges,\n stubExcludeIds,\n worldPx(WAYFINDING_SNAP_PX),\n anchorById,\n )\n : storeLinkPreview && rubberCursor && stubExcludeIds\n ? routePointerSnap\n : null;\n const lastRoutePoint =\n lastRouteAnchor != null ? anchorById.get(lastRouteAnchor) : undefined;\n const routeRubberSnap =\n !stubDrag &&\n !storeLinkPreview &&\n rubberCursor &&\n (routeDraftPoint ||\n (canPlaceNewRoute(tool) && lastRouteAnchor != null))\n ? routePointerSnap\n : null;\n const highlightedRouteEdgeId =\n (dragRouteSnap?.type === 'edge' ? dragRouteSnap.edgeId : null) ??\n (stubSnap?.type === 'edge' ? stubSnap.edgeId : null) ??\n routeHover?.edgeId ??\n null;\n const highlightedRouteEdge =\n highlightedRouteEdgeId == null\n ? null\n : edges.find((edge) => edge.id === highlightedRouteEdgeId) ?? null;\n const highlightedRouteFrom = highlightedRouteEdge\n ? displayAnchorById.get(highlightedRouteEdge.fromAnchorId)\n : null;\n const highlightedRouteTo = highlightedRouteEdge\n ? displayAnchorById.get(highlightedRouteEdge.toAnchorId)\n : null;\n const routePlusAt =\n (dragRouteSnap?.type === 'edge' ? dragRouteSnap.point : null) ??\n (stubSnap?.type === 'edge' ? stubSnap.point : null) ??\n routeHover?.point ??\n null;\n const rubberFrom =\n stubDrag?.origin ??\n storeLinkPreview?.origin ??\n routeDraftPoint ??\n (canPlaceNewRoute(tool) && lastRoutePoint\n ? { x: lastRoutePoint.x, y: lastRoutePoint.y }\n : null);\n const rubberTo =\n stubDrag != null\n ? stubSnap?.point ?? stubDrag.cursor\n : stubSnap?.point ??\n routeRubberSnap?.point ??\n routeHover?.point ??\n rubberCursor;\n const rubberBand =\n (stubDrag != null ||\n storeLinkPreview != null ||\n routeDraftPoint != null ||\n (canPlaceNewRoute(tool) && lastRouteAnchor != null && rubberCursor != null))\n ? routeRubberBand(rubberFrom, rubberTo)\n : null;\n const polygonFollow =\n isPolygonDrawTool(tool) && polygonPoints.length > 0\n ? routeRubberBand(polygonPoints[polygonPoints.length - 1], rubberCursor)\n : null;\n const polygonClose =\n isPolygonDrawTool(tool) && polygonPoints.length >= 2\n ? routeRubberBand(rubberCursor, polygonPoints[0])\n : null;\n\n if (!level) {\n return (\n <div\n className={editorCanvasClass(showGrid)}\n style={editorCanvasStyle(showGrid, gridOpacity)}\n >\n <div className=\"eyeon-map-canvas__empty\">{emptyMessage}</div>\n </div>\n );\n }\n\n return (\n <div\n ref={canvasRef}\n className={editorCanvasClass(showGrid)}\n style={editorCanvasStyle(showGrid, gridOpacity)}\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: editorMapCursor({\n tool,\n readOnly,\n spaceHeld,\n panning: isPanning,\n shapeDragging: shapeDrag != null,\n routeEdgeHover: routeHover != null && !stubDrag,\n anchorDragging: dragAnchor != null || stubDrag != null,\n edgeDragging: !!edgePress?.dragging,\n edgeHover: hoveredEdge != null,\n }),\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 if (readOnly || !wayfindingOn) return;\n const pendingId = pendingRouteInsertRef.current?.edgeId;\n const hoverId =\n routePointerSnap?.type === 'edge'\n ? routePointerSnap.edgeId\n : null;\n const edgeId = pendingId ?? hoverId;\n if (edgeId == null) return;\n e.stopPropagation();\n removeWayfindingEdge(edgeId);\n }}\n >\n <g\n ref={viewGroupRef}\n className=\"eyeon-map-canvas__view\"\n transform={`translate(${viewRef.current.pan.x}, ${viewRef.current.pan.y}) scale(${viewRef.current.zoom})`}\n >\n <defs>\n <pattern\n id={openingHatchId}\n patternUnits=\"userSpaceOnUse\"\n width={14}\n height={14}\n >\n <rect width=\"14\" height=\"14\" fill=\"#94a3b8\" fillOpacity=\"0.16\" />\n <path d=\"M-2 16 L16 -2\" stroke=\"#64748b\" strokeWidth=\"1.15\" />\n </pattern>\n {openingShapes.length > 0 ? (\n <clipPath id={openingClipId}>\n {openingShapes.map((shape) => (\n <path key={shape.id} d={shapePathD(shape)} />\n ))}\n </clipPath>\n ) : null}\n </defs>\n {svgUnderlayUrl ? (\n <OutdoorSvgUnderlay\n url={svgUnderlayUrl}\n imageProxyUrl={imageProxyUrl}\n suppressIds={svgSuppressIds}\n theme={theme}\n />\n ) : null}\n\n {underlayShapes.filter(isUnderlayDrawnShape).map((shape) => {\n const hintable = !wayfindingOn && isUnderlayHintShape(shape.kind);\n const hovered = hintable && hoveredShapeId === shape.id;\n const publishedFill = editorShapeFill(\n shape,\n theme,\n assignmentByShapeId.get(shape.id),\n );\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={editorShapeEmphasisColor(publishedFill, hovered)}\n fillOpacity={hovered ? 0.4 : hintable ? 0.22 : 0.32}\n stroke={hovered ? editorShapeEmphasisColor(publishedFill, true) : '#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 = spaceHeld\n ? undefined\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 (spaceHeldRef.current) {\n e.stopPropagation();\n beginPan(e, false);\n return;\n }\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 cancelPendingRouteInsert();\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 const emphasisStroke = editorShapeEmphasisColor(\n shape.label.color ?? theme.STORE_TEXT_COLOR,\n selected || hovered,\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 ? emphasisStroke : '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 const emphasisStroke = editorShapeEmphasisColor(\n shape.label.color ?? theme.STORE_TEXT_COLOR,\n selected || hovered,\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 ? emphasisStroke : '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 const emphasized = selected || hovered;\n const publishedFill = editorShapeFill(\n shape,\n theme,\n assignmentByShapeId.get(shape.id),\n );\n const emphasisFill = editorShapeEmphasisColor(\n opening ? '#94a3b8' : publishedFill,\n emphasized,\n );\n return (\n <path\n key={shape.id}\n d={shapePathD(shape)}\n fill={\n opening\n ? `url(#${openingHatchId})`\n : editorShapeEmphasisColor(publishedFill, emphasized)\n }\n fillOpacity={\n opening\n ? 1\n : editorHoverFillOpacity(\n shape.kind,\n baseOpacity,\n emphasized,\n )\n }\n stroke={emphasized ? emphasisFill : '#64748b'}\n strokeWidth={\n selected ? 2.5 / zoom : hovered ? 2 / zoom : 1 / zoom\n }\n strokeDasharray={\n opening && !selected && !hovered\n ? `${6 / zoom} ${4 / zoom}`\n : undefined\n }\n onPointerDown={beginShapePointerDown}\n style={{ cursor }}\n {...hoverHandlers}\n />\n );\n })}\n\n {assignedOverlays.map((overlay) => (\n <AssignedShapeOverlay\n key={`assign-overlay-${overlay.shapeId}`}\n overlay={overlay}\n imageProxyUrl={imageProxyUrl}\n />\n ))}\n\n {/* Anchors (Select, Curve, Split / Join) + curve helpers (Curve only) */}\n {canSelectShapes(tool) &&\n selectedShape &&\n !isStampShape(selectedShape) &&\n geometryToRings(displayGeometry ?? selectedShape.geometry).map(\n (ring, ri) => {\n const n = edgeCount(ring);\n const items: React.ReactNode[] = [];\n for (let ei = 0; ei < n; ei++) {\n const edge = ring.edges[ei];\n const from = edgeFrom(ring, ei);\n const to = edgeTo(ring, ei);\n const hovered =\n hoveredEdge?.ringIndex === ri && hoveredEdge.edgeIndex === ei;\n const strokeD = edgeToPathD(ring, ei);\n if (tool === 'select') {\n items.push(\n <path\n key={`edge-hit-${selectedShape.id}-${ri}-${ei}`}\n d={strokeD}\n fill=\"none\"\n stroke=\"transparent\"\n strokeWidth={worldPx(VERTEX_HIT_PX * 2)}\n strokeLinecap=\"round\"\n style={{\n cursor: edgePress?.dragging ? 'grabbing' : 'none',\n }}\n onPointerEnter={(e) =>\n hoverEdgeAt(ri, ei, e.clientX, e.clientY)\n }\n onPointerMove={(e) =>\n hoverEdgeAt(ri, ei, e.clientX, e.clientY)\n }\n onPointerLeave={() =>\n setHoveredEdge((prev) =>\n prev?.ringIndex === ri && prev.edgeIndex === ei\n ? null\n : prev,\n )\n }\n onPointerDown={(e) => {\n if (tool !== 'select') return;\n const world = toWorld(e.clientX, e.clientY);\n const clickRing = geometryToRings(\n displayGeometry ?? selectedShape.geometry,\n )[ri];\n beginEdgePress(\n ri,\n ei,\n clickRing\n ? pointOnRingEdge(clickRing, ei, world)\n : world,\n e,\n );\n }}\n />,\n );\n if (hovered && hoveredEdge && !edgePress?.dragging) {\n const preview = hoveredEdge.point;\n const plus = worldPx(5);\n items.push(\n <path\n key={`edge-glow-${selectedShape.id}-${ri}-${ei}`}\n d={strokeD}\n fill=\"none\"\n stroke={EDITOR_GUIDE_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={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(3.5)}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n pointerEvents=\"none\"\n />,\n <g\n key={`edge-add-${selectedShape.id}-${ri}-${ei}`}\n className=\"eyeon-map-screen-const\"\n pointerEvents=\"none\"\n >\n <circle\n cx={preview.x}\n cy={preview.y}\n r={worldPx(9)}\n fill=\"#fff\"\n stroke={EDITOR_GUIDE_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={EDITOR_GUIDE_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={EDITOR_GUIDE_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={EDITOR_GUIDE_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 ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_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 ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_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={EDITOR_GUIDE_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 ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n onDoubleClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n if (!showsShapeAnchors(tool)) return;\n deleteShapeAnchor(ri, vi);\n }}\n onPointerDown={(e) => {\n if (!showsShapeAnchors(tool)) return;\n e.stopPropagation();\n if (e.detail >= 2) {\n deleteShapeAnchor(ri, vi);\n return;\n }\n setSelectedVertex({ polygonIndex: ri, vertexIndex: vi });\n setSelectedHandle(null);\n setVertexDrag({\n type: 'anchor',\n shapeId: selectedShape.id,\n polygonIndex: ri,\n vertexIndex: vi,\n });\n }}\n />,\n );\n });\n return items;\n },\n )}\n\n {wayfindingOn && routeEdgePath ? (\n <path\n className=\"eyeon-map-screen-stroke\"\n d={routeEdgePath}\n fill=\"none\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={8 / zoom}\n style={screenStrokeStyle(8 / zoom)}\n strokeLinecap=\"round\"\n strokeOpacity={0.95}\n pointerEvents=\"none\"\n />\n ) : null}\n\n {wayfindingOn && highlightedRouteFrom && highlightedRouteTo ? (\n <g pointerEvents=\"none\">\n <line\n className=\"eyeon-map-screen-stroke\"\n x1={highlightedRouteFrom.x}\n y1={highlightedRouteFrom.y}\n x2={highlightedRouteTo.x}\n y2={highlightedRouteTo.y}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(12)}\n style={screenStrokeStyle(worldPx(12))}\n strokeOpacity={0.22}\n strokeLinecap=\"round\"\n />\n <line\n className=\"eyeon-map-screen-stroke\"\n x1={highlightedRouteFrom.x}\n y1={highlightedRouteFrom.y}\n x2={highlightedRouteTo.x}\n y2={highlightedRouteTo.y}\n stroke=\"#22c55e\"\n strokeWidth={8 / zoom}\n style={screenStrokeStyle(8 / zoom)}\n strokeLinecap=\"round\"\n />\n {routePlusAt && !stubDrag ? (\n <g className=\"eyeon-map-screen-const\">\n <circle\n cx={routePlusAt.x}\n cy={routePlusAt.y}\n r={worldPx(9)}\n fill=\"#fff\"\n stroke={EDITOR_GUIDE_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={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(2)}\n strokeLinecap=\"round\"\n />\n </g>\n ) : null}\n </g>\n ) : null}\n\n {wayfindingOn && rubberBand && (\n <g pointerEvents=\"none\">\n <line\n className=\"eyeon-map-screen-stroke\"\n x1={rubberBand.from.x}\n y1={rubberBand.from.y}\n x2={rubberBand.to.x}\n y2={rubberBand.to.y}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={8 / zoom}\n style={screenStrokeStyle(8 / zoom)}\n strokeOpacity={0.85}\n strokeLinecap=\"round\"\n />\n {(stubDrag || storeLinkPreview) && (\n <HandleDot\n cx={rubberBand.to.x}\n cy={rubberBand.to.y}\n r={worldPx(stubSnap ? ANCHOR_R_SELECTED_PX : ANCHOR_R_PX)}\n hitR={worldPx(ANCHOR_HIT_PX)}\n fill={stubSnap ? '#22c55e' : EDITOR_GUIDE_COLOR}\n fillOpacity={0.85}\n stroke=\"#fff\"\n strokeWidth={worldPx(ANCHOR_STROKE_PX)}\n cursor=\"grabbing\"\n />\n )}\n </g>\n )}\n\n {wayfindingOn && routeDraftPoint && (\n <HandleDot\n cx={routeDraftPoint.x}\n cy={routeDraftPoint.y}\n r={worldPx(ANCHOR_R_PX)}\n hitR={worldPx(ANCHOR_HIT_PX)}\n fill=\"#0f172a\"\n fillOpacity={1}\n stroke=\"#fff\"\n strokeWidth={worldPx(ANCHOR_STROKE_PX)}\n cursor=\"default\"\n />\n )}\n\n {wayfindingOn &&\n anchors\n .filter((anchor) => wayfindingLinksShapes(level) || anchor.shapeId == null)\n .map((anchor) => {\n const selected = selectedAnchorIds.includes(anchor.id);\n const hovered = hoveredAnchorId === anchor.id;\n const shapeNode = anchor.shapeId != null;\n const connected = connectedAnchorIds.has(anchor.id);\n const displayAnchor = displayAnchorById.get(anchor.id) ?? anchor;\n const dragConnect = dragAnchor === anchor.id && dragRouteSnap != null;\n const nearWeld =\n selected &&\n selectedAnchorIds.some((id) => {\n if (id === anchor.id) return false;\n const other = anchorById.get(id);\n return (\n other &&\n Math.hypot(\n other.x - displayAnchor.x,\n other.y - displayAnchor.y,\n ) <= 2.5\n );\n });\n const visR = selected || shapeNode ? ANCHOR_R_SELECTED_PX : ANCHOR_R_PX;\n return (\n <g key={anchor.id}>\n <HandleDot\n cx={displayAnchor.x}\n cy={displayAnchor.y}\n r={worldPx(visR)}\n hitR={worldPx(WAYFINDING_ANCHOR_HIT_PX)}\n fill={\n dragConnect\n ? '#22c55e'\n : nearWeld\n ? '#22c55e'\n : shapeNode\n ? hovered\n ? '#f97316'\n : SHAPE_ROUTE_ANCHOR_FILL\n : selected\n ? hovered\n ? '#3b82f6'\n : EDITOR_GUIDE_COLOR\n : hovered\n ? '#334155'\n : '#0f172a'\n }\n fillOpacity={1}\n stroke={selected && shapeNode ? EDITOR_GUIDE_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 ? EDITOR_GUIDE_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 ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"pointer\"\n onPointerDown={(e) => {\n e.stopPropagation();\n tryJoinOpenEnd(end.point);\n }}\n />,\n );\n });\n return items;\n })}\n\n {isSplitJoinTool(tool) &&\n splitJoinHover &&\n !splitJoinHover.shared &&\n !splitJoinSnapEnd &&\n !nearSplitJoinAnchor(splitJoinHover.point, worldPx(SNAP_HIT_PX)) &&\n (() => {\n const shape = splitJoinShapes.find(\n (s) => s.id === splitJoinHover.shapeId,\n );\n if (!shape) return null;\n const preview = previewCutPoints(\n shape.geometry,\n splitJoinHover.ringIndex,\n splitJoinHover.edgeIndex,\n splitJoinHover.point,\n worldPx(SPLIT_JOIN_GAP_PX),\n );\n if (!preview) return null;\n const hideOnAnchor = worldPx(VERTEX_R_PX + 2);\n if (\n nearSplitJoinAnchor(preview.p1, hideOnAnchor) ||\n nearSplitJoinAnchor(preview.p2, hideOnAnchor)\n ) {\n return null;\n }\n return (\n <g pointerEvents=\"none\">\n <g className=\"eyeon-map-screen-const\">\n <circle\n cx={preview.p1.x}\n cy={preview.p1.y}\n r={worldPx(BEND_R_PX)}\n fill=\"#fff\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n />\n </g>\n <g className=\"eyeon-map-screen-const\">\n <circle\n cx={preview.p2.x}\n cy={preview.p2.y}\n r={worldPx(BEND_R_PX)}\n fill=\"#fff\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n />\n </g>\n </g>\n );\n })()}\n\n {canJoinOpenEnds(tool) &&\n splitJoinPending &&\n rubberCursor &&\n (() => {\n const shape = splitJoinShapes.find(\n (s) => s.id === splitJoinPending.shapeId,\n );\n const from = shape\n ? listOpenEnds(shape.geometry).find(\n (end) =>\n end.ringIndex === splitJoinPending.ringIndex &&\n end.end === splitJoinPending.end,\n )?.point\n : null;\n if (!from) return null;\n const snapped = splitJoinSnapEnd != null;\n return (\n <line\n x1={from.x}\n y1={from.y}\n x2={rubberCursor.x}\n y2={rubberCursor.y}\n stroke={EDITOR_GUIDE_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={theme.STORE_DEFAULT_COLOR}\n fillOpacity={0.2}\n stroke={EDITOR_GUIDE_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={EDITOR_GUIDE_COLOR}\n strokeWidth={2 / zoom}\n strokeDasharray={`${6 / zoom} ${4 / zoom}`}\n />\n )}\n {axisGuide && (\n <line\n x1={\n axisGuide.axis === 'horizontal'\n ? axisGuide.through.x - 100000\n : axisGuide.through.x\n }\n y1={\n axisGuide.axis === 'horizontal'\n ? axisGuide.through.y\n : axisGuide.through.y - 100000\n }\n x2={\n axisGuide.axis === 'horizontal'\n ? axisGuide.through.x + 100000\n : axisGuide.through.x\n }\n y2={\n axisGuide.axis === 'horizontal'\n ? axisGuide.through.y\n : axisGuide.through.y + 100000\n }\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={1.25 / zoom}\n strokeDasharray={`${3 / zoom} ${5 / zoom}`}\n pointerEvents=\"none\"\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={EDITOR_GUIDE_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={EDITOR_GUIDE_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={EDITOR_GUIDE_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 ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_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={EDITOR_GUIDE_COLOR}\n stroke={EDITOR_GUIDE_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","/** True while leaving the editor would drop work that is not in the saved draft. */\nexport function editorShouldWarnOnLeave(state: {\n pendingEdits: boolean;\n needsPublish: boolean;\n cameraDirty: boolean;\n gesture: boolean;\n saving: boolean;\n}): boolean {\n return (\n state.saving ||\n state.pendingEdits ||\n state.needsPublish ||\n state.cameraDirty ||\n state.gesture\n );\n}\n\n/**\n * Ask the browser to confirm close, reload, or navigation away from this\n * document. Switching to another tab does not unload the page, so browsers\n * do not fire this event for that.\n */\nexport function applyBeforeUnloadWarning(\n event: { preventDefault: () => void; returnValue: string },\n shouldWarn: boolean,\n): void {\n if (!shouldWarn) return;\n event.preventDefault();\n event.returnValue = '';\n}\n\n/**\n * Storybook renders the editor in a preview iframe. Chrome only shows the\n * leave dialog for the top-level document, so the listener has to sit on\n * that window as well as the editor frame.\n */\nexport function beforeUnloadTargets(frame: Window): Window[] {\n const targets: Window[] = [frame];\n try {\n const top = frame.top;\n if (top && top !== frame) targets.push(top);\n } catch {\n // Parent frame is cross-origin; the editor frame is the only hook.\n }\n return targets;\n}\n","import type {\n BatchOp,\n CmAnchor,\n CmConnector,\n CmLevel,\n CmRouteEdge,\n CmShape,\n ConnectorDirection,\n ConnectorKind,\n Vec2,\n} from '../core';\nimport { distance, geometryCentroid } from '../core';\n\nexport type VerticalRailKind = 'escalator' | 'elevator';\n\nexport interface ParsedConnectorSource {\n family: ConnectorKind;\n group: string;\n direction?: 'up' | 'down';\n role?: 'start' | 'end';\n}\n\nconst FAMILY_PREFIXES: Array<{ prefix: string; family: ConnectorKind }> = [\n { prefix: 'escalator', family: 'escalator' },\n { prefix: 'elevator', family: 'elevator' },\n { prefix: 'travelator', family: 'travelator' },\n { prefix: 'stairs', family: 'stairs' },\n { prefix: 'ramp', family: 'ramp' },\n];\n\nfunction normalizeId(value: string | null | undefined): string {\n return (value ?? '').trim().toLowerCase().replace(/_/g, '-');\n}\n\n/** Parse v1-style ids: `escalator-5-up-start`, `elevator-2`. */\nexport function parseConnectorSourceId(\n value: string | null | undefined,\n): ParsedConnectorSource | null {\n const raw = normalizeId(value);\n if (!raw) return null;\n const family = FAMILY_PREFIXES.find(\n (item) => raw === item.prefix || raw.startsWith(`${item.prefix}-`),\n );\n if (!family) return null;\n const rest = raw.slice(family.prefix.length).replace(/^-+/, '');\n const parts = rest.split('-').filter(Boolean);\n let direction: 'up' | 'down' | undefined;\n let role: 'start' | 'end' | undefined;\n const groupParts: string[] = [];\n for (const part of parts) {\n if (part === 'up' || part === 'down') direction = part;\n else if (part === 'start' || part === 'end') role = part;\n else groupParts.push(part);\n }\n return {\n family: family.family,\n group: groupParts.join('-') || '1',\n direction,\n role,\n };\n}\n\nexport function guessConnectorKind(shape: {\n kind: string;\n key: string;\n sourceSvgId?: string | null;\n}): ConnectorKind | null {\n return (\n parseConnectorSourceId(shape.sourceSvgId)?.family ??\n parseConnectorSourceId(shape.key)?.family ??\n null\n );\n}\n\nexport function connectorIdForShape(\n shapeId: number,\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n): number | null {\n for (const anchor of anchors) {\n if (anchor.shapeId === shapeId && anchor.connectorId != null) {\n return anchor.connectorId;\n }\n }\n return null;\n}\n\nexport function connectorForShape(\n shapeId: number,\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n connectors: CmConnector[],\n): CmConnector | null {\n const id = connectorIdForShape(shapeId, anchors);\n if (id == null) return null;\n return connectors.find((item) => item.id === id) ?? null;\n}\n\nexport function resolvedConnectorKind(\n shape: { id: number; kind: string; key: string; sourceSvgId?: string | null },\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n connectors: CmConnector[],\n): ConnectorKind | null {\n return connectorForShape(shape.id, anchors, connectors)?.kind ?? guessConnectorKind(shape);\n}\n\nexport function railConnectorShapes<\n T extends { id: number; kind: string; key: string; sourceSvgId?: string | null; orphanedAt?: string | null },\n>(\n shapes: T[],\n kind: VerticalRailKind,\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n connectors: CmConnector[],\n): T[] {\n return shapes.filter((shape) => {\n if (shape.orphanedAt) return false;\n if (shape.kind !== 'connector' && guessConnectorKind(shape) !== kind) return false;\n return resolvedConnectorKind(shape, anchors, connectors) === kind;\n });\n}\n\nexport function landingAnchor(\n shapeId: number,\n anchors: CmAnchor[],\n): CmAnchor | undefined {\n return (\n anchors.find((a) => a.shapeId === shapeId && a.kind === 'connector') ??\n anchors.find((a) => a.shapeId === shapeId && a.connectorId != null) ??\n anchors.find((a) => a.shapeId === shapeId)\n );\n}\n\nexport function shapeLandingPoint(shape: Pick<CmShape, 'geometry'>): Vec2 {\n const c = geometryCentroid(shape.geometry);\n if (Number.isFinite(c.x) && Number.isFinite(c.y)) return c;\n const first = shape.geometry.polygons[0]?.[0];\n return first ?? { x: 0, y: 0 };\n}\n\nexport function inferTravelDirection(\n fromLevelIndex: number,\n toLevelIndex: number,\n hint?: 'up' | 'down',\n): ConnectorDirection {\n if (hint) return hint;\n if (toLevelIndex > fromLevelIndex) return 'up';\n if (toLevelIndex < fromLevelIndex) return 'down';\n return 'both';\n}\n\nexport function defaultConnectorName(\n kind: VerticalRailKind,\n shapes: Array<{ key: string; sourceSvgId?: string | null }>,\n): string {\n for (const shape of shapes) {\n const parsed =\n parseConnectorSourceId(shape.sourceSvgId) ?? parseConnectorSourceId(shape.key);\n if (parsed) {\n const label = kind === 'elevator' ? 'Elevator' : 'Escalator';\n return parsed.group && parsed.group !== '1' ? `${label} ${parsed.group}` : label;\n }\n }\n return kind === 'elevator' ? 'Elevator' : 'Escalator';\n}\n\nexport function nearestWalkAnchor(\n anchors: CmAnchor[],\n levelId: number,\n point: Vec2,\n excludeIds: ReadonlySet<number> = new Set(),\n): CmAnchor | null {\n let best: CmAnchor | null = null;\n let bestDist = Infinity;\n for (const anchor of anchors) {\n if (anchor.levelId !== levelId || excludeIds.has(anchor.id)) continue;\n if (anchor.kind !== 'junction' && anchor.kind !== 'unit') continue;\n const d = distance(anchor, point);\n if (d < bestDist) {\n best = anchor;\n bestDist = d;\n }\n }\n return best;\n}\n\nexport function memberShapeIds(\n connectorId: number,\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n): number[] {\n const ids = new Set<number>();\n for (const anchor of anchors) {\n if (anchor.connectorId === connectorId && anchor.shapeId != null) {\n ids.add(anchor.shapeId);\n }\n }\n return [...ids];\n}\n\nexport type ConnectorEdgeLike = Pick<\n CmRouteEdge,\n 'kind' | 'directed' | 'fromAnchorId' | 'toAnchorId'\n>;\n\nexport type ConnectorAnchorLike = Pick<CmAnchor, 'id' | 'shapeId' | 'connectorId'>;\n\nexport function partnerShapesForConnector<T extends { id: number }>(\n shapeId: number,\n anchors: ConnectorAnchorLike[],\n connectors: CmConnector[],\n shapes: T[],\n): T[] {\n const connector = connectorForShape(shapeId, anchors, connectors);\n if (!connector) return [];\n const ids = memberShapeIds(connector.id, anchors);\n return shapes.filter((s) => ids.includes(s.id) && s.id !== shapeId);\n}\n\nexport function levelsWithLandings<T extends { levelId: number }>(\n landings: T[],\n levels: CmLevel[],\n): CmLevel[] {\n const ids = new Set(landings.map((item) => item.levelId));\n return levels\n .filter((level) => ids.has(level.id))\n .slice()\n .sort((a, b) => a.ordering - b.ordering || a.levelIndex - b.levelIndex);\n}\n\nexport function escalatorDirectedEnds<T extends { id: number }>(\n connectorId: number,\n anchors: ConnectorAnchorLike[],\n edges: ConnectorEdgeLike[],\n shapes: T[],\n): { from: T; to: T } | null {\n const memberAnchors = anchors.filter((a) => a.connectorId === connectorId);\n const memberIds = new Set(memberAnchors.map((a) => a.id));\n const ride = edges.find(\n (edge) =>\n edge.kind === 'connector' &&\n edge.directed &&\n memberIds.has(edge.fromAnchorId) &&\n memberIds.has(edge.toAnchorId),\n );\n if (!ride) return null;\n const fromAnchor = anchors.find((a) => a.id === ride.fromAnchorId);\n const toAnchor = anchors.find((a) => a.id === ride.toAnchorId);\n const from = shapes.find((s) => s.id === fromAnchor?.shapeId);\n const to = shapes.find((s) => s.id === toAnchor?.shapeId);\n if (!from || !to) return null;\n return { from, to };\n}\n\nfunction floorName(\n levelId: number,\n levels: Array<{ id: number; name: string }>,\n): string {\n return levels.find((level) => level.id === levelId)?.name ?? 'Floor';\n}\n\nfunction landingRideId(\n shape: { key: string; levelId: number },\n levels: Array<{ id: number; name: string }>,\n): string {\n return `${floorName(shape.levelId, levels)} · ${shape.key}`;\n}\n\nexport type EscalatorRideEnds<T extends { id: number; key: string; levelId: number }> = {\n connectorId: number;\n from: T;\n to: T;\n};\n\nexport type EscalatorRideLandingLine = {\n shapeId: number;\n key: string;\n levelName: string;\n};\n\n/**\n * One sidebar row per linked ride. Boarding is `from`, exit is `to`.\n * Unlinked landings are omitted — they stay in the Unassigned list.\n */\nexport function groupEscalatorRides<T extends { id: number; key: string; levelId: number }>(\n connectors: Array<Pick<CmConnector, 'id' | 'kind'>>,\n anchors: ConnectorAnchorLike[],\n edges: ConnectorEdgeLike[],\n shapes: T[],\n): EscalatorRideEnds<T>[] {\n const rides: EscalatorRideEnds<T>[] = [];\n for (const connector of connectors) {\n if (connector.kind !== 'escalator') continue;\n const directed = escalatorDirectedEnds(connector.id, anchors, edges, shapes);\n if (directed) {\n rides.push({ connectorId: connector.id, from: directed.from, to: directed.to });\n continue;\n }\n const ids = new Set(memberShapeIds(connector.id, anchors));\n const members = shapes.filter((shape) => ids.has(shape.id));\n if (members.length < 2) continue;\n rides.push({ connectorId: connector.id, from: members[0], to: members[1] });\n }\n return rides;\n}\n\n/** Boarding on top, exit below — each with its floor name. */\nexport function escalatorRideLandingLines<\n T extends { id: number; key: string; levelId: number },\n>(\n ride: EscalatorRideEnds<T>,\n levels: Array<{ id: number; name: string }>,\n): [EscalatorRideLandingLine, EscalatorRideLandingLine] {\n return [\n {\n shapeId: ride.from.id,\n key: ride.from.key,\n levelName: floorName(ride.from.levelId, levels),\n },\n {\n shapeId: ride.to.id,\n key: ride.to.key,\n levelName: floorName(ride.to.levelId, levels),\n },\n ];\n}\n\n/** Assigned-list title: boarding → exit (escalator) or floor landings ↔ (elevator). */\nexport function connectorRideLabel(\n shape: { id: number; key: string; levelId: number },\n anchors: ConnectorAnchorLike[],\n edges: ConnectorEdgeLike[],\n connectors: CmConnector[],\n shapes: Array<{ id: number; key: string; levelId: number }>,\n levels: Array<{ id: number; name: string; ordering?: number; levelIndex?: number }> = [],\n): string | null {\n const connector = connectorForShape(shape.id, anchors, connectors);\n if (!connector) return null;\n\n if (connector.kind === 'escalator') {\n const ride = escalatorDirectedEnds(connector.id, anchors, edges, shapes);\n if (ride) {\n return `${ride.from.key} → ${ride.to.key}`;\n }\n const partners = partnerShapesForConnector(shape.id, anchors, connectors, shapes);\n if (partners.length === 1) {\n return `${shape.key} → ${partners[0].key}`;\n }\n return null;\n }\n\n const members = [shape, ...partnerShapesForConnector(shape.id, anchors, connectors, shapes)];\n if (members.length < 2) return null;\n const order = new Map(\n levels.map((level, index) => [\n level.id,\n (level.ordering ?? level.levelIndex ?? index) * 1000 + (level.levelIndex ?? index),\n ]),\n );\n const sorted = members.slice().sort((a, b) => {\n const ai = order.get(a.levelId) ?? Number.POSITIVE_INFINITY;\n const bi = order.get(b.levelId) ?? Number.POSITIVE_INFINITY;\n return ai - bi;\n });\n return sorted.map((item) => landingRideId(item, levels)).join(' ↔ ');\n}\n\nfunction connectorEdgesBetween(\n edges: CmRouteEdge[],\n anchorIds: ReadonlySet<number>,\n): CmRouteEdge[] {\n return edges.filter(\n (edge) =>\n edge.kind === 'connector' &&\n anchorIds.has(edge.fromAnchorId) &&\n anchorIds.has(edge.toAnchorId),\n );\n}\n\nexport interface ConnectorPlanContext {\n mapId: number;\n levels: CmLevel[];\n shapes: CmShape[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n connectors: CmConnector[];\n allocId: () => number;\n}\n\nfunction ensureLanding(\n ctx: ConnectorPlanContext,\n shape: CmShape,\n connectorId: number,\n ops: BatchOp[],\n): CmAnchor {\n const existing = landingAnchor(shape.id, ctx.anchors);\n const point = existing\n ? { x: existing.x, y: existing.y }\n : shapeLandingPoint(shape);\n if (existing) {\n if (existing.connectorId !== connectorId || existing.kind !== 'connector') {\n const next: CmAnchor = {\n ...existing,\n kind: 'connector',\n connectorId,\n };\n ops.push({ op: 'upsert_anchor', anchor: next });\n ctx.anchors = ctx.anchors.map((a) => (a.id === next.id ? next : a));\n return next;\n }\n return existing;\n }\n const created: CmAnchor = {\n id: ctx.allocId(),\n levelId: shape.levelId,\n shapeId: shape.id,\n kind: 'connector',\n x: point.x,\n y: point.y,\n connectorId,\n };\n ops.push({ op: 'upsert_anchor', anchor: created });\n ctx.anchors = [...ctx.anchors, created];\n return created;\n}\n\nfunction linkLandingToWalk(\n ctx: ConnectorPlanContext,\n landing: CmAnchor,\n ops: BatchOp[],\n) {\n const near = nearestWalkAnchor(ctx.anchors, landing.levelId, landing, new Set([landing.id]));\n if (!near) return;\n const exists = ctx.edges.some(\n (e) =>\n (e.fromAnchorId === landing.id && e.toAnchorId === near.id) ||\n (e.fromAnchorId === near.id && e.toAnchorId === landing.id),\n );\n if (exists) return;\n const edge: CmRouteEdge = {\n id: ctx.allocId(),\n mapId: ctx.mapId,\n fromAnchorId: landing.id,\n toAnchorId: near.id,\n weight: null,\n directed: false,\n accessible: true,\n kind: 'walk',\n };\n ops.push({ op: 'upsert_edge', edge });\n ctx.edges = [...ctx.edges, edge];\n}\n\nfunction applyUnlinkLocal(ctx: ConnectorPlanContext, connectorId: number): BatchOp[] {\n const memberAnchors = ctx.anchors.filter((a) => a.connectorId === connectorId);\n const ids = new Set(memberAnchors.map((a) => a.id));\n const ops: BatchOp[] = [];\n for (const edge of connectorEdgesBetween(ctx.edges, ids)) {\n ops.push({ op: 'delete_edge', edgeId: edge.id });\n }\n ctx.edges = ctx.edges.filter(\n (e) =>\n !(e.kind === 'connector' && ids.has(e.fromAnchorId) && ids.has(e.toAnchorId)),\n );\n for (const anchor of memberAnchors) {\n ops.push({\n op: 'upsert_anchor',\n anchor: { ...anchor, connectorId: null },\n });\n }\n ctx.anchors = ctx.anchors.map((a) =>\n a.connectorId === connectorId ? { ...a, connectorId: null } : a,\n );\n ctx.connectors = ctx.connectors.filter((c) => c.id !== connectorId);\n ops.push({ op: 'delete_connector', connectorId });\n return ops;\n}\n\nfunction unlinkConnectorOps(ctx: ConnectorPlanContext, connectorId: number): BatchOp[] {\n return applyUnlinkLocal(ctx, connectorId);\n}\n\nexport function buildUnlinkConnectorOps(\n ctx: ConnectorPlanContext,\n connectorId: number,\n): BatchOp[] {\n return unlinkConnectorOps(ctx, connectorId);\n}\n\nexport function buildEscalatorLinkOps(\n ctx: ConnectorPlanContext,\n fromShape: CmShape,\n toShape: CmShape,\n options?: { name?: string; direction?: 'up' | 'down' },\n): BatchOp[] {\n const fromLevel = ctx.levels.find((l) => l.id === fromShape.levelId);\n const toLevel = ctx.levels.find((l) => l.id === toShape.levelId);\n const direction = inferTravelDirection(\n fromLevel?.levelIndex ?? 0,\n toLevel?.levelIndex ?? 0,\n options?.direction ??\n parseConnectorSourceId(fromShape.sourceSvgId)?.direction ??\n parseConnectorSourceId(toShape.sourceSvgId)?.direction,\n );\n const name =\n options?.name ?? defaultConnectorName('escalator', [fromShape, toShape]);\n\n const existingFrom = connectorIdForShape(fromShape.id, ctx.anchors);\n const existingTo = connectorIdForShape(toShape.id, ctx.anchors);\n const ops: BatchOp[] = [];\n const working: ConnectorPlanContext = {\n ...ctx,\n anchors: ctx.anchors.slice(),\n edges: ctx.edges.slice(),\n connectors: ctx.connectors.slice(),\n };\n\n for (const id of new Set([existingFrom, existingTo].filter((v): v is number => v != null))) {\n ops.push(...applyUnlinkLocal(working, id));\n }\n\n const connectorId = working.allocId();\n const connector: CmConnector = {\n id: connectorId,\n mapId: working.mapId,\n kind: 'escalator',\n name,\n direction,\n accessible: false,\n };\n ops.push({ op: 'upsert_connector', connector });\n working.connectors = [...working.connectors, connector];\n\n const fromAnchor = ensureLanding(working, fromShape, connectorId, ops);\n const toAnchor = ensureLanding(working, toShape, connectorId, ops);\n linkLandingToWalk(working, fromAnchor, ops);\n linkLandingToWalk(working, toAnchor, ops);\n\n ops.push({\n op: 'upsert_edge',\n edge: {\n id: working.allocId(),\n mapId: working.mapId,\n fromAnchorId: fromAnchor.id,\n toAnchorId: toAnchor.id,\n weight: null,\n directed: true,\n accessible: false,\n kind: 'connector',\n },\n });\n return ops;\n}\n\nexport function buildElevatorShaftOps(\n ctx: ConnectorPlanContext,\n memberShapes: CmShape[],\n options?: { name?: string; accessible?: boolean; connectorId?: number },\n): BatchOp[] {\n const unique = new Map(memberShapes.map((s) => [s.id, s]));\n const members = [...unique.values()];\n if (members.length < 2) return [];\n\n const ops: BatchOp[] = [];\n const working: ConnectorPlanContext = {\n ...ctx,\n anchors: ctx.anchors.slice(),\n edges: ctx.edges.slice(),\n connectors: ctx.connectors.slice(),\n };\n const existingIds = new Set(\n members\n .map((s) => connectorIdForShape(s.id, working.anchors))\n .filter((id): id is number => id != null),\n );\n const keepId =\n options?.connectorId ??\n (existingIds.size === 1 ? [...existingIds][0] : undefined);\n\n for (const id of existingIds) {\n if (id === keepId) {\n const memberAnchors = working.anchors.filter((a) => a.connectorId === id);\n const ids = new Set(memberAnchors.map((a) => a.id));\n for (const edge of connectorEdgesBetween(working.edges, ids)) {\n ops.push({ op: 'delete_edge', edgeId: edge.id });\n working.edges = working.edges.filter((e) => e.id !== edge.id);\n }\n continue;\n }\n ops.push(...applyUnlinkLocal(working, id));\n }\n\n const connectorId = keepId ?? working.allocId();\n const connector: CmConnector = {\n id: connectorId,\n mapId: working.mapId,\n kind: 'elevator',\n name: options?.name ?? defaultConnectorName('elevator', members),\n direction: 'both',\n accessible: options?.accessible ?? true,\n };\n ops.push({ op: 'upsert_connector', connector });\n\n const landings = members.map((shape) => ensureLanding(working, shape, connectorId, ops));\n for (const landing of landings) linkLandingToWalk(working, landing, ops);\n\n for (let i = 0; i < landings.length; i++) {\n for (let j = i + 1; j < landings.length; j++) {\n ops.push({\n op: 'upsert_edge',\n edge: {\n id: working.allocId(),\n mapId: working.mapId,\n fromAnchorId: landings[i].id,\n toAnchorId: landings[j].id,\n weight: null,\n directed: false,\n accessible: connector.accessible,\n kind: 'connector',\n },\n });\n }\n }\n return ops;\n}\n\nexport function suggestEscalatorPairs(\n shapes: CmShape[],\n levels: CmLevel[],\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n): Array<{ fromShapeId: number; toShapeId: number; label: string }> {\n const groups = new Map<string, CmShape[]>();\n for (const shape of shapes) {\n if (shape.orphanedAt) continue;\n if (guessConnectorKind(shape) !== 'escalator') continue;\n if (connectorIdForShape(shape.id, anchors) != null) continue;\n const parsed =\n parseConnectorSourceId(shape.sourceSvgId) ?? parseConnectorSourceId(shape.key);\n if (!parsed) continue;\n const key = `${parsed.group}:${parsed.direction ?? ''}`;\n const list = groups.get(key) ?? [];\n list.push(shape);\n groups.set(key, list);\n }\n const suggestions: Array<{ fromShapeId: number; toShapeId: number; label: string }> = [];\n for (const [key, group] of groups) {\n if (group.length !== 2) continue;\n if (group[0].levelId === group[1].levelId) continue;\n const parsed =\n parseConnectorSourceId(group[0].sourceSvgId) ?? parseConnectorSourceId(group[0].key);\n const start =\n group.find((s) => parseConnectorSourceId(s.sourceSvgId)?.role === 'start') ??\n group[0];\n const end = group.find((s) => s.id !== start.id)!;\n const fromName = levels.find((l) => l.id === start.levelId)?.name ?? 'Floor';\n const toName = levels.find((l) => l.id === end.levelId)?.name ?? 'Floor';\n const dir = parsed?.direction ? ` ${parsed.direction}` : '';\n suggestions.push({\n fromShapeId: start.id,\n toShapeId: end.id,\n label: `Escalator ${key.split(':')[0]}${dir}: ${fromName} → ${toName}`,\n });\n }\n return suggestions;\n}\n","import type {\n BatchOp,\n BBox,\n CmAmenityCatalogItem,\n CmAnchor,\n CmBuilding,\n CmConnector,\n CmLevel,\n CmResponsiveOverride,\n CmRouteEdge,\n CmShape,\n CmShapeAssignment,\n ShapeGeometry,\n ThemeDefaults,\n} from '../core';\nimport {\n bboxOf,\n canonicalizeEntranceLabel,\n geometryBBox,\n mergeEntranceAwareLabel,\n normalizeGeometrySpace,\n parseShapeAssignment,\n} from '../core';\n\nexport interface EditorDraftState {\n mapId: number;\n centerId: number;\n theme: Partial<ThemeDefaults>;\n buildings: CmBuilding[];\n levels: CmLevel[];\n shapes: CmShape[];\n assignments: CmShapeAssignment[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n connectors: CmConnector[];\n amenities: CmAmenityCatalogItem[];\n baseSvgUrl?: string | null;\n responsiveOverrides?: CmResponsiveOverride[];\n}\n\nfunction geometryBbox(geometry?: ShapeGeometry | null): BBox {\n const points = (geometry?.polygons ?? []).flat();\n return bboxOf(points);\n}\n\n/** True when another live shape already uses this ID on the floor. */\nexport function shapeKeyTakenOnLevel(\n shapes: Array<{\n id: number;\n levelId: number;\n key: string;\n orphanedAt?: string | null;\n }>,\n shapeId: number,\n levelId: number,\n key: string,\n): boolean {\n return shapes.some(\n (shape) =>\n shape.id !== shapeId &&\n shape.levelId === levelId &&\n shape.key === key &&\n !shape.orphanedAt,\n );\n}\n\nfunction upsertById<T extends { id: number }>(\n rows: T[],\n next: T,\n): T[] {\n const idx = rows.findIndex((row) => row.id === next.id);\n if (idx < 0) return [...rows, next];\n const copy = rows.slice();\n copy[idx] = next;\n return copy;\n}\n\nexport function applyDraftOp(\n draft: EditorDraftState,\n op: BatchOp,\n): EditorDraftState {\n switch (op.op) {\n case 'upsert_shape': {\n const incoming = op.shape;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.shapes.find((s) => s.id === id);\n const geometry = incoming.geometry ?? existing?.geometry ?? {\n paths: [],\n polygons: [],\n };\n const shape: CmShape = {\n id,\n levelId: incoming.levelId ?? existing?.levelId ?? 0,\n key: incoming.key ?? existing?.key ?? `shape-${id}`,\n kind: incoming.kind ?? existing?.kind ?? 'unit',\n geometry,\n bbox:\n incoming.bbox ??\n (incoming.geometry != null\n ? geometryBbox(geometry)\n : existing?.bbox) ??\n geometryBbox(geometry),\n zIndex: incoming.zIndex ?? existing?.zIndex ?? 0,\n style: incoming.style ?? existing?.style ?? {},\n sourceSvgId: incoming.sourceSvgId ?? existing?.sourceSvgId ?? null,\n origin: incoming.origin ?? existing?.origin ?? 'manual',\n label: mergeEntranceAwareLabel(existing?.label, incoming.label, {\n kind: incoming.kind ?? existing?.kind ?? 'unit',\n origin: incoming.origin ?? existing?.origin ?? 'manual',\n sourceSvgId:\n incoming.sourceSvgId ?? existing?.sourceSvgId ?? null,\n }),\n geometryLocked:\n incoming.geometryLocked ??\n (incoming.geometry != null ? true : existing?.geometryLocked) ??\n false,\n orphanedAt: incoming.orphanedAt ?? existing?.orphanedAt ?? null,\n };\n return { ...draft, shapes: upsertById(draft.shapes, shape) };\n }\n case 'delete_shape':\n return {\n ...draft,\n shapes: draft.shapes.filter((s) => s.id !== op.shapeId),\n assignments: draft.assignments.filter((a) => a.shapeId !== op.shapeId),\n };\n case 'upsert_assignment': {\n const kind =\n draft.shapes.find((s) => s.id === op.assignment.shapeId)?.kind ?? 'unit';\n const assignment = parseShapeAssignment(op.assignment, kind);\n const rest = draft.assignments.filter((a) => a.shapeId !== assignment.shapeId);\n return { ...draft, assignments: [...rest, assignment] };\n }\n case 'delete_assignment':\n return {\n ...draft,\n assignments: draft.assignments.filter((a) => a.shapeId !== op.shapeId),\n };\n case 'upsert_anchor': {\n const incoming = op.anchor;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.anchors.find((a) => a.id === id);\n const anchor: CmAnchor = {\n id,\n levelId: incoming.levelId ?? existing?.levelId ?? 0,\n shapeId: incoming.shapeId ?? existing?.shapeId ?? null,\n kind: incoming.kind ?? existing?.kind ?? 'junction',\n x: incoming.x ?? existing?.x ?? 0,\n y: incoming.y ?? existing?.y ?? 0,\n connectorId:\n incoming.connectorId !== undefined\n ? incoming.connectorId\n : existing?.connectorId ?? null,\n };\n return { ...draft, anchors: upsertById(draft.anchors, anchor) };\n }\n case 'delete_anchor':\n return {\n ...draft,\n anchors: draft.anchors.filter((a) => a.id !== op.anchorId),\n edges: draft.edges.filter(\n (e) => e.fromAnchorId !== op.anchorId && e.toAnchorId !== op.anchorId,\n ),\n };\n case 'upsert_edge': {\n const incoming = op.edge;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.edges.find((e) => e.id === id);\n const edge: CmRouteEdge = {\n id,\n mapId: incoming.mapId ?? existing?.mapId ?? draft.mapId,\n fromAnchorId: incoming.fromAnchorId ?? existing?.fromAnchorId ?? 0,\n toAnchorId: incoming.toAnchorId ?? existing?.toAnchorId ?? 0,\n weight: incoming.weight ?? existing?.weight ?? null,\n directed: incoming.directed ?? existing?.directed ?? false,\n accessible: incoming.accessible ?? existing?.accessible ?? true,\n kind: incoming.kind ?? existing?.kind ?? 'walk',\n };\n return { ...draft, edges: upsertById(draft.edges, edge) };\n }\n case 'delete_edge':\n return { ...draft, edges: draft.edges.filter((e) => e.id !== op.edgeId) };\n case 'weld_anchors': {\n const ids = (op.anchorIds ?? []).filter((id) => Number.isFinite(id));\n if (ids.length < 2) return draft;\n const keep = ids[0];\n const removed = new Set(ids.slice(1));\n const edges = draft.edges\n .map((e) => ({\n ...e,\n fromAnchorId: removed.has(e.fromAnchorId) ? keep : e.fromAnchorId,\n toAnchorId: removed.has(e.toAnchorId) ? keep : e.toAnchorId,\n }))\n .filter((e) => e.fromAnchorId !== e.toAnchorId);\n return {\n ...draft,\n anchors: draft.anchors.filter((a) => !removed.has(a.id)),\n edges,\n };\n }\n case 'update_theme':\n return { ...draft, theme: { ...draft.theme, ...op.theme } };\n case 'upsert_connector': {\n const incoming = op.connector;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.connectors.find((c) => c.id === id);\n const connector: CmConnector = {\n id,\n mapId: incoming.mapId ?? existing?.mapId ?? draft.mapId,\n kind: incoming.kind ?? existing?.kind ?? 'escalator',\n name: incoming.name ?? existing?.name ?? 'Connector',\n direction: incoming.direction ?? existing?.direction ?? 'both',\n accessible: incoming.accessible ?? existing?.accessible ?? false,\n };\n return { ...draft, connectors: upsertById(draft.connectors, connector) };\n }\n case 'delete_connector':\n return {\n ...draft,\n connectors: draft.connectors.filter((c) => c.id !== op.connectorId),\n anchors: draft.anchors.map((a) =>\n a.connectorId === op.connectorId ? { ...a, connectorId: null } : a,\n ),\n };\n case 'delete_level':\n return omitLevelFromDraft(draft, op.levelId);\n default:\n return draft;\n }\n}\n\n/** Drop a floor/outdoor level and every draft row that lived on it. */\nexport function omitLevelFromDraft(\n draft: EditorDraftState,\n levelId: number,\n): EditorDraftState {\n const removedShapeIds = new Set(\n draft.shapes.filter((shape) => shape.levelId === levelId).map((shape) => shape.id),\n );\n const removedAnchorIds = new Set(\n draft.anchors.filter((anchor) => anchor.levelId === levelId).map((anchor) => anchor.id),\n );\n const anchors = draft.anchors.filter((anchor) => anchor.levelId !== levelId);\n const liveConnectorIds = new Set(\n anchors\n .map((anchor) => anchor.connectorId)\n .filter((id): id is number => id != null),\n );\n return {\n ...draft,\n levels: draft.levels.filter((level) => level.id !== levelId),\n shapes: draft.shapes.filter((shape) => shape.levelId !== levelId),\n assignments: draft.assignments.filter((row) => !removedShapeIds.has(row.shapeId)),\n anchors,\n edges: draft.edges.filter(\n (edge) =>\n !removedAnchorIds.has(edge.fromAnchorId) &&\n !removedAnchorIds.has(edge.toAnchorId),\n ),\n connectors: draft.connectors.filter((connector) => liveConnectorIds.has(connector.id)),\n responsiveOverrides: (draft.responsiveOverrides ?? []).filter(\n (row) => row.levelId !== levelId,\n ),\n };\n}\n\nexport function applyDraftOps(\n draft: EditorDraftState,\n ops: BatchOp[],\n): EditorDraftState {\n const seeded = {\n ...healDraftGeometry(draft),\n connectors: draft.connectors ?? [],\n responsiveOverrides: draft.responsiveOverrides ?? [],\n };\n return ops.reduce(applyDraftOp, seeded);\n}\n\n/**\n * Rebuild `polygons` from `paths` on rows written before the Y-flip removal,\n * so the canvas outline and its vertex handles agree without a re-import.\n */\nfunction healDraftGeometry(draft: EditorDraftState): EditorDraftState {\n let changed = false;\n const shapes = draft.shapes.map((shape) => {\n const geometry = normalizeGeometrySpace(shape.geometry);\n const label = canonicalizeEntranceLabel(shape) ?? shape.label;\n const geometryChanged = geometry !== shape.geometry;\n const labelChanged = label !== shape.label;\n if (!geometryChanged && !labelChanged) return shape;\n changed = true;\n return {\n ...shape,\n geometry,\n bbox: geometryChanged ? geometryBBox(geometry) : shape.bbox,\n label,\n };\n });\n return changed ? { ...draft, shapes } : draft;\n}\n\n/** Collapse repeated updates to the same entity so Save Changes sends one op each. */\nexport function coalesceDraftOp(ops: BatchOp[], op: BatchOp): BatchOp[] {\n if (op.op === 'update_theme') {\n const prev = ops.filter((item) => item.op === 'update_theme');\n const rest = ops.filter((item) => item.op !== 'update_theme');\n const theme = prev.reduce(\n (acc, item) => (item.op === 'update_theme' ? { ...acc, ...item.theme } : acc),\n {} as Record<string, unknown>,\n );\n return [...rest, { op: 'update_theme', theme: { ...theme, ...op.theme } }];\n }\n\n if (op.op === 'upsert_shape' && op.shape.id != null) {\n const idx = ops.findIndex(\n (item) => item.op === 'upsert_shape' && item.shape.id === op.shape.id,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_shape') {\n const next = ops.slice();\n const merged = { ...ops[idx].shape, ...op.shape };\n next[idx] = {\n op: 'upsert_shape',\n shape: {\n ...merged,\n label: mergeEntranceAwareLabel(\n ops[idx].shape.label,\n op.shape.label,\n {\n kind: merged.kind ?? 'unit',\n origin: merged.origin,\n sourceSvgId: merged.sourceSvgId,\n },\n ),\n },\n };\n return next;\n }\n }\n\n if (op.op === 'upsert_anchor' && op.anchor.id != null) {\n const idx = ops.findIndex(\n (item) => item.op === 'upsert_anchor' && item.anchor.id === op.anchor.id,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_anchor') {\n const next = ops.slice();\n next[idx] = {\n op: 'upsert_anchor',\n anchor: { ...ops[idx].anchor, ...op.anchor },\n };\n return next;\n }\n }\n\n if (op.op === 'upsert_connector' && op.connector.id != null) {\n const idx = ops.findIndex(\n (item) => item.op === 'upsert_connector' && item.connector.id === op.connector.id,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_connector') {\n const next = ops.slice();\n next[idx] = {\n op: 'upsert_connector',\n connector: { ...ops[idx].connector, ...op.connector },\n };\n return next;\n }\n }\n\n if (op.op === 'upsert_assignment') {\n const idx = ops.findIndex(\n (item) =>\n item.op === 'upsert_assignment' &&\n item.assignment.shapeId === op.assignment.shapeId,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_assignment') {\n const next = ops.slice();\n next[idx] = { op: 'upsert_assignment', assignment: op.assignment };\n return next;\n }\n }\n\n return [...ops, op];\n}\n\n/**\n * Persist order for POST /v1/map/batch.\n * Relinking an escalator coalesces landing upserts into the earlier unlink slot,\n * which would otherwise write `connector_id` before the new connector exists.\n *\n * `delete_edge` runs before `upsert_edge`. Splitting a corridor deletes the\n * old edge and inserts a replacement with the same endpoints; inserting first\n * violates `cm_route_edges (from_anchor_id, to_anchor_id)`.\n * Keep in sync with `admin-portal-backend` `orderBatchOpsForPersist`.\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 delete_edge: 65,\n upsert_edge: 70,\n update_theme: 80,\n weld_anchors: 90,\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\nfunction edgePairKey(\n edge: Partial<CmRouteEdge> & { fromAnchorId: number; toAnchorId: number },\n): string {\n return `${edge.fromAnchorId}:${edge.toAnchorId}`;\n}\n\n/**\n * The editor log keeps every split and heal. Persist used to insert all of\n * those edges before deleting any, so two copies of the same anchor pair\n * landed in one transaction. Drop rows that this batch both creates and\n * removes, and keep only the last edge for each endpoint pair.\n */\nfunction compactRouteOpsForPersist(ops: BatchOp[]): BatchOp[] {\n const deletedEdgeIds = new Set<number>();\n const deletedAnchorIds = new Set<number>();\n const upsertedEdgeIds = new Set<number>();\n const upsertedAnchorIds = new Set<number>();\n\n for (const op of ops) {\n if (op.op === 'delete_edge') deletedEdgeIds.add(op.edgeId);\n if (op.op === 'delete_anchor') deletedAnchorIds.add(op.anchorId);\n if (op.op === 'upsert_edge' && op.edge.id != null) upsertedEdgeIds.add(op.edge.id);\n if (op.op === 'upsert_anchor' && op.anchor.id != null) {\n upsertedAnchorIds.add(op.anchor.id);\n }\n }\n\n const ephemeralAnchorIds = new Set(\n [...upsertedAnchorIds].filter((id) => id < 0 && deletedAnchorIds.has(id)),\n );\n\n const kept: BatchOp[] = [];\n for (const op of ops) {\n if (\n op.op === 'upsert_anchor' &&\n op.anchor.id != null &&\n deletedAnchorIds.has(op.anchor.id)\n ) {\n continue;\n }\n if (\n op.op === 'delete_anchor' &&\n op.anchorId < 0 &&\n upsertedAnchorIds.has(op.anchorId)\n ) {\n continue;\n }\n if (op.op === 'upsert_edge' && op.edge.id != null && deletedEdgeIds.has(op.edge.id)) {\n continue;\n }\n if (op.op === 'delete_edge' && op.edgeId < 0 && upsertedEdgeIds.has(op.edgeId)) {\n continue;\n }\n if (\n op.op === 'upsert_edge' &&\n (ephemeralAnchorIds.has(op.edge.fromAnchorId) ||\n ephemeralAnchorIds.has(op.edge.toAnchorId))\n ) {\n continue;\n }\n kept.push(op);\n }\n\n const lastIndexByPair = new Map<string, number>();\n kept.forEach((op, index) => {\n if (op.op !== 'upsert_edge') return;\n lastIndexByPair.set(edgePairKey(op.edge), index);\n });\n\n const drop = new Set<number>();\n const extraDeletes: BatchOp[] = [];\n kept.forEach((op, index) => {\n if (op.op !== 'upsert_edge') return;\n const winner = lastIndexByPair.get(edgePairKey(op.edge));\n if (winner == null || winner === index) return;\n drop.add(index);\n const winnerOp = kept[winner];\n if (\n op.edge.id != null &&\n op.edge.id > 0 &&\n winnerOp.op === 'upsert_edge' &&\n winnerOp.edge.id !== op.edge.id &&\n !deletedEdgeIds.has(op.edge.id)\n ) {\n extraDeletes.push({ op: 'delete_edge', edgeId: op.edge.id });\n }\n });\n\n return [...kept.filter((_, index) => !drop.has(index)), ...extraDeletes];\n}\n\nfunction sortBatchOps(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\nexport function orderBatchOpsForPersist(ops: BatchOp[]): BatchOp[] {\n return sortBatchOps(compactRouteOpsForPersist(ops));\n}\n","import React from 'react';\n\nfunction FieldResetIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3.3 8a4.7 4.7 0 1 0 1.15-3.15\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M3.1 2.6v3.3h3.3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function FieldResetButton({\n label,\n onClick,\n disabled,\n}: {\n label: string;\n onClick: () => void;\n disabled?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n className=\"eyeon-map-rail__field-reset\"\n aria-label={`Reset ${label}`}\n title=\"Reset\"\n disabled={disabled}\n onClick={onClick}\n >\n <FieldResetIcon />\n </button>\n );\n}\n","import { isTransparentColor } from '../core/color';\n\nexport { isTransparentColor, TRANSPARENT_COLOR } from '../core/color';\n\n/** Normalize `#rgb` / `#rrggbb` (with or without `#`) for `<input type=\"color\">`. */\nexport function normalizeHexColor(value: string): string | null {\n const match = value.trim().match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);\n if (!match) return null;\n let hex = match[1].toLowerCase();\n if (hex.length === 3) {\n hex = hex\n .split('')\n .map((ch) => ch + ch)\n .join('');\n }\n return `#${hex}`;\n}\n\nexport function hexColorInputValue(value: string): string {\n return normalizeHexColor(value) ?? '#000000';\n}\n\nexport function sameHexColor(a: string, b: string): boolean {\n if (isTransparentColor(a) || isTransparentColor(b)) {\n return isTransparentColor(a) && isTransparentColor(b);\n }\n const left = normalizeHexColor(a);\n const right = normalizeHexColor(b);\n return left != null && left === right;\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport {\n assignNumberFromDraft,\n commitAssignNumberDraft,\n LABEL_ALIGNS,\n normalizeLabelAlign,\n type LabelAlign,\n} from '../../core';\nimport { FieldResetButton } from '../FieldResetButton';\nimport {\n hexColorInputValue,\n isTransparentColor,\n normalizeHexColor,\n TRANSPARENT_COLOR,\n} from '../hexColor';\n\nexport function StepperRow({\n label,\n value,\n disabled,\n extra,\n onChange,\n onStep,\n onHoldStart,\n onHoldEnd,\n}: {\n label: string;\n value: number;\n disabled: boolean;\n extra?: React.ReactNode;\n onChange: (value: number) => void;\n onStep: (delta: number) => void;\n onHoldStart: (delta: number) => void;\n onHoldEnd: () => void;\n}) {\n const [draft, setDraft] = useState(() => String(value));\n const focused = useRef(false);\n const syncDraft = useRef(false);\n\n useEffect(() => {\n if (!focused.current || syncDraft.current) {\n setDraft(String(value));\n syncDraft.current = false;\n }\n }, [value]);\n\n const commitDraft = (raw: string, persistIncomplete: boolean) => {\n const parsed = persistIncomplete\n ? commitAssignNumberDraft(raw)\n : { display: raw, render: assignNumberFromDraft(raw).render };\n setDraft(parsed.display);\n onChange(parsed.render);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">{label}</span>\n <div className=\"eyeon-map-assign__control\">\n {extra}\n <div className=\"eyeon-map-assign__stepper\">\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={`Decrease ${label}`}\n onClick={() => onStep(-1)}\n onMouseDown={() => onHoldStart(-1)}\n onMouseUp={onHoldEnd}\n onMouseLeave={onHoldEnd}\n >\n −\n </button>\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={draft}\n disabled={disabled}\n aria-label={label}\n onFocus={() => {\n focused.current = true;\n }}\n onChange={(e) => commitDraft(e.target.value, false)}\n onBlur={() => {\n focused.current = false;\n commitDraft(draft, true);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n return;\n }\n if (e.key !== 'ArrowUp' && e.key !== 'ArrowDown') return;\n e.preventDefault();\n if (disabled) return;\n syncDraft.current = true;\n onStep(e.key === 'ArrowUp' ? 1 : -1);\n }}\n />\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={`Increase ${label}`}\n onClick={() => onStep(1)}\n onMouseDown={() => onHoldStart(1)}\n onMouseUp={onHoldEnd}\n onMouseLeave={onHoldEnd}\n >\n +\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nexport function ColorSwatch({\n label,\n hex,\n swatch,\n fallback,\n disabled,\n emptyIsTransparent = true,\n onHexChange,\n onCommit,\n onPick,\n}: {\n label: string;\n hex: string;\n swatch: string;\n fallback?: string;\n disabled?: boolean;\n emptyIsTransparent?: boolean;\n onHexChange: (value: string) => void;\n onCommit: () => void;\n onPick: (hex: string) => void;\n}) {\n const lastSolid = useRef(hexColorInputValue(fallback || swatch));\n const transparent =\n isTransparentColor(swatch) ||\n (emptyIsTransparent && !hex.trim());\n\n useEffect(() => {\n const solid = normalizeHexColor(swatch);\n if (solid) lastSolid.current = solid;\n }, [swatch]);\n\n const pickerValue = hexColorInputValue(transparent ? lastSolid.current : swatch);\n\n return (\n <div className=\"eyeon-map-assign__swatch\">\n <span\n className={\n transparent\n ? 'eyeon-map-assign__swatch-well is-transparent'\n : 'eyeon-map-assign__swatch-well'\n }\n style={transparent ? undefined : { backgroundColor: hexColorInputValue(swatch) }}\n >\n <input\n type=\"color\"\n className=\"eyeon-map-assign__swatch-native\"\n disabled={disabled}\n aria-label={label}\n value={pickerValue}\n onChange={(e) => {\n lastSolid.current = e.target.value;\n onPick(e.target.value);\n }}\n />\n </span>\n <input\n type=\"text\"\n spellCheck={false}\n disabled={disabled}\n aria-label={`${label} hex`}\n placeholder=\"Transparent\"\n value={transparent ? '' : hex}\n onChange={(e) => onHexChange(e.target.value)}\n onBlur={onCommit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n }\n }}\n />\n </div>\n );\n}\n\nexport function ColorRow({\n label,\n value,\n fallback,\n disabled,\n onChange,\n onReset,\n}: {\n label: string;\n value: string;\n fallback: string;\n disabled: boolean;\n onChange: (hex: string) => void;\n onReset?: () => void;\n}) {\n const transparent = isTransparentColor(value);\n const display = transparent ? TRANSPARENT_COLOR : value.trim() ? value : fallback;\n const [hex, setHex] = useState(transparent ? '' : display);\n\n useEffect(() => {\n setHex(transparent ? '' : display);\n }, [display, transparent]);\n\n const commit = (next: string) => {\n if (!next.trim() || isTransparentColor(next)) {\n setHex('');\n onChange(TRANSPARENT_COLOR);\n return;\n }\n const normalized = normalizeHexColor(next);\n if (!normalized) {\n setHex(transparent ? '' : display);\n return;\n }\n setHex(normalized);\n onChange(normalized);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">\n {label}\n {onReset ? (\n <FieldResetButton label={label} onClick={onReset} disabled={disabled} />\n ) : null}\n </span>\n <ColorSwatch\n label={label}\n hex={hex}\n swatch={display}\n fallback={fallback}\n disabled={disabled}\n onHexChange={setHex}\n onCommit={() => commit(hex)}\n onPick={commit}\n />\n </div>\n );\n}\n\nconst ALIGN_TOOLTIPS: Record<LabelAlign, string> = {\n left: 'Left',\n center: 'Center',\n right: 'Right',\n};\n\nfunction AlignLeftIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M2 3h12v1.4H2V3zm0 4.3h8v1.4H2V7.3zm0 4.3h12v1.4H2v-1.4z\"\n />\n </svg>\n );\n}\n\nfunction AlignCenterIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M2 3h12v1.4H2V3zm2 4.3h8v1.4H4V7.3zm-2 4.3h12v1.4H2v-1.4z\"\n />\n </svg>\n );\n}\n\nfunction AlignRightIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M2 3h12v1.4H2V3zm4 4.3h8v1.4H6V7.3zm-4 4.3h12v1.4H2v-1.4z\"\n />\n </svg>\n );\n}\n\nconst ALIGN_ICONS: Record<LabelAlign, React.ReactNode> = {\n left: <AlignLeftIcon />,\n center: <AlignCenterIcon />,\n right: <AlignRightIcon />,\n};\n\nexport function AlignRow({\n value,\n disabled,\n onChange,\n}: {\n value?: LabelAlign;\n disabled: boolean;\n onChange: (align: LabelAlign) => void;\n}) {\n const align = normalizeLabelAlign(value);\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">Alignment</span>\n <div className=\"eyeon-map-assign__align\" role=\"group\" aria-label=\"Alignment\">\n {LABEL_ALIGNS.map((option) => (\n <button\n key={option}\n type=\"button\"\n className={option === align ? 'is-active' : undefined}\n disabled={disabled}\n aria-label={ALIGN_TOOLTIPS[option]}\n aria-pressed={option === align}\n data-tooltip={ALIGN_TOOLTIPS[option]}\n onClick={() => onChange(option)}\n >\n {ALIGN_ICONS[option]}\n </button>\n ))}\n </div>\n </div>\n );\n}\n\nexport function RotateIcon() {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n fill=\"currentColor\"\n d=\"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\"\n />\n </svg>\n );\n}\n\nexport function nextQuarterTurn(value: number): number {\n const angle = 45;\n let next = value;\n const remainder = next % angle;\n if (remainder !== 0) next -= remainder;\n next += angle;\n return next >= 360 ? 0 : next;\n}\n\n/** +/- drops the fraction, then steps by whole numbers. Typed decimals stay until then. */\nexport function stepWholeNumber(value: number, delta: number): number {\n if (!Number.isFinite(value)) return delta;\n if (delta > 0) return Math.floor(value) + delta;\n if (Number.isInteger(value)) return value + delta;\n return Math.floor(value);\n}\n","import React, { useEffect, useRef } from 'react';\nimport type { CmShapeAssignment } from '../../core';\nimport { ColorRow, RotateIcon, StepperRow, nextQuarterTurn } from './formRows';\n\ntype StepKey = 'size' | 'rotate' | 'offsetX' | 'offsetY';\n\nexport interface AssignmentStyleFieldsProps {\n form: Pick<\n CmShapeAssignment,\n 'size' | 'rotate' | 'offsetX' | 'offsetY' | 'bgColor' | 'textColor'\n >;\n canEdit: boolean;\n storeDefaultColor: string;\n storeTextColor: string;\n textColorLabel?: string;\n showTextColor?: boolean;\n onPatch: (partial: Partial<CmShapeAssignment>) => void;\n}\n\n/** Size, rotate, offset, and colors — shared by kiosk / store / escalator assign. */\nexport function AssignmentStyleFields({\n form,\n canEdit,\n storeDefaultColor,\n storeTextColor,\n textColorLabel = 'Text Color',\n showTextColor = true,\n onPatch,\n}: AssignmentStyleFieldsProps) {\n const formRef = useRef(form);\n formRef.current = form;\n const intervals = useRef<Partial<Record<StepKey, number>>>({});\n\n useEffect(\n () => () => {\n (Object.values(intervals.current) as number[]).forEach((id) =>\n window.clearInterval(id),\n );\n },\n [],\n );\n\n const bump = (key: StepKey, delta: number) => {\n onPatch({ [key]: (formRef.current[key] ?? 0) + delta });\n };\n\n const startHold = (key: StepKey, delta: number) => {\n stopHold(key);\n intervals.current[key] = window.setInterval(() => bump(key, delta), 200);\n };\n\n const stopHold = (key: StepKey) => {\n const id = intervals.current[key];\n if (id) {\n window.clearInterval(id);\n intervals.current[key] = undefined;\n }\n };\n\n return (\n <>\n <StepperRow\n label=\"Size\"\n value={form.size}\n disabled={!canEdit}\n onChange={(size) => onPatch({ size })}\n onStep={(delta) => bump('size', delta)}\n onHoldStart={(delta) => startHold('size', delta)}\n onHoldEnd={() => stopHold('size')}\n />\n <StepperRow\n label=\"Rotate\"\n value={form.rotate}\n disabled={!canEdit}\n extra={\n <button\n type=\"button\"\n className=\"eyeon-map-assign__rotate\"\n aria-label=\"Rotate 45 degrees\"\n disabled={!canEdit}\n onClick={() => onPatch({ rotate: nextQuarterTurn(form.rotate ?? 0) })}\n >\n <RotateIcon />\n </button>\n }\n onChange={(rotate) => onPatch({ rotate })}\n onStep={(delta) => bump('rotate', delta)}\n onHoldStart={(delta) => startHold('rotate', delta)}\n onHoldEnd={() => stopHold('rotate')}\n />\n <StepperRow\n label=\"Offset X\"\n value={form.offsetX}\n disabled={!canEdit}\n onChange={(offsetX) => onPatch({ offsetX })}\n onStep={(delta) => bump('offsetX', delta)}\n onHoldStart={(delta) => startHold('offsetX', delta)}\n onHoldEnd={() => stopHold('offsetX')}\n />\n <StepperRow\n label=\"Offset Y\"\n value={form.offsetY}\n disabled={!canEdit}\n onChange={(offsetY) => onPatch({ offsetY })}\n onStep={(delta) => bump('offsetY', delta)}\n onHoldStart={(delta) => startHold('offsetY', delta)}\n onHoldEnd={() => stopHold('offsetY')}\n />\n <ColorRow\n label=\"BG Color\"\n value={form.bgColor ?? ''}\n fallback={storeDefaultColor}\n disabled={!canEdit}\n onChange={(bgColor) => onPatch({ bgColor: bgColor || null })}\n onReset={form.bgColor ? () => onPatch({ bgColor: null }) : undefined}\n />\n {showTextColor ? (\n <ColorRow\n label={textColorLabel}\n value={form.textColor ?? ''}\n fallback={storeTextColor}\n disabled={!canEdit}\n onChange={(textColor) => onPatch({ textColor: textColor || null })}\n onReset={form.textColor ? () => onPatch({ textColor: null }) : undefined}\n />\n ) : null}\n </>\n );\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { BatchOp, CmShape, CmShapeAssignment } from '../../core';\nimport {\n assignmentPadFillFallback,\n emptyShapeAssignment,\n parseShapeAssignment,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport { AssignmentStyleFields } from './AssignmentStyleFields';\nimport {\n buildElevatorShaftOps,\n buildEscalatorLinkOps,\n buildUnlinkConnectorOps,\n connectorForShape,\n connectorIdForShape,\n levelsWithLandings,\n memberShapeIds,\n resolvedConnectorKind,\n 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 applyEscalator = (from: CmShape, to: CmShape) => {\n onApplyOps(buildEscalatorLinkOps(ctx, from, to));\n };\n\n const applyElevator = (nextMembers: CmShape[]) => {\n if (nextMembers.length < 2) return;\n onApplyOps(\n buildElevatorShaftOps(ctx, nextMembers, {\n name: connector?.name,\n accessible: connector?.accessible ?? true,\n connectorId: connector?.id,\n }),\n );\n };\n\n const pickExitLanding = (nextId: string) => {\n setTargetId(nextId);\n const to = ctx.shapes.find((s) => s.id === Number(nextId));\n if (!to || !canEdit) return;\n applyEscalator(shape, to);\n };\n\n const pickElevatorStop = (nextId: string) => {\n const next = ctx.shapes.find((s) => s.id === Number(nextId));\n if (!next || !canEdit) return;\n applyElevator([...members, shape, next]);\n setStopFloorId('');\n };\n\n const landingOptions = (\n landings: CmShape[],\n kind: VerticalRailKind,\n ) =>\n landings.map((item) => {\n const linked = connectorIdForShape(item.id, ctx.anchors) != null;\n return {\n value: String(item.id),\n label: item.key,\n hint: linked ? 'Linked' : undefined,\n iconUrl: connectorSpecialIconDataUrl(\n kind,\n linked,\n linked ? storeTextColor : undefined,\n ),\n iconMuted: !linked,\n };\n });\n\n return (\n <div className=\"eyeon-map-inspector\">\n <div className=\"eyeon-map-inspector__heading\">\n {railKind === 'escalator' ? 'Escalator ride' : 'Elevator shaft'}\n </div>\n {railKind === 'escalator' ? (\n <p className=\"eyeon-map-rail__hint\">\n People board this landing and get off at a different place on another\n floor. Travel is one-way.\n </p>\n ) : (\n <p className=\"eyeon-map-rail__hint\">\n One shaft, many floors. Riders can go between any linked landings in\n both directions.\n </p>\n )}\n\n {railKind === 'escalator' && (\n <>\n <label className=\"eyeon-map-rail__field\">\n Floor\n <ModernSelect\n ariaLabel=\"Floor\"\n value={exitFloorId}\n disabled={!canEdit || exitFloors.length === 0}\n placeholder=\"Choose a floor\"\n options={exitFloors.map((level) => ({\n value: String(level.id),\n label: level.name,\n }))}\n onChange={(nextFloor) => {\n setExitFloorId(nextFloor);\n setTargetId(\n partner && String(partner.levelId) === nextFloor\n ? String(partner.id)\n : '',\n );\n }}\n />\n </label>\n <label className=\"eyeon-map-rail__field\">\n Escalator Point\n <ModernSelect\n ariaLabel=\"Escalator Point\"\n value={targetId}\n disabled={!canEdit || !exitFloorId}\n placeholder={\n exitFloorId\n ? 'Choose an escalator on that floor'\n : 'Choose a floor first'\n }\n searchable\n options={landingOptions(landingsOnExitFloor, 'escalator')}\n onChange={pickExitLanding}\n />\n </label>\n {partner ? (\n <p className=\"eyeon-map-rail__hint\">\n Linked: {shape.key} → {partner.key} ({levelName(shape.levelId)} →{' '}\n {levelName(partner.levelId)}, {connector?.direction ?? 'up'})\n </p>\n ) : null}\n {canEdit && connector ? (\n <div className=\"eyeon-map-rail__actions\">\n <button\n type=\"button\"\n onClick={() => onApplyOps(buildUnlinkConnectorOps(ctx, connector.id))}\n >\n Unlink\n </button>\n </div>\n ) : null}\n </>\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 <>\n <div className=\"eyeon-map-rail__heading eyeon-map-rail__heading--section\">\n Design\n </div>\n <div className=\"eyeon-map-assign\">\n <AssignmentStyleFields\n form={styleForm}\n canEdit={canEdit}\n storeDefaultColor={assignmentPadFillFallback(\n 'connector',\n storeDefaultColor,\n )}\n storeTextColor={storeTextColor}\n textColorLabel=\"Icon Color\"\n onPatch={patchStyle}\n />\n </div>\n </>\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 custom: 'Custom',\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 'custom',\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 'custom',\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 layerType?: CmShapeAssignment['layerType'] | null;\n customImageKey?: 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 custom: T[];\n unassignedCustom: 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 custom: T[] = [];\n const unassignedCustom: 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 (shape.kind === 'custom') {\n if (isPolygonAssigned(assignment)) custom.push(shape);\n else unassignedCustom.push(shape);\n continue;\n }\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 custom,\n unassignedCustom,\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 'custom',\n 'unassigned',\n 'escalators',\n 'elevators',\n] as const;\n\nexport type RailItemSection = (typeof RAIL_ITEM_SECTIONS)[number];\n\nexport function isRailItemSection(\n section: string | null,\n): section is RailItemSection {\n return (\n section != null &&\n (RAIL_ITEM_SECTIONS as readonly string[]).includes(section)\n );\n}\n\n/** Third sidebar screen: field options for the selected list item. */\nexport function railShowsItemOptions(\n section: string | null,\n selectedCount: number,\n): boolean {\n return isRailItemSection(section) && selectedCount > 0;\n}\n\ntype RailLevel = {\n id: number;\n kind: string;\n ordering: number;\n levelIndex: number;\n};\n\n/** Outdoor first, then the lowest building floor, then each floor above it. */\nexport function railListLevelOrder<T extends RailLevel>(levels: T[]): T[] {\n const outdoor = levels.filter((level) => level.kind === 'outdoor');\n const floorsLowToHigh = levels\n .filter((level) => level.kind === 'floor')\n .slice()\n .sort(compareBuildingFloors)\n .reverse();\n return [...outdoor, ...floorsLowToHigh];\n}\n\nexport function sortShapesByRailLevel<T extends { levelId: number }>(\n shapes: T[],\n levels: RailLevel[],\n): T[] {\n const indexById = new Map(\n railListLevelOrder(levels).map((level, index) => [level.id, index]),\n );\n return shapes.slice().sort((a, b) => {\n const ai = indexById.get(a.levelId) ?? Number.POSITIVE_INFINITY;\n const bi = indexById.get(b.levelId) ?? Number.POSITIVE_INFINITY;\n return ai - bi;\n });\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { compareBuildingFloors, type CmBuilding, type CmLevel } from '../../core';\n\nexport type CreateLevelInput = {\n name: string;\n kind: 'outdoor' | 'floor';\n buildingId?: number | null;\n file?: File;\n onProgress?: (percent: number) => void;\n};\n\nexport type UpdateLevelInput = {\n levelId: number;\n name?: string;\n file?: File;\n onProgress?: (percent: number) => void;\n};\n\nexport type FloorsScreen =\n | { mode: 'list' }\n | { mode: 'add-base' }\n | { mode: 'add-floor' }\n | { mode: 'edit'; levelId: number };\n\nexport function floorsScreenTitle(\n screen: FloorsScreen,\n levels: Array<{ id: number; kind: string }>,\n): string {\n if (screen.mode === 'add-base') return 'Add Outdoor SVG';\n if (screen.mode === 'add-floor') return 'Add Floor';\n if (screen.mode === 'edit') {\n const level = levels.find((l) => l.id === screen.levelId);\n return level?.kind === 'outdoor' ? 'Edit Outdoor' : 'Edit Floor';\n }\n return 'Floors';\n}\n\n/** Building floors only — Outdoor is a separate item and is not counted. */\nexport function visibleFloorCount(levels: Array<{ kind: string }>): number {\n return levels.filter((l) => l.kind === 'floor').length;\n}\n\n/** Insert `movedId` before or after `targetId`. Used by live floor reorder. */\nexport function placeLevelId(\n ids: number[],\n movedId: number,\n targetId: number,\n place: 'before' | 'after',\n): number[] {\n if (movedId === targetId) return ids;\n const from = ids.indexOf(movedId);\n if (from < 0) return ids;\n const without = ids.filter((id) => id !== movedId);\n const target = without.indexOf(targetId);\n if (target < 0) return ids;\n const next = [...without];\n next.splice(place === 'after' ? target + 1 : target, 0, movedId);\n return next;\n}\n\n/** Move `movedId` to `toIndex` in the list with that id removed. */\nexport function moveLevelId(ids: number[], movedId: number, toIndex: number): number[] {\n const from = ids.indexOf(movedId);\n if (from < 0) return ids;\n const without = ids.filter((id) => id !== movedId);\n const clamped = Math.max(0, Math.min(toIndex, without.length));\n const next = [...without];\n next.splice(clamped, 0, movedId);\n return next;\n}\n\n/** Slot index from pointer Y. Uses the list box, not live row midpoints. */\nexport function insertIndexFromY(\n clientY: number,\n listTop: number,\n rowHeight: number,\n count: number,\n): number {\n if (count <= 1 || rowHeight <= 0) return 0;\n const index = Math.round((clientY - listTop - rowHeight / 2) / rowHeight);\n return Math.max(0, Math.min(count - 1, index));\n}\n\n/** Overlay Y for the drop line. Null when the item would stay put. */\nexport function dropLineTop(\n fromIndex: number,\n dropIndex: number,\n rowHeight: number,\n rowInnerHeight: number,\n): number | null {\n if (fromIndex < 0 || dropIndex === fromIndex || rowHeight <= 0) return null;\n if (dropIndex < fromIndex) return dropIndex * rowHeight;\n return dropIndex * rowHeight + rowInnerHeight;\n}\n\nfunction sameIdOrder(a: number[], b: number[]): boolean {\n return a.length === b.length && a.every((id, i) => id === b[i]);\n}\n\ntype FloorDrag = {\n id: number;\n pointerId: number;\n offsetX: number;\n offsetY: number;\n width: number;\n height: number;\n name: string;\n x: number;\n y: number;\n listTop: number;\n listLeft: number;\n listBottom: number;\n rowHeight: number;\n originIds: number[];\n dropIndex: number;\n};\n\nexport interface FloorsPanelProps {\n levels: CmLevel[];\n buildings: CmBuilding[];\n /** Shapes already imported per level — drives delete and re-import copy. */\n levelShapeCounts?: Record<number, number>;\n canFloors: boolean;\n screen: FloorsScreen;\n onScreenChange: (screen: FloorsScreen) => void;\n onCreateLevel?: (input: CreateLevelInput) => Promise<number | void>;\n onUpdateLevel?: (input: UpdateLevelInput) => Promise<void>;\n onDeleteLevel?: (levelId: number) => Promise<void>;\n onReorderLevels?: (orderedIds: number[]) => Promise<void>;\n}\n\nfunction formatBytes(size: number): string {\n if (size < 1024) return `${size} B`;\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`;\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction svgFileName(key: string | null | undefined): string | null {\n if (!key) return null;\n const part = key.split('/').pop()?.trim();\n return part || null;\n}\n\nfunction isSvgFile(next: File): boolean {\n return next.name.toLowerCase().endsWith('.svg') || next.type === 'image/svg+xml';\n}\n\nfunction GripIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" aria-hidden=\"true\">\n <path\n d=\"M3 5h12M3 9h12M3 13h12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\n/** Same glyph as admin-portal Deals/Retailers (`Trash2` from react-feather). */\nfunction TrashIcon() {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"3 6 5 6 21 6\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" />\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" />\n </svg>\n );\n}\n\nexport function deleteConfirmCopy(\n level: { kind: string; name: string },\n shapeCount = 0,\n) {\n const isOutdoor = level.kind === 'outdoor';\n const shapes =\n shapeCount === 1 ? '1 shape' : `${shapeCount} shapes`;\n return {\n title: isOutdoor ? 'Delete Outdoor SVG?' : `Delete “${level.name}”?`,\n body: isOutdoor\n ? `The stored outdoor SVG, its ${shapes} and every assignment on them are removed. Building floors are not affected.`\n : `This floor and its ${shapes} are removed, along with the retailer, amenity and kiosk assignments on them.`,\n action: isOutdoor ? 'Delete Outdoor' : 'Delete floor',\n };\n}\n\nexport function FloorsPanel({\n levels,\n buildings,\n levelShapeCounts,\n canFloors,\n screen,\n onScreenChange,\n onCreateLevel,\n onUpdateLevel,\n onDeleteLevel,\n onReorderLevels,\n}: FloorsPanelProps) {\n const [name, setName] = useState('');\n const [file, setFile] = useState<File | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [progress, setProgress] = useState<number | null>(null);\n const [dragOver, setDragOver] = useState(false);\n const [confirmDeleteId, setConfirmDeleteId] = useState<number | null>(null);\n const [deleting, setDeleting] = useState(false);\n const [drag, setDrag] = useState<FloorDrag | null>(null);\n const [dropIndex, setDropIndex] = useState<number | null>(null);\n const [previewIds, setPreviewIds] = useState<number[] | null>(null);\n const [previewFailed, setPreviewFailed] = useState(false);\n const [localPreviewUrl, setLocalPreviewUrl] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const floorListRef = useRef<HTMLDivElement>(null);\n const ghostRef = useRef<HTMLDivElement>(null);\n const previewIdsRef = useRef<number[] | null>(null);\n const dragRef = useRef<FloorDrag | null>(null);\n\n const outdoor = useMemo(\n () => levels.find((l) => l.kind === 'outdoor') ?? null,\n [levels],\n );\n const outdoorReady = Boolean(outdoor?.sourceSvgKey || outdoor?.sourceSvgUrl);\n const shapeCount = (levelId: number) => levelShapeCounts?.[levelId] ?? 0;\n const buildingFloors = useMemo(\n () =>\n levels\n .filter((l) => l.kind === 'floor')\n .slice()\n .sort(compareBuildingFloors),\n [levels],\n );\n const committedIds = useMemo(\n () => buildingFloors.map((level) => level.id),\n [buildingFloors],\n );\n const displayFloors = useMemo(() => {\n // Keep committed order on screen while dragging so sibling rows stay put.\n const ids = drag != null ? committedIds : (previewIds ?? committedIds);\n const byId = new Map(buildingFloors.map((level) => [level.id, level]));\n return ids\n .map((id) => byId.get(id))\n .filter((level): level is CmLevel => level != null);\n }, [buildingFloors, committedIds, drag, previewIds]);\n const editing =\n screen.mode === 'edit'\n ? levels.find((l) => l.id === screen.levelId) ?? null\n : null;\n const isOutdoorForm =\n screen.mode === 'add-base' || editing?.kind === 'outdoor';\n const canManage = canFloors && !!onCreateLevel && !!onUpdateLevel;\n const canReorder = canManage && !!onReorderLevels && buildingFloors.length > 1;\n\n useEffect(() => {\n if (screen.mode === 'add-base' || editing?.kind === 'outdoor') {\n setName('Outdoor');\n setFile(null);\n } else if (screen.mode === 'add-floor') {\n setName('');\n setFile(null);\n } else if (screen.mode === 'edit' && editing) {\n setName(editing.name);\n setFile(null);\n }\n setError(null);\n setConfirmDeleteId(null);\n setDeleting(false);\n setProgress(null);\n setPreviewFailed(false);\n }, [screen, editing?.id, editing?.kind, editing?.name]);\n\n useEffect(() => {\n if (confirmDeleteId == null) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && !deleting) setConfirmDeleteId(null);\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [confirmDeleteId, deleting]);\n\n useEffect(() => {\n if (!file) {\n setLocalPreviewUrl(null);\n return;\n }\n const url = URL.createObjectURL(file);\n setLocalPreviewUrl(url);\n setPreviewFailed(false);\n return () => URL.revokeObjectURL(url);\n }, [file]);\n\n previewIdsRef.current = previewIds;\n dragRef.current = drag;\n\n useEffect(() => {\n if (drag != null || previewIds == null) return;\n if (sameIdOrder(committedIds, previewIds)) setPreviewIds(null);\n }, [committedIds, drag, previewIds]);\n\n const takeSvgFile = (next: File | null | undefined) => {\n if (!next) return;\n if (!isSvgFile(next)) {\n setError('Choose an SVG file.');\n return;\n }\n setError(null);\n setFile(next);\n };\n\n const openEdit = (level: CmLevel) => {\n onScreenChange({ mode: 'edit', levelId: level.id });\n };\n\n const submit = async (picked?: File | null) => {\n const svgFile = picked ?? file;\n if (isOutdoorForm) {\n if (!svgFile && (screen.mode === 'add-base' || !editing?.sourceSvgKey)) {\n setError('Choose an SVG file.');\n return;\n }\n } else if (!name.trim()) {\n setError('Enter a title.');\n return;\n }\n if (screen.mode === 'add-floor' && !svgFile) {\n setError('Choose an SVG file.');\n return;\n }\n setBusy(true);\n setError(null);\n if (svgFile) setProgress(0);\n try {\n if (screen.mode === 'add-base') {\n await onCreateLevel?.({\n name: 'Outdoor',\n kind: 'outdoor',\n file: svgFile ?? undefined,\n onProgress: setProgress,\n });\n } else if (screen.mode === 'add-floor') {\n await onCreateLevel?.({\n name: name.trim(),\n kind: 'floor',\n buildingId: buildings[0]?.id ?? null,\n file: svgFile ?? undefined,\n onProgress: setProgress,\n });\n } else if (screen.mode === 'edit' && editing) {\n await onUpdateLevel?.({\n levelId: editing.id,\n name: editing.kind === 'outdoor' ? 'Outdoor' : name.trim(),\n file: svgFile ?? undefined,\n onProgress: setProgress,\n });\n }\n setProgress(100);\n onScreenChange({ mode: 'list' });\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not save floor.');\n setProgress(null);\n } finally {\n setBusy(false);\n }\n };\n\n const remove = async (level: CmLevel) => {\n if (!onDeleteLevel || deleting) return;\n setDeleting(true);\n setError(null);\n try {\n await onDeleteLevel(level.id);\n setConfirmDeleteId(null);\n onScreenChange({ mode: 'list' });\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not delete floor.');\n } finally {\n setDeleting(false);\n }\n };\n\n const renderDeleteModal = () => {\n const level = levels.find((l) => l.id === confirmDeleteId);\n if (!level) return null;\n const copy = deleteConfirmCopy(level, shapeCount(level.id));\n return (\n <div className=\"eyeon-map-modal\" role=\"presentation\">\n <div\n className=\"eyeon-map-modal__backdrop\"\n onClick={() => (deleting ? undefined : setConfirmDeleteId(null))}\n />\n <div\n className=\"eyeon-map-modal__card\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"eyeon-map-delete-title\"\n aria-describedby=\"eyeon-map-delete-body\"\n >\n <h3 className=\"eyeon-map-modal__title\" id=\"eyeon-map-delete-title\">\n {copy.title}\n </h3>\n <p className=\"eyeon-map-modal__body\" id=\"eyeon-map-delete-body\">\n {copy.body} This cannot be undone.\n </p>\n {error ? <div className=\"eyeon-map-floors__error\">{error}</div> : null}\n <div className=\"eyeon-map-modal__actions\">\n <button\n type=\"button\"\n className=\"eyeon-map-modal__cancel\"\n disabled={deleting}\n onClick={() => setConfirmDeleteId(null)}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"eyeon-map-floors__danger\"\n disabled={deleting}\n autoFocus\n onClick={() => void remove(level)}\n >\n {deleting ? (\n <>\n <span className=\"eyeon-map-floors__spinner\" aria-hidden=\"true\" />\n Deleting…\n </>\n ) : (\n copy.action\n )}\n </button>\n </div>\n </div>\n </div>\n );\n };\n\n const renderRowDelete = (level: CmLevel) => {\n if (!canManage || !onDeleteLevel) return null;\n return (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__icon-danger\"\n title={`Delete ${level.kind === 'outdoor' ? 'Outdoor SVG' : level.name}`}\n aria-label={`Delete ${level.kind === 'outdoor' ? 'Outdoor SVG' : level.name}`}\n disabled={busy || deleting}\n onClick={(e) => {\n e.stopPropagation();\n setConfirmDeleteId(level.id);\n }}\n >\n <TrashIcon />\n </button>\n );\n };\n\n const applyGhost = (x: number, y: number) => {\n const ghost = ghostRef.current;\n if (!ghost) return;\n ghost.style.left = `${x}px`;\n ghost.style.top = `${y}px`;\n };\n\n const previewMoveToY = (clientY: number) => {\n const current = dragRef.current;\n if (!current) return;\n const index = insertIndexFromY(\n clientY,\n current.listTop,\n current.rowHeight,\n current.originIds.length,\n );\n if (current.dropIndex !== index) {\n current.dropIndex = index;\n setDropIndex(index);\n }\n const next = moveLevelId(current.originIds, current.id, index);\n const ids = previewIdsRef.current ?? current.originIds;\n if (!sameIdOrder(ids, next)) setPreviewIds(next);\n };\n\n const persistPreview = async () => {\n const nextIds = previewIdsRef.current;\n if (!onReorderLevels || nextIds == null) return;\n if (sameIdOrder(nextIds, committedIds)) {\n setPreviewIds(null);\n return;\n }\n try {\n await onReorderLevels(nextIds);\n } catch (e) {\n setPreviewIds(null);\n setError(e instanceof Error ? e.message : 'Could not reorder floors.');\n }\n };\n\n const endDrag = () => {\n if (!dragRef.current) return;\n dragRef.current = null;\n setDrag(null);\n setDropIndex(null);\n void persistPreview();\n };\n\n useEffect(() => {\n if (!drag) return;\n const onMove = (e: PointerEvent) => {\n const current = dragRef.current;\n if (!current || e.pointerId !== current.pointerId) return;\n const x = current.listLeft;\n const maxY = current.listBottom - current.height;\n const y = Math.max(current.listTop, Math.min(maxY, e.clientY - current.offsetY));\n current.x = x;\n current.y = y;\n applyGhost(x, y);\n previewMoveToY(e.clientY);\n };\n const onUp = (e: PointerEvent) => {\n const current = dragRef.current;\n if (!current || e.pointerId !== current.pointerId) return;\n endDrag();\n };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onUp);\n return () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n };\n }, [Boolean(drag)]);\n\n const startDrag = (level: CmLevel, e: React.PointerEvent<HTMLButtonElement>) => {\n const row = e.currentTarget.closest('.eyeon-map-floors__row');\n const list = floorListRef.current;\n if (!(row instanceof HTMLElement) || !list) return;\n const rect = row.getBoundingClientRect();\n const listRect = list.getBoundingClientRect();\n const rowHeight = rect.height + 2;\n e.preventDefault();\n e.stopPropagation();\n const next: FloorDrag = {\n id: level.id,\n pointerId: e.pointerId,\n offsetX: e.clientX - rect.left,\n offsetY: e.clientY - rect.top,\n width: rect.width,\n height: rect.height,\n name: level.name,\n x: listRect.left,\n y: rect.top,\n listTop: listRect.top,\n listLeft: listRect.left,\n listBottom: listRect.bottom,\n rowHeight,\n originIds: committedIds,\n dropIndex: committedIds.indexOf(level.id),\n };\n dragRef.current = next;\n setDrag(next);\n setDropIndex(committedIds.indexOf(level.id));\n setPreviewIds(committedIds);\n };\n\n const lineTop =\n drag && dropIndex != null\n ? dropLineTop(\n drag.originIds.indexOf(drag.id),\n dropIndex,\n drag.rowHeight,\n drag.height,\n )\n : null;\n\n if (screen.mode !== 'list') {\n const hasExistingSvg = Boolean(editing?.sourceSvgKey || editing?.sourceSvgUrl);\n const showEditPreview = screen.mode === 'edit' && hasExistingSvg;\n const previewUrl = localPreviewUrl ?? (showEditPreview ? editing?.sourceSvgUrl ?? null : null);\n const previewFallback =\n file?.name ?? svgFileName(editing?.sourceSvgKey) ?? 'SVG on file';\n const importedCount = editing ? shapeCount(editing.id) : 0;\n const showReimportNotice =\n !isOutdoorForm && screen.mode === 'edit' && importedCount > 0;\n const primaryLabel = isOutdoorForm ? 'Upload' : 'Import';\n const primaryBusyLabel = isOutdoorForm ? 'Uploading' : 'Importing';\n\n return (\n <div className=\"eyeon-map-floors\">\n {!isOutdoorForm && (\n <label className=\"eyeon-map-rail__field\">\n Title\n <input\n value={name}\n disabled={busy || !canManage}\n onChange={(e) => setName(e.target.value)}\n />\n </label>\n )}\n {showEditPreview ? (\n <div className=\"eyeon-map-rail__field eyeon-map-floors__svg-field\">\n SVG\n <div className=\"eyeon-map-floors__preview-card\">\n {previewUrl && !previewFailed ? (\n <img\n className=\"eyeon-map-floors__preview-img\"\n src={previewUrl}\n alt={file?.name ?? editing?.name ?? 'SVG preview'}\n onError={() => setPreviewFailed(true)}\n />\n ) : (\n <div className=\"eyeon-map-floors__preview-fallback\">{previewFallback}</div>\n )}\n </div>\n {file ? (\n <span className=\"eyeon-map-floors__drop-meta\">\n {file.name}\n {isOutdoorForm\n ? ` · ${formatBytes(file.size)} · Ready to upload`\n : ` · ${formatBytes(file.size)}`}\n </span>\n ) : null}\n {!isOutdoorForm ? (\n <p className=\"eyeon-map-rail__hint\">\n Floor SVGs are read for geometry only — no copy of the file is kept.\n </p>\n ) : (\n <p className=\"eyeon-map-rail__hint\">\n The outdoor SVG is stored and drawn live, so decoration stays\n designer-owned. Only its interactive polygons are imported.\n </p>\n )}\n <input\n ref={fileInputRef}\n hidden\n type=\"file\"\n accept=\".svg,image/svg+xml\"\n disabled={busy || deleting || !canManage}\n onChange={(e) => {\n takeSvgFile(e.target.files?.[0] ?? null);\n e.target.value = '';\n }}\n />\n <button\n type=\"button\"\n className=\"eyeon-map-floors__change\"\n disabled={busy || deleting || !canManage}\n onClick={() => fileInputRef.current?.click()}\n >\n {isOutdoorForm ? 'Replace SVG' : 'Re-import SVG'}\n </button>\n </div>\n ) : (\n <div className=\"eyeon-map-rail__field\">\n {isOutdoorForm ? 'SVG file' : 'Floor SVG to import'}\n <label\n className={[\n 'eyeon-map-floors__drop',\n dragOver ? 'is-over' : '',\n file ? 'has-file' : '',\n busy ? 'is-busy' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onDragOver={(e) => {\n e.preventDefault();\n if (!busy) setDragOver(true);\n }}\n onDragLeave={() => setDragOver(false)}\n onDrop={(e) => {\n e.preventDefault();\n setDragOver(false);\n if (busy || !canManage) return;\n takeSvgFile(e.dataTransfer.files?.[0]);\n }}\n >\n <input\n type=\"file\"\n accept=\".svg,image/svg+xml\"\n disabled={busy || deleting || !canManage}\n onChange={(e) => {\n takeSvgFile(e.target.files?.[0] ?? null);\n e.target.value = '';\n }}\n />\n <span className=\"eyeon-map-floors__drop-title\">\n {file ? file.name : 'Choose SVG or drop it here'}\n </span>\n <span className=\"eyeon-map-floors__drop-meta\">\n {file\n ? isOutdoorForm\n ? `${formatBytes(file.size)} · Ready to upload`\n : `${formatBytes(file.size)} · Ready to import`\n : 'SVG only'}\n </span>\n </label>\n {!isOutdoorForm && !showReimportNotice ? (\n <p className=\"eyeon-map-rail__hint\">\n The file is read for geometry only. Shapes, the INTERACTIVE group\n and line segments in the <code>routes</code> group go into the\n database; the SVG itself is not stored.\n </p>\n ) : null}\n </div>\n )}\n {showReimportNotice ? (\n <div className=\"eyeon-map-floors__notice\">\n <p className=\"eyeon-map-floors__notice-title\">\n Re-importing replaces the {importedCount} shape\n {importedCount === 1 ? '' : 's'} on this floor\n </p>\n <ul className=\"eyeon-map-floors__notice-list\">\n <li>\n Layers that keep the same Illustrator ID are redrawn from the new file\n and keep their retailer, amenity and kiosk assignments.\n </li>\n <li>\n Shapes you reshaped in Edit Map keep your geometry — the new file is\n ignored for those.\n </li>\n <li>\n IDs missing from the new file are hidden rather than deleted, so you can\n move their assignments onto a renamed layer.\n </li>\n <li>\n New IDs come in unassigned, and line segments in the{' '}\n <code>routes</code> group replace this floor&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 clampRouteThickness,\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 | 'custom'\n | 'paths'\n | 'style'\n | 'selection'\n | 'unassigned'\n | 'edit-map'\n | 'wayfinding'\n | 'map-responsiveness';\n\n/** @deprecated Use RailSection */\nexport type RailTab = RailSection;\n\nexport interface LeftRailDraft {\n buildings: CmBuilding[];\n levels: CmLevel[];\n shapes: Array<{\n id: number;\n levelId: number;\n key: string;\n kind: string;\n sourceSvgId?: string | null;\n orphanedAt?: string | null;\n }>;\n anchors: Array<Pick<CmAnchor, 'id' | 'levelId' | 'shapeId' | 'connectorId'>>;\n edges: Array<\n Pick<CmRouteEdge, 'id' | 'kind' | 'directed' | 'fromAnchorId' | 'toAnchorId'>\n >;\n connectors: CmConnector[];\n amenities: CmAmenityCatalogItem[];\n assignments: CmShapeAssignment[];\n}\n\nexport interface LeftRailProps {\n section: RailSection | null;\n onSectionChange: (section: RailSection | null) => void;\n draft: LeftRailDraft;\n activeLevelId: number | null;\n selectedShapeId: number | null;\n selectedShapeIds?: number[];\n onSelectShape: (id: number | null, opts?: { additive?: boolean }) => void;\n onHoverShape?: (id: number | null) => void;\n onListFocus?: () => void;\n retailers?: MapAssignRetailer[];\n kiosks?: MapAssignKiosk[];\n canFloors: boolean;\n canSettings: boolean;\n canResponsiveness?: boolean;\n onImportSvg?: (levelId: number, file: File) => Promise<void>;\n onCreateLevel?: (input: CreateLevelInput) => Promise<number | void>;\n onUpdateLevel?: (input: UpdateLevelInput) => Promise<void>;\n onDeleteLevel?: (levelId: number) => Promise<void>;\n onReorderLevels?: (orderedIds: number[]) => Promise<void>;\n onAutoroute?: (levelId: number) => Promise<void>;\n theme: ThemeDefaults;\n onThemeChange: (partial: Partial<ThemeDefaults>) => void;\n assignPanel: ReactNode;\n /** Saved display_kiosks: pick a kiosk shape or delete. */\n catalogKioskPanel?: ReactNode;\n selectedCatalogKioskId?: number | null;\n onSelectCatalogKiosk?: (id: number | null) => void;\n /** Draw/tools UI for Edit Map (icons + inspector). */\n editMapPanel?: ReactNode;\n /** Route tools and path stats for Wayfinding. */\n wayfindingPanel?: ReactNode;\n mapResponsivenessPanel?: ReactNode;\n footer?: ReactNode;\n /** PORTAL: switch this center back to Classic (v1) map. */\n onUseClassicMap?: () => void;\n}\n\nfunction BackIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M10.2 2.6 4.8 8l5.4 5.4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ChevronIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M5.8 2.6 11.2 8l-5.4 5.4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nconst NAV_ICON_PROPS = {\n width: 18,\n height: 18,\n viewBox: '0 0 18 18',\n fill: 'none',\n 'aria-hidden': true,\n} as const;\n\nfunction FloorsNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M3 12.5 9 15.5 15 12.5M3 9.2 9 12.2 15 9.2M9 2.5 3 5.5 9 8.5 15 5.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction StoresNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M3.5 7.2 4.4 14h9.2l.9-6.8H3.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3 7.2 4.6 4h8.8L15 7.2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M7 14V9.6h4V14\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\nfunction AmenitiesNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M9 15.2s5.2-3.6 5.2-7.1A5.2 5.2 0 0 0 9 2.8a5.2 5.2 0 0 0-5.2 5.3c0 3.5 5.2 7.1 5.2 7.1Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"9\" cy=\"8\" r=\"1.6\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction KiosksNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect\n x=\"2.5\"\n y=\"3\"\n width=\"13\"\n height=\"8.5\"\n rx=\"1.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path d=\"M7 15h4M9 11.5V15\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction EscalatorsNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M3 15h4V11h4V7h4V3h3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ElevatorsNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect x=\"4\" y=\"2.8\" width=\"10\" height=\"12.4\" rx=\"1.4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M9 5.4 7.2 7.6h3.6Zm0 7.2 1.8-2.2H7.2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction SettingsNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS} viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <path\n d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction CustomNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect\n x=\"2.5\"\n y=\"3.5\"\n width=\"13\"\n height=\"11\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M5.2 8h7.6M5.2 10.8h4.6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction UnassignedNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect\n x=\"3\"\n y=\"3\"\n width=\"12\"\n height=\"12\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeDasharray=\"2.4 2\"\n />\n </svg>\n );\n}\n\nfunction EditMapNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect\n x=\"3\"\n y=\"3.5\"\n width=\"12\"\n height=\"11\"\n rx=\"1.6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M6 11.2 11.4 5.8l1.8 1.8L7.8 13H6z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction WayfindingNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M3.4 13.4c2.4-3.6 3.5-3.8 5-3.8 1.8 0 2.5 2 5.2 2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"3.4\" cy=\"13.4\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"8.4\" cy=\"9.6\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"13.6\" cy=\"11.6\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction MapResponsivenessNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect x=\"2.5\" y=\"4\" width=\"13\" height=\"9\" rx=\"1.4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M6 13.8h6M9 13.8v1.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M5.2 10.2 8.4 7l2 2 2.6-2.8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\ntype RailNavCountKey =\n | 'floors'\n | 'stores'\n | 'amenities'\n | 'kiosks'\n | 'escalators'\n | 'elevators'\n | 'custom'\n | 'unassigned';\n\ntype RailNavItem = {\n id: RailSection;\n title: string;\n description: string;\n icon: () => React.ReactElement;\n countKey?: RailNavCountKey;\n};\n\ntype RailNavEntry = RailNavItem | { separator: true };\n\nconst RAIL_NAV: RailNavEntry[] = [\n {\n id: 'floors',\n title: 'Floors',\n description: 'Building floors and Outdoor SVG',\n icon: FloorsNavIcon,\n countKey: 'floors',\n },\n {\n id: 'stores',\n title: 'Stores',\n description: 'Retailers linked to the map',\n icon: StoresNavIcon,\n countKey: 'stores',\n },\n {\n id: 'amenities',\n title: 'Amenities',\n description: 'Amenities linked to the map',\n icon: AmenitiesNavIcon,\n countKey: 'amenities',\n },\n {\n id: 'kiosks',\n title: 'Kiosks',\n description: 'Link kiosk screens to devices',\n icon: KiosksNavIcon,\n countKey: 'kiosks',\n },\n {\n id: 'escalators',\n title: 'Escalators',\n description: 'One-way rides between floors',\n icon: EscalatorsNavIcon,\n countKey: 'escalators',\n },\n {\n id: 'elevators',\n title: 'Elevators',\n description: 'Two-way shafts across floors',\n icon: ElevatorsNavIcon,\n countKey: 'elevators',\n },\n {\n id: 'custom',\n title: 'Custom',\n description: 'Text and images drawn on the map',\n icon: CustomNavIcon,\n countKey: 'custom',\n },\n {\n id: 'unassigned',\n title: 'Unassigned',\n description: 'Polygons with no store, amenity, or kiosk',\n icon: UnassignedNavIcon,\n countKey: 'unassigned',\n },\n { separator: true },\n {\n id: 'edit-map',\n title: 'Edit Map',\n description: 'Draw and reshape stores, text, and lines',\n icon: EditMapNavIcon,\n },\n {\n id: 'wayfinding',\n title: 'Wayfinding',\n description: 'Walking paths and route anchors',\n icon: WayfindingNavIcon,\n },\n {\n id: 'map-responsiveness',\n title: 'Map Responsiveness',\n description: 'Starting zoom and position per floor and device',\n icon: MapResponsivenessNavIcon,\n },\n { separator: true },\n {\n id: 'style',\n title: 'Settings',\n description: 'Colors and map look',\n icon: SettingsNavIcon,\n },\n];\n\nconst HIDDEN_SECTION_TITLES: Partial<Record<RailSection, string>> = {\n paths: 'Walking paths',\n selection: 'Selected',\n};\n\nfunction isRailNavSeparator(entry: RailNavEntry): entry is { separator: true } {\n return 'separator' in entry;\n}\n\nfunction railSectionTitle(section: RailSection): string {\n const item = RAIL_NAV.find(\n (entry): entry is RailNavItem => !isRailNavSeparator(entry) && entry.id === section,\n );\n return item?.title ?? HIDDEN_SECTION_TITLES[section] ?? section;\n}\n\nconst HOUSE_OUTDOOR_THEME = staticLayerThemeDefaults();\n\nconst OUTDOOR_COLOR_FIELDS: Array<[StaticLayerThemeKey, string]> = [\n ['GREEN_AREA_COLOR', 'Green Areas'],\n ['WATER_COLOR', 'Water'],\n ['WALKABLE_COLOR', 'Walking Paths'],\n ['PARKING_LANE_COLOR', 'Parking Lanes'],\n ['PARKING_ICON_COLOR', 'Parking Icons'],\n];\n\nfunction SettingsField({\n label,\n onReset,\n children,\n}: {\n label: string;\n onReset?: () => void;\n children: ReactNode;\n}) {\n return (\n <div className=\"eyeon-map-rail__field eyeon-map-rail__field--inline\">\n <span className=\"eyeon-map-rail__field-label\">\n {label}\n {onReset ? <FieldResetButton label={label} onClick={onReset} /> : null}\n </span>\n {children}\n </div>\n );\n}\n\nfunction ColorField({\n label,\n value,\n fallback,\n onChange,\n onReset,\n}: {\n label: string;\n value: string;\n fallback?: string;\n onChange: (hex: string) => void;\n onReset?: () => void;\n}) {\n const transparent = isTransparentColor(value) || !value.trim();\n const [hex, setHex] = useState(transparent ? '' : value);\n\n useEffect(() => {\n setHex(transparent ? '' : value);\n }, [transparent, value]);\n\n const commit = (next: string) => {\n if (!next.trim() || isTransparentColor(next)) {\n setHex('');\n if (!transparent) onChange(TRANSPARENT_COLOR);\n return;\n }\n const normalized = normalizeHexColor(next);\n if (!normalized) {\n setHex(transparent ? '' : value);\n return;\n }\n setHex(normalized);\n if (normalized !== value.toLowerCase() && normalized !== value) onChange(normalized);\n };\n\n return (\n <SettingsField label={label} onReset={onReset}>\n <ColorSwatch\n label={label}\n hex={hex}\n swatch={transparent ? TRANSPARENT_COLOR : value}\n fallback={fallback}\n onHexChange={setHex}\n onCommit={() => commit(hex)}\n onPick={commit}\n />\n </SettingsField>\n );\n}\n\nexport function LeftRail({\n section,\n onSectionChange,\n draft,\n activeLevelId,\n selectedShapeId,\n selectedShapeIds,\n onSelectShape,\n onHoverShape,\n onListFocus,\n retailers = [],\n kiosks = [],\n canFloors,\n canSettings,\n canResponsiveness = false,\n onCreateLevel,\n onUpdateLevel,\n onDeleteLevel,\n onReorderLevels,\n onAutoroute,\n theme,\n onThemeChange,\n assignPanel,\n catalogKioskPanel,\n selectedCatalogKioskId = null,\n onSelectCatalogKiosk,\n editMapPanel,\n wayfindingPanel,\n mapResponsivenessPanel,\n footer,\n onUseClassicMap,\n}: LeftRailProps) {\n const [floorsScreen, setFloorsScreen] = useState<FloorsScreen>({ mode: 'list' });\n\n useEffect(() => {\n if (section !== 'floors') setFloorsScreen({ mode: 'list' });\n }, [section]);\n\n useEffect(\n () => () => {\n onHoverShape?.(null);\n },\n [section, onHoverShape],\n );\n\n const assigned = useMemo(\n () => railAssignmentGroups(draft.shapes, draft.assignments),\n [draft.shapes, draft.assignments],\n );\n const storeShapes = assigned.stores;\n const amenityShapes = assigned.amenities;\n const kioskShapes = assigned.kiosks;\n const unassignedStoreShapes = assigned.unassignedStores;\n const unassignedAmenityShapes = assigned.unassignedAmenities;\n const unassignedKioskShapes = assigned.unassignedKiosks;\n const unassignedShapes = assigned.unassigned;\n const customShapes = assigned.custom;\n const unassignedCustomShapes = assigned.unassignedCustom;\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 if (shape.kind === 'custom') {\n if (assignment?.layerType === 'custom_image') return 'Image';\n return assignment?.customLabel?.trim() || null;\n }\n return connectorRideLabel(\n shape,\n draft.anchors,\n draft.edges,\n connectors,\n draft.shapes,\n draft.levels,\n );\n };\n const activeLevel = draft.levels.find((l) => l.id === activeLevelId);\n const pathCount = draft.anchors.filter((a) => a.levelId === activeLevelId).length;\n const levelName = (levelId: number) =>\n draft.levels.find((l) => l.id === levelId)?.name ?? 'Floor';\n const levelShapeCounts = useMemo(() => {\n const counts: Record<number, number> = {};\n for (const shape of draft.shapes) {\n if (shape.orphanedAt) continue;\n counts[shape.levelId] = (counts[shape.levelId] ?? 0) + 1;\n }\n return counts;\n }, [draft.shapes]);\n\n const selectedIds =\n selectedShapeIds ?? (selectedShapeId != null ? [selectedShapeId] : []);\n const isShapeSelected = (id: number) => selectedIds.includes(id);\n const selectedCatalogKiosk =\n selectedCatalogKioskId != null\n ? kiosks.find((item) => item.id === selectedCatalogKioskId) ?? null\n : null;\n const showingCatalogKiosk =\n section === 'kiosks' && selectedCatalogKiosk != null;\n const showingItemOptions =\n railShowsItemOptions(section, selectedIds.length) || showingCatalogKiosk;\n useEffect(() => {\n if (showingItemOptions) onHoverShape?.(null);\n }, [showingItemOptions, onHoverShape]);\n const itemOptionsTitle = (() => {\n if (showingCatalogKiosk && selectedCatalogKiosk) {\n const linkedId = shapeIdForCatalogKiosk(\n selectedCatalogKiosk.id,\n draft.assignments,\n );\n const linked = linkedId\n ? draft.shapes.find((row) => row.id === linkedId)\n : null;\n return {\n key: selectedCatalogKiosk.name.trim() || `Kiosk ${selectedCatalogKiosk.id}`,\n levelName: linked?.key ?? 'Unlinked',\n };\n }\n if (!showingItemOptions || selectedIds.length !== 1) return null;\n const shape = draft.shapes.find((row) => row.id === selectedIds[0]);\n if (!shape) return null;\n return { key: shape.key, levelName: levelName(shape.levelId) };\n })();\n const selectShapeFromList = (id: number, event: { shiftKey: boolean }) => {\n onSelectCatalogKiosk?.(null);\n onSelectShape(id, { additive: event.shiftKey });\n onListFocus?.();\n };\n const leftoverKiosks = leftoverCatalogKiosks(kiosks, draft.assignments);\n\n const counts: Record<RailNavCountKey, number> = {\n floors: visibleFloorCount(draft.levels),\n stores: storeShapes.length + unassignedStoreShapes.length,\n amenities: amenityShapes.length + unassignedAmenityShapes.length,\n kiosks:\n kioskShapes.length + unassignedKioskShapes.length + leftoverKiosks.length,\n escalators: escalatorShapes.length,\n elevators: elevatorShapes.length,\n custom: customShapes.length + unassignedCustomShapes.length,\n unassigned: unassignedShapes.length,\n };\n\n const renderShapeList = (\n shapes: typeof draft.shapes,\n empty: string,\n opts?: {\n kindLabelFor?: (shape: (typeof draft.shapes)[number]) => string;\n showKindTag?: boolean;\n connectorIcon?: 'escalator' | 'elevator';\n connectorAssigned?: boolean;\n },\n ) =>\n shapes.length === 0 ? (\n <p className=\"eyeon-map-rail__hint\">{empty}</p>\n ) : (\n sortShapesByRailLevel(shapes, draft.levels).map((s) => {\n const copy = railRowLabels({\n key: s.key,\n kindLabel: opts?.kindLabelFor?.(s) ?? shapeKindLabel(s.kind),\n levelName: levelName(s.levelId),\n assignedName: assignedNameFor(s),\n showKindTag: opts?.showKindTag,\n });\n const iconUrl = opts?.connectorIcon\n ? connectorSpecialIconDataUrl(\n opts.connectorIcon,\n Boolean(opts.connectorAssigned),\n opts.connectorAssigned ? theme.CONNECTOR_ICON_COLOR : undefined,\n )\n : undefined;\n return (\n <button\n key={s.id}\n type=\"button\"\n className={\n isShapeSelected(s.id)\n ? 'eyeon-map-rail__row is-active'\n : 'eyeon-map-rail__row'\n }\n onMouseDown={(event) => {\n if (event.shiftKey) event.preventDefault();\n }}\n onMouseEnter={() => onHoverShape?.(s.id)}\n onMouseLeave={() => onHoverShape?.(null)}\n onClick={(event) => selectShapeFromList(s.id, event)}\n >\n {iconUrl ? (\n <img\n className={\n opts?.connectorAssigned\n ? 'eyeon-map-rail__row-icon is-assigned'\n : 'eyeon-map-rail__row-icon'\n }\n src={iconUrl}\n alt=\"\"\n />\n ) : null}\n <span className=\"eyeon-map-rail__row-copy\">\n {copy.title ? (\n <span className=\"eyeon-map-rail__row-title\">{copy.title}</span>\n ) : null}\n <span className=\"eyeon-map-rail__row-meta\">\n <span\n className={\n copy.title\n ? 'eyeon-map-rail__row-id'\n : 'eyeon-map-rail__row-id eyeon-map-rail__row-id--lead'\n }\n >\n {copy.id}\n </span>\n {copy.tags.length > 0 ? (\n <span className=\"eyeon-map-rail__tags\">\n {copy.tags.map((tag) => (\n <span key={`${s.id}-${tag}`} className=\"eyeon-map-rail__tag\">\n {tag}\n </span>\n ))}\n </span>\n ) : null}\n </span>\n </span>\n </button>\n );\n })\n );\n\n const renderEscalatorRideList = () =>\n escalatorRides.map((ride) => {\n const lines = escalatorRideLandingLines(ride, draft.levels);\n const active =\n isShapeSelected(ride.from.id) || isShapeSelected(ride.to.id);\n return (\n <button\n key={ride.connectorId}\n type=\"button\"\n className={\n active\n ? 'eyeon-map-rail__row eyeon-map-rail__row--ride is-active'\n : 'eyeon-map-rail__row eyeon-map-rail__row--ride'\n }\n onMouseDown={(event) => {\n if (event.shiftKey) event.preventDefault();\n }}\n onMouseEnter={() => onHoverShape?.(ride.from.id)}\n onMouseLeave={() => onHoverShape?.(null)}\n onClick={(event) => selectShapeFromList(ride.from.id, event)}\n >\n <span className=\"eyeon-map-rail__row-copy\">\n {lines.map((line) => (\n <span key={line.shapeId} className=\"eyeon-map-rail__row-meta\">\n <span className=\"eyeon-map-rail__row-id eyeon-map-rail__row-id--lead\">\n {line.key}\n </span>\n <span className=\"eyeon-map-rail__tags\">\n <span className=\"eyeon-map-rail__tag\">{line.levelName}</span>\n </span>\n </span>\n ))}\n </span>\n </button>\n );\n });\n\n const renderAssignedUnassigned = (\n assignedList: typeof draft.shapes,\n unassignedList: typeof draft.shapes,\n kindLabelFor?: (shape: (typeof draft.shapes)[number]) => string,\n connectorIcon?: 'escalator' | 'elevator',\n ) => (\n <>\n <div className=\"eyeon-map-rail__heading\">\n Assigned ({assignedList.length})\n </div>\n {assignedList.length > 0\n ? renderShapeList(assignedList, '', {\n kindLabelFor,\n connectorIcon,\n connectorAssigned: true,\n })\n : null}\n <div className=\"eyeon-map-rail__heading\">\n Unassigned ({unassignedList.length})\n </div>\n {unassignedList.length > 0\n ? renderShapeList(unassignedList, '', {\n kindLabelFor,\n connectorIcon,\n connectorAssigned: false,\n })\n : null}\n </>\n );\n\n return (\n <aside className=\"eyeon-map-rail\">\n {section ? (\n <div className=\"eyeon-map-rail__header\">\n <button\n type=\"button\"\n className=\"eyeon-map-rail__back\"\n onClick={() => {\n if (section === 'floors' && floorsScreen.mode !== 'list') {\n setFloorsScreen({ mode: 'list' });\n return;\n }\n if (showingCatalogKiosk) {\n onSelectCatalogKiosk?.(null);\n return;\n }\n if (showingItemOptions) {\n onSelectShape(null);\n onHoverShape?.(null);\n return;\n }\n onSectionChange(null);\n }}\n aria-label=\"Back\"\n >\n <BackIcon />\n </button>\n <div className=\"eyeon-map-rail__header-title\">\n {section === 'floors' ? (\n floorsScreenTitle(floorsScreen, draft.levels)\n ) : itemOptionsTitle ? (\n <span className=\"eyeon-map-assign__tag\">{itemOptionsTitle.key}</span>\n ) : (\n railSectionTitle(section)\n )}\n </div>\n {itemOptionsTitle ? (\n <span className=\"eyeon-map-rail__tag\">{itemOptionsTitle.levelName}</span>\n ) : null}\n </div>\n ) : (\n <div className=\"eyeon-map-rail__header\">\n <div className=\"eyeon-map-rail__header-title\">Configure Center Map</div>\n </div>\n )}\n\n <div className=\"eyeon-map-rail__body\">\n {!section && (\n <nav className=\"eyeon-map-rail__nav\" aria-label=\"Map options\">\n {RAIL_NAV.map((entry, index) => {\n if (isRailNavSeparator(entry)) {\n return (\n <div\n key={`sep-${index}`}\n className=\"eyeon-map-rail__nav-sep\"\n role=\"separator\"\n />\n );\n }\n const Icon = entry.icon;\n return (\n <button\n key={entry.id}\n type=\"button\"\n className=\"eyeon-map-rail__nav-item\"\n onClick={() => onSectionChange(entry.id)}\n >\n <span className=\"eyeon-map-rail__nav-icon\">\n <Icon />\n </span>\n <span className=\"eyeon-map-rail__nav-copy\">\n <span className=\"eyeon-map-rail__nav-title\">{entry.title}</span>\n <span className=\"eyeon-map-rail__nav-desc\">{entry.description}</span>\n </span>\n <span className=\"eyeon-map-rail__nav-meta\">\n {entry.countKey != null ? (\n <span className=\"eyeon-map-rail__nav-count\">\n {counts[entry.countKey]}\n </span>\n ) : null}\n <ChevronIcon />\n </span>\n </button>\n );\n })}\n </nav>\n )}\n\n {section === 'edit-map' && (\n <div className=\"eyeon-map-rail__section\">{editMapPanel}</div>\n )}\n\n {section === 'wayfinding' && (\n <div className=\"eyeon-map-rail__section\">{wayfindingPanel}</div>\n )}\n\n {section === 'map-responsiveness' && (\n <div className=\"eyeon-map-rail__section\">{mapResponsivenessPanel}</div>\n )}\n\n {section === 'floors' && (\n <FloorsPanel\n levels={draft.levels}\n buildings={draft.buildings}\n levelShapeCounts={levelShapeCounts}\n canFloors={canFloors}\n screen={floorsScreen}\n onScreenChange={setFloorsScreen}\n onCreateLevel={\n onCreateLevel\n ? async (input) => {\n const id = await onCreateLevel(input);\n setFloorsScreen({ mode: 'list' });\n return id;\n }\n : undefined\n }\n onUpdateLevel={onUpdateLevel}\n onDeleteLevel={onDeleteLevel}\n onReorderLevels={onReorderLevels}\n />\n )}\n\n {section === 'stores' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions\n ? assignPanel\n : renderAssignedUnassigned(storeShapes, unassignedStoreShapes)}\n </div>\n )}\n\n {section === 'amenities' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions\n ? assignPanel\n : renderAssignedUnassigned(\n amenityShapes,\n unassignedAmenityShapes,\n )}\n </div>\n )}\n\n {section === 'custom' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions\n ? assignPanel\n : renderAssignedUnassigned(customShapes, unassignedCustomShapes)}\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 {leftoverKiosks.length > 0 ? (\n <>\n <div className=\"eyeon-map-rail__heading\">\n Existing kiosks ({leftoverKiosks.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 {leftoverKiosks.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 <div className=\"eyeon-map-rail__heading\">Map Settings</div>\n {(\n [\n ['MAP_BACKGROUND_COLOR', 'Background'],\n ['STORE_DEFAULT_COLOR', 'Stores'],\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__heading eyeon-map-rail__heading--section\">\n Route Settings\n </div>\n <ColorField\n label=\"Route Path\"\n value={theme.ROUTE_COLOR}\n fallback={DEFAULT_THEME.ROUTE_COLOR}\n onChange={(hex) => onThemeChange({ ROUTE_COLOR: hex })}\n onReset={\n sameHexColor(theme.ROUTE_COLOR, DEFAULT_THEME.ROUTE_COLOR)\n ? undefined\n : () =>\n onThemeChange({ ROUTE_COLOR: DEFAULT_THEME.ROUTE_COLOR })\n }\n />\n <SettingsField\n label=\"Route Thickness\"\n onReset={\n theme.ROUTE_THICKNESS === DEFAULT_THEME.ROUTE_THICKNESS\n ? undefined\n : () =>\n onThemeChange({\n ROUTE_THICKNESS: DEFAULT_THEME.ROUTE_THICKNESS,\n })\n }\n >\n <input\n className=\"eyeon-map-rail__number-sm\"\n type=\"number\"\n min={1}\n step={1}\n inputMode=\"decimal\"\n value={theme.ROUTE_THICKNESS}\n aria-label=\"Route Thickness\"\n onChange={(e) =>\n onThemeChange({\n ROUTE_THICKNESS: clampRouteThickness(e.target.value),\n })\n }\n />\n </SettingsField>\n <div className=\"eyeon-map-rail__heading eyeon-map-rail__heading--section\">\n Outdoor Settings\n </div>\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 custom: 'custom',\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 } from 'react';\nimport type {\n AssignmentLayerType,\n CmAmenityCatalogItem,\n CmShape,\n CmShapeAssignment,\n LabelAlign,\n MapAssignKiosk,\n MapAssignRetailer,\n} from '../../core';\nimport {\n assignmentHasTarget,\n assignmentIconThemeFallback,\n assignmentPadFillFallback,\n DEFAULT_LABEL_ALIGN,\n emptyShapeAssignment,\n isHttpImageUrl,\n normalizeLabelAlign,\n parseShapeAssignment,\n retailerOptionLabel,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport {\n amenityAssignOptions,\n amenityCatalogIdForType,\n amenityTypeFromCatalogId,\n} from '../../specialIcons';\nimport { isAssignableKind } from '../railAssignments';\nimport { AssignmentStyleFields } from './AssignmentStyleFields';\nimport { AlignRow } from './formRows';\n\nconst RETAIL_LAYER_TYPES: AssignmentLayerType[] = [\n 'retail_name',\n 'retail_logo',\n 'retail_text',\n];\n\nexport interface AssignFormProps {\n shape: CmShape;\n assignment: CmShapeAssignment | null;\n amenities: CmAmenityCatalogItem[];\n retailers: MapAssignRetailer[];\n kiosks?: MapAssignKiosk[];\n canEdit: boolean;\n storeDefaultColor: string;\n storeTextColor: string;\n amenityIconColor: string;\n kioskIconColor: string;\n onChange: (assignment: CmShapeAssignment) => void;\n onClear: () => void;\n}\n\nexport function AssignForm({\n shape,\n assignment,\n amenities,\n retailers,\n kiosks = [],\n canEdit,\n storeDefaultColor,\n storeTextColor,\n amenityIconColor,\n kioskIconColor,\n onChange,\n onClear,\n}: AssignFormProps) {\n const [form, setForm] = useState<CmShapeAssignment>(() =>\n assignment\n ? parseShapeAssignment(assignment, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind),\n );\n const formRef = useRef(form);\n formRef.current = form;\n\n useEffect(() => {\n setForm(\n assignment\n ? parseShapeAssignment(assignment, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind),\n );\n }, [shape, assignment]);\n\n const commit = useCallback(\n (next: CmShapeAssignment) => {\n setForm(next);\n if (!canEdit) return;\n onChange(parseShapeAssignment(next, shape.kind));\n },\n [canEdit, onChange, shape.kind],\n );\n\n const patch = useCallback(\n (partial: Partial<CmShapeAssignment>) => {\n commit({ ...formRef.current, shapeId: shape.id, ...partial });\n },\n [commit, shape.id],\n );\n\n const nameCounts = useMemo(() => {\n const counts = new Map<string, number>();\n for (const retailer of retailers) {\n const key = retailer.name.trim().toLowerCase();\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return counts;\n }, [retailers]);\n\n const retailerOptions = useMemo(\n () =>\n retailers.map((retailer) => {\n const duplicate =\n (nameCounts.get(retailer.name.trim().toLowerCase()) ?? 0) > 1;\n return {\n value: String(retailer.id),\n label: retailerOptionLabel(retailer, duplicate),\n };\n }),\n [nameCounts, retailers],\n );\n\n const amenityOptions = useMemo(() => amenityAssignOptions(), []);\n const selectedAmenityType =\n amenityTypeFromCatalogId(form.amenityId, amenities) ||\n form.customLabel ||\n '';\n\n const kioskCatalogName = useMemo(() => {\n if (form.kioskId == null) return null;\n return kiosks.find((item) => item.id === form.kioskId)?.name ?? null;\n }, [form.kioskId, kiosks]);\n\n const showTextColor = [\n 'retail_name',\n 'retail_text',\n 'custom_text',\n 'kiosk',\n 'amenity',\n ].includes(form.layerType);\n const textColorLabel =\n form.layerType === 'kiosk' || form.layerType === 'amenity'\n ? 'Icon Color'\n : 'Text Color';\n const textColorFallback = assignmentIconThemeFallback(\n form,\n {\n AMENITY_ICON_COLOR: amenityIconColor,\n KIOSK_ICON_COLOR: kioskIconColor,\n CONNECTOR_ICON_COLOR: storeTextColor,\n STORE_TEXT_COLOR: storeTextColor,\n },\n shape.kind,\n );\n\n const hasAssignment = assignmentHasTarget(form);\n\n if (!isAssignableKind(shape.kind)) return null;\n\n return (\n <div className=\"eyeon-map-assign\">\n {shape.kind === 'unit' || shape.kind === 'parking_zone' ? (\n <>\n <ModernSelect\n ariaLabel=\"Choose a Retailer\"\n value={form.retailerId != null ? String(form.retailerId) : ''}\n disabled={!canEdit}\n searchable\n placeholder=\"Choose a Retailer…\"\n options={retailerOptions}\n onChange={(next) => {\n const retailerId = next ? Number(next) : null;\n const retailer = retailers.find((item) => item.id === retailerId);\n const layerType = RETAIL_LAYER_TYPES.includes(form.layerType)\n ? form.layerType\n : 'retail_name';\n patch({\n targetType: retailerId ? 'retailer' : 'none',\n retailerId,\n amenityId: null,\n kioskId: null,\n unitStatus: retailerId ? 'occupied' : 'vacant',\n layerType,\n customLabel:\n layerType === 'retail_name'\n ? retailer?.name ?? null\n : form.customLabel,\n customImageKey:\n layerType === 'retail_logo'\n ? retailer?.logoKey ?? form.customImageKey\n : form.customImageKey,\n });\n }}\n />\n {form.retailerId != null ? (\n <div className=\"eyeon-map-assign__tabs\" role=\"group\" aria-label=\"Display\">\n <button\n type=\"button\"\n className={\n form.layerType === 'retail_name' ? 'is-active' : undefined\n }\n disabled={!canEdit}\n onClick={() => {\n const retailer = retailers.find(\n (item) => item.id === form.retailerId,\n );\n patch({\n layerType: 'retail_name',\n customLabel: retailer?.name ?? form.customLabel,\n });\n }}\n >\n Retail Name\n </button>\n <button\n type=\"button\"\n className={\n form.layerType === 'retail_logo' ? 'is-active' : undefined\n }\n disabled={!canEdit}\n onClick={() => {\n const retailer = retailers.find(\n (item) => item.id === form.retailerId,\n );\n patch({\n layerType: 'retail_logo',\n customImageKey:\n retailer?.logoKey ?? form.customImageKey,\n });\n }}\n >\n Retail Logo\n </button>\n <button\n type=\"button\"\n className={\n form.layerType === 'retail_text' ? 'is-active' : undefined\n }\n disabled={!canEdit}\n onClick={() => patch({ layerType: 'retail_text' })}\n >\n Custom Text\n </button>\n </div>\n ) : null}\n {form.retailerId != null && form.layerType === 'retail_text' ? (\n <>\n <label className=\"eyeon-map-rail__field\">\n Text\n <textarea\n className=\"eyeon-map-assign__text\"\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 === 'custom' ? (\n <>\n <div className=\"eyeon-map-assign__tabs\" role=\"group\" aria-label=\"Custom display\">\n <button\n type=\"button\"\n className={form.layerType !== 'custom_image' ? 'is-active' : undefined}\n disabled={!canEdit}\n onClick={() =>\n patch({\n targetType: 'none',\n retailerId: null,\n amenityId: null,\n kioskId: null,\n layerType: 'custom_text',\n })\n }\n >\n Text\n </button>\n <button\n type=\"button\"\n className={form.layerType === 'custom_image' ? 'is-active' : undefined}\n disabled={!canEdit}\n onClick={() =>\n patch({\n targetType: 'none',\n retailerId: null,\n amenityId: null,\n kioskId: null,\n layerType: 'custom_image',\n })\n }\n >\n Image\n </button>\n </div>\n {form.layerType === 'custom_image' ? (\n <label className=\"eyeon-map-rail__field\">\n Image URL\n <input\n type=\"url\"\n inputMode=\"url\"\n autoComplete=\"off\"\n spellCheck={false}\n disabled={!canEdit}\n placeholder=\"https://\"\n aria-label=\"Custom image URL\"\n value={form.customImageKey ?? ''}\n onChange={(e) =>\n patch({\n targetType: 'none',\n retailerId: null,\n amenityId: null,\n kioskId: null,\n layerType: 'custom_image',\n customImageKey: e.target.value.trim() ? e.target.value.trim() : null,\n })\n }\n />\n {form.customImageKey && !isHttpImageUrl(form.customImageKey) ? (\n <span className=\"eyeon-map-rail__hint\">\n Use a full http:// or https:// image address.\n </span>\n ) : null}\n </label>\n ) : (\n <>\n <label className=\"eyeon-map-rail__field\">\n Text\n <textarea\n className=\"eyeon-map-assign__text\"\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) =>\n patch({\n targetType: 'none',\n retailerId: null,\n amenityId: null,\n kioskId: null,\n layerType: 'custom_text',\n customLabel: e.target.value || null,\n })\n }\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 )}\n </>\n ) : null}\n\n {shape.kind === 'amenity' ? (\n <ModernSelect\n ariaLabel=\"Choose Amenity\"\n value={selectedAmenityType}\n disabled={!canEdit}\n searchable\n placeholder=\"Choose Amenity…\"\n options={amenityOptions}\n onChange={(next) => {\n const amenityId = next\n ? amenityCatalogIdForType(next, amenities)\n : null;\n patch({\n targetType: next ? 'amenity' : 'none',\n amenityId,\n customLabel: next || null,\n retailerId: null,\n kioskId: null,\n layerType: 'amenity',\n });\n }}\n />\n ) : null}\n\n {shape.kind === 'kiosk_screen' ? (\n <KioskNameField\n value={form.customLabel ?? kioskCatalogName ?? ''}\n disabled={!canEdit}\n onChange={(name) => {\n const trimmed = name.trim();\n patch({\n targetType: trimmed ? 'kiosk' : 'none',\n kioskId: trimmed ? form.kioskId : null,\n customLabel: name === '' ? null : name,\n retailerId: null,\n amenityId: null,\n layerType: 'kiosk',\n });\n }}\n />\n ) : null}\n\n <AssignmentStyleFields\n form={form}\n canEdit={canEdit}\n storeDefaultColor={assignmentPadFillFallback(\n shape.kind,\n storeDefaultColor,\n )}\n storeTextColor={textColorFallback}\n textColorLabel={textColorLabel}\n showTextColor={showTextColor}\n onPatch={patch}\n />\n {canEdit ? (\n <div className=\"eyeon-map-assign__actions eyeon-map-assign__actions--end\">\n <button\n type=\"button\"\n className=\"eyeon-map-assign__unassign\"\n onClick={() => {\n if (!hasAssignment) return;\n onClear();\n }}\n disabled={!hasAssignment}\n >\n Unassign\n </button>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction KioskNameField({\n value,\n disabled,\n onChange,\n}: {\n value: string;\n disabled: boolean;\n onChange: (name: string) => void;\n}) {\n return (\n <label className=\"eyeon-map-rail__field\">\n Name\n <input\n type=\"text\"\n autoComplete=\"off\"\n spellCheck={false}\n disabled={disabled}\n placeholder=\"e.g. Food court entrance\"\n aria-label=\"Kiosk name\"\n maxLength={50}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n />\n </label>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport type { CmShape, CmShapeAssignment } from '../../core';\nimport {\n assignNumberFromDraft,\n assignmentIconThemeFallback,\n assignmentPadFillFallback,\n bulkAssignFormState,\n DEFAULT_ASSIGNMENT_SIZE,\n emptyShapeAssignment,\n parseShapeAssignment,\n type BulkAssignPatch,\n} from '../../core';\nimport { FieldResetButton } from '../FieldResetButton';\nimport {\n isTransparentColor,\n normalizeHexColor,\n TRANSPARENT_COLOR,\n} from '../hexColor';\nimport { isAssignableKind } from '../railAssignments';\nimport { ColorSwatch } from './formRows';\n\nexport function BulkAssignForm({\n shapes,\n assignments,\n canEdit,\n storeDefaultColor,\n storeTextColor,\n amenityIconColor,\n kioskIconColor,\n onPatch,\n}: {\n shapes: CmShape[];\n assignments: CmShapeAssignment[];\n canEdit: boolean;\n storeDefaultColor: string;\n storeTextColor: string;\n amenityIconColor: string;\n kioskIconColor: string;\n onPatch: (patch: BulkAssignPatch) => void;\n}) {\n const rows = shapes\n .filter((shape) => isAssignableKind(shape.kind))\n .map((shape) => {\n const existing = assignments.find((row) => row.shapeId === shape.id);\n return existing\n ? parseShapeAssignment(existing, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind);\n });\n const common = bulkAssignFormState(rows);\n const assignableShapes = shapes.filter((shape) => isAssignableKind(shape.kind));\n const iconOnly =\n assignableShapes.length > 0 &&\n assignableShapes.every(\n (shape) => shape.kind === 'amenity' || shape.kind === 'kiosk_screen',\n );\n const uniqueKinds = new Set(assignableShapes.map((shape) => shape.kind));\n const textColorLabel = iconOnly ? 'Icon Color' : 'Text Color';\n const textColorFallback =\n uniqueKinds.size === 1\n ? assignmentIconThemeFallback(\n rows[0],\n {\n AMENITY_ICON_COLOR: amenityIconColor,\n KIOSK_ICON_COLOR: kioskIconColor,\n CONNECTOR_ICON_COLOR: storeTextColor,\n STORE_TEXT_COLOR: storeTextColor,\n },\n assignableShapes[0]?.kind,\n )\n : storeTextColor;\n const bgColorFallback =\n uniqueKinds.size === 1\n ? assignmentPadFillFallback(assignableShapes[0]?.kind, storeDefaultColor)\n : storeDefaultColor;\n\n return (\n <div className=\"eyeon-map-assign\">\n <div className=\"eyeon-map-assign__tags\">\n {shapes.map((shape) => (\n <span key={shape.id} className=\"eyeon-map-assign__tag\">\n {shape.key}\n </span>\n ))}\n </div>\n <BulkSizeRow\n value={common.size}\n disabled={!canEdit}\n onCommit={(size) => onPatch({ size })}\n />\n <BulkColorRow\n label=\"BG Color\"\n value={common.bgColor}\n fallback={bgColorFallback}\n mixed={common.bgColorMixed}\n disabled={!canEdit}\n onCommit={(bgColor) => onPatch({ bgColor })}\n />\n <BulkColorRow\n label={textColorLabel}\n value={common.textColor}\n fallback={textColorFallback}\n mixed={common.textColorMixed}\n disabled={!canEdit}\n onCommit={(textColor) => onPatch({ textColor })}\n />\n </div>\n );\n}\n\nfunction BulkSizeRow({\n value,\n disabled,\n onCommit,\n}: {\n value: number | '';\n disabled: boolean;\n onCommit: (size: number) => void;\n}) {\n const [draft, setDraft] = useState(() => (value === '' ? '' : String(value)));\n const focused = useRef(false);\n\n useEffect(() => {\n if (!focused.current) setDraft(value === '' ? '' : String(value));\n }, [value]);\n\n const emitIfComplete = (raw: string, persistIncomplete: boolean) => {\n if (!raw.trim()) {\n setDraft('');\n return;\n }\n const parsed = assignNumberFromDraft(raw);\n if (!parsed.complete) {\n setDraft(raw);\n return;\n }\n setDraft(String(parsed.render));\n onCommit(parsed.render);\n if (persistIncomplete) setDraft(String(parsed.render));\n };\n\n const step = (delta: number) => {\n const base = value === '' ? DEFAULT_ASSIGNMENT_SIZE : value;\n const next = base + delta;\n setDraft(String(next));\n onCommit(next);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">Size</span>\n <div className=\"eyeon-map-assign__control\">\n <div className=\"eyeon-map-assign__stepper\">\n <button\n type=\"button\"\n disabled={disabled}\n aria-label=\"Decrease Size\"\n onClick={() => step(-1)}\n >\n −\n </button>\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={draft}\n disabled={disabled}\n aria-label=\"Size\"\n onFocus={() => {\n focused.current = true;\n }}\n onChange={(e) => emitIfComplete(e.target.value, false)}\n onBlur={() => {\n focused.current = false;\n emitIfComplete(draft, true);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n return;\n }\n if (e.key !== 'ArrowUp' && e.key !== 'ArrowDown') return;\n e.preventDefault();\n if (disabled) return;\n const delta = e.key === 'ArrowUp' ? 1 : -1;\n const parsed = assignNumberFromDraft(draft);\n const base = parsed.complete\n ? parsed.render\n : value === ''\n ? DEFAULT_ASSIGNMENT_SIZE\n : value;\n const next = base + delta;\n setDraft(String(next));\n onCommit(next);\n }}\n />\n <button\n type=\"button\"\n disabled={disabled}\n aria-label=\"Increase Size\"\n onClick={() => step(1)}\n >\n +\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nfunction BulkColorRow({\n label,\n value,\n fallback,\n mixed,\n disabled,\n onCommit,\n}: {\n label: string;\n value: string;\n fallback: string;\n mixed: boolean;\n disabled: boolean;\n onCommit: (hex: string | null) => void;\n}) {\n const transparent = !mixed && isTransparentColor(value);\n const display = mixed\n ? ''\n : transparent\n ? TRANSPARENT_COLOR\n : value.trim()\n ? value\n : fallback;\n const customized = mixed || Boolean(value.trim());\n const [hex, setHex] = useState(transparent ? '' : display);\n\n useEffect(() => {\n setHex(transparent ? '' : display);\n }, [display, transparent]);\n\n const commit = (next: string) => {\n if (!next.trim() || isTransparentColor(next)) {\n setHex('');\n if (!mixed) onCommit(TRANSPARENT_COLOR);\n return;\n }\n const normalized = normalizeHexColor(next);\n if (!normalized) {\n setHex(transparent ? '' : display);\n return;\n }\n setHex(normalized);\n onCommit(normalized);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">\n {label}\n {customized ? (\n <FieldResetButton\n label={label}\n disabled={disabled}\n onClick={() => onCommit(null)}\n />\n ) : null}\n </span>\n <ColorSwatch\n label={label}\n hex={hex}\n swatch={display}\n fallback={fallback}\n disabled={disabled}\n emptyIsTransparent={!mixed}\n onHexChange={setHex}\n onCommit={() => commit(hex)}\n onPick={commit}\n />\n </div>\n );\n}\n","import React, { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport '../../ui/modern-select.css';\n\nfunction Chevron() {\n return (\n <svg\n className=\"eyeon-map-select__chevron\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n aria-hidden\n >\n <path\n d=\"M2.5 4.5 6 8l3.5-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function CopyToLevelButton({\n destinations,\n disabled = false,\n onCopyToLevel,\n}: {\n destinations: Array<{ id: number; name: string }>;\n disabled?: boolean;\n onCopyToLevel: (levelId: number) => string | null;\n}) {\n const listId = useId();\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [menuPos, setMenuPos] = useState<{\n top: number;\n left: number;\n width: number;\n maxHeight: number;\n } | null>(null);\n\n const close = useCallback(() => {\n setOpen(false);\n setMenuPos(null);\n }, []);\n\n const updateMenuPos = useCallback(() => {\n const el = buttonRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom - 8;\n const spaceAbove = rect.top - 8;\n const maxHeight = Math.min(280, Math.max(spaceBelow, spaceAbove, 120));\n const openAbove = spaceBelow < 160 && spaceAbove > spaceBelow;\n setMenuPos({\n top: openAbove ? Math.max(8, rect.top - maxHeight - 4) : rect.bottom + 4,\n left: rect.left,\n width: Math.max(rect.width, 168),\n maxHeight,\n });\n }, []);\n\n const destinationKey = destinations.map((level) => level.id).join(',');\n useEffect(() => {\n setError(null);\n close();\n }, [close, destinationKey]);\n\n useEffect(() => {\n if (!open) return;\n updateMenuPos();\n const onDoc = (e: MouseEvent) => {\n const t = e.target as Node;\n if (buttonRef.current?.contains(t) || menuRef.current?.contains(t)) return;\n close();\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n close();\n buttonRef.current?.blur();\n }\n };\n const onMove = () => updateMenuPos();\n document.addEventListener('mousedown', onDoc);\n document.addEventListener('keydown', onKey);\n window.addEventListener('resize', onMove);\n window.addEventListener('scroll', onMove, true);\n return () => {\n document.removeEventListener('mousedown', onDoc);\n document.removeEventListener('keydown', onKey);\n window.removeEventListener('resize', onMove);\n window.removeEventListener('scroll', onMove, true);\n };\n }, [close, open, updateMenuPos]);\n\n if (destinations.length === 0) return null;\n\n const menu =\n open && menuPos && !disabled\n ? createPortal(\n <div\n ref={menuRef}\n id={listId}\n className=\"eyeon-map-select__menu\"\n role=\"listbox\"\n aria-label=\"Duplicate to floor\"\n style={{\n top: menuPos.top,\n left: menuPos.left,\n width: menuPos.width,\n maxHeight: menuPos.maxHeight,\n }}\n >\n <ul className=\"eyeon-map-select__list\">\n {destinations.map((level) => (\n <li key={level.id} role=\"option\">\n <button\n type=\"button\"\n className=\"eyeon-map-select__option\"\n onClick={() => {\n const nextError = onCopyToLevel(level.id);\n setError(nextError);\n if (!nextError) close();\n }}\n >\n {level.name}\n </button>\n </li>\n ))}\n </ul>\n </div>,\n document.body,\n )\n : null;\n\n return (\n <div className=\"eyeon-map-assign__copy-wrap\">\n <button\n ref={buttonRef}\n type=\"button\"\n className={\n open ? 'eyeon-map-assign__copy is-open' : 'eyeon-map-assign__copy'\n }\n aria-label=\"Duplicate to another floor\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listId : undefined}\n disabled={disabled}\n onClick={() => {\n if (disabled) return;\n setError(null);\n setOpen((value) => !value);\n }}\n >\n Duplicate\n <Chevron />\n </button>\n {menu}\n {error ? (\n <p className=\"eyeon-map-rail__hint\" style={{ color: '#b91c1c' }}>\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ShapeLabel } from '../../core';\nimport { DEFAULT_ENTRANCE_SIZE, clampEntranceSize } from '../entranceIcon';\nimport {\n ColorRow,\n RotateIcon,\n StepperRow,\n nextQuarterTurn,\n stepWholeNumber,\n} from './formRows';\n\nconst MIN_ICON_SIZE = 8;\ntype StepKey = 'size' | 'rotate';\n\nexport function EntranceIconForm({\n label,\n canEdit,\n storeTextColor,\n onChange,\n}: {\n label: ShapeLabel;\n canEdit: boolean;\n storeTextColor: string;\n onChange: (label: ShapeLabel, opts?: { live?: boolean }) => void;\n}) {\n const [size, setSize] = useState(label.size ?? DEFAULT_ENTRANCE_SIZE);\n const [rotate, setRotate] = useState(label.rotate ?? 0);\n const sizeRef = useRef(size);\n const rotateRef = useRef(rotate);\n sizeRef.current = size;\n rotateRef.current = rotate;\n const intervals = useRef<Partial<Record<StepKey, number>>>({});\n\n useEffect(() => {\n setSize(label.size ?? DEFAULT_ENTRANCE_SIZE);\n setRotate(label.rotate ?? 0);\n }, [label]);\n\n useEffect(\n () => () => {\n (Object.values(intervals.current) as number[]).forEach((id) =>\n window.clearInterval(id),\n );\n },\n [],\n );\n\n const commit = useCallback(\n (partial: Partial<ShapeLabel>, opts?: { live?: boolean }) => {\n if (!canEdit) return;\n const nextSize = clampEntranceSize(partial.size ?? sizeRef.current);\n const nextRotate = partial.rotate ?? rotateRef.current;\n if (partial.size != null) {\n setSize(nextSize);\n sizeRef.current = nextSize;\n }\n if (partial.rotate != null) {\n setRotate(nextRotate);\n rotateRef.current = nextRotate;\n }\n onChange(\n {\n ...label,\n ...partial,\n size: nextSize,\n rotate: nextRotate,\n },\n opts,\n );\n },\n [canEdit, label, onChange],\n );\n\n const bump = (key: StepKey, delta: number) => {\n if (key === 'size') {\n commit({\n size: clampEntranceSize(stepWholeNumber(sizeRef.current, delta)),\n });\n return;\n }\n commit({ rotate: stepWholeNumber(rotateRef.current, delta) });\n };\n\n const stopHold = (key: StepKey) => {\n const id = intervals.current[key];\n if (id) {\n window.clearInterval(id);\n intervals.current[key] = undefined;\n }\n };\n\n const startHold = (key: StepKey, delta: number) => {\n stopHold(key);\n intervals.current[key] = window.setInterval(() => bump(key, delta), 200);\n };\n\n const color = label.color ?? '';\n\n return (\n <div className=\"eyeon-map-assign\">\n <StepperRow\n label=\"Size\"\n value={size}\n disabled={!canEdit}\n onChange={(next) => commit({ size: Math.max(MIN_ICON_SIZE, next) })}\n onStep={(delta) => bump('size', delta)}\n onHoldStart={(delta) => startHold('size', delta)}\n onHoldEnd={() => stopHold('size')}\n />\n <ColorRow\n label=\"Color\"\n value={color}\n fallback={storeTextColor}\n disabled={!canEdit}\n onChange={(hex) => commit({ color: hex || undefined })}\n />\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 geometry onto another floor. Edit Map only — not assign. */\n onCopyToLevel?: (levelId: number) => string | null;\n levels?: Array<{ id: number; name: string }>;\n onDelete?: () => void;\n onClearAssignment?: () => void;\n onSaveAssignment: (assignment: CmShapeAssignment) => void;\n onUpdateLabel?: (label: ShapeLabel, opts?: { live?: boolean }) => void;\n selectedShapes?: CmShape[];\n selectedAssignments?: CmShapeAssignment[];\n onBulkAssign?: (patch: BulkAssignPatch) => void;\n storeDefaultColor: string;\n storeTextColor: string;\n amenityIconColor: string;\n kioskIconColor: string;\n}\n\nexport function Inspector({\n shape,\n assignment,\n amenities,\n retailers = [],\n kiosks = [],\n levelShapeKeys = [],\n canEdit,\n showAssignment = true,\n emptyHint = 'Pick an item from the list below, or click it on the map.',\n onRename,\n onChangeKind,\n onChangeLevel,\n onCopyToLevel,\n levels = [],\n onDelete,\n onClearAssignment,\n onSaveAssignment,\n onUpdateLabel,\n selectedShapes = [],\n selectedAssignments = [],\n onBulkAssign,\n storeDefaultColor,\n storeTextColor,\n amenityIconColor,\n kioskIconColor,\n}: InspectorProps) {\n const [key, setKey] = useState(shape?.key ?? '');\n const [keyError, setKeyError] = useState<string | null>(null);\n const [levelError, setLevelError] = useState<string | null>(null);\n\n useEffect(() => {\n setKey(shape?.key ?? '');\n setKeyError(null);\n setLevelError(null);\n }, [shape, assignment]);\n\n if (showAssignment && selectedShapes.length > 1 && onBulkAssign) {\n return (\n <div className=\"eyeon-map-inspector\">\n <BulkAssignForm\n key={selectedShapes.map((item) => item.id).join(',')}\n shapes={selectedShapes}\n assignments={selectedAssignments}\n canEdit={canEdit}\n storeDefaultColor={storeDefaultColor}\n storeTextColor={storeTextColor}\n amenityIconColor={amenityIconColor}\n kioskIconColor={kioskIconColor}\n onPatch={onBulkAssign}\n />\n </div>\n );\n }\n\n if (!shape) {\n if (!showAssignment || !emptyHint) return null;\n return (\n <div className=\"eyeon-map-inspector__empty\">\n {emptyHint}\n </div>\n );\n }\n\n const commitRename = () => {\n if (!key || key === shape.key) {\n setKeyError(null);\n return;\n }\n if (levelShapeKeys.includes(key)) {\n setKeyError('That ID is already used on this level.');\n return;\n }\n setKeyError(null);\n onRename(key);\n };\n\n const copyDestinations = copyDestinationLevels(levels, shape.levelId);\n const copyButton =\n !showAssignment &&\n canEdit &&\n onCopyToLevel &&\n copyDestinations.length > 0 ? (\n <CopyToLevelButton\n destinations={copyDestinations}\n onCopyToLevel={onCopyToLevel}\n />\n ) : null;\n\n if (showAssignment) {\n return (\n <div className=\"eyeon-map-inspector\">\n {shape.geometryLocked ? (\n <p className=\"eyeon-map-rail__hint\">\n Geometry locked — outdoor re-uploads will not overwrite this shape.\n </p>\n ) : null}\n {isAssignableKind(shape.kind) ? (\n <AssignForm\n shape={shape}\n assignment={assignment}\n amenities={amenities}\n retailers={retailers}\n kiosks={kiosks}\n canEdit={canEdit}\n storeDefaultColor={storeDefaultColor}\n storeTextColor={storeTextColor}\n amenityIconColor={amenityIconColor}\n kioskIconColor={kioskIconColor}\n onChange={onSaveAssignment}\n onClear={() => onClearAssignment?.()}\n />\n ) : null}\n </div>\n );\n }\n\n return (\n <div className=\"eyeon-map-inspector\">\n {isEntranceIcon(shape) ? (\n onUpdateLabel ? (\n <EntranceIconForm\n label={shape.label}\n canEdit={canEdit}\n storeTextColor={storeTextColor}\n onChange={onUpdateLabel}\n />\n ) : null\n ) : shape.kind === 'label' ? (\n onUpdateLabel ? (\n <TextLabelForm\n label={shape.label}\n canEdit={canEdit}\n storeTextColor={storeTextColor}\n onChange={onUpdateLabel}\n />\n ) : null\n ) : (\n <>\n <label className=\"eyeon-map-rail__field\">\n ID\n <input\n className=\"eyeon-map-rail__id-input\"\n value={key}\n disabled={!canEdit}\n onChange={(e) => {\n setKey(e.target.value);\n setKeyError(null);\n }}\n onBlur={commitRename}\n />\n </label>\n {keyError ? (\n <p className=\"eyeon-map-rail__hint\" style={{ color: '#b91c1c' }}>\n {keyError}\n </p>\n ) : null}\n\n {inspectorShowsType(shape.kind) ? (\n <label className=\"eyeon-map-rail__field\">\n Type\n <ModernSelect\n ariaLabel=\"Type\"\n value={shape.kind}\n disabled={!canEdit}\n searchable={false}\n options={inspectorTypeKinds(shape.kind).map((k) => ({\n value: k,\n label: SHAPE_KIND_LABELS[k],\n }))}\n onChange={(next) => onChangeKind(next as ShapeKind)}\n />\n </label>\n ) : null}\n {shape.kind === 'void' ? (\n <p className=\"eyeon-map-rail__hint\">\n Open to Below looks through to the floor below — walkways and\n floor plates are cut out so the lower level shows through.\n </p>\n ) : null}\n </>\n )}\n\n {onChangeLevel && levels.length > 0 ? (\n <>\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">Floor</span>\n <div className=\"eyeon-map-assign__floor\">\n <ModernSelect\n ariaLabel=\"Floor\"\n value={String(shape.levelId)}\n disabled={!canEdit}\n searchable={false}\n options={levels.map((level) => ({\n value: String(level.id),\n label: level.name,\n }))}\n onChange={(next) => {\n if (!next) return;\n setLevelError(onChangeLevel(Number(next)));\n }}\n />\n </div>\n </div>\n {levelError ? (\n <p className=\"eyeon-map-rail__hint\" style={{ color: '#b91c1c' }}>\n {levelError}\n </p>\n ) : null}\n </>\n ) : null}\n\n {canEdit && (copyButton || onDelete) ? (\n <div className=\"eyeon-map-assign__actions\">\n {copyButton}\n {onDelete ? (\n <button\n type=\"button\"\n className=\"eyeon-map-assign__unassign\"\n onClick={() => onDelete()}\n >\n Delete\n </button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n","import React, { Suspense } from 'react';\nimport type {\n DeviceType,\n MapViewerHost,\n PublishedDocument,\n} from '../../core';\nimport { MapViewer } from '../../viewer/MapViewer';\nimport type { CameraViewSnapshot } from '../../viewer/components/CameraRig';\n\nexport function PreviewOverlay({\n document,\n host = 'PORTAL_ASSIGN',\n onSelectShape,\n selectedShapeId,\n selectedShapeIds,\n hoveredShapeId,\n focusNonce,\n activeLevelId,\n onActiveLevelChange,\n routeOnSelect,\n imageProxyUrl,\n device,\n captureCamera,\n onCameraChange,\n onCameraReset,\n}: {\n document: PublishedDocument;\n /** Assign mode and public website hide search. */\n host?: MapViewerHost;\n onSelectShape?: (shapeId: number | null, opts?: { additive?: boolean }) => void;\n selectedShapeId?: number | null;\n selectedShapeIds?: number[];\n hoveredShapeId?: number | null;\n focusNonce?: number;\n activeLevelId?: number | null;\n onActiveLevelChange?: (levelId: number) => void;\n /** Default true (public navigate). False when assigning in PORTAL. */\n routeOnSelect?: boolean;\n /** Without this the outdoor SVG is fetched cross-origin and CORS blocks it. */\n imageProxyUrl?: string | null;\n device?: DeviceType;\n captureCamera?: boolean;\n onCameraChange?: (view: CameraViewSnapshot) => void;\n onCameraReset?: () => void;\n}) {\n return (\n <div className=\"eyeon-map-preview\">\n <Suspense fallback={<div className=\"eyeon-map-preview__loading\">Loading preview…</div>}>\n {/* Viewer chrome stays on the canvas — never in the Map options rail. */}\n <MapViewer\n document={document}\n host={host}\n onSelectShape={onSelectShape}\n selectedShapeId={selectedShapeId}\n selectedShapeIds={selectedShapeIds}\n hoveredShapeId={hoveredShapeId}\n focusNonce={focusNonce}\n activeLevelId={activeLevelId}\n onActiveLevelChange={onActiveLevelChange}\n routeOnSelect={routeOnSelect}\n imageProxyUrl={imageProxyUrl}\n device={device}\n captureCamera={captureCamera}\n onCameraChange={onCameraChange}\n onCameraReset={onCameraReset}\n />\n </Suspense>\n </div>\n );\n}\n","export type ShapeSelectOpts = { additive?: boolean };\n\n/** Plain click replaces; Shift-click toggles the id in the set. */\nexport function nextSelectedShapeIds(\n current: number[],\n id: number | null,\n opts?: ShapeSelectOpts,\n): number[] {\n if (id == null) return [];\n if (!opts?.additive) return [id];\n if (current.includes(id)) return current.filter((item) => item !== id);\n return [...current, id];\n}\n","import type {\n CmConnector,\n CmResponsiveOverride,\n MapAssignRetailer,\n PublishedDocument,\n} from '../core';\nimport { compileDocument } from '../core';\nimport type { EditorDraftState } from './draftOps';\n\nexport function compileEditorPreview(\n draft: EditorDraftState,\n extras?: {\n revisionId?: number;\n revisionNumber?: number;\n connectors?: CmConnector[];\n publishedAt?: string;\n retailers?: MapAssignRetailer[];\n responsiveOverrides?: CmResponsiveOverride[];\n },\n): PublishedDocument {\n const outdoor = draft.levels.find((level) => level.kind === 'outdoor');\n return compileDocument({\n revisionId: extras?.revisionId ?? 0,\n revisionNumber: extras?.revisionNumber ?? 0,\n centerId: draft.centerId,\n mapId: draft.mapId,\n theme: draft.theme,\n baseSvgUrl: draft.baseSvgUrl ?? outdoor?.sourceSvgUrl ?? null,\n baseViewbox: outdoor?.sourceViewbox ?? null,\n buildings: draft.buildings,\n levels: draft.levels,\n shapes: draft.shapes.filter((s) => !s.orphanedAt),\n assignments: draft.assignments,\n anchors: draft.anchors,\n edges: draft.edges,\n connectors: extras?.connectors ?? draft.connectors ?? [],\n amenities: draft.amenities,\n responsiveOverrides:\n extras?.responsiveOverrides ?? draft.responsiveOverrides ?? [],\n publishedAt: extras?.publishedAt,\n retailers: extras?.retailers,\n /** Prefer already-resolved CDN URLs on draft levels (outdoor SVG). */\n resolveSvgUrl: (key) => {\n if (!key) return null;\n const match = draft.levels.find(\n (l) => l.sourceSvgKey === key || l.sourceSvgUrl === key,\n );\n return match?.sourceSvgUrl ?? key;\n },\n });\n}\n","import type { DeviceType } from '../core';\n\nexport type RestoredEditorSection = {\n section: 'edit-map' | 'wayfinding' | 'map-responsiveness';\n levelId: number | null;\n device?: DeviceType;\n};\n\nconst memory = new Map<number, RestoredEditorSection>();\nconst MAX_REMEMBERED_MAPS = 20;\n\nconst storageKey = (mapId: number) => `eyeon-map-editor-section:${mapId}`;\n\nfunction dropLegacyStorage(mapId: number): void {\n try {\n sessionStorage.removeItem(storageKey(mapId));\n } catch {\n /* private mode / SSR */\n }\n}\n\n/**\n * Keep Edit Map / Wayfinding / Map Responsiveness open across an in-page remount (save).\n * Memory only — a full page refresh returns to Map options.\n */\nexport function markEditorSection(\n mapId: number,\n restored: RestoredEditorSection,\n): void {\n memory.delete(mapId);\n memory.set(mapId, restored);\n if (memory.size > MAX_REMEMBERED_MAPS) {\n const oldest = memory.keys().next().value;\n if (oldest != null) memory.delete(oldest);\n }\n dropLegacyStorage(mapId);\n}\n\nexport function peekEditorSection(mapId: number): RestoredEditorSection | null {\n dropLegacyStorage(mapId);\n return memory.get(mapId) ?? null;\n}\n\nexport function clearEditorSection(mapId: number): void {\n memory.delete(mapId);\n dropLegacyStorage(mapId);\n}\n","const memory = new Set<number>();\n\nconst storageKey = (mapId: number) => `eyeon-map-return-floors:${mapId}`;\n\nfunction storage(): Storage | null {\n try {\n return sessionStorage;\n } catch {\n return null;\n }\n}\n\n/** Remember to reopen the floors list after a remount (reload after add). */\nexport function markReturnToFloorsList(mapId: number): void {\n memory.add(mapId);\n storage()?.setItem(storageKey(mapId), '1');\n}\n\nexport function consumeReturnToFloorsList(mapId: number): boolean {\n const stored = storage()?.getItem(storageKey(mapId)) === '1';\n const pending = memory.has(mapId) || stored;\n clearReturnToFloorsList(mapId);\n return pending;\n}\n\nexport function clearReturnToFloorsList(mapId: number): void {\n memory.delete(mapId);\n storage()?.removeItem(storageKey(mapId));\n}\n","import React from 'react';\n\n/** Edit Map / Wayfinding graph paper strength. Per-user, not per center. */\nexport type MapGridPrefs = {\n /** 0–0.3. The slider still travels 0–100. Diagonals stay at half this value. */\n gridOpacity: number;\n};\n\n/** Right end of the slider. The control itself stays 0–100. */\nexport const MAX_GRID_OPACITY = 0.3;\nexport const DEFAULT_GRID_OPACITY = 0.13;\n\nexport function clampGridOpacity(value: number): number {\n if (!Number.isFinite(value)) return DEFAULT_GRID_OPACITY;\n return Math.min(MAX_GRID_OPACITY, Math.max(0, Math.round(value * 1000) / 1000));\n}\n\nfunction gridOpacityFromSlider(percent: number): number {\n return clampGridOpacity((percent / 100) * MAX_GRID_OPACITY);\n}\n\nfunction sliderPercentFromGridOpacity(opacity: number): number {\n return Math.round((clampGridOpacity(opacity) / MAX_GRID_OPACITY) * 100);\n}\n\nexport function GridPrefsControl({\n gridOpacity,\n onChange,\n}: {\n gridOpacity: number;\n /** Fires on every slider move so the host can update the canvas and persist immediately. */\n onChange: (prefs: MapGridPrefs) => void;\n}) {\n const percent = sliderPercentFromGridOpacity(gridOpacity);\n const prefsFromInput = (value: string): MapGridPrefs => ({\n gridOpacity: gridOpacityFromSlider(Number(value)),\n });\n return (\n <div className=\"eyeon-map-editor__grid-prefs\">\n <label className=\"eyeon-map-editor__grid-prefs-opacity\">\n Grid Opacity\n <input\n type=\"range\"\n min={0}\n max={100}\n step={1}\n value={percent}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={percent}\n aria-label=\"Grid Opacity\"\n data-eyeon-grid-opacity=\"\"\n onInput={(event) => onChange(prefsFromInput(event.currentTarget.value))}\n onChange={(event) => onChange(prefsFromInput(event.currentTarget.value))}\n />\n </label>\n </div>\n );\n}\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport type {\n BatchOp,\n CmShapeAssignment,\n DeviceType,\n MapAssignKiosk,\n MapAssignRetailer,\n MapEditorHost,\n PublishedDocument,\n ResponsiveCamera,\n ShapeKind,\n Vec3,\n} from '../core';\nimport type { ShapeGeometry, ShapeLabel, ShapeStyle } from '../core';\nimport { assignmentVisualPatch, applyBulkAssignPatch, DEFAULT_LABEL_ALIGN, emptyResponsiveOverrideInput, emptyShapeAssignment, geometryBBox, hasBuildingFloors, MAP_NO_FLOORS_MESSAGE, mergeResponsiveOverrides, mergeTheme, nextLowerBuildingFloor, parseShapeAssignment, poseToResponsiveFields, RESPONSIVE_DEVICE_TABS, responsiveSlotKey, viewerLevelIdAfterShapeSelect } from '../core';\nimport type { CameraViewSnapshot } from '../viewer/components/CameraRig';\nimport type { BulkAssignPatch } from '../core';\nimport { MapControls } from '../viewer/ui/MapControls';\nimport {\n editorFloorControlLevels,\n isEditorSection,\n levelIdOnEnterDefaultMap,\n levelIdOnEnterEditMap,\n levelIdOnEnterWayfinding,\n portalCenterSurface,\n wayfindingOutdoorReadOnly,\n} from './portalSurface';\nimport { EditorCanvas, type EditorCanvasHandle } from './canvas/EditorCanvas';\nimport {\n applyBeforeUnloadWarning,\n beforeUnloadTargets,\n editorShouldWarnOnLeave,\n} from './dirty';\nimport {\n resolvedConnectorKind,\n type VerticalRailKind,\n} from './connectorAssignments';\nimport {\n applyDraftOps,\n coalesceDraftOp,\n orderBatchOpsForPersist,\n shapeKeyTakenOnLevel,\n type EditorDraftState,\n} from './draftOps';\nimport { ConnectorAssign } from './panels/ConnectorAssign';\nimport { LeftRail, type RailSection } from './panels/LeftRail';\nimport type { CreateLevelInput, UpdateLevelInput } from './panels/FloorsPanel';\nimport { CatalogKioskForm } from './panels/CatalogKioskForm';\nimport { Inspector } from './panels/Inspector';\nimport { PreviewOverlay } from './panels/PreviewOverlay';\nimport { isAssignableKind } from './railAssignments';\nimport {\n catalogKioskShapeOptions,\n isKioskScreenKind,\n shapeIdForCatalogKiosk,\n} from './railKiosks';\nimport { allocShapeKey, copyShapeToLevelOps, liveShapeKeysOnLevel } from './shapeCopy';\nimport { nextSelectedShapeIds, type ShapeSelectOpts } from './shapeSelection';\nimport { compileEditorPreview } from './previewDocument';\nimport { geometryForLabelText, DEFAULT_LABEL_SIZE } from './labelText';\nimport {\n DEFAULT_ENTRANCE_SIZE,\n canonicalizeEntranceLabel,\n geometryForEntranceIcon,\n isEntranceIcon,\n} from './entranceIcon';\nimport {\n cloneHistorySnapshot,\n emptyEditorHistory,\n isEditableTypingTarget,\n isEditorRedoHotkey,\n isEditorUndoHotkey,\n pushEditorHistory,\n redoEditorHistory,\n undoEditorHistory,\n type EditorHistorySnapshot,\n} from './history';\nimport {\n connectRouteAnchorToRouteOps,\n connectShapeToRouteOps,\n deleteRouteAnchorOps,\n deleteRouteEdgeOps,\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 {\n clampGridOpacity,\n DEFAULT_GRID_OPACITY,\n GridPrefsControl,\n type MapGridPrefs,\n} from './GridPrefsControl';\nimport './editor.css';\n\nexport type { EditorDraftState } from './draftOps';\nexport type { MapEditorHost } from '../core';\nexport type { EditorTool } from './tools';\n\nexport type ResponsiveOverrideInput = {\n levelId: number;\n device: DeviceType;\n camera: ResponsiveCamera;\n controls: Vec3;\n};\n\nexport interface MapEditorProps {\n /**\n * Where the editor is embedded. `PORTAL` (default) always includes Map\n * options (LeftRail: Floors, Kiosks, Settings, plus Edit Map — never viewer\n * chrome). Default center is MapViewer (click-to-assign, no grid). Edit\n * Map swaps in the geometry canvas and editor grid. `WEBSITE` is canvas +\n * toolbar only — public sites should use `MapViewer`, not this editor.\n */\n host?: MapEditorHost;\n draft: EditorDraftState;\n webApiURI: string;\n canEdit?: boolean;\n canFloors?: boolean;\n canSettings?: boolean;\n canResponsiveness?: boolean;\n onBatch?: (ops: BatchOp[]) => Promise<void>;\n onPublish?: () => Promise<void>;\n onSaveResponsive?: (items: ResponsiveOverrideInput[]) => Promise<void>;\n /** Reload the draft from the database after discarding local edits. */\n onDiscard?: () => Promise<void> | void;\n onImportSvg?: (levelId: number, file: File) => Promise<void>;\n onCreateLevel?: (input: CreateLevelInput) => Promise<number | void>;\n onUpdateLevel?: (input: UpdateLevelInput) => Promise<void>;\n onDeleteLevel?: (levelId: number) => Promise<void>;\n onReorderLevels?: (orderedIds: number[]) => Promise<void>;\n onAutoroute?: (levelId: number) => Promise<void>;\n previewDocument?: PublishedDocument | null;\n /**\n * Center retailers for the default-map assign form (v1 retailer dropdown).\n */\n retailers?: MapAssignRetailer[];\n /** Center kiosks for leftover ID-only assignments; new kiosks are named in Assign. */\n kiosks?: MapAssignKiosk[];\n /**\n * Media proxy base for remote http(s) media, same contract as v1\n * `IMAGE_PROXY_URL`. Required whenever the outdoor SVG is served from an\n * origin that does not send CORS headers. Inlined amenity data URLs skip it.\n */\n imageProxyUrl?: string | null;\n className?: string;\n /** Quiet extra actions under the left rail (e.g. developer Classic Map). */\n sidebarFooter?: ReactNode;\n /**\n * Fires when local edits, an in-progress shape/route, or a save-in-flight\n * should block leaving the page. Quiet again after a successful save.\n */\n onDirtyChange?: (state: { dirty: boolean; saving: boolean }) => void;\n /** PORTAL host: pin \"Use Classic Map\" at the bottom of the left rail. */\n onUseClassicMap?: () => void;\n /**\n * Edit Map and Wayfinding graph paper strength. Saved per user by the host.\n * The grid always paints above shapes.\n */\n gridOpacity?: number;\n /** Fires on every slider move so the host can update the canvas and persist immediately. */\n onGridPrefsChange?: (prefs: MapGridPrefs) => void;\n}\n\nexport function MapEditor({\n host = 'PORTAL',\n draft,\n canEdit = true,\n canFloors = true,\n canSettings = true,\n canResponsiveness = false,\n onBatch,\n onPublish,\n onSaveResponsive,\n onDiscard,\n onImportSvg,\n onCreateLevel,\n onUpdateLevel,\n onDeleteLevel,\n onReorderLevels,\n onAutoroute,\n previewDocument,\n retailers = [],\n kiosks = [],\n imageProxyUrl,\n className,\n sidebarFooter,\n onDirtyChange,\n onUseClassicMap,\n gridOpacity: gridOpacityProp = DEFAULT_GRID_OPACITY,\n onGridPrefsChange,\n}: MapEditorProps) {\n const restoredSection = peekEditorSection(draft.mapId);\n const [section, setSection] = useState<RailSection | null>(() => {\n if (consumeReturnToFloorsList(draft.mapId)) return 'floors';\n return restoredSection?.section ?? null;\n });\n const [responsiveDevice, setResponsiveDevice] = useState<DeviceType>(\n () => restoredSection?.device ?? 'admin_portal',\n );\n const [pendingResponsive, setPendingResponsive] = useState<\n Record<string, ResponsiveOverrideInput>\n >({});\n const [previewEpoch, setPreviewEpoch] = useState(0);\n const [activeLevelId, setActiveLevelId] = useState<number | null>(() => {\n const restoredLevel = peekEditorSection(draft.mapId)?.levelId;\n if (\n restoredLevel != null &&\n draft.levels.some((level) => level.id === restoredLevel)\n ) {\n return restoredLevel;\n }\n return levelIdOnEnterEditMap(draft.levels);\n });\n const [selectedShapeIds, setSelectedShapeIds] = useState<number[]>([]);\n const [selectedCatalogKioskId, setSelectedCatalogKioskId] = useState<\n number | null\n >(null);\n const selectedShapeId = selectedShapeIds[0] ?? null;\n const [hoveredShapeId, setHoveredShapeId] = useState<number | null>(null);\n const [listFocusNonce, setListFocusNonce] = useState(0);\n const [selectedAnchorIds, setSelectedAnchorIds] = useState<number[]>([]);\n const [tool, setTool] = useState<EditorTool>('select');\n const [gridOpacity, setGridOpacity] = useState(() =>\n clampGridOpacity(gridOpacityProp),\n );\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 setGridOpacity(clampGridOpacity(gridOpacityProp));\n }, [gridOpacityProp]);\n\n const handleGridPrefsChange = useCallback((prefs: MapGridPrefs) => {\n const gridOpacity = clampGridOpacity(prefs.gridOpacity);\n setGridOpacity(gridOpacity);\n onGridPrefsChange?.({ gridOpacity });\n }, [onGridPrefsChange]);\n\n useEffect(() => {\n pendingOps.current = [];\n nextTempId.current = -1;\n historyGestureRef.current = false;\n setEditVersion(0);\n setNeedsPublish(false);\n setPendingResponsive({});\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n }, [draft.mapId, draft.centerId]);\n\n useEffect(() => {\n if (\n section === 'edit-map' ||\n section === 'wayfinding' ||\n section === 'map-responsiveness'\n ) {\n markEditorSection(draft.mapId, {\n section,\n levelId: activeLevelId,\n device: section === 'map-responsiveness' ? responsiveDevice : undefined,\n });\n return;\n }\n clearEditorSection(draft.mapId);\n }, [activeLevelId, draft.mapId, responsiveDevice, section]);\n\n // Levels can arrive after the first render, or the active one can be deleted.\n // Default map / Wayfinding must not stay on Outdoor — that hides floors.\n useEffect(() => {\n const exists = draft.levels.some((level) => level.id === activeLevelId);\n if (!exists) {\n setActiveLevelId(\n section === 'wayfinding'\n ? levelIdOnEnterWayfinding(draft.levels)\n : isEditorSection(section)\n ? levelIdOnEnterEditMap(draft.levels)\n : levelIdOnEnterDefaultMap(draft.levels),\n );\n return;\n }\n if (section === 'edit-map') return;\n const active = draft.levels.find((level) => level.id === activeLevelId);\n if (active?.kind !== 'outdoor') return;\n const next =\n section === 'wayfinding'\n ? levelIdOnEnterWayfinding(draft.levels)\n : levelIdOnEnterDefaultMap(draft.levels);\n if (next != null && next !== activeLevelId) setActiveLevelId(next);\n }, [draft.levels, activeLevelId, section]);\n\n const workingDraft = useMemo(\n () => applyDraftOps(draft, pendingOps.current),\n [draft, editVersion],\n );\n\n const theme = useMemo(\n () => mergeTheme(workingDraft.theme),\n [workingDraft.theme],\n );\n\n const cameraDirty = Object.keys(pendingResponsive).length > 0;\n const pendingEdits = pendingOps.current.length > 0;\n const dirty = pendingEdits || needsPublish || cameraDirty;\n const warnOnLeave = editorShouldWarnOnLeave({\n pendingEdits,\n needsPublish,\n cameraDirty,\n gesture: routeDraftActive,\n saving,\n });\n useEffect(() => {\n onDirtyChange?.({ dirty: warnOnLeave, saving });\n }, [onDirtyChange, saving, warnOnLeave]);\n const warnOnLeaveRef = useRef(warnOnLeave);\n warnOnLeaveRef.current = warnOnLeave;\n useEffect(() => {\n const onBeforeUnload = (event: BeforeUnloadEvent) => {\n applyBeforeUnloadWarning(event, warnOnLeaveRef.current);\n };\n const targets = beforeUnloadTargets(window);\n for (const target of targets) {\n target.addEventListener('beforeunload', onBeforeUnload);\n }\n return () => {\n for (const target of targets) {\n target.removeEventListener('beforeunload', onBeforeUnload);\n }\n };\n }, []);\n const canPersist =\n !saving && dirty && (canEdit || (canResponsiveness && cameraDirty));\n const isResponsiveness = section === 'map-responsiveness';\n const activeLevel = workingDraft.levels.find((l) => l.id === activeLevelId) ?? null;\n const outdoorViewOnly = wayfindingOutdoorReadOnly(section, activeLevel);\n const canDrawOnCanvas = canEdit && !outdoorViewOnly;\n const outdoorLevel = workingDraft.levels.find((l) => l.kind === 'outdoor') ?? null;\n const outdoorShapes =\n outdoorLevel && activeLevel?.kind === 'floor'\n ? workingDraft.shapes.filter((s) => s.levelId === outdoorLevel.id)\n : [];\n const levelShapes = workingDraft.shapes.filter((s) => s.levelId === activeLevelId);\n const openingUnderlayShapes = useMemo(() => {\n const levelsWithShapes = workingDraft.levels.map((lvl) => ({\n ...lvl,\n shapes: workingDraft.shapes.filter((shape) => shape.levelId === lvl.id),\n }));\n const lower = nextLowerBuildingFloor(levelsWithShapes, activeLevelId);\n if (!lower) return [];\n return workingDraft.shapes.filter(\n (shape) => shape.levelId === lower.id && !shape.orphanedAt,\n );\n }, [workingDraft.levels, workingDraft.shapes, activeLevelId]);\n const mergedResponsiveOverrides = useMemo(\n () =>\n mergeResponsiveOverrides(\n workingDraft.responsiveOverrides ?? [],\n Object.values(pendingResponsive),\n ),\n [pendingResponsive, workingDraft.responsiveOverrides],\n );\n const compiledPreview = useMemo(\n () =>\n compileEditorPreview(workingDraft, {\n revisionId: previewDocument?.revisionId,\n revisionNumber: previewDocument?.revisionNumber,\n connectors: workingDraft.connectors,\n publishedAt: previewDocument?.publishedAt,\n retailers,\n responsiveOverrides: mergedResponsiveOverrides,\n }),\n [workingDraft, previewDocument, retailers, mergedResponsiveOverrides],\n );\n const levelAnchors = useMemo(\n () => workingDraft.anchors.filter((a) => a.levelId === activeLevelId),\n [activeLevelId, workingDraft.anchors],\n );\n const levelEdges = useMemo(() => {\n const anchorsById = new Map(\n workingDraft.anchors.map((anchor) => [anchor.id, anchor]),\n );\n return workingDraft.edges.filter(\n (edge) => anchorsById.get(edge.fromAnchorId)?.levelId === activeLevelId,\n );\n }, [activeLevelId, workingDraft.anchors, workingDraft.edges]);\n const selectedShape =\n workingDraft.shapes.find((s) => s.id === selectedShapeId) ?? null;\n const selectedAssignment =\n workingDraft.assignments.find((a) => a.shapeId === selectedShapeId) ?? null;\n\n const takeSnapshot = (): EditorHistorySnapshot =>\n cloneHistorySnapshot({\n ops: pendingOps.current,\n nextTempId: nextTempId.current,\n selectedShapeId: historyMetaRef.current.selectedShapeId,\n selectedAnchorIds: historyMetaRef.current.selectedAnchorIds,\n });\n\n const applySnapshot = (snapshot: EditorHistorySnapshot) => {\n pendingOps.current = snapshot.ops;\n nextTempId.current = snapshot.nextTempId;\n setSelectedShapeIds(\n snapshot.selectedShapeId == null ? [] : [snapshot.selectedShapeId],\n );\n setSelectedAnchorIds(snapshot.selectedAnchorIds);\n setEditVersion((n) => n + 1);\n };\n\n const recordHistoryStep = (mode: 'step' | 'gesture' | 'none') => {\n if (!historyMetaRef.current.isEditMap || mode === 'none') return;\n if (mode === 'gesture') {\n if (historyGestureRef.current) return;\n historyGestureRef.current = true;\n }\n const next = pushEditorHistory(historyRef.current, takeSnapshot());\n historyRef.current = next;\n setHistory(next);\n };\n\n const queueOp = useCallback(\n (op: BatchOp, historyMode: 'step' | 'gesture' | 'none' = 'step'): number | null => {\n recordHistoryStep(historyMode);\n let next = op;\n if (next.op === 'upsert_shape' && next.shape.id == null) {\n const id = nextTempId.current--;\n next = { ...next, shape: { ...next.shape, id } };\n }\n if (next.op === 'upsert_anchor' && next.anchor.id == null) {\n const id = nextTempId.current--;\n next = { ...next, anchor: { ...next.anchor, id } };\n }\n if (next.op === 'upsert_edge' && next.edge.id == null) {\n const id = nextTempId.current--;\n next = { ...next, edge: { ...next.edge, id } };\n }\n if (next.op === 'upsert_connector' && next.connector.id == null) {\n const id = nextTempId.current--;\n next = { ...next, connector: { ...next.connector, id } };\n }\n pendingOps.current = coalesceDraftOp(pendingOps.current, next);\n setEditVersion((n) => n + 1);\n if (next.op === 'upsert_shape') return next.shape.id ?? null;\n if (next.op === 'upsert_anchor') return next.anchor.id ?? null;\n if (next.op === 'upsert_edge') return next.edge.id ?? null;\n if (next.op === 'upsert_connector') return next.connector.id ?? null;\n return null;\n },\n [],\n );\n\n const endHistoryGesture = useCallback(() => {\n historyGestureRef.current = false;\n }, []);\n\n const undo = useCallback(() => {\n if (!historyMetaRef.current.isEditMap || !canEdit || saving) return;\n const routeKind = canvasRef.current?.consumeRouteUndo();\n if (routeKind === 'clear-only') return;\n const next = undoEditorHistory(historyRef.current, takeSnapshot());\n if (!next) return;\n historyGestureRef.current = false;\n applySnapshot(next.restored);\n historyRef.current = next.history;\n setHistory(next.history);\n }, [canEdit, saving]);\n\n const redo = useCallback(() => {\n if (!historyMetaRef.current.isEditMap || !canEdit || saving) return;\n const next = redoEditorHistory(historyRef.current, takeSnapshot());\n if (!next) return;\n historyGestureRef.current = false;\n applySnapshot(next.restored);\n historyRef.current = next.history;\n setHistory(next.history);\n }, [canEdit, saving]);\n\n const handleSaveChanges = useCallback(async () => {\n if (saving) return;\n const ops = canEdit ? orderBatchOpsForPersist(pendingOps.current) : [];\n const cameraItems = canResponsiveness ? Object.values(pendingResponsive) : [];\n if (!ops.length && !needsPublish && !cameraItems.length) return;\n if (!canEdit && !cameraItems.length) return;\n pendingOps.current = [];\n setEditVersion((n) => n + 1);\n setSaving(true);\n let persisted = !ops.length;\n const savedCamera = cameraItems;\n try {\n if (cameraItems.length && onSaveResponsive) {\n await onSaveResponsive(cameraItems);\n setPendingResponsive({});\n }\n if (ops.length && onBatch) {\n await onBatch(ops);\n persisted = true;\n }\n await onPublish?.();\n setNeedsPublish(false);\n historyGestureRef.current = false;\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n } catch {\n if (savedCamera.length) {\n setPendingResponsive((prev) =>\n Object.keys(prev).length ? prev : Object.fromEntries(\n savedCamera.map((item) => [\n responsiveSlotKey(item.levelId, item.device),\n item,\n ]),\n ),\n );\n }\n if (!persisted) {\n pendingOps.current = ops;\n setEditVersion((n) => n + 1);\n } else {\n setNeedsPublish(true);\n }\n } finally {\n setSaving(false);\n }\n }, [\n canEdit,\n canResponsiveness,\n needsPublish,\n onBatch,\n onPublish,\n onSaveResponsive,\n pendingResponsive,\n saving,\n ]);\n\n const handleDiscardChanges = useCallback(async () => {\n if (saving || !dirty) return;\n if (!canEdit && !cameraDirty) return;\n if (\n !window.confirm(\n 'Discard unsaved changes and reload the map from the database?',\n )\n ) {\n return;\n }\n canvasRef.current?.consumeRouteUndo();\n pendingOps.current = [];\n nextTempId.current = -1;\n historyGestureRef.current = false;\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n setNeedsPublish(false);\n setPendingResponsive({});\n setPreviewEpoch((n) => n + 1);\n setEditVersion((n) => n + 1);\n setSaving(true);\n try {\n await onDiscard?.();\n } finally {\n setSaving(false);\n }\n }, [cameraDirty, canEdit, dirty, onDiscard, saving]);\n\n const handleSectionChange = useCallback(\n (next: RailSection | null) => {\n // Leave item-options (level 3) whenever the rail module changes so\n // Stores / Amenities / … always open on their list (level 2).\n setSelectedShapeIds([]);\n setSelectedCatalogKioskId(null);\n setSelectedAnchorIds([]);\n setHoveredShapeId(null);\n if (isEditorSection(section) && !isEditorSection(next)) {\n setTool('select');\n historyGestureRef.current = false;\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n setActiveLevelId(levelIdOnEnterDefaultMap(draft.levels));\n } else if (next === 'edit-map') {\n setTool('select');\n setActiveLevelId(levelIdOnEnterEditMap(draft.levels));\n } else if (next === 'wayfinding') {\n setTool('select');\n setActiveLevelId(levelIdOnEnterWayfinding(draft.levels));\n } else if (next === 'map-responsiveness') {\n setActiveLevelId(levelIdOnEnterDefaultMap(draft.levels));\n }\n setSection(next);\n },\n [draft.levels, section],\n );\n\n const handleCanvasLevelChange = (levelId: number) => {\n if (levelId === activeLevelId) return;\n setSelectedShapeIds([]);\n setSelectedAnchorIds([]);\n setActiveLevelId(levelId);\n const nextLevel = workingDraft.levels.find((level) => level.id === levelId);\n if (wayfindingOutdoorReadOnly(section, nextLevel)) setTool('select');\n };\n\n useEffect(() => {\n if (!isEditMap || !canEdit) return;\n const onKey = (e: KeyboardEvent) => {\n if (isEditableTypingTarget(e.target)) return;\n if (isEditorUndoHotkey(e)) {\n e.preventDefault();\n undo();\n return;\n }\n if (isEditorRedoHotkey(e)) {\n e.preventDefault();\n redo();\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [canEdit, isEditMap, redo, undo]);\n\n const handleSelectShape = useCallback(\n (id: number | null, opts?: ShapeSelectOpts) => {\n const shape = id == null ? null : workingDraft.shapes.find((s) => s.id === id);\n const additive =\n Boolean(opts?.additive) &&\n section !== 'edit-map' &&\n section !== 'wayfinding' &&\n (shape == null || isAssignableKind(shape.kind));\n setSelectedShapeIds((prev) => nextSelectedShapeIds(prev, id, { additive }));\n if (id != null) setSelectedCatalogKioskId(null);\n setHoveredShapeId(null);\n if (id == null) return;\n if (shape && !additive) {\n const nextLevelId =\n section === 'edit-map' || section === 'wayfinding'\n ? shape.levelId\n : viewerLevelIdAfterShapeSelect(\n workingDraft.levels,\n activeLevelId,\n shape.levelId,\n );\n setActiveLevelId(nextLevelId);\n }\n if (additive) return;\n setSection((current) => {\n if (\n current === 'edit-map' ||\n current === 'wayfinding' ||\n current === 'map-responsiveness'\n ) {\n return current;\n }\n if (shape?.kind === 'custom') return 'custom';\n if (\n current === 'unassigned' ||\n current === 'escalators' ||\n current === 'elevators'\n ) {\n return current;\n }\n const connectorKind = shape\n ? resolvedConnectorKind(shape, workingDraft.anchors, workingDraft.connectors)\n : null;\n if (connectorKind === 'escalator') return 'escalators';\n if (connectorKind === 'elevator') return 'elevators';\n if (shape?.kind === 'unit' || shape?.kind === 'parking_zone') return 'stores';\n if (shape?.kind === 'amenity') return 'amenities';\n if (shape?.kind === 'kiosk_screen') return 'kiosks';\n return 'selection';\n });\n },\n [\n activeLevelId,\n section,\n workingDraft.anchors,\n workingDraft.connectors,\n workingDraft.levels,\n workingDraft.shapes,\n ],\n );\n\n const handleToolChange = (next: EditorTool) => {\n const resolved = nextEditorTool(tool, next);\n setTool(resolved);\n if (!showsWayfinding(resolved, section === 'wayfinding')) setSelectedAnchorIds([]);\n };\n\n const handleRenameShape = (key: string) => {\n if (!selectedShape || !canEdit) return;\n if (\n shapeKeyTakenOnLevel(\n workingDraft.shapes,\n selectedShape.id,\n selectedShape.levelId,\n key,\n )\n ) {\n return;\n }\n queueOp({\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key,\n kind: selectedShape.kind,\n },\n });\n };\n\n const handleChangeLevel = (levelId: number): string | null => {\n if (!selectedShape || !canEdit) return null;\n if (levelId === selectedShape.levelId) return null;\n if (\n shapeKeyTakenOnLevel(\n workingDraft.shapes,\n selectedShape.id,\n levelId,\n selectedShape.key,\n )\n ) {\n return 'That ID is already used on this floor.';\n }\n const ops: BatchOp[] = [\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n },\n },\n ];\n for (const anchor of workingDraft.anchors) {\n if (anchor.shapeId !== selectedShape.id || anchor.levelId === levelId) {\n continue;\n }\n ops.push({\n op: 'upsert_anchor',\n anchor: {\n id: anchor.id,\n levelId,\n shapeId: anchor.shapeId,\n kind: anchor.kind,\n x: anchor.x,\n y: anchor.y,\n connectorId: anchor.connectorId,\n },\n });\n }\n queueOpBatch(ops);\n setActiveLevelId(levelId);\n return null;\n };\n\n const handleCopyToLevel = (levelId: number): string | null => {\n if (!selectedShape || !canEdit) return null;\n const copied = copyShapeToLevelOps({\n shape: selectedShape,\n assignment: selectedAssignment,\n targetLevelId: levelId,\n shapes: workingDraft.shapes,\n allocId: () => nextTempId.current--,\n });\n if (!copied) return 'Pick a different floor.';\n queueOpBatch(copied.ops);\n setSelectedShapeIds([copied.shapeId]);\n setActiveLevelId(levelId);\n return null;\n };\n\n const handleDeleteShape = () => {\n if (!selectedShape || !canEdit) return;\n queueOp({ op: 'delete_shape', shapeId: selectedShape.id });\n setSelectedShapeIds([]);\n };\n\n const handleUpdateShapeGeometry = (\n shapeId: number,\n geometry: ShapeGeometry,\n opts?: { live?: boolean },\n ) => {\n if (!canDrawOnCanvas) return;\n const shape = workingDraft.shapes.find((s) => s.id === shapeId);\n if (!shape) return;\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: shape.id,\n levelId: shape.levelId,\n key: shape.key,\n kind: shape.kind,\n geometry,\n bbox: geometryBBox(geometry),\n geometryLocked: true,\n },\n },\n opts?.live ? 'gesture' : 'step',\n );\n };\n\n const handleUpdateLabel = (label: ShapeLabel, opts?: { live?: boolean }) => {\n if (!selectedShape || !canEdit) return;\n if (isEntranceIcon(selectedShape)) {\n const nextLabel =\n canonicalizeEntranceLabel({\n ...selectedShape,\n label,\n }) ?? label;\n const size = nextLabel.size ?? selectedShape.label.size ?? DEFAULT_ENTRANCE_SIZE;\n const sameLabel =\n size === (selectedShape.label.size ?? DEFAULT_ENTRANCE_SIZE) &&\n (nextLabel.rotate ?? 0) === (selectedShape.label.rotate ?? 0) &&\n (nextLabel.color ?? '') === (selectedShape.label.color ?? '') &&\n (nextLabel.imageKey ?? '') === (selectedShape.label.imageKey ?? '');\n if (sameLabel) {\n if (!opts?.live) endHistoryGesture();\n return;\n }\n const geometry = geometryForEntranceIcon(selectedShape.geometry, size);\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n origin: selectedShape.origin,\n sourceSvgId: selectedShape.sourceSvgId,\n label: nextLabel,\n geometry,\n bbox: geometryBBox(geometry),\n },\n },\n opts?.live ? 'gesture' : 'step',\n );\n if (!opts?.live) endHistoryGesture();\n return;\n }\n const size = label.size ?? selectedShape.label.size ?? DEFAULT_LABEL_SIZE;\n const sameLabel =\n (label.text ?? '') === (selectedShape.label.text ?? '') &&\n size === (selectedShape.label.size ?? DEFAULT_LABEL_SIZE) &&\n (label.rotate ?? 0) === (selectedShape.label.rotate ?? 0) &&\n (label.color ?? '') === (selectedShape.label.color ?? '') &&\n (label.align ?? DEFAULT_LABEL_ALIGN) ===\n (selectedShape.label.align ?? DEFAULT_LABEL_ALIGN);\n if (sameLabel) {\n if (!opts?.live) endHistoryGesture();\n return;\n }\n const geometry = geometryForLabelText(\n selectedShape.geometry,\n label.text ?? selectedShape.label.text ?? '',\n size,\n );\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n label,\n geometry,\n bbox: geometryBBox(geometry),\n },\n },\n opts?.live ? 'gesture' : 'step',\n );\n if (!opts?.live) endHistoryGesture();\n };\n\n const handleChangeKind = (kind: ShapeKind) => {\n if (!selectedShape || !canEdit) return;\n queueOp({\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind,\n },\n });\n if (kind === 'custom') {\n queueOp({\n op: 'upsert_assignment',\n assignment: emptyShapeAssignment(selectedShape.id, 'custom'),\n });\n } else if (selectedShape.kind === 'custom') {\n queueOp({ op: 'delete_assignment', shapeId: selectedShape.id });\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 === 'custom' ||\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={section === 'edit-map' ? handleCopyToLevel : undefined}\n levels={editorFloorControlLevels('edit-map', workingDraft.levels)}\n onDelete={handleDeleteShape}\n onClearAssignment={handleClearAssignment}\n onUpdateLabel={handleUpdateLabel}\n onSaveAssignment={handleSaveAssignment}\n onBulkAssign={handleBulkAssign}\n storeDefaultColor={theme.STORE_DEFAULT_COLOR}\n storeTextColor={theme.STORE_TEXT_COLOR}\n amenityIconColor={theme.AMENITY_ICON_COLOR}\n kioskIconColor={theme.KIOSK_ICON_COLOR}\n />\n {section !== 'edit-map' && selectedShape && connectorRailKind ? (\n <ConnectorAssign\n shape={selectedShape}\n railKind={connectorRailKind}\n canEdit={canEdit}\n assignment={selectedAssignment}\n storeDefaultColor={theme.STORE_DEFAULT_COLOR}\n storeTextColor={theme.CONNECTOR_ICON_COLOR}\n ctx={{\n mapId: workingDraft.mapId,\n levels: workingDraft.levels,\n shapes: workingDraft.shapes,\n anchors: workingDraft.anchors,\n edges: workingDraft.edges,\n connectors: workingDraft.connectors,\n allocId: () => nextTempId.current--,\n }}\n onApplyOps={queueOpBatch}\n onSaveAssignment={handleSaveAssignment}\n />\n ) : null}\n </>\n );\n\n const selectedCatalogKiosk =\n selectedCatalogKioskId != null\n ? kiosks.find((item) => item.id === selectedCatalogKioskId) ?? null\n : null;\n const catalogKioskPanel = selectedCatalogKiosk ? (\n <CatalogKioskForm\n kiosk={selectedCatalogKiosk}\n shapeOptions={catalogKioskShapeOptions(workingDraft.shapes)}\n assignedShapeId={shapeIdForCatalogKiosk(\n selectedCatalogKiosk.id,\n workingDraft.assignments,\n )}\n canEdit={canEdit}\n onAssign={(shapeId) =>\n handleLinkCatalogKiosk(selectedCatalogKiosk.id, shapeId)\n }\n />\n ) : null;\n\n const handleCameraChange = useCallback(\n (view: CameraViewSnapshot) => {\n if (section !== 'map-responsiveness' || activeLevelId == null) return;\n const fields = poseToResponsiveFields({\n zoom: view.zoom,\n position: view.position,\n target: view.target,\n });\n setPendingResponsive((prev) => ({\n ...prev,\n [responsiveSlotKey(activeLevelId, responsiveDevice)]: {\n levelId: activeLevelId,\n device: responsiveDevice,\n camera: fields.camera,\n controls: fields.controls,\n },\n }));\n },\n [activeLevelId, responsiveDevice, section],\n );\n\n const handleCameraReset = useCallback(() => {\n if (activeLevelId == null) return;\n setPendingResponsive((prev) => ({\n ...prev,\n [responsiveSlotKey(activeLevelId, responsiveDevice)]:\n emptyResponsiveOverrideInput(activeLevelId, responsiveDevice),\n }));\n }, [activeLevelId, responsiveDevice]);\n\n const toolGroup = section === 'wayfinding' ? 'route' : section === 'edit-map' ? 'map' : undefined;\n\n return (\n <div className={`eyeon-map-editor eyeon-map-editor--${host} ${className ?? ''}`}>\n {showMapOptions ? (\n <LeftRail\n section={section}\n onSectionChange={handleSectionChange}\n draft={workingDraft}\n activeLevelId={activeLevelId}\n selectedShapeId={selectedShapeId}\n selectedShapeIds={selectedShapeIds}\n onSelectShape={handleSelectShape}\n onHoverShape={setHoveredShapeId}\n onListFocus={() => setListFocusNonce((n) => n + 1)}\n retailers={retailers}\n kiosks={kiosks}\n selectedCatalogKioskId={selectedCatalogKioskId}\n onSelectCatalogKiosk={setSelectedCatalogKioskId}\n canFloors={canFloors}\n canSettings={canSettings}\n canResponsiveness={canResponsiveness}\n onImportSvg={onImportSvg}\n onCreateLevel={\n onCreateLevel\n ? async (input) => {\n markReturnToFloorsList(draft.mapId);\n try {\n const id = await onCreateLevel(input);\n setSection('floors');\n clearReturnToFloorsList(draft.mapId);\n return id;\n } catch (error) {\n clearReturnToFloorsList(draft.mapId);\n throw error;\n }\n }\n : undefined\n }\n onUpdateLevel={onUpdateLevel}\n onDeleteLevel={onDeleteLevel}\n onReorderLevels={onReorderLevels}\n onAutoroute={onAutoroute}\n theme={theme}\n onThemeChange={(partial) => {\n if (!canSettings) return;\n queueOp(\n { op: 'update_theme', theme: { ...workingDraft.theme, ...partial } },\n 'none',\n );\n }}\n footer={sidebarFooter}\n catalogKioskPanel={catalogKioskPanel}\n onUseClassicMap={host === 'PORTAL' ? onUseClassicMap : undefined}\n assignPanel={assignPanel}\n editMapPanel={\n <>\n {toolHint(tool, 'map') ? (\n <p className=\"eyeon-map-rail__hint\">{toolHint(tool, 'map')}</p>\n ) : null}\n {assignPanel}\n </>\n }\n wayfindingPanel={\n <>\n {outdoorViewOnly ? (\n <p className=\"eyeon-map-rail__hint\">\n Outdoor is view-only in Wayfinding. Switch to a floor to edit routes.\n </p>\n ) : toolHint(tool, 'route') ? (\n <p className=\"eyeon-map-rail__hint\">{toolHint(tool, 'route')}</p>\n ) : null}\n <div className=\"eyeon-map-rail__tool-extras\">\n <div className=\"eyeon-map-rail__stat\">\n {levelAnchors.length} path points · {levelEdges.length} connections\n </div>\n {canFloors && activeLevelId != null && !outdoorViewOnly && (\n <div className=\"eyeon-map-rail__actions\">\n <button type=\"button\" onClick={() => onAutoroute?.(activeLevelId)}>\n Suggest walking paths\n </button>\n </div>\n )}\n </div>\n </>\n }\n mapResponsivenessPanel={\n <p className=\"eyeon-map-rail__hint\">\n Pan and zoom the map for each floor and device. Reset fits the\n whole floor so you can start from the default view. Save Changes\n stores that starting view for Admin Portal, website, and kiosk.\n </p>\n }\n />\n ) : null}\n\n <div className=\"eyeon-map-editor__center\">\n <div className=\"eyeon-map-editor__toolbar\">\n <div className=\"eyeon-map-editor__tools\">\n {isResponsiveness ? (\n <div className=\"eyeon-map-editor__device-tabs\" role=\"tablist\" aria-label=\"Device\">\n {RESPONSIVE_DEVICE_TABS.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={responsiveDevice === tab.id}\n className={\n responsiveDevice === tab.id\n ? 'eyeon-map-editor__device-tab is-active'\n : 'eyeon-map-editor__device-tab'\n }\n onClick={() => setResponsiveDevice(tab.id)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n ) : isEditMap ? (\n <EditorToolButtons\n tool={tool}\n onToolChange={handleToolChange}\n canEdit={canDrawOnCanvas}\n group={toolGroup}\n />\n ) : null}\n </div>\n <div className=\"eyeon-map-editor__toolbar-side\">\n {isEditMap ? (\n <GridPrefsControl\n gridOpacity={gridOpacity}\n onChange={handleGridPrefsChange}\n />\n ) : null}\n <div className=\"eyeon-map-editor__actions\">\n {isEditMap ? (\n <EditorHistoryButtons\n canUndo={history.past.length > 0 || routeDraftActive}\n canRedo={history.future.length > 0}\n disabled={!canEdit || saving}\n onUndo={undo}\n onRedo={redo}\n />\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-editor__discard\"\n aria-label=\"Discard Changes\"\n onClick={() => void handleDiscardChanges()}\n disabled={!canPersist}\n >\n Discard Changes\n </button>\n <button\n type=\"button\"\n className=\"eyeon-map-editor__save\"\n aria-label={dirty ? 'Save Changes (unsaved edits)' : 'Save Changes'}\n onClick={() => void handleSaveChanges()}\n disabled={!canPersist}\n >\n {dirty ? (\n <span className=\"eyeon-map-editor__save-badge\" aria-hidden=\"true\" />\n ) : null}\n {saving ? 'Saving…' : 'Save Changes'}\n </button>\n </div>\n </div>\n </div>\n\n {centerSurface === 'viewer' ? (\n <PreviewOverlay\n key={previewEpoch}\n document={compiledPreview}\n host={isResponsiveness ? 'WEBSITE' : 'PORTAL_ASSIGN'}\n selectedShapeId={isResponsiveness ? null : selectedShapeId}\n selectedShapeIds={isResponsiveness ? [] : selectedShapeIds}\n hoveredShapeId={isResponsiveness ? null : hoveredShapeId}\n focusNonce={isResponsiveness ? undefined : listFocusNonce}\n onSelectShape={isResponsiveness ? undefined : handleSelectShape}\n activeLevelId={activeLevelId}\n onActiveLevelChange={setActiveLevelId}\n routeOnSelect={false}\n imageProxyUrl={imageProxyUrl}\n device={isResponsiveness ? responsiveDevice : undefined}\n captureCamera={isResponsiveness}\n onCameraChange={isResponsiveness ? handleCameraChange : undefined}\n onCameraReset={isResponsiveness ? handleCameraReset : undefined}\n />\n ) : (\n <>\n <div className=\"eyeon-map-editor__canvas-wrap\">\n <EditorCanvas\n ref={canvasRef}\n level={activeLevel}\n shapes={levelShapes.filter((s) => !s.orphanedAt)}\n underlayShapes={outdoorShapes.filter((s) => !s.orphanedAt)}\n openingUnderlayShapes={openingUnderlayShapes}\n anchors={levelAnchors}\n edges={levelEdges}\n assignments={workingDraft.assignments}\n retailers={retailers}\n amenities={workingDraft.amenities}\n theme={theme}\n tool={tool}\n selectedShapeId={selectedShapeId}\n selectedAnchorIds={selectedAnchorIds}\n baseSvgUrl={workingDraft.baseSvgUrl ?? null}\n baseViewbox={outdoorLevel?.sourceViewbox ?? null}\n outdoorSvgUrl={\n outdoorLevel?.sourceSvgUrl ?? workingDraft.baseSvgUrl ?? null\n }\n imageProxyUrl={imageProxyUrl}\n emptyMessage={\n hasBuildingFloors(workingDraft.levels) || outdoorLevel\n ? undefined\n : MAP_NO_FLOORS_MESSAGE\n }\n interactiveOnly={activeLevel?.kind === 'outdoor'}\n showGrid\n gridOpacity={gridOpacity}\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 onDeleteRouteEdge={(edgeId) => {\n if (!canDrawOnCanvas) return;\n const ops = deleteRouteEdgeOps(edgeId, levelEdges);\n if (ops.length) queueOpBatch(ops);\n const removed = new Set(\n ops\n .filter((op) => op.op === 'delete_anchor')\n .map((op) => op.anchorId),\n );\n if (removed.size) {\n setSelectedAnchorIds((ids) =>\n ids.filter((id) => !removed.has(id)),\n );\n }\n }}\n onEnsureShapeAnchor={(shapeId, point) => {\n if (!canDrawOnCanvas) return null;\n const target = levelShapes.find((item) => item.id === shapeId);\n if (!target) return null;\n const { ops, anchorId } = ensureShapeRouteAnchorOps({\n shape: target,\n anchors: levelAnchors,\n allocId: () => nextTempId.current--,\n point,\n });\n if (ops.length) queueOpBatch(ops);\n setSelectedAnchorIds([anchorId]);\n return anchorId;\n }}\n onConnectShapeToRoute={(shapeId, from, drop, maxDist) => {\n if (!canDrawOnCanvas) return;\n const target = levelShapes.find((item) => item.id === shapeId);\n if (!target) return;\n const ops = connectShapeToRouteOps({\n shape: target,\n anchors: levelAnchors,\n edges: levelEdges,\n mapId: workingDraft.mapId,\n from,\n drop,\n maxDist,\n allocId: () => nextTempId.current--,\n });\n if (ops.length) queueOpBatch(ops);\n }}\n onConnectRouteAnchorToRoute={(anchorId, drop, maxDist) => {\n if (!canDrawOnCanvas) return;\n const anchor = levelAnchors.find((item) => item.id === anchorId);\n if (!anchor) return;\n const ops = connectRouteAnchorToRouteOps({\n anchor,\n anchors: levelAnchors,\n edges: levelEdges,\n mapId: workingDraft.mapId,\n drop,\n maxDist,\n allocId: () => nextTempId.current--,\n });\n if (ops.length) queueOpBatch(ops);\n }}\n onHistoryGestureEnd={endHistoryGesture}\n onMoveAnchor={(anchorId, x, y) => {\n if (!canDrawOnCanvas) return;\n const anchor = levelAnchors.find((a) => a.id === anchorId);\n if (!anchor) return;\n queueOp(\n {\n op: 'upsert_anchor',\n anchor: { ...anchor, x, y },\n },\n 'gesture',\n );\n }}\n onCreateShape={(kind, geometry, extras) => {\n if (!activeLevel || !canDrawOnCanvas) return;\n const key = allocShapeKey(\n kind,\n liveShapeKeysOnLevel(workingDraft.shapes, activeLevel.id),\n );\n const id = queueOp({\n op: 'upsert_shape',\n shape: {\n levelId: activeLevel.id,\n key,\n kind,\n geometry,\n bbox: geometryBBox(geometry),\n origin: 'manual',\n sourceSvgId: null,\n geometryLocked: true,\n label:\n kind === 'entrance'\n ? canonicalizeEntranceLabel({\n kind,\n origin: 'manual',\n sourceSvgId: null,\n label: extras?.label,\n }) ?? extras?.label\n : extras?.label,\n },\n });\n if (id != null) handleSelectShape(id);\n }}\n onUpdateShapeGeometry={handleUpdateShapeGeometry}\n onBatchShapeEdits={(edits) => {\n if (!activeLevel || !canDrawOnCanvas || edits.length === 0) {\n return;\n }\n const ops: BatchOp[] = [];\n let deletedSelected = false;\n const takenKeys = new Set(\n liveShapeKeysOnLevel(workingDraft.shapes, activeLevel.id),\n );\n edits.forEach((edit) => {\n if (edit.action === 'update') {\n const shape = workingDraft.shapes.find(\n (s) => s.id === edit.shapeId,\n );\n if (!shape) return;\n ops.push({\n op: 'upsert_shape',\n shape: {\n id: shape.id,\n levelId: shape.levelId,\n key: shape.key,\n kind: shape.kind,\n geometry: edit.geometry,\n bbox: geometryBBox(edit.geometry),\n geometryLocked: true,\n },\n });\n return;\n }\n if (edit.action === 'create') {\n const style: ShapeStyle | undefined = edit.style;\n const key = allocShapeKey(edit.kind, takenKeys);\n takenKeys.add(key);\n ops.push({\n op: 'upsert_shape',\n shape: {\n levelId: activeLevel.id,\n key,\n kind: edit.kind,\n geometry: edit.geometry,\n bbox: geometryBBox(edit.geometry),\n style,\n origin: 'manual',\n geometryLocked: true,\n },\n });\n return;\n }\n if (edit.shapeId === selectedShapeId) deletedSelected = true;\n ops.push({ op: 'delete_shape', shapeId: edit.shapeId });\n });\n if (ops.length) queueOpBatch(ops);\n if (deletedSelected) {\n const survivor = edits.find((e) => e.action === 'update');\n handleSelectShape(\n survivor && survivor.action === 'update'\n ? survivor.shapeId\n : null,\n );\n }\n }}\n />\n <MapControls\n levels={workingDraft.levels}\n floorOptions={editorFloorControlLevels(section, workingDraft.levels)}\n alwaysShowFloors\n activeLevelId={activeLevelId}\n onActiveLevelChange={handleCanvasLevelChange}\n onZoomIn={() => canvasRef.current?.zoomIn()}\n onZoomOut={() => canvasRef.current?.zoomOut()}\n onReset={() => canvasRef.current?.resetView()}\n />\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n\nexport default MapEditor;\n","import React, { useMemo, useState } from 'react';\nimport type { ImportDiff, ImportDiffItem } from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\n\nexport interface ImportReviewProps {\n diff: ImportDiff;\n viewBoxChanged?: boolean;\n blockedMessage?: string | null;\n busy?: boolean;\n onApply: (payload: {\n acceptAll: boolean;\n remap: Array<{ fromShapeId: number; toSourceSvgId: string }>;\n }) => Promise<void> | void;\n onCancel?: () => void;\n}\n\nfunction bucketLabel(change: ImportDiffItem['change']): string {\n switch (change) {\n case 'added':\n return 'Added';\n case 'removed':\n return 'Orphaned';\n case 'moved':\n return 'Moved';\n case 'kind_changed':\n return 'Kind changed';\n default:\n return 'Unchanged';\n }\n}\n\n/**\n * Outdoor (or floor) re-upload review — shows added / orphaned / locked / drifted\n * buckets before apply. Host wires POST .../import + .../import/apply.\n */\nexport function ImportReviewPanel({\n diff,\n viewBoxChanged = false,\n blockedMessage,\n busy = false,\n onApply,\n onCancel,\n}: ImportReviewProps) {\n const [remap, setRemap] = useState<Record<number, string>>({});\n\n const buckets = useMemo(() => {\n const added = diff.items.filter((i) => i.change === 'added');\n const orphaned = diff.items.filter((i) => i.change === 'removed');\n const locked = diff.items.filter(\n (i) => i.geometryLocked && i.change !== 'removed' && i.change !== 'added',\n );\n const moved = diff.items.filter((i) => i.change === 'moved');\n return { added, orphaned, locked, moved };\n }, [diff.items]);\n\n if (viewBoxChanged) {\n return (\n <div className=\"eyeon-map-import-review\">\n <div className=\"eyeon-map-floors__error\">\n {blockedMessage ??\n 'SVG viewBox changed — restore the original artboard before re-uploading.'}\n </div>\n {onCancel ? (\n <button type=\"button\" onClick={onCancel} disabled={busy}>\n Close\n </button>\n ) : null}\n </div>\n );\n }\n\n return (\n <div className=\"eyeon-map-import-review\">\n <p className=\"eyeon-map-rail__hint\">\n Review changes before applying. Orphaned shapes keep their retailer\n assignments — remap them onto a newly added id if the designer renamed\n a store.\n </p>\n\n {buckets.added.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Added ({buckets.added.length})\n </div>\n {buckets.added.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row\">\n <span>{item.sourceSvgId}</span>\n <span className=\"eyeon-map-rail__muted\">{item.newKind}</span>\n </div>\n ))}\n </section>\n )}\n\n {buckets.orphaned.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Orphaned ({buckets.orphaned.length})\n </div>\n {buckets.orphaned.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row eyeon-map-import-review__remap\">\n <span>{item.sourceSvgId}</span>\n <label className=\"eyeon-map-rail__field\">\n Remap to\n <ModernSelect\n ariaLabel={`Remap ${item.sourceSvgId}`}\n value={remap[item.existingShapeId!] ?? ''}\n disabled={busy || buckets.added.length === 0}\n placeholder=\"Keep orphaned\"\n searchable\n options={[\n { value: '', label: 'Keep orphaned' },\n ...buckets.added.map((a) => ({\n value: a.sourceSvgId,\n label: a.sourceSvgId,\n })),\n ]}\n onChange={(next) =>\n setRemap((prev) => ({\n ...prev,\n [item.existingShapeId!]: next,\n }))\n }\n />\n </label>\n </div>\n ))}\n </section>\n )}\n\n {buckets.locked.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Geometry locked ({buckets.locked.length})\n </div>\n <p className=\"eyeon-map-rail__hint\">\n Portal edits win — kind/style may update, geometry will not.\n </p>\n {buckets.locked.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row\">\n <span>{item.sourceSvgId}</span>\n <span className=\"eyeon-map-rail__muted\">{bucketLabel(item.change)}</span>\n </div>\n ))}\n </section>\n )}\n\n {buckets.moved.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Moved ({buckets.moved.length})\n </div>\n <p className=\"eyeon-map-rail__hint\">\n Centroid drifted — check nearby walking paths after apply.\n </p>\n {buckets.moved.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row\">\n <span>{item.sourceSvgId}</span>\n </div>\n ))}\n </section>\n )}\n\n {diff.items.length === 0 && (\n <p className=\"eyeon-map-rail__hint\">No shape changes detected.</p>\n )}\n\n <div className=\"eyeon-map-rail__actions\">\n {onCancel ? (\n <button type=\"button\" disabled={busy} onClick={onCancel}>\n Cancel\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-floors__primary\"\n disabled={busy}\n onClick={() =>\n void onApply({\n acceptAll: true,\n remap: Object.entries(remap)\n .filter(([, to]) => Boolean(to))\n .map(([from, toSourceSvgId]) => ({\n fromShapeId: Number(from),\n toSourceSvgId,\n })),\n })\n }\n >\n {busy ? 'Applying…' : 'Apply import'}\n </button>\n </div>\n </div>\n );\n}\n"],"names":["isEditorSection","section","portalCenterSurface","host","wayfindingSelectableLevels","levels","floorSwitcherLevels","editMapSelectableLevels","outdoor","level","defaultEditorFloorId","_a","levelIdOnEnterWayfinding","levelIdOnEnterEditMap","levelIdOnEnterDefaultMap","defaultViewerLevelId","editorFloorControlLevels","wayfindingOutdoorReadOnly","emptyEditorHistory","cloneHistorySnapshot","snapshot","op","pushEditorHistory","history","current","undoEditorHistory","restored","redoEditorHistory","isEditableTypingTarget","target","el","tag","isEditorUndoHotkey","isEditorRedoHotkey","key","EDITOR_TOOLS","canPlaceNewRoute","tool","canChainRoute","nextRouteChainAnchor","endAnchorId","ICON_PROPS","SelectIcon","jsx","PanIcon","DrawRectIcon","DrawPolygonIcon","DrawCircleIcon","CurveIcon","jsxs","SplitJoinIcon","DrawTextIcon","DrawEntranceIcon","DrawRouteIcon","CreateRouteIcon","CreateRouteMultiIcon","UndoIcon","RedoIcon","TOOL_ICONS","canSelectShapes","isSplitJoinTool","isPolygonDrawTool","popPolygonDraftPoint","points","isEllipseDrawTool","isShapeDrawTool","isStampDrawTool","canJoinOpenEnds","showsShapeAnchors","showsCurveHandles","emptyCanvasDragPans","nextEditorTool","next","toolHint","group","EditorToolButtons","onToolChange","canEdit","mapTools","t","routeTools","showMap","showRoute","selectTool","routeToolbar","renderButton","Icon","React","EditorHistoryButtons","canUndo","canRedo","disabled","onUndo","onRedo","EPS","vecEq","a","b","eps","cloneVec","p","addVec","subVec","scaleVec","s","lerpVec","edgeCount","ring","edgeFrom","edgeIndex","edgeTo","edgeToPathD","from","to","edge","fmtCoord","n","r","ringFromPolygon","poly","closed","anchors","edges","quadraticToCubic","p0","q","p2","cubicHandlesForPull","pull","mid","offset","chord","cubicPoint","c1","c2","p3","u","splitCubic","c","d","e","ellipticalArcToCubics","rx","ry","xAxisRotationDeg","largeArc","sweep","p1","arx","ary","phi","cosPhi","sinPhi","dx2","dy2","x1p","y1p","lambda","scale","rxSq","rySq","numerator","denominator","factor","cxp","cyp","cx","cy","ux","uy","vx","vy","theta1","deltaTheta","ellipsePoint","theta","cosT","sinT","ellipseDeriv","dx","dy","out","t0","remaining","step","t1","k","start","end","d0","d1","parsePathToRings","tokens","tokenizePathData","rings","x","y","startX","startY","lastCtrl","i","cmd","started","readNum","flush","expected","pushAnchor","isRel","nx","ny","x1","y1","x2","y2","qx","qy","rot","cubics","cubic","ringToPathD","a0","ringsToGeometry","ds","geometry","buildGeometryFromPaths","ARCH_CORNER_RAD","MIN_ARCH_POINTS","MIN_ARCH_BULGE","MIN_ARCH_BULGE_RATIO","MAX_ARCH_BULGE_RATIO","signedTurn","prev","cur","ax","ay","bx","by","runLooksLikeArch","pts","distance","maxDev","side","proj","projectOntoSegment","fitCubicThroughRun","cubicDeviationFromChord","samples","approximateCubic","point","cubicIsRunaway","dev","flattenRunawayCubics","changed","collapseLineRunsToCubics","idx","incoming","outgoing","isSharp","_b","sharp","outA","outE","walk","emitRun","fromW","toW","w","linesOnly","_","last","geometryToRings","fromPaths","pointOnRingEdge","nearestTOnCubic","bestT","bestPt","bestD","clonePolygons","polygons","polygonsToPathD","polygonsToGeometry","cleaned","commitRings","incomingEdgeIndex","anchorIndex","outgoingEdgeIndex","translateGeometry","delta","translateEdge","ringIndex","fromIdx","toIdx","vertexNeighborPoints","polygonIndex","vertexIndex","count","moveVertex","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","constrainOrthogonal","origin","cursor","constrainVertexOrthogonal","neighbors","neighbor","options","option","isSpacePanKey","event","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","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","nextZoomFromWheel","screenPxToWorld","px","pxPerUser","editorHandleScale","sizeZoom","liveZoom","panAfterZoom","nextZoom","world","panKeepingWorldAtUser","EDITOR_ZOOM_ANIM_MS","easeOutCubic","lerp","interpolateView","editorShapeFillOpacity","editorShapeFill","theme","assignment","WALKING_PATH_COLOR","published","resolvedShapeFill","isTransparentPadKind","isTransparentColor","staffPadPlaceholderFill","EDITOR_GUIDE_COLOR","isHoverHighlightShape","INTERACTIVE_SHAPE_KINDS","editorMapCursor","args","editorSelectCursor","editorHoverFillOpacity","base","hovered","editorShapeEmphasisColor","fill","emphasized","darkenShapeFill","liveDisplayRetailer","retailer","wayfindingAssignedOverlay","amenities","displayRetailer","label","publishedShapeLabel","assignmentOverlayVisible","fontSize","DEFAULT_ASSIGNMENT_SIZE","imageUrl","assignmentOverlayImageUrl","iconId","assignmentSpecialIconId","assignmentOverlayRenderSize","resolvedAssignmentIconColor","normalizeLabelAlign","wayfindingAssignedOverlays","input","retailerById","assignmentByShapeId","row","overlays","overlay","wayfindingOverlayHref","imageProxyUrl","resolveFetchUrl","getMapSpecialSvg","mapSpecialSvgToDataUrl","AssignedShapeOverlay","rotate","align","href","transform","AssignedOverlayText","lineHeight","blockHeight","labelSvgTextAnchor","index","OutdoorSvgUnderlay","url","suppressIds","svgText","setSvgText","useState","suppressKey","useMemo","useEffect","cancelled","controller","fetchUrl","res","err","paths","blocked","outdoorDecorationFromSvg","isUnderlayHintShape","isUnderlayDrawnShape","underlaySwitchHint","WAYFINDING_SNAP_PX","WAYFINDING_ANCHOR_HIT_PX","ROUTE_EDGE_CLICK_MS","showsWayfinding","routeMode","routeSessionUndoKind","session","beginOrContinueRouteDraft","draft","routeRubberBand","isWayfindingShape","wayfindingLinksShapes","anchorKindForShape","routeAnchorKindForShape","shapeRoutePoint","anchorHasEdge","anchorId","routeComponentAnchorIds","ids","pending","walkEdgeExists","isSnappableRouteEdge","storeLinkOriginIds","preview","anchor","nearestRouteSnap","excludeIds","maxDist","anchorById","bestJunction","bestEdge","walkEdge","mapId","fromAnchorId","toAnchorId","ensureShapeRouteAnchorOps","allocId","existing","unit","connectShapeToRouteOps","ops","snap","junctionId","nextEdges","source","linkKind","connectRouteAnchorToRouteOps","incident","otherId","link","linkRouteAnchorsOp","insertJunctionOnWalkEdgeOps","levelId","deleteRouteEdgeOps","edgeId","deleteRouteAnchorOps","walkNeighbors","ANCHOR_R_PX","ANCHOR_R_SELECTED_PX","ANCHOR_HIT_PX","ANCHOR_STROKE_PX","SHAPE_ROUTE_ANCHOR_FILL","VERTEX_R_PX","VERTEX_R_SELECTED_PX","VERTEX_HIT_PX","VERTEX_STROKE_PX","HANDLE_R_PX","HANDLE_R_SELECTED_PX","HANDLE_HIT_PX","HANDLE_LINE_PX","HANDLE_LINE_HALO_PX","BEND_R_PX","EDGE_DRAG_PX","SPLIT_JOIN_GAP_PX","SNAP_HIT_PX","rectPolygon","dragSize","screenStrokeStyle","HandleDot","hitR","stroke","strokeWidth","fillOpacity","strokeDasharray","onPointerDown","onPointerEnter","onPointerLeave","onDoubleClick","polygonsToPath","isEditableShape","interactiveOnly","editorCanvasClass","showGrid","editorCanvasStyle","gridOpacity","EditorCanvas","assignments","retailers","selectedShapeId","selectedAnchorIds","baseSvgUrl","baseViewbox","outdoorSvgUrl","levelSvgUrl","underlayShapes","openingUnderlayShapes","readOnly","emptyMessage","onSelectShape","onSelectAnchors","onCreateRoutePoint","onCreateRouteSegment","onLinkRouteAnchors","onInsertRouteJunction","onDeleteRouteAnchor","onDeleteRouteEdge","onConnectShapeToRoute","onConnectRouteAnchorToRoute","onEnsureShapeAnchor","onMoveAnchor","onCreateShape","onUpdateShapeGeometry","onBatchShapeEdits","onHistoryGestureEnd","onRouteDraftActiveChange","ref","ensureMapFont","wayfindingOn","svgRef","useRef","viewGroupRef","canvasRef","setPan","setZoom","viewRef","sizeZoomRef","wheelFrameRef","wheelSettleRef","routeHoverFrameRef","routeHoverClientRef","pendingRouteInsertRef","setPxPerUser","pointersRef","pinchRef","drawing","setDrawing","drawLockCircle","setDrawLockCircle","spaceHeld","setSpaceHeld","spaceHeldRef","axisGuide","setAxisGuide","polygonPoints","setPolygonPoints","dragAnchor","setDragAnchor","dragAnchorPoint","setDragAnchorPoint","lastRouteAnchor","setLastRouteAnchor","routeDraftPoint","setRouteDraftPoint","storeLinkPreview","setStoreLinkPreview","rubberCursor","setRubberCursor","splitJoinPending","setSplitJoinPending","splitJoinHover","setSplitJoinHover","splitJoinSnapEnd","setSplitJoinSnapEnd","polygonSnap","setPolygonSnap","clearRouteSession","stubDrag","setStubDrag","shapeDrag","setShapeDrag","shapeOffset","setShapeOffset","vertexDrag","setVertexDrag","selectedVertex","setSelectedVertex","selectedHandle","setSelectedHandle","hoveredEdge","setHoveredEdge","edgePress","setEdgePress","hoveredShapeId","setHoveredShapeId","hoveredAnchorId","setHoveredAnchorId","routePointerSnap","setRoutePointerSnap","routeHover","underlayTip","setUnderlayTip","panStart","isPanning","setIsPanning","worldPx","syncViewDom","nextPan","g","applyView","cancelWheelWork","paintView","settleWheelView","scheduleWheelPaint","zoomAnimRef","cancelZoomAnim","animateViewTo","targetPan","targetZoom","now","zoomAroundCenter","currentPan","useImperativeHandle","polygon","renderedZoom","useLayoutEffect","viewbox","unionViewBox","svgUnderlayUrl","svgSuppressIds","svgIdsOwnedByShapes","measure","ro","editableShapes","openingShapes","openingClipId","openingHatchId","selectedShape","displayGeometry","splitJoinShapes","polygonAnchorCandidates","nearSplitJoinAnchor","snapPolygonPoint","own","commitSplitJoinEdits","deleted","survivor","tryJoinOpenEnd","endHit","handleSplitJoinAt","endTol","edgeTol","edgeHit","toWorld","moveUnderlayTip","insertAnchorOnEdge","beginEdgePress","insertAt","deleteShapeAnchor","beginSplitJoinVertexDrag","vertexHit","deleteShapeHandle","hoverEdgeAt","connectedAnchorIds","routeAnchorDegreeById","degree","dragRouteExcludeIds","dragRouteSnap","displayAnchorById","dragged","routeEdgePath","assignedOverlays","cancelRouteHoverFrame","scheduleRouteHover","client","closePolygon","onKey","down","node","onWheel","beginPinch","onCanvasPointerDownCapture","beginPan","onCanvasPointerMoveCapture","onCanvasPointerUpCapture","wasPinching","fromEmptySelect","captureNode","insertHoveredRoutePoint","created","cancelPendingRouteInsert","flushPendingRouteInsert","schedulePendingRouteInsert","removeWayfindingEdge","orphans","removeWayfindingAnchor","snapped","constrained","placed","storeExclude","DEFAULT_ENTRANCE_SIZE","_c","handleHit","_e","_d","midHit","_g","_f","handleTol","_i","_h","onPointerMove","screenMove","snapTol","finishRect","finishEllipse","onPointerUp","endedPan","moved","pathDFromGeometry","shapePathD","stubExcludeIds","stubSnap","lastRoutePoint","routeRubberSnap","highlightedRouteEdgeId","highlightedRouteEdge","highlightedRouteFrom","highlightedRouteTo","routePlusAt","rubberFrom","rubberTo","rubberBand","polygonFollow","polygonClose","pendingId","hoverId","hintable","publishedFill","highlightable","selected","dragging","textLabel","entranceIcon","stamp","beginShapePointerDown","worldAt","hoverHandlers","iconUrl","entranceIconDataUrl","emphasisStroke","textX","labelAlignX","baseOpacity","opening","emphasisFill","ri","items","ei","strokeD","clickRing","plus","h1","h2","vi","shapeNode","connected","displayAnchor","dragConnect","nearWeld","visR","hideOnAnchor","Fragment","editorShouldWarnOnLeave","state","applyBeforeUnloadWarning","shouldWarn","beforeUnloadTargets","frame","targets","top","FAMILY_PREFIXES","normalizeId","value","parseConnectorSourceId","raw","family","direction","role","groupParts","part","guessConnectorKind","connectorIdForShape","shapeId","connectorForShape","connectors","resolvedConnectorKind","railConnectorShapes","landingAnchor","shapeLandingPoint","geometryCentroid","inferTravelDirection","fromLevelIndex","toLevelIndex","hint","defaultConnectorName","parsed","nearestWalkAnchor","bestDist","memberShapeIds","connectorId","partnerShapesForConnector","connector","levelsWithLandings","landings","escalatorDirectedEnds","memberAnchors","memberIds","ride","fromAnchor","toAnchor","floorName","landingRideId","groupEscalatorRides","rides","directed","members","escalatorRideLandingLines","connectorRideLabel","partners","order","ai","bi","connectorEdgesBetween","anchorIds","ensureLanding","linkLandingToWalk","landing","applyUnlinkLocal","unlinkConnectorOps","buildUnlinkConnectorOps","buildEscalatorLinkOps","fromShape","toShape","fromLevel","l","toLevel","name","existingFrom","existingTo","v","buildElevatorShaftOps","memberShapes","existingIds","keepId","geometryBbox","bboxOf","shapeKeyTakenOnLevel","upsertById","rows","copy","applyDraftOp","mergeEntranceAwareLabel","parseShapeAssignment","rest","removed","omitLevelFromDraft","removedShapeIds","removedAnchorIds","liveConnectorIds","applyDraftOps","seeded","healDraftGeometry","normalizeGeometrySpace","canonicalizeEntranceLabel","geometryChanged","labelChanged","coalesceDraftOp","acc","BATCH_PERSIST_RANK","edgePairKey","compactRouteOpsForPersist","deletedEdgeIds","deletedAnchorIds","upsertedEdgeIds","upsertedAnchorIds","ephemeralAnchorIds","lastIndexByPair","winner","winnerOp","sortBatchOps","rank","orderBatchOpsForPersist","FieldResetIcon","FieldResetButton","onClick","normalizeHexColor","match","hex","ch","hexColorInputValue","sameHexColor","StepperRow","onChange","onStep","onHoldStart","onHoldEnd","setDraft","focused","syncDraft","commitDraft","persistIncomplete","commitAssignNumberDraft","assignNumberFromDraft","ColorSwatch","swatch","fallback","emptyIsTransparent","onHexChange","onCommit","onPick","lastSolid","transparent","solid","pickerValue","ColorRow","onReset","display","TRANSPARENT_COLOR","setHex","commit","normalized","ALIGN_TOOLTIPS","AlignLeftIcon","AlignCenterIcon","AlignRightIcon","ALIGN_ICONS","AlignRow","LABEL_ALIGNS","RotateIcon","nextQuarterTurn","remainder","stepWholeNumber","AssignmentStyleFields","form","storeDefaultColor","storeTextColor","textColorLabel","showTextColor","onPatch","formRef","intervals","bump","startHold","stopHold","offsetX","offsetY","bgColor","textColor","connectorStyleAssignment","emptyShapeAssignment","ConnectorAssign","railKind","onApplyOps","onSaveAssignment","partner","levelName","exitFloorId","setExitFloorId","targetId","setTargetId","stopFloorId","setStopFloorId","styleForm","setStyleForm","styleFormRef","patchStyle","useCallback","partial","exitFloors","landingsOnExitFloor","addable","addFloors","landingsOnStopFloor","applyEscalator","applyElevator","nextMembers","pickExitLanding","nextId","pickElevatorStop","landingOptions","linked","connectorSpecialIconDataUrl","ModernSelect","nextFloor","assignmentPadFillFallback","SHAPE_KIND_LABELS","EDITOR_TYPE_KINDS","TOOL_ONLY_KINDS","inspectorShowsType","inspectorTypeKinds","shapeKindLabel","ASSIGNABLE_SHAPE_KINDS","isAssignableKind","isStoreShapeKind","isRetailerAssigned","isAmenityAssigned","isKioskAssigned","isPolygonAssigned","assignmentHasTarget","railAssignmentGroups","byShape","stores","kiosks","unassignedStores","unassignedAmenities","unassignedKiosks","custom","unassignedCustom","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","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","list","listRect","lineTop","hasExistingSvg","showEditPreview","previewUrl","previewFallback","importedCount","showReimportNotice","primaryLabel","primaryBusyLabel","createPortal","BackIcon","ChevronIcon","NAV_ICON_PROPS","FloorsNavIcon","StoresNavIcon","AmenitiesNavIcon","KiosksNavIcon","EscalatorsNavIcon","ElevatorsNavIcon","SettingsNavIcon","CustomNavIcon","UnassignedNavIcon","EditMapNavIcon","WayfindingNavIcon","MapResponsivenessNavIcon","RAIL_NAV","HIDDEN_SECTION_TITLES","isRailNavSeparator","entry","railSectionTitle","HOUSE_OUTDOOR_THEME","staticLayerThemeDefaults","OUTDOOR_COLOR_FIELDS","SettingsField","children","ColorField","LeftRail","onSectionChange","activeLevelId","selectedShapeIds","onHoverShape","onListFocus","canSettings","canResponsiveness","onAutoroute","onThemeChange","assignPanel","catalogKioskPanel","selectedCatalogKioskId","onSelectCatalogKiosk","editMapPanel","wayfindingPanel","mapResponsivenessPanel","footer","onUseClassicMap","floorsScreen","setFloorsScreen","assigned","storeShapes","amenityShapes","kioskShapes","unassignedStoreShapes","unassignedAmenityShapes","unassignedKioskShapes","unassignedShapes","customShapes","unassignedCustomShapes","escalatorShapes","elevatorShapes","unlinkedEscalators","escalatorRides","linkedElevators","unlinkedElevators","assignmentById","counts","duplicate","retailerOptionLabel","amenityById","kioskById","assignedNameFor","catalogName","fromType","getAmenityByType","amenityAssignedName","kioskAssignedName","activeLevel","pathCount","selectedIds","isShapeSelected","selectedCatalogKiosk","showingCatalogKiosk","showingItemOptions","itemOptionsTitle","linkedId","selectShapeFromList","leftoverKiosks","renderShapeList","empty","opts","renderEscalatorRideList","active","renderAssignedUnassigned","assignedList","unassignedList","kindLabelFor","connectorIcon","house","DEFAULT_THEME","customized","clampStoreRadius","clampRouteThickness","CatalogKioskForm","shapeOptions","assignedShapeId","onAssign","hasShape","SHAPE_KEY_PREFIX","SHAPE_KEY_ALPHABET","SHAPE_KEY_SUFFIX_LENGTH","shapeKeyPrefix","randomShapeKeySuffix","length","bytes","liveShapeKeysOnLevel","copyDestinationLevels","currentLevelId","allocShapeKey","taken","suffix","prefix","cloneShapeGeometry","path","copyShapeToLevelOps","targetLevelId","RETAIL_LAYER_TYPES","AssignForm","amenityIconColor","kioskIconColor","onClear","setForm","patch","nameCounts","retailerOptions","amenityOptions","amenityAssignOptions","selectedAmenityType","amenityTypeFromCatalogId","kioskCatalogName","textColorFallback","assignmentIconThemeFallback","hasAssignment","retailerId","layerType","DEFAULT_LABEL_ALIGN","isHttpImageUrl","amenityId","amenityCatalogIdForType","KioskNameField","trimmed","BulkAssignForm","common","bulkAssignFormState","assignableShapes","iconOnly","uniqueKinds","bgColorFallback","BulkSizeRow","BulkColorRow","emitIfComplete","mixed","Chevron","CopyToLevelButton","destinations","onCopyToLevel","listId","useId","buttonRef","menuRef","setOpen","menuPos","setMenuPos","close","updateMenuPos","spaceBelow","spaceAbove","maxHeight","openAbove","destinationKey","onDoc","menu","nextError","MIN_ICON_SIZE","EntranceIconForm","setSize","setRotate","sizeRef","rotateRef","nextSize","nextRotate","MIN_FONT_SIZE","TextLabelForm","setText","textFocused","nextText","Inspector","levelShapeKeys","showAssignment","emptyHint","onRename","onChangeKind","onChangeLevel","onDelete","onClearAssignment","onUpdateLabel","selectedShapes","selectedAssignments","onBulkAssign","setKey","keyError","setKeyError","levelError","setLevelError","commitRename","copyDestinations","copyButton","PreviewOverlay","document","focusNonce","onActiveLevelChange","routeOnSelect","device","captureCamera","onCameraChange","onCameraReset","Suspense","MapViewer","nextSelectedShapeIds","compileEditorPreview","compileDocument","memory","MAX_REMEMBERED_MAPS","storageKey","dropLegacyStorage","markEditorSection","oldest","peekEditorSection","clearEditorSection","storage","markReturnToFloorsList","consumeReturnToFloorsList","stored","clearReturnToFloorsList","MAX_GRID_OPACITY","DEFAULT_GRID_OPACITY","clampGridOpacity","gridOpacityFromSlider","percent","sliderPercentFromGridOpacity","opacity","GridPrefsControl","prefsFromInput","MapEditor","onBatch","onPublish","onSaveResponsive","onDiscard","onImportSvg","previewDocument","className","sidebarFooter","onDirtyChange","gridOpacityProp","onGridPrefsChange","restoredSection","setSection","responsiveDevice","setResponsiveDevice","pendingResponsive","setPendingResponsive","previewEpoch","setPreviewEpoch","setActiveLevelId","restoredLevel","setSelectedShapeIds","setSelectedCatalogKioskId","listFocusNonce","setListFocusNonce","setSelectedAnchorIds","setTool","setGridOpacity","editVersion","setEditVersion","needsPublish","setNeedsPublish","saving","setSaving","setHistory","routeDraftActive","setRouteDraftActive","historyRef","pendingOps","nextTempId","historyGestureRef","showMapOptions","centerSurface","isEditMap","historyMetaRef","handleGridPrefsChange","prefs","workingDraft","mergeTheme","cameraDirty","pendingEdits","dirty","warnOnLeave","warnOnLeaveRef","onBeforeUnload","canPersist","isResponsiveness","outdoorViewOnly","canDrawOnCanvas","outdoorLevel","outdoorShapes","levelShapes","levelsWithShapes","lvl","lower","nextLowerBuildingFloor","mergedResponsiveOverrides","mergeResponsiveOverrides","compiledPreview","levelAnchors","levelEdges","anchorsById","selectedAssignment","takeSnapshot","applySnapshot","recordHistoryStep","mode","queueOp","historyMode","endHistoryGesture","undo","redo","handleSaveChanges","cameraItems","persisted","savedCamera","responsiveSlotKey","handleDiscardChanges","handleSectionChange","handleCanvasLevelChange","nextLevel","handleSelectShape","additive","nextLevelId","viewerLevelIdAfterShapeSelect","connectorKind","handleToolChange","resolved","handleRenameShape","handleChangeLevel","queueOpBatch","handleCopyToLevel","copied","handleDeleteShape","handleUpdateShapeGeometry","handleUpdateLabel","nextLabel","handleChangeKind","handleSaveAssignment","visuals","assignmentVisualPatch","handleClearAssignment","handleLinkCatalogKiosk","previousShapeId","clearShape","handleBulkAssign","patched","applyBulkAssignPatch","selectedConnectorKind","connectorRailKind","handleCameraChange","view","fields","poseToResponsiveFields","handleCameraReset","emptyResponsiveOverrideInput","toolGroup","RESPONSIVE_DEVICE_TABS","tab","hasBuildingFloors","MAP_NO_FLOORS_MESSAGE","id1","id2","prevAnchorId","deletedSelected","takenKeys","edit","style","MapControls","bucketLabel","change","ImportReviewPanel","diff","viewBoxChanged","blockedMessage","onApply","onCancel","remap","setRemap","buckets","added","orphaned","locked","toSourceSvgId"],"mappings":"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"}