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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +23 -0
  3. package/dist/capture/index.d.ts +3 -0
  4. package/dist/capture/index.d.ts.map +1 -0
  5. package/dist/capture/index.js +2 -0
  6. package/dist/capture/schema.d.ts +417 -0
  7. package/dist/capture/schema.d.ts.map +1 -0
  8. package/dist/capture/schema.js +348 -0
  9. package/dist/capture/source.d.ts +60 -0
  10. package/dist/capture/source.d.ts.map +1 -0
  11. package/dist/capture/source.js +254 -0
  12. package/dist/events/bus.d.ts +55 -7
  13. package/dist/events/bus.d.ts.map +1 -1
  14. package/dist/events/hidden-wall-pointer-hold.d.ts +28 -0
  15. package/dist/events/hidden-wall-pointer-hold.d.ts.map +1 -0
  16. package/dist/events/hidden-wall-pointer-hold.js +37 -0
  17. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +2785 -1
  18. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  19. package/dist/hooks/spatial-grid/spatial-grid-sync.js +132 -19
  20. package/dist/hooks/spatial-grid/support-host-patch.d.ts +45 -1
  21. package/dist/hooks/spatial-grid/support-host-patch.d.ts.map +1 -1
  22. package/dist/hooks/spatial-grid/support-host-patch.js +171 -6
  23. package/dist/index.d.ts +14 -6
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +16 -5
  26. package/dist/lib/asset-storage.d.ts.map +1 -1
  27. package/dist/lib/asset-storage.js +4 -1
  28. package/dist/lib/polygon-union.d.ts +4 -0
  29. package/dist/lib/polygon-union.d.ts.map +1 -0
  30. package/dist/lib/polygon-union.js +306 -0
  31. package/dist/lib/roof-overlap.d.ts +32 -0
  32. package/dist/lib/roof-overlap.d.ts.map +1 -0
  33. package/dist/lib/roof-overlap.js +72 -0
  34. package/dist/lib/slab-polygon.d.ts +35 -2
  35. package/dist/lib/slab-polygon.d.ts.map +1 -1
  36. package/dist/lib/slab-polygon.js +133 -27
  37. package/dist/lib/space-detection.d.ts +11 -0
  38. package/dist/lib/space-detection.d.ts.map +1 -1
  39. package/dist/lib/space-detection.js +42 -14
  40. package/dist/registry/handles.d.ts +24 -3
  41. package/dist/registry/handles.d.ts.map +1 -1
  42. package/dist/registry/index.d.ts +3 -4
  43. package/dist/registry/index.d.ts.map +1 -1
  44. package/dist/registry/index.js +1 -2
  45. package/dist/registry/registry.d.ts +13 -6
  46. package/dist/registry/registry.d.ts.map +1 -1
  47. package/dist/registry/registry.js +37 -4
  48. package/dist/registry/scene-api.d.ts +16 -0
  49. package/dist/registry/scene-api.d.ts.map +1 -1
  50. package/dist/registry/scene-api.js +49 -1
  51. package/dist/registry/types.d.ts +226 -13
  52. package/dist/registry/types.d.ts.map +1 -1
  53. package/dist/schema/__bench__/node-parsers.bench.d.ts +24 -0
  54. package/dist/schema/__bench__/node-parsers.bench.d.ts.map +1 -0
  55. package/dist/schema/__bench__/node-parsers.bench.js +314 -0
  56. package/dist/schema/__fixtures__/node-fixtures.d.ts +28 -0
  57. package/dist/schema/__fixtures__/node-fixtures.d.ts.map +1 -0
  58. package/dist/schema/__fixtures__/node-fixtures.js +125 -0
  59. package/dist/schema/base.d.ts +1 -1
  60. package/dist/schema/base.d.ts.map +1 -1
  61. package/dist/schema/base.js +8 -1
  62. package/dist/schema/compiled-node-parsers.d.ts +40 -0
  63. package/dist/schema/compiled-node-parsers.d.ts.map +1 -0
  64. package/dist/schema/compiled-node-parsers.js +95 -0
  65. package/dist/schema/index.d.ts +19 -15
  66. package/dist/schema/index.d.ts.map +1 -1
  67. package/dist/schema/index.js +17 -12
  68. package/dist/schema/material.d.ts +2 -1
  69. package/dist/schema/material.d.ts.map +1 -1
  70. package/dist/schema/material.js +1 -0
  71. package/dist/schema/nodes/automatic-downspout.d.ts +17 -0
  72. package/dist/schema/nodes/automatic-downspout.d.ts.map +1 -0
  73. package/dist/schema/nodes/automatic-downspout.js +237 -0
  74. package/dist/schema/nodes/block.d.ts +107 -0
  75. package/dist/schema/nodes/block.d.ts.map +1 -0
  76. package/dist/schema/nodes/block.js +207 -0
  77. package/dist/schema/nodes/box-vent.d.ts +8 -2
  78. package/dist/schema/nodes/box-vent.d.ts.map +1 -1
  79. package/dist/schema/nodes/box-vent.js +2 -0
  80. package/dist/schema/nodes/building.d.ts +1 -1
  81. package/dist/schema/nodes/cabinet.d.ts +25 -3
  82. package/dist/schema/nodes/cabinet.d.ts.map +1 -1
  83. package/dist/schema/nodes/cabinet.js +26 -5
  84. package/dist/schema/nodes/ceiling.d.ts +1 -1
  85. package/dist/schema/nodes/chimney.d.ts +2 -2
  86. package/dist/schema/nodes/column.d.ts +6 -6
  87. package/dist/schema/nodes/construction-dimension.d.ts +4 -4
  88. package/dist/schema/nodes/cupola.d.ts +9 -1
  89. package/dist/schema/nodes/cupola.d.ts.map +1 -1
  90. package/dist/schema/nodes/cupola.js +2 -0
  91. package/dist/schema/nodes/door.d.ts +1 -1
  92. package/dist/schema/nodes/dormer.d.ts +44 -1
  93. package/dist/schema/nodes/dormer.d.ts.map +1 -1
  94. package/dist/schema/nodes/dormer.js +131 -7
  95. package/dist/schema/nodes/downspout.d.ts +11 -1
  96. package/dist/schema/nodes/downspout.d.ts.map +1 -1
  97. package/dist/schema/nodes/downspout.js +24 -0
  98. package/dist/schema/nodes/duct-fitting.d.ts +18 -1
  99. package/dist/schema/nodes/duct-fitting.d.ts.map +1 -1
  100. package/dist/schema/nodes/duct-fitting.js +25 -4
  101. package/dist/schema/nodes/duct-segment.d.ts +23 -1
  102. package/dist/schema/nodes/duct-segment.d.ts.map +1 -1
  103. package/dist/schema/nodes/duct-segment.js +20 -0
  104. package/dist/schema/nodes/duct-terminal.d.ts +1 -1
  105. package/dist/schema/nodes/elevator.d.ts +1 -1
  106. package/dist/schema/nodes/eyebrow-vent.d.ts +8 -2
  107. package/dist/schema/nodes/eyebrow-vent.d.ts.map +1 -1
  108. package/dist/schema/nodes/eyebrow-vent.js +2 -0
  109. package/dist/schema/nodes/fence.d.ts +1 -1
  110. package/dist/schema/nodes/guide.d.ts +1 -1
  111. package/dist/schema/nodes/gutter.d.ts +36 -2
  112. package/dist/schema/nodes/gutter.d.ts.map +1 -1
  113. package/dist/schema/nodes/gutter.js +308 -1
  114. package/dist/schema/nodes/hanger-overrides.d.ts +7 -0
  115. package/dist/schema/nodes/hanger-overrides.d.ts.map +1 -0
  116. package/dist/schema/nodes/hanger-overrides.js +6 -0
  117. package/dist/schema/nodes/hvac-equipment.d.ts +1 -1
  118. package/dist/schema/nodes/item.d.ts +4 -3
  119. package/dist/schema/nodes/item.d.ts.map +1 -1
  120. package/dist/schema/nodes/item.js +5 -0
  121. package/dist/schema/nodes/lean-to-extension.d.ts +212 -0
  122. package/dist/schema/nodes/lean-to-extension.d.ts.map +1 -0
  123. package/dist/schema/nodes/lean-to-extension.js +114 -0
  124. package/dist/schema/nodes/level.d.ts +2 -2
  125. package/dist/schema/nodes/level.d.ts.map +1 -1
  126. package/dist/schema/nodes/lineset.d.ts +1 -1
  127. package/dist/schema/nodes/liquid-line.d.ts +1 -1
  128. package/dist/schema/nodes/measurement.d.ts +1 -1
  129. package/dist/schema/nodes/pipe-fitting.d.ts +9 -1
  130. package/dist/schema/nodes/pipe-fitting.d.ts.map +1 -1
  131. package/dist/schema/nodes/pipe-fitting.js +6 -2
  132. package/dist/schema/nodes/pipe-segment.d.ts +23 -1
  133. package/dist/schema/nodes/pipe-segment.d.ts.map +1 -1
  134. package/dist/schema/nodes/pipe-segment.js +20 -0
  135. package/dist/schema/nodes/pipe-trap.d.ts +1 -1
  136. package/dist/schema/nodes/ridge-vent.d.ts +1 -1
  137. package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
  138. package/dist/schema/nodes/ridge-vent.js +4 -1
  139. package/dist/schema/nodes/roof-segment-shape.d.ts +4 -0
  140. package/dist/schema/nodes/roof-segment-shape.d.ts.map +1 -1
  141. package/dist/schema/nodes/roof-segment-shape.js +64 -1
  142. package/dist/schema/nodes/roof-segment-walls.d.ts +3 -1
  143. package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -1
  144. package/dist/schema/nodes/roof-segment-walls.js +1 -1
  145. package/dist/schema/nodes/roof-segment.d.ts +41 -1
  146. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  147. package/dist/schema/nodes/roof-segment.js +79 -2
  148. package/dist/schema/nodes/roof.d.ts +22 -1
  149. package/dist/schema/nodes/roof.d.ts.map +1 -1
  150. package/dist/schema/nodes/roof.js +14 -0
  151. package/dist/schema/nodes/scan.d.ts +19 -2
  152. package/dist/schema/nodes/scan.d.ts.map +1 -1
  153. package/dist/schema/nodes/scan.js +11 -1
  154. package/dist/schema/nodes/shelf.d.ts +2 -2
  155. package/dist/schema/nodes/site.d.ts +1 -1
  156. package/dist/schema/nodes/skylight.d.ts +1 -1
  157. package/dist/schema/nodes/slab.d.ts +1 -1
  158. package/dist/schema/nodes/solar-panel.d.ts +1 -1
  159. package/dist/schema/nodes/spawn.d.ts +1 -1
  160. package/dist/schema/nodes/stair-segment.d.ts +1 -1
  161. package/dist/schema/nodes/stair.d.ts +1 -1
  162. package/dist/schema/nodes/structural-grid.d.ts +1 -1
  163. package/dist/schema/nodes/turbine-vent.d.ts +7 -1
  164. package/dist/schema/nodes/turbine-vent.d.ts.map +1 -1
  165. package/dist/schema/nodes/turbine-vent.js +2 -0
  166. package/dist/schema/nodes/wall.d.ts +4 -4
  167. package/dist/schema/nodes/wall.d.ts.map +1 -1
  168. package/dist/schema/nodes/wall.js +7 -1
  169. package/dist/schema/nodes/window.d.ts +10 -3
  170. package/dist/schema/nodes/window.d.ts.map +1 -1
  171. package/dist/schema/nodes/window.js +4 -0
  172. package/dist/schema/nodes/zone.d.ts +2 -2
  173. package/dist/schema/nodes/zone.js +1 -1
  174. package/dist/schema/types.d.ts +484 -109
  175. package/dist/schema/types.d.ts.map +1 -1
  176. package/dist/schema/types.js +27 -1
  177. package/dist/services/hosting.d.ts +2 -2
  178. package/dist/services/hosting.d.ts.map +1 -1
  179. package/dist/services/hosting.js +4 -4
  180. package/dist/services/index.d.ts +1 -1
  181. package/dist/services/index.d.ts.map +1 -1
  182. package/dist/services/index.js +1 -1
  183. package/dist/services/system-graph.d.ts +11 -0
  184. package/dist/services/system-graph.d.ts.map +1 -1
  185. package/dist/services/system-graph.js +35 -5
  186. package/dist/store/actions/node-actions.d.ts +7 -0
  187. package/dist/store/actions/node-actions.d.ts.map +1 -1
  188. package/dist/store/actions/node-actions.js +429 -17
  189. package/dist/store/history-invalidation.d.ts +3 -0
  190. package/dist/store/history-invalidation.d.ts.map +1 -0
  191. package/dist/store/history-invalidation.js +72 -0
  192. package/dist/store/scene-hydration.d.ts +5 -0
  193. package/dist/store/scene-hydration.d.ts.map +1 -0
  194. package/dist/store/scene-hydration.js +57 -0
  195. package/dist/store/use-scene.d.ts +3 -0
  196. package/dist/store/use-scene.d.ts.map +1 -1
  197. package/dist/store/use-scene.js +332 -64
  198. package/dist/systems/roof/roof-elevation-system.d.ts +3 -0
  199. package/dist/systems/roof/roof-elevation-system.d.ts.map +1 -0
  200. package/dist/systems/roof/roof-elevation-system.js +94 -0
  201. package/dist/systems/roof/roof-elevation.d.ts +4 -0
  202. package/dist/systems/roof/roof-elevation.d.ts.map +1 -0
  203. package/dist/systems/roof/roof-elevation.js +95 -0
  204. package/dist/systems/roof/roof-footprint.d.ts +17 -0
  205. package/dist/systems/roof/roof-footprint.d.ts.map +1 -0
  206. package/dist/systems/roof/roof-footprint.js +83 -0
  207. package/dist/systems/stair/stair-flight.d.ts +17 -0
  208. package/dist/systems/stair/stair-flight.d.ts.map +1 -0
  209. package/dist/systems/stair/stair-flight.js +27 -0
  210. package/dist/systems/stair/stair-opening-preview.d.ts +1555 -1328
  211. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  212. package/dist/systems/stair/stair-opening-system.d.ts +1 -0
  213. package/dist/systems/stair/stair-opening-system.d.ts.map +1 -1
  214. package/dist/systems/stair/stair-opening-system.js +93 -96
  215. package/dist/systems/stair/stair-rise.d.ts.map +1 -1
  216. package/dist/systems/stair/stair-rise.js +20 -21
  217. package/dist/systems/wall/wall-curve.d.ts +1 -0
  218. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  219. package/dist/systems/wall/wall-curve.js +73 -0
  220. package/dist/systems/wall/wall-footprint.d.ts +1 -0
  221. package/dist/systems/wall/wall-footprint.d.ts.map +1 -1
  222. package/dist/systems/wall/wall-footprint.js +1 -0
  223. package/dist/utils/clone-scene-graph.d.ts.map +1 -1
  224. package/dist/utils/clone-scene-graph.js +26 -0
  225. package/dist/validation/validate-build-json.d.ts +3 -0
  226. package/dist/validation/validate-build-json.d.ts.map +1 -1
  227. package/dist/validation/validate-build-json.js +49 -2
  228. package/package.json +10 -3
  229. package/dist/systems/elevator/elevator-runtime-system.d.ts +0 -2
  230. package/dist/systems/elevator/elevator-runtime-system.d.ts.map +0 -1
  231. package/dist/systems/elevator/elevator-runtime-system.js +0 -8
