@pascal-app/nodes 0.1.1 → 1.0.0-beta.1

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 (408) hide show
  1. package/README.md +34 -0
  2. package/dist/building/definition.js +1 -1
  3. package/dist/cabinet/definition.d.ts.map +1 -1
  4. package/dist/cabinet/definition.js +809 -72
  5. package/dist/cabinet/geometry.d.ts.map +1 -1
  6. package/dist/cabinet/geometry.js +4 -0
  7. package/dist/cabinet/move-frame.js +3 -3
  8. package/dist/cabinet/panel.d.ts.map +1 -1
  9. package/dist/cabinet/panel.js +1 -0
  10. package/dist/cabinet/placement-snap.d.ts +8 -0
  11. package/dist/cabinet/placement-snap.d.ts.map +1 -0
  12. package/dist/cabinet/placement-snap.js +19 -0
  13. package/dist/cabinet/presets.js +8 -8
  14. package/dist/cabinet/quick-actions.d.ts.map +1 -1
  15. package/dist/cabinet/quick-actions.js +9 -3
  16. package/dist/cabinet/resize-limits.d.ts +11 -0
  17. package/dist/cabinet/resize-limits.d.ts.map +1 -0
  18. package/dist/cabinet/resize-limits.js +22 -0
  19. package/dist/cabinet/run-layout.d.ts +8 -2
  20. package/dist/cabinet/run-layout.d.ts.map +1 -1
  21. package/dist/cabinet/run-layout.js +59 -7
  22. package/dist/cabinet/run-ops.d.ts +44 -3
  23. package/dist/cabinet/run-ops.d.ts.map +1 -1
  24. package/dist/cabinet/run-ops.js +646 -110
  25. package/dist/cabinet/run-panel.d.ts +2 -1
  26. package/dist/cabinet/run-panel.d.ts.map +1 -1
  27. package/dist/cabinet/run-panel.js +38 -4
  28. package/dist/cabinet/stack-transitions.js +4 -4
  29. package/dist/cabinet/tool.d.ts.map +1 -1
  30. package/dist/cabinet/tool.js +95 -17
  31. package/dist/cabinet/wall-snap.d.ts.map +1 -1
  32. package/dist/cabinet/wall-snap.js +2 -6
  33. package/dist/ceiling/boundary-editor.d.ts.map +1 -1
  34. package/dist/ceiling/boundary-editor.js +2 -2
  35. package/dist/ceiling/definition.d.ts +1 -1
  36. package/dist/ceiling/definition.d.ts.map +1 -1
  37. package/dist/ceiling/definition.js +36 -5
  38. package/dist/ceiling/floorplan-affordances.d.ts +4 -4
  39. package/dist/ceiling/floorplan-move.d.ts +4 -4
  40. package/dist/ceiling/floorplan-move.d.ts.map +1 -1
  41. package/dist/ceiling/floorplan-move.js +5 -4
  42. package/dist/ceiling/hole-editor.d.ts.map +1 -1
  43. package/dist/ceiling/hole-editor.js +2 -2
  44. package/dist/ceiling/move-tool.d.ts.map +1 -1
  45. package/dist/ceiling/move-tool.js +4 -3
  46. package/dist/ceiling/panel.d.ts.map +1 -1
  47. package/dist/ceiling/panel.js +65 -3
  48. package/dist/ceiling/renderer.d.ts.map +1 -1
  49. package/dist/ceiling/renderer.js +6 -2
  50. package/dist/ceiling/tool.d.ts.map +1 -1
  51. package/dist/ceiling/tool.js +12 -1
  52. package/dist/chimney/definition.d.ts.map +1 -1
  53. package/dist/chimney/definition.js +1 -0
  54. package/dist/chimney/tool.d.ts.map +1 -1
  55. package/dist/chimney/tool.js +16 -1
  56. package/dist/column/definition.d.ts.map +1 -1
  57. package/dist/column/definition.js +14 -2
  58. package/dist/column/floorplan-affordances.d.ts.map +1 -1
  59. package/dist/column/floorplan-affordances.js +19 -14
  60. package/dist/column/floorplan-move.d.ts.map +1 -1
  61. package/dist/column/floorplan-move.js +7 -2
  62. package/dist/column/floorplan.d.ts +9 -1
  63. package/dist/column/floorplan.d.ts.map +1 -1
  64. package/dist/column/floorplan.js +59 -4
  65. package/dist/column/tool.d.ts.map +1 -1
  66. package/dist/column/tool.js +33 -7
  67. package/dist/construction-dimension/definition.d.ts +4 -0
  68. package/dist/construction-dimension/definition.d.ts.map +1 -0
  69. package/dist/construction-dimension/definition.js +83 -0
  70. package/dist/construction-dimension/drawing-coordination.d.ts +7 -0
  71. package/dist/construction-dimension/drawing-coordination.d.ts.map +1 -0
  72. package/dist/construction-dimension/drawing-coordination.js +54 -0
  73. package/dist/construction-dimension/floorplan-affordances.d.ts +4 -0
  74. package/dist/construction-dimension/floorplan-affordances.d.ts.map +1 -0
  75. package/dist/construction-dimension/floorplan-affordances.js +114 -0
  76. package/dist/construction-dimension/floorplan-tool.d.ts +21 -0
  77. package/dist/construction-dimension/floorplan-tool.d.ts.map +1 -0
  78. package/dist/construction-dimension/floorplan-tool.js +557 -0
  79. package/dist/construction-dimension/floorplan.d.ts +3 -0
  80. package/dist/construction-dimension/floorplan.d.ts.map +1 -0
  81. package/dist/construction-dimension/floorplan.js +457 -0
  82. package/dist/construction-dimension/geometry.d.ts +31 -0
  83. package/dist/construction-dimension/geometry.d.ts.map +1 -0
  84. package/dist/construction-dimension/geometry.js +144 -0
  85. package/dist/construction-dimension/index.d.ts +4 -0
  86. package/dist/construction-dimension/index.d.ts.map +1 -0
  87. package/dist/construction-dimension/index.js +3 -0
  88. package/dist/construction-dimension/panel.d.ts +2 -0
  89. package/dist/construction-dimension/panel.d.ts.map +1 -0
  90. package/dist/construction-dimension/panel.js +128 -0
  91. package/dist/construction-dimension/parametrics.d.ts +3 -0
  92. package/dist/construction-dimension/parametrics.d.ts.map +1 -0
  93. package/dist/construction-dimension/parametrics.js +4 -0
  94. package/dist/construction-dimension/schema.d.ts +2 -0
  95. package/dist/construction-dimension/schema.d.ts.map +1 -0
  96. package/dist/construction-dimension/schema.js +1 -0
  97. package/dist/door/contextual-dimensions.d.ts +3 -0
  98. package/dist/door/contextual-dimensions.d.ts.map +1 -0
  99. package/dist/door/contextual-dimensions.js +7 -0
  100. package/dist/door/definition.d.ts.map +1 -1
  101. package/dist/door/definition.js +13 -8
  102. package/dist/door/floorplan-affordances.d.ts +2 -5
  103. package/dist/door/floorplan-affordances.d.ts.map +1 -1
  104. package/dist/door/floorplan-affordances.js +9 -18
  105. package/dist/door/floorplan.d.ts +3 -4
  106. package/dist/door/floorplan.d.ts.map +1 -1
  107. package/dist/door/floorplan.js +88 -6
  108. package/dist/door/move-tool.d.ts.map +1 -1
  109. package/dist/door/move-tool.js +2 -2
  110. package/dist/door/panel.d.ts.map +1 -1
  111. package/dist/door/panel.js +3 -1
  112. package/dist/door/schema.d.ts +1 -1
  113. package/dist/door/schema.d.ts.map +1 -1
  114. package/dist/door/schema.js +1 -1
  115. package/dist/door/tool.d.ts.map +1 -1
  116. package/dist/door/tool.js +63 -6
  117. package/dist/dormer/definition.d.ts.map +1 -1
  118. package/dist/dormer/definition.js +1 -0
  119. package/dist/dormer/tool.d.ts.map +1 -1
  120. package/dist/dormer/tool.js +23 -1
  121. package/dist/duct-segment/tool.d.ts.map +1 -1
  122. package/dist/duct-segment/tool.js +20 -9
  123. package/dist/duct-terminal/tool.d.ts.map +1 -1
  124. package/dist/duct-terminal/tool.js +9 -6
  125. package/dist/elevator/floorplan-affordances.d.ts +2 -6
  126. package/dist/elevator/floorplan-affordances.d.ts.map +1 -1
  127. package/dist/elevator/floorplan-affordances.js +13 -12
  128. package/dist/fence/actions/move-endpoint.d.ts.map +1 -1
  129. package/dist/fence/actions/move-endpoint.js +29 -1
  130. package/dist/fence/definition.d.ts.map +1 -1
  131. package/dist/fence/definition.js +67 -14
  132. package/dist/fence/floorplan-affordances.d.ts.map +1 -1
  133. package/dist/fence/floorplan-affordances.js +48 -11
  134. package/dist/fence/floorplan-move.d.ts.map +1 -1
  135. package/dist/fence/floorplan-move.js +38 -3
  136. package/dist/fence/geometry.d.ts.map +1 -1
  137. package/dist/fence/geometry.js +9 -1
  138. package/dist/fence/lift.d.ts +15 -0
  139. package/dist/fence/lift.d.ts.map +1 -0
  140. package/dist/fence/lift.js +23 -0
  141. package/dist/fence/move-tool.d.ts.map +1 -1
  142. package/dist/fence/move-tool.js +25 -5
  143. package/dist/fence/system.d.ts +3 -0
  144. package/dist/fence/system.d.ts.map +1 -0
  145. package/dist/fence/system.js +41 -0
  146. package/dist/fence/tool.d.ts.map +1 -1
  147. package/dist/fence/tool.js +103 -32
  148. package/dist/hvac-equipment/tool.d.ts.map +1 -1
  149. package/dist/hvac-equipment/tool.js +8 -3
  150. package/dist/index.d.ts +2 -0
  151. package/dist/index.d.ts.map +1 -1
  152. package/dist/index.js +6 -0
  153. package/dist/item/definition.d.ts.map +1 -1
  154. package/dist/item/definition.js +7 -1
  155. package/dist/item/floorplan-move.d.ts.map +1 -1
  156. package/dist/item/floorplan-move.js +50 -43
  157. package/dist/item/floorplan.d.ts +1 -0
  158. package/dist/item/floorplan.d.ts.map +1 -1
  159. package/dist/item/floorplan.js +49 -0
  160. package/dist/item/renderer.d.ts +3 -0
  161. package/dist/item/renderer.d.ts.map +1 -1
  162. package/dist/item/renderer.js +96 -8
  163. package/dist/level/definition.d.ts.map +1 -1
  164. package/dist/level/definition.js +7 -3
  165. package/dist/lineset/tool.d.ts.map +1 -1
  166. package/dist/lineset/tool.js +5 -1
  167. package/dist/liquid-line/tool.d.ts.map +1 -1
  168. package/dist/liquid-line/tool.js +7 -1
  169. package/dist/measurement/definition.d.ts.map +1 -1
  170. package/dist/measurement/definition.js +5 -0
  171. package/dist/measurement/floorplan.d.ts.map +1 -1
  172. package/dist/measurement/floorplan.js +11 -10
  173. package/dist/measurement/index.d.ts +1 -1
  174. package/dist/measurement/index.d.ts.map +1 -1
  175. package/dist/measurement/index.js +1 -1
  176. package/dist/measurement/resolve.d.ts +5 -0
  177. package/dist/measurement/resolve.d.ts.map +1 -1
  178. package/dist/measurement/resolve.js +2 -2
  179. package/dist/measurement/surface-query.js +5 -5
  180. package/dist/measurement/tool.d.ts +6 -1
  181. package/dist/measurement/tool.d.ts.map +1 -1
  182. package/dist/measurement/tool.js +7 -11
  183. package/dist/pipe-segment/tool.d.ts.map +1 -1
  184. package/dist/pipe-segment/tool.js +22 -19
  185. package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
  186. package/dist/roof-segment/floorplan-affordances.js +14 -8
  187. package/dist/shared/construction-dimension-standards.d.ts +34 -0
  188. package/dist/shared/construction-dimension-standards.d.ts.map +1 -0
  189. package/dist/shared/construction-dimension-standards.js +18 -0
  190. package/dist/shared/construction-length.d.ts +10 -0
  191. package/dist/shared/construction-length.d.ts.map +1 -0
  192. package/dist/shared/construction-length.js +57 -0
  193. package/dist/shared/dimension-string.d.ts +20 -0
  194. package/dist/shared/dimension-string.d.ts.map +1 -0
  195. package/dist/shared/dimension-string.js +19 -0
  196. package/dist/shared/draft-axis-guides.d.ts +36 -0
  197. package/dist/shared/draft-axis-guides.d.ts.map +1 -0
  198. package/dist/shared/draft-axis-guides.js +107 -0
  199. package/dist/shared/move-roof-tool.d.ts.map +1 -1
  200. package/dist/shared/move-roof-tool.js +17 -3
  201. package/dist/shared/opening-documentation-fields.d.ts +16 -0
  202. package/dist/shared/opening-documentation-fields.d.ts.map +1 -0
  203. package/dist/shared/opening-documentation-fields.js +54 -0
  204. package/dist/shared/opening-documentation.d.ts +47 -0
  205. package/dist/shared/opening-documentation.d.ts.map +1 -0
  206. package/dist/shared/opening-documentation.js +300 -0
  207. package/dist/shared/opening-guides-runtime.d.ts.map +1 -1
  208. package/dist/shared/opening-guides-runtime.js +3 -2
  209. package/dist/shared/opening-placement-dimensions.d.ts.map +1 -1
  210. package/dist/shared/opening-placement-dimensions.js +14 -5
  211. package/dist/shared/wall-opening-ceiling.d.ts +30 -0
  212. package/dist/shared/wall-opening-ceiling.d.ts.map +1 -0
  213. package/dist/shared/wall-opening-ceiling.js +29 -0
  214. package/dist/shelf/floorplan-affordances.d.ts.map +1 -1
  215. package/dist/shelf/floorplan-affordances.js +10 -5
  216. package/dist/shelf/floorplan-move.d.ts +2 -16
  217. package/dist/shelf/floorplan-move.d.ts.map +1 -1
  218. package/dist/shelf/floorplan-move.js +19 -40
  219. package/dist/shelf/tool.d.ts.map +1 -1
  220. package/dist/shelf/tool.js +8 -3
  221. package/dist/site/recessed-slab-ground-holes.d.ts.map +1 -1
  222. package/dist/site/recessed-slab-ground-holes.js +1 -4
  223. package/dist/site/renderer.d.ts.map +1 -1
  224. package/dist/site/renderer.js +118 -28
  225. package/dist/site/terrain-drape.d.ts +91 -0
  226. package/dist/site/terrain-drape.d.ts.map +1 -0
  227. package/dist/site/terrain-drape.js +205 -0
  228. package/dist/site/terrain-geometry.d.ts +131 -0
  229. package/dist/site/terrain-geometry.d.ts.map +1 -0
  230. package/dist/site/terrain-geometry.js +259 -0
  231. package/dist/site/terrain-mesh.d.ts +49 -0
  232. package/dist/site/terrain-mesh.d.ts.map +1 -0
  233. package/dist/site/terrain-mesh.js +122 -0
  234. package/dist/site/terrain-renderer.d.ts +28 -0
  235. package/dist/site/terrain-renderer.d.ts.map +1 -0
  236. package/dist/site/terrain-renderer.js +69 -0
  237. package/dist/skylight/definition.d.ts.map +1 -1
  238. package/dist/skylight/definition.js +1 -0
  239. package/dist/skylight/tool.d.ts.map +1 -1
  240. package/dist/skylight/tool.js +16 -1
  241. package/dist/slab/definition.d.ts.map +1 -1
  242. package/dist/slab/definition.js +87 -10
  243. package/dist/slab/elevation-limit.d.ts +43 -0
  244. package/dist/slab/elevation-limit.d.ts.map +1 -0
  245. package/dist/slab/elevation-limit.js +124 -0
  246. package/dist/slab/floorplan-affordances.d.ts +16 -0
  247. package/dist/slab/floorplan-affordances.d.ts.map +1 -1
  248. package/dist/slab/geometry.d.ts.map +1 -1
  249. package/dist/slab/geometry.js +98 -5
  250. package/dist/slab/panel.d.ts.map +1 -1
  251. package/dist/slab/panel.js +82 -4
  252. package/dist/slab/parametrics.d.ts +1 -1
  253. package/dist/slab/parametrics.d.ts.map +1 -1
  254. package/dist/slab/parametrics.js +13 -1
  255. package/dist/slab/placement-ownership.d.ts +3 -0
  256. package/dist/slab/placement-ownership.d.ts.map +1 -0
  257. package/dist/slab/placement-ownership.js +3 -0
  258. package/dist/slab/quick-measurement.d.ts.map +1 -1
  259. package/dist/slab/quick-measurement.js +3 -2
  260. package/dist/slab/system.d.ts.map +1 -1
  261. package/dist/slab/system.js +14 -4
  262. package/dist/slab/tool.d.ts.map +1 -1
  263. package/dist/slab/tool.js +81 -23
  264. package/dist/solar-panel/definition.d.ts.map +1 -1
  265. package/dist/solar-panel/definition.js +1 -0
  266. package/dist/solar-panel/tool.d.ts.map +1 -1
  267. package/dist/solar-panel/tool.js +17 -1
  268. package/dist/spawn/definition.d.ts.map +1 -1
  269. package/dist/spawn/definition.js +1 -0
  270. package/dist/spawn/floorplan-affordances.d.ts.map +1 -1
  271. package/dist/spawn/floorplan-affordances.js +7 -4
  272. package/dist/spawn/floorplan-move.d.ts.map +1 -1
  273. package/dist/spawn/floorplan-move.js +8 -6
  274. package/dist/spawn/renderer.d.ts +4 -0
  275. package/dist/spawn/renderer.d.ts.map +1 -1
  276. package/dist/spawn/renderer.js +32 -18
  277. package/dist/spawn/tool.d.ts +2 -2
  278. package/dist/spawn/tool.d.ts.map +1 -1
  279. package/dist/spawn/tool.js +78 -11
  280. package/dist/stair/definition.d.ts.map +1 -1
  281. package/dist/stair/definition.js +15 -7
  282. package/dist/stair/destination.d.ts +16 -0
  283. package/dist/stair/destination.d.ts.map +1 -0
  284. package/dist/stair/destination.js +24 -0
  285. package/dist/stair/documentation.d.ts +8 -0
  286. package/dist/stair/documentation.d.ts.map +1 -0
  287. package/dist/stair/documentation.js +245 -0
  288. package/dist/stair/floor-stack.d.ts.map +1 -1
  289. package/dist/stair/floor-stack.js +38 -0
  290. package/dist/stair/floorplan-affordances.d.ts.map +1 -1
  291. package/dist/stair/floorplan-affordances.js +28 -9
  292. package/dist/stair/floorplan-move.d.ts +3 -5
  293. package/dist/stair/floorplan-move.d.ts.map +1 -1
  294. package/dist/stair/floorplan-move.js +14 -16
  295. package/dist/stair/floorplan.d.ts.map +1 -1
  296. package/dist/stair/floorplan.js +27 -14
  297. package/dist/stair/panel.d.ts.map +1 -1
  298. package/dist/stair/panel.js +35 -2
  299. package/dist/stair/renderer.d.ts.map +1 -1
  300. package/dist/stair/renderer.js +4 -3
  301. package/dist/structural-grid/coordination.d.ts +16 -0
  302. package/dist/structural-grid/coordination.d.ts.map +1 -0
  303. package/dist/structural-grid/coordination.js +105 -0
  304. package/dist/structural-grid/definition.d.ts +4 -0
  305. package/dist/structural-grid/definition.d.ts.map +1 -0
  306. package/dist/structural-grid/definition.js +51 -0
  307. package/dist/structural-grid/floorplan-tool.d.ts +16 -0
  308. package/dist/structural-grid/floorplan-tool.d.ts.map +1 -0
  309. package/dist/structural-grid/floorplan-tool.js +183 -0
  310. package/dist/structural-grid/floorplan.d.ts +3 -0
  311. package/dist/structural-grid/floorplan.d.ts.map +1 -0
  312. package/dist/structural-grid/floorplan.js +61 -0
  313. package/dist/structural-grid/index.d.ts +2 -0
  314. package/dist/structural-grid/index.d.ts.map +1 -0
  315. package/dist/structural-grid/index.js +1 -0
  316. package/dist/structural-grid/schema.d.ts +2 -0
  317. package/dist/structural-grid/schema.d.ts.map +1 -0
  318. package/dist/structural-grid/schema.js +1 -0
  319. package/dist/wall/construction-dimensions.d.ts +32 -0
  320. package/dist/wall/construction-dimensions.d.ts.map +1 -0
  321. package/dist/wall/construction-dimensions.js +1031 -0
  322. package/dist/wall/contextual-dimensions.d.ts +13 -0
  323. package/dist/wall/contextual-dimensions.d.ts.map +1 -0
  324. package/dist/wall/contextual-dimensions.js +221 -0
  325. package/dist/wall/definition.d.ts.map +1 -1
  326. package/dist/wall/definition.js +20 -1
  327. package/dist/wall/floorplan-affordances.d.ts.map +1 -1
  328. package/dist/wall/floorplan-affordances.js +23 -8
  329. package/dist/wall/floorplan-overrides.d.ts +9 -6
  330. package/dist/wall/floorplan-overrides.d.ts.map +1 -1
  331. package/dist/wall/floorplan-overrides.js +20 -11
  332. package/dist/wall/floorplan.d.ts +12 -3
  333. package/dist/wall/floorplan.d.ts.map +1 -1
  334. package/dist/wall/floorplan.js +121 -79
  335. package/dist/wall/measurement.d.ts.map +1 -1
  336. package/dist/wall/measurement.js +17 -4
  337. package/dist/wall/move-endpoint-tool.d.ts.map +1 -1
  338. package/dist/wall/move-endpoint-tool.js +74 -27
  339. package/dist/wall/move-shared.d.ts.map +1 -1
  340. package/dist/wall/move-shared.js +3 -2
  341. package/dist/wall/move-tool.d.ts.map +1 -1
  342. package/dist/wall/move-tool.js +15 -3
  343. package/dist/wall/paint.d.ts.map +1 -1
  344. package/dist/wall/paint.js +10 -6
  345. package/dist/wall/panel.d.ts.map +1 -1
  346. package/dist/wall/panel.js +32 -5
  347. package/dist/wall/parametrics.d.ts.map +1 -1
  348. package/dist/wall/parametrics.js +2 -0
  349. package/dist/wall/preview.d.ts +8 -0
  350. package/dist/wall/preview.d.ts.map +1 -0
  351. package/dist/wall/preview.js +39 -0
  352. package/dist/wall/quick-measurement.d.ts.map +1 -1
  353. package/dist/wall/quick-measurement.js +3 -2
  354. package/dist/wall/renderer.d.ts.map +1 -1
  355. package/dist/wall/renderer.js +7 -5
  356. package/dist/wall/system.d.ts +1 -1
  357. package/dist/wall/system.d.ts.map +1 -1
  358. package/dist/wall/system.js +37 -2
  359. package/dist/wall/tool.d.ts.map +1 -1
  360. package/dist/wall/tool.js +148 -96
  361. package/dist/wall/treatment-level-data.d.ts +14 -0
  362. package/dist/wall/treatment-level-data.d.ts.map +1 -0
  363. package/dist/wall/treatment-level-data.js +31 -0
  364. package/dist/wall/treatments.d.ts +8 -2
  365. package/dist/wall/treatments.d.ts.map +1 -1
  366. package/dist/wall/treatments.js +58 -15
  367. package/dist/window/contextual-dimensions.d.ts +3 -0
  368. package/dist/window/contextual-dimensions.d.ts.map +1 -0
  369. package/dist/window/contextual-dimensions.js +7 -0
  370. package/dist/window/definition.d.ts.map +1 -1
  371. package/dist/window/definition.js +15 -10
  372. package/dist/window/floorplan-affordances.d.ts +2 -5
  373. package/dist/window/floorplan-affordances.d.ts.map +1 -1
  374. package/dist/window/floorplan-affordances.js +9 -15
  375. package/dist/window/floorplan-move.d.ts.map +1 -1
  376. package/dist/window/floorplan-move.js +1 -1
  377. package/dist/window/floorplan.d.ts.map +1 -1
  378. package/dist/window/floorplan.js +7 -1
  379. package/dist/window/move-tool.d.ts.map +1 -1
  380. package/dist/window/move-tool.js +3 -3
  381. package/dist/window/panel.d.ts.map +1 -1
  382. package/dist/window/panel.js +4 -1
  383. package/dist/window/schema.d.ts +1 -1
  384. package/dist/window/schema.d.ts.map +1 -1
  385. package/dist/window/schema.js +1 -1
  386. package/dist/window/tool.d.ts.map +1 -1
  387. package/dist/window/tool.js +64 -7
  388. package/dist/window/window-math.d.ts +7 -3
  389. package/dist/window/window-math.d.ts.map +1 -1
  390. package/dist/window/window-math.js +8 -3
  391. package/dist/zone/contextual-dimensions.d.ts +3 -0
  392. package/dist/zone/contextual-dimensions.d.ts.map +1 -0
  393. package/dist/zone/contextual-dimensions.js +43 -0
  394. package/dist/zone/definition.d.ts.map +1 -1
  395. package/dist/zone/definition.js +9 -1
  396. package/dist/zone/floorplan-affordances.d.ts +36 -0
  397. package/dist/zone/floorplan-affordances.d.ts.map +1 -1
  398. package/dist/zone/floorplan.d.ts.map +1 -1
  399. package/dist/zone/floorplan.js +59 -3
  400. package/dist/zone/quantities-panel.d.ts.map +1 -1
  401. package/dist/zone/quantities-panel.js +48 -4
  402. package/dist/zone/room-clear-dimensions.d.ts +3 -0
  403. package/dist/zone/room-clear-dimensions.d.ts.map +1 -0
  404. package/dist/zone/room-clear-dimensions.js +406 -0
  405. package/dist/zone/room-documentation.d.ts +11 -0
  406. package/dist/zone/room-documentation.d.ts.map +1 -0
  407. package/dist/zone/room-documentation.js +97 -0
  408. package/package.json +7 -7
