@pascal-app/nodes 1.0.0-beta.5 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (831) hide show
  1. package/LICENSE +21 -0
  2. package/dist/block/commands.d.ts +68 -0
  3. package/dist/block/commands.d.ts.map +1 -0
  4. package/dist/block/commands.js +1144 -0
  5. package/dist/block/contextual-help.d.ts +3 -0
  6. package/dist/block/contextual-help.d.ts.map +1 -0
  7. package/dist/block/contextual-help.js +38 -0
  8. package/dist/block/definition.d.ts +8 -0
  9. package/dist/block/definition.d.ts.map +1 -0
  10. package/dist/block/definition.js +126 -0
  11. package/dist/block/edit-session.d.ts +16 -0
  12. package/dist/block/edit-session.d.ts.map +1 -0
  13. package/dist/block/edit-session.js +32 -0
  14. package/dist/block/face-host.d.ts +3 -0
  15. package/dist/block/face-host.d.ts.map +1 -0
  16. package/dist/block/face-host.js +178 -0
  17. package/dist/block/floorplan.d.ts +3 -0
  18. package/dist/block/floorplan.d.ts.map +1 -0
  19. package/dist/block/floorplan.js +43 -0
  20. package/dist/block/geometry-snap.d.ts +18 -0
  21. package/dist/block/geometry-snap.d.ts.map +1 -0
  22. package/dist/block/geometry-snap.js +137 -0
  23. package/dist/block/geometry.d.ts +11 -0
  24. package/dist/block/geometry.d.ts.map +1 -0
  25. package/dist/block/geometry.js +146 -0
  26. package/dist/block/gesture-wheel.d.ts +8 -0
  27. package/dist/block/gesture-wheel.d.ts.map +1 -0
  28. package/dist/block/gesture-wheel.js +7 -0
  29. package/dist/block/interaction-sfx.d.ts +3 -0
  30. package/dist/block/interaction-sfx.d.ts.map +1 -0
  31. package/dist/block/interaction-sfx.js +16 -0
  32. package/dist/block/last-operation.d.ts +48 -0
  33. package/dist/block/last-operation.d.ts.map +1 -0
  34. package/dist/block/last-operation.js +120 -0
  35. package/dist/block/loop-cut-interaction.d.ts +5 -0
  36. package/dist/block/loop-cut-interaction.d.ts.map +1 -0
  37. package/dist/block/loop-cut-interaction.js +13 -0
  38. package/dist/block/material-slots.d.ts +61 -0
  39. package/dist/block/material-slots.d.ts.map +1 -0
  40. package/dist/block/material-slots.js +131 -0
  41. package/dist/block/modal-face-operation.d.ts +13 -0
  42. package/dist/block/modal-face-operation.d.ts.map +1 -0
  43. package/dist/block/modal-face-operation.js +40 -0
  44. package/dist/block/modal-session.d.ts +15 -0
  45. package/dist/block/modal-session.d.ts.map +1 -0
  46. package/dist/block/modal-session.js +40 -0
  47. package/dist/block/modal-transform.d.ts +30 -0
  48. package/dist/block/modal-transform.d.ts.map +1 -0
  49. package/dist/block/modal-transform.js +144 -0
  50. package/dist/block/paint.d.ts +3 -0
  51. package/dist/block/paint.d.ts.map +1 -0
  52. package/dist/block/paint.js +136 -0
  53. package/dist/block/panel.d.ts +2 -0
  54. package/dist/block/panel.d.ts.map +1 -0
  55. package/dist/block/panel.js +234 -0
  56. package/dist/block/parametrics.d.ts +4 -0
  57. package/dist/block/parametrics.d.ts.map +1 -0
  58. package/dist/block/parametrics.js +9 -0
  59. package/dist/block/preview.d.ts +6 -0
  60. package/dist/block/preview.d.ts.map +1 -0
  61. package/dist/block/preview.js +46 -0
  62. package/dist/block/rotation-drag.d.ts +5 -0
  63. package/dist/block/rotation-drag.d.ts.map +1 -0
  64. package/dist/block/rotation-drag.js +18 -0
  65. package/dist/block/schema.d.ts +2 -0
  66. package/dist/block/schema.d.ts.map +1 -0
  67. package/dist/block/schema.js +1 -0
  68. package/dist/block/selection-geometry.d.ts +9 -0
  69. package/dist/block/selection-geometry.d.ts.map +1 -0
  70. package/dist/block/selection-geometry.js +31 -0
  71. package/dist/block/selection-model.d.ts +17 -0
  72. package/dist/block/selection-model.d.ts.map +1 -0
  73. package/dist/block/selection-model.js +84 -0
  74. package/dist/block/selection.d.ts +4 -0
  75. package/dist/block/selection.d.ts.map +1 -0
  76. package/dist/block/selection.js +2570 -0
  77. package/dist/block/slots.d.ts +4 -0
  78. package/dist/block/slots.d.ts.map +1 -0
  79. package/dist/block/slots.js +17 -0
  80. package/dist/block/tool.d.ts +3 -0
  81. package/dist/block/tool.d.ts.map +1 -0
  82. package/dist/block/tool.js +174 -0
  83. package/dist/block/toolbar-state.d.ts +46 -0
  84. package/dist/block/toolbar-state.d.ts.map +1 -0
  85. package/dist/block/toolbar-state.js +67 -0
  86. package/dist/block/use-block-face-operation.d.ts +39 -0
  87. package/dist/block/use-block-face-operation.d.ts.map +1 -0
  88. package/dist/block/use-block-face-operation.js +218 -0
  89. package/dist/box-vent/definition.d.ts.map +1 -1
  90. package/dist/box-vent/definition.js +8 -5
  91. package/dist/box-vent/geometry.d.ts +4 -0
  92. package/dist/box-vent/geometry.d.ts.map +1 -1
  93. package/dist/box-vent/geometry.js +76 -44
  94. package/dist/box-vent/paint.d.ts +4 -0
  95. package/dist/box-vent/paint.d.ts.map +1 -0
  96. package/dist/box-vent/paint.js +40 -0
  97. package/dist/box-vent/panel.js +1 -1
  98. package/dist/box-vent/parametrics.js +3 -3
  99. package/dist/box-vent/renderer.d.ts.map +1 -1
  100. package/dist/box-vent/renderer.js +29 -10
  101. package/dist/cabinet/compartment-card.d.ts.map +1 -1
  102. package/dist/cabinet/compartment-card.js +11 -3
  103. package/dist/cabinet/continuous-placement.d.ts +3 -0
  104. package/dist/cabinet/continuous-placement.d.ts.map +1 -1
  105. package/dist/cabinet/continuous-placement.js +6 -0
  106. package/dist/cabinet/definition.d.ts.map +1 -1
  107. package/dist/cabinet/definition.js +400 -54
  108. package/dist/cabinet/floorplan-move.d.ts.map +1 -1
  109. package/dist/cabinet/floorplan-move.js +91 -22
  110. package/dist/cabinet/geometry/fridge.d.ts.map +1 -1
  111. package/dist/cabinet/geometry/fridge.js +25 -1
  112. package/dist/cabinet/geometry/fronts.d.ts +4 -0
  113. package/dist/cabinet/geometry/fronts.d.ts.map +1 -1
  114. package/dist/cabinet/geometry/fronts.js +1 -1
  115. package/dist/cabinet/geometry/run.d.ts.map +1 -1
  116. package/dist/cabinet/geometry/run.js +19 -1
  117. package/dist/cabinet/geometry.d.ts.map +1 -1
  118. package/dist/cabinet/geometry.js +63 -1
  119. package/dist/cabinet/index.d.ts +1 -0
  120. package/dist/cabinet/index.d.ts.map +1 -1
  121. package/dist/cabinet/index.js +1 -0
  122. package/dist/cabinet/insertion.d.ts +19 -0
  123. package/dist/cabinet/insertion.d.ts.map +1 -0
  124. package/dist/cabinet/insertion.js +49 -0
  125. package/dist/cabinet/move-frame.d.ts.map +1 -1
  126. package/dist/cabinet/move-frame.js +68 -2
  127. package/dist/cabinet/panel-context.d.ts +7 -0
  128. package/dist/cabinet/panel-context.d.ts.map +1 -0
  129. package/dist/cabinet/panel-context.js +16 -0
  130. package/dist/cabinet/panel-visibility.d.ts +9 -0
  131. package/dist/cabinet/panel-visibility.d.ts.map +1 -0
  132. package/dist/cabinet/panel-visibility.js +26 -0
  133. package/dist/cabinet/panel.d.ts.map +1 -1
  134. package/dist/cabinet/panel.js +221 -37
  135. package/dist/cabinet/placement-dimensions.d.ts +42 -0
  136. package/dist/cabinet/placement-dimensions.d.ts.map +1 -0
  137. package/dist/cabinet/placement-dimensions.js +227 -0
  138. package/dist/cabinet/placement-snap.d.ts +21 -1
  139. package/dist/cabinet/placement-snap.d.ts.map +1 -1
  140. package/dist/cabinet/placement-snap.js +48 -6
  141. package/dist/cabinet/preset-width-debt.d.ts +7 -0
  142. package/dist/cabinet/preset-width-debt.d.ts.map +1 -0
  143. package/dist/cabinet/preset-width-debt.js +45 -0
  144. package/dist/cabinet/presets.d.ts.map +1 -1
  145. package/dist/cabinet/presets.js +14 -13
  146. package/dist/cabinet/profiles.d.ts +14 -0
  147. package/dist/cabinet/profiles.d.ts.map +1 -0
  148. package/dist/cabinet/profiles.js +30 -0
  149. package/dist/cabinet/quick-actions.d.ts.map +1 -1
  150. package/dist/cabinet/quick-actions.js +8 -24
  151. package/dist/cabinet/reveals.d.ts +37 -0
  152. package/dist/cabinet/reveals.d.ts.map +1 -0
  153. package/dist/cabinet/reveals.js +13 -0
  154. package/dist/cabinet/run-layout.d.ts +90 -4
  155. package/dist/cabinet/run-layout.d.ts.map +1 -1
  156. package/dist/cabinet/run-layout.js +408 -23
  157. package/dist/cabinet/run-ops.d.ts +202 -10
  158. package/dist/cabinet/run-ops.d.ts.map +1 -1
  159. package/dist/cabinet/run-ops.js +520 -33
  160. package/dist/cabinet/run-panel.d.ts +6 -2
  161. package/dist/cabinet/run-panel.d.ts.map +1 -1
  162. package/dist/cabinet/run-panel.js +285 -108
  163. package/dist/cabinet/stack-transitions.d.ts.map +1 -1
  164. package/dist/cabinet/stack-transitions.js +35 -24
  165. package/dist/cabinet/stack.d.ts +169 -1
  166. package/dist/cabinet/stack.d.ts.map +1 -1
  167. package/dist/cabinet/stack.js +57 -18
  168. package/dist/cabinet/tool.d.ts.map +1 -1
  169. package/dist/cabinet/tool.js +615 -91
  170. package/dist/cabinet/validation.d.ts +27 -0
  171. package/dist/cabinet/validation.d.ts.map +1 -0
  172. package/dist/cabinet/validation.js +56 -0
  173. package/dist/cabinet/wall-height-presets.d.ts +12 -0
  174. package/dist/cabinet/wall-height-presets.d.ts.map +1 -0
  175. package/dist/cabinet/wall-height-presets.js +15 -0
  176. package/dist/cabinet/wall-snap.d.ts +27 -3
  177. package/dist/cabinet/wall-snap.d.ts.map +1 -1
  178. package/dist/cabinet/wall-snap.js +278 -62
  179. package/dist/cabinet/widths.d.ts +10 -0
  180. package/dist/cabinet/widths.d.ts.map +1 -0
  181. package/dist/cabinet/widths.js +13 -0
  182. package/dist/ceiling/definition.d.ts.map +1 -1
  183. package/dist/ceiling/definition.js +7 -1
  184. package/dist/ceiling/floorplan-affordances.d.ts +8 -8
  185. package/dist/ceiling/materials.d.ts.map +1 -1
  186. package/dist/ceiling/materials.js +0 -1
  187. package/dist/ceiling/panel.js +1 -1
  188. package/dist/ceiling/parametrics.js +1 -1
  189. package/dist/chimney/definition.js +1 -1
  190. package/dist/chimney/panel.js +1 -1
  191. package/dist/chimney/parametrics.js +3 -3
  192. package/dist/column/definition.d.ts.map +1 -1
  193. package/dist/column/definition.js +22 -4
  194. package/dist/column/panel.d.ts.map +1 -1
  195. package/dist/column/panel.js +37 -7
  196. package/dist/column/parametrics.d.ts.map +1 -1
  197. package/dist/column/parametrics.js +5 -3
  198. package/dist/column/tool.d.ts.map +1 -1
  199. package/dist/column/tool.js +50 -14
  200. package/dist/cupola/definition.d.ts.map +1 -1
  201. package/dist/cupola/definition.js +15 -6
  202. package/dist/cupola/geometry.d.ts +6 -0
  203. package/dist/cupola/geometry.d.ts.map +1 -1
  204. package/dist/cupola/geometry.js +60 -13
  205. package/dist/cupola/paint.d.ts +4 -0
  206. package/dist/cupola/paint.d.ts.map +1 -0
  207. package/dist/cupola/paint.js +39 -0
  208. package/dist/cupola/panel.js +1 -1
  209. package/dist/cupola/parametrics.js +3 -3
  210. package/dist/cupola/renderer.d.ts.map +1 -1
  211. package/dist/cupola/renderer.js +27 -8
  212. package/dist/door/floorplan-move.d.ts.map +1 -1
  213. package/dist/door/floorplan-move.js +1 -1
  214. package/dist/door/move-tool.d.ts.map +1 -1
  215. package/dist/door/move-tool.js +86 -32
  216. package/dist/door/panel.d.ts.map +1 -1
  217. package/dist/door/panel.js +1 -1
  218. package/dist/door/parametrics.js +2 -2
  219. package/dist/door/tool.d.ts.map +1 -1
  220. package/dist/door/tool.js +16 -4
  221. package/dist/dormer/csg-geometry.d.ts +6 -42
  222. package/dist/dormer/csg-geometry.d.ts.map +1 -1
  223. package/dist/dormer/csg-geometry.js +38 -209
  224. package/dist/dormer/definition.d.ts +4 -12
  225. package/dist/dormer/definition.d.ts.map +1 -1
  226. package/dist/dormer/definition.js +18 -193
  227. package/dist/dormer/floorplan.d.ts +3 -3
  228. package/dist/dormer/floorplan.d.ts.map +1 -1
  229. package/dist/dormer/floorplan.js +6 -17
  230. package/dist/dormer/geometry.d.ts +5 -24
  231. package/dist/dormer/geometry.d.ts.map +1 -1
  232. package/dist/dormer/geometry.js +64 -41
  233. package/dist/dormer/index.d.ts +1 -1
  234. package/dist/dormer/index.d.ts.map +1 -1
  235. package/dist/dormer/index.js +1 -1
  236. package/dist/dormer/move-tool.d.ts.map +1 -1
  237. package/dist/dormer/move-tool.js +31 -3
  238. package/dist/dormer/panel-windows-section.d.ts +9 -0
  239. package/dist/dormer/panel-windows-section.d.ts.map +1 -0
  240. package/dist/dormer/panel-windows-section.js +7 -0
  241. package/dist/dormer/panel.d.ts.map +1 -1
  242. package/dist/dormer/panel.js +100 -18
  243. package/dist/dormer/parametrics.d.ts.map +1 -1
  244. package/dist/dormer/parametrics.js +8 -77
  245. package/dist/dormer/preview.d.ts.map +1 -1
  246. package/dist/dormer/preview.js +9 -1
  247. package/dist/dormer/renderer.d.ts.map +1 -1
  248. package/dist/dormer/renderer.js +24 -26
  249. package/dist/dormer/tool.d.ts.map +1 -1
  250. package/dist/dormer/tool.js +3 -1
  251. package/dist/dormer/window-layout.d.ts +15 -0
  252. package/dist/dormer/window-layout.d.ts.map +1 -0
  253. package/dist/dormer/window-layout.js +59 -0
  254. package/dist/downspout/definition.d.ts.map +1 -1
  255. package/dist/downspout/definition.js +17 -4
  256. package/dist/downspout/geometry.d.ts.map +1 -1
  257. package/dist/downspout/geometry.js +10 -0
  258. package/dist/downspout/inspector-editors.d.ts.map +1 -1
  259. package/dist/downspout/inspector-editors.js +9 -1
  260. package/dist/downspout/parametrics.d.ts.map +1 -1
  261. package/dist/downspout/parametrics.js +2 -1
  262. package/dist/downspout/renderer.d.ts.map +1 -1
  263. package/dist/downspout/renderer.js +19 -3
  264. package/dist/downspout/system.d.ts +7 -0
  265. package/dist/downspout/system.d.ts.map +1 -0
  266. package/dist/downspout/system.js +114 -0
  267. package/dist/duct-fitting/accessory-geometry.d.ts +4 -0
  268. package/dist/duct-fitting/accessory-geometry.d.ts.map +1 -0
  269. package/dist/duct-fitting/accessory-geometry.js +47 -0
  270. package/dist/duct-fitting/definition.d.ts.map +1 -1
  271. package/dist/duct-fitting/definition.js +11 -1
  272. package/dist/duct-fitting/floorplan.d.ts.map +1 -1
  273. package/dist/duct-fitting/floorplan.js +8 -0
  274. package/dist/duct-fitting/geometry.d.ts.map +1 -1
  275. package/dist/duct-fitting/geometry.js +52 -38
  276. package/dist/duct-fitting/parametrics.d.ts.map +1 -1
  277. package/dist/duct-fitting/parametrics.js +78 -15
  278. package/dist/duct-fitting/ports.d.ts +1 -0
  279. package/dist/duct-fitting/ports.d.ts.map +1 -1
  280. package/dist/duct-fitting/ports.js +46 -0
  281. package/dist/duct-fitting/tool.d.ts +19 -0
  282. package/dist/duct-fitting/tool.d.ts.map +1 -1
  283. package/dist/duct-fitting/tool.js +126 -34
  284. package/dist/duct-segment/continuation.d.ts +21 -0
  285. package/dist/duct-segment/continuation.d.ts.map +1 -0
  286. package/dist/duct-segment/continuation.js +167 -0
  287. package/dist/duct-segment/definition.d.ts.map +1 -1
  288. package/dist/duct-segment/definition.js +19 -18
  289. package/dist/duct-segment/floorplan.d.ts.map +1 -1
  290. package/dist/duct-segment/floorplan.js +43 -0
  291. package/dist/duct-segment/geometry.d.ts.map +1 -1
  292. package/dist/duct-segment/geometry.js +3 -0
  293. package/dist/duct-segment/move-tool.d.ts.map +1 -1
  294. package/dist/duct-segment/move-tool.js +33 -6
  295. package/dist/duct-segment/parametrics.d.ts.map +1 -1
  296. package/dist/duct-segment/parametrics.js +45 -1
  297. package/dist/duct-segment/selection.d.ts +3 -4
  298. package/dist/duct-segment/selection.d.ts.map +1 -1
  299. package/dist/duct-segment/selection.js +186 -158
  300. package/dist/duct-segment/tool.d.ts +37 -0
  301. package/dist/duct-segment/tool.d.ts.map +1 -1
  302. package/dist/duct-segment/tool.js +305 -678
  303. package/dist/duct-terminal/parametrics.js +2 -2
  304. package/dist/duct-terminal/tool.d.ts.map +1 -1
  305. package/dist/duct-terminal/tool.js +37 -7
  306. package/dist/elevator/panel.d.ts.map +1 -1
  307. package/dist/elevator/panel.js +7 -7
  308. package/dist/elevator/system.d.ts.map +1 -1
  309. package/dist/elevator/system.js +10 -1
  310. package/dist/eyebrow-vent/definition.d.ts.map +1 -1
  311. package/dist/eyebrow-vent/definition.js +8 -5
  312. package/dist/eyebrow-vent/geometry.d.ts +4 -0
  313. package/dist/eyebrow-vent/geometry.d.ts.map +1 -1
  314. package/dist/eyebrow-vent/geometry.js +60 -15
  315. package/dist/eyebrow-vent/paint.d.ts +4 -0
  316. package/dist/eyebrow-vent/paint.d.ts.map +1 -0
  317. package/dist/eyebrow-vent/paint.js +33 -0
  318. package/dist/eyebrow-vent/panel.js +1 -1
  319. package/dist/eyebrow-vent/parametrics.js +3 -3
  320. package/dist/eyebrow-vent/renderer.d.ts.map +1 -1
  321. package/dist/eyebrow-vent/renderer.js +27 -8
  322. package/dist/fence/definition.d.ts.map +1 -1
  323. package/dist/fence/definition.js +2 -1
  324. package/dist/fence/floorplan-affordances.d.ts +1 -0
  325. package/dist/fence/floorplan-affordances.d.ts.map +1 -1
  326. package/dist/fence/floorplan-affordances.js +30 -1
  327. package/dist/fence/floorplan.d.ts.map +1 -1
  328. package/dist/fence/floorplan.js +14 -0
  329. package/dist/fence/parametrics.js +3 -3
  330. package/dist/fence/tool.d.ts.map +1 -1
  331. package/dist/fence/tool.js +47 -20
  332. package/dist/gutter/corner-mitre.d.ts.map +1 -1
  333. package/dist/gutter/corner-mitre.js +47 -7
  334. package/dist/gutter/definition.d.ts.map +1 -1
  335. package/dist/gutter/definition.js +23 -13
  336. package/dist/gutter/eave-align.d.ts.map +1 -1
  337. package/dist/gutter/eave-align.js +10 -0
  338. package/dist/gutter/eave-snap.d.ts +1 -1
  339. package/dist/gutter/eave-snap.d.ts.map +1 -1
  340. package/dist/gutter/eave-snap.js +10 -23
  341. package/dist/gutter/geometry.d.ts.map +1 -1
  342. package/dist/gutter/geometry.js +126 -8
  343. package/dist/gutter/outlet-lookup.d.ts.map +1 -1
  344. package/dist/gutter/outlet-lookup.js +22 -1
  345. package/dist/gutter/paint.d.ts +3 -0
  346. package/dist/gutter/paint.d.ts.map +1 -0
  347. package/dist/gutter/paint.js +6 -0
  348. package/dist/gutter/parametrics.d.ts.map +1 -1
  349. package/dist/gutter/parametrics.js +4 -1
  350. package/dist/gutter/renderer.d.ts.map +1 -1
  351. package/dist/gutter/renderer.js +63 -7
  352. package/dist/gutter/trim-clip.d.ts +3 -0
  353. package/dist/gutter/trim-clip.d.ts.map +1 -0
  354. package/dist/gutter/trim-clip.js +5 -0
  355. package/dist/hvac-equipment/parametrics.js +3 -3
  356. package/dist/hvac-equipment/tool.d.ts.map +1 -1
  357. package/dist/hvac-equipment/tool.js +12 -2
  358. package/dist/index.d.ts +5 -2
  359. package/dist/index.d.ts.map +1 -1
  360. package/dist/index.js +9 -2
  361. package/dist/item/definition.d.ts.map +1 -1
  362. package/dist/item/definition.js +10 -2
  363. package/dist/item/floorplan-move.d.ts.map +1 -1
  364. package/dist/item/floorplan-move.js +20 -1
  365. package/dist/item/floorplan.d.ts.map +1 -1
  366. package/dist/item/floorplan.js +22 -1
  367. package/dist/item/move-tool.d.ts +28 -1
  368. package/dist/item/move-tool.d.ts.map +1 -1
  369. package/dist/item/move-tool.js +14 -2
  370. package/dist/item/renderer.d.ts.map +1 -1
  371. package/dist/item/renderer.js +16 -6
  372. package/dist/item/system.d.ts +5 -0
  373. package/dist/item/system.d.ts.map +1 -1
  374. package/dist/item/system.js +7 -1
  375. package/dist/lean-to-extension/arc.d.ts +14 -0
  376. package/dist/lean-to-extension/arc.d.ts.map +1 -0
  377. package/dist/lean-to-extension/arc.js +56 -0
  378. package/dist/lean-to-extension/assembly.d.ts +61 -0
  379. package/dist/lean-to-extension/assembly.d.ts.map +1 -0
  380. package/dist/lean-to-extension/assembly.js +761 -0
  381. package/dist/lean-to-extension/canopy-joint.d.ts +35 -0
  382. package/dist/lean-to-extension/canopy-joint.d.ts.map +1 -0
  383. package/dist/lean-to-extension/canopy-joint.js +234 -0
  384. package/dist/lean-to-extension/conical-host.d.ts +15 -0
  385. package/dist/lean-to-extension/conical-host.d.ts.map +1 -0
  386. package/dist/lean-to-extension/conical-host.js +113 -0
  387. package/dist/lean-to-extension/corner-joint.d.ts +29 -0
  388. package/dist/lean-to-extension/corner-joint.d.ts.map +1 -0
  389. package/dist/lean-to-extension/corner-joint.js +1202 -0
  390. package/dist/lean-to-extension/definition.d.ts +4 -0
  391. package/dist/lean-to-extension/definition.d.ts.map +1 -0
  392. package/dist/lean-to-extension/definition.js +433 -0
  393. package/dist/lean-to-extension/floorplan-affordances.d.ts +4 -0
  394. package/dist/lean-to-extension/floorplan-affordances.d.ts.map +1 -0
  395. package/dist/lean-to-extension/floorplan-affordances.js +144 -0
  396. package/dist/lean-to-extension/floorplan-move.d.ts +3 -0
  397. package/dist/lean-to-extension/floorplan-move.d.ts.map +1 -0
  398. package/dist/lean-to-extension/floorplan-move.js +157 -0
  399. package/dist/lean-to-extension/floorplan-tool.d.ts +4 -0
  400. package/dist/lean-to-extension/floorplan-tool.d.ts.map +1 -0
  401. package/dist/lean-to-extension/floorplan-tool.js +385 -0
  402. package/dist/lean-to-extension/floorplan.d.ts +3 -0
  403. package/dist/lean-to-extension/floorplan.d.ts.map +1 -0
  404. package/dist/lean-to-extension/floorplan.js +373 -0
  405. package/dist/lean-to-extension/geometry.d.ts +7 -0
  406. package/dist/lean-to-extension/geometry.d.ts.map +1 -0
  407. package/dist/lean-to-extension/geometry.js +662 -0
  408. package/dist/lean-to-extension/index.d.ts +8 -0
  409. package/dist/lean-to-extension/index.d.ts.map +1 -0
  410. package/dist/lean-to-extension/index.js +7 -0
  411. package/dist/lean-to-extension/layout.d.ts +108 -0
  412. package/dist/lean-to-extension/layout.d.ts.map +1 -0
  413. package/dist/lean-to-extension/layout.js +477 -0
  414. package/dist/lean-to-extension/managed-preview.d.ts +3 -0
  415. package/dist/lean-to-extension/managed-preview.d.ts.map +1 -0
  416. package/dist/lean-to-extension/managed-preview.js +93 -0
  417. package/dist/lean-to-extension/move-tool.d.ts +8 -0
  418. package/dist/lean-to-extension/move-tool.d.ts.map +1 -0
  419. package/dist/lean-to-extension/move-tool.js +202 -0
  420. package/dist/lean-to-extension/paint.d.ts +2 -0
  421. package/dist/lean-to-extension/paint.d.ts.map +1 -0
  422. package/dist/lean-to-extension/paint.js +16 -0
  423. package/dist/lean-to-extension/parametrics.d.ts +4 -0
  424. package/dist/lean-to-extension/parametrics.d.ts.map +1 -0
  425. package/dist/lean-to-extension/parametrics.js +570 -0
  426. package/dist/lean-to-extension/placement-scope.d.ts +3 -0
  427. package/dist/lean-to-extension/placement-scope.d.ts.map +1 -0
  428. package/dist/lean-to-extension/placement-scope.js +4 -0
  429. package/dist/lean-to-extension/placement-validation.d.ts +4 -0
  430. package/dist/lean-to-extension/placement-validation.d.ts.map +1 -0
  431. package/dist/lean-to-extension/placement-validation.js +324 -0
  432. package/dist/lean-to-extension/placement.d.ts +59 -0
  433. package/dist/lean-to-extension/placement.d.ts.map +1 -0
  434. package/dist/lean-to-extension/placement.js +331 -0
  435. package/dist/lean-to-extension/plan-footprint.d.ts +10 -0
  436. package/dist/lean-to-extension/plan-footprint.d.ts.map +1 -0
  437. package/dist/lean-to-extension/plan-footprint.js +27 -0
  438. package/dist/lean-to-extension/preview-geometry.d.ts +7 -0
  439. package/dist/lean-to-extension/preview-geometry.d.ts.map +1 -0
  440. package/dist/lean-to-extension/preview-geometry.js +40 -0
  441. package/dist/lean-to-extension/preview.d.ts +7 -0
  442. package/dist/lean-to-extension/preview.d.ts.map +1 -0
  443. package/dist/lean-to-extension/preview.js +20 -0
  444. package/dist/lean-to-extension/renderer.d.ts +6 -0
  445. package/dist/lean-to-extension/renderer.d.ts.map +1 -0
  446. package/dist/lean-to-extension/renderer.js +34 -0
  447. package/dist/lean-to-extension/roof-attachment.d.ts +28 -0
  448. package/dist/lean-to-extension/roof-attachment.d.ts.map +1 -0
  449. package/dist/lean-to-extension/roof-attachment.js +376 -0
  450. package/dist/lean-to-extension/schema.d.ts +2 -0
  451. package/dist/lean-to-extension/schema.d.ts.map +1 -0
  452. package/dist/lean-to-extension/schema.js +1 -0
  453. package/dist/lean-to-extension/slots.d.ts +5 -0
  454. package/dist/lean-to-extension/slots.d.ts.map +1 -0
  455. package/dist/lean-to-extension/slots.js +15 -0
  456. package/dist/lean-to-extension/system.d.ts +7 -0
  457. package/dist/lean-to-extension/system.d.ts.map +1 -0
  458. package/dist/lean-to-extension/system.js +726 -0
  459. package/dist/lean-to-extension/tool.d.ts +3 -0
  460. package/dist/lean-to-extension/tool.d.ts.map +1 -0
  461. package/dist/lean-to-extension/tool.js +580 -0
  462. package/dist/lean-to-extension/wall-target.d.ts +10 -0
  463. package/dist/lean-to-extension/wall-target.d.ts.map +1 -0
  464. package/dist/lean-to-extension/wall-target.js +29 -0
  465. package/dist/lineset/definition.d.ts.map +1 -1
  466. package/dist/lineset/definition.js +1 -0
  467. package/dist/liquid-line/definition.d.ts.map +1 -1
  468. package/dist/liquid-line/definition.js +1 -0
  469. package/dist/pipe-fitting/definition.d.ts.map +1 -1
  470. package/dist/pipe-fitting/definition.js +16 -2
  471. package/dist/pipe-fitting/floorplan.d.ts.map +1 -1
  472. package/dist/pipe-fitting/floorplan.js +4 -0
  473. package/dist/pipe-fitting/geometry.d.ts +3 -5
  474. package/dist/pipe-fitting/geometry.d.ts.map +1 -1
  475. package/dist/pipe-fitting/geometry.js +154 -21
  476. package/dist/pipe-fitting/inline-insertion.d.ts +13 -0
  477. package/dist/pipe-fitting/inline-insertion.d.ts.map +1 -0
  478. package/dist/pipe-fitting/inline-insertion.js +96 -0
  479. package/dist/pipe-fitting/parametrics.d.ts.map +1 -1
  480. package/dist/pipe-fitting/parametrics.js +17 -3
  481. package/dist/pipe-fitting/ports.d.ts.map +1 -1
  482. package/dist/pipe-fitting/ports.js +8 -1
  483. package/dist/pipe-fitting/tool.d.ts +26 -0
  484. package/dist/pipe-fitting/tool.d.ts.map +1 -1
  485. package/dist/pipe-fitting/tool.js +182 -37
  486. package/dist/pipe-segment/continuation.d.ts +22 -0
  487. package/dist/pipe-segment/continuation.d.ts.map +1 -0
  488. package/dist/pipe-segment/continuation.js +146 -0
  489. package/dist/pipe-segment/definition.d.ts.map +1 -1
  490. package/dist/pipe-segment/definition.js +23 -7
  491. package/dist/pipe-segment/floorplan.d.ts.map +1 -1
  492. package/dist/pipe-segment/floorplan.js +42 -0
  493. package/dist/pipe-segment/geometry.d.ts +2 -1
  494. package/dist/pipe-segment/geometry.d.ts.map +1 -1
  495. package/dist/pipe-segment/geometry.js +4 -1
  496. package/dist/pipe-segment/move-tool.d.ts.map +1 -1
  497. package/dist/pipe-segment/move-tool.js +25 -5
  498. package/dist/pipe-segment/parametrics.d.ts.map +1 -1
  499. package/dist/pipe-segment/parametrics.js +45 -0
  500. package/dist/pipe-segment/selection.d.ts +3 -4
  501. package/dist/pipe-segment/selection.d.ts.map +1 -1
  502. package/dist/pipe-segment/selection.js +169 -105
  503. package/dist/pipe-segment/slope.d.ts +5 -0
  504. package/dist/pipe-segment/slope.d.ts.map +1 -0
  505. package/dist/pipe-segment/slope.js +10 -0
  506. package/dist/pipe-segment/tool.d.ts.map +1 -1
  507. package/dist/pipe-segment/tool.js +325 -545
  508. package/dist/pipe-trap/tool.d.ts.map +1 -1
  509. package/dist/pipe-trap/tool.js +15 -2
  510. package/dist/ridge-vent/definition.js +1 -1
  511. package/dist/ridge-vent/panel.d.ts.map +1 -1
  512. package/dist/ridge-vent/panel.js +2 -2
  513. package/dist/ridge-vent/parametrics.js +1 -1
  514. package/dist/roof/conical-roof-placement.d.ts +36 -0
  515. package/dist/roof/conical-roof-placement.d.ts.map +1 -0
  516. package/dist/roof/conical-roof-placement.js +134 -0
  517. package/dist/roof/conical-roof.d.ts +3 -0
  518. package/dist/roof/conical-roof.d.ts.map +1 -0
  519. package/dist/roof/conical-roof.js +53 -0
  520. package/dist/roof/definition.d.ts +3 -10
  521. package/dist/roof/definition.d.ts.map +1 -1
  522. package/dist/roof/definition.js +83 -13
  523. package/dist/roof/floorplan.d.ts +3 -10
  524. package/dist/roof/floorplan.d.ts.map +1 -1
  525. package/dist/roof/floorplan.js +139 -165
  526. package/dist/roof/index.d.ts +1 -0
  527. package/dist/roof/index.d.ts.map +1 -1
  528. package/dist/roof/index.js +1 -0
  529. package/dist/roof/panel.d.ts.map +1 -1
  530. package/dist/roof/panel.js +22 -23
  531. package/dist/roof/renderer.d.ts.map +1 -1
  532. package/dist/roof/roof-footprint-source.d.ts +16 -0
  533. package/dist/roof/roof-footprint-source.d.ts.map +1 -0
  534. package/dist/roof/roof-footprint-source.js +14 -0
  535. package/dist/roof/roof-footprint.d.ts +25 -0
  536. package/dist/roof/roof-footprint.d.ts.map +1 -0
  537. package/dist/roof/roof-footprint.js +94 -0
  538. package/dist/roof/roof-placement-mode.d.ts +18 -0
  539. package/dist/roof/roof-placement-mode.d.ts.map +1 -0
  540. package/dist/roof/roof-placement-mode.js +24 -0
  541. package/dist/roof/tool.d.ts +10 -0
  542. package/dist/roof/tool.d.ts.map +1 -0
  543. package/dist/roof/tool.js +922 -0
  544. package/dist/roof-segment/definition.d.ts.map +1 -1
  545. package/dist/roof-segment/definition.js +52 -8
  546. package/dist/roof-segment/floorplan-affordances.d.ts +5 -6
  547. package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
  548. package/dist/roof-segment/floorplan-affordances.js +64 -18
  549. package/dist/roof-segment/floorplan.d.ts +3 -2
  550. package/dist/roof-segment/floorplan.d.ts.map +1 -1
  551. package/dist/roof-segment/floorplan.js +95 -46
  552. package/dist/roof-segment/panel.d.ts.map +1 -1
  553. package/dist/roof-segment/panel.js +122 -27
  554. package/dist/scan/definition.d.ts +2 -3
  555. package/dist/scan/definition.d.ts.map +1 -1
  556. package/dist/scan/definition.js +9 -7
  557. package/dist/scan/parametrics.d.ts.map +1 -1
  558. package/dist/scan/parametrics.js +13 -1
  559. package/dist/scan/renderer.d.ts.map +1 -1
  560. package/dist/scan/renderer.js +8 -2
  561. package/dist/shared/accessory-cursor.d.ts +7 -0
  562. package/dist/shared/accessory-cursor.d.ts.map +1 -0
  563. package/dist/shared/accessory-cursor.js +83 -0
  564. package/dist/shared/accessory-floorplan.d.ts +4 -0
  565. package/dist/shared/accessory-floorplan.d.ts.map +1 -0
  566. package/dist/shared/accessory-floorplan.js +51 -0
  567. package/dist/shared/accessory-geometry.d.ts +7 -0
  568. package/dist/shared/accessory-geometry.d.ts.map +1 -0
  569. package/dist/shared/accessory-geometry.js +79 -0
  570. package/dist/shared/accessory-placement.d.ts +10 -0
  571. package/dist/shared/accessory-placement.d.ts.map +1 -0
  572. package/dist/shared/accessory-placement.js +126 -0
  573. package/dist/shared/accessory-snapping.d.ts +5 -0
  574. package/dist/shared/accessory-snapping.d.ts.map +1 -0
  575. package/dist/shared/accessory-snapping.js +40 -0
  576. package/dist/shared/automatic-run-end-cap.d.ts +11 -0
  577. package/dist/shared/automatic-run-end-cap.d.ts.map +1 -0
  578. package/dist/shared/automatic-run-end-cap.js +159 -0
  579. package/dist/shared/block-face-host.d.ts +15 -0
  580. package/dist/shared/block-face-host.d.ts.map +1 -0
  581. package/dist/shared/block-face-host.js +36 -0
  582. package/dist/shared/connection-compatibility.d.ts +8 -0
  583. package/dist/shared/connection-compatibility.d.ts.map +1 -0
  584. package/dist/shared/connection-compatibility.js +28 -0
  585. package/dist/shared/connection-feedback.d.ts +10 -0
  586. package/dist/shared/connection-feedback.d.ts.map +1 -0
  587. package/dist/shared/connection-feedback.js +17 -0
  588. package/dist/shared/distribution-run-contract.d.ts +49 -0
  589. package/dist/shared/distribution-run-contract.d.ts.map +1 -0
  590. package/dist/shared/distribution-run-contract.js +30 -0
  591. package/dist/shared/distribution-run-tool.d.ts +107 -0
  592. package/dist/shared/distribution-run-tool.d.ts.map +1 -0
  593. package/dist/shared/distribution-run-tool.js +941 -0
  594. package/dist/shared/dormer-wall-opening-placement.d.ts +21 -0
  595. package/dist/shared/dormer-wall-opening-placement.d.ts.map +1 -0
  596. package/dist/shared/dormer-wall-opening-placement.js +101 -0
  597. package/dist/shared/duct-adapter.d.ts +10 -0
  598. package/dist/shared/duct-adapter.d.ts.map +1 -0
  599. package/dist/shared/duct-adapter.js +43 -0
  600. package/dist/shared/elbow-branch-continuation.d.ts +20 -0
  601. package/dist/shared/elbow-branch-continuation.d.ts.map +1 -0
  602. package/dist/shared/elbow-branch-continuation.js +200 -0
  603. package/dist/shared/fitting-clearance.d.ts +5 -0
  604. package/dist/shared/fitting-clearance.d.ts.map +1 -0
  605. package/dist/shared/fitting-clearance.js +11 -0
  606. package/dist/shared/fitting-deletion-cleanup.d.ts +14 -0
  607. package/dist/shared/fitting-deletion-cleanup.d.ts.map +1 -0
  608. package/dist/shared/fitting-deletion-cleanup.js +297 -0
  609. package/dist/shared/fitting-surface-support.d.ts +5 -0
  610. package/dist/shared/fitting-surface-support.d.ts.map +1 -0
  611. package/dist/shared/fitting-surface-support.js +42 -0
  612. package/dist/shared/fitting-tool-options.d.ts +4 -0
  613. package/dist/shared/fitting-tool-options.d.ts.map +1 -0
  614. package/dist/shared/fitting-tool-options.js +175 -0
  615. package/dist/shared/floor-placement.d.ts +1 -1
  616. package/dist/shared/floor-placement.d.ts.map +1 -1
  617. package/dist/shared/floor-placement.js +13 -33
  618. package/dist/shared/ghost-materials.d.ts.map +1 -1
  619. package/dist/shared/ghost-materials.js +2 -1
  620. package/dist/shared/lean-to-post-omissions.d.ts +8 -0
  621. package/dist/shared/lean-to-post-omissions.d.ts.map +1 -0
  622. package/dist/shared/lean-to-post-omissions.js +51 -0
  623. package/dist/shared/mep-fitting-actions.d.ts +5 -0
  624. package/dist/shared/mep-fitting-actions.d.ts.map +1 -0
  625. package/dist/shared/mep-fitting-actions.js +16 -0
  626. package/dist/shared/mep-presets.d.ts +11 -0
  627. package/dist/shared/mep-presets.d.ts.map +1 -0
  628. package/dist/shared/mep-presets.js +34 -0
  629. package/dist/shared/node-batch/candidates.d.ts +29 -0
  630. package/dist/shared/node-batch/candidates.d.ts.map +1 -0
  631. package/dist/shared/node-batch/candidates.js +260 -0
  632. package/dist/shared/node-batch/store.d.ts +26 -0
  633. package/dist/shared/node-batch/store.d.ts.map +1 -0
  634. package/dist/shared/node-batch/store.js +319 -0
  635. package/dist/shared/node-batch/system.d.ts +8 -0
  636. package/dist/shared/node-batch/system.d.ts.map +1 -0
  637. package/dist/shared/node-batch/system.js +569 -0
  638. package/dist/shared/node-batch/types.d.ts +99 -0
  639. package/dist/shared/node-batch/types.d.ts.map +1 -0
  640. package/dist/shared/node-batch/types.js +4 -0
  641. package/dist/shared/opening-move-history.d.ts +47 -0
  642. package/dist/shared/opening-move-history.d.ts.map +1 -0
  643. package/dist/shared/opening-move-history.js +18 -0
  644. package/dist/shared/opening-move-wall-gate.d.ts +55 -0
  645. package/dist/shared/opening-move-wall-gate.d.ts.map +1 -0
  646. package/dist/shared/opening-move-wall-gate.js +44 -0
  647. package/dist/shared/path-point-affordance.d.ts +2 -2
  648. package/dist/shared/path-point-affordance.d.ts.map +1 -1
  649. package/dist/shared/path-point-affordance.js +30 -6
  650. package/dist/shared/placeholder-geometry.d.ts.map +1 -1
  651. package/dist/shared/placeholder-geometry.js +4 -0
  652. package/dist/shared/ports.d.ts +20 -3
  653. package/dist/shared/ports.d.ts.map +1 -1
  654. package/dist/shared/ports.js +148 -7
  655. package/dist/shared/primitive-uv.d.ts +17 -0
  656. package/dist/shared/primitive-uv.d.ts.map +1 -0
  657. package/dist/shared/primitive-uv.js +107 -0
  658. package/dist/shared/reducer-size.d.ts +2 -0
  659. package/dist/shared/reducer-size.d.ts.map +1 -0
  660. package/dist/shared/reducer-size.js +12 -0
  661. package/dist/shared/ridge-snap.js +1 -1
  662. package/dist/shared/roof-surface.d.ts.map +1 -1
  663. package/dist/shared/roof-surface.js +17 -2
  664. package/dist/shared/run-cursor.d.ts +22 -0
  665. package/dist/shared/run-cursor.d.ts.map +1 -0
  666. package/dist/shared/run-cursor.js +19 -0
  667. package/dist/shared/run-direction-feedback.d.ts +20 -0
  668. package/dist/shared/run-direction-feedback.d.ts.map +1 -0
  669. package/dist/shared/run-direction-feedback.js +139 -0
  670. package/dist/shared/run-hanger-controls.d.ts +7 -0
  671. package/dist/shared/run-hanger-controls.d.ts.map +1 -0
  672. package/dist/shared/run-hanger-controls.js +44 -0
  673. package/dist/shared/run-hanger-inspector.d.ts +5 -0
  674. package/dist/shared/run-hanger-inspector.d.ts.map +1 -0
  675. package/dist/shared/run-hanger-inspector.js +43 -0
  676. package/dist/shared/run-hanger-mode.d.ts +11 -0
  677. package/dist/shared/run-hanger-mode.d.ts.map +1 -0
  678. package/dist/shared/run-hanger-mode.js +32 -0
  679. package/dist/shared/run-hanger-system.d.ts +3 -0
  680. package/dist/shared/run-hanger-system.d.ts.map +1 -0
  681. package/dist/shared/run-hanger-system.js +39 -0
  682. package/dist/shared/run-hangers.d.ts +25 -0
  683. package/dist/shared/run-hangers.d.ts.map +1 -0
  684. package/dist/shared/run-hangers.js +261 -0
  685. package/dist/shared/run-port-snap.d.ts +11 -0
  686. package/dist/shared/run-port-snap.d.ts.map +1 -0
  687. package/dist/shared/run-port-snap.js +19 -0
  688. package/dist/shared/run-screen-direction.d.ts +5 -0
  689. package/dist/shared/run-screen-direction.d.ts.map +1 -0
  690. package/dist/shared/run-screen-direction.js +24 -0
  691. package/dist/shared/selection-handles.d.ts +4 -0
  692. package/dist/shared/selection-handles.d.ts.map +1 -1
  693. package/dist/shared/selection-handles.js +10 -0
  694. package/dist/shared/slot-paint.d.ts +8 -1
  695. package/dist/shared/slot-paint.d.ts.map +1 -1
  696. package/dist/shared/slot-paint.js +120 -27
  697. package/dist/shared/surface-paint.d.ts +1 -2
  698. package/dist/shared/surface-paint.d.ts.map +1 -1
  699. package/dist/shared/surface-paint.js +9 -20
  700. package/dist/shared/system-check-panel.d.ts +6 -0
  701. package/dist/shared/system-check-panel.d.ts.map +1 -0
  702. package/dist/shared/system-check-panel.js +62 -0
  703. package/dist/shared/system-checks.d.ts +9 -0
  704. package/dist/shared/system-checks.d.ts.map +1 -0
  705. package/dist/shared/system-checks.js +131 -0
  706. package/dist/shared/wall-attach-target.d.ts +14 -2
  707. package/dist/shared/wall-attach-target.d.ts.map +1 -1
  708. package/dist/shared/wall-attach-target.js +108 -4
  709. package/dist/shared/wall-opening-clearance.d.ts +19 -0
  710. package/dist/shared/wall-opening-clearance.d.ts.map +1 -0
  711. package/dist/shared/wall-opening-clearance.js +28 -0
  712. package/dist/shared/wall-run-move.d.ts +17 -0
  713. package/dist/shared/wall-run-move.d.ts.map +1 -0
  714. package/dist/shared/wall-run-move.js +56 -0
  715. package/dist/shelf/parametrics.js +4 -4
  716. package/dist/site/renderer.d.ts.map +1 -1
  717. package/dist/site/renderer.js +40 -28
  718. package/dist/site/terrain-geometry.d.ts +1 -1
  719. package/dist/site/terrain-geometry.d.ts.map +1 -1
  720. package/dist/site/terrain-geometry.js +35 -9
  721. package/dist/site/terrain-mesh.d.ts +5 -0
  722. package/dist/site/terrain-mesh.d.ts.map +1 -1
  723. package/dist/site/terrain-mesh.js +63 -34
  724. package/dist/skylight/definition.js +1 -1
  725. package/dist/skylight/panel.js +1 -1
  726. package/dist/skylight/parametrics.js +2 -2
  727. package/dist/slab/definition.d.ts.map +1 -1
  728. package/dist/slab/definition.js +6 -1
  729. package/dist/slab/dependency-tracker.d.ts +3 -0
  730. package/dist/slab/dependency-tracker.d.ts.map +1 -0
  731. package/dist/slab/dependency-tracker.js +104 -0
  732. package/dist/slab/floorplan-affordances.d.ts +8 -8
  733. package/dist/slab/geometry.d.ts.map +1 -1
  734. package/dist/slab/geometry.js +16 -2
  735. package/dist/slab/panel.js +1 -1
  736. package/dist/slab/parametrics.js +1 -1
  737. package/dist/slab/system.d.ts.map +1 -1
  738. package/dist/slab/system.js +8 -64
  739. package/dist/solar-panel/definition.js +1 -1
  740. package/dist/solar-panel/panel.js +1 -1
  741. package/dist/solar-panel/parametrics.js +2 -2
  742. package/dist/stair/panel.d.ts.map +1 -1
  743. package/dist/stair/panel.js +18 -13
  744. package/dist/stair/stair-type.d.ts +18 -0
  745. package/dist/stair/stair-type.d.ts.map +1 -0
  746. package/dist/stair/stair-type.js +25 -0
  747. package/dist/stair-segment/panel.d.ts.map +1 -1
  748. package/dist/stair-segment/panel.js +44 -5
  749. package/dist/turbine-vent/definition.d.ts.map +1 -1
  750. package/dist/turbine-vent/definition.js +8 -5
  751. package/dist/turbine-vent/geometry.d.ts.map +1 -1
  752. package/dist/turbine-vent/geometry.js +48 -18
  753. package/dist/turbine-vent/paint.d.ts +4 -0
  754. package/dist/turbine-vent/paint.d.ts.map +1 -0
  755. package/dist/turbine-vent/paint.js +35 -0
  756. package/dist/turbine-vent/panel.js +1 -1
  757. package/dist/turbine-vent/parametrics.js +2 -2
  758. package/dist/turbine-vent/renderer.d.ts.map +1 -1
  759. package/dist/turbine-vent/renderer.js +31 -9
  760. package/dist/wall/curve-eligibility.d.ts +3 -0
  761. package/dist/wall/curve-eligibility.d.ts.map +1 -0
  762. package/dist/wall/curve-eligibility.js +10 -0
  763. package/dist/wall/curve-tool.d.ts.map +1 -1
  764. package/dist/wall/curve-tool.js +8 -11
  765. package/dist/wall/definition.d.ts +1 -1
  766. package/dist/wall/definition.d.ts.map +1 -1
  767. package/dist/wall/definition.js +36 -13
  768. package/dist/wall/floorplan-affordances.d.ts +1 -0
  769. package/dist/wall/floorplan-affordances.d.ts.map +1 -1
  770. package/dist/wall/floorplan-affordances.js +46 -7
  771. package/dist/wall/floorplan-move.d.ts +3 -4
  772. package/dist/wall/floorplan-move.d.ts.map +1 -1
  773. package/dist/wall/floorplan-move.js +122 -9
  774. package/dist/wall/floorplan.d.ts.map +1 -1
  775. package/dist/wall/floorplan.js +19 -23
  776. package/dist/wall/move-shared.d.ts.map +1 -1
  777. package/dist/wall/move-shared.js +10 -7
  778. package/dist/wall/paint.d.ts.map +1 -1
  779. package/dist/wall/paint.js +2 -0
  780. package/dist/wall/panel.d.ts.map +1 -1
  781. package/dist/wall/panel.js +10 -17
  782. package/dist/wall/parametrics.js +2 -2
  783. package/dist/wall/pointer-transparency.d.ts +128 -0
  784. package/dist/wall/pointer-transparency.d.ts.map +1 -0
  785. package/dist/wall/pointer-transparency.js +147 -0
  786. package/dist/wall/renderer.d.ts.map +1 -1
  787. package/dist/wall/renderer.js +65 -8
  788. package/dist/wall/selection-hit-owner.d.ts +53 -0
  789. package/dist/wall/selection-hit-owner.d.ts.map +1 -0
  790. package/dist/wall/selection-hit-owner.js +79 -0
  791. package/dist/wall/system.d.ts +2 -0
  792. package/dist/wall/system.d.ts.map +1 -1
  793. package/dist/wall/system.js +66 -25
  794. package/dist/wall/tool.d.ts.map +1 -1
  795. package/dist/wall/tool.js +5 -0
  796. package/dist/wall/treatment-level-data.d.ts +6 -1
  797. package/dist/wall/treatment-level-data.d.ts.map +1 -1
  798. package/dist/wall/treatment-level-data.js +82 -5
  799. package/dist/wall/treatments.d.ts +1 -0
  800. package/dist/wall/treatments.d.ts.map +1 -1
  801. package/dist/wall/treatments.js +5 -0
  802. package/dist/wall/wall-batch-system.d.ts +38 -6
  803. package/dist/wall/wall-batch-system.d.ts.map +1 -1
  804. package/dist/wall/wall-batch-system.js +122 -25
  805. package/dist/wall/wall-batch.js +2 -2
  806. package/dist/window/definition.d.ts +2 -1
  807. package/dist/window/definition.d.ts.map +1 -1
  808. package/dist/window/definition.js +51 -24
  809. package/dist/window/floorplan-move.d.ts.map +1 -1
  810. package/dist/window/floorplan-move.js +1 -1
  811. package/dist/window/move-tool.d.ts +7 -5
  812. package/dist/window/move-tool.d.ts.map +1 -1
  813. package/dist/window/move-tool.js +344 -58
  814. package/dist/window/panel.d.ts.map +1 -1
  815. package/dist/window/panel.js +2 -0
  816. package/dist/window/parametrics.js +2 -2
  817. package/dist/window/renderer.d.ts.map +1 -1
  818. package/dist/window/renderer.js +5 -7
  819. package/dist/window/tool.d.ts.map +1 -1
  820. package/dist/window/tool.js +227 -13
  821. package/dist/zone/floorplan-affordances.d.ts +12 -12
  822. package/package.json +11 -9
  823. package/dist/dormer/panel-window-section.d.ts +0 -14
  824. package/dist/dormer/panel-window-section.d.ts.map +0 -1
  825. package/dist/dormer/panel-window-section.js +0 -59
  826. package/dist/dormer/window-assembly.d.ts +0 -22
  827. package/dist/dormer/window-assembly.d.ts.map +0 -1
  828. package/dist/dormer/window-assembly.js +0 -111
  829. package/dist/dormer/window-frame.d.ts +0 -24
  830. package/dist/dormer/window-frame.d.ts.map +0 -1
  831. package/dist/dormer/window-frame.js +0 -100
