@kerros/editor 0.0.0-stage → 0.1.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (345) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +35 -2
  3. package/dist/SitePlanner.js +1189 -0
  4. package/dist/SitePlanner.js.map +1 -0
  5. package/dist/adapters/basemap.js +11 -0
  6. package/dist/adapters/basemap.js.map +1 -0
  7. package/dist/adapters/persistence.js +121 -0
  8. package/dist/adapters/persistence.js.map +1 -0
  9. package/dist/adapters/status.js +11 -0
  10. package/dist/adapters/status.js.map +1 -0
  11. package/dist/adapters/useProjectPersistence.js +56 -0
  12. package/dist/adapters/useProjectPersistence.js.map +1 -0
  13. package/dist/components/AiImportPanel.js +635 -0
  14. package/dist/components/AiImportPanel.js.map +1 -0
  15. package/dist/components/AnalysisPreview.js +179 -0
  16. package/dist/components/AnalysisPreview.js.map +1 -0
  17. package/dist/components/ElevatorPanel.js +120 -0
  18. package/dist/components/ElevatorPanel.js.map +1 -0
  19. package/dist/components/Icons.js +57 -0
  20. package/dist/components/Icons.js.map +1 -0
  21. package/dist/components/ImportDialog.js +467 -0
  22. package/dist/components/ImportDialog.js.map +1 -0
  23. package/dist/components/Inspector.js +1184 -0
  24. package/dist/components/Inspector.js.map +1 -0
  25. package/dist/components/NavigatePanel.js +301 -0
  26. package/dist/components/NavigatePanel.js.map +1 -0
  27. package/dist/components/NavigationGraph.js +234 -0
  28. package/dist/components/NavigationGraph.js.map +1 -0
  29. package/dist/components/StructureExplorer.js +510 -0
  30. package/dist/components/StructureExplorer.js.map +1 -0
  31. package/dist/components/StructureView.js +286 -0
  32. package/dist/components/StructureView.js.map +1 -0
  33. package/dist/components/controls.js +209 -0
  34. package/dist/components/controls.js.map +1 -0
  35. package/dist/components/graphLayout.js +27 -0
  36. package/dist/components/graphLayout.js.map +1 -0
  37. package/dist/host.js +175 -0
  38. package/dist/host.js.map +1 -0
  39. package/dist/i18n.js +88 -0
  40. package/dist/i18n.js.map +1 -0
  41. package/dist/import/analysisPreview.js +41 -0
  42. package/dist/import/analysisPreview.js.map +1 -0
  43. package/dist/import/brief.js +29 -0
  44. package/dist/import/brief.js.map +1 -0
  45. package/dist/import/checkpoint.js +50 -0
  46. package/dist/import/checkpoint.js.map +1 -0
  47. package/dist/import/detect.js +120 -0
  48. package/dist/import/detect.js.map +1 -0
  49. package/dist/import/documentSvg.js +49 -0
  50. package/dist/import/documentSvg.js.map +1 -0
  51. package/dist/import/instructions.js +20 -0
  52. package/dist/import/instructions.js.map +1 -0
  53. package/dist/import/openings.js +61 -0
  54. package/dist/import/openings.js.map +1 -0
  55. package/dist/import/planImport.js +233 -0
  56. package/dist/import/planImport.js.map +1 -0
  57. package/dist/import/register.js +47 -0
  58. package/dist/import/register.js.map +1 -0
  59. package/dist/import/runs.js +67 -0
  60. package/dist/import/runs.js.map +1 -0
  61. package/dist/import/session.js +23 -0
  62. package/dist/import/session.js.map +1 -0
  63. package/dist/import/types.js +13 -0
  64. package/dist/import/types.js.map +1 -0
  65. package/dist/import/usage.js +29 -0
  66. package/dist/import/usage.js.map +1 -0
  67. package/dist/import/walls.js +112 -0
  68. package/dist/import/walls.js.map +1 -0
  69. package/dist/index.js +178 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/map/CabinMaterials.js +81 -0
  72. package/dist/map/CabinMaterials.js.map +1 -0
  73. package/dist/map/CabinMirror.js +43 -0
  74. package/dist/map/CabinMirror.js.map +1 -0
  75. package/dist/map/Doors.js +80 -0
  76. package/dist/map/Doors.js.map +1 -0
  77. package/dist/map/ElevatorCabin.js +93 -0
  78. package/dist/map/ElevatorCabin.js.map +1 -0
  79. package/dist/map/FixtureLights.js +117 -0
  80. package/dist/map/FixtureLights.js.map +1 -0
  81. package/dist/map/MapCanvas.js +2161 -0
  82. package/dist/map/MapCanvas.js.map +1 -0
  83. package/dist/map/Passenger.js +69 -0
  84. package/dist/map/Passenger.js.map +1 -0
  85. package/dist/map/SceneLayer.js +1534 -0
  86. package/dist/map/SceneLayer.js.map +1 -0
  87. package/dist/map/UndergroundContext.js +153 -0
  88. package/dist/map/UndergroundContext.js.map +1 -0
  89. package/dist/map/ambience.js +194 -0
  90. package/dist/map/ambience.js.map +1 -0
  91. package/dist/map/architecture.js +305 -0
  92. package/dist/map/architecture.js.map +1 -0
  93. package/dist/map/bathMusic.js +92 -0
  94. package/dist/map/bathMusic.js.map +1 -0
  95. package/dist/map/cameraAim.js +33 -0
  96. package/dist/map/cameraAim.js.map +1 -0
  97. package/dist/map/elevators.js +56 -0
  98. package/dist/map/elevators.js.map +1 -0
  99. package/dist/map/excavation.js +52 -0
  100. package/dist/map/excavation.js.map +1 -0
  101. package/dist/map/exteriors.js +25 -0
  102. package/dist/map/exteriors.js.map +1 -0
  103. package/dist/map/features.js +218 -0
  104. package/dist/map/features.js.map +1 -0
  105. package/dist/map/fences.js +29 -0
  106. package/dist/map/fences.js.map +1 -0
  107. package/dist/map/journey.js +112 -0
  108. package/dist/map/journey.js.map +1 -0
  109. package/dist/map/levels.js +6 -0
  110. package/dist/map/levels.js.map +1 -0
  111. package/dist/map/lighting.js +143 -0
  112. package/dist/map/lighting.js.map +1 -0
  113. package/dist/map/loadBasemap.js +26 -0
  114. package/dist/map/loadBasemap.js.map +1 -0
  115. package/dist/map/materials.js +183 -0
  116. package/dist/map/materials.js.map +1 -0
  117. package/dist/map/poolLighting.js +39 -0
  118. package/dist/map/poolLighting.js.map +1 -0
  119. package/dist/map/projection.js +24 -0
  120. package/dist/map/projection.js.map +1 -0
  121. package/dist/map/rampGeometry.js +38 -0
  122. package/dist/map/rampGeometry.js.map +1 -0
  123. package/dist/map/route.js +107 -0
  124. package/dist/map/route.js.map +1 -0
  125. package/dist/map/stairSurfaces.js +115 -0
  126. package/dist/map/stairSurfaces.js.map +1 -0
  127. package/dist/map/surfaces.js +136 -0
  128. package/dist/map/surfaces.js.map +1 -0
  129. package/dist/map/textures.js +95 -0
  130. package/dist/map/textures.js.map +1 -0
  131. package/dist/map/underground.js +34 -0
  132. package/dist/map/underground.js.map +1 -0
  133. package/dist/map/walk.js +433 -0
  134. package/dist/map/walk.js.map +1 -0
  135. package/dist/map/walkContext.js +46 -0
  136. package/dist/map/walkContext.js.map +1 -0
  137. package/dist/map/walkDimensions.js +7 -0
  138. package/dist/map/walkDimensions.js.map +1 -0
  139. package/dist/map/walkJourney.js +85 -0
  140. package/dist/map/walkJourney.js.map +1 -0
  141. package/dist/map/walkSurfaces.js +106 -0
  142. package/dist/map/walkSurfaces.js.map +1 -0
  143. package/dist/map/wallJoins.js +70 -0
  144. package/dist/map/wallJoins.js.map +1 -0
  145. package/dist/map/water.js +274 -0
  146. package/dist/map/water.js.map +1 -0
  147. package/dist/model/authoring.js +99 -0
  148. package/dist/model/authoring.js.map +1 -0
  149. package/dist/model/boundaries.js +548 -0
  150. package/dist/model/boundaries.js.map +1 -0
  151. package/dist/model/coverage.js +30 -0
  152. package/dist/model/coverage.js.map +1 -0
  153. package/dist/model/document.js +52 -0
  154. package/dist/model/document.js.map +1 -0
  155. package/dist/model/doors.js +47 -0
  156. package/dist/model/doors.js.map +1 -0
  157. package/dist/model/factory.js +56 -0
  158. package/dist/model/factory.js.map +1 -0
  159. package/dist/model/geometry.js +454 -0
  160. package/dist/model/geometry.js.map +1 -0
  161. package/dist/model/history.js +29 -0
  162. package/dist/model/history.js.map +1 -0
  163. package/dist/model/imports.js +45 -0
  164. package/dist/model/imports.js.map +1 -0
  165. package/dist/model/inference.js +182 -0
  166. package/dist/model/inference.js.map +1 -0
  167. package/dist/model/materials.js +11 -0
  168. package/dist/model/materials.js.map +1 -0
  169. package/dist/model/mutations.js +157 -0
  170. package/dist/model/mutations.js.map +1 -0
  171. package/dist/model/navigation.js +275 -0
  172. package/dist/model/navigation.js.map +1 -0
  173. package/dist/model/ontology.js +109 -0
  174. package/dist/model/ontology.js.map +1 -0
  175. package/dist/model/passages.js +5 -0
  176. package/dist/model/passages.js.map +1 -0
  177. package/dist/model/portals.js +42 -0
  178. package/dist/model/portals.js.map +1 -0
  179. package/dist/model/precision.js +11 -0
  180. package/dist/model/precision.js.map +1 -0
  181. package/dist/model/project.js +31 -0
  182. package/dist/model/project.js.map +1 -0
  183. package/dist/model/ramps.js +10 -0
  184. package/dist/model/ramps.js.map +1 -0
  185. package/dist/model/roomNavigation.js +87 -0
  186. package/dist/model/roomNavigation.js.map +1 -0
  187. package/dist/model/routeClearance.js +72 -0
  188. package/dist/model/routeClearance.js.map +1 -0
  189. package/dist/model/spaces.js +104 -0
  190. package/dist/model/spaces.js.map +1 -0
  191. package/dist/model/stairGeometry.js +40 -0
  192. package/dist/model/stairGeometry.js.map +1 -0
  193. package/dist/model/stairTraversal.js +48 -0
  194. package/dist/model/stairTraversal.js.map +1 -0
  195. package/dist/model/topology.js +63 -0
  196. package/dist/model/topology.js.map +1 -0
  197. package/dist/model/types.js +35 -0
  198. package/dist/model/types.js.map +1 -0
  199. package/dist/model/validate.js +240 -0
  200. package/dist/model/validate.js.map +1 -0
  201. package/dist/model/vertical.js +129 -0
  202. package/dist/model/vertical.js.map +1 -0
  203. package/dist/model/walls.js +261 -0
  204. package/dist/model/walls.js.map +1 -0
  205. package/dist/planner/DrawingDock.js +231 -0
  206. package/dist/planner/DrawingDock.js.map +1 -0
  207. package/dist/planner/FloorControls.js +93 -0
  208. package/dist/planner/FloorControls.js.map +1 -0
  209. package/dist/planner/MapSettings.js +143 -0
  210. package/dist/planner/MapSettings.js.map +1 -0
  211. package/dist/planner/PlannerHelp.js +57 -0
  212. package/dist/planner/PlannerHelp.js.map +1 -0
  213. package/dist/planner/ProjectSidebar.js +246 -0
  214. package/dist/planner/ProjectSidebar.js.map +1 -0
  215. package/dist/planner/floors.js +18 -0
  216. package/dist/planner/floors.js.map +1 -0
  217. package/dist/planner/useDrawingTools.js +341 -0
  218. package/dist/planner/useDrawingTools.js.map +1 -0
  219. package/dist/planner/useMapDisplay.js +51 -0
  220. package/dist/planner/useMapDisplay.js.map +1 -0
  221. package/dist/planner/usePlannerKeyboard.js +138 -0
  222. package/dist/planner/usePlannerKeyboard.js.map +1 -0
  223. package/dist/planner/useReferenceAlignment.js +50 -0
  224. package/dist/planner/useReferenceAlignment.js.map +1 -0
  225. package/dist/styles.css +4931 -0
  226. package/dist/theme/index.js +34 -0
  227. package/dist/theme/index.js.map +1 -0
  228. package/dist/types/SitePlanner.d.ts +5 -0
  229. package/dist/types/adapters/basemap.d.ts +2 -0
  230. package/dist/types/adapters/persistence.d.ts +29 -0
  231. package/dist/types/adapters/status.d.ts +4 -0
  232. package/dist/types/adapters/useProjectPersistence.d.ts +13 -0
  233. package/dist/types/components/AiImportPanel.d.ts +9 -0
  234. package/dist/types/components/AnalysisPreview.d.ts +4 -0
  235. package/dist/types/components/ElevatorPanel.d.ts +18 -0
  236. package/dist/types/components/Icons.d.ts +8 -0
  237. package/dist/types/components/ImportDialog.d.ts +42 -0
  238. package/dist/types/components/Inspector.d.ts +38 -0
  239. package/dist/types/components/NavigatePanel.d.ts +27 -0
  240. package/dist/types/components/NavigationGraph.d.ts +10 -0
  241. package/dist/types/components/StructureExplorer.d.ts +8 -0
  242. package/dist/types/components/StructureView.d.ts +22 -0
  243. package/dist/types/components/controls.d.ts +52 -0
  244. package/dist/types/components/graphLayout.d.ts +9 -0
  245. package/dist/types/editor/host.d.ts +9 -0
  246. package/dist/types/editor/index.d.ts +2 -0
  247. package/dist/types/i18n.d.ts +85 -0
  248. package/dist/types/import/analysisPreview.d.ts +27 -0
  249. package/dist/types/import/brief.d.ts +22 -0
  250. package/dist/types/import/checkpoint.d.ts +49 -0
  251. package/dist/types/import/detect.d.ts +34 -0
  252. package/dist/types/import/documentSvg.d.ts +2 -0
  253. package/dist/types/import/index.d.ts +10 -0
  254. package/dist/types/import/instructions.d.ts +7 -0
  255. package/dist/types/import/openings.d.ts +22 -0
  256. package/dist/types/import/planImport.d.ts +22 -0
  257. package/dist/types/import/register.d.ts +25 -0
  258. package/dist/types/import/runs.d.ts +31 -0
  259. package/dist/types/import/session.d.ts +33 -0
  260. package/dist/types/import/types.d.ts +56 -0
  261. package/dist/types/import/usage.d.ts +10 -0
  262. package/dist/types/import/walls.d.ts +37 -0
  263. package/dist/types/map/CabinMaterials.d.ts +18 -0
  264. package/dist/types/map/CabinMirror.d.ts +13 -0
  265. package/dist/types/map/Doors.d.ts +11 -0
  266. package/dist/types/map/ElevatorCabin.d.ts +20 -0
  267. package/dist/types/map/FixtureLights.d.ts +35 -0
  268. package/dist/types/map/MapCanvas.d.ts +87 -0
  269. package/dist/types/map/Passenger.d.ts +18 -0
  270. package/dist/types/map/SceneLayer.d.ts +306 -0
  271. package/dist/types/map/UndergroundContext.d.ts +18 -0
  272. package/dist/types/map/ambience.d.ts +29 -0
  273. package/dist/types/map/architecture.d.ts +8 -0
  274. package/dist/types/map/bathMusic.d.ts +14 -0
  275. package/dist/types/map/cameraAim.d.ts +20 -0
  276. package/dist/types/map/elevators.d.ts +16 -0
  277. package/dist/types/map/excavation.d.ts +9 -0
  278. package/dist/types/map/exteriors.d.ts +3 -0
  279. package/dist/types/map/features.d.ts +33 -0
  280. package/dist/types/map/fences.d.ts +4 -0
  281. package/dist/types/map/journey.d.ts +36 -0
  282. package/dist/types/map/levels.d.ts +4 -0
  283. package/dist/types/map/lighting.d.ts +103 -0
  284. package/dist/types/map/loadBasemap.d.ts +4 -0
  285. package/dist/types/map/materials.d.ts +38 -0
  286. package/dist/types/map/poolLighting.d.ts +11 -0
  287. package/dist/types/map/projection.d.ts +9 -0
  288. package/dist/types/map/rampGeometry.d.ts +8 -0
  289. package/dist/types/map/route.d.ts +59 -0
  290. package/dist/types/map/stairSurfaces.d.ts +29 -0
  291. package/dist/types/map/surfaces.d.ts +36 -0
  292. package/dist/types/map/textures.d.ts +8 -0
  293. package/dist/types/map/underground.d.ts +30 -0
  294. package/dist/types/map/walk.d.ts +232 -0
  295. package/dist/types/map/walkContext.d.ts +11 -0
  296. package/dist/types/map/walkDimensions.d.ts +5 -0
  297. package/dist/types/map/walkJourney.d.ts +33 -0
  298. package/dist/types/map/walkSurfaces.d.ts +27 -0
  299. package/dist/types/map/wallJoins.d.ts +6 -0
  300. package/dist/types/map/water.d.ts +12 -0
  301. package/dist/types/model/authoring.d.ts +38 -0
  302. package/dist/types/model/boundaries.d.ts +41 -0
  303. package/dist/types/model/coverage.d.ts +8 -0
  304. package/dist/types/model/document.d.ts +9 -0
  305. package/dist/types/model/doors.d.ts +19 -0
  306. package/dist/types/model/factory.d.ts +5 -0
  307. package/dist/types/model/geometry.d.ts +99 -0
  308. package/dist/types/model/history.d.ts +10 -0
  309. package/dist/types/model/host.d.ts +154 -0
  310. package/dist/types/model/imports.d.ts +7 -0
  311. package/dist/types/model/inference.d.ts +46 -0
  312. package/dist/types/model/live.d.ts +60 -0
  313. package/dist/types/model/materials.d.ts +28 -0
  314. package/dist/types/model/mutations.d.ts +178 -0
  315. package/dist/types/model/navigation.d.ts +70 -0
  316. package/dist/types/model/ontology.d.ts +43 -0
  317. package/dist/types/model/passages.d.ts +2 -0
  318. package/dist/types/model/portals.d.ts +9 -0
  319. package/dist/types/model/precision.d.ts +11 -0
  320. package/dist/types/model/project.d.ts +8 -0
  321. package/dist/types/model/ramps.d.ts +7 -0
  322. package/dist/types/model/roomNavigation.d.ts +15 -0
  323. package/dist/types/model/routeClearance.d.ts +11 -0
  324. package/dist/types/model/spaces.d.ts +46 -0
  325. package/dist/types/model/stairGeometry.d.ts +27 -0
  326. package/dist/types/model/stairTraversal.d.ts +8 -0
  327. package/dist/types/model/topology.d.ts +14 -0
  328. package/dist/types/model/types.d.ts +369 -0
  329. package/dist/types/model/validate.d.ts +38 -0
  330. package/dist/types/model/vertical.d.ts +145 -0
  331. package/dist/types/model/walls.d.ts +71 -0
  332. package/dist/types/planner/DrawingDock.d.ts +16 -0
  333. package/dist/types/planner/FloorControls.d.ts +17 -0
  334. package/dist/types/planner/MapSettings.d.ts +16 -0
  335. package/dist/types/planner/PlannerHelp.d.ts +3 -0
  336. package/dist/types/planner/ProjectSidebar.d.ts +32 -0
  337. package/dist/types/planner/floors.d.ts +3 -0
  338. package/dist/types/planner/types.d.ts +3 -0
  339. package/dist/types/planner/useDrawingTools.d.ts +52 -0
  340. package/dist/types/planner/useMapDisplay.d.ts +29 -0
  341. package/dist/types/planner/usePlannerKeyboard.d.ts +18 -0
  342. package/dist/types/planner/useReferenceAlignment.d.ts +30 -0
  343. package/dist/types/schema/index.d.ts +25 -0
  344. package/dist/types/theme/index.d.ts +55 -0
  345. package/package.json +58 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePlannerKeyboard.js","sources":["../../../../src/planner/usePlannerKeyboard.ts"],"sourcesContent":["import type { Map as GLMap } from 'maplibre-gl';\nimport { useEffect, useRef, useState, type RefObject } from 'react';\nimport type { Tool } from '../model/types';\n\ninterface PlannerKeyboardOptions {\n graphView: boolean;\n editing: boolean;\n threeD: boolean;\n walk: boolean;\n hasDraft: boolean;\n hasSelection: boolean;\n mapRef: RefObject<GLMap | null>;\n chooseTool: (tool: Tool) => void;\n stepFloor: (direction: 1 | -1) => void;\n commands: Record<\n | 'undo'\n | 'redo'\n | 'undoPoint'\n | 'export'\n | 'cancel'\n | 'finish'\n | 'help'\n | 'view'\n | 'edit'\n | 'walk'\n | 'live'\n | 'cycleView'\n | 'toggleStack'\n | 'toggleSidebar'\n | 'toggleInspector'\n | 'toggleFullscreen'\n | 'toggleNavigation'\n | 'toggleTheme'\n | 'deleteSelection'\n | 'duplicate',\n () => void\n >;\n}\n\n/** Routes chrome shortcuts without taking movement keys from the map or walker. */\nexport function usePlannerKeyboard({\n graphView,\n editing,\n threeD,\n walk,\n hasDraft,\n hasSelection,\n mapRef,\n chooseTool,\n stepFloor,\n commands,\n}: PlannerKeyboardOptions) {\n const [showKeys, setShowKeys] = useState(false);\n const walkRef = useRef(walk);\n walkRef.current = walk;\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if ((e.target as HTMLElement).closest('input, textarea, select, dialog, [role=\"tab\"]')) return;\n if (graphView) return;\n const cmd = e.metaKey || e.ctrlKey;\n if (cmd && e.key.toLowerCase() === 'z' && editing) {\n e.preventDefault();\n if (hasDraft && !e.shiftKey) commands.undoPoint();\n else if (e.shiftKey) commands.redo();\n else commands.undo();\n return;\n }\n if (cmd && e.key.toLowerCase() === 's') {\n e.preventDefault();\n commands.export();\n return;\n }\n if (e.key === 'Escape') {\n commands.cancel();\n }\n if (e.key === 'Enter' && hasDraft) {\n e.preventDefault();\n commands.finish();\n }\n // Chrome shortcuts work in every mode; single letters stay free because tools use their own set.\n // While walking, only the keys that change mode are ours — the rest belong to the walker.\n if (!cmd) {\n if (walkRef.current && !['t', '1', '2', '3', '4', '[', ']'].includes(e.key.toLowerCase())) return;\n const key = e.key.toLowerCase();\n if (e.key === '?') {\n commands.help();\n return;\n }\n if (e.key === '1') {\n commands.view();\n return;\n }\n if (e.key === '2') {\n commands.edit();\n return;\n }\n if (e.key === '3') {\n commands.walk();\n return;\n }\n if (e.key === '4') {\n commands.live();\n return;\n }\n if (key === 't') {\n commands.cycleView();\n return;\n }\n if (key === 'x' && threeD && !walk) {\n commands.toggleStack();\n return;\n }\n if (key === 'b') {\n commands.toggleSidebar();\n return;\n }\n if (key === 'i') {\n commands.toggleInspector();\n return;\n }\n if (key === 'f') {\n commands.toggleFullscreen();\n return;\n }\n if (key === 'g') {\n commands.toggleNavigation();\n return;\n }\n if (key === 'n') {\n commands.toggleTheme();\n return;\n }\n if (e.key === '[') {\n stepFloor(-1);\n return;\n }\n if (e.key === ']') {\n stepFloor(1);\n return;\n }\n }\n if (!editing) return;\n if ((e.key === 'Backspace' || e.key === 'Delete') && hasDraft) {\n e.preventDefault();\n commands.undoPoint();\n return;\n }\n if ((e.key === 'Delete' || e.key === 'Backspace') && hasSelection) {\n e.preventDefault();\n commands.deleteSelection();\n }\n if (cmd && e.key.toLowerCase() === 'd') {\n e.preventDefault();\n commands.duplicate();\n }\n if (!cmd && !e.shiftKey) {\n const shortcut: Record<string, Tool> = {\n v: 'select',\n h: 'pan',\n w: 'wall',\n p: 'partition',\n d: 'door',\n c: 'camera',\n z: 'zone',\n m: 'measure',\n s: 'split',\n e: 'enclose',\n };\n if (shortcut[e.key.toLowerCase()]) chooseTool(shortcut[e.key.toLowerCase()]);\n }\n };\n // Shift+Up/Down steps floors — registered in capture phase so it wins over MapLibre's\n // shift-pitch handling when the map canvas has focus. AltGr symbols are avoided on purpose.\n const floorKeys = (e: KeyboardEvent) => {\n if ((e.target as HTMLElement).closest('input, textarea, select, dialog, [role=\"tab\"]')) return;\n if (graphView) return;\n // Walking owns the movement keys outright. The walker stops these events before they get here,\n // but \"before\" depends on listener registration order, and losing that race pans the map 140 px\n // under the walker on every arrow — which reads as the arrows moving faster than W and S.\n if (walkRef.current) return;\n const m = mapRef.current;\n if (e.key.startsWith('Arrow')) {\n e.preventDefault();\n e.stopPropagation();\n if (!e.shiftKey)\n m?.panBy(\n [\n e.key === 'ArrowLeft' ? -140 : e.key === 'ArrowRight' ? 140 : 0,\n e.key === 'ArrowUp' ? -140 : e.key === 'ArrowDown' ? 140 : 0,\n ],\n { duration: 250 },\n );\n else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') stepFloor(e.key === 'ArrowUp' ? 1 : -1);\n else m?.easeTo({ bearing: m.getBearing() + (e.key === 'ArrowRight' ? 45 : -45), duration: 450 });\n return;\n }\n if (e.shiftKey && threeD && m && (e.key.toLowerCase() === 'w' || e.key.toLowerCase() === 's')) {\n e.preventDefault();\n e.stopPropagation();\n m.easeTo({\n pitch: Math.max(0, Math.min(75, m.getPitch() + (e.key.toLowerCase() === 'w' ? 10 : -10))),\n duration: 300,\n });\n }\n };\n // Holding Shift reveals each dock tool's shortcut as a badge on the button.\n const shiftDown = (e: KeyboardEvent) => {\n if (e.key === 'Shift') setShowKeys(true);\n };\n const shiftUp = (e: KeyboardEvent) => {\n if (e.key === 'Shift') setShowKeys(false);\n };\n const blur = () => setShowKeys(false);\n window.addEventListener('keydown', handler);\n window.addEventListener('keydown', floorKeys, true);\n window.addEventListener('keydown', shiftDown);\n window.addEventListener('keyup', shiftUp);\n window.addEventListener('blur', blur);\n return () => {\n window.removeEventListener('keydown', handler);\n window.removeEventListener('keydown', floorKeys, true);\n window.removeEventListener('keydown', shiftDown);\n window.removeEventListener('keyup', shiftUp);\n window.removeEventListener('blur', blur);\n };\n });\n return showKeys;\n}\n"],"names":["usePlannerKeyboard","graphView","editing","threeD","walk","hasDraft","hasSelection","mapRef","chooseTool","stepFloor","commands","showKeys","setShowKeys","useState","walkRef","useRef","useEffect","handler","cmd","key","shortcut","floorKeys","m","shiftDown","shiftUp","blur"],"mappings":";AAwCO,SAASA,EAAmB;AAAA,EACjC,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,cAAAC;AAAA,EACA,QAAAC;AAAA,EACA,YAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AACF,GAA2B;AACzB,QAAM,CAACC,GAAUC,CAAW,IAAIC,EAAS,EAAK,GACxCC,IAAUC,EAAOX,CAAI;AAC3B,SAAAU,EAAQ,UAAUV,GAClBY,EAAU,MAAM;AACd,UAAMC,IAAU,CAAC,MAAqB;AAEpC,UADK,EAAE,OAAuB,QAAQ,+CAA+C,KACjFhB,EAAW;AACf,YAAMiB,IAAM,EAAE,WAAW,EAAE;AAC3B,UAAIA,KAAO,EAAE,IAAI,YAAA,MAAkB,OAAOhB,GAAS;AACjD,UAAE,eAAA,GACEG,KAAY,CAAC,EAAE,aAAmB,UAAA,IAC7B,EAAE,WAAUK,EAAS,KAAA,MAChB,KAAA;AACd;AAAA,MACF;AACA,UAAIQ,KAAO,EAAE,IAAI,YAAA,MAAkB,KAAK;AACtC,UAAE,eAAA,GACFR,EAAS,OAAA;AACT;AAAA,MACF;AAUA,UATI,EAAE,QAAQ,YACZA,EAAS,OAAA,GAEP,EAAE,QAAQ,WAAWL,MACvB,EAAE,eAAA,GACFK,EAAS,OAAA,IAIP,CAACQ,GAAK;AACR,YAAIJ,EAAQ,WAAW,CAAC,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,EAAE,SAAS,EAAE,IAAI,YAAA,CAAa,EAAG;AAC3F,cAAMK,IAAM,EAAE,IAAI,YAAA;AAClB,YAAI,EAAE,QAAQ,KAAK;AACjB,UAAAT,EAAS,KAAA;AACT;AAAA,QACF;AACA,YAAI,EAAE,QAAQ,KAAK;AACjB,UAAAA,EAAS,KAAA;AACT;AAAA,QACF;AACA,YAAI,EAAE,QAAQ,KAAK;AACjB,UAAAA,EAAS,KAAA;AACT;AAAA,QACF;AACA,YAAI,EAAE,QAAQ,KAAK;AACjB,UAAAA,EAAS,KAAA;AACT;AAAA,QACF;AACA,YAAI,EAAE,QAAQ,KAAK;AACjB,UAAAA,EAAS,KAAA;AACT;AAAA,QACF;AACA,YAAIS,MAAQ,KAAK;AACf,UAAAT,EAAS,UAAA;AACT;AAAA,QACF;AACA,YAAIS,MAAQ,OAAOhB,KAAU,CAACC,GAAM;AAClC,UAAAM,EAAS,YAAA;AACT;AAAA,QACF;AACA,YAAIS,MAAQ,KAAK;AACf,UAAAT,EAAS,cAAA;AACT;AAAA,QACF;AACA,YAAIS,MAAQ,KAAK;AACf,UAAAT,EAAS,gBAAA;AACT;AAAA,QACF;AACA,YAAIS,MAAQ,KAAK;AACf,UAAAT,EAAS,iBAAA;AACT;AAAA,QACF;AACA,YAAIS,MAAQ,KAAK;AACf,UAAAT,EAAS,iBAAA;AACT;AAAA,QACF;AACA,YAAIS,MAAQ,KAAK;AACf,UAAAT,EAAS,YAAA;AACT;AAAA,QACF;AACA,YAAI,EAAE,QAAQ,KAAK;AACjB,UAAAD,EAAU,EAAE;AACZ;AAAA,QACF;AACA,YAAI,EAAE,QAAQ,KAAK;AACjB,UAAAA,EAAU,CAAC;AACX;AAAA,QACF;AAAA,MACF;AACA,UAAKP,GACL;AAAA,aAAK,EAAE,QAAQ,eAAe,EAAE,QAAQ,aAAaG,GAAU;AAC7D,YAAE,eAAA,GACFK,EAAS,UAAA;AACT;AAAA,QACF;AASA,aARK,EAAE,QAAQ,YAAY,EAAE,QAAQ,gBAAgBJ,MACnD,EAAE,eAAA,GACFI,EAAS,gBAAA,IAEPQ,KAAO,EAAE,IAAI,YAAA,MAAkB,QACjC,EAAE,eAAA,GACFR,EAAS,UAAA,IAEP,CAACQ,KAAO,CAAC,EAAE,UAAU;AACvB,gBAAME,IAAiC;AAAA,YACrC,GAAG;AAAA,YACH,GAAG;AAAA,YACH,GAAG;AAAA,YACH,GAAG;AAAA,YACH,GAAG;AAAA,YACH,GAAG;AAAA,YACH,GAAG;AAAA,YACH,GAAG;AAAA,YACH,GAAG;AAAA,YACH,GAAG;AAAA,UAAA;AAEL,UAAIA,EAAS,EAAE,IAAI,YAAA,CAAa,KAAGZ,EAAWY,EAAS,EAAE,IAAI,YAAA,CAAa,CAAC;AAAA,QAC7E;AAAA;AAAA,IACF,GAGMC,IAAY,CAAC,MAAqB;AAMtC,UALK,EAAE,OAAuB,QAAQ,+CAA+C,KACjFpB,KAIAa,EAAQ,QAAS;AACrB,YAAMQ,IAAIf,EAAO;AACjB,UAAI,EAAE,IAAI,WAAW,OAAO,GAAG;AAC7B,UAAE,eAAA,GACF,EAAE,gBAAA,GACG,EAAE,WAQE,EAAE,QAAQ,aAAa,EAAE,QAAQ,cAAaE,EAAU,EAAE,QAAQ,YAAY,IAAI,EAAE,IACxFa,KAAA,QAAAA,EAAG,OAAO,EAAE,SAASA,EAAE,WAAA,KAAgB,EAAE,QAAQ,eAAe,KAAK,MAAM,UAAU,SARxFA,KAAA,QAAAA,EAAG;AAAA,UACD;AAAA,YACE,EAAE,QAAQ,cAAc,OAAO,EAAE,QAAQ,eAAe,MAAM;AAAA,YAC9D,EAAE,QAAQ,YAAY,OAAO,EAAE,QAAQ,cAAc,MAAM;AAAA,UAAA;AAAA,UAE7D,EAAE,UAAU,IAAA;AAAA;AAIhB;AAAA,MACF;AACA,MAAI,EAAE,YAAYnB,KAAUmB,MAAM,EAAE,IAAI,YAAA,MAAkB,OAAO,EAAE,IAAI,YAAA,MAAkB,SACvF,EAAE,eAAA,GACF,EAAE,gBAAA,GACFA,EAAE,OAAO;AAAA,QACP,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,IAAIA,EAAE,SAAA,KAAc,EAAE,IAAI,YAAA,MAAkB,MAAM,KAAK,IAAI,CAAC;AAAA,QACxF,UAAU;AAAA,MAAA,CACX;AAAA,IAEL,GAEMC,IAAY,CAAC,MAAqB;AACtC,MAAI,EAAE,QAAQ,WAASX,EAAY,EAAI;AAAA,IACzC,GACMY,IAAU,CAAC,MAAqB;AACpC,MAAI,EAAE,QAAQ,WAASZ,EAAY,EAAK;AAAA,IAC1C,GACMa,IAAO,MAAMb,EAAY,EAAK;AACpC,kBAAO,iBAAiB,WAAWK,CAAO,GAC1C,OAAO,iBAAiB,WAAWI,GAAW,EAAI,GAClD,OAAO,iBAAiB,WAAWE,CAAS,GAC5C,OAAO,iBAAiB,SAASC,CAAO,GACxC,OAAO,iBAAiB,QAAQC,CAAI,GAC7B,MAAM;AACX,aAAO,oBAAoB,WAAWR,CAAO,GAC7C,OAAO,oBAAoB,WAAWI,GAAW,EAAI,GACrD,OAAO,oBAAoB,WAAWE,CAAS,GAC/C,OAAO,oBAAoB,SAASC,CAAO,GAC3C,OAAO,oBAAoB,QAAQC,CAAI;AAAA,IACzC;AAAA,EACF,CAAC,GACMd;AACT;"}
@@ -0,0 +1,50 @@
1
+ import { useState as h } from "react";
2
+ import { makeDrawing as v } from "../components/ImportDialog.js";
3
+ import { distance as A, alignDrawing as b } from "../model/geometry.js";
4
+ function k({
5
+ project: s,
6
+ floorId: w,
7
+ assets: c,
8
+ commit: o,
9
+ notify: r,
10
+ setSelected: g,
11
+ onStart: l
12
+ }) {
13
+ const [n, t] = h(null);
14
+ async function m(i) {
15
+ const e = v(i, w);
16
+ try {
17
+ await c.put(e.assetId, i.blob), t({ prepared: i, drawing: e, imagePoints: [], mapPoints: [], preview: !1 }), l();
18
+ } catch (a) {
19
+ r(`Could not store drawing: ${a.message}`);
20
+ }
21
+ }
22
+ function u() {
23
+ if (n)
24
+ try {
25
+ const i = b(n.imagePoints, n.mapPoints);
26
+ t({ ...n, drawing: { ...n.drawing, ...i }, preview: !0 });
27
+ } catch (i) {
28
+ r(i.message);
29
+ }
30
+ }
31
+ function d() {
32
+ n && o((i) => i.drawings.push(n.drawing)) && (g(n.drawing.id), t(null), r("Drawing aligned. Trace walls and rooms over the reference."));
33
+ }
34
+ function f(i) {
35
+ if (!n || n.imagePoints.length !== 2 || !Number.isFinite(i) || i <= 0) return;
36
+ const e = A(n.imagePoints[0], n.imagePoints[1]);
37
+ if (e < 1) {
38
+ r("Choose two distinct image points.");
39
+ return;
40
+ }
41
+ const a = { ...n.drawing, scale: i / e };
42
+ o((P) => P.drawings.push(a)) && (g(a.id), t(null));
43
+ }
44
+ const p = n != null && n.preview ? { ...s, drawings: [...s.drawings, n.drawing] } : s;
45
+ return { alignment: n, setAlignment: t, startAlignment: m, previewAlignment: u, confirmAlignment: d, calibrate: f, displayProject: p };
46
+ }
47
+ export {
48
+ k as useReferenceAlignment
49
+ };
50
+ //# sourceMappingURL=useReferenceAlignment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useReferenceAlignment.js","sources":["../../../../src/planner/useReferenceAlignment.ts"],"sourcesContent":["import { useState } from 'react';\nimport { makeDrawing, type PreparedDrawing } from '../components/ImportDialog';\nimport { alignDrawing, distance } from '../model/geometry';\nimport type { AssetRepository, Drawing, Point, ProjectDocument } from '../model/types';\nimport type { CommitProject } from './types';\n\ninterface Alignment {\n prepared: PreparedDrawing;\n imagePoints: Point[];\n mapPoints: Point[];\n drawing: Drawing;\n preview: boolean;\n}\n\ninterface ReferenceAlignmentOptions {\n project: ProjectDocument;\n floorId: string | null;\n assets: AssetRepository;\n commit: CommitProject;\n notify: (message: string) => void;\n setSelected: (id: string | null) => void;\n onStart: () => void;\n}\n\n/** A reference drawing stays provisional until its alignment or scale is accepted. */\nexport function useReferenceAlignment({\n project,\n floorId,\n assets,\n commit,\n notify,\n setSelected,\n onStart,\n}: ReferenceAlignmentOptions) {\n const [alignment, setAlignment] = useState<Alignment | null>(null);\n async function startAlignment(prepared: PreparedDrawing) {\n const drawing = makeDrawing(prepared, floorId);\n try {\n await assets.put(drawing.assetId, prepared.blob);\n setAlignment({ prepared, drawing, imagePoints: [], mapPoints: [], preview: false });\n onStart();\n } catch (e) {\n notify(`Could not store drawing: ${(e as Error).message}`);\n }\n }\n function previewAlignment() {\n if (!alignment) return;\n try {\n const transform = alignDrawing(alignment.imagePoints as [Point, Point], alignment.mapPoints as [Point, Point]);\n setAlignment({ ...alignment, drawing: { ...alignment.drawing, ...transform }, preview: true });\n } catch (e) {\n notify((e as Error).message);\n }\n }\n function confirmAlignment() {\n if (!alignment) return;\n if (commit(p => p.drawings.push(alignment.drawing))) {\n setSelected(alignment.drawing.id);\n setAlignment(null);\n notify('Drawing aligned. Trace walls and rooms over the reference.');\n }\n }\n function calibrate(metres: number) {\n if (!alignment || alignment.imagePoints.length !== 2 || !Number.isFinite(metres) || metres <= 0) return;\n const pixels = distance(alignment.imagePoints[0], alignment.imagePoints[1]);\n if (pixels < 1) {\n notify('Choose two distinct image points.');\n return;\n }\n const drawing = { ...alignment.drawing, scale: metres / pixels };\n if (commit(p => p.drawings.push(drawing))) {\n setSelected(drawing.id);\n setAlignment(null);\n }\n }\n const displayProject = alignment?.preview\n ? { ...project, drawings: [...project.drawings, alignment.drawing] }\n : project;\n return { alignment, setAlignment, startAlignment, previewAlignment, confirmAlignment, calibrate, displayProject };\n}\n"],"names":["useReferenceAlignment","project","floorId","assets","commit","notify","setSelected","onStart","alignment","setAlignment","useState","startAlignment","prepared","drawing","makeDrawing","e","previewAlignment","transform","alignDrawing","confirmAlignment","p","calibrate","metres","pixels","distance","displayProject"],"mappings":";;;AAyBO,SAASA,EAAsB;AAAA,EACpC,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC;AACF,GAA8B;AAC5B,QAAM,CAACC,GAAWC,CAAY,IAAIC,EAA2B,IAAI;AACjE,iBAAeC,EAAeC,GAA2B;AACvD,UAAMC,IAAUC,EAAYF,GAAUV,CAAO;AAC7C,QAAI;AACF,YAAMC,EAAO,IAAIU,EAAQ,SAASD,EAAS,IAAI,GAC/CH,EAAa,EAAE,UAAAG,GAAU,SAAAC,GAAS,aAAa,IAAI,WAAW,CAAA,GAAI,SAAS,IAAO,GAClFN,EAAA;AAAA,IACF,SAASQ,GAAG;AACV,MAAAV,EAAO,4BAA6BU,EAAY,OAAO,EAAE;AAAA,IAC3D;AAAA,EACF;AACA,WAASC,IAAmB;AAC1B,QAAKR;AACL,UAAI;AACF,cAAMS,IAAYC,EAAaV,EAAU,aAA+BA,EAAU,SAA2B;AAC7G,QAAAC,EAAa,EAAE,GAAGD,GAAW,SAAS,EAAE,GAAGA,EAAU,SAAS,GAAGS,EAAA,GAAa,SAAS,IAAM;AAAA,MAC/F,SAASF,GAAG;AACV,QAAAV,EAAQU,EAAY,OAAO;AAAA,MAC7B;AAAA,EACF;AACA,WAASI,IAAmB;AAC1B,IAAKX,KACDJ,EAAO,OAAKgB,EAAE,SAAS,KAAKZ,EAAU,OAAO,CAAC,MAChDF,EAAYE,EAAU,QAAQ,EAAE,GAChCC,EAAa,IAAI,GACjBJ,EAAO,4DAA4D;AAAA,EAEvE;AACA,WAASgB,EAAUC,GAAgB;AACjC,QAAI,CAACd,KAAaA,EAAU,YAAY,WAAW,KAAK,CAAC,OAAO,SAASc,CAAM,KAAKA,KAAU,EAAG;AACjG,UAAMC,IAASC,EAAShB,EAAU,YAAY,CAAC,GAAGA,EAAU,YAAY,CAAC,CAAC;AAC1E,QAAIe,IAAS,GAAG;AACd,MAAAlB,EAAO,mCAAmC;AAC1C;AAAA,IACF;AACA,UAAMQ,IAAU,EAAE,GAAGL,EAAU,SAAS,OAAOc,IAASC,EAAA;AACxD,IAAInB,EAAO,CAAAgB,MAAKA,EAAE,SAAS,KAAKP,CAAO,CAAC,MACtCP,EAAYO,EAAQ,EAAE,GACtBJ,EAAa,IAAI;AAAA,EAErB;AACA,QAAMgB,IAAiBjB,KAAA,QAAAA,EAAW,UAC9B,EAAE,GAAGP,GAAS,UAAU,CAAC,GAAGA,EAAQ,UAAUO,EAAU,OAAO,MAC/DP;AACJ,SAAO,EAAE,WAAAO,GAAW,cAAAC,GAAc,gBAAAE,GAAgB,kBAAAK,GAAkB,kBAAAG,GAAkB,WAAAE,GAAW,gBAAAI,EAAA;AACnG;"}