@pascal-app/core 0.9.1 → 0.9.2

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 (321) hide show
  1. package/dist/events/bus.d.ts +30 -2
  2. package/dist/events/bus.d.ts.map +1 -1
  3. package/dist/hooks/scene-registry/item-clip-registry.d.ts +18 -0
  4. package/dist/hooks/scene-registry/item-clip-registry.d.ts.map +1 -0
  5. package/dist/hooks/scene-registry/item-clip-registry.js +10 -0
  6. package/dist/hooks/scene-registry/scene-registry.d.ts +8 -1
  7. package/dist/hooks/scene-registry/scene-registry.d.ts.map +1 -1
  8. package/dist/hooks/scene-registry/scene-registry.js +27 -1
  9. package/dist/hooks/scene-registry/scene-registry.test.d.ts +2 -0
  10. package/dist/hooks/scene-registry/scene-registry.test.d.ts.map +1 -0
  11. package/dist/hooks/scene-registry/scene-registry.test.js +26 -0
  12. package/dist/hooks/spatial-grid/floor-placed-elevation.test.js +93 -0
  13. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +69 -12
  14. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  15. package/dist/hooks/spatial-grid/spatial-grid-manager.js +476 -195
  16. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  17. package/dist/hooks/spatial-grid/spatial-grid-sync.js +19 -1
  18. package/dist/hooks/spatial-grid/wall-slab-overlap.test.d.ts +2 -0
  19. package/dist/hooks/spatial-grid/wall-slab-overlap.test.d.ts.map +1 -0
  20. package/dist/hooks/spatial-grid/wall-slab-overlap.test.js +363 -0
  21. package/dist/index.d.ts +16 -6
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +15 -5
  24. package/dist/lib/level-name.d.ts +4 -0
  25. package/dist/lib/level-name.d.ts.map +1 -0
  26. package/dist/lib/level-name.js +10 -0
  27. package/dist/lib/measurement-geometry.d.ts +19 -0
  28. package/dist/lib/measurement-geometry.d.ts.map +1 -0
  29. package/dist/lib/measurement-geometry.js +232 -0
  30. package/dist/lib/measurement-geometry.test.d.ts +2 -0
  31. package/dist/lib/measurement-geometry.test.d.ts.map +1 -0
  32. package/dist/lib/measurement-geometry.test.js +102 -0
  33. package/dist/lib/polygon-geometry.d.ts +0 -1
  34. package/dist/lib/polygon-geometry.d.ts.map +1 -1
  35. package/dist/lib/polygon-geometry.js +0 -18
  36. package/dist/lib/selection-proxy.d.ts +4 -0
  37. package/dist/lib/selection-proxy.d.ts.map +1 -0
  38. package/dist/lib/selection-proxy.js +12 -0
  39. package/dist/lib/slab-polygon.d.ts +31 -2
  40. package/dist/lib/slab-polygon.d.ts.map +1 -1
  41. package/dist/lib/slab-polygon.js +525 -31
  42. package/dist/lib/slab-polygon.test.d.ts +2 -0
  43. package/dist/lib/slab-polygon.test.d.ts.map +1 -0
  44. package/dist/lib/slab-polygon.test.js +635 -0
  45. package/dist/lib/slots.d.ts +14 -0
  46. package/dist/lib/slots.d.ts.map +1 -0
  47. package/dist/lib/slots.js +26 -0
  48. package/dist/lib/space-detection.d.ts +25 -2
  49. package/dist/lib/space-detection.d.ts.map +1 -1
  50. package/dist/lib/space-detection.js +414 -118
  51. package/dist/lib/space-detection.test.js +301 -2
  52. package/dist/lib/wall-distance.d.ts +60 -0
  53. package/dist/lib/wall-distance.d.ts.map +1 -0
  54. package/dist/lib/wall-distance.js +85 -0
  55. package/dist/lib/zone-quantities.d.ts +21 -0
  56. package/dist/lib/zone-quantities.d.ts.map +1 -0
  57. package/dist/lib/zone-quantities.js +183 -0
  58. package/dist/lib/zone-quantities.test.d.ts +2 -0
  59. package/dist/lib/zone-quantities.test.d.ts.map +1 -0
  60. package/dist/lib/zone-quantities.test.js +82 -0
  61. package/dist/material-library.d.ts +20 -1
  62. package/dist/material-library.d.ts.map +1 -1
  63. package/dist/material-library.js +2181 -441
  64. package/dist/registry/handles.d.ts +75 -2
  65. package/dist/registry/handles.d.ts.map +1 -1
  66. package/dist/registry/index.d.ts +3 -3
  67. package/dist/registry/index.d.ts.map +1 -1
  68. package/dist/registry/index.js +1 -1
  69. package/dist/registry/registry.d.ts +46 -3
  70. package/dist/registry/registry.d.ts.map +1 -1
  71. package/dist/registry/registry.js +82 -1
  72. package/dist/registry/registry.test.js +14 -1
  73. package/dist/registry/subtree.d.ts.map +1 -1
  74. package/dist/registry/subtree.js +4 -0
  75. package/dist/registry/subtree.test.js +30 -0
  76. package/dist/registry/types.d.ts +717 -38
  77. package/dist/registry/types.d.ts.map +1 -1
  78. package/dist/schema/index.d.ts +21 -5
  79. package/dist/schema/index.d.ts.map +1 -1
  80. package/dist/schema/index.js +17 -3
  81. package/dist/schema/material.d.ts +3 -2
  82. package/dist/schema/material.d.ts.map +1 -1
  83. package/dist/schema/material.js +7 -5
  84. package/dist/schema/material.test.d.ts +2 -0
  85. package/dist/schema/material.test.d.ts.map +1 -0
  86. package/dist/schema/material.test.js +43 -0
  87. package/dist/schema/nodes/box-vent.d.ts +2 -2
  88. package/dist/schema/nodes/cabinet.d.ts +534 -0
  89. package/dist/schema/nodes/cabinet.d.ts.map +1 -0
  90. package/dist/schema/nodes/cabinet.js +137 -0
  91. package/dist/schema/nodes/ceiling.d.ts +3 -2
  92. package/dist/schema/nodes/ceiling.d.ts.map +1 -1
  93. package/dist/schema/nodes/ceiling.js +4 -0
  94. package/dist/schema/nodes/chimney.d.ts +4 -4
  95. package/dist/schema/nodes/column.d.ts +3 -2
  96. package/dist/schema/nodes/column.d.ts.map +1 -1
  97. package/dist/schema/nodes/column.js +3 -0
  98. package/dist/schema/nodes/cupola.d.ts +2 -2
  99. package/dist/schema/nodes/door.d.ts +13 -5
  100. package/dist/schema/nodes/door.d.ts.map +1 -1
  101. package/dist/schema/nodes/door.js +12 -0
  102. package/dist/schema/nodes/dormer.d.ts +8 -8
  103. package/dist/schema/nodes/dormer.js +1 -1
  104. package/dist/schema/nodes/downspout.d.ts +2 -2
  105. package/dist/schema/nodes/duct-fitting.d.ts +91 -0
  106. package/dist/schema/nodes/duct-fitting.d.ts.map +1 -0
  107. package/dist/schema/nodes/duct-fitting.js +92 -0
  108. package/dist/schema/nodes/duct-segment.d.ts +61 -0
  109. package/dist/schema/nodes/duct-segment.d.ts.map +1 -0
  110. package/dist/schema/nodes/duct-segment.js +73 -0
  111. package/dist/schema/nodes/duct-terminal.d.ts +57 -0
  112. package/dist/schema/nodes/duct-terminal.d.ts.map +1 -0
  113. package/dist/schema/nodes/duct-terminal.js +51 -0
  114. package/dist/schema/nodes/elevator.d.ts +3 -2
  115. package/dist/schema/nodes/elevator.d.ts.map +1 -1
  116. package/dist/schema/nodes/elevator.js +3 -0
  117. package/dist/schema/nodes/eyebrow-vent.d.ts +2 -2
  118. package/dist/schema/nodes/fence.d.ts +18 -2
  119. package/dist/schema/nodes/fence.d.ts.map +1 -1
  120. package/dist/schema/nodes/fence.js +25 -2
  121. package/dist/schema/nodes/gutter.d.ts +2 -2
  122. package/dist/schema/nodes/hvac-equipment.d.ts +63 -0
  123. package/dist/schema/nodes/hvac-equipment.d.ts.map +1 -0
  124. package/dist/schema/nodes/hvac-equipment.js +55 -0
  125. package/dist/schema/nodes/item.d.ts +8 -0
  126. package/dist/schema/nodes/item.d.ts.map +1 -1
  127. package/dist/schema/nodes/item.js +11 -0
  128. package/dist/schema/nodes/level.d.ts +1 -1
  129. package/dist/schema/nodes/level.d.ts.map +1 -1
  130. package/dist/schema/nodes/level.js +2 -0
  131. package/dist/schema/nodes/lineset.d.ts +42 -0
  132. package/dist/schema/nodes/lineset.d.ts.map +1 -0
  133. package/dist/schema/nodes/lineset.js +38 -0
  134. package/dist/schema/nodes/liquid-line.d.ts +34 -0
  135. package/dist/schema/nodes/liquid-line.d.ts.map +1 -0
  136. package/dist/schema/nodes/liquid-line.js +24 -0
  137. package/dist/schema/nodes/measurement.d.ts +306 -0
  138. package/dist/schema/nodes/measurement.d.ts.map +1 -0
  139. package/dist/schema/nodes/measurement.js +87 -0
  140. package/dist/schema/nodes/measurement.test.d.ts +2 -0
  141. package/dist/schema/nodes/measurement.test.d.ts.map +1 -0
  142. package/dist/schema/nodes/measurement.test.js +139 -0
  143. package/dist/schema/nodes/pipe-fitting.d.ts +56 -0
  144. package/dist/schema/nodes/pipe-fitting.d.ts.map +1 -0
  145. package/dist/schema/nodes/pipe-fitting.js +45 -0
  146. package/dist/schema/nodes/pipe-segment.d.ts +48 -0
  147. package/dist/schema/nodes/pipe-segment.d.ts.map +1 -0
  148. package/dist/schema/nodes/pipe-segment.js +36 -0
  149. package/dist/schema/nodes/pipe-trap.d.ts +43 -0
  150. package/dist/schema/nodes/pipe-trap.d.ts.map +1 -0
  151. package/dist/schema/nodes/pipe-trap.js +36 -0
  152. package/dist/schema/nodes/ridge-vent-defaults.test.d.ts +2 -0
  153. package/dist/schema/nodes/ridge-vent-defaults.test.d.ts.map +1 -0
  154. package/dist/schema/nodes/ridge-vent-defaults.test.js +205 -0
  155. package/dist/schema/nodes/ridge-vent.d.ts +18 -3
  156. package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
  157. package/dist/schema/nodes/ridge-vent.js +221 -3
  158. package/dist/schema/nodes/roof-segment-shape.d.ts +90 -0
  159. package/dist/schema/nodes/roof-segment-shape.d.ts.map +1 -0
  160. package/dist/schema/nodes/roof-segment-shape.js +318 -0
  161. package/dist/schema/nodes/roof-segment-shape.test.d.ts +2 -0
  162. package/dist/schema/nodes/roof-segment-shape.test.d.ts.map +1 -0
  163. package/dist/schema/nodes/roof-segment-shape.test.js +175 -0
  164. package/dist/schema/nodes/roof-segment-surface.test.d.ts +2 -0
  165. package/dist/schema/nodes/roof-segment-surface.test.d.ts.map +1 -0
  166. package/dist/schema/nodes/roof-segment-surface.test.js +48 -0
  167. package/dist/schema/nodes/roof-segment-trim.test.d.ts +2 -0
  168. package/dist/schema/nodes/roof-segment-trim.test.d.ts.map +1 -0
  169. package/dist/schema/nodes/roof-segment-trim.test.js +107 -0
  170. package/dist/schema/nodes/roof-segment-walls.d.ts +101 -0
  171. package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -0
  172. package/dist/schema/nodes/roof-segment-walls.js +330 -0
  173. package/dist/schema/nodes/roof-segment-walls.test.d.ts +2 -0
  174. package/dist/schema/nodes/roof-segment-walls.test.d.ts.map +1 -0
  175. package/dist/schema/nodes/roof-segment-walls.test.js +92 -0
  176. package/dist/schema/nodes/roof-segment.d.ts +84 -8
  177. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  178. package/dist/schema/nodes/roof-segment.js +290 -5
  179. package/dist/schema/nodes/roof.d.ts +8 -8
  180. package/dist/schema/nodes/shelf.d.ts +3 -2
  181. package/dist/schema/nodes/shelf.d.ts.map +1 -1
  182. package/dist/schema/nodes/shelf.js +6 -0
  183. package/dist/schema/nodes/skylight.d.ts +10 -10
  184. package/dist/schema/nodes/slab.d.ts +3 -2
  185. package/dist/schema/nodes/slab.d.ts.map +1 -1
  186. package/dist/schema/nodes/slab.js +4 -0
  187. package/dist/schema/nodes/solar-panel.d.ts +4 -4
  188. package/dist/schema/nodes/stair-segment.d.ts +4 -4
  189. package/dist/schema/nodes/stair.d.ts +13 -12
  190. package/dist/schema/nodes/stair.d.ts.map +1 -1
  191. package/dist/schema/nodes/stair.js +3 -0
  192. package/dist/schema/nodes/turbine-vent.d.ts +2 -2
  193. package/dist/schema/nodes/wall.d.ts +245 -6
  194. package/dist/schema/nodes/wall.d.ts.map +1 -1
  195. package/dist/schema/nodes/wall.js +257 -0
  196. package/dist/schema/nodes/wall.test.d.ts +2 -0
  197. package/dist/schema/nodes/wall.test.d.ts.map +1 -0
  198. package/dist/schema/nodes/wall.test.js +208 -0
  199. package/dist/schema/nodes/window.d.ts +11 -3
  200. package/dist/schema/nodes/window.d.ts.map +1 -1
  201. package/dist/schema/nodes/window.js +12 -0
  202. package/dist/schema/nodes/zone.d.ts +2 -0
  203. package/dist/schema/nodes/zone.d.ts.map +1 -1
  204. package/dist/schema/nodes/zone.js +6 -0
  205. package/dist/schema/scene-material.d.ts +41 -0
  206. package/dist/schema/scene-material.d.ts.map +1 -0
  207. package/dist/schema/scene-material.js +9 -0
  208. package/dist/schema/types.d.ts +1089 -94
  209. package/dist/schema/types.d.ts.map +1 -1
  210. package/dist/schema/types.js +23 -0
  211. package/dist/services/alignment-anchors.d.ts.map +1 -1
  212. package/dist/services/alignment-anchors.js +30 -1
  213. package/dist/services/alignment.d.ts +5 -0
  214. package/dist/services/alignment.d.ts.map +1 -1
  215. package/dist/services/alignment.js +2 -0
  216. package/dist/services/hosting.d.ts +8 -0
  217. package/dist/services/hosting.d.ts.map +1 -1
  218. package/dist/services/hosting.js +13 -4
  219. package/dist/services/hosting.test.js +32 -1
  220. package/dist/services/index.d.ts +8 -2
  221. package/dist/services/index.d.ts.map +1 -1
  222. package/dist/services/index.js +8 -2
  223. package/dist/services/level-height.d.ts +28 -0
  224. package/dist/services/level-height.d.ts.map +1 -0
  225. package/dist/services/level-height.js +62 -0
  226. package/dist/services/opening-guides.d.ts +141 -0
  227. package/dist/services/opening-guides.d.ts.map +1 -0
  228. package/dist/services/opening-guides.js +267 -0
  229. package/dist/services/opening-guides.test.d.ts +2 -0
  230. package/dist/services/opening-guides.test.d.ts.map +1 -0
  231. package/dist/services/opening-guides.test.js +208 -0
  232. package/dist/services/port-connectivity.d.ts +115 -0
  233. package/dist/services/port-connectivity.d.ts.map +1 -0
  234. package/dist/services/port-connectivity.js +300 -0
  235. package/dist/services/port-connectivity.test.d.ts +2 -0
  236. package/dist/services/port-connectivity.test.d.ts.map +1 -0
  237. package/dist/services/port-connectivity.test.js +297 -0
  238. package/dist/services/riser-diagram.d.ts +40 -0
  239. package/dist/services/riser-diagram.d.ts.map +1 -0
  240. package/dist/services/riser-diagram.js +110 -0
  241. package/dist/services/riser-diagram.test.d.ts +2 -0
  242. package/dist/services/riser-diagram.test.d.ts.map +1 -0
  243. package/dist/services/riser-diagram.test.js +66 -0
  244. package/dist/services/snap.d.ts +9 -1
  245. package/dist/services/snap.d.ts.map +1 -1
  246. package/dist/services/snap.js +21 -1
  247. package/dist/services/snap.test.js +43 -1
  248. package/dist/services/system-graph.d.ts +30 -0
  249. package/dist/services/system-graph.d.ts.map +1 -0
  250. package/dist/services/system-graph.js +164 -0
  251. package/dist/services/system-graph.test.d.ts +2 -0
  252. package/dist/services/system-graph.test.d.ts.map +1 -0
  253. package/dist/services/system-graph.test.js +138 -0
  254. package/dist/services/validate-dwv.d.ts +32 -0
  255. package/dist/services/validate-dwv.d.ts.map +1 -0
  256. package/dist/services/validate-dwv.js +118 -0
  257. package/dist/services/validate-dwv.test.d.ts +2 -0
  258. package/dist/services/validate-dwv.test.d.ts.map +1 -0
  259. package/dist/services/validate-dwv.test.js +109 -0
  260. package/dist/store/actions/node-actions.d.ts.map +1 -1
  261. package/dist/store/actions/node-actions.js +94 -1
  262. package/dist/store/actions/ridge-vent-update.test.d.ts +2 -0
  263. package/dist/store/actions/ridge-vent-update.test.d.ts.map +1 -0
  264. package/dist/store/actions/ridge-vent-update.test.js +264 -0
  265. package/dist/store/history-control.d.ts +11 -0
  266. package/dist/store/history-control.d.ts.map +1 -1
  267. package/dist/store/history-control.js +33 -0
  268. package/dist/store/use-scene-dirty-tracking.test.d.ts +2 -0
  269. package/dist/store/use-scene-dirty-tracking.test.d.ts.map +1 -0
  270. package/dist/store/use-scene-dirty-tracking.test.js +68 -0
  271. package/dist/store/use-scene-measurement-roundtrip.test.d.ts +2 -0
  272. package/dist/store/use-scene-measurement-roundtrip.test.d.ts.map +1 -0
  273. package/dist/store/use-scene-measurement-roundtrip.test.js +97 -0
  274. package/dist/store/use-scene-plugins.test.d.ts +2 -0
  275. package/dist/store/use-scene-plugins.test.d.ts.map +1 -0
  276. package/dist/store/use-scene-plugins.test.js +51 -0
  277. package/dist/store/use-scene-wall-slot-migration.test.d.ts +2 -0
  278. package/dist/store/use-scene-wall-slot-migration.test.d.ts.map +1 -0
  279. package/dist/store/use-scene-wall-slot-migration.test.js +210 -0
  280. package/dist/store/use-scene-window-migration.test.d.ts +2 -0
  281. package/dist/store/use-scene-window-migration.test.d.ts.map +1 -0
  282. package/dist/store/use-scene-window-migration.test.js +85 -0
  283. package/dist/store/use-scene.d.ts +17 -2
  284. package/dist/store/use-scene.d.ts.map +1 -1
  285. package/dist/store/use-scene.js +358 -51
  286. package/dist/systems/elevator/elevator-service.js +1 -1
  287. package/dist/systems/fence/fence-centerline.d.ts +12 -0
  288. package/dist/systems/fence/fence-centerline.d.ts.map +1 -0
  289. package/dist/systems/fence/fence-centerline.js +37 -0
  290. package/dist/systems/fence/fence-spline.d.ts +39 -0
  291. package/dist/systems/fence/fence-spline.d.ts.map +1 -0
  292. package/dist/systems/fence/fence-spline.js +196 -0
  293. package/dist/systems/fence/fence-spline.test.d.ts +2 -0
  294. package/dist/systems/fence/fence-spline.test.d.ts.map +1 -0
  295. package/dist/systems/fence/fence-spline.test.js +136 -0
  296. package/dist/systems/stair/stair-footprint.d.ts.map +1 -1
  297. package/dist/systems/stair/stair-footprint.js +21 -11
  298. package/dist/systems/stair/stair-opening-preview.d.ts +1139 -469
  299. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  300. package/dist/systems/stair/stair-opening-sync.d.ts.map +1 -1
  301. package/dist/systems/stair/stair-opening-sync.js +1 -18
  302. package/dist/systems/stair/stair-opening-sync.test.js +39 -0
  303. package/dist/systems/wall/wall-mitering.d.ts.map +1 -1
  304. package/dist/systems/wall/wall-mitering.js +38 -2
  305. package/dist/systems/wall/wall-mitering.test.d.ts +2 -0
  306. package/dist/systems/wall/wall-mitering.test.d.ts.map +1 -0
  307. package/dist/systems/wall/wall-mitering.test.js +63 -0
  308. package/dist/utils/clone-scene-graph.d.ts +1 -0
  309. package/dist/utils/clone-scene-graph.d.ts.map +1 -1
  310. package/dist/utils/clone-scene-graph.js +23 -3
  311. package/dist/utils/clone-scene-graph.test.js +3 -0
  312. package/dist/utils/heal-scene-graph.d.ts +18 -0
  313. package/dist/utils/heal-scene-graph.d.ts.map +1 -0
  314. package/dist/utils/heal-scene-graph.js +90 -0
  315. package/dist/utils/heal-scene-graph.test.d.ts +2 -0
  316. package/dist/utils/heal-scene-graph.test.d.ts.map +1 -0
  317. package/dist/utils/heal-scene-graph.test.js +88 -0
  318. package/dist/validation/validate-build-json.d.ts +1 -0
  319. package/dist/validation/validate-build-json.d.ts.map +1 -1
  320. package/dist/validation/validate-build-json.js +31 -2
  321. package/package.json +3 -3