@@ -0,0 +1,941 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { emitter, sceneRegistry, useScene } from '@pascal-app/core';
4
+ import { CursorSphere, clearPlacementSurface, DimensionPill, getGridEventScreenProjection, isAngleSnapActive, isGridSnapActive, isMagneticSnapActive, markToolCancelConsumed, publishPlacementSurface, triggerSFX, useEditor, useInteractionScope, } from '@pascal-app/editor';
5
+ import { Html } from '@react-three/drei';
6
+ import { useThree } from '@react-three/fiber';
7
+ import { useCallback, useEffect, useRef, useState } from 'react';
8
+ import { createPortal } from 'react-dom';
9
+ import { Vector3 } from 'three';
10
+ import { clearDrawAlignment } from './draw-alignment';
11
+ import { resolveRunCursorPlane } from './run-cursor';
12
+ import { RunDirectionFeedback, run3DDirectionCandidates, runHorizontalDirectionCandidates, } from './run-direction-feedback';
13
+ import { findScreenPort } from './run-port-snap';
14
+ import { chooseScreenDirection, screenDirectionScore } from './run-screen-direction';
15
+ const UP = [0, 1, 0];
16
+ const X_AXIS = [1, 0, 0];
17
+ const Z_AXIS = [0, 0, 1];
18
+ function dotRun(a, b) {
19
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
20
+ }
21
+ function crossRun(a, b) {
22
+ return [
23
+ a[1] * b[2] - a[2] * b[1],
24
+ a[2] * b[0] - a[0] * b[2],
25
+ a[0] * b[1] - a[1] * b[0],
26
+ ];
27
+ }
28
+ function normalizeRun(vector, fallback) {
29
+ const length = Math.hypot(vector[0], vector[1], vector[2]);
30
+ return length < 1e-9
31
+ ? [...fallback]
32
+ : [vector[0] / length, vector[1] / length, vector[2] / length];
33
+ }
34
+ /** Build a stable 2D drawing frame for a floor, wall, ceiling, or sloped face. */
35
+ export function createRunSurfaceFrame(origin, surfaceNormal = UP) {
36
+ const normal = normalizeRun(surfaceNormal, UP);
37
+ // Prefer the building's vertical axis for walls and sloped surfaces. For a
38
+ // horizontal floor/ceiling this deliberately falls back to world X so the
39
+ // frame remains stable and matches the existing floor grid orientation.
40
+ const horizontal = Math.abs(dotRun(normal, UP)) > 0.98;
41
+ const tangent = horizontal
42
+ ? [...X_AXIS]
43
+ : normalizeRun(crossRun(UP, normal), X_AXIS);
44
+ const bitangent = horizontal
45
+ ? [...Z_AXIS]
46
+ : normalizeRun(crossRun(normal, tangent), Z_AXIS);
47
+ return {
48
+ origin: [origin[0], origin[1], origin[2]],
49
+ normal,
50
+ tangent,
51
+ bitangent,
52
+ };
53
+ }
54
+ export function projectRunPointToSurface(point, frame) {
55
+ const offset = [
56
+ point[0] - frame.origin[0],
57
+ point[1] - frame.origin[1],
58
+ point[2] - frame.origin[2],
59
+ ];
60
+ const distance = dotRun(offset, frame.normal);
61
+ return [
62
+ point[0] - frame.normal[0] * distance,
63
+ point[1] - frame.normal[1] * distance,
64
+ point[2] - frame.normal[2] * distance,
65
+ ];
66
+ }
67
+ export function snapRunPointToSurface(point, frame, step) {
68
+ const projected = projectRunPointToSurface(point, frame);
69
+ if (step <= 0)
70
+ return projected;
71
+ const offset = [
72
+ projected[0] - frame.origin[0],
73
+ projected[1] - frame.origin[1],
74
+ projected[2] - frame.origin[2],
75
+ ];
76
+ const u = snapRunValue(dotRun(offset, frame.tangent), step);
77
+ const v = snapRunValue(dotRun(offset, frame.bitangent), step);
78
+ return [
79
+ frame.origin[0] + frame.tangent[0] * u + frame.bitangent[0] * v,
80
+ frame.origin[1] + frame.tangent[1] * u + frame.bitangent[1] * v,
81
+ frame.origin[2] + frame.tangent[2] * u + frame.bitangent[2] * v,
82
+ ];
83
+ }
84
+ export function projectRunToSurfaceAngleLock(from, raw, frame, sourceDirection = null) {
85
+ const fromOffset = [
86
+ from[0] - frame.origin[0],
87
+ from[1] - frame.origin[1],
88
+ from[2] - frame.origin[2],
89
+ ];
90
+ const rawOffset = [raw[0] - from[0], raw[1] - from[1], raw[2] - from[2]];
91
+ const rawU = dotRun(rawOffset, frame.tangent);
92
+ const rawV = dotRun(rawOffset, frame.bitangent);
93
+ const sourceU = sourceDirection ? dotRun(sourceDirection, frame.tangent) : 0;
94
+ const sourceV = sourceDirection ? dotRun(sourceDirection, frame.bitangent) : 0;
95
+ const sourceAngle = sourceDirection && Math.hypot(sourceU, sourceV) > 1e-6
96
+ ? Math.atan2(sourceV, sourceU)
97
+ : Math.atan2(rawV, rawU);
98
+ const angle = Math.round(sourceAngle / ANGLE_STEP_RAD) * ANGLE_STEP_RAD;
99
+ const distance = Math.max(0, rawU * Math.cos(angle) + rawV * Math.sin(angle));
100
+ const u = dotRun(fromOffset, frame.tangent) + Math.cos(angle) * distance;
101
+ const v = dotRun(fromOffset, frame.bitangent) + Math.sin(angle) * distance;
102
+ return [
103
+ frame.origin[0] + frame.tangent[0] * u + frame.bitangent[0] * v,
104
+ frame.origin[1] + frame.tangent[1] * u + frame.bitangent[1] * v,
105
+ frame.origin[2] + frame.tangent[2] * u + frame.bitangent[2] * v,
106
+ ];
107
+ }
108
+ const ANGLE_STEP_RAD = Math.PI / 4;
109
+ const ALT_PIXELS_PER_METER = 100;
110
+ export const RUN_PREVIEW_OPACITY = 0.55;
111
+ export const RUN_SNAP_CURSOR_COLOR = '#22c55e';
112
+ export function runSectionHalfSizeM(nominalInches) {
113
+ return (nominalInches * 0.0254) / 2;
114
+ }
115
+ export function snapRunValue(value, step) {
116
+ if (step <= 0)
117
+ return value;
118
+ return Math.round(value / step) * step;
119
+ }
120
+ export function runDistanceSquared(a, b) {
121
+ const dx = a[0] - b[0];
122
+ const dy = a[1] - b[1];
123
+ const dz = a[2] - b[2];
124
+ return dx * dx + dy * dy + dz * dz;
125
+ }
126
+ export function projectRunToAngleLock(from, raw, sourceDirection = null) {
127
+ const dx = raw[0] - from[0];
128
+ const dz = raw[2] - from[2];
129
+ const length = Math.hypot(dx, dz);
130
+ if (length < 1e-4)
131
+ return [...from];
132
+ if (!sourceDirection) {
133
+ const angle = Math.round(Math.atan2(dz, dx) / ANGLE_STEP_RAD) * ANGLE_STEP_RAD;
134
+ const distance = Math.max(0, dx * Math.cos(angle) + dz * Math.sin(angle));
135
+ return [from[0] + Math.cos(angle) * distance, from[1], from[2] + Math.sin(angle) * distance];
136
+ }
137
+ const candidates = runHorizontalDirectionCandidates(sourceDirection);
138
+ let winner = candidates[0];
139
+ let winningProjection = Number.NEGATIVE_INFINITY;
140
+ for (const candidate of candidates) {
141
+ const projection = dx * candidate[0] + dz * candidate[2];
142
+ if (projection > winningProjection) {
143
+ winner = candidate;
144
+ winningProjection = projection;
145
+ }
146
+ }
147
+ const distance = Math.max(0, winningProjection);
148
+ return [from[0] + winner[0] * distance, from[1], from[2] + winner[2] * distance];
149
+ }
150
+ function dotRunVector(a, b) {
151
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
152
+ }
153
+ function normalizedRunVector(vector) {
154
+ const length = Math.hypot(vector[0], vector[1], vector[2]);
155
+ return length < 1e-9 ? null : [vector[0] / length, vector[1] / length, vector[2] / length];
156
+ }
157
+ export function snapRunLength(from, point, step) {
158
+ const delta = [point[0] - from[0], point[1] - from[1], point[2] - from[2]];
159
+ const length = Math.hypot(...delta);
160
+ if (step <= 0 || length < 1e-9)
161
+ return point;
162
+ const scale = snapRunValue(length, step) / length;
163
+ return [from[0] + delta[0] * scale, from[1] + delta[1] * scale, from[2] + delta[2] * scale];
164
+ }
165
+ export function projectRunToDirection(from, raw, direction) {
166
+ const distance = Math.max(0, dotRun([raw[0] - from[0], raw[1] - from[1], raw[2] - from[2]], direction));
167
+ return [
168
+ from[0] + direction[0] * distance,
169
+ from[1] + direction[1] * distance,
170
+ from[2] + direction[2] * distance,
171
+ ];
172
+ }
173
+ export function projectRunToCameraDirection(from, ray, sourceDirection, minimumDistance, gridStep, candidates = run3DDirectionCandidates(sourceDirection), surfaceFrame, screen) {
174
+ const rayDirection = normalizedRunVector(ray.direction);
175
+ if (!rayDirection)
176
+ return null;
177
+ const fromRayOrigin = [
178
+ ray.origin[0] - from[0],
179
+ ray.origin[1] - from[1],
180
+ ray.origin[2] - from[2],
181
+ ];
182
+ let winner = null;
183
+ let winningAim = Number.NEGATIVE_INFINITY;
184
+ const projectedCandidates = [];
185
+ const scores = [];
186
+ for (const direction of candidates) {
187
+ const parallel = dotRunVector(rayDirection, direction);
188
+ const denominator = 1 - parallel * parallel;
189
+ const projectedDistance = Math.abs(denominator) < 1e-9
190
+ ? minimumDistance
191
+ : (dotRunVector(fromRayOrigin, direction) -
192
+ parallel * dotRunVector(fromRayOrigin, rayDirection)) /
193
+ denominator;
194
+ const distance = Math.max(minimumDistance, snapRunValue(Math.max(projectedDistance, minimumDistance), gridStep));
195
+ const point = [
196
+ from[0] + direction[0] * distance,
197
+ from[1] + direction[1] * distance,
198
+ from[2] + direction[2] * distance,
199
+ ];
200
+ if (surfaceFrame &&
201
+ runDistanceSquared(point, projectRunPointToSurface(point, surfaceFrame)) > 1e-8) {
202
+ continue;
203
+ }
204
+ const aim = normalizedRunVector([
205
+ point[0] - ray.origin[0],
206
+ point[1] - ray.origin[1],
207
+ point[2] - ray.origin[2],
208
+ ]);
209
+ if (!aim)
210
+ continue;
211
+ if (screen) {
212
+ const origin = screen.project(from);
213
+ const tip = screen.project(from.map((value, i) => value + direction[i]));
214
+ scores.push(origin && tip ? screenDirectionScore(origin, tip, screen.pointer) : Infinity);
215
+ projectedCandidates.push({ point, direction });
216
+ }
217
+ const aimDot = dotRunVector(rayDirection, aim);
218
+ if (aimDot > winningAim) {
219
+ winningAim = aimDot;
220
+ winner = { point, direction };
221
+ }
222
+ }
223
+ if (screen) {
224
+ const previous = projectedCandidates.findIndex((candidate) => screen.previous && dotRunVector(candidate.direction, screen.previous) > 0.9999);
225
+ return projectedCandidates[chooseScreenDirection(scores, previous)] ?? null;
226
+ }
227
+ return winner;
228
+ }
229
+ export function stepNominalRunSize(sizes, current, direction) {
230
+ let nearest = 0;
231
+ for (let index = 1; index < sizes.length; index++) {
232
+ if (Math.abs(sizes[index] - current) < Math.abs(sizes[nearest] - current))
233
+ nearest = index;
234
+ }
235
+ return sizes[Math.min(sizes.length - 1, Math.max(0, nearest + direction))] ?? current;
236
+ }
237
+ function wallSurfaceBounds(hostId) {
238
+ const wall = useScene.getState().nodes[hostId];
239
+ if (wall?.type !== 'wall') {
240
+ return { minU: 0, maxU: 0, minV: 0, maxV: 0 };
241
+ }
242
+ return {
243
+ minU: 0,
244
+ maxU: Math.hypot(wall.end[0] - wall.start[0], wall.end[1] - wall.start[1]),
245
+ minV: 0,
246
+ maxV: Math.max(0, wall.height ?? 0),
247
+ };
248
+ }
249
+ function stableWallFrame(frame, hostId, activeLevelId) {
250
+ const wall = useScene.getState().nodes[hostId];
251
+ if (wall?.type !== 'wall')
252
+ return frame;
253
+ const origin = new Vector3(wall.start[0], 0, wall.start[1]);
254
+ const ownerLevel = wall.parentId ? sceneRegistry.nodes.get(wall.parentId) : null;
255
+ const activeLevel = activeLevelId ? sceneRegistry.nodes.get(activeLevelId) : null;
256
+ if (ownerLevel)
257
+ ownerLevel.localToWorld(origin);
258
+ if (activeLevel)
259
+ activeLevel.worldToLocal(origin);
260
+ return {
261
+ ...frame,
262
+ origin: projectRunPointToSurface(origin.toArray(), frame),
263
+ };
264
+ }
265
+ function publishRunSurface(target, point, activeLevelId) {
266
+ if (!target) {
267
+ clearPlacementSurface();
268
+ return;
269
+ }
270
+ const building = activeLevelId ? sceneRegistry.nodes.get(activeLevelId) : null;
271
+ const worldPoint = new Vector3(...point);
272
+ const worldAnchor = new Vector3(...target.frame.origin);
273
+ const worldNormalPoint = new Vector3(target.frame.origin[0] + target.frame.normal[0], target.frame.origin[1] + target.frame.normal[1], target.frame.origin[2] + target.frame.normal[2]);
274
+ if (building) {
275
+ building.localToWorld(worldPoint);
276
+ building.localToWorld(worldAnchor);
277
+ building.localToWorld(worldNormalPoint);
278
+ }
279
+ const worldNormal = worldNormalPoint.sub(worldAnchor).normalize();
280
+ publishPlacementSurface(worldPoint, worldNormal, 'fixed-plane', worldAnchor);
281
+ }
282
+ function surfacePointFromEvent(event, activeLevelId) {
283
+ const source = event.surfaceLocalPosition ?? event.localPosition;
284
+ const point = [source[0], source[1], source[2]];
285
+ const frame = createRunSurfaceFrame(point, event.surfaceNormal ?? UP);
286
+ const planeDistance = dotRun(point, frame.normal);
287
+ frame.origin = frame.normal.map((value) => value * planeDistance);
288
+ const floorLevelId = event.surfaceHit?.levelId ?? activeLevelId;
289
+ const wallNode = event.surfaceHit?.hostId
290
+ ? useScene.getState().nodes[event.surfaceHit.hostId]
291
+ : undefined;
292
+ // The selected level can legitimately remain on the ground floor while the
293
+ // cursor is over a wall on another storey. Resolve the wall's owning level
294
+ // from the hit node so the wall target cannot be downgraded to a floor target.
295
+ const wallLevelId = wallNode?.type === 'wall' ? wallNode.parentId : undefined;
296
+ const target = event.surfaceHit?.kind === 'wall' && event.surfaceHit.face === 'side' && wallLevelId
297
+ ? {
298
+ kind: 'wall',
299
+ levelId: wallLevelId,
300
+ hostId: event.surfaceHit.hostId,
301
+ side: event.surfaceHit.side ?? 'front',
302
+ frame: stableWallFrame(frame, event.surfaceHit.hostId, activeLevelId),
303
+ bounds: wallSurfaceBounds(event.surfaceHit.hostId),
304
+ }
305
+ : floorLevelId
306
+ ? {
307
+ kind: event.surfaceHit?.kind === 'ceiling' || frame.normal[1] < -0.98
308
+ ? 'ceiling'
309
+ : Math.abs(frame.normal[1]) > 0.98
310
+ ? 'floor'
311
+ : 'surface',
312
+ hostId: event.surfaceHit?.hostId,
313
+ levelId: floorLevelId,
314
+ frame,
315
+ }
316
+ : null;
317
+ return {
318
+ point,
319
+ frame: target?.frame ?? frame,
320
+ isHorizontal: event.surfaceNormal == null || Math.abs(frame.normal[1]) > 0.98,
321
+ target,
322
+ };
323
+ }
324
+ export function useDistributionRunTool(config) {
325
+ const { camera, gl } = useThree();
326
+ const initialStartRef = useRef(config.initialStart ? [...config.initialStart] : null);
327
+ const initialConnectionRef = useRef(config.initialConnection ?? { port: null, body: null });
328
+ const [start, setStart] = useState(initialStartRef.current);
329
+ const [cursor, setCursor] = useState(initialStartRef.current);
330
+ const [snapTarget, setSnapTarget] = useState(null);
331
+ const [snapScreen, setSnapScreen] = useState(null);
332
+ const [endConnection, setEndConnection] = useState({
333
+ port: null,
334
+ body: null,
335
+ });
336
+ const [altActive, setAltActive] = useState(false);
337
+ const [directionMode, setDirectionMode] = useState('free');
338
+ const [lengthInput, setLengthInput] = useState('');
339
+ const [validationMessage, setValidationMessage] = useState(null);
340
+ const configRef = useRef(config);
341
+ configRef.current = config;
342
+ const startRef = useRef(start);
343
+ startRef.current = start;
344
+ const startConnectionRef = useRef(initialConnectionRef.current);
345
+ const altAnchorRef = useRef(null);
346
+ const lastPointerRef = useRef(null);
347
+ const refreshCursorRef = useRef(() => { });
348
+ const lastClientYRef = useRef(null);
349
+ const lastResolvedRef = useRef(null);
350
+ const forcedDirectionRef = useRef(null);
351
+ const hoveredDirectionRef = useRef(null);
352
+ const lengthInputRef = useRef('');
353
+ useEffect(() => {
354
+ if (!config.active)
355
+ return;
356
+ const toolName = config.toolName;
357
+ useInteractionScope.getState().begin({ kind: 'drafting', tool: toolName });
358
+ return () => {
359
+ useInteractionScope
360
+ .getState()
361
+ .endIf((scope) => scope.kind === 'drafting' && scope.tool === toolName);
362
+ clearPlacementSurface();
363
+ };
364
+ }, [config.active, config.toolName]);
365
+ const refreshCursor = useCallback(() => refreshCursorRef.current(), []);
366
+ const updateLengthInput = useCallback((value) => {
367
+ const normalized = value.replace(',', '.').replace(/[^0-9.]/g, '');
368
+ const firstDot = normalized.indexOf('.');
369
+ const cleaned = firstDot < 0
370
+ ? normalized
371
+ : `${normalized.slice(0, firstDot + 1)}${normalized.slice(firstDot + 1).replace(/\./g, '')}`;
372
+ lengthInputRef.current = cleaned.slice(0, 12);
373
+ setLengthInput(lengthInputRef.current);
374
+ refreshCursorRef.current();
375
+ }, []);
376
+ useEffect(() => {
377
+ if (!config.active)
378
+ return;
379
+ const applyTypedLength = (resolved) => {
380
+ const currentStart = startRef.current;
381
+ const typed = Number.parseFloat(lengthInputRef.current);
382
+ if (!currentStart ||
383
+ !Number.isFinite(typed) ||
384
+ typed <= 0 ||
385
+ resolved.port ||
386
+ resolved.body) {
387
+ return resolved;
388
+ }
389
+ const direction = normalizedRunVector([
390
+ resolved.point[0] - currentStart[0],
391
+ resolved.point[1] - currentStart[1],
392
+ resolved.point[2] - currentStart[2],
393
+ ]);
394
+ if (!direction)
395
+ return resolved;
396
+ return {
397
+ ...resolved,
398
+ point: [
399
+ currentStart[0] + direction[0] * typed,
400
+ currentStart[1] + direction[1] * typed,
401
+ currentStart[2] + direction[2] * typed,
402
+ ],
403
+ snapped: null,
404
+ directionMode: resolved.directionMode,
405
+ };
406
+ };
407
+ const resolvePoint = (event) => {
408
+ const adapter = configRef.current;
409
+ const hit = surfacePointFromEvent(event, adapter.levelId);
410
+ const currentStart = startRef.current;
411
+ const previous = lastResolvedRef.current;
412
+ // A wall is only an attachment candidate, not a constraint for the
413
+ // whole run. Once the ray leaves the wall, continue on a horizontal
414
+ // plane through the start point so the user can route freely at the
415
+ // same elevation (or use angle lock for a deliberate diagonal).
416
+ const working = !event.surfaceHit && previous?.surfaceTarget?.kind === 'wall' && currentStart
417
+ ? createRunSurfaceFrame(currentStart, UP)
418
+ : (previous?.frame ?? (currentStart ? createRunSurfaceFrame(currentStart) : null));
419
+ const hasSurface = !!event.surfaceHit || !working || !event.localRay;
420
+ const target = hasSurface ? hit.target : null;
421
+ const resolved = resolveRunCursorPlane({
422
+ hit: hasSurface ? { point: hit.point, frame: hit.frame } : null,
423
+ working,
424
+ ray: event.localRay,
425
+ fallback: previous?.point ?? currentStart ?? hit.point,
426
+ clearance: adapter.surfaceClearance?.(target) ?? 0,
427
+ });
428
+ const bypass = event.nativeEvent?.altKey === true;
429
+ const gridStep = !bypass && isGridSnapActive() ? useEditor.getState().gridSnapStep : 0;
430
+ const angleLocked = !bypass && (isAngleSnapActive() || isGridSnapActive());
431
+ let point = currentStart
432
+ ? resolved.point
433
+ : snapRunPointToSurface(resolved.point, resolved.frame, gridStep);
434
+ const forcedDirection = forcedDirectionRef.current;
435
+ if (currentStart && forcedDirection) {
436
+ point = projectRunToDirection(currentStart, point, forcedDirection);
437
+ }
438
+ if (currentStart && angleLocked && !forcedDirection) {
439
+ const from = projectRunPointToSurface(currentStart, resolved.frame);
440
+ if (runDistanceSquared(from, currentStart) < 1e-6) {
441
+ point = projectRunToSurfaceAngleLock(currentStart, point, resolved.frame);
442
+ }
443
+ }
444
+ if (currentStart && gridStep > 0) {
445
+ point = snapRunLength(currentStart, point, gridStep);
446
+ }
447
+ const sample = { frame: resolved.frame, surfaceTarget: target };
448
+ const native = (event.nativeEvent ?? {});
449
+ const screenProjection = getGridEventScreenProjection(event);
450
+ const pointer = screenProjection?.pointer ?? [native.clientX ?? NaN, native.clientY ?? NaN];
451
+ const rect = gl.domElement.getBoundingClientRect();
452
+ const level = adapter.levelId ? sceneRegistry.nodes.get(adapter.levelId) : null;
453
+ const origin = camera.getWorldPosition(new Vector3());
454
+ const projectConnection = (candidate) => {
455
+ if (screenProjection) {
456
+ const [a, b, c, d, e, f] = screenProjection.localToScreen;
457
+ return {
458
+ x: a * candidate[0] + c * candidate[2] + e,
459
+ y: b * candidate[0] + d * candidate[2] + f,
460
+ depth: 0,
461
+ };
462
+ }
463
+ const world = new Vector3(...candidate);
464
+ if (level)
465
+ level.localToWorld(world);
466
+ const projected = world.clone().project(camera);
467
+ if (projected.z < -1 || projected.z > 1)
468
+ return null;
469
+ if (event.surfaceHit &&
470
+ world.distanceTo(origin) > new Vector3(...event.position).distanceTo(origin) + 0.03)
471
+ return null;
472
+ return {
473
+ x: rect.left + ((projected.x + 1) * rect.width) / 2,
474
+ y: rect.top + ((1 - projected.y) * rect.height) / 2,
475
+ depth: world.distanceTo(origin),
476
+ };
477
+ };
478
+ const acceptsConnection = (candidate) => {
479
+ const screen = projectConnection(candidate);
480
+ return !!screen && Math.hypot(screen.x - pointer[0], screen.y - pointer[1]) <= 12;
481
+ };
482
+ const resolveConnection = (candidate) => {
483
+ if (bypass || !(isGridSnapActive() || isMagneticSnapActive() || isAngleSnapActive()))
484
+ return null;
485
+ const source = startConnectionRef.current.port;
486
+ const hit = findScreenPort(adapter.getPorts(), pointer, projectConnection, source);
487
+ if (hit) {
488
+ return {
489
+ frame: createRunSurfaceFrame([...hit.port.position]),
490
+ surfaceTarget: null,
491
+ point: [...hit.port.position],
492
+ snapped: [...hit.port.position],
493
+ snapScreen: hit.screen,
494
+ directionMode: 'snap',
495
+ port: hit.port,
496
+ body: null,
497
+ };
498
+ }
499
+ const body = adapter.findBody(candidate, target);
500
+ if (body && acceptsConnection(body.point) && body.nodeId !== source?.nodeId) {
501
+ return {
502
+ ...sample,
503
+ point: body.point,
504
+ snapped: body.point,
505
+ directionMode: 'snap',
506
+ port: null,
507
+ body,
508
+ };
509
+ }
510
+ return null;
511
+ };
512
+ const connection = resolveConnection(resolved.point);
513
+ if (connection)
514
+ return connection;
515
+ // Rank displayed directions before a surface projection discards height.
516
+ if (currentStart && event.localRay && !bypass && (forcedDirection || angleLocked)) {
517
+ const source = startConnectionRef.current.port?.direction ?? null;
518
+ const candidates = forcedDirection
519
+ ? [forcedDirection]
520
+ : source
521
+ ? run3DDirectionCandidates(source)
522
+ : runHorizontalDirectionCandidates(null);
523
+ const directionHit = projectRunToCameraDirection(currentStart, event.localRay, source ?? X_AXIS, adapter.minimumSegmentLength ?? 0.05, gridStep, candidates, (target?.kind === 'wall' || target?.kind === 'ceiling') && !forcedDirection
524
+ ? resolved.frame
525
+ : undefined, !forcedDirection && event.nativeEvent
526
+ ? {
527
+ project: (candidate) => {
528
+ const level = adapter.levelId ? sceneRegistry.nodes.get(adapter.levelId) : null;
529
+ const world = new Vector3(...candidate);
530
+ if (level)
531
+ level.localToWorld(world);
532
+ world.project(camera);
533
+ if (world.z < -1 || world.z > 1)
534
+ return null;
535
+ const rect = gl.domElement.getBoundingClientRect();
536
+ return [
537
+ rect.left + ((world.x + 1) * rect.width) / 2,
538
+ rect.top + ((1 - world.y) * rect.height) / 2,
539
+ ];
540
+ },
541
+ pointer: [event.nativeEvent.clientX, event.nativeEvent.clientY],
542
+ previous: hoveredDirectionRef.current,
543
+ }
544
+ : undefined);
545
+ if (directionHit) {
546
+ hoveredDirectionRef.current = directionHit.direction;
547
+ const directionConnection = resolveConnection(directionHit.point);
548
+ if (directionConnection)
549
+ return directionConnection;
550
+ return {
551
+ point: Math.abs(directionHit.direction[1]) < 1e-6 && target?.kind !== 'ceiling'
552
+ ? (adapter.resolveFreeEnd?.(currentStart, directionHit.point, startConnectionRef.current) ?? directionHit.point)
553
+ : directionHit.point,
554
+ frame: event.surfaceHit && !forcedDirection
555
+ ? resolved.frame
556
+ : createRunSurfaceFrame(currentStart),
557
+ surfaceTarget: forcedDirection ||
558
+ (Math.abs(directionHit.direction[1]) > 1e-6 && target?.kind === 'floor')
559
+ ? null
560
+ : target,
561
+ snapped: null,
562
+ directionMode: 'angle',
563
+ port: null,
564
+ body: null,
565
+ };
566
+ }
567
+ }
568
+ if (currentStart && target?.kind !== 'ceiling' && Math.abs(resolved.frame.normal[1]) > 0.98) {
569
+ point = adapter.resolveFreeEnd?.(currentStart, point, startConnectionRef.current) ?? point;
570
+ }
571
+ return {
572
+ ...sample,
573
+ point,
574
+ snapped: null,
575
+ directionMode: angleLocked ? 'angle' : 'free',
576
+ port: null,
577
+ body: null,
578
+ };
579
+ };
580
+ const resolveVerticalPoint = (clientY) => {
581
+ const anchor = altAnchorRef.current;
582
+ const currentStart = startRef.current;
583
+ if (!anchor || !currentStart)
584
+ return null;
585
+ const step = isGridSnapActive() ? useEditor.getState().gridSnapStep : 0;
586
+ const delta = snapRunValue((anchor.clientY - clientY) / ALT_PIXELS_PER_METER, step);
587
+ const y = anchor.baseY + delta;
588
+ return [currentStart[0], y, currentStart[2]];
589
+ };
590
+ const updateCursor = (resolved) => {
591
+ if (!resolved.frame && lastResolvedRef.current?.frame)
592
+ resolved = {
593
+ ...resolved,
594
+ frame: { ...lastResolvedRef.current.frame, origin: resolved.point },
595
+ surfaceTarget: null,
596
+ };
597
+ lastResolvedRef.current = resolved;
598
+ const currentStart = startRef.current;
599
+ const minimumLength = configRef.current.minimumSegmentLength ?? 0.05;
600
+ const length = currentStart
601
+ ? Math.hypot(resolved.point[0] - currentStart[0], resolved.point[1] - currentStart[1], resolved.point[2] - currentStart[2])
602
+ : 0;
603
+ const typed = lengthInputRef.current;
604
+ setValidationMessage(currentStart &&
605
+ typed &&
606
+ (!Number.isFinite(Number.parseFloat(typed)) || Number.parseFloat(typed) <= 0)
607
+ ? 'Enter a positive length'
608
+ : currentStart && length < minimumLength
609
+ ? `Run must be at least ${minimumLength.toFixed(2)} m`
610
+ : null);
611
+ setCursor(resolved.point);
612
+ setSnapTarget(resolved.snapped);
613
+ setSnapScreen(resolved.snapScreen ?? null);
614
+ setEndConnection({
615
+ port: resolved.port,
616
+ body: resolved.port ? null : resolved.body,
617
+ });
618
+ setDirectionMode(resolved.directionMode);
619
+ if (resolved.frame)
620
+ publishRunSurface({
621
+ kind: 'surface',
622
+ levelId: configRef.current.levelId,
623
+ frame: resolved.frame,
624
+ }, resolved.point, configRef.current.levelId);
625
+ };
626
+ const commit = (end, connection) => {
627
+ const currentStart = startRef.current;
628
+ if (!currentStart)
629
+ return;
630
+ if (lengthInputRef.current && !(Number(lengthInputRef.current) > 0))
631
+ return;
632
+ const minimumLength = configRef.current.minimumSegmentLength ?? 0.05;
633
+ const length = Math.hypot(end[0] - currentStart[0], end[1] - currentStart[1], end[2] - currentStart[2]);
634
+ if (length < minimumLength) {
635
+ return;
636
+ }
637
+ const capturedTarget = lastResolvedRef.current?.surfaceTarget ?? null;
638
+ const clearance = configRef.current.surfaceClearance?.(capturedTarget) ?? 0;
639
+ const surfaceTarget = capturedTarget?.kind === 'wall' &&
640
+ [currentStart, end].some((point) => {
641
+ const projected = projectRunPointToSurface(point, capturedTarget.frame);
642
+ return Math.abs(Math.sqrt(runDistanceSquared(point, projected)) - clearance) > 1e-4;
643
+ })
644
+ ? null
645
+ : capturedTarget;
646
+ const result = configRef.current.commit({
647
+ start: currentStart,
648
+ end,
649
+ startConnection: startConnectionRef.current,
650
+ endConnection: connection,
651
+ surfaceTarget,
652
+ });
653
+ if (!result) {
654
+ setValidationMessage('Fitting clearance is too small for this connection');
655
+ return;
656
+ }
657
+ triggerSFX('sfx:item-place');
658
+ startRef.current = result.nextStart;
659
+ setStart(result.nextStart);
660
+ setSnapTarget(null);
661
+ setSnapScreen(null);
662
+ setEndConnection({ port: null, body: null });
663
+ lengthInputRef.current = '';
664
+ setLengthInput('');
665
+ setValidationMessage(null);
666
+ startConnectionRef.current = result.nextConnection;
667
+ forcedDirectionRef.current = null;
668
+ hoveredDirectionRef.current = null;
669
+ altAnchorRef.current = null;
670
+ setAltActive(false);
671
+ };
672
+ const onMove = (event) => {
673
+ lastPointerRef.current = event;
674
+ const clientY = event.nativeEvent?.clientY;
675
+ if (typeof clientY === 'number')
676
+ lastClientYRef.current = clientY;
677
+ if (altAnchorRef.current && typeof clientY === 'number') {
678
+ const point = resolveVerticalPoint(clientY);
679
+ if (point) {
680
+ clearDrawAlignment();
681
+ updateCursor({
682
+ point,
683
+ snapped: null,
684
+ port: null,
685
+ body: null,
686
+ directionMode: 'vertical',
687
+ });
688
+ return;
689
+ }
690
+ }
691
+ updateCursor(applyTypedLength(resolvePoint(event)));
692
+ };
693
+ const onClick = (event) => {
694
+ event.nativeEvent?.stopPropagation?.();
695
+ const currentStart = startRef.current;
696
+ if (altAnchorRef.current && currentStart) {
697
+ const clientY = event.nativeEvent?.clientY ?? lastClientYRef.current;
698
+ if (typeof clientY === 'number') {
699
+ const point = resolveVerticalPoint(clientY);
700
+ if (point && Math.abs(point[1] - currentStart[1]) >= 1e-4) {
701
+ commit(point, { port: null, body: null });
702
+ }
703
+ }
704
+ return;
705
+ }
706
+ const resolved = applyTypedLength(resolvePoint(event));
707
+ updateCursor(resolved);
708
+ if (!currentStart) {
709
+ triggerSFX('sfx:grid-snap');
710
+ const connection = {
711
+ port: resolved.port,
712
+ body: resolved.port ? null : resolved.body,
713
+ };
714
+ startConnectionRef.current = connection;
715
+ configRef.current.inheritFromConnection?.(connection);
716
+ startRef.current = resolved.point;
717
+ setStart(resolved.point);
718
+ setCursor(resolved.point);
719
+ setSnapTarget(resolved.snapped);
720
+ setSnapScreen(resolved.snapScreen ?? null);
721
+ setEndConnection({ port: null, body: null });
722
+ return;
723
+ }
724
+ const typedResolved = applyTypedLength(resolved);
725
+ commit(typedResolved.point, {
726
+ port: resolved.port,
727
+ body: resolved.port ? null : resolved.body,
728
+ });
729
+ };
730
+ const onKeyDown = (event) => {
731
+ const target = event.target;
732
+ const tag = target?.tagName;
733
+ const isLengthField = target ? target.closest('[data-run-length-input]') !== null : false;
734
+ if ((tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || tag === 'BUTTON') &&
735
+ !isLengthField)
736
+ return;
737
+ if (event.key === 'Escape' && startRef.current) {
738
+ event.preventDefault();
739
+ event.stopImmediatePropagation();
740
+ onCancel();
741
+ useEditor.getState().armToolMode({ mode: 'select' });
742
+ return;
743
+ }
744
+ if (event.key === 'Alt') {
745
+ const currentStart = startRef.current;
746
+ if (!currentStart || lastClientYRef.current === null || altAnchorRef.current)
747
+ return;
748
+ event.preventDefault();
749
+ altAnchorRef.current = {
750
+ clientY: lastClientYRef.current,
751
+ baseY: currentStart[1],
752
+ };
753
+ setAltActive(true);
754
+ return;
755
+ }
756
+ if (event.key === 'Tab' &&
757
+ startRef.current &&
758
+ !event.altKey &&
759
+ !event.metaKey &&
760
+ !event.ctrlKey) {
761
+ event.preventDefault();
762
+ event.stopImmediatePropagation();
763
+ const source = startConnectionRef.current.port?.direction;
764
+ const candidates = source
765
+ ? run3DDirectionCandidates(source)
766
+ : runHorizontalDirectionCandidates(null);
767
+ const current = forcedDirectionRef.current ?? hoveredDirectionRef.current;
768
+ const index = candidates.findIndex((direction) => current && dotRunVector(direction, current) > 0.9999);
769
+ forcedDirectionRef.current =
770
+ candidates[(index + (event.shiftKey ? candidates.length - 1 : 1)) % candidates.length];
771
+ refreshCursorRef.current();
772
+ return;
773
+ }
774
+ if (startRef.current && isLengthField && /^[0-9.,]$/.test(event.key)) {
775
+ event.stopImmediatePropagation();
776
+ return;
777
+ }
778
+ if (startRef.current && !isLengthField && /^[0-9.,]$/.test(event.key)) {
779
+ event.preventDefault();
780
+ event.stopImmediatePropagation();
781
+ updateLengthInput(`${lengthInputRef.current}${event.key}`);
782
+ return;
783
+ }
784
+ if (startRef.current && event.key === 'Enter') {
785
+ event.preventDefault();
786
+ event.stopImmediatePropagation();
787
+ const resolved = lastResolvedRef.current;
788
+ if (resolved) {
789
+ const typedResolved = applyTypedLength(resolved);
790
+ commit(typedResolved.point, {
791
+ port: typedResolved.port,
792
+ body: typedResolved.port ? null : typedResolved.body,
793
+ });
794
+ }
795
+ return;
796
+ }
797
+ configRef.current.onShortcut?.(event, startRef.current);
798
+ };
799
+ const onKeyUp = (event) => {
800
+ if (event.key !== 'Alt' || !altAnchorRef.current)
801
+ return;
802
+ event.preventDefault();
803
+ altAnchorRef.current = null;
804
+ setAltActive(false);
805
+ setDirectionMode('free');
806
+ };
807
+ const onCancel = () => {
808
+ clearDrawAlignment();
809
+ if (!startRef.current)
810
+ return;
811
+ markToolCancelConsumed();
812
+ startRef.current = null;
813
+ setStart(null);
814
+ setCursor(null);
815
+ setSnapTarget(null);
816
+ setSnapScreen(null);
817
+ setEndConnection({ port: null, body: null });
818
+ lengthInputRef.current = '';
819
+ setLengthInput('');
820
+ setValidationMessage(null);
821
+ startConnectionRef.current = { port: null, body: null };
822
+ forcedDirectionRef.current = null;
823
+ hoveredDirectionRef.current = null;
824
+ lastPointerRef.current = null;
825
+ clearPlacementSurface();
826
+ lastResolvedRef.current = null;
827
+ altAnchorRef.current = null;
828
+ setAltActive(false);
829
+ };
830
+ refreshCursorRef.current = () => {
831
+ if (lastPointerRef.current)
832
+ updateCursor(applyTypedLength(resolvePoint(lastPointerRef.current)));
833
+ else if (lastResolvedRef.current)
834
+ updateCursor(applyTypedLength(lastResolvedRef.current));
835
+ };
836
+ const unsubscribeSnapping = useEditor.subscribe((state, previous) => {
837
+ const modeChanged = state.snappingModeByContext !== previous.snappingModeByContext;
838
+ if (!modeChanged && state.gridSnapStep === previous.gridSnapStep)
839
+ return;
840
+ if (modeChanged) {
841
+ forcedDirectionRef.current = null;
842
+ hoveredDirectionRef.current = null;
843
+ }
844
+ refreshCursorRef.current();
845
+ });
846
+ emitter.on('grid:click', onClick);
847
+ emitter.on('grid:move', onMove);
848
+ emitter.on('tool:cancel', onCancel);
849
+ window.addEventListener('keydown', onKeyDown, true);
850
+ window.addEventListener('keyup', onKeyUp);
851
+ return () => {
852
+ unsubscribeSnapping();
853
+ emitter.off('grid:click', onClick);
854
+ emitter.off('grid:move', onMove);
855
+ emitter.off('tool:cancel', onCancel);
856
+ window.removeEventListener('keydown', onKeyDown, true);
857
+ window.removeEventListener('keyup', onKeyUp);
858
+ altAnchorRef.current = null;
859
+ lastPointerRef.current = null;
860
+ refreshCursorRef.current = () => { };
861
+ clearPlacementSurface();
862
+ clearDrawAlignment();
863
+ };
864
+ }, [camera, gl, config.active, updateLengthInput]);
865
+ return {
866
+ refreshCursor,
867
+ start,
868
+ cursor,
869
+ snapTarget,
870
+ snapScreen,
871
+ altActive,
872
+ directionMode,
873
+ lengthInput,
874
+ validationMessage,
875
+ onLengthInputChange: updateLengthInput,
876
+ onDirectionSelect: (direction) => {
877
+ forcedDirectionRef.current = direction;
878
+ setDirectionMode('angle');
879
+ refreshCursorRef.current();
880
+ },
881
+ startConnection: startConnectionRef.current,
882
+ endConnection,
883
+ surfaceTarget: lastResolvedRef.current?.surfaceTarget ?? null,
884
+ };
885
+ }
886
+ export function DistributionRunCursor({ cursor, start, snapTarget, snapScreen, altActive, unit, extraParts = [], cursorRef, directionMode, startDirection, lengthInput, validationMessage, onLengthInputChange, onDirectionSelect, }) {
887
+ const lengthFieldRef = useRef(null);
888
+ useEffect(() => {
889
+ if (start)
890
+ lengthFieldRef.current?.focus();
891
+ }, [start]);
892
+ if (!cursor)
893
+ return null;
894
+ const parts = [
895
+ ...(start
896
+ ? [
897
+ {
898
+ key: 'length',
899
+ prefix: 'L',
900
+ value: Math.hypot(cursor[0] - start[0], cursor[1] - start[1], cursor[2] - start[2]),
901
+ },
902
+ ]
903
+ : []),
904
+ {
905
+ key: 'x',
906
+ prefix: 'X',
907
+ value: start ? cursor[0] - start[0] : cursor[0],
908
+ signed: !!start,
909
+ },
910
+ {
911
+ key: 'y',
912
+ prefix: 'Y',
913
+ value: start ? cursor[1] - start[1] : cursor[1],
914
+ signed: !!start,
915
+ },
916
+ {
917
+ key: 'z',
918
+ prefix: 'Z',
919
+ value: start ? cursor[2] - start[2] : cursor[2],
920
+ signed: !!start,
921
+ },
922
+ ...extraParts,
923
+ ];
924
+ const primary = start ? (altActive ? 'y' : 'length') : undefined;
925
+ const elevated = cursor[1] > 0.001;
926
+ const ground = [cursor[0], 0, cursor[2]];
927
+ return (_jsxs(_Fragment, { children: [snapScreen && (_jsx(Html, { style: { pointerEvents: 'none' }, children: createPortal(_jsx("div", { style: {
928
+ position: 'fixed',
929
+ left: snapScreen.x,
930
+ top: snapScreen.y,
931
+ pointerEvents: 'none',
932
+ zIndex: 110,
933
+ }, children: _jsx("div", { className: "absolute h-5 w-5 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-emerald-500 bg-emerald-500/20 ring-2 ring-background" }) }), document.body) })), start && (_jsx(RunDirectionFeedback, { cursor: cursor, mode: directionMode, snapped: !!snapTarget, sourceDirection: startDirection ?? null, start: start, onDirectionSelect: onDirectionSelect })), _jsx(CursorSphere, { color: snapTarget ? RUN_SNAP_CURSOR_COLOR : undefined, dotAtTip: elevated || undefined, height: elevated ? cursor[1] : undefined, position: elevated ? ground : cursor, ref: cursorRef }), _jsx("group", { position: cursor, children: _jsx(Html, { center: true, position: [0, 1.45, 0], style: { pointerEvents: 'none', userSelect: 'none' }, zIndexRange: [100, 0], children: _jsxs("div", { className: "flex flex-col items-center gap-1", children: [_jsx(DimensionPill, { parts: parts, primary: primary, unit: unit }), start ? (_jsxs("label", { className: "rounded-full border border-border/60 bg-background/90 px-3 py-1 text-[11px] tabular-nums text-muted-foreground shadow-sm backdrop-blur", children: ["Length:", ' ', _jsx("input", { className: "w-20 bg-transparent text-center text-foreground outline-none", "data-run-length-input": true, inputMode: "decimal", onKeyDown: (event) => {
934
+ if (event.key === 'Backspace' ||
935
+ event.key === 'Delete' ||
936
+ event.key === 'ArrowLeft' ||
937
+ event.key === 'ArrowRight') {
938
+ event.stopPropagation();
939
+ }
940
+ }, onChange: (event) => onLengthInputChange?.(event.target.value), onPointerDown: (event) => event.stopPropagation(), placeholder: "type a length", ref: lengthFieldRef, style: { pointerEvents: 'auto' }, type: "text", value: lengthInput ?? '' }), ' ', "m", _jsx("span", { className: "ml-2", children: "Tab: direction" })] })) : null, validationMessage ? (_jsx("div", { className: "rounded-full border border-red-500/50 bg-red-500/10 px-3 py-1 text-[11px] text-red-700 shadow-sm backdrop-blur dark:text-red-300", children: validationMessage })) : null] }) }) })] }));
941
+ }