@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,4931 @@
1
+ .maplibregl-map{font:12px/20px Helvetica Neue,Arial,Helvetica,sans-serif;overflow:hidden;position:relative;-webkit-tap-highlight-color:rgb(0 0 0/0);-webkit-touch-callout:none}.maplibregl-canvas{position:absolute;left:0;top:0}.maplibregl-map:fullscreen{width:100%;height:100%}.maplibregl-ctrl-group button.maplibregl-ctrl-compass{touch-action:none}.maplibregl-canvas-container.maplibregl-interactive,.maplibregl-ctrl-group button.maplibregl-ctrl-compass{cursor:grab;-webkit-user-select:none;-moz-user-select:none;user-select:none}.maplibregl-canvas-container.maplibregl-interactive.maplibregl-track-pointer{cursor:pointer}.maplibregl-canvas-container.maplibregl-interactive:active,.maplibregl-ctrl-group button.maplibregl-ctrl-compass:active{cursor:grabbing}.maplibregl-canvas-container.maplibregl-touch-zoom-rotate,.maplibregl-canvas-container.maplibregl-touch-zoom-rotate .maplibregl-canvas{touch-action:pan-x pan-y}.maplibregl-canvas-container.maplibregl-touch-drag-pan,.maplibregl-canvas-container.maplibregl-touch-drag-pan .maplibregl-canvas{touch-action:pinch-zoom}.maplibregl-canvas-container.maplibregl-touch-zoom-rotate.maplibregl-touch-drag-pan,.maplibregl-canvas-container.maplibregl-touch-zoom-rotate.maplibregl-touch-drag-pan .maplibregl-canvas{touch-action:none}.maplibregl-canvas-container.maplibregl-touch-drag-pan.maplibregl-cooperative-gestures,.maplibregl-canvas-container.maplibregl-touch-drag-pan.maplibregl-cooperative-gestures .maplibregl-canvas{touch-action:pan-x pan-y}.maplibregl-ctrl-bottom-left,.maplibregl-ctrl-bottom-right,.maplibregl-ctrl-top-left,.maplibregl-ctrl-top-right{position:absolute;pointer-events:none;z-index:2}.maplibregl-ctrl-top-left{top:0;left:0}.maplibregl-ctrl-top-right{top:0;right:0}.maplibregl-ctrl-bottom-left{bottom:0;left:0}.maplibregl-ctrl-bottom-right{right:0;bottom:0}.maplibregl-ctrl{clear:both;pointer-events:auto;transform:translate(0)}.maplibregl-ctrl-top-left .maplibregl-ctrl{margin:10px 0 0 10px;float:left}.maplibregl-ctrl-top-right .maplibregl-ctrl{margin:10px 10px 0 0;float:right}.maplibregl-ctrl-bottom-left .maplibregl-ctrl{margin:0 0 10px 10px;float:left}.maplibregl-ctrl-bottom-right .maplibregl-ctrl{margin:0 10px 10px 0;float:right}.maplibregl-ctrl-group{border-radius:4px;background:#fff}.maplibregl-ctrl-group:not(:empty){box-shadow:0 0 0 2px rgba(0,0,0,.1)}.maplibregl-ctrl-group button{width:29px;height:29px;display:block;padding:0;outline:none;border:0;box-sizing:border-box;background-color:transparent;cursor:pointer}.maplibregl-ctrl button{-webkit-user-select:none;-moz-user-select:none;user-select:none}.maplibregl-ctrl-group button+button{border-top:1px solid #ddd}.maplibregl-ctrl button .maplibregl-ctrl-icon{display:block;width:100%;height:100%;background-repeat:no-repeat;background-position:50%}@media(forced-colors:active){.maplibregl-ctrl-group:not(:empty){box-shadow:0 0 0 2px ButtonText}.maplibregl-ctrl-icon{background-color:transparent}.maplibregl-ctrl-group button+button{border-top:1px solid buttontext}}.maplibregl-ctrl button::-moz-focus-inner{border:0;padding:0}.maplibregl-ctrl-attrib-button:focus,.maplibregl-ctrl-group button:focus{box-shadow:0 0 2px 2px #0096ff}.maplibregl-ctrl button:disabled{cursor:not-allowed}.maplibregl-ctrl button:disabled .maplibregl-ctrl-icon{opacity:.25}@media(hover:hover){.maplibregl-ctrl button:not(:disabled):hover{background-color:rgba(0,0,0,.05)}}.maplibregl-ctrl button:not(:disabled):active{background-color:rgba(0,0,0,.05)}.maplibregl-ctrl-group button:focus:focus-visible{box-shadow:0 0 2px 2px #0096ff}.maplibregl-ctrl-group button:focus:not(:focus-visible){box-shadow:none}.maplibregl-ctrl-group button:focus:first-child{border-radius:4px 4px 0 0}.maplibregl-ctrl-group button:focus:last-child{border-radius:0 0 4px 4px}.maplibregl-ctrl-group button:focus:only-child{border-radius:inherit}.maplibregl-ctrl button.maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23333'%3E %3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13z'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23333'%3E %3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5'/%3E %3C/svg%3E")}@media(forced-colors:active){.maplibregl-ctrl button.maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23fff'%3E %3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13z'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23fff'%3E %3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5'/%3E %3C/svg%3E")}}@media(forced-colors:active) and (prefers-color-scheme:light){.maplibregl-ctrl button.maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23000'%3E %3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13z'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23000'%3E %3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5'/%3E %3C/svg%3E")}}.maplibregl-ctrl button.maplibregl-ctrl-fullscreen .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23333'%3E %3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1z'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-shrink .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29'%3E %3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1z'/%3E %3C/svg%3E")}@media(forced-colors:active){.maplibregl-ctrl button.maplibregl-ctrl-fullscreen .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23fff'%3E %3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1z'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-shrink .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23fff'%3E %3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1z'/%3E %3C/svg%3E")}}@media(forced-colors:active) and (prefers-color-scheme:light){.maplibregl-ctrl button.maplibregl-ctrl-fullscreen .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23000'%3E %3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1z'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-shrink .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23000'%3E %3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1z'/%3E %3C/svg%3E")}}.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23333'%3E %3Cpath d='m10.5 14 4-8 4 8z'/%3E %3Cpath fill='%23ccc' d='m10.5 16 4 8 4-8z'/%3E %3C/svg%3E")}@media(forced-colors:active){.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23fff'%3E %3Cpath d='m10.5 14 4-8 4 8z'/%3E %3Cpath fill='%23ccc' d='m10.5 16 4 8 4-8z'/%3E %3C/svg%3E")}}@media(forced-colors:active) and (prefers-color-scheme:light){.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23000'%3E %3Cpath d='m10.5 14 4-8 4 8z'/%3E %3Cpath fill='%23ccc' d='m10.5 16 4 8 4-8z'/%3E %3C/svg%3E")}}.maplibregl-ctrl button.maplibregl-ctrl-globe .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22' fill='none' viewBox='0 0 22 22' stroke='%23333'%3E %3Ccircle cx='11' cy='11' r='8.5'/%3E %3Cpath d='M17.5 11c0 4.819-3.02 8.5-6.5 8.5S4.5 15.819 4.5 11 7.52 2.5 11 2.5s6.5 3.681 6.5 8.5Z'/%3E %3Cpath d='M13.5 11c0 2.447-.331 4.64-.853 6.206-.262.785-.562 1.384-.872 1.777-.314.399-.58.517-.775.517-.195 0-.461-.118-.775-.517-.31-.393-.61-.992-.872-1.777C8.831 15.64 8.5 13.446 8.5 11c0-2.447.331-4.64.853-6.206.262-.785.562-1.384.872-1.777.314-.399.58-.517.775-.517.195 0 .461.118.775.517.31.393.61.992.872 1.777.522 1.565.853 3.76.853 6.206Z'/%3E %3Cpath d='M11 7.5c-1.909 0-3.622-.166-4.845-.428-.616-.132-1.08-.283-1.379-.434a1.333 1.333 0 0 1-.224-.138c.047-.038.12-.085.224-.138.299-.151.763-.302 1.379-.434C7.378 5.666 9.091 5.5 11 5.5c1.909 0 3.622.166 4.845.428.616.132 1.08.283 1.379.434.105.053.177.1.224.138-.047.038-.12.085-.224.138-.299.151-.763.302-1.379.434-1.223.262-2.936.428-4.845.428ZM4.486 6.436ZM11 16.5c-1.909 0-3.622-.166-4.845-.428-.616-.132-1.08-.283-1.379-.434a1.33 1.33 0 0 1-.224-.138 1.33 1.33 0 0 1 .224-.138c.299-.151.763-.302 1.379-.434C7.378 14.666 9.091 14.5 11 14.5c1.909 0 3.622.166 4.845.428.616.132 1.08.283 1.379.434.105.053.177.1.224.138a1.33 1.33 0 0 1-.224.138c-.299.151-.763.302-1.379.434-1.223.262-2.936.428-4.845.428Zm-6.514-1.064ZM11 12.5c-2.46 0-4.672-.222-6.255-.574-.796-.177-1.406-.38-1.805-.59a1.465 1.465 0 0 1-.39-.272.293.293 0 0 1-.047-.064.293.293 0 0 1 .048-.064c.066-.073.189-.167.389-.272.399-.21 1.009-.413 1.805-.59C6.328 9.722 8.54 9.5 11 9.5s4.672.222 6.256.574c.795.177 1.405.38 1.804.59.2.105.323.2.39.272a.33.33 0 0 1 .047.064.293.293 0 0 1-.048.064 1.435 1.435 0 0 1-.389.272c-.399.21-1.009.413-1.804.59-1.584.352-3.796.574-6.256.574Zm-8.501-1.51v.002-.002Zm0 .018v.002-.002Zm17.002.002v-.002.002Zm0-.018v-.002.002Z'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-globe-enabled .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22' fill='none' viewBox='0 0 22 22' stroke='%2333b5e5'%3E %3Ccircle cx='11' cy='11' r='8.5'/%3E %3Cpath d='M17.5 11c0 4.819-3.02 8.5-6.5 8.5S4.5 15.819 4.5 11 7.52 2.5 11 2.5s6.5 3.681 6.5 8.5Z'/%3E %3Cpath d='M13.5 11c0 2.447-.331 4.64-.853 6.206-.262.785-.562 1.384-.872 1.777-.314.399-.58.517-.775.517-.195 0-.461-.118-.775-.517-.31-.393-.61-.992-.872-1.777C8.831 15.64 8.5 13.446 8.5 11c0-2.447.331-4.64.853-6.206.262-.785.562-1.384.872-1.777.314-.399.58-.517.775-.517.195 0 .461.118.775.517.31.393.61.992.872 1.777.522 1.565.853 3.76.853 6.206Z'/%3E %3Cpath d='M11 7.5c-1.909 0-3.622-.166-4.845-.428-.616-.132-1.08-.283-1.379-.434a1.333 1.333 0 0 1-.224-.138c.047-.038.12-.085.224-.138.299-.151.763-.302 1.379-.434C7.378 5.666 9.091 5.5 11 5.5c1.909 0 3.622.166 4.845.428.616.132 1.08.283 1.379.434.105.053.177.1.224.138-.047.038-.12.085-.224.138-.299.151-.763.302-1.379.434-1.223.262-2.936.428-4.845.428ZM4.486 6.436ZM11 16.5c-1.909 0-3.622-.166-4.845-.428-.616-.132-1.08-.283-1.379-.434a1.33 1.33 0 0 1-.224-.138 1.33 1.33 0 0 1 .224-.138c.299-.151.763-.302 1.379-.434C7.378 14.666 9.091 14.5 11 14.5c1.909 0 3.622.166 4.845.428.616.132 1.08.283 1.379.434.105.053.177.1.224.138a1.33 1.33 0 0 1-.224.138c-.299.151-.763.302-1.379.434-1.223.262-2.936.428-4.845.428Zm-6.514-1.064ZM11 12.5c-2.46 0-4.672-.222-6.255-.574-.796-.177-1.406-.38-1.805-.59a1.465 1.465 0 0 1-.39-.272.293.293 0 0 1-.047-.064.293.293 0 0 1 .048-.064c.066-.073.189-.167.389-.272.399-.21 1.009-.413 1.805-.59C6.328 9.722 8.54 9.5 11 9.5s4.672.222 6.256.574c.795.177 1.405.38 1.804.59.2.105.323.2.39.272a.33.33 0 0 1 .047.064.293.293 0 0 1-.048.064 1.435 1.435 0 0 1-.389.272c-.399.21-1.009.413-1.804.59-1.584.352-3.796.574-6.256.574Zm-8.501-1.51v.002-.002Zm0 .018v.002-.002Zm17.002.002v-.002.002Zm0-.018v-.002.002Z'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-terrain .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22' viewBox='0 0 22 22' fill='%23333'%3E %3Cpath d='m1.754 13.406 4.453-4.851 3.09 3.09 3.281 3.277.969-.969-3.309-3.312 3.844-4.121 6.148 6.886h1.082v-.855l-7.207-8.07-4.84 5.187L6.169 6.57l-5.48 5.965v.871ZM.688 16.844h20.625v1.375H.688Zm0 0'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-terrain-enabled .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22' viewBox='0 0 22 22' fill='%2333b5e5'%3E %3Cpath d='m1.754 13.406 4.453-4.851 3.09 3.09 3.281 3.277.969-.969-3.309-3.312 3.844-4.121 6.148 6.886h1.082v-.855l-7.207-8.07-4.84 5.187L6.169 6.57l-5.48 5.965v.871ZM.688 16.844h20.625v1.375H.688Zm0 0'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' fill='%23333'%3E %3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate:disabled .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' fill='%23aaa'%3E %3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' fill='%23f00'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' fill='%2333b5e5'%3E %3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active-error .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' fill='%23e58978'%3E %3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' fill='%2333b5e5'%3E %3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background-error .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' fill='%23e54e33'%3E %3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-waiting .maplibregl-ctrl-icon{animation:maplibregl-spin 2s linear infinite}@media(forced-colors:active){.maplibregl-ctrl button.maplibregl-ctrl-geolocate .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' fill='%23fff'%3E %3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate:disabled .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' fill='%23999'%3E %3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' fill='%23f00'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' fill='%2333b5e5'%3E %3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active-error .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' fill='%23e58978'%3E %3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' fill='%2333b5e5'%3E %3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background-error .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' fill='%23e54e33'%3E %3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E")}}@media(forced-colors:active) and (prefers-color-scheme:light){.maplibregl-ctrl button.maplibregl-ctrl-geolocate .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' fill='%23000'%3E %3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate:disabled .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' fill='%23666'%3E %3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' fill='%23f00'/%3E %3C/svg%3E")}}@keyframes maplibregl-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}a.maplibregl-ctrl-logo{width:88px;height:23px;margin:0 0 -4px -4px;display:block;background-repeat:no-repeat;cursor:pointer;overflow:hidden;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='88' height='23' fill='none'%3E %3Cpath fill='%23000' fill-opacity='.4' fill-rule='evenodd' d='M17.408 16.796h-1.827l2.501-12.095h.198l3.324 6.533.988 2.19.988-2.19 3.258-6.533h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.929 5.644h-.098l-2.914-5.644-.757-1.71-.345 1.71zm1.958-3.42-.726 3.663a1.255 1.255 0 0 1-1.232 1.011h-1.827a1.255 1.255 0 0 1-1.229-1.509l2.501-12.095a1.255 1.255 0 0 1 1.23-1.001h.197a1.25 1.25 0 0 1 1.12.685l3.19 6.273 3.125-6.263a1.25 1.25 0 0 1 1.123-.695h.181a1.255 1.255 0 0 1 1.227.991l1.443 6.71a5 5 0 0 1 .314-.787l.009-.016a4.6 4.6 0 0 1 1.777-1.887c.782-.46 1.668-.667 2.611-.667a4.6 4.6 0 0 1 1.7.32l.306.134c.21-.16.474-.256.759-.256h1.694a1.255 1.255 0 0 1 1.212.925 1.255 1.255 0 0 1 1.212-.925h1.711c.284 0 .545.094.755.252.613-.3 1.312-.45 2.075-.45 1.356 0 2.557.445 3.482 1.4q.47.48.763 1.064V4.701a1.255 1.255 0 0 1 1.255-1.255h1.86A1.255 1.255 0 0 1 54.44 4.7v9.194h2.217c.19 0 .37.043.532.118v-4.77c0-.356.147-.678.385-.906a2.42 2.42 0 0 1-.682-1.71c0-.665.267-1.253.735-1.7a2.45 2.45 0 0 1 1.722-.674 2.43 2.43 0 0 1 1.705.675q.318.302.504.683V4.7a1.255 1.255 0 0 1 1.255-1.255h1.744A1.255 1.255 0 0 1 65.812 4.7v3.335a4.8 4.8 0 0 1 1.526-.246c.938 0 1.817.214 2.59.69a4.47 4.47 0 0 1 1.67 1.743v-.98a1.255 1.255 0 0 1 1.256-1.256h1.777c.233 0 .451.064.639.174a3.4 3.4 0 0 1 1.567-.372c.346 0 .861.02 1.285.232a1.25 1.25 0 0 1 .689 1.004 4.7 4.7 0 0 1 .853-.588c.795-.44 1.675-.647 2.61-.647 1.385 0 2.65.39 3.525 1.396.836.938 1.168 2.173 1.168 3.528q-.001.515-.056 1.051a1.255 1.255 0 0 1-.947 1.09l.408.952a1.255 1.255 0 0 1-.477 1.552c-.418.268-.92.463-1.458.612-.613.171-1.304.244-2.049.244-1.06 0-2.043-.207-2.886-.698l-.015-.008c-.798-.48-1.419-1.135-1.818-1.963l-.004-.008a5.8 5.8 0 0 1-.548-2.512q0-.429.053-.843a1.3 1.3 0 0 1-.333-.086l-.166-.004c-.223 0-.426.062-.643.228-.03.024-.142.139-.142.59v3.883a1.255 1.255 0 0 1-1.256 1.256h-1.777a1.255 1.255 0 0 1-1.256-1.256V15.69l-.032.057a4.8 4.8 0 0 1-1.86 1.833 5.04 5.04 0 0 1-2.484.634 4.5 4.5 0 0 1-1.935-.424 1.25 1.25 0 0 1-.764.258h-1.71a1.255 1.255 0 0 1-1.256-1.255V7.687a2.4 2.4 0 0 1-.428.625c.253.23.412.561.412.93v7.553a1.255 1.255 0 0 1-1.256 1.255h-1.843a1.25 1.25 0 0 1-.894-.373c-.228.23-.544.373-.894.373H51.32a1.255 1.255 0 0 1-1.256-1.255v-1.251l-.061.117a4.7 4.7 0 0 1-1.782 1.884 4.77 4.77 0 0 1-2.485.67 5.6 5.6 0 0 1-1.485-.188l.009 2.764a1.255 1.255 0 0 1-1.255 1.259h-1.729a1.255 1.255 0 0 1-1.255-1.255v-3.537a1.255 1.255 0 0 1-1.167.793h-1.679a1.25 1.25 0 0 1-.77-.263 4.5 4.5 0 0 1-1.945.429c-.885 0-1.724-.21-2.495-.632l-.017-.01a5 5 0 0 1-1.081-.836 1.255 1.255 0 0 1-1.254 1.312h-1.81a1.255 1.255 0 0 1-1.228-.99l-.782-3.625-2.044 3.939a1.25 1.25 0 0 1-1.115.676h-.098a1.25 1.25 0 0 1-1.116-.68l-2.061-3.994zM35.92 16.63l.207-.114.223-.15q.493-.356.735-.785l.061-.118.033 1.332h1.678V9.242h-1.694l-.033 1.267q-.133-.329-.526-.658l-.032-.028a3.2 3.2 0 0 0-.668-.428l-.27-.12a3.3 3.3 0 0 0-1.235-.23q-1.136-.001-1.974.493a3.36 3.36 0 0 0-1.3 1.382q-.445.89-.444 2.074 0 1.2.51 2.107a3.8 3.8 0 0 0 1.382 1.381 3.9 3.9 0 0 0 1.893.477q.795 0 1.455-.33zm-2.789-5.38q-.576.675-.575 1.762 0 1.102.559 1.794.576.675 1.645.675a2.25 2.25 0 0 0 .934-.19 2.2 2.2 0 0 0 .468-.29l.178-.161a2.2 2.2 0 0 0 .397-.561q.244-.5.244-1.15v-.115q0-.708-.296-1.267l-.043-.077a2.2 2.2 0 0 0-.633-.709l-.13-.086-.047-.028a2.1 2.1 0 0 0-1.073-.285q-1.052 0-1.629.692zm2.316 2.706c.163-.17.28-.407.28-.83v-.114c0-.292-.06-.508-.15-.68a.96.96 0 0 0-.353-.389.85.85 0 0 0-.464-.127c-.4 0-.56.114-.664.239l-.01.012c-.148.174-.275.45-.275.945 0 .506.122.801.27.99.097.11.266.224.68.224.303 0 .504-.09.687-.269zm7.545 1.705a2.6 2.6 0 0 0 .331.423q.319.33.755.548l.173.074q.65.255 1.49.255 1.02 0 1.844-.493a3.45 3.45 0 0 0 1.316-1.4q.493-.904.493-2.089 0-1.909-.988-2.913-.988-1.02-2.584-1.02-.898 0-1.575.347a3 3 0 0 0-.415.262l-.199.166a3.4 3.4 0 0 0-.64.82V9.242h-1.712v11.553h1.729l-.017-5.134zm.53-1.138q.206.29.48.5l.155.11.053.034q.51.296 1.119.297 1.07 0 1.645-.675.577-.69.576-1.762 0-1.119-.576-1.777-.558-.675-1.645-.675-.435 0-.835.16a2 2 0 0 0-.284.136 2 2 0 0 0-.363.254 2.2 2.2 0 0 0-.46.569l-.082.162a2.6 2.6 0 0 0-.213 1.072v.115q0 .707.296 1.267l.135.211zm.964-.818a1.1 1.1 0 0 0 .367.385.94.94 0 0 0 .476.118c.423 0 .59-.117.687-.23.159-.194.28-.478.28-.95 0-.53-.133-.8-.266-.952l-.021-.025c-.078-.094-.231-.221-.68-.221a1 1 0 0 0-.503.135l-.012.007a.86.86 0 0 0-.335.343c-.073.133-.132.324-.132.614v.115a1.4 1.4 0 0 0 .14.66zm15.7-6.222q.347-.346.346-.856a1.05 1.05 0 0 0-.345-.79 1.18 1.18 0 0 0-.84-.329q-.51 0-.855.33a1.05 1.05 0 0 0-.346.79q0 .51.346.855.345.346.856.346.51 0 .839-.346zm4.337 9.314.033-1.332q.191.403.59.747l.098.081a4 4 0 0 0 .316.224l.223.122a3.2 3.2 0 0 0 1.44.322 3.8 3.8 0 0 0 1.875-.477 3.5 3.5 0 0 0 1.382-1.366q.527-.89.526-2.09 0-1.184-.444-2.073a3.24 3.24 0 0 0-1.283-1.399q-.823-.51-1.942-.51a3.5 3.5 0 0 0-1.527.344l-.086.043-.165.09a3 3 0 0 0-.33.214q-.432.315-.656.707a2 2 0 0 0-.099.198l.082-1.283V4.701h-1.744v12.095zm.473-2.509a2.5 2.5 0 0 0 .566.7q.117.098.245.18l.144.08a2.1 2.1 0 0 0 .975.232q1.07 0 1.645-.675.576-.69.576-1.778 0-1.102-.576-1.777-.56-.691-1.645-.692a2.2 2.2 0 0 0-1.015.235q-.22.113-.415.282l-.15.142a2.1 2.1 0 0 0-.42.594q-.223.479-.223 1.1v.115q0 .705.293 1.26zm2.616-.293c.157-.191.28-.479.28-.967 0-.51-.13-.79-.276-.961l-.021-.026c-.082-.1-.232-.225-.67-.225a.87.87 0 0 0-.681.279l-.012.011c-.154.155-.274.38-.274.807v.115c0 .285.057.499.144.669a1.1 1.1 0 0 0 .367.405c.137.082.28.123.455.123.423 0 .59-.118.686-.23zm8.266-3.013q.345-.13.724-.14l.069-.002q.493 0 .642.099l.247-1.794q-.196-.099-.717-.099a2.3 2.3 0 0 0-.545.063 2 2 0 0 0-.411.148 2.2 2.2 0 0 0-.4.249 2.5 2.5 0 0 0-.485.499 2.7 2.7 0 0 0-.32.581l-.05.137v-1.48h-1.778v7.553h1.777v-3.884q0-.546.159-.943a1.5 1.5 0 0 1 .466-.636 2.5 2.5 0 0 1 .399-.253 2 2 0 0 1 .224-.099zm9.784 2.656.05-.922q0-1.743-.856-2.698-.838-.97-2.584-.97-1.119-.001-2.007.493a3.46 3.46 0 0 0-1.4 1.382q-.493.906-.493 2.106 0 1.07.428 1.975.428.89 1.332 1.432.906.526 2.255.526.973 0 1.668-.185l.044-.012.135-.04q.613-.184.984-.421l-.542-1.267q-.3.162-.642.274l-.297.087q-.51.131-1.3.131-.954 0-1.497-.444a1.6 1.6 0 0 1-.192-.193q-.366-.44-.512-1.234l-.004-.021zm-5.427-1.256-.003.022h3.752v-.138q-.011-.727-.288-1.118a1 1 0 0 0-.156-.176q-.46-.428-1.316-.428-.986 0-1.494.604-.379.45-.494 1.234zm-27.053 2.77V4.7h-1.86v12.095h5.333V15.15zm7.103-5.908v7.553h-1.843V9.242h1.843z'/%3E %3Cpath fill='%23fff' d='m19.63 11.151-.757-1.71-.345 1.71-1.12 5.644h-1.827L18.083 4.7h.197l3.325 6.533.988 2.19.988-2.19L26.839 4.7h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.93 5.644h-.098l-2.913-5.644zm14.836 5.81q-1.02 0-1.893-.478a3.8 3.8 0 0 1-1.381-1.382q-.51-.906-.51-2.106 0-1.185.444-2.074a3.36 3.36 0 0 1 1.3-1.382q.839-.494 1.974-.494a3.3 3.3 0 0 1 1.234.231 3.3 3.3 0 0 1 .97.575q.396.33.527.659l.033-1.267h1.694v7.553H37.18l-.033-1.332q-.279.593-1.02 1.053a3.17 3.17 0 0 1-1.662.444zm.296-1.482q.938 0 1.58-.642.642-.66.642-1.711v-.115q0-.708-.296-1.267a2.2 2.2 0 0 0-.807-.872 2.1 2.1 0 0 0-1.119-.313q-1.053 0-1.629.692-.575.675-.575 1.76 0 1.103.559 1.795.577.675 1.645.675zm6.521-6.237h1.711v1.4q.906-1.597 2.83-1.597 1.596 0 2.584 1.02.988 1.005.988 2.914 0 1.185-.493 2.09a3.46 3.46 0 0 1-1.316 1.399 3.5 3.5 0 0 1-1.844.493q-.954 0-1.662-.329a2.67 2.67 0 0 1-1.086-.97l.017 5.134h-1.728zm4.048 6.22q1.07 0 1.645-.674.577-.69.576-1.762 0-1.119-.576-1.777-.558-.675-1.645-.675-.592 0-1.12.296-.51.28-.822.823-.296.527-.296 1.234v.115q0 .708.296 1.267.313.543.823.855.51.296 1.119.297z'/%3E %3Cpath fill='%23e1e3e9' d='M51.325 4.7h1.86v10.45h3.473v1.646h-5.333zm7.12 4.542h1.843v7.553h-1.843zm.905-1.415a1.16 1.16 0 0 1-.856-.346 1.17 1.17 0 0 1-.346-.856 1.05 1.05 0 0 1 .346-.79q.346-.329.856-.329.494 0 .839.33a1.05 1.05 0 0 1 .345.79 1.16 1.16 0 0 1-.345.855q-.33.346-.84.346zm7.875 9.133a3.17 3.17 0 0 1-1.662-.444q-.723-.46-1.004-1.053l-.033 1.332h-1.71V4.701h1.743v4.657l-.082 1.283q.279-.658 1.086-1.119a3.5 3.5 0 0 1 1.778-.477q1.119 0 1.942.51a3.24 3.24 0 0 1 1.283 1.4q.445.888.444 2.072 0 1.201-.526 2.09a3.5 3.5 0 0 1-1.382 1.366 3.8 3.8 0 0 1-1.876.477zm-.296-1.481q1.069 0 1.645-.675.577-.69.577-1.778 0-1.102-.577-1.776-.56-.691-1.645-.692a2.12 2.12 0 0 0-1.58.659q-.642.641-.642 1.694v.115q0 .71.296 1.267a2.4 2.4 0 0 0 .807.872 2.1 2.1 0 0 0 1.119.313zm5.927-6.237h1.777v1.481q.263-.757.856-1.217a2.14 2.14 0 0 1 1.349-.46q.527 0 .724.098l-.247 1.794q-.149-.099-.642-.099-.774 0-1.416.494-.626.493-.626 1.58v3.883h-1.777V9.242zm9.534 7.718q-1.35 0-2.255-.526-.904-.543-1.332-1.432a4.6 4.6 0 0 1-.428-1.975q0-1.2.493-2.106a3.46 3.46 0 0 1 1.4-1.382q.889-.495 2.007-.494 1.744 0 2.584.97.855.956.856 2.7 0 .444-.05.92h-5.43q.18 1.005.708 1.45.542.443 1.497.443.79 0 1.3-.131a4 4 0 0 0 .938-.362l.542 1.267q-.411.263-1.119.46-.708.198-1.711.197zm1.596-4.558q.016-1.02-.444-1.432-.46-.428-1.316-.428-1.728 0-1.991 1.86z'/%3E %3Cpath d='M5.074 15.948a.484.657 0 0 0-.486.659v1.84a.484.657 0 0 0 .486.659h4.101a.484.657 0 0 0 .486-.659v-1.84a.484.657 0 0 0-.486-.659zm3.56 1.16H5.617v.838h3.017z' style='fill:%23fff;fill-rule:evenodd;stroke-width:1.03600001'/%3E %3Cg style='stroke-width:1.12603545'%3E %3Cpath d='M-9.408-1.416c-3.833-.025-7.056 2.912-7.08 6.615-.02 3.08 1.653 4.832 3.107 6.268.903.892 1.721 1.74 2.32 2.902l-.525-.004c-.543-.003-.992.304-1.24.639a1.87 1.87 0 0 0-.362 1.121l-.011 1.877c-.003.402.104.787.347 1.125.244.338.688.653 1.23.656l4.142.028c.542.003.99-.306 1.238-.641a1.87 1.87 0 0 0 .363-1.121l.012-1.875a1.87 1.87 0 0 0-.348-1.127c-.243-.338-.688-.653-1.23-.656l-.518-.004c.597-1.145 1.425-1.983 2.348-2.87 1.473-1.414 3.18-3.149 3.2-6.226-.016-3.59-2.923-6.684-6.993-6.707m-.006 1.1v.002c3.274.02 5.92 2.532 5.9 5.6-.017 2.706-1.39 4.026-2.863 5.44-1.034.994-2.118 2.033-2.814 3.633-.018.041-.052.055-.075.065q-.013.004-.02.01a.34.34 0 0 1-.226.084.34.34 0 0 1-.224-.086l-.092-.077c-.699-1.615-1.768-2.669-2.781-3.67-1.454-1.435-2.797-2.762-2.78-5.478.02-3.067 2.7-5.545 5.975-5.523m-.02 2.826c-1.62-.01-2.944 1.315-2.955 2.96-.01 1.646 1.295 2.988 2.916 2.999h.002c1.621.01 2.943-1.316 2.953-2.961.011-1.646-1.294-2.988-2.916-2.998m-.005 1.1c1.017.006 1.829.83 1.822 1.89s-.83 1.874-1.848 1.867c-1.018-.006-1.829-.83-1.822-1.89s.83-1.874 1.848-1.868m-2.155 11.857 4.14.025c.271.002.49.305.487.676l-.013 1.875c-.003.37-.224.67-.495.668l-4.14-.025c-.27-.002-.487-.306-.485-.676l.012-1.875c.003-.37.224-.67.494-.668' style='color:%23000;font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:%23000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:evenodd;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:%23000;solid-opacity:1;vector-effect:none;fill:%23000;fill-opacity:.4;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto' transform='translate(15.553 2.85)scale(.88807)'/%3E %3Cpath d='M-9.415-.316C-12.69-.338-15.37 2.14-15.39 5.207c-.017 2.716 1.326 4.041 2.78 5.477 1.013 1 2.081 2.055 2.78 3.67l.092.076a.34.34 0 0 0 .225.086.34.34 0 0 0 .227-.083l.019-.01c.022-.009.057-.024.074-.064.697-1.6 1.78-2.64 2.814-3.634 1.473-1.414 2.847-2.733 2.864-5.44.02-3.067-2.627-5.58-5.901-5.601m-.057 8.784c1.621.011 2.944-1.315 2.955-2.96.01-1.646-1.295-2.988-2.916-2.999-1.622-.01-2.945 1.315-2.955 2.96s1.295 2.989 2.916 3' style='clip-rule:evenodd;fill:%23e1e3e9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:.4' transform='translate(15.553 2.85)scale(.88807)'/%3E %3Cpath d='M-11.594 15.465c-.27-.002-.492.297-.494.668l-.012 1.876c-.003.371.214.673.485.675l4.14.027c.271.002.492-.298.495-.668l.012-1.877c.003-.37-.215-.672-.485-.674z' style='clip-rule:evenodd;fill:%23fff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:.4' transform='translate(15.553 2.85)scale(.88807)'/%3E %3C/g%3E %3C/svg%3E")}a.maplibregl-ctrl-logo.maplibregl-compact{width:14px}@media(forced-colors:active){a.maplibregl-ctrl-logo{background-color:transparent;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='88' height='23' fill='none'%3E %3Cpath fill='%23000' fill-opacity='.4' fill-rule='evenodd' d='M17.408 16.796h-1.827l2.501-12.095h.198l3.324 6.533.988 2.19.988-2.19 3.258-6.533h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.929 5.644h-.098l-2.914-5.644-.757-1.71-.345 1.71zm1.958-3.42-.726 3.663a1.255 1.255 0 0 1-1.232 1.011h-1.827a1.255 1.255 0 0 1-1.229-1.509l2.501-12.095a1.255 1.255 0 0 1 1.23-1.001h.197a1.25 1.25 0 0 1 1.12.685l3.19 6.273 3.125-6.263a1.25 1.25 0 0 1 1.123-.695h.181a1.255 1.255 0 0 1 1.227.991l1.443 6.71a5 5 0 0 1 .314-.787l.009-.016a4.6 4.6 0 0 1 1.777-1.887c.782-.46 1.668-.667 2.611-.667a4.6 4.6 0 0 1 1.7.32l.306.134c.21-.16.474-.256.759-.256h1.694a1.255 1.255 0 0 1 1.212.925 1.255 1.255 0 0 1 1.212-.925h1.711c.284 0 .545.094.755.252.613-.3 1.312-.45 2.075-.45 1.356 0 2.557.445 3.482 1.4q.47.48.763 1.064V4.701a1.255 1.255 0 0 1 1.255-1.255h1.86A1.255 1.255 0 0 1 54.44 4.7v9.194h2.217c.19 0 .37.043.532.118v-4.77c0-.356.147-.678.385-.906a2.42 2.42 0 0 1-.682-1.71c0-.665.267-1.253.735-1.7a2.45 2.45 0 0 1 1.722-.674 2.43 2.43 0 0 1 1.705.675q.318.302.504.683V4.7a1.255 1.255 0 0 1 1.255-1.255h1.744A1.255 1.255 0 0 1 65.812 4.7v3.335a4.8 4.8 0 0 1 1.526-.246c.938 0 1.817.214 2.59.69a4.47 4.47 0 0 1 1.67 1.743v-.98a1.255 1.255 0 0 1 1.256-1.256h1.777c.233 0 .451.064.639.174a3.4 3.4 0 0 1 1.567-.372c.346 0 .861.02 1.285.232a1.25 1.25 0 0 1 .689 1.004 4.7 4.7 0 0 1 .853-.588c.795-.44 1.675-.647 2.61-.647 1.385 0 2.65.39 3.525 1.396.836.938 1.168 2.173 1.168 3.528q-.001.515-.056 1.051a1.255 1.255 0 0 1-.947 1.09l.408.952a1.255 1.255 0 0 1-.477 1.552c-.418.268-.92.463-1.458.612-.613.171-1.304.244-2.049.244-1.06 0-2.043-.207-2.886-.698l-.015-.008c-.798-.48-1.419-1.135-1.818-1.963l-.004-.008a5.8 5.8 0 0 1-.548-2.512q0-.429.053-.843a1.3 1.3 0 0 1-.333-.086l-.166-.004c-.223 0-.426.062-.643.228-.03.024-.142.139-.142.59v3.883a1.255 1.255 0 0 1-1.256 1.256h-1.777a1.255 1.255 0 0 1-1.256-1.256V15.69l-.032.057a4.8 4.8 0 0 1-1.86 1.833 5.04 5.04 0 0 1-2.484.634 4.5 4.5 0 0 1-1.935-.424 1.25 1.25 0 0 1-.764.258h-1.71a1.255 1.255 0 0 1-1.256-1.255V7.687a2.4 2.4 0 0 1-.428.625c.253.23.412.561.412.93v7.553a1.255 1.255 0 0 1-1.256 1.255h-1.843a1.25 1.25 0 0 1-.894-.373c-.228.23-.544.373-.894.373H51.32a1.255 1.255 0 0 1-1.256-1.255v-1.251l-.061.117a4.7 4.7 0 0 1-1.782 1.884 4.77 4.77 0 0 1-2.485.67 5.6 5.6 0 0 1-1.485-.188l.009 2.764a1.255 1.255 0 0 1-1.255 1.259h-1.729a1.255 1.255 0 0 1-1.255-1.255v-3.537a1.255 1.255 0 0 1-1.167.793h-1.679a1.25 1.25 0 0 1-.77-.263 4.5 4.5 0 0 1-1.945.429c-.885 0-1.724-.21-2.495-.632l-.017-.01a5 5 0 0 1-1.081-.836 1.255 1.255 0 0 1-1.254 1.312h-1.81a1.255 1.255 0 0 1-1.228-.99l-.782-3.625-2.044 3.939a1.25 1.25 0 0 1-1.115.676h-.098a1.25 1.25 0 0 1-1.116-.68l-2.061-3.994zM35.92 16.63l.207-.114.223-.15q.493-.356.735-.785l.061-.118.033 1.332h1.678V9.242h-1.694l-.033 1.267q-.133-.329-.526-.658l-.032-.028a3.2 3.2 0 0 0-.668-.428l-.27-.12a3.3 3.3 0 0 0-1.235-.23q-1.136-.001-1.974.493a3.36 3.36 0 0 0-1.3 1.382q-.445.89-.444 2.074 0 1.2.51 2.107a3.8 3.8 0 0 0 1.382 1.381 3.9 3.9 0 0 0 1.893.477q.795 0 1.455-.33zm-2.789-5.38q-.576.675-.575 1.762 0 1.102.559 1.794.576.675 1.645.675a2.25 2.25 0 0 0 .934-.19 2.2 2.2 0 0 0 .468-.29l.178-.161a2.2 2.2 0 0 0 .397-.561q.244-.5.244-1.15v-.115q0-.708-.296-1.267l-.043-.077a2.2 2.2 0 0 0-.633-.709l-.13-.086-.047-.028a2.1 2.1 0 0 0-1.073-.285q-1.052 0-1.629.692zm2.316 2.706c.163-.17.28-.407.28-.83v-.114c0-.292-.06-.508-.15-.68a.96.96 0 0 0-.353-.389.85.85 0 0 0-.464-.127c-.4 0-.56.114-.664.239l-.01.012c-.148.174-.275.45-.275.945 0 .506.122.801.27.99.097.11.266.224.68.224.303 0 .504-.09.687-.269zm7.545 1.705a2.6 2.6 0 0 0 .331.423q.319.33.755.548l.173.074q.65.255 1.49.255 1.02 0 1.844-.493a3.45 3.45 0 0 0 1.316-1.4q.493-.904.493-2.089 0-1.909-.988-2.913-.988-1.02-2.584-1.02-.898 0-1.575.347a3 3 0 0 0-.415.262l-.199.166a3.4 3.4 0 0 0-.64.82V9.242h-1.712v11.553h1.729l-.017-5.134zm.53-1.138q.206.29.48.5l.155.11.053.034q.51.296 1.119.297 1.07 0 1.645-.675.577-.69.576-1.762 0-1.119-.576-1.777-.558-.675-1.645-.675-.435 0-.835.16a2 2 0 0 0-.284.136 2 2 0 0 0-.363.254 2.2 2.2 0 0 0-.46.569l-.082.162a2.6 2.6 0 0 0-.213 1.072v.115q0 .707.296 1.267l.135.211zm.964-.818a1.1 1.1 0 0 0 .367.385.94.94 0 0 0 .476.118c.423 0 .59-.117.687-.23.159-.194.28-.478.28-.95 0-.53-.133-.8-.266-.952l-.021-.025c-.078-.094-.231-.221-.68-.221a1 1 0 0 0-.503.135l-.012.007a.86.86 0 0 0-.335.343c-.073.133-.132.324-.132.614v.115a1.4 1.4 0 0 0 .14.66zm15.7-6.222q.347-.346.346-.856a1.05 1.05 0 0 0-.345-.79 1.18 1.18 0 0 0-.84-.329q-.51 0-.855.33a1.05 1.05 0 0 0-.346.79q0 .51.346.855.345.346.856.346.51 0 .839-.346zm4.337 9.314.033-1.332q.191.403.59.747l.098.081a4 4 0 0 0 .316.224l.223.122a3.2 3.2 0 0 0 1.44.322 3.8 3.8 0 0 0 1.875-.477 3.5 3.5 0 0 0 1.382-1.366q.527-.89.526-2.09 0-1.184-.444-2.073a3.24 3.24 0 0 0-1.283-1.399q-.823-.51-1.942-.51a3.5 3.5 0 0 0-1.527.344l-.086.043-.165.09a3 3 0 0 0-.33.214q-.432.315-.656.707a2 2 0 0 0-.099.198l.082-1.283V4.701h-1.744v12.095zm.473-2.509a2.5 2.5 0 0 0 .566.7q.117.098.245.18l.144.08a2.1 2.1 0 0 0 .975.232q1.07 0 1.645-.675.576-.69.576-1.778 0-1.102-.576-1.777-.56-.691-1.645-.692a2.2 2.2 0 0 0-1.015.235q-.22.113-.415.282l-.15.142a2.1 2.1 0 0 0-.42.594q-.223.479-.223 1.1v.115q0 .705.293 1.26zm2.616-.293c.157-.191.28-.479.28-.967 0-.51-.13-.79-.276-.961l-.021-.026c-.082-.1-.232-.225-.67-.225a.87.87 0 0 0-.681.279l-.012.011c-.154.155-.274.38-.274.807v.115c0 .285.057.499.144.669a1.1 1.1 0 0 0 .367.405c.137.082.28.123.455.123.423 0 .59-.118.686-.23zm8.266-3.013q.345-.13.724-.14l.069-.002q.493 0 .642.099l.247-1.794q-.196-.099-.717-.099a2.3 2.3 0 0 0-.545.063 2 2 0 0 0-.411.148 2.2 2.2 0 0 0-.4.249 2.5 2.5 0 0 0-.485.499 2.7 2.7 0 0 0-.32.581l-.05.137v-1.48h-1.778v7.553h1.777v-3.884q0-.546.159-.943a1.5 1.5 0 0 1 .466-.636 2.5 2.5 0 0 1 .399-.253 2 2 0 0 1 .224-.099zm9.784 2.656.05-.922q0-1.743-.856-2.698-.838-.97-2.584-.97-1.119-.001-2.007.493a3.46 3.46 0 0 0-1.4 1.382q-.493.906-.493 2.106 0 1.07.428 1.975.428.89 1.332 1.432.906.526 2.255.526.973 0 1.668-.185l.044-.012.135-.04q.613-.184.984-.421l-.542-1.267q-.3.162-.642.274l-.297.087q-.51.131-1.3.131-.954 0-1.497-.444a1.6 1.6 0 0 1-.192-.193q-.366-.44-.512-1.234l-.004-.021zm-5.427-1.256-.003.022h3.752v-.138q-.011-.727-.288-1.118a1 1 0 0 0-.156-.176q-.46-.428-1.316-.428-.986 0-1.494.604-.379.45-.494 1.234zm-27.053 2.77V4.7h-1.86v12.095h5.333V15.15zm7.103-5.908v7.553h-1.843V9.242h1.843z'/%3E %3Cpath fill='%23fff' d='m19.63 11.151-.757-1.71-.345 1.71-1.12 5.644h-1.827L18.083 4.7h.197l3.325 6.533.988 2.19.988-2.19L26.839 4.7h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.93 5.644h-.098l-2.913-5.644zm14.836 5.81q-1.02 0-1.893-.478a3.8 3.8 0 0 1-1.381-1.382q-.51-.906-.51-2.106 0-1.185.444-2.074a3.36 3.36 0 0 1 1.3-1.382q.839-.494 1.974-.494a3.3 3.3 0 0 1 1.234.231 3.3 3.3 0 0 1 .97.575q.396.33.527.659l.033-1.267h1.694v7.553H37.18l-.033-1.332q-.279.593-1.02 1.053a3.17 3.17 0 0 1-1.662.444zm.296-1.482q.938 0 1.58-.642.642-.66.642-1.711v-.115q0-.708-.296-1.267a2.2 2.2 0 0 0-.807-.872 2.1 2.1 0 0 0-1.119-.313q-1.053 0-1.629.692-.575.675-.575 1.76 0 1.103.559 1.795.577.675 1.645.675zm6.521-6.237h1.711v1.4q.906-1.597 2.83-1.597 1.596 0 2.584 1.02.988 1.005.988 2.914 0 1.185-.493 2.09a3.46 3.46 0 0 1-1.316 1.399 3.5 3.5 0 0 1-1.844.493q-.954 0-1.662-.329a2.67 2.67 0 0 1-1.086-.97l.017 5.134h-1.728zm4.048 6.22q1.07 0 1.645-.674.577-.69.576-1.762 0-1.119-.576-1.777-.558-.675-1.645-.675-.592 0-1.12.296-.51.28-.822.823-.296.527-.296 1.234v.115q0 .708.296 1.267.313.543.823.855.51.296 1.119.297z'/%3E %3Cpath fill='%23e1e3e9' d='M51.325 4.7h1.86v10.45h3.473v1.646h-5.333zm7.12 4.542h1.843v7.553h-1.843zm.905-1.415a1.16 1.16 0 0 1-.856-.346 1.17 1.17 0 0 1-.346-.856 1.05 1.05 0 0 1 .346-.79q.346-.329.856-.329.494 0 .839.33a1.05 1.05 0 0 1 .345.79 1.16 1.16 0 0 1-.345.855q-.33.346-.84.346zm7.875 9.133a3.17 3.17 0 0 1-1.662-.444q-.723-.46-1.004-1.053l-.033 1.332h-1.71V4.701h1.743v4.657l-.082 1.283q.279-.658 1.086-1.119a3.5 3.5 0 0 1 1.778-.477q1.119 0 1.942.51a3.24 3.24 0 0 1 1.283 1.4q.445.888.444 2.072 0 1.201-.526 2.09a3.5 3.5 0 0 1-1.382 1.366 3.8 3.8 0 0 1-1.876.477zm-.296-1.481q1.069 0 1.645-.675.577-.69.577-1.778 0-1.102-.577-1.776-.56-.691-1.645-.692a2.12 2.12 0 0 0-1.58.659q-.642.641-.642 1.694v.115q0 .71.296 1.267a2.4 2.4 0 0 0 .807.872 2.1 2.1 0 0 0 1.119.313zm5.927-6.237h1.777v1.481q.263-.757.856-1.217a2.14 2.14 0 0 1 1.349-.46q.527 0 .724.098l-.247 1.794q-.149-.099-.642-.099-.774 0-1.416.494-.626.493-.626 1.58v3.883h-1.777V9.242zm9.534 7.718q-1.35 0-2.255-.526-.904-.543-1.332-1.432a4.6 4.6 0 0 1-.428-1.975q0-1.2.493-2.106a3.46 3.46 0 0 1 1.4-1.382q.889-.495 2.007-.494 1.744 0 2.584.97.855.956.856 2.7 0 .444-.05.92h-5.43q.18 1.005.708 1.45.542.443 1.497.443.79 0 1.3-.131a4 4 0 0 0 .938-.362l.542 1.267q-.411.263-1.119.46-.708.198-1.711.197zm1.596-4.558q.016-1.02-.444-1.432-.46-.428-1.316-.428-1.728 0-1.991 1.86z'/%3E %3Cpath d='M5.074 15.948a.484.657 0 0 0-.486.659v1.84a.484.657 0 0 0 .486.659h4.101a.484.657 0 0 0 .486-.659v-1.84a.484.657 0 0 0-.486-.659zm3.56 1.16H5.617v.838h3.017z' style='fill:%23fff;fill-rule:evenodd;stroke-width:1.03600001'/%3E %3Cg style='stroke-width:1.12603545'%3E %3Cpath d='M-9.408-1.416c-3.833-.025-7.056 2.912-7.08 6.615-.02 3.08 1.653 4.832 3.107 6.268.903.892 1.721 1.74 2.32 2.902l-.525-.004c-.543-.003-.992.304-1.24.639a1.87 1.87 0 0 0-.362 1.121l-.011 1.877c-.003.402.104.787.347 1.125.244.338.688.653 1.23.656l4.142.028c.542.003.99-.306 1.238-.641a1.87 1.87 0 0 0 .363-1.121l.012-1.875a1.87 1.87 0 0 0-.348-1.127c-.243-.338-.688-.653-1.23-.656l-.518-.004c.597-1.145 1.425-1.983 2.348-2.87 1.473-1.414 3.18-3.149 3.2-6.226-.016-3.59-2.923-6.684-6.993-6.707m-.006 1.1v.002c3.274.02 5.92 2.532 5.9 5.6-.017 2.706-1.39 4.026-2.863 5.44-1.034.994-2.118 2.033-2.814 3.633-.018.041-.052.055-.075.065q-.013.004-.02.01a.34.34 0 0 1-.226.084.34.34 0 0 1-.224-.086l-.092-.077c-.699-1.615-1.768-2.669-2.781-3.67-1.454-1.435-2.797-2.762-2.78-5.478.02-3.067 2.7-5.545 5.975-5.523m-.02 2.826c-1.62-.01-2.944 1.315-2.955 2.96-.01 1.646 1.295 2.988 2.916 2.999h.002c1.621.01 2.943-1.316 2.953-2.961.011-1.646-1.294-2.988-2.916-2.998m-.005 1.1c1.017.006 1.829.83 1.822 1.89s-.83 1.874-1.848 1.867c-1.018-.006-1.829-.83-1.822-1.89s.83-1.874 1.848-1.868m-2.155 11.857 4.14.025c.271.002.49.305.487.676l-.013 1.875c-.003.37-.224.67-.495.668l-4.14-.025c-.27-.002-.487-.306-.485-.676l.012-1.875c.003-.37.224-.67.494-.668' style='color:%23000;font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:%23000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:evenodd;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:%23000;solid-opacity:1;vector-effect:none;fill:%23000;fill-opacity:.4;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto' transform='translate(15.553 2.85)scale(.88807)'/%3E %3Cpath d='M-9.415-.316C-12.69-.338-15.37 2.14-15.39 5.207c-.017 2.716 1.326 4.041 2.78 5.477 1.013 1 2.081 2.055 2.78 3.67l.092.076a.34.34 0 0 0 .225.086.34.34 0 0 0 .227-.083l.019-.01c.022-.009.057-.024.074-.064.697-1.6 1.78-2.64 2.814-3.634 1.473-1.414 2.847-2.733 2.864-5.44.02-3.067-2.627-5.58-5.901-5.601m-.057 8.784c1.621.011 2.944-1.315 2.955-2.96.01-1.646-1.295-2.988-2.916-2.999-1.622-.01-2.945 1.315-2.955 2.96s1.295 2.989 2.916 3' style='clip-rule:evenodd;fill:%23e1e3e9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:.4' transform='translate(15.553 2.85)scale(.88807)'/%3E %3Cpath d='M-11.594 15.465c-.27-.002-.492.297-.494.668l-.012 1.876c-.003.371.214.673.485.675l4.14.027c.271.002.492-.298.495-.668l.012-1.877c.003-.37-.215-.672-.485-.674z' style='clip-rule:evenodd;fill:%23fff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:.4' transform='translate(15.553 2.85)scale(.88807)'/%3E %3C/g%3E %3C/svg%3E")}}@media(forced-colors:active) and (prefers-color-scheme:light){a.maplibregl-ctrl-logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='88' height='23' fill='none'%3E %3Cpath fill='%23000' fill-opacity='.4' fill-rule='evenodd' d='M17.408 16.796h-1.827l2.501-12.095h.198l3.324 6.533.988 2.19.988-2.19 3.258-6.533h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.929 5.644h-.098l-2.914-5.644-.757-1.71-.345 1.71zm1.958-3.42-.726 3.663a1.255 1.255 0 0 1-1.232 1.011h-1.827a1.255 1.255 0 0 1-1.229-1.509l2.501-12.095a1.255 1.255 0 0 1 1.23-1.001h.197a1.25 1.25 0 0 1 1.12.685l3.19 6.273 3.125-6.263a1.25 1.25 0 0 1 1.123-.695h.181a1.255 1.255 0 0 1 1.227.991l1.443 6.71a5 5 0 0 1 .314-.787l.009-.016a4.6 4.6 0 0 1 1.777-1.887c.782-.46 1.668-.667 2.611-.667a4.6 4.6 0 0 1 1.7.32l.306.134c.21-.16.474-.256.759-.256h1.694a1.255 1.255 0 0 1 1.212.925 1.255 1.255 0 0 1 1.212-.925h1.711c.284 0 .545.094.755.252.613-.3 1.312-.45 2.075-.45 1.356 0 2.557.445 3.482 1.4q.47.48.763 1.064V4.701a1.255 1.255 0 0 1 1.255-1.255h1.86A1.255 1.255 0 0 1 54.44 4.7v9.194h2.217c.19 0 .37.043.532.118v-4.77c0-.356.147-.678.385-.906a2.42 2.42 0 0 1-.682-1.71c0-.665.267-1.253.735-1.7a2.45 2.45 0 0 1 1.722-.674 2.43 2.43 0 0 1 1.705.675q.318.302.504.683V4.7a1.255 1.255 0 0 1 1.255-1.255h1.744A1.255 1.255 0 0 1 65.812 4.7v3.335a4.8 4.8 0 0 1 1.526-.246c.938 0 1.817.214 2.59.69a4.47 4.47 0 0 1 1.67 1.743v-.98a1.255 1.255 0 0 1 1.256-1.256h1.777c.233 0 .451.064.639.174a3.4 3.4 0 0 1 1.567-.372c.346 0 .861.02 1.285.232a1.25 1.25 0 0 1 .689 1.004 4.7 4.7 0 0 1 .853-.588c.795-.44 1.675-.647 2.61-.647 1.385 0 2.65.39 3.525 1.396.836.938 1.168 2.173 1.168 3.528q-.001.515-.056 1.051a1.255 1.255 0 0 1-.947 1.09l.408.952a1.255 1.255 0 0 1-.477 1.552c-.418.268-.92.463-1.458.612-.613.171-1.304.244-2.049.244-1.06 0-2.043-.207-2.886-.698l-.015-.008c-.798-.48-1.419-1.135-1.818-1.963l-.004-.008a5.8 5.8 0 0 1-.548-2.512q0-.429.053-.843a1.3 1.3 0 0 1-.333-.086l-.166-.004c-.223 0-.426.062-.643.228-.03.024-.142.139-.142.59v3.883a1.255 1.255 0 0 1-1.256 1.256h-1.777a1.255 1.255 0 0 1-1.256-1.256V15.69l-.032.057a4.8 4.8 0 0 1-1.86 1.833 5.04 5.04 0 0 1-2.484.634 4.5 4.5 0 0 1-1.935-.424 1.25 1.25 0 0 1-.764.258h-1.71a1.255 1.255 0 0 1-1.256-1.255V7.687a2.4 2.4 0 0 1-.428.625c.253.23.412.561.412.93v7.553a1.255 1.255 0 0 1-1.256 1.255h-1.843a1.25 1.25 0 0 1-.894-.373c-.228.23-.544.373-.894.373H51.32a1.255 1.255 0 0 1-1.256-1.255v-1.251l-.061.117a4.7 4.7 0 0 1-1.782 1.884 4.77 4.77 0 0 1-2.485.67 5.6 5.6 0 0 1-1.485-.188l.009 2.764a1.255 1.255 0 0 1-1.255 1.259h-1.729a1.255 1.255 0 0 1-1.255-1.255v-3.537a1.255 1.255 0 0 1-1.167.793h-1.679a1.25 1.25 0 0 1-.77-.263 4.5 4.5 0 0 1-1.945.429c-.885 0-1.724-.21-2.495-.632l-.017-.01a5 5 0 0 1-1.081-.836 1.255 1.255 0 0 1-1.254 1.312h-1.81a1.255 1.255 0 0 1-1.228-.99l-.782-3.625-2.044 3.939a1.25 1.25 0 0 1-1.115.676h-.098a1.25 1.25 0 0 1-1.116-.68l-2.061-3.994zM35.92 16.63l.207-.114.223-.15q.493-.356.735-.785l.061-.118.033 1.332h1.678V9.242h-1.694l-.033 1.267q-.133-.329-.526-.658l-.032-.028a3.2 3.2 0 0 0-.668-.428l-.27-.12a3.3 3.3 0 0 0-1.235-.23q-1.136-.001-1.974.493a3.36 3.36 0 0 0-1.3 1.382q-.445.89-.444 2.074 0 1.2.51 2.107a3.8 3.8 0 0 0 1.382 1.381 3.9 3.9 0 0 0 1.893.477q.795 0 1.455-.33zm-2.789-5.38q-.576.675-.575 1.762 0 1.102.559 1.794.576.675 1.645.675a2.25 2.25 0 0 0 .934-.19 2.2 2.2 0 0 0 .468-.29l.178-.161a2.2 2.2 0 0 0 .397-.561q.244-.5.244-1.15v-.115q0-.708-.296-1.267l-.043-.077a2.2 2.2 0 0 0-.633-.709l-.13-.086-.047-.028a2.1 2.1 0 0 0-1.073-.285q-1.052 0-1.629.692zm2.316 2.706c.163-.17.28-.407.28-.83v-.114c0-.292-.06-.508-.15-.68a.96.96 0 0 0-.353-.389.85.85 0 0 0-.464-.127c-.4 0-.56.114-.664.239l-.01.012c-.148.174-.275.45-.275.945 0 .506.122.801.27.99.097.11.266.224.68.224.303 0 .504-.09.687-.269zm7.545 1.705a2.6 2.6 0 0 0 .331.423q.319.33.755.548l.173.074q.65.255 1.49.255 1.02 0 1.844-.493a3.45 3.45 0 0 0 1.316-1.4q.493-.904.493-2.089 0-1.909-.988-2.913-.988-1.02-2.584-1.02-.898 0-1.575.347a3 3 0 0 0-.415.262l-.199.166a3.4 3.4 0 0 0-.64.82V9.242h-1.712v11.553h1.729l-.017-5.134zm.53-1.138q.206.29.48.5l.155.11.053.034q.51.296 1.119.297 1.07 0 1.645-.675.577-.69.576-1.762 0-1.119-.576-1.777-.558-.675-1.645-.675-.435 0-.835.16a2 2 0 0 0-.284.136 2 2 0 0 0-.363.254 2.2 2.2 0 0 0-.46.569l-.082.162a2.6 2.6 0 0 0-.213 1.072v.115q0 .707.296 1.267l.135.211zm.964-.818a1.1 1.1 0 0 0 .367.385.94.94 0 0 0 .476.118c.423 0 .59-.117.687-.23.159-.194.28-.478.28-.95 0-.53-.133-.8-.266-.952l-.021-.025c-.078-.094-.231-.221-.68-.221a1 1 0 0 0-.503.135l-.012.007a.86.86 0 0 0-.335.343c-.073.133-.132.324-.132.614v.115a1.4 1.4 0 0 0 .14.66zm15.7-6.222q.347-.346.346-.856a1.05 1.05 0 0 0-.345-.79 1.18 1.18 0 0 0-.84-.329q-.51 0-.855.33a1.05 1.05 0 0 0-.346.79q0 .51.346.855.345.346.856.346.51 0 .839-.346zm4.337 9.314.033-1.332q.191.403.59.747l.098.081a4 4 0 0 0 .316.224l.223.122a3.2 3.2 0 0 0 1.44.322 3.8 3.8 0 0 0 1.875-.477 3.5 3.5 0 0 0 1.382-1.366q.527-.89.526-2.09 0-1.184-.444-2.073a3.24 3.24 0 0 0-1.283-1.399q-.823-.51-1.942-.51a3.5 3.5 0 0 0-1.527.344l-.086.043-.165.09a3 3 0 0 0-.33.214q-.432.315-.656.707a2 2 0 0 0-.099.198l.082-1.283V4.701h-1.744v12.095zm.473-2.509a2.5 2.5 0 0 0 .566.7q.117.098.245.18l.144.08a2.1 2.1 0 0 0 .975.232q1.07 0 1.645-.675.576-.69.576-1.778 0-1.102-.576-1.777-.56-.691-1.645-.692a2.2 2.2 0 0 0-1.015.235q-.22.113-.415.282l-.15.142a2.1 2.1 0 0 0-.42.594q-.223.479-.223 1.1v.115q0 .705.293 1.26zm2.616-.293c.157-.191.28-.479.28-.967 0-.51-.13-.79-.276-.961l-.021-.026c-.082-.1-.232-.225-.67-.225a.87.87 0 0 0-.681.279l-.012.011c-.154.155-.274.38-.274.807v.115c0 .285.057.499.144.669a1.1 1.1 0 0 0 .367.405c.137.082.28.123.455.123.423 0 .59-.118.686-.23zm8.266-3.013q.345-.13.724-.14l.069-.002q.493 0 .642.099l.247-1.794q-.196-.099-.717-.099a2.3 2.3 0 0 0-.545.063 2 2 0 0 0-.411.148 2.2 2.2 0 0 0-.4.249 2.5 2.5 0 0 0-.485.499 2.7 2.7 0 0 0-.32.581l-.05.137v-1.48h-1.778v7.553h1.777v-3.884q0-.546.159-.943a1.5 1.5 0 0 1 .466-.636 2.5 2.5 0 0 1 .399-.253 2 2 0 0 1 .224-.099zm9.784 2.656.05-.922q0-1.743-.856-2.698-.838-.97-2.584-.97-1.119-.001-2.007.493a3.46 3.46 0 0 0-1.4 1.382q-.493.906-.493 2.106 0 1.07.428 1.975.428.89 1.332 1.432.906.526 2.255.526.973 0 1.668-.185l.044-.012.135-.04q.613-.184.984-.421l-.542-1.267q-.3.162-.642.274l-.297.087q-.51.131-1.3.131-.954 0-1.497-.444a1.6 1.6 0 0 1-.192-.193q-.366-.44-.512-1.234l-.004-.021zm-5.427-1.256-.003.022h3.752v-.138q-.011-.727-.288-1.118a1 1 0 0 0-.156-.176q-.46-.428-1.316-.428-.986 0-1.494.604-.379.45-.494 1.234zm-27.053 2.77V4.7h-1.86v12.095h5.333V15.15zm7.103-5.908v7.553h-1.843V9.242h1.843z'/%3E %3Cpath fill='%23fff' d='m19.63 11.151-.757-1.71-.345 1.71-1.12 5.644h-1.827L18.083 4.7h.197l3.325 6.533.988 2.19.988-2.19L26.839 4.7h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.93 5.644h-.098l-2.913-5.644zm14.836 5.81q-1.02 0-1.893-.478a3.8 3.8 0 0 1-1.381-1.382q-.51-.906-.51-2.106 0-1.185.444-2.074a3.36 3.36 0 0 1 1.3-1.382q.839-.494 1.974-.494a3.3 3.3 0 0 1 1.234.231 3.3 3.3 0 0 1 .97.575q.396.33.527.659l.033-1.267h1.694v7.553H37.18l-.033-1.332q-.279.593-1.02 1.053a3.17 3.17 0 0 1-1.662.444zm.296-1.482q.938 0 1.58-.642.642-.66.642-1.711v-.115q0-.708-.296-1.267a2.2 2.2 0 0 0-.807-.872 2.1 2.1 0 0 0-1.119-.313q-1.053 0-1.629.692-.575.675-.575 1.76 0 1.103.559 1.795.577.675 1.645.675zm6.521-6.237h1.711v1.4q.906-1.597 2.83-1.597 1.596 0 2.584 1.02.988 1.005.988 2.914 0 1.185-.493 2.09a3.46 3.46 0 0 1-1.316 1.399 3.5 3.5 0 0 1-1.844.493q-.954 0-1.662-.329a2.67 2.67 0 0 1-1.086-.97l.017 5.134h-1.728zm4.048 6.22q1.07 0 1.645-.674.577-.69.576-1.762 0-1.119-.576-1.777-.558-.675-1.645-.675-.592 0-1.12.296-.51.28-.822.823-.296.527-.296 1.234v.115q0 .708.296 1.267.313.543.823.855.51.296 1.119.297z'/%3E %3Cpath fill='%23e1e3e9' d='M51.325 4.7h1.86v10.45h3.473v1.646h-5.333zm7.12 4.542h1.843v7.553h-1.843zm.905-1.415a1.16 1.16 0 0 1-.856-.346 1.17 1.17 0 0 1-.346-.856 1.05 1.05 0 0 1 .346-.79q.346-.329.856-.329.494 0 .839.33a1.05 1.05 0 0 1 .345.79 1.16 1.16 0 0 1-.345.855q-.33.346-.84.346zm7.875 9.133a3.17 3.17 0 0 1-1.662-.444q-.723-.46-1.004-1.053l-.033 1.332h-1.71V4.701h1.743v4.657l-.082 1.283q.279-.658 1.086-1.119a3.5 3.5 0 0 1 1.778-.477q1.119 0 1.942.51a3.24 3.24 0 0 1 1.283 1.4q.445.888.444 2.072 0 1.201-.526 2.09a3.5 3.5 0 0 1-1.382 1.366 3.8 3.8 0 0 1-1.876.477zm-.296-1.481q1.069 0 1.645-.675.577-.69.577-1.778 0-1.102-.577-1.776-.56-.691-1.645-.692a2.12 2.12 0 0 0-1.58.659q-.642.641-.642 1.694v.115q0 .71.296 1.267a2.4 2.4 0 0 0 .807.872 2.1 2.1 0 0 0 1.119.313zm5.927-6.237h1.777v1.481q.263-.757.856-1.217a2.14 2.14 0 0 1 1.349-.46q.527 0 .724.098l-.247 1.794q-.149-.099-.642-.099-.774 0-1.416.494-.626.493-.626 1.58v3.883h-1.777V9.242zm9.534 7.718q-1.35 0-2.255-.526-.904-.543-1.332-1.432a4.6 4.6 0 0 1-.428-1.975q0-1.2.493-2.106a3.46 3.46 0 0 1 1.4-1.382q.889-.495 2.007-.494 1.744 0 2.584.97.855.956.856 2.7 0 .444-.05.92h-5.43q.18 1.005.708 1.45.542.443 1.497.443.79 0 1.3-.131a4 4 0 0 0 .938-.362l.542 1.267q-.411.263-1.119.46-.708.198-1.711.197zm1.596-4.558q.016-1.02-.444-1.432-.46-.428-1.316-.428-1.728 0-1.991 1.86z'/%3E %3Cpath d='M5.074 15.948a.484.657 0 0 0-.486.659v1.84a.484.657 0 0 0 .486.659h4.101a.484.657 0 0 0 .486-.659v-1.84a.484.657 0 0 0-.486-.659zm3.56 1.16H5.617v.838h3.017z' style='fill:%23fff;fill-rule:evenodd;stroke-width:1.03600001'/%3E %3Cg style='stroke-width:1.12603545'%3E %3Cpath d='M-9.408-1.416c-3.833-.025-7.056 2.912-7.08 6.615-.02 3.08 1.653 4.832 3.107 6.268.903.892 1.721 1.74 2.32 2.902l-.525-.004c-.543-.003-.992.304-1.24.639a1.87 1.87 0 0 0-.362 1.121l-.011 1.877c-.003.402.104.787.347 1.125.244.338.688.653 1.23.656l4.142.028c.542.003.99-.306 1.238-.641a1.87 1.87 0 0 0 .363-1.121l.012-1.875a1.87 1.87 0 0 0-.348-1.127c-.243-.338-.688-.653-1.23-.656l-.518-.004c.597-1.145 1.425-1.983 2.348-2.87 1.473-1.414 3.18-3.149 3.2-6.226-.016-3.59-2.923-6.684-6.993-6.707m-.006 1.1v.002c3.274.02 5.92 2.532 5.9 5.6-.017 2.706-1.39 4.026-2.863 5.44-1.034.994-2.118 2.033-2.814 3.633-.018.041-.052.055-.075.065q-.013.004-.02.01a.34.34 0 0 1-.226.084.34.34 0 0 1-.224-.086l-.092-.077c-.699-1.615-1.768-2.669-2.781-3.67-1.454-1.435-2.797-2.762-2.78-5.478.02-3.067 2.7-5.545 5.975-5.523m-.02 2.826c-1.62-.01-2.944 1.315-2.955 2.96-.01 1.646 1.295 2.988 2.916 2.999h.002c1.621.01 2.943-1.316 2.953-2.961.011-1.646-1.294-2.988-2.916-2.998m-.005 1.1c1.017.006 1.829.83 1.822 1.89s-.83 1.874-1.848 1.867c-1.018-.006-1.829-.83-1.822-1.89s.83-1.874 1.848-1.868m-2.155 11.857 4.14.025c.271.002.49.305.487.676l-.013 1.875c-.003.37-.224.67-.495.668l-4.14-.025c-.27-.002-.487-.306-.485-.676l.012-1.875c.003-.37.224-.67.494-.668' style='color:%23000;font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:%23000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:evenodd;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:%23000;solid-opacity:1;vector-effect:none;fill:%23000;fill-opacity:.4;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto' transform='translate(15.553 2.85)scale(.88807)'/%3E %3Cpath d='M-9.415-.316C-12.69-.338-15.37 2.14-15.39 5.207c-.017 2.716 1.326 4.041 2.78 5.477 1.013 1 2.081 2.055 2.78 3.67l.092.076a.34.34 0 0 0 .225.086.34.34 0 0 0 .227-.083l.019-.01c.022-.009.057-.024.074-.064.697-1.6 1.78-2.64 2.814-3.634 1.473-1.414 2.847-2.733 2.864-5.44.02-3.067-2.627-5.58-5.901-5.601m-.057 8.784c1.621.011 2.944-1.315 2.955-2.96.01-1.646-1.295-2.988-2.916-2.999-1.622-.01-2.945 1.315-2.955 2.96s1.295 2.989 2.916 3' style='clip-rule:evenodd;fill:%23e1e3e9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:.4' transform='translate(15.553 2.85)scale(.88807)'/%3E %3Cpath d='M-11.594 15.465c-.27-.002-.492.297-.494.668l-.012 1.876c-.003.371.214.673.485.675l4.14.027c.271.002.492-.298.495-.668l.012-1.877c.003-.37-.215-.672-.485-.674z' style='clip-rule:evenodd;fill:%23fff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:.4' transform='translate(15.553 2.85)scale(.88807)'/%3E %3C/g%3E %3C/svg%3E")}}.maplibregl-ctrl.maplibregl-ctrl-attrib{padding:0 5px;background-color:hsla(0,0%,100%,.5);margin:0}@media screen{.maplibregl-ctrl-attrib.maplibregl-compact{min-height:20px;padding:2px 24px 2px 0;margin:10px;position:relative;background-color:#fff;color:#000;border-radius:12px;box-sizing:content-box}.maplibregl-ctrl-attrib.maplibregl-compact-show{padding:2px 28px 2px 8px;visibility:visible}.maplibregl-ctrl-bottom-left>.maplibregl-ctrl-attrib.maplibregl-compact-show,.maplibregl-ctrl-top-left>.maplibregl-ctrl-attrib.maplibregl-compact-show{padding:2px 8px 2px 28px;border-radius:12px}.maplibregl-ctrl-attrib.maplibregl-compact .maplibregl-ctrl-attrib-inner{display:none}.maplibregl-ctrl-attrib-button{display:none;cursor:pointer;position:absolute;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill-rule='evenodd' viewBox='0 0 20 20'%3E %3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E %3C/svg%3E");background-color:hsla(0,0%,100%,.5);width:24px;height:24px;box-sizing:border-box;border-radius:12px;outline:none;top:0;right:0;border:0}.maplibregl-ctrl-attrib summary.maplibregl-ctrl-attrib-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;list-style:none}.maplibregl-ctrl-attrib summary.maplibregl-ctrl-attrib-button::-webkit-details-marker{display:none}.maplibregl-ctrl-bottom-left .maplibregl-ctrl-attrib-button,.maplibregl-ctrl-top-left .maplibregl-ctrl-attrib-button{left:0}.maplibregl-ctrl-attrib.maplibregl-compact .maplibregl-ctrl-attrib-button,.maplibregl-ctrl-attrib.maplibregl-compact-show .maplibregl-ctrl-attrib-inner{display:block}.maplibregl-ctrl-attrib.maplibregl-compact-show .maplibregl-ctrl-attrib-button{background-color:rgba(0,0,0,.05)}.maplibregl-ctrl-bottom-right>.maplibregl-ctrl-attrib.maplibregl-compact:after{bottom:0;right:0}.maplibregl-ctrl-top-right>.maplibregl-ctrl-attrib.maplibregl-compact:after{top:0;right:0}.maplibregl-ctrl-top-left>.maplibregl-ctrl-attrib.maplibregl-compact:after{top:0;left:0}.maplibregl-ctrl-bottom-left>.maplibregl-ctrl-attrib.maplibregl-compact:after{bottom:0;left:0}}@media screen and (forced-colors:active){.maplibregl-ctrl-attrib.maplibregl-compact:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill-rule='evenodd' viewBox='0 0 20 20' fill='%23fff'%3E %3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E %3C/svg%3E")}}@media screen and (forced-colors:active) and (prefers-color-scheme:light){.maplibregl-ctrl-attrib.maplibregl-compact:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill-rule='evenodd' viewBox='0 0 20 20'%3E %3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E %3C/svg%3E")}}.maplibregl-ctrl-attrib a{color:rgba(0,0,0,.75);text-decoration:none}.maplibregl-ctrl-attrib a:hover{color:inherit;text-decoration:underline}.maplibregl-attrib-empty{display:none}.maplibregl-ctrl-scale{background-color:hsla(0,0%,100%,.75);font-size:10px;white-space:nowrap;border-color:#333;border-style:none solid solid;border-width:medium 2px 2px;padding:0 5px;color:#333;box-sizing:border-box}.maplibregl-popup{position:absolute;top:0;left:0;display:flex;will-change:transform;pointer-events:none}.maplibregl-popup-anchor-top,.maplibregl-popup-anchor-top-left,.maplibregl-popup-anchor-top-right{flex-direction:column}.maplibregl-popup-anchor-bottom,.maplibregl-popup-anchor-bottom-left,.maplibregl-popup-anchor-bottom-right{flex-direction:column-reverse}.maplibregl-popup-anchor-left{flex-direction:row}.maplibregl-popup-anchor-right,[dir=rtl] .maplibregl-popup-anchor-left{flex-direction:row-reverse}.maplibregl-popup-tip{width:0;height:0;border:10px solid transparent;z-index:1}.maplibregl-popup-anchor-top .maplibregl-popup-tip{align-self:center;border-top:none;border-bottom-color:#fff}.maplibregl-popup-anchor-top-left .maplibregl-popup-tip{align-self:flex-start;border-top:none;border-left:none;border-bottom-color:#fff}.maplibregl-popup-anchor-top-right .maplibregl-popup-tip{align-self:flex-end;border-top:none;border-right:none;border-bottom-color:#fff}.maplibregl-popup-anchor-bottom .maplibregl-popup-tip{align-self:center;border-bottom:none;border-top-color:#fff}.maplibregl-popup-anchor-bottom-left .maplibregl-popup-tip{align-self:flex-start;border-bottom:none;border-left:none;border-top-color:#fff}.maplibregl-popup-anchor-bottom-right .maplibregl-popup-tip{align-self:flex-end;border-bottom:none;border-right:none;border-top-color:#fff}.maplibregl-popup-anchor-left .maplibregl-popup-tip{align-self:center;border-left:none;border-right-color:#fff}.maplibregl-popup-anchor-right .maplibregl-popup-tip{align-self:center;border-right:none;border-left-color:#fff}[dir=rtl] .maplibregl-popup-anchor-right{flex-direction:row}[dir=rtl] .maplibregl-popup-anchor-top-left .maplibregl-popup-tip{align-self:flex-end}[dir=rtl] .maplibregl-popup-anchor-top-right .maplibregl-popup-tip{align-self:flex-start}[dir=rtl] .maplibregl-popup-anchor-bottom-left .maplibregl-popup-tip{align-self:flex-end}[dir=rtl] .maplibregl-popup-anchor-bottom-right .maplibregl-popup-tip{align-self:flex-start}.maplibregl-popup-close-button{position:absolute;right:0;top:0;border:0;border-radius:0 3px 0 0;cursor:pointer;background-color:transparent}.maplibregl-popup-close-button:hover{background-color:rgba(0,0,0,.05)}.maplibregl-popup-content{position:relative;background:#fff;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.1);padding:15px 10px;pointer-events:auto}.maplibregl-popup-anchor-top-left .maplibregl-popup-content{border-top-left-radius:0}.maplibregl-popup-anchor-top-right .maplibregl-popup-content{border-top-right-radius:0}.maplibregl-popup-anchor-bottom-left .maplibregl-popup-content{border-bottom-left-radius:0}.maplibregl-popup-anchor-bottom-right .maplibregl-popup-content{border-bottom-right-radius:0}.maplibregl-popup-track-pointer{display:none}.maplibregl-popup-track-pointer *{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.maplibregl-map:hover .maplibregl-popup-track-pointer{display:flex}.maplibregl-map:active .maplibregl-popup-track-pointer{display:none}.maplibregl-marker{position:absolute;top:0;left:0;will-change:transform;transition:opacity .2s}.maplibregl-marker-draggable{cursor:grab}.maplibregl-user-location-dot,.maplibregl-user-location-dot:before{background-color:#1da1f2;width:15px;height:15px;border-radius:50%}.maplibregl-user-location-dot:before{content:"";position:absolute;animation:maplibregl-user-location-dot-pulse 2s infinite}.maplibregl-user-location-dot:after{border-radius:50%;border:2px solid #fff;content:"";height:19px;left:-2px;position:absolute;top:-2px;width:19px;box-sizing:border-box;box-shadow:0 0 3px rgba(0,0,0,.35)}@media(prefers-reduced-motion:reduce){.maplibregl-user-location-dot:before{animation:none}}@keyframes maplibregl-user-location-dot-pulse{0%{transform:scale(1);opacity:1}70%{transform:scale(3);opacity:0}to{transform:scale(1);opacity:0}}.maplibregl-user-location-dot-stale{background-color:#aaa}.maplibregl-user-location-dot-stale:after{display:none}.maplibregl-user-location-accuracy-circle{background-color:#1da1f233;width:1px;height:1px;border-radius:100%}.maplibregl-crosshair,.maplibregl-crosshair .maplibregl-interactive,.maplibregl-crosshair .maplibregl-interactive:active{cursor:crosshair}.maplibregl-boxzoom{position:absolute;top:0;left:0;width:0;height:0;background:#fff;border:2px dotted #202020;opacity:.5}.maplibregl-cooperative-gesture-screen{background:rgba(0,0,0,.4);position:absolute;inset:0;display:flex;justify-content:center;align-items:center;color:#fff;padding:1rem;font-size:1.4em;line-height:1.2;opacity:0;pointer-events:none;transition:opacity 1s 1s;z-index:99999}.maplibregl-cooperative-gesture-screen.maplibregl-show{opacity:1;transition:opacity .05s}.maplibregl-cooperative-gesture-screen .maplibregl-mobile-message{display:none}@media(hover:none),(pointer:coarse){.maplibregl-cooperative-gesture-screen .maplibregl-desktop-message{display:none}.maplibregl-cooperative-gesture-screen .maplibregl-mobile-message{display:block}}.maplibregl-pseudo-fullscreen{position:fixed!important;width:100%!important;height:100%!important;top:0!important;left:0!important;z-index:99999}/* Kerros — single stylesheet for the planner, viewer and home shell.
2
+ Tokens first; components follow the DOM order of SitePlanner.tsx. */
3
+ :root {
4
+ --bg: #f7f7fa;
5
+ --panel: #ffffff;
6
+ --panel-soft: #f4f5f9;
7
+ --ink: #191b33;
8
+ --ink-soft: #4e5169;
9
+ --ink-faint: #8a8da3;
10
+ --line: #e6e7ef;
11
+ --line-strong: #d2d4e0;
12
+ --accent: #6259e8;
13
+ --accent-ink: #4a43c4;
14
+ --accent-soft: #edebfc;
15
+ --accent-selection: #c8c4f5;
16
+ --ok: #2e9e6b;
17
+ --alarm: #e0524e;
18
+ --alarm-soft: #fdecea;
19
+ --warning: #e39d3b;
20
+ --warning-soft: #fbf1de;
21
+ --unknown: #9a9daf;
22
+ --shadow-sm: 0 1px 2px rgba(24, 30, 27, 0.06);
23
+ --shadow-md: 0 4px 16px rgba(24, 30, 27, 0.09);
24
+ --shadow-lg: 0 12px 40px rgba(24, 30, 27, 0.14);
25
+ --radius: 12px;
26
+ --radius-lg: 16px;
27
+ --font:
28
+ "Avenir Next", "Segoe UI Variable", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue",
29
+ sans-serif;
30
+ --font-display: var(--font);
31
+ }
32
+ /* Resets are scoped to .kerros-root (the wrapper KerrosThemeProvider and the FloorViewer/FloorEditor
33
+ roots render) so embedding a component in a host page never restyles the host's own elements. The
34
+ full-page html/body reset is the app's concern, not the library's.
35
+
36
+ The scope sits inside :where() so it adds no specificity. That is the whole point: a reset has to
37
+ LOSE to the component rules layered over it. Written plainly, `.kerros-root button` scores (0,1,1)
38
+ and so beats every single-class rule — `.home-card`, `.back-link`, `.stack-button` — silently
39
+ flattening the padding they ask for. :where() keeps the namespacing and restores the (0,0,1) of the
40
+ bare element reset these rules were written against. */
41
+ :where(.kerros-root, .kerros-root *),
42
+ :where(.kerros-root, .kerros-root *)::before,
43
+ :where(.kerros-root, .kerros-root *)::after {
44
+ box-sizing: border-box;
45
+ }
46
+ /* .kerros-root is a SCOPE, never a box. It marks "library UI lives in here" so the resets above and
47
+ the design tokens have something to hang off, and every entry point renders it — the theme provider,
48
+ FloorViewer and SitePlanner alike — because the resets have to work whether or not a host wrapped
49
+ anything in a provider. Nesting them (a provider around a viewer) is therefore normal and harmless:
50
+ the resets are idempotent and the tokens inherit inwards.
51
+
52
+ What an element does in LAYOUT is a separate class, so that the two can never be confused for one
53
+ another: .kerros-passthrough for the provider, .kerros-surface for the viewer, .app-shell for the
54
+ editor. Keeping those here rather than in inline styles also means a host can restyle them. */
55
+ .kerros-root {
56
+ color: var(--ink);
57
+ font: 14px / 1.45 var(--font);
58
+ -webkit-font-smoothing: antialiased;
59
+ }
60
+ /* The provider contributes tokens and context, not geometry — display:contents keeps its wrapper out
61
+ of layout entirely, so children flex/grid against the host's own container as if it weren't there. */
62
+ .kerros-passthrough {
63
+ display: contents;
64
+ }
65
+ /* A viewer fills whatever the host gives it, and is the positioning context for the map's overlays. */
66
+ .kerros-surface {
67
+ position: relative;
68
+ width: 100%;
69
+ height: 100%;
70
+ }
71
+ :where(.kerros-root) :is(h1, h2, h3, p) {
72
+ margin: 0;
73
+ }
74
+ :where(.kerros-root) button {
75
+ font: inherit;
76
+ color: inherit;
77
+ background: none;
78
+ border: 0;
79
+ padding: 0;
80
+ cursor: pointer;
81
+ }
82
+ :where(.kerros-root) button:disabled {
83
+ cursor: default;
84
+ opacity: 0.45;
85
+ }
86
+ :where(.kerros-root) :is(input, select) {
87
+ font: inherit;
88
+ color: inherit;
89
+ }
90
+ :where(.kerros-root) kbd {
91
+ font: 11px / 1 var(--font);
92
+ background: var(--panel);
93
+ border: 1px solid var(--line-strong);
94
+ border-bottom-width: 2px;
95
+ border-radius: 5px;
96
+ padding: 3px 6px;
97
+ color: var(--ink-soft);
98
+ }
99
+ :where(.kerros-root) ::selection {
100
+ background: var(--accent-selection);
101
+ }
102
+
103
+ /* ---------- shared atoms ---------- */
104
+ .eyebrow {
105
+ font-size: 10.5px;
106
+ font-weight: 700;
107
+ letter-spacing: 0.12em;
108
+ color: var(--accent-ink);
109
+ }
110
+ .helper {
111
+ font-size: 12px;
112
+ color: var(--ink-faint);
113
+ line-height: 1.5;
114
+ }
115
+ .helper.padded {
116
+ padding: 10px 14px;
117
+ }
118
+ .icon-button {
119
+ display: inline-flex;
120
+ align-items: center;
121
+ justify-content: center;
122
+ width: 30px;
123
+ height: 30px;
124
+ border-radius: 8px;
125
+ color: var(--ink-soft);
126
+ flex: none;
127
+ }
128
+ .icon-button:hover {
129
+ background: rgba(25, 27, 51, 0.07);
130
+ color: var(--ink);
131
+ }
132
+ .text-button {
133
+ color: var(--accent-ink);
134
+ font-size: 12.5px;
135
+ font-weight: 600;
136
+ padding: 4px 0;
137
+ }
138
+ .text-button:hover {
139
+ text-decoration: underline;
140
+ }
141
+ .button {
142
+ display: inline-flex;
143
+ align-items: center;
144
+ justify-content: center;
145
+ gap: 7px;
146
+ border-radius: 999px;
147
+ padding: 9px 16px;
148
+ font-weight: 600;
149
+ font-size: 13.5px;
150
+ transition:
151
+ background 0.15s,
152
+ box-shadow 0.15s;
153
+ }
154
+ .button.small {
155
+ padding: 6px 12px;
156
+ font-size: 12.5px;
157
+ }
158
+ .button.full {
159
+ width: 100%;
160
+ }
161
+ .button.primary {
162
+ background: var(--accent);
163
+ color: #fff;
164
+ box-shadow: var(--shadow-sm);
165
+ }
166
+ .button.primary:hover:not(:disabled) {
167
+ background: var(--accent-ink);
168
+ }
169
+ .button.secondary {
170
+ background: var(--panel);
171
+ border: 1px solid var(--line-strong);
172
+ color: var(--ink);
173
+ }
174
+ .button.secondary:hover:not(:disabled) {
175
+ border-color: var(--accent);
176
+ color: var(--accent-ink);
177
+ }
178
+ .button.danger {
179
+ background: var(--alarm);
180
+ color: #fff;
181
+ }
182
+ .button.danger:hover {
183
+ background: #b93a3a;
184
+ }
185
+ .button.danger-quiet {
186
+ color: var(--alarm);
187
+ }
188
+ .button.danger-quiet:hover {
189
+ background: var(--alarm-soft);
190
+ }
191
+ .status-dot {
192
+ display: inline-block;
193
+ width: 8px;
194
+ height: 8px;
195
+ border-radius: 50%;
196
+ background: var(--unknown);
197
+ flex: none;
198
+ }
199
+ .status-dot.normal {
200
+ background: var(--ok);
201
+ }
202
+ .status-dot.warning {
203
+ background: var(--warning);
204
+ }
205
+ .status-dot.critical {
206
+ background: var(--alarm);
207
+ animation: pulse 1.4s ease-in-out infinite;
208
+ }
209
+ .status-dot.unknown {
210
+ background: var(--unknown);
211
+ }
212
+ @keyframes pulse {
213
+ 50% {
214
+ opacity: 0.45;
215
+ }
216
+ }
217
+ .live-pip {
218
+ width: 7px;
219
+ height: 7px;
220
+ border-radius: 50%;
221
+ background: var(--ok);
222
+ display: inline-block;
223
+ animation: pulse 2s ease-in-out infinite;
224
+ }
225
+
226
+ .field {
227
+ display: flex;
228
+ flex-direction: column;
229
+ gap: 5px;
230
+ margin: 10px 0;
231
+ }
232
+ .field > span {
233
+ font-size: 11.5px;
234
+ font-weight: 600;
235
+ color: var(--ink-soft);
236
+ }
237
+ .field input,
238
+ .field select,
239
+ .input-wrap input {
240
+ width: 100%;
241
+ background: var(--panel-soft);
242
+ border: 1px solid var(--line-strong);
243
+ border-radius: 8px;
244
+ padding: 8px 10px;
245
+ outline: none;
246
+ transition: border-color 0.15s;
247
+ }
248
+ .field input:focus,
249
+ .field select:focus,
250
+ .input-wrap input:focus {
251
+ border-color: var(--accent);
252
+ background: #fff;
253
+ }
254
+ .field input[type="color"] {
255
+ padding: 3px;
256
+ height: 36px;
257
+ }
258
+ .field input[type="range"] {
259
+ padding: 0;
260
+ border: 0;
261
+ background: none;
262
+ accent-color: var(--accent);
263
+ }
264
+ .input-wrap {
265
+ position: relative;
266
+ display: flex;
267
+ align-items: center;
268
+ }
269
+ .input-wrap em {
270
+ position: absolute;
271
+ right: 10px;
272
+ font-style: normal;
273
+ font-size: 12px;
274
+ color: var(--ink-faint);
275
+ pointer-events: none;
276
+ }
277
+ .field-grid {
278
+ display: grid;
279
+ grid-template-columns: 1fr 1fr;
280
+ gap: 0 10px;
281
+ }
282
+ .form-error {
283
+ color: var(--alarm);
284
+ font-size: 12.5px;
285
+ background: var(--alarm-soft);
286
+ border-radius: 8px;
287
+ padding: 9px 12px;
288
+ margin: 10px 0 0;
289
+ }
290
+ .check-row {
291
+ display: flex;
292
+ align-items: center;
293
+ gap: 9px;
294
+ padding: 7px 2px;
295
+ font-size: 13px;
296
+ cursor: pointer;
297
+ }
298
+ .check-row input {
299
+ accent-color: var(--accent);
300
+ width: 15px;
301
+ height: 15px;
302
+ }
303
+ .check-row span {
304
+ margin-left: auto;
305
+ color: var(--ink-faint);
306
+ font-size: 12px;
307
+ }
308
+ .toggle-row {
309
+ display: flex;
310
+ align-items: center;
311
+ justify-content: space-between;
312
+ gap: 12px;
313
+ width: 100%;
314
+ padding: 9px 0;
315
+ text-align: left;
316
+ font-size: 13px;
317
+ font-weight: 500;
318
+ }
319
+ .toggle-row small {
320
+ display: block;
321
+ color: var(--ink-faint);
322
+ font-weight: 400;
323
+ font-size: 11.5px;
324
+ }
325
+ .choice-row {
326
+ display: block;
327
+ }
328
+ .lamp-note {
329
+ display: flex;
330
+ align-items: center;
331
+ gap: 7px;
332
+ }
333
+ .lamp-note i {
334
+ flex: none;
335
+ width: 11px;
336
+ height: 11px;
337
+ border-radius: 50%;
338
+ box-shadow: inset 0 0 0 1px rgba(16, 20, 34, 0.18);
339
+ }
340
+ .choice-head {
341
+ display: flex;
342
+ align-items: center;
343
+ justify-content: space-between;
344
+ gap: 12px;
345
+ }
346
+ .choice-row small {
347
+ display: block;
348
+ margin-top: 3px;
349
+ color: var(--ink-faint);
350
+ font-weight: 400;
351
+ font-size: 11.5px;
352
+ }
353
+ .choice {
354
+ display: flex;
355
+ flex: none;
356
+ gap: 2px;
357
+ padding: 2px;
358
+ border-radius: 8px;
359
+ background: var(--surface-sunken, rgba(0, 0, 0, 0.05));
360
+ }
361
+ .choice button {
362
+ padding: 3px 8px;
363
+ border-radius: 6px;
364
+ font-size: 11.5px;
365
+ font-weight: 500;
366
+ color: var(--ink-faint);
367
+ }
368
+ .choice button.active {
369
+ background: var(--surface);
370
+ color: var(--ink);
371
+ box-shadow: 0 1px 2px rgba(16, 20, 34, 0.14);
372
+ }
373
+ .toggle {
374
+ width: 34px;
375
+ height: 20px;
376
+ border-radius: 10px;
377
+ background: var(--line-strong);
378
+ position: relative;
379
+ transition: background 0.15s;
380
+ flex: none;
381
+ }
382
+ .toggle::after {
383
+ content: "";
384
+ position: absolute;
385
+ top: 2px;
386
+ left: 2px;
387
+ width: 16px;
388
+ height: 16px;
389
+ border-radius: 50%;
390
+ background: #fff;
391
+ box-shadow: var(--shadow-sm);
392
+ transition: left 0.15s;
393
+ }
394
+ .toggle.on {
395
+ background: var(--accent);
396
+ }
397
+ .toggle.on::after {
398
+ left: 16px;
399
+ }
400
+
401
+ /* ---------- brand & app frame ---------- */
402
+ .brand {
403
+ display: inline-flex;
404
+ align-items: center;
405
+ gap: 9px;
406
+ color: var(--ink);
407
+ text-decoration: none;
408
+ }
409
+ .brand-mark {
410
+ display: inline-flex;
411
+ align-items: center;
412
+ justify-content: center;
413
+ width: 34px;
414
+ height: 34px;
415
+ border-radius: 10px;
416
+ background: linear-gradient(135deg, var(--accent) 0%, #3b37a8 100%);
417
+ color: #fff;
418
+ box-shadow: var(--shadow-sm);
419
+ }
420
+ .brand strong {
421
+ font-size: 16.5px;
422
+ letter-spacing: -0.01em;
423
+ }
424
+ .brand strong i {
425
+ font-style: normal;
426
+ font-size: 9px;
427
+ vertical-align: super;
428
+ color: var(--ink-faint);
429
+ }
430
+ .brand-divider {
431
+ width: 1px;
432
+ height: 18px;
433
+ background: var(--line-strong);
434
+ }
435
+ .brand-product {
436
+ font-size: 14px;
437
+ font-weight: 600;
438
+ color: var(--ink-soft);
439
+ }
440
+ .avatar,
441
+ .workspace-avatar {
442
+ display: inline-flex;
443
+ align-items: center;
444
+ justify-content: center;
445
+ width: 32px;
446
+ height: 32px;
447
+ border-radius: 50%;
448
+ background: #23264a;
449
+ color: #d9d7fb;
450
+ font-size: 11.5px;
451
+ font-weight: 700;
452
+ flex: none;
453
+ }
454
+ .app-shell {
455
+ height: 100vh;
456
+ height: 100dvh;
457
+ display: flex;
458
+ flex-direction: column;
459
+ overflow: hidden;
460
+ /* Paints its own surface — the library no longer relies on a full-page body background. */
461
+ background: var(--bg);
462
+ }
463
+ .app-header {
464
+ height: 58px;
465
+ flex: none;
466
+ display: flex;
467
+ align-items: center;
468
+ gap: 20px;
469
+ padding: 0 18px;
470
+ background: var(--panel);
471
+ border-bottom: 1px solid var(--line);
472
+ z-index: 40;
473
+ }
474
+ .mode-switch {
475
+ display: flex;
476
+ gap: 2px;
477
+ background: var(--bg);
478
+ border: 1px solid var(--line);
479
+ border-radius: var(--radius);
480
+ padding: 3px;
481
+ margin: 0 auto;
482
+ }
483
+ .mode-switch button {
484
+ display: flex;
485
+ align-items: center;
486
+ gap: 7px;
487
+ padding: 7px 16px;
488
+ border-radius: 7px;
489
+ font-weight: 600;
490
+ font-size: 13px;
491
+ color: var(--ink-soft);
492
+ }
493
+ .mode-switch button.active {
494
+ background: var(--panel);
495
+ color: var(--ink);
496
+ box-shadow: var(--shadow-sm);
497
+ }
498
+ .header-right {
499
+ display: flex;
500
+ align-items: center;
501
+ gap: 12px;
502
+ }
503
+ .save-status {
504
+ display: inline-flex;
505
+ align-items: center;
506
+ gap: 7px;
507
+ font-size: 12px;
508
+ color: var(--ink-faint);
509
+ }
510
+ .save-status > span {
511
+ width: 7px;
512
+ height: 7px;
513
+ border-radius: 50%;
514
+ background: var(--ok);
515
+ }
516
+ .save-status.saving > span {
517
+ background: var(--warning);
518
+ animation: pulse 1s infinite;
519
+ }
520
+ .save-status.error {
521
+ color: var(--alarm);
522
+ }
523
+ .save-status.error > span {
524
+ background: var(--alarm);
525
+ }
526
+ .workspace {
527
+ flex: 1;
528
+ display: flex;
529
+ min-height: 0;
530
+ }
531
+
532
+ /* ---------- sidebar ---------- */
533
+ .sidebar {
534
+ width: 296px;
535
+ flex: none;
536
+ background: var(--panel);
537
+ border-right: 1px solid var(--line);
538
+ display: flex;
539
+ flex-direction: column;
540
+ min-height: 0;
541
+ }
542
+ .back-link {
543
+ display: flex;
544
+ align-items: center;
545
+ gap: 6px;
546
+ padding: 12px 18px 4px;
547
+ font-size: 12px;
548
+ font-weight: 600;
549
+ color: var(--ink-faint);
550
+ }
551
+ .back-link:hover {
552
+ color: var(--accent-ink);
553
+ }
554
+ .site-card {
555
+ display: flex;
556
+ align-items: center;
557
+ gap: 11px;
558
+ padding: 10px 18px;
559
+ }
560
+ .site-icon {
561
+ display: flex;
562
+ align-items: center;
563
+ justify-content: center;
564
+ width: 44px;
565
+ height: 44px;
566
+ border-radius: 12px;
567
+ background: var(--accent-soft);
568
+ color: var(--accent-ink);
569
+ flex: none;
570
+ }
571
+ .site-card h1 {
572
+ font-size: 15.5px;
573
+ letter-spacing: -0.01em;
574
+ }
575
+ .site-card > div > span {
576
+ display: flex;
577
+ align-items: center;
578
+ gap: 4px;
579
+ font-size: 11.5px;
580
+ color: var(--ink-faint);
581
+ }
582
+ .site-card .icon-button {
583
+ margin-left: auto;
584
+ }
585
+ .site-badge {
586
+ display: flex;
587
+ align-items: center;
588
+ gap: 7px;
589
+ margin: 4px 18px 8px;
590
+ padding: 6px 10px;
591
+ border-radius: 8px;
592
+ background: var(--panel-soft);
593
+ border: 1px solid var(--line);
594
+ font-size: 10px;
595
+ font-weight: 700;
596
+ letter-spacing: 0.08em;
597
+ color: var(--accent-ink);
598
+ }
599
+ .site-badge > span:first-child {
600
+ width: 6px;
601
+ height: 6px;
602
+ border-radius: 50%;
603
+ background: var(--accent);
604
+ }
605
+ .badge-right {
606
+ margin-left: auto;
607
+ color: var(--ink-faint);
608
+ letter-spacing: 0.02em;
609
+ font-weight: 600;
610
+ }
611
+ .sidebar-tabs {
612
+ display: flex;
613
+ gap: 18px;
614
+ padding: 0 18px;
615
+ border-bottom: 1px solid var(--line);
616
+ }
617
+ .sidebar-tabs button {
618
+ padding: 9px 2px 10px;
619
+ font-weight: 600;
620
+ font-size: 13px;
621
+ color: var(--ink-faint);
622
+ border-bottom: 2px solid transparent;
623
+ margin-bottom: -1px;
624
+ display: flex;
625
+ gap: 6px;
626
+ align-items: center;
627
+ }
628
+ .sidebar-tabs button.active {
629
+ color: var(--ink);
630
+ border-bottom-color: var(--accent);
631
+ }
632
+ .sidebar-tabs button span {
633
+ background: var(--bg);
634
+ border-radius: 9px;
635
+ font-size: 10.5px;
636
+ padding: 1px 7px;
637
+ color: var(--ink-soft);
638
+ }
639
+ .sidebar-scroll {
640
+ flex: 1;
641
+ overflow-y: auto;
642
+ padding: 10px 12px 16px;
643
+ min-height: 0;
644
+ }
645
+ .section-label {
646
+ display: flex;
647
+ align-items: center;
648
+ justify-content: space-between;
649
+ padding: 8px 6px 6px;
650
+ font-size: 10.5px;
651
+ font-weight: 700;
652
+ letter-spacing: 0.1em;
653
+ color: var(--ink-faint);
654
+ text-transform: uppercase;
655
+ }
656
+ .section-label span {
657
+ font-weight: 600;
658
+ }
659
+ .drawings-heading {
660
+ margin-top: 14px;
661
+ border-top: 1px solid var(--line);
662
+ padding-top: 14px;
663
+ }
664
+ .floor-item,
665
+ .drawing-item,
666
+ .object-row {
667
+ display: flex;
668
+ align-items: center;
669
+ gap: 11px;
670
+ width: 100%;
671
+ padding: 8px 10px;
672
+ border-radius: var(--radius);
673
+ text-align: left;
674
+ color: var(--ink-soft);
675
+ }
676
+ .floor-item:hover,
677
+ .drawing-item:hover,
678
+ .object-row:hover {
679
+ background: var(--panel-soft);
680
+ color: var(--ink);
681
+ }
682
+ .floor-item.active,
683
+ .drawing-item.active,
684
+ .object-row.active {
685
+ background: var(--accent-soft);
686
+ color: var(--accent-ink);
687
+ }
688
+ .floor-item > span:not(.floor-number):not(.active-floor-dot),
689
+ .drawing-item > span,
690
+ .object-row > span:first-of-type {
691
+ flex: 1;
692
+ min-width: 0;
693
+ font-weight: 600;
694
+ font-size: 13px;
695
+ }
696
+ .floor-item small,
697
+ .drawing-item small,
698
+ .object-row small {
699
+ display: block;
700
+ font-weight: 400;
701
+ font-size: 11px;
702
+ color: var(--ink-faint);
703
+ }
704
+ .floor-number {
705
+ display: inline-flex;
706
+ align-items: center;
707
+ justify-content: center;
708
+ width: 28px;
709
+ height: 28px;
710
+ border-radius: 8px;
711
+ background: var(--bg);
712
+ font-size: 11px;
713
+ font-weight: 700;
714
+ color: var(--ink-soft);
715
+ flex: none;
716
+ }
717
+ .floor-item.active .floor-number {
718
+ background: #fff;
719
+ color: var(--accent-ink);
720
+ }
721
+ .active-floor-dot {
722
+ width: 7px;
723
+ height: 7px;
724
+ border-radius: 50%;
725
+ background: var(--accent);
726
+ flex: none;
727
+ }
728
+ .floor-alarm {
729
+ width: 8px;
730
+ height: 8px;
731
+ border-radius: 50%;
732
+ background: var(--alarm);
733
+ box-shadow: 0 0 0 3px var(--alarm-soft);
734
+ flex: none;
735
+ animation: pulse 1.4s ease-in-out infinite;
736
+ }
737
+ .dark .floor-alarm {
738
+ box-shadow: 0 0 0 3px rgba(224, 82, 78, 0.25);
739
+ }
740
+ .floor-item.outdoor {
741
+ margin-bottom: 4px;
742
+ }
743
+ .building-group {
744
+ margin: 2px 0;
745
+ }
746
+ .building-label {
747
+ display: flex;
748
+ width: 100%;
749
+ align-items: center;
750
+ gap: 7px;
751
+ padding: 8px 6px 4px;
752
+ font-size: 11.5px;
753
+ font-weight: 700;
754
+ color: var(--ink-soft);
755
+ border-radius: 7px;
756
+ text-align: left;
757
+ }
758
+ .building-label:hover {
759
+ color: var(--ink);
760
+ background: var(--panel-soft);
761
+ }
762
+ .building-label svg:last-child {
763
+ margin-left: auto;
764
+ color: var(--ink-faint);
765
+ }
766
+ .building-count {
767
+ font-size: 10px;
768
+ font-weight: 600;
769
+ color: var(--ink-faint);
770
+ background: var(--panel-soft);
771
+ border-radius: 99px;
772
+ padding: 1px 7px;
773
+ }
774
+ .duplicate-floor {
775
+ display: flex;
776
+ align-items: center;
777
+ gap: 7px;
778
+ width: 100%;
779
+ padding: 8px 10px;
780
+ margin-top: 2px;
781
+ border-radius: var(--radius);
782
+ border: 1px dashed var(--line-strong);
783
+ color: var(--ink-faint);
784
+ font-size: 12px;
785
+ font-weight: 600;
786
+ justify-content: center;
787
+ }
788
+ .duplicate-floor:hover {
789
+ border-color: var(--accent);
790
+ color: var(--accent-ink);
791
+ }
792
+ .empty-drawings {
793
+ display: flex;
794
+ flex-direction: column;
795
+ align-items: center;
796
+ gap: 4px;
797
+ width: 100%;
798
+ padding: 22px 14px;
799
+ border: 1.5px dashed var(--line-strong);
800
+ border-radius: var(--radius-lg);
801
+ color: var(--ink-faint);
802
+ text-align: center;
803
+ }
804
+ .empty-drawings:hover {
805
+ border-color: var(--accent);
806
+ color: var(--accent-ink);
807
+ background: var(--panel-soft);
808
+ }
809
+ .empty-drawings div {
810
+ display: flex;
811
+ align-items: flex-start;
812
+ gap: 2px;
813
+ color: var(--accent-ink);
814
+ margin-bottom: 4px;
815
+ }
816
+ .empty-drawings strong {
817
+ font-size: 13px;
818
+ color: var(--ink);
819
+ }
820
+ .empty-drawings span {
821
+ font-size: 12px;
822
+ }
823
+ .empty-drawings small {
824
+ font-size: 10.5px;
825
+ letter-spacing: 0.06em;
826
+ }
827
+ .object-search {
828
+ display: flex;
829
+ align-items: center;
830
+ gap: 8px;
831
+ margin: 2px 4px 8px;
832
+ padding: 8px 11px;
833
+ background: var(--panel-soft);
834
+ border: 1px solid var(--line);
835
+ border-radius: var(--radius);
836
+ color: var(--ink-faint);
837
+ }
838
+ .object-search input {
839
+ flex: 1;
840
+ border: 0;
841
+ background: none;
842
+ outline: none;
843
+ min-width: 0;
844
+ }
845
+ .sidebar-footer {
846
+ display: flex;
847
+ align-items: center;
848
+ gap: 10px;
849
+ padding: 12px 18px;
850
+ border-top: 1px solid var(--line);
851
+ color: var(--ink-faint);
852
+ }
853
+ .sidebar-footer > div {
854
+ flex: 1;
855
+ line-height: 1.25;
856
+ }
857
+ .sidebar-footer strong {
858
+ display: block;
859
+ font-size: 12.5px;
860
+ color: var(--ink);
861
+ }
862
+ .sidebar-footer small {
863
+ font-size: 11px;
864
+ }
865
+
866
+ /* ---------- canvas column ---------- */
867
+ .canvas-column {
868
+ flex: 1;
869
+ display: flex;
870
+ flex-direction: column;
871
+ min-width: 0;
872
+ min-height: 0;
873
+ }
874
+ .canvas-header {
875
+ height: 46px;
876
+ flex: none;
877
+ display: flex;
878
+ align-items: center;
879
+ justify-content: space-between;
880
+ padding: 0 16px;
881
+ background: var(--panel);
882
+ border-bottom: 1px solid var(--line);
883
+ }
884
+ .canvas-header > div:last-child {
885
+ display: flex;
886
+ align-items: center;
887
+ gap: 8px;
888
+ }
889
+ .breadcrumb {
890
+ display: flex;
891
+ align-items: center;
892
+ gap: 6px;
893
+ font-size: 13px;
894
+ color: var(--ink-faint);
895
+ }
896
+ .breadcrumb strong {
897
+ color: var(--ink);
898
+ }
899
+ .mode-pill {
900
+ margin-left: 10px;
901
+ background: var(--accent-soft);
902
+ color: var(--accent-ink);
903
+ font-size: 9.5px;
904
+ font-weight: 800;
905
+ letter-spacing: 0.1em;
906
+ border-radius: 20px;
907
+ padding: 3px 9px;
908
+ }
909
+ .canvas-body {
910
+ flex: 1;
911
+ position: relative;
912
+ min-height: 0;
913
+ overflow: hidden;
914
+ background: #e2e4e1;
915
+ }
916
+ .canvas-statusbar {
917
+ height: 30px;
918
+ flex: none;
919
+ display: flex;
920
+ align-items: center;
921
+ justify-content: space-between;
922
+ gap: 16px;
923
+ padding: 0 16px;
924
+ background: var(--panel);
925
+ border-top: 1px solid var(--line);
926
+ font-size: 11.5px;
927
+ color: var(--ink-faint);
928
+ }
929
+ .canvas-statusbar span {
930
+ display: inline-flex;
931
+ align-items: center;
932
+ gap: 7px;
933
+ }
934
+ .canvas-statusbar i {
935
+ width: 1px;
936
+ height: 11px;
937
+ background: var(--line-strong);
938
+ }
939
+ .canvas-top-left {
940
+ position: absolute;
941
+ top: 14px;
942
+ left: 14px;
943
+ display: flex;
944
+ flex-wrap: wrap;
945
+ gap: 9px;
946
+ max-width: calc(100% - 300px);
947
+ z-index: 20;
948
+ }
949
+ .floor-chip {
950
+ display: flex;
951
+ align-items: center;
952
+ gap: 8px;
953
+ background: var(--panel);
954
+ border-radius: var(--radius);
955
+ box-shadow: var(--shadow-md);
956
+ padding: 0 12px;
957
+ height: 40px;
958
+ color: var(--accent-ink);
959
+ position: relative;
960
+ }
961
+ .floor-chip select {
962
+ appearance: none;
963
+ border: 0;
964
+ background: none;
965
+ outline: none;
966
+ font-weight: 600;
967
+ font-size: 13.5px;
968
+ padding-right: 2px;
969
+ cursor: pointer;
970
+ }
971
+ .view-switch {
972
+ display: flex;
973
+ background: var(--panel);
974
+ border-radius: var(--radius);
975
+ box-shadow: var(--shadow-md);
976
+ padding: 4px;
977
+ height: 40px;
978
+ }
979
+ .view-switch button {
980
+ display: flex;
981
+ align-items: center;
982
+ gap: 6px;
983
+ padding: 0 14px;
984
+ border-radius: 7px;
985
+ font-weight: 700;
986
+ font-size: 12.5px;
987
+ color: var(--ink-faint);
988
+ }
989
+ .view-switch button.active {
990
+ background: var(--ink);
991
+ color: #fff;
992
+ }
993
+ .stack-button {
994
+ display: flex;
995
+ align-items: center;
996
+ gap: 7px;
997
+ background: var(--panel);
998
+ border-radius: var(--radius);
999
+ box-shadow: var(--shadow-md);
1000
+ padding: 0 14px;
1001
+ height: 40px;
1002
+ font-weight: 600;
1003
+ font-size: 12.5px;
1004
+ color: var(--ink-soft);
1005
+ }
1006
+ .stack-button.active {
1007
+ background: var(--ink);
1008
+ color: #fff;
1009
+ }
1010
+ .canvas-top-right {
1011
+ position: absolute;
1012
+ top: 14px;
1013
+ right: 14px;
1014
+ display: flex;
1015
+ gap: 9px;
1016
+ z-index: 20;
1017
+ }
1018
+ .live-badge {
1019
+ display: flex;
1020
+ align-items: center;
1021
+ gap: 8px;
1022
+ background: var(--panel);
1023
+ border-radius: var(--radius);
1024
+ box-shadow: var(--shadow-md);
1025
+ padding: 0 14px;
1026
+ height: 40px;
1027
+ font-weight: 600;
1028
+ font-size: 12.5px;
1029
+ color: var(--ink-soft);
1030
+ }
1031
+ .live-badge.has-alarm {
1032
+ background: var(--alarm);
1033
+ color: #fff;
1034
+ animation: pulse 1.6s infinite;
1035
+ }
1036
+ .floating-icon {
1037
+ display: flex;
1038
+ align-items: center;
1039
+ justify-content: center;
1040
+ width: 40px;
1041
+ height: 40px;
1042
+ background: var(--panel);
1043
+ border-radius: var(--radius);
1044
+ box-shadow: var(--shadow-md);
1045
+ color: var(--ink-soft);
1046
+ }
1047
+ .floating-icon.active,
1048
+ .floating-icon:hover {
1049
+ color: var(--accent-ink);
1050
+ }
1051
+ .map-settings {
1052
+ position: absolute;
1053
+ top: 62px;
1054
+ right: 14px;
1055
+ width: 274px;
1056
+ background: var(--panel);
1057
+ border-radius: var(--radius-lg);
1058
+ box-shadow: var(--shadow-lg);
1059
+ padding: 14px 16px;
1060
+ z-index: 25;
1061
+ }
1062
+ .map-settings h3 {
1063
+ display: flex;
1064
+ align-items: center;
1065
+ justify-content: space-between;
1066
+ font-size: 13.5px;
1067
+ margin-bottom: 4px;
1068
+ }
1069
+ .map-settings .helper {
1070
+ display: block;
1071
+ margin-top: 8px;
1072
+ }
1073
+ .map-legend {
1074
+ position: absolute;
1075
+ left: 14px;
1076
+ bottom: 14px;
1077
+ display: flex;
1078
+ gap: 14px;
1079
+ background: rgba(255, 255, 255, 0.92);
1080
+ backdrop-filter: blur(6px);
1081
+ border-radius: var(--radius);
1082
+ box-shadow: var(--shadow-sm);
1083
+ padding: 8px 14px;
1084
+ font-size: 11.5px;
1085
+ color: var(--ink-soft);
1086
+ z-index: 20;
1087
+ }
1088
+ .map-legend span {
1089
+ display: inline-flex;
1090
+ align-items: center;
1091
+ gap: 6px;
1092
+ }
1093
+
1094
+ /* ---------- drawing dock & palette ---------- */
1095
+ .drawing-dock-wrap {
1096
+ position: absolute;
1097
+ left: 50%;
1098
+ bottom: 16px;
1099
+ transform: translateX(-50%);
1100
+ display: flex;
1101
+ flex-direction: column;
1102
+ align-items: center;
1103
+ gap: 9px;
1104
+ z-index: 25;
1105
+ pointer-events: none;
1106
+ }
1107
+ .drawing-dock-wrap > * {
1108
+ pointer-events: auto;
1109
+ }
1110
+ .tool-instruction {
1111
+ display: flex;
1112
+ align-items: center;
1113
+ gap: 10px;
1114
+ background: var(--ink);
1115
+ color: #ededf6;
1116
+ border-radius: var(--radius);
1117
+ box-shadow: var(--shadow-lg);
1118
+ padding: 9px 14px;
1119
+ font-size: 12.5px;
1120
+ white-space: nowrap;
1121
+ }
1122
+ .tool-instruction-dot {
1123
+ width: 7px;
1124
+ height: 7px;
1125
+ border-radius: 50%;
1126
+ background: #a9a3f0;
1127
+ animation: pulse 1.6s infinite;
1128
+ }
1129
+ .tool-instruction strong {
1130
+ color: #fff;
1131
+ }
1132
+ .tool-instruction button {
1133
+ display: inline-flex;
1134
+ align-items: center;
1135
+ gap: 6px;
1136
+ background: rgba(255, 255, 255, 0.12);
1137
+ border-radius: 7px;
1138
+ padding: 5px 10px;
1139
+ color: #fff;
1140
+ font-weight: 600;
1141
+ font-size: 12px;
1142
+ }
1143
+ .tool-instruction button:hover {
1144
+ background: rgba(255, 255, 255, 0.22);
1145
+ }
1146
+ .tool-instruction kbd {
1147
+ background: none;
1148
+ border-color: rgba(255, 255, 255, 0.35);
1149
+ color: #cfe3da;
1150
+ padding: 1px 4px;
1151
+ }
1152
+ .tool-palette {
1153
+ display: flex;
1154
+ gap: 22px;
1155
+ background: var(--panel);
1156
+ border-radius: var(--radius-lg);
1157
+ box-shadow: var(--shadow-lg);
1158
+ padding: 16px 20px;
1159
+ }
1160
+ .tool-palette h3 {
1161
+ font-size: 10.5px;
1162
+ font-weight: 700;
1163
+ letter-spacing: 0.1em;
1164
+ text-transform: uppercase;
1165
+ color: var(--ink-faint);
1166
+ margin-bottom: 8px;
1167
+ }
1168
+ .tool-palette > div {
1169
+ min-width: 128px;
1170
+ }
1171
+ .tool-palette button {
1172
+ display: flex;
1173
+ align-items: center;
1174
+ gap: 9px;
1175
+ width: 100%;
1176
+ padding: 7px 9px;
1177
+ border-radius: 8px;
1178
+ font-size: 12.5px;
1179
+ font-weight: 500;
1180
+ color: var(--ink-soft);
1181
+ }
1182
+ .tool-palette button:hover {
1183
+ background: var(--accent-soft);
1184
+ color: var(--accent-ink);
1185
+ }
1186
+ .drawing-dock {
1187
+ display: flex;
1188
+ align-items: center;
1189
+ gap: 3px;
1190
+ background: var(--panel);
1191
+ border-radius: var(--radius-lg);
1192
+ box-shadow: var(--shadow-lg);
1193
+ padding: 7px;
1194
+ }
1195
+ .drawing-dock button {
1196
+ position: relative;
1197
+ display: flex;
1198
+ align-items: center;
1199
+ justify-content: center;
1200
+ width: 40px;
1201
+ height: 40px;
1202
+ border-radius: 9px;
1203
+ color: var(--ink-soft);
1204
+ }
1205
+ .key-hint {
1206
+ position: absolute;
1207
+ top: -4px;
1208
+ right: -4px;
1209
+ padding: 1px 4px;
1210
+ font-size: 9.5px;
1211
+ line-height: 1.3;
1212
+ border-radius: 4px;
1213
+ background: var(--ink);
1214
+ color: var(--panel);
1215
+ border: 0;
1216
+ box-shadow: var(--shadow-sm);
1217
+ pointer-events: none;
1218
+ z-index: 3;
1219
+ }
1220
+ .mode-switch button,
1221
+ .view-switch button,
1222
+ .stack-button,
1223
+ .icon-button,
1224
+ .floating-icon {
1225
+ position: relative;
1226
+ }
1227
+ .drawing-dock button:hover:not(:disabled) {
1228
+ background: var(--panel-soft);
1229
+ color: var(--ink);
1230
+ }
1231
+ .drawing-dock button.active {
1232
+ background: var(--accent);
1233
+ color: #fff;
1234
+ }
1235
+ .drawing-dock i {
1236
+ width: 1px;
1237
+ height: 22px;
1238
+ background: var(--line);
1239
+ margin: 0 5px;
1240
+ }
1241
+ .dock-caption {
1242
+ display: flex;
1243
+ gap: 14px;
1244
+ font-size: 11px;
1245
+ color: var(--ink-faint);
1246
+ background: rgba(255, 255, 255, 0.8);
1247
+ backdrop-filter: blur(4px);
1248
+ border-radius: 14px;
1249
+ padding: 3px 12px;
1250
+ }
1251
+
1252
+ /* ---------- map surface & overlay ---------- */
1253
+ .map-wrap {
1254
+ position: absolute;
1255
+ inset: 0;
1256
+ }
1257
+ .map-surface {
1258
+ position: absolute;
1259
+ inset: 0;
1260
+ }
1261
+ .map-overlay {
1262
+ position: absolute;
1263
+ inset: 0;
1264
+ pointer-events: none;
1265
+ overflow: hidden;
1266
+ z-index: 10;
1267
+ }
1268
+ .map-overlay > * {
1269
+ position: absolute;
1270
+ transform: translate(-50%, -50%);
1271
+ }
1272
+ .space-label {
1273
+ pointer-events: none;
1274
+ text-align: center;
1275
+ font-size: 11.5px;
1276
+ font-weight: 600;
1277
+ /* Darker than it looks like it needs to be on paper. A room label in 3D stands over a floor that
1278
+ is pale, shaded, part in shadow and crossed by furniture and walls — not the flat plate the 2D
1279
+ plan gives it — so the ink has to carry against the darkest of that, not the average. */
1280
+ color: #23273c;
1281
+ /* A hard 1 px outline, not a glow. A blurred halo spreads the label's own colour into the ring
1282
+ around it and the text stops having edges — at 11.5 px that reads as out of focus. Four offsets
1283
+ at zero blur trace the glyph exactly and leave it crisp. */
1284
+ --label-halo: #ffffff;
1285
+ /* Eight offsets, not four: at the corners a four-way outline leaves the glyph touching whatever is
1286
+ behind it, which over a shaded 3D floor is where the letters start to dissolve. */
1287
+ text-shadow:
1288
+ 1px 0 0 var(--label-halo),
1289
+ -1px 0 0 var(--label-halo),
1290
+ 0 1px 0 var(--label-halo),
1291
+ 0 -1px 0 var(--label-halo),
1292
+ 1px 1px 0 var(--label-halo),
1293
+ -1px 1px 0 var(--label-halo),
1294
+ 1px -1px 0 var(--label-halo),
1295
+ -1px -1px 0 var(--label-halo),
1296
+ 0 1px 3px rgba(255, 255, 255, 0.8);
1297
+ white-space: nowrap;
1298
+ }
1299
+ .space-label small {
1300
+ display: block;
1301
+ font-size: 10px;
1302
+ font-weight: 500;
1303
+ color: #4d5266;
1304
+ }
1305
+ /* In 3D the label stands over a shaded, textured floor with walls crossing behind it, and dark ink
1306
+ with a white halo dissolved into it. White letters with a black stroke read against anything:
1307
+ the stroke is painted under the fill so it thickens the glyph outward and never eats the letter. */
1308
+ .map-wrap.perspective .space-label {
1309
+ color: #fff;
1310
+ --label-halo: #000;
1311
+ -webkit-text-stroke: 2.5px #000;
1312
+ paint-order: stroke fill;
1313
+ text-shadow: 0 1px 3px rgba(0, 0, 0, 0.7);
1314
+ }
1315
+ .map-wrap.perspective .space-label small {
1316
+ color: #f1f3f8;
1317
+ }
1318
+ .map-wrap.perspective .space-label.outdoor {
1319
+ color: #fff;
1320
+ }
1321
+ .space-label.outdoor {
1322
+ font-size: 12px;
1323
+ letter-spacing: 0.04em;
1324
+ text-transform: uppercase;
1325
+ color: #5c6180;
1326
+ }
1327
+ /* Labels anchored over a shaft have no light floor behind them. Use a crisp plaque in both themes. */
1328
+ .map-wrap .space-label.void-label {
1329
+ width: max-content;
1330
+ max-width: 180px;
1331
+ padding: 7px 11px;
1332
+ border: 1px solid rgba(255, 255, 255, 0.3);
1333
+ border-radius: 8px;
1334
+ background: #242938;
1335
+ color: #fff;
1336
+ text-shadow: none;
1337
+ white-space: normal;
1338
+ line-height: 1.35;
1339
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.22);
1340
+ }
1341
+ .map-wrap .space-label.void-label small {
1342
+ margin-top: 3px;
1343
+ color: #d5dbea;
1344
+ font-variant-numeric: tabular-nums;
1345
+ }
1346
+ .entity-marker {
1347
+ pointer-events: auto;
1348
+ display: flex;
1349
+ align-items: center;
1350
+ justify-content: center;
1351
+ width: 30px;
1352
+ height: 30px;
1353
+ border-radius: 50%;
1354
+ background: var(--panel);
1355
+ border: 1.5px solid var(--line-strong);
1356
+ box-shadow: var(--shadow-md);
1357
+ color: var(--ink-soft);
1358
+ transition:
1359
+ border-color 0.15s,
1360
+ transform 0.1s;
1361
+ }
1362
+ .entity-marker:hover {
1363
+ border-color: var(--accent);
1364
+ color: var(--accent-ink);
1365
+ z-index: 5;
1366
+ }
1367
+ .entity-marker.selected {
1368
+ border-color: var(--accent);
1369
+ background: var(--accent);
1370
+ color: #fff;
1371
+ z-index: 6;
1372
+ }
1373
+ .entity-marker.critical {
1374
+ border-color: var(--alarm);
1375
+ background: var(--alarm);
1376
+ color: #fff;
1377
+ animation: pulse 1.4s infinite;
1378
+ z-index: 7;
1379
+ }
1380
+ .entity-marker.warning {
1381
+ border-color: var(--warning);
1382
+ }
1383
+ .entity-marker.poi {
1384
+ border-radius: 9px;
1385
+ background: #1d2038;
1386
+ border-color: #1d2038;
1387
+ color: #dcdaf8;
1388
+ }
1389
+ .entity-marker.poi.selected {
1390
+ background: var(--accent);
1391
+ border-color: var(--accent);
1392
+ }
1393
+ .entity-marker .status-dot {
1394
+ position: absolute;
1395
+ top: -2px;
1396
+ right: -2px;
1397
+ width: 9px;
1398
+ height: 9px;
1399
+ border: 1.5px solid #fff;
1400
+ }
1401
+ .marker-tooltip {
1402
+ position: absolute;
1403
+ bottom: calc(100% + 7px);
1404
+ left: 50%;
1405
+ transform: translateX(-50%);
1406
+ background: #191b33;
1407
+ color: #fff;
1408
+ font-size: 11px;
1409
+ font-weight: 600;
1410
+ padding: 4px 9px;
1411
+ border-radius: 6px;
1412
+ white-space: nowrap;
1413
+ opacity: 0;
1414
+ pointer-events: none;
1415
+ transition: opacity 0.12s;
1416
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.3);
1417
+ }
1418
+ .entity-marker:hover .marker-tooltip {
1419
+ opacity: 1;
1420
+ }
1421
+ .mini-marker {
1422
+ pointer-events: auto;
1423
+ width: 11px;
1424
+ height: 11px;
1425
+ border-radius: 50%;
1426
+ border: 1.5px solid #fff;
1427
+ box-shadow: var(--shadow-sm);
1428
+ transition: transform 0.1s;
1429
+ z-index: 4;
1430
+ }
1431
+ .mini-marker:hover {
1432
+ transform: translate(-50%, -50%) scale(1.5);
1433
+ z-index: 9;
1434
+ }
1435
+ .mini-marker:hover .marker-tooltip {
1436
+ opacity: 1;
1437
+ }
1438
+ .vertex-handle {
1439
+ pointer-events: auto;
1440
+ width: 13px;
1441
+ height: 13px;
1442
+ border-radius: 50%;
1443
+ background: #fff;
1444
+ border: 2.5px solid var(--accent);
1445
+ box-shadow: var(--shadow-sm);
1446
+ cursor: grab;
1447
+ z-index: 8;
1448
+ }
1449
+ .vertex-handle:hover {
1450
+ transform: translate(-50%, -50%) scale(1.25);
1451
+ }
1452
+ .move-handle {
1453
+ pointer-events: auto;
1454
+ width: 26px;
1455
+ height: 26px;
1456
+ border-radius: 50%;
1457
+ background: var(--accent);
1458
+ color: #fff;
1459
+ font-size: 13px;
1460
+ display: flex;
1461
+ align-items: center;
1462
+ justify-content: center;
1463
+ box-shadow: var(--shadow-md);
1464
+ cursor: grab;
1465
+ z-index: 8;
1466
+ }
1467
+ .draft-node {
1468
+ pointer-events: none;
1469
+ width: 9px;
1470
+ height: 9px;
1471
+ border-radius: 50%;
1472
+ background: var(--accent);
1473
+ border: 2px solid #fff;
1474
+ box-shadow: var(--shadow-sm);
1475
+ }
1476
+ .alignment-pin {
1477
+ pointer-events: none;
1478
+ display: flex;
1479
+ align-items: center;
1480
+ justify-content: center;
1481
+ width: 22px;
1482
+ height: 22px;
1483
+ border-radius: 50% 50% 50% 4px;
1484
+ background: #d97b2b;
1485
+ color: #fff;
1486
+ font-size: 11px;
1487
+ font-weight: 700;
1488
+ box-shadow: var(--shadow-md);
1489
+ }
1490
+ .pitch-control {
1491
+ position: absolute;
1492
+ right: 14px;
1493
+ bottom: 508px;
1494
+ z-index: 20;
1495
+ display: flex;
1496
+ flex-direction: column;
1497
+ align-items: center;
1498
+ background: var(--panel);
1499
+ border-radius: 999px;
1500
+ box-shadow: var(--shadow-md);
1501
+ padding: 9px 5px;
1502
+ color: var(--ink-soft);
1503
+ }
1504
+ .pitch-control input {
1505
+ appearance: auto;
1506
+ width: 86px;
1507
+ height: 18px;
1508
+ transform: rotate(-90deg);
1509
+ margin: 36px -30px;
1510
+ accent-color: var(--accent);
1511
+ }
1512
+ .map-navigator {
1513
+ position: absolute;
1514
+ right: 14px;
1515
+ bottom: 218px;
1516
+ display: flex;
1517
+ flex-direction: column;
1518
+ background: var(--panel);
1519
+ border-radius: var(--radius);
1520
+ box-shadow: var(--shadow-md);
1521
+ padding: 4px;
1522
+ z-index: 20;
1523
+ }
1524
+ .map-navigator button {
1525
+ display: flex;
1526
+ align-items: center;
1527
+ justify-content: center;
1528
+ width: 34px;
1529
+ height: 34px;
1530
+ border-radius: 7px;
1531
+ color: var(--ink-soft);
1532
+ }
1533
+ .map-navigator button:hover {
1534
+ background: var(--panel-soft);
1535
+ color: var(--ink);
1536
+ }
1537
+ .map-navigator div {
1538
+ height: 1px;
1539
+ background: var(--line);
1540
+ margin: 3px 4px;
1541
+ }
1542
+ /* Walk mode's head-up display: everything the person walking needs and nothing the map wants.
1543
+ Pointer-events are off throughout — the canvas underneath has to receive the drag. */
1544
+ .walk-fov {
1545
+ position: absolute;
1546
+ top: 68px;
1547
+ right: 14px;
1548
+ z-index: 24;
1549
+ display: grid;
1550
+ gap: 6px;
1551
+ width: 190px;
1552
+ padding: 10px 12px;
1553
+ border-radius: var(--radius);
1554
+ background: var(--panel);
1555
+ box-shadow: var(--shadow-md);
1556
+ color: var(--ink-soft);
1557
+ font-size: 12px;
1558
+ }
1559
+ .walk-fov span {
1560
+ display: flex;
1561
+ justify-content: space-between;
1562
+ }
1563
+ .walk-fov output {
1564
+ color: var(--ink);
1565
+ font-variant-numeric: tabular-nums;
1566
+ }
1567
+ .walk-fov input {
1568
+ width: 100%;
1569
+ accent-color: var(--accent);
1570
+ }
1571
+ .walk-hud {
1572
+ position: absolute;
1573
+ inset: 0;
1574
+ pointer-events: none;
1575
+ z-index: 24;
1576
+ font-size: 12px;
1577
+ }
1578
+ .walk-status {
1579
+ position: absolute;
1580
+ left: 50%;
1581
+ bottom: 78px;
1582
+ transform: translateX(-50%);
1583
+ display: flex;
1584
+ align-items: center;
1585
+ gap: 14px;
1586
+ padding: 7px 14px;
1587
+ border-radius: 999px;
1588
+ background: #141a2b;
1589
+ color: #fff;
1590
+ border: 1px solid #687087;
1591
+ font-size: 13px;
1592
+ white-space: nowrap;
1593
+ }
1594
+ .walk-status:empty {
1595
+ display: none;
1596
+ }
1597
+ .walk-status b {
1598
+ color: #fff;
1599
+ font-weight: 600;
1600
+ }
1601
+ /* The route's next instruction leads the bar: it is the reason you are walking. */
1602
+ .walk-status em {
1603
+ order: -1;
1604
+ color: #fff;
1605
+ font-style: normal;
1606
+ font-weight: 600;
1607
+ }
1608
+ .walk-keys {
1609
+ position: absolute;
1610
+ left: 50%;
1611
+ bottom: 40px;
1612
+ transform: translateX(-50%);
1613
+ display: flex;
1614
+ align-items: center;
1615
+ gap: 16px;
1616
+ padding: 6px 14px;
1617
+ border-radius: 999px;
1618
+ background: #141a2b;
1619
+ color: #f4f5fa;
1620
+ white-space: nowrap;
1621
+ transition: opacity 0.25s;
1622
+ }
1623
+ /* While you are actually turning the view, the legend is in the way of the thing it explains. */
1624
+ .walk-keys.busy {
1625
+ opacity: 0.25;
1626
+ }
1627
+ .walk-hud kbd {
1628
+ display: inline-block;
1629
+ min-width: 17px;
1630
+ margin: 0 1px;
1631
+ padding: 1px 4px;
1632
+ border-radius: 4px;
1633
+ background: rgba(255, 255, 255, 0.16);
1634
+ border: 1px solid rgba(255, 255, 255, 0.24);
1635
+ font: inherit;
1636
+ font-size: 11px;
1637
+ color: #f4f5fa;
1638
+ text-align: center;
1639
+ }
1640
+ .map-scale[hidden] {
1641
+ display: none;
1642
+ }
1643
+ .map-scale {
1644
+ position: absolute;
1645
+ right: 14px;
1646
+ bottom: 14px;
1647
+ display: flex;
1648
+ align-items: center;
1649
+ gap: 8px;
1650
+ font-size: 10.5px;
1651
+ color: var(--ink-soft);
1652
+ background: rgba(255, 255, 255, 0.85);
1653
+ border-radius: 7px;
1654
+ padding: 4px 10px;
1655
+ z-index: 20;
1656
+ }
1657
+ .map-scale > span {
1658
+ display: inline-block;
1659
+ height: 4px;
1660
+ border: 1.5px solid #5c607a;
1661
+ border-top: 0;
1662
+ }
1663
+ .map-scale i {
1664
+ width: 1px;
1665
+ height: 10px;
1666
+ background: var(--line-strong);
1667
+ }
1668
+ .map-error {
1669
+ position: absolute;
1670
+ top: 66px;
1671
+ left: 50%;
1672
+ transform: translateX(-50%);
1673
+ background: var(--warning-soft);
1674
+ border: 1px solid #ecd9ae;
1675
+ color: #7a5a17;
1676
+ border-radius: var(--radius);
1677
+ padding: 8px 14px;
1678
+ font-size: 12.5px;
1679
+ box-shadow: var(--shadow-md);
1680
+ z-index: 30;
1681
+ }
1682
+ .map-loading,
1683
+ .renderer-loading {
1684
+ position: absolute;
1685
+ inset: 0;
1686
+ display: flex;
1687
+ flex-direction: column;
1688
+ align-items: center;
1689
+ justify-content: center;
1690
+ gap: 14px;
1691
+ background: var(--bg);
1692
+ color: var(--ink-faint);
1693
+ font-size: 13px;
1694
+ z-index: 30;
1695
+ }
1696
+ .loading-orbit {
1697
+ width: 34px;
1698
+ height: 34px;
1699
+ border-radius: 50%;
1700
+ border: 3px solid var(--line);
1701
+ border-top-color: var(--accent);
1702
+ animation: spin 1s linear infinite;
1703
+ }
1704
+ @keyframes spin {
1705
+ to {
1706
+ transform: rotate(360deg);
1707
+ }
1708
+ }
1709
+ .map-wrap.perspective .map-surface {
1710
+ transition: filter 0.4s;
1711
+ }
1712
+
1713
+ /* ---------- inspector ---------- */
1714
+ .inspector,
1715
+ .alignment-panel {
1716
+ width: 324px;
1717
+ flex: none;
1718
+ background: var(--panel);
1719
+ border-left: 1px solid var(--line);
1720
+ display: flex;
1721
+ flex-direction: column;
1722
+ min-height: 0;
1723
+ }
1724
+ .inspector-top {
1725
+ display: flex;
1726
+ align-items: center;
1727
+ justify-content: space-between;
1728
+ padding: 13px 18px;
1729
+ border-bottom: 1px solid var(--line);
1730
+ font-size: 11px;
1731
+ font-weight: 700;
1732
+ letter-spacing: 0.1em;
1733
+ text-transform: uppercase;
1734
+ color: var(--ink-faint);
1735
+ }
1736
+ .inspector-scroll {
1737
+ flex: 1;
1738
+ overflow-y: auto;
1739
+ padding: 16px 18px;
1740
+ min-height: 0;
1741
+ }
1742
+ .object-title {
1743
+ text-align: center;
1744
+ padding-bottom: 14px;
1745
+ }
1746
+ .object-avatar {
1747
+ display: flex;
1748
+ align-items: center;
1749
+ justify-content: center;
1750
+ width: 58px;
1751
+ height: 58px;
1752
+ border-radius: 18px;
1753
+ background: var(--accent-soft);
1754
+ color: var(--accent-ink);
1755
+ margin: 0 auto 12px;
1756
+ }
1757
+ .object-avatar.critical {
1758
+ background: var(--alarm-soft);
1759
+ color: var(--alarm);
1760
+ }
1761
+ .object-avatar.warning {
1762
+ background: var(--warning-soft);
1763
+ color: var(--warning);
1764
+ }
1765
+ .object-title .eyebrow {
1766
+ text-transform: uppercase;
1767
+ }
1768
+ .object-title h2 {
1769
+ font-size: 18px;
1770
+ letter-spacing: -0.01em;
1771
+ margin: 3px 0 2px;
1772
+ }
1773
+ .object-title p {
1774
+ font-size: 12.5px;
1775
+ color: var(--ink-faint);
1776
+ }
1777
+ .property-section {
1778
+ border-top: 1px solid var(--line);
1779
+ padding: 14px 0;
1780
+ }
1781
+ .property-section h3 {
1782
+ display: flex;
1783
+ align-items: center;
1784
+ gap: 7px;
1785
+ font-size: 12px;
1786
+ font-weight: 700;
1787
+ color: var(--ink-soft);
1788
+ margin-bottom: 6px;
1789
+ }
1790
+ .property-section h3 svg {
1791
+ color: var(--ink-faint);
1792
+ }
1793
+ .status-banner {
1794
+ display: flex;
1795
+ align-items: center;
1796
+ gap: 9px;
1797
+ border-radius: var(--radius);
1798
+ padding: 11px 13px;
1799
+ background: var(--accent-soft);
1800
+ color: var(--accent-ink);
1801
+ font-size: 13.5px;
1802
+ }
1803
+ .status-banner strong {
1804
+ flex: 1;
1805
+ }
1806
+ .status-banner.critical {
1807
+ background: var(--alarm-soft);
1808
+ color: var(--alarm);
1809
+ }
1810
+ .status-banner.warning {
1811
+ background: var(--warning-soft);
1812
+ color: #8a6410;
1813
+ }
1814
+ .status-banner.unknown {
1815
+ background: var(--bg);
1816
+ color: var(--ink-soft);
1817
+ }
1818
+ .status-grid {
1819
+ display: grid;
1820
+ grid-template-columns: 1fr 1fr;
1821
+ gap: 8px;
1822
+ margin-top: 10px;
1823
+ }
1824
+ .status-grid > div {
1825
+ background: var(--panel-soft);
1826
+ border: 1px solid var(--line);
1827
+ border-radius: 9px;
1828
+ padding: 8px 11px;
1829
+ }
1830
+ .status-grid span {
1831
+ display: block;
1832
+ font-size: 10.5px;
1833
+ font-weight: 600;
1834
+ color: var(--ink-faint);
1835
+ text-transform: uppercase;
1836
+ letter-spacing: 0.04em;
1837
+ }
1838
+ .status-grid strong {
1839
+ font-size: 13px;
1840
+ text-transform: capitalize;
1841
+ }
1842
+ .measurement-row {
1843
+ display: flex;
1844
+ align-items: center;
1845
+ justify-content: space-between;
1846
+ padding: 8px 2px;
1847
+ font-size: 13px;
1848
+ color: var(--ink-soft);
1849
+ border-bottom: 1px dashed var(--line);
1850
+ }
1851
+ .measurement-row strong {
1852
+ color: var(--ink);
1853
+ }
1854
+ .feed-id {
1855
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
1856
+ font-size: 11.5px;
1857
+ background: var(--panel-soft);
1858
+ border: 1px solid var(--line);
1859
+ border-radius: 7px;
1860
+ padding: 7px 10px;
1861
+ color: var(--ink-soft);
1862
+ margin-top: 8px;
1863
+ word-break: break-all;
1864
+ }
1865
+ .simulator {
1866
+ background: var(--panel-soft);
1867
+ margin: 0 -18px;
1868
+ padding: 14px 18px;
1869
+ border-bottom: 1px solid var(--line);
1870
+ }
1871
+ .simulator h3 span {
1872
+ margin-left: auto;
1873
+ background: var(--accent-soft);
1874
+ color: var(--accent-ink);
1875
+ font-size: 9px;
1876
+ letter-spacing: 0.1em;
1877
+ border-radius: 8px;
1878
+ padding: 2px 8px;
1879
+ }
1880
+ .simulator p {
1881
+ font-size: 12px;
1882
+ color: var(--ink-faint);
1883
+ margin-bottom: 8px;
1884
+ }
1885
+ .simulator select {
1886
+ width: 100%;
1887
+ background: #fff;
1888
+ border: 1px solid var(--line-strong);
1889
+ border-radius: 8px;
1890
+ padding: 8px 10px;
1891
+ outline: none;
1892
+ }
1893
+ .inspector-footer {
1894
+ display: flex;
1895
+ gap: 8px;
1896
+ padding: 12px 18px;
1897
+ border-top: 1px solid var(--line);
1898
+ }
1899
+ .inspector-footer .button {
1900
+ flex: 1;
1901
+ }
1902
+ .viewer-note {
1903
+ display: flex;
1904
+ align-items: center;
1905
+ gap: 8px;
1906
+ padding: 11px 18px;
1907
+ border-top: 1px solid var(--line);
1908
+ font-size: 11.5px;
1909
+ color: var(--ink-faint);
1910
+ }
1911
+ .inspector-note {
1912
+ display: flex;
1913
+ gap: 11px;
1914
+ align-items: flex-start;
1915
+ background: var(--panel-soft);
1916
+ border: 1px solid var(--line);
1917
+ border-radius: var(--radius-lg);
1918
+ padding: 13px 14px;
1919
+ margin-top: 14px;
1920
+ color: var(--accent-ink);
1921
+ }
1922
+ .inspector-note p {
1923
+ font-size: 12.5px;
1924
+ font-weight: 600;
1925
+ color: var(--ink);
1926
+ line-height: 1.4;
1927
+ }
1928
+ .inspector-note p span {
1929
+ font-weight: 400;
1930
+ color: var(--ink-faint);
1931
+ font-size: 11.5px;
1932
+ }
1933
+ .overview-hero {
1934
+ text-align: center;
1935
+ padding: 6px 0 16px;
1936
+ }
1937
+ .overview-hero h2 {
1938
+ font-size: 19px;
1939
+ letter-spacing: -0.01em;
1940
+ margin: 3px 0 2px;
1941
+ }
1942
+ .overview-hero p {
1943
+ font-size: 12.5px;
1944
+ color: var(--ink-faint);
1945
+ }
1946
+ .overview-art {
1947
+ position: relative;
1948
+ height: 92px;
1949
+ display: flex;
1950
+ align-items: flex-end;
1951
+ justify-content: center;
1952
+ margin-bottom: 12px;
1953
+ }
1954
+ .mini-building {
1955
+ position: relative;
1956
+ display: flex;
1957
+ flex-direction: column-reverse;
1958
+ gap: 3px;
1959
+ }
1960
+ .mini-building i {
1961
+ width: 84px;
1962
+ height: 16px;
1963
+ border-radius: 4px;
1964
+ background: linear-gradient(180deg, #e2e4ee, #d1d4e4);
1965
+ border: 1px solid var(--line-strong);
1966
+ }
1967
+ .mini-building i:nth-child(2) {
1968
+ width: 92px;
1969
+ }
1970
+ .mini-building i:nth-child(3) {
1971
+ width: 84px;
1972
+ }
1973
+ .mini-building i:nth-child(4) {
1974
+ width: 62px;
1975
+ }
1976
+ .mini-access {
1977
+ position: absolute;
1978
+ right: -14px;
1979
+ bottom: -6px;
1980
+ display: flex;
1981
+ align-items: center;
1982
+ justify-content: center;
1983
+ width: 30px;
1984
+ height: 30px;
1985
+ border-radius: 50%;
1986
+ background: var(--accent);
1987
+ color: #fff;
1988
+ box-shadow: var(--shadow-md);
1989
+ }
1990
+ .hero-dots {
1991
+ position: absolute;
1992
+ inset: 0;
1993
+ background-image: radial-gradient(var(--line-strong) 1px, transparent 1px);
1994
+ background-size: 12px 12px;
1995
+ opacity: 0.5;
1996
+ z-index: -1;
1997
+ border-radius: 12px;
1998
+ }
1999
+ .overview-stats {
2000
+ display: grid;
2001
+ grid-template-columns: 1fr 1fr;
2002
+ gap: 9px;
2003
+ margin-bottom: 14px;
2004
+ }
2005
+ .overview-stats > div {
2006
+ background: var(--panel-soft);
2007
+ border: 1px solid var(--line);
2008
+ border-radius: var(--radius);
2009
+ padding: 11px 13px;
2010
+ }
2011
+ .overview-stats strong {
2012
+ display: block;
2013
+ font-size: 21px;
2014
+ letter-spacing: -0.02em;
2015
+ color: var(--accent-ink);
2016
+ }
2017
+ .overview-stats span {
2018
+ font-size: 11px;
2019
+ color: var(--ink-faint);
2020
+ font-weight: 600;
2021
+ }
2022
+ .overview-status {
2023
+ display: flex;
2024
+ align-items: center;
2025
+ gap: 9px;
2026
+ padding: 7px 2px;
2027
+ font-size: 13px;
2028
+ color: var(--ink-soft);
2029
+ }
2030
+ .overview-status strong {
2031
+ margin-left: auto;
2032
+ color: var(--ink);
2033
+ }
2034
+ .alarm-row {
2035
+ display: flex;
2036
+ align-items: center;
2037
+ gap: 10px;
2038
+ width: 100%;
2039
+ padding: 9px 11px;
2040
+ border-radius: var(--radius);
2041
+ background: var(--alarm-soft);
2042
+ color: var(--alarm);
2043
+ text-align: left;
2044
+ margin-bottom: 6px;
2045
+ }
2046
+ .alarm-row span:nth-child(2) {
2047
+ flex: 1;
2048
+ font-weight: 600;
2049
+ font-size: 13px;
2050
+ }
2051
+ .alarm-row small {
2052
+ display: block;
2053
+ font-weight: 400;
2054
+ font-size: 11.5px;
2055
+ }
2056
+
2057
+ /* ---------- alignment panel ---------- */
2058
+ .panel-heading {
2059
+ padding: 16px 18px 8px;
2060
+ }
2061
+ .panel-heading h2 {
2062
+ font-size: 17px;
2063
+ margin: 3px 0 4px;
2064
+ }
2065
+ .panel-heading p {
2066
+ font-size: 12.5px;
2067
+ color: var(--ink-soft);
2068
+ line-height: 1.5;
2069
+ }
2070
+ .alignment-image {
2071
+ position: relative;
2072
+ margin: 8px 18px;
2073
+ border: 1px solid var(--line-strong);
2074
+ border-radius: var(--radius);
2075
+ overflow: hidden;
2076
+ cursor: crosshair;
2077
+ background: repeating-conic-gradient(#f1f3f1 0% 25%, #fff 0% 50%) 50% / 18px 18px;
2078
+ }
2079
+ .alignment-image img {
2080
+ display: block;
2081
+ width: 100%;
2082
+ }
2083
+ .alignment-image b {
2084
+ position: absolute;
2085
+ transform: translate(-50%, -50%);
2086
+ display: flex;
2087
+ align-items: center;
2088
+ justify-content: center;
2089
+ width: 20px;
2090
+ height: 20px;
2091
+ border-radius: 50%;
2092
+ background: #d97b2b;
2093
+ color: #fff;
2094
+ font-size: 11px;
2095
+ box-shadow: var(--shadow-md);
2096
+ pointer-events: none;
2097
+ }
2098
+ .alignment-progress {
2099
+ display: flex;
2100
+ gap: 8px;
2101
+ padding: 4px 18px;
2102
+ }
2103
+ .alignment-progress span {
2104
+ display: inline-flex;
2105
+ align-items: center;
2106
+ gap: 6px;
2107
+ font-size: 11.5px;
2108
+ font-weight: 600;
2109
+ color: var(--ink-faint);
2110
+ background: var(--panel-soft);
2111
+ border: 1px solid var(--line);
2112
+ border-radius: 16px;
2113
+ padding: 5px 11px;
2114
+ }
2115
+ .alignment-progress span.done {
2116
+ background: var(--accent-soft);
2117
+ border-color: var(--accent-selection);
2118
+ color: var(--accent-ink);
2119
+ }
2120
+ .alignment-panel .text-button {
2121
+ margin: 4px 18px;
2122
+ align-self: flex-start;
2123
+ }
2124
+ .known-distance {
2125
+ margin: 10px 18px;
2126
+ padding: 13px 14px;
2127
+ background: var(--panel-soft);
2128
+ border: 1px solid var(--line);
2129
+ border-radius: var(--radius-lg);
2130
+ }
2131
+ .known-distance strong {
2132
+ font-size: 13px;
2133
+ }
2134
+ .known-distance p {
2135
+ font-size: 11.5px;
2136
+ color: var(--ink-faint);
2137
+ margin: 4px 0 2px;
2138
+ line-height: 1.45;
2139
+ }
2140
+ .alignment-actions {
2141
+ display: flex;
2142
+ gap: 8px;
2143
+ padding: 12px 18px;
2144
+ border-top: 1px solid var(--line);
2145
+ margin-top: auto;
2146
+ }
2147
+ .alignment-actions .button {
2148
+ flex: 1;
2149
+ }
2150
+
2151
+ /* ---------- modal & import ---------- */
2152
+ .modal {
2153
+ border: 0;
2154
+ border-radius: 16px;
2155
+ box-shadow: var(--shadow-lg);
2156
+ padding: 22px 24px;
2157
+ width: 440px;
2158
+ max-width: calc(100vw - 40px);
2159
+ background: var(--panel);
2160
+ color: var(--ink);
2161
+ }
2162
+ .modal.wide {
2163
+ width: 560px;
2164
+ }
2165
+ .modal::backdrop {
2166
+ background: rgba(24, 36, 32, 0.45);
2167
+ backdrop-filter: blur(2px);
2168
+ }
2169
+ .modal header {
2170
+ display: flex;
2171
+ align-items: flex-start;
2172
+ justify-content: space-between;
2173
+ gap: 12px;
2174
+ margin-bottom: 12px;
2175
+ }
2176
+ .modal h2 {
2177
+ font-size: 18px;
2178
+ letter-spacing: -0.01em;
2179
+ }
2180
+ .modal header p {
2181
+ font-size: 13px;
2182
+ color: var(--ink-faint);
2183
+ margin-top: 3px;
2184
+ line-height: 1.45;
2185
+ }
2186
+ .modal footer {
2187
+ display: flex;
2188
+ justify-content: flex-end;
2189
+ gap: 9px;
2190
+ margin-top: 18px;
2191
+ }
2192
+ .import-tabs {
2193
+ display: flex;
2194
+ gap: 8px;
2195
+ margin-bottom: 12px;
2196
+ }
2197
+ .import-tabs button {
2198
+ flex: 1;
2199
+ display: flex;
2200
+ flex-direction: column;
2201
+ align-items: center;
2202
+ gap: 5px;
2203
+ padding: 12px 8px;
2204
+ border: 1px solid var(--line);
2205
+ border-radius: var(--radius);
2206
+ font-size: 12px;
2207
+ font-weight: 600;
2208
+ color: var(--ink-soft);
2209
+ }
2210
+ .import-tabs button.active {
2211
+ border-color: var(--accent);
2212
+ background: var(--accent-soft);
2213
+ color: var(--accent-ink);
2214
+ }
2215
+ .dropzone {
2216
+ display: flex;
2217
+ flex-direction: column;
2218
+ align-items: center;
2219
+ gap: 4px;
2220
+ width: 100%;
2221
+ padding: 26px 16px;
2222
+ border: 1.5px dashed var(--line-strong);
2223
+ border-radius: var(--radius-lg);
2224
+ color: var(--accent-ink);
2225
+ }
2226
+ .dropzone:hover {
2227
+ border-color: var(--accent);
2228
+ background: var(--panel-soft);
2229
+ }
2230
+ .dropzone strong {
2231
+ color: var(--ink);
2232
+ font-size: 13.5px;
2233
+ max-width: 100%;
2234
+ overflow: hidden;
2235
+ text-overflow: ellipsis;
2236
+ }
2237
+ .dropzone span {
2238
+ font-size: 11.5px;
2239
+ color: var(--ink-faint);
2240
+ }
2241
+ .help-content h3 {
2242
+ font-size: 14px;
2243
+ margin: 14px 0 4px;
2244
+ }
2245
+ .help-content p {
2246
+ font-size: 13px;
2247
+ color: var(--ink-soft);
2248
+ line-height: 1.55;
2249
+ }
2250
+ .shortcut-grid {
2251
+ display: grid;
2252
+ grid-template-columns: 1fr 1fr;
2253
+ gap: 7px 18px;
2254
+ margin: 14px 0;
2255
+ }
2256
+ .shortcut-grid > div {
2257
+ display: flex;
2258
+ align-items: center;
2259
+ justify-content: space-between;
2260
+ font-size: 12.5px;
2261
+ color: var(--ink-soft);
2262
+ }
2263
+
2264
+ /* ---------- toast ---------- */
2265
+ .toast {
2266
+ position: fixed;
2267
+ bottom: 44px;
2268
+ left: 50%;
2269
+ transform: translateX(-50%);
2270
+ display: flex;
2271
+ align-items: center;
2272
+ gap: 10px;
2273
+ /* An inverted chip: it sits on the ink so it stands off whatever is behind it. Both halves have
2274
+ to invert together — pinning the text to a pale grey made it pale text on the pale surface
2275
+ --ink becomes in dark mode, which is the one place the toast was unreadable. */
2276
+ background: var(--ink);
2277
+ color: var(--bg);
2278
+ border-radius: var(--radius-lg);
2279
+ box-shadow: var(--shadow-lg);
2280
+ padding: 12px 16px;
2281
+ font-size: 13px;
2282
+ max-width: min(520px, calc(100vw - 40px));
2283
+ z-index: 100;
2284
+ animation: rise 0.25s ease;
2285
+ }
2286
+ .toast svg {
2287
+ color: #a9a3f0;
2288
+ flex: none;
2289
+ }
2290
+ .toast button {
2291
+ color: var(--bg);
2292
+ opacity: 0.65;
2293
+ display: flex;
2294
+ }
2295
+ .toast button:hover {
2296
+ opacity: 1;
2297
+ }
2298
+ /* The accent that reads on a dark chip is washed out on the pale one dark mode gives it. */
2299
+ .dark .toast svg {
2300
+ color: #4a43c4;
2301
+ }
2302
+ @keyframes rise {
2303
+ from {
2304
+ opacity: 0;
2305
+ transform: translate(-50%, 8px);
2306
+ }
2307
+ }
2308
+
2309
+ /* ---------- home shell ---------- */
2310
+ .home {
2311
+ min-height: 100vh;
2312
+ display: flex;
2313
+ flex-direction: column;
2314
+ background: linear-gradient(180deg, #f8faf9 0%, var(--bg) 340px);
2315
+ }
2316
+ .home-header {
2317
+ display: flex;
2318
+ align-items: center;
2319
+ justify-content: space-between;
2320
+ padding: 16px 34px;
2321
+ }
2322
+ .home-main {
2323
+ width: min(1060px, calc(100vw - 48px));
2324
+ margin: 0 auto;
2325
+ padding-bottom: 60px;
2326
+ }
2327
+ .home-hero {
2328
+ padding: 44px 0 30px;
2329
+ }
2330
+ .home-hero h1 {
2331
+ font-size: 40px;
2332
+ letter-spacing: -0.03em;
2333
+ line-height: 1.08;
2334
+ margin: 10px 0 14px;
2335
+ }
2336
+ .home-hero p {
2337
+ max-width: 560px;
2338
+ font-size: 15px;
2339
+ color: var(--ink-soft);
2340
+ line-height: 1.6;
2341
+ }
2342
+ .home-grid {
2343
+ display: grid;
2344
+ grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
2345
+ gap: 14px;
2346
+ }
2347
+ .home-card {
2348
+ display: flex;
2349
+ flex-direction: column;
2350
+ align-items: flex-start;
2351
+ gap: 8px;
2352
+ text-align: left;
2353
+ background: var(--panel);
2354
+ border: 1px solid var(--line);
2355
+ border-radius: 16px;
2356
+ padding: 20px;
2357
+ transition:
2358
+ box-shadow 0.15s,
2359
+ border-color 0.15s,
2360
+ transform 0.15s;
2361
+ }
2362
+ .home-card:hover {
2363
+ border-color: var(--accent-selection);
2364
+ box-shadow: var(--shadow-md);
2365
+ transform: translateY(-2px);
2366
+ }
2367
+ .home-card strong {
2368
+ font-size: 15.5px;
2369
+ letter-spacing: -0.01em;
2370
+ }
2371
+ .home-card p {
2372
+ font-size: 12.5px;
2373
+ color: var(--ink-faint);
2374
+ line-height: 1.5;
2375
+ flex: 1;
2376
+ }
2377
+ .home-card-icon {
2378
+ display: flex;
2379
+ align-items: center;
2380
+ justify-content: center;
2381
+ width: 48px;
2382
+ height: 48px;
2383
+ border-radius: 14px;
2384
+ background: linear-gradient(135deg, var(--accent) 0%, #3b37a8 100%);
2385
+ color: #fff;
2386
+ margin-bottom: 4px;
2387
+ }
2388
+ .home-card-icon.plain {
2389
+ background: var(--panel-soft);
2390
+ border: 1px solid var(--line);
2391
+ color: var(--accent-ink);
2392
+ }
2393
+ .home-card-footer {
2394
+ display: flex;
2395
+ align-items: center;
2396
+ justify-content: space-between;
2397
+ width: 100%;
2398
+ margin-top: 4px;
2399
+ }
2400
+ .home-tag {
2401
+ display: inline-flex;
2402
+ align-items: center;
2403
+ gap: 5px;
2404
+ font-size: 10.5px;
2405
+ font-weight: 700;
2406
+ letter-spacing: 0.06em;
2407
+ color: var(--accent-ink);
2408
+ background: var(--accent-soft);
2409
+ border-radius: 12px;
2410
+ padding: 3px 9px;
2411
+ }
2412
+ .home-open {
2413
+ display: inline-flex;
2414
+ align-items: center;
2415
+ gap: 5px;
2416
+ margin-left: auto;
2417
+ font-size: 12.5px;
2418
+ font-weight: 700;
2419
+ color: var(--accent-ink);
2420
+ }
2421
+ .home-saved {
2422
+ margin-top: 34px;
2423
+ }
2424
+ .home-saved h2 {
2425
+ font-size: 15px;
2426
+ margin-bottom: 10px;
2427
+ }
2428
+ .home-row {
2429
+ display: flex;
2430
+ align-items: center;
2431
+ gap: 10px;
2432
+ background: var(--panel);
2433
+ border: 1px solid var(--line);
2434
+ border-radius: var(--radius-lg);
2435
+ padding: 8px 12px;
2436
+ margin-bottom: 8px;
2437
+ }
2438
+ .home-row-main {
2439
+ display: flex;
2440
+ align-items: center;
2441
+ gap: 12px;
2442
+ flex: 1;
2443
+ text-align: left;
2444
+ padding: 4px;
2445
+ min-width: 0;
2446
+ }
2447
+ .home-row-main > span:last-child {
2448
+ font-weight: 600;
2449
+ font-size: 13.5px;
2450
+ }
2451
+ .home-row-main small {
2452
+ display: block;
2453
+ font-weight: 400;
2454
+ font-size: 11.5px;
2455
+ color: var(--ink-faint);
2456
+ }
2457
+ .home-row-icon {
2458
+ display: flex;
2459
+ align-items: center;
2460
+ justify-content: center;
2461
+ width: 36px;
2462
+ height: 36px;
2463
+ border-radius: 10px;
2464
+ background: var(--accent-soft);
2465
+ color: var(--accent-ink);
2466
+ flex: none;
2467
+ }
2468
+ .home-footnote {
2469
+ margin-top: 26px;
2470
+ font-size: 12px;
2471
+ color: var(--ink-faint);
2472
+ }
2473
+
2474
+ /* ---------- responsive ---------- */
2475
+ @media (max-width: 1180px) {
2476
+ .sidebar {
2477
+ width: 252px;
2478
+ }
2479
+ .inspector,
2480
+ .alignment-panel {
2481
+ width: 288px;
2482
+ }
2483
+ }
2484
+ @media (max-width: 960px) {
2485
+ .sidebar {
2486
+ display: none;
2487
+ }
2488
+ .mode-switch button {
2489
+ padding: 7px 10px;
2490
+ }
2491
+ .home-hero h1 {
2492
+ font-size: 30px;
2493
+ }
2494
+ }
2495
+
2496
+ /* ---------- cozy display type & fullscreen ---------- */
2497
+ .home-hero h1,
2498
+ .object-title h2,
2499
+ .overview-hero h2,
2500
+ .modal h2,
2501
+ .site-card h1,
2502
+ .panel-heading h2 {
2503
+ font-family: var(--font-display);
2504
+ font-weight: 700;
2505
+ letter-spacing: -0.02em;
2506
+ }
2507
+ .app-shell.fullscreen .app-header,
2508
+ .app-shell.fullscreen .sidebar,
2509
+ .app-shell.fullscreen .inspector,
2510
+ .app-shell.fullscreen .canvas-header,
2511
+ .app-shell.fullscreen .canvas-statusbar {
2512
+ display: none;
2513
+ }
2514
+
2515
+ /* ---------- dark mode ---------- */
2516
+ .dark {
2517
+ --bg: #14161f;
2518
+ --panel: #1c1f2b;
2519
+ --panel-soft: #222634;
2520
+ --ink: #e8eaf2;
2521
+ --ink-soft: #a7abbd;
2522
+ --ink-faint: #767b8f;
2523
+ --line: #2c3040;
2524
+ --line-strong: #3a3f52;
2525
+ --accent: #7d75f2;
2526
+ --accent-ink: #9d97f5;
2527
+ --accent-soft: #2a2b45;
2528
+ --accent-selection: #4a4680;
2529
+ --ok: #3dbb84;
2530
+ --alarm: #e0625d;
2531
+ --alarm-soft: #3a2426;
2532
+ --warning: #dfa64f;
2533
+ --warning-soft: #38301e;
2534
+ --unknown: #767b8f;
2535
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
2536
+ --shadow-md: 0 4px 16px rgba(0, 0, 0, 0.4);
2537
+ --shadow-lg: 0 12px 40px rgba(0, 0, 0, 0.55);
2538
+ }
2539
+ .dark .canvas-body {
2540
+ background: #14161f;
2541
+ }
2542
+ .dark .home {
2543
+ background: linear-gradient(180deg, #171923 0%, var(--bg) 340px);
2544
+ }
2545
+ .dark .icon-button:hover {
2546
+ background: rgba(255, 255, 255, 0.08);
2547
+ }
2548
+ .dark .field input:focus,
2549
+ .dark .field select:focus,
2550
+ .dark .input-wrap input:focus {
2551
+ background: var(--panel-soft);
2552
+ }
2553
+ .dark .toggle::after {
2554
+ background: #cfd3e0;
2555
+ }
2556
+ .dark .view-switch button.active,
2557
+ .dark .stack-button.active {
2558
+ background: var(--accent);
2559
+ color: #fff;
2560
+ }
2561
+ .dark .tool-instruction {
2562
+ background: #2a2e3d;
2563
+ color: #d7dae6;
2564
+ }
2565
+ .dark .map-legend,
2566
+ .dark .dock-caption {
2567
+ background: rgba(28, 31, 43, 0.88);
2568
+ color: var(--ink-soft);
2569
+ }
2570
+ .dark .map-scale {
2571
+ background: rgba(28, 31, 43, 0.85);
2572
+ color: var(--ink-soft);
2573
+ }
2574
+ .dark .map-scale > span {
2575
+ border-color: #8a90a4;
2576
+ }
2577
+ /* A room label stands on the room's own floor, and a floor plate is pale in both themes — so the
2578
+ label keeps its dark ink in dark mode. Inverting it with the rest of the chrome put white text on
2579
+ a white floor. Only the outdoor labels, which sit on the basemap, follow the theme. */
2580
+ .dark .space-label.outdoor {
2581
+ color: #ccd2e6;
2582
+ --label-halo: rgba(8, 10, 16, 0.92);
2583
+ text-shadow:
2584
+ 1px 0 0 var(--label-halo),
2585
+ -1px 0 0 var(--label-halo),
2586
+ 0 1px 0 var(--label-halo),
2587
+ 0 -1px 0 var(--label-halo);
2588
+ }
2589
+ .dark .vertex-handle {
2590
+ background: var(--panel);
2591
+ }
2592
+ .dark .mini-marker {
2593
+ border-color: var(--panel);
2594
+ }
2595
+ .dark .marker-tooltip {
2596
+ background: #2b2f42;
2597
+ color: #eef0f7;
2598
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.55);
2599
+ }
2600
+ .dark .entity-marker {
2601
+ border-color: var(--line-strong);
2602
+ }
2603
+ .dark .entity-marker.selected,
2604
+ .dark .entity-marker.critical {
2605
+ border-color: transparent;
2606
+ }
2607
+ .dark .floor-item.active .floor-number {
2608
+ background: var(--panel);
2609
+ color: var(--accent-ink);
2610
+ }
2611
+ .dark .map-loading,
2612
+ .dark .renderer-loading {
2613
+ background: var(--bg);
2614
+ }
2615
+ .dark .modal::backdrop {
2616
+ background: rgba(0, 0, 0, 0.6);
2617
+ }
2618
+ .dark .brand-mark,
2619
+ .dark .home-card-icon:not(.plain) {
2620
+ background: linear-gradient(135deg, #7d75f2 0%, #4a43c4 100%);
2621
+ }
2622
+
2623
+ /* ---- viewer sample app (sample integration code) ---- */
2624
+ .viewer-object h2 {
2625
+ font-family: var(--font-display);
2626
+ font-weight: 700;
2627
+ letter-spacing: -0.02em;
2628
+ font-size: 16.5px;
2629
+ margin-bottom: 2px;
2630
+ }
2631
+ .viewer-object .object-kind {
2632
+ font-size: 11.5px;
2633
+ color: var(--ink-faint);
2634
+ text-transform: capitalize;
2635
+ margin-bottom: 14px;
2636
+ }
2637
+
2638
+ .viewer-workspace {
2639
+ display: flex;
2640
+ flex-direction: column;
2641
+ overflow: hidden;
2642
+ background: var(--panel);
2643
+ color: var(--ink);
2644
+ }
2645
+ .viewer-toolbar {
2646
+ display: flex;
2647
+ align-items: center;
2648
+ flex-wrap: wrap;
2649
+ gap: 8px;
2650
+ padding: 8px 12px;
2651
+ border-bottom: 1px solid var(--line);
2652
+ z-index: 8;
2653
+ }
2654
+ .viewer-toolbar .floor-chip {
2655
+ max-width: min(340px, 80vw);
2656
+ }
2657
+ .viewer-toolbar-actions {
2658
+ display: flex;
2659
+ align-items: center;
2660
+ gap: 4px;
2661
+ margin-left: auto;
2662
+ }
2663
+ .viewer-content {
2664
+ display: flex;
2665
+ flex: 1;
2666
+ min-height: 0;
2667
+ min-width: 0;
2668
+ position: relative;
2669
+ }
2670
+ .viewer-map {
2671
+ position: relative;
2672
+ flex: 1;
2673
+ min-width: 0;
2674
+ min-height: 0;
2675
+ }
2676
+ .viewer-panel {
2677
+ position: relative;
2678
+ display: flex;
2679
+ width: 310px;
2680
+ flex: none;
2681
+ min-height: 0;
2682
+ border-left: 1px solid var(--line);
2683
+ background: var(--panel);
2684
+ }
2685
+ .viewer-panel > .inspector,
2686
+ .viewer-panel > .structure-panel {
2687
+ width: 100%;
2688
+ min-width: 0;
2689
+ }
2690
+ .viewer-close-panel {
2691
+ position: absolute;
2692
+ right: 6px;
2693
+ top: 2px;
2694
+ z-index: 1;
2695
+ }
2696
+ .viewer-panel .structure-heading {
2697
+ padding-right: 40px;
2698
+ }
2699
+ .viewer-display-options {
2700
+ position: relative;
2701
+ }
2702
+ .viewer-display-options > summary {
2703
+ display: flex;
2704
+ padding: 10px;
2705
+ cursor: pointer;
2706
+ border-radius: 8px;
2707
+ }
2708
+ .viewer-display-options > summary::-webkit-details-marker {
2709
+ display: none;
2710
+ }
2711
+ .viewer-display-options > div {
2712
+ position: absolute;
2713
+ right: 0;
2714
+ top: 100%;
2715
+ width: 225px;
2716
+ padding: 12px;
2717
+ border: 1px solid var(--line);
2718
+ border-radius: 10px;
2719
+ background: var(--panel);
2720
+ box-shadow: var(--shadow);
2721
+ }
2722
+ .viewer-display-options label {
2723
+ display: flex;
2724
+ align-items: center;
2725
+ gap: 8px;
2726
+ padding: 5px 0;
2727
+ font-size: 12px;
2728
+ }
2729
+ @media (max-width: 840px) {
2730
+ .viewer-panel {
2731
+ position: absolute;
2732
+ inset: 0 0 0 auto;
2733
+ max-width: 88%;
2734
+ z-index: 7;
2735
+ }
2736
+ }
2737
+ .viewer-status {
2738
+ display: flex;
2739
+ align-items: center;
2740
+ gap: 9px;
2741
+ padding: 10px 12px;
2742
+ border: 1px solid var(--line);
2743
+ border-radius: var(--radius);
2744
+ background: var(--panel-soft);
2745
+ font-size: 13px;
2746
+ font-weight: 600;
2747
+ }
2748
+
2749
+ /* Camera hover peek: a synthetic CCTV frame in place of the plain name tooltip. */
2750
+ .marker-tooltip.flip-y {
2751
+ bottom: auto;
2752
+ top: calc(100% + 7px);
2753
+ }
2754
+ .marker-tooltip.nudge-left {
2755
+ left: auto;
2756
+ right: -6px;
2757
+ transform: none;
2758
+ }
2759
+ .marker-tooltip.nudge-right {
2760
+ left: -6px;
2761
+ transform: none;
2762
+ }
2763
+
2764
+ /* ---------- small screens ---------- */
2765
+ /* The planner is desktop-first; on phones the map goes full-bleed, panels become slide-over
2766
+ sheets, chrome compresses to icons, and touch targets grow. */
2767
+ @media (max-width: 840px) {
2768
+ .app-header {
2769
+ height: 52px;
2770
+ padding: 0 10px;
2771
+ gap: 8px;
2772
+ }
2773
+ .app-header .brand-product,
2774
+ .app-header .brand-divider,
2775
+ .save-status,
2776
+ .avatar,
2777
+ .help-button {
2778
+ display: none;
2779
+ }
2780
+ .mode-switch {
2781
+ margin: 0 auto;
2782
+ }
2783
+ .mode-switch button {
2784
+ padding: 7px 10px;
2785
+ }
2786
+ .mode-switch .mode-label {
2787
+ display: none;
2788
+ }
2789
+ .sidebar,
2790
+ .inspector {
2791
+ position: fixed;
2792
+ top: 52px;
2793
+ bottom: 0;
2794
+ z-index: 60;
2795
+ box-shadow: var(--shadow-lg);
2796
+ }
2797
+ .sidebar {
2798
+ left: 0;
2799
+ width: min(85vw, 320px);
2800
+ }
2801
+ .inspector {
2802
+ right: 0;
2803
+ width: min(92vw, 360px);
2804
+ }
2805
+ .canvas-header {
2806
+ padding: 6px 8px;
2807
+ }
2808
+ .canvas-header .breadcrumb > span:first-child {
2809
+ display: none;
2810
+ }
2811
+ .canvas-top-left,
2812
+ .canvas-top-right {
2813
+ gap: 6px;
2814
+ }
2815
+ .floor-chip {
2816
+ padding: 0 8px;
2817
+ height: 36px;
2818
+ max-width: 46vw;
2819
+ }
2820
+ .floor-chip select {
2821
+ font-size: 12.5px;
2822
+ max-width: 34vw;
2823
+ text-overflow: ellipsis;
2824
+ }
2825
+ .view-switch {
2826
+ height: 36px;
2827
+ }
2828
+ .view-switch button {
2829
+ padding: 0 9px;
2830
+ font-size: 12px;
2831
+ }
2832
+ .stack-button {
2833
+ height: 36px;
2834
+ font-size: 12px;
2835
+ }
2836
+ .map-legend,
2837
+ .dock-caption,
2838
+ .key-hint {
2839
+ display: none !important;
2840
+ }
2841
+ .drawing-dock-wrap {
2842
+ bottom: 10px;
2843
+ max-width: calc(100vw - 16px);
2844
+ }
2845
+ .drawing-dock {
2846
+ overflow-x: auto;
2847
+ max-width: calc(100vw - 16px);
2848
+ padding: 5px;
2849
+ }
2850
+ .drawing-dock button {
2851
+ width: 38px;
2852
+ height: 38px;
2853
+ flex: none;
2854
+ }
2855
+ .map-navigator {
2856
+ display: none;
2857
+ }
2858
+ .pitch-control {
2859
+ position: fixed;
2860
+ right: 12px;
2861
+ bottom: 240px;
2862
+ z-index: 40;
2863
+ }
2864
+ .home-grid {
2865
+ grid-template-columns: 1fr;
2866
+ }
2867
+ .home-hero h1 {
2868
+ font-size: 34px;
2869
+ }
2870
+ .home-main {
2871
+ padding: 22px 16px 40px;
2872
+ }
2873
+ .modal {
2874
+ width: min(94vw, 560px);
2875
+ }
2876
+ }
2877
+ @media (pointer: coarse) {
2878
+ .vertex-handle {
2879
+ width: 22px;
2880
+ height: 22px;
2881
+ }
2882
+ .move-handle {
2883
+ width: 30px;
2884
+ height: 30px;
2885
+ }
2886
+ .entity-marker {
2887
+ min-width: 34px;
2888
+ min-height: 34px;
2889
+ }
2890
+ }
2891
+
2892
+ /* On-map floor stepper: the always-available way to walk levels, sized for touch on mobile. */
2893
+ .floor-step {
2894
+ position: absolute;
2895
+ right: 14px;
2896
+ bottom: 46px;
2897
+ z-index: 26;
2898
+ display: flex;
2899
+ flex-direction: column;
2900
+ align-items: stretch;
2901
+ background: var(--panel);
2902
+ border-radius: var(--radius);
2903
+ box-shadow: var(--shadow-md);
2904
+ overflow: hidden;
2905
+ width: 44px;
2906
+ }
2907
+ .floor-step button {
2908
+ display: flex;
2909
+ flex-direction: column;
2910
+ align-items: center;
2911
+ justify-content: center;
2912
+ gap: 2px;
2913
+ padding: 14px 0 12px;
2914
+ color: var(--ink-soft);
2915
+ }
2916
+ .floor-step button b {
2917
+ font-size: 11px;
2918
+ line-height: 1.1;
2919
+ font-weight: 700;
2920
+ letter-spacing: 0.02em;
2921
+ }
2922
+ .floor-step button:hover:not(:disabled) {
2923
+ background: var(--panel-soft);
2924
+ color: var(--ink);
2925
+ }
2926
+ .floor-step-current {
2927
+ text-align: center;
2928
+ font-size: 13px;
2929
+ font-weight: 800;
2930
+ color: var(--accent-ink);
2931
+ background: var(--accent-soft);
2932
+ padding: 8px 0;
2933
+ }
2934
+ /* Mobile: a thumb-sized navigator fixed bottom-right, above the status bar. */
2935
+ @media (max-width: 840px) {
2936
+ .floor-step {
2937
+ position: fixed;
2938
+ right: 10px;
2939
+ bottom: 64px;
2940
+ width: 54px;
2941
+ z-index: 40;
2942
+ border-radius: 14px;
2943
+ box-shadow: var(--shadow-lg);
2944
+ }
2945
+ .sidebar {
2946
+ animation: slide-in-left 0.22s ease;
2947
+ }
2948
+ .inspector {
2949
+ animation: slide-in-right 0.22s ease;
2950
+ }
2951
+ }
2952
+
2953
+ @keyframes slide-in-left {
2954
+ from {
2955
+ transform: translateX(-100%);
2956
+ }
2957
+ }
2958
+ @keyframes slide-in-right {
2959
+ from {
2960
+ transform: translateX(100%);
2961
+ }
2962
+ }
2963
+
2964
+ /* Door control panel: colour-coded commands (green open, amber unlock, indigo lock, red block). */
2965
+ .door-controls {
2966
+ display: grid;
2967
+ grid-template-columns: 1fr 1fr;
2968
+ gap: 8px;
2969
+ margin-top: 4px;
2970
+ }
2971
+ .door-btn {
2972
+ display: flex;
2973
+ align-items: center;
2974
+ justify-content: center;
2975
+ gap: 6px;
2976
+ padding: 10px 8px;
2977
+ border-radius: 9px;
2978
+ font-size: 12.5px;
2979
+ font-weight: 700;
2980
+ border: 1.5px solid transparent;
2981
+ transition: filter 0.12s;
2982
+ }
2983
+ .door-btn:hover {
2984
+ filter: brightness(0.96);
2985
+ }
2986
+ .door-btn.active {
2987
+ border-color: currentColor;
2988
+ }
2989
+ .door-btn.open {
2990
+ background: #e2f3e9;
2991
+ color: #1d7a4f;
2992
+ }
2993
+ .door-btn.unlock {
2994
+ background: var(--warning-soft);
2995
+ color: #8a5a10;
2996
+ }
2997
+ .door-btn.lock {
2998
+ background: var(--accent-soft);
2999
+ color: var(--accent-ink);
3000
+ }
3001
+ .door-btn.block {
3002
+ background: var(--alarm-soft);
3003
+ color: #b03530;
3004
+ }
3005
+ .dark .door-btn.open {
3006
+ background: rgba(46, 158, 107, 0.16);
3007
+ color: #6fcf9f;
3008
+ }
3009
+ .dark .door-btn.unlock {
3010
+ background: rgba(227, 157, 59, 0.15);
3011
+ color: #e8b86a;
3012
+ }
3013
+ .dark .door-btn.lock {
3014
+ background: rgba(98, 89, 232, 0.18);
3015
+ color: #a7a0f2;
3016
+ }
3017
+ .dark .door-btn.block {
3018
+ background: rgba(224, 82, 78, 0.15);
3019
+ color: #ec8a87;
3020
+ }
3021
+
3022
+ /* ---------- navigate panel (route directions & journey playback) ---------- */
3023
+ .navigate-panel .inspector-scroll {
3024
+ padding-top: 12px;
3025
+ }
3026
+ .nav-endpoints {
3027
+ display: flex;
3028
+ align-items: flex-start;
3029
+ gap: 8px;
3030
+ }
3031
+ .nav-endpoint-fields {
3032
+ flex: 1;
3033
+ min-width: 0;
3034
+ }
3035
+ .nav-endpoint-fields .field {
3036
+ margin: 6px 0;
3037
+ }
3038
+ .nav-endpoint-actions {
3039
+ display: flex;
3040
+ flex-direction: column;
3041
+ align-items: center;
3042
+ gap: 4px;
3043
+ padding-top: 26px;
3044
+ }
3045
+ .nav-endpoint-actions .text-button {
3046
+ font-size: 11px;
3047
+ padding: 2px 0;
3048
+ }
3049
+ .nav-summary {
3050
+ display: grid;
3051
+ grid-template-columns: 1fr 1fr 1fr;
3052
+ gap: 8px;
3053
+ margin: 12px 0;
3054
+ }
3055
+ .nav-summary > div {
3056
+ background: var(--panel-soft);
3057
+ border: 1px solid var(--line);
3058
+ border-radius: 9px;
3059
+ padding: 8px 10px;
3060
+ text-align: center;
3061
+ }
3062
+ .nav-summary strong {
3063
+ display: block;
3064
+ font-size: 15px;
3065
+ letter-spacing: -0.01em;
3066
+ color: var(--accent-ink);
3067
+ }
3068
+ .nav-summary span {
3069
+ font-size: 10.5px;
3070
+ font-weight: 600;
3071
+ color: var(--ink-faint);
3072
+ text-transform: uppercase;
3073
+ letter-spacing: 0.04em;
3074
+ }
3075
+ .nav-steps {
3076
+ list-style: none;
3077
+ margin: 0;
3078
+ padding: 0;
3079
+ border-top: 1px solid var(--line);
3080
+ }
3081
+ .nav-steps li + li {
3082
+ border-top: 1px dashed var(--line);
3083
+ }
3084
+ .nav-step {
3085
+ display: flex;
3086
+ align-items: center;
3087
+ gap: 10px;
3088
+ width: 100%;
3089
+ padding: 9px 6px;
3090
+ border-radius: 9px;
3091
+ text-align: left;
3092
+ color: var(--ink-soft);
3093
+ }
3094
+ .nav-step:hover {
3095
+ background: var(--panel-soft);
3096
+ color: var(--ink);
3097
+ }
3098
+ .nav-step.active {
3099
+ background: var(--accent-soft);
3100
+ color: var(--accent-ink);
3101
+ }
3102
+ .nav-step svg {
3103
+ flex: none;
3104
+ color: var(--ink-faint);
3105
+ }
3106
+ .nav-step.active svg {
3107
+ color: var(--accent-ink);
3108
+ }
3109
+ .nav-step-num {
3110
+ display: inline-flex;
3111
+ align-items: center;
3112
+ justify-content: center;
3113
+ width: 22px;
3114
+ height: 22px;
3115
+ border-radius: 50%;
3116
+ background: var(--panel-soft);
3117
+ border: 1px solid var(--line-strong);
3118
+ font-size: 10.5px;
3119
+ font-weight: 700;
3120
+ color: var(--ink-soft);
3121
+ flex: none;
3122
+ }
3123
+ .nav-step.active .nav-step-num {
3124
+ background: var(--accent);
3125
+ border-color: var(--accent);
3126
+ color: #fff;
3127
+ }
3128
+ .nav-step-text {
3129
+ flex: 1;
3130
+ min-width: 0;
3131
+ font-size: 12.5px;
3132
+ font-weight: 600;
3133
+ line-height: 1.3;
3134
+ }
3135
+ .nav-step-text small {
3136
+ display: block;
3137
+ font-weight: 400;
3138
+ font-size: 11px;
3139
+ color: var(--ink-faint);
3140
+ }
3141
+ .nav-controls {
3142
+ display: flex;
3143
+ align-items: center;
3144
+ gap: 8px;
3145
+ padding: 12px 18px;
3146
+ border-top: 1px solid var(--line);
3147
+ }
3148
+ .nav-controls .nav-play {
3149
+ flex: 1;
3150
+ }
3151
+ .nav-empty {
3152
+ display: flex;
3153
+ flex-direction: column;
3154
+ align-items: center;
3155
+ gap: 6px;
3156
+ text-align: center;
3157
+ padding: 26px 14px;
3158
+ margin-top: 12px;
3159
+ border: 1.5px dashed var(--line-strong);
3160
+ border-radius: var(--radius-lg);
3161
+ color: var(--accent-ink);
3162
+ }
3163
+ .nav-empty strong {
3164
+ font-size: 13px;
3165
+ color: var(--ink);
3166
+ }
3167
+ .nav-empty p {
3168
+ font-size: 12px;
3169
+ color: var(--ink-faint);
3170
+ line-height: 1.5;
3171
+ }
3172
+ @media (max-width: 840px) {
3173
+ .navigate-panel {
3174
+ position: fixed;
3175
+ top: 52px;
3176
+ bottom: 0;
3177
+ right: 0;
3178
+ width: min(92vw, 360px);
3179
+ z-index: 60;
3180
+ box-shadow: var(--shadow-lg);
3181
+ animation: slide-in-right 0.22s ease;
3182
+ }
3183
+ }
3184
+ .icon-button.active-nav {
3185
+ background: var(--accent-soft);
3186
+ color: var(--accent-ink);
3187
+ }
3188
+
3189
+ /* Navigate panel place pickers: searchable comboboxes for projects with hundreds of places. */
3190
+ .place-picker {
3191
+ position: relative;
3192
+ }
3193
+ .place-input {
3194
+ position: relative;
3195
+ display: flex;
3196
+ align-items: center;
3197
+ }
3198
+ .place-input > svg {
3199
+ position: absolute;
3200
+ left: 9px;
3201
+ color: var(--ink-faint);
3202
+ pointer-events: none;
3203
+ }
3204
+ .place-input input {
3205
+ width: 100%;
3206
+ background: var(--panel-soft);
3207
+ border: 1px solid var(--line-strong);
3208
+ border-radius: 8px;
3209
+ padding: 8px 30px 8px 28px;
3210
+ outline: none;
3211
+ }
3212
+ .place-input input:focus {
3213
+ border-color: var(--accent);
3214
+ background: var(--panel);
3215
+ }
3216
+ .place-clear {
3217
+ position: absolute;
3218
+ right: 3px;
3219
+ width: 24px;
3220
+ height: 24px;
3221
+ }
3222
+ .place-options {
3223
+ position: absolute;
3224
+ top: 100%;
3225
+ left: 0;
3226
+ right: 0;
3227
+ z-index: 45;
3228
+ background: var(--panel);
3229
+ border: 1px solid var(--line-strong);
3230
+ border-radius: 10px;
3231
+ box-shadow: var(--shadow-lg);
3232
+ max-height: 296px;
3233
+ overflow: auto;
3234
+ margin-top: 4px;
3235
+ }
3236
+ .place-option {
3237
+ display: flex;
3238
+ gap: 9px;
3239
+ align-items: center;
3240
+ width: 100%;
3241
+ padding: 8px 10px;
3242
+ text-align: left;
3243
+ font-size: 13px;
3244
+ font-weight: 500;
3245
+ }
3246
+ .place-option span {
3247
+ min-width: 0;
3248
+ }
3249
+ .place-option small {
3250
+ display: block;
3251
+ color: var(--ink-faint);
3252
+ font-size: 11px;
3253
+ font-weight: 400;
3254
+ }
3255
+ .place-option.cursor {
3256
+ background: var(--accent-soft);
3257
+ }
3258
+ .place-option.chosen {
3259
+ color: var(--accent-ink);
3260
+ }
3261
+ .place-none {
3262
+ padding: 9px 11px;
3263
+ font-size: 12px;
3264
+ color: var(--ink-faint);
3265
+ }
3266
+
3267
+ /* Floor chip: searchable level dropdown (the Silo has a hundred floors). */
3268
+ .floor-select {
3269
+ position: relative;
3270
+ }
3271
+ .floor-select-value {
3272
+ display: flex;
3273
+ align-items: center;
3274
+ gap: 7px;
3275
+ font-weight: 600;
3276
+ font-size: 13.5px;
3277
+ color: var(--accent-ink);
3278
+ max-width: 46vw;
3279
+ }
3280
+ .floor-select-value > span {
3281
+ overflow: hidden;
3282
+ text-overflow: ellipsis;
3283
+ white-space: nowrap;
3284
+ }
3285
+ .floor-select-value b {
3286
+ font-size: 10px;
3287
+ background: var(--accent-soft);
3288
+ border-radius: 5px;
3289
+ padding: 2px 5px;
3290
+ flex: none;
3291
+ }
3292
+ .floor-select-options {
3293
+ position: absolute;
3294
+ top: calc(100% + 12px);
3295
+ left: -42px;
3296
+ width: 300px;
3297
+ max-height: 348px;
3298
+ }
3299
+ .floor-select-options .place-input {
3300
+ position: sticky;
3301
+ top: 0;
3302
+ background: var(--panel);
3303
+ padding: 8px;
3304
+ z-index: 1;
3305
+ }
3306
+ .floor-select-options .place-input > svg {
3307
+ left: 17px;
3308
+ }
3309
+ .floor-select-options .place-option .floor-number {
3310
+ flex: none;
3311
+ }
3312
+
3313
+ /* ——— Structure view: the ontology browsed as a list, with no map involved. */
3314
+ .structure-panel {
3315
+ display: flex;
3316
+ flex-direction: column;
3317
+ min-height: 0;
3318
+ height: 100%;
3319
+ }
3320
+ .structure-heading {
3321
+ display: flex;
3322
+ justify-content: space-between;
3323
+ gap: 12px;
3324
+ padding: 14px 16px 10px;
3325
+ }
3326
+ .structure-heading small {
3327
+ color: var(--ink-soft);
3328
+ overflow: hidden;
3329
+ text-overflow: ellipsis;
3330
+ white-space: nowrap;
3331
+ }
3332
+ .structure-tabs {
3333
+ display: flex;
3334
+ padding: 0 12px;
3335
+ border-bottom: 1px solid var(--line);
3336
+ }
3337
+ .structure-tabs button {
3338
+ flex: 1;
3339
+ padding: 10px 4px;
3340
+ font-size: 12px;
3341
+ color: var(--ink-soft);
3342
+ border-bottom: 2px solid transparent;
3343
+ }
3344
+ .structure-tabs button[aria-selected="true"] {
3345
+ color: var(--accent);
3346
+ border-color: var(--accent);
3347
+ background: var(--accent-selection);
3348
+ }
3349
+ .structure-filters {
3350
+ display: grid;
3351
+ gap: 8px;
3352
+ padding: 12px 16px 0;
3353
+ }
3354
+ .structure-filters input,
3355
+ .structure-filters select,
3356
+ .structure-group-filter select {
3357
+ width: 100%;
3358
+ min-width: 0;
3359
+ padding: 7px 9px;
3360
+ border: 1px solid var(--line);
3361
+ border-radius: 7px;
3362
+ background: var(--panel);
3363
+ color: var(--ink);
3364
+ }
3365
+ .structure-tab-content,
3366
+ .structure-zone-list {
3367
+ display: flex;
3368
+ flex-direction: column;
3369
+ min-height: 0;
3370
+ flex: 1;
3371
+ }
3372
+ .structure-floor {
3373
+ margin: 0 10px 6px;
3374
+ }
3375
+ .structure-floor > summary,
3376
+ .structure-record > summary {
3377
+ cursor: pointer;
3378
+ padding: 9px 6px;
3379
+ font-size: 12px;
3380
+ overflow-wrap: anywhere;
3381
+ }
3382
+ .structure-floor > summary {
3383
+ font-weight: 600;
3384
+ }
3385
+ .structure-floor summary small,
3386
+ .structure-record summary small {
3387
+ display: block;
3388
+ margin: 3px 0 0 16px;
3389
+ font-weight: 400;
3390
+ color: var(--ink-soft);
3391
+ }
3392
+ .structure-record {
3393
+ margin: 0 10px;
3394
+ border-bottom: 1px solid var(--line);
3395
+ }
3396
+ .structure-record.selected > summary,
3397
+ .structure-record .text-button.active {
3398
+ background: var(--accent-selection);
3399
+ color: var(--accent);
3400
+ }
3401
+ .structure-record-body {
3402
+ padding: 4px 10px 12px;
3403
+ font-size: 12px;
3404
+ overflow-wrap: anywhere;
3405
+ }
3406
+ .structure-record-body p {
3407
+ margin: 6px 0;
3408
+ color: var(--ink-soft);
3409
+ }
3410
+ .structure-record-body code {
3411
+ display: block;
3412
+ margin-top: 5px;
3413
+ font-size: 10px;
3414
+ color: var(--ink-soft);
3415
+ white-space: nowrap;
3416
+ overflow: hidden;
3417
+ text-overflow: ellipsis;
3418
+ }
3419
+ .structure-record-body h4 {
3420
+ margin: 12px 0 6px;
3421
+ }
3422
+ .structure-load-more {
3423
+ display: flex;
3424
+ align-items: center;
3425
+ justify-content: space-between;
3426
+ gap: 8px;
3427
+ flex-wrap: wrap;
3428
+ }
3429
+ .structure-connection {
3430
+ display: grid;
3431
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
3432
+ align-items: center;
3433
+ gap: 6px;
3434
+ }
3435
+ .structure-load-more {
3436
+ padding: 10px;
3437
+ font-size: 11px;
3438
+ color: var(--ink-soft);
3439
+ }
3440
+ .structure-group-filter {
3441
+ display: flex;
3442
+ gap: 8px;
3443
+ align-items: center;
3444
+ margin: 10px 16px;
3445
+ font-size: 12px;
3446
+ }
3447
+ .structure-group-filter select {
3448
+ flex: 1;
3449
+ }
3450
+ .structure-edge {
3451
+ display: grid;
3452
+ grid-template-columns: minmax(0, 1fr) 25px;
3453
+ gap: 0 5px;
3454
+ padding: 3px 0;
3455
+ border-top: 1px solid var(--line);
3456
+ }
3457
+ .structure-edge-target {
3458
+ min-width: 0;
3459
+ display: flex;
3460
+ align-items: center;
3461
+ min-height: 25px;
3462
+ font-weight: 500;
3463
+ }
3464
+ .structure-edge-target > span {
3465
+ overflow: hidden;
3466
+ text-overflow: ellipsis;
3467
+ white-space: nowrap;
3468
+ }
3469
+ .structure-edge-meta,
3470
+ .structure-facts {
3471
+ display: flex;
3472
+ align-items: center;
3473
+ flex-wrap: wrap;
3474
+ gap: 0 8px;
3475
+ min-width: 0;
3476
+ color: var(--ink-soft);
3477
+ font-size: 10px;
3478
+ line-height: 1.4;
3479
+ }
3480
+ .structure-edge-meta {
3481
+ grid-column: 1;
3482
+ }
3483
+ .structure-fact {
3484
+ display: inline-flex;
3485
+ align-items: center;
3486
+ gap: 4px;
3487
+ min-width: 0;
3488
+ max-width: 100%;
3489
+ }
3490
+ .structure-edge-meta .structure-locate {
3491
+ width: 22px;
3492
+ height: 22px;
3493
+ }
3494
+ .structure-edge-locate {
3495
+ grid-column: 2;
3496
+ grid-row: 1 / 3;
3497
+ align-self: center;
3498
+ }
3499
+ .structure-scroll > .structure-note {
3500
+ margin: 10px 16px;
3501
+ }
3502
+ .structure-floor-find {
3503
+ margin: 4px 16px 8px;
3504
+ }
3505
+ /* Dense explorer rows: identity, relationship count and location stay on one line. */
3506
+ .structure-heading {
3507
+ padding: 9px 12px 6px;
3508
+ font-size: 13px;
3509
+ }
3510
+ .structure-tabs {
3511
+ padding: 0 6px;
3512
+ }
3513
+ .structure-tabs button {
3514
+ padding: 7px 3px;
3515
+ }
3516
+ .structure-filters {
3517
+ grid-template-columns: minmax(0, 1fr) minmax(100px, 0.8fr);
3518
+ gap: 6px;
3519
+ padding: 8px 10px 0;
3520
+ }
3521
+ .structure-filters input,
3522
+ .structure-filters select {
3523
+ padding: 5px 7px;
3524
+ font-size: 11px;
3525
+ }
3526
+ .structure-panel .structure-summary {
3527
+ padding: 7px 12px;
3528
+ gap: 10px;
3529
+ font-size: 11px;
3530
+ }
3531
+ .structure-floor {
3532
+ margin: 0 5px 3px;
3533
+ }
3534
+ .structure-record {
3535
+ margin: 0 5px;
3536
+ }
3537
+ .structure-floor > summary,
3538
+ .structure-record > summary {
3539
+ display: flex;
3540
+ align-items: center;
3541
+ gap: 5px;
3542
+ padding: 5px;
3543
+ min-height: 29px;
3544
+ }
3545
+ .structure-floor > summary::before,
3546
+ .structure-record > summary::before {
3547
+ content: "›";
3548
+ width: 8px;
3549
+ flex: none;
3550
+ color: var(--ink-soft);
3551
+ }
3552
+ .structure-floor[open] > summary::before,
3553
+ .structure-record[open] > summary::before {
3554
+ transform: rotate(90deg);
3555
+ }
3556
+ .structure-floor > summary::-webkit-details-marker,
3557
+ .structure-record > summary::-webkit-details-marker {
3558
+ display: none;
3559
+ }
3560
+ .structure-row-title {
3561
+ display: flex;
3562
+ align-items: center;
3563
+ gap: 6px;
3564
+ flex: 1;
3565
+ min-width: 0;
3566
+ }
3567
+ .structure-row-title > span {
3568
+ flex: 1;
3569
+ min-width: 0;
3570
+ overflow: hidden;
3571
+ text-overflow: ellipsis;
3572
+ white-space: nowrap;
3573
+ }
3574
+ .structure-row-title > small {
3575
+ display: inline;
3576
+ flex: none;
3577
+ margin: 0;
3578
+ font-size: 10px;
3579
+ white-space: nowrap;
3580
+ }
3581
+ .structure-locate {
3582
+ display: inline-flex;
3583
+ align-items: center;
3584
+ justify-content: center;
3585
+ flex: none;
3586
+ width: 25px;
3587
+ height: 25px;
3588
+ border-radius: 5px;
3589
+ color: var(--ink-soft);
3590
+ }
3591
+ .structure-locate:hover {
3592
+ background: var(--accent-selection);
3593
+ color: var(--accent);
3594
+ }
3595
+ .structure-object-link,
3596
+ .structure-member,
3597
+ .structure-member-title {
3598
+ display: flex;
3599
+ align-items: center;
3600
+ gap: 5px;
3601
+ min-width: 0;
3602
+ }
3603
+ .structure-object-link {
3604
+ display: inline-flex;
3605
+ max-width: 100%;
3606
+ }
3607
+ .structure-object-link > span {
3608
+ min-width: 0;
3609
+ overflow: hidden;
3610
+ text-overflow: ellipsis;
3611
+ white-space: nowrap;
3612
+ }
3613
+ .structure-item {
3614
+ display: flex;
3615
+ align-items: center;
3616
+ justify-content: space-between;
3617
+ gap: 6px;
3618
+ min-height: 25px;
3619
+ width: 100%;
3620
+ }
3621
+ .structure-item > small {
3622
+ flex: none;
3623
+ color: var(--ink-soft);
3624
+ }
3625
+ .structure-member-title {
3626
+ flex: 1;
3627
+ font-size: 11px;
3628
+ }
3629
+ .structure-member-title > span {
3630
+ min-width: 0;
3631
+ overflow: hidden;
3632
+ text-overflow: ellipsis;
3633
+ white-space: nowrap;
3634
+ }
3635
+ .structure-member-title > svg,
3636
+ .structure-member-title > em {
3637
+ flex: none;
3638
+ }
3639
+ .structure-detail .structure-member {
3640
+ min-height: 25px;
3641
+ }
3642
+ .structure-member-title em {
3643
+ margin-left: auto;
3644
+ }
3645
+ .structure-detail .structure-member > .structure-locate {
3646
+ width: 25px;
3647
+ padding: 0;
3648
+ }
3649
+ .structure-record-body {
3650
+ padding: 0 6px 5px 16px;
3651
+ font-size: 11px;
3652
+ line-height: 1.4;
3653
+ }
3654
+ .structure-record-body p {
3655
+ margin: 2px 0;
3656
+ }
3657
+ .structure-record-body > .structure-record {
3658
+ margin: 0;
3659
+ }
3660
+ .structure-record-body h4 {
3661
+ margin: 6px 0 2px;
3662
+ font-size: 11px;
3663
+ }
3664
+ .structure-zone-toolbar {
3665
+ display: flex;
3666
+ align-items: center;
3667
+ padding-right: 8px;
3668
+ }
3669
+ .structure-zone-toolbar .structure-zone-head {
3670
+ flex: 1;
3671
+ min-width: 0;
3672
+ flex-wrap: nowrap;
3673
+ padding: 6px 10px;
3674
+ font-size: 12px;
3675
+ }
3676
+ .structure-zone-head strong {
3677
+ min-width: 0;
3678
+ overflow: hidden;
3679
+ text-overflow: ellipsis;
3680
+ white-space: nowrap;
3681
+ }
3682
+ .structure-zone-toolbar .structure-counts {
3683
+ font-size: 10px;
3684
+ }
3685
+ .structure-zone.open > .structure-zone-toolbar {
3686
+ background: var(--hover);
3687
+ }
3688
+ .structure-panel .structure-group h3 {
3689
+ margin: 9px 12px 4px;
3690
+ font-size: 10px;
3691
+ }
3692
+ .structure-panel .structure-detail {
3693
+ padding: 0 10px 6px 20px;
3694
+ line-height: 1.4;
3695
+ }
3696
+ .structure-panel .structure-detail h4 {
3697
+ margin: 6px 0 2px;
3698
+ letter-spacing: 0.03em;
3699
+ }
3700
+ .structure-detail li button {
3701
+ padding: 3px 5px;
3702
+ font-size: 11.5px;
3703
+ }
3704
+ .structure-panel .structure-group-filter {
3705
+ margin: 6px 12px;
3706
+ font-size: 11px;
3707
+ }
3708
+ .structure-panel .structure-note {
3709
+ font-size: 10.5px;
3710
+ margin-top: 4px;
3711
+ }
3712
+ .structure-panel .text-button {
3713
+ font-size: 11px;
3714
+ }
3715
+ .navigation-graph {
3716
+ display: flex;
3717
+ flex-direction: column;
3718
+ flex: 1;
3719
+ min-width: 0;
3720
+ min-height: 0;
3721
+ background: var(--panel);
3722
+ }
3723
+ .navigation-graph-toolbar,
3724
+ .navigation-graph-search,
3725
+ .navigation-graph-legend {
3726
+ display: flex;
3727
+ align-items: center;
3728
+ flex-wrap: wrap;
3729
+ gap: 10px;
3730
+ padding: 10px 16px;
3731
+ border-bottom: 1px solid var(--line);
3732
+ color: var(--ink);
3733
+ font-size: 12px;
3734
+ }
3735
+ .navigation-graph select,
3736
+ .navigation-graph input[type="search"] {
3737
+ max-width: 280px;
3738
+ min-width: 0;
3739
+ padding: 7px 9px;
3740
+ color: var(--ink);
3741
+ background: var(--panel);
3742
+ border: 1px solid var(--line);
3743
+ border-radius: 6px;
3744
+ }
3745
+ .navigation-graph-toolbar strong {
3746
+ margin-right: auto;
3747
+ }
3748
+ .navigation-graph-toolbar label {
3749
+ display: flex;
3750
+ gap: 6px;
3751
+ align-items: center;
3752
+ }
3753
+ .navigation-graph-stage {
3754
+ position: relative;
3755
+ flex: 1;
3756
+ min-height: 200px;
3757
+ }
3758
+ .navigation-graph canvas {
3759
+ position: absolute;
3760
+ width: 100%;
3761
+ height: 100%;
3762
+ touch-action: none;
3763
+ cursor: grab;
3764
+ }
3765
+ .navigation-graph canvas:active {
3766
+ cursor: grabbing;
3767
+ }
3768
+ .navigation-graph-empty {
3769
+ text-align: center;
3770
+ color: var(--ink-soft);
3771
+ padding: 60px 20px;
3772
+ }
3773
+ .navigation-graph-legend {
3774
+ border-top: 1px solid var(--line);
3775
+ border-bottom: 0;
3776
+ color: var(--ink-soft);
3777
+ }
3778
+ .navigation-graph-legend span {
3779
+ display: inline-flex;
3780
+ gap: 6px;
3781
+ align-items: center;
3782
+ }
3783
+ .navigation-graph-legend i {
3784
+ display: inline-block;
3785
+ width: 16px;
3786
+ height: 3px;
3787
+ }
3788
+ .navigation-graph-help {
3789
+ padding: 0 16px 12px;
3790
+ margin: 0;
3791
+ color: var(--ink-faint);
3792
+ font-size: 11px;
3793
+ }
3794
+ .structure-summary {
3795
+ display: flex;
3796
+ gap: 14px;
3797
+ padding: 10px 16px;
3798
+ border-bottom: 1px solid var(--line);
3799
+ color: var(--ink-soft);
3800
+ font-size: 12px;
3801
+ flex-wrap: wrap;
3802
+ }
3803
+ .structure-summary span {
3804
+ display: inline-flex;
3805
+ align-items: center;
3806
+ gap: 5px;
3807
+ }
3808
+ .structure-scroll {
3809
+ padding: 4px 0 18px;
3810
+ }
3811
+ .structure-group h3 {
3812
+ margin: 14px 16px 6px;
3813
+ font-size: 11px;
3814
+ letter-spacing: 0.08em;
3815
+ text-transform: uppercase;
3816
+ color: var(--ink-soft);
3817
+ }
3818
+ .structure-zone-head {
3819
+ display: flex;
3820
+ align-items: center;
3821
+ gap: 7px;
3822
+ width: 100%;
3823
+ padding: 7px 16px;
3824
+ text-align: left;
3825
+ border-radius: 8px;
3826
+ flex-wrap: wrap;
3827
+ }
3828
+ .structure-zone-head:hover {
3829
+ background: var(--hover);
3830
+ }
3831
+ .structure-zone.open > .structure-zone-head {
3832
+ background: var(--hover);
3833
+ }
3834
+ .structure-counts {
3835
+ margin-left: auto;
3836
+ color: var(--ink-soft);
3837
+ font-size: 11.5px;
3838
+ white-space: nowrap;
3839
+ }
3840
+ .structure-detail {
3841
+ padding: 2px 16px 10px 30px;
3842
+ }
3843
+ .structure-detail h4 {
3844
+ display: flex;
3845
+ align-items: center;
3846
+ gap: 5px;
3847
+ margin: 10px 0 4px;
3848
+ font-size: 11px;
3849
+ letter-spacing: 0.06em;
3850
+ text-transform: uppercase;
3851
+ color: var(--ink-soft);
3852
+ font-weight: 600;
3853
+ }
3854
+ .structure-detail ul {
3855
+ margin: 0;
3856
+ padding: 0;
3857
+ list-style: none;
3858
+ }
3859
+ .structure-detail li button {
3860
+ display: flex;
3861
+ align-items: center;
3862
+ gap: 6px;
3863
+ width: 100%;
3864
+ padding: 4px 8px;
3865
+ border-radius: 6px;
3866
+ text-align: left;
3867
+ font-size: 12.5px;
3868
+ }
3869
+ .structure-detail li button:hover {
3870
+ background: var(--hover);
3871
+ }
3872
+ /* Room names are long and sidebars are narrow. Truncate rather than wrap: a row that grows to three
3873
+ lines loses the scannable left edge that makes a list readable at all. */
3874
+ .structure-detail li button > span {
3875
+ min-width: 0;
3876
+ overflow: hidden;
3877
+ text-overflow: ellipsis;
3878
+ white-space: nowrap;
3879
+ }
3880
+ .structure-detail li button > svg {
3881
+ flex: none;
3882
+ }
3883
+ .structure-detail li button.active {
3884
+ background: var(--accent-selection);
3885
+ color: var(--accent);
3886
+ }
3887
+ .structure-detail li em {
3888
+ margin-left: auto;
3889
+ font-style: normal;
3890
+ color: var(--ink-soft);
3891
+ font-size: 11px;
3892
+ white-space: nowrap;
3893
+ }
3894
+ .structure-from {
3895
+ color: var(--ink-soft);
3896
+ }
3897
+ .structure-note {
3898
+ margin: 8px 0 0;
3899
+ color: var(--ink-soft);
3900
+ font-size: 11.5px;
3901
+ }
3902
+ .structure-empty {
3903
+ display: flex;
3904
+ flex-direction: column;
3905
+ gap: 8px;
3906
+ padding: 28px 22px;
3907
+ color: var(--ink-soft);
3908
+ font-size: 12.5px;
3909
+ }
3910
+ .structure-empty strong {
3911
+ color: var(--ink);
3912
+ font-size: 13.5px;
3913
+ }
3914
+ .structure-empty p {
3915
+ margin: 0;
3916
+ line-height: 1.5;
3917
+ }
3918
+
3919
+ /* Sidebar tab pair: levels, or the structure the ontology describes. */
3920
+ .viewer-tabs {
3921
+ display: flex;
3922
+ gap: 4px;
3923
+ padding: 8px 12px 0;
3924
+ }
3925
+ .viewer-tabs button {
3926
+ flex: 1;
3927
+ padding: 6px 10px;
3928
+ border-radius: 8px;
3929
+ font-size: 12.5px;
3930
+ font-weight: 600;
3931
+ color: var(--ink-soft);
3932
+ }
3933
+ .viewer-tabs button:hover {
3934
+ background: var(--hover);
3935
+ }
3936
+ .viewer-tabs button.active {
3937
+ background: var(--accent-selection);
3938
+ color: var(--accent);
3939
+ }
3940
+
3941
+ .structure-actions {
3942
+ display: flex;
3943
+ gap: 10px;
3944
+ padding: 8px 16px;
3945
+ border-bottom: 1px solid var(--line);
3946
+ }
3947
+ .structure-actions .text-button {
3948
+ display: inline-flex;
3949
+ align-items: center;
3950
+ gap: 5px;
3951
+ font-size: 12px;
3952
+ }
3953
+ .structure-actions .text-button:disabled {
3954
+ opacity: 0.4;
3955
+ }
3956
+ .structure-edit {
3957
+ display: flex;
3958
+ flex-wrap: wrap;
3959
+ align-items: center;
3960
+ gap: 6px;
3961
+ margin: 6px 0 2px;
3962
+ padding-bottom: 8px;
3963
+ border-bottom: 1px dashed var(--line);
3964
+ }
3965
+ .structure-edit input,
3966
+ .structure-edit select {
3967
+ flex: 1 1 120px;
3968
+ min-width: 0;
3969
+ padding: 4px 7px;
3970
+ border: 1px solid var(--line);
3971
+ border-radius: 6px;
3972
+ background: var(--panel);
3973
+ font-size: 12px;
3974
+ }
3975
+ .structure-edit .text-button {
3976
+ font-size: 11.5px;
3977
+ white-space: nowrap;
3978
+ }
3979
+
3980
+ /* A project file dropped anywhere on the home screen opens it — the whole page is the target, so
3981
+ the whole page has to say so while a file is over it. */
3982
+ .home.dropping::after {
3983
+ content: "";
3984
+ position: fixed;
3985
+ inset: 10px;
3986
+ border: 2px dashed var(--accent);
3987
+ border-radius: var(--radius-lg);
3988
+ background: color-mix(in srgb, var(--accent) 7%, transparent);
3989
+ pointer-events: none;
3990
+ z-index: 40;
3991
+ }
3992
+
3993
+ /* Two numbers that belong together — a longitude and its latitude — read as one reading, not two. */
3994
+ .field-row {
3995
+ display: grid;
3996
+ grid-template-columns: 1fr 1fr;
3997
+ gap: 10px;
3998
+ }
3999
+
4000
+ /* The layer census in the CAD import tab: what each layer was read as, and a way to say otherwise. */
4001
+ .layer-picker {
4002
+ border: 1px solid var(--line);
4003
+ border-radius: var(--radius);
4004
+ margin-top: 12px;
4005
+ overflow: hidden;
4006
+ }
4007
+ .layer-picker-head {
4008
+ display: flex;
4009
+ align-items: center;
4010
+ justify-content: space-between;
4011
+ width: 100%;
4012
+ gap: 10px;
4013
+ padding: 10px 12px;
4014
+ background: var(--panel-soft);
4015
+ border: 0;
4016
+ cursor: pointer;
4017
+ font: inherit;
4018
+ color: inherit;
4019
+ text-align: left;
4020
+ }
4021
+ .layer-picker-head span {
4022
+ display: flex;
4023
+ flex-direction: column;
4024
+ gap: 2px;
4025
+ }
4026
+ .layer-picker-head small {
4027
+ color: var(--ink-faint);
4028
+ }
4029
+ .layer-picker-head small.warn {
4030
+ color: var(--warning);
4031
+ }
4032
+ .layer-picker .helper {
4033
+ padding: 0 12px;
4034
+ }
4035
+ .layer-rows {
4036
+ max-height: 260px;
4037
+ overflow-y: auto;
4038
+ padding: 0 12px;
4039
+ }
4040
+ .layer-row {
4041
+ display: grid;
4042
+ grid-template-columns: 1fr auto;
4043
+ gap: 10px;
4044
+ align-items: center;
4045
+ padding: 5px 0;
4046
+ border-bottom: 1px solid var(--line);
4047
+ }
4048
+ .layer-row.assigned .layer-name {
4049
+ color: var(--accent-ink);
4050
+ font-weight: 600;
4051
+ }
4052
+ .layer-name {
4053
+ display: flex;
4054
+ flex-direction: column;
4055
+ min-width: 0;
4056
+ overflow: hidden;
4057
+ text-overflow: ellipsis;
4058
+ white-space: nowrap;
4059
+ }
4060
+ .layer-name small {
4061
+ color: var(--ink-faint);
4062
+ font-size: 11.5px;
4063
+ }
4064
+ .layer-row select {
4065
+ max-width: 150px;
4066
+ }
4067
+ .layer-profiles {
4068
+ display: flex;
4069
+ flex-wrap: wrap;
4070
+ gap: 8px;
4071
+ padding: 10px 12px;
4072
+ border-top: 1px solid var(--line);
4073
+ }
4074
+ .layer-profiles input {
4075
+ flex: 1 1 160px;
4076
+ min-width: 0;
4077
+ }
4078
+
4079
+ /* Site anchor: a bearing you drag and a position you nudge, because nobody adjusts a building by
4080
+ typing degrees of longitude. */
4081
+ .nudge-row {
4082
+ display: flex;
4083
+ align-items: center;
4084
+ gap: 4px;
4085
+ margin-bottom: 10px;
4086
+ }
4087
+ .nudge-row .button {
4088
+ padding: 4px 6px;
4089
+ min-width: 0;
4090
+ }
4091
+ .nudge-value {
4092
+ flex: 1 1 auto;
4093
+ min-width: 56px;
4094
+ text-align: center;
4095
+ }
4096
+ .nudge-pad {
4097
+ display: grid;
4098
+ grid-template-areas: ". up ." "left step right" ". down .";
4099
+ gap: 4px;
4100
+ justify-content: center;
4101
+ align-items: center;
4102
+ margin-bottom: 8px;
4103
+ }
4104
+ .nudge-pad .up {
4105
+ grid-area: up;
4106
+ }
4107
+ .nudge-pad .left {
4108
+ grid-area: left;
4109
+ }
4110
+ .nudge-pad .right {
4111
+ grid-area: right;
4112
+ }
4113
+ .nudge-pad .down {
4114
+ grid-area: down;
4115
+ }
4116
+ .nudge-pad .step {
4117
+ grid-area: step;
4118
+ min-width: 72px;
4119
+ }
4120
+ .anchor-exact summary {
4121
+ cursor: pointer;
4122
+ color: var(--ink-faint);
4123
+ font-size: 12.5px;
4124
+ margin-bottom: 8px;
4125
+ }
4126
+
4127
+ /* The way in to the site anchor. It lives in the properties panel, which is closed by default and
4128
+ shows the site only when nothing is selected — so without a door like this you have to know. */
4129
+ .anchor-entry {
4130
+ display: flex;
4131
+ align-items: center;
4132
+ gap: 10px;
4133
+ width: 100%;
4134
+ padding: 9px 12px;
4135
+ margin-bottom: 6px;
4136
+ border: 1px solid var(--line);
4137
+ border-radius: var(--radius);
4138
+ background: var(--panel-soft);
4139
+ color: var(--ink-soft);
4140
+ font: inherit;
4141
+ text-align: left;
4142
+ cursor: pointer;
4143
+ }
4144
+ .anchor-entry:hover {
4145
+ border-color: var(--accent);
4146
+ color: var(--ink);
4147
+ }
4148
+ .anchor-entry span {
4149
+ display: flex;
4150
+ flex-direction: column;
4151
+ flex: 1;
4152
+ min-width: 0;
4153
+ }
4154
+ .anchor-entry small {
4155
+ color: var(--ink-faint);
4156
+ font-size: 11px;
4157
+ overflow: hidden;
4158
+ text-overflow: ellipsis;
4159
+ }
4160
+
4161
+ /* Turning an object, and aiming a camera. Both stand off in the world rather than on screen, so they
4162
+ follow the thing they belong to through a pan or a zoom. */
4163
+ .rotate-handle,
4164
+ .coverage-handle {
4165
+ /* The overlay layer is pointer-events: none so the map stays draggable through it; every handle
4166
+ on it has to opt back in, as the move handle does. */
4167
+ pointer-events: auto;
4168
+ z-index: 8;
4169
+ position: absolute;
4170
+ width: 15px;
4171
+ height: 15px;
4172
+ margin: -8px 0 0 -8px;
4173
+ padding: 0;
4174
+ border-radius: 50%;
4175
+ border: 2px solid var(--panel);
4176
+ background: var(--accent);
4177
+ box-shadow: var(--shadow-sm);
4178
+ cursor: grab;
4179
+ }
4180
+ .rotate-handle:active,
4181
+ .coverage-handle:active {
4182
+ cursor: grabbing;
4183
+ }
4184
+ .coverage-handle {
4185
+ border-radius: 3px;
4186
+ background: var(--warning);
4187
+ }
4188
+
4189
+ /* The reference viewer's lift controls. Host chrome, like the floor sidebar: the library draws what
4190
+ a reading says, and this is the host's way of producing one. */
4191
+ .lift-panel {
4192
+ position: absolute;
4193
+ top: 14px;
4194
+ right: 14px;
4195
+ z-index: 20;
4196
+ width: 208px;
4197
+ max-height: calc(100% - 28px);
4198
+ overflow-y: auto;
4199
+ padding: 12px;
4200
+ border-radius: var(--radius-lg);
4201
+ border: 1px solid var(--line);
4202
+ background: var(--panel);
4203
+ box-shadow: var(--shadow-md);
4204
+ }
4205
+ .lift-panel h3 {
4206
+ margin: 0 0 10px;
4207
+ font-size: 11px;
4208
+ letter-spacing: 0.08em;
4209
+ text-transform: uppercase;
4210
+ color: var(--ink-faint);
4211
+ }
4212
+ .lift-panel section + section {
4213
+ margin-top: 14px;
4214
+ padding-top: 12px;
4215
+ border-top: 1px solid var(--line);
4216
+ }
4217
+ .lift-panel header {
4218
+ display: flex;
4219
+ justify-content: space-between;
4220
+ align-items: baseline;
4221
+ gap: 8px;
4222
+ margin-bottom: 7px;
4223
+ }
4224
+ .lift-panel header strong {
4225
+ font-size: 13px;
4226
+ }
4227
+ .lift-panel header span {
4228
+ font-size: 11px;
4229
+ color: var(--ink-faint);
4230
+ text-align: right;
4231
+ }
4232
+ .lift-landings {
4233
+ display: flex;
4234
+ flex-direction: column;
4235
+ gap: 3px;
4236
+ }
4237
+ .lift-landings button,
4238
+ .lift-doors {
4239
+ display: flex;
4240
+ align-items: center;
4241
+ gap: 6px;
4242
+ width: 100%;
4243
+ padding: 5px 8px;
4244
+ border-radius: 7px;
4245
+ border: 1px solid transparent;
4246
+ background: transparent;
4247
+ color: var(--ink-soft);
4248
+ font: inherit;
4249
+ font-size: 12px;
4250
+ text-align: left;
4251
+ cursor: pointer;
4252
+ }
4253
+ .lift-landings button:hover,
4254
+ .lift-doors:hover {
4255
+ background: var(--surface-hover, rgba(120, 120, 150, 0.09));
4256
+ }
4257
+ .lift-landings button.active {
4258
+ background: var(--accent-soft, rgba(98, 89, 232, 0.12));
4259
+ color: var(--accent-ink);
4260
+ font-weight: 600;
4261
+ }
4262
+ .lift-doors {
4263
+ margin-top: 8px;
4264
+ justify-content: center;
4265
+ border-color: var(--line);
4266
+ }
4267
+ .lift-doors.active {
4268
+ border-color: var(--accent);
4269
+ color: var(--accent-ink);
4270
+ }
4271
+
4272
+ /* Offered above the route tool's instruction bar when a plan has no graph of its own. */
4273
+ .adopt-graph {
4274
+ position: absolute;
4275
+ bottom: 152px;
4276
+ left: 50%;
4277
+ transform: translateX(-50%);
4278
+ z-index: 21;
4279
+ display: flex;
4280
+ align-items: center;
4281
+ gap: 7px;
4282
+ white-space: nowrap;
4283
+ }
4284
+ /* The person, kept apart from the camera: where the last walk ended, drawn on the plan with the way
4285
+ they were facing. --turn is the facing relative to the map's rotation, set by reposition(). */
4286
+ .avatar-marker {
4287
+ pointer-events: auto;
4288
+ width: 24px;
4289
+ height: 24px;
4290
+ border-radius: 50%;
4291
+ background: var(--accent, #4f46e5);
4292
+ color: #fff;
4293
+ border: 2px solid #fff;
4294
+ box-shadow: var(--shadow-md);
4295
+ display: flex;
4296
+ align-items: center;
4297
+ justify-content: center;
4298
+ z-index: 12;
4299
+ cursor: pointer;
4300
+ }
4301
+ .avatar-marker i {
4302
+ position: absolute;
4303
+ left: 50%;
4304
+ top: 50%;
4305
+ width: 0;
4306
+ height: 0;
4307
+ border-left: 18px solid transparent;
4308
+ border-right: 18px solid transparent;
4309
+ border-bottom: 34px solid rgba(79, 70, 229, 0.28);
4310
+ transform-origin: 50% 100%;
4311
+ transform: translate(-50%, -100%) rotate(var(--turn, 0deg));
4312
+ pointer-events: none;
4313
+ }
4314
+ .avatar-marker:hover {
4315
+ transform: translate(-50%, -50%) scale(1.15);
4316
+ }
4317
+ .map-navigator .pegman {
4318
+ cursor: grab;
4319
+ color: var(--accent, #4f46e5);
4320
+ touch-action: none;
4321
+ }
4322
+ .map-navigator .pegman.lifted {
4323
+ cursor: grabbing;
4324
+ color: var(--ink-soft);
4325
+ }
4326
+ .pegman-ghost {
4327
+ position: absolute;
4328
+ z-index: 30;
4329
+ pointer-events: none;
4330
+ transform: translate(-50%, -100%);
4331
+ color: var(--accent, #4f46e5);
4332
+ filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.35));
4333
+ }
4334
+ /* The place picker's browse mode: levels first, then the places on one. */
4335
+ .place-level,
4336
+ .place-back {
4337
+ display: flex;
4338
+ align-items: center;
4339
+ gap: 9px;
4340
+ width: 100%;
4341
+ padding: 8px 10px;
4342
+ text-align: left;
4343
+ font-size: 13px;
4344
+ font-weight: 500;
4345
+ }
4346
+ .place-level small {
4347
+ margin-left: auto;
4348
+ color: var(--ink-faint);
4349
+ font-weight: 400;
4350
+ }
4351
+ .place-level:hover,
4352
+ .place-back:hover {
4353
+ background: var(--panel-soft);
4354
+ }
4355
+ .place-back {
4356
+ color: var(--ink-soft);
4357
+ border-bottom: 1px solid var(--line);
4358
+ position: sticky;
4359
+ top: 0;
4360
+ background: var(--panel);
4361
+ z-index: 1;
4362
+ }
4363
+ .place-group {
4364
+ padding: 7px 10px 3px;
4365
+ font-size: 10.5px;
4366
+ font-weight: 600;
4367
+ letter-spacing: 0.06em;
4368
+ text-transform: uppercase;
4369
+ color: var(--ink-faint);
4370
+ }
4371
+ .place-option.here {
4372
+ color: var(--accent-ink);
4373
+ border-bottom: 1px solid var(--line);
4374
+ }
4375
+
4376
+ .walk-elevator {
4377
+ position: absolute;
4378
+ right: 14px;
4379
+ top: 142px;
4380
+ width: 270px;
4381
+ max-height: calc(100% - 240px);
4382
+ overflow: auto;
4383
+ z-index: 12;
4384
+ border: 1px solid var(--line);
4385
+ border-radius: 14px;
4386
+ background: var(--panel);
4387
+ color: var(--ink);
4388
+ box-shadow: 0 8px 28px #10162724;
4389
+ font-size: 12px;
4390
+ }
4391
+ .walk-elevator button,
4392
+ .walk-elevator select {
4393
+ font: inherit;
4394
+ }
4395
+ .elevator-toggle {
4396
+ width: 100%;
4397
+ padding: 12px;
4398
+ border: 0;
4399
+ background: transparent;
4400
+ color: inherit;
4401
+ text-align: left;
4402
+ cursor: pointer;
4403
+ }
4404
+ .elevator-toggle span {
4405
+ float: right;
4406
+ }
4407
+ .elevator-body {
4408
+ display: grid;
4409
+ gap: 9px;
4410
+ padding: 0 12px 12px;
4411
+ }
4412
+ .elevator-body p {
4413
+ margin: 0;
4414
+ }
4415
+ .elevator-body button {
4416
+ border: 1px solid var(--line-strong);
4417
+ border-radius: 7px;
4418
+ background: var(--panel-soft);
4419
+ color: inherit;
4420
+ padding: 9px;
4421
+ cursor: pointer;
4422
+ }
4423
+ .elevator-body button:disabled {
4424
+ opacity: 0.45;
4425
+ cursor: default;
4426
+ }
4427
+ .elevator-body button[aria-pressed="true"] {
4428
+ background: var(--accent-soft);
4429
+ color: var(--accent-ink);
4430
+ }
4431
+ .elevator-floors {
4432
+ display: grid;
4433
+ gap: 5px;
4434
+ }
4435
+ .elevator-door-buttons {
4436
+ display: flex;
4437
+ gap: 6px;
4438
+ }
4439
+ .elevator-door-buttons button {
4440
+ flex: 1;
4441
+ }
4442
+
4443
+ .elevator-body small {
4444
+ color: var(--ink-soft);
4445
+ }
4446
+ .elevator-body select {
4447
+ background: var(--panel-soft);
4448
+ color: var(--ink);
4449
+ border: 1px solid var(--line-strong);
4450
+ padding: 8px;
4451
+ border-radius: 7px;
4452
+ }
4453
+ .elevator-body button:focus-visible,
4454
+ .elevator-toggle:focus-visible {
4455
+ outline: 2px solid var(--accent);
4456
+ outline-offset: -3px;
4457
+ }
4458
+
4459
+ /* AI import activity; accepted geometry is displayed on the main map. */
4460
+ .ai-import-inputs {
4461
+ display: grid;
4462
+ grid-template-columns: 1fr 1fr;
4463
+ gap: 16px;
4464
+ }
4465
+ .ai-import-inputs small {
4466
+ color: var(--ink-faint);
4467
+ font-size: 12px;
4468
+ }
4469
+ .ai-import-inputs textarea,
4470
+ .ai-import-composer textarea {
4471
+ width: 100%;
4472
+ resize: vertical;
4473
+ min-height: 70px;
4474
+ }
4475
+ .ai-import-toolbar,
4476
+ .ai-import-pane-heading {
4477
+ display: flex;
4478
+ align-items: center;
4479
+ justify-content: space-between;
4480
+ gap: 12px;
4481
+ }
4482
+ .ai-import-toolbar {
4483
+ margin: 12px 0;
4484
+ font-size: 13px;
4485
+ }
4486
+ .ai-import-conversation {
4487
+ border: 1px solid var(--line);
4488
+ border-radius: 10px;
4489
+ min-width: 0;
4490
+ overflow: hidden;
4491
+ }
4492
+ .ai-import-pane-heading {
4493
+ padding: 10px 12px;
4494
+ font-size: 13px;
4495
+ border-bottom: 1px solid var(--line);
4496
+ min-height: 48px;
4497
+ }
4498
+ .ai-import-chat {
4499
+ height: 330px;
4500
+ overflow: auto;
4501
+ padding: 12px;
4502
+ }
4503
+ .ai-import-empty {
4504
+ padding: 28px 16px;
4505
+ color: var(--ink-faint);
4506
+ font-size: 13px;
4507
+ line-height: 1.6;
4508
+ }
4509
+ .ai-import-message {
4510
+ padding: 10px 12px;
4511
+ margin-bottom: 10px;
4512
+ border-radius: 8px;
4513
+ background: var(--panel);
4514
+ border: 1px solid var(--line);
4515
+ }
4516
+ .ai-import-message small {
4517
+ color: var(--ink-faint);
4518
+ font-size: 11px;
4519
+ }
4520
+ .ai-import-message p {
4521
+ white-space: pre-wrap;
4522
+ overflow-wrap: anywhere;
4523
+ font-size: 13px;
4524
+ line-height: 1.5;
4525
+ margin-top: 4px;
4526
+ }
4527
+ .ai-import-message.tool p {
4528
+ font-family: monospace;
4529
+ font-size: 11px;
4530
+ }
4531
+ .ai-import-panel .helper {
4532
+ margin: 12px 0;
4533
+ }
4534
+ @media (max-width: 720px) {
4535
+ .ai-import-inputs {
4536
+ grid-template-columns: 1fr;
4537
+ }
4538
+ .ai-import-chat {
4539
+ height: 220px;
4540
+ }
4541
+ .import-tabs {
4542
+ overflow-x: auto;
4543
+ }
4544
+ }
4545
+
4546
+ .plan-import-slot {
4547
+ display: flex;
4548
+ flex: none;
4549
+ min-height: 0;
4550
+ }
4551
+ .plan-import-slot[hidden] {
4552
+ display: none;
4553
+ }
4554
+ .plan-import-panel .inspector-top h2 {
4555
+ font-size: 13px;
4556
+ text-transform: none;
4557
+ letter-spacing: 0;
4558
+ }
4559
+ .plan-import-panel > .import-tabs {
4560
+ flex: none;
4561
+ margin: 0;
4562
+ padding: 6px 12px;
4563
+ border-bottom: 1px solid var(--line);
4564
+ }
4565
+ .plan-import-panel > .import-tabs button {
4566
+ padding: 6px 8px;
4567
+ font-size: 12px;
4568
+ }
4569
+ .plan-import-panel .ai-import-inputs {
4570
+ grid-template-columns: 1fr;
4571
+ }
4572
+ .ai-import-shell,
4573
+ .ai-import-organized {
4574
+ display: flex;
4575
+ flex-direction: column;
4576
+ flex: 1;
4577
+ min-height: 0;
4578
+ }
4579
+ .ai-import-sticky {
4580
+ flex: none;
4581
+ padding: 12px;
4582
+ background: var(--panel);
4583
+ max-height: 45%;
4584
+ overflow: auto;
4585
+ }
4586
+ .ai-import-source {
4587
+ display: block;
4588
+ overflow: hidden;
4589
+ text-overflow: ellipsis;
4590
+ white-space: nowrap;
4591
+ font-size: 12px;
4592
+ margin-bottom: 8px;
4593
+ }
4594
+ .ai-import-sticky .ai-import-toolbar {
4595
+ gap: 8px;
4596
+ }
4597
+ .ai-import-sticky .ai-import-toolbar > span {
4598
+ font-size: 11px;
4599
+ line-height: 1.5;
4600
+ }
4601
+ .ai-import-sticky .button {
4602
+ flex: none;
4603
+ padding: 7px 9px;
4604
+ font-size: 11px;
4605
+ }
4606
+ .ai-import-sticky .form-error {
4607
+ max-height: 6rem;
4608
+ overflow: auto;
4609
+ }
4610
+ .ai-import-pause {
4611
+ font-size: 11px;
4612
+ line-height: 1.4;
4613
+ color: var(--ink-soft);
4614
+ margin-top: 8px;
4615
+ }
4616
+ .ai-import-tablist {
4617
+ display: flex;
4618
+ flex: none;
4619
+ border-bottom: 1px solid var(--line);
4620
+ padding: 0 8px;
4621
+ background: var(--panel);
4622
+ }
4623
+ .ai-import-tablist button {
4624
+ flex: 1;
4625
+ padding: 10px 2px;
4626
+ color: var(--ink-soft);
4627
+ border-bottom: 2px solid transparent;
4628
+ font-size: 12px;
4629
+ }
4630
+ .ai-import-tablist button[aria-selected="true"] {
4631
+ color: var(--accent);
4632
+ border-bottom-color: var(--accent);
4633
+ font-weight: 650;
4634
+ }
4635
+ .ai-import-tablist i {
4636
+ display: inline-block;
4637
+ width: 5px;
4638
+ height: 5px;
4639
+ border-radius: 50%;
4640
+ background: var(--accent);
4641
+ margin-left: 4px;
4642
+ }
4643
+ .ai-import-tab-scroll {
4644
+ overflow-y: auto;
4645
+ flex: 1;
4646
+ min-height: 0;
4647
+ padding: 12px;
4648
+ }
4649
+ .ai-import-tab-scroll[hidden] {
4650
+ display: none;
4651
+ }
4652
+ .ai-import-tab-scroll .ai-import-conversation {
4653
+ border: 0;
4654
+ }
4655
+ .ai-import-tab-scroll .ai-import-message {
4656
+ padding: 10px;
4657
+ }
4658
+ .icon-button[data-import-running] {
4659
+ position: relative;
4660
+ }
4661
+ .icon-button[data-import-running]::after {
4662
+ content: "";
4663
+ position: absolute;
4664
+ top: 2px;
4665
+ right: 2px;
4666
+ width: 6px;
4667
+ height: 6px;
4668
+ border-radius: 50%;
4669
+ background: var(--accent);
4670
+ }
4671
+
4672
+ .ai-import-activity {
4673
+ font-size: 12px;
4674
+ color: var(--ink-faint);
4675
+ margin: 8px 0;
4676
+ }
4677
+ .ai-import-usage {
4678
+ padding: 12px;
4679
+ margin-bottom: 12px;
4680
+ border: 1px solid var(--line);
4681
+ border-radius: 8px;
4682
+ font-size: 12px;
4683
+ }
4684
+ .ai-import-usage dl {
4685
+ display: grid;
4686
+ grid-template-columns: repeat(2, minmax(0, 1fr));
4687
+ gap: 8px 16px;
4688
+ margin: 10px 0;
4689
+ }
4690
+ .ai-import-usage dl > div {
4691
+ display: flex;
4692
+ justify-content: space-between;
4693
+ gap: 8px;
4694
+ }
4695
+ .ai-import-usage dd {
4696
+ margin: 0;
4697
+ font-variant-numeric: tabular-nums;
4698
+ }
4699
+ .ai-import-usage small {
4700
+ color: var(--ink-faint);
4701
+ }
4702
+ .ai-import-followup {
4703
+ padding: 10px;
4704
+ margin-bottom: 12px;
4705
+ border: 1px solid var(--line);
4706
+ border-radius: 8px;
4707
+ }
4708
+ .ai-import-followup textarea {
4709
+ width: 100%;
4710
+ }
4711
+ .ai-import-followup .button {
4712
+ margin-top: 8px;
4713
+ }
4714
+
4715
+ .ai-import-scale {
4716
+ border: 1px solid var(--line);
4717
+ border-radius: 8px;
4718
+ padding: 10px 12px;
4719
+ margin: 12px 0;
4720
+ min-width: 0;
4721
+ }
4722
+ .ai-import-scale legend {
4723
+ font-size: 12px;
4724
+ font-weight: 600;
4725
+ padding: 0 4px;
4726
+ }
4727
+ .ai-import-scale small {
4728
+ display: block;
4729
+ color: var(--ink-faint);
4730
+ font-size: 11px;
4731
+ line-height: 1.5;
4732
+ margin-top: 8px;
4733
+ }
4734
+ .ai-import-scale .field-grid {
4735
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
4736
+ }
4737
+
4738
+ .ai-analysis-preview {
4739
+ padding: 0.85rem;
4740
+ border: 1px solid var(--line);
4741
+ border-radius: 12px;
4742
+ margin-block: 0.75rem;
4743
+ }
4744
+ .ai-analysis-preview > summary {
4745
+ cursor: pointer;
4746
+ font-weight: 650;
4747
+ }
4748
+ .ai-analysis-layers,
4749
+ .ai-analysis-toolbar {
4750
+ display: flex;
4751
+ gap: 0.65rem;
4752
+ flex-wrap: wrap;
4753
+ align-items: center;
4754
+ margin-block: 0.65rem;
4755
+ font-size: 0.8rem;
4756
+ }
4757
+ .ai-analysis-layers label,
4758
+ .ai-analysis-toolbar label {
4759
+ display: inline-flex;
4760
+ align-items: center;
4761
+ gap: 0.25rem;
4762
+ }
4763
+ .ai-analysis-layers input {
4764
+ accent-color: #2563eb;
4765
+ }
4766
+ .ai-analysis-toolbar input {
4767
+ width: 6rem;
4768
+ }
4769
+ .ai-analysis-toolbar .button {
4770
+ padding: 0.25rem 0.55rem;
4771
+ min-height: 1.8rem;
4772
+ }
4773
+ .ai-analysis-canvas {
4774
+ max-height: 24rem;
4775
+ min-height: 10rem;
4776
+ overflow: auto;
4777
+ background: #fff;
4778
+ border: 1px solid var(--line);
4779
+ border-radius: 6px;
4780
+ }
4781
+ .ai-analysis-canvas img {
4782
+ display: block;
4783
+ max-width: none;
4784
+ height: auto;
4785
+ padding: 8px;
4786
+ }
4787
+ .ai-analysis-preview .helper,
4788
+ .ai-analysis-preview li {
4789
+ font-size: 0.75rem;
4790
+ line-height: 1.4;
4791
+ }
4792
+ .ai-import-budget {
4793
+ margin-block: 0.75rem;
4794
+ }
4795
+ .ai-import-budget summary {
4796
+ cursor: pointer;
4797
+ font-size: 0.85rem;
4798
+ }
4799
+
4800
+ .ai-import-activity-panel {
4801
+ display: flex;
4802
+ flex-direction: column;
4803
+ flex: 1;
4804
+ min-height: 0;
4805
+ }
4806
+ .ai-import-activity-panel[hidden] {
4807
+ display: none;
4808
+ }
4809
+ .ai-import-composer {
4810
+ flex: none;
4811
+ padding: 10px 12px;
4812
+ border-top: 1px solid var(--line);
4813
+ background: var(--panel);
4814
+ }
4815
+ .ai-import-composer .field {
4816
+ margin: 0 0 8px;
4817
+ }
4818
+ .ai-import-composer textarea {
4819
+ min-height: 58px;
4820
+ max-height: 140px;
4821
+ resize: vertical;
4822
+ font-size: 12px;
4823
+ }
4824
+ .ai-import-composer > div {
4825
+ display: flex;
4826
+ align-items: center;
4827
+ gap: 8px;
4828
+ }
4829
+ .ai-import-composer small {
4830
+ flex: 1;
4831
+ font-size: 10px;
4832
+ color: var(--ink-faint);
4833
+ line-height: 1.4;
4834
+ }
4835
+ .ai-import-composer .button {
4836
+ flex: none;
4837
+ padding: 7px 9px;
4838
+ font-size: 11px;
4839
+ }
4840
+
4841
+ .modal.fullscreen {
4842
+ width: 100vw;
4843
+ max-width: 100vw;
4844
+ height: 100dvh;
4845
+ max-height: 100dvh;
4846
+ margin: 0;
4847
+ border-radius: 0;
4848
+ padding: 18px;
4849
+ overflow: hidden;
4850
+ }
4851
+ .modal.fullscreen[open] {
4852
+ display: flex;
4853
+ flex-direction: column;
4854
+ }
4855
+ .modal.fullscreen > header {
4856
+ flex: none;
4857
+ }
4858
+ .ai-analysis-preview[hidden] {
4859
+ display: none;
4860
+ }
4861
+ .ai-analysis-fullscreen {
4862
+ display: flex;
4863
+ flex-direction: column;
4864
+ flex: 1;
4865
+ min-height: 0;
4866
+ }
4867
+ .ai-analysis-fullscreen .ai-analysis-canvas {
4868
+ flex: 1;
4869
+ min-height: 0;
4870
+ max-height: none;
4871
+ }
4872
+ .ai-analysis-fullscreen .ai-analysis-canvas img {
4873
+ margin-inline: auto;
4874
+ }
4875
+ .ai-analysis-fullscreen .helper {
4876
+ font-size: 12px;
4877
+ line-height: 1.4;
4878
+ margin: 6px 0;
4879
+ }
4880
+ .ai-analysis-fullscreen > details {
4881
+ max-height: 15vh;
4882
+ overflow: auto;
4883
+ }
4884
+
4885
+ .ai-analysis-overlay-controls {
4886
+ display: flex;
4887
+ flex-wrap: wrap;
4888
+ gap: 8px 16px;
4889
+ font-size: 12px;
4890
+ margin-block: 8px;
4891
+ }
4892
+ .ai-analysis-overlay-controls label {
4893
+ display: inline-flex;
4894
+ align-items: center;
4895
+ gap: 6px;
4896
+ }
4897
+ .ai-analysis-overlay-controls input[type="range"] {
4898
+ width: 90px;
4899
+ }
4900
+ .ai-analysis-overlay-controls input {
4901
+ accent-color: #2563eb;
4902
+ }
4903
+ .ai-analysis-overlay-controls output {
4904
+ min-width: 3ch;
4905
+ }
4906
+
4907
+ .ai-import-panel textarea {
4908
+ font: inherit;
4909
+ font-size: 12px;
4910
+ line-height: 1.5;
4911
+ padding: 9px 10px;
4912
+ color: var(--ink);
4913
+ background: var(--panel-soft);
4914
+ border: 1px solid var(--line);
4915
+ border-radius: 8px;
4916
+ outline: none;
4917
+ }
4918
+ .ai-import-panel textarea:focus {
4919
+ border-color: var(--accent);
4920
+ }
4921
+ .ai-import-panel textarea::placeholder {
4922
+ color: var(--ink-faint);
4923
+ }
4924
+
4925
+ .ai-analysis-toolbar a {
4926
+ color: var(--accent);
4927
+ text-underline-offset: 2px;
4928
+ }
4929
+ .ai-analysis-fullscreen .helper {
4930
+ color: var(--ink-soft);
4931
+ }