@pascal-app/nodes 1.0.0 → 1.0.3

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 (439) hide show
  1. package/dist/block/definition.d.ts.map +1 -1
  2. package/dist/block/definition.js +4 -1
  3. package/dist/block/face-host.d.ts.map +1 -1
  4. package/dist/block/face-host.js +19 -2
  5. package/dist/block/hosted-edit.d.ts +13 -0
  6. package/dist/block/hosted-edit.d.ts.map +1 -0
  7. package/dist/block/hosted-edit.js +205 -0
  8. package/dist/block/last-operation.d.ts +1 -1
  9. package/dist/block/last-operation.d.ts.map +1 -1
  10. package/dist/block/last-operation.js +6 -4
  11. package/dist/block/modal-session.d.ts +2 -1
  12. package/dist/block/modal-session.d.ts.map +1 -1
  13. package/dist/block/modal-session.js +2 -2
  14. package/dist/block/selection.d.ts.map +1 -1
  15. package/dist/block/selection.js +82 -24
  16. package/dist/block/surface.d.ts +4 -0
  17. package/dist/block/surface.d.ts.map +1 -0
  18. package/dist/block/surface.js +54 -0
  19. package/dist/block/use-block-face-operation.d.ts +2 -2
  20. package/dist/block/use-block-face-operation.d.ts.map +1 -1
  21. package/dist/block/use-block-face-operation.js +25 -11
  22. package/dist/box-vent/definition.d.ts.map +1 -1
  23. package/dist/box-vent/definition.js +1 -0
  24. package/dist/box-vent/panel.js +4 -4
  25. package/dist/building/renderer.d.ts.map +1 -1
  26. package/dist/building/renderer.js +1 -1
  27. package/dist/cabinet/appliance-layout.d.ts +26 -0
  28. package/dist/cabinet/appliance-layout.d.ts.map +1 -0
  29. package/dist/cabinet/appliance-layout.js +52 -0
  30. package/dist/cabinet/countertop-layout.d.ts +173 -0
  31. package/dist/cabinet/countertop-layout.d.ts.map +1 -0
  32. package/dist/cabinet/countertop-layout.js +80 -0
  33. package/dist/cabinet/definition.d.ts.map +1 -1
  34. package/dist/cabinet/definition.js +17 -8
  35. package/dist/cabinet/geometry/cooktop.d.ts.map +1 -1
  36. package/dist/cabinet/geometry/cooktop.js +2 -2
  37. package/dist/cabinet/geometry/run.d.ts.map +1 -1
  38. package/dist/cabinet/geometry/run.js +10 -71
  39. package/dist/cabinet/geometry/sink.d.ts +2 -12
  40. package/dist/cabinet/geometry/sink.d.ts.map +1 -1
  41. package/dist/cabinet/geometry/sink.js +8 -39
  42. package/dist/cabinet/hosted-resize.d.ts +5 -0
  43. package/dist/cabinet/hosted-resize.d.ts.map +1 -0
  44. package/dist/cabinet/hosted-resize.js +14 -0
  45. package/dist/cabinet/placement-snap.d.ts.map +1 -1
  46. package/dist/cabinet/placement-snap.js +4 -2
  47. package/dist/cabinet/run-layout.d.ts +8 -1
  48. package/dist/cabinet/run-layout.d.ts.map +1 -1
  49. package/dist/cabinet/run-layout.js +22 -14
  50. package/dist/cabinet/run-ops.d.ts +3 -3
  51. package/dist/cabinet/run-ops.js +3 -3
  52. package/dist/cabinet/run-panel.d.ts +1 -1
  53. package/dist/cabinet/run-panel.d.ts.map +1 -1
  54. package/dist/cabinet/run-panel.js +16 -7
  55. package/dist/cabinet/surfaces.d.ts +5 -0
  56. package/dist/cabinet/surfaces.d.ts.map +1 -0
  57. package/dist/cabinet/surfaces.js +113 -0
  58. package/dist/cabinet/tool.d.ts.map +1 -1
  59. package/dist/cabinet/tool.js +8 -4
  60. package/dist/cabinet/tree-structure.d.ts.map +1 -1
  61. package/dist/cabinet/tree-structure.js +10 -9
  62. package/dist/ceiling/definition.d.ts.map +1 -1
  63. package/dist/ceiling/definition.js +6 -1
  64. package/dist/ceiling/floorplan-affordances.d.ts +4 -4
  65. package/dist/ceiling/panel.js +1 -1
  66. package/dist/ceiling/renderer.d.ts.map +1 -1
  67. package/dist/ceiling/renderer.js +3 -2
  68. package/dist/chimney/definition.d.ts.map +1 -1
  69. package/dist/chimney/definition.js +1 -0
  70. package/dist/chimney/panel.js +9 -9
  71. package/dist/column/definition.d.ts.map +1 -1
  72. package/dist/column/definition.js +10 -3
  73. package/dist/column/floorplan-affordances.d.ts.map +1 -1
  74. package/dist/column/floorplan-affordances.js +6 -1
  75. package/dist/column/floorplan.d.ts.map +1 -1
  76. package/dist/column/floorplan.js +23 -11
  77. package/dist/column/hosted-resize.d.ts +116 -0
  78. package/dist/column/hosted-resize.d.ts.map +1 -0
  79. package/dist/column/hosted-resize.js +9 -0
  80. package/dist/column/panel.d.ts.map +1 -1
  81. package/dist/column/panel.js +6 -3
  82. package/dist/column/renderer.d.ts.map +1 -1
  83. package/dist/column/renderer.js +25 -103
  84. package/dist/column/shape.d.ts +22 -0
  85. package/dist/column/shape.d.ts.map +1 -0
  86. package/dist/column/shape.js +120 -0
  87. package/dist/column/surface.d.ts +4 -0
  88. package/dist/column/surface.d.ts.map +1 -0
  89. package/dist/column/surface.js +66 -0
  90. package/dist/cupola/definition.d.ts.map +1 -1
  91. package/dist/cupola/definition.js +1 -0
  92. package/dist/cupola/panel.js +1 -1
  93. package/dist/door/definition.d.ts.map +1 -1
  94. package/dist/door/definition.js +40 -1
  95. package/dist/door/door-math.d.ts +1 -1
  96. package/dist/door/door-math.d.ts.map +1 -1
  97. package/dist/door/door-math.js +7 -10
  98. package/dist/door/floorplan-affordances.d.ts.map +1 -1
  99. package/dist/door/floorplan-affordances.js +8 -12
  100. package/dist/door/move-tool.d.ts.map +1 -1
  101. package/dist/door/move-tool.js +3 -4
  102. package/dist/door/panel.d.ts.map +1 -1
  103. package/dist/door/panel.js +28 -57
  104. package/dist/door/tool.d.ts.map +1 -1
  105. package/dist/door/tool.js +20 -2
  106. package/dist/dormer/definition.d.ts.map +1 -1
  107. package/dist/dormer/definition.js +1 -0
  108. package/dist/dormer/panel-position-section.js +2 -2
  109. package/dist/dormer/panel.js +1 -1
  110. package/dist/downspout/definition.d.ts.map +1 -1
  111. package/dist/downspout/definition.js +1 -0
  112. package/dist/duct-segment/parametrics.d.ts.map +1 -1
  113. package/dist/duct-segment/parametrics.js +5 -1
  114. package/dist/duct-segment/tool.d.ts +1 -0
  115. package/dist/duct-segment/tool.d.ts.map +1 -1
  116. package/dist/duct-segment/tool.js +21 -8
  117. package/dist/duct-terminal/tool.d.ts.map +1 -1
  118. package/dist/duct-terminal/tool.js +77 -8
  119. package/dist/elevator/definition.d.ts.map +1 -1
  120. package/dist/elevator/definition.js +2 -0
  121. package/dist/elevator/parametrics.d.ts.map +1 -1
  122. package/dist/elevator/parametrics.js +98 -1
  123. package/dist/eyebrow-vent/definition.d.ts.map +1 -1
  124. package/dist/eyebrow-vent/definition.js +1 -0
  125. package/dist/eyebrow-vent/panel.js +1 -1
  126. package/dist/fence/definition.d.ts.map +1 -1
  127. package/dist/fence/definition.js +1 -0
  128. package/dist/fence/inspector-editors.js +1 -1
  129. package/dist/fence/tool.js +2 -2
  130. package/dist/guide/definition.d.ts.map +1 -1
  131. package/dist/guide/definition.js +1 -0
  132. package/dist/gutter/definition.d.ts.map +1 -1
  133. package/dist/gutter/definition.js +1 -0
  134. package/dist/hvac-equipment/tool.d.ts.map +1 -1
  135. package/dist/hvac-equipment/tool.js +8 -2
  136. package/dist/imported-mesh/definition.d.ts +5 -0
  137. package/dist/imported-mesh/definition.d.ts.map +1 -0
  138. package/dist/imported-mesh/definition.js +38 -0
  139. package/dist/imported-mesh/floorplan.d.ts +4 -0
  140. package/dist/imported-mesh/floorplan.d.ts.map +1 -0
  141. package/dist/imported-mesh/floorplan.js +34 -0
  142. package/dist/imported-mesh/geometry.d.ts +5 -0
  143. package/dist/imported-mesh/geometry.d.ts.map +1 -0
  144. package/dist/imported-mesh/geometry.js +34 -0
  145. package/dist/imported-mesh/index.d.ts +4 -0
  146. package/dist/imported-mesh/index.d.ts.map +1 -0
  147. package/dist/imported-mesh/index.js +3 -0
  148. package/dist/imported-mesh/schema.d.ts +2 -0
  149. package/dist/imported-mesh/schema.d.ts.map +1 -0
  150. package/dist/imported-mesh/schema.js +1 -0
  151. package/dist/index.d.ts +2 -0
  152. package/dist/index.d.ts.map +1 -1
  153. package/dist/index.js +8 -0
  154. package/dist/item/__fixtures__/main-floorplan.d.ts +26 -0
  155. package/dist/item/__fixtures__/main-floorplan.d.ts.map +1 -0
  156. package/dist/item/__fixtures__/main-floorplan.js +297 -0
  157. package/dist/item/definition.d.ts.map +1 -1
  158. package/dist/item/definition.js +3 -1
  159. package/dist/item/floorplan-move.d.ts +9 -1
  160. package/dist/item/floorplan-move.d.ts.map +1 -1
  161. package/dist/item/floorplan-move.js +231 -99
  162. package/dist/item/floorplan.d.ts +22 -0
  163. package/dist/item/floorplan.d.ts.map +1 -1
  164. package/dist/item/floorplan.js +72 -2
  165. package/dist/item/move-tool.d.ts +1 -1
  166. package/dist/item/move-tool.d.ts.map +1 -1
  167. package/dist/item/move-tool.js +15 -7
  168. package/dist/item/panel.js +1 -1
  169. package/dist/item/renderer.d.ts.map +1 -1
  170. package/dist/item/renderer.js +8 -2
  171. package/dist/level/renderer.js +1 -1
  172. package/dist/lineset/tool.d.ts.map +1 -1
  173. package/dist/lineset/tool.js +1 -0
  174. package/dist/liquid-line/tool.d.ts.map +1 -1
  175. package/dist/liquid-line/tool.js +5 -1
  176. package/dist/measurement/definition.d.ts.map +1 -1
  177. package/dist/measurement/definition.js +1 -0
  178. package/dist/pipe-segment/parametrics.d.ts.map +1 -1
  179. package/dist/pipe-segment/parametrics.js +5 -1
  180. package/dist/pipe-segment/tool.d.ts.map +1 -1
  181. package/dist/pipe-segment/tool.js +14 -3
  182. package/dist/pipe-trap/tool.d.ts.map +1 -1
  183. package/dist/pipe-trap/tool.js +7 -8
  184. package/dist/procedural-item/definition.d.ts +4 -0
  185. package/dist/procedural-item/definition.d.ts.map +1 -0
  186. package/dist/procedural-item/definition.js +257 -0
  187. package/dist/procedural-item/geometry.d.ts +31 -0
  188. package/dist/procedural-item/geometry.d.ts.map +1 -0
  189. package/dist/procedural-item/geometry.js +88 -0
  190. package/dist/procedural-item/index.d.ts +3 -0
  191. package/dist/procedural-item/index.d.ts.map +1 -0
  192. package/dist/procedural-item/index.js +2 -0
  193. package/dist/procedural-item/move-session.d.ts +15 -0
  194. package/dist/procedural-item/move-session.d.ts.map +1 -0
  195. package/dist/procedural-item/move-session.js +197 -0
  196. package/dist/procedural-item/move-tool.d.ts +5 -0
  197. package/dist/procedural-item/move-tool.d.ts.map +1 -0
  198. package/dist/procedural-item/move-tool.js +193 -0
  199. package/dist/procedural-item/renderer.d.ts +5 -0
  200. package/dist/procedural-item/renderer.d.ts.map +1 -0
  201. package/dist/procedural-item/renderer.js +66 -0
  202. package/dist/ridge-vent/definition.d.ts.map +1 -1
  203. package/dist/ridge-vent/definition.js +1 -0
  204. package/dist/ridge-vent/panel.js +4 -4
  205. package/dist/roof/definition.d.ts.map +1 -1
  206. package/dist/roof/definition.js +4 -1
  207. package/dist/roof/panel-model.d.ts +4 -0
  208. package/dist/roof/panel-model.d.ts.map +1 -0
  209. package/dist/roof/panel-model.js +151 -0
  210. package/dist/roof/panel.d.ts.map +1 -1
  211. package/dist/roof/panel.js +9 -8
  212. package/dist/roof/parametrics.d.ts.map +1 -1
  213. package/dist/roof/parametrics.js +16 -1
  214. package/dist/roof-segment/definition.d.ts.map +1 -1
  215. package/dist/roof-segment/definition.js +1 -0
  216. package/dist/roof-segment/panel.d.ts.map +1 -1
  217. package/dist/roof-segment/panel.js +5 -5
  218. package/dist/roof-segment/parametrics.d.ts.map +1 -1
  219. package/dist/roof-segment/parametrics.js +176 -1
  220. package/dist/scan/definition.d.ts.map +1 -1
  221. package/dist/scan/definition.js +1 -0
  222. package/dist/shared/automatic-run-end-cap.d.ts +1 -0
  223. package/dist/shared/automatic-run-end-cap.d.ts.map +1 -1
  224. package/dist/shared/automatic-run-end-cap.js +10 -0
  225. package/dist/shared/commit-opening-move.d.ts +4 -0
  226. package/dist/shared/commit-opening-move.d.ts.map +1 -0
  227. package/dist/shared/commit-opening-move.js +9 -0
  228. package/dist/shared/curtain-opening-limits.d.ts +14 -0
  229. package/dist/shared/curtain-opening-limits.d.ts.map +1 -0
  230. package/dist/shared/curtain-opening-limits.js +53 -0
  231. package/dist/shared/distribution-run-tool.d.ts +10 -0
  232. package/dist/shared/distribution-run-tool.d.ts.map +1 -1
  233. package/dist/shared/distribution-run-tool.js +56 -11
  234. package/dist/shared/draft-axis-guides.d.ts +0 -6
  235. package/dist/shared/draft-axis-guides.d.ts.map +1 -1
  236. package/dist/shared/draft-axis-guides.js +1 -8
  237. package/dist/shared/hosted-resize.d.ts +12 -0
  238. package/dist/shared/hosted-resize.d.ts.map +1 -0
  239. package/dist/shared/hosted-resize.js +166 -0
  240. package/dist/shared/opening-grid-follow.d.ts +8 -0
  241. package/dist/shared/opening-grid-follow.d.ts.map +1 -0
  242. package/dist/shared/opening-grid-follow.js +12 -0
  243. package/dist/shared/opening-property-preview-host.d.ts +3 -0
  244. package/dist/shared/opening-property-preview-host.d.ts.map +1 -0
  245. package/dist/shared/opening-property-preview-host.js +21 -0
  246. package/dist/shared/opening-property-preview.d.ts +19 -0
  247. package/dist/shared/opening-property-preview.d.ts.map +1 -0
  248. package/dist/shared/opening-property-preview.js +99 -0
  249. package/dist/shared/panel-fields.d.ts +15 -0
  250. package/dist/shared/panel-fields.d.ts.map +1 -0
  251. package/dist/shared/panel-fields.js +31 -0
  252. package/dist/shared/resting-surface-plan.d.ts +4 -0
  253. package/dist/shared/resting-surface-plan.d.ts.map +1 -0
  254. package/dist/shared/resting-surface-plan.js +53 -0
  255. package/dist/shared/surface-counterparts.d.ts +12 -0
  256. package/dist/shared/surface-counterparts.d.ts.map +1 -0
  257. package/dist/shared/surface-counterparts.js +27 -0
  258. package/dist/shared/wall-attach-target.d.ts +1 -0
  259. package/dist/shared/wall-attach-target.d.ts.map +1 -1
  260. package/dist/shared/wall-attach-target.js +4 -1
  261. package/dist/shared/wall-event-from-grid.d.ts +5 -0
  262. package/dist/shared/wall-event-from-grid.d.ts.map +1 -0
  263. package/dist/shared/wall-event-from-grid.js +36 -0
  264. package/dist/shelf/definition.d.ts.map +1 -1
  265. package/dist/shelf/definition.js +5 -2
  266. package/dist/shelf/floorplan-affordances.d.ts.map +1 -1
  267. package/dist/shelf/floorplan-affordances.js +5 -3
  268. package/dist/shelf/floorplan-move.d.ts.map +1 -1
  269. package/dist/shelf/floorplan-move.js +3 -2
  270. package/dist/shelf/floorplan.d.ts.map +1 -1
  271. package/dist/shelf/floorplan.js +9 -2
  272. package/dist/shelf/geometry.d.ts.map +1 -1
  273. package/dist/shelf/geometry.js +2 -10
  274. package/dist/site/renderer.d.ts.map +1 -1
  275. package/dist/site/renderer.js +9 -2
  276. package/dist/skylight/definition.d.ts.map +1 -1
  277. package/dist/skylight/definition.js +1 -0
  278. package/dist/skylight/panel.js +6 -6
  279. package/dist/slab/definition.d.ts.map +1 -1
  280. package/dist/slab/definition.js +4 -0
  281. package/dist/slab/panel.js +1 -1
  282. package/dist/solar-panel/definition.d.ts.map +1 -1
  283. package/dist/solar-panel/definition.js +1 -0
  284. package/dist/solar-panel/panel.js +2 -2
  285. package/dist/spawn/definition.d.ts.map +1 -1
  286. package/dist/spawn/definition.js +1 -0
  287. package/dist/spawn/panel.js +1 -1
  288. package/dist/stair/definition.d.ts.map +1 -1
  289. package/dist/stair/definition.js +2 -0
  290. package/dist/stair/panel.d.ts.map +1 -1
  291. package/dist/stair/panel.js +9 -7
  292. package/dist/stair/parametrics.d.ts.map +1 -1
  293. package/dist/stair/parametrics.js +164 -1
  294. package/dist/stair-segment/definition.d.ts.map +1 -1
  295. package/dist/stair-segment/definition.js +1 -0
  296. package/dist/stair-segment/panel.js +4 -4
  297. package/dist/stair-segment/parametrics.d.ts.map +1 -1
  298. package/dist/stair-segment/parametrics.js +81 -1
  299. package/dist/turbine-vent/definition.d.ts.map +1 -1
  300. package/dist/turbine-vent/definition.js +1 -0
  301. package/dist/turbine-vent/panel.js +1 -1
  302. package/dist/unit/definition.d.ts +10 -0
  303. package/dist/unit/definition.d.ts.map +1 -0
  304. package/dist/unit/definition.js +38 -0
  305. package/dist/unit/index.d.ts +2 -0
  306. package/dist/unit/index.d.ts.map +1 -0
  307. package/dist/unit/index.js +1 -0
  308. package/dist/unit/parametrics.d.ts +3 -0
  309. package/dist/unit/parametrics.d.ts.map +1 -0
  310. package/dist/unit/parametrics.js +4 -0
  311. package/dist/unit/schema.d.ts +2 -0
  312. package/dist/unit/schema.d.ts.map +1 -0
  313. package/dist/unit/schema.js +1 -0
  314. package/dist/unit/unit-panel.d.ts +5 -0
  315. package/dist/unit/unit-panel.d.ts.map +1 -0
  316. package/dist/unit/unit-panel.js +61 -0
  317. package/dist/wall/actions.d.ts +3 -0
  318. package/dist/wall/actions.d.ts.map +1 -0
  319. package/dist/wall/actions.js +56 -0
  320. package/dist/wall/curtain-opening-frame.d.ts +14 -0
  321. package/dist/wall/curtain-opening-frame.d.ts.map +1 -0
  322. package/dist/wall/curtain-opening-frame.js +111 -0
  323. package/dist/wall/curtain-panel-highlight.d.ts +3 -0
  324. package/dist/wall/curtain-panel-highlight.d.ts.map +1 -0
  325. package/dist/wall/curtain-panel-highlight.js +113 -0
  326. package/dist/wall/curtain-wall-adapter.d.ts +3 -0
  327. package/dist/wall/curtain-wall-adapter.d.ts.map +1 -0
  328. package/dist/wall/curtain-wall-adapter.js +55 -0
  329. package/dist/wall/curtain-wall-floorplan.d.ts +3 -0
  330. package/dist/wall/curtain-wall-floorplan.d.ts.map +1 -0
  331. package/dist/wall/curtain-wall-floorplan.js +91 -0
  332. package/dist/wall/curtain-wall-geometry.d.ts +4 -0
  333. package/dist/wall/curtain-wall-geometry.d.ts.map +1 -0
  334. package/dist/wall/curtain-wall-geometry.js +226 -0
  335. package/dist/wall/curtain-wall-layout.d.ts +16 -0
  336. package/dist/wall/curtain-wall-layout.d.ts.map +1 -0
  337. package/dist/wall/curtain-wall-layout.js +176 -0
  338. package/dist/wall/curtain-wall-materials.d.ts +5 -0
  339. package/dist/wall/curtain-wall-materials.d.ts.map +1 -0
  340. package/dist/wall/curtain-wall-materials.js +55 -0
  341. package/dist/wall/curtain-wall-panel.d.ts +14 -0
  342. package/dist/wall/curtain-wall-panel.d.ts.map +1 -0
  343. package/dist/wall/curtain-wall-panel.js +167 -0
  344. package/dist/wall/curtain-wall-piece-geometry.d.ts +5 -0
  345. package/dist/wall/curtain-wall-piece-geometry.d.ts.map +1 -0
  346. package/dist/wall/curtain-wall-piece-geometry.js +220 -0
  347. package/dist/wall/curtain-wall-shadow.d.ts +4 -0
  348. package/dist/wall/curtain-wall-shadow.d.ts.map +1 -0
  349. package/dist/wall/curtain-wall-shadow.js +15 -0
  350. package/dist/wall/definition.d.ts +0 -15
  351. package/dist/wall/definition.d.ts.map +1 -1
  352. package/dist/wall/definition.js +65 -4
  353. package/dist/wall/drawing-mode.d.ts +12 -0
  354. package/dist/wall/drawing-mode.d.ts.map +1 -0
  355. package/dist/wall/drawing-mode.js +38 -0
  356. package/dist/wall/floorplan-tool.d.ts +4 -0
  357. package/dist/wall/floorplan-tool.d.ts.map +1 -0
  358. package/dist/wall/floorplan-tool.js +107 -0
  359. package/dist/wall/floorplan.d.ts.map +1 -1
  360. package/dist/wall/floorplan.js +6 -2
  361. package/dist/wall/length-patch.d.ts +3 -0
  362. package/dist/wall/length-patch.d.ts.map +1 -0
  363. package/dist/wall/length-patch.js +14 -0
  364. package/dist/wall/move-tool.d.ts.map +1 -1
  365. package/dist/wall/move-tool.js +23 -1
  366. package/dist/wall/paint.d.ts.map +1 -1
  367. package/dist/wall/paint.js +39 -4
  368. package/dist/wall/panel-model.d.ts +4 -0
  369. package/dist/wall/panel-model.d.ts.map +1 -0
  370. package/dist/wall/panel-model.js +117 -0
  371. package/dist/wall/panel.d.ts.map +1 -1
  372. package/dist/wall/panel.js +20 -24
  373. package/dist/wall/property-preview.d.ts +7 -0
  374. package/dist/wall/property-preview.d.ts.map +1 -0
  375. package/dist/wall/property-preview.js +31 -0
  376. package/dist/wall/rectangle-command.d.ts +149 -0
  377. package/dist/wall/rectangle-command.d.ts.map +1 -0
  378. package/dist/wall/rectangle-command.js +22 -0
  379. package/dist/wall/rectangle-tool.d.ts +2 -0
  380. package/dist/wall/rectangle-tool.d.ts.map +1 -0
  381. package/dist/wall/rectangle-tool.js +147 -0
  382. package/dist/wall/renderer.d.ts.map +1 -1
  383. package/dist/wall/renderer.js +7 -4
  384. package/dist/wall/slots.d.ts +2 -2
  385. package/dist/wall/slots.d.ts.map +1 -1
  386. package/dist/wall/slots.js +10 -2
  387. package/dist/wall/split-floorplan-layer.d.ts +4 -0
  388. package/dist/wall/split-floorplan-layer.d.ts.map +1 -0
  389. package/dist/wall/split-floorplan-layer.js +71 -0
  390. package/dist/wall/split-pointer.d.ts +3 -0
  391. package/dist/wall/split-pointer.d.ts.map +1 -0
  392. package/dist/wall/split-pointer.js +95 -0
  393. package/dist/wall/split-preview.d.ts +55 -0
  394. package/dist/wall/split-preview.d.ts.map +1 -0
  395. package/dist/wall/split-preview.js +106 -0
  396. package/dist/wall/split-session.d.ts +16 -0
  397. package/dist/wall/split-session.d.ts.map +1 -0
  398. package/dist/wall/split-session.js +138 -0
  399. package/dist/wall/split-store.d.ts +16 -0
  400. package/dist/wall/split-store.d.ts.map +1 -0
  401. package/dist/wall/split-store.js +6 -0
  402. package/dist/wall/split-tool.d.ts +10 -0
  403. package/dist/wall/split-tool.d.ts.map +1 -0
  404. package/dist/wall/split-tool.js +95 -0
  405. package/dist/wall/system.d.ts.map +1 -1
  406. package/dist/wall/system.js +3 -1
  407. package/dist/wall/tool.d.ts.map +1 -1
  408. package/dist/wall/tool.js +14 -6
  409. package/dist/wall/wall-batch-system.d.ts.map +1 -1
  410. package/dist/wall/wall-batch-system.js +3 -0
  411. package/dist/window/definition.d.ts.map +1 -1
  412. package/dist/window/definition.js +48 -1
  413. package/dist/window/floorplan-affordances.d.ts.map +1 -1
  414. package/dist/window/floorplan-affordances.js +8 -10
  415. package/dist/window/move-tool.d.ts.map +1 -1
  416. package/dist/window/move-tool.js +4 -6
  417. package/dist/window/panel.d.ts.map +1 -1
  418. package/dist/window/panel.js +22 -60
  419. package/dist/window/tool.d.ts.map +1 -1
  420. package/dist/window/tool.js +34 -2
  421. package/dist/window/window-math.d.ts +1 -1
  422. package/dist/window/window-math.d.ts.map +1 -1
  423. package/dist/window/window-math.js +8 -11
  424. package/dist/zone/definition.d.ts.map +1 -1
  425. package/dist/zone/definition.js +8 -1
  426. package/dist/zone/floorplan.d.ts +1 -3
  427. package/dist/zone/floorplan.d.ts.map +1 -1
  428. package/dist/zone/floorplan.js +43 -28
  429. package/dist/zone/quantities-panel.d.ts.map +1 -1
  430. package/dist/zone/quantities-panel.js +32 -44
  431. package/dist/zone/renderer.d.ts.map +1 -1
  432. package/dist/zone/renderer.js +21 -7
  433. package/dist/zone/unit-membership.d.ts +12 -0
  434. package/dist/zone/unit-membership.d.ts.map +1 -0
  435. package/dist/zone/unit-membership.js +22 -0
  436. package/package.json +15 -9
  437. package/dist/shared/opening-documentation-fields.d.ts +0 -16
  438. package/dist/shared/opening-documentation-fields.d.ts.map +0 -1
  439. package/dist/shared/opening-documentation-fields.js +0 -54