@@ -2,7 +2,16 @@ import dedent from 'dedent';
2
2
  import { z } from 'zod';
3
3
  import { BaseNode, nodeType, objectId } from '../base';
4
4
  import { MaterialSchema } from '../material';
5
- export const RoofType = z.enum(['hip', 'gable', 'shed', 'gambrel', 'dutch', 'mansard', 'flat']);
5
+ export const RoofType = z.enum([
6
+ 'hip',
7
+ 'gable',
8
+ 'shed',
9
+ 'gambrel',
10
+ 'dutch',
11
+ 'mansard',
12
+ 'flat',
13
+ 'conical',
14
+ ]);
6
15
  export const MIN_ROOF_SEGMENT_TRIM_SPAN = 0.1;
7
16
  const DEFAULT_ROOF_SEGMENT_WIDTH = 8;
8
17
  const DEFAULT_ROOF_SEGMENT_DEPTH = 6;
@@ -96,6 +105,18 @@ export const RoofSegmentNode = BaseNode.extend({
96
105
  // Footprint dimensions
97
106
  width: z.number().default(8),
98
107
  depth: z.number().default(6),
108
+ // Angular extent of a conical roof. A full cone uses 2π. A signed
109
+ // sweep preserves the direction of the curved wall used to create a
110
+ // conical sector; other roof types ignore both fields.
111
+ conicalStartAngle: z.number().optional(),
112
+ conicalSweepAngle: z
113
+ .number()
114
+ .min(-Math.PI * 2)
115
+ .max(Math.PI * 2)
116
+ .optional(),
117
+ // Overrides the stored sector angles without discarding them, allowing
118
+ // the panel to switch back to the original clipped wall sweep.
119
+ conicalFullCircle: z.boolean().optional(),
99
120
  // Segment-local distances trimmed from each footprint side. The trim
100
121
  // boundary is projected vertically through the roof volume, so the
101
122
  // resulting edge follows the actual sloped roof surfaces.
@@ -112,6 +133,34 @@ export const RoofSegmentNode = BaseNode.extend({
112
133
  deckThickness: z.number().default(0.1),
113
134
  overhang: z.number().default(0.3),
114
135
  shingleThickness: z.number().default(0.05),
136
+ arc: z
137
+ .object({
138
+ centerX: z.number(),
139
+ centerZ: z.number(),
140
+ radius: z.number(),
141
+ })
142
+ .optional()
143
+ .describe('Concentric-arc descriptor for a curved shed deck, in segment-local coordinates (center + true radius). Absent for a straight deck.'),
144
+ shedSideInfillSpan: z.number().positive().optional(),
145
+ shedSideInfillMinX: z.number().optional(),
146
+ shedSideInfillMaxX: z.number().optional(),
147
+ shedFootprintPieces: z.array(z.array(z.tuple([z.number(), z.number()])).min(3)).optional(),
148
+ shedOpenEndSides: z.array(z.enum(['left', 'right'])).optional(),
149
+ // Shared scene-scope data for comparing shed seams that live under separate
150
+ // roof parents. Kind-owned assembly code supplies it; the renderer remains
151
+ // independent of the kind that produced the segment.
152
+ shedJointFrame: z
153
+ .object({
154
+ position: z.tuple([z.number(), z.number(), z.number()]),
155
+ rotation: z.number(),
156
+ })
157
+ .optional(),
158
+ shedJointOwnerId: z.string().optional(),
159
+ shedJointNeighborIds: z.array(z.string()).optional(),
160
+ shedJointScopeId: z.string().optional(),
161
+ managedByParent: z.boolean().default(false),
162
+ wallShell: z.enum(['auto', 'include', 'omit']).default('auto'),
163
+ shedInsetEndPanels: z.boolean().default(false),
115
164
  // Shape-specific ratios. Only the pair matching `roofType` is read; the
116
165
  // rest are inert. Defined on every segment so the panel can flip
117
166
  // roofType without losing the previous shape's tuning.
@@ -169,8 +218,10 @@ export const RoofSegmentNode = BaseNode.extend({
169
218
  Roof segment node - an individual roof module within a roof group.
170
219
  Each segment generates a complete architectural volume (walls + roof).
171
220
  Multiple segments can be combined to form complex roof shapes.
172
- - roofType: hip, gable, shed, gambrel, dutch, mansard, flat
221
+ - roofType: hip, gable, shed, gambrel, dutch, mansard, flat, conical
173
222
  - width/depth: footprint dimensions
223
+ - conicalStartAngle / conicalSweepAngle: angular extent of a conical sector (radians)
224
+ - conicalFullCircle: temporarily render the complete cone while preserving the sector angles
174
225
  - trim: segment-local side cut distances
175
226
  - wallHeight: height of walls below the roof
176
227
  - pitch: roof slope in degrees (angle of the primary slope face)
@@ -184,6 +235,20 @@ export const RoofSegmentNode = BaseNode.extend({
184
235
  - dutchGabletRake: gablet barge-board overhang past the gablet end-wall (m, 0 = none)
185
236
  - dutchTopRakeThickness: thickness of the top gable rake slab
186
237
  `);
238
+ export function getConicalRoofCoverage(node) {
239
+ const storedSweep = node.conicalSweepAngle;
240
+ const inferredFullCircle = storedSweep === undefined || Math.abs(storedSweep) >= Math.PI * 2 - 1e-4;
241
+ const fullCircle = node.conicalFullCircle ?? inferredFullCircle;
242
+ if (fullCircle) {
243
+ return { fullCircle: true, startAngle: 0, sweepAngle: -Math.PI * 2 };
244
+ }
245
+ const hasClippedSweep = storedSweep !== undefined && Math.abs(storedSweep) < Math.PI * 2 - 1e-4;
246
+ return {
247
+ fullCircle: false,
248
+ startAngle: node.conicalStartAngle ?? 0,
249
+ sweepAngle: hasClippedSweep ? storedSweep : -Math.PI,
250
+ };
251
+ }
187
252
  function finiteNonNegative(value) {
188
253
  return typeof value === 'number' && Number.isFinite(value) ? Math.max(0, value) : 0;
189
254
  }
@@ -323,6 +388,8 @@ export function getDutchRoofMetrics(input) {
323
388
  function getPrimarySlopeRun(input) {
324
389
  const min = Math.min(input.width, input.depth);
325
390
  switch (input.roofType) {
391
+ case 'conical':
392
+ return input.width / 2;
326
393
  case 'shed':
327
394
  return input.depth;
328
395
  case 'gable':
@@ -395,6 +462,7 @@ export function getRoofSegmentVisibleTopBounds(segment) {
395
462
  let frontExt = deckExt;
396
463
  let backExt = deckExt;
397
464
  if (segment.roofType === 'hip' ||
465
+ segment.roofType === 'conical' ||
398
466
  segment.roofType === 'mansard' ||
399
467
  segment.roofType === 'dutch') {
400
468
  xExt += shingleOverhang;
@@ -495,9 +563,18 @@ export function getRoofSegmentSurfaceY(node, localX, localZ) {
495
563
  const fz = node.depth > 0 ? Math.abs(localZ) / (node.depth / 2) : 0;
496
564
  return peakY - Math.max(fx, fz) * activeRh;
497
565
  }
566
+ if (node.roofType === 'conical') {
567
+ const radius = Math.max(0.0001, node.width / 2);
568
+ const radialProgress = Math.min(1, Math.hypot(localX, localZ) / radius);
569
+ return peakY - radialProgress * activeRh;
570
+ }
498
571
  const t = node.depth > 0 ? Math.abs(localZ) / (node.depth / 2) : 0;
499
572
  return peakY - t * activeRh;
500
573
  }
574
+ // A shed segment whose deck follows a concentric arc.
575
+ export function isBandedShedSegment(node) {
576
+ return node.roofType === 'shed' && node.arc != null && Number.isFinite(node.arc.radius);
577
+ }
501
578
  /**
502
579
  * Inverse of `getActiveRoofHeight` — recover the pitch a legacy
503
580
  * `roofHeight` value would correspond to. Used by the scene migration.
@@ -5,6 +5,17 @@ export type RoofSurfaceMaterialSpec = {
5
5
  material?: MaterialSchemaType;
6
6
  materialPreset?: string;
7
7
  };
8
+ export declare const RoofSupport: z.ZodDefault<z.ZodDiscriminatedUnion<[z.ZodObject<{
9
+ kind: z.ZodLiteral<"level">;
10
+ }, z.core.$strip>, z.ZodObject<{
11
+ kind: z.ZodLiteral<"walls">;
12
+ }, z.core.$strip>, z.ZodObject<{
13
+ kind: z.ZodLiteral<"roof">;
14
+ roofSegmentId: z.ZodDefault<z.ZodTemplateLiteral<`rseg_${string}`>>;
15
+ localPosition: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
16
+ curbHeight: z.ZodDefault<z.ZodNumber>;
17
+ }, z.core.$strip>], "kind">>;
18
+ export type RoofSupport = z.infer<typeof RoofSupport>;
8
19
  export declare const RoofNode: z.ZodObject<{
9
20
  object: z.ZodDefault<z.ZodLiteral<"node">>;
10
21
  name: z.ZodOptional<z.ZodString>;
@@ -20,7 +31,7 @@ export declare const RoofNode: z.ZodObject<{
20
31
  fov: z.ZodOptional<z.ZodNumber>;
21
32
  zoom: z.ZodOptional<z.ZodNumber>;
22
33
  }, z.core.$strip>>;
23
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
34
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
24
35
  id: z.ZodDefault<z.ZodTemplateLiteral<`roof_${string}`>>;
25
36
  type: z.ZodDefault<z.ZodLiteral<"roof">>;
26
37
  material: z.ZodOptional<z.ZodObject<{
@@ -157,6 +168,16 @@ export declare const RoofNode: z.ZodObject<{
157
168
  wallMaterialPreset: z.ZodOptional<z.ZodString>;
158
169
  position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
159
170
  rotation: z.ZodDefault<z.ZodNumber>;
171
+ support: z.ZodDefault<z.ZodDiscriminatedUnion<[z.ZodObject<{
172
+ kind: z.ZodLiteral<"level">;
173
+ }, z.core.$strip>, z.ZodObject<{
174
+ kind: z.ZodLiteral<"walls">;
175
+ }, z.core.$strip>, z.ZodObject<{
176
+ kind: z.ZodLiteral<"roof">;
177
+ roofSegmentId: z.ZodDefault<z.ZodTemplateLiteral<`rseg_${string}`>>;
178
+ localPosition: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
179
+ curbHeight: z.ZodDefault<z.ZodNumber>;
180
+ }, z.core.$strip>], "kind">>;
160
181
  children: z.ZodDefault<z.ZodArray<z.ZodDefault<z.ZodTemplateLiteral<`rseg_${string}`>>>>;
161
182
  }, z.core.$strip>;
162
183
  export type RoofNode = z.infer<typeof RoofNode>;
@@ -1 +1 @@
1
- {"version":3,"file":"roof.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/roof.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,cAAc,IAAI,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAIvE,MAAM,MAAM,uBAAuB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAA;AAC7D,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyBpB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA;AAS/C,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,uBAAuB,GAC5B,uBAAuB,CAoCzB"}
1
+ {"version":3,"file":"roof.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/roof.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,cAAc,IAAI,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAIvE,MAAM,MAAM,uBAAuB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAA;AAC7D,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,WAAW;;;;;;;;;4BAWK,CAAA;AAE7B,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AAErD,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2BpB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA;AAS/C,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,uBAAuB,GAC5B,uBAAuB,CAoCzB"}
@@ -3,6 +3,18 @@ import { z } from 'zod';
3
3
  import { BaseNode, nodeType, objectId } from '../base';
4
4
  import { MaterialSchema } from '../material';
5
5
  import { RoofSegmentNode } from './roof-segment';
6
+ export const RoofSupport = z
7
+ .discriminatedUnion('kind', [
8
+ z.object({ kind: z.literal('level') }),
9
+ z.object({ kind: z.literal('walls') }),
10
+ z.object({
11
+ kind: z.literal('roof'),
12
+ roofSegmentId: RoofSegmentNode.shape.id,
13
+ localPosition: z.tuple([z.number(), z.number()]),
14
+ curbHeight: z.number().min(0).default(0.5),
15
+ }),
16
+ ])
17
+ .default({ kind: 'level' });
6
18
  export const RoofNode = BaseNode.extend({
7
19
  id: objectId('roof'),
8
20
  type: nodeType('roof'),
@@ -17,6 +29,7 @@ export const RoofNode = BaseNode.extend({
17
29
  position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
18
30
  // Rotation around Y axis in radians
19
31
  rotation: z.number().default(0),
32
+ support: RoofSupport,
20
33
  // Child roof segment IDs
21
34
  children: z.array(RoofSegmentNode.shape.id).default([]),
22
35
  }).describe(dedent `
@@ -25,6 +38,7 @@ export const RoofNode = BaseNode.extend({
25
38
  When not being edited, segments are visually combined into a single solid.
26
39
  - position: center position of the roof group
27
40
  - rotation: rotation around Y axis
41
+ - support: custom level placement, spatial wall-top following, or a roof-surface attachment
28
42
  - children: array of RoofSegmentNode IDs
29
43
  `);
30
44
  function getLegacyRoofSurfaceMaterial(node) {
@@ -1,4 +1,11 @@
1
1
  import { z } from 'zod';
2
+ export declare const CaptureSessionReference: z.ZodObject<{
3
+ sessionId: z.ZodString;
4
+ schemaVersion: z.ZodOptional<z.ZodNumber>;
5
+ revisionId: z.ZodOptional<z.ZodString>;
6
+ manifestUrl: z.ZodOptional<z.ZodString>;
7
+ }, z.core.$strip>;
8
+ export declare const ScanLayerVisibility: z.ZodPipe<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodBoolean>>, z.ZodTransform<Record<string, boolean>, Record<string, boolean>>>;
2
9
  export declare const ScanNode: z.ZodObject<{
3
10
  object: z.ZodDefault<z.ZodLiteral<"node">>;
4
11
  name: z.ZodOptional<z.ZodString>;
@@ -14,14 +21,24 @@ export declare const ScanNode: z.ZodObject<{
14
21
  fov: z.ZodOptional<z.ZodNumber>;
15
22
  zoom: z.ZodOptional<z.ZodNumber>;
16
23
  }, z.core.$strip>>;
17
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
24
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
18
25
  id: z.ZodDefault<z.ZodTemplateLiteral<`scan_${string}`>>;
19
26
  type: z.ZodDefault<z.ZodLiteral<"scan">>;
20
- url: z.ZodString;
27
+ url: z.ZodDefault<z.ZodNullable<z.ZodString>>;
28
+ captureSession: z.ZodDefault<z.ZodNullable<z.ZodObject<{
29
+ sessionId: z.ZodString;
30
+ schemaVersion: z.ZodOptional<z.ZodNumber>;
31
+ revisionId: z.ZodOptional<z.ZodString>;
32
+ manifestUrl: z.ZodOptional<z.ZodString>;
33
+ }, z.core.$strip>>>;
34
+ layers: z.ZodPipe<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodBoolean>>, z.ZodTransform<Record<string, boolean>, Record<string, boolean>>>;
21
35
  position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
22
36
  rotation: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
23
37
  scale: z.ZodDefault<z.ZodNumber>;
24
38
  opacity: z.ZodDefault<z.ZodNumber>;
25
39
  }, z.core.$strip>;
40
+ export type CaptureSessionReference = z.infer<typeof CaptureSessionReference>;
41
+ export type CaptureSessionReferenceInput = z.input<typeof CaptureSessionReference>;
42
+ export type ScanLayerVisibility = z.infer<typeof ScanLayerVisibility>;
26
43
  export type ScanNode = z.infer<typeof ScanNode>;
27
44
  //# sourceMappingURL=scan.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;iBAQnB,CAAA;AAEF,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA"}
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,eAAO,MAAM,uBAAuB;;;;;iBAElC,CAAA;AAEF,eAAO,MAAM,mBAAmB,mIAGmE,CAAA;AAEnG,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAUnB,CAAA;AAEF,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAC7E,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAClF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AACrE,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA"}
@@ -1,10 +1,20 @@
1
1
  import { z } from 'zod';
2
+ import { CaptureSessionLocatorSchema } from '../../capture/schema';
2
3
  import { AssetUrl } from '../asset-url';
3
4
  import { BaseNode, nodeType, objectId } from '../base';
5
+ export const CaptureSessionReference = CaptureSessionLocatorSchema.extend({
6
+ manifestUrl: AssetUrl.optional(),
7
+ });
8
+ export const ScanLayerVisibility = z
9
+ .record(z.string().min(1), z.boolean())
10
+ .default({ deviceMotion: true, model: true })
11
+ .transform((layers) => ({ deviceMotion: true, model: true, ...layers }));
4
12
  export const ScanNode = BaseNode.extend({
5
13
  id: objectId('scan'),
6
14
  type: nodeType('scan'),
7
- url: AssetUrl,
15
+ url: AssetUrl.nullable().default(null),
16
+ captureSession: CaptureSessionReference.nullable().default(null),
17
+ layers: ScanLayerVisibility,
8
18
  position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
9
19
  rotation: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
10
20
  scale: z.number().default(1),
@@ -41,7 +41,7 @@ export declare const ShelfNode: z.ZodObject<{
41
41
  fov: z.ZodOptional<z.ZodNumber>;
42
42
  zoom: z.ZodOptional<z.ZodNumber>;
43
43
  }, z.core.$strip>>;
44
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
44
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
45
45
  id: z.ZodDefault<z.ZodTemplateLiteral<`shelf_${string}`>>;
46
46
  type: z.ZodDefault<z.ZodLiteral<"shelf">>;
47
47
  children: z.ZodDefault<z.ZodArray<z.ZodDefault<z.ZodTemplateLiteral<`item_${string}`>>>>;
@@ -64,9 +64,9 @@ export declare const ShelfNode: z.ZodObject<{
64
64
  withSides: z.ZodDefault<z.ZodBoolean>;
65
65
  withBottom: z.ZodDefault<z.ZodBoolean>;
66
66
  bracketStyle: z.ZodDefault<z.ZodEnum<{
67
+ hidden: "hidden";
67
68
  minimal: "minimal";
68
69
  industrial: "industrial";
69
- hidden: "hidden";
70
70
  }>>;
71
71
  material: z.ZodOptional<z.ZodObject<{
72
72
  id: z.ZodOptional<z.ZodString>;
@@ -14,7 +14,7 @@ export declare const SiteNode: z.ZodObject<{
14
14
  fov: z.ZodOptional<z.ZodNumber>;
15
15
  zoom: z.ZodOptional<z.ZodNumber>;
16
16
  }, z.core.$strip>>;
17
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
17
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
18
18
  id: z.ZodDefault<z.ZodTemplateLiteral<`site_${string}`>>;
19
19
  type: z.ZodDefault<z.ZodLiteral<"site">>;
20
20
  polygon: z.ZodDefault<z.ZodOptional<z.ZodObject<{
@@ -168,7 +168,7 @@ export declare const SkylightNode: z.ZodObject<{
168
168
  fov: z.ZodOptional<z.ZodNumber>;
169
169
  zoom: z.ZodOptional<z.ZodNumber>;
170
170
  }, z.core.$strip>>;
171
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
171
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
172
172
  id: z.ZodDefault<z.ZodTemplateLiteral<`skylight_${string}`>>;
173
173
  type: z.ZodDefault<z.ZodLiteral<"skylight">>;
174
174
  material: z.ZodOptional<z.ZodObject<{
@@ -15,7 +15,7 @@ export declare const SlabNode: z.ZodObject<{
15
15
  fov: z.ZodOptional<z.ZodNumber>;
16
16
  zoom: z.ZodOptional<z.ZodNumber>;
17
17
  }, z.core.$strip>>;
18
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
18
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
19
19
  id: z.ZodDefault<z.ZodTemplateLiteral<`slab_${string}`>>;
20
20
  type: z.ZodDefault<z.ZodLiteral<"slab">>;
21
21
  material: z.ZodOptional<z.ZodObject<{
@@ -19,7 +19,7 @@ export declare const SolarPanelNode: z.ZodObject<{
19
19
  fov: z.ZodOptional<z.ZodNumber>;
20
20
  zoom: z.ZodOptional<z.ZodNumber>;
21
21
  }, z.core.$strip>>;
22
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
22
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
23
23
  id: z.ZodDefault<z.ZodTemplateLiteral<`solarpanel_${string}`>>;
24
24
  type: z.ZodDefault<z.ZodLiteral<"solar-panel">>;
25
25
  material: z.ZodOptional<z.ZodObject<{
@@ -14,7 +14,7 @@ export declare const SpawnNode: z.ZodObject<{
14
14
  fov: z.ZodOptional<z.ZodNumber>;
15
15
  zoom: z.ZodOptional<z.ZodNumber>;
16
16
  }, z.core.$strip>>;
17
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
17
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
18
18
  id: z.ZodDefault<z.ZodTemplateLiteral<`spawn_${string}`>>;
19
19
  type: z.ZodDefault<z.ZodLiteral<"spawn">>;
20
20
  position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
@@ -25,7 +25,7 @@ export declare const StairSegmentNode: z.ZodObject<{
25
25
  fov: z.ZodOptional<z.ZodNumber>;
26
26
  zoom: z.ZodOptional<z.ZodNumber>;
27
27
  }, z.core.$strip>>;
28
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
28
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
29
29
  id: z.ZodDefault<z.ZodTemplateLiteral<`sseg_${string}`>>;
30
30
  type: z.ZodDefault<z.ZodLiteral<"stair-segment">>;
31
31
  material: z.ZodOptional<z.ZodObject<{
@@ -43,7 +43,7 @@ export declare const StairNode: z.ZodObject<{
43
43
  fov: z.ZodOptional<z.ZodNumber>;
44
44
  zoom: z.ZodOptional<z.ZodNumber>;
45
45
  }, z.core.$strip>>;
46
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
46
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
47
47
  id: z.ZodDefault<z.ZodTemplateLiteral<`stair_${string}`>>;
48
48
  type: z.ZodDefault<z.ZodLiteral<"stair">>;
49
49
  material: z.ZodOptional<z.ZodObject<{
@@ -14,7 +14,7 @@ export declare const StructuralGridNode: z.ZodObject<{
14
14
  fov: z.ZodOptional<z.ZodNumber>;
15
15
  zoom: z.ZodOptional<z.ZodNumber>;
16
16
  }, z.core.$strip>>;
17
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
17
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
18
18
  id: z.ZodDefault<z.ZodTemplateLiteral<`structural-grid_${string}`>>;
19
19
  type: z.ZodDefault<z.ZodLiteral<"structural-grid">>;
20
20
  start: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
@@ -1,4 +1,9 @@
1
1
  import { z } from 'zod';
2
+ export declare const TurbineVentMaterialRole: z.ZodEnum<{
3
+ base: "base";
4
+ head: "head";
5
+ }>;
6
+ export type TurbineVentMaterialRole = z.infer<typeof TurbineVentMaterialRole>;
2
7
  export declare const TurbineVentNode: z.ZodObject<{
3
8
  object: z.ZodDefault<z.ZodLiteral<"node">>;
4
9
  name: z.ZodOptional<z.ZodString>;
@@ -14,7 +19,7 @@ export declare const TurbineVentNode: z.ZodObject<{
14
19
  fov: z.ZodOptional<z.ZodNumber>;
15
20
  zoom: z.ZodOptional<z.ZodNumber>;
16
21
  }, z.core.$strip>>;
17
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
22
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
18
23
  id: z.ZodDefault<z.ZodTemplateLiteral<`tvent_${string}`>>;
19
24
  type: z.ZodDefault<z.ZodLiteral<"turbine-vent">>;
20
25
  material: z.ZodOptional<z.ZodObject<{
@@ -49,6 +54,7 @@ export declare const TurbineVentNode: z.ZodObject<{
49
54
  scale: z.ZodOptional<z.ZodNumber>;
50
55
  }, z.core.$strip>>;
51
56
  }, z.core.$strip>>;
57
+ slots: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
52
58
  materialPreset: z.ZodDefault<z.ZodString>;
53
59
  roofSegmentId: z.ZodOptional<z.ZodString>;
54
60
  position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
@@ -1 +1 @@
1
- {"version":3,"file":"turbine-vent.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/turbine-vent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0C3B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA"}
1
+ {"version":3,"file":"turbine-vent.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/turbine-vent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,uBAAuB;;;EAA2B,CAAA;AAC/D,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAE7E,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2C3B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA"}
@@ -2,10 +2,12 @@ import dedent from 'dedent';
2
2
  import { z } from 'zod';
3
3
  import { BaseNode, nodeType, objectId } from '../base';
4
4
  import { MaterialSchema } from '../material';
5
+ export const TurbineVentMaterialRole = z.enum(['base', 'head']);
5
6
  export const TurbineVentNode = BaseNode.extend({
6
7
  id: objectId('tvent'),
7
8
  type: nodeType('turbine-vent'),
8
9
  material: MaterialSchema.optional(),
10
+ slots: z.record(z.string(), z.string()).optional(),
9
11
  // Default to the white preset so a freshly-placed turbine reads as
10
12
  // clean painted/galvanised metal and the paint inspector shows "White"
11
13
  // as the current selection (matches box-vent's reasoning).
@@ -92,7 +92,7 @@ export declare const WallFaceBandConfig: z.ZodPreprocess<z.ZodObject<{
92
92
  lowerHeight: z.ZodDefault<z.ZodNumber>;
93
93
  middleHeight: z.ZodDefault<z.ZodNumber>;
94
94
  upperHeight: z.ZodDefault<z.ZodNumber>;
95
- }, z.core.$strip>>;
95
+ }, z.core.$strip>, unknown>;
96
96
  export type WallFaceBandConfig = z.infer<typeof WallFaceBandConfig>;
97
97
  export declare const WALL_FACE_BAND_DEFAULT: WallFaceBandConfig;
98
98
  export declare const WALL_SKIRTING_SLOT_DEFAULT = "library:preset-softwhite";
@@ -138,10 +138,10 @@ export declare const WallNode: z.ZodObject<{
138
138
  fov: z.ZodOptional<z.ZodNumber>;
139
139
  zoom: z.ZodOptional<z.ZodNumber>;
140
140
  }, z.core.$strip>>;
141
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
141
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
142
142
  id: z.ZodDefault<z.ZodTemplateLiteral<`wall_${string}`>>;
143
143
  type: z.ZodDefault<z.ZodLiteral<"wall">>;
144
- children: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodDefault<z.ZodTemplateLiteral<`item_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`door_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`window_${string}`>>]>>>;
144
+ children: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodDefault<z.ZodTemplateLiteral<`item_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`door_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`window_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`leanto_${string}`>>]>>>;
145
145
  material: z.ZodOptional<z.ZodObject<{
146
146
  id: z.ZodOptional<z.ZodString>;
147
147
  preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
@@ -254,7 +254,7 @@ export declare const WallNode: z.ZodObject<{
254
254
  lowerHeight: z.ZodDefault<z.ZodNumber>;
255
255
  middleHeight: z.ZodDefault<z.ZodNumber>;
256
256
  upperHeight: z.ZodDefault<z.ZodNumber>;
257
- }, z.core.$strip>>>;
257
+ }, z.core.$strip>, unknown>>;
258
258
  skirting: z.ZodOptional<z.ZodObject<{
259
259
  enabled: z.ZodDefault<z.ZodBoolean>;
260
260
  sides: z.ZodDefault<z.ZodEnum<{
@@ -1 +1 @@
1
- {"version":3,"file":"wall.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/wall.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wall.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/wall.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { BaseNode, nodeType, objectId } from '../base';
4
4
  import { MaterialSchema } from '../material';
5
5
  import { DoorNode } from './door';
6
6
  import { ItemNode } from './item';
7
+ import { LeanToExtensionNode } from './lean-to-extension';
7
8
  import { WindowNode } from './window';
8
9
  export const WallTreatmentSide = z.enum(['interior', 'exterior', 'both']);
9
10
  export const WallTrimProfile = z.enum([
@@ -112,7 +113,12 @@ export const WallNode = BaseNode.extend({
112
113
  id: objectId('wall'),
113
114
  type: nodeType('wall'),
114
115
  children: z
115
- .array(z.union([ItemNode.shape.id, DoorNode.shape.id, WindowNode.shape.id]))
116
+ .array(z.union([
117
+ ItemNode.shape.id,
118
+ DoorNode.shape.id,
119
+ WindowNode.shape.id,
120
+ LeanToExtensionNode.shape.id,
121
+ ]))
116
122
  .default([]),
117
123
  // Legacy single-material wall finish. Read for backward compatibility only.
118
124
  material: MaterialSchema.optional(),
@@ -1,7 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  export declare const WindowType: z.ZodEnum<{
3
- sliding: "sliding";
4
3
  fixed: "fixed";
4
+ sliding: "sliding";
5
5
  casement: "casement";
6
6
  awning: "awning";
7
7
  hopper: "hopper";
@@ -39,7 +39,7 @@ export declare const WindowNode: z.ZodObject<{
39
39
  fov: z.ZodOptional<z.ZodNumber>;
40
40
  zoom: z.ZodOptional<z.ZodNumber>;
41
41
  }, z.core.$strip>>;
42
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
42
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
43
43
  id: z.ZodDefault<z.ZodTemplateLiteral<`window_${string}`>>;
44
44
  type: z.ZodDefault<z.ZodLiteral<"window">>;
45
45
  material: z.ZodOptional<z.ZodObject<{
@@ -82,6 +82,13 @@ export declare const WindowNode: z.ZodObject<{
82
82
  back: "back";
83
83
  }>>;
84
84
  wallId: z.ZodOptional<z.ZodString>;
85
+ dormerId: z.ZodOptional<z.ZodString>;
86
+ dormerFace: z.ZodOptional<z.ZodEnum<{
87
+ front: "front";
88
+ back: "back";
89
+ right: "right";
90
+ left: "left";
91
+ }>>;
85
92
  roofSegmentId: z.ZodOptional<z.ZodString>;
86
93
  roofFace: z.ZodOptional<z.ZodEnum<{
87
94
  front: "front";
@@ -113,8 +120,8 @@ export declare const WindowNode: z.ZodObject<{
113
120
  opening: "opening";
114
121
  }>>;
115
122
  windowType: z.ZodDefault<z.ZodEnum<{
116
- sliding: "sliding";
117
123
  fixed: "fixed";
124
+ sliding: "sliding";
118
125
  casement: "casement";
119
126
  awning: "awning";
120
127
  hopper: "hopper";
@@ -1 +1 @@
1
- {"version":3,"file":"window.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/window.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,UAAU;;;;;;;;;;;EAWrB,CAAA;AACF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAEnD,eAAO,MAAM,sBAAsB;;;EAAgC,CAAA;AACnE,eAAO,MAAM,wBAAwB;;;;;EAKnC,CAAA;AACF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAC3E,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAA;AAE/E,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmFrB,CAAA;AAEF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA"}
1
+ {"version":3,"file":"window.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/window.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,UAAU;;;;;;;;;;;EAWrB,CAAA;AACF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAEnD,eAAO,MAAM,sBAAsB;;;EAAgC,CAAA;AACnE,eAAO,MAAM,wBAAwB;;;;;EAKnC,CAAA;AACF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAC3E,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAA;AAE/E,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuFrB,CAAA;AAEF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA"}
@@ -34,6 +34,10 @@ export const WindowNode = BaseNode.extend({
34
34
  side: z.enum(['front', 'back']).optional(),
35
35
  // Wall reference
36
36
  wallId: z.string().optional(),
37
+ // Alternative host: a dormer's generated wall face. When set, `position`
38
+ // is FACE-LOCAL — [u along the face, v height, z from the wall mid-plane].
39
+ dormerId: z.string().optional(),
40
+ dormerFace: z.enum(['front', 'back', 'right', 'left']).optional(),
37
41
  // Alternative host: a roof-segment's generated wall face (base wall
38
42
  // under the roof or a coplanar gable end). When set, `position` is
39
43
  // FACE-LOCAL — [u along the face, v height, z from the wall mid-plane]
@@ -26,8 +26,8 @@ export declare const ZoneNode: z.ZodObject<{
26
26
  roomNumber: z.ZodDefault<z.ZodString>;
27
27
  enclosureStatus: z.ZodDefault<z.ZodEnum<{
28
28
  auto: "auto";
29
- enclosed: "enclosed";
30
29
  open: "open";
30
+ enclosed: "enclosed";
31
31
  }>>;
32
32
  floorFinish: z.ZodDefault<z.ZodString>;
33
33
  wallFinish: z.ZodDefault<z.ZodString>;
@@ -40,7 +40,7 @@ export declare const ZoneNode: z.ZodObject<{
40
40
  "finish-faces": "finish-faces";
41
41
  }>>;
42
42
  color: z.ZodDefault<z.ZodString>;
43
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
43
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
44
44
  }, z.core.$strip>;
45
45
  export type ZoneNode = z.infer<typeof ZoneNode>;
46
46
  //# sourceMappingURL=zone.d.ts.map
@@ -24,7 +24,7 @@ export const ZoneNode = BaseNode.extend({
24
24
  clearDimensionPolicy: z.enum(['none', 'inside-faces', 'finish-faces']).default('none'),
25
25
  // Visual styling
26
26
  color: z.string().default('#3b82f6'), // Default blue
27
- metadata: z.json().optional().default({}),
27
+ metadata: z.record(z.string(), z.unknown()).optional().default({}),
28
28
  }).describe(dedent `
29
29
  Zone schema - a polygon zone attached to a level
30
30
  - object: "zone"