@pascal-app/nodes 1.0.3 → 1.0.4

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 (708) hide show
  1. package/dist/block/definition.d.ts.map +1 -1
  2. package/dist/block/definition.js +18 -3
  3. package/dist/block/floorplan.d.ts +11 -1
  4. package/dist/block/floorplan.d.ts.map +1 -1
  5. package/dist/block/floorplan.js +81 -13
  6. package/dist/block/geometry.d.ts +2 -2
  7. package/dist/block/geometry.d.ts.map +1 -1
  8. package/dist/block/geometry.js +39 -24
  9. package/dist/block/hosted-edit.d.ts.map +1 -1
  10. package/dist/block/hosted-edit.js +25 -0
  11. package/dist/block/material-slots.d.ts +1 -3
  12. package/dist/block/material-slots.d.ts.map +1 -1
  13. package/dist/block/material-slots.js +1 -11
  14. package/dist/block/paint.d.ts.map +1 -1
  15. package/dist/block/paint.js +4 -10
  16. package/dist/block/panel.d.ts.map +1 -1
  17. package/dist/block/panel.js +8 -3
  18. package/dist/block/selection.d.ts.map +1 -1
  19. package/dist/block/selection.js +2 -2
  20. package/dist/box-vent/definition.d.ts.map +1 -1
  21. package/dist/box-vent/definition.js +2 -5
  22. package/dist/box-vent/panel.d.ts.map +1 -1
  23. package/dist/box-vent/panel.js +5 -28
  24. package/dist/cabinet/countertop-layout.d.ts +13 -2
  25. package/dist/cabinet/countertop-layout.d.ts.map +1 -1
  26. package/dist/cabinet/definition.d.ts.map +1 -1
  27. package/dist/cabinet/definition.js +1 -2
  28. package/dist/cabinet/floorplan.d.ts.map +1 -1
  29. package/dist/cabinet/floorplan.js +125 -28
  30. package/dist/cabinet/geometry/shared.d.ts +1 -2
  31. package/dist/cabinet/geometry/shared.d.ts.map +1 -1
  32. package/dist/cabinet/geometry/shared.js +1 -2
  33. package/dist/cabinet/run-layout.d.ts.map +1 -1
  34. package/dist/cabinet/run-layout.js +8 -5
  35. package/dist/cabinet/run-ops.d.ts +13 -2
  36. package/dist/cabinet/run-ops.d.ts.map +1 -1
  37. package/dist/cabinet/tool.d.ts.map +1 -1
  38. package/dist/cabinet/tool.js +22 -24
  39. package/dist/cabinet/wall-snap.d.ts.map +1 -1
  40. package/dist/cabinet/wall-snap.js +8 -8
  41. package/dist/ceiling/boundary-editor.d.ts.map +1 -1
  42. package/dist/ceiling/boundary-editor.js +5 -3
  43. package/dist/ceiling/definition.d.ts +4 -4
  44. package/dist/ceiling/definition.d.ts.map +1 -1
  45. package/dist/ceiling/definition.js +15 -15
  46. package/dist/ceiling/floorplan-affordances.d.ts +84 -4
  47. package/dist/ceiling/floorplan-affordances.d.ts.map +1 -1
  48. package/dist/ceiling/floorplan-affordances.js +0 -1
  49. package/dist/ceiling/floorplan-move.d.ts.map +1 -1
  50. package/dist/ceiling/floorplan-move.js +0 -1
  51. package/dist/ceiling/floorplan.d.ts +1 -1
  52. package/dist/ceiling/floorplan.d.ts.map +1 -1
  53. package/dist/ceiling/floorplan.js +2 -1
  54. package/dist/ceiling/height-bounds.d.ts +19 -0
  55. package/dist/ceiling/height-bounds.d.ts.map +1 -0
  56. package/dist/ceiling/height-bounds.js +24 -0
  57. package/dist/ceiling/hole-editor.d.ts.map +1 -1
  58. package/dist/ceiling/hole-editor.js +3 -4
  59. package/dist/ceiling/materials.d.ts +1 -1
  60. package/dist/ceiling/materials.d.ts.map +1 -1
  61. package/dist/ceiling/materials.js +10 -3
  62. package/dist/ceiling/paint.d.ts +2 -8
  63. package/dist/ceiling/paint.d.ts.map +1 -1
  64. package/dist/ceiling/paint.js +121 -24
  65. package/dist/ceiling/panel.d.ts.map +1 -1
  66. package/dist/ceiling/panel.js +40 -23
  67. package/dist/ceiling/renderer.d.ts.map +1 -1
  68. package/dist/ceiling/renderer.js +41 -5
  69. package/dist/chimney/move-tool.d.ts.map +1 -1
  70. package/dist/chimney/move-tool.js +8 -2
  71. package/dist/chimney/paint.d.ts.map +1 -1
  72. package/dist/chimney/paint.js +3 -10
  73. package/dist/column/definition.d.ts.map +1 -1
  74. package/dist/column/definition.js +24 -2
  75. package/dist/column/floorplan-affordances.d.ts.map +1 -1
  76. package/dist/column/floorplan-affordances.js +5 -0
  77. package/dist/column/floorplan.d.ts +1 -1
  78. package/dist/column/floorplan.d.ts.map +1 -1
  79. package/dist/column/floorplan.js +47 -2
  80. package/dist/column/hosted-resize.d.ts +101 -2
  81. package/dist/column/hosted-resize.d.ts.map +1 -1
  82. package/dist/column/panel.d.ts.map +1 -1
  83. package/dist/column/panel.js +147 -146
  84. package/dist/column/renderer.d.ts.map +1 -1
  85. package/dist/column/renderer.js +6 -4
  86. package/dist/column/surface.d.ts.map +1 -1
  87. package/dist/column/surface.js +7 -0
  88. package/dist/construction-dimension/floorplan.js +7 -3
  89. package/dist/cupola/definition.d.ts.map +1 -1
  90. package/dist/cupola/definition.js +2 -8
  91. package/dist/cupola/panel.d.ts.map +1 -1
  92. package/dist/cupola/panel.js +5 -23
  93. package/dist/door/definition.d.ts.map +1 -1
  94. package/dist/door/definition.js +12 -3
  95. package/dist/door/door-math.d.ts +5 -10
  96. package/dist/door/door-math.d.ts.map +1 -1
  97. package/dist/door/door-math.js +14 -15
  98. package/dist/door/floorplan-move.d.ts.map +1 -1
  99. package/dist/door/floorplan-move.js +3 -1
  100. package/dist/door/floorplan.d.ts.map +1 -1
  101. package/dist/door/floorplan.js +55 -21
  102. package/dist/door/mechanism.d.ts +4 -0
  103. package/dist/door/mechanism.d.ts.map +1 -0
  104. package/dist/door/mechanism.js +24 -0
  105. package/dist/door/move-tool.d.ts.map +1 -1
  106. package/dist/door/move-tool.js +72 -48
  107. package/dist/door/paint.d.ts.map +1 -1
  108. package/dist/door/paint.js +3 -0
  109. package/dist/door/panel.d.ts.map +1 -1
  110. package/dist/door/panel.js +34 -259
  111. package/dist/door/placement.d.ts +45 -0
  112. package/dist/door/placement.d.ts.map +1 -0
  113. package/dist/door/placement.js +51 -0
  114. package/dist/door/preview.d.ts.map +1 -1
  115. package/dist/door/preview.js +2 -0
  116. package/dist/door/renderer.d.ts.map +1 -1
  117. package/dist/door/renderer.js +3 -2
  118. package/dist/door/tool.d.ts.map +1 -1
  119. package/dist/door/tool.js +92 -21
  120. package/dist/dormer/csg-geometry.d.ts.map +1 -1
  121. package/dist/dormer/csg-geometry.js +2 -0
  122. package/dist/dormer/paint.d.ts.map +1 -1
  123. package/dist/dormer/paint.js +2 -5
  124. package/dist/dormer/panel.d.ts.map +1 -1
  125. package/dist/dormer/panel.js +4 -14
  126. package/dist/downspout/definition.d.ts.map +1 -1
  127. package/dist/downspout/definition.js +2 -2
  128. package/dist/duct-fitting/definition.d.ts.map +1 -1
  129. package/dist/duct-fitting/definition.js +2 -1
  130. package/dist/duct-fitting/geometry.d.ts.map +1 -1
  131. package/dist/duct-fitting/geometry.js +1 -1
  132. package/dist/duct-fitting/move-tool.d.ts.map +1 -1
  133. package/dist/duct-fitting/move-tool.js +8 -2
  134. package/dist/duct-segment/definition.d.ts.map +1 -1
  135. package/dist/duct-segment/definition.js +2 -2
  136. package/dist/duct-segment/geometry.d.ts.map +1 -1
  137. package/dist/duct-segment/geometry.js +1 -1
  138. package/dist/duct-segment/move-tool.d.ts.map +1 -1
  139. package/dist/duct-segment/move-tool.js +8 -2
  140. package/dist/elevator/definition.d.ts.map +1 -1
  141. package/dist/elevator/definition.js +1 -2
  142. package/dist/elevator/panel.d.ts.map +1 -1
  143. package/dist/elevator/panel.js +5 -27
  144. package/dist/elevator/parametrics.js +1 -1
  145. package/dist/elevator/renderer.d.ts.map +1 -1
  146. package/dist/elevator/renderer.js +3 -4
  147. package/dist/eyebrow-vent/definition.d.ts.map +1 -1
  148. package/dist/eyebrow-vent/definition.js +2 -5
  149. package/dist/eyebrow-vent/paint.d.ts.map +1 -1
  150. package/dist/eyebrow-vent/paint.js +3 -6
  151. package/dist/eyebrow-vent/panel.d.ts.map +1 -1
  152. package/dist/eyebrow-vent/panel.js +5 -23
  153. package/dist/fence/actions/move-endpoint.d.ts +1 -1
  154. package/dist/fence/actions/move-endpoint.d.ts.map +1 -1
  155. package/dist/fence/actions/move-endpoint.js +2 -1
  156. package/dist/fence/definition.d.ts +2 -1
  157. package/dist/fence/definition.d.ts.map +1 -1
  158. package/dist/fence/definition.js +83 -28
  159. package/dist/fence/drafting.d.ts +36 -0
  160. package/dist/fence/drafting.d.ts.map +1 -0
  161. package/dist/fence/drafting.js +210 -0
  162. package/dist/fence/feature-tool.d.ts +4 -0
  163. package/dist/fence/feature-tool.d.ts.map +1 -0
  164. package/dist/fence/feature-tool.js +140 -0
  165. package/dist/fence/features.d.ts +2 -0
  166. package/dist/fence/features.d.ts.map +1 -0
  167. package/dist/fence/features.js +12 -0
  168. package/dist/fence/floorplan-affordances.d.ts.map +1 -1
  169. package/dist/fence/floorplan-affordances.js +2 -1
  170. package/dist/fence/floorplan.d.ts +2 -3
  171. package/dist/fence/floorplan.d.ts.map +1 -1
  172. package/dist/fence/floorplan.js +131 -71
  173. package/dist/fence/geometry-parts.d.ts +50 -0
  174. package/dist/fence/geometry-parts.d.ts.map +1 -0
  175. package/dist/fence/geometry-parts.js +1144 -0
  176. package/dist/fence/geometry.d.ts +2 -3
  177. package/dist/fence/geometry.d.ts.map +1 -1
  178. package/dist/fence/geometry.js +84 -7
  179. package/dist/fence/index.d.ts +1 -0
  180. package/dist/fence/index.d.ts.map +1 -1
  181. package/dist/fence/index.js +1 -0
  182. package/dist/fence/inspector-editors.d.ts +15 -0
  183. package/dist/fence/inspector-editors.d.ts.map +1 -1
  184. package/dist/fence/inspector-editors.js +128 -3
  185. package/dist/fence/lift.d.ts.map +1 -1
  186. package/dist/fence/lift.js +5 -2
  187. package/dist/fence/move-tool.js +2 -1
  188. package/dist/fence/panel-model.d.ts +4 -0
  189. package/dist/fence/panel-model.d.ts.map +1 -0
  190. package/dist/fence/panel-model.js +12 -0
  191. package/dist/fence/parametrics.d.ts +0 -12
  192. package/dist/fence/parametrics.d.ts.map +1 -1
  193. package/dist/fence/parametrics.js +185 -18
  194. package/dist/fence/system.d.ts.map +1 -1
  195. package/dist/fence/system.js +141 -31
  196. package/dist/fence/tool.d.ts.map +1 -1
  197. package/dist/fence/tool.js +256 -47
  198. package/dist/fence-feature/actions.d.ts +7 -0
  199. package/dist/fence-feature/actions.d.ts.map +1 -0
  200. package/dist/fence-feature/actions.js +26 -0
  201. package/dist/fence-feature/definition.d.ts +4 -0
  202. package/dist/fence-feature/definition.d.ts.map +1 -0
  203. package/dist/fence-feature/definition.js +112 -0
  204. package/dist/fence-feature/floorplan-affordances.d.ts +3 -0
  205. package/dist/fence-feature/floorplan-affordances.d.ts.map +1 -0
  206. package/dist/fence-feature/floorplan-affordances.js +37 -0
  207. package/dist/fence-feature/floorplan.d.ts +4 -0
  208. package/dist/fence-feature/floorplan.d.ts.map +1 -0
  209. package/dist/fence-feature/floorplan.js +120 -0
  210. package/dist/fence-feature/geometry.d.ts +5 -0
  211. package/dist/fence-feature/geometry.d.ts.map +1 -0
  212. package/dist/fence-feature/geometry.js +43 -0
  213. package/dist/fence-feature/handles.d.ts +5 -0
  214. package/dist/fence-feature/handles.d.ts.map +1 -0
  215. package/dist/fence-feature/handles.js +84 -0
  216. package/dist/fence-feature/inspector.d.ts +6 -0
  217. package/dist/fence-feature/inspector.d.ts.map +1 -0
  218. package/dist/fence-feature/inspector.js +214 -0
  219. package/dist/fence-feature/interaction.d.ts +3 -0
  220. package/dist/fence-feature/interaction.d.ts.map +1 -0
  221. package/dist/fence-feature/interaction.js +41 -0
  222. package/dist/fence-feature/move-session.d.ts +9 -0
  223. package/dist/fence-feature/move-session.d.ts.map +1 -0
  224. package/dist/fence-feature/move-session.js +48 -0
  225. package/dist/fence-feature/move-tool.d.ts +5 -0
  226. package/dist/fence-feature/move-tool.d.ts.map +1 -0
  227. package/dist/fence-feature/move-tool.js +58 -0
  228. package/dist/fence-feature/pick-target.d.ts +7 -0
  229. package/dist/fence-feature/pick-target.d.ts.map +1 -0
  230. package/dist/fence-feature/pick-target.js +52 -0
  231. package/dist/floor-opening/definition.d.ts +3 -0
  232. package/dist/floor-opening/definition.d.ts.map +1 -0
  233. package/dist/floor-opening/definition.js +41 -0
  234. package/dist/floor-opening/floorplan.d.ts +156 -0
  235. package/dist/floor-opening/floorplan.d.ts.map +1 -0
  236. package/dist/floor-opening/floorplan.js +63 -0
  237. package/dist/gutter/definition.d.ts.map +1 -1
  238. package/dist/gutter/definition.js +2 -2
  239. package/dist/imported-mesh/definition.d.ts.map +1 -1
  240. package/dist/imported-mesh/definition.js +2 -0
  241. package/dist/imported-mesh/geometry.d.ts +1 -1
  242. package/dist/imported-mesh/geometry.d.ts.map +1 -1
  243. package/dist/imported-mesh/geometry.js +40 -12
  244. package/dist/index.d.ts +13 -2
  245. package/dist/index.d.ts.map +1 -1
  246. package/dist/index.js +20 -2
  247. package/dist/item/authored-face-host.d.ts +10 -0
  248. package/dist/item/authored-face-host.d.ts.map +1 -0
  249. package/dist/item/authored-face-host.js +87 -0
  250. package/dist/item/authored-params.d.ts +15 -0
  251. package/dist/item/authored-params.d.ts.map +1 -0
  252. package/dist/item/authored-params.js +72 -0
  253. package/dist/item/definition.d.ts +2 -2
  254. package/dist/item/definition.d.ts.map +1 -1
  255. package/dist/item/definition.js +33 -4
  256. package/dist/item/floorplan.d.ts +1 -1
  257. package/dist/item/floorplan.d.ts.map +1 -1
  258. package/dist/item/floorplan.js +35 -5
  259. package/dist/item/index.d.ts +1 -0
  260. package/dist/item/index.d.ts.map +1 -1
  261. package/dist/item/index.js +1 -0
  262. package/dist/item/model-loader.d.ts +2 -0
  263. package/dist/item/model-loader.d.ts.map +1 -1
  264. package/dist/item/model-loader.js +55 -23
  265. package/dist/item/move-tool.js +4 -4
  266. package/dist/item/paint.d.ts.map +1 -1
  267. package/dist/item/paint.js +5 -24
  268. package/dist/item/panel.d.ts +1 -3
  269. package/dist/item/panel.d.ts.map +1 -1
  270. package/dist/item/panel.js +20 -24
  271. package/dist/item/placement-notice.d.ts +14 -0
  272. package/dist/item/placement-notice.d.ts.map +1 -0
  273. package/dist/item/placement-notice.js +38 -0
  274. package/dist/item/plan-symbols.d.ts +67 -0
  275. package/dist/item/plan-symbols.d.ts.map +1 -0
  276. package/dist/item/plan-symbols.js +407 -0
  277. package/dist/item/renderer.d.ts +10 -0
  278. package/dist/item/renderer.d.ts.map +1 -1
  279. package/dist/item/renderer.js +64 -38
  280. package/dist/item/script-param-defaults.d.ts +12 -0
  281. package/dist/item/script-param-defaults.d.ts.map +1 -0
  282. package/dist/item/script-param-defaults.js +34 -0
  283. package/dist/lean-to-extension/definition.d.ts.map +1 -1
  284. package/dist/lean-to-extension/definition.js +1 -2
  285. package/dist/lean-to-extension/geometry.d.ts.map +1 -1
  286. package/dist/lean-to-extension/geometry.js +1 -1
  287. package/dist/lean-to-extension/layout.d.ts.map +1 -1
  288. package/dist/lean-to-extension/layout.js +2 -3
  289. package/dist/lean-to-extension/placement-validation.d.ts.map +1 -1
  290. package/dist/lean-to-extension/placement-validation.js +5 -5
  291. package/dist/lean-to-extension/tool.d.ts.map +1 -1
  292. package/dist/lean-to-extension/tool.js +5 -5
  293. package/dist/lineset/move-tool.d.ts.map +1 -1
  294. package/dist/lineset/move-tool.js +8 -2
  295. package/dist/liquid-line/move-tool.d.ts.map +1 -1
  296. package/dist/liquid-line/move-tool.js +8 -2
  297. package/dist/measurement/definition.js +1 -1
  298. package/dist/pipe-fitting/move-tool.d.ts.map +1 -1
  299. package/dist/pipe-fitting/move-tool.js +8 -2
  300. package/dist/pipe-segment/move-tool.d.ts.map +1 -1
  301. package/dist/pipe-segment/move-tool.js +8 -2
  302. package/dist/procedural-item/animation.d.ts +8 -0
  303. package/dist/procedural-item/animation.d.ts.map +1 -0
  304. package/dist/procedural-item/animation.js +116 -0
  305. package/dist/procedural-item/definition.d.ts.map +1 -1
  306. package/dist/procedural-item/definition.js +74 -8
  307. package/dist/procedural-item/geometry.d.ts +5 -1
  308. package/dist/procedural-item/geometry.d.ts.map +1 -1
  309. package/dist/procedural-item/geometry.js +239 -15
  310. package/dist/procedural-item/renderer.d.ts.map +1 -1
  311. package/dist/procedural-item/renderer.js +272 -23
  312. package/dist/ridge-vent/panel.d.ts.map +1 -1
  313. package/dist/ridge-vent/panel.js +5 -23
  314. package/dist/ridge-vent/renderer.d.ts.map +1 -1
  315. package/dist/ridge-vent/renderer.js +9 -8
  316. package/dist/roof/definition.d.ts.map +1 -1
  317. package/dist/roof/definition.js +4 -1
  318. package/dist/roof/floorplan.d.ts +8 -0
  319. package/dist/roof/floorplan.d.ts.map +1 -1
  320. package/dist/roof/floorplan.js +194 -18
  321. package/dist/roof/panel-model.d.ts.map +1 -1
  322. package/dist/roof/panel-model.js +10 -6
  323. package/dist/roof/panel.d.ts.map +1 -1
  324. package/dist/roof/panel.js +3 -10
  325. package/dist/roof/renderer.d.ts.map +1 -1
  326. package/dist/roof/renderer.js +5 -2
  327. package/dist/roof-segment/panel.d.ts.map +1 -1
  328. package/dist/roof-segment/panel.js +5 -24
  329. package/dist/roof-segment/renderer.d.ts.map +1 -1
  330. package/dist/roof-segment/renderer.js +17 -8
  331. package/dist/separator/definition.d.ts +3 -0
  332. package/dist/separator/definition.d.ts.map +1 -0
  333. package/dist/separator/definition.js +39 -0
  334. package/dist/separator/renderer.d.ts +5 -0
  335. package/dist/separator/renderer.d.ts.map +1 -0
  336. package/dist/separator/renderer.js +36 -0
  337. package/dist/shared/duct-body-paint.d.ts +0 -4
  338. package/dist/shared/duct-body-paint.d.ts.map +1 -1
  339. package/dist/shared/duct-body-paint.js +1 -5
  340. package/dist/shared/item-interaction-actions.d.ts +6 -0
  341. package/dist/shared/item-interaction-actions.d.ts.map +1 -0
  342. package/dist/shared/item-interaction-actions.js +27 -0
  343. package/dist/shared/item-interactions.d.ts +9 -0
  344. package/dist/shared/item-interactions.d.ts.map +1 -0
  345. package/dist/shared/item-interactions.js +74 -0
  346. package/dist/shared/item-light-placement.d.ts +2 -0
  347. package/dist/shared/item-light-placement.d.ts.map +1 -0
  348. package/dist/shared/item-light-placement.js +3 -0
  349. package/dist/shared/move-roof-tool.js +2 -1
  350. package/dist/shared/node-batch/batchable.d.ts +12 -0
  351. package/dist/shared/node-batch/batchable.d.ts.map +1 -0
  352. package/dist/shared/node-batch/batchable.js +41 -0
  353. package/dist/shared/node-batch/candidates.d.ts +7 -5
  354. package/dist/shared/node-batch/candidates.d.ts.map +1 -1
  355. package/dist/shared/node-batch/candidates.js +43 -59
  356. package/dist/shared/node-batch/release.d.ts +8 -0
  357. package/dist/shared/node-batch/release.d.ts.map +1 -0
  358. package/dist/shared/node-batch/release.js +16 -0
  359. package/dist/shared/node-batch/system.d.ts.map +1 -1
  360. package/dist/shared/node-batch/system.js +17 -12
  361. package/dist/shared/node-batch/types.d.ts +4 -1
  362. package/dist/shared/node-batch/types.d.ts.map +1 -1
  363. package/dist/shared/opening-documentation.d.ts +13 -1
  364. package/dist/shared/opening-documentation.d.ts.map +1 -1
  365. package/dist/shared/opening-documentation.js +245 -59
  366. package/dist/shared/opening-guides-runtime.d.ts.map +1 -1
  367. package/dist/shared/opening-guides-runtime.js +17 -14
  368. package/dist/shared/opening-placement-dimensions.d.ts.map +1 -1
  369. package/dist/shared/opening-placement-dimensions.js +3 -3
  370. package/dist/shared/opening-plane-offset.d.ts +23 -0
  371. package/dist/shared/opening-plane-offset.d.ts.map +1 -0
  372. package/dist/shared/opening-plane-offset.js +24 -0
  373. package/dist/shared/polygon-centroid-move.d.ts.map +1 -1
  374. package/dist/shared/polygon-centroid-move.js +4 -1
  375. package/dist/shared/polygon-vertex-affordance.d.ts.map +1 -1
  376. package/dist/shared/polygon-vertex-affordance.js +19 -15
  377. package/dist/shared/run-hangers.d.ts.map +1 -1
  378. package/dist/shared/run-hangers.js +5 -4
  379. package/dist/shared/scripted-opening-handles.d.ts +18 -0
  380. package/dist/shared/scripted-opening-handles.d.ts.map +1 -0
  381. package/dist/shared/scripted-opening-handles.js +53 -0
  382. package/dist/shared/scripted-opening.d.ts +25 -0
  383. package/dist/shared/scripted-opening.d.ts.map +1 -0
  384. package/dist/shared/scripted-opening.js +72 -0
  385. package/dist/shared/slot-paint.d.ts +14 -2
  386. package/dist/shared/slot-paint.d.ts.map +1 -1
  387. package/dist/shared/slot-paint.js +29 -29
  388. package/dist/shared/surface-paint.d.ts.map +1 -1
  389. package/dist/shared/surface-paint.js +2 -5
  390. package/dist/shared/swap-preview-material.d.ts +11 -0
  391. package/dist/shared/swap-preview-material.d.ts.map +1 -0
  392. package/dist/shared/swap-preview-material.js +16 -0
  393. package/dist/shared/system-checks.d.ts.map +1 -1
  394. package/dist/shared/system-checks.js +5 -3
  395. package/dist/shared/wall-attach-target.d.ts +3 -10
  396. package/dist/shared/wall-attach-target.d.ts.map +1 -1
  397. package/dist/shared/wall-attach-target.js +3 -63
  398. package/dist/shared/wall-opening-ceiling.d.ts +5 -15
  399. package/dist/shared/wall-opening-ceiling.d.ts.map +1 -1
  400. package/dist/shared/wall-opening-ceiling.js +10 -18
  401. package/dist/shelf/definition.d.ts.map +1 -1
  402. package/dist/shelf/definition.js +1 -1
  403. package/dist/shelf/geometry.d.ts.map +1 -1
  404. package/dist/shelf/geometry.js +1 -2
  405. package/dist/shelf/paint.d.ts.map +1 -1
  406. package/dist/shelf/paint.js +4 -10
  407. package/dist/site/line-ribbon.d.ts +31 -0
  408. package/dist/site/line-ribbon.d.ts.map +1 -0
  409. package/dist/site/line-ribbon.js +117 -0
  410. package/dist/site/lot-mask.d.ts +18 -0
  411. package/dist/site/lot-mask.d.ts.map +1 -0
  412. package/dist/site/lot-mask.js +35 -0
  413. package/dist/site/panel.d.ts +10 -0
  414. package/dist/site/panel.d.ts.map +1 -0
  415. package/dist/site/panel.js +155 -0
  416. package/dist/site/parametrics.d.ts +7 -0
  417. package/dist/site/parametrics.d.ts.map +1 -1
  418. package/dist/site/parametrics.js +8 -0
  419. package/dist/site/recessed-slab-ground-holes.d.ts.map +1 -1
  420. package/dist/site/recessed-slab-ground-holes.js +5 -2
  421. package/dist/site/renderer.d.ts.map +1 -1
  422. package/dist/site/renderer.js +150 -19
  423. package/dist/site/setbacks.d.ts +33 -0
  424. package/dist/site/setbacks.d.ts.map +1 -0
  425. package/dist/site/setbacks.js +204 -0
  426. package/dist/site/terrain-geometry.d.ts +28 -1
  427. package/dist/site/terrain-geometry.d.ts.map +1 -1
  428. package/dist/site/terrain-geometry.js +78 -4
  429. package/dist/site/terrain-holes.d.ts +15 -0
  430. package/dist/site/terrain-holes.d.ts.map +1 -0
  431. package/dist/site/terrain-holes.js +74 -0
  432. package/dist/site/terrain-mesh.d.ts +9 -2
  433. package/dist/site/terrain-mesh.d.ts.map +1 -1
  434. package/dist/site/terrain-mesh.js +36 -9
  435. package/dist/site/terrain-renderer.d.ts +9 -2
  436. package/dist/site/terrain-renderer.d.ts.map +1 -1
  437. package/dist/site/terrain-renderer.js +14 -4
  438. package/dist/slab/boundary-editor.d.ts +1 -1
  439. package/dist/slab/boundary-editor.d.ts.map +1 -1
  440. package/dist/slab/boundary-editor.js +13 -13
  441. package/dist/slab/definition.d.ts.map +1 -1
  442. package/dist/slab/definition.js +19 -3
  443. package/dist/slab/dependency-tracker.d.ts.map +1 -1
  444. package/dist/slab/dependency-tracker.js +67 -7
  445. package/dist/slab/elevation-limit.d.ts.map +1 -1
  446. package/dist/slab/elevation-limit.js +2 -2
  447. package/dist/slab/floorplan-affordances.d.ts +176 -4
  448. package/dist/slab/floorplan-affordances.d.ts.map +1 -1
  449. package/dist/slab/floorplan-affordances.js +0 -1
  450. package/dist/slab/floorplan-move.d.ts.map +1 -1
  451. package/dist/slab/floorplan-move.js +3 -4
  452. package/dist/slab/floorplan.d.ts +7 -0
  453. package/dist/slab/floorplan.d.ts.map +1 -1
  454. package/dist/slab/floorplan.js +22 -5
  455. package/dist/slab/geometry.d.ts.map +1 -1
  456. package/dist/slab/geometry.js +186 -76
  457. package/dist/slab/move-tool.js +7 -6
  458. package/dist/slab/paint.d.ts +18 -5
  459. package/dist/slab/paint.d.ts.map +1 -1
  460. package/dist/slab/paint.js +458 -9
  461. package/dist/slab/panel.d.ts.map +1 -1
  462. package/dist/slab/panel.js +28 -9
  463. package/dist/slab/placement-ownership.d.ts +2 -1
  464. package/dist/slab/placement-ownership.d.ts.map +1 -1
  465. package/dist/slab/placement-ownership.js +2 -2
  466. package/dist/slab/surface-split.d.ts +24 -0
  467. package/dist/slab/surface-split.d.ts.map +1 -0
  468. package/dist/slab/surface-split.js +389 -0
  469. package/dist/slab/tool.d.ts.map +1 -1
  470. package/dist/slab/tool.js +3 -3
  471. package/dist/stair/baluster-geometry.d.ts +21 -0
  472. package/dist/stair/baluster-geometry.d.ts.map +1 -0
  473. package/dist/stair/baluster-geometry.js +74 -0
  474. package/dist/stair/baluster-guard.d.ts +50 -0
  475. package/dist/stair/baluster-guard.d.ts.map +1 -0
  476. package/dist/stair/baluster-guard.js +71 -0
  477. package/dist/stair/boards-guard.d.ts +37 -0
  478. package/dist/stair/boards-guard.d.ts.map +1 -0
  479. package/dist/stair/boards-guard.js +61 -0
  480. package/dist/stair/cable-guard.d.ts +39 -0
  481. package/dist/stair/cable-guard.d.ts.map +1 -0
  482. package/dist/stair/cable-guard.js +105 -0
  483. package/dist/stair/construction-controls.d.ts +15 -0
  484. package/dist/stair/construction-controls.d.ts.map +1 -0
  485. package/dist/stair/construction-controls.js +29 -0
  486. package/dist/stair/continuous-railings.d.ts +10 -0
  487. package/dist/stair/continuous-railings.d.ts.map +1 -0
  488. package/dist/stair/continuous-railings.js +159 -0
  489. package/dist/stair/definition.d.ts.map +1 -1
  490. package/dist/stair/definition.js +16 -37
  491. package/dist/stair/documentation.d.ts +1 -1
  492. package/dist/stair/documentation.d.ts.map +1 -1
  493. package/dist/stair/documentation.js +10 -17
  494. package/dist/stair/floorplan-affordances.d.ts.map +1 -1
  495. package/dist/stair/floorplan-affordances.js +9 -25
  496. package/dist/stair/floorplan.d.ts +1 -23
  497. package/dist/stair/floorplan.d.ts.map +1 -1
  498. package/dist/stair/floorplan.js +102 -86
  499. package/dist/stair/glass-guard.d.ts +72 -0
  500. package/dist/stair/glass-guard.d.ts.map +1 -0
  501. package/dist/stair/glass-guard.js +167 -0
  502. package/dist/stair/guard-path.d.ts +119 -0
  503. package/dist/stair/guard-path.d.ts.map +1 -0
  504. package/dist/stair/guard-path.js +208 -0
  505. package/dist/stair/materials.d.ts +11 -0
  506. package/dist/stair/materials.d.ts.map +1 -0
  507. package/dist/stair/materials.js +51 -0
  508. package/dist/stair/metal-guard.d.ts +38 -0
  509. package/dist/stair/metal-guard.d.ts.map +1 -0
  510. package/dist/stair/metal-guard.js +79 -0
  511. package/dist/stair/paint.d.ts +32 -0
  512. package/dist/stair/paint.d.ts.map +1 -1
  513. package/dist/stair/paint.js +75 -36
  514. package/dist/stair/panel.d.ts.map +1 -1
  515. package/dist/stair/panel.js +154 -17
  516. package/dist/stair/parametrics.d.ts +1 -1
  517. package/dist/stair/parametrics.d.ts.map +1 -1
  518. package/dist/stair/parametrics.js +32 -15
  519. package/dist/stair/plan-entry.d.ts +31 -0
  520. package/dist/stair/plan-entry.d.ts.map +1 -0
  521. package/dist/stair/plan-entry.js +325 -0
  522. package/dist/stair/post-and-rail-guard.d.ts +31 -0
  523. package/dist/stair/post-and-rail-guard.d.ts.map +1 -0
  524. package/dist/stair/post-and-rail-guard.js +63 -0
  525. package/dist/stair/railing-controls.d.ts +9 -0
  526. package/dist/stair/railing-controls.d.ts.map +1 -0
  527. package/dist/stair/railing-controls.js +49 -0
  528. package/dist/stair/renderer.d.ts.map +1 -1
  529. package/dist/stair/renderer.js +259 -259
  530. package/dist/stair/use-stair-render-data.d.ts +317 -0
  531. package/dist/stair/use-stair-render-data.d.ts.map +1 -0
  532. package/dist/stair/use-stair-render-data.js +73 -0
  533. package/dist/stair-segment/definition.d.ts.map +1 -1
  534. package/dist/stair-segment/definition.js +51 -10
  535. package/dist/stair-segment/panel.d.ts.map +1 -1
  536. package/dist/stair-segment/panel.js +36 -42
  537. package/dist/stair-segment/parametrics.d.ts +1 -1
  538. package/dist/stair-segment/parametrics.d.ts.map +1 -1
  539. package/dist/stair-segment/parametrics.js +21 -8
  540. package/dist/stair-segment/renderer.d.ts.map +1 -1
  541. package/dist/stair-segment/renderer.js +16 -28
  542. package/dist/turbine-vent/definition.d.ts.map +1 -1
  543. package/dist/turbine-vent/definition.js +2 -5
  544. package/dist/turbine-vent/paint.d.ts.map +1 -1
  545. package/dist/turbine-vent/paint.js +2 -5
  546. package/dist/turbine-vent/panel.d.ts.map +1 -1
  547. package/dist/turbine-vent/panel.js +5 -23
  548. package/dist/unit/unit-panel.d.ts.map +1 -1
  549. package/dist/unit/unit-panel.js +6 -1
  550. package/dist/wall/actions.d.ts.map +1 -1
  551. package/dist/wall/actions.js +7 -2
  552. package/dist/wall/construction-dimensions.js +8 -5
  553. package/dist/wall/contextual-dimensions.js +4 -4
  554. package/dist/wall/curtain-wall-materials.d.ts +1 -1
  555. package/dist/wall/curtain-wall-materials.d.ts.map +1 -1
  556. package/dist/wall/curtain-wall-materials.js +2 -2
  557. package/dist/wall/curve-tool.d.ts.map +1 -1
  558. package/dist/wall/curve-tool.js +4 -0
  559. package/dist/wall/definition.d.ts.map +1 -1
  560. package/dist/wall/definition.js +41 -17
  561. package/dist/wall/floorplan-move.d.ts +1 -1
  562. package/dist/wall/floorplan-move.d.ts.map +1 -1
  563. package/dist/wall/floorplan-move.js +20 -83
  564. package/dist/wall/floorplan-tool.d.ts.map +1 -1
  565. package/dist/wall/floorplan-tool.js +10 -11
  566. package/dist/wall/floorplan.d.ts +3 -1
  567. package/dist/wall/floorplan.d.ts.map +1 -1
  568. package/dist/wall/floorplan.js +184 -21
  569. package/dist/wall/measurement.d.ts.map +1 -1
  570. package/dist/wall/measurement.js +5 -5
  571. package/dist/wall/move-endpoint-tool.d.ts.map +1 -1
  572. package/dist/wall/move-endpoint-tool.js +20 -7
  573. package/dist/wall/move-shared.d.ts.map +1 -1
  574. package/dist/wall/move-shared.js +11 -7
  575. package/dist/wall/move-tool.d.ts.map +1 -1
  576. package/dist/wall/move-tool.js +118 -148
  577. package/dist/wall/paint.d.ts +26 -15
  578. package/dist/wall/paint.d.ts.map +1 -1
  579. package/dist/wall/paint.js +306 -117
  580. package/dist/wall/panel-model.d.ts +18 -0
  581. package/dist/wall/panel-model.d.ts.map +1 -1
  582. package/dist/wall/panel-model.js +77 -19
  583. package/dist/wall/panel.d.ts.map +1 -1
  584. package/dist/wall/panel.js +217 -41
  585. package/dist/wall/parametrics.d.ts.map +1 -1
  586. package/dist/wall/parametrics.js +3 -0
  587. package/dist/wall/rectangle-command.d.ts +111 -12
  588. package/dist/wall/rectangle-command.d.ts.map +1 -1
  589. package/dist/wall/rectangle-tool.d.ts.map +1 -1
  590. package/dist/wall/rectangle-tool.js +26 -8
  591. package/dist/wall/renderer.d.ts.map +1 -1
  592. package/dist/wall/renderer.js +4 -2
  593. package/dist/wall/split-floorplan-layer.d.ts.map +1 -1
  594. package/dist/wall/split-floorplan-layer.js +7 -7
  595. package/dist/wall/split-session.d.ts.map +1 -1
  596. package/dist/wall/split-session.js +7 -1
  597. package/dist/wall/system.d.ts.map +1 -1
  598. package/dist/wall/system.js +36 -4
  599. package/dist/wall/tool.d.ts.map +1 -1
  600. package/dist/wall/tool.js +105 -49
  601. package/dist/wall/treatment-level-data.d.ts +3 -2
  602. package/dist/wall/treatment-level-data.d.ts.map +1 -1
  603. package/dist/wall/treatment-level-data.js +17 -13
  604. package/dist/wall/treatments.d.ts +10 -10
  605. package/dist/wall/treatments.d.ts.map +1 -1
  606. package/dist/wall/treatments.js +67 -54
  607. package/dist/wall/wall-batch-system.d.ts +7 -0
  608. package/dist/wall/wall-batch-system.d.ts.map +1 -1
  609. package/dist/wall/wall-batch-system.js +35 -3
  610. package/dist/wall/wall-batch.d.ts +6 -0
  611. package/dist/wall/wall-batch.d.ts.map +1 -1
  612. package/dist/wall/wall-batch.js +7 -1
  613. package/dist/window/definition.d.ts.map +1 -1
  614. package/dist/window/definition.js +12 -4
  615. package/dist/window/floorplan-move.d.ts.map +1 -1
  616. package/dist/window/floorplan-move.js +3 -1
  617. package/dist/window/floorplan.d.ts.map +1 -1
  618. package/dist/window/floorplan.js +145 -60
  619. package/dist/window/mechanism.d.ts +4 -0
  620. package/dist/window/mechanism.d.ts.map +1 -0
  621. package/dist/window/mechanism.js +20 -0
  622. package/dist/window/move-tool.d.ts.map +1 -1
  623. package/dist/window/move-tool.js +79 -48
  624. package/dist/window/paint.d.ts.map +1 -1
  625. package/dist/window/paint.js +3 -0
  626. package/dist/window/panel.d.ts.map +1 -1
  627. package/dist/window/panel.js +32 -88
  628. package/dist/window/placement.d.ts +23 -0
  629. package/dist/window/placement.d.ts.map +1 -0
  630. package/dist/window/placement.js +66 -0
  631. package/dist/window/preview.d.ts.map +1 -1
  632. package/dist/window/preview.js +2 -0
  633. package/dist/window/renderer.d.ts.map +1 -1
  634. package/dist/window/renderer.js +3 -2
  635. package/dist/window/tool.d.ts.map +1 -1
  636. package/dist/window/tool.js +96 -24
  637. package/dist/window/window-math.d.ts +6 -14
  638. package/dist/window/window-math.d.ts.map +1 -1
  639. package/dist/window/window-math.js +14 -20
  640. package/dist/zone/contextual-dimensions.d.ts.map +1 -1
  641. package/dist/zone/contextual-dimensions.js +6 -28
  642. package/dist/zone/definition.d.ts.map +1 -1
  643. package/dist/zone/definition.js +3 -3
  644. package/dist/zone/floorplan-affordances.d.ts +200 -0
  645. package/dist/zone/floorplan-affordances.d.ts.map +1 -1
  646. package/dist/zone/floorplan.d.ts +1 -1
  647. package/dist/zone/floorplan.d.ts.map +1 -1
  648. package/dist/zone/floorplan.js +93 -53
  649. package/dist/zone/quantities-panel.d.ts.map +1 -1
  650. package/dist/zone/quantities-panel.js +3 -14
  651. package/dist/zone/quick-measurement.d.ts +2 -2
  652. package/dist/zone/quick-measurement.d.ts.map +1 -1
  653. package/dist/zone/quick-measurement.js +6 -5
  654. package/dist/zone/renderer.d.ts +1 -1
  655. package/dist/zone/renderer.d.ts.map +1 -1
  656. package/dist/zone/renderer.js +58 -146
  657. package/dist/zone/room-clear-dimensions.js +3 -3
  658. package/dist/zone/room-documentation.d.ts.map +1 -1
  659. package/dist/zone/room-documentation.js +2 -6
  660. package/package.json +11 -11
  661. package/dist/block/slots.d.ts +0 -4
  662. package/dist/block/slots.d.ts.map +0 -1
  663. package/dist/block/slots.js +0 -17
  664. package/dist/cabinet/slots.d.ts +0 -4
  665. package/dist/cabinet/slots.d.ts.map +0 -1
  666. package/dist/cabinet/slots.js +0 -24
  667. package/dist/ceiling/slots.d.ts +0 -6
  668. package/dist/ceiling/slots.d.ts.map +0 -1
  669. package/dist/ceiling/slots.js +0 -7
  670. package/dist/column/slots.d.ts +0 -9
  671. package/dist/column/slots.d.ts.map +0 -1
  672. package/dist/column/slots.js +0 -19
  673. package/dist/door/slots.d.ts +0 -9
  674. package/dist/door/slots.d.ts.map +0 -1
  675. package/dist/door/slots.js +0 -20
  676. package/dist/elevator/slots.d.ts +0 -8
  677. package/dist/elevator/slots.d.ts.map +0 -1
  678. package/dist/elevator/slots.js +0 -17
  679. package/dist/fence/slots.d.ts +0 -10
  680. package/dist/fence/slots.d.ts.map +0 -1
  681. package/dist/fence/slots.js +0 -23
  682. package/dist/item/__fixtures__/main-floorplan.d.ts +0 -26
  683. package/dist/item/__fixtures__/main-floorplan.d.ts.map +0 -1
  684. package/dist/item/__fixtures__/main-floorplan.js +0 -297
  685. package/dist/lean-to-extension/slots.d.ts +0 -5
  686. package/dist/lean-to-extension/slots.d.ts.map +0 -1
  687. package/dist/lean-to-extension/slots.js +0 -15
  688. package/dist/shelf/slots.d.ts +0 -9
  689. package/dist/shelf/slots.d.ts.map +0 -1
  690. package/dist/shelf/slots.js +0 -30
  691. package/dist/slab/slots.d.ts +0 -10
  692. package/dist/slab/slots.d.ts.map +0 -1
  693. package/dist/slab/slots.js +0 -20
  694. package/dist/stair/floor-stack.d.ts +0 -10
  695. package/dist/stair/floor-stack.d.ts.map +0 -1
  696. package/dist/stair/floor-stack.js +0 -115
  697. package/dist/stair/slots.d.ts +0 -7
  698. package/dist/stair/slots.d.ts.map +0 -1
  699. package/dist/stair/slots.js +0 -13
  700. package/dist/wall/drawing-mode.d.ts +0 -12
  701. package/dist/wall/drawing-mode.d.ts.map +0 -1
  702. package/dist/wall/drawing-mode.js +0 -38
  703. package/dist/wall/slots.d.ts +0 -10
  704. package/dist/wall/slots.d.ts.map +0 -1
  705. package/dist/wall/slots.js +0 -92
  706. package/dist/window/slots.d.ts +0 -5
  707. package/dist/window/slots.d.ts.map +0 -1
  708. package/dist/window/slots.js +0 -11