@@ -0,0 +1,52 @@
1
+ export const BASIN_WALL = 0.012;
2
+ const BASIN_CORNER_MARGIN = 0.06;
3
+ // Centers the faucet base in the strip between the bowl's back edge and the
4
+ // countertop's back edge (BASIN_CORNER_MARGIN wide).
5
+ export const FAUCET_SETBACK = 0.03;
6
+ /**
7
+ * Bowl rects in module-local X/Z given the usable countertop footprint.
8
+ * Shared by the 3D cut, the run-countertop cut, and the 2D floorplan symbol.
9
+ */
10
+ export function sinkBowls(layout, usableWidth, usableDepth) {
11
+ const depth = Math.max(0.1, usableDepth - BASIN_CORNER_MARGIN * 2);
12
+ const full = Math.max(0.15, usableWidth - BASIN_CORNER_MARGIN * 2);
13
+ if (layout === 'single') {
14
+ const width = Math.min(0.7, full);
15
+ return [{ centerX: 0, width, depth }];
16
+ }
17
+ const divider = 0.03;
18
+ if (layout === 'double') {
19
+ const width = Math.min(0.42, (full - divider) / 2);
20
+ return [
21
+ { centerX: -(width + divider) / 2, width, depth },
22
+ { centerX: (width + divider) / 2, width, depth },
23
+ ];
24
+ }
25
+ // double-offset: 60/40 split
26
+ const total = Math.min(0.86, full);
27
+ const main = (total - divider) * 0.6;
28
+ const side = (total - divider) * 0.4;
29
+ return [
30
+ { centerX: -(total / 2) + main / 2, width: main, depth },
31
+ { centerX: total / 2 - side / 2, width: side, depth },
32
+ ];
33
+ }
34
+ export function sinkOpening(bowl) {
35
+ return { ...bowl, width: bowl.width - BASIN_WALL, depth: bowl.depth - BASIN_WALL };
36
+ }
37
+ export function cooktopFootprint(node) {
38
+ return {
39
+ width: Math.max(0.32, Math.min(node.width - 0.01, 0.76)),
40
+ depth: Math.max(0.28, Math.min(node.depth - 0.04, 0.53)),
41
+ };
42
+ }
43
+ export const FAUCET_BASE_RADIUS = 0.032;
44
+ export function sinkFaucetFootprint(bowls) {
45
+ const minX = Math.min(...bowls.map((bowl) => bowl.centerX - bowl.width / 2));
46
+ const maxX = Math.max(...bowls.map((bowl) => bowl.centerX + bowl.width / 2));
47
+ return {
48
+ x: (minX + maxX) / 2,
49
+ z: -bowls[0].depth / 2 - FAUCET_SETBACK,
50
+ radius: FAUCET_BASE_RADIUS,
51
+ };
52
+ }
@@ -0,0 +1,173 @@
1
+ import type { CabinetNode, GeometryContext } from '@pascal-app/core';
2
+ import { type SinkBowlSpec } from './appliance-layout';
3
+ export type CabinetSlab = {
4
+ size: [number, number, number];
5
+ position: [number, number, number];
6
+ };
7
+ export type RunSinkCut = {
8
+ bowls: SinkBowlSpec[];
9
+ x: number;
10
+ z: number;
11
+ };
12
+ export declare function getCabinetCountertopLayout(node: CabinetNode, ctx?: GeometryContext): {
13
+ span: import("./run-layout").RunSpan;
14
+ modules: {
15
+ object: "node";
16
+ parentId: string | null;
17
+ visible: boolean;
18
+ metadata: Record<string, unknown>;
19
+ position: [number, number, number];
20
+ rotation: number;
21
+ width: number;
22
+ depth: number;
23
+ carcassHeight: number;
24
+ operationState: number;
25
+ plinthHeight: number;
26
+ toeKickDepth: number;
27
+ boardThickness: number;
28
+ countertopThickness: number;
29
+ countertopOverhang: number;
30
+ countertopBackOverhang: number;
31
+ withFinishedBack: boolean;
32
+ frontThickness: number;
33
+ frontGap: number;
34
+ frontStyle: "slab" | "shaker" | "raised-arch";
35
+ panelReady: boolean;
36
+ handleStyle: "none" | "bar" | "cutout" | "hole" | "knob";
37
+ handlePosition: "center" | "top" | "auto";
38
+ frontOverlay: "full" | "inset";
39
+ withBottomPanel: boolean;
40
+ showPlinth: boolean;
41
+ withCountertop: boolean;
42
+ id: `cabinet-module_${string}`;
43
+ type: "cabinet-module";
44
+ children: string[];
45
+ cabinetType: "base" | "tall";
46
+ moduleKind: "standard" | "corner-filler";
47
+ topFinish: "trim" | "none" | "top-cabinet";
48
+ topFinishHeight: number;
49
+ topFinishDepth: number;
50
+ name?: string | undefined;
51
+ camera?: {
52
+ position: [number, number, number];
53
+ target: [number, number, number];
54
+ mode: "perspective" | "orthographic";
55
+ fov?: number | undefined;
56
+ zoom?: number | undefined;
57
+ } | undefined;
58
+ supportSlabId?: string | undefined;
59
+ material?: {
60
+ id?: string | undefined;
61
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
62
+ properties?: {
63
+ color: string;
64
+ roughness: number;
65
+ metalness: number;
66
+ opacity: number;
67
+ transparent: boolean;
68
+ side: "front" | "back" | "double";
69
+ } | undefined;
70
+ texture?: {
71
+ url: string;
72
+ repeat?: [number, number] | undefined;
73
+ scale?: number | undefined;
74
+ } | undefined;
75
+ } | undefined;
76
+ materialPreset?: string | undefined;
77
+ slots?: Record<string, string> | undefined;
78
+ stack?: ({
79
+ type: "shelf";
80
+ id: string;
81
+ shelfCount?: number | undefined;
82
+ height?: number | undefined;
83
+ } | {
84
+ type: "drawer";
85
+ id: string;
86
+ drawerCount?: number | undefined;
87
+ height?: number | undefined;
88
+ } | {
89
+ type: "door";
90
+ id: string;
91
+ doorType?: "glass" | "double" | "single-left" | "single-right" | undefined;
92
+ shelfCount?: number | undefined;
93
+ height?: number | undefined;
94
+ } | {
95
+ type: "sink";
96
+ id: string;
97
+ sinkLayout?: "single" | "double" | "double-offset" | undefined;
98
+ height?: number | undefined;
99
+ } | {
100
+ type: "oven";
101
+ id: string;
102
+ height?: number | undefined;
103
+ } | {
104
+ type: "microwave";
105
+ id: string;
106
+ height?: number | undefined;
107
+ } | {
108
+ type: "dishwasher";
109
+ id: string;
110
+ height?: number | undefined;
111
+ } | {
112
+ type: "cooktop-gas";
113
+ id: string;
114
+ cooktopLayout?: "gas-2burner" | "gas-4burner" | "gas-5burner-wok" | "gas-6burner" | undefined;
115
+ cooktopBurnersOn?: boolean | undefined;
116
+ cooktopActiveBurners?: number[] | undefined;
117
+ cooktopKnobProgress?: number[] | undefined;
118
+ cooktopShowGrate?: boolean | undefined;
119
+ height?: number | undefined;
120
+ } | {
121
+ type: "cooktop-induction";
122
+ id: string;
123
+ cooktopLayout?: "induction-2zone" | "induction-4zone" | undefined;
124
+ cooktopBurnersOn?: boolean | undefined;
125
+ cooktopActiveBurners?: number[] | undefined;
126
+ cooktopKnobProgress?: number[] | undefined;
127
+ cooktopShowGrate?: boolean | undefined;
128
+ height?: number | undefined;
129
+ } | {
130
+ type: "pull-out-pantry";
131
+ id: string;
132
+ shelfCount?: number | undefined;
133
+ pantryRackStyle?: "glass" | "wire" | "tray" | undefined;
134
+ height?: number | undefined;
135
+ } | {
136
+ type: "fridge-single";
137
+ id: string;
138
+ height?: number | undefined;
139
+ } | {
140
+ type: "fridge-double";
141
+ id: string;
142
+ height?: number | undefined;
143
+ } | {
144
+ type: "fridge-top-freezer";
145
+ id: string;
146
+ height?: number | undefined;
147
+ } | {
148
+ type: "fridge-bottom-freezer";
149
+ id: string;
150
+ height?: number | undefined;
151
+ } | {
152
+ type: "hood-pyramid";
153
+ id: string;
154
+ height?: number | undefined;
155
+ } | {
156
+ type: "hood-curved-glass";
157
+ id: string;
158
+ height?: number | undefined;
159
+ })[] | undefined;
160
+ openSide?: "left" | "right" | undefined;
161
+ cornerShelf?: boolean | undefined;
162
+ }[];
163
+ ends: import("./run-layout").RunSpanEnds;
164
+ backOverhang: number;
165
+ countertop: CabinetSlab | null;
166
+ bar: {
167
+ slab: CabinetSlab;
168
+ support: CabinetSlab;
169
+ edge: NonNullable<CabinetNode["barLedge"]>["edge"];
170
+ } | null;
171
+ sinkCuts: RunSinkCut[];
172
+ }[];
173
+ //# sourceMappingURL=countertop-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"countertop-layout.d.ts","sourceRoot":"","sources":["../../src/cabinet/countertop-layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvF,OAAO,EAAE,KAAK,YAAY,EAAa,MAAM,oBAAoB,CAAA;AAIjE,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAExE,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA8BvE,WAAW;iBACR,WAAW;cACd,WAAW,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;;;IA4DvD"}
@@ -0,0 +1,80 @@
1
+ import { sinkBowls } from './appliance-layout';
2
+ import { getRunSpanEnds, getRunSpanGroups } from './run-layout';
3
+ import { compartmentSinkLayout } from './stack';
4
+ export function getCabinetCountertopLayout(node, ctx) {
5
+ const modules = (ctx?.children ?? []).filter((child) => child.type === 'cabinet-module');
6
+ const groups = getRunSpanGroups(modules, { runTier: node.runTier });
7
+ const ends = getRunSpanEnds(node, ctx, groups.map(({ span }) => span));
8
+ // A back bar replaces the seating overhang; side bars leave it alone.
9
+ const backOverhang = node.withCountertop && node.barLedge?.edge !== 'back' ? node.countertopBackOverhang : 0;
10
+ return groups.map(({ span, modules: spanModules }, index) => {
11
+ const spanEnds = ends[index];
12
+ const { leftOverhang, rightOverhang } = spanEnds;
13
+ const width = span.width + leftOverhang + rightOverhang;
14
+ const centerX = span.centerX + (rightOverhang - leftOverhang) / 2;
15
+ const depth = span.depth + node.countertopOverhang + backOverhang;
16
+ const centerZ = span.centerZ + (node.countertopOverhang - backOverhang) / 2;
17
+ const countertop = node.withCountertop && span.hasCountertop && node.countertopThickness > 0
18
+ ? {
19
+ size: [width, node.countertopThickness, depth],
20
+ position: [centerX, span.topY + node.countertopThickness / 2, centerZ],
21
+ }
22
+ : null;
23
+ const ledge = node.barLedge;
24
+ let bar = null;
25
+ if (ledge &&
26
+ span.hasCountertop &&
27
+ (ledge.edge === 'back' ||
28
+ (ledge.edge === 'left' && index === 0) ||
29
+ (ledge.edge === 'right' && index === groups.length - 1))) {
30
+ const thickness = Math.max(node.countertopThickness, 0.02);
31
+ const height = Math.max(0.1, ledge.height - thickness);
32
+ if (ledge.edge === 'back') {
33
+ const backZ = span.minZ - (node.withFinishedBack ? node.boardThickness : 0);
34
+ bar = {
35
+ edge: ledge.edge,
36
+ support: {
37
+ size: [width, height, node.boardThickness],
38
+ position: [centerX, height / 2, backZ - node.boardThickness / 2],
39
+ },
40
+ slab: {
41
+ size: [width, thickness, ledge.depth],
42
+ position: [centerX, height + thickness / 2, backZ - ledge.depth / 2],
43
+ },
44
+ };
45
+ }
46
+ else {
47
+ const sign = ledge.edge === 'left' ? -1 : 1;
48
+ const edgeX = ledge.edge === 'left' ? span.minX : span.maxX;
49
+ bar = {
50
+ edge: ledge.edge,
51
+ support: {
52
+ size: [node.boardThickness, height, depth],
53
+ position: [edgeX + (sign * node.boardThickness) / 2, height / 2, centerZ],
54
+ },
55
+ slab: {
56
+ size: [ledge.depth, thickness, depth],
57
+ position: [edgeX + (sign * ledge.depth) / 2, height + thickness / 2, centerZ],
58
+ },
59
+ };
60
+ }
61
+ }
62
+ const sinkCuts = [];
63
+ if (countertop) {
64
+ for (const module of modules) {
65
+ if (module.position[0] < span.minX - 1e-4 || module.position[0] > span.maxX + 1e-4)
66
+ continue;
67
+ // The default stack contains only storage; avoid generating compartment IDs in a query.
68
+ const sink = module.stack?.find((compartment) => compartment.type === 'sink');
69
+ if (!sink)
70
+ continue;
71
+ sinkCuts.push({
72
+ bowls: sinkBowls(compartmentSinkLayout(sink), Math.max(0.01, module.width - 2 * module.boardThickness), module.depth),
73
+ x: module.position[0],
74
+ z: module.position[2],
75
+ });
76
+ }
77
+ }
78
+ return { span, modules: spanModules, ends: spanEnds, backOverhang, countertop, bar, sinkCuts };
79
+ });
80
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/cabinet/definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EAET,WAAW,IAAI,eAAe,EAG9B,oBAAoB,EAMpB,cAAc,EACd,QAAQ,EACT,MAAM,kBAAkB,CAAA;AAwDzB,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAuKzD,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,eAAe,EACrB,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,GAC3C,oBAAoB,EAAE,CAcxB;AAiKD,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAA;IAC1B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,GAC1C,mBAAmB,CAWrB;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,SAAS,mBAAmB,EAAE,EAC1C,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAgD9B;AAED,oEAAoE;AACpE,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAaxE;AA6uDD,eAAO,MAAM,iBAAiB,EAAE,cAAc,CAAC,OAAO,WAAW,CAwMhE,CAAA;AAED,eAAO,MAAM,uBAAuB,EAAE,cAAc,CAAC,OAAO,iBAAiB,CAmK5E,CAAA"}
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/cabinet/definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EAET,WAAW,IAAI,eAAe,EAG9B,oBAAoB,EAMpB,cAAc,EACd,QAAQ,EACT,MAAM,kBAAkB,CAAA;AAyDzB,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAwKzD,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,eAAe,EACrB,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,GAC3C,oBAAoB,EAAE,CAcxB;AAiKD,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAA;IAC1B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,GAC1C,mBAAmB,CAWrB;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,SAAS,mBAAmB,EAAE,EAC1C,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAgD9B;AAED,oEAAoE;AACpE,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAexE;AAgvDD,eAAO,MAAM,iBAAiB,EAAE,cAAc,CAAC,OAAO,WAAW,CA+MhE,CAAA;AAED,eAAO,MAAM,uBAAuB,EAAE,cAAc,CAAC,OAAO,iBAAiB,CA0K5E,CAAA"}
@@ -5,6 +5,7 @@ import { buildCabinetFloorplan, buildCabinetModuleFloorplan } from './floorplan'
5
5
  import { cabinetModuleFloorplanMoveTarget } from './floorplan-move';
6
6
  import { cabinetFloorplanSiblingOverrides } from './floorplan-overrides';
7
7
  import { buildCabinetGeometry } from './geometry';
8
+ import { withCabinetHostedChildren } from './hosted-resize';
8
9
  import { toggleCabinetOperationState } from './interaction';
9
10
  import { cabinetModuleParentFrame } from './move-frame';
10
11
  import { cabinetPaint } from './paint';
@@ -21,6 +22,7 @@ import { cabinetSceneAction } from './scene-action';
21
22
  import { CabinetModuleNode, CabinetNode } from './schema';
22
23
  import { cabinetSlots } from './slots';
23
24
  import { backAnchoredModuleZ, isHoodCompartmentType, minCabinetCarcassHeightForStack, stackForCabinet, } from './stack';
25
+ import { cabinetModuleSurfaceProvider, cabinetSurfaceProvider } from './surfaces';
24
26
  import { cabinetFloorplanAffectedIds, cabinetTreeChildIds, cabinetTreeHidden, cabinetTreeLabel, } from './tree-structure';
25
27
  import { findClosestCabinetWallInPlan, resolveCabinetModuleWallSnapLocal, resolveCabinetRunWallSnap, resolveCabinetWallFaceOffset, } from './wall-snap';
26
28
  function isCabinetDuplicableNode(node) {
@@ -334,7 +336,7 @@ export function cabinetRunNeighborSignature(run) {
334
336
  run.carcassHeight,
335
337
  run.runTier,
336
338
  run.countertopOverhang,
337
- run.children ?? [],
339
+ (run.children ?? []).filter((id) => id.startsWith('cabinet_') || id.startsWith('cabinet-module_')),
338
340
  cabinetLayoutRevision(run.metadata),
339
341
  ]);
340
342
  }
