@eyeon/map 2.0.0

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 (58) hide show
  1. package/README.md +27 -0
  2. package/dist/assets/MapViewer.css +1 -0
  3. package/dist/assets/index.css +1 -0
  4. package/dist/chunks/MapViewer.js +530 -0
  5. package/dist/chunks/MapViewer.js.map +1 -0
  6. package/dist/chunks/graph-tools.js +153 -0
  7. package/dist/chunks/graph-tools.js.map +1 -0
  8. package/dist/chunks/pathfinding.js +343 -0
  9. package/dist/chunks/pathfinding.js.map +1 -0
  10. package/dist/core/geometry/index.d.ts +42 -0
  11. package/dist/core/geometry/index.d.ts.map +1 -0
  12. package/dist/core/import/index.d.ts +51 -0
  13. package/dist/core/import/index.d.ts.map +1 -0
  14. package/dist/core/index.d.ts +7 -0
  15. package/dist/core/index.d.ts.map +1 -0
  16. package/dist/core/index.js +282 -0
  17. package/dist/core/index.js.map +1 -0
  18. package/dist/core/publish/index.d.ts +28 -0
  19. package/dist/core/publish/index.d.ts.map +1 -0
  20. package/dist/core/routing/graph-tools.d.ts +47 -0
  21. package/dist/core/routing/graph-tools.d.ts.map +1 -0
  22. package/dist/core/routing/pathfinding.d.ts +22 -0
  23. package/dist/core/routing/pathfinding.d.ts.map +1 -0
  24. package/dist/core/types.d.ts +406 -0
  25. package/dist/core/types.d.ts.map +1 -0
  26. package/dist/editor/MapEditor.d.ts +31 -0
  27. package/dist/editor/MapEditor.d.ts.map +1 -0
  28. package/dist/editor/canvas/EditorCanvas.d.ts +22 -0
  29. package/dist/editor/canvas/EditorCanvas.d.ts.map +1 -0
  30. package/dist/editor/index.css +248 -0
  31. package/dist/editor/index.d.ts +5 -0
  32. package/dist/editor/index.d.ts.map +1 -0
  33. package/dist/editor/index.js +734 -0
  34. package/dist/editor/index.js.map +1 -0
  35. package/dist/editor/panels/Inspector.d.ts +14 -0
  36. package/dist/editor/panels/Inspector.d.ts.map +1 -0
  37. package/dist/editor/panels/LeftRail.d.ts +36 -0
  38. package/dist/editor/panels/LeftRail.d.ts.map +1 -0
  39. package/dist/editor/panels/PreviewOverlay.d.ts +6 -0
  40. package/dist/editor/panels/PreviewOverlay.d.ts.map +1 -0
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/viewer/MapViewer.d.ts +26 -0
  44. package/dist/viewer/MapViewer.d.ts.map +1 -0
  45. package/dist/viewer/components/LevelMeshes.d.ts +11 -0
  46. package/dist/viewer/components/LevelMeshes.d.ts.map +1 -0
  47. package/dist/viewer/components/MapScene.d.ts +12 -0
  48. package/dist/viewer/components/MapScene.d.ts.map +1 -0
  49. package/dist/viewer/components/RouteLine.d.ts +8 -0
  50. package/dist/viewer/components/RouteLine.d.ts.map +1 -0
  51. package/dist/viewer/index.css +210 -0
  52. package/dist/viewer/index.d.ts +4 -0
  53. package/dist/viewer/index.d.ts.map +1 -0
  54. package/dist/viewer/index.js +7 -0
  55. package/dist/viewer/index.js.map +1 -0
  56. package/dist/viewer/ui/RuntimeChrome.d.ts +19 -0
  57. package/dist/viewer/ui/RuntimeChrome.d.ts.map +1 -0
  58. package/package.json +81 -0