@@ -1,12 +1,11 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { getElevatorCabDepth, getElevatorCabWidth, getElevatorDoorLeafSides, getElevatorDoorLeafWidth, getElevatorDoorLeafX, getElevatorShaftDepth, getElevatorShaftWallThickness, getElevatorShaftWidth, getResolvedElevatorDoorPanelStyle as getResolvedDoorPanelStyle, getResolvedElevatorDoorStyle as getResolvedDoorStyle, getResolvedElevatorShaftStyle as getResolvedShaftStyle, resolveElevatorLevels, useInteractive, useLiveNodeOverrides, useLiveTransforms, useRegistry, useScene, } from '@pascal-app/core';
4
- import { createDefaultMaterial, createSurfaceRoleMaterial, resolveMaterialRef, resolveSlotDefaultMaterial, useNodeEvents, useViewer, } from '@pascal-app/viewer';
3
+ import { ELEVATOR_CAB_SLOT_DEFAULT, ELEVATOR_DOORS_SLOT_DEFAULT, ELEVATOR_GLASS_SLOT_DEFAULT, ELEVATOR_SHAFT_SLOT_DEFAULT, getElevatorCabDepth, getElevatorCabWidth, getElevatorDoorLeafSides, getElevatorDoorLeafWidth, getElevatorDoorLeafX, getElevatorShaftDepth, getElevatorShaftWallThickness, getElevatorShaftWidth, getResolvedElevatorDoorPanelStyle as getResolvedDoorPanelStyle, getResolvedElevatorDoorStyle as getResolvedDoorStyle, getResolvedElevatorShaftStyle as getResolvedShaftStyle, resolveElevatorLevels, useInteractive, useLiveNodeOverrides, useLiveTransforms, useRegistry, useScene, } from '@pascal-app/core';
4
+ import { createDefaultMaterial, createSurfaceRoleMaterial, materialCastsShadow, resolveMaterialRef, resolveSlotDefaultMaterial, useNodeEvents, useViewer, } from '@pascal-app/viewer';
5
5
  import { useFrame } from '@react-three/fiber';