@@ -1,5 +1,5 @@
1
- import { snapScalar, useScene, } from '@pascal-app/core';
2
- import { getSegmentGridStep } from '@pascal-app/editor';
1
+ import { snapScalar, useLiveNodeOverrides, useScene, } from '@pascal-app/core';
2
+ import { getSegmentGridStep, isAngleSnapActive } from '@pascal-app/editor';
3
3
  import { createFloorplanCursorResolver } from '../shared/floorplan-cursor';
4
4
  import { rotateAffordanceDelta } from '../shared/rotate-affordance';
5
5
  const MIN_ROOF_DIM = 1;
@@ -67,14 +67,16 @@ export const roofSegmentResizeAffordance = {
67
67
  const snappedValue = step > 0 ? snapScalar(rawValue, step) : rawValue;
68
68
  const newValue = Math.max(MIN_ROOF_DIM, snappedValue);
69
69
  lastValue = newValue;
70
- useScene
70
+ useLiveNodeOverrides
71
71
  .getState()
72
- .updateNode(segmentId, axis === 'x' ? { width: newValue } : { depth: newValue });
72
+ .set(segmentId, axis === 'x' ? { width: newValue } : { depth: newValue });
73
+ useScene.getState().markDirty(segmentId);
73
74
  },
74
75
  canCommit() {
75
76
  return true;
76
77
  },
77
78
  commit() {
79
+ useLiveNodeOverrides.getState().clear(segmentId);
78
80
  useScene
79
81
  .getState()
80
82
  .updateNode(segmentId, axis === 'x' ? { width: lastValue } : { depth: lastValue });
@@ -99,20 +101,22 @@ export const roofSegmentRotateAffordance = {
99
101
  let lastRotation = initialRotation;
100
102
  return {
101
103
  affectedIds: [segmentId],
102
- apply({ planPoint, modifiers }) {
104
+ apply({ planPoint }) {
103
105
  const delta = rotateAffordanceDelta({
104
106
  center: [cx, cz],
105
107
  initialAngle,
106
108
  planPoint,
107
- free: modifiers.shiftKey,
109
+ free: !isAngleSnapActive(),
108
110
  });
109
111
  lastRotation = initialRotation - delta;
110
- useScene.getState().updateNode(segmentId, { rotation: lastRotation });
112
+ useLiveNodeOverrides.getState().set(segmentId, { rotation: lastRotation });
113
+ useScene.getState().markDirty(segmentId);
111
114
  },
112
115
  canCommit() {
113
116
  return true;
114
117
  },
115
118
  commit() {
119
+ useLiveNodeOverrides.getState().clear(segmentId);
116
120
  useScene.getState().updateNode(segmentId, { rotation: lastRotation });
117
121
  },
118
122
  };
@@ -158,12 +162,14 @@ export const roofSegmentMoveTarget = ({ node, nodes }) => {
158
162
  let localX = dx * cosRoof + dz * sinRoof;
159
163
  let localZ = -dx * sinRoof + dz * cosRoof;
160
164
  lastLocal = [localX, initialY, localZ];
161
- useScene.getState().updateNode(segmentId, { position: lastLocal });
165
+ useLiveNodeOverrides.getState().set(segmentId, { position: lastLocal });
166
+ useScene.getState().markDirty(segmentId);
162
167
  },
163
168
  canCommit() {
164
169
  return true;
165
170
  },
166
171
  commit() {
172
+ useLiveNodeOverrides.getState().clear(segmentId);
167
173
  useScene.getState().updateNode(segmentId, { position: lastLocal });
168
174
  },
169
175
  };
@@ -0,0 +1,34 @@
1
+ import type { DimensionTerminator, DimensionTextPosition } from '@pascal-app/core';
2
+ import type { ConstructionImperialPrecision, ConstructionMetricNotation } from './construction-length';
3
+ export type ConstructionDimensionDrawingStandard = {
4
+ datumPolicy: 'centerline' | 'wall-face' | 'structural-face' | 'finish-face';
5
+ intersectionReferencePolicy: 'single' | 'both-faces';
6
+ terminator: DimensionTerminator;
7
+ textPosition: DimensionTextPosition;
8
+ imperialPrecision: ConstructionImperialPrecision;
9
+ metricNotation: ConstructionMetricNotation;
10
+ openingChainOffset: number;
11
+ wallSpanOffset: number;
12
+ firstOpeningWidthOffset: number;
13
+ firstGeneralTierOffset: number;
14
+ tierSpacing: number;
15
+ extensionStartGap: number;
16
+ extensionOvershoot: number;
17
+ };
18
+ export declare const DEFAULT_CONSTRUCTION_DIMENSION_STANDARD: {
19
+ datumPolicy: "wall-face";
20
+ intersectionReferencePolicy: "single";
21
+ terminator: "architectural-tick";
22
+ textPosition: "above";
23
+ imperialPrecision: "1/16";
24
+ metricNotation: "meters";
25
+ openingChainOffset: number;
26
+ wallSpanOffset: number;
27
+ firstOpeningWidthOffset: number;
28
+ firstGeneralTierOffset: number;
29
+ tierSpacing: number;
30
+ extensionStartGap: number;
31
+ extensionOvershoot: number;
32
+ };
33
+ export declare function constructionDimensionStandard(overrides?: Partial<ConstructionDimensionDrawingStandard>): ConstructionDimensionDrawingStandard;
34
+ //# sourceMappingURL=construction-dimension-standards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"construction-dimension-standards.d.ts","sourceRoot":"","sources":["../../src/shared/construction-dimension-standards.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAClF,OAAO,KAAK,EACV,6BAA6B,EAC7B,0BAA0B,EAC3B,MAAM,uBAAuB,CAAA;AAE9B,MAAM,MAAM,oCAAoC,GAAG;IACjD,WAAW,EAAE,YAAY,GAAG,WAAW,GAAG,iBAAiB,GAAG,aAAa,CAAA;IAC3E,2BAA2B,EAAE,QAAQ,GAAG,YAAY,CAAA;IACpD,UAAU,EAAE,mBAAmB,CAAA;IAC/B,YAAY,EAAE,qBAAqB,CAAA;IACnC,iBAAiB,EAAE,6BAA6B,CAAA;IAChD,cAAc,EAAE,0BAA0B,CAAA;IAC1C,kBAAkB,EAAE,MAAM,CAAA;IAC1B,cAAc,EAAE,MAAM,CAAA;IACtB,uBAAuB,EAAE,MAAM,CAAA;IAC/B,sBAAsB,EAAE,MAAM,CAAA;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,eAAO,MAAM,uCAAuC;;;;;;;;;;;;;;CAcJ,CAAA;AAEhD,wBAAgB,6BAA6B,CAC3C,SAAS,GAAE,OAAO,CAAC,oCAAoC,CAAM,GAC5D,oCAAoC,CAEtC"}
@@ -0,0 +1,18 @@
1
+ export const DEFAULT_CONSTRUCTION_DIMENSION_STANDARD = {
2
+ datumPolicy: 'wall-face',
3
+ intersectionReferencePolicy: 'single',
4
+ terminator: 'architectural-tick',
5
+ textPosition: 'above',
6
+ imperialPrecision: '1/16',
7
+ metricNotation: 'meters',
8
+ openingChainOffset: 0.55,
9
+ wallSpanOffset: 1.05,
10
+ firstOpeningWidthOffset: 0.62,
11
+ firstGeneralTierOffset: 0.55,
12
+ tierSpacing: 0.62,
13
+ extensionStartGap: 0.075,
14
+ extensionOvershoot: 0.12,
15
+ };
16
+ export function constructionDimensionStandard(overrides = {}) {
17
+ return { ...DEFAULT_CONSTRUCTION_DIMENSION_STANDARD, ...overrides };
18
+ }
@@ -0,0 +1,10 @@
1
+ export type ConstructionLinearUnit = 'metric' | 'imperial';
2
+ export type ConstructionLengthProfile = 'editor' | 'document';
3
+ export type ConstructionMetricNotation = 'meters' | 'millimeters';
4
+ export type ConstructionImperialPrecision = '1' | '1/2' | '1/4' | '1/8' | '1/16';
5
+ export type ConstructionLengthFormatOptions = {
6
+ metricNotation?: ConstructionMetricNotation;
7
+ imperialPrecision?: ConstructionImperialPrecision;
8
+ };
9
+ export declare function formatConstructionLength(meters: number, unit: ConstructionLinearUnit, profile?: ConstructionLengthProfile, options?: ConstructionLengthFormatOptions): string;
10
+ //# sourceMappingURL=construction-length.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"construction-length.d.ts","sourceRoot":"","sources":["../../src/shared/construction-length.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,UAAU,CAAA;AAC1D,MAAM,MAAM,yBAAyB,GAAG,QAAQ,GAAG,UAAU,CAAA;AAC7D,MAAM,MAAM,0BAA0B,GAAG,QAAQ,GAAG,aAAa,CAAA;AACjE,MAAM,MAAM,6BAA6B,GAAG,GAAG,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAA;AAEhF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,cAAc,CAAC,EAAE,0BAA0B,CAAA;IAC3C,iBAAiB,CAAC,EAAE,6BAA6B,CAAA;CAClD,CAAA;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,sBAAsB,EAC5B,OAAO,GAAE,yBAAoC,EAC7C,OAAO,GAAE,+BAAoC,GAC5C,MAAM,CA0BR"}
@@ -0,0 +1,57 @@
1
+ const INCHES_PER_METER = 1 / 0.0254;
2
+ const IMPERIAL_FRACTION_DENOMINATOR = 16;
3
+ export function formatConstructionLength(meters, unit, profile = 'editor', options = {}) {
4
+ if (!Number.isFinite(meters))
5
+ return '--';
6
+ if (unit === 'metric') {
7
+ if (profile === 'document' || options.metricNotation === 'millimeters') {
8
+ return `${Math.round(meters * 1000)}`;
9
+ }
10
+ const rounded = Number.parseFloat(Math.abs(meters).toFixed(2));
11
+ const sign = meters < 0 && rounded !== 0 ? '-' : '';
12
+ return `${sign}${rounded}m`;
13
+ }
14
+ const sign = meters < 0 ? '-' : '';
15
+ const denominator = imperialPrecisionDenominator(options.imperialPrecision);
16
+ const totalFractionUnits = Math.round(Math.abs(meters) * INCHES_PER_METER * denominator);
17
+ const unitsPerFoot = 12 * denominator;
18
+ const feet = Math.floor(totalFractionUnits / unitsPerFoot);
19
+ const remainder = totalFractionUnits - feet * unitsPerFoot;
20
+ const inches = Math.floor(remainder / denominator);
21
+ const numerator = remainder - inches * denominator;
22
+ const fraction = formatFraction(numerator, denominator);
23
+ const inchText = fraction ? `${inches} ${fraction}` : `${inches}`;
24
+ if (feet === 0)
25
+ return `${sign}${inchText}"`;
26
+ return `${sign}${feet}'-${inchText}"`;
27
+ }
28
+ function imperialPrecisionDenominator(precision) {
29
+ switch (precision) {
30
+ case '1':
31
+ return 1;
32
+ case '1/2':
33
+ return 2;
34
+ case '1/4':
35
+ return 4;
36
+ case '1/8':
37
+ return 8;
38
+ default:
39
+ return IMPERIAL_FRACTION_DENOMINATOR;
40
+ }
41
+ }
42
+ function formatFraction(numerator, denominator) {
43
+ if (numerator === 0)
44
+ return '';
45
+ const divisor = greatestCommonDivisor(numerator, denominator);
46
+ return `${numerator / divisor}/${denominator / divisor}`;
47
+ }
48
+ function greatestCommonDivisor(a, b) {
49
+ let left = Math.abs(a);
50
+ let right = Math.abs(b);
51
+ while (right !== 0) {
52
+ const next = left % right;
53
+ left = right;
54
+ right = next;
55
+ }
56
+ return left || 1;
57
+ }
@@ -0,0 +1,20 @@
1
+ import type { DimensionTerminator, DimensionTextPosition, FloorplanGeometry, FloorplanPoint } from '@pascal-app/core';
2
+ export type DimensionStringSegment = {
3
+ witnessStart: FloorplanPoint;
4
+ witnessEnd: FloorplanPoint;
5
+ dimensionStart?: FloorplanPoint;
6
+ dimensionEnd?: FloorplanPoint;
7
+ text: string;
8
+ };
9
+ export type DimensionStringGeometryInput = {
10
+ segments: readonly DimensionStringSegment[];
11
+ offsetNormal: FloorplanPoint;
12
+ offsetDistance?: number;
13
+ extensionStartGap?: number;
14
+ extensionOvershoot?: number;
15
+ terminator?: DimensionTerminator;
16
+ textPosition?: DimensionTextPosition;
17
+ stroke?: string;
18
+ };
19
+ export declare function buildDimensionStringGeometry(input: DimensionStringGeometryInput): FloorplanGeometry;
20
+ //# sourceMappingURL=dimension-string.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dimension-string.d.ts","sourceRoot":"","sources":["../../src/shared/dimension-string.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACf,MAAM,kBAAkB,CAAA;AAEzB,MAAM,MAAM,sBAAsB,GAAG;IACnC,YAAY,EAAE,cAAc,CAAA;IAC5B,UAAU,EAAE,cAAc,CAAA;IAC1B,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,YAAY,CAAC,EAAE,cAAc,CAAA;IAC7B,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,4BAA4B,GAAG;IACzC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,CAAA;IAC3C,YAAY,EAAE,cAAc,CAAA;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,UAAU,CAAC,EAAE,mBAAmB,CAAA;IAChC,YAAY,CAAC,EAAE,qBAAqB,CAAA;IACpC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,4BAA4B,GAClC,iBAAiB,CAkBnB"}
@@ -0,0 +1,19 @@
1
+ export function buildDimensionStringGeometry(input) {
2
+ return {
3
+ kind: 'dimension-string',
4
+ segments: input.segments.map((segment) => ({
5
+ start: segment.witnessStart,
6
+ end: segment.witnessEnd,
7
+ dimensionStart: segment.dimensionStart,
8
+ dimensionEnd: segment.dimensionEnd,
9
+ text: segment.text,
10
+ })),
11
+ offsetNormal: input.offsetNormal,
12
+ offsetDistance: input.offsetDistance ?? 0,
13
+ extensionStartGap: input.extensionStartGap,
14
+ extensionOvershoot: input.extensionOvershoot ?? 0,
15
+ terminator: input.terminator,
16
+ textPosition: input.textPosition,
17
+ stroke: input.stroke,
18
+ };
19
+ }
@@ -0,0 +1,36 @@
1
+ import { type WallPlanPoint } from '@pascal-app/editor';
2
+ export type DraftAngleLabel = {
3
+ id: string;
4
+ label: string;
5
+ position: [number, number, number];
6
+ arc: {
7
+ center: WallPlanPoint;
8
+ radius: number;
9
+ startAngle: number;
10
+ endAngle: number;
11
+ y: number;
12
+ };
13
+ };
14
+ export type DraftAxisGuideState = {
15
+ origin: WallPlanPoint;
16
+ endOrigin: WallPlanPoint | null;
17
+ y: number;
18
+ angleLabel: DraftAngleLabel | null;
19
+ } | null;
20
+ export declare function getNearestAxisAngleLabel(start: WallPlanPoint, end: WallPlanPoint, y: number): DraftAngleLabel | null;
21
+ export declare function DraftAxisGuides({ guide, labelColor, labelShadowColor, }: {
22
+ guide: DraftAxisGuideState;
23
+ labelColor: string;
24
+ labelShadowColor: string;
25
+ }): import("react").JSX.Element | null;
26
+ export declare function DraftAngleArc({ arc, color }: {
27
+ arc: DraftAngleLabel['arc'];
28
+ color: string;
29
+ }): import("react").JSX.Element;
30
+ export declare function DraftMeasurementLabel({ color, label, position, shadowColor, }: {
31
+ color: string;
32
+ label: string;
33
+ position: [number, number, number];
34
+ shadowColor: string;
35
+ }): import("react").JSX.Element;
36
+ //# sourceMappingURL=draft-axis-guides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-axis-guides.d.ts","sourceRoot":"","sources":["../../src/shared/draft-axis-guides.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAA;AA6B3B,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,GAAG,EAAE;QACH,MAAM,EAAE,aAAa,CAAA;QACrB,MAAM,EAAE,MAAM,CAAA;QACd,UAAU,EAAE,MAAM,CAAA;QAClB,QAAQ,EAAE,MAAM,CAAA;QAChB,CAAC,EAAE,MAAM,CAAA;KACV,CAAA;CACF,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,aAAa,CAAA;IACrB,SAAS,EAAE,aAAa,GAAG,IAAI,CAAA;IAC/B,CAAC,EAAE,MAAM,CAAA;IACT,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;CACnC,GAAG,IAAI,CAAA;AAeR,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,aAAa,EAClB,CAAC,EAAE,MAAM,GACR,eAAe,GAAG,IAAI,CAyCxB;AAED,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,UAAU,EACV,gBAAgB,GACjB,EAAE;IACD,KAAK,EAAE,mBAAmB,CAAA;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;CACzB,sCA2CA;AAoBD,wBAAgB,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;IAAE,GAAG,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,+BAkC3F;AAED,wBAAgB,qBAAqB,CAAC,EACpC,KAAK,EACL,KAAK,EACL,QAAQ,EACR,WAAW,GACZ,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,WAAW,EAAE,MAAM,CAAA;CACpB,+BAmBA"}
@@ -0,0 +1,107 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { EDITOR_LAYER, formatAngleRadians, getAngleArcToSegmentReference, getAngleToSegmentReference, } from '@pascal-app/editor';
3
+ import { Html } from '@react-three/drei';
4
+ import { useMemo } from 'react';
5
+ import { BufferGeometry, Vector3 } from 'three';
6
+ /**
7
+ * Axis guide lines + axis-angle readout shown while drafting linear segments
8
+ * (walls, fences). An X/Z cross of long thin boxes is drawn through the
9
+ * segment start so it can be aligned against the world axes; the moving
10
+ * endpoint gets a single long line PERPENDICULAR to the draft segment (a
11
+ * second cross there would overlap the start cross whenever the segment is
12
+ * axis-aligned). The angle to the nearest axis is shown as an arc + label
13
+ * anchored at the start point only (duplicating it at the endpoint is
14
+ * visual clutter).
15
+ */
16
+ const DRAFT_AXIS_GUIDE_LENGTH = 2000;
17
+ const DRAFT_AXIS_GUIDE_WIDTH = 0.035;
18
+ const DRAFT_AXIS_GUIDE_HEIGHT = 0.004;
19
+ const DRAFT_AXIS_GUIDE_Y_OFFSET = 0.026;
20
+ const DRAFT_AXIS_ANGLE_ARC_Y_OFFSET = 0.05;
21
+ const DRAFT_AXIS_ANGLE_LABEL_Y_OFFSET = 0.16;
22
+ const DRAFT_AXIS_ANGLE_ARC_MIN_RADIUS = 0.36;
23
+ const DRAFT_AXIS_ANGLE_ARC_MAX_RADIUS = 0.82;
24
+ const DRAFT_ANGLE_ARC_SEGMENTS = 24;
25
+ const AXIS_ANGLE_REFERENCES = [
26
+ { vector: [1, 0], orientation: 'axis' },
27
+ { vector: [0, 1], orientation: 'axis' },
28
+ ];
29
+ function clamp(value, min, max) {
30
+ return Math.min(max, Math.max(min, value));
31
+ }
32
+ export function getNearestAxisAngleLabel(start, end, y) {
33
+ const dx = end[0] - start[0];
34
+ const dz = end[1] - start[1];
35
+ const length = Math.hypot(dx, dz);
36
+ if (length < 0.01)
37
+ return null;
38
+ const draftVector = [dx, dz];
39
+ const axisCandidates = [];
40
+ for (const reference of AXIS_ANGLE_REFERENCES) {
41
+ const angle = getAngleToSegmentReference(draftVector, reference);
42
+ const arc = getAngleArcToSegmentReference(draftVector, reference);
43
+ if (!(angle === null || arc === null)) {
44
+ axisCandidates.push({ angle, arc });
45
+ }
46
+ }
47
+ const nearestAxisAngle = axisCandidates.sort((a, b) => a.angle - b.angle)[0];
48
+ if (!nearestAxisAngle)
49
+ return null;
50
+ const radius = clamp(length * 0.22, DRAFT_AXIS_ANGLE_ARC_MIN_RADIUS, DRAFT_AXIS_ANGLE_ARC_MAX_RADIUS);
51
+ const { angle, arc } = nearestAxisAngle;
52
+ return {
53
+ id: 'axis',
54
+ label: formatAngleRadians(angle),
55
+ position: [
56
+ start[0] + Math.cos(arc.midAngle) * (radius + 0.16),
57
+ y + DRAFT_AXIS_ANGLE_LABEL_Y_OFFSET,
58
+ start[1] + Math.sin(arc.midAngle) * (radius + 0.16),
59
+ ],
60
+ arc: {
61
+ center: start,
62
+ radius,
63
+ startAngle: arc.startAngle,
64
+ endAngle: arc.endAngle,
65
+ y: y + DRAFT_AXIS_ANGLE_ARC_Y_OFFSET,
66
+ },
67
+ };
68
+ }
69
+ export function DraftAxisGuides({ guide, labelColor, labelShadowColor, }) {
70
+ if (!guide)
71
+ return null;
72
+ const [x, z] = guide.origin;
73
+ // Single long line through the endpoint, perpendicular to the draft
74
+ // segment (a full axis cross there would collide with the start cross
75
+ // whenever the segment is axis-aligned).
76
+ let endRotationY = null;
77
+ if (guide.endOrigin) {
78
+ const dx = guide.endOrigin[0] - x;
79
+ const dz = guide.endOrigin[1] - z;
80
+ if (dx * dx + dz * dz >= 0.01 * 0.01) {
81
+ endRotationY = Math.atan2(-dx, -dz);
82
+ }
83
+ }
84
+ return (_jsxs(_Fragment, { children: [_jsxs("group", { position: [x, guide.y + DRAFT_AXIS_GUIDE_Y_OFFSET, z], children: [_jsx(DraftAxisGuideLine, { axis: "x" }), _jsx(DraftAxisGuideLine, { axis: "z" })] }), guide.endOrigin && endRotationY !== null && (_jsx("group", { position: [guide.endOrigin[0], guide.y + DRAFT_AXIS_GUIDE_Y_OFFSET, guide.endOrigin[1]], children: _jsx(DraftAxisGuideLine, { rotationY: endRotationY }) })), guide.angleLabel && (_jsxs(_Fragment, { children: [_jsx(DraftAngleArc, { arc: guide.angleLabel.arc, color: "#818cf8" }), _jsx(DraftMeasurementLabel, { color: labelColor, label: guide.angleLabel.label, position: guide.angleLabel.position, shadowColor: labelShadowColor })] }))] }));
85
+ }
86
+ function DraftAxisGuideLine({ axis, rotationY }) {
87
+ const y = rotationY ?? (axis === 'z' ? Math.PI / 2 : 0);
88
+ return (_jsxs("mesh", { frustumCulled: false, layers: EDITOR_LAYER, renderOrder: 0, rotation: [0, y, 0], children: [_jsx("boxGeometry", { args: [DRAFT_AXIS_GUIDE_LENGTH, DRAFT_AXIS_GUIDE_HEIGHT, DRAFT_AXIS_GUIDE_WIDTH] }), _jsx("meshBasicMaterial", { color: "#818cf8", depthTest: false, depthWrite: false, opacity: 0.36, transparent: true })] }));
89
+ }
90
+ export function DraftAngleArc({ arc, color }) {
91
+ const geometry = useMemo(() => {
92
+ const segmentCount = Math.max(8, Math.ceil((Math.abs(arc.endAngle - arc.startAngle) / Math.PI) * DRAFT_ANGLE_ARC_SEGMENTS));
93
+ const points = Array.from({ length: segmentCount + 1 }, (_, index) => {
94
+ const t = index / segmentCount;
95
+ const angle = arc.startAngle + (arc.endAngle - arc.startAngle) * t;
96
+ return new Vector3(arc.center[0] + Math.cos(angle) * arc.radius, arc.y, arc.center[1] + Math.sin(angle) * arc.radius);
97
+ });
98
+ return new BufferGeometry().setFromPoints(points);
99
+ }, [arc]);
100
+ return (_jsx("line", { frustumCulled: false, geometry: geometry, layers: EDITOR_LAYER, renderOrder: 2, children: _jsx("lineBasicNodeMaterial", { color: color, depthTest: false, depthWrite: false, linewidth: 2, opacity: 0.95, transparent: true }) }));
101
+ }
102
+ export function DraftMeasurementLabel({ color, label, position, shadowColor, }) {
103
+ return (_jsx(Html, { center: true, position: position, style: { pointerEvents: 'none', userSelect: 'none' }, zIndexRange: [100, 0], children: _jsx("div", { className: "whitespace-nowrap font-bold font-mono text-[15px]", style: {
104
+ color,
105
+ textShadow: `-1.5px -1.5px 0 ${shadowColor}, 1.5px -1.5px 0 ${shadowColor}, -1.5px 1.5px 0 ${shadowColor}, 1.5px 1.5px 0 ${shadowColor}, 0 0 4px ${shadowColor}, 0 0 4px ${shadowColor}`,
106
+ }, children: label }) }));
107
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"move-roof-tool.d.ts","sourceRoot":"","sources":["../../src/shared/move-roof-tool.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,QAAQ,EACb,KAAK,eAAe,EAEpB,KAAK,SAAS,EACd,KAAK,gBAAgB,EAMtB,MAAM,kBAAkB,CAAA;AAwDzB,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC;IAClC,IAAI,EAAE,QAAQ,GAAG,eAAe,GAAG,SAAS,GAAG,gBAAgB,CAAA;CAChE,CAqeA,CAAA;AAED,eAAe,YAAY,CAAA"}
1
+ {"version":3,"file":"move-roof-tool.d.ts","sourceRoot":"","sources":["../../src/shared/move-roof-tool.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,QAAQ,EACb,KAAK,eAAe,EAGpB,KAAK,SAAS,EACd,KAAK,gBAAgB,EAMtB,MAAM,kBAAkB,CAAA;AAwDzB,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC;IAClC,IAAI,EAAE,QAAQ,GAAG,eAAe,GAAG,SAAS,GAAG,gBAAgB,CAAA;CAChE,CAofA,CAAA;AAED,eAAe,YAAY,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { collectAlignmentAnchors, emitter, movingAlignmentAnchors, nodeRegistry, resolveAlignment, sceneRegistry, useLiveNodeOverrides, useLiveTransforms, useScene, } from '@pascal-app/core';
2
+ import { collectAlignmentAnchors, emitter, movingAlignmentAnchors, nodeRegistry, resolveAlignment, resolveSupportSlabPatch, sceneRegistry, useLiveNodeOverrides, useLiveTransforms, useScene, } from '@pascal-app/core';
3
3
  import { CursorSphere, commitFreshPlacementSubtree, consumePlacementDragRelease, DragBoundingBox, getFloorStackPreviewPosition, isMagneticSnapActive, resolvePlanarCursorPosition, snapFenceDraftPoint, stripPlacementMetadataFlags, triggerSFX, useAlignmentGuides, useEditor, useFreshPlacementVisibility, } from '@pascal-app/editor';
4
4
  import { useViewer } from '@pascal-app/viewer';
5
5
  import { useCallback, useEffect, useRef, useState } from 'react';
@@ -283,14 +283,27 @@ export const MoveRoofTool = ({ node: movingNode }) => {
283
283
  const [localX, , localZ] = lastLocalPosition;
284
284
  useAlignmentGuides.getState().clear();
285
285
  wasCommitted = true;
286
+ const position = [localX, movingNode.position[1], localZ];
287
+ const effectiveNode = {
288
+ ...movingNode,
289
+ position,
290
+ rotation: pendingRotation,
291
+ };
292
+ const supportPatch = isFloorPlaced
293
+ ? resolveSupportSlabPatch(effectiveNode, {
294
+ ...useScene.getState().nodes,
295
+ [movingNode.id]: effectiveNode,
296
+ })
297
+ : {};
286
298
  let committedId = movingNode.id;
287
299
  if (isNew) {
288
300
  committedId =
289
301
  commitFreshPlacementSubtree(movingNode.id, {
290
- position: [localX, movingNode.position[1], localZ],
302
+ position,
291
303
  rotation: pendingRotation,
292
304
  metadata: committedMeta,
293
305
  visible: true,
306
+ ...supportPatch,
294
307
  }) ?? committedId;
295
308
  }
296
309
  else {
@@ -298,9 +311,10 @@ export const MoveRoofTool = ({ node: movingNode }) => {
298
311
  // Resume temporal and apply the final state as a single undoable step.
299
312
  useScene.temporal.getState().resume();
300
313
  useScene.getState().updateNode(movingNode.id, {
301
- position: [localX, movingNode.position[1], localZ],
314
+ position,
302
315
  rotation: pendingRotation,
303
316
  metadata: committedMeta,
317
+ ...supportPatch,
304
318
  });
305
319
  useScene.temporal.getState().pause();
306
320
  }
@@ -0,0 +1,16 @@
1
+ type OpeningDocumentationPatch = {
2
+ mark?: string;
3
+ constructionType?: 'framed' | 'masonry';
4
+ dimensionReference?: 'nominal' | 'rough-opening' | 'masonry-opening' | 'finish-opening';
5
+ roughOpeningWidth?: number;
6
+ roughOpeningHeight?: number;
7
+ masonryOpeningWidth?: number;
8
+ masonryOpeningHeight?: number;
9
+ finishOpeningWidth?: number;
10
+ finishOpeningHeight?: number;
11
+ };
12
+ export declare function OpeningDocumentationFields({ mark, constructionType, dimensionReference, roughOpeningWidth, roughOpeningHeight, masonryOpeningWidth, masonryOpeningHeight, finishOpeningWidth, finishOpeningHeight, onChange, }: OpeningDocumentationPatch & {
13
+ onChange: (patch: OpeningDocumentationPatch) => void;
14
+ }): import("react").JSX.Element;
15
+ export {};
16
+ //# sourceMappingURL=opening-documentation-fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opening-documentation-fields.d.ts","sourceRoot":"","sources":["../../src/shared/opening-documentation-fields.tsx"],"names":[],"mappings":"AAKA,KAAK,yBAAyB,GAAG;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,gBAAgB,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;IACvC,kBAAkB,CAAC,EAAE,SAAS,GAAG,eAAe,GAAG,iBAAiB,GAAG,gBAAgB,CAAA;IACvF,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B,CAAA;AAED,wBAAgB,0BAA0B,CAAC,EACzC,IAAI,EACJ,gBAA2B,EAC3B,kBAA8B,EAC9B,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,QAAQ,GACT,EAAE,yBAAyB,GAAG;IAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,CAAA;CACrD,+BA+GA"}
@@ -0,0 +1,54 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { getLinearUnitLabel, linearUnitToMeters, metersToLinearUnit } from '@pascal-app/editor';
4
+ import { useViewer } from '@pascal-app/viewer';
5
+ export function OpeningDocumentationFields({ mark, constructionType = 'framed', dimensionReference = 'nominal', roughOpeningWidth, roughOpeningHeight, masonryOpeningWidth, masonryOpeningHeight, finishOpeningWidth, finishOpeningHeight, onChange, }) {
6
+ return (_jsxs("div", { className: "flex flex-col gap-2 px-1 pb-1", children: [_jsxs("label", { className: "flex flex-col gap-1", children: [_jsx("span", { className: "font-medium text-[10px] text-muted-foreground/80 uppercase tracking-wider", children: "Mark" }), _jsx("input", { className: "h-8 rounded-lg border border-border/50 bg-[#2C2C2E] px-2.5 font-mono text-foreground text-xs outline-none transition-colors placeholder:text-muted-foreground/50 focus:border-orange-400/60", defaultValue: mark ?? '', maxLength: 16, onBlur: (event) => {
7
+ const next = event.currentTarget.value.trim().toLocaleUpperCase();
8
+ if (next !== (mark ?? ''))
9
+ onChange({ mark: next || undefined });
10
+ }, onKeyDown: (event) => {
11
+ if (event.key === 'Enter')
12
+ event.currentTarget.blur();
13
+ if (event.key === 'Escape') {
14
+ event.currentTarget.value = mark ?? '';
15
+ event.currentTarget.blur();
16
+ }
17
+ }, placeholder: "Auto-assigned" }, `mark:${mark ?? ''}`)] }), _jsxs("div", { className: "grid grid-cols-2 gap-2", children: [_jsxs("label", { className: "flex flex-col gap-1", children: [_jsx("span", { className: "font-medium text-[10px] text-muted-foreground/80 uppercase tracking-wider", children: "Construction" }), _jsxs("select", { className: "h-8 rounded-lg border border-border/50 bg-[#2C2C2E] px-2 text-foreground text-xs outline-none focus:border-orange-400/60", onChange: (event) => {
18
+ const next = event.currentTarget.value;
19
+ onChange({
20
+ constructionType: next,
21
+ dimensionReference: next === 'masonry' && dimensionReference === 'nominal'
22
+ ? 'masonry-opening'
23
+ : dimensionReference,
24
+ });
25
+ }, value: constructionType, children: [_jsx("option", { value: "framed", children: "Framed" }), _jsx("option", { value: "masonry", children: "Masonry" })] })] }), _jsxs("label", { className: "flex flex-col gap-1", children: [_jsx("span", { className: "font-medium text-[10px] text-muted-foreground/80 uppercase tracking-wider", children: "Dimension to" }), _jsxs("select", { className: "h-8 rounded-lg border border-border/50 bg-[#2C2C2E] px-2 text-foreground text-xs outline-none focus:border-orange-400/60", onChange: (event) => onChange({
26
+ dimensionReference: event.currentTarget
27
+ .value,
28
+ }), value: dimensionReference, children: [_jsx("option", { value: "nominal", children: "Nominal" }), _jsx("option", { value: "rough-opening", children: "Rough opening" }), _jsx("option", { value: "masonry-opening", children: "Masonry opening" }), _jsx("option", { value: "finish-opening", children: "Finish opening" })] })] })] }), _jsxs("div", { className: "grid grid-cols-2 gap-2", children: [_jsx(OptionalMeterInput, { label: "RO Width", onChange: (value) => onChange({ roughOpeningWidth: value }), value: roughOpeningWidth }), _jsx(OptionalMeterInput, { label: "RO Height", onChange: (value) => onChange({ roughOpeningHeight: value }), value: roughOpeningHeight })] }), _jsxs("div", { className: "grid grid-cols-2 gap-2", children: [_jsx(OptionalMeterInput, { label: "MO Width", onChange: (value) => onChange({ masonryOpeningWidth: value }), value: masonryOpeningWidth }), _jsx(OptionalMeterInput, { label: "MO Height", onChange: (value) => onChange({ masonryOpeningHeight: value }), value: masonryOpeningHeight })] }), _jsxs("div", { className: "grid grid-cols-2 gap-2", children: [_jsx(OptionalMeterInput, { label: "FO Width", onChange: (value) => onChange({ finishOpeningWidth: value }), value: finishOpeningWidth }), _jsx(OptionalMeterInput, { label: "FO Height", onChange: (value) => onChange({ finishOpeningHeight: value }), value: finishOpeningHeight })] }), _jsx("p", { className: "px-0.5 text-[10px] text-muted-foreground/65 leading-4", children: "Leave RO, MO, and FO values blank until verified by the applicable manufacturer or trade." })] }));
29
+ }
30
+ function OptionalMeterInput({ label, value, onChange, }) {
31
+ const unit = useViewer((state) => state.unit);
32
+ const displayValue = value === undefined ? '' : roundForInput(metersToLinearUnit(value, unit));
33
+ return (_jsxs("label", { className: "flex flex-col gap-1", children: [_jsx("span", { className: "font-medium text-[10px] text-muted-foreground/80 uppercase tracking-wider", children: label }), _jsxs("div", { className: "flex h-8 items-center rounded-lg border border-border/50 bg-[#2C2C2E] focus-within:border-orange-400/60", children: [_jsx("input", { className: "min-w-0 flex-1 bg-transparent px-2 font-mono text-foreground text-xs outline-none placeholder:text-muted-foreground/50", defaultValue: displayValue, min: 0.01, onBlur: (event) => {
34
+ const raw = event.currentTarget.value;
35
+ if (raw === String(displayValue))
36
+ return;
37
+ const parsed = Number.parseFloat(raw);
38
+ const next = raw === '' || !Number.isFinite(parsed) || parsed <= 0
39
+ ? undefined
40
+ : linearUnitToMeters(parsed, unit);
41
+ if (next !== value)
42
+ onChange(next);
43
+ }, onKeyDown: (event) => {
44
+ if (event.key === 'Enter')
45
+ event.currentTarget.blur();
46
+ if (event.key === 'Escape') {
47
+ event.currentTarget.value = String(displayValue);
48
+ event.currentTarget.blur();
49
+ }
50
+ }, onWheel: (event) => event.currentTarget.blur(), placeholder: "Verify", step: unit === 'imperial' ? 0.01 : 0.001, type: "number" }, `${label}:${displayValue}`), _jsx("span", { className: "pr-2 font-mono text-[10px] text-muted-foreground", children: getLinearUnitLabel(unit) })] })] }));
51
+ }
52
+ function roundForInput(value) {
53
+ return Math.round(value * 1000) / 1000;
54
+ }
@@ -0,0 +1,47 @@
1
+ import type { AnyNode, DoorNode, FloorplanGeometry, WallNode, WindowNode } from '@pascal-app/core';
2
+ import { type FloorplanSchedule } from '@pascal-app/editor';
3
+ import { type ConstructionLengthProfile, type ConstructionLinearUnit } from './construction-length';
4
+ type OpeningNode = DoorNode | WindowNode;
5
+ export type OpeningConstructionType = 'framed' | 'masonry';
6
+ export type OpeningDimensionReference = 'nominal' | 'rough-opening' | 'masonry-opening' | 'finish-opening';
7
+ export type OpeningDimensionDocumentation = {
8
+ constructionType: OpeningConstructionType;
9
+ reference: OpeningDimensionReference;
10
+ locationPolicy: 'centerline' | 'edge-to-edge';
11
+ width: number | null;
12
+ height: number | null;
13
+ prefix: string;
14
+ verified: boolean;
15
+ };
16
+ export type OpeningFloorplanLevelData = {
17
+ markById: ReadonlyMap<string, string>;
18
+ };
19
+ export declare function computeDoorFloorplanLevelData(args: {
20
+ siblings: ReadonlyArray<DoorNode>;
21
+ nodes: Record<string, AnyNode>;
22
+ }): OpeningFloorplanLevelData;
23
+ export declare function computeWindowFloorplanLevelData(args: {
24
+ siblings: ReadonlyArray<WindowNode>;
25
+ nodes: Record<string, AnyNode>;
26
+ }): OpeningFloorplanLevelData;
27
+ export declare function buildDoorFloorplanSchedule(args: {
28
+ siblings: ReadonlyArray<DoorNode>;
29
+ nodes: Readonly<Record<string, AnyNode>>;
30
+ levelId: string;
31
+ unit: ConstructionLinearUnit;
32
+ profile?: ConstructionLengthProfile;
33
+ }): FloorplanSchedule | null;
34
+ export declare function buildWindowFloorplanSchedule(args: {
35
+ siblings: ReadonlyArray<WindowNode>;
36
+ nodes: Readonly<Record<string, AnyNode>>;
37
+ levelId: string;
38
+ unit: ConstructionLinearUnit;
39
+ profile?: ConstructionLengthProfile;
40
+ }): FloorplanSchedule | null;
41
+ export declare function buildOpeningMarkAnnotation(opening: OpeningNode, wall: WallNode, levelData: OpeningFloorplanLevelData | undefined, { preferredSide, stroke, }?: {
42
+ preferredSide?: -1 | 1;
43
+ stroke?: string;
44
+ }): FloorplanGeometry | null;
45
+ export declare function resolveOpeningDimensionDocumentation(opening: OpeningNode): OpeningDimensionDocumentation;
46
+ export {};
47
+ //# sourceMappingURL=opening-documentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opening-documentation.d.ts","sourceRoot":"","sources":["../../src/shared/opening-documentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,QAAQ,EACR,iBAAiB,EAEjB,QAAQ,EACR,UAAU,EACX,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,KAAK,iBAAiB,EAAiC,MAAM,oBAAoB,CAAA;AAC1F,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAE5B,MAAM,uBAAuB,CAAA;AAE9B,KAAK,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAA;AAGxC,MAAM,MAAM,uBAAuB,GAAG,QAAQ,GAAG,SAAS,CAAA;AAC1D,MAAM,MAAM,yBAAyB,GACjC,SAAS,GACT,eAAe,GACf,iBAAiB,GACjB,gBAAgB,CAAA;AAEpB,MAAM,MAAM,6BAA6B,GAAG;IAC1C,gBAAgB,EAAE,uBAAuB,CAAA;IACzC,SAAS,EAAE,yBAAyB,CAAA;IACpC,cAAc,EAAE,YAAY,GAAG,cAAc,CAAA;IAC7C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACtC,CAAA;AAMD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,yBAAyB,CAE5B;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE;IACpD,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;IACnC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,yBAAyB,CAE5B;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IACjC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,sBAAsB,CAAA;IAC5B,OAAO,CAAC,EAAE,yBAAyB,CAAA;CACpC,GAAG,iBAAiB,GAAG,IAAI,CA6B3B;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;IACnC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,sBAAsB,CAAA;IAC5B,OAAO,CAAC,EAAE,yBAAyB,CAAA;CACpC,GAAG,iBAAiB,GAAG,IAAI,CAqC3B;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,QAAQ,EACd,SAAS,EAAE,yBAAyB,GAAG,SAAS,EAChD,EACE,aAAkB,EAClB,MAAkB,GACnB,GAAE;IACD,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;CACX,GACL,iBAAiB,GAAG,IAAI,CAiE1B;AAED,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,WAAW,GACnB,6BAA6B,CAoB/B"}