@pascal-app/editor 1.0.6 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. package/package.json +18 -15
  2. package/src/components/editor/action-menu-button.tsx +4 -1
  3. package/src/components/editor/alignment-3d-guide-layer.tsx +102 -11
  4. package/src/components/editor/bake-thumbnail.tsx +3 -2
  5. package/src/components/editor/custom-camera-controls.tsx +110 -42
  6. package/src/components/editor/duplicate-node.ts +2 -1
  7. package/src/components/editor/elevation-3d-guide-layer.tsx +1 -1
  8. package/src/components/editor/first-person-controls.tsx +77 -68
  9. package/src/components/editor/fit-scene-framing.test.ts +318 -0
  10. package/src/components/editor/fit-scene-framing.ts +142 -0
  11. package/src/components/editor/floating-action-menu.tsx +31 -11
  12. package/src/components/editor/floating-building-action-menu.tsx +1 -1
  13. package/src/components/editor/floor-openings-overlay.tsx +1 -1
  14. package/src/components/editor/floor-region-controls.tsx +2 -2
  15. package/src/components/editor/floorplan-panel.test.ts +220 -0
  16. package/src/components/editor/floorplan-panel.tsx +458 -140
  17. package/src/components/editor/floorplan-wall-typing-keys.test.tsx +152 -0
  18. package/src/components/editor/floorplan-wall-typing-keys.ts +79 -0
  19. package/src/components/editor/footprint-height-handle.tsx +2 -2
  20. package/src/components/editor/grid.tsx +24 -15
  21. package/src/components/editor/group-actions.ts +19 -1
  22. package/src/components/editor/group-floating-action-menu.tsx +1 -1
  23. package/src/components/editor/group-move-3d.ts +27 -2
  24. package/src/components/editor/group-selection-box-3d.tsx +4 -1
  25. package/src/components/editor/group-transform-shared.ts +23 -1
  26. package/src/components/editor/index.tsx +150 -20
  27. package/src/components/editor/inspector-extension-actions.tsx +36 -0
  28. package/src/components/editor/localized-html.tsx +22 -0
  29. package/src/components/editor/measurement-pill.tsx +1 -1
  30. package/src/components/editor/node-action-menu.tsx +46 -12
  31. package/src/components/editor/node-arrow-handles.tsx +2 -3
  32. package/src/components/editor/open-wall-ends-3d-layer.tsx +2 -3
  33. package/src/components/editor/open-wall-ends-hint.tsx +1 -1
  34. package/src/components/editor/opening-guides-3d-layer.tsx +1 -1
  35. package/src/components/editor/quick-measurement-card.tsx +1 -1
  36. package/src/components/editor/registry-action-contributions.test.tsx +67 -6
  37. package/src/components/editor/registry-action-contributions.tsx +115 -15
  38. package/src/components/editor/riser-diagram-panel.tsx +59 -9
  39. package/src/components/editor/room-controls.tsx +4 -3
  40. package/src/components/editor/room-handles-2d.tsx +158 -7
  41. package/src/components/editor/room-handles.tsx +244 -54
  42. package/src/components/editor/room-highlight.tsx +2 -0
  43. package/src/components/editor/room-labels.tsx +33 -17
  44. package/src/components/editor/selection-manager.tsx +15 -102
  45. package/src/components/editor/separator-end-grip.tsx +74 -0
  46. package/src/components/editor/site-edge-labels.tsx +7 -3
  47. package/src/components/editor/thumbnail-generator.test.ts +15 -6
  48. package/src/components/editor/thumbnail-generator.tsx +26 -1
  49. package/src/components/editor/use-floorplan-background-placement.ts +55 -52
  50. package/src/components/editor/views/view-bar.tsx +111 -26
  51. package/src/components/editor/wall-measurement-label.tsx +31 -15
  52. package/src/components/editor/wall-move-side-handles.tsx +15 -7
  53. package/src/components/editor/wall-pull-grip.tsx +193 -0
  54. package/src/components/editor/wall-region-handles.tsx +2 -2
  55. package/src/components/editor/wall-snap-beacon-layer.tsx +134 -33
  56. package/src/components/editor-2d/floorplan-adjacent-walls-layer.test.ts +76 -0
  57. package/src/components/editor-2d/floorplan-adjacent-walls-layer.tsx +186 -0
  58. package/src/components/editor-2d/floorplan-alignment-guide-layer.tsx +63 -3
  59. package/src/components/editor-2d/floorplan-group-move.tsx +32 -4
  60. package/src/components/editor-2d/floorplan-measurement-tool-layer.test.ts +6 -0
  61. package/src/components/editor-2d/floorplan-measurement-tool-layer.tsx +33 -24
  62. package/src/components/editor-2d/floorplan-open-wall-ends-layer.tsx +12 -5
  63. package/src/components/editor-2d/floorplan-registry-action-menu.tsx +2 -1
  64. package/src/components/editor-2d/floorplan-registry-move-overlay.tsx +29 -5
  65. package/src/components/editor-2d/floorplan-snap-beacon-layer.tsx +96 -4
  66. package/src/components/editor-2d/renderers/floorplan-dimension-edit-overlay.tsx +52 -12
  67. package/src/components/editor-2d/renderers/floorplan-draft-measurement.tsx +7 -1
  68. package/src/components/editor-2d/renderers/floorplan-placement-preview-layer.tsx +13 -1
  69. package/src/components/editor-2d/renderers/floorplan-placement-typing-hud.test.tsx +35 -0
  70. package/src/components/editor-2d/renderers/floorplan-placement-typing-hud.tsx +65 -0
  71. package/src/components/editor-2d/renderers/floorplan-registry-layer.test.ts +34 -1
  72. package/src/components/editor-2d/renderers/floorplan-registry-layer.tsx +211 -39
  73. package/src/components/procedural-items/inspector.tsx +59 -12
  74. package/src/components/systems/ceiling/ceiling-bracket-batch.test.ts +2 -0
  75. package/src/components/systems/ceiling/ceiling-system.test.ts +141 -0
  76. package/src/components/systems/ceiling/ceiling-system.tsx +53 -18
  77. package/src/components/systems/roof/roof-edit-system.test.tsx +15 -1
  78. package/src/components/systems/roof/roof-edit-system.tsx +30 -19
  79. package/src/components/tools/distribution/distribution-run-tool.test.tsx +371 -3
  80. package/src/components/tools/distribution/distribution-run-tool.tsx +200 -58
  81. package/src/components/tools/item/move-tool.tsx +1 -6
  82. package/src/components/tools/item/placement-history.test.tsx +1 -1
  83. package/src/components/tools/item/placement-strategies.test.ts +64 -1
  84. package/src/components/tools/item/placement-strategies.ts +5 -9
  85. package/src/components/tools/item/use-placement-coordinator.tsx +31 -35
  86. package/src/components/tools/paint-region/wall-paint-region-tool.tsx +1 -1
  87. package/src/components/tools/registry/item-surface-move.test.ts +11 -0
  88. package/src/components/tools/registry/move-registry-node-tool.test.ts +42 -1
  89. package/src/components/tools/registry/move-registry-node-tool.tsx +38 -14
  90. package/src/components/tools/select/select-candidates.test.ts +45 -0
  91. package/src/components/tools/select/select-candidates.ts +13 -2
  92. package/src/components/tools/shared/cursor-sphere.tsx +10 -3
  93. package/src/components/tools/shared/draft-measurement-label.tsx +1 -1
  94. package/src/components/tools/shared/placement-box.tsx +2 -6
  95. package/src/components/tools/shared/placement-coordinate-input.tsx +94 -0
  96. package/src/components/tools/shared/placement-dimension-guides.tsx +1 -1
  97. package/src/components/tools/shared/segment-angle.ts +0 -4
  98. package/src/components/tools/site/terrain-brush-cursor.tsx +1 -1
  99. package/src/components/tools/tool-manager.tsx +1 -24
  100. package/src/components/tools/wall/wall-drafting.test.ts +299 -23
  101. package/src/components/tools/wall/wall-drafting.ts +132 -24
  102. package/src/components/tools/wall/wall-pull-snap.test.ts +274 -0
  103. package/src/components/tools/wall/wall-pull-snap.ts +563 -0
  104. package/src/components/tools/wall/wall-snap-geometry.test.ts +113 -1
  105. package/src/components/tools/wall/wall-snap-geometry.ts +137 -0
  106. package/src/components/tools/wall/wall-typed-entry.test.ts +99 -0
  107. package/src/components/tools/wall/wall-typed-entry.ts +70 -0
  108. package/src/components/tools/zone/zone-tool.tsx +3 -3
  109. package/src/components/ui/action-menu/action-button.tsx +2 -0
  110. package/src/components/ui/action-menu/camera-actions.tsx +8 -7
  111. package/src/components/ui/action-menu/control-modes.tsx +9 -5
  112. package/src/components/ui/action-menu/follow-pascal-pill.tsx +3 -1
  113. package/src/components/ui/action-menu/follow-pascal-toggle.tsx +7 -1
  114. package/src/components/ui/action-menu/furnish-tools.tsx +7 -6
  115. package/src/components/ui/action-menu/index.tsx +1 -0
  116. package/src/components/ui/action-menu/measurement-control.tsx +35 -29
  117. package/src/components/ui/action-menu/point-ask-button.tsx +4 -3
  118. package/src/components/ui/action-menu/structure-tools.tsx +25 -23
  119. package/src/components/ui/action-menu/view-toggles.test.ts +18 -0
  120. package/src/components/ui/action-menu/view-toggles.tsx +256 -51
  121. package/src/components/ui/build-panel/build-panel.tsx +163 -25
  122. package/src/components/ui/command-palette/editor-commands.tsx +38 -11
  123. package/src/components/ui/controls/finish-swatch.tsx +45 -19
  124. package/src/components/ui/controls/material-picker.tsx +24 -17
  125. package/src/components/ui/controls/metric-control.test.ts +52 -0
  126. package/src/components/ui/controls/metric-control.tsx +62 -24
  127. package/src/components/ui/controls/segmented-control.tsx +5 -2
  128. package/src/components/ui/controls/slider-control.test.tsx +23 -0
  129. package/src/components/ui/controls/slider-control.tsx +47 -19
  130. package/src/components/ui/controls/tool-options-panel.tsx +74 -44
  131. package/src/components/ui/floating-level-selector.tsx +100 -48
  132. package/src/components/ui/helpers/building-helper.tsx +5 -3
  133. package/src/components/ui/helpers/contextual-helper-panel.tsx +97 -37
  134. package/src/components/ui/helpers/helper-manager.test.tsx +106 -3
  135. package/src/components/ui/helpers/helper-manager.tsx +136 -57
  136. package/src/components/ui/helpers/item-helper.tsx +6 -4
  137. package/src/components/ui/helpers/registered-tool-helper.tsx +3 -1
  138. package/src/components/ui/level-duplicate-dialog.tsx +32 -23
  139. package/src/components/ui/level-wall-copy-prompt.tsx +124 -0
  140. package/src/components/ui/panels/collections/collections-popover.tsx +11 -11
  141. package/src/components/ui/panels/deck-boards-fields.tsx +136 -0
  142. package/src/components/ui/panels/floor-foundation-panel.tsx +114 -39
  143. package/src/components/ui/panels/floor-opening-panel.tsx +74 -26
  144. package/src/components/ui/panels/inspector-extensions.tsx +66 -0
  145. package/src/components/ui/panels/mobile-panel-sheet.tsx +3 -1
  146. package/src/components/ui/panels/mobile-selection-bar.tsx +34 -28
  147. package/src/components/ui/panels/multi-field-value.test.ts +27 -0
  148. package/src/components/ui/panels/multi-field-value.ts +20 -1
  149. package/src/components/ui/panels/multi-height-mode.tsx +11 -10
  150. package/src/components/ui/panels/multi-parametric-inspector.tsx +122 -34
  151. package/src/components/ui/panels/multi-selection-panel.tsx +76 -36
  152. package/src/components/ui/panels/node-display.ts +35 -24
  153. package/src/components/ui/panels/panel-manager.tsx +9 -5
  154. package/src/components/ui/panels/panel-wrapper.tsx +63 -127
  155. package/src/components/ui/panels/parametric-field-control.tsx +13 -10
  156. package/src/components/ui/panels/parametric-inspector.tsx +18 -12
  157. package/src/components/ui/panels/reference-panel.tsx +51 -35
  158. package/src/components/ui/panels/room-construction-rows.tsx +465 -66
  159. package/src/components/ui/panels/room-name-options.test.ts +36 -3
  160. package/src/components/ui/panels/room-name-options.ts +110 -11
  161. package/src/components/ui/panels/room-openings-field.tsx +22 -13
  162. package/src/components/ui/panels/room-panel.tsx +207 -100
  163. package/src/components/ui/panels/shape-choice.tsx +7 -5
  164. package/src/components/ui/panels/wall-region-list.tsx +7 -7
  165. package/src/components/ui/primitives/shortcut-token.tsx +10 -6
  166. package/src/components/ui/right-stack.test.ts +13 -6
  167. package/src/components/ui/right-stack.tsx +21 -10
  168. package/src/components/ui/sidebar/icon-rail.tsx +11 -9
  169. package/src/components/ui/sidebar/panels/items-panel/function-tree-panel.tsx +10 -10
  170. package/src/components/ui/sidebar/panels/items-panel/index.tsx +10 -9
  171. package/src/components/ui/sidebar/panels/settings-panel/index.tsx +3 -0
  172. package/src/components/ui/sidebar/panels/settings-panel/keyboard-shortcuts-dialog.tsx +102 -32
  173. package/src/components/ui/sidebar/panels/settings-panel/load-build-dialog.tsx +1 -5
  174. package/src/components/ui/sidebar/panels/site-panel/building-tree-node.tsx +4 -3
  175. package/src/components/ui/sidebar/panels/site-panel/ceiling-tree-node.tsx +5 -3
  176. package/src/components/ui/sidebar/panels/site-panel/chimney-tree-node.tsx +4 -2
  177. package/src/components/ui/sidebar/panels/site-panel/collection-tree-node.tsx +7 -5
  178. package/src/components/ui/sidebar/panels/site-panel/column-tree-node.tsx +4 -2
  179. package/src/components/ui/sidebar/panels/site-panel/default-names.ts +75 -0
  180. package/src/components/ui/sidebar/panels/site-panel/door-tree-node.tsx +4 -2
  181. package/src/components/ui/sidebar/panels/site-panel/dormer-tree-node.tsx +4 -2
  182. package/src/components/ui/sidebar/panels/site-panel/elevator-tree-node.tsx +4 -2
  183. package/src/components/ui/sidebar/panels/site-panel/fence-tree-node.tsx +4 -2
  184. package/src/components/ui/sidebar/panels/site-panel/gutter-tree-node.tsx +4 -2
  185. package/src/components/ui/sidebar/panels/site-panel/index.tsx +118 -72
  186. package/src/components/ui/sidebar/panels/site-panel/inline-rename-input.tsx +36 -3
  187. package/src/components/ui/sidebar/panels/site-panel/item-tree-node.tsx +4 -2
  188. package/src/components/ui/sidebar/panels/site-panel/level-tree-node.tsx +7 -4
  189. package/src/components/ui/sidebar/panels/site-panel/registry-tree-node.tsx +8 -2
  190. package/src/components/ui/sidebar/panels/site-panel/roof-tree-node.tsx +8 -5
  191. package/src/components/ui/sidebar/panels/site-panel/shelf-tree-node.tsx +4 -2
  192. package/src/components/ui/sidebar/panels/site-panel/slab-tree-node.tsx +9 -4
  193. package/src/components/ui/sidebar/panels/site-panel/solar-panel-tree-node.tsx +4 -2
  194. package/src/components/ui/sidebar/panels/site-panel/spawn-tree-node.tsx +4 -2
  195. package/src/components/ui/sidebar/panels/site-panel/stair-tree-node.tsx +8 -7
  196. package/src/components/ui/sidebar/panels/site-panel/tree-node-actions.tsx +7 -6
  197. package/src/components/ui/sidebar/panels/site-panel/tree-node.tsx +16 -1
  198. package/src/components/ui/sidebar/panels/site-panel/unit-tree-node.tsx +15 -8
  199. package/src/components/ui/sidebar/panels/site-panel/wall-tree-node.tsx +4 -2
  200. package/src/components/ui/sidebar/panels/site-panel/window-tree-node.tsx +4 -2
  201. package/src/components/ui/sidebar/panels/site-panel/zone-membership-checkbox.tsx +3 -1
  202. package/src/components/ui/sidebar/panels/site-panel/zone-tree-node.tsx +19 -9
  203. package/src/components/ui/sidebar/panels/zone-panel/index.tsx +25 -14
  204. package/src/components/ui/sidebar/tab-bar.tsx +4 -1
  205. package/src/components/ui/sidebar/use-plugin-panels.tsx +19 -10
  206. package/src/components/ui/snap-target-badge.tsx +7 -6
  207. package/src/components/ui/wall-type/wall-type-editor-dialog.tsx +721 -0
  208. package/src/components/ui/wall-type/wall-type-menu.tsx +167 -0
  209. package/src/components/viewer/floorplan-compass-button.tsx +12 -3
  210. package/src/components/viewer/floorplan-preview.tsx +27 -19
  211. package/src/components/viewer/render-settings-menu.tsx +294 -0
  212. package/src/components/viewer/sky-control.tsx +710 -0
  213. package/src/components/viewer/use-viewer-ui-sounds.test.ts +15 -0
  214. package/src/components/viewer/use-viewer-ui-sounds.ts +46 -0
  215. package/src/components/viewer/viewer-controls-bar.tsx +278 -260
  216. package/src/components/viewer/viewer-hover-label.tsx +12 -4
  217. package/src/components/viewer/viewer-rooms.tsx +62 -5
  218. package/src/components/viewer/viewer-scene-header.tsx +28 -17
  219. package/src/components/viewer/viewer-stage-switcher.tsx +4 -2
  220. package/src/components/viewer-overlay.tsx +8 -0
  221. package/src/components/walkthrough-hud.tsx +75 -2
  222. package/src/hooks/use-keyboard.test.ts +85 -4
  223. package/src/hooks/use-keyboard.ts +65 -7
  224. package/src/hooks/use-selected-room.ts +12 -1
  225. package/src/i18n/floor-footprint-name.ts +30 -0
  226. package/src/i18n/level-name.ts +39 -0
  227. package/src/i18n/locales/en/messages.po +15849 -0
  228. package/src/i18n/locales/en/messages.ts +1 -0
  229. package/src/i18n/locales/en-XA/messages.ts +1 -0
  230. package/src/i18n/locales/es/messages.po +39331 -0
  231. package/src/i18n/locales/es/messages.ts +1 -0
  232. package/src/i18n/locales/fr/messages.po +39331 -0
  233. package/src/i18n/locales/fr/messages.ts +1 -0
  234. package/src/i18n/locales/ja/messages.po +39331 -0
  235. package/src/i18n/locales/ja/messages.ts +1 -0
  236. package/src/i18n/locales/zh-CN/messages.po +39331 -0
  237. package/src/i18n/locales/zh-CN/messages.ts +1 -0
  238. package/src/i18n/locales.test.ts +63 -0
  239. package/src/i18n/locales.ts +32 -0
  240. package/src/i18n/message-slot.tsx +25 -0
  241. package/src/i18n/node-messages.ts +169 -0
  242. package/src/i18n/pseudo-locale.ts +17 -0
  243. package/src/i18n/published-entry.test.ts +17 -0
  244. package/src/i18n/scene-theme-name.ts +16 -0
  245. package/src/index.tsx +224 -45
  246. package/src/lib/add-storey.test.ts +3 -3
  247. package/src/lib/contextual-help.test.ts +20 -1
  248. package/src/lib/contextual-help.ts +101 -19
  249. package/src/lib/continuation.ts +38 -11
  250. package/src/lib/elevation-guides.ts +21 -6
  251. package/src/lib/elevator-support.ts +1 -72
  252. package/src/lib/floor-footprints.test.ts +3 -2
  253. package/src/lib/floor-footprints.ts +1 -9
  254. package/src/lib/floor-foundation-support.test.ts +15 -6
  255. package/src/lib/floor-opening-draft.ts +1 -1
  256. package/src/lib/floor-region-session.ts +1 -1
  257. package/src/lib/floorplan/dimension-drive.test.ts +36 -2
  258. package/src/lib/floorplan/dimension-drive.ts +68 -3
  259. package/src/lib/floorplan/floorplan-export.test.ts +16 -5
  260. package/src/lib/floorplan/floorplan-export.tsx +13 -16
  261. package/src/lib/floorplan/floorplan-extension.test.ts +11 -12
  262. package/src/lib/floorplan/floorplan-extension.ts +37 -18
  263. package/src/lib/floorplan/floorplan-mode.test.ts +13 -6
  264. package/src/lib/floorplan/floorplan-mode.ts +14 -12
  265. package/src/lib/floorplan/floorplan-plugin-install.test.tsx +1 -1
  266. package/src/lib/floorplan/floorplan-readonly.ts +3 -3
  267. package/src/lib/floorplan/open-wall-ends.ts +2 -1
  268. package/src/lib/floorplan/schedules.ts +10 -6
  269. package/src/lib/floorplan/site-plan/site-annotations.test.ts +46 -1
  270. package/src/lib/floorplan/site-plan/site-annotations.ts +3 -0
  271. package/src/lib/floorplan/site-plan/site-parts.ts +6 -3
  272. package/src/lib/geometry-script/author.test.ts +114 -0
  273. package/src/lib/geometry-script/author.ts +55 -23
  274. package/src/lib/geometry-script/client.ts +3 -0
  275. package/src/lib/geometry-script/finish-scripts.ts +7 -7
  276. package/src/lib/gesture-lifecycle.ts +3 -1
  277. package/src/lib/glb-export.test.ts +327 -0
  278. package/src/lib/glb-export.ts +70 -2
  279. package/src/lib/grid-frame.test.ts +56 -3
  280. package/src/lib/grid-frame.ts +28 -1
  281. package/src/lib/history.test.ts +2 -1
  282. package/src/lib/hud-title.ts +48 -24
  283. package/src/lib/ifc-export.test.ts +41 -1
  284. package/src/lib/inspector-card-mode.test.ts +3 -31
  285. package/src/lib/inspector-card-mode.ts +5 -10
  286. package/src/lib/inspector-expanded.test.ts +13 -0
  287. package/src/lib/inspector-expanded.ts +13 -1
  288. package/src/lib/interaction/scope.ts +1 -0
  289. package/src/lib/keyboard-pan.test.ts +7 -0
  290. package/src/lib/keyboard-pan.ts +9 -2
  291. package/src/lib/layer-thickness.test.ts +22 -0
  292. package/src/lib/layer-thickness.ts +79 -0
  293. package/src/lib/level-selection.test.ts +18 -2
  294. package/src/lib/level-selection.ts +31 -8
  295. package/src/lib/linear-display.ts +1 -1
  296. package/src/lib/live-gesture-round-trip.test.ts +1 -1
  297. package/src/lib/lot/drop-in.test.ts +59 -1
  298. package/src/lib/lot/drop-in.ts +42 -50
  299. package/src/lib/material-swatch-style.ts +24 -0
  300. package/src/lib/measurement-label.test.ts +1 -1
  301. package/src/lib/measurement-parser.ts +7 -3
  302. package/src/lib/measurements.test.ts +24 -6
  303. package/src/lib/measurements.ts +1 -203
  304. package/src/lib/mezzanine-selection.test.ts +3 -1
  305. package/src/lib/node-action-movement.test.tsx +115 -0
  306. package/src/lib/node-action-movement.ts +2 -0
  307. package/src/lib/orbit-near-plane.test.ts +12 -0
  308. package/src/lib/orbit-near-plane.ts +13 -0
  309. package/src/lib/paint-regions.test.ts +8 -5
  310. package/src/lib/paint-scope.test.ts +53 -0
  311. package/src/lib/paint-scope.ts +18 -4
  312. package/src/lib/panel-rows.ts +17 -8
  313. package/src/lib/placement-metadata.ts +4 -0
  314. package/src/lib/point-ask/describe-target.ts +6 -8
  315. package/src/lib/point-ask/region.ts +1 -1
  316. package/src/lib/print-shell-compiler.ts +12 -1
  317. package/src/lib/print-wall-solids.test.ts +11 -0
  318. package/src/lib/print-wall-solids.ts +9 -0
  319. package/src/lib/reference-scale.ts +83 -0
  320. package/src/lib/room-assembly-overlay.ts +1 -1
  321. package/src/lib/room-built-on.test.ts +28 -17
  322. package/src/lib/room-built-on.ts +21 -17
  323. package/src/lib/room-construction-commands.ts +3 -2
  324. package/src/lib/room-construction.test.ts +28 -1
  325. package/src/lib/room-construction.ts +14 -0
  326. package/src/lib/room-controls-phase6.test.ts +141 -1
  327. package/src/lib/room-handle-drag.ts +554 -58
  328. package/src/lib/room-name-catalog.test.ts +8 -0
  329. package/src/lib/room-name-catalog.ts +8 -1
  330. package/src/lib/room-name-messages.test.ts +132 -0
  331. package/src/lib/room-name-messages.ts +147 -0
  332. package/src/lib/room-name-storage.test.ts +334 -0
  333. package/src/lib/room-push-dimensions.test.ts +38 -1
  334. package/src/lib/room-push-dimensions.ts +226 -2
  335. package/src/lib/room-selection.test.ts +23 -6
  336. package/src/lib/scene-bounds.test.ts +144 -0
  337. package/src/lib/scene-bounds.ts +79 -15
  338. package/src/lib/scene-clipboard.test.ts +70 -49
  339. package/src/lib/scene-clipboard.ts +11 -5
  340. package/src/lib/selection-cycle.ts +63 -0
  341. package/src/lib/separator-edit.test.ts +431 -0
  342. package/src/lib/separator-edit.ts +179 -0
  343. package/src/lib/separator-lines.ts +38 -0
  344. package/src/lib/sfx-bus.ts +27 -1
  345. package/src/lib/sfx-player.ts +16 -0
  346. package/src/lib/snapping-mode.test.ts +23 -1
  347. package/src/lib/tool-cursor-icon.ts +5 -1
  348. package/src/lib/tool-shortcuts.ts +130 -0
  349. package/src/lib/viewer-selection.test.ts +28 -24
  350. package/src/lib/viewer-selection.ts +21 -6
  351. package/src/lib/wall-draw-variant.test.ts +7 -6
  352. package/src/lib/wall-draw-variant.ts +107 -6
  353. package/src/lib/wall-nudge.test.ts +44 -0
  354. package/src/lib/wall-nudge.ts +131 -0
  355. package/src/lib/wall-parallel-snap.test.ts +83 -0
  356. package/src/lib/wall-parallel-snap.ts +176 -0
  357. package/src/lib/wall-placement-pointer.test.ts +23 -0
  358. package/src/lib/wall-placement-pointer.ts +18 -0
  359. package/src/lib/wall-pull.test.ts +245 -0
  360. package/src/lib/wall-pull.ts +209 -0
  361. package/src/lib/wall-push-line-up.test.ts +132 -0
  362. package/src/lib/wall-region-list.ts +17 -6
  363. package/src/lib/wall-run-snap.test.ts +188 -0
  364. package/src/lib/wall-run-snap.ts +83 -0
  365. package/src/lib/wall-type.test.ts +125 -0
  366. package/src/lib/wall-type.ts +119 -0
  367. package/src/lib/window-interaction.test.ts +44 -0
  368. package/src/lib/world-grid-snap.test.ts +139 -2
  369. package/src/lib/world-grid-snap.ts +102 -105
  370. package/src/store/use-alignment-guides.ts +27 -1
  371. package/src/store/use-editor.tsx +53 -0
  372. package/src/store/use-floorplan-annotation-visibility.test.ts +64 -0
  373. package/src/store/use-floorplan-annotation-visibility.ts +47 -22
  374. package/src/store/use-placement-typing.test.ts +165 -0
  375. package/src/store/use-placement-typing.ts +186 -0
  376. package/src/store/use-wall-snap-indicator.ts +15 -2
  377. package/src/components/tools/elevator/elevator-defaults.ts +0 -8
  378. package/src/components/tools/elevator/elevator-tool.tsx +0 -372
  379. package/src/components/tools/elevator/move-elevator-tool.tsx +0 -262
  380. package/src/lib/door-interaction.ts +0 -102
  381. package/src/lib/measurement-label.ts +0 -68
  382. package/src/lib/window-interaction.ts +0 -100
