@kerros/editor 0.0.0-stage → 0.1.0-rc.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 (345) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +35 -2
  3. package/dist/SitePlanner.js +1189 -0
  4. package/dist/SitePlanner.js.map +1 -0
  5. package/dist/adapters/basemap.js +11 -0
  6. package/dist/adapters/basemap.js.map +1 -0
  7. package/dist/adapters/persistence.js +121 -0
  8. package/dist/adapters/persistence.js.map +1 -0
  9. package/dist/adapters/status.js +11 -0
  10. package/dist/adapters/status.js.map +1 -0
  11. package/dist/adapters/useProjectPersistence.js +56 -0
  12. package/dist/adapters/useProjectPersistence.js.map +1 -0
  13. package/dist/components/AiImportPanel.js +635 -0
  14. package/dist/components/AiImportPanel.js.map +1 -0
  15. package/dist/components/AnalysisPreview.js +179 -0
  16. package/dist/components/AnalysisPreview.js.map +1 -0
  17. package/dist/components/ElevatorPanel.js +120 -0
  18. package/dist/components/ElevatorPanel.js.map +1 -0
  19. package/dist/components/Icons.js +57 -0
  20. package/dist/components/Icons.js.map +1 -0
  21. package/dist/components/ImportDialog.js +467 -0
  22. package/dist/components/ImportDialog.js.map +1 -0
  23. package/dist/components/Inspector.js +1184 -0
  24. package/dist/components/Inspector.js.map +1 -0
  25. package/dist/components/NavigatePanel.js +301 -0
  26. package/dist/components/NavigatePanel.js.map +1 -0
  27. package/dist/components/NavigationGraph.js +234 -0
  28. package/dist/components/NavigationGraph.js.map +1 -0
  29. package/dist/components/StructureExplorer.js +510 -0
  30. package/dist/components/StructureExplorer.js.map +1 -0
  31. package/dist/components/StructureView.js +286 -0
  32. package/dist/components/StructureView.js.map +1 -0
  33. package/dist/components/controls.js +209 -0
  34. package/dist/components/controls.js.map +1 -0
  35. package/dist/components/graphLayout.js +27 -0
  36. package/dist/components/graphLayout.js.map +1 -0
  37. package/dist/host.js +175 -0
  38. package/dist/host.js.map +1 -0
  39. package/dist/i18n.js +88 -0
  40. package/dist/i18n.js.map +1 -0
  41. package/dist/import/analysisPreview.js +41 -0
  42. package/dist/import/analysisPreview.js.map +1 -0
  43. package/dist/import/brief.js +29 -0
  44. package/dist/import/brief.js.map +1 -0
  45. package/dist/import/checkpoint.js +50 -0
  46. package/dist/import/checkpoint.js.map +1 -0
  47. package/dist/import/detect.js +120 -0
  48. package/dist/import/detect.js.map +1 -0
  49. package/dist/import/documentSvg.js +49 -0
  50. package/dist/import/documentSvg.js.map +1 -0
  51. package/dist/import/instructions.js +20 -0
  52. package/dist/import/instructions.js.map +1 -0
  53. package/dist/import/openings.js +61 -0
  54. package/dist/import/openings.js.map +1 -0
  55. package/dist/import/planImport.js +233 -0
  56. package/dist/import/planImport.js.map +1 -0
  57. package/dist/import/register.js +47 -0
  58. package/dist/import/register.js.map +1 -0
  59. package/dist/import/runs.js +67 -0
  60. package/dist/import/runs.js.map +1 -0
  61. package/dist/import/session.js +23 -0
  62. package/dist/import/session.js.map +1 -0
  63. package/dist/import/types.js +13 -0
  64. package/dist/import/types.js.map +1 -0
  65. package/dist/import/usage.js +29 -0
  66. package/dist/import/usage.js.map +1 -0
  67. package/dist/import/walls.js +112 -0
  68. package/dist/import/walls.js.map +1 -0
  69. package/dist/index.js +178 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/map/CabinMaterials.js +81 -0
  72. package/dist/map/CabinMaterials.js.map +1 -0
  73. package/dist/map/CabinMirror.js +43 -0
  74. package/dist/map/CabinMirror.js.map +1 -0
  75. package/dist/map/Doors.js +80 -0
  76. package/dist/map/Doors.js.map +1 -0
  77. package/dist/map/ElevatorCabin.js +93 -0
  78. package/dist/map/ElevatorCabin.js.map +1 -0
  79. package/dist/map/FixtureLights.js +117 -0
  80. package/dist/map/FixtureLights.js.map +1 -0
  81. package/dist/map/MapCanvas.js +2161 -0
  82. package/dist/map/MapCanvas.js.map +1 -0
  83. package/dist/map/Passenger.js +69 -0
  84. package/dist/map/Passenger.js.map +1 -0
  85. package/dist/map/SceneLayer.js +1534 -0
  86. package/dist/map/SceneLayer.js.map +1 -0
  87. package/dist/map/UndergroundContext.js +153 -0
  88. package/dist/map/UndergroundContext.js.map +1 -0
  89. package/dist/map/ambience.js +194 -0
  90. package/dist/map/ambience.js.map +1 -0
  91. package/dist/map/architecture.js +305 -0
  92. package/dist/map/architecture.js.map +1 -0
  93. package/dist/map/bathMusic.js +92 -0
  94. package/dist/map/bathMusic.js.map +1 -0
  95. package/dist/map/cameraAim.js +33 -0
  96. package/dist/map/cameraAim.js.map +1 -0
  97. package/dist/map/elevators.js +56 -0
  98. package/dist/map/elevators.js.map +1 -0
  99. package/dist/map/excavation.js +52 -0
  100. package/dist/map/excavation.js.map +1 -0
  101. package/dist/map/exteriors.js +25 -0
  102. package/dist/map/exteriors.js.map +1 -0
  103. package/dist/map/features.js +218 -0
  104. package/dist/map/features.js.map +1 -0
  105. package/dist/map/fences.js +29 -0
  106. package/dist/map/fences.js.map +1 -0
  107. package/dist/map/journey.js +112 -0
  108. package/dist/map/journey.js.map +1 -0
  109. package/dist/map/levels.js +6 -0
  110. package/dist/map/levels.js.map +1 -0
  111. package/dist/map/lighting.js +143 -0
  112. package/dist/map/lighting.js.map +1 -0
  113. package/dist/map/loadBasemap.js +26 -0
  114. package/dist/map/loadBasemap.js.map +1 -0
  115. package/dist/map/materials.js +183 -0
  116. package/dist/map/materials.js.map +1 -0
  117. package/dist/map/poolLighting.js +39 -0
  118. package/dist/map/poolLighting.js.map +1 -0
  119. package/dist/map/projection.js +24 -0
  120. package/dist/map/projection.js.map +1 -0
  121. package/dist/map/rampGeometry.js +38 -0
  122. package/dist/map/rampGeometry.js.map +1 -0
  123. package/dist/map/route.js +107 -0
  124. package/dist/map/route.js.map +1 -0
  125. package/dist/map/stairSurfaces.js +115 -0
  126. package/dist/map/stairSurfaces.js.map +1 -0
  127. package/dist/map/surfaces.js +136 -0
  128. package/dist/map/surfaces.js.map +1 -0
  129. package/dist/map/textures.js +95 -0
  130. package/dist/map/textures.js.map +1 -0
  131. package/dist/map/underground.js +34 -0
  132. package/dist/map/underground.js.map +1 -0
  133. package/dist/map/walk.js +433 -0
  134. package/dist/map/walk.js.map +1 -0
  135. package/dist/map/walkContext.js +46 -0
  136. package/dist/map/walkContext.js.map +1 -0
  137. package/dist/map/walkDimensions.js +7 -0
  138. package/dist/map/walkDimensions.js.map +1 -0
  139. package/dist/map/walkJourney.js +85 -0
  140. package/dist/map/walkJourney.js.map +1 -0
  141. package/dist/map/walkSurfaces.js +106 -0
  142. package/dist/map/walkSurfaces.js.map +1 -0
  143. package/dist/map/wallJoins.js +70 -0
  144. package/dist/map/wallJoins.js.map +1 -0
  145. package/dist/map/water.js +274 -0
  146. package/dist/map/water.js.map +1 -0
  147. package/dist/model/authoring.js +99 -0
  148. package/dist/model/authoring.js.map +1 -0
  149. package/dist/model/boundaries.js +548 -0
  150. package/dist/model/boundaries.js.map +1 -0
  151. package/dist/model/coverage.js +30 -0
  152. package/dist/model/coverage.js.map +1 -0
  153. package/dist/model/document.js +52 -0
  154. package/dist/model/document.js.map +1 -0
  155. package/dist/model/doors.js +47 -0
  156. package/dist/model/doors.js.map +1 -0
  157. package/dist/model/factory.js +56 -0
  158. package/dist/model/factory.js.map +1 -0
  159. package/dist/model/geometry.js +454 -0
  160. package/dist/model/geometry.js.map +1 -0
  161. package/dist/model/history.js +29 -0
  162. package/dist/model/history.js.map +1 -0
  163. package/dist/model/imports.js +45 -0
  164. package/dist/model/imports.js.map +1 -0
  165. package/dist/model/inference.js +182 -0
  166. package/dist/model/inference.js.map +1 -0
  167. package/dist/model/materials.js +11 -0
  168. package/dist/model/materials.js.map +1 -0
  169. package/dist/model/mutations.js +157 -0
  170. package/dist/model/mutations.js.map +1 -0
  171. package/dist/model/navigation.js +275 -0
  172. package/dist/model/navigation.js.map +1 -0
  173. package/dist/model/ontology.js +109 -0
  174. package/dist/model/ontology.js.map +1 -0
  175. package/dist/model/passages.js +5 -0
  176. package/dist/model/passages.js.map +1 -0
  177. package/dist/model/portals.js +42 -0
  178. package/dist/model/portals.js.map +1 -0
  179. package/dist/model/precision.js +11 -0
  180. package/dist/model/precision.js.map +1 -0
  181. package/dist/model/project.js +31 -0
  182. package/dist/model/project.js.map +1 -0
  183. package/dist/model/ramps.js +10 -0
  184. package/dist/model/ramps.js.map +1 -0
  185. package/dist/model/roomNavigation.js +87 -0
  186. package/dist/model/roomNavigation.js.map +1 -0
  187. package/dist/model/routeClearance.js +72 -0
  188. package/dist/model/routeClearance.js.map +1 -0
  189. package/dist/model/spaces.js +104 -0
  190. package/dist/model/spaces.js.map +1 -0
  191. package/dist/model/stairGeometry.js +40 -0
  192. package/dist/model/stairGeometry.js.map +1 -0
  193. package/dist/model/stairTraversal.js +48 -0
  194. package/dist/model/stairTraversal.js.map +1 -0
  195. package/dist/model/topology.js +63 -0
  196. package/dist/model/topology.js.map +1 -0
  197. package/dist/model/types.js +35 -0
  198. package/dist/model/types.js.map +1 -0
  199. package/dist/model/validate.js +240 -0
  200. package/dist/model/validate.js.map +1 -0
  201. package/dist/model/vertical.js +129 -0
  202. package/dist/model/vertical.js.map +1 -0
  203. package/dist/model/walls.js +261 -0
  204. package/dist/model/walls.js.map +1 -0
  205. package/dist/planner/DrawingDock.js +231 -0
  206. package/dist/planner/DrawingDock.js.map +1 -0
  207. package/dist/planner/FloorControls.js +93 -0
  208. package/dist/planner/FloorControls.js.map +1 -0
  209. package/dist/planner/MapSettings.js +143 -0
  210. package/dist/planner/MapSettings.js.map +1 -0
  211. package/dist/planner/PlannerHelp.js +57 -0
  212. package/dist/planner/PlannerHelp.js.map +1 -0
  213. package/dist/planner/ProjectSidebar.js +246 -0
  214. package/dist/planner/ProjectSidebar.js.map +1 -0
  215. package/dist/planner/floors.js +18 -0
  216. package/dist/planner/floors.js.map +1 -0
  217. package/dist/planner/useDrawingTools.js +341 -0
  218. package/dist/planner/useDrawingTools.js.map +1 -0
  219. package/dist/planner/useMapDisplay.js +51 -0
  220. package/dist/planner/useMapDisplay.js.map +1 -0
  221. package/dist/planner/usePlannerKeyboard.js +138 -0
  222. package/dist/planner/usePlannerKeyboard.js.map +1 -0
  223. package/dist/planner/useReferenceAlignment.js +50 -0
  224. package/dist/planner/useReferenceAlignment.js.map +1 -0
  225. package/dist/styles.css +4931 -0
  226. package/dist/theme/index.js +34 -0
  227. package/dist/theme/index.js.map +1 -0
  228. package/dist/types/SitePlanner.d.ts +5 -0
  229. package/dist/types/adapters/basemap.d.ts +2 -0
  230. package/dist/types/adapters/persistence.d.ts +29 -0
  231. package/dist/types/adapters/status.d.ts +4 -0
  232. package/dist/types/adapters/useProjectPersistence.d.ts +13 -0
  233. package/dist/types/components/AiImportPanel.d.ts +9 -0
  234. package/dist/types/components/AnalysisPreview.d.ts +4 -0
  235. package/dist/types/components/ElevatorPanel.d.ts +18 -0
  236. package/dist/types/components/Icons.d.ts +8 -0
  237. package/dist/types/components/ImportDialog.d.ts +42 -0
  238. package/dist/types/components/Inspector.d.ts +38 -0
  239. package/dist/types/components/NavigatePanel.d.ts +27 -0
  240. package/dist/types/components/NavigationGraph.d.ts +10 -0
  241. package/dist/types/components/StructureExplorer.d.ts +8 -0
  242. package/dist/types/components/StructureView.d.ts +22 -0
  243. package/dist/types/components/controls.d.ts +52 -0
  244. package/dist/types/components/graphLayout.d.ts +9 -0
  245. package/dist/types/editor/host.d.ts +9 -0
  246. package/dist/types/editor/index.d.ts +2 -0
  247. package/dist/types/i18n.d.ts +85 -0
  248. package/dist/types/import/analysisPreview.d.ts +27 -0
  249. package/dist/types/import/brief.d.ts +22 -0
  250. package/dist/types/import/checkpoint.d.ts +49 -0
  251. package/dist/types/import/detect.d.ts +34 -0
  252. package/dist/types/import/documentSvg.d.ts +2 -0
  253. package/dist/types/import/index.d.ts +10 -0
  254. package/dist/types/import/instructions.d.ts +7 -0
  255. package/dist/types/import/openings.d.ts +22 -0
  256. package/dist/types/import/planImport.d.ts +22 -0
  257. package/dist/types/import/register.d.ts +25 -0
  258. package/dist/types/import/runs.d.ts +31 -0
  259. package/dist/types/import/session.d.ts +33 -0
  260. package/dist/types/import/types.d.ts +56 -0
  261. package/dist/types/import/usage.d.ts +10 -0
  262. package/dist/types/import/walls.d.ts +37 -0
  263. package/dist/types/map/CabinMaterials.d.ts +18 -0
  264. package/dist/types/map/CabinMirror.d.ts +13 -0
  265. package/dist/types/map/Doors.d.ts +11 -0
  266. package/dist/types/map/ElevatorCabin.d.ts +20 -0
  267. package/dist/types/map/FixtureLights.d.ts +35 -0
  268. package/dist/types/map/MapCanvas.d.ts +87 -0
  269. package/dist/types/map/Passenger.d.ts +18 -0
  270. package/dist/types/map/SceneLayer.d.ts +306 -0
  271. package/dist/types/map/UndergroundContext.d.ts +18 -0
  272. package/dist/types/map/ambience.d.ts +29 -0
  273. package/dist/types/map/architecture.d.ts +8 -0
  274. package/dist/types/map/bathMusic.d.ts +14 -0
  275. package/dist/types/map/cameraAim.d.ts +20 -0
  276. package/dist/types/map/elevators.d.ts +16 -0
  277. package/dist/types/map/excavation.d.ts +9 -0
  278. package/dist/types/map/exteriors.d.ts +3 -0
  279. package/dist/types/map/features.d.ts +33 -0
  280. package/dist/types/map/fences.d.ts +4 -0
  281. package/dist/types/map/journey.d.ts +36 -0
  282. package/dist/types/map/levels.d.ts +4 -0
  283. package/dist/types/map/lighting.d.ts +103 -0
  284. package/dist/types/map/loadBasemap.d.ts +4 -0
  285. package/dist/types/map/materials.d.ts +38 -0
  286. package/dist/types/map/poolLighting.d.ts +11 -0
  287. package/dist/types/map/projection.d.ts +9 -0
  288. package/dist/types/map/rampGeometry.d.ts +8 -0
  289. package/dist/types/map/route.d.ts +59 -0
  290. package/dist/types/map/stairSurfaces.d.ts +29 -0
  291. package/dist/types/map/surfaces.d.ts +36 -0
  292. package/dist/types/map/textures.d.ts +8 -0
  293. package/dist/types/map/underground.d.ts +30 -0
  294. package/dist/types/map/walk.d.ts +232 -0
  295. package/dist/types/map/walkContext.d.ts +11 -0
  296. package/dist/types/map/walkDimensions.d.ts +5 -0
  297. package/dist/types/map/walkJourney.d.ts +33 -0
  298. package/dist/types/map/walkSurfaces.d.ts +27 -0
  299. package/dist/types/map/wallJoins.d.ts +6 -0
  300. package/dist/types/map/water.d.ts +12 -0
  301. package/dist/types/model/authoring.d.ts +38 -0
  302. package/dist/types/model/boundaries.d.ts +41 -0
  303. package/dist/types/model/coverage.d.ts +8 -0
  304. package/dist/types/model/document.d.ts +9 -0
  305. package/dist/types/model/doors.d.ts +19 -0
  306. package/dist/types/model/factory.d.ts +5 -0
  307. package/dist/types/model/geometry.d.ts +99 -0
  308. package/dist/types/model/history.d.ts +10 -0
  309. package/dist/types/model/host.d.ts +154 -0
  310. package/dist/types/model/imports.d.ts +7 -0
  311. package/dist/types/model/inference.d.ts +46 -0
  312. package/dist/types/model/live.d.ts +60 -0
  313. package/dist/types/model/materials.d.ts +28 -0
  314. package/dist/types/model/mutations.d.ts +178 -0
  315. package/dist/types/model/navigation.d.ts +70 -0
  316. package/dist/types/model/ontology.d.ts +43 -0
  317. package/dist/types/model/passages.d.ts +2 -0
  318. package/dist/types/model/portals.d.ts +9 -0
  319. package/dist/types/model/precision.d.ts +11 -0
  320. package/dist/types/model/project.d.ts +8 -0
  321. package/dist/types/model/ramps.d.ts +7 -0
  322. package/dist/types/model/roomNavigation.d.ts +15 -0
  323. package/dist/types/model/routeClearance.d.ts +11 -0
  324. package/dist/types/model/spaces.d.ts +46 -0
  325. package/dist/types/model/stairGeometry.d.ts +27 -0
  326. package/dist/types/model/stairTraversal.d.ts +8 -0
  327. package/dist/types/model/topology.d.ts +14 -0
  328. package/dist/types/model/types.d.ts +369 -0
  329. package/dist/types/model/validate.d.ts +38 -0
  330. package/dist/types/model/vertical.d.ts +145 -0
  331. package/dist/types/model/walls.d.ts +71 -0
  332. package/dist/types/planner/DrawingDock.d.ts +16 -0
  333. package/dist/types/planner/FloorControls.d.ts +17 -0
  334. package/dist/types/planner/MapSettings.d.ts +16 -0
  335. package/dist/types/planner/PlannerHelp.d.ts +3 -0
  336. package/dist/types/planner/ProjectSidebar.d.ts +32 -0
  337. package/dist/types/planner/floors.d.ts +3 -0
  338. package/dist/types/planner/types.d.ts +3 -0
  339. package/dist/types/planner/useDrawingTools.d.ts +52 -0
  340. package/dist/types/planner/useMapDisplay.d.ts +29 -0
  341. package/dist/types/planner/usePlannerKeyboard.d.ts +18 -0
  342. package/dist/types/planner/useReferenceAlignment.d.ts +30 -0
  343. package/dist/types/schema/index.d.ts +25 -0
  344. package/dist/types/theme/index.d.ts +55 -0
  345. package/package.json +58 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Inspector.js","sources":["../../../../src/components/Inspector.tsx"],"sourcesContent":["import { useState, type ReactNode } from 'react';\nimport {\n ArrowUpRight,\n Camera,\n Compass,\n ArrowDown,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n ChevronRight,\n Eye,\n Copy,\n Layers,\n Layers3,\n LockKeyhole,\n MoreHorizontal,\n ShieldCheck,\n Trash2,\n Unplug,\n X,\n} from 'lucide-react';\nimport type { Barrier, Drawing, Floor, Portal, ProjectDocument, SiteObject } from '../model/types';\nimport type { StatusReading } from '../model/live';\nimport type { StatusPanelContext } from '../model/host';\nimport { isArea, isOpening, isSpace } from '../model/types';\nimport { barrierEnds, distance, objectArea, objectPosition } from '../model/geometry';\nimport { entryInto, zoneSpaces } from '../model/ontology';\nimport { effectivePortals } from '../model/portals';\nimport { coverageOf } from '../model/coverage';\nimport { spaceAt } from '../model/spaces';\nimport { statusLabel, statusTone } from '../adapters/status';\nimport { EntityIcon } from './Icons';\nimport { Choice, Field, Toggle } from './controls';\nimport { DEFAULT_LIGHT, kelvinColor, LAMPS, lampFor } from '../map/lighting';\nimport { AMBIENCES } from '../map/ambience';\n\nexport interface InspectorProps {\n project: ProjectDocument;\n floorId: string | null;\n selected: string | null;\n statuses: Map<string, StatusReading>;\n /** Whether the host supplied a StatusFeed at all. False hides every live-status surface — a\n * rollup of bindings that can only ever read \"unknown\" is worse than no rollup. */\n monitoring: boolean;\n editing: boolean;\n live: boolean;\n renderStatusPanel?: (ctx: StatusPanelContext) => ReactNode;\n onClose: () => void;\n onUpdateObject: (id: string, patch: Partial<SiteObject>) => void;\n /** Apply an arbitrary change through the host's commit/undo path — used for the ontology, which\n * edits entities beside the object rather than fields on it. */\n onEdit?: (change: (draft: ProjectDocument) => void) => void;\n /** Editing operations are supplied by the editor, so read-only consumers need no authoring engine. */\n onSpaceGeometry?: (id: string, source: 'outline' | 'walls' | 'independent') => void;\n onShiftOrigin?: (east: number, north: number) => void;\n onUpdateBarrier: (id: string, patch: Partial<Barrier>) => void;\n onUpdateDrawing: (id: string, patch: Partial<Drawing>) => void;\n onUpdateFloor: (id: string, patch: Partial<Floor>) => void;\n /** Set (or clear, with null) the floor a viewer opens this document on. */\n onSetInitialFloor: (id: string | null) => void;\n /** Remove a floor and everything on it (confirms first). */\n onDeleteFloor: (id: string) => void;\n onDuplicate: () => void;\n onDelete: () => void;\n onSelect: (id: string) => void;\n /** Open a floor — a lift's levels are the one relation that crosses them. */\n onFloor: (id: string) => void;\n onTraceFootprint: (id: string) => void;\n}\n/** What a selected thing is joined to, and a way to go there.\n *\n * The ontology is the half of the model with no shape — a portal is two ids, a zone is a list of\n * them, a lift is a set of floors it reaches. None of that is visible on the plan, so until now the\n * only way to read it was the structure panel or the JSON. Everything here is derived; nothing is\n * stored twice. */\nfunction Connections({\n project,\n object,\n onSelect,\n onFloor,\n}: {\n project: ProjectDocument;\n object: SiteObject;\n onSelect: (id: string) => void;\n onFloor: (id: string) => void;\n}) {\n const name = (id: string) => project.objects.find(o => o.id === id)?.name ?? 'elsewhere';\n const floorName = (id: string) => project.floors.find(f => f.id === id)?.name ?? id;\n const rows: { key: string; icon: ReactNode; label: string; detail: string; go: () => void }[] = [];\n const kindOf = (id: string) => project.objects.find(o => o.id === id)?.kind ?? '';\n\n // An opening: the two sides of the portal it carries, and which way each may be crossed.\n const portals = effectivePortals(project);\n const portal = portals.find(x => x.openingId === object.id);\n if (portal)\n for (const side of [portal.a, portal.b]) {\n const other = side === portal.a ? portal.b : portal.a;\n const way = entryInto(portal, side);\n rows.push({\n key: `p-${side}`,\n icon: <ArrowRight size={14} />,\n label: name(side),\n detail: way ? `enter from ${name(other)}` : `no way through from ${name(other)}`,\n go: () => onSelect(side),\n });\n }\n\n // A doorway the plan has not joined into a portal still separates two places, and saying which\n // is more use than an empty panel — it also shows WHY there is no portal, when one side turns out\n // to be nowhere in particular.\n if (!portal && isOpening(object.kind) && object.barrierId) {\n const barrier = project.barriers.find(b => b.id === object.barrierId);\n if (barrier) {\n const [a, b] = barrierEnds(project, barrier);\n const len = distance(a, b) || 1;\n const nx = -(b[1] - a[1]) / len,\n ny = (b[0] - a[0]) / len;\n const step = barrier.thickness / 2 + 0.35;\n for (const sign of [1, -1]) {\n const probe: [number, number] = [object.position[0] + nx * step * sign, object.position[1] + ny * step * sign];\n const space = spaceAt(project, object.floorId, probe);\n rows.push({\n key: `s-${sign}`,\n icon: <ArrowRight size={14} />,\n label: space?.name ?? 'Outside any space',\n detail: space ? 'on this side of the doorway' : 'nothing drawn on this side',\n go: () => space && onSelect(space.id),\n });\n }\n }\n }\n\n // What a camera can see. Derived from its own cone and the walls in the way, so it follows the\n // camera when it is turned or moved rather than going stale.\n if (object.kind === 'camera')\n for (const id of coverageOf(project, object)) {\n rows.push({\n key: `c-${id}`,\n icon: <Eye size={14} />,\n label: name(id),\n detail: `in view · ${kindOf(id)}`,\n go: () => onSelect(id),\n });\n }\n\n // A shaft: every level it reaches. This is the one relation that crosses floors, so it is also\n // the one you most want a button for.\n if (object.servedFloorIds?.length)\n for (const fid of object.servedFloorIds) {\n const f = project.floors.find(x => x.id === fid);\n if (!f) continue;\n rows.push({\n key: `f-${fid}`,\n icon: <Layers size={14} />,\n label: floorName(fid),\n detail: `${f.elevation.toFixed(1)} m`,\n go: () => onFloor(fid),\n });\n }\n\n // A space: every portal on it, named by what is on the other side.\n if (isSpace(object.kind))\n for (const p of portals) {\n if (p.a !== object.id && p.b !== object.id) continue;\n const other = p.a === object.id ? p.b : p.a;\n const opening = p.openingId ? project.objects.find(o => o.id === p.openingId) : undefined;\n rows.push({\n key: `w-${p.id}`,\n icon: <ArrowRight size={14} />,\n label: name(other),\n detail: opening ? (opening.name ?? opening.kind) : 'open boundary',\n go: () => onSelect(p.openingId ?? other),\n });\n }\n\n // The other direction: which cameras have this in frame.\n for (const cam of project.objects)\n if (cam.kind === 'camera' && cam.floorId === object.floorId && cam.id !== object.id)\n if (coverageOf(project, cam).includes(object.id))\n rows.push({\n key: `v-${cam.id}`,\n icon: <Eye size={14} />,\n label: cam.name,\n detail: 'has this in view',\n go: () => onSelect(cam.id),\n });\n const zones = (project.zones ?? []).filter(z => zoneSpaces(project, z).includes(object.id));\n if (!rows.length && !zones.length) return null;\n return (\n <section className=\"property-section\">\n <h3>Connections</h3>\n {rows.map(r => (\n <button className=\"object-row\" key={r.key} onClick={r.go}>\n {r.icon}\n <span>\n {r.label}\n <small>{r.detail}</small>\n </span>\n <ChevronRight size={15} />\n </button>\n ))}\n {zones.map(z => (\n <p className=\"helper\" key={z.id}>\n In zone <strong>{z.name}</strong>\n {z.purpose ? ` · ${z.purpose}` : ''}\n </p>\n ))}\n </section>\n );\n}\n\nexport function Inspector(props: InspectorProps) {\n const { project, floorId, selected, statuses, monitoring, editing } = props;\n // The portal this opening carries, if the plan has one. Direction is the part a person decides:\n // a fire exit lets you out and never back in, and nothing else in the model can say so.\n const portal = effectivePortals(project).find(x => x.openingId === selected);\n const spaceName = (id: string) => project.objects.find(o => o.id === id)?.name ?? 'elsewhere';\n const object = project.objects.find(o => o.id === selected),\n barrier = project.barriers.find(b => b.id === selected),\n boundary = project.virtualBoundaries?.find(b => b.id === selected),\n drawing = project.drawings.find(d => d.id === selected),\n floor = project.floors.find(f => f.id === floorId);\n const objects = project.objects.filter(o => o.floorId === floorId),\n bound = objects.filter(o => o.feedId),\n allBound = project.objects.filter(o => o.feedId);\n const alarms = allBound.filter(o => statusTone(statuses.get(o.feedId!)) === 'critical');\n // Environment rollup: everything reporting metrics on this floor (or the whole site outdoors).\n const sensed = bound.filter(o => statuses.get(o.feedId!)?.metrics?.occupancy !== undefined);\n const people = (list: SiteObject[]) =>\n list.reduce((n, o) => n + (statuses.get(o.feedId!)?.metrics?.occupancy ?? 0), 0);\n const co2Values = sensed.map(o => statuses.get(o.feedId!)!.metrics!.co2).filter((n): n is number => n !== undefined);\n const busiest = [...sensed].sort(\n (a, b) => (statuses.get(b.feedId!)?.metrics?.occupancy ?? 0) - (statuses.get(a.feedId!)?.metrics?.occupancy ?? 0),\n )[0];\n const status = object?.feedId ? statuses.get(object.feedId) : undefined;\n const [step, setStep] = useState(0.5);\n /** Edit one part of the site anchor. A blank or unparseable box leaves the anchor alone rather\n * than snapping the whole site to the null island mid-keystroke. */\n const setBearing = (value: number) => {\n if (!Number.isFinite(value)) return;\n const b = ((value % 360) + 360) % 360;\n props.onEdit?.(d => {\n d.origin = (b ? [d.origin[0], d.origin[1], b] : [d.origin[0], d.origin[1]]) as typeof d.origin;\n });\n };\n const turn = (delta: number) => setBearing((project.origin[2] ?? 0) + delta);\n const shift = (east: number, north: number) => props.onShiftOrigin?.(east, north);\n const setOrigin = (part: 0 | 1 | 2, raw: string) => {\n const value = Number(raw);\n if (raw.trim() === '' || !Number.isFinite(value)) return;\n if (part === 0 && Math.abs(value) > 180) return;\n if (part === 1 && Math.abs(value) > 90) return;\n props.onEdit?.(d => {\n const [lng, lat, bearing = 0] = d.origin;\n const next = part === 0 ? [value, lat, bearing] : part === 1 ? [lng, value, bearing] : [lng, lat, value];\n // A zero bearing is the absence of one — keep the two-element shape the schema started with.\n d.origin = (next[2] ? next : next.slice(0, 2)) as typeof d.origin;\n });\n };\n // Event footage: the camera assigned to watch this object (SiteObject.watchedIds).\n const watcher = object\n ? project.objects.find(c => c.kind === 'camera' && c.watchedIds?.includes(object.id))\n : undefined;\n const update = (patch: Partial<SiteObject>) => object && props.onUpdateObject(object.id, patch);\n const number = (label: string, value: number, key: keyof SiteObject, suffix = 'm', min = 0.01, max?: number) => (\n <Field\n label={label}\n value={value}\n type=\"number\"\n suffix={suffix}\n min={min}\n max={max}\n onChange={v => update({ [key]: Number(v) })}\n />\n );\n const title = object?.name ?? barrier?.name ?? drawing?.name ?? (boundary ? 'Virtual boundary' : undefined);\n return (\n <aside className=\"inspector\">\n <div className=\"inspector-top\">\n <span>{selected ? 'Properties' : 'Space overview'}</span>\n {selected ? (\n <button className=\"icon-button\" aria-label=\"Close properties\" onClick={props.onClose}>\n <X size={17} />\n </button>\n ) : (\n <Layers3 size={17} />\n )}\n </div>\n <div className=\"inspector-scroll\">\n {title ? (\n <>\n <div className=\"object-title\">\n <div className={`object-avatar ${object ? statusTone(status) : ''}`}>\n {object ? (\n <EntityIcon kind={object.kind} size={25} symbol={object.symbol} travel={object.travel} />\n ) : barrier ? (\n <EntityIcon kind={barrier.kind} size={25} />\n ) : (\n <Layers3 size={25} />\n )}\n </div>\n <span className=\"eyebrow\">\n {object?.kind ?? barrier?.kind ?? (boundary ? 'SPACE BOUNDARY' : 'REFERENCE DRAWING')}\n </span>\n <h2>{title}</h2>\n <p>\n {project.floors.find(\n f => f.id === (object?.floorId ?? barrier?.floorId ?? boundary?.floorId ?? drawing?.floorId),\n )?.name ?? 'Outdoor site'}\n </p>\n </div>\n {monitoring && object?.feedId && !isArea(object.kind) && (\n <section className=\"property-section\">\n <div className={`status-banner ${statusTone(status)}`}>\n <ShieldCheck size={18} />\n <strong>{statusLabel(status)}</strong>\n <span className=\"live-pip\" />\n </div>\n <div className=\"status-grid\">\n <div>\n <span>Last update</span>\n <strong>\n {status?.timestamp\n ? new Date(status.timestamp).toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n })\n : '—'}\n </strong>\n </div>\n </div>\n {watcher && (\n <p className=\"helper\">\n <Camera size={13} /> {watcher.name} covers this {object!.kind}.\n </p>\n )}\n </section>\n )}\n {status?.metrics && (\n <section className=\"property-section\">\n <h3>Environment</h3>\n <div className=\"status-grid\">\n {status.metrics.occupancy !== undefined && (\n <div>\n <span>People</span>\n <strong>\n {status.metrics.occupancy}\n {status.metrics.capacity ? ` / ${status.metrics.capacity}` : ''}\n </strong>\n </div>\n )}\n {status.metrics.co2 !== undefined && (\n <div>\n <span>CO₂</span>\n <strong>{status.metrics.co2} ppm</strong>\n </div>\n )}\n {status.metrics.lux !== undefined && (\n <div>\n <span>Light</span>\n <strong>{status.metrics.lux} lx</strong>\n </div>\n )}\n {status.metrics.temperature !== undefined && (\n <div>\n <span>Temperature</span>\n <strong>{status.metrics.temperature} °C</strong>\n </div>\n )}\n </div>\n {status.metrics.presence !== undefined && (\n <p className=\"helper\">\n {status.metrics.presence ? 'Presence detected in this space.' : 'No presence detected right now.'}\n </p>\n )}\n </section>\n )}\n {editing && object && (\n <section className=\"property-section\">\n <h3>Object details</h3>\n <Field label=\"Name\" value={object.name} onChange={name => update({ name })} />\n {isArea(object.kind) && (\n <>\n <label className=\"field\">\n <span>Space geometry</span>\n <select\n aria-label=\"Space geometry\"\n value={object.geometry?.mode ?? 'independent'}\n onChange={e => {\n const mode = e.target.value;\n props.onSpaceGeometry?.(object.id, mode === 'boundaries' ? 'outline' : 'independent');\n }}\n >\n <option value=\"boundaries\">Shared boundaries</option>\n <option value=\"independent\">Independent outline</option>\n </select>\n </label>\n <p className=\"helper\">\n {object.geometry?.mode === 'boundaries'\n ? 'Move the boundary handles or walls. Adjacent spaces follow the same boundary.'\n : 'This outline stays where you draw it. Connect it to share edits with adjacent spaces.'}\n </p>\n {object.geometry?.mode !== 'boundaries' && (\n <button className=\"button secondary\" onClick={() => props.onSpaceGeometry?.(object.id, 'walls')}>\n Use surrounding walls\n </button>\n )}\n </>\n )}\n {object.feedId !== undefined ||\n ['door', 'gate', 'camera', 'reader', 'turnstile', 'elevator'].includes(object.kind) ? (\n <Field\n label=\"Feed ID\"\n value={object.feedId ?? ''}\n onChange={feedId => update({ feedId: feedId || undefined })}\n />\n ) : null}\n {object.geometry?.mode !== 'boundaries' && (\n <div className=\"field-grid\">\n {object.barrierId ? (\n number('Along barrier', object.offset ?? 0, 'offset', 'm', 0)\n ) : (\n <Field\n label=\"East / X\"\n value={object.position[0]}\n type=\"number\"\n suffix=\"m\"\n onChange={v => update({ position: [Number(v), object.position[1]] })}\n />\n )}\n {object.barrierId ? (\n number('Width', object.width, 'width')\n ) : (\n <Field\n label=\"North / Y\"\n value={object.position[1]}\n type=\"number\"\n suffix=\"m\"\n onChange={v => update({ position: [object.position[0], Number(v)] })}\n />\n )}\n </div>\n )}\n {!object.barrierId && object.geometry?.mode !== 'boundaries' && (\n <div className=\"field-grid\">\n {number('Width', object.width, 'width')}\n {number('Depth', object.depth, 'depth')}\n </div>\n )}\n {object.kind === 'door' && (\n <>\n <label className=\"field\">\n <span>Door type</span>\n <select\n value={object.doorType ?? 'hinged'}\n disabled={!editing}\n onChange={e => update({ doorType: e.target.value as NonNullable<SiteObject['doorType']> })}\n >\n <option value=\"hinged\">Hinged door</option>\n <option value=\"sliding\">Sliding door</option>\n <option value=\"double\">Double-leaf door</option>\n </select>\n </label>\n <div className=\"field-grid\">\n <label className=\"field\">\n <span>{object.doorType === 'sliding' ? 'Slide direction' : 'Door hinge'}</span>\n <select\n value={object.doorHinge ?? 'left'}\n disabled={!editing || object.doorType === 'double'}\n onChange={e => update({ doorHinge: e.target.value as 'left' | 'right' })}\n >\n <option value=\"left\">{object.doorType === 'sliding' ? 'Left' : 'Left-handed'}</option>\n <option value=\"right\">{object.doorType === 'sliding' ? 'Right' : 'Right-handed'}</option>\n </select>\n </label>\n <label className=\"field\">\n <span>Opening side</span>\n <select\n value={object.doorSwing ?? 1}\n disabled={!editing}\n onChange={e => update({ doorSwing: Number(e.target.value) as 1 | -1 })}\n >\n <option value={1}>Side A</option>\n <option value={-1}>Side B</option>\n </select>\n </label>\n </div>\n <small>\n {object.doorType === 'sliding'\n ? 'Slides along the wall on the selected side. Left is toward the wall’s start; right toward its end.'\n : object.doorType === 'double'\n ? 'Two leaves hinge at opposite jambs and open to the selected side.'\n : 'Left hinges at the wall’s start; right at its end. Drag across the wall to change the opening side.'}\n </small>\n </>\n )}\n {portal && (\n <label className=\"field\">\n <span>Passage</span>\n <select\n value={portal.passage ?? 'both'}\n disabled={!editing}\n onChange={e => {\n const passage = e.target.value as NonNullable<Portal['passage']>;\n props.onEdit?.(d => {\n const target = d.portals?.find(x => x.id === portal.id);\n if (target) target.passage = passage === 'both' ? undefined : passage;\n });\n }}\n >\n <option value=\"both\">Both ways</option>\n <option value=\"a-to-b\">{`Into ${spaceName(portal.b)} only`}</option>\n <option value=\"b-to-a\">{`Into ${spaceName(portal.a)} only`}</option>\n <option value=\"none\">Sealed</option>\n </select>\n <small>\n {`Between ${spaceName(portal.a)} and ${spaceName(portal.b)}. Routing obeys this — a one-way portal is a one-way edge.`}\n </small>\n </label>\n )}\n {portal && (\n <label className=\"field\">\n <span>Attestation</span>\n <select\n value={portal.attests ?? 'assumed'}\n disabled={!editing}\n onChange={e => {\n const attests = e.target.value as NonNullable<Portal['attests']>;\n props.onEdit?.(d => {\n const target = d.portals?.find(x => x.id === portal.id);\n if (target) target.attests = attests;\n });\n }}\n >\n <option value=\"confirmed\">Confirmed — a sensor sees it</option>\n <option value=\"assumed\">Assumed — granted, not watched</option>\n <option value=\"none\">None — a request, not an event</option>\n </select>\n <small>\n How far a crossing here can be trusted to have happened. Anything counting crossings must ignore\n portals that attest nothing.\n </small>\n </label>\n )}\n <div className=\"field-grid\">\n {number('Height', object.height, 'height', 'm', 0)}\n {!object.barrierId &&\n object.geometry?.mode !== 'boundaries' &&\n number('Rotation', object.rotation, 'rotation', '°', -360, 360)}\n </div>\n {object.rings && (\n <div className=\"measurement-row\">\n <span>Net area</span>\n <strong>{objectArea(object).toFixed(1)} m²</strong>\n </div>\n )}\n {object.rings && (\n <label className=\"field\">\n <span>Fill colour</span>\n <input\n aria-label=\"Fill colour\"\n type=\"color\"\n value={object.color ?? '#e0e8df'}\n onChange={e => update({ color: e.target.value })}\n />\n </label>\n )}\n {object.rings && (\n <label className=\"field\">\n <span>Parent zone</span>\n <select\n value={object.parentId ?? ''}\n onChange={e => update({ parentId: e.target.value || undefined })}\n >\n <option value=\"\">None · independent area</option>\n {project.objects\n .filter(o => o.id !== object.id && o.floorId === object.floorId && o.kind === 'zone')\n .map(o => (\n <option value={o.id} key={o.id}>\n {o.name}\n </option>\n ))}\n </select>\n </label>\n )}\n {object.kind === 'poi' && (\n <label className=\"field\">\n <span>Symbol</span>\n <select\n value={object.symbol}\n onChange={e => update({ symbol: e.target.value as SiteObject['symbol'] })}\n >\n <option value=\"personnel\">Personnel entrance</option>\n <option value=\"service\">Service access</option>\n <option value=\"driveway\">Main driveway</option>\n <option value=\"parking\">Parking</option>\n <option value=\"assembly\">Assembly point</option>\n <option value=\"info\">Information</option>\n </select>\n </label>\n )}\n {isSpace(object.kind) && (\n <label className=\"field\">\n <span>Ambient sound</span>\n <select\n aria-label=\"Ambient sound\"\n value={object.ambience?.preset ?? 'floor'}\n onChange={e =>\n update({\n ambience:\n e.target.value === 'floor'\n ? undefined\n : { preset: e.target.value as NonNullable<SiteObject['ambience']>['preset'] },\n })\n }\n >\n <option value=\"floor\">Same as the floor</option>\n {AMBIENCES.map(a => (\n <option value={a.id} key={a.id} title={a.description}>\n {a.label}\n </option>\n ))}\n </select>\n </label>\n )}\n {object.kind === 'light' && object.light && (\n <>\n <h3>Ceiling light</h3>\n <div className=\"field-grid\">\n {(\n [\n ['Colour temperature', 'kelvin', 'K', 1000, 12000],\n ['Light intensity', 'intensity', 'cd', 0, 10000],\n ['Light range', 'range', 'm', 0.1, 100],\n ['Flicker depth', 'flicker', '', 0, 1],\n ] as const\n ).map(([label, key, suffix, min, max]) => (\n <Field\n key={key}\n label={label}\n value={object.light![key] ?? 0}\n type=\"number\"\n suffix={suffix}\n min={min}\n max={max}\n onChange={v => update({ light: { ...object.light!, [key]: Number(v) } })}\n />\n ))}\n </div>\n </>\n )}\n {object.kind === 'camera' && (\n <>\n <h3>Illustrative coverage</h3>\n <div className=\"field-grid\">\n {number('Field of view', object.coverageAngle ?? 70, 'coverageAngle', '°', 1, 360)}\n {number('Range', object.coverageRange ?? 12, 'coverageRange')}\n </div>\n <p className=\"helper\">\n Coverage illustrates direction and range; walls do not calculate occlusion.\n </p>\n <h3>Watches</h3>\n {project.objects\n .filter(\n x =>\n x.floorId === object.floorId &&\n x.id !== object.id &&\n ['door', 'gate', 'turnstile', 'elevator', 'room', 'zone'].includes(x.kind),\n )\n .map(x => ({ x, d: distance(objectPosition(project, x), object.position) }))\n .sort((a, b) => a.d - b.d)\n .slice(0, 12)\n .map(({ x, d }) => (\n <label className=\"check-row\" key={x.id}>\n <input\n type=\"checkbox\"\n checked={object.watchedIds?.includes(x.id) ?? false}\n onChange={e =>\n update({\n watchedIds: e.target.checked\n ? [...(object.watchedIds ?? []), x.id]\n : (object.watchedIds ?? []).filter(id => id !== x.id),\n })\n }\n />\n {x.name}\n <span>{d.toFixed(0)} m</span>\n </label>\n ))}\n <p className=\"helper\">Watched objects use this camera for event footage.</p>\n </>\n )}\n {editing && object.kind === 'stairs' && (\n <>\n <h3>Stair geometry</h3>\n <select\n className=\"field\"\n value={object.stairModel ?? ''}\n onChange={e => update({ stairModel: (e.target.value || undefined) as SiteObject['stairModel'] })}\n >\n <option value=\"\">Fit to the footprint</option>\n <option value=\"straight\">Straight flight</option>\n <option value=\"switchback\">Switchback (half turn)</option>\n <option value=\"dogleg\">Dogleg (quarter turn)</option>\n <option value=\"spiral\">Spiral</option>\n <option value=\"escalator\">Escalator</option>\n </select>\n <p className=\"helper\">\n Left to fit, a run too steep for its footprint is drawn as the stair that turns.\n </p>\n {object.stairModel === 'escalator' && (\n <>\n <Choice\n label=\"Carries you\"\n description=\"An escalator runs one way — routing rides it that way and walks round to come back\"\n value={object.travel ?? 'up'}\n options={[\n { value: 'up', label: 'Up', title: 'From the lower landing to the upper' },\n { value: 'down', label: 'Down', title: 'From the upper landing to the lower' },\n ]}\n onChange={travel => update({ travel })}\n />\n {object.feedId && (\n <p className=\"helper\">\n {statuses.get(object.feedId)?.running === false\n ? 'Stopped right now — the plan draws its steps standing still.'\n : 'Running. A feed may stop it or reverse it; the direction above is how it was built.'}\n </p>\n )}\n </>\n )}\n </>\n )}\n {editing && object.kind === 'elevator' && (\n <>\n <h3>Doors open onto</h3>\n {(['front', 'right', 'back', 'left'] as const).map(side => (\n <label className=\"check-row\" key={side}>\n <input\n type=\"checkbox\"\n checked={(object.doorSides ?? ['front']).includes(side)}\n onChange={e => {\n const now = new Set(object.doorSides ?? ['front']);\n if (e.target.checked) now.add(side);\n else now.delete(side);\n update({\n doorSides: now.size\n ? (['front', 'back', 'left', 'right'] as const).filter(x => now.has(x))\n : undefined,\n });\n }}\n />\n {side[0].toUpperCase() + side.slice(1)}\n </label>\n ))}\n <p className=\"helper\">\n Relative to the lift's own rotation. A level it passes without serving has no doors at all.\n </p>\n </>\n )}\n {editing && ['elevator', 'stairs'].includes(object.kind) && (\n <>\n <h3>Served floors</h3>\n {project.floors.map(f => (\n <label className=\"check-row\" key={f.id}>\n <input\n type=\"checkbox\"\n checked={object.servedFloorIds?.includes(f.id) ?? false}\n onChange={e =>\n update({\n servedFloorIds: e.target.checked\n ? [...(object.servedFloorIds ?? []), f.id]\n : object.servedFloorIds?.filter(id => id !== f.id),\n })\n }\n />\n {f.name}\n <span>{f.elevation} m</span>\n </label>\n ))}\n </>\n )}\n {object.kind === 'building' && (\n <button className=\"button secondary full\" onClick={() => props.onTraceFootprint(object.id)}>\n Create floor walls\n <ArrowUpRight size={15} />\n </button>\n )}\n </section>\n )}\n {!editing && object && (\n <section className=\"property-section\">\n <h3>Object details</h3>\n <div className=\"measurement-row\">\n <span>Type</span>\n <strong>{object.kind}</strong>\n </div>\n <div className=\"measurement-row\">\n <span>Position</span>\n <strong>\n {objectPosition(project, object)\n .map(n => n.toFixed(1))\n .join(', ')}{' '}\n m\n </strong>\n </div>\n {object.rings && (\n <div className=\"measurement-row\">\n <span>Area</span>\n <strong>{objectArea(object).toFixed(1)} m²</strong>\n </div>\n )}\n {object.feedId && <p className=\"feed-id\">{object.feedId}</p>}\n </section>\n )}\n {editing && barrier && (\n <section className=\"property-section\">\n <h3>Barrier geometry</h3>\n <Field\n label=\"Name\"\n value={barrier.name}\n onChange={name => props.onUpdateBarrier(barrier.id, { name })}\n />\n <div className=\"field-grid\">\n <Field\n label=\"Thickness\"\n value={barrier.thickness}\n type=\"number\"\n suffix=\"m\"\n onChange={v => props.onUpdateBarrier(barrier.id, { thickness: Number(v) })}\n />\n <Field\n label=\"Height\"\n value={barrier.height}\n type=\"number\"\n suffix=\"m\"\n onChange={v => props.onUpdateBarrier(barrier.id, { height: Number(v) })}\n />\n </div>\n <div className=\"measurement-row\">\n <span>Length</span>\n <strong>{distance(...barrierEnds(project, barrier)).toFixed(2)} m</strong>\n </div>\n <p className=\"helper\">\n Drag the endpoint handles to reshape this segment. Connected walls and attached openings follow.\n </p>\n <h3>Attached objects</h3>\n {project.objects\n .filter(o => o.barrierId === barrier.id)\n .map(o => (\n <button className=\"object-row\" onClick={() => props.onSelect(o.id)} key={o.id}>\n <EntityIcon kind={o.kind} />\n <span>{o.name}</span>\n <ChevronRight size={14} />\n </button>\n ))}\n </section>\n )}\n {editing && boundary && (\n <section className=\"property-section\">\n <h3>Virtual boundary</h3>\n <div className=\"measurement-row\">\n <span>Length</span>\n <strong>{distance(...barrierEnds(project, boundary)).toFixed(2)} m</strong>\n </div>\n <p className=\"helper\">\n Drag its handles to reshape the shared division. To remove a division between spaces, choose which\n space survives the merge.\n </p>\n </section>\n )}\n {editing && drawing && (\n <section className=\"property-section\">\n <h3>Reference image</h3>\n <Field\n label=\"Name\"\n value={drawing.name}\n onChange={name => props.onUpdateDrawing(drawing.id, { name })}\n />\n <Toggle\n label=\"Visible\"\n value={drawing.visible}\n onChange={() => props.onUpdateDrawing(drawing.id, { visible: !drawing.visible })}\n />\n <Toggle\n label=\"Lock position\"\n value={drawing.locked}\n onChange={() => props.onUpdateDrawing(drawing.id, { locked: !drawing.locked })}\n />\n <label className=\"field\">\n <span>Opacity · {Math.round(drawing.opacity * 100)}%</span>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.05}\n value={drawing.opacity}\n onChange={e => props.onUpdateDrawing(drawing.id, { opacity: Number(e.target.value) })}\n />\n </label>\n {!drawing.locked && (\n <>\n <div className=\"field-grid\">\n <Field\n label=\"East / X\"\n value={drawing.origin[0]}\n type=\"number\"\n suffix=\"m\"\n onChange={v => props.onUpdateDrawing(drawing.id, { origin: [Number(v), drawing.origin[1]] })}\n />\n <Field\n label=\"North / Y\"\n value={drawing.origin[1]}\n type=\"number\"\n suffix=\"m\"\n onChange={v => props.onUpdateDrawing(drawing.id, { origin: [drawing.origin[0], Number(v)] })}\n />\n </div>\n <Field\n label=\"Metres per pixel\"\n value={drawing.scale}\n type=\"number\"\n step={0.001}\n min={0.000001}\n onChange={v => props.onUpdateDrawing(drawing.id, { scale: Number(v) })}\n />\n <Field\n label=\"Rotation\"\n value={drawing.rotation}\n type=\"number\"\n suffix=\"°\"\n onChange={v => props.onUpdateDrawing(drawing.id, { rotation: Number(v) })}\n />\n </>\n )}\n </section>\n )}\n {object && (\n <Connections project={project} object={object} onSelect={props.onSelect} onFloor={props.onFloor} />\n )}\n {monitoring && object?.feedId && props.renderStatusPanel?.({ object, status, editing, live: props.live })}\n </>\n ) : (\n <>\n <div className=\"overview-hero\">\n <div className=\"overview-art\">\n <div className=\"mini-building\">\n <i />\n <i />\n <i />\n <i />\n <div className=\"mini-access\">\n <LockKeyhole size={15} />\n </div>\n </div>\n <span className=\"hero-dots\" />\n </div>\n <span className=\"eyebrow\">{floor ? 'MAIN BUILDING' : 'SITE & SURROUNDINGS'}</span>\n <h2>{floor?.name ?? 'Outdoor site'}</h2>\n <p>\n {floor\n ? `Level ${floor.elevation < 0 ? 'B' + project.floors.filter(x => x.buildingId === floor.buildingId && x.elevation < 0 && x.elevation >= floor.elevation).length : project.floors.filter(x => x.buildingId === floor.buildingId && x.elevation >= 0 && x.elevation < floor.elevation).length} · ${floor.elevation.toFixed(1)} m elevation`\n : project.description}\n </p>\n </div>\n {editing && (\n <section className=\"property-section\">\n <h3>\n Site anchor <Compass size={15} />\n </h3>\n <p className=\"helper\">\n Where the plan is pinned and which way it faces — the one thing a drawing cannot tell you. Geometry is\n untouched: metres stay metres, only the frame moves.\n </p>\n <label className=\"field\">\n <span>Bearing</span>\n <input\n type=\"range\"\n aria-label=\"Bearing slider\"\n min={0}\n max={360}\n step={0.1}\n value={((project.origin[2] ?? 0) + 360) % 360}\n onChange={e => setBearing(Number(e.target.value))}\n />\n </label>\n <div className=\"nudge-row\">\n {[-5, -1, -0.1].map(d => (\n <button className=\"button secondary small\" key={d} onClick={() => turn(d)}>\n {d}°\n </button>\n ))}\n <input\n className=\"nudge-value\"\n aria-label=\"Bearing\"\n type=\"number\"\n step={0.1}\n value={Number((((project.origin[2] ?? 0) + 360) % 360).toFixed(2))}\n onChange={e => setBearing(Number(e.target.value))}\n />\n {[0.1, 1, 5].map(d => (\n <button className=\"button secondary small\" key={d} onClick={() => turn(d)}>\n +{d}°\n </button>\n ))}\n </div>\n <label className=\"field\">\n <span>Move the site</span>\n </label>\n <div className=\"nudge-pad\">\n <button className=\"button secondary small up\" onClick={() => shift(0, step)} aria-label=\"Move north\">\n <ArrowUp size={14} />\n </button>\n <button\n className=\"button secondary small left\"\n onClick={() => shift(-step, 0)}\n aria-label=\"Move west\"\n >\n <ArrowLeft size={14} />\n </button>\n <select\n className=\"step\"\n aria-label=\"Step size\"\n value={step}\n onChange={e => setStep(Number(e.target.value))}\n >\n {[0.1, 0.25, 0.5, 1, 5].map(v => (\n <option key={v} value={v}>\n {v} m\n </option>\n ))}\n </select>\n <button\n className=\"button secondary small right\"\n onClick={() => shift(step, 0)}\n aria-label=\"Move east\"\n >\n <ArrowRight size={14} />\n </button>\n <button\n className=\"button secondary small down\"\n onClick={() => shift(0, -step)}\n aria-label=\"Move south\"\n >\n <ArrowDown size={14} />\n </button>\n </div>\n <p className=\"helper\">\n Steps are metres on the ground, north-up — the compass, not the plan's own grid.\n </p>\n <details className=\"anchor-exact\">\n <summary>Exact coordinates</summary>\n <div className=\"field-row\">\n <Field\n label=\"Longitude\"\n type=\"number\"\n step={0.000001}\n value={project.origin[0]}\n onChange={v => setOrigin(0, v)}\n suffix=\"°\"\n />\n <Field\n label=\"Latitude\"\n type=\"number\"\n step={0.000001}\n value={project.origin[1]}\n onChange={v => setOrigin(1, v)}\n suffix=\"°\"\n />\n </div>\n </details>\n </section>\n )}\n <div className=\"overview-stats\">\n {monitoring ? (\n <div>\n <strong>{bound.length}</strong>\n <span>Live bindings</span>\n </div>\n ) : (\n <div>\n <strong>{objects.length}</strong>\n <span>Objects here</span>\n </div>\n )}\n <div>\n <strong>{objects.filter(o => o.kind === 'room' || o.kind === 'zone').length}</strong>\n <span>Spaces & zones</span>\n </div>\n </div>\n {monitoring && sensed.length > 0 && (\n <section className=\"property-section\">\n <h3>Occupancy & environment</h3>\n <div className=\"overview-status\">\n <span className=\"status-dot normal\" />\n <span>People on this {floor ? 'floor' : 'site'}</span>\n <strong>{people(sensed)}</strong>\n </div>\n <div className=\"overview-status\">\n <span className=\"status-dot normal\" />\n <span>Whole building</span>\n <strong>{people(allBound)}</strong>\n </div>\n {co2Values.length > 0 && (\n <div className=\"overview-status\">\n <span className={`status-dot ${Math.max(...co2Values) > 1000 ? 'warning' : 'normal'}`} />\n <span>CO₂ · avg / peak</span>\n <strong>\n {Math.round(co2Values.reduce((a, b) => a + b, 0) / co2Values.length)} / {Math.max(...co2Values)}{' '}\n ppm\n </strong>\n </div>\n )}\n {busiest && (\n <button className=\"alarm-row\" onClick={() => props.onSelect(busiest.id)}>\n <span className=\"status-dot normal\" />\n <span>\n {busiest.name}\n <small>Busiest space · {statuses.get(busiest.feedId!)?.metrics?.occupancy} people</small>\n </span>\n <ChevronRight size={15} />\n </button>\n )}\n </section>\n )}\n {monitoring && (\n <section className=\"property-section\">\n <h3>\n Status overview <ShieldCheck size={15} />\n </h3>\n <div className=\"overview-status\">\n <span className=\"status-dot normal\" />\n <span>Normal</span>\n <strong>{bound.filter(o => statusTone(statuses.get(o.feedId!)) === 'normal').length}</strong>\n </div>\n <div className=\"overview-status\">\n <span className=\"status-dot critical\" />\n <span>Active alarms</span>\n <strong>{bound.filter(o => statusTone(statuses.get(o.feedId!)) === 'critical').length}</strong>\n </div>\n <div className=\"overview-status\">\n <span className=\"status-dot warning\" />\n <span>Offline / stale / unknown</span>\n <strong>\n {bound.filter(o => ['warning', 'unknown'].includes(statusTone(statuses.get(o.feedId!)))).length}\n </strong>\n </div>\n </section>\n )}\n {monitoring && alarms.length > 0 && (\n <section className=\"property-section\">\n <h3>Site alarms</h3>\n {alarms.map(o => (\n <button className=\"alarm-row\" onClick={() => props.onSelect(o.id)} key={o.id}>\n <span className=\"status-dot critical\" />\n <span>\n {o.name}\n <small>{statusLabel(statuses.get(o.feedId!))}</small>\n </span>\n <ChevronRight size={15} />\n </button>\n ))}\n </section>\n )}\n <section className=\"property-section\">\n <h3>\n Quick access <MoreHorizontal size={16} />\n </h3>\n {bound.slice(0, 4).map(o => (\n <button className=\"object-row\" onClick={() => props.onSelect(o.id)} key={o.id}>\n <EntityIcon kind={o.kind} />\n <span>{o.name}</span>\n <span className={`status-dot ${statusTone(statuses.get(o.feedId!))}`} />\n </button>\n ))}\n {!bound.length && <p className=\"helper\">Give an object a feed id to connect it to your own live data.</p>}\n </section>\n {editing && floor && (\n <section className=\"property-section\">\n <h3>Floor settings</h3>\n <Field\n label=\"Floor name\"\n value={floor.name}\n onChange={name => props.onUpdateFloor(floor.id, { name })}\n />\n <div className=\"field-grid\">\n <Field\n label=\"Elevation\"\n value={floor.elevation}\n type=\"number\"\n suffix=\"m\"\n onChange={v => props.onUpdateFloor(floor.id, { elevation: Number(v) })}\n />\n <Field\n label=\"Floor height\"\n value={floor.height}\n type=\"number\"\n suffix=\"m\"\n onChange={v => props.onUpdateFloor(floor.id, { height: Number(v) })}\n />\n </div>\n <Toggle\n label=\"Intermediate level\"\n description=\"An entresol between full floors: the plan shows it over the level below\"\n value={floor.mezzanine ?? false}\n onChange={() => props.onUpdateFloor(floor.id, { mezzanine: !floor.mezzanine || undefined })}\n />\n <label className=\"field\">\n <span>Ceiling light</span>\n <select\n aria-label=\"Ceiling light\"\n value={lampFor((floor.light ?? DEFAULT_LIGHT).kelvin).id}\n onChange={e =>\n props.onUpdateFloor(floor.id, {\n light: {\n ...(floor.light ?? DEFAULT_LIGHT),\n kelvin: LAMPS.find(l => l.id === e.target.value)!.kelvin,\n },\n })\n }\n >\n {LAMPS.map(lamp => (\n <option value={lamp.id} key={lamp.id}>\n {lamp.label} · {lamp.kelvin} K\n </option>\n ))}\n </select>\n </label>\n <label className=\"field\">\n <span>Ambient sound</span>\n <select\n aria-label=\"Ambient sound\"\n value={floor.ambience?.preset ?? 'silent'}\n onChange={e =>\n props.onUpdateFloor(floor.id, {\n ambience:\n e.target.value === 'silent'\n ? undefined\n : { preset: e.target.value as NonNullable<Floor['ambience']>['preset'] },\n })\n }\n >\n {AMBIENCES.map(a => (\n <option value={a.id} key={a.id} title={a.description}>\n {a.label}\n </option>\n ))}\n </select>\n </label>\n <div className=\"field-grid\">\n <Field\n label=\"Colour temperature\"\n value={(floor.light ?? DEFAULT_LIGHT).kelvin}\n type=\"number\"\n suffix=\"K\"\n min={1500}\n max={12000}\n step={100}\n onChange={v =>\n props.onUpdateFloor(floor.id, {\n light: {\n ...(floor.light ?? DEFAULT_LIGHT),\n kelvin: Math.max(1000, Math.min(12000, Number(v) || DEFAULT_LIGHT.kelvin)),\n },\n })\n }\n />\n <Field\n label=\"Brightness\"\n value={Math.round((floor.light ?? DEFAULT_LIGHT).level * 100)}\n type=\"number\"\n suffix=\"%\"\n min={0}\n max={100}\n step={5}\n onChange={v =>\n props.onUpdateFloor(floor.id, {\n light: {\n ...(floor.light ?? DEFAULT_LIGHT),\n level: Math.max(0, Math.min(1, Number(v) / 100)),\n },\n })\n }\n />\n </div>\n <p className=\"helper lamp-note\">\n <i style={{ background: kelvinColor((floor.light ?? DEFAULT_LIGHT).kelvin) }} />\n This level's own lighting, which stays on whatever the sun is doing — it is what keeps the plan\n legible after dark.\n </p>\n <Toggle\n label=\"Open here by default\"\n description=\"Anyone opening this plan starts on this level instead of the ground floor\"\n value={project.initialFloorId === floor.id}\n onChange={() => props.onSetInitialFloor(project.initialFloorId === floor.id ? null : floor.id)}\n />\n {project.floors.length > 1 && (\n <button className=\"text-button danger\" onClick={() => props.onDeleteFloor(floor.id)}>\n <Trash2 size={14} />\n Delete this floor\n </button>\n )}\n <p className=\"helper\">{project.datum}</p>\n </section>\n )}\n <div className=\"inspector-note\">\n <Compass size={17} />\n <p>\n Your space, described.\n <br />\n <span>Select anything on the plan to inspect and edit it.</span>\n </p>\n </div>\n </>\n )}\n </div>\n {selected && editing && (\n <div className=\"inspector-footer\">\n <button\n className=\"button secondary\"\n onClick={props.onDuplicate}\n disabled={!!drawing || !!barrier || !!boundary || !!object?.barrierId}\n >\n <Copy size={15} />\n Duplicate\n </button>\n <button className=\"button danger-quiet\" onClick={props.onDelete}>\n <Trash2 size={16} />\n Delete\n </button>\n </div>\n )}\n {!editing && monitoring && (\n <div className=\"viewer-note\">\n <Unplug size={14} />\n Read-only status feed\n </div>\n )}\n </aside>\n );\n}\n"],"names":["Connections","project","object","onSelect","onFloor","name","id","_a","o","floorName","f","rows","kindOf","portals","effectivePortals","portal","x","side","other","way","entryInto","jsx","ArrowRight","isOpening","barrier","b","a","barrierEnds","len","distance","nx","ny","step","sign","probe","space","spaceAt","coverageOf","Eye","fid","Layers","isSpace","p","opening","cam","zones","z","zoneSpaces","jsxs","r","ChevronRight","Inspector","props","floorId","selected","statuses","monitoring","editing","spaceName","boundary","drawing","d","floor","objects","bound","allBound","alarms","statusTone","sensed","_b","people","list","n","co2Values","busiest","_d","_c","status","setStep","useState","setBearing","value","turn","delta","shift","east","north","setOrigin","part","raw","lng","lat","bearing","next","watcher","c","update","patch","number","label","key","suffix","min","max","Field","v","title","X","Layers3","Fragment","EntityIcon","isArea","ShieldCheck","statusLabel","Camera","mode","_e","feedId","_f","_g","passage","target","attests","_h","objectArea","_i","AMBIENCES","objectPosition","e","Choice","travel","_j","now","ArrowUpRight","Toggle","_k","LockKeyhole","Compass","ArrowUp","ArrowLeft","ArrowDown","_m","_l","MoreHorizontal","lampFor","DEFAULT_LIGHT","LAMPS","l","lamp","_n","kelvinColor","Trash2","Copy","Unplug"],"mappings":"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"}
@@ -0,0 +1,301 @@
1
+ import { jsxs as l, jsx as n, Fragment as R } from "react/jsx-runtime";
2
+ import { useMemo as K, useRef as B, useEffect as F, useState as G } from "react";
3
+ import { X as _, ArrowUpDown as W, Waypoints as V, Flag as X, ArrowUpRight as J, MoveUpRight as Y, DoorOpen as Z, Footprints as j, MapPin as ee, ChevronLeft as Q, Pause as ne, Play as oe, ChevronRight as le, Search as ie, Layers3 as se, PersonStanding as ae } from "lucide-react";
4
+ import { floorPhrase as O, HERE as P, navNodes as te } from "../model/navigation.js";
5
+ import { EntityIcon as re } from "./Icons.js";
6
+ import { useStrings as ce } from "../theme/index.js";
7
+ const de = ["room", "zone", "door", "gate", "poi", "elevator", "stairs", "turnstile"], pe = {
8
+ depart: ee,
9
+ walk: j,
10
+ door: Z,
11
+ stairs: Y,
12
+ elevator: J,
13
+ arrive: X
14
+ };
15
+ function Ne({
16
+ project: t,
17
+ here: r,
18
+ from: u,
19
+ to: s,
20
+ route: a,
21
+ playing: y,
22
+ activeStep: E,
23
+ editing: U,
24
+ onFrom: m,
25
+ onTo: x,
26
+ onSwap: H,
27
+ onClear: v,
28
+ onPlay: f,
29
+ onPause: L,
30
+ onStep: C,
31
+ onSeek: I,
32
+ onClose: $
33
+ }) {
34
+ const g = ce(), i = g.navigate, { places: T, levels: M } = K(() => {
35
+ const c = t.objects.filter((o) => de.includes(o.kind)), d = new Map(t.objects.map((o) => [o.id, o])), w = [
36
+ { id: null, name: g.outdoors, count: 0 },
37
+ ...t.floors.map((o) => ({ id: o.id, name: O(t, o.id), count: 0 }))
38
+ ], e = [];
39
+ for (const o of w) {
40
+ const p = c.filter((h) => h.floorId === o.id).sort((h, k) => h.name.localeCompare(k.name));
41
+ o.count = p.length;
42
+ for (const h of p) {
43
+ const k = h.parentId ? d.get(h.parentId) : void 0;
44
+ e.push({ id: h.id, o: h, floorId: o.id, floor: o.name, group: (k == null ? void 0 : k.name) ?? "" });
45
+ }
46
+ }
47
+ return { places: e, levels: w.filter((o) => o.count) };
48
+ }, [t, g.outdoors]), z = r ? `${i.here} · ${r.floorId === null ? g.outdoors : O(t, r.floorId)}` : "", b = r ? {
49
+ id: P,
50
+ o: { id: P, kind: "poi", name: i.here, floorId: r.floorId, position: r.position },
51
+ floorId: r.floorId,
52
+ floor: z,
53
+ group: ""
54
+ } : null, D = B(!1);
55
+ F(() => {
56
+ r && !u && !s && !D.current && (D.current = !0, m(P));
57
+ }, [r, u, s, m]);
58
+ const A = K(() => te(t).length > 0, [t]), N = a ? new Set(a.steps.map((c) => c.floorId)).size : 0, S = (c, d, w, e, o) => /* @__PURE__ */ n(
59
+ he,
60
+ {
61
+ label: c,
62
+ places: T,
63
+ levels: M,
64
+ first: o,
65
+ value: d,
66
+ other: w,
67
+ onPick: e,
68
+ placeholder: i.choose,
69
+ strings: i
70
+ }
71
+ );
72
+ return /* @__PURE__ */ l("aside", { className: "inspector navigate-panel", children: [
73
+ /* @__PURE__ */ l("div", { className: "inspector-top", children: [
74
+ /* @__PURE__ */ n("span", { children: i.title }),
75
+ /* @__PURE__ */ n("button", { className: "icon-button", "aria-label": "Close navigation", onClick: $, children: /* @__PURE__ */ n(_, { size: 17 }) })
76
+ ] }),
77
+ /* @__PURE__ */ l("div", { className: "inspector-scroll", children: [
78
+ /* @__PURE__ */ l("div", { className: "nav-endpoints", children: [
79
+ /* @__PURE__ */ l("div", { className: "nav-endpoint-fields", children: [
80
+ S(i.from, u, s, m, b),
81
+ S(i.to, s, u, x, null)
82
+ ] }),
83
+ /* @__PURE__ */ l("div", { className: "nav-endpoint-actions", children: [
84
+ /* @__PURE__ */ n("button", { className: "icon-button", "aria-label": i.swap, title: i.swap, disabled: !u && !s, onClick: H, children: /* @__PURE__ */ n(W, { size: 16 }) }),
85
+ (u || s) && /* @__PURE__ */ n("button", { className: "text-button", onClick: v, children: i.clear })
86
+ ] })
87
+ ] }),
88
+ A ? u && s && !a ? /* @__PURE__ */ l("div", { className: "nav-empty", children: [
89
+ /* @__PURE__ */ n(V, { size: 22 }),
90
+ /* @__PURE__ */ n("strong", { children: i.unreachable }),
91
+ /* @__PURE__ */ n("p", { children: i.unreachableHint })
92
+ ] }) : a ? /* @__PURE__ */ l(R, { children: [
93
+ /* @__PURE__ */ l("div", { className: "nav-summary", children: [
94
+ /* @__PURE__ */ l("div", { children: [
95
+ /* @__PURE__ */ l("strong", { children: [
96
+ Math.max(1, Math.round(a.distance)),
97
+ " m"
98
+ ] }),
99
+ /* @__PURE__ */ n("span", { children: i.walking })
100
+ ] }),
101
+ /* @__PURE__ */ l("div", { children: [
102
+ /* @__PURE__ */ n("strong", { children: N }),
103
+ /* @__PURE__ */ n("span", { children: i.floors })
104
+ ] }),
105
+ /* @__PURE__ */ l("div", { children: [
106
+ /* @__PURE__ */ n("strong", { children: a.steps.length }),
107
+ /* @__PURE__ */ n("span", { children: i.steps })
108
+ ] })
109
+ ] }),
110
+ /* @__PURE__ */ n("ol", { className: "nav-steps", children: a.steps.map((c, d) => {
111
+ const w = pe[c.kind];
112
+ return /* @__PURE__ */ n("li", { children: /* @__PURE__ */ l("button", { className: `nav-step ${d === E ? "active" : ""}`, onClick: () => I(d), children: [
113
+ /* @__PURE__ */ n("span", { className: "nav-step-num", children: d + 1 }),
114
+ /* @__PURE__ */ n(w, { size: 15 }),
115
+ /* @__PURE__ */ l("span", { className: "nav-step-text", children: [
116
+ c.text,
117
+ /* @__PURE__ */ l("small", { children: [
118
+ O(t, c.floorId),
119
+ c.distance !== void 0 ? ` · ${Math.max(1, Math.round(c.distance))} m` : ""
120
+ ] })
121
+ ] })
122
+ ] }) }, d);
123
+ }) })
124
+ ] }) : /* @__PURE__ */ n("p", { className: "helper", children: i.pick }) : /* @__PURE__ */ l("div", { className: "nav-empty", children: [
125
+ /* @__PURE__ */ n(V, { size: 22 }),
126
+ /* @__PURE__ */ n("strong", { children: i.noGraph }),
127
+ /* @__PURE__ */ n("p", { children: U ? i.noGraphHintEdit : i.noGraphHintView })
128
+ ] })
129
+ ] }),
130
+ a && /* @__PURE__ */ l("div", { className: "nav-controls", children: [
131
+ /* @__PURE__ */ n(
132
+ "button",
133
+ {
134
+ className: "icon-button",
135
+ "aria-label": i.prev,
136
+ title: i.prev,
137
+ disabled: (E ?? 0) <= 0,
138
+ onClick: () => C(-1),
139
+ children: /* @__PURE__ */ n(Q, { size: 18 })
140
+ }
141
+ ),
142
+ /* @__PURE__ */ n("button", { className: "button primary nav-play", onClick: y ? L : f, children: y ? /* @__PURE__ */ l(R, { children: [
143
+ /* @__PURE__ */ n(ne, { size: 15 }),
144
+ i.pause
145
+ ] }) : /* @__PURE__ */ l(R, { children: [
146
+ /* @__PURE__ */ n(oe, { size: 15 }),
147
+ i.play
148
+ ] }) }),
149
+ /* @__PURE__ */ n(
150
+ "button",
151
+ {
152
+ className: "icon-button",
153
+ "aria-label": i.next,
154
+ title: i.next,
155
+ disabled: (E ?? -1) >= a.steps.length - 1,
156
+ onClick: () => C(1),
157
+ children: /* @__PURE__ */ n(le, { size: 18 })
158
+ }
159
+ )
160
+ ] })
161
+ ] });
162
+ }
163
+ const q = 60;
164
+ function he({
165
+ label: t,
166
+ places: r,
167
+ levels: u,
168
+ first: s,
169
+ value: a,
170
+ other: y,
171
+ onPick: E,
172
+ placeholder: U,
173
+ strings: m
174
+ }) {
175
+ const [x, H] = G(""), [v, f] = G(!1), [L, C] = G(0), [I, $] = G(void 0), [g, i] = G(q), T = B(null), M = B(null), z = a === P ? s : a ? r.find((e) => e.id === a) : void 0, b = x.trim().toLowerCase(), D = v && !b, A = v ? b ? r.filter((e) => e.id !== y && (e.o.name.toLowerCase().includes(b) || e.floor.toLowerCase().includes(b))) : I !== void 0 ? r.filter((e) => e.id !== y && e.floorId === I) : [] : [], N = A.slice(0, g);
176
+ F(() => {
177
+ const e = (o) => {
178
+ var p;
179
+ (p = T.current) != null && p.contains(o.target) || f(!1);
180
+ };
181
+ return window.addEventListener("pointerdown", e), () => window.removeEventListener("pointerdown", e);
182
+ }, []), F(() => {
183
+ C(0), i(q), M.current && (M.current.scrollTop = 0);
184
+ }, [b, v, I]);
185
+ const S = (e) => {
186
+ E(e), f(!1), H(""), $(void 0);
187
+ }, c = () => {
188
+ const e = M.current;
189
+ e && e.scrollTop + e.clientHeight >= e.scrollHeight - 80 && g < A.length && i((o) => o + q);
190
+ }, d = (e, o) => /* @__PURE__ */ l(
191
+ "button",
192
+ {
193
+ role: "option",
194
+ "aria-selected": o === L,
195
+ className: `place-option ${o === L ? "cursor" : ""} ${e.id === a ? "chosen" : ""} ${e.id === P ? "here" : ""}`,
196
+ onPointerDown: (p) => {
197
+ p.preventDefault(), S(e.id);
198
+ },
199
+ onMouseEnter: () => C(o),
200
+ children: [
201
+ e.id === P ? /* @__PURE__ */ n(ae, { size: 14 }) : /* @__PURE__ */ n(re, { kind: e.o.kind, size: 14, symbol: e.o.symbol }),
202
+ /* @__PURE__ */ l("span", { children: [
203
+ e.o.name,
204
+ /* @__PURE__ */ n("small", { children: e.id === P ? `${m.hereHint} · ${e.floor.split(" · ")[1] ?? ""}` : e.floor })
205
+ ] })
206
+ ]
207
+ },
208
+ e.id
209
+ ), w = (e) => {
210
+ const o = [];
211
+ let p;
212
+ return e.forEach((h, k) => {
213
+ h.group !== p && (p = h.group, p && o.push(
214
+ /* @__PURE__ */ n("p", { className: "place-group", children: p }, `g-${p}-${k}`)
215
+ )), o.push(d(h, k));
216
+ }), o;
217
+ };
218
+ return /* @__PURE__ */ l("label", { className: "field place-picker", ref: T, children: [
219
+ /* @__PURE__ */ n("span", { children: t }),
220
+ /* @__PURE__ */ l("div", { className: "place-input", children: [
221
+ /* @__PURE__ */ n(ie, { size: 13 }),
222
+ /* @__PURE__ */ n(
223
+ "input",
224
+ {
225
+ "aria-label": t,
226
+ placeholder: z ? z.o.name : U,
227
+ value: v ? x : (z == null ? void 0 : z.o.name) ?? "",
228
+ onFocus: () => {
229
+ f(!0), H("");
230
+ },
231
+ onBlur: () => setTimeout(() => f(!1), 120),
232
+ onChange: (e) => {
233
+ H(e.target.value), f(!0);
234
+ },
235
+ onKeyDown: (e) => {
236
+ e.key === "ArrowDown" ? (e.preventDefault(), C((o) => Math.min(o + 1, N.length - 1))) : e.key === "ArrowUp" ? (e.preventDefault(), C((o) => Math.max(o - 1, 0))) : e.key === "Enter" ? (e.preventDefault(), N[L] && S(N[L].id)) : e.key === "Backspace" && !x && I !== void 0 ? $(void 0) : e.key === "Escape" && (e.stopPropagation(), f(!1), e.target.blur());
237
+ }
238
+ }
239
+ ),
240
+ a && !v && /* @__PURE__ */ n(
241
+ "button",
242
+ {
243
+ className: "icon-button place-clear",
244
+ "aria-label": `Clear ${t}`,
245
+ onClick: (e) => {
246
+ e.preventDefault(), E(null);
247
+ },
248
+ children: /* @__PURE__ */ n(_, { size: 13 })
249
+ }
250
+ )
251
+ ] }),
252
+ v && /* @__PURE__ */ n("div", { className: "place-options", role: "listbox", ref: M, onScroll: c, children: D && I === void 0 ? /* @__PURE__ */ l(R, { children: [
253
+ s && s.id !== y && d(s, -1),
254
+ /* @__PURE__ */ n("p", { className: "place-group", children: m.levels }),
255
+ u.map((e) => /* @__PURE__ */ l(
256
+ "button",
257
+ {
258
+ className: "place-level",
259
+ onPointerDown: (o) => {
260
+ o.preventDefault(), $(e.id);
261
+ },
262
+ children: [
263
+ /* @__PURE__ */ n(se, { size: 14 }),
264
+ e.name,
265
+ /* @__PURE__ */ l("small", { children: [
266
+ e.count,
267
+ " ",
268
+ m.places
269
+ ] })
270
+ ]
271
+ },
272
+ e.id ?? "out"
273
+ ))
274
+ ] }) : /* @__PURE__ */ l(R, { children: [
275
+ D && /* @__PURE__ */ l(
276
+ "button",
277
+ {
278
+ className: "place-back",
279
+ onPointerDown: (e) => {
280
+ e.preventDefault(), $(void 0);
281
+ },
282
+ children: [
283
+ /* @__PURE__ */ n(Q, { size: 14 }),
284
+ m.allLevels
285
+ ]
286
+ }
287
+ ),
288
+ !D && s && s.id !== y && s.o.name.toLowerCase().includes(b) && d(s, -1),
289
+ N.length ? D ? w(N) : N.map(d) : /* @__PURE__ */ l("p", { className: "place-none", children: [
290
+ "No places match “",
291
+ x,
292
+ "”."
293
+ ] }),
294
+ g < A.length && /* @__PURE__ */ n("p", { className: "place-none", children: m.more })
295
+ ] }) })
296
+ ] });
297
+ }
298
+ export {
299
+ Ne as NavigatePanel
300
+ };
301
+ //# sourceMappingURL=NavigatePanel.js.map