6
6
  import { createContext, useCallback, useContext, useLayoutEffect, useMemo, useRef } from 'react';
7
7
  import { BoxGeometry, CylinderGeometry, Object3D, TorusGeometry, } from 'three';
8
8
  import { useShallow } from 'zustand/react/shallow';
9
- import { ELEVATOR_CAB_SLOT_DEFAULT, ELEVATOR_DOORS_SLOT_DEFAULT, ELEVATOR_GLASS_SLOT_DEFAULT, ELEVATOR_SHAFT_SLOT_DEFAULT, } from './slots';
10
9
  const DEFAULT_STRUCTURE_WHITE = '#f2f0ed';
11
10
  const SHAFT_WALL_COLOR = DEFAULT_STRUCTURE_WHITE;
12
11
  const SHAFT_SIDE_COLOR = DEFAULT_STRUCTURE_WHITE;
@@ -284,7 +283,7 @@ const SEGMENT_PROPS = {
284
283
  upperRight: { position: [0.32, 0.22, 0], size: [0.11, 0.42, 0.018] },
285
284
  };
286
285
  function BoxPrimitive({ castShadow = false, material, position, receiveShadow = false, rotation, scale, slotId, }) {
287
- return (_jsx("mesh", { castShadow: castShadow, dispose: null, geometry: UNIT_BOX_GEOMETRY, material: material, position: position, receiveShadow: receiveShadow, rotation: rotation, scale: scale, userData: slotId ? ELEVATOR_SLOT_USER_DATA[slotId] : undefined }));
286
+ return (_jsx("mesh", { castShadow: castShadow && materialCastsShadow(material), dispose: null, geometry: UNIT_BOX_GEOMETRY, material: material, position: position, receiveShadow: receiveShadow, rotation: rotation, scale: scale, userData: slotId ? ELEVATOR_SLOT_USER_DATA[slotId] : undefined }));
288
287
  }