package/src/index.tsx CHANGED
@@ -2,11 +2,25 @@
2
2
  // own shells on top of `@pascal-app/editor` (community-app, embedders)
3
3
  // don't have to learn three separate package imports. The canonical
4
4
  // definitions still live in `@pascal-app/core` / `@pascal-app/viewer`.
5
+ import { registerCompiledMessages as registerEditorMessages } from '@pascal-app/core'
6
+ import { messages as editorEnglishMessages } from './i18n/locales/en/messages'
7
+
8
+ // Published-package consumers need compiled English too: Lingui cannot
9
+ // interpolate a raw fallback literal in production. Other bundled locales
10
+ // remain explicitly host-registered through `@pascal-app/editor/locales`.
11
+ registerEditorMessages('en', '', editorEnglishMessages)
12
+
5
13
  export {
6
14
  type ApplySceneSnapshotOptions,
7
15
  acquireSceneReadOnlyLease,
8
16
  applyScenePatch,
9
17
  applySceneSnapshot,
18
+ buildMeasurementAngleArcPoints,
19
+ type CompiledTranslationMessages,
20
+ closeDoorOpenState,
21
+ closeWindowOpenState,
22
+ createI18n,
23
+ cubicMetersToVolumeUnit,
10
24
  DEFAULT_CURVED_STAIR_INNER_RADIUS,
11
25
  DEFAULT_CURVED_STAIR_SWEEP_ANGLE,
12
26
  DEFAULT_SPIRAL_SHOW_CENTER_COLUMN,
@@ -22,6 +36,37 @@ export {
22
36
  DEFAULT_STAIR_THICKNESS,
23
37
  DEFAULT_STAIR_TYPE,
24
38
  DEFAULT_STAIR_WIDTH,
39
+ defaultI18n,
40
+ formatAngleRadians,
41
+ formatAreaLabel,
42
+ formatLength,
43
+ formatLinearMeasurement,
44
+ formatNumber,
45
+ formatVolumeLabel,
46
+ getAreaUnitLabel,
47
+ getDisplayedDoorValue,
48
+ getDisplayedWindowShutterValue,
49
+ getDisplayedWindowValue,
50
+ getLinearUnitLabel,
51
+ getLocale,
52
+ getVolumeUnitLabel,
53
+ isOperableWindowType,
54
+ type LinearUnit,
55
+ linearControlValueToMeters,
56
+ linearUnitToMeters,
57
+ metersToLinearUnit,
58
+ normalizeDecimalInput,
59
+ openDoorOpenState,
60
+ openWindowOpenState,
61
+ type PascalI18n,
62
+ PascalI18nProvider,
63
+ parseLinearMeasurementInput,
64
+ parseLocalizedNumber,
65
+ registerCompiledMessages,
66
+ registerMessages,
67
+ resolveElevatorNodeSupportY,
68
+ resolveElevatorSupportLevelId,
69
+ resolveElevatorSupportY,
25
70
  type SceneCommit,
26
71
  type SceneCommitListener,
27
72
  type SceneCommitOrigin,
@@ -29,10 +74,31 @@ export {
29
74
  type SceneNodePatch,
30
75
  type ScenePatch,
31
76
  type SceneSnapshot,
77
+ separatorFloorElevation,
78
+ setLocale,
79
+ setWindowShuttersOpenState,
80
+ squareMetersToAreaUnit,
81
+ subscribe,
32
82
  subscribeSceneCommits,
83
+ type TranslationMessage,
84
+ type TranslationMessages,
85
+ type TranslationParams,
86
+ translate,
87
+ useLocale,
88
+ usePascalI18n,
33
89
  useScene,
90
+ type WindowOpenAnimationOptions,
91
+ type WindowShutterField,
34
92
  } from '@pascal-app/core'
35
- export { useViewer } from '@pascal-app/viewer'
93
+ export {
94
+ MEASUREMENT_ACTIVE_COLOR,
95
+ MEASUREMENT_DANGLING_COLOR,
96
+ MEASUREMENT_PERSISTENT_COLOR,
97
+ measurementPolygonLabelAnchor,
98
+ measurementPresentationColor,
99
+ triangulateMeasurementPolygon,
100
+ useViewer,
101
+ } from '@pascal-app/viewer'
36
102
  export type { EditorProps } from './components/editor'
37
103
  export { default as Editor } from './components/editor'
38
104
  export { ActionMenuButton } from './components/editor/action-menu-button'
@@ -68,6 +134,7 @@ export { FloatingActionMenu as FloatingMenu } from './components/editor/floating
68
134
  // flags. Tools place onto `useViewer.selection.levelId`, so the host must set a
69
135
  // building + level selection first.
70
136
  export { EDITOR_GRID_INPUT_NAME, Grid } from './components/editor/grid'
137
+ export { Html as LocalizedHtml } from './components/editor/localized-html'
71
138
  export {
72
139
  DimensionPill,
73
140
  type DimensionPillPart,
@@ -98,12 +165,15 @@ export {
98
165
  } from './components/editor/node-arrow-handles'
99
166
  export { QuickMeasurementCard } from './components/editor/quick-measurement-card'
100
167
  export { SelectionManager } from './components/editor/selection-manager'
168
+ export { SeparatorEndGrip } from './components/editor/separator-end-grip'
101
169
  export {
102
170
  type SnapshotCameraData,
103
171
  ThumbnailGenerator,
104
172
  } from './components/editor/thumbnail-generator'
105
173
  export { PLUGINS_VIEW_ID } from './components/editor/views/use-editor-views'
106
174
  export { WallMoveSideHandles } from './components/editor/wall-move-side-handles'
175
+ export { WallPushArrow } from './components/editor/wall-push-arrow'
176
+ export { useWallsBelowSetting } from './components/editor-2d/floorplan-adjacent-walls-layer'
107
177
  export { useFloorplanRender } from './components/editor-2d/floorplan-render-context'
108
178
  export { FloorplanDimensionRenderer } from './components/editor-2d/renderers/floorplan-dimension-renderer'
109
179
  export {
@@ -124,6 +194,7 @@ export {
124
194
  buildSvgArrowHeadPoints,
125
195
  getArcPlanPoint,
126
196
  } from './components/editor-2d/svg-paths'
197
+ export { useCeilingsSetting } from './components/systems/ceiling/ceiling-system'
127
198
  export type {
128
199
  SelectionAffordanceHistoryApi,
129
200
  SelectionAffordanceInteractionApi,
@@ -154,7 +225,11 @@ export {
154
225
  usePlacementCoordinator,
155
226
  } from './components/tools/item/use-placement-coordinator'
156
227
  export { MoveRegistryNodeTool } from './components/tools/registry/move-registry-node-tool'
157
- export { useRegistryToolContext } from './components/tools/registry-tool-context'
228
+ export {
229
+ type RegistryToolContextValue,
230
+ RegistryToolProvider,
231
+ useRegistryToolContext,
232
+ } from './components/tools/registry-tool-context'
158
233
  export { CursorSphere } from './components/tools/shared/cursor-sphere'
159
234
  export {
160
235
  DRAFT_LABEL_Y_OFFSET,
@@ -171,6 +246,7 @@ export {
171
246
  resolveLevelConstructionPlane,
172
247
  } from './components/tools/shared/horizontal-construction-plane'
173
248
  export { PlacementBox } from './components/tools/shared/placement-box'
249
+ export { PlacementCoordinateInput } from './components/tools/shared/placement-coordinate-input'
174
250
  export { PlacementDimensionGuides } from './components/tools/shared/placement-dimension-guides'
175
251
  // Pointer-decided support surface (deck top vs floor underneath) — the
176
252
  // draw tools (wall / fence) ride their grid plane and commit cap on it.
@@ -186,7 +262,6 @@ export {
186
262
  type PolygonEditorProps,
187
263
  } from './components/tools/shared/polygon-editor'
188
264
  export {
189
- formatAngleRadians,
190
265
  getAngleArcToSegmentReference,
191
266
  getAngleToSegmentReference,
192
267
  getSegmentAngleReferenceAtPoint,
@@ -195,6 +270,7 @@ export {
195
270
  export { preloadRegistryToolModules, ToolManager } from './components/tools/tool-manager'
196
271
  export {
197
272
  chainEndJoinsExistingWall,
273
+ createInvisibleWallOnCurrentLevel,
198
274
  createWallOnCurrentLevel,
199
275
  findWallSnapTarget,
200
276
  getSegmentGridStep,
@@ -212,6 +288,26 @@ export {
212
288
  type WallPlanPoint,
213
289
  type WallSnapRadii,
214
290
  } from './components/tools/wall/wall-drafting'
291
+ export {
292
+ lockWallPullDirection,
293
+ snapWallPullPoint,
294
+ WALL_PULL_ANGLE_STEP,
295
+ WALL_PULL_LOCK_TOLERANCE,
296
+ WALL_PULL_SNAP_LABELS,
297
+ WALL_PULL_SNAP_RADII,
298
+ type WallPullDirectionLock,
299
+ type WallPullGuide,
300
+ type WallPullGuideKind,
301
+ type WallPullSnapInput,
302
+ type WallPullSnapKind,
303
+ type WallPullSnapRadii,
304
+ type WallPullSnapResult,
305
+ } from './components/tools/wall/wall-pull-snap'
306
+ export {
307
+ formatWallDraftHeading,
308
+ resolveTypedWallEnd,
309
+ wallDraftHeadingDegrees,
310
+ } from './components/tools/wall/wall-typed-entry'
215
311
  // `ToolbarLeft` / `ToolbarRight` alias `ViewerToolbarLeft` / `ViewerToolbarRight`
216
312
  // (same components) under the names headless hosts compose their toolbars with.
217
313
  export {
@@ -234,6 +330,8 @@ export {
234
330
  } from './components/ui/build-panel/build-panel'
235
331
  export { useCommandPalette } from './components/ui/command-palette'
236
332
  export { ActionButton, ActionGroup } from './components/ui/controls/action-button'
333
+ // A finish row in a node panel: the paint tool's picker and its write for one paint role.
334
+ export { FinishSwatch } from './components/ui/controls/finish-swatch'
237
335
  export {
238
336
  MaterialPaintPanel,
239
337
  type MaterialPaintPanelProps,
@@ -275,13 +373,17 @@ export { applyMultiHeightMode } from './components/ui/panels/multi-height-mode'
275
373
  // a kind-owned panel and need PanelWrapper for the chrome.
276
374
  export { PanelWrapper } from './components/ui/panels/panel-wrapper'
277
375
  export { ParametricInspector as Inspector } from './components/ui/panels/parametric-inspector'
376
+ // A floor's script (a room's, a slab's): its code to read and a way to take it off.
377
+ export { ScriptedFinishRow } from './components/ui/panels/room-panel'
278
378
  export { ShapeChoice } from './components/ui/panels/shape-choice'
279
379
  export { WallPaintRegionList } from './components/ui/panels/wall-region-list'
280
380
  export { PALETTE_COLORS } from './components/ui/primitives/color-dot'
281
381
  export {
282
382
  DropdownMenu,
283
383
  DropdownMenuContent,
384
+ DropdownMenuGroup,
284
385
  DropdownMenuItem,
386
+ DropdownMenuLabel,
285
387
  DropdownMenuSeparator,
286
388
  DropdownMenuSub,
287
389
  DropdownMenuSubContent,
@@ -316,6 +418,8 @@ export {
316
418
  SnapTargetBadge,
317
419
  SnapTargetIcon,
318
420
  } from './components/ui/snap-target-badge'
421
+ // A wall's project wall types: new, edit, duplicate (the wall panel's Assembly).
422
+ export { WallTypeMenu } from './components/ui/wall-type/wall-type-menu'
319
423
  export {
320
424
  FloorplanCompassButton,
321
425
  type FloorplanCompassButtonProps,
@@ -325,7 +429,14 @@ export {
325
429
  type FloorplanPreviewProps,
326
430
  type FloorplanPreviewScene,
327
431
  } from './components/viewer/floorplan-preview'
432
+ export {
433
+ DaylightMenu,
434
+ EdgesToggleItem,
435
+ QualityMenu,
436
+ } from './components/viewer/render-settings-menu'
437
+ export { openSkyPanel, SkyControl, useSkyPanel } from './components/viewer/sky-control'
328
438
  export { useViewerCameraNavigationSync } from './components/viewer/use-viewer-camera-navigation-sync'
439
+ export { useViewerUiSounds } from './components/viewer/use-viewer-ui-sounds'
329
440
  export {
330
441
  ViewerControlsBar,
331
442
  type ViewerControlsBarProps,
@@ -351,6 +462,7 @@ export {
351
462
  type ViewerStageSwitcherProps,
352
463
  } from './components/viewer/viewer-stage-switcher'
353
464
  export {
465
+ DroneHud,
354
466
  WalkthroughHud,
355
467
  type WalkthroughHudProps,
356
468
  type WalkthroughInteract,
@@ -366,6 +478,18 @@ export { usePlacementNotice } from './hooks/use-placement-notice'
366
478
  export { useReducedMotion } from './hooks/use-reduced-motion'
367
479
  export { useSelectedRoom } from './hooks/use-selected-room'
368
480
  export { type Selection, useSelection } from './hooks/use-selection'
481
+ export { localizedLevelName } from './i18n/level-name'
482
+ export {
483
+ messageSlug,
484
+ nodeDescriptionDescriptor,
485
+ nodeLabel,
486
+ nodeLabelDescriptor,
487
+ toolHintChipLabel,
488
+ toolHintDescriptor,
489
+ toolHintKey,
490
+ toolHintLabel,
491
+ } from './i18n/node-messages'
492
+ export { sceneThemeName } from './i18n/scene-theme-name'
369
493
  export {
370
494
  clearPlacementSurface,
371
495
  getPlacementSurface,
@@ -396,7 +520,12 @@ export {
396
520
  resolveCeilingPlanPointSnap,
397
521
  } from './lib/ceiling-plan-snap'
398
522
  export { EDITOR_LAYER } from './lib/constants'
399
- export type { ContextualShortcutHint } from './lib/contextual-help'
523
+ export {
524
+ AXIS_MOVE_DRAG_LABEL,
525
+ type ContextualShortcutHint,
526
+ PATH_POINT_DRAG_LABEL,
527
+ ROTATE_HANDLE_DRAG_LABEL,
528
+ } from './lib/contextual-help'
400
529
  export {
401
530
  CONTEXTUAL_HELP_NODE_EXTENSION_KEY,
402
531
  type ContextualHelpNodeExtension,
@@ -411,11 +540,6 @@ export {
411
540
  nextContinuation,
412
541
  } from './lib/continuation'
413
542
  export { canDirectMoveNode } from './lib/direct-manipulation'
414
- export {
415
- closeDoorOpenState,
416
- getDisplayedDoorValue,
417
- openDoorOpenState,
418
- } from './lib/door-interaction'
419
543
  export { downloadProjectFile } from './lib/download-project-file'
420
544
  export { createEditorApi } from './lib/editor-api'
421
545
  export {
@@ -437,12 +561,7 @@ export {
437
561
  resolveElevationSnapMatch,
438
562
  resolveStructuralElevationSnap,
439
563
  } from './lib/elevation-guides'
440
- export {
441
- resolveCurrentBuildingId,
442
- resolveElevatorNodeSupportY,
443
- resolveElevatorSupportLevelId,
444
- resolveElevatorSupportY,
445
- } from './lib/elevator-support'
564
+ export { resolveCurrentBuildingId } from './lib/elevator-support'
446
565
  export type { ExportTextureUtils } from './lib/export-texture-utils'
447
566
  export { getFloatingMenuScale } from './lib/floating-menu-scale'
448
567
  export { startOpeningDraft } from './lib/floor-opening-draft'
@@ -491,6 +610,7 @@ export {
491
610
  type FloorplanSchedule,
492
611
  type FloorplanToolContext,
493
612
  type FloorplanToolMode,
613
+ type FloorplanWallDimensionFaces,
494
614
  floorplanGeometryMetadata,
495
615
  getFloorplanNodeExtension,
496
616
  readFloorplanContext,
@@ -584,6 +704,11 @@ export {
584
704
  editorFinishScriptHost,
585
705
  finishScriptCode,
586
706
  } from './lib/geometry-script/finish-scripts'
707
+ export {
708
+ beginGesture,
709
+ type GestureCancelReason,
710
+ type GestureHandle,
711
+ } from './lib/gesture-lifecycle'
587
712
  export { exportSceneToGlb, type GlbExportOptions } from './lib/glb-export'
588
713
  export {
589
714
  type EditorGridEvent,
@@ -620,6 +745,11 @@ export {
620
745
  scopeNodeId,
621
746
  } from './lib/interaction/scope'
622
747
  export { isEditableKeyboardTarget } from './lib/keyboard-pan'
748
+ export {
749
+ formatLayerDepth,
750
+ formatLayerThickness,
751
+ parseLayerThickness,
752
+ } from './lib/layer-thickness'
623
753
  export { selectPlacedNode } from './lib/level-selection'
624
754
  // Lot drop-in — address → parcel → streets → front edge → setbacks, on the
625
755
  // site node, through the parcel provider the host sets.
@@ -664,10 +794,6 @@ export {
664
794
  isCreatableMeasurementKind,
665
795
  normalizeCreatableMeasurementKind,
666
796
  } from './lib/measurement-kind'
667
- export {
668
- measurementPolygonLabelAnchor,
669
- triangulateMeasurementPolygon,
670
- } from './lib/measurement-label'
671
797
  export {
672
798
  type LingoUnitSpec,
673
799
  lingoUnitSpec,
@@ -677,25 +803,8 @@ export {
677
803
  parseMeasurement,
678
804
  } from './lib/measurement-parser'
679
805
  export {
680
- buildMeasurementAngleArcPoints,
681
- cubicMetersToVolumeUnit,
682
- formatAreaLabel,
683
- formatLinearMeasurement,
684
- formatVolumeLabel,
685
- getAreaUnitLabel,
686
- getLinearUnitLabel,
687
- getVolumeUnitLabel,
688
- type LinearUnit,
689
- linearControlValueToMeters,
690
- linearUnitToMeters,
691
- MEASUREMENT_ACTIVE_COLOR,
692
- MEASUREMENT_DANGLING_COLOR,
693
806
  MEASUREMENT_FLOORPLAN_COLOR,
694
- MEASUREMENT_PERSISTENT_COLOR,
695
807
  measurementFloorplanPresentationColor,
696
- measurementPresentationColor,
697
- metersToLinearUnit,
698
- squareMetersToAreaUnit,
699
808
  } from './lib/measurements'
700
809
  export type {
701
810
  ModelExport,
@@ -713,6 +822,7 @@ export {
713
822
  } from './lib/paint-scope'
714
823
  export {
715
824
  getNodePanelModel,
825
+ type MultiPanelControl,
716
826
  type NodePanelModel,
717
827
  PANEL_MODEL_EXTENSION,
718
828
  type PanelAction,
@@ -773,7 +883,13 @@ export { clearRoofDuplicateMetadata, duplicateRoofSubtree } from './lib/roof-dup
773
883
  // kind-owned door / window tools in `@pascal-app/nodes` and the item
774
884
  // placement coordinator's roof-wall strategy.
775
885
  export { hasRoofFaceChildOverlap, type RoofWallHit, resolveRoofWallHit } from './lib/roof-wall-hit'
776
- export { WALL_PUSH_AFFORDANCE, type WallPushArrowPayload } from './lib/room-handle-drag'
886
+ export {
887
+ selectedWallDimensions,
888
+ separatorPushHandles,
889
+ WALL_PUSH_AFFORDANCE,
890
+ type WallPushArrowPayload,
891
+ } from './lib/room-handle-drag'
892
+ export { displayRoomName } from './lib/room-name-messages'
777
893
  export type { RoomKey, RoomSelectionRecord } from './lib/room-selection'
778
894
  export { popRoomSelection, selectRoom } from './lib/room-selection-commands'
779
895
  export {
@@ -790,8 +906,13 @@ export {
790
906
  remapSceneMaterialRefs,
791
907
  sceneMaterialUsageCounts,
792
908
  } from './lib/scene-material-refs'
909
+ export {
910
+ beginSeparatorEndDrag,
911
+ runSeparatorEndDrag,
912
+ type SeparatorEndDrag,
913
+ } from './lib/separator-edit'
793
914
  export { movementSfxStepKey } from './lib/sfx/movement-tick'
794
- export { emitDeleteSFX, triggerSFX } from './lib/sfx-bus'
915
+ export { emitDeleteSFX, initSFXBus, triggerSFX } from './lib/sfx-bus'
795
916
  export { playSFX, type SFXName, type SFXPlaybackOptions } from './lib/sfx-player'
796
917
  export { showSidebarPanel } from './lib/sidebar-panel'
797
918
  export {
@@ -848,6 +969,7 @@ export {
848
969
  sculptFieldForSite,
849
970
  terrainPointInsideSite,
850
971
  } from './lib/terrain-sculpt'
972
+ export { withToolShortcut } from './lib/tool-shortcuts'
851
973
  export { isTypingTarget } from './lib/typing-target'
852
974
  export { enterUnitFocus } from './lib/units'
853
975
  export { exportSceneToUsdz, type UsdzExportOptions } from './lib/usdz-export'
@@ -868,10 +990,27 @@ export {
868
990
  } from './lib/viewer-selection'
869
991
  export {
870
992
  getWallDrawVariant,
993
+ getWallLineKind,
994
+ INVISIBLE_WALL_DRAFT_THICKNESS,
995
+ invisibleWallDraftSnapLines,
871
996
  selectWallDrawVariant,
997
+ selectWallKind,
998
+ useWallDraftThickness,
872
999
  useWallDrawVariant,
1000
+ useWallKind,
1001
+ WALL_KINDS,
873
1002
  type WallDrawVariant,
1003
+ type WallKind,
1004
+ type WallLineKind,
874
1005
  } from './lib/wall-draw-variant'
1006
+ export {
1007
+ nearestWallParallelTarget,
1008
+ nudgeWallPosition,
1009
+ publishWallParallelGuide,
1010
+ WALL_PARALLEL_SNAP_RADIUS,
1011
+ type WallParallelTarget,
1012
+ wallParallelTargets,
1013
+ } from './lib/wall-parallel-snap'
875
1014
  export {
876
1015
  createWallPointerTracker,
877
1016
  wallPointerInParent,
@@ -884,13 +1023,33 @@ export {
884
1023
  startWallPolygonDraft,
885
1024
  wallPolygonDraftWalls,
886
1025
  } from './lib/wall-polygon-draft'
887
- export { writeWindowChanges } from './lib/window-changes'
888
1026
  export {
889
- closeWindowOpenState,
890
- getDisplayedWindowValue,
891
- isOperableWindowType,
892
- openWindowOpenState,
893
- } from './lib/window-interaction'
1027
+ endWallPullRun,
1028
+ releaseWallPullDrag,
1029
+ startWallPull,
1030
+ useWallPullRun,
1031
+ WALL_PULL_AFFORDANCE,
1032
+ WALL_PULL_GRIP_TITLE,
1033
+ type WallPullGripPayload,
1034
+ type WallPullRun,
1035
+ wallDraftIsRun,
1036
+ wallPullSeed,
1037
+ wallPullTypePatch,
1038
+ } from './lib/wall-pull'
1039
+ export {
1040
+ isWallRunFree,
1041
+ publishWallRunFeedback,
1042
+ snapWallRunDraftPoint,
1043
+ wallRunDirection,
1044
+ } from './lib/wall-run-snap'
1045
+ export {
1046
+ deleteProjectWallType,
1047
+ saveProjectWallType,
1048
+ useProjectWallTypes,
1049
+ type WallTypePlacement,
1050
+ wallTypePlacementOf,
1051
+ } from './lib/wall-type'
1052
+ export { writeWindowChanges } from './lib/window-changes'
894
1053
  export {
895
1054
  getActiveBuildingPose,
896
1055
  projectAlignmentGuidesWorldToActiveBuildingLocal,
@@ -900,7 +1059,11 @@ export {
900
1059
  snapWorldXZForActiveBuilding,
901
1060
  } from './lib/world-grid-snap'
902
1061
  export { subscribeCameraPose } from './store/camera-pose-store'
903
- export { default as useAlignmentGuides } from './store/use-alignment-guides'
1062
+ export {
1063
+ type DraftGuideLine,
1064
+ type DraftGuides,
1065
+ default as useAlignmentGuides,
1066
+ } from './store/use-alignment-guides'
904
1067
  export { default as useAudio } from './store/use-audio'
905
1068
  export { type CameraHintAction, useCameraHintFocus } from './store/use-camera-hint-focus'
906
1069
  export { type CommandAction, useCommandRegistry } from './store/use-command-registry'
@@ -1009,6 +1172,22 @@ export {
1009
1172
  default as usePlacementPreview,
1010
1173
  type PlacementPreviewDimension,
1011
1174
  } from './store/use-placement-preview'
1175
+ export {
1176
+ isPlacementTypingKey,
1177
+ isPlacementTypingStartKey,
1178
+ PLACEMENT_TYPING_DISTANCE_OFFSET,
1179
+ PLACEMENT_TYPING_LENGTH_ANGLE,
1180
+ type PlacementTypingField,
1181
+ type PlacementTypingKeyOptions,
1182
+ type PlacementTypingKeyOutcome,
1183
+ type PlacementTypingProjection,
1184
+ type PlacementTypingSession,
1185
+ type PlacementTypingState,
1186
+ type PlacementTypingValues,
1187
+ placementTypingLengthOptions,
1188
+ routePlacementTypingKey,
1189
+ usePlacementTyping,
1190
+ } from './store/use-placement-typing'
1012
1191
  export { usePointAsk } from './store/use-point-ask'
1013
1192
  export {
1014
1193
  activateQuickMeasurementHudSource,
@@ -145,11 +145,11 @@ describe('setGroundFloor', () => {
145
145
 
146
146
  const standing = (id: string) => levelGradeStanding(useScene.getState().nodes, id)
147
147
 
148
- test('seats the building so the level stands 8 in over grade, the ones under it below it, in one undo step', () => {
148
+ test('seats the building so the level stands on grade, the ones under it below it, in one undo step', () => {
149
149
  expect(standing('level_lower')).toBe('at-grade')
150
150
  expect(setGroundFloor('level_reception' as LevelNode['id'])).toBe(true)
151
151
  const nodes = useScene.getState().nodes
152
- expect((nodes[BUILDING as AnyNodeId] as BuildingNode).position).toEqual([0, -3.197, 0])
152
+ expect((nodes[BUILDING as AnyNodeId] as BuildingNode).position).toEqual([0, -3.4, 0])
153
153
  expect((nodes[BUILDING as AnyNodeId] as BuildingNode).groundLevelId).toBe('level_reception')
154
154
  expect(standing('level_reception')).toBe('at-grade')
155
155
  expect(standing('level_lower')).toBe('below-grade')
@@ -172,6 +172,6 @@ describe('setGroundFloor', () => {
172
172
  const basement = addStoreyBelow(BUILDING)
173
173
  expect(basement.level).toBe(-3)
174
174
  expect(standing(basement.id)).toBe('below-grade')
175
- expect(levelFloorWorldY(useScene.getState().nodes, 'level_reception')).toBeCloseTo(0.203, 9)
175
+ expect(levelFloorWorldY(useScene.getState().nodes, 'level_reception')).toBeCloseTo(0, 9)
176
176
  })
177
177
  })
@@ -1,5 +1,24 @@
1
1
  import { describe, expect, test } from 'bun:test'
2
- import { resolveRotateHandleHelpHints, resolveSelectModeHelpHints } from './contextual-help'
2
+ import type { MessageDescriptor } from '@pascal-app/core'
3
+ import {
4
+ type ContextualShortcutHint,
5
+ resolveRotateHandleHelpHints as rotateHints,
6
+ resolveSelectModeHelpHints as selectHints,
7
+ } from './contextual-help'
8
+
9
+ // Hints carry message descriptors; these tests read their English.
10
+ const text = (value: MessageDescriptor | string) =>
11
+ typeof value === 'string' ? value : value.message
12
+ const english = (hints: ContextualShortcutHint[]) =>
13
+ hints.map(({ label, subtitle, ...hint }) => ({
14
+ ...hint,
15
+ label: text(label),
16
+ ...(subtitle ? { subtitle: text(subtitle) } : {}),
17
+ }))
18
+ const resolveRotateHandleHelpHints = (...args: Parameters<typeof rotateHints>) =>
19
+ english(rotateHints(...args))
20
+ const resolveSelectModeHelpHints = (...args: Parameters<typeof selectHints>) =>
21
+ english(selectHints(...args))
3
22
 
4
23
  test('rotation advertises Alt as the temporary free-rotation override', () => {
5
24
  expect(resolveRotateHandleHelpHints(false)).toEqual([