@@ -0,0 +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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"}
@@ -0,0 +1,14 @@
1
+ import { default as React } from 'react';
2
+ import { CmAmenityCatalogItem, CmShape, CmShapeAssignment, ShapeKind } from '../../core';
3
+ export interface InspectorProps {
4
+ shape: CmShape | null;
5
+ assignment: CmShapeAssignment | null;
6
+ amenities: CmAmenityCatalogItem[];
7
+ canEdit: boolean;
8
+ onRename: (key: string) => void;
9
+ onChangeKind: (kind: ShapeKind) => void;
10
+ onSaveAssignment: (assignment: CmShapeAssignment) => void;
11
+ undoCount: number;
12
+ }
13
+ export declare function Inspector({ shape, assignment, amenities, canEdit, onRename, onChangeKind, onSaveAssignment, undoCount, }: InspectorProps): React.JSX.Element;
14
+ //# sourceMappingURL=Inspector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Inspector.d.ts","sourceRoot":"","sources":["../../../src/editor/panels/Inspector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,KAAK,EACV,oBAAoB,EACpB,OAAO,EACP,iBAAiB,EACjB,SAAS,EAEV,MAAM,YAAY,CAAC;AA6BpB,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,YAAY,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACxC,gBAAgB,EAAE,CAAC,UAAU,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC1D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,UAAU,EACV,SAAS,EACT,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,gBAAgB,EAChB,SAAS,GACV,EAAE,cAAc,qBA6KhB"}
@@ -0,0 +1,36 @@
1
+ import { default as React } from 'react';
2
+ import { CmAmenityCatalogItem, CmLevel, CmBuilding, ThemeDefaults } from '../../core';
3
+ export type RailTab = 'levels' | 'shapes' | 'routes' | 'amenities' | 'kiosks' | 'theme';
4
+ export interface LeftRailDraft {
5
+ buildings: CmBuilding[];
6
+ levels: CmLevel[];
7
+ shapes: Array<{
8
+ id: number;
9
+ levelId: number;
10
+ key: string;
11
+ kind: string;
12
+ }>;
13
+ anchors: Array<{
14
+ id: number;
15
+ levelId: number;
16
+ }>;
17
+ edges: Array<{
18
+ id: number;
19
+ }>;
20
+ amenities: CmAmenityCatalogItem[];
21
+ }
22
+ export interface LeftRailProps {
23
+ tab: RailTab;
24
+ onTabChange: (tab: RailTab) => void;
25
+ draft: LeftRailDraft;
26
+ activeLevelId: number | null;
27
+ onSelectLevel: (id: number) => void;
28
+ canFloors: boolean;
29
+ canSettings: boolean;
30
+ onImportSvg?: (levelId: number, file: File) => Promise<void>;
31
+ onAutoroute?: (levelId: number) => Promise<void>;
32
+ theme: ThemeDefaults;
33
+ onThemeChange: (partial: Partial<ThemeDefaults>) => void;
34
+ }
35
+ export declare function LeftRail({ tab, onTabChange, draft, activeLevelId, onSelectLevel, canFloors, canSettings, onImportSvg, onAutoroute, theme, onThemeChange, }: LeftRailProps): React.JSX.Element;
36
+ //# sourceMappingURL=LeftRail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LeftRail.d.ts","sourceRoot":"","sources":["../../../src/editor/panels/LeftRail.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EACV,oBAAoB,EACpB,OAAO,EACP,UAAU,EACV,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,OAAO,GACf,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,OAAO,CAAC;AAEZ,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1E,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7B,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,OAAO,CAAC;IACb,WAAW,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IACpC,KAAK,EAAE,aAAa,CAAC;IACrB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,KAAK,EAAE,aAAa,CAAC;IACrB,aAAa,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC;CAC1D;AAWD,wBAAgB,QAAQ,CAAC,EACvB,GAAG,EACH,WAAW,EACX,KAAK,EACL,aAAa,EACb,aAAa,EACb,SAAS,EACT,WAAW,EACX,WAAW,EACX,WAAW,EACX,KAAK,EACL,aAAa,GACd,EAAE,aAAa,qBAyKf"}
@@ -0,0 +1,6 @@
1
+ import { default as React } from 'react';
2
+ import { PublishedDocument } from '../../core';
3
+ export declare function PreviewOverlay({ document }: {
4
+ document: PublishedDocument;
5
+ }): React.JSX.Element;
6
+ //# sourceMappingURL=PreviewOverlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviewOverlay.d.ts","sourceRoot":"","sources":["../../../src/editor/panels/PreviewOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGpD,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,iBAAiB,CAAA;CAAE,qBAQ3E"}
@@ -0,0 +1,3 @@
1
+ /** Root re-exports core by default. Prefer subpath imports. */
2
+ export * from './core';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,cAAc,QAAQ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { default as React } from 'react';
2
+ import { PublishedDocument, ThemeDefaults } from '../core';
3
+ export interface MapViewerProps {
4
+ /** Published (or draft) document. If omitted, fetched from webApiURI. */
5
+ document?: PublishedDocument | null;
6
+ webApiURI?: string;
7
+ /** Prefer fetching /v1/map/document */
8
+ centerId?: number;
9
+ role?: 'WP_SITE' | 'DISPLAY_APP' | 'PORTAL_PREVIEW' | 'DEMO';
10
+ kioskId?: number | null;
11
+ selectedRetailerId?: number | null;
12
+ imageProxyUrl?: string;
13
+ themeOverrides?: Partial<ThemeDefaults>;
14
+ onExtractedAmenities?: (codes: string[]) => void;
15
+ onSelectShape?: (shapeId: number) => void;
16
+ createRouteRef?: React.MutableRefObject<{
17
+ createRouteToStore: (retailerId: number) => void;
18
+ createRouteToAmenity: (amenityCode: string) => void;
19
+ clearRoute: () => void;
20
+ } | null>;
21
+ className?: string;
22
+ style?: React.CSSProperties;
23
+ }
24
+ export declare function MapViewer(props: MapViewerProps): React.JSX.Element;
25
+ export default MapViewer;
26
+ //# sourceMappingURL=MapViewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MapViewer.d.ts","sourceRoot":"","sources":["../../src/viewer/MapViewer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiD,MAAM,OAAO,CAAC;AACtE,OAAO,KAAK,EAGV,iBAAiB,EACjB,aAAa,EACd,MAAM,SAAS,CAAC;AAIjB,OAAO,cAAc,CAAC;AAEtB,MAAM,WAAW,cAAc;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,gBAAgB,GAAG,MAAM,CAAC;IAC7D,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACxC,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACjD,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,cAAc,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC;QACtC,kBAAkB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;QACjD,oBAAoB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;QACpD,UAAU,EAAE,MAAM,IAAI,CAAC;KACxB,GAAG,IAAI,CAAC,CAAC;IACV,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAWD,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,qBAuO9C;AAED,eAAe,SAAS,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { default as React } from 'react';
2
+ import { PublishedLevel, ThemeDefaults } from '../../core';
3
+ export interface LevelMeshesProps {
4
+ level: PublishedLevel;
5
+ theme: ThemeDefaults;
6
+ is3d: boolean;
7
+ selectedRetailerId?: number | null;
8
+ onSelectShape?: (shapeId: number) => void;
9
+ }
10
+ export declare function LevelMeshes({ level, theme, is3d, selectedRetailerId, onSelectShape, }: LevelMeshesProps): React.JSX.Element;
11
+ //# sourceMappingURL=LevelMeshes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LevelMeshes.d.ts","sourceRoot":"","sources":["../../../src/viewer/components/LevelMeshes.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAa,MAAM,YAAY,CAAC;AAsC3E,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,KAAK,EACL,IAAI,EACJ,kBAAkB,EAClB,aAAa,GACd,EAAE,gBAAgB,qBA2FlB"}
@@ -0,0 +1,12 @@
1
+ import { default as React } from 'react';
2
+ import { PathResult, PublishedDocument, ThemeDefaults } from '../../core';
3
+ export interface MapSceneProps {
4
+ doc: PublishedDocument;
5
+ theme: ThemeDefaults;
6
+ activeLevelId: number | null;
7
+ route: PathResult | null;
8
+ selectedRetailerId?: number | null;
9
+ onSelectShape?: (shapeId: number, levelId: number) => void;
10
+ }
11
+ export declare function MapScene({ doc, theme, activeLevelId, route, selectedRetailerId, onSelectShape, }: MapSceneProps): React.JSX.Element;
12
+ //# sourceMappingURL=MapScene.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MapScene.d.ts","sourceRoot":"","sources":["../../../src/viewer/components/MapScene.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI/E,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,iBAAiB,CAAC;IACvB,KAAK,EAAE,aAAa,CAAC;IACrB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5D;AAED,wBAAgB,QAAQ,CAAC,EACvB,GAAG,EACH,KAAK,EACL,aAAa,EACb,KAAK,EACL,kBAAkB,EAClB,aAAa,GACd,EAAE,aAAa,qBAkFf"}
@@ -0,0 +1,8 @@
1
+ import { default as React } from 'react';
2
+ import { PathResult } from '../../core';
3
+ export declare function RouteLine({ route, activeLevelId, color, }: {
4
+ route: PathResult;
5
+ activeLevelId: number | null;
6
+ color: string;
7
+ }): React.JSX.Element | null;
8
+ //# sourceMappingURL=RouteLine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteLine.d.ts","sourceRoot":"","sources":["../../../src/viewer/components/RouteLine.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,aAAa,EACb,KAAK,GACN,EAAE;IACD,KAAK,EAAE,UAAU,CAAC;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;CACf,4BAgBA"}
@@ -0,0 +1,210 @@
1
+ .eyeon-map-viewer {
2
+ position: relative;
3
+ width: 100%;
4
+ height: 100%;
5
+ min-height: 320px;
6
+ overflow: hidden;
7
+ background: var(--map-bg, #f5f5f5);
8
+ font-family: system-ui, -apple-system, sans-serif;
9
+ font-size: 13px;
10
+ color: #0f172a;
11
+ }
12
+
13
+ .eyeon-map-viewer__canvas {
14
+ position: absolute;
15
+ inset: 0;
16
+ }
17
+
18
+ .eyeon-map-viewer__loading,
19
+ .eyeon-map-viewer__error {
20
+ display: flex;
21
+ align-items: center;
22
+ justify-content: center;
23
+ height: 100%;
24
+ padding: 1rem;
25
+ }
26
+
27
+ .eyeon-map-chrome {
28
+ position: absolute;
29
+ z-index: 2;
30
+ top: 12px;
31
+ left: 12px;
32
+ width: min(320px, calc(100% - 24px));
33
+ display: flex;
34
+ flex-direction: column;
35
+ gap: 8px;
36
+ pointer-events: none;
37
+ }
38
+
39
+ .eyeon-map-chrome > * {
40
+ pointer-events: auto;
41
+ }
42
+
43
+ .eyeon-map-chrome__top {
44
+ display: flex;
45
+ flex-direction: column;
46
+ gap: 8px;
47
+ }
48
+
49
+ .eyeon-map-chrome__search-toggle {
50
+ align-self: flex-start;
51
+ border: 0;
52
+ border-radius: 8px;
53
+ background: #fff;
54
+ box-shadow: 0 1px 4px rgba(15, 23, 42, 0.12);
55
+ padding: 8px 12px;
56
+ font-size: 12px;
57
+ font-weight: 600;
58
+ cursor: pointer;
59
+ }
60
+
61
+ .eyeon-map-chrome__amenities {
62
+ display: grid;
63
+ grid-template-columns: repeat(auto-fill, minmax(40px, 1fr));
64
+ gap: 6px;
65
+ background: rgba(255, 255, 255, 0.92);
66
+ border-radius: 10px;
67
+ padding: 8px;
68
+ box-shadow: 0 1px 4px rgba(15, 23, 42, 0.1);
69
+ }
70
+
71
+ .eyeon-map-chrome__amenity {
72
+ width: 40px;
73
+ height: 40px;
74
+ border: 0;
75
+ border-radius: 8px;
76
+ background: #f1f5f9;
77
+ cursor: pointer;
78
+ display: flex;
79
+ align-items: center;
80
+ justify-content: center;
81
+ font-size: 11px;
82
+ font-weight: 600;
83
+ }
84
+
85
+ .eyeon-map-chrome__panel {
86
+ background: #fff;
87
+ border-radius: 12px;
88
+ box-shadow: 0 8px 24px rgba(15, 23, 42, 0.14);
89
+ padding: 10px;
90
+ max-height: min(60vh, 480px);
91
+ overflow: auto;
92
+ animation: eyeon-map-slide 160ms ease-out;
93
+ }
94
+
95
+ @keyframes eyeon-map-slide {
96
+ from {
97
+ opacity: 0;
98
+ transform: translateY(-6px);
99
+ }
100
+ to {
101
+ opacity: 1;
102
+ transform: translateY(0);
103
+ }
104
+ }
105
+
106
+ .eyeon-map-chrome__search-input {
107
+ width: 100%;
108
+ border: 1px solid #e2e8f0;
109
+ border-radius: 8px;
110
+ padding: 8px 10px;
111
+ font-size: 13px;
112
+ margin-bottom: 8px;
113
+ }
114
+
115
+ .eyeon-map-chrome__group-title {
116
+ font-size: 11px;
117
+ font-weight: 700;
118
+ text-transform: uppercase;
119
+ letter-spacing: 0.04em;
120
+ color: #64748b;
121
+ margin: 8px 0 4px;
122
+ }
123
+
124
+ .eyeon-map-chrome__item {
125
+ display: block;
126
+ width: 100%;
127
+ text-align: left;
128
+ border: 0;
129
+ background: transparent;
130
+ padding: 6px 4px;
131
+ border-radius: 6px;
132
+ cursor: pointer;
133
+ font-size: 13px;
134
+ }
135
+
136
+ .eyeon-map-chrome__item:hover {
137
+ background: #f1f5f9;
138
+ }
139
+
140
+ .eyeon-map-chrome__detail {
141
+ border-top: 1px solid #e2e8f0;
142
+ margin-top: 8px;
143
+ padding-top: 8px;
144
+ }
145
+
146
+ .eyeon-map-chrome__detail-title {
147
+ font-weight: 700;
148
+ }
149
+
150
+ .eyeon-map-chrome__detail-meta {
151
+ color: #64748b;
152
+ font-size: 12px;
153
+ }
154
+
155
+ .eyeon-map-chrome__route {
156
+ display: grid;
157
+ gap: 6px;
158
+ margin-top: 10px;
159
+ border-top: 1px solid #e2e8f0;
160
+ padding-top: 8px;
161
+ }
162
+
163
+ .eyeon-map-chrome__route label {
164
+ display: grid;
165
+ gap: 4px;
166
+ font-size: 11px;
167
+ font-weight: 600;
168
+ color: #475569;
169
+ }
170
+
171
+ .eyeon-map-chrome__route select {
172
+ font-size: 12px;
173
+ padding: 6px;
174
+ border-radius: 6px;
175
+ border: 1px solid #e2e8f0;
176
+ }
177
+
178
+ .eyeon-map-chrome__accessible {
179
+ display: flex !important;
180
+ align-items: center;
181
+ gap: 6px;
182
+ font-weight: 500 !important;
183
+ }
184
+
185
+ .eyeon-map-chrome__floors {
186
+ position: absolute;
187
+ right: 12px;
188
+ bottom: 12px;
189
+ left: auto;
190
+ top: auto;
191
+ display: flex;
192
+ gap: 6px;
193
+ width: auto;
194
+ }
195
+
196
+ .eyeon-map-chrome__floor {
197
+ border: 0;
198
+ border-radius: 8px;
199
+ background: #fff;
200
+ box-shadow: 0 1px 4px rgba(15, 23, 42, 0.12);
201
+ padding: 8px 10px;
202
+ font-size: 12px;
203
+ font-weight: 600;
204
+ cursor: pointer;
205
+ }
206
+
207
+ .eyeon-map-chrome__floor.is-active {
208
+ background: var(--map-accent, #2563eb);
209
+ color: #fff;
210
+ }
@@ -0,0 +1,4 @@
1
+ export { MapViewer, type MapViewerProps } from './MapViewer';
2
+ export { MapScene } from './components/MapScene';
3
+ export { RuntimeChrome } from './ui/RuntimeChrome';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/viewer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,cAAc,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { M as r, a as m, R as o } from "../chunks/MapViewer.js";
2
+ export {
3
+ r as MapScene,
4
+ m as MapViewer,
5
+ o as RuntimeChrome
6
+ };
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,19 @@
1
+ import { default as React } from 'react';
2
+ import { CmAmenityCatalogItem, PathResult, PublishedDocument } from '../../core';
3
+ export interface RuntimeChromeProps {
4
+ doc: PublishedDocument;
5
+ amenities: CmAmenityCatalogItem[];
6
+ searchOpen: boolean;
7
+ onSearchOpenChange: (open: boolean) => void;
8
+ activeLevelId: number | null;
9
+ onActiveLevelChange: (id: number) => void;
10
+ fromAnchorId: number | null;
11
+ toAnchorId: number | null;
12
+ onFromChange: (id: number | null) => void;
13
+ onToChange: (id: number | null) => void;
14
+ accessibleOnly: boolean;
15
+ onAccessibleOnlyChange: (v: boolean) => void;
16
+ route: PathResult | null;
17
+ }
18
+ export declare function RuntimeChrome({ doc, amenities, searchOpen, onSearchOpenChange, activeLevelId, onActiveLevelChange, fromAnchorId, toAnchorId, onFromChange, onToChange, accessibleOnly, onAccessibleOnlyChange, route, }: RuntimeChromeProps): React.JSX.Element;
19
+ //# sourceMappingURL=RuntimeChrome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuntimeChrome.d.ts","sourceRoot":"","sources":["../../../src/viewer/ui/RuntimeChrome.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AACjD,OAAO,KAAK,EACV,oBAAoB,EACpB,UAAU,EACV,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,iBAAiB,CAAC;IACvB,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mBAAmB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1C,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACxC,cAAc,EAAE,OAAO,CAAC;IACxB,sBAAsB,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;CAC1B;AAWD,wBAAgB,aAAa,CAAC,EAC5B,GAAG,EACH,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,UAAU,EACV,cAAc,EACd,sBAAsB,EACtB,KAAK,GACN,EAAE,kBAAkB,qBAgNpB"}
package/package.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "@eyeon/map",
3
+ "version": "2.0.0",
4
+ "description": "EyeOn Center Map v2 — core, viewer, and editor",
5
+ "author": "EyeOn LLC",
6
+ "license": "UNLICENSED",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/mycenterportal/threejs-map.git",
10
+ "directory": "packages/map"
11
+ },
12
+ "type": "module",
13
+ "engines": {
14
+ "node": "^22.20.0"
15
+ },
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/core/index.d.ts",
19
+ "import": "./dist/core/index.js"
20
+ },
21
+ "./core": {
22
+ "types": "./dist/core/index.d.ts",
23
+ "import": "./dist/core/index.js"
24
+ },
25
+ "./viewer": {
26
+ "types": "./dist/viewer/index.d.ts",
27
+ "import": "./dist/viewer/index.js"
28
+ },
29
+ "./editor": {
30
+ "types": "./dist/editor/index.d.ts",
31
+ "import": "./dist/editor/index.js"
32
+ },
33
+ "./viewer/index.css": "./dist/viewer/index.css",
34
+ "./editor/index.css": "./dist/editor/index.css"
35
+ },
36
+ "files": [
37
+ "dist",
38
+ "README.md"
39
+ ],
40
+ "sideEffects": [
41
+ "**/*.css"
42
+ ],
43
+ "scripts": {
44
+ "build": "vite build",
45
+ "dev": "vite build --watch",
46
+ "test": "vitest run",
47
+ "test:watch": "vitest"
48
+ },
49
+ "dependencies": {
50
+ "ngraph.graph": "^20.0.1",
51
+ "ngraph.path": "^1.5.0"
52
+ },
53
+ "peerDependencies": {
54
+ "@react-three/drei": "^10.0.0",
55
+ "@react-three/fiber": "^9.4.0",
56
+ "react": "^19.0.0",
57
+ "react-dom": "^19.0.0",
58
+ "three": "^0.180.0"
59
+ },
60
+ "peerDependenciesMeta": {
61
+ "@react-three/drei": { "optional": true },
62
+ "@react-three/fiber": { "optional": true },
63
+ "three": { "optional": true }
64
+ },
65
+ "devDependencies": {
66
+ "@react-three/drei": "10.7.6",
67
+ "@react-three/fiber": "^9.4.0",
68
+ "@types/node": "^22.7.4",
69
+ "@types/react": "^19.0.0",
70
+ "@types/react-dom": "^19.0.0",
71
+ "@types/three": "^0.180.0",
72
+ "@vitejs/plugin-react": "^4.3.1",
73
+ "react": "19.2.1",
74
+ "react-dom": "19.2.1",
75
+ "three": "^0.180.0",
76
+ "typescript": "^5.4.5",
77
+ "vite": "^5.4.9",
78
+ "vite-plugin-dts": "^4.2.3",
79
+ "vitest": "^2.1.0"
80
+ }
81
+ }