@eyeon/map 2.0.0 → 2.0.2

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 (96) hide show
  1. package/README.md +18 -1
  2. package/dist/assets/MapViewer.css +1 -1
  3. package/dist/assets/index.css +1 -1
  4. package/dist/chunks/MapViewer.js +1745 -356
  5. package/dist/chunks/MapViewer.js.map +1 -1
  6. package/dist/chunks/stacking.js +1321 -0
  7. package/dist/chunks/stacking.js.map +1 -0
  8. package/dist/core/geometry/index.d.ts +41 -4
  9. package/dist/core/geometry/index.d.ts.map +1 -1
  10. package/dist/core/hostChrome.d.ts +20 -0
  11. package/dist/core/hostChrome.d.ts.map +1 -0
  12. package/dist/core/import/index.d.ts +48 -3
  13. package/dist/core/import/index.d.ts.map +1 -1
  14. package/dist/core/import/svgStyle.d.ts +21 -0
  15. package/dist/core/import/svgStyle.d.ts.map +1 -0
  16. package/dist/core/import/svgTransform.d.ts +49 -0
  17. package/dist/core/import/svgTransform.d.ts.map +1 -0
  18. package/dist/core/index.d.ts +3 -0
  19. package/dist/core/index.d.ts.map +1 -1
  20. package/dist/core/index.js +207 -266
  21. package/dist/core/index.js.map +1 -1
  22. package/dist/core/layerStyles.d.ts +28 -0
  23. package/dist/core/layerStyles.d.ts.map +1 -0
  24. package/dist/core/publish/index.d.ts +8 -2
  25. package/dist/core/publish/index.d.ts.map +1 -1
  26. package/dist/core/routing/graph-tools.d.ts +5 -1
  27. package/dist/core/routing/graph-tools.d.ts.map +1 -1
  28. package/dist/core/stacking.d.ts +61 -0
  29. package/dist/core/stacking.d.ts.map +1 -0
  30. package/dist/core/types.d.ts +27 -0
  31. package/dist/core/types.d.ts.map +1 -1
  32. package/dist/editor/MapEditor.d.ts +28 -16
  33. package/dist/editor/MapEditor.d.ts.map +1 -1
  34. package/dist/editor/canvas/EditorCanvas.d.ts +15 -3
  35. package/dist/editor/canvas/EditorCanvas.d.ts.map +1 -1
  36. package/dist/editor/canvas/coords.d.ts +21 -0
  37. package/dist/editor/canvas/coords.d.ts.map +1 -0
  38. package/dist/editor/draftOps.d.ts +19 -0
  39. package/dist/editor/draftOps.d.ts.map +1 -0
  40. package/dist/editor/geometryEdit.d.ts +34 -0
  41. package/dist/editor/geometryEdit.d.ts.map +1 -0
  42. package/dist/editor/index.css +1281 -145
  43. package/dist/editor/index.d.ts +8 -2
  44. package/dist/editor/index.d.ts.map +1 -1
  45. package/dist/editor/index.js +2293 -585
  46. package/dist/editor/index.js.map +1 -1
  47. package/dist/editor/labels.d.ts +5 -0
  48. package/dist/editor/labels.d.ts.map +1 -0
  49. package/dist/editor/panels/FloorsPanel.d.ts +60 -0
  50. package/dist/editor/panels/FloorsPanel.d.ts.map +1 -0
  51. package/dist/editor/panels/ImportReviewPanel.d.ts +22 -0
  52. package/dist/editor/panels/ImportReviewPanel.d.ts.map +1 -0
  53. package/dist/editor/panels/Inspector.d.ts +4 -2
  54. package/dist/editor/panels/Inspector.d.ts.map +1 -1
  55. package/dist/editor/panels/LeftRail.d.ts +19 -6
  56. package/dist/editor/panels/LeftRail.d.ts.map +1 -1
  57. package/dist/editor/panels/PreviewOverlay.d.ts +11 -2
  58. package/dist/editor/panels/PreviewOverlay.d.ts.map +1 -1
  59. package/dist/editor/portalSurface.d.ts +11 -0
  60. package/dist/editor/portalSurface.d.ts.map +1 -0
  61. package/dist/editor/previewDocument.d.ts +9 -0
  62. package/dist/editor/previewDocument.d.ts.map +1 -0
  63. package/dist/editor/tools.d.ts +20 -0
  64. package/dist/editor/tools.d.ts.map +1 -0
  65. package/dist/test-maps/shops-at-south-town/BASE - Shops At South Town.ai +26780 -26
  66. package/dist/test-maps/shops-at-south-town/LF - Shops At South Town.ai +4487 -2
  67. package/dist/test-maps/shops-at-south-town/SVG/BASE - Shops At South Town.svg +567 -0
  68. package/dist/test-maps/shops-at-south-town/SVG/LF - Shops At South Town.svg +238 -0
  69. package/dist/test-maps/shops-at-south-town/SVG/UF - Shops At South Town.svg +276 -0
  70. package/dist/test-maps/shops-at-south-town/UF - Shops At South Town.ai +4228 -1
  71. package/dist/viewer/MapViewer.d.ts +14 -3
  72. package/dist/viewer/MapViewer.d.ts.map +1 -1
  73. package/dist/viewer/camera.d.ts +34 -0
  74. package/dist/viewer/camera.d.ts.map +1 -0
  75. package/dist/viewer/components/CameraRig.d.ts +18 -0
  76. package/dist/viewer/components/CameraRig.d.ts.map +1 -0
  77. package/dist/viewer/components/LevelMeshes.d.ts +6 -1
  78. package/dist/viewer/components/LevelMeshes.d.ts.map +1 -1
  79. package/dist/viewer/components/MapScene.d.ts +6 -1
  80. package/dist/viewer/components/MapScene.d.ts.map +1 -1
  81. package/dist/viewer/components/SvgVectorLayer.d.ts +18 -0
  82. package/dist/viewer/components/SvgVectorLayer.d.ts.map +1 -0
  83. package/dist/viewer/index.css +124 -35
  84. package/dist/viewer/index.d.ts +4 -0
  85. package/dist/viewer/index.d.ts.map +1 -1
  86. package/dist/viewer/index.js +9 -4
  87. package/dist/viewer/index.js.map +1 -1
  88. package/dist/viewer/ui/MapControls.d.ts +14 -0
  89. package/dist/viewer/ui/MapControls.d.ts.map +1 -0
  90. package/dist/viewer/ui/RuntimeChrome.d.ts +3 -3
  91. package/dist/viewer/ui/RuntimeChrome.d.ts.map +1 -1
  92. package/package.json +17 -7
  93. package/dist/chunks/graph-tools.js +0 -153
  94. package/dist/chunks/graph-tools.js.map +0 -1
  95. package/dist/chunks/pathfinding.js +0 -343
  96. package/dist/chunks/pathfinding.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/editor/canvas/EditorCanvas.tsx","../../src/editor/panels/LeftRail.tsx","../../src/editor/panels/Inspector.tsx","../../src/editor/panels/PreviewOverlay.tsx","../../src/editor/MapEditor.tsx"],"sourcesContent":["import React, { useMemo, useRef, useState } from 'react';\nimport type {\n CmAnchor,\n CmLevel,\n CmRouteEdge,\n CmShape,\n CmShapeAssignment,\n ShapeGeometry,\n ShapeKind,\n ThemeDefaults,\n Vec2,\n} from '../../core';\nimport { snapAngle } from '../../core';\n\nexport interface EditorCanvasProps {\n level: CmLevel | null;\n shapes: CmShape[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n assignments: CmShapeAssignment[];\n theme: ThemeDefaults;\n tool: 'select' | 'draw-unit' | 'draw-route' | 'pan';\n baseAngle: number;\n selectedShapeId: number | null;\n selectedAnchorIds: number[];\n baseSvgUrl: string | null;\n onSelectShape: (id: number | null) => void;\n onSelectAnchors: (ids: number[]) => void;\n onCreateRoutePoint: (point: Vec2, prevAnchorId: number | null) => void;\n onMoveAnchor: (anchorId: number, x: number, y: number) => void;\n onCreateShape: (kind: ShapeKind, geometry: ShapeGeometry) => void;\n}\n\nfunction polygonsToPath(polygons: Vec2[][]): string {\n return polygons\n .map((poly) => {\n if (poly.length === 0) return '';\n let d = `M ${poly[0].x} ${poly[0].y}`;\n for (let i = 1; i < poly.length; i++) d += ` L ${poly[i].x} ${poly[i].y}`;\n d += ' Z';\n return d;\n })\n .join(' ');\n}\n\nexport function EditorCanvas({\n level,\n shapes,\n anchors,\n edges,\n theme,\n tool,\n baseAngle,\n selectedShapeId,\n selectedAnchorIds,\n baseSvgUrl,\n onSelectShape,\n onSelectAnchors,\n onCreateRoutePoint,\n onMoveAnchor,\n onCreateShape,\n}: EditorCanvasProps) {\n const svgRef = useRef<SVGSVGElement>(null);\n const [pan, setPan] = useState({ x: 0, y: 0 });\n const [zoom, setZoom] = useState(1);\n const [drawing, setDrawing] = useState<Vec2[]>([]);\n const [dragAnchor, setDragAnchor] = useState<number | null>(null);\n const [lastRouteAnchor, setLastRouteAnchor] = useState<number | null>(null);\n const panStart = useRef<{ x: number; y: number; panX: number; panY: number } | null>(null);\n\n const viewbox = level?.sourceViewbox ?? { x: 0, y: 0, width: 1000, height: 800 };\n\n const toWorld = (clientX: number, clientY: number): Vec2 => {\n const svg = svgRef.current;\n if (!svg) return { x: 0, y: 0 };\n const rect = svg.getBoundingClientRect();\n const x = (clientX - rect.left - pan.x) / zoom;\n const y = (clientY - rect.top - pan.y) / zoom;\n return { x: x + viewbox.x, y: y + viewbox.y };\n };\n\n const anchorById = useMemo(\n () => new Map(anchors.map((a) => [a.id, a])),\n [anchors],\n );\n\n const onPointerDown = (e: React.PointerEvent) => {\n if (tool === 'pan' || e.button === 1) {\n panStart.current = { x: e.clientX, y: e.clientY, panX: pan.x, panY: pan.y };\n return;\n }\n const world = toWorld(e.clientX, e.clientY);\n if (tool === 'draw-route') {\n const snapped = lastRouteAnchor\n ? snapAngle(anchorById.get(lastRouteAnchor) ?? world, world, baseAngle)\n : world;\n onCreateRoutePoint(snapped, lastRouteAnchor);\n return;\n }\n if (tool === 'draw-unit') {\n setDrawing([world]);\n }\n };\n\n const onPointerMove = (e: React.PointerEvent) => {\n if (panStart.current) {\n setPan({\n x: panStart.current.panX + (e.clientX - panStart.current.x),\n y: panStart.current.panY + (e.clientY - panStart.current.y),\n });\n return;\n }\n if (dragAnchor != null) {\n const world = toWorld(e.clientX, e.clientY);\n onMoveAnchor(dragAnchor, world.x, world.y);\n return;\n }\n if (tool === 'draw-unit' && drawing.length > 0) {\n const world = toWorld(e.clientX, e.clientY);\n setDrawing((d) => [...d.slice(0, -1), d[d.length - 1], world].slice(0, -0) || [...d.slice(0, -1), world]);\n // keep last point updating\n setDrawing((prev) => {\n if (prev.length === 0) return prev;\n return [...prev.slice(0, -1), world];\n });\n }\n };\n\n const onPointerUp = () => {\n panStart.current = null;\n if (dragAnchor != null) {\n // weld hint: select nearby anchors after drop\n const moved = anchors.find((a) => a.id === dragAnchor);\n if (moved) {\n const near = anchors\n .filter((a) => a.id !== moved.id)\n .filter((a) => Math.hypot(a.x - moved.x, a.y - moved.y) <= 2.5)\n .map((a) => a.id);\n if (near.length) onSelectAnchors([moved.id, ...near]);\n }\n setDragAnchor(null);\n }\n };\n\n const finishPolygon = () => {\n if (drawing.length < 3) {\n setDrawing([]);\n return;\n }\n const geometry: ShapeGeometry = {\n paths: [\n {\n d: polygonsToPath([drawing]),\n closed: true,\n },\n ],\n polygons: [drawing],\n };\n onCreateShape('unit', geometry);\n setDrawing([]);\n };\n\n return (\n <div\n className=\"eyeon-map-canvas\"\n onWheel={(e) => {\n e.preventDefault();\n setZoom((z) => Math.min(8, Math.max(0.2, z * (e.deltaY > 0 ? 0.9 : 1.1))));\n }}\n >\n <svg\n ref={svgRef}\n className=\"eyeon-map-canvas__svg\"\n viewBox={`${viewbox.x} ${viewbox.y} ${viewbox.width} ${viewbox.height}`}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onDoubleClick={() => {\n if (tool === 'draw-unit') finishPolygon();\n }}\n >\n <g transform={`translate(${pan.x / zoom}, ${pan.y / zoom}) scale(${zoom})`}>\n {baseSvgUrl && (\n <image\n href={baseSvgUrl}\n x={viewbox.x}\n y={viewbox.y}\n width={viewbox.width}\n height={viewbox.height}\n opacity={0.85}\n />\n )}\n\n {shapes.map((shape) => (\n <path\n key={shape.id}\n d={\n shape.geometry.paths.map((p) => p.d).join(' ') ||\n polygonsToPath(shape.geometry.polygons)\n }\n fill={\n shape.style.fill ??\n (shape.kind === 'walkable'\n ? theme.WALKABLE_COLOR\n : shape.kind === 'unit'\n ? theme.STORE_DEFAULT_COLOR\n : '#cbd5e1')\n }\n fillOpacity={shape.kind === 'amenity' ? 0.15 : 0.85}\n stroke={selectedShapeId === shape.id ? theme.ACCENT_COLOR : '#64748b'}\n strokeWidth={selectedShapeId === shape.id ? 2.5 / zoom : 1 / zoom}\n onClick={(e) => {\n e.stopPropagation();\n if (tool === 'select') onSelectShape(shape.id);\n }}\n style={{ cursor: tool === 'select' ? 'pointer' : 'default' }}\n />\n ))}\n\n {edges.map((edge) => {\n const a = anchorById.get(edge.fromAnchorId);\n const b = anchorById.get(edge.toAnchorId);\n if (!a || !b) return null;\n return (\n <line\n key={edge.id}\n x1={a.x}\n y1={a.y}\n x2={b.x}\n y2={b.y}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={2 / zoom}\n strokeLinecap=\"round\"\n />\n );\n })}\n\n {anchors.map((anchor) => {\n const selected = selectedAnchorIds.includes(anchor.id);\n const nearWeld =\n selected &&\n selectedAnchorIds.some((id) => {\n if (id === anchor.id) return false;\n const other = anchorById.get(id);\n return other && Math.hypot(other.x - anchor.x, other.y - anchor.y) <= 2.5;\n });\n return (\n <circle\n key={anchor.id}\n cx={anchor.x}\n cy={anchor.y}\n r={(selected ? 5 : 3.5) / zoom}\n fill={nearWeld ? '#22c55e' : selected ? theme.ACCENT_COLOR : '#0f172a'}\n stroke=\"#fff\"\n strokeWidth={1 / zoom}\n onPointerDown={(e) => {\n e.stopPropagation();\n if (tool === 'draw-route') {\n setLastRouteAnchor(anchor.id);\n onCreateRoutePoint(anchor, lastRouteAnchor);\n return;\n }\n if (tool === 'select') {\n onSelectAnchors(\n e.shiftKey\n ? selectedAnchorIds.includes(anchor.id)\n ? selectedAnchorIds.filter((id) => id !== anchor.id)\n : [...selectedAnchorIds, anchor.id]\n : [anchor.id],\n );\n setDragAnchor(anchor.id);\n }\n }}\n style={{ cursor: 'grab' }}\n />\n );\n })}\n\n {drawing.length > 1 && (\n <polyline\n points={drawing.map((p) => `${p.x},${p.y}`).join(' ')}\n fill=\"none\"\n stroke={theme.ACCENT_COLOR}\n strokeWidth={2 / zoom}\n strokeDasharray={`${6 / zoom} ${4 / zoom}`}\n />\n )}\n </g>\n </svg>\n {!level && (\n <div className=\"eyeon-map-canvas__empty\">Select or create a level to begin</div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type {\n CmAmenityCatalogItem,\n CmLevel,\n CmBuilding,\n ThemeDefaults,\n} from '../../core';\n\nexport type RailTab =\n | 'levels'\n | 'shapes'\n | 'routes'\n | 'amenities'\n | 'kiosks'\n | 'theme';\n\nexport interface LeftRailDraft {\n buildings: CmBuilding[];\n levels: CmLevel[];\n shapes: Array<{ id: number; levelId: number; key: string; kind: string }>;\n anchors: Array<{ id: number; levelId: number }>;\n edges: Array<{ id: number }>;\n amenities: CmAmenityCatalogItem[];\n}\n\nexport interface LeftRailProps {\n tab: RailTab;\n onTabChange: (tab: RailTab) => void;\n draft: LeftRailDraft;\n activeLevelId: number | null;\n onSelectLevel: (id: number) => void;\n canFloors: boolean;\n canSettings: boolean;\n onImportSvg?: (levelId: number, file: File) => Promise<void>;\n onAutoroute?: (levelId: number) => Promise<void>;\n theme: ThemeDefaults;\n onThemeChange: (partial: Partial<ThemeDefaults>) => void;\n}\n\nconst TABS: Array<{ id: RailTab; label: string }> = [\n { id: 'levels', label: 'Levels' },\n { id: 'shapes', label: 'Shapes' },\n { id: 'routes', label: 'Routes' },\n { id: 'amenities', label: 'Amenities' },\n { id: 'kiosks', label: 'Kiosks' },\n { id: 'theme', label: 'Theme' },\n];\n\nexport function LeftRail({\n tab,\n onTabChange,\n draft,\n activeLevelId,\n onSelectLevel,\n canFloors,\n canSettings,\n onImportSvg,\n onAutoroute,\n theme,\n onThemeChange,\n}: LeftRailProps) {\n return (\n <aside className=\"eyeon-map-rail\">\n <nav className=\"eyeon-map-rail__tabs\">\n {TABS.map((t) => (\n <button\n key={t.id}\n type=\"button\"\n className={tab === t.id ? 'is-active' : ''}\n onClick={() => onTabChange(t.id)}\n >\n {t.label}\n </button>\n ))}\n </nav>\n\n <div className=\"eyeon-map-rail__body\">\n {tab === 'levels' && (\n <div className=\"eyeon-map-rail__section\">\n <div className=\"eyeon-map-rail__heading\">Buildings</div>\n {draft.buildings.map((b) => (\n <div key={b.id} className=\"eyeon-map-rail__group\">\n <div className=\"eyeon-map-rail__group-title\">{b.name}</div>\n {draft.levels\n .filter((l) => l.buildingId === b.id)\n .map((l) => (\n <button\n key={l.id}\n type=\"button\"\n className={\n l.id === activeLevelId\n ? 'eyeon-map-rail__row is-active'\n : 'eyeon-map-rail__row'\n }\n onClick={() => onSelectLevel(l.id)}\n >\n {l.name}\n </button>\n ))}\n </div>\n ))}\n <div className=\"eyeon-map-rail__heading\">Outdoor</div>\n {draft.levels\n .filter((l) => l.kind === 'outdoor')\n .map((l) => (\n <button\n key={l.id}\n type=\"button\"\n className={\n l.id === activeLevelId\n ? 'eyeon-map-rail__row is-active'\n : 'eyeon-map-rail__row'\n }\n onClick={() => onSelectLevel(l.id)}\n >\n {l.name}\n </button>\n ))}\n\n {canFloors && activeLevelId != null && (\n <div className=\"eyeon-map-rail__actions\">\n <label className=\"eyeon-map-rail__file\">\n Import SVG\n <input\n type=\"file\"\n accept=\".svg,image/svg+xml\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file && onImportSvg) void onImportSvg(activeLevelId, file);\n }}\n />\n </label>\n <button type=\"button\" onClick={() => onAutoroute?.(activeLevelId)}>\n Auto-route\n </button>\n </div>\n )}\n </div>\n )}\n\n {tab === 'shapes' && (\n <div className=\"eyeon-map-rail__section\">\n <div className=\"eyeon-map-rail__heading\">\n Shapes ({draft.shapes.filter((s) => s.levelId === activeLevelId).length})\n </div>\n {draft.shapes\n .filter((s) => s.levelId === activeLevelId)\n .map((s) => (\n <div key={s.id} className=\"eyeon-map-rail__row\">\n <span className=\"eyeon-map-rail__muted\">{s.kind}</span> {s.key}\n </div>\n ))}\n </div>\n )}\n\n {tab === 'routes' && (\n <div className=\"eyeon-map-rail__section\">\n <div className=\"eyeon-map-rail__heading\">Anchors / Edges</div>\n <p className=\"eyeon-map-rail__hint\">\n Draw routes on the canvas. Drag anchors onto each other to weld. Green\n highlight means a weld is available.\n </p>\n <div className=\"eyeon-map-rail__stat\">\n {draft.anchors.filter((a) => a.levelId === activeLevelId).length} anchors ·{' '}\n {draft.edges.length} edges\n </div>\n </div>\n )}\n\n {tab === 'amenities' && (\n <div className=\"eyeon-map-rail__section\">\n <div className=\"eyeon-map-rail__heading\">Amenity catalog</div>\n {draft.amenities.map((a) => (\n <div key={a.id} className=\"eyeon-map-rail__row\">\n {a.name}\n <span className=\"eyeon-map-rail__muted\">{a.code}</span>\n </div>\n ))}\n </div>\n )}\n\n {tab === 'kiosks' && (\n <div className=\"eyeon-map-rail__section\">\n <p className=\"eyeon-map-rail__hint\">\n Assign a kiosk_screen shape to a display_kiosks device in the inspector.\n </p>\n </div>\n )}\n\n {tab === 'theme' && canSettings && (\n <div className=\"eyeon-map-rail__section\">\n <div className=\"eyeon-map-rail__heading\">Theme</div>\n <label className=\"eyeon-map-rail__field\">\n Style\n <select\n value={theme.MAP_STYLE}\n onChange={(e) =>\n onThemeChange({ MAP_STYLE: e.target.value as '2D' | '3D' })\n }\n >\n <option value=\"2D\">2D</option>\n <option value=\"3D\">3D</option>\n </select>\n </label>\n {(\n [\n ['ACCENT_COLOR', 'Accent'],\n ['STORE_DEFAULT_COLOR', 'Store fill'],\n ['MAP_BACKGROUND_COLOR', 'Background'],\n ['WALL_COLOR', 'Walls'],\n ['PARKING_ZONE_COLOR', 'Parking'],\n ['GREEN_AREA_COLOR', 'Green'],\n ['WATER_COLOR', 'Water'],\n ] as const\n ).map(([key, label]) => (\n <label key={key} className=\"eyeon-map-rail__field\">\n {label}\n <input\n type=\"color\"\n value={theme[key]}\n onChange={(e) => onThemeChange({ [key]: e.target.value })}\n />\n </label>\n ))}\n </div>\n )}\n </div>\n </aside>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport type {\n CmAmenityCatalogItem,\n CmShape,\n CmShapeAssignment,\n ShapeKind,\n UnitStatus,\n} from '../../core';\n\nconst SHAPE_KINDS: ShapeKind[] = [\n 'unit',\n 'amenity',\n 'kiosk_screen',\n 'connector',\n 'entrance',\n 'walkable',\n 'void',\n 'wall',\n 'boundary',\n 'floorplate',\n 'decor',\n 'label',\n 'zone',\n 'parking_zone',\n 'green_area',\n 'water',\n 'parking_icon',\n];\n\nconst UNIT_STATUSES: UnitStatus[] = [\n 'occupied',\n 'vacant',\n 'coming_soon',\n 'under_renovation',\n];\n\nexport interface InspectorProps {\n shape: CmShape | null;\n assignment: CmShapeAssignment | null;\n amenities: CmAmenityCatalogItem[];\n canEdit: boolean;\n onRename: (key: string) => void;\n onChangeKind: (kind: ShapeKind) => void;\n onSaveAssignment: (assignment: CmShapeAssignment) => void;\n undoCount: number;\n}\n\nexport function Inspector({\n shape,\n assignment,\n amenities,\n canEdit,\n onRename,\n onChangeKind,\n onSaveAssignment,\n undoCount,\n}: InspectorProps) {\n const [key, setKey] = useState(shape?.key ?? '');\n const [retailerId, setRetailerId] = useState<string>(\n assignment?.retailerId?.toString() ?? '',\n );\n const [amenityId, setAmenityId] = useState<string>(\n assignment?.amenityId?.toString() ?? '',\n );\n const [kioskId, setKioskId] = useState<string>(\n assignment?.kioskId?.toString() ?? '',\n );\n const [unitStatus, setUnitStatus] = useState<UnitStatus>(\n assignment?.unitStatus ?? 'vacant',\n );\n const [unitNumber, setUnitNumber] = useState(assignment?.unitNumber ?? '');\n const [customLabel, setCustomLabel] = useState(assignment?.customLabel ?? '');\n\n useEffect(() => {\n setKey(shape?.key ?? '');\n setRetailerId(assignment?.retailerId?.toString() ?? '');\n setAmenityId(assignment?.amenityId?.toString() ?? '');\n setKioskId(assignment?.kioskId?.toString() ?? '');\n setUnitStatus(assignment?.unitStatus ?? 'vacant');\n setUnitNumber(assignment?.unitNumber ?? '');\n setCustomLabel(assignment?.customLabel ?? '');\n }, [shape, assignment]);\n\n if (!shape) {\n return (\n <aside className=\"eyeon-map-inspector\">\n <div className=\"eyeon-map-inspector__empty\">\n Select a shape or anchor\n <div className=\"eyeon-map-rail__muted\">Undo stack: {undoCount}</div>\n </div>\n </aside>\n );\n }\n\n return (\n <aside className=\"eyeon-map-inspector\">\n <div className=\"eyeon-map-inspector__heading\">Shape</div>\n\n <label className=\"eyeon-map-rail__field\">\n Key / ID\n <input\n value={key}\n disabled={!canEdit}\n onChange={(e) => setKey(e.target.value)}\n onBlur={() => {\n if (key && key !== shape.key) onRename(key);\n }}\n />\n </label>\n\n <label className=\"eyeon-map-rail__field\">\n Kind\n <select\n value={shape.kind}\n disabled={!canEdit}\n onChange={(e) => onChangeKind(e.target.value as ShapeKind)}\n >\n {SHAPE_KINDS.map((k) => (\n <option key={k} value={k}>\n {k}\n </option>\n ))}\n </select>\n </label>\n\n <div className=\"eyeon-map-inspector__heading\">Assignment</div>\n\n {(shape.kind === 'unit' || shape.kind === 'parking_zone') && (\n <>\n <label className=\"eyeon-map-rail__field\">\n Retailer ID\n <input\n value={retailerId}\n disabled={!canEdit}\n onChange={(e) => setRetailerId(e.target.value)}\n />\n </label>\n <label className=\"eyeon-map-rail__field\">\n Status\n <select\n value={unitStatus}\n disabled={!canEdit}\n onChange={(e) => setUnitStatus(e.target.value as UnitStatus)}\n >\n {UNIT_STATUSES.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))}\n </select>\n </label>\n <label className=\"eyeon-map-rail__field\">\n Unit number\n <input\n value={unitNumber}\n disabled={!canEdit}\n onChange={(e) => setUnitNumber(e.target.value)}\n />\n </label>\n </>\n )}\n\n {shape.kind === 'amenity' && (\n <label className=\"eyeon-map-rail__field\">\n Amenity\n <select\n value={amenityId}\n disabled={!canEdit}\n onChange={(e) => setAmenityId(e.target.value)}\n >\n <option value=\"\">—</option>\n {amenities.map((a) => (\n <option key={a.id} value={a.id}>\n {a.name}\n </option>\n ))}\n </select>\n </label>\n )}\n\n {shape.kind === 'kiosk_screen' && (\n <label className=\"eyeon-map-rail__field\">\n Kiosk device ID\n <input\n value={kioskId}\n disabled={!canEdit}\n onChange={(e) => setKioskId(e.target.value)}\n />\n </label>\n )}\n\n <label className=\"eyeon-map-rail__field\">\n Custom label\n <input\n value={customLabel}\n disabled={!canEdit}\n onChange={(e) => setCustomLabel(e.target.value)}\n />\n </label>\n\n {canEdit && (\n <button\n type=\"button\"\n className=\"eyeon-map-inspector__save\"\n onClick={() =>\n onSaveAssignment({\n shapeId: shape.id,\n targetType: retailerId\n ? 'retailer'\n : amenityId\n ? 'amenity'\n : kioskId\n ? 'kiosk'\n : 'none',\n retailerId: retailerId ? Number(retailerId) : null,\n amenityId: amenityId ? Number(amenityId) : null,\n kioskId: kioskId ? Number(kioskId) : null,\n unitStatus,\n unitNumber: unitNumber || null,\n customLabel: customLabel || null,\n customImageKey: assignment?.customImageKey ?? null,\n })\n }\n >\n Save assignment\n </button>\n )}\n </aside>\n );\n}\n","import React, { Suspense } from 'react';\nimport type { PublishedDocument } from '../../core';\nimport { MapViewer } from '../../viewer/MapViewer';\n\nexport function PreviewOverlay({ document }: { document: PublishedDocument }) {\n return (\n <div className=\"eyeon-map-preview\">\n <Suspense fallback={<div className=\"eyeon-map-preview__loading\">Loading preview…</div>}>\n <MapViewer document={document} role=\"PORTAL_PREVIEW\" />\n </Suspense>\n </div>\n );\n}\n","import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport type {\n BatchOp,\n CmAmenityCatalogItem,\n CmAnchor,\n CmBuilding,\n CmLevel,\n CmRouteEdge,\n CmShape,\n CmShapeAssignment,\n PublishedDocument,\n ShapeKind,\n ThemeDefaults,\n} from '../core';\nimport { DEFAULT_THEME, snapAngle, weldAnchors } from '../core';\nimport { EditorCanvas } from './canvas/EditorCanvas';\nimport { LeftRail, type RailTab } from './panels/LeftRail';\nimport { Inspector } from './panels/Inspector';\nimport { PreviewOverlay } from './panels/PreviewOverlay';\nimport './editor.css';\n\nexport interface EditorDraftState {\n mapId: number;\n centerId: number;\n theme: Partial<ThemeDefaults>;\n buildings: CmBuilding[];\n levels: CmLevel[];\n shapes: CmShape[];\n assignments: CmShapeAssignment[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n amenities: CmAmenityCatalogItem[];\n baseSvgUrl?: string | null;\n}\n\nexport interface MapEditorProps {\n draft: EditorDraftState;\n webApiURI: string;\n canEdit?: boolean;\n canFloors?: boolean;\n canSettings?: boolean;\n onBatch?: (ops: BatchOp[]) => Promise<void>;\n onPublish?: () => Promise<void>;\n onImportSvg?: (levelId: number, file: File) => Promise<void>;\n onAutoroute?: (levelId: number) => Promise<void>;\n previewDocument?: PublishedDocument | null;\n className?: string;\n}\n\nexport function MapEditor({\n draft,\n canEdit = true,\n canFloors = true,\n canSettings = true,\n onBatch,\n onPublish,\n onImportSvg,\n onAutoroute,\n previewDocument,\n className,\n}: MapEditorProps) {\n const [tab, setTab] = useState<RailTab>('levels');\n const [activeLevelId, setActiveLevelId] = useState<number | null>(\n draft.levels[0]?.id ?? null,\n );\n const [selectedShapeId, setSelectedShapeId] = useState<number | null>(null);\n const [selectedAnchorIds, setSelectedAnchorIds] = useState<number[]>([]);\n const [tool, setTool] = useState<'select' | 'draw-unit' | 'draw-route' | 'pan'>('select');\n const [preview, setPreview] = useState(false);\n const [baseAngle, setBaseAngle] = useState(0);\n const [undoStack, setUndoStack] = useState<BatchOp[][]>([]);\n const pendingOps = useRef<BatchOp[]>([]);\n\n const theme = useMemo(\n () => ({ ...DEFAULT_THEME, ...draft.theme }),\n [draft.theme],\n );\n\n const activeLevel = draft.levels.find((l) => l.id === activeLevelId) ?? null;\n const levelShapes = draft.shapes.filter((s) => s.levelId === activeLevelId);\n const levelAnchors = draft.anchors.filter((a) => a.levelId === activeLevelId);\n const levelEdges = draft.edges.filter((e) => {\n const a = draft.anchors.find((x) => x.id === e.fromAnchorId);\n return a?.levelId === activeLevelId;\n });\n const selectedShape = levelShapes.find((s) => s.id === selectedShapeId) ?? null;\n const selectedAssignment =\n draft.assignments.find((a) => a.shapeId === selectedShapeId) ?? null;\n\n const flushOps = useCallback(\n async (ops: BatchOp[]) => {\n if (!ops.length || !onBatch) return;\n setUndoStack((s) => [...s, ops]);\n await onBatch(ops);\n pendingOps.current = [];\n },\n [onBatch],\n );\n\n const handleWeldSelected = async () => {\n if (selectedAnchorIds.length < 2) return;\n const anchors = levelAnchors.map((a) => ({ ...a }));\n const edges = draft.edges.map((e) => ({ ...e }));\n const result = weldAnchors(anchors, edges, selectedAnchorIds);\n if (!result) return;\n await flushOps([\n {\n op: 'weld_anchors',\n anchorIds: selectedAnchorIds,\n },\n ]);\n setSelectedAnchorIds([result.survivingAnchorId]);\n };\n\n const handleRenameShape = async (key: string) => {\n if (!selectedShape || !canEdit) return;\n await flushOps([\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key,\n kind: selectedShape.kind,\n },\n },\n ]);\n };\n\n const handleChangeKind = async (kind: ShapeKind) => {\n if (!selectedShape || !canEdit) return;\n await flushOps([\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind,\n },\n },\n ]);\n };\n\n return (\n <div className={`eyeon-map-editor ${className ?? ''}`}>\n <LeftRail\n tab={tab}\n onTabChange={setTab}\n draft={draft}\n activeLevelId={activeLevelId}\n onSelectLevel={setActiveLevelId}\n canFloors={canFloors}\n canSettings={canSettings}\n onImportSvg={onImportSvg}\n onAutoroute={onAutoroute}\n theme={theme}\n onThemeChange={async (partial) => {\n if (!canSettings) return;\n await flushOps([{ op: 'update_theme', theme: partial }]);\n }}\n />\n\n <div className=\"eyeon-map-editor__center\">\n <div className=\"eyeon-map-editor__toolbar\">\n <div className=\"eyeon-map-editor__tools\">\n {(['select', 'pan', 'draw-unit', 'draw-route'] as const).map((t) => (\n <button\n key={t}\n type=\"button\"\n className={tool === t ? 'is-active' : ''}\n onClick={() => setTool(t)}\n disabled={!canEdit && t.startsWith('draw')}\n >\n {t}\n </button>\n ))}\n <button type=\"button\" onClick={handleWeldSelected} disabled={selectedAnchorIds.length < 2}>\n Weld anchors\n </button>\n <label className=\"eyeon-map-editor__angle\">\n Base °\n <input\n type=\"number\"\n value={baseAngle}\n onChange={(e) => setBaseAngle(Number(e.target.value) || 0)}\n />\n </label>\n </div>\n <div className=\"eyeon-map-editor__actions\">\n <button type=\"button\" onClick={() => setPreview((p) => !p)}>\n {preview ? 'Edit' : 'Preview'}\n </button>\n <button\n type=\"button\"\n className=\"eyeon-map-editor__publish\"\n onClick={() => onPublish?.()}\n disabled={!canEdit}\n >\n Publish\n </button>\n </div>\n </div>\n\n <div className=\"eyeon-map-editor__canvas-wrap\">\n {preview && previewDocument ? (\n <PreviewOverlay document={previewDocument} />\n ) : (\n <EditorCanvas\n level={activeLevel}\n shapes={levelShapes}\n anchors={levelAnchors}\n edges={levelEdges}\n assignments={draft.assignments}\n theme={theme}\n tool={tool}\n baseAngle={baseAngle}\n selectedShapeId={selectedShapeId}\n selectedAnchorIds={selectedAnchorIds}\n baseSvgUrl={\n activeLevel?.kind === 'outdoor' ? draft.baseSvgUrl ?? null : null\n }\n onSelectShape={setSelectedShapeId}\n onSelectAnchors={setSelectedAnchorIds}\n onCreateRoutePoint={async (point, prevAnchorId) => {\n if (!activeLevel || !canEdit) return;\n const snapped = prevAnchorId\n ? snapAngle(\n levelAnchors.find((a) => a.id === prevAnchorId) ?? point,\n point,\n baseAngle,\n )\n : point;\n await flushOps([\n {\n op: 'upsert_anchor',\n anchor: {\n levelId: activeLevel.id,\n x: snapped.x,\n y: snapped.y,\n kind: 'junction',\n },\n },\n ]);\n }}\n onMoveAnchor={async (anchorId, x, y) => {\n if (!canEdit) return;\n const anchor = levelAnchors.find((a) => a.id === anchorId);\n if (!anchor) return;\n await flushOps([\n {\n op: 'upsert_anchor',\n anchor: { ...anchor, x, y },\n },\n ]);\n }}\n onCreateShape={async (kind, geometry) => {\n if (!activeLevel || !canEdit) return;\n await flushOps([\n {\n op: 'upsert_shape',\n shape: {\n levelId: activeLevel.id,\n key: `${kind}-${Date.now()}`,\n kind,\n geometry,\n },\n },\n ]);\n }}\n />\n )}\n </div>\n </div>\n\n <Inspector\n shape={selectedShape}\n assignment={selectedAssignment}\n amenities={draft.amenities}\n canEdit={canEdit}\n onRename={handleRenameShape}\n onChangeKind={handleChangeKind}\n onSaveAssignment={async (assignment) => {\n if (!canEdit) return;\n await flushOps([{ op: 'upsert_assignment', assignment }]);\n }}\n undoCount={undoStack.length}\n />\n </div>\n );\n}\n\nexport default MapEditor;\n"],"names":["polygonsToPath","polygons","poly","d","i","EditorCanvas","level","shapes","anchors","edges","theme","tool","baseAngle","selectedShapeId","selectedAnchorIds","baseSvgUrl","onSelectShape","onSelectAnchors","onCreateRoutePoint","onMoveAnchor","onCreateShape","svgRef","useRef","pan","setPan","useState","zoom","setZoom","drawing","setDrawing","dragAnchor","setDragAnchor","lastRouteAnchor","setLastRouteAnchor","panStart","viewbox","toWorld","clientX","clientY","svg","rect","x","y","anchorById","useMemo","a","onPointerDown","world","snapped","snapAngle","onPointerMove","prev","onPointerUp","moved","near","finishPolygon","geometry","jsxs","z","jsx","shape","p","e","edge","b","anchor","selected","nearWeld","id","other","TABS","LeftRail","tab","onTabChange","draft","activeLevelId","onSelectLevel","canFloors","canSettings","onImportSvg","onAutoroute","onThemeChange","l","file","_a","s","key","label","SHAPE_KINDS","UNIT_STATUSES","Inspector","assignment","amenities","canEdit","onRename","onChangeKind","onSaveAssignment","undoCount","setKey","retailerId","setRetailerId","amenityId","setAmenityId","_b","kioskId","setKioskId","_c","unitStatus","setUnitStatus","unitNumber","setUnitNumber","customLabel","setCustomLabel","useEffect","k","Fragment","PreviewOverlay","document","Suspense","MapViewer","MapEditor","onBatch","onPublish","previewDocument","className","setTab","setActiveLevelId","setSelectedShapeId","setSelectedAnchorIds","setTool","preview","setPreview","setBaseAngle","undoStack","setUndoStack","pendingOps","DEFAULT_THEME","activeLevel","levelShapes","levelAnchors","levelEdges","selectedShape","selectedAssignment","flushOps","useCallback","ops","handleWeldSelected","result","weldAnchors","handleRenameShape","handleChangeKind","kind","partial","t","point","prevAnchorId","anchorId"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/editor/geometryEdit.ts","../../src/editor/canvas/coords.ts","../../src/editor/canvas/EditorCanvas.tsx","../../src/editor/draftOps.ts","../../src/editor/labels.ts","../../src/editor/panels/FloorsPanel.tsx","../../src/editor/panels/LeftRail.tsx","../../src/editor/panels/Inspector.tsx","../../src/editor/panels/PreviewOverlay.tsx","../../src/editor/previewDocument.ts","../../src/editor/portalSurface.ts","../../src/editor/tools.tsx","../../src/editor/MapEditor.tsx","../../src/editor/panels/ImportReviewPanel.tsx"],"sourcesContent":["import type { ShapeGeometry, Vec2 } from '../core';\nimport { geometryBBox } from '../core';\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 // Drop closing duplicate if present\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\nexport function translateGeometry(\n geometry: ShapeGeometry,\n dx: number,\n dy: number,\n): ShapeGeometry {\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\nexport function moveVertex(\n geometry: ShapeGeometry,\n polygonIndex: number,\n vertexIndex: number,\n point: Vec2,\n): ShapeGeometry {\n const polygons = clonePolygons(geometry.polygons);\n const poly = polygons[polygonIndex];\n if (!poly || vertexIndex < 0 || vertexIndex >= poly.length) {\n return geometry;\n }\n poly[vertexIndex] = { x: point.x, y: point.y };\n return polygonsToGeometry(polygons);\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 polygons = clonePolygons(geometry.polygons);\n const poly = polygons[polygonIndex];\n if (!poly || afterVertexIndex < 0 || afterVertexIndex >= poly.length) {\n return geometry;\n }\n poly.splice(afterVertexIndex + 1, 0, { x: point.x, y: point.y });\n return polygonsToGeometry(polygons);\n}\n\n/** Remove a vertex; refuses to go below 3 points on a ring. */\nexport function removeVertex(\n geometry: ShapeGeometry,\n polygonIndex: number,\n vertexIndex: number,\n): ShapeGeometry {\n const polygons = clonePolygons(geometry.polygons);\n const poly = polygons[polygonIndex];\n if (!poly || poly.length <= 3) return geometry;\n if (vertexIndex < 0 || vertexIndex >= poly.length) return geometry;\n poly.splice(vertexIndex, 1);\n return polygonsToGeometry(polygons);\n}\n\nexport interface VertexHit {\n polygonIndex: number;\n vertexIndex: number;\n point: Vec2;\n distance: number;\n}\n\n/** Nearest vertex 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 geometry.polygons.forEach((poly, polygonIndex) => {\n poly.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 EdgeHit {\n polygonIndex: number;\n /** Insert after this vertex index. */\n afterVertexIndex: number;\n point: Vec2;\n distance: number;\n}\n\n/** Nearest edge midpoint (or projection) within tolerance for insert. */\nexport function hitTestEdgeMidpoint(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n): EdgeHit | null {\n let best: EdgeHit | null = null;\n geometry.polygons.forEach((poly, polygonIndex) => {\n if (poly.length < 2) return;\n for (let i = 0; i < poly.length; i++) {\n const a = poly[i];\n const b = poly[(i + 1) % poly.length];\n const mid = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n const distance = Math.hypot(mid.x - point.x, mid.y - point.y);\n if (distance <= tolerance && (!best || distance < best.distance)) {\n best = {\n polygonIndex,\n afterVertexIndex: i,\n point: mid,\n distance,\n };\n }\n }\n });\n return best;\n}\n\nexport function geometryWithBBox(geometry: ShapeGeometry): {\n geometry: ShapeGeometry;\n bbox: ReturnType<typeof geometryBBox>;\n} {\n return { geometry, bbox: geometryBBox(geometry) };\n}\n","import type { Vec2 } from '../../core';\n\n/** 2D affine matrix in DOMMatrix / SVGMatrix layout (a c e / b d f). */\nexport interface Affine2 {\n a: number;\n b: number;\n c: number;\n d: number;\n e: number;\n f: number;\n}\n\n/**\n * Map a client (CSS pixel) point through the inverse of an SVG screen CTM.\n * That converts pointer coordinates into SVG user / viewBox space so pan\n * deltas match what is drawn, even when the viewBox is larger than the\n * canvas CSS box (or letterboxed by preserveAspectRatio).\n */\nexport function clientToUser(ctm: Affine2, clientX: number, clientY: number): Vec2 {\n const det = ctm.a * ctm.d - ctm.b * ctm.c;\n if (det === 0) return { x: 0, y: 0 };\n const x = clientX - ctm.e;\n const y = clientY - ctm.f;\n return {\n x: (ctm.d * x - ctm.c * y) / det,\n y: (-ctm.b * x + ctm.a * y) / det,\n };\n}\n\nexport function clientToSvgUser(svg: SVGSVGElement, clientX: number, clientY: number): Vec2 {\n const ctm = svg.getScreenCTM();\n if (!ctm) return { x: 0, y: 0 };\n return clientToUser(ctm, clientX, clientY);\n}\n\n/** Invert `translate(pan) scale(zoom)` so a user-space point becomes world geometry. */\nexport function userToWorld(user: Vec2, pan: Vec2, zoom: number): Vec2 {\n const z = zoom === 0 ? 1 : zoom;\n return {\n x: (user.x - pan.x) / z,\n y: (user.y - pan.y) / z,\n };\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n CmAnchor,\n CmLevel,\n CmRouteEdge,\n CmShape,\n CmShapeAssignment,\n ShapeGeometry,\n ShapeKind,\n ThemeDefaults,\n Vec2,\n ViewBox,\n} from '../../core';\nimport { INTERACTIVE_SHAPE_KINDS, snapAngle, unionViewBox } from '../../core';\nimport type { EditorTool } from '../tools';\nimport {\n hitTestEdgeMidpoint,\n hitTestVertex,\n insertVertex,\n moveVertex,\n polygonsToGeometry,\n removeVertex,\n translateGeometry,\n} from '../geometryEdit';\nimport { clientToSvgUser, userToWorld } from './coords';\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\nexport interface EditorCanvasProps {\n level: CmLevel | null;\n shapes: CmShape[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n assignments: CmShapeAssignment[];\n theme: ThemeDefaults;\n tool: EditorTool;\n baseAngle: number;\n selectedShapeId: number | null;\n selectedAnchorIds: number[];\n /** Outdoor SVG underlay (designer-owned). */\n baseSvgUrl: string | null;\n baseViewbox?: ViewBox | null;\n /** Active level SVG underlay — outdoor only; floors have no stored SVG. */\n levelSvgUrl?: string | null;\n /** Outdoor/base shapes drawn behind the active building floor (non-interactive). */\n underlayShapes?: CmShape[];\n /** When true (outdoor), only interactive shapes are editable. */\n interactiveOnly?: boolean;\n /** Graph-paper grid. PORTAL only mounts this canvas after Edit Map. */\n showGrid?: boolean;\n onSelectShape: (id: number | null) => void;\n onSelectAnchors: (ids: number[]) => void;\n onCreateRoutePoint: (point: Vec2, prevAnchorId: number | null) => void;\n onMoveAnchor: (anchorId: number, x: number, y: number) => void;\n onCreateShape: (kind: ShapeKind, geometry: ShapeGeometry) => void;\n onUpdateShapeGeometry: (shapeId: number, geometry: ShapeGeometry) => void;\n}\n\nfunction polygonsToPath(polygons: Vec2[][]): string {\n return polygons\n .map((poly) => {\n if (poly.length === 0) return '';\n let d = `M ${poly[0].x} ${poly[0].y}`;\n for (let i = 1; i < poly.length; i++) d += ` L ${poly[i].x} ${poly[i].y}`;\n d += ' Z';\n return d;\n })\n .join(' ');\n}\n\nfunction isEditableShape(shape: CmShape, interactiveOnly: boolean): boolean {\n if (shape.orphanedAt) return false;\n if (!interactiveOnly) return true;\n return INTERACTIVE_SHAPE_KINDS.includes(shape.kind);\n}\n\nexport function EditorCanvas({\n level,\n shapes,\n anchors,\n edges,\n theme,\n tool,\n baseAngle,\n selectedShapeId,\n selectedAnchorIds,\n baseSvgUrl,\n baseViewbox = null,\n levelSvgUrl = null,\n underlayShapes = [],\n interactiveOnly = false,\n showGrid = true,\n onSelectShape,\n onSelectAnchors,\n onCreateRoutePoint,\n onMoveAnchor,\n onCreateShape,\n onUpdateShapeGeometry,\n}: EditorCanvasProps) {\n const svgRef = useRef<SVGSVGElement>(null);\n const [pan, setPan] = useState({ x: 0, y: 0 });\n const [zoom, setZoom] = useState(1);\n const [drawing, setDrawing] = useState<Vec2[]>([]);\n const [polygonPoints, setPolygonPoints] = useState<Vec2[]>([]);\n const [dragAnchor, setDragAnchor] = useState<number | null>(null);\n const [lastRouteAnchor, setLastRouteAnchor] = useState<number | 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 shapeId: number;\n polygonIndex: number;\n vertexIndex: number;\n } | null>(null);\n const [selectedVertex, setSelectedVertex] = useState<{\n polygonIndex: number;\n vertexIndex: number;\n } | null>(null);\n const panStart = useRef<{ x: number; y: number; panX: number; panY: number } | null>(null);\n\n useEffect(() => {\n setDrawing([]);\n setPolygonPoints([]);\n setLastRouteAnchor(null);\n setShapeDrag(null);\n setVertexDrag(null);\n setShapeOffset({ x: 0, y: 0 });\n }, [tool]);\n\n useEffect(() => {\n setSelectedVertex(null);\n setShapeDrag(null);\n setVertexDrag(null);\n setShapeOffset({ x: 0, y: 0 });\n }, [selectedShapeId]);\n\n const viewbox = unionViewBox(level?.sourceViewbox, baseViewbox);\n const underlayUrl = levelSvgUrl ?? (level?.kind === 'outdoor' ? baseSvgUrl : null);\n\n const editableShapes = useMemo(\n () => shapes.filter((s) => isEditableShape(s, interactiveOnly)),\n [shapes, interactiveOnly],\n );\n\n const selectedShape =\n editableShapes.find((s) => s.id === selectedShapeId) ?? null;\n\n const displayGeometry = useMemo(() => {\n if (!selectedShape) return null;\n if (shapeDrag && shapeDrag.shapeId === selectedShape.id) {\n return translateGeometry(shapeDrag.originGeometry, shapeOffset.x, shapeOffset.y);\n }\n return selectedShape.geometry;\n }, [selectedShape, shapeDrag, shapeOffset]);\n\n const toWorld = (clientX: number, clientY: number): Vec2 => {\n const svg = svgRef.current;\n if (!svg) return { x: 0, y: 0 };\n return userToWorld(clientToSvgUser(svg, clientX, clientY), pan, zoom);\n };\n\n const anchorById = useMemo(\n () => new Map(anchors.map((a) => [a.id, a])),\n [anchors],\n );\n\n const closePolygon = () => {\n if (polygonPoints.length < 3) {\n setPolygonPoints([]);\n return;\n }\n onCreateShape('unit', polygonsToGeometry([polygonPoints]));\n setPolygonPoints([]);\n };\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (tool === 'draw-polygon') {\n if (e.key === 'Enter') {\n e.preventDefault();\n closePolygon();\n } else if (e.key === 'Escape') {\n setPolygonPoints([]);\n }\n }\n if (\n (e.key === 'Backspace' || e.key === 'Delete') &&\n selectedShape &&\n selectedVertex &&\n tool === 'select'\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 };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tool, polygonPoints, selectedShape, selectedVertex]);\n\n const onPointerDown = (e: React.PointerEvent) => {\n if (tool === 'pan' || e.button === 1) {\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 = { x: user.x, y: user.y, panX: pan.x, panY: pan.y };\n return;\n }\n const world = toWorld(e.clientX, e.clientY);\n\n if (tool === 'draw-polygon') {\n if (polygonPoints.length >= 3) {\n const first = polygonPoints[0];\n if (Math.hypot(world.x - first.x, world.y - first.y) <= 6 / zoom) {\n closePolygon();\n return;\n }\n }\n setPolygonPoints((prev) => [...prev, world]);\n return;\n }\n\n if (tool === 'draw-route') {\n const snapped = lastRouteAnchor\n ? snapAngle(anchorById.get(lastRouteAnchor) ?? world, world, baseAngle)\n : world;\n onCreateRoutePoint(snapped, lastRouteAnchor);\n return;\n }\n if (tool === 'draw-unit' || tool === 'draw-line') {\n e.currentTarget.setPointerCapture?.(e.pointerId);\n setDrawing([world, world]);\n return;\n }\n\n if (tool === 'select' && selectedShape && displayGeometry) {\n const handleTol = 8 / zoom;\n const hit = hitTestVertex(displayGeometry, world, handleTol);\n if (hit) {\n setSelectedVertex({\n polygonIndex: hit.polygonIndex,\n vertexIndex: hit.vertexIndex,\n });\n setVertexDrag({\n shapeId: selectedShape.id,\n polygonIndex: hit.polygonIndex,\n vertexIndex: hit.vertexIndex,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n return;\n }\n const edgeHit = hitTestEdgeMidpoint(displayGeometry, world, handleTol);\n if (edgeHit && e.detail >= 2) {\n const next = insertVertex(\n selectedShape.geometry,\n edgeHit.polygonIndex,\n edgeHit.afterVertexIndex,\n edgeHit.point,\n );\n onUpdateShapeGeometry(selectedShape.id, next);\n setSelectedVertex({\n polygonIndex: edgeHit.polygonIndex,\n vertexIndex: edgeHit.afterVertexIndex + 1,\n });\n return;\n }\n }\n };\n\n const onPointerMove = (e: React.PointerEvent) => {\n if (panStart.current) {\n const svg = svgRef.current;\n if (!svg) return;\n const user = clientToSvgUser(svg, e.clientX, e.clientY);\n setPan({\n x: panStart.current.panX + (user.x - panStart.current.x),\n y: panStart.current.panY + (user.y - panStart.current.y),\n });\n return;\n }\n if (dragAnchor != null) {\n const world = toWorld(e.clientX, e.clientY);\n onMoveAnchor(dragAnchor, world.x, world.y);\n return;\n }\n if (vertexDrag && selectedShape) {\n const world = toWorld(e.clientX, e.clientY);\n const next = moveVertex(\n selectedShape.geometry,\n vertexDrag.polygonIndex,\n vertexDrag.vertexIndex,\n world,\n );\n // Live update via parent — coalesced on save\n onUpdateShapeGeometry(selectedShape.id, next);\n return;\n }\n if (shapeDrag) {\n const world = toWorld(e.clientX, e.clientY);\n setShapeOffset({\n x: world.x - shapeDrag.start.x,\n y: world.y - shapeDrag.start.y,\n });\n return;\n }\n if ((tool === 'draw-unit' || tool === 'draw-line') && drawing.length > 0) {\n const world = toWorld(e.clientX, e.clientY);\n setDrawing((prev) => {\n if (prev.length === 0) return prev;\n return [prev[0], world];\n });\n }\n };\n\n const finishRect = () => {\n if (drawing.length < 2) {\n setDrawing([]);\n return;\n }\n const [a, b] = [drawing[0], drawing[drawing.length - 1]];\n if (dragSize(a, b) < 2) {\n setDrawing([]);\n return;\n }\n const poly = rectPolygon(a, b);\n onCreateShape('unit', polygonsToGeometry([poly]));\n setDrawing([]);\n };\n\n const finishLine = () => {\n if (drawing.length < 2) {\n setDrawing([]);\n return;\n }\n const [a, b] = [drawing[0], drawing[drawing.length - 1]];\n if (dragSize(a, b) < 2) {\n setDrawing([]);\n return;\n }\n const geometry: ShapeGeometry = {\n paths: [{ d: `M ${a.x} ${a.y} L ${b.x} ${b.y}`, closed: false }],\n polygons: [],\n };\n onCreateShape('wall', geometry);\n setDrawing([]);\n };\n\n const onPointerUp = () => {\n panStart.current = null;\n if (vertexDrag) {\n setVertexDrag(null);\n return;\n }\n if (shapeDrag && selectedShape) {\n const next = translateGeometry(\n shapeDrag.originGeometry,\n shapeOffset.x,\n shapeOffset.y,\n );\n if (Math.hypot(shapeOffset.x, shapeOffset.y) >= 0.5) {\n onUpdateShapeGeometry(selectedShape.id, next);\n }\n setShapeDrag(null);\n setShapeOffset({ x: 0, y: 0 });\n return;\n }\n if (dragAnchor != null) {\n const moved = anchors.find((a) => a.id === dragAnchor);\n if (moved) {\n const near = anchors\n .filter((a) => a.id !== moved.id)\n .filter((a) => Math.hypot(a.x - moved.x, a.y - moved.y) <= 2.5)\n .map((a) => a.id);\n if (near.length) onSelectAnchors([moved.id, ...near]);\n }\n setDragAnchor(null);\n return;\n }\n if (tool === 'draw-unit') finishRect();\n if (tool === 'draw-line') finishLine();\n };\n\n const shapePathD = (shape: CmShape): string => {\n if (\n selectedShapeId === shape.id &&\n displayGeometry &&\n shapeDrag?.shapeId === shape.id\n ) {\n return (\n displayGeometry.paths.map((p) => p.d).join(' ') ||\n polygonsToPath(displayGeometry.polygons)\n );\n }\n return (\n shape.geometry.paths.map((p) => p.d).join(' ') ||\n polygonsToPath(shape.geometry.polygons)\n );\n };\n\n if (!level) {\n return (\n <div className={`eyeon-map-canvas${showGrid ? ' eyeon-map-canvas--grid' : ''}`}>\n <div className=\"eyeon-map-canvas__empty\">\n Choose a floor or Outdoor to edit\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={`eyeon-map-canvas${showGrid ? ' eyeon-map-canvas--grid' : ''}`}\n onWheel={(e) => {\n e.preventDefault();\n setZoom((z) => Math.min(8, Math.max(0.2, z * (e.deltaY > 0 ? 0.9 : 1.1))));\n }}\n >\n <svg\n ref={svgRef}\n className=\"eyeon-map-canvas__svg\"\n viewBox={`${viewbox.x} ${viewbox.y} ${viewbox.width} ${viewbox.height}`}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n >\n <g transform={`translate(${pan.x}, ${pan.y}) scale(${zoom})`}>\n {underlayUrl && (\n <image\n href={underlayUrl}\n x={(baseViewbox ?? viewbox).x}\n y={(baseViewbox ?? viewbox).y}\n width={(baseViewbox ?? viewbox).width}\n height={(baseViewbox ?? viewbox).height}\n opacity={0.85}\n pointerEvents=\"none\"\n />\n )}\n\n {underlayShapes.map((shape) => (\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={\n shape.style.fill ??\n (shape.kind === 'walkable'\n ? theme.WALKABLE_COLOR\n : shape.kind === 'unit'\n ? theme.STORE_DEFAULT_COLOR\n : '#cbd5e1')\n }\n fillOpacity={0.45}\n stroke=\"#94a3b8\"\n strokeWidth={1 / zoom}\n pointerEvents=\"none\"\n />\n ))}\n\n {editableShapes.map((shape) => (\n <path\n key={shape.id}\n d={shapePathD(shape)}\n fill={\n shape.style.fill ??\n (shape.kind === 'walkable'\n ? theme.WALKABLE_COLOR\n : shape.kind === 'unit'\n ? theme.STORE_DEFAULT_COLOR\n : '#cbd5e1')\n }\n fillOpacity={shape.kind === 'amenity' ? 0.15 : 0.85}\n stroke={selectedShapeId === shape.id ? theme.ACCENT_COLOR : '#64748b'}\n strokeWidth={selectedShapeId === shape.id ? 2.5 / zoom : 1 / zoom}\n onPointerDown={(e) => {\n if (tool !== 'select') return;\n e.stopPropagation();\n onSelectShape(shape.id);\n const world = toWorld(e.clientX, e.clientY);\n setShapeDrag({\n shapeId: shape.id,\n start: world,\n originGeometry: shape.geometry,\n });\n setShapeOffset({ x: 0, y: 0 });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n }}\n style={{ cursor: tool === 'select' ? 'grab' : 'default' }}\n />\n ))}\n\n {/* Vertex handles for selected shape */}\n {selectedShape &&\n (displayGeometry ?? selectedShape.geometry).polygons.map(\n (poly, pi) =>\n poly.map((vertex, vi) => {\n const selected =\n selectedVertex?.polygonIndex === pi &&\n selectedVertex?.vertexIndex === vi;\n return (\n <circle\n key={`v-${selectedShape.id}-${pi}-${vi}`}\n cx={vertex.x}\n cy={vertex.y}\n r={(selected ? 6 : 5) / zoom}\n fill={selected ? theme.ACCENT_COLOR : '#fff'}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={1.5 / zoom}\n onPointerDown={(e) => {\n if (tool !== 'select') return;\n e.stopPropagation();\n setSelectedVertex({ polygonIndex: pi, vertexIndex: vi });\n setVertexDrag({\n shapeId: selectedShape.id,\n polygonIndex: pi,\n vertexIndex: vi,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n }}\n style={{ cursor: 'crosshair' }}\n />\n );\n }),\n )}\n\n {edges.map((edge) => {\n const a = anchorById.get(edge.fromAnchorId);\n const b = anchorById.get(edge.toAnchorId);\n if (!a || !b) return null;\n return (\n <line\n key={edge.id}\n x1={a.x}\n y1={a.y}\n x2={b.x}\n y2={b.y}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={2 / zoom}\n strokeLinecap=\"round\"\n />\n );\n })}\n\n {anchors.map((anchor) => {\n const selected = selectedAnchorIds.includes(anchor.id);\n const nearWeld =\n selected &&\n selectedAnchorIds.some((id) => {\n if (id === anchor.id) return false;\n const other = anchorById.get(id);\n return other && Math.hypot(other.x - anchor.x, other.y - anchor.y) <= 2.5;\n });\n return (\n <circle\n key={anchor.id}\n cx={anchor.x}\n cy={anchor.y}\n r={(selected ? 5 : 3.5) / zoom}\n fill={nearWeld ? '#22c55e' : selected ? theme.ACCENT_COLOR : '#0f172a'}\n stroke=\"#fff\"\n strokeWidth={1 / zoom}\n onPointerDown={(e) => {\n e.stopPropagation();\n if (tool === 'draw-route') {\n setLastRouteAnchor(anchor.id);\n onCreateRoutePoint(anchor, lastRouteAnchor);\n return;\n }\n if (tool === 'select') {\n onSelectAnchors(\n e.shiftKey\n ? selectedAnchorIds.includes(anchor.id)\n ? selectedAnchorIds.filter((id) => id !== anchor.id)\n : [...selectedAnchorIds, anchor.id]\n : [anchor.id],\n );\n setDragAnchor(anchor.id);\n }\n }}\n style={{ cursor: 'grab' }}\n />\n );\n })}\n\n {drawing.length > 1 && tool === 'draw-unit' && (\n <rect\n x={Math.min(drawing[0].x, drawing[1].x)}\n y={Math.min(drawing[0].y, drawing[1].y)}\n width={Math.abs(drawing[1].x - drawing[0].x)}\n height={Math.abs(drawing[1].y - drawing[0].y)}\n fill={theme.STORE_DEFAULT_COLOR}\n fillOpacity={0.2}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={2 / zoom}\n strokeDasharray={`${6 / zoom} ${4 / zoom}`}\n />\n )}\n {drawing.length > 1 && tool === 'draw-line' && (\n <line\n x1={drawing[0].x}\n y1={drawing[0].y}\n x2={drawing[1].x}\n y2={drawing[1].y}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={2 / zoom}\n strokeDasharray={`${6 / zoom} ${4 / zoom}`}\n strokeLinecap=\"round\"\n />\n )}\n {polygonPoints.length > 0 && tool === 'draw-polygon' && (\n <>\n <polyline\n points={polygonPoints.map((p) => `${p.x},${p.y}`).join(' ')}\n fill=\"none\"\n stroke={theme.ACCENT_COLOR}\n strokeWidth={2 / zoom}\n strokeDasharray={`${6 / zoom} ${4 / zoom}`}\n />\n {polygonPoints.map((p, i) => (\n <circle\n key={`pp-${i}`}\n cx={p.x}\n cy={p.y}\n r={(i === 0 ? 5 : 3.5) / zoom}\n fill={i === 0 ? theme.ACCENT_COLOR : '#fff'}\n stroke={theme.ACCENT_COLOR}\n strokeWidth={1 / zoom}\n />\n ))}\n </>\n )}\n </g>\n </svg>\n </div>\n );\n}\n","import type {\n BatchOp,\n BBox,\n CmAmenityCatalogItem,\n CmAnchor,\n CmBuilding,\n CmLevel,\n CmRouteEdge,\n CmShape,\n CmShapeAssignment,\n ShapeGeometry,\n ThemeDefaults,\n} from '../core';\nimport { bboxOf, geometryBBox, normalizeGeometrySpace } from '../core';\n\nexport interface EditorDraftState {\n mapId: number;\n centerId: number;\n theme: Partial<ThemeDefaults>;\n buildings: CmBuilding[];\n levels: CmLevel[];\n shapes: CmShape[];\n assignments: CmShapeAssignment[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n amenities: CmAmenityCatalogItem[];\n baseSvgUrl?: string | null;\n}\n\nfunction geometryBbox(geometry?: ShapeGeometry | null): BBox {\n const points = (geometry?.polygons ?? []).flat();\n return bboxOf(points);\n}\n\nfunction upsertById<T extends { id: number }>(\n rows: T[],\n next: T,\n): T[] {\n const idx = rows.findIndex((row) => row.id === next.id);\n if (idx < 0) return [...rows, next];\n const copy = rows.slice();\n copy[idx] = next;\n return copy;\n}\n\nexport function applyDraftOp(\n draft: EditorDraftState,\n op: BatchOp,\n): EditorDraftState {\n switch (op.op) {\n case 'upsert_shape': {\n const incoming = op.shape;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.shapes.find((s) => s.id === id);\n const geometry = incoming.geometry ?? existing?.geometry ?? {\n paths: [],\n polygons: [],\n };\n const shape: CmShape = {\n id,\n levelId: incoming.levelId ?? existing?.levelId ?? 0,\n key: incoming.key ?? existing?.key ?? `shape-${id}`,\n kind: incoming.kind ?? existing?.kind ?? 'unit',\n geometry,\n bbox: incoming.bbox ?? existing?.bbox ?? geometryBbox(geometry),\n zIndex: incoming.zIndex ?? existing?.zIndex ?? 0,\n style: incoming.style ?? existing?.style ?? {},\n label: incoming.label ?? existing?.label ?? {},\n sourceSvgId: incoming.sourceSvgId ?? existing?.sourceSvgId ?? null,\n origin: incoming.origin ?? existing?.origin ?? 'manual',\n geometryLocked:\n incoming.geometryLocked ??\n (incoming.geometry != null ? true : existing?.geometryLocked) ??\n false,\n orphanedAt: incoming.orphanedAt ?? existing?.orphanedAt ?? null,\n };\n return { ...draft, shapes: upsertById(draft.shapes, shape) };\n }\n case 'delete_shape':\n return {\n ...draft,\n shapes: draft.shapes.filter((s) => s.id !== op.shapeId),\n assignments: draft.assignments.filter((a) => a.shapeId !== op.shapeId),\n };\n case 'upsert_assignment': {\n const assignment: CmShapeAssignment = {\n shapeId: op.assignment.shapeId,\n targetType: op.assignment.targetType ?? 'none',\n retailerId: op.assignment.retailerId ?? null,\n amenityId: op.assignment.amenityId ?? null,\n kioskId: op.assignment.kioskId ?? null,\n unitStatus: op.assignment.unitStatus ?? 'vacant',\n unitNumber: op.assignment.unitNumber ?? null,\n customLabel: op.assignment.customLabel ?? null,\n customImageKey: op.assignment.customImageKey ?? null,\n };\n const rest = draft.assignments.filter((a) => a.shapeId !== assignment.shapeId);\n return { ...draft, assignments: [...rest, assignment] };\n }\n case 'delete_assignment':\n return {\n ...draft,\n assignments: draft.assignments.filter((a) => a.shapeId !== op.shapeId),\n };\n case 'upsert_anchor': {\n const incoming = op.anchor;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.anchors.find((a) => a.id === id);\n const anchor: CmAnchor = {\n id,\n levelId: incoming.levelId ?? existing?.levelId ?? 0,\n shapeId: incoming.shapeId ?? existing?.shapeId ?? null,\n kind: incoming.kind ?? existing?.kind ?? 'junction',\n x: incoming.x ?? existing?.x ?? 0,\n y: incoming.y ?? existing?.y ?? 0,\n connectorId: incoming.connectorId ?? existing?.connectorId ?? null,\n };\n return { ...draft, anchors: upsertById(draft.anchors, anchor) };\n }\n case 'delete_anchor':\n return {\n ...draft,\n anchors: draft.anchors.filter((a) => a.id !== op.anchorId),\n edges: draft.edges.filter(\n (e) => e.fromAnchorId !== op.anchorId && e.toAnchorId !== op.anchorId,\n ),\n };\n case 'upsert_edge': {\n const incoming = op.edge;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.edges.find((e) => e.id === id);\n const edge: CmRouteEdge = {\n id,\n mapId: incoming.mapId ?? existing?.mapId ?? draft.mapId,\n fromAnchorId: incoming.fromAnchorId ?? existing?.fromAnchorId ?? 0,\n toAnchorId: incoming.toAnchorId ?? existing?.toAnchorId ?? 0,\n weight: incoming.weight ?? existing?.weight ?? null,\n directed: incoming.directed ?? existing?.directed ?? false,\n accessible: incoming.accessible ?? existing?.accessible ?? true,\n kind: incoming.kind ?? existing?.kind ?? 'walk',\n };\n return { ...draft, edges: upsertById(draft.edges, edge) };\n }\n case 'delete_edge':\n return { ...draft, edges: draft.edges.filter((e) => e.id !== op.edgeId) };\n case 'weld_anchors': {\n const ids = (op.anchorIds ?? []).filter((id) => Number.isFinite(id));\n if (ids.length < 2) return draft;\n const keep = ids[0];\n const removed = new Set(ids.slice(1));\n const edges = draft.edges\n .map((e) => ({\n ...e,\n fromAnchorId: removed.has(e.fromAnchorId) ? keep : e.fromAnchorId,\n toAnchorId: removed.has(e.toAnchorId) ? keep : e.toAnchorId,\n }))\n .filter((e) => e.fromAnchorId !== e.toAnchorId);\n return {\n ...draft,\n anchors: draft.anchors.filter((a) => !removed.has(a.id)),\n edges,\n };\n }\n case 'update_theme':\n return { ...draft, theme: { ...draft.theme, ...op.theme } };\n default:\n return draft;\n }\n}\n\nexport function applyDraftOps(\n draft: EditorDraftState,\n ops: BatchOp[],\n): EditorDraftState {\n return ops.reduce(applyDraftOp, healDraftGeometry(draft));\n}\n\n/**\n * Rebuild `polygons` from `paths` on rows written before the Y-flip removal,\n * so the canvas outline and its vertex handles agree without a re-import.\n */\nfunction healDraftGeometry(draft: EditorDraftState): EditorDraftState {\n let changed = false;\n const shapes = draft.shapes.map((shape) => {\n const geometry = normalizeGeometrySpace(shape.geometry);\n if (geometry === shape.geometry) return shape;\n changed = true;\n return { ...shape, geometry, bbox: geometryBBox(geometry) };\n });\n return changed ? { ...draft, shapes } : draft;\n}\n\n/** Collapse repeated updates to the same entity so Save Changes sends one op each. */\nexport function coalesceDraftOp(ops: BatchOp[], op: BatchOp): BatchOp[] {\n if (op.op === 'update_theme') {\n const prev = ops.filter((item) => item.op === 'update_theme');\n const rest = ops.filter((item) => item.op !== 'update_theme');\n const theme = prev.reduce(\n (acc, item) => (item.op === 'update_theme' ? { ...acc, ...item.theme } : acc),\n {} as Record<string, unknown>,\n );\n return [...rest, { op: 'update_theme', theme: { ...theme, ...op.theme } }];\n }\n\n if (op.op === 'upsert_shape' && op.shape.id != null) {\n const idx = ops.findIndex(\n (item) => item.op === 'upsert_shape' && item.shape.id === op.shape.id,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_shape') {\n const next = ops.slice();\n next[idx] = {\n op: 'upsert_shape',\n shape: { ...ops[idx].shape, ...op.shape },\n };\n return next;\n }\n }\n\n if (op.op === 'upsert_anchor' && op.anchor.id != null) {\n const idx = ops.findIndex(\n (item) => item.op === 'upsert_anchor' && item.anchor.id === op.anchor.id,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_anchor') {\n const next = ops.slice();\n next[idx] = {\n op: 'upsert_anchor',\n anchor: { ...ops[idx].anchor, ...op.anchor },\n };\n return next;\n }\n }\n\n if (op.op === 'upsert_assignment') {\n const idx = ops.findIndex(\n (item) =>\n item.op === 'upsert_assignment' &&\n item.assignment.shapeId === op.assignment.shapeId,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_assignment') {\n const next = ops.slice();\n next[idx] = { op: 'upsert_assignment', assignment: op.assignment };\n return next;\n }\n }\n\n return [...ops, op];\n}\n","import type { ShapeKind, UnitStatus } from '../core';\n\nexport const SHAPE_KIND_LABELS: Record<ShapeKind, string> = {\n unit: 'Store',\n amenity: 'Amenity',\n kiosk_screen: 'Kiosk',\n connector: 'Connector',\n entrance: 'Entrance',\n walkable: 'Walkway',\n void: 'Opening',\n wall: 'Wall',\n boundary: 'Boundary',\n floorplate: 'Floor plate',\n decor: 'Decor',\n label: 'Label',\n zone: 'Zone',\n parking_zone: 'Parking',\n green_area: 'Green area',\n water: 'Water',\n parking_icon: 'Parking icon',\n};\n\nexport const UNIT_STATUS_LABELS: Record<UnitStatus, string> = {\n occupied: 'Occupied',\n vacant: 'Vacant',\n coming_soon: 'Coming soon',\n under_renovation: 'Under renovation',\n};\n\nexport function shapeKindLabel(kind: string): string {\n return SHAPE_KIND_LABELS[kind as ShapeKind] ?? kind;\n}\n","import React, { useEffect, useLayoutEffect, 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\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};\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 [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 floorRectsRef = useRef<Map<number, number>>(new Map());\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 const ids = 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, 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 useLayoutEffect(() => {\n const root = floorListRef.current;\n if (!root) return;\n const nodes = root.querySelectorAll<HTMLElement>('[data-floor-id]');\n const nextTops = new Map<number, number>();\n nodes.forEach((node) => {\n const id = Number(node.dataset.floorId);\n if (!Number.isFinite(id)) return;\n const nextTop = node.getBoundingClientRect().top;\n nextTops.set(id, nextTop);\n const prevTop = floorRectsRef.current.get(id);\n if (prevTop == null || drag == null) return;\n const dy = prevTop - nextTop;\n if (Math.abs(dy) < 1) return;\n node.style.transition = 'none';\n node.style.transform = `translateY(${dy}px)`;\n requestAnimationFrame(() => {\n node.style.transition = 'transform 180ms ease';\n node.style.transform = '';\n });\n });\n floorRectsRef.current = nextTops;\n }, [displayFloors, drag]);\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 previewMoveToY = (clientY: number) => {\n const current = dragRef.current;\n const root = floorListRef.current;\n if (!current || !root) return;\n const ids = previewIdsRef.current ?? committedIds;\n const others = ids.filter((id) => id !== current.id);\n let insertAt = others.length;\n for (let i = 0; i < others.length; i += 1) {\n const node = root.querySelector<HTMLElement>(`[data-floor-id=\"${others[i]}\"]`);\n if (!node) continue;\n const rect = node.getBoundingClientRect();\n if (clientY < rect.top + rect.height / 2) {\n insertAt = i;\n break;\n }\n }\n const next = moveLevelId(ids, current.id, insertAt);\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 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 next = {\n ...current,\n x: e.clientX - current.offsetX,\n y: e.clientY - current.offsetY,\n };\n dragRef.current = next;\n setDrag(next);\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 if (!(row instanceof HTMLElement)) return;\n const rect = row.getBoundingClientRect();\n e.preventDefault();\n e.stopPropagation();\n e.currentTarget.setPointerCapture(e.pointerId);\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: rect.left,\n y: rect.top,\n };\n dragRef.current = next;\n setDrag(next);\n setPreviewIds(committedIds);\n };\n\n if (screen.mode !== 'list') {\n const hasExistingSvg = Boolean(editing?.sourceSvgKey || editing?.sourceSvgUrl);\n const showEditPreview = screen.mode === 'edit' && hasExistingSvg;\n const previewUrl = localPreviewUrl ?? (showEditPreview ? editing?.sourceSvgUrl ?? null : null);\n const previewFallback =\n file?.name ?? svgFileName(editing?.sourceSvgKey) ?? 'SVG on file';\n const importedCount = editing ? shapeCount(editing.id) : 0;\n const showReimportNotice =\n !isOutdoorForm && screen.mode === 'edit' && importedCount > 0;\n const primaryLabel = isOutdoorForm ? 'Upload' : 'Import';\n const primaryBusyLabel = isOutdoorForm ? 'Uploading' : 'Importing';\n\n return (\n <div className=\"eyeon-map-floors\">\n {!isOutdoorForm && (\n <label className=\"eyeon-map-rail__field\">\n Title\n <input\n value={name}\n disabled={busy || !canManage}\n onChange={(e) => setName(e.target.value)}\n />\n </label>\n )}\n {showEditPreview ? (\n <div className=\"eyeon-map-rail__field eyeon-map-floors__svg-field\">\n SVG\n <div className=\"eyeon-map-floors__preview-card\">\n {previewUrl && !previewFailed ? (\n <img\n className=\"eyeon-map-floors__preview-img\"\n src={previewUrl}\n alt={file?.name ?? editing?.name ?? 'SVG preview'}\n onError={() => setPreviewFailed(true)}\n />\n ) : (\n <div className=\"eyeon-map-floors__preview-fallback\">{previewFallback}</div>\n )}\n </div>\n {file ? (\n <span className=\"eyeon-map-floors__drop-meta\">\n {file.name}\n {isOutdoorForm\n ? ` · ${formatBytes(file.size)} · Ready to upload`\n : ` · ${formatBytes(file.size)}`}\n </span>\n ) : null}\n {!isOutdoorForm ? (\n <p className=\"eyeon-map-rail__hint\">\n Floor SVGs are read for geometry only — no copy of the file is kept.\n </p>\n ) : (\n <p className=\"eyeon-map-rail__hint\">\n The outdoor SVG is stored and drawn live, so decoration stays\n designer-owned. Only its interactive polygons are imported.\n </p>\n )}\n <input\n ref={fileInputRef}\n hidden\n type=\"file\"\n accept=\".svg,image/svg+xml\"\n disabled={busy || deleting || !canManage}\n onChange={(e) => {\n takeSvgFile(e.target.files?.[0] ?? null);\n e.target.value = '';\n }}\n />\n <button\n type=\"button\"\n className=\"eyeon-map-floors__change\"\n disabled={busy || deleting || !canManage}\n onClick={() => fileInputRef.current?.click()}\n >\n {isOutdoorForm ? 'Replace SVG' : 'Re-import SVG'}\n </button>\n </div>\n ) : (\n <div className=\"eyeon-map-rail__field\">\n {isOutdoorForm ? 'SVG file' : 'Floor SVG to import'}\n <label\n className={[\n 'eyeon-map-floors__drop',\n dragOver ? 'is-over' : '',\n file ? 'has-file' : '',\n busy ? 'is-busy' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onDragOver={(e) => {\n e.preventDefault();\n if (!busy) setDragOver(true);\n }}\n onDragLeave={() => setDragOver(false)}\n onDrop={(e) => {\n e.preventDefault();\n setDragOver(false);\n if (busy || !canManage) return;\n takeSvgFile(e.dataTransfer.files?.[0]);\n }}\n >\n <input\n type=\"file\"\n accept=\".svg,image/svg+xml\"\n disabled={busy || deleting || !canManage}\n onChange={(e) => {\n takeSvgFile(e.target.files?.[0] ?? null);\n e.target.value = '';\n }}\n />\n <span className=\"eyeon-map-floors__drop-title\">\n {file ? file.name : 'Choose SVG or drop it here'}\n </span>\n <span className=\"eyeon-map-floors__drop-meta\">\n {file\n ? isOutdoorForm\n ? `${formatBytes(file.size)} · Ready to upload`\n : `${formatBytes(file.size)} · Ready to import`\n : 'SVG only'}\n </span>\n </label>\n {!isOutdoorForm && !showReimportNotice ? (\n <p className=\"eyeon-map-rail__hint\">\n The file is read for geometry only. Shapes, layer names and walking\n paths go into the database; the SVG itself is not stored.\n </p>\n ) : null}\n </div>\n )}\n {showReimportNotice ? (\n <div className=\"eyeon-map-floors__notice\">\n <p className=\"eyeon-map-floors__notice-title\">\n Re-importing replaces the {importedCount} shape\n {importedCount === 1 ? '' : 's'} on this floor\n </p>\n <ul className=\"eyeon-map-floors__notice-list\">\n <li>\n Layers that keep the same Illustrator ID are redrawn from the new file\n and keep their retailer, amenity and kiosk assignments.\n </li>\n <li>\n Shapes you reshaped in Edit Map keep your geometry — the new file is\n ignored for those.\n </li>\n <li>\n IDs missing from the new file are hidden rather than deleted, so you can\n move their assignments onto a renamed layer.\n </li>\n <li>\n New IDs come in unassigned, and <code>route-path</code> layers replace\n this floor&rsquo;s walking paths.\n </li>\n <li>\n The artboard must stay the same size, otherwise the import is rejected.\n </li>\n </ul>\n </div>\n ) : null}\n {progress != null && (\n <div\n className=\"eyeon-map-floors__progress\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={progress}\n >\n <div className=\"eyeon-map-floors__progress-track\">\n <div\n className=\"eyeon-map-floors__progress-bar\"\n style={{ width: `${Math.min(100, Math.max(0, progress))}%` }}\n />\n </div>\n <span className=\"eyeon-map-floors__progress-label\">{progress}%</span>\n </div>\n )}\n {error ? <div className=\"eyeon-map-floors__error\">{error}</div> : null}\n {screen.mode === 'edit' && editing ? (\n <div className=\"eyeon-map-floors__edit-actions\">\n <div className=\"eyeon-map-floors__edit-row\">\n {onDeleteLevel && canManage ? (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__danger\"\n disabled={busy || deleting}\n onClick={() => setConfirmDeleteId(editing.id)}\n >\n Delete\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-floors__primary\"\n disabled={\n busy ||\n deleting ||\n !canManage ||\n (editing.kind !== 'outdoor' && !name.trim())\n }\n onClick={() => void submit()}\n >\n {busy\n ? progress != null\n ? `${primaryBusyLabel} ${progress}%`\n : 'Saving…'\n : file\n ? isOutdoorForm\n ? 'Upload & Save'\n : 'Import & Save'\n : 'Save Changes'}\n </button>\n </div>\n </div>\n ) : (\n <div className=\"eyeon-map-rail__actions\">\n <button\n type=\"button\"\n className=\"eyeon-map-floors__primary\"\n disabled={\n busy ||\n deleting ||\n !canManage ||\n (isOutdoorForm ? !file : !name.trim() || !file)\n }\n onClick={() => void submit()}\n >\n {busy\n ? progress != null\n ? `${primaryBusyLabel} ${progress}%`\n : `${primaryBusyLabel}…`\n : primaryLabel}\n </button>\n </div>\n )}\n {renderDeleteModal()}\n </div>\n );\n }\n\n return (\n <div className={['eyeon-map-floors', drag ? 'is-reordering' : ''].filter(Boolean).join(' ')}>\n <div className=\"eyeon-map-floors__block\">\n {canManage && (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__add\"\n onClick={() => onScreenChange({ mode: 'add-floor' })}\n >\n Add Floor\n </button>\n )}\n {displayFloors.length === 0 ? (\n <p className=\"eyeon-map-rail__hint\">No floors yet.</p>\n ) : (\n <div ref={floorListRef} className=\"eyeon-map-floors__list\">\n {displayFloors.map((level) => (\n <div\n key={level.id}\n data-floor-id={level.id}\n className=\"eyeon-map-floors__entry\"\n >\n <div\n className={[\n 'eyeon-map-floors__row',\n drag?.id === level.id ? 'is-placeholder' : '',\n confirmDeleteId === level.id ? 'is-confirm' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {canReorder ? (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__grip\"\n title=\"Drag to reorder\"\n aria-label={`Reorder ${level.name}`}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => {\n if (e.button !== 0) return;\n startDrag(level, e);\n }}\n >\n <GripIcon />\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-floors__item\"\n onClick={() => {\n if (drag) return;\n openEdit(level);\n }}\n >\n {level.name}\n </button>\n {renderRowDelete(level)}\n </div>\n </div>\n ))}\n </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 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 type {\n CmAmenityCatalogItem,\n CmLevel,\n CmBuilding,\n ThemeDefaults,\n} from '../../core';\nimport { shapeKindLabel } from '../labels';\nimport {\n FloorsPanel,\n floorsScreenTitle,\n visibleFloorCount,\n type CreateLevelInput,\n type FloorsScreen,\n type UpdateLevelInput,\n} from './FloorsPanel';\n\nexport type RailSection =\n | 'floors'\n | 'stores'\n | 'amenities'\n | 'kiosks'\n | 'paths'\n | 'style'\n | 'selection'\n | 'edit-map';\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 orphanedAt?: string | null;\n }>;\n anchors: Array<{ id: number; levelId: number }>;\n edges: Array<{ id: number }>;\n amenities: CmAmenityCatalogItem[];\n}\n\nexport interface LeftRailProps {\n section: RailSection | null;\n onSectionChange: (section: RailSection | null) => void;\n draft: LeftRailDraft;\n activeLevelId: number | null;\n selectedShapeId: number | null;\n onSelectShape: (id: number) => void;\n canFloors: boolean;\n canSettings: boolean;\n onImportSvg?: (levelId: number, file: File) => Promise<void>;\n onCreateLevel?: (input: CreateLevelInput) => Promise<number | void>;\n onUpdateLevel?: (input: UpdateLevelInput) => Promise<void>;\n onDeleteLevel?: (levelId: number) => Promise<void>;\n onReorderLevels?: (orderedIds: number[]) => Promise<void>;\n onAutoroute?: (levelId: number) => Promise<void>;\n theme: ThemeDefaults;\n onThemeChange: (partial: Partial<ThemeDefaults>) => void;\n assignPanel: ReactNode;\n /** Draw/tools UI for Edit Map (icons + inspector). */\n editMapPanel?: ReactNode;\n footer?: ReactNode;\n}\n\nconst NAV_ITEMS: Array<{\n id: RailSection;\n label: string;\n description: string;\n countKey?: 'kiosks' | 'floors';\n}> = [\n {\n id: 'floors',\n label: 'Floors',\n description: 'Building floors and Outdoor SVG',\n countKey: 'floors',\n },\n {\n id: 'kiosks',\n label: 'Kiosks',\n description: 'Link kiosk screens to devices',\n countKey: 'kiosks',\n },\n {\n id: 'style',\n label: 'Style',\n description: 'Colors and 2D / 3D look',\n },\n];\n\nconst SECTION_TITLES: Record<RailSection, string> = {\n floors: 'Floors',\n stores: 'Stores',\n amenities: 'Amenities',\n kiosks: 'Kiosks',\n paths: 'Walking paths',\n style: 'Style',\n selection: 'Selected',\n 'edit-map': 'Edit Map',\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\nexport function LeftRail({\n section,\n onSectionChange,\n draft,\n activeLevelId,\n selectedShapeId,\n onSelectShape,\n canFloors,\n canSettings,\n onCreateLevel,\n onUpdateLevel,\n onDeleteLevel,\n onReorderLevels,\n onAutoroute,\n theme,\n onThemeChange,\n assignPanel,\n editMapPanel,\n footer,\n}: LeftRailProps) {\n const [floorsScreen, setFloorsScreen] = useState<FloorsScreen>({ mode: 'list' });\n\n useEffect(() => {\n if (section !== 'floors') setFloorsScreen({ mode: 'list' });\n }, [section]);\n\n const levelShapes = draft.shapes.filter((s) => s.levelId === activeLevelId);\n const storeShapes = levelShapes.filter(\n (s) => s.kind === 'unit' || s.kind === 'parking_zone',\n );\n const amenityShapes = levelShapes.filter((s) => s.kind === 'amenity');\n const kioskShapes = levelShapes.filter((s) => s.kind === 'kiosk_screen');\n const activeLevel = draft.levels.find((l) => l.id === activeLevelId);\n const pathCount = draft.anchors.filter((a) => a.levelId === activeLevelId).length;\n const levelShapeCounts = useMemo(() => {\n const counts: Record<number, number> = {};\n for (const shape of draft.shapes) {\n if (shape.orphanedAt) continue;\n counts[shape.levelId] = (counts[shape.levelId] ?? 0) + 1;\n }\n return counts;\n }, [draft.shapes]);\n\n const counts: Record<NonNullable<(typeof NAV_ITEMS)[number]['countKey']>, number> = {\n floors: visibleFloorCount(draft.levels),\n kiosks: kioskShapes.length,\n };\n\n const renderShapeList = (\n shapes: typeof levelShapes,\n empty: string,\n ) =>\n shapes.length === 0 ? (\n <p className=\"eyeon-map-rail__hint\">{empty}</p>\n ) : (\n shapes.map((s) => (\n <button\n key={s.id}\n type=\"button\"\n className={\n s.id === selectedShapeId\n ? 'eyeon-map-rail__row is-active'\n : 'eyeon-map-rail__row'\n }\n onClick={() => onSelectShape(s.id)}\n >\n <span>{s.key}</span>\n <span className=\"eyeon-map-rail__muted\">{shapeKindLabel(s.kind)}</span>\n </button>\n ))\n );\n\n return (\n <aside className=\"eyeon-map-rail\">\n {section ? (\n <div className=\"eyeon-map-rail__header\">\n <button\n type=\"button\"\n className=\"eyeon-map-rail__back\"\n onClick={() => {\n if (section === 'floors' && floorsScreen.mode !== 'list') {\n setFloorsScreen({ mode: 'list' });\n return;\n }\n onSectionChange(null);\n }}\n aria-label=\"Back\"\n >\n <BackIcon />\n </button>\n <div className=\"eyeon-map-rail__header-title\">\n {section === 'floors'\n ? floorsScreenTitle(floorsScreen, draft.levels)\n : SECTION_TITLES[section]}\n </div>\n </div>\n ) : (\n <div className=\"eyeon-map-rail__header\">\n <div className=\"eyeon-map-rail__header-title\">Map options</div>\n </div>\n )}\n\n <div className=\"eyeon-map-rail__body\">\n {!section && (\n <nav className=\"eyeon-map-rail__nav\" aria-label=\"Map options\">\n <button\n type=\"button\"\n className=\"eyeon-map-rail__edit-map\"\n onClick={() => onSectionChange('edit-map')}\n >\n Edit Map\n </button>\n {NAV_ITEMS.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className=\"eyeon-map-rail__nav-item\"\n onClick={() => onSectionChange(item.id)}\n >\n <span className=\"eyeon-map-rail__nav-copy\">\n <span className=\"eyeon-map-rail__nav-title\">{item.label}</span>\n <span className=\"eyeon-map-rail__nav-desc\">{item.description}</span>\n </span>\n <span className=\"eyeon-map-rail__nav-meta\">\n {item.countKey != null ? (\n <span className=\"eyeon-map-rail__nav-count\">{counts[item.countKey]}</span>\n ) : null}\n <ChevronIcon />\n </span>\n </button>\n ))}\n </nav>\n )}\n\n {section === 'edit-map' && (\n <div className=\"eyeon-map-rail__section\">{editMapPanel}</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={onCreateLevel}\n onUpdateLevel={onUpdateLevel}\n onDeleteLevel={onDeleteLevel}\n onReorderLevels={onReorderLevels}\n />\n )}\n\n {section === 'stores' && (\n <div className=\"eyeon-map-rail__section\">\n {activeLevel ? (\n <p className=\"eyeon-map-rail__hint\">\n Stores on {activeLevel.name}. Click one here or on the map to\n assign a retailer.\n </p>\n ) : null}\n {assignPanel}\n <div className=\"eyeon-map-rail__heading\">On this floor ({storeShapes.length})</div>\n {renderShapeList(storeShapes, 'No store spaces on this floor yet.')}\n </div>\n )}\n\n {section === 'amenities' && (\n <div className=\"eyeon-map-rail__section\">\n <p className=\"eyeon-map-rail__hint\">\n Click an amenity on the map to link it, or browse the catalog below.\n </p>\n {assignPanel}\n <div className=\"eyeon-map-rail__heading\">On this floor ({amenityShapes.length})</div>\n {renderShapeList(amenityShapes, 'No amenity shapes on this floor yet.')}\n {draft.amenities.length > 0 && (\n <>\n <div className=\"eyeon-map-rail__heading\">Amenity catalog</div>\n {draft.amenities.map((a) => (\n <div key={a.id} className=\"eyeon-map-rail__row\">\n <span>{a.name}</span>\n <span className=\"eyeon-map-rail__muted\">{a.code}</span>\n </div>\n ))}\n </>\n )}\n </div>\n )}\n\n {section === 'kiosks' && (\n <div className=\"eyeon-map-rail__section\">\n <p className=\"eyeon-map-rail__hint\">\n Select a kiosk screen on the map, then enter its device ID.\n </p>\n {assignPanel}\n <div className=\"eyeon-map-rail__heading\">On this floor ({kioskShapes.length})</div>\n {renderShapeList(kioskShapes, 'No kiosk screens on this floor yet.')}\n </div>\n )}\n\n {section === 'paths' && (\n <div className=\"eyeon-map-rail__section\">\n <p className=\"eyeon-map-rail__hint\">\n Use Routes / wayfinding in Edit Map, then click the map to place\n points. Drag two points together and choose Join points to connect\n them.\n </p>\n <div className=\"eyeon-map-rail__stat\">\n {pathCount} path points · {draft.edges.length} connections\n </div>\n {canFloors && activeLevelId != null && (\n <div className=\"eyeon-map-rail__actions\">\n <button type=\"button\" onClick={() => onAutoroute?.(activeLevelId)}>\n Suggest walking paths\n </button>\n </div>\n )}\n </div>\n )}\n\n {section === 'style' && (\n <div className=\"eyeon-map-rail__section\">\n {!canSettings ? (\n <p className=\"eyeon-map-rail__hint\">\n You do not have permission to change map colors.\n </p>\n ) : (\n <>\n <p className=\"eyeon-map-rail__hint\">\n These colors apply on the public map after Save Changes.\n </p>\n <label className=\"eyeon-map-rail__field\">\n View\n <select\n value={theme.MAP_STYLE}\n onChange={(e) =>\n onThemeChange({ MAP_STYLE: e.target.value as '2D' | '3D' })\n }\n >\n <option value=\"2D\">2D</option>\n <option value=\"3D\">3D</option>\n </select>\n </label>\n {(\n [\n ['ACCENT_COLOR', 'Highlight'],\n ['STORE_DEFAULT_COLOR', 'Stores'],\n ['MAP_BACKGROUND_COLOR', 'Background'],\n ['WALL_COLOR', 'Walls'],\n ] as const\n ).map(([key, label]) => (\n <label key={key} className=\"eyeon-map-rail__field eyeon-map-rail__field--color\">\n {label}\n <input\n type=\"color\"\n value={theme[key]}\n onChange={(e) => onThemeChange({ [key]: e.target.value })}\n />\n </label>\n ))}\n <p className=\"eyeon-map-rail__hint\">\n Green areas, parking lanes, and walking paths use fixed house\n colors from the map library — not editable here.\n </p>\n </>\n )}\n </div>\n )}\n\n {section === 'selection' && (\n <div className=\"eyeon-map-rail__section\">\n <p className=\"eyeon-map-rail__hint\">\n {activeLevel\n ? `Editing a shape on ${activeLevel.name}.`\n : 'Editing the selected shape.'}\n </p>\n {assignPanel}\n </div>\n )}\n </div>\n\n {footer ? <div className=\"eyeon-map-rail__footer\">{footer}</div> : null}\n </aside>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport type {\n CmAmenityCatalogItem,\n CmShape,\n CmShapeAssignment,\n ShapeKind,\n UnitStatus,\n} from '../../core';\nimport { SHAPE_KIND_LABELS, UNIT_STATUS_LABELS } from '../labels';\n\nconst SHAPE_KINDS = Object.keys(SHAPE_KIND_LABELS) as ShapeKind[];\nconst UNIT_STATUSES = Object.keys(UNIT_STATUS_LABELS) as UnitStatus[];\n\nexport interface InspectorProps {\n shape: CmShape | null;\n assignment: CmShapeAssignment | null;\n amenities: CmAmenityCatalogItem[];\n /** Other shape keys on the same level — used for uniqueness validation. */\n levelShapeKeys?: string[];\n canEdit: boolean;\n onRename: (key: string) => void;\n onChangeKind: (kind: ShapeKind) => void;\n onDelete?: () => void;\n onSaveAssignment: (assignment: CmShapeAssignment) => void;\n}\n\nexport function Inspector({\n shape,\n assignment,\n amenities,\n levelShapeKeys = [],\n canEdit,\n onRename,\n onChangeKind,\n onDelete,\n onSaveAssignment,\n}: InspectorProps) {\n const [key, setKey] = useState(shape?.key ?? '');\n const [keyError, setKeyError] = useState<string | null>(null);\n const [retailerId, setRetailerId] = useState<string>(\n assignment?.retailerId?.toString() ?? '',\n );\n const [amenityId, setAmenityId] = useState<string>(\n assignment?.amenityId?.toString() ?? '',\n );\n const [kioskId, setKioskId] = useState<string>(\n assignment?.kioskId?.toString() ?? '',\n );\n const [unitStatus, setUnitStatus] = useState<UnitStatus>(\n assignment?.unitStatus ?? 'vacant',\n );\n const [unitNumber, setUnitNumber] = useState(assignment?.unitNumber ?? '');\n const [customLabel, setCustomLabel] = useState(assignment?.customLabel ?? '');\n\n useEffect(() => {\n setKey(shape?.key ?? '');\n setKeyError(null);\n setRetailerId(assignment?.retailerId?.toString() ?? '');\n setAmenityId(assignment?.amenityId?.toString() ?? '');\n setKioskId(assignment?.kioskId?.toString() ?? '');\n setUnitStatus(assignment?.unitStatus ?? 'vacant');\n setUnitNumber(assignment?.unitNumber ?? '');\n setCustomLabel(assignment?.customLabel ?? '');\n }, [shape, assignment]);\n\n if (!shape) {\n return (\n <div className=\"eyeon-map-inspector__empty\">\n Pick an item from the list below, or click it on the map.\n </div>\n );\n }\n\n const commitRename = () => {\n if (!key || key === shape.key) {\n setKeyError(null);\n return;\n }\n if (levelShapeKeys.includes(key)) {\n setKeyError('That name is already used on this level.');\n return;\n }\n setKeyError(null);\n onRename(key);\n };\n\n return (\n <div className=\"eyeon-map-inspector\">\n <div className=\"eyeon-map-inspector__heading\">Selected</div>\n\n <label className=\"eyeon-map-rail__field\">\n Name\n <input\n value={key}\n disabled={!canEdit}\n onChange={(e) => {\n setKey(e.target.value);\n setKeyError(null);\n }}\n onBlur={commitRename}\n />\n </label>\n {keyError ? (\n <p className=\"eyeon-map-rail__hint\" style={{ color: '#b91c1c' }}>\n {keyError}\n </p>\n ) : null}\n {shape.geometryLocked ? (\n <p className=\"eyeon-map-rail__hint\">\n Geometry locked — outdoor re-uploads will not overwrite this shape.\n </p>\n ) : null}\n\n <label className=\"eyeon-map-rail__field\">\n Type\n <select\n value={shape.kind}\n disabled={!canEdit}\n onChange={(e) => onChangeKind(e.target.value as ShapeKind)}\n >\n {SHAPE_KINDS.map((k) => (\n <option key={k} value={k}>\n {SHAPE_KIND_LABELS[k]}\n </option>\n ))}\n </select>\n </label>\n\n {(shape.kind === 'unit' || shape.kind === 'parking_zone') && (\n <>\n <div className=\"eyeon-map-inspector__heading\">Store</div>\n <label className=\"eyeon-map-rail__field\">\n Retailer ID\n <input\n value={retailerId}\n disabled={!canEdit}\n onChange={(e) => setRetailerId(e.target.value)}\n />\n </label>\n <label className=\"eyeon-map-rail__field\">\n Status\n <select\n value={unitStatus}\n disabled={!canEdit}\n onChange={(e) => setUnitStatus(e.target.value as UnitStatus)}\n >\n {UNIT_STATUSES.map((s) => (\n <option key={s} value={s}>\n {UNIT_STATUS_LABELS[s]}\n </option>\n ))}\n </select>\n </label>\n <label className=\"eyeon-map-rail__field\">\n Unit number\n <input\n value={unitNumber}\n disabled={!canEdit}\n onChange={(e) => setUnitNumber(e.target.value)}\n />\n </label>\n </>\n )}\n\n {shape.kind === 'amenity' && (\n <>\n <div className=\"eyeon-map-inspector__heading\">Amenity</div>\n <label className=\"eyeon-map-rail__field\">\n Linked amenity\n <select\n value={amenityId}\n disabled={!canEdit}\n onChange={(e) => setAmenityId(e.target.value)}\n >\n <option value=\"\">Not assigned</option>\n {amenities.map((a) => (\n <option key={a.id} value={a.id}>\n {a.name}\n </option>\n ))}\n </select>\n </label>\n </>\n )}\n\n {shape.kind === 'kiosk_screen' && (\n <>\n <div className=\"eyeon-map-inspector__heading\">Kiosk</div>\n <label className=\"eyeon-map-rail__field\">\n Kiosk device ID\n <input\n value={kioskId}\n disabled={!canEdit}\n onChange={(e) => setKioskId(e.target.value)}\n />\n </label>\n </>\n )}\n\n <label className=\"eyeon-map-rail__field\">\n Label on map\n <input\n value={customLabel}\n disabled={!canEdit}\n placeholder=\"Optional\"\n onChange={(e) => setCustomLabel(e.target.value)}\n />\n </label>\n\n {canEdit && (\n <div className=\"eyeon-map-rail__actions\">\n <button\n type=\"button\"\n className=\"eyeon-map-inspector__save\"\n onClick={() =>\n onSaveAssignment({\n shapeId: shape.id,\n targetType: retailerId\n ? 'retailer'\n : amenityId\n ? 'amenity'\n : kioskId\n ? 'kiosk'\n : 'none',\n retailerId: retailerId ? Number(retailerId) : null,\n amenityId: amenityId ? Number(amenityId) : null,\n kioskId: kioskId ? Number(kioskId) : null,\n unitStatus,\n unitNumber: unitNumber || null,\n customLabel: customLabel || null,\n customImageKey: assignment?.customImageKey ?? null,\n })\n }\n >\n Save\n </button>\n {onDelete ? (\n <button\n type=\"button\"\n className=\"eyeon-map-inspector__delete\"\n onClick={() => {\n if (window.confirm(`Delete shape “${shape.key}”?`)) onDelete();\n }}\n >\n Delete\n </button>\n ) : null}\n </div>\n )}\n </div>\n );\n}\n","import React, { Suspense } from 'react';\nimport type { MapViewerHost, PublishedDocument } from '../../core';\nimport { MapViewer } from '../../viewer/MapViewer';\n\nexport function PreviewOverlay({\n document,\n host = 'PORTAL_ASSIGN',\n onSelectShape,\n activeLevelId,\n onActiveLevelChange,\n routeOnSelect,\n imageProxyUrl,\n}: {\n document: PublishedDocument;\n /** Assign mode hides search. Public preview can be added later as WEBSITE. */\n host?: Extract<MapViewerHost, 'PORTAL_ASSIGN' | 'WEBSITE'>;\n onSelectShape?: (shapeId: number) => void;\n activeLevelId?: number | null;\n onActiveLevelChange?: (levelId: number) => void;\n /** Default true (public navigate). False when assigning in PORTAL. */\n routeOnSelect?: boolean;\n /** Without this the outdoor SVG is fetched cross-origin and CORS blocks it. */\n imageProxyUrl?: string | null;\n}) {\n return (\n <div className=\"eyeon-map-preview\">\n <Suspense fallback={<div className=\"eyeon-map-preview__loading\">Loading preview…</div>}>\n {/* Viewer chrome stays on the canvas — never in the Map options rail. */}\n <MapViewer\n document={document}\n host={host}\n onSelectShape={onSelectShape}\n activeLevelId={activeLevelId}\n onActiveLevelChange={onActiveLevelChange}\n routeOnSelect={routeOnSelect}\n imageProxyUrl={imageProxyUrl}\n />\n </Suspense>\n </div>\n );\n}\n","import type { CmConnector, PublishedDocument } from '../core';\nimport { compileDocument } from '../core';\nimport type { EditorDraftState } from './draftOps';\n\nexport function compileEditorPreview(\n draft: EditorDraftState,\n extras?: {\n revisionId?: number;\n revisionNumber?: number;\n connectors?: CmConnector[];\n publishedAt?: string;\n },\n): PublishedDocument {\n const outdoor = draft.levels.find((level) => level.kind === 'outdoor');\n return compileDocument({\n revisionId: extras?.revisionId ?? 0,\n revisionNumber: extras?.revisionNumber ?? 0,\n centerId: draft.centerId,\n mapId: draft.mapId,\n theme: draft.theme,\n baseSvgUrl: draft.baseSvgUrl ?? outdoor?.sourceSvgUrl ?? null,\n baseViewbox: outdoor?.sourceViewbox ?? null,\n buildings: draft.buildings,\n levels: draft.levels,\n shapes: draft.shapes.filter((s) => !s.orphanedAt),\n assignments: draft.assignments,\n anchors: draft.anchors,\n edges: draft.edges,\n connectors: extras?.connectors ?? [],\n amenities: draft.amenities,\n responsiveOverrides: [],\n publishedAt: extras?.publishedAt,\n /** Prefer already-resolved CDN URLs on draft levels (outdoor SVG). */\n resolveSvgUrl: (key) => {\n if (!key) return null;\n const match = draft.levels.find(\n (l) => l.sourceSvgKey === key || l.sourceSvgUrl === key,\n );\n return match?.sourceSvgUrl ?? key;\n },\n });\n}\n","import type { MapEditorHost } 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/**\n * PORTAL default is MapViewer (assign on the real map, no editor grid).\n * Edit Map swaps in EditorCanvas + grid. Non-PORTAL editor hosts stay on\n * the geometry canvas.\n */\nexport function portalCenterSurface(\n host: MapEditorHost,\n section: RailSection | null,\n): PortalCenterSurface {\n if (host === 'PORTAL' && section !== 'edit-map') return 'viewer';\n return 'editor';\n}\n","import React from 'react';\n\nexport type EditorTool =\n | 'select'\n | 'pan'\n | 'draw-unit'\n | 'draw-polygon'\n | 'draw-line'\n | 'draw-route';\n\nexport const EDITOR_TOOLS: Array<{\n id: EditorTool;\n label: string;\n draw?: boolean;\n}> = [\n { id: 'select', label: 'Select' },\n { id: 'pan', label: 'Pan' },\n { id: 'draw-unit', label: 'Draw rectangle', draw: true },\n { id: 'draw-polygon', label: 'Draw polygon', draw: true },\n { id: 'draw-line', label: 'Draw line', draw: true },\n { id: 'draw-route', label: 'Routes / wayfinding', draw: true },\n];\n\nconst ICON_PROPS = {\n width: 16,\n height: 16,\n viewBox: '0 0 16 16',\n fill: 'none',\n 'aria-hidden': true,\n} as const;\n\nfunction SelectIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M3.2 2.4 12.4 8.1l-4.1.6 1.8 4.6-1.8.7-1.8-4.6-2.6 2.4z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\nfunction PanIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M4.15 8.05V6.7a.95.95 0 0 1 1.9 0V8.15M6.05 7.2V4.1a.95.95 0 1 1 1.9 0V7.05M7.95 6.9V3.2a.95.95 0 1 1 1.9 0V6.95M9.85 7V3.9a.95.95 0 1 1 1.9 0v5.05c0 2.05-1.5 3.4-3.6 3.4-1.75 0-3.15-1.05-3.35-2.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.45\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction DrawRectIcon() {\n return (\n <svg {...ICON_PROPS}>\n <rect\n x=\"2.5\"\n y=\"3.5\"\n width=\"11\"\n height=\"9\"\n rx=\"1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n />\n </svg>\n );\n}\n\nfunction DrawPolygonIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M8 2.5 13.2 6.2 11.2 12.5H4.8L2.8 6.2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction DrawLineIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M3 12.5 13 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"3\" cy=\"12.5\" r=\"1.4\" fill=\"currentColor\" />\n <circle cx=\"13\" cy=\"3.5\" r=\"1.4\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction 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 JoinIcon() {\n return (\n <svg {...ICON_PROPS}>\n <circle cx=\"4\" cy=\"8\" r=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <circle cx=\"12\" cy=\"8\" r=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M6 8h4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nconst TOOL_ICONS: Record<EditorTool, () => React.ReactElement> = {\n select: SelectIcon,\n pan: PanIcon,\n 'draw-unit': DrawRectIcon,\n 'draw-polygon': DrawPolygonIcon,\n 'draw-line': DrawLineIcon,\n 'draw-route': DrawRouteIcon,\n};\n\nexport function toolHint(tool: EditorTool): string {\n switch (tool) {\n case 'pan':\n return 'Drag the map to move around.';\n case 'draw-unit':\n return 'Click and drag to draw a store rectangle.';\n case 'draw-polygon':\n return 'Click to place points. Click the first point or press Enter to close. Esc cancels.';\n case 'draw-line':\n return 'Click and drag to draw a line.';\n case 'draw-route':\n return 'Click the map to place path points. Drag two points together, then Join points, to connect them.';\n default:\n return 'Click a shape to select it. Drag to move; drag anchors to reshape.';\n }\n}\n\nexport interface EditorToolButtonsProps {\n tool: EditorTool;\n onToolChange: (tool: EditorTool) => void;\n canEdit: boolean;\n}\n\nexport function EditorToolButtons({\n tool,\n onToolChange,\n canEdit,\n}: EditorToolButtonsProps) {\n return (\n <div className=\"eyeon-map-editor__tool-icons\" role=\"toolbar\" aria-label=\"Map tools\">\n {EDITOR_TOOLS.map((t) => {\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${tool === t.id ? ' is-active' : ''}`}\n data-tooltip={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 </button>\n );\n })}\n </div>\n );\n}\n\nexport interface JoinPointsButtonProps {\n disabled: boolean;\n onClick: () => void;\n}\n\nexport function JoinPointsButton({ disabled, onClick }: JoinPointsButtonProps) {\n return (\n <button\n type=\"button\"\n className=\"eyeon-map-editor__tool-icon\"\n data-tooltip=\"Join points\"\n aria-label=\"Join points\"\n onClick={onClick}\n disabled={disabled}\n >\n <JoinIcon />\n </button>\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 MapEditorHost,\n PublishedDocument,\n ShapeKind,\n} from '../core';\nimport type { ShapeGeometry } from '../core';\nimport { defaultViewerLevelId, mergeTheme, snapAngle } from '../core';\nimport { EditorCanvas } from './canvas/EditorCanvas';\nimport { applyDraftOps, coalesceDraftOp, type EditorDraftState } from './draftOps';\nimport { LeftRail, type RailSection } from './panels/LeftRail';\nimport type { CreateLevelInput, UpdateLevelInput } from './panels/FloorsPanel';\nimport { Inspector } from './panels/Inspector';\nimport { PreviewOverlay } from './panels/PreviewOverlay';\nimport { compileEditorPreview } from './previewDocument';\nimport { portalCenterSurface } from './portalSurface';\nimport {\n EditorToolButtons,\n JoinPointsButton,\n toolHint,\n type EditorTool,\n} from './tools';\nimport './editor.css';\n\nexport type { EditorDraftState } from './draftOps';\nexport type { MapEditorHost } from '../core';\nexport type { EditorTool } from './tools';\n\nexport interface MapEditorProps {\n /**\n * Where the editor is embedded. `PORTAL` (default) always includes Map\n * options (LeftRail: Floors, Kiosks, Style, plus Edit Map — never viewer\n * chrome). Default center is MapViewer (click-to-assign, no grid). Edit\n * Map swaps in the geometry canvas and editor grid. `WEBSITE` is canvas +\n * toolbar only — public sites should use `MapViewer`, not this editor.\n */\n host?: MapEditorHost;\n draft: EditorDraftState;\n webApiURI: string;\n canEdit?: boolean;\n canFloors?: boolean;\n canSettings?: boolean;\n onBatch?: (ops: BatchOp[]) => Promise<void>;\n onPublish?: () => Promise<void>;\n onImportSvg?: (levelId: number, file: File) => Promise<void>;\n onCreateLevel?: (input: CreateLevelInput) => Promise<number | void>;\n onUpdateLevel?: (input: UpdateLevelInput) => Promise<void>;\n onDeleteLevel?: (levelId: number) => Promise<void>;\n onReorderLevels?: (orderedIds: number[]) => Promise<void>;\n onAutoroute?: (levelId: number) => Promise<void>;\n previewDocument?: PublishedDocument | null;\n /**\n * Media proxy base, same contract as v1 `IMAGE_PROXY_URL` (base + encoded\n * URL). Required whenever the outdoor SVG is served from a origin that does\n * not send CORS headers, otherwise its decoration silently fails to load.\n */\n imageProxyUrl?: string | null;\n className?: string;\n /** Quiet extra actions under the left rail (e.g. developer Classic Map). */\n sidebarFooter?: ReactNode;\n}\n\nexport function MapEditor({\n host = 'PORTAL',\n draft,\n canEdit = true,\n canFloors = true,\n canSettings = true,\n onBatch,\n onPublish,\n onImportSvg,\n onCreateLevel,\n onUpdateLevel,\n onDeleteLevel,\n onReorderLevels,\n onAutoroute,\n previewDocument,\n imageProxyUrl,\n className,\n sidebarFooter,\n}: MapEditorProps) {\n const [section, setSection] = useState<RailSection | null>(null);\n const [activeLevelId, setActiveLevelId] = useState<number | null>(\n defaultViewerLevelId(draft.levels) ?? draft.levels[0]?.id ?? null,\n );\n const [selectedShapeId, setSelectedShapeId] = useState<number | null>(null);\n const [selectedAnchorIds, setSelectedAnchorIds] = useState<number[]>([]);\n const [tool, setTool] = useState<EditorTool>('select');\n const [baseAngle, setBaseAngle] = useState(0);\n const [editVersion, setEditVersion] = useState(0);\n const [needsPublish, setNeedsPublish] = useState(false);\n const [saving, setSaving] = useState(false);\n const pendingOps = useRef<BatchOp[]>([]);\n const nextTempId = useRef(-1);\n\n useEffect(() => {\n pendingOps.current = [];\n setEditVersion(0);\n setNeedsPublish(false);\n }, [draft.mapId, draft.centerId]);\n\n // Levels can arrive after the first render, or the active one can be deleted.\n useEffect(() => {\n if (draft.levels.some((level) => level.id === activeLevelId)) return;\n setActiveLevelId(defaultViewerLevelId(draft.levels) ?? draft.levels[0]?.id ?? null);\n }, [draft.levels, activeLevelId]);\n\n const workingDraft = useMemo(\n () => applyDraftOps(draft, pendingOps.current),\n [draft, editVersion],\n );\n\n const theme = useMemo(\n () => mergeTheme(workingDraft.theme),\n [workingDraft.theme],\n );\n\n const dirty = pendingOps.current.length > 0 || needsPublish;\n const activeLevel = workingDraft.levels.find((l) => l.id === activeLevelId) ?? null;\n const outdoorLevel = workingDraft.levels.find((l) => l.kind === 'outdoor') ?? null;\n const outdoorShapes =\n outdoorLevel && activeLevel?.kind === 'floor'\n ? workingDraft.shapes.filter((s) => s.levelId === outdoorLevel.id)\n : [];\n const levelShapes = workingDraft.shapes.filter((s) => s.levelId === activeLevelId);\n const compiledPreview = useMemo(\n () =>\n compileEditorPreview(workingDraft, {\n revisionId: previewDocument?.revisionId,\n revisionNumber: previewDocument?.revisionNumber,\n connectors: previewDocument?.connectors,\n publishedAt: previewDocument?.publishedAt,\n }),\n [workingDraft, previewDocument],\n );\n const levelAnchors = workingDraft.anchors.filter((a) => a.levelId === activeLevelId);\n const levelEdges = workingDraft.edges.filter((e) => {\n const a = workingDraft.anchors.find((x) => x.id === e.fromAnchorId);\n return a?.levelId === activeLevelId;\n });\n const selectedShape =\n workingDraft.shapes.find((s) => s.id === selectedShapeId) ?? null;\n const selectedAssignment =\n workingDraft.assignments.find((a) => a.shapeId === selectedShapeId) ?? null;\n\n const queueOp = useCallback((op: BatchOp): number | null => {\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 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 return null;\n }, []);\n\n const handleSaveChanges = useCallback(async () => {\n if (!canEdit || saving) return;\n const ops = pendingOps.current;\n if (!ops.length && !needsPublish) return;\n pendingOps.current = [];\n setEditVersion((n) => n + 1);\n setSaving(true);\n let persisted = !ops.length;\n try {\n if (ops.length && onBatch) {\n await onBatch(ops);\n persisted = true;\n }\n await onPublish?.();\n setNeedsPublish(false);\n } catch {\n if (!persisted) {\n pendingOps.current = ops;\n setEditVersion((n) => n + 1);\n } else {\n setNeedsPublish(true);\n }\n } finally {\n setSaving(false);\n }\n }, [canEdit, needsPublish, onBatch, onPublish, saving]);\n\n const handleSectionChange = useCallback(\n (next: RailSection | null) => {\n if (section === 'edit-map' && next !== 'edit-map') {\n setTool('select');\n }\n setSection(next);\n },\n [section],\n );\n\n const handleSelectShape = useCallback(\n (id: number | null) => {\n setSelectedShapeId(id);\n if (id == null) return;\n const shape = workingDraft.shapes.find((s) => s.id === id);\n if (shape) setActiveLevelId(shape.levelId);\n setSection((current) => {\n if (current === 'edit-map') return current;\n if (shape?.kind === 'unit' || shape?.kind === 'parking_zone') return 'stores';\n if (shape?.kind === 'amenity') return 'amenities';\n if (shape?.kind === 'kiosk_screen') return 'kiosks';\n return 'selection';\n });\n },\n [workingDraft.shapes],\n );\n\n const handleWeldSelected = () => {\n if (selectedAnchorIds.length < 2) return;\n queueOp({\n op: 'weld_anchors',\n anchorIds: selectedAnchorIds,\n });\n setSelectedAnchorIds([selectedAnchorIds[0]]);\n };\n\n const handleRenameShape = (key: string) => {\n if (!selectedShape || !canEdit) return;\n const clash = workingDraft.shapes.some(\n (s) =>\n s.id !== selectedShape.id &&\n s.levelId === selectedShape.levelId &&\n s.key === key &&\n !s.orphanedAt,\n );\n if (clash) return;\n queueOp({\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key,\n kind: selectedShape.kind,\n },\n });\n };\n\n const handleDeleteShape = () => {\n if (!selectedShape || !canEdit) return;\n queueOp({ op: 'delete_shape', shapeId: selectedShape.id });\n setSelectedShapeId(null);\n };\n\n const handleUpdateShapeGeometry = (shapeId: number, geometry: ShapeGeometry) => {\n if (!canEdit) return;\n const shape = workingDraft.shapes.find((s) => s.id === shapeId);\n if (!shape) return;\n queueOp({\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 geometryLocked: true,\n },\n });\n };\n\n const handleChangeKind = (kind: ShapeKind) => {\n if (!selectedShape || !canEdit) return;\n queueOp({\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind,\n },\n });\n };\n\n const showMapOptions = host === 'PORTAL';\n const centerSurface = portalCenterSurface(host, section);\n const isEditMap = centerSurface === 'editor';\n\n const assignPanel = (\n <Inspector\n shape={selectedShape}\n assignment={selectedAssignment}\n amenities={workingDraft.amenities}\n levelShapeKeys={levelShapes\n .filter((s) => s.id !== selectedShapeId)\n .map((s) => s.key)}\n canEdit={canEdit}\n onRename={handleRenameShape}\n onChangeKind={handleChangeKind}\n onDelete={handleDeleteShape}\n onSaveAssignment={(assignment) => {\n if (!canEdit) return;\n queueOp({ op: 'upsert_assignment', assignment });\n }}\n />\n );\n\n const renderRouteExtras = () => (\n <>\n <JoinPointsButton\n disabled={selectedAnchorIds.length < 2}\n onClick={handleWeldSelected}\n />\n <label className=\"eyeon-map-editor__angle\">\n Snap °\n <input\n type=\"number\"\n value={baseAngle}\n onChange={(e) => setBaseAngle(Number(e.target.value) || 0)}\n />\n </label>\n </>\n );\n\n return (\n <div className={`eyeon-map-editor eyeon-map-editor--${host} ${className ?? ''}`}>\n {showMapOptions ? (\n <LeftRail\n section={section}\n onSectionChange={handleSectionChange}\n draft={workingDraft}\n activeLevelId={activeLevelId}\n selectedShapeId={selectedShapeId}\n onSelectShape={(id) => handleSelectShape(id)}\n canFloors={canFloors}\n canSettings={canSettings}\n onImportSvg={onImportSvg}\n onCreateLevel={onCreateLevel}\n onUpdateLevel={onUpdateLevel}\n onDeleteLevel={onDeleteLevel}\n onReorderLevels={onReorderLevels}\n onAutoroute={onAutoroute}\n theme={theme}\n onThemeChange={(partial) => {\n if (!canSettings) return;\n queueOp({ op: 'update_theme', theme: { ...workingDraft.theme, ...partial } });\n }}\n footer={sidebarFooter}\n assignPanel={assignPanel}\n editMapPanel={\n <>\n <label className=\"eyeon-map-rail__field\">\n Level to edit\n <select\n value={activeLevelId ?? ''}\n onChange={(e) =>\n setActiveLevelId(e.target.value ? Number(e.target.value) : null)\n }\n >\n <option value=\"\">Choose floor or Outdoor…</option>\n {workingDraft.levels.map((l) => (\n <option key={l.id} value={l.id}>\n {l.kind === 'outdoor' ? `Outdoor — ${l.name}` : l.name}\n </option>\n ))}\n </select>\n </label>\n <EditorToolButtons tool={tool} onToolChange={setTool} canEdit={canEdit} />\n <p className=\"eyeon-map-rail__hint\">{toolHint(tool)}</p>\n {tool === 'draw-route' && (\n <div className=\"eyeon-map-rail__tool-extras\">\n {renderRouteExtras()}\n <div className=\"eyeon-map-rail__stat\">\n {levelAnchors.length} path points · {levelEdges.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 {assignPanel}\n </>\n }\n />\n ) : null}\n\n <div className=\"eyeon-map-editor__center\">\n <div className=\"eyeon-map-editor__toolbar\">\n <div className=\"eyeon-map-editor__tools\">\n {isEditMap ? (\n <>\n <EditorToolButtons\n tool={tool}\n onToolChange={setTool}\n canEdit={canEdit}\n />\n {tool === 'draw-route' ? renderRouteExtras() : null}\n </>\n ) : null}\n </div>\n <div className=\"eyeon-map-editor__actions\">\n {dirty && (\n <span className=\"eyeon-map-editor__unsaved\">Unsaved changes</span>\n )}\n <button\n type=\"button\"\n className=\"eyeon-map-editor__save\"\n onClick={() => void handleSaveChanges()}\n disabled={!canEdit || !dirty || saving}\n >\n {saving ? 'Saving…' : 'Save Changes'}\n </button>\n </div>\n </div>\n\n {centerSurface === 'viewer' ? (\n <PreviewOverlay\n document={compiledPreview}\n host=\"PORTAL_ASSIGN\"\n onSelectShape={handleSelectShape}\n routeOnSelect={false}\n imageProxyUrl={imageProxyUrl}\n />\n ) : (\n <>\n {isEditMap && tool === 'draw-route' && (\n <div className=\"eyeon-map-editor__hint\">\n Click the map to place path points. Drag two points together, then\n Join points, to connect them.\n </div>\n )}\n\n <div className=\"eyeon-map-editor__canvas-wrap\">\n <EditorCanvas\n level={activeLevel}\n shapes={levelShapes.filter((s) => !s.orphanedAt)}\n underlayShapes={outdoorShapes.filter((s) => !s.orphanedAt)}\n anchors={levelAnchors}\n edges={levelEdges}\n assignments={workingDraft.assignments}\n theme={theme}\n tool={tool}\n baseAngle={baseAngle}\n selectedShapeId={selectedShapeId}\n selectedAnchorIds={selectedAnchorIds}\n baseSvgUrl={workingDraft.baseSvgUrl ?? null}\n baseViewbox={outdoorLevel?.sourceViewbox ?? null}\n levelSvgUrl={\n activeLevel?.kind === 'outdoor'\n ? (activeLevel.sourceSvgUrl ?? workingDraft.baseSvgUrl ?? null)\n : null\n }\n interactiveOnly={activeLevel?.kind === 'outdoor'}\n showGrid\n onSelectShape={handleSelectShape}\n onSelectAnchors={setSelectedAnchorIds}\n onCreateRoutePoint={(point, prevAnchorId) => {\n if (!activeLevel || !canEdit) return;\n const snapped = prevAnchorId\n ? snapAngle(\n levelAnchors.find((a) => a.id === prevAnchorId) ?? point,\n point,\n baseAngle,\n )\n : point;\n queueOp({\n op: 'upsert_anchor',\n anchor: {\n levelId: activeLevel.id,\n x: snapped.x,\n y: snapped.y,\n kind: 'junction',\n },\n });\n }}\n onMoveAnchor={(anchorId, x, y) => {\n if (!canEdit) return;\n const anchor = levelAnchors.find((a) => a.id === anchorId);\n if (!anchor) return;\n queueOp({\n op: 'upsert_anchor',\n anchor: { ...anchor, x, y },\n });\n }}\n onCreateShape={(kind, geometry) => {\n if (!activeLevel || !canEdit) return;\n const id = queueOp({\n op: 'upsert_shape',\n shape: {\n levelId: activeLevel.id,\n key: `${kind}-${Date.now()}`,\n kind,\n geometry,\n origin: 'manual',\n geometryLocked: true,\n },\n });\n if (id != null) handleSelectShape(id);\n }}\n onUpdateShapeGeometry={handleUpdateShapeGeometry}\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';\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 <select\n value={remap[item.existingShapeId!] ?? ''}\n disabled={busy || buckets.added.length === 0}\n onChange={(e) =>\n setRemap((prev) => ({\n ...prev,\n [item.existingShapeId!]: e.target.value,\n }))\n }\n >\n <option value=\"\">Keep orphaned</option>\n {buckets.added.map((a) => (\n <option key={a.sourceSvgId} value={a.sourceSvgId}>\n {a.sourceSvgId}\n </option>\n ))}\n </select>\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":["clonePolygons","polygons","poly","p","polygonsToPathD","d","i","polygonsToGeometry","cleaned","translateGeometry","geometry","dx","dy","moveVertex","polygonIndex","vertexIndex","point","insertVertex","afterVertexIndex","removeVertex","hitTestVertex","tolerance","best","vertex","distance","hitTestEdgeMidpoint","a","b","mid","clientToUser","ctm","clientX","clientY","det","x","y","clientToSvgUser","svg","userToWorld","user","pan","zoom","z","rectPolygon","dragSize","polygonsToPath","isEditableShape","shape","interactiveOnly","INTERACTIVE_SHAPE_KINDS","EditorCanvas","level","shapes","anchors","edges","theme","tool","baseAngle","selectedShapeId","selectedAnchorIds","baseSvgUrl","baseViewbox","levelSvgUrl","underlayShapes","showGrid","onSelectShape","onSelectAnchors","onCreateRoutePoint","onMoveAnchor","onCreateShape","onUpdateShapeGeometry","svgRef","useRef","setPan","useState","setZoom","drawing","setDrawing","polygonPoints","setPolygonPoints","dragAnchor","setDragAnchor","lastRouteAnchor","setLastRouteAnchor","shapeDrag","setShapeDrag","shapeOffset","setShapeOffset","vertexDrag","setVertexDrag","selectedVertex","setSelectedVertex","panStart","useEffect","viewbox","unionViewBox","underlayUrl","editableShapes","useMemo","s","selectedShape","displayGeometry","toWorld","anchorById","closePolygon","onKey","e","next","onPointerDown","world","first","prev","snapped","snapAngle","_b","_a","handleTol","hit","_d","_c","edgeHit","onPointerMove","finishRect","finishLine","onPointerUp","moved","near","shapePathD","jsx","jsxs","pi","vi","selected","edge","anchor","nearWeld","id","other","Fragment","geometryBbox","points","bboxOf","upsertById","rows","idx","row","copy","applyDraftOp","draft","op","incoming","existing","assignment","rest","ids","keep","removed","applyDraftOps","ops","healDraftGeometry","changed","normalizeGeometrySpace","geometryBBox","coalesceDraftOp","item","acc","SHAPE_KIND_LABELS","UNIT_STATUS_LABELS","shapeKindLabel","kind","floorsScreenTitle","screen","levels","visibleFloorCount","l","moveLevelId","movedId","toIndex","without","clamped","sameIdOrder","formatBytes","size","svgFileName","key","isSvgFile","GripIcon","TrashIcon","deleteConfirmCopy","shapeCount","isOutdoor","FloorsPanel","buildings","levelShapeCounts","canFloors","onScreenChange","onCreateLevel","onUpdateLevel","onDeleteLevel","onReorderLevels","name","setName","file","setFile","busy","setBusy","error","setError","progress","setProgress","dragOver","setDragOver","confirmDeleteId","setConfirmDeleteId","deleting","setDeleting","drag","setDrag","previewIds","setPreviewIds","previewFailed","setPreviewFailed","localPreviewUrl","setLocalPreviewUrl","fileInputRef","floorListRef","floorRectsRef","previewIdsRef","dragRef","outdoor","outdoorReady","levelId","buildingFloors","compareBuildingFloors","committedIds","displayFloors","byId","editing","isOutdoorForm","canManage","canReorder","url","useLayoutEffect","root","nodes","nextTops","node","nextTop","prevTop","takeSvgFile","openEdit","submit","picked","svgFile","remove","renderDeleteModal","renderRowDelete","previewMoveToY","current","others","insertAt","rect","persistPreview","nextIds","endDrag","onMove","onUp","startDrag","hasExistingSvg","showEditPreview","previewUrl","previewFallback","importedCount","showReimportNotice","primaryLabel","primaryBusyLabel","createPortal","NAV_ITEMS","SECTION_TITLES","BackIcon","ChevronIcon","LeftRail","section","onSectionChange","activeLevelId","canSettings","onAutoroute","onThemeChange","assignPanel","editMapPanel","footer","floorsScreen","setFloorsScreen","levelShapes","storeShapes","amenityShapes","kioskShapes","activeLevel","pathCount","counts","renderShapeList","empty","label","SHAPE_KINDS","UNIT_STATUSES","Inspector","amenities","levelShapeKeys","canEdit","onRename","onChangeKind","onDelete","onSaveAssignment","setKey","keyError","setKeyError","retailerId","setRetailerId","amenityId","setAmenityId","kioskId","setKioskId","unitStatus","setUnitStatus","unitNumber","setUnitNumber","customLabel","setCustomLabel","k","PreviewOverlay","document","host","onActiveLevelChange","routeOnSelect","imageProxyUrl","Suspense","MapViewer","compileEditorPreview","extras","compileDocument","match","portalCenterSurface","EDITOR_TOOLS","ICON_PROPS","SelectIcon","PanIcon","DrawRectIcon","DrawPolygonIcon","DrawLineIcon","DrawRouteIcon","JoinIcon","TOOL_ICONS","toolHint","EditorToolButtons","onToolChange","t","Icon","JoinPointsButton","disabled","onClick","MapEditor","onBatch","onPublish","onImportSvg","previewDocument","className","sidebarFooter","setSection","setActiveLevelId","defaultViewerLevelId","setSelectedShapeId","setSelectedAnchorIds","setTool","setBaseAngle","editVersion","setEditVersion","needsPublish","setNeedsPublish","saving","setSaving","pendingOps","nextTempId","workingDraft","mergeTheme","dirty","outdoorLevel","outdoorShapes","compiledPreview","levelAnchors","levelEdges","selectedAssignment","queueOp","useCallback","n","handleSaveChanges","persisted","handleSectionChange","handleSelectShape","handleWeldSelected","handleRenameShape","handleDeleteShape","handleUpdateShapeGeometry","shapeId","handleChangeKind","showMapOptions","centerSurface","isEditMap","renderRouteExtras","partial","prevAnchorId","anchorId","bucketLabel","change","ImportReviewPanel","diff","viewBoxChanged","blockedMessage","onApply","onCancel","remap","setRemap","buckets","added","orphaned","locked","to","from","toSourceSvgId"],"mappings":"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"}