@@ -1698,7 +1700,8 @@ function cabinetRotateHandle() {
1698
1700
  };
1699
1701
  }
1700
1702
  function cabinetHandles(node, sceneApi) {
1701
- if ((node.children ?? []).length > 0) {
1703
+ const structuralChildren = (node.children ?? []).filter((id) => id.startsWith('cabinet_') || id.startsWith('cabinet-module_'));
1704
+ if (structuralChildren.length > 0) {
1702
1705
  const connectedRuns = sceneApi && node.runTier === 'base' ? connectedBaseRuns(node, sceneApi) : [];
1703
1706
  const depthHandles = sceneApi
1704
1707
  ? connectedRuns.map((run) => cabinetConnectedRunDepthHandle(node, run, sceneApi))
@@ -1715,7 +1718,7 @@ function cabinetHandles(node, sceneApi) {
1715
1718
  cabinetHeightHandle(),
1716
1719
  cabinetRotateHandle(),
1717
1720
  ];
1718
- if ((node.children ?? []).length === 0) {
1721
+ if (structuralChildren.length === 0) {
1719
1722
  handles.unshift(cabinetWidthHandle('left'), cabinetWidthHandle('right'));
1720
1723
  }
1721
1724
  return handles;
@@ -1798,6 +1801,7 @@ export const cabinetDefinition = {
1798
1801
  // material / materialPreset left undefined — paint mode writes slot refs.
1799
1802
  }),
1800
1803
  capabilities: {
1804
+ surfacePlacement: 'floor-only',
1801
1805
  selectable: { hitVolume: 'bbox' },
1802
1806
  movable: {
1803
1807
  axes: ['x', 'z'],
@@ -1821,6 +1825,7 @@ export const cabinetDefinition = {
1821
1825
  duplicable: { subtree: true, prepareSubtreeClone: prepareCabinetSubtreeClone },
1822
1826
  deletable: true,
1823
1827
  surfaces: {
1828
+ hosting: cabinetSurfaceProvider,
1824
1829
  top: {
1825
1830
  height: (node, context) => cabinetLocalBounds(node, context.nodes).maxY,
1826
1831
  },
@@ -1845,10 +1850,10 @@ export const cabinetDefinition = {
1845
1850
  // Dirty-cascade: a dirtied run re-marks its hosted modules so their
1846
1851
  // composite geometry re-flows with the run (see `cascadeDirty`).
1847
1852
  relations: {
1848
- hosts: ['cabinet', 'cabinet-module'],
1853
+ hosts: ['cabinet', 'cabinet-module', 'item', 'procedural-item'],
1849
1854
  },
1850
1855
  parametrics: cabinetParametrics,
1851
- handles: cabinetHandles,
1856
+ handles: (node, sceneApi) => cabinetHandles(node, sceneApi).map(withCabinetHostedChildren),
1852
1857
  geometry: buildCabinetGeometry,
1853
1858
  exportAnimation: ({ node, object }) => bakeCabinetAnimationClip(node, object),
1854
1859
  system: {
@@ -1857,6 +1862,7 @@ export const cabinetDefinition = {
1857
1862
  },
1858
1863
  // `operationState` is deliberately absent — door/drawer poses are applied
1859
1864
  // per-frame by the cabinet animation system, not by geometry rebuilds.
1865
+ geometryChildTypes: ['cabinet', 'cabinet-module'],
1860
1866
  geometryKey: (n) => JSON.stringify([
1861
1867
  n.width,
1862
1868
  n.depth,
@@ -1890,7 +1896,7 @@ export const cabinetDefinition = {
1890
1896
  // overhang re-trims against the neighbor's new spans (the neighbor's
1891
1897
  // own fields never appear in this key).
1892
1898
  JSON.stringify(cabinetAdjacencyRevision(n.metadata)),
1893
- JSON.stringify(n.children ?? []),
1899
+ JSON.stringify((n.children ?? []).filter((id) => id.startsWith('cabinet_') || id.startsWith('cabinet-module_'))),
1894
1900
  JSON.stringify(n.stack ?? null),
1895
1901
  ]),
1896
1902
  floorplan: buildCabinetFloorplan,
@@ -1990,6 +1996,7 @@ export const cabinetModuleDefinition = {
1990
1996
  }),
1991
1997
  capabilities: {
1992
1998
  selectable: { hitVolume: 'bbox' },
1999
+ surfaces: { hosting: cabinetModuleSurfaceProvider },
1993
2000
  movable: {
1994
2001
  axes: ['x', 'z'],
1995
2002
  directDrag: true,
@@ -2022,11 +2029,13 @@ export const cabinetModuleDefinition = {
2022
2029
  sceneAction: cabinetSceneAction,
2023
2030
  slots: () => cabinetSlots(),
2024
2031
  },
2032
+ relations: { hosts: ['cabinet', 'cabinet-module', 'item', 'procedural-item'] },
2025
2033
  parametrics: cabinetModuleParametrics,
2026
- handles: cabinetModuleHandles,
2034
+ handles: () => cabinetModuleHandles().map(withCabinetHostedChildren),
2027
2035
  geometry: buildCabinetGeometry,
2028
2036
  exportAnimation: ({ node, object }) => bakeCabinetAnimationClip(node, object),
2029
2037
  // `operationState` is deliberately absent — see cabinetDefinition.geometryKey.
2038
+ geometryChildTypes: ['cabinet', 'cabinet-module'],
2030
2039
  geometryKey: (n) => JSON.stringify([
2031
2040
  n.cabinetType,
2032
2041
  n.moduleKind,
@@ -2056,7 +2065,7 @@ export const cabinetModuleDefinition = {
2056
2065
  JSON.stringify(n.material ?? null),
2057
2066
  JSON.stringify(n.materialPreset ?? null),
2058
2067
  JSON.stringify(n.slots ?? null),
2059
- JSON.stringify(n.children ?? []),
2068
+ JSON.stringify((n.children ?? []).filter((id) => id.startsWith('cabinet_') || id.startsWith('cabinet-module_'))),
2060
2069
  JSON.stringify(n.stack ?? null),
2061
2070
  ]),
2062
2071
  floorplan: buildCabinetModuleFloorplan,
@@ -1 +1 @@
1
- {"version":3,"file":"cooktop.d.ts","sourceRoot":"","sources":["../../../src/cabinet/geometry/cooktop.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,EAMN,MAAM,OAAO,CAAA;AAOd,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,6BAA6B,EAClC,KAAK,aAAa,EAMnB,MAAM,UAAU,CAAA;AACjB,OAAO,EAGL,KAAK,mBAAmB,EAWzB,MAAM,UAAU,CAAA;AAEjB,eAAO,MAAM,qBAAqB,QAAQ,CAAA;AAC1C,MAAM,MAAM,iBAAiB,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AA+BtE,MAAM,MAAM,iBAAiB,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAgBhG,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,iBAAiB,EAAE,CASxE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,iBAAiB,EAAE,CAMzE;AA+SD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,mBAAmB,EACzB,WAAW,EAAE,kBAAkB,EAC/B,IAAI,EAAE,6BAA6B,EACnC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,QAoJd"}
1
+ {"version":3,"file":"cooktop.d.ts","sourceRoot":"","sources":["../../../src/cabinet/geometry/cooktop.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,EAMN,MAAM,OAAO,CAAA;AAQd,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,6BAA6B,EAClC,KAAK,aAAa,EAMnB,MAAM,UAAU,CAAA;AACjB,OAAO,EAGL,KAAK,mBAAmB,EAWzB,MAAM,UAAU,CAAA;AAEjB,eAAO,MAAM,qBAAqB,QAAQ,CAAA;AAC1C,MAAM,MAAM,iBAAiB,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AA+BtE,MAAM,MAAM,iBAAiB,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAgBhG,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,iBAAiB,EAAE,CASxE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,iBAAiB,EAAE,CAMzE;AA+SD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,mBAAmB,EACzB,WAAW,EAAE,kBAAkB,EAC/B,IAAI,EAAE,6BAA6B,EACnC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,QAmJd"}
@@ -1,4 +1,5 @@
1
1
  import { AdditiveBlending, BoxGeometry, CylinderGeometry, DoubleSide, Group, Mesh, MeshBasicMaterial, RingGeometry, SphereGeometry, TorusGeometry, } from 'three';
2
+ import { cooktopFootprint } from '../appliance-layout';
2
3
  import { COOKTOP_FLAME_COUNT, cooktopFlameSeed, createCooktopFlameGeometry, updateCooktopFlameTube, } from '../cooktop-flame';
3
4
  import { compartmentCooktopActiveBurners, compartmentCooktopBurnersOn, compartmentCooktopKnobProgress, compartmentCooktopLayout, compartmentCooktopShowGrate, } from '../stack';
4
5
  import { addBox, applianceDisplayMaterial, cooktopBurnerMaterial, cooktopGlassMaterial, cooktopGrateMaterial, cooktopInductionActiveZoneMaterial, cooktopInductionZoneMaterial, cooktopKnobHitMaterial, cooktopKnobOnMaterial, cooktopTrimMaterial, createWorldScaleBoxGeometry, stampSlot, } from './shared';
@@ -192,8 +193,7 @@ export function addCooktopCompartment(group, node, compartment, type, topY, inde
192
193
  const knobProgress = compartmentCooktopKnobProgress(compartment, type);
193
194
  const burnersOn = activeBurners.size > 0 || compartmentCooktopBurnersOn(compartment);
194
195
  const name = type === 'cooktop-gas' ? `cabinet-cooktop-gas-${index}` : `cabinet-cooktop-induction-${index}`;
195
- const frameWidth = Math.max(0.32, Math.min(node.width - 0.01, 0.76));
196
- const frameDepth = Math.max(0.28, Math.min(node.depth - 0.04, 0.53));
196
+ const { width: frameWidth, depth: frameDepth } = cooktopFootprint(node);
197
197
  const surfaceWidth = Math.max(0.28, frameWidth - 0.026);
198
198
  const surfaceDepth = Math.max(0.24, frameDepth - 0.026);
199
199
  const surfaceThickness = 0.012;
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cabinet/geometry/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvF,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACpE,OAAO,EAAE,KAAK,EAAQ,MAAM,OAAO,CAAA;AAOnC,wBAAgB,aAAa,CAAC,GAAG,CAAC,EAAE,eAAe,GAAG,iBAAiB,EAAE,CAIxE;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,eAAe,GAAG,SAAS,EAChC,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,OAAO,EACjB,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,KAAK,GAAG,IAAI,CAmNd"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cabinet/geometry/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvF,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACpE,OAAO,EAAE,KAAK,EAAQ,MAAM,OAAO,CAAA;AAMnC,wBAAgB,aAAa,CAAC,GAAG,CAAC,EAAE,eAAe,GAAG,iBAAiB,EAAE,CAIxE;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,eAAe,GAAG,SAAS,EAChC,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,OAAO,EACjB,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,KAAK,GAAG,IAAI,CAoId"}
@@ -1,9 +1,8 @@
1
1
  import { Group, Mesh } from 'three';
2
- import { getRunSpanEnds, getRunSpans } from '../run-layout';
3
- import { compartmentSinkLayout, stackForCabinet } from '../stack';
2
+ import { getCabinetCountertopLayout } from '../countertop-layout';
4
3
  import { buildFrontGeometry } from './fronts';
5
4
  import { addBox, getCabinetSlotMaterials } from './shared';
6
- import { cutSinkIntoCountertop, sinkBowls } from './sink';
5
+ import { cutSinkIntoCountertop } from './sink';
7
6
  export function getRunModules(ctx) {
8
7
  return (ctx?.children ?? []).filter((child) => child.type === 'cabinet-module');
9
8
  }
@@ -14,15 +13,9 @@ export function buildCabinetRunGeometry(node, ctx, shading, textures, colorPrese
14
13
  const group = new Group();
15
14
  const materials = getCabinetSlotMaterials(node, ctx, shading, textures, colorPreset, sceneTheme);
16
15
  const plinth = node.showPlinth ? node.plinthHeight : 0;
17
- // A back-edge bar ledge occupies the back edge, superseding the seating
18
- // overhang; side-edge bars leave it alone.
19
- const backOverhang = node.withCountertop && node.barLedge?.edge !== 'back' ? node.countertopBackOverhang : 0;
20
- const spans = getRunSpans(modules, { runTier: node.runTier });
21
- const spanEnds = getRunSpanEnds(node, ctx, spans);
22
- for (const span of spans) {
23
- const spanIndex = spans.indexOf(span);
24
- const barEdge = node.barLedge?.edge;
25
- const { leftOverhang, rightOverhang, exposedLeft, exposedRight } = spanEnds[spanIndex];
16
+ for (const layout of getCabinetCountertopLayout(node, ctx)) {
17
+ const { span, backOverhang, countertop: slab, bar, sinkCuts } = layout;
18
+ const { leftOverhang, rightOverhang, exposedLeft, exposedRight } = layout.ends;
26
19
  const toeKickDepth = node.showPlinth
27
20
  ? Math.min(node.toeKickDepth, span.depth - node.boardThickness * 2)
28
21
  : 0;
@@ -52,39 +45,9 @@ export function buildCabinetRunGeometry(node, ctx, shading, textures, colorPrese
52
45
  group.add(endPanel);
53
46
  }
54
47
  }
55
- // Raised bar counter: knee wall against one run face topped by a slab at
56
- // bar height, cantilevered outward as knee space for stools. Side bars
57
- // apply only to the run's end span on that side.
58
- const spanHasBar = node.barLedge &&
59
- span.hasCountertop &&
60
- (barEdge === 'back' ||
61
- (barEdge === 'left' && spanIndex === 0) ||
62
- (barEdge === 'right' && spanIndex === spans.length - 1));
63
- if (node.barLedge && spanHasBar) {
64
- const slabThickness = Math.max(node.countertopThickness, 0.02);
65
- const supportHeight = Math.max(0.1, node.barLedge.height - slabThickness);
66
- // Knee wall spans the slab's full footprint on the shared axis so the
67
- // two faces stay flush — a carcass-sized wall reads as a seam under
68
- // the wider slab.
69
- if (barEdge === 'back') {
70
- const backZ = span.minZ - (node.withFinishedBack ? node.boardThickness : 0);
71
- const barWidth = span.width + leftOverhang + rightOverhang;
72
- const barCenterX = span.centerX + (rightOverhang - leftOverhang) / 2;
73
- addBox(group, [barWidth, supportHeight, node.boardThickness], [barCenterX, supportHeight / 2, backZ - node.boardThickness / 2], materials.front, 'cabinet-run-bar-support', 'front');
74
- addBox(group, [barWidth, slabThickness, node.barLedge.depth], [barCenterX, supportHeight + slabThickness / 2, backZ - node.barLedge.depth / 2], materials.countertop, 'cabinet-run-bar-slab', 'countertop');
75
- }
76
- else {
77
- const sign = barEdge === 'left' ? -1 : 1;
78
- const edgeX = barEdge === 'left' ? span.minX : span.maxX;
79
- const slabDepth = span.depth + node.countertopOverhang + backOverhang;
80
- const slabCenterZ = span.centerZ + (node.countertopOverhang - backOverhang) / 2;
81
- addBox(group, [node.boardThickness, supportHeight, slabDepth], [edgeX + sign * (node.boardThickness / 2), supportHeight / 2, slabCenterZ], materials.front, 'cabinet-run-bar-support', 'front');
82
- addBox(group, [node.barLedge.depth, slabThickness, slabDepth], [
83
- edgeX + sign * (node.barLedge.depth / 2),
84
- supportHeight + slabThickness / 2,
85
- slabCenterZ,
86
- ], materials.countertop, 'cabinet-run-bar-slab', 'countertop');
87
- }
48
+ if (bar) {
49
+ addBox(group, bar.support.size, bar.support.position, materials.front, 'cabinet-run-bar-support', 'front');
50
+ addBox(group, bar.slab.size, bar.slab.position, materials.countertop, 'cabinet-run-bar-slab', 'countertop');
88
51
  }
89
52
  // Waterfall ends: the slab material drops to the floor on exposed run
90
53
  // ends (skipped where a neighbor abuts or a side bar occupies the end).
@@ -100,32 +63,8 @@ export function buildCabinetRunGeometry(node, ctx, shading, textures, colorPrese
100
63
  addBox(group, [node.countertopThickness, span.topY, slabDepth], [outerX - sign * (node.countertopThickness / 2), span.topY / 2, slabCenterZ], materials.countertop, `cabinet-run-waterfall-${side}`, 'countertop');
101
64
  }
102
65
  }
103
- if (node.withCountertop && span.hasCountertop && node.countertopThickness > 0) {
104
- const countertop = addBox(group, [
105
- span.width + leftOverhang + rightOverhang,
106
- node.countertopThickness,
107
- span.depth + node.countertopOverhang + backOverhang,
108
- ], [
109
- span.centerX + (rightOverhang - leftOverhang) / 2,
110
- span.topY + node.countertopThickness / 2,
111
- span.centerZ + (node.countertopOverhang - backOverhang) / 2,
112
- ], materials.countertop, 'cabinet-run-countertop', 'countertop');
113
- // Undermount sink modules cut their bowl openings out of the run's
114
- // slab (modules inside a run never own a countertop themselves).
115
- const sinkCuts = [];
116
- for (const module of modules) {
117
- if (module.position[0] < span.minX - 1e-4 || module.position[0] > span.maxX + 1e-4) {
118
- continue;
119
- }
120
- const sink = stackForCabinet(module).find((compartment) => compartment.type === 'sink');
121
- if (!sink)
122
- continue;
123
- sinkCuts.push({
124
- bowls: sinkBowls(compartmentSinkLayout(sink), Math.max(0.01, module.width - 2 * module.boardThickness), module.depth),
125
- x: module.position[0],
126
- z: module.position[2],
127
- });
128
- }
66
+ if (slab) {
67
+ const countertop = addBox(group, slab.size, slab.position, materials.countertop, 'cabinet-run-countertop', 'countertop');
129
68
  if (sinkCuts.length > 0) {
130
69
  group.remove(countertop);
131
70
  let cut = countertop;
@@ -1,16 +1,6 @@
1
1
  import { Group, type Material, Mesh } from 'three';
2
- import type { SinkLayout } from '../stack';
3
- export declare const FAUCET_SETBACK = 0.03;
4
- export type SinkBowlSpec = {
5
- centerX: number;
6
- width: number;
7
- depth: number;
8
- };
9
- /**
10
- * Bowl rects in module-local X/Z given the usable countertop footprint.
11
- * Shared by the 3D cut, the run-countertop cut, and the 2D floorplan symbol.
12
- */
13
- export declare function sinkBowls(layout: SinkLayout, usableWidth: number, usableDepth: number): SinkBowlSpec[];
2
+ import { type SinkBowlSpec } from '../appliance-layout';
3
+ export { FAUCET_SETBACK, type SinkBowlSpec, sinkBowls } from '../appliance-layout';
14
4
  /**
15
5
  * Subtract the sink bowl openings from a countertop mesh via three-bvh-csg.
16
6
  * `cutCenterX/Z` position the sink footprint in the countertop mesh's local
@@ -1 +1 @@
1
- {"version":3,"file":"sink.d.ts","sourceRoot":"","sources":["../../../src/cabinet/geometry/sink.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,KAAK,EACL,KAAK,QAAQ,EACb,IAAI,EAGL,MAAM,OAAO,CAAA;AACd,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAQ1C,eAAO,MAAM,cAAc,OAAO,CAAA;AAElC,MAAM,MAAM,YAAY,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAE5E;;;GAGG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,YAAY,EAAE,CAuBhB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,IAAI,EAChB,KAAK,EAAE,YAAY,EAAE,EACrB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,mBAAmB,EAAE,MAAM,GAC1B,IAAI,CA8BN;AAkUD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,YAAY,EAAE,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,mBAAmB,EAAE,MAAM,EAC3B,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,QAAQ,QAY5B"}
1
+ {"version":3,"file":"sink.d.ts","sourceRoot":"","sources":["../../../src/cabinet/geometry/sink.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,KAAK,EACL,KAAK,QAAQ,EACb,IAAI,EAGL,MAAM,OAAO,CAAA;AACd,OAAO,EAGL,KAAK,YAAY,EAGlB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAMlF;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,IAAI,EAChB,KAAK,EAAE,YAAY,EAAE,EACrB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,mBAAmB,EAAE,MAAM,GAC1B,IAAI,CA6BN;AAqUD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,YAAY,EAAE,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,mBAAmB,EAAE,MAAM,EAC3B,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,QAAQ,QAW5B"}