289
288
  function MeshButtonLabel({ faceSign = 1, label, material, position, scale, }) {
290
289
  const ref = useRef(null);
@@ -1 +1 @@
1
- {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/eyebrow-vent/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAA;AAIzB,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AA+F1C;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,EAAE,cAAc,CAAC,OAAO,eAAe,CA+DxE,CAAA"}
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/eyebrow-vent/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAA;AAIzB,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AA+F1C;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,EAAE,cAAc,CAAC,OAAO,eAAe,CA4DxE,CAAA"}
@@ -1,4 +1,4 @@
1
- import { EyebrowVentNode as EyebrowVentNodeSchema, } from '@pascal-app/core';
1
+ import { EyebrowVentNode as EyebrowVentNodeSchema, eyebrowVentSlots, } from '@pascal-app/core';
2
2
  import { buildEyebrowVentFloorplan } from './floorplan';
3
3
  import { eyebrowVentPaint } from './paint';
4
4
  import { eyebrowVentParametrics } from './parametrics';
@@ -111,10 +111,7 @@ export const eyebrowVentDefinition = {
111
111
  return rest;
112
112
  },
113
113
  capabilities: {
114
- slots: () => [
115
- { slotId: 'hood', label: 'Hood', default: 'library:preset-softwhite' },
116
- { slotId: 'front', label: 'Louvers', default: 'library:preset-softwhite' },
117
- ],
114
+ slots: eyebrowVentSlots,
118
115
  selectable: { hitVolume: 'bbox' },
119
116
  duplicable: true,
120
117
  deletable: true,
@@ -1 +1 @@
1
- {"version":3,"file":"paint.d.ts","sourceRoot":"","sources":["../../src/eyebrow-vent/paint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,uBAAuB,EAAkB,MAAM,kBAAkB,CAAA;AAOxF,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,MAAM,GAAG,IAAI,GAC3B,uBAAuB,CAEzB;AAED,eAAO,MAAM,gBAAgB,4CA0B3B,CAAA"}
1
+ {"version":3,"file":"paint.d.ts","sourceRoot":"","sources":["../../src/eyebrow-vent/paint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,uBAAuB,EAAkB,MAAM,kBAAkB,CAAA;AAQxF,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,MAAM,GAAG,IAAI,GAC3B,uBAAuB,CAEzB;AAED,eAAO,MAAM,gBAAgB,4CAsB3B,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { buildSlotPreviewMaterial, createSlotPaintCapability } from '../shared/slot-paint';
2
+ import { swapPreviewMaterial } from '../shared/swap-preview-material';
2
3
  import { EYEBROW_VENT_MATERIAL_INDEX } from './geometry';
3
4
  export function resolveEyebrowVentMaterialRole(materialIndex) {
4
5
  return materialIndex === EYEBROW_VENT_MATERIAL_INDEX.front ? 'front' : 'hood';
@@ -16,13 +17,9 @@ export const eyebrowVentPaint = createSlotPaintCapability({
16
17
  const mesh = object;
17
18
  if (!mesh.isMesh || mesh.name !== 'eyebrow-vent-surface' || !Array.isArray(mesh.material))
18
19
  return;
19
- const previous = [...mesh.material];
20
- const next = [...previous];
20
+ const next = [...mesh.material];
21
21
  next[materialIndex] = preview;
22
- mesh.material = next;
23
- restore = () => {
24
- mesh.material = previous;
25
- };
22
+ restore = swapPreviewMaterial(mesh, next);
26
23
  });
27
24
  return restore;
28
25
  },
@@ -1 +1 @@
1
- {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/eyebrow-vent/panel.tsx"],"names":[],"mappings":"AA0BA;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,uCAmRvC"}
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/eyebrow-vent/panel.tsx"],"names":[],"mappings":"AA0BA;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,uCA+PvC"}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { EyebrowVentNode as EyebrowVentSchema, getActiveRoofHeight, useLiveNodeOverrides, useScene, } from '@pascal-app/core';
4
- import { ActionButton, ActionGroup, PanelSection, PanelWrapper, SegmentedControl, SliderControl, triggerSFX, useEditor, } from '@pascal-app/editor';
3
+ import { getActiveRoofHeight, useLiveNodeOverrides, useScene, } from '@pascal-app/core';
4
+ import { ActionButton, ActionGroup, duplicateNodeAndPickUp, PanelSection, PanelWrapper, SegmentedControl, SliderControl, triggerSFX, useEditor, } from '@pascal-app/editor';
5
5
  import { useViewer } from '@pascal-app/viewer';
6
6
  import { Copy, Move, Trash2 } from 'lucide-react';
7
7
  import { useCallback } from 'react';
@@ -52,27 +52,9 @@ export default function EyebrowVentPanel() {
52
52
  setSelection({ selectedIds: [] });
53
53
  }, [node, setMovingNode, setSelection]);
54
54
  const handleDuplicate = useCallback(() => {
55
- if (!node)
56
- return;
57
- triggerSFX('sfx:item-pick');
58
- const parentId = node.roofSegmentId;
59
- if (!parentId)
60
- return;
61
- const state = useScene.getState();
62
- const meta = typeof node.metadata === 'object' && node.metadata !== null
63
- ? node.metadata
64
- : {};
65
- const cloneInput = {
66
- ...node,
67
- id: undefined,
68
- metadata: { ...meta, isNew: true },
69
- };
70
- const cloned = EyebrowVentSchema.parse(cloneInput);
71
- state.createNode(cloned, parentId);
72
- state.dirtyNodes.add(parentId);
73
- setMovingNode(cloned);
74
- setSelection({ selectedIds: [] });
75
- }, [node, setMovingNode, setSelection]);
55
+ if (node)
56
+ duplicateNodeAndPickUp(node);
57
+ }, [node]);
76
58
  const handleDelete = useCallback(() => {
77
59
  if (!(selectedId && node))
78
60
  return;
@@ -1,5 +1,5 @@
1
1
  import { type AlignmentAnchor, type AnyNodeId, type DragAction, type FenceNode, type WallNode } from '@pascal-app/core';
2
- import { type FencePlanPoint } from '@pascal-app/editor';
2
+ import { type FencePlanPoint } from '../drafting';
3
3
  type LinkedFenceSnapshot = {
4
4
  id: FenceNode['id'];
5
5
  start: FencePlanPoint;
@@ -1 +1 @@
1
- {"version":3,"file":"move-endpoint.d.ts","sourceRoot":"","sources":["../../../src/fence/actions/move-endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,SAAS,EAEd,KAAK,UAAU,EACf,KAAK,SAAS,EAId,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,KAAK,cAAc,EAOpB,MAAM,oBAAoB,CAAA;AA2C3B,KAAK,mBAAmB,GAAG;IACzB,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;IACnB,KAAK,EAAE,cAAc,CAAA;IACrB,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,SAAS,CAAA;IAClB,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAA;IACzB,aAAa,EAAE,cAAc,CAAA;IAC7B,WAAW,EAAE,cAAc,CAAA;IAC3B,mBAAmB,EAAE,cAAc,CAAA;IACnC,UAAU,EAAE,cAAc,CAAA;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,eAAe,EAAE,mBAAmB,EAAE,CAAA;IACtC,UAAU,EAAE,QAAQ,EAAE,CAAA;IACtB,WAAW,EAAE,SAAS,EAAE,CAAA;IACxB;4DACwD;IACxD,eAAe,EAAE,eAAe,EAAE,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,WAAW,EAAE,cAAc,CAAA;IAC3B,KAAK,EAAE,cAAc,CAAA;IACrB,GAAG,EAAE,cAAc,CAAA;IACnB,aAAa,EAAE,mBAAmB,EAAE,CAAA;IACpC,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAuDD,eAAO,MAAM,2BAA2B,EAAE,UAAU,CAAC,oBAAoB,EAAE,sBAAsB,CA6J9F,CAAA"}
1
+ {"version":3,"file":"move-endpoint.d.ts","sourceRoot":"","sources":["../../../src/fence/actions/move-endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,SAAS,EAEd,KAAK,UAAU,EACf,KAAK,SAAS,EAId,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AAQzB,OAAO,EAAE,KAAK,cAAc,EAAuB,MAAM,aAAa,CAAA;AA2CtE,KAAK,mBAAmB,GAAG;IACzB,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;IACnB,KAAK,EAAE,cAAc,CAAA;IACrB,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,SAAS,CAAA;IAClB,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAA;IACzB,aAAa,EAAE,cAAc,CAAA;IAC7B,WAAW,EAAE,cAAc,CAAA;IAC3B,mBAAmB,EAAE,cAAc,CAAA;IACnC,UAAU,EAAE,cAAc,CAAA;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,eAAe,EAAE,mBAAmB,EAAE,CAAA;IACtC,UAAU,EAAE,QAAQ,EAAE,CAAA;IACtB,WAAW,EAAE,SAAS,EAAE,CAAA;IACxB;4DACwD;IACxD,eAAe,EAAE,eAAe,EAAE,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,WAAW,EAAE,cAAc,CAAA;IAC3B,KAAK,EAAE,cAAc,CAAA;IACrB,GAAG,EAAE,cAAc,CAAA;IACnB,aAAa,EAAE,mBAAmB,EAAE,CAAA;IACpC,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAuDD,eAAO,MAAM,2BAA2B,EAAE,UAAU,CAAC,oBAAoB,EAAE,sBAAsB,CA6J9F,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { collectAlignmentAnchors, resolveAlignment, resolveFenceSupportSlabPatch, useScene, } from '@pascal-app/core';
2
- import { isAlignmentGuideActive, isAngleSnapActive, isMagneticSnapActive, isSegmentLongEnough, snapFenceDraftPoint, useAlignmentGuides, } from '@pascal-app/editor';
2
+ import { isAlignmentGuideActive, isAngleSnapActive, isMagneticSnapActive, isSegmentLongEnough, useAlignmentGuides, } from '@pascal-app/editor';
3
+ import { snapFenceDraftPoint } from '../drafting';
3
4
  /**
4
5
  * Phase 5 Stage D — move-fence-endpoint drag affordance.
5
6
  *
@@ -1,5 +1,6 @@
1
- import { type NodeDefinition } from '@pascal-app/core';
1
+ import { type FenceNode as FenceNodeType, type NodeDefinition, type SceneApi } from '@pascal-app/core';
2
2
  import { FenceNode } from './schema';
3
+ export declare function fenceBaseElevation(n: FenceNodeType, sceneApi?: SceneApi, point?: readonly [number, number]): number;
3
4
  /**
4
5
  * Fence — Phase 5 batch kind. Stage B complete: `def.geometry` drives
5
6
  * the rebuild via the generic `<GeometrySystem>`; `<ParametricNodeRenderer>`
@@ -1 +1 @@
1
- {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/fence/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,cAAc,EAEpB,MAAM,kBAAkB,CAAA;AAmBzB,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAgPpC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,OAAO,SAAS,CA2H5D,CAAA"}
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/fence/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,IAAI,aAAa,EAS/B,KAAK,cAAc,EACnB,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AA2BzB,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AASpC,wBAAgB,kBAAkB,CAChC,CAAC,EAAE,aAAa,EAChB,QAAQ,CAAC,EAAE,QAAQ,EACnB,KAAK,GAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAW,GACzC,MAAM,CA+BR;AA4OD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,OAAO,SAAS,CAkJ5D,CAAA"}
@@ -1,25 +1,43 @@
1
- import { getFenceControlHandle, isSplineFence, } from '@pascal-app/core';
2
- import { clearStructuralElevationGuide, publishStructuralElevationGuide, resolveStructuralElevationSnap, } from '@pascal-app/editor';
1
+ import { fenceSlots, findLevelAncestorId, floorConstructionLift, getFenceControlHandle, getFenceSpanMode, isSplineFence, levelBaseElevationAt, } from '@pascal-app/core';
2
+ import { clearStructuralElevationGuide, PANEL_MODEL_EXTENSION, publishStructuralElevationGuide, REGISTERED_DRAFT_SNAP_EXTENSION, resolveStructuralElevationSnap, } from '@pascal-app/editor';
3
+ import { createNodeTopSurfaceHeightSampler, createSceneSupportHeightSampler, } from '@pascal-app/viewer';
4
+ import { snapFenceDraftPoint } from './drafting';
3
5
  import { buildFenceFloorplan } from './floorplan';
4
6
  import { fenceControlPointAffordance, fenceCurveAffordance, fenceMoveEndpointAffordance, fenceTangentAffordance, fenceThicknessAffordance, } from './floorplan-affordances';
5
7
  import { fenceFloorplanMoveTarget } from './floorplan-move';
6
8
  import { buildFenceGeometry } from './geometry';
7
9
  import { resolveFenceLiftElevation, resolveFenceLiftElevationForNodes } from './lift';
8
10
  import { fencePaint } from './paint';
11
+ import { fencePanelModel } from './panel-model';
9
12
  import { fenceParametrics } from './parametrics';
10
13
  import { FenceNode } from './schema';
11
- import { fenceSlots } from './slots';
12
14
  const SIDE_HANDLE_OFFSET = 0.27;
13
15
  const SIDE_HANDLE_MIN_OFFSET = 0.33;
14
16
  const SIDE_HANDLE_TOP_INSET = 0.08;
15
17
  const SIDE_HANDLE_MIN_HEIGHT = 0.4;
16
18
  const HEIGHT_HANDLE_OFFSET = 0.45;
17
19
  const MIN_FENCE_HEIGHT = 0.3;
18
- function fenceBaseElevation(n, sceneApi) {
20
+ export function fenceBaseElevation(n, sceneApi, point = n.start) {
19
21
  const nodes = sceneApi?.nodes();
20
- return nodes
21
- ? resolveFenceLiftElevationForNodes(n, nodes)
22
- : resolveFenceLiftElevation(n, () => undefined);
22
+ if (!nodes)
23
+ return resolveFenceLiftElevation(n, () => undefined);
24
+ if (n.supportSlabId)
25
+ return resolveFenceLiftElevationForNodes(n, nodes);
26
+ const levelId = findLevelAncestorId(n.id, nodes);
27
+ if (levelId && ((n.path?.length ?? 0) >= 2 || Math.abs(n.curveOffset ?? 0) > 1e-4)) {
28
+ const selectedHost = n.surfaceMode === 'selected'
29
+ ? (n.supportSurfaceNodeId ?? n.supportSlabId)
30
+ : undefined;
31
+ const samplePoint = n.surfaceMode === 'level' ? n.start : point;
32
+ return (Math.max(createSceneSupportHeightSampler(nodes, levelId, selectedHost)(samplePoint[0], samplePoint[1]), levelBaseElevationAt(nodes, levelId, samplePoint[0], samplePoint[1]) +
33
+ floorConstructionLift(nodes, n)) + (n.supportOffset ?? 0));
34
+ }
35
+ if (n.supportSurfaceNodeId && levelId) {
36
+ const height = createNodeTopSurfaceHeightSampler(n.supportSurfaceNodeId, levelId)?.(point[0], point[1]);
37
+ if (height !== null && height !== undefined)
38
+ return height + (n.supportOffset ?? 0);
39
+ }
40
+ return resolveFenceLiftElevationForNodes(n, nodes);
23
41
  }
24
42
  function fenceMidpointFrame(n) {
25
43
  const dx = n.end[0] - n.start[0];
@@ -54,7 +72,7 @@ function fenceSideMoveHandle(side) {
54
72
  const { midX, midZ, normalX, normalZ } = fenceMidpointFrame(n);
55
73
  const offset = Math.max((n.thickness ?? 0.1) / 2 + SIDE_HANDLE_OFFSET, SIDE_HANDLE_MIN_OFFSET);
56
74
  const h = n.height ?? 1.8;
57
- const handleY = fenceBaseElevation(n, sceneApi) +
75
+ const handleY = fenceBaseElevation(n, sceneApi, [midX, midZ]) +
58
76
  Math.max(h - SIDE_HANDLE_TOP_INSET, SIDE_HANDLE_MIN_HEIGHT);
59
77
  return [midX + sign * normalX * offset, handleY, midZ + sign * normalZ * offset];
60
78
  },
@@ -90,7 +108,7 @@ function fenceHeightHandle() {
90
108
  const { midX, midZ } = fenceMidpointFrame(n);
91
109
  return [
92
110
  midX,
93
- fenceBaseElevation(n, sceneApi) + (n.height ?? 1.8) + HEIGHT_HANDLE_OFFSET,
111
+ fenceBaseElevation(n, sceneApi, [midX, midZ]) + (n.height ?? 1.8) + HEIGHT_HANDLE_OFFSET,
94
112
  midZ,
95
113
  ];
96
114
  },
@@ -117,7 +135,11 @@ function fenceElevationHandle(currentBase) {
117
135
  // including the ground, so dragging a fence's base to an absolute height
118
136
  // on a hillside stores the delta from that hillside and the fence keeps
119
137
  // following it.
120
- const supportBase = resolveFenceLiftElevationForNodes({ ...initial, supportOffset: undefined }, sceneApi.nodes());
138
+ const { midX, midZ } = fenceMidpointFrame(initial);
139
+ const supportBase = fenceBaseElevation({ ...initial, supportOffset: undefined }, sceneApi, [
140
+ midX,
141
+ midZ,
142
+ ]);
121
143
  const nextOffset = newBase - supportBase;
122
144
  return {
123
145
  supportOffset: Math.abs(nextOffset) < 1e-6 ? undefined : nextOffset,
@@ -126,7 +148,7 @@ function fenceElevationHandle(currentBase) {
126
148
  placement: {
127
149
  position: (n, sceneApi) => {
128
150
  const { midX, midZ } = fenceMidpointFrame(n);
129
- return [midX, fenceBaseElevation(n, sceneApi), midZ];
151
+ return [midX, fenceBaseElevation(n, sceneApi, [midX, midZ]), midZ];
130
152
  },
131
153
  },
132
154
  };
@@ -145,7 +167,7 @@ function fenceCornerPicker(endpoint) {
145
167
  placement: {
146
168
  position: (n, sceneApi) => {
147
169
  const corner = endpoint === 'start' ? n.start : n.end;
148
- return [corner[0], fenceBaseElevation(n, sceneApi), corner[1]];
170
+ return [corner[0], fenceBaseElevation(n, sceneApi, corner), corner[1]];
149
171
  },
150
172
  },
151
173
  };
@@ -161,7 +183,7 @@ function fenceControlPointPicker(index) {
161
183
  placement: {
162
184
  position: (n, sceneApi) => {
163
185
  const point = n.path?.[index] ?? n.start;
164
- return [point[0], fenceBaseElevation(n, sceneApi), point[1]];
186
+ return [point[0], fenceBaseElevation(n, sceneApi, point), point[1]];
165
187
  },
166
188
  },
167
189
  };
@@ -178,7 +200,7 @@ function fenceTangentPicker(index, side) {
178
200
  placement: {
179
201
  position: (n, sceneApi) => {
180
202
  const point = n.path?.[index] ?? n.start;
181
- const baseElevation = fenceBaseElevation(n, sceneApi);
203
+ const baseElevation = fenceBaseElevation(n, sceneApi, point);
182
204
  if (!n.path)
183
205
  return [point[0], baseElevation, point[1]];
184
206
  const handle = getFenceControlHandle(n.path, n.tangents, index);
@@ -192,16 +214,26 @@ function fenceTangentPicker(index, side) {
192
214
  };
193
215
  }
194
216
  const fenceHandles = (node, sceneApi) => {
195
- const elevationHandle = fenceElevationHandle(fenceBaseElevation(node, sceneApi));
217
+ const { midX, midZ } = fenceMidpointFrame(node);
218
+ const elevationHandle = fenceElevationHandle(fenceBaseElevation(node, sceneApi, [midX, midZ]));
196
219
  if (isSplineFence(node) && node.path) {
197
220
  return [
198
221
  elevationHandle,
199
222
  fenceHeightHandle(),
200
- ...node.path.flatMap((_, index) => [
201
- fenceControlPointPicker(index),
202
- fenceTangentPicker(index, 'out'),
203
- fenceTangentPicker(index, 'in'),
204
- ]),
223
+ ...node.path.flatMap((_, index) => {
224
+ const path = node.path;
225
+ return [
226
+ fenceControlPointPicker(index),
227
+ ...(index < path.length - 1 &&
228
+ getFenceSpanMode(path, node.tangents, node.spanModes, index) === 'curve'
229
+ ? [fenceTangentPicker(index, 'out')]
230
+ : []),
231
+ ...(index > 0 &&
232
+ getFenceSpanMode(path, node.tangents, node.spanModes, index - 1) === 'curve'
233
+ ? [fenceTangentPicker(index, 'in')]
234
+ : []),
235
+ ];
236
+ }),
205
237
  ];
206
238
  }
207
239
  return [
@@ -229,8 +261,12 @@ const fenceHandles = (node, sceneApi) => {
229
261
  export const fenceDefinition = {
230
262
  kind: 'fence',
231
263
  snapProfile: 'structural',
232
- schemaVersion: 2,
264
+ schemaVersion: 3,
233
265
  schema: FenceNode,
266
+ extensions: {
267
+ [PANEL_MODEL_EXTENSION]: fencePanelModel,
268
+ [REGISTERED_DRAFT_SNAP_EXTENSION]: snapFenceDraftPoint,
269
+ },
234
270
  category: 'structure',
235
271
  surfaceRole: 'wall',
236
272
  defaults: () => ({
@@ -243,22 +279,39 @@ export const fenceDefinition = {
243
279
  height: 1.8,
244
280
  thickness: 0.08,
245
281
  baseHeight: 0.22,
246
- postSpacing: 2,
247
- postSize: 0.1,
282
+ postSpacing: 1.98,
283
+ picketSpacing: 0.27,
284
+ patternDistribution: 'automatic',
285
+ patternAlignment: 'center',
286
+ patternCount: 4,
287
+ patternRemainder: 'leave',
288
+ picketWidth: 0.07,
289
+ picketTop: 'flat',
290
+ picketRailCount: 2,
291
+ picketProfile: 'level',
292
+ picketTopClearance: 0.2,
293
+ picketVariation: 0.23,
294
+ picketRailProjection: 0.001,
295
+ postSize: 0.109,
248
296
  topRailHeight: 0.04,
249
- groundClearance: 0,
297
+ groundClearance: 0.14,
250
298
  edgeInset: 0.015,
251
299
  slatGap: 0.01,
252
300
  postCap: 'pyramid',
253
- baseStyle: 'grounded',
301
+ baseStyle: 'floating',
302
+ surfaceMode: 'auto',
303
+ transitionMode: 'slope',
304
+ transitionWidth: 0.8,
254
305
  showInfill: true,
306
+ infillPlacement: 'center',
255
307
  color: '#ffffff',
256
- style: 'slat',
308
+ style: 'picket',
309
+ children: [],
257
310
  }),
258
311
  capabilities: {
259
312
  surfacePlacement: 'floor-only',
260
313
  selectable: { hitVolume: 'bbox' },
261
- surfaces: { sides: { faces: 'all' } },
314
+ surfaces: { sides: { faces: 'all' }, hosting: false },
262
315
  duplicable: true,
263
316
  deletable: true,
264
317
  slots: (node) => fenceSlots(node),
@@ -270,7 +323,7 @@ export const fenceDefinition = {
270
323
  },
271
324
  relations: {
272
325
  linkedBy: 'endpoint-match',
273
- cascadeDelete: 'none',
326
+ cascadeDelete: 'descendants',
274
327
  },
275
328
  parametrics: fenceParametrics,
276
329
  handles: fenceHandles,
@@ -283,6 +336,8 @@ export const fenceDefinition = {
283
336
  // Stage B: pure geometry function. Generic <GeometrySystem> rebuilds
284
337
  // on dirtyNodes; <ParametricNodeRenderer> mounts the empty group.
285
338
  geometry: buildFenceGeometry,
339
+ geometryChildTypes: ['fence-gate', 'fence-opening'],
340
+ floorplanDependencies: (node) => (node.children ?? []),
286
341
  // Dependency tracker only — a hosted railing (`supportSlabId`) renders at
287
342
  // its slab's elevation, so host elevation edits must re-dirty the fence.
288
343
  system: {
@@ -0,0 +1,36 @@
1
+ import { type AnyNodeId, type FenceConstructionOptions as FenceCommitOptions, FenceNode, type SceneApi, type WallNode } from '@pascal-app/core';
2
+ import { type WallPlanPoint } from '@pascal-app/editor';
3
+ export type FencePlanPoint = WallPlanPoint;
4
+ export type FenceDraftContext = {
5
+ sceneApi: SceneApi;
6
+ levelId: AnyNodeId | null;
7
+ };
8
+ export declare function getFenceInheritedDefaults(start: FencePlanPoint, context: FenceDraftContext, currentNodes?: ReturnType<SceneApi['nodes']>): Partial<FenceNode> | null;
9
+ export declare function snapFenceDraftPoint(args: {
10
+ point: FencePlanPoint;
11
+ walls: WallNode[];
12
+ fences: FenceNode[];
13
+ start?: FencePlanPoint;
14
+ angleSnap?: boolean;
15
+ ignoreFenceIds?: string[];
16
+ bypassSnap?: boolean;
17
+ magnetic?: boolean;
18
+ /** Override the grid step. */
19
+ step?: number;
20
+ /**
21
+ * Optional grid-snap function. When provided, replaces the default
22
+ * local-axis snap — lets the 2D floor-plan keep snapping to the
23
+ * world XZ grid even when the building is rotated. Wall / fence
24
+ * endpoint snap precedence is preserved.
25
+ */
26
+ gridSnap?: (point: FencePlanPoint) => FencePlanPoint;
27
+ }): FencePlanPoint;
28
+ export declare function createFenceOnCurrentLevel(start: FencePlanPoint, end: FencePlanPoint, options: FenceCommitOptions | undefined, context: FenceDraftContext): FenceNode | null;
29
+ /**
30
+ * Commit a smooth spline fence from a list of drawn control points. The
31
+ * centerline becomes a Catmull-Rom curve through `path`; `start`/`end` are
32
+ * pinned to the first/last point so endpoint handles, bbox, and miter
33
+ * references stay valid. Requires >= 2 points spanning a usable distance.
34
+ */
35
+ export declare function createSplineFenceOnCurrentLevel(path: FencePlanPoint[], tangents: FenceNode['tangents'] | undefined, context: FenceDraftContext): FenceNode | null;
36
+ //# sourceMappingURL=drafting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drafting.d.ts","sourceRoot":"","sources":["../../src/fence/drafting.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,wBAAwB,IAAI,kBAAkB,EACnD,SAAS,EAIT,KAAK,QAAQ,EAGb,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAOL,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAA;AAE3B,MAAM,MAAM,cAAc,GAAG,aAAa,CAAA;AAE1C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,QAAQ,CAAA;IAClB,OAAO,EAAE,SAAS,GAAG,IAAI,CAAA;CAC1B,CAAA;AAuCD,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,iBAAiB,EAC1B,YAAY,GAAE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAA4B,GACrE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAiB3B;AA2FD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,KAAK,EAAE,cAAc,CAAA;IACrB,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,MAAM,EAAE,SAAS,EAAE,CAAA;IACnB,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,cAAc,CAAA;CACrD,GAAG,cAAc,CA0CjB;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,cAAc,EACrB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,kBAAkB,GAAG,SAAS,EACvC,OAAO,EAAE,iBAAiB,GACzB,SAAS,GAAG,IAAI,CA8BlB;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,cAAc,EAAE,EACtB,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,GAAG,SAAS,EAC3C,OAAO,EAAE,iBAAiB,GACzB,SAAS,GAAG,IAAI,CAkClB"}
@@ -0,0 +1,210 @@
1
+ import { DEFAULT_ANGLE_STEP, FenceNode, getFenceCenterlineLength, getFenceSplineLength, resolveFenceConstructionSupport, sampleFenceCenterline, snapPointAlongAngleRay, } from '@pascal-app/core';
2
+ import { findWallSnapTarget, getSegmentGridStep, isSegmentLongEnough, snapPointToGrid, triggerSFX, useEditor, } from '@pascal-app/editor';
3
+ const INHERITED_FENCE_FIELDS = [
4
+ 'height',
5
+ 'thickness',
6
+ 'material',
7
+ 'materialPreset',
8
+ 'slots',
9
+ 'baseHeight',
10
+ 'postSpacing',
11
+ 'picketSpacing',
12
+ 'patternDistribution',
13
+ 'patternAlignment',
14
+ 'patternCount',
15
+ 'patternRemainder',
16
+ 'picketWidth',
17
+ 'picketTop',
18
+ 'picketRailCount',
19
+ 'picketProfile',
20
+ 'picketTopClearance',
21
+ 'picketVariation',
22
+ 'picketRailProjection',
23
+ 'postSize',
24
+ 'topRailHeight',
25
+ 'groundClearance',
26
+ 'edgeInset',
27
+ 'slatGap',
28
+ 'postCap',
29
+ 'baseStyle',
30
+ 'surfaceMode',
31
+ 'supportOffset',
32
+ 'transitionMode',
33
+ 'transitionWidth',
34
+ 'showInfill',
35
+ 'infillPlacement',
36
+ 'color',
37
+ 'style',
38
+ ];
39
+ export function getFenceInheritedDefaults(start, context, currentNodes = context.sceneApi.nodes()) {
40
+ const { levelId } = context;
41
+ if (!levelId)
42
+ return null;
43
+ const nodes = currentNodes;
44
+ const source = Object.values(nodes).find((node) => node.type === 'fence' &&
45
+ node.parentId === levelId &&
46
+ node.visible !== false &&
47
+ [node.start, node.end].some((point) => distanceSquared(start, point) < 0.001 ** 2));
48
+ if (!source)
49
+ return null;
50
+ const defaults = {};
51
+ for (const field of INHERITED_FENCE_FIELDS) {
52
+ if (source[field] !== undefined)
53
+ defaults[field] = source[field];
54
+ }
55
+ return defaults;
56
+ }
57
+ const FENCE_CORNER_SNAP_RADIUS = 0.28;
58
+ const FENCE_SPAN_SNAP_RADIUS = 0.16;
59
+ function distanceSquared(a, b) {
60
+ const dx = a[0] - b[0];
61
+ const dz = a[1] - b[1];
62
+ return dx * dx + dz * dz;
63
+ }
64
+ function projectPointOntoSegment(point, segment) {
65
+ const [x1, z1] = segment.start;
66
+ const [x2, z2] = segment.end;
67
+ const dx = x2 - x1;
68
+ const dz = z2 - z1;
69
+ const lengthSquared = dx * dx + dz * dz;
70
+ if (lengthSquared < 1e-9) {
71
+ return null;
72
+ }
73
+ const t = Math.max(0, Math.min(1, ((point[0] - x1) * dx + (point[1] - z1) * dz) / lengthSquared));
74
+ return [x1 + dx * t, z1 + dz * t];
75
+ }
76
+ function findFenceSnapTarget(point, fences, ignoreFenceIds = []) {
77
+ const cornerRadiusSquared = FENCE_CORNER_SNAP_RADIUS ** 2;
78
+ const spanRadiusSquared = FENCE_SPAN_SNAP_RADIUS ** 2;
79
+ const ignoredFenceIds = new Set(ignoreFenceIds);
80
+ let bestCornerTarget = null;
81
+ let bestCornerDistanceSquared = Number.POSITIVE_INFINITY;
82
+ let bestSpanTarget = null;
83
+ let bestSpanDistanceSquared = Number.POSITIVE_INFINITY;
84
+ for (const fence of fences) {
85
+ if (ignoredFenceIds.has(fence.id)) {
86
+ continue;
87
+ }
88
+ for (const candidate of [fence.start, fence.end]) {
89
+ const candidateDistanceSquared = distanceSquared(point, candidate);
90
+ if (candidateDistanceSquared > cornerRadiusSquared ||
91
+ candidateDistanceSquared >= bestCornerDistanceSquared) {
92
+ continue;
93
+ }
94
+ bestCornerTarget = candidate;
95
+ bestCornerDistanceSquared = candidateDistanceSquared;
96
+ }
97
+ const samples = sampleFenceCenterline(fence, Math.max(32, Math.ceil(getFenceCenterlineLength(fence) / 0.1)));
98
+ for (let index = 1; index < samples.length; index += 1) {
99
+ const a = samples[index - 1];
100
+ const b = samples[index];
101
+ const candidate = projectPointOntoSegment(point, {
102
+ start: [a.x, a.y],
103
+ end: [b.x, b.y],
104
+ });
105
+ if (!candidate)
106
+ continue;
107
+ const candidateDistanceSquared = distanceSquared(point, candidate);
108
+ if (candidateDistanceSquared > spanRadiusSquared ||
109
+ candidateDistanceSquared >= bestSpanDistanceSquared)
110
+ continue;
111
+ bestSpanTarget = candidate;
112
+ bestSpanDistanceSquared = candidateDistanceSquared;
113
+ }
114
+ }
115
+ return bestCornerTarget ?? bestSpanTarget;
116
+ }
117
+ export function snapFenceDraftPoint(args) {
118
+ if (useEditor.getState().toolDefaults.fence?.featurePlacement)
119
+ return args.point;
120
+ const { point, walls, fences, start, angleSnap = false, ignoreFenceIds, bypassSnap = false, magnetic = true, step, gridSnap, } = args;
121
+ if (bypassSnap)
122
+ return point;
123
+ const gridStep = step ?? getSegmentGridStep();
124
+ // Magnetic endpoint snap must beat the angle lock, and the lock can pull
125
+ // the cursor far enough off an endpoint that probing the locked point
126
+ // would never engage — so under the lock, probe from the RAW cursor
127
+ // first (mirrors `snapWallDraftPointDetailed`'s special-point pre-pass).
128
+ if (start && angleSnap) {
129
+ const rawTarget = magnetic &&
130
+ (findFenceSnapTarget(point, fences, ignoreFenceIds) ?? findWallSnapTarget(point, walls));
131
+ if (rawTarget)
132
+ return rawTarget;
133
+ }
134
+ // The angle path snaps the distance ALONG the 15° ray — a scalar, the
135
+ // same in world and local frames — so the `gridSnap` world-grid override
136
+ // only applies when the angle lock is off.
137
+ const basePoint = start && angleSnap
138
+ ? [...snapPointAlongAngleRay(start, point, DEFAULT_ANGLE_STEP, gridStep)]
139
+ : gridSnap
140
+ ? gridSnap(point)
141
+ : snapPointToGrid(point, gridStep);
142
+ if (!magnetic)
143
+ return basePoint;
144
+ const fenceSnapTarget = findFenceSnapTarget(basePoint, fences, ignoreFenceIds);
145
+ return fenceSnapTarget ?? findWallSnapTarget(basePoint, walls) ?? basePoint;
146
+ }
147
+ export function createFenceOnCurrentLevel(start, end, options, context) {
148
+ const { sceneApi, levelId: currentLevelId } = context;
149
+ const nodes = sceneApi.nodes();
150
+ if (!(currentLevelId && isSegmentLongEnough(start, end))) {
151
+ return null;
152
+ }
153
+ const fenceCount = Object.values(nodes).filter((node) => node.type === 'fence').length;
154
+ // Build parameters seeded by a placed preset (height, style, post
155
+ // spacing, …) merge in first; `name`/`start`/`end` always win. The
156
+ // schema parse validates and drops anything unexpected.
157
+ const defaults = {
158
+ ...useEditor.getState().toolDefaults.fence,
159
+ ...getFenceInheritedDefaults(start, context),
160
+ };
161
+ const authoredFence = FenceNode.parse({
162
+ ...defaults,
163
+ name: `Fence ${fenceCount + 1}`,
164
+ start,
165
+ end,
166
+ });
167
+ // Fences run no per-frame support election — the persisted host IS the
168
+ // lift (absent = level floor), so elect it at commit, pointer-capped.
169
+ const fence = resolveFenceConstructionSupport(authoredFence, currentLevelId, nodes, options);
170
+ sceneApi.upsert(fence, currentLevelId);
171
+ triggerSFX('sfx:structure-build');
172
+ return fence;
173
+ }
174
+ /**
175
+ * Commit a smooth spline fence from a list of drawn control points. The
176
+ * centerline becomes a Catmull-Rom curve through `path`; `start`/`end` are
177
+ * pinned to the first/last point so endpoint handles, bbox, and miter
178
+ * references stay valid. Requires >= 2 points spanning a usable distance.
179
+ */
180
+ export function createSplineFenceOnCurrentLevel(path, tangents, context) {
181
+ const { sceneApi, levelId: currentLevelId } = context;
182
+ const nodes = sceneApi.nodes();
183
+ if (!currentLevelId || path.length < 2) {
184
+ return null;
185
+ }
186
+ const start = path[0];
187
+ const end = path[path.length - 1];
188
+ // A degenerate single-point-ish path (all clicks on one spot) is rejected
189
+ // the same way a too-short straight segment is.
190
+ if (getFenceSplineLength(path, tangents) < 0.01) {
191
+ return null;
192
+ }
193
+ const fenceCount = Object.values(nodes).filter((node) => node.type === 'fence').length;
194
+ const defaults = {
195
+ ...useEditor.getState().toolDefaults.fence,
196
+ ...getFenceInheritedDefaults(start, context),
197
+ };
198
+ const authoredFence = FenceNode.parse({
199
+ ...defaults,
200
+ name: `Fence ${fenceCount + 1}`,
201
+ start,
202
+ end,
203
+ path,
204
+ tangents,
205
+ });
206
+ const fence = authoredFence;
207
+ sceneApi.upsert(fence, currentLevelId);
208
+ triggerSFX('sfx:structure-build');
209
+ return fence;
210
+ }
@@ -0,0 +1,4 @@
1
+ export default function FenceFeatureTool({ kind }: {
2
+ kind: 'gate' | 'opening';
3
+ }): null;
4
+ //# sourceMappingURL=feature-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-tool.d.ts","sourceRoot":"","sources":["../../src/fence/feature-tool.tsx"],"names":[],"mappings":"AAyBA,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,QAuJ9E"}