@@ -20,7 +20,7 @@ export declare const CeilingNode: z.ZodObject<{
20
20
  children: z.ZodDefault<z.ZodArray<z.ZodDefault<z.ZodTemplateLiteral<`item_${string}`>>>>;
21
21
  material: z.ZodOptional<z.ZodObject<{
22
22
  id: z.ZodOptional<z.ZodString>;
23
- preset: z.ZodOptional<z.ZodEnum<{
23
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
24
24
  custom: "custom";
25
25
  white: "white";
26
26
  brick: "brick";
@@ -31,7 +31,7 @@ export declare const CeilingNode: z.ZodObject<{
31
31
  plaster: "plaster";
32
32
  tile: "tile";
33
33
  marble: "marble";
34
- }>>;
34
+ }>>>;
35
35
  properties: z.ZodOptional<z.ZodObject<{
36
36
  color: z.ZodDefault<z.ZodString>;
37
37
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -51,6 +51,7 @@ export declare const CeilingNode: z.ZodObject<{
51
51
  }, z.core.$strip>>;
52
52
  }, z.core.$strip>>;
53
53
  materialPreset: z.ZodOptional<z.ZodString>;
54
+ slots: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
54
55
  polygon: z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
55
56
  holes: z.ZodDefault<z.ZodArray<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>>>;
56
57
  holeMetadata: z.ZodDefault<z.ZodArray<z.ZodObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"ceiling.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/ceiling.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAMvB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmBvB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA"}
1
+ {"version":3,"file":"ceiling.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/ceiling.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAMvB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuBvB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA"}
@@ -10,6 +10,10 @@ export const CeilingNode = BaseNode.extend({
10
10
  children: z.array(ItemNode.shape.id).default([]),
11
11
  material: MaterialSchema.optional(),
12
12
  materialPreset: z.string().optional(),
13
+ // Per-slot material overrides on the unified slot model, mirroring
14
+ // `ShelfNode.slots`. Key = slot id (`surface`), value = a `MaterialRef`
15
+ // (`library:<id>` / `scene:<id>`). Absent = the declared slot default.
16
+ slots: z.record(z.string(), z.string()).optional(),
13
17
  polygon: z.array(z.tuple([z.number(), z.number()])),
14
18
  holes: z.array(z.array(z.tuple([z.number(), z.number()]))).default([]),
15
19
  holeMetadata: z.array(SurfaceHoleMetadata).default([]),
@@ -24,7 +24,7 @@ export declare const ChimneyNode: z.ZodObject<{
24
24
  type: z.ZodDefault<z.ZodLiteral<"chimney">>;
25
25
  material: z.ZodOptional<z.ZodObject<{
26
26
  id: z.ZodOptional<z.ZodString>;
27
- preset: z.ZodOptional<z.ZodEnum<{
27
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
28
28
  custom: "custom";
29
29
  white: "white";
30
30
  brick: "brick";
@@ -35,7 +35,7 @@ export declare const ChimneyNode: z.ZodObject<{
35
35
  plaster: "plaster";
36
36
  tile: "tile";
37
37
  marble: "marble";
38
- }>>;
38
+ }>>>;
39
39
  properties: z.ZodOptional<z.ZodObject<{
40
40
  color: z.ZodDefault<z.ZodString>;
41
41
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -57,7 +57,7 @@ export declare const ChimneyNode: z.ZodObject<{
57
57
  materialPreset: z.ZodOptional<z.ZodString>;
58
58
  topMaterial: z.ZodOptional<z.ZodObject<{
59
59
  id: z.ZodOptional<z.ZodString>;
60
- preset: z.ZodOptional<z.ZodEnum<{
60
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
61
61
  custom: "custom";
62
62
  white: "white";
63
63
  brick: "brick";
@@ -68,7 +68,7 @@ export declare const ChimneyNode: z.ZodObject<{
68
68
  plaster: "plaster";
69
69
  tile: "tile";
70
70
  marble: "marble";
71
- }>>;
71
+ }>>>;
72
72
  properties: z.ZodOptional<z.ZodObject<{
73
73
  color: z.ZodDefault<z.ZodString>;
74
74
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -263,7 +263,7 @@ export declare const ColumnNode: z.ZodObject<{
263
263
  bracePlateEnabled: z.ZodDefault<z.ZodBoolean>;
264
264
  material: z.ZodOptional<z.ZodObject<{
265
265
  id: z.ZodOptional<z.ZodString>;
266
- preset: z.ZodOptional<z.ZodEnum<{
266
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
267
267
  custom: "custom";
268
268
  white: "white";
269
269
  brick: "brick";
@@ -274,7 +274,7 @@ export declare const ColumnNode: z.ZodObject<{
274
274
  plaster: "plaster";
275
275
  tile: "tile";
276
276
  marble: "marble";
277
- }>>;
277
+ }>>>;
278
278
  properties: z.ZodOptional<z.ZodObject<{
279
279
  color: z.ZodDefault<z.ZodString>;
280
280
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -294,6 +294,7 @@ export declare const ColumnNode: z.ZodObject<{
294
294
  }, z.core.$strip>>;
295
295
  }, z.core.$strip>>;
296
296
  materialPreset: z.ZodOptional<z.ZodString>;
297
+ slots: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
297
298
  }, z.core.$strip>;
298
299
  export declare const COLUMN_PRESETS: {
299
300
  readonly basicPillar: {
@@ -1 +1 @@
1
- {"version":3,"file":"column.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/column.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"column.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/column.ts"],"names":[],"mappings":"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"}
@@ -137,6 +137,9 @@ export const ColumnNode = BaseNode.extend({
137
137
  bracePlateEnabled: z.boolean().default(true),
138
138
  material: MaterialSchema.optional(),
139
139
  materialPreset: z.string().optional(),
140
+ // Unified paint-slot refs (`scene:`/`library:` MaterialRef per slot id),
141
+ // matching the slot model items/slab/shelf use. Absent = declared default.
142
+ slots: z.record(z.string(), z.string()).optional(),
140
143
  }).describe(dedent `
141
144
  Column node - used to represent structural or decorative pillars/columns.
142
145
  - style: visual approach such as plain, lathe-turned, carved, or cluster
@@ -19,7 +19,7 @@ export declare const CupolaNode: z.ZodObject<{
19
19
  type: z.ZodDefault<z.ZodLiteral<"cupola">>;
20
20
  material: z.ZodOptional<z.ZodObject<{
21
21
  id: z.ZodOptional<z.ZodString>;
22
- preset: z.ZodOptional<z.ZodEnum<{
22
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
23
23
  custom: "custom";
24
24
  white: "white";
25
25
  brick: "brick";
@@ -30,7 +30,7 @@ export declare const CupolaNode: z.ZodObject<{
30
30
  plaster: "plaster";
31
31
  tile: "tile";
32
32
  marble: "marble";
33
- }>>;
33
+ }>>>;
34
34
  properties: z.ZodOptional<z.ZodObject<{
35
35
  color: z.ZodDefault<z.ZodString>;
36
36
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -57,7 +57,7 @@ export declare const DoorNode: z.ZodObject<{
57
57
  type: z.ZodDefault<z.ZodLiteral<"door">>;
58
58
  material: z.ZodOptional<z.ZodObject<{
59
59
  id: z.ZodOptional<z.ZodString>;
60
- preset: z.ZodOptional<z.ZodEnum<{
60
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
61
61
  custom: "custom";
62
62
  white: "white";
63
63
  brick: "brick";
@@ -68,7 +68,7 @@ export declare const DoorNode: z.ZodObject<{
68
68
  plaster: "plaster";
69
69
  tile: "tile";
70
70
  marble: "marble";
71
- }>>;
71
+ }>>>;
72
72
  properties: z.ZodOptional<z.ZodObject<{
73
73
  color: z.ZodDefault<z.ZodString>;
74
74
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -87,6 +87,7 @@ export declare const DoorNode: z.ZodObject<{
87
87
  scale: z.ZodOptional<z.ZodNumber>;
88
88
  }, z.core.$strip>>;
89
89
  }, z.core.$strip>>;
90
+ slots: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
90
91
  position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
91
92
  rotation: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
92
93
  side: z.ZodOptional<z.ZodEnum<{
@@ -94,6 +95,13 @@ export declare const DoorNode: z.ZodObject<{
94
95
  back: "back";
95
96
  }>>;
96
97
  wallId: z.ZodOptional<z.ZodString>;
98
+ roofSegmentId: z.ZodOptional<z.ZodString>;
99
+ roofFace: z.ZodOptional<z.ZodEnum<{
100
+ front: "front";
101
+ back: "back";
102
+ right: "right";
103
+ left: "left";
104
+ }>>;
97
105
  width: z.ZodDefault<z.ZodNumber>;
98
106
  height: z.ZodDefault<z.ZodNumber>;
99
107
  doorCategory: z.ZodDefault<z.ZodEnum<{
@@ -115,8 +123,8 @@ export declare const DoorNode: z.ZodObject<{
115
123
  leafCount: z.ZodDefault<z.ZodUnion<readonly [z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>]>>;
116
124
  operationState: z.ZodDefault<z.ZodNumber>;
117
125
  slideDirection: z.ZodDefault<z.ZodEnum<{
118
- left: "left";
119
126
  right: "right";
127
+ left: "left";
120
128
  }>>;
121
129
  trackStyle: z.ZodDefault<z.ZodEnum<{
122
130
  visible: "visible";
@@ -147,8 +155,8 @@ export declare const DoorNode: z.ZodObject<{
147
155
  threshold: z.ZodDefault<z.ZodBoolean>;
148
156
  thresholdHeight: z.ZodDefault<z.ZodNumber>;
149
157
  hingesSide: z.ZodDefault<z.ZodEnum<{
150
- left: "left";
151
158
  right: "right";
159
+ left: "left";
152
160
  }>>;
153
161
  swingDirection: z.ZodDefault<z.ZodEnum<{
154
162
  inward: "inward";
@@ -170,8 +178,8 @@ export declare const DoorNode: z.ZodObject<{
170
178
  handle: z.ZodDefault<z.ZodBoolean>;
171
179
  handleHeight: z.ZodDefault<z.ZodNumber>;
172
180
  handleSide: z.ZodDefault<z.ZodEnum<{
173
- left: "left";
174
181
  right: "right";
182
+ left: "left";
175
183
  }>>;
176
184
  contentPadding: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
177
185
  doorCloser: z.ZodDefault<z.ZodBoolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"door.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/door.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,WAAW;;;;;;;;;;;iBAWtB,CAAA;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AAErD,eAAO,MAAM,YAAY;;;EAAiC,CAAA;AAC1D,eAAO,MAAM,QAAQ;;;;;;;;;;;EAWnB,CAAA;AACF,eAAO,MAAM,cAAc;;;;;EAAoD,CAAA;AAE/E,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AACvD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA;AAC/C,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAE3D,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuFnB,CAAA;AAEF,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA"}
1
+ {"version":3,"file":"door.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/door.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,WAAW;;;;;;;;;;;iBAWtB,CAAA;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AAErD,eAAO,MAAM,YAAY;;;EAAiC,CAAA;AAC1D,eAAO,MAAM,QAAQ;;;;;;;;;;;EAWnB,CAAA;AACF,eAAO,MAAM,cAAc;;;;;EAAoD,CAAA;AAE/E,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AACvD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA;AAC/C,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAE3D,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmGnB,CAAA;AAEF,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA"}
@@ -30,10 +30,22 @@ export const DoorNode = BaseNode.extend({
30
30
  id: objectId('door'),
31
31
  type: nodeType('door'),
32
32
  material: MaterialSchema.optional(),
33
+ // Per-slot material overrides on the unified slot model. Keys: `panel` (the
34
+ // door body), `glass`. Value = a `MaterialRef` (`library:<id>` / `scene:<id>`).
35
+ // Absent = the body/glass default. Mirrors `ShelfNode.slots`.
36
+ slots: z.record(z.string(), z.string()).optional(),
33
37
  position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
34
38
  rotation: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
35
39
  side: z.enum(['front', 'back']).optional(),
36
40
  wallId: z.string().optional(),
41
+ // Alternative host: a roof-segment's generated wall face (base wall
42
+ // under the roof or a coplanar gable end). When set, `position` is
43
+ // FACE-LOCAL — [u along the face, v height, z from the wall mid-plane]
44
+ // — exactly the wall-child convention; the renderer mounts the node
45
+ // inside the face frame (`getRoofWallFaceFrame`), which is what makes
46
+ // hosted children track segment resizes live.
47
+ roofSegmentId: z.string().optional(),
48
+ roofFace: z.enum(['front', 'back', 'right', 'left']).optional(),
37
49
  // Overall dimensions
38
50
  width: z.number().default(0.9),
39
51
  height: z.number().default(2.1),
@@ -49,7 +49,7 @@ export declare const DormerNode: z.ZodObject<{
49
49
  type: z.ZodDefault<z.ZodLiteral<"dormer">>;
50
50
  material: z.ZodOptional<z.ZodObject<{
51
51
  id: z.ZodOptional<z.ZodString>;
52
- preset: z.ZodOptional<z.ZodEnum<{
52
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
53
53
  custom: "custom";
54
54
  white: "white";
55
55
  brick: "brick";
@@ -60,7 +60,7 @@ export declare const DormerNode: z.ZodObject<{
60
60
  plaster: "plaster";
61
61
  tile: "tile";
62
62
  marble: "marble";
63
- }>>;
63
+ }>>>;
64
64
  properties: z.ZodOptional<z.ZodObject<{
65
65
  color: z.ZodDefault<z.ZodString>;
66
66
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -82,7 +82,7 @@ export declare const DormerNode: z.ZodObject<{
82
82
  materialPreset: z.ZodOptional<z.ZodString>;
83
83
  topMaterial: z.ZodOptional<z.ZodObject<{
84
84
  id: z.ZodOptional<z.ZodString>;
85
- preset: z.ZodOptional<z.ZodEnum<{
85
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
86
86
  custom: "custom";
87
87
  white: "white";
88
88
  brick: "brick";
@@ -93,7 +93,7 @@ export declare const DormerNode: z.ZodObject<{
93
93
  plaster: "plaster";
94
94
  tile: "tile";
95
95
  marble: "marble";
96
- }>>;
96
+ }>>>;
97
97
  properties: z.ZodOptional<z.ZodObject<{
98
98
  color: z.ZodDefault<z.ZodString>;
99
99
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -115,7 +115,7 @@ export declare const DormerNode: z.ZodObject<{
115
115
  topMaterialPreset: z.ZodOptional<z.ZodString>;
116
116
  sideMaterial: z.ZodOptional<z.ZodObject<{
117
117
  id: z.ZodOptional<z.ZodString>;
118
- preset: z.ZodOptional<z.ZodEnum<{
118
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
119
119
  custom: "custom";
120
120
  white: "white";
121
121
  brick: "brick";
@@ -126,7 +126,7 @@ export declare const DormerNode: z.ZodObject<{
126
126
  plaster: "plaster";
127
127
  tile: "tile";
128
128
  marble: "marble";
129
- }>>;
129
+ }>>>;
130
130
  properties: z.ZodOptional<z.ZodObject<{
131
131
  color: z.ZodDefault<z.ZodString>;
132
132
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -148,7 +148,7 @@ export declare const DormerNode: z.ZodObject<{
148
148
  sideMaterialPreset: z.ZodOptional<z.ZodString>;
149
149
  wallMaterial: z.ZodOptional<z.ZodObject<{
150
150
  id: z.ZodOptional<z.ZodString>;
151
- preset: z.ZodOptional<z.ZodEnum<{
151
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
152
152
  custom: "custom";
153
153
  white: "white";
154
154
  brick: "brick";
@@ -159,7 +159,7 @@ export declare const DormerNode: z.ZodObject<{
159
159
  plaster: "plaster";
160
160
  tile: "tile";
161
161
  marble: "marble";
162
- }>>;
162
+ }>>>;
163
163
  properties: z.ZodOptional<z.ZodObject<{
164
164
  color: z.ZodDefault<z.ZodString>;
165
165
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -76,7 +76,7 @@ export const DormerNode = BaseNode.extend({
76
76
  windowCornerRadii: z
77
77
  .tuple([z.number(), z.number(), z.number(), z.number()])
78
78
  .default(DEFAULT_CORNER_RADII),
79
- windowSill: z.boolean().default(true),
79
+ windowSill: z.boolean().default(false),
80
80
  windowSillDepth: z.number().default(DORMER_DEFAULTS.WINDOW_SILL_DEPTH),
81
81
  windowSillThickness: z.number().default(DORMER_DEFAULTS.WINDOW_SILL_THICKNESS),
82
82
  }).describe(dedent `
@@ -19,7 +19,7 @@ export declare const DownspoutNode: z.ZodObject<{
19
19
  type: z.ZodDefault<z.ZodLiteral<"downspout">>;
20
20
  material: z.ZodOptional<z.ZodObject<{
21
21
  id: z.ZodOptional<z.ZodString>;
22
- preset: z.ZodOptional<z.ZodEnum<{
22
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
23
23
  custom: "custom";
24
24
  white: "white";
25
25
  brick: "brick";
@@ -30,7 +30,7 @@ export declare const DownspoutNode: z.ZodObject<{
30
30
  plaster: "plaster";
31
31
  tile: "tile";
32
32
  marble: "marble";
33
- }>>;
33
+ }>>>;
34
34
  properties: z.ZodOptional<z.ZodObject<{
35
35
  color: z.ZodDefault<z.ZodString>;
36
36
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -0,0 +1,91 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Duct fitting — the junction pieces that connect round duct segments:
4
+ * elbows (direction change), tees (branch takeoff), reducers (diameter
5
+ * transition).
6
+ *
7
+ * Phase 2 of the HVAC node system. Fittings are the first kind to expose
8
+ * typed ports (`def.ports`) — placement tools snap duct endpoints onto a
9
+ * fitting's collars, and the future system graph walks ports to decide
10
+ * connectivity.
11
+ *
12
+ * `position` is level-local meters; `rotation` is an XYZ euler in radians
13
+ * so a fitting can turn a horizontal run vertical (riser elbows).
14
+ *
15
+ * Local-frame conventions (before `rotation` is applied):
16
+ * - elbow: inlet faces -X, outlet turned by `angle` degrees in the
17
+ * XZ plane (90° → +Z).
18
+ * - tee: run along the X axis (ports face -X and +X), branch
19
+ * collar at `branchAngle`° from the +X (outlet) axis in the
20
+ * XZ plane — 90° a square straight tee, <90° a lateral
21
+ * leaning downstream toward the outlet, >90° leaning upstream
22
+ * toward the inlet — sized at `diameter2`.
23
+ * - cross: four-way junction — run along the X axis (ports face -X
24
+ * and +X) at the run profile, two opposed branches square to
25
+ * the run along ±Z (branch faces +Z, branch2 faces -Z) at the
26
+ * branch profile (`shape2` / `diameter2`).
27
+ * - reducer: inlet at `diameter` faces -X, outlet at `diameter2`
28
+ * faces +X.
29
+ * - transition: square-to-round — rect end at `width` × `height` faces
30
+ * -X, round end at `diameter2` faces +X. `diameter` carries
31
+ * the rect end's area-equivalent round size.
32
+ */
33
+ export declare const DuctFittingNode: z.ZodObject<{
34
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
35
+ name: z.ZodOptional<z.ZodString>;
36
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
37
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
38
+ camera: z.ZodOptional<z.ZodObject<{
39
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
40
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
41
+ mode: z.ZodDefault<z.ZodEnum<{
42
+ perspective: "perspective";
43
+ orthographic: "orthographic";
44
+ }>>;
45
+ fov: z.ZodOptional<z.ZodNumber>;
46
+ zoom: z.ZodOptional<z.ZodNumber>;
47
+ }, z.core.$strip>>;
48
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
49
+ id: z.ZodDefault<z.ZodTemplateLiteral<`duct-fitting_${string}`>>;
50
+ type: z.ZodDefault<z.ZodLiteral<"duct-fitting">>;
51
+ position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
52
+ rotation: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
53
+ fittingType: z.ZodDefault<z.ZodEnum<{
54
+ elbow: "elbow";
55
+ tee: "tee";
56
+ cross: "cross";
57
+ reducer: "reducer";
58
+ transition: "transition";
59
+ }>>;
60
+ shape: z.ZodDefault<z.ZodEnum<{
61
+ round: "round";
62
+ rect: "rect";
63
+ oval: "oval";
64
+ }>>;
65
+ width: z.ZodDefault<z.ZodNumber>;
66
+ height: z.ZodDefault<z.ZodNumber>;
67
+ shape2: z.ZodDefault<z.ZodEnum<{
68
+ round: "round";
69
+ rect: "rect";
70
+ oval: "oval";
71
+ }>>;
72
+ width2: z.ZodDefault<z.ZodNumber>;
73
+ height2: z.ZodDefault<z.ZodNumber>;
74
+ angle: z.ZodDefault<z.ZodNumber>;
75
+ branchAngle: z.ZodDefault<z.ZodNumber>;
76
+ diameter: z.ZodDefault<z.ZodNumber>;
77
+ diameter2: z.ZodDefault<z.ZodNumber>;
78
+ ductMaterial: z.ZodDefault<z.ZodEnum<{
79
+ "sheet-metal": "sheet-metal";
80
+ flex: "flex";
81
+ "duct-board": "duct-board";
82
+ }>>;
83
+ system: z.ZodDefault<z.ZodEnum<{
84
+ supply: "supply";
85
+ return: "return";
86
+ }>>;
87
+ slots: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
88
+ }, z.core.$strip>;
89
+ export type DuctFittingNode = z.infer<typeof DuctFittingNode>;
90
+ export type DuctFittingNodeId = DuctFittingNode['id'];
91
+ //# sourceMappingURL=duct-fitting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duct-fitting.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/duct-fitting.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2D3B,CAAA;AACD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAC7D,MAAM,MAAM,iBAAiB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA"}
@@ -0,0 +1,92 @@
1
+ import dedent from 'dedent';
2
+ import { z } from 'zod';
3
+ import { BaseNode, nodeType, objectId } from '../base';
4
+ /**
5
+ * Duct fitting — the junction pieces that connect round duct segments:
6
+ * elbows (direction change), tees (branch takeoff), reducers (diameter
7
+ * transition).
8
+ *
9
+ * Phase 2 of the HVAC node system. Fittings are the first kind to expose
10
+ * typed ports (`def.ports`) — placement tools snap duct endpoints onto a
11
+ * fitting's collars, and the future system graph walks ports to decide
12
+ * connectivity.
13
+ *
14
+ * `position` is level-local meters; `rotation` is an XYZ euler in radians
15
+ * so a fitting can turn a horizontal run vertical (riser elbows).
16
+ *
17
+ * Local-frame conventions (before `rotation` is applied):
18
+ * - elbow: inlet faces -X, outlet turned by `angle` degrees in the
19
+ * XZ plane (90° → +Z).
20
+ * - tee: run along the X axis (ports face -X and +X), branch
21
+ * collar at `branchAngle`° from the +X (outlet) axis in the
22
+ * XZ plane — 90° a square straight tee, <90° a lateral
23
+ * leaning downstream toward the outlet, >90° leaning upstream
24
+ * toward the inlet — sized at `diameter2`.
25
+ * - cross: four-way junction — run along the X axis (ports face -X
26
+ * and +X) at the run profile, two opposed branches square to
27
+ * the run along ±Z (branch faces +Z, branch2 faces -Z) at the
28
+ * branch profile (`shape2` / `diameter2`).
29
+ * - reducer: inlet at `diameter` faces -X, outlet at `diameter2`
30
+ * faces +X.
31
+ * - transition: square-to-round — rect end at `width` × `height` faces
32
+ * -X, round end at `diameter2` faces +X. `diameter` carries
33
+ * the rect end's area-equivalent round size.
34
+ */
35
+ export const DuctFittingNode = BaseNode.extend({
36
+ id: objectId('duct-fitting'),
37
+ type: nodeType('duct-fitting'),
38
+ // Level-local meters.
39
+ position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
40
+ // XYZ euler radians.
41
+ rotation: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
42
+ fittingType: z.enum(['elbow', 'tee', 'cross', 'reducer', 'transition']).default('elbow'),
43
+ // Run-leg cross-section: round collars, or a rect / flat-oval profile
44
+ // matching the trunk the fitting sits in. Reducers ignore the shape.
45
+ // When non-round, `diameter` carries the area-equivalent round size
46
+ // (drives leg lengths + advertised ports).
47
+ shape: z.enum(['round', 'rect', 'oval']).default('rect'),
48
+ // Rect / oval run-leg profile in inches (used when shape ≠ 'round').
49
+ width: z.number().min(4).max(60).default(14),
50
+ height: z.number().min(3).max(40).default(8),
51
+ // Tee / cross BRANCH cross-section: a round collar at `diameter2` or a
52
+ // rect / oval profile matching the duct drawn off the tap. When
53
+ // non-round, `diameter2` carries the branch's area-equivalent round
54
+ // size. A cross's two opposed branches share this one profile.
55
+ shape2: z.enum(['round', 'rect', 'oval']).default('rect'),
56
+ // Rect / oval branch profile in inches (used when shape2 ≠ 'round').
57
+ width2: z.number().min(4).max(60).default(14),
58
+ height2: z.number().min(3).max(40).default(8),
59
+ // Elbow turn angle in degrees. Residential sheet-metal elbows come in
60
+ // 90° and 45°; adjustable elbows cover the range between. 0° is a
61
+ // straight coupling — what an elbow flattens to when its run is dragged
62
+ // into line with the fixed collar.
63
+ angle: z.number().min(0).max(90).default(90),
64
+ // Tee branch angle in degrees, measured off the +X (outlet) axis: 90°
65
+ // is a square straight tee, <90° a lateral whose branch sweeps
66
+ // downstream toward the outlet (flow merges), >90° leans the branch
67
+ // upstream toward the inlet. Ignored by every other fitting type.
68
+ branchAngle: z.number().min(45).max(135).default(90),
69
+ // Main (run/inlet) nominal diameter in inches.
70
+ diameter: z.number().min(2).max(48).default(6),
71
+ // Secondary diameter in inches — tee branch collar, reducer outlet.
72
+ // Ignored by elbows.
73
+ diameter2: z.number().min(2).max(48).default(6),
74
+ ductMaterial: z.enum(['sheet-metal', 'flex', 'duct-board']).default('sheet-metal'),
75
+ system: z.enum(['supply', 'return']).default('supply'),
76
+ slots: z.record(z.string(), z.string()).optional(),
77
+ }).describe(dedent `
78
+ Duct fitting - elbow, tee, cross, reducer, or square-to-round transition between duct runs.
79
+ - position: [x, y, z] level-local meters
80
+ - rotation: [x, y, z] euler radians
81
+ - fittingType: elbow | tee | cross | reducer | transition (rect end -X, round end +X)
82
+ - shape: round | rect | oval run legs (matches the trunk; ignored by reducer / transition)
83
+ - width / height: rect / oval run-leg profile in inches (transition: the rect end)
84
+ - shape2: round | rect | oval tee / cross branch (matches the duct drawn off the tap)
85
+ - width2 / height2: rect / oval branch profile in inches
86
+ - angle: elbow turn in degrees (45 or 90 typical)
87
+ - branchAngle: tee branch angle off the outlet axis (90 straight tee, 45 downstream lateral, 135 upstream); cross branches are always square
88
+ - diameter: main nominal diameter in inches
89
+ - diameter2: tee / cross branch / reducer outlet / transition round-end diameter in inches
90
+ - ductMaterial: sheet-metal | flex | duct-board
91
+ - system: supply | return
92
+ `);
@@ -0,0 +1,61 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Round duct segment — a polyline of 3D points connected by cylindrical
4
+ * duct sections. Forced-air HVAC supply/return runs in US residential.
5
+ *
6
+ * Phase 1 of the HVAC node system: just the geometry primitive. Fittings,
7
+ * terminals, equipment, and typed ports come in later slices.
8
+ *
9
+ * Path coordinates are level-local meters: [x, y, z] tuples. y is height
10
+ * above the level floor. A duct hung at ceiling height through three points
11
+ * is e.g. `[[0, 2.6, 0], [3, 2.6, 0], [3, 2.6, 4]]`.
12
+ *
13
+ * Diameters are nominal US round-duct sizes in inches; the geometry
14
+ * builder converts to meters for the cylinder radius.
15
+ */
16
+ export declare const DuctSegmentNode: z.ZodObject<{
17
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
18
+ name: z.ZodOptional<z.ZodString>;
19
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
20
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
21
+ camera: z.ZodOptional<z.ZodObject<{
22
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
23
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
24
+ mode: z.ZodDefault<z.ZodEnum<{
25
+ perspective: "perspective";
26
+ orthographic: "orthographic";
27
+ }>>;
28
+ fov: z.ZodOptional<z.ZodNumber>;
29
+ zoom: z.ZodOptional<z.ZodNumber>;
30
+ }, z.core.$strip>>;
31
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
32
+ id: z.ZodDefault<z.ZodTemplateLiteral<`duct-segment_${string}`>>;
33
+ type: z.ZodDefault<z.ZodLiteral<"duct-segment">>;
34
+ path: z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
35
+ shape: z.ZodDefault<z.ZodEnum<{
36
+ round: "round";
37
+ rect: "rect";
38
+ oval: "oval";
39
+ }>>;
40
+ diameter: z.ZodDefault<z.ZodNumber>;
41
+ width: z.ZodDefault<z.ZodNumber>;
42
+ height: z.ZodDefault<z.ZodNumber>;
43
+ roll: z.ZodDefault<z.ZodNumber>;
44
+ ductMaterial: z.ZodDefault<z.ZodEnum<{
45
+ spiral: "spiral";
46
+ "sheet-metal": "sheet-metal";
47
+ flex: "flex";
48
+ "duct-board": "duct-board";
49
+ }>>;
50
+ seamDetail: z.ZodDefault<z.ZodBoolean>;
51
+ insulated: z.ZodDefault<z.ZodBoolean>;
52
+ insulationR: z.ZodDefault<z.ZodNumber>;
53
+ system: z.ZodDefault<z.ZodEnum<{
54
+ supply: "supply";
55
+ return: "return";
56
+ }>>;
57
+ slots: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
58
+ }, z.core.$strip>;
59
+ export type DuctSegmentNode = z.infer<typeof DuctSegmentNode>;
60
+ export type DuctSegmentNodeId = DuctSegmentNode['id'];
61
+ //# sourceMappingURL=duct-segment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duct-segment.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/duct-segment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyD3B,CAAA;AACD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAC7D,MAAM,MAAM,iBAAiB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA"}