@pascal-app/core 0.8.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/dist/events/bus.d.ts +39 -13
  2. package/dist/events/bus.d.ts.map +1 -1
  3. package/dist/hooks/scene-registry/scene-registry.d.ts +6 -22
  4. package/dist/hooks/scene-registry/scene-registry.d.ts.map +1 -1
  5. package/dist/hooks/scene-registry/scene-registry.js +33 -26
  6. package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts +14 -0
  7. package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts.map +1 -0
  8. package/dist/hooks/spatial-grid/floor-placed-elevation.js +51 -0
  9. package/dist/hooks/spatial-grid/floor-placed-elevation.test.d.ts +2 -0
  10. package/dist/hooks/spatial-grid/floor-placed-elevation.test.d.ts.map +1 -0
  11. package/dist/hooks/spatial-grid/floor-placed-elevation.test.js +273 -0
  12. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +13 -2
  13. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  14. package/dist/hooks/spatial-grid/spatial-grid-manager.js +95 -9
  15. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +28 -1
  16. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  17. package/dist/hooks/spatial-grid/spatial-grid-sync.js +91 -18
  18. package/dist/index.d.ts +22 -4
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +19 -2
  21. package/dist/lib/polygon-relations.d.ts +10 -0
  22. package/dist/lib/polygon-relations.d.ts.map +1 -0
  23. package/dist/lib/polygon-relations.js +73 -0
  24. package/dist/lib/space-detection-pause.test.d.ts +2 -0
  25. package/dist/lib/space-detection-pause.test.d.ts.map +1 -0
  26. package/dist/lib/space-detection-pause.test.js +42 -0
  27. package/dist/lib/space-detection.d.ts +30 -1
  28. package/dist/lib/space-detection.d.ts.map +1 -1
  29. package/dist/lib/space-detection.js +215 -36
  30. package/dist/lib/space-detection.test.d.ts +2 -0
  31. package/dist/lib/space-detection.test.d.ts.map +1 -0
  32. package/dist/lib/space-detection.test.js +77 -0
  33. package/dist/material-library.d.ts +1 -1
  34. package/dist/material-library.d.ts.map +1 -1
  35. package/dist/material-library.js +1940 -143
  36. package/dist/registry/__bench__/relations-resolver.bench.d.ts +15 -0
  37. package/dist/registry/__bench__/relations-resolver.bench.d.ts.map +1 -0
  38. package/dist/registry/__bench__/relations-resolver.bench.js +170 -0
  39. package/dist/registry/handles.d.ts +321 -0
  40. package/dist/registry/handles.d.ts.map +1 -0
  41. package/dist/registry/handles.js +24 -0
  42. package/dist/registry/index.d.ts +7 -0
  43. package/dist/registry/index.d.ts.map +1 -0
  44. package/dist/registry/index.js +4 -0
  45. package/dist/registry/registry.d.ts +93 -0
  46. package/dist/registry/registry.d.ts.map +1 -0
  47. package/dist/registry/registry.js +201 -0
  48. package/dist/registry/registry.test.d.ts +2 -0
  49. package/dist/registry/registry.test.d.ts.map +1 -0
  50. package/dist/registry/registry.test.js +183 -0
  51. package/dist/registry/relations-resolver.d.ts +42 -0
  52. package/dist/registry/relations-resolver.d.ts.map +1 -0
  53. package/dist/registry/relations-resolver.js +77 -0
  54. package/dist/registry/relations-resolver.test.d.ts +2 -0
  55. package/dist/registry/relations-resolver.test.d.ts.map +1 -0
  56. package/dist/registry/relations-resolver.test.js +183 -0
  57. package/dist/registry/scene-api.d.ts +44 -0
  58. package/dist/registry/scene-api.d.ts.map +1 -0
  59. package/dist/registry/scene-api.js +111 -0
  60. package/dist/registry/scene-api.test.d.ts +2 -0
  61. package/dist/registry/scene-api.test.d.ts.map +1 -0
  62. package/dist/registry/scene-api.test.js +183 -0
  63. package/dist/registry/subtree.d.ts +67 -0
  64. package/dist/registry/subtree.d.ts.map +1 -0
  65. package/dist/registry/subtree.js +119 -0
  66. package/dist/registry/subtree.test.d.ts +2 -0
  67. package/dist/registry/subtree.test.d.ts.map +1 -0
  68. package/dist/registry/subtree.test.js +133 -0
  69. package/dist/registry/types.d.ts +1420 -0
  70. package/dist/registry/types.d.ts.map +1 -0
  71. package/dist/registry/types.js +1 -0
  72. package/dist/schema/index.d.ts +17 -2
  73. package/dist/schema/index.d.ts.map +1 -1
  74. package/dist/schema/index.js +17 -3
  75. package/dist/schema/material.d.ts +10 -0
  76. package/dist/schema/material.d.ts.map +1 -1
  77. package/dist/schema/material.js +10 -0
  78. package/dist/schema/nodes/box-vent.d.ts +74 -0
  79. package/dist/schema/nodes/box-vent.d.ts.map +1 -0
  80. package/dist/schema/nodes/box-vent.js +63 -0
  81. package/dist/schema/nodes/building.d.ts +1 -1
  82. package/dist/schema/nodes/building.d.ts.map +1 -1
  83. package/dist/schema/nodes/building.js +3 -2
  84. package/dist/schema/nodes/ceiling.d.ts +2 -0
  85. package/dist/schema/nodes/ceiling.d.ts.map +1 -1
  86. package/dist/schema/nodes/ceiling.js +1 -1
  87. package/dist/schema/nodes/chimney.d.ts +158 -0
  88. package/dist/schema/nodes/chimney.d.ts.map +1 -0
  89. package/dist/schema/nodes/chimney.js +67 -0
  90. package/dist/schema/nodes/column.d.ts +597 -5
  91. package/dist/schema/nodes/column.d.ts.map +1 -1
  92. package/dist/schema/nodes/column.js +586 -6
  93. package/dist/schema/nodes/cupola.d.ts +66 -0
  94. package/dist/schema/nodes/cupola.d.ts.map +1 -0
  95. package/dist/schema/nodes/cupola.js +28 -0
  96. package/dist/schema/nodes/dormer.d.ts +228 -0
  97. package/dist/schema/nodes/dormer.d.ts.map +1 -0
  98. package/dist/schema/nodes/dormer.js +119 -0
  99. package/dist/schema/nodes/downspout.d.ts +75 -0
  100. package/dist/schema/nodes/downspout.d.ts.map +1 -0
  101. package/dist/schema/nodes/downspout.js +63 -0
  102. package/dist/schema/nodes/elevator.d.ts +105 -0
  103. package/dist/schema/nodes/elevator.d.ts.map +1 -0
  104. package/dist/schema/nodes/elevator.js +54 -0
  105. package/dist/schema/nodes/eyebrow-vent.d.ts +68 -0
  106. package/dist/schema/nodes/eyebrow-vent.d.ts.map +1 -0
  107. package/dist/schema/nodes/eyebrow-vent.js +40 -0
  108. package/dist/schema/nodes/fence.d.ts +1 -0
  109. package/dist/schema/nodes/fence.d.ts.map +1 -1
  110. package/dist/schema/nodes/fence.js +2 -0
  111. package/dist/schema/nodes/gutter.d.ts +84 -0
  112. package/dist/schema/nodes/gutter.d.ts.map +1 -0
  113. package/dist/schema/nodes/gutter.js +76 -0
  114. package/dist/schema/nodes/item.d.ts +4 -0
  115. package/dist/schema/nodes/item.d.ts.map +1 -1
  116. package/dist/schema/nodes/item.js +9 -0
  117. package/dist/schema/nodes/level.d.ts +1 -1
  118. package/dist/schema/nodes/level.d.ts.map +1 -1
  119. package/dist/schema/nodes/level.js +2 -0
  120. package/dist/schema/nodes/ridge-vent.d.ts +67 -0
  121. package/dist/schema/nodes/ridge-vent.d.ts.map +1 -0
  122. package/dist/schema/nodes/ridge-vent.js +30 -0
  123. package/dist/schema/nodes/roof-segment.d.ts +195 -1
  124. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  125. package/dist/schema/nodes/roof-segment.js +254 -3
  126. package/dist/schema/nodes/roof.d.ts.map +1 -1
  127. package/dist/schema/nodes/roof.js +4 -16
  128. package/dist/schema/nodes/shelf.d.ts +105 -0
  129. package/dist/schema/nodes/shelf.d.ts.map +1 -0
  130. package/dist/schema/nodes/shelf.js +84 -0
  131. package/dist/schema/nodes/site.d.ts +1 -122
  132. package/dist/schema/nodes/site.d.ts.map +1 -1
  133. package/dist/schema/nodes/site.js +2 -6
  134. package/dist/schema/nodes/skylight.d.ts +279 -0
  135. package/dist/schema/nodes/skylight.d.ts.map +1 -0
  136. package/dist/schema/nodes/skylight.js +152 -0
  137. package/dist/schema/nodes/slab.d.ts +2 -0
  138. package/dist/schema/nodes/slab.d.ts.map +1 -1
  139. package/dist/schema/nodes/slab.js +1 -1
  140. package/dist/schema/nodes/solar-panel.d.ts +117 -0
  141. package/dist/schema/nodes/solar-panel.d.ts.map +1 -0
  142. package/dist/schema/nodes/solar-panel.js +47 -0
  143. package/dist/schema/nodes/surface-hole-metadata.d.ts +2 -0
  144. package/dist/schema/nodes/surface-hole-metadata.d.ts.map +1 -1
  145. package/dist/schema/nodes/surface-hole-metadata.js +3 -1
  146. package/dist/schema/nodes/turbine-vent.d.ts +68 -0
  147. package/dist/schema/nodes/turbine-vent.d.ts.map +1 -0
  148. package/dist/schema/nodes/turbine-vent.js +41 -0
  149. package/dist/schema/types.d.ts +1325 -125
  150. package/dist/schema/types.d.ts.map +1 -1
  151. package/dist/schema/types.js +26 -0
  152. package/dist/services/alignment-anchors.d.ts +100 -0
  153. package/dist/services/alignment-anchors.d.ts.map +1 -0
  154. package/dist/services/alignment-anchors.js +283 -0
  155. package/dist/services/alignment-anchors.test.d.ts +2 -0
  156. package/dist/services/alignment-anchors.test.d.ts.map +1 -0
  157. package/dist/services/alignment-anchors.test.js +383 -0
  158. package/dist/services/alignment.d.ts +126 -0
  159. package/dist/services/alignment.d.ts.map +1 -0
  160. package/dist/services/alignment.js +169 -0
  161. package/dist/services/alignment.test.d.ts +2 -0
  162. package/dist/services/alignment.test.d.ts.map +1 -0
  163. package/dist/services/alignment.test.js +92 -0
  164. package/dist/services/drag-session.d.ts +47 -0
  165. package/dist/services/drag-session.d.ts.map +1 -0
  166. package/dist/services/drag-session.js +100 -0
  167. package/dist/services/drag-session.test.d.ts +2 -0
  168. package/dist/services/drag-session.test.d.ts.map +1 -0
  169. package/dist/services/drag-session.test.js +219 -0
  170. package/dist/services/hosting.d.ts +80 -0
  171. package/dist/services/hosting.d.ts.map +1 -0
  172. package/dist/services/hosting.js +122 -0
  173. package/dist/services/hosting.test.d.ts +2 -0
  174. package/dist/services/hosting.test.d.ts.map +1 -0
  175. package/dist/services/hosting.test.js +199 -0
  176. package/dist/services/index.d.ts +7 -0
  177. package/dist/services/index.d.ts.map +1 -0
  178. package/dist/services/index.js +6 -0
  179. package/dist/services/movement.d.ts +48 -0
  180. package/dist/services/movement.d.ts.map +1 -0
  181. package/dist/services/movement.js +65 -0
  182. package/dist/services/movement.test.d.ts +2 -0
  183. package/dist/services/movement.test.d.ts.map +1 -0
  184. package/dist/services/movement.test.js +133 -0
  185. package/dist/services/single-undo-dance.test.d.ts +2 -0
  186. package/dist/services/single-undo-dance.test.d.ts.map +1 -0
  187. package/dist/services/single-undo-dance.test.js +210 -0
  188. package/dist/services/snap.d.ts +72 -0
  189. package/dist/services/snap.d.ts.map +1 -0
  190. package/dist/services/snap.js +120 -0
  191. package/dist/services/snap.test.d.ts +2 -0
  192. package/dist/services/snap.test.d.ts.map +1 -0
  193. package/dist/services/snap.test.js +95 -0
  194. package/dist/solar-panel-presets.d.ts +17 -0
  195. package/dist/solar-panel-presets.d.ts.map +1 -0
  196. package/dist/solar-panel-presets.js +43 -0
  197. package/dist/store/actions/node-actions.d.ts +14 -2
  198. package/dist/store/actions/node-actions.d.ts.map +1 -1
  199. package/dist/store/actions/node-actions.js +492 -15
  200. package/dist/store/actions/node-mutation-sanitize.test.d.ts +2 -0
  201. package/dist/store/actions/node-mutation-sanitize.test.d.ts.map +1 -0
  202. package/dist/store/actions/node-mutation-sanitize.test.js +147 -0
  203. package/dist/store/actions/reparent.test.d.ts +2 -0
  204. package/dist/store/actions/reparent.test.d.ts.map +1 -0
  205. package/dist/store/actions/reparent.test.js +212 -0
  206. package/dist/store/use-interactive.d.ts +39 -0
  207. package/dist/store/use-interactive.d.ts.map +1 -1
  208. package/dist/store/use-interactive.js +75 -0
  209. package/dist/store/use-live-node-overrides.d.ts +22 -0
  210. package/dist/store/use-live-node-overrides.d.ts.map +1 -0
  211. package/dist/store/use-live-node-overrides.js +59 -0
  212. package/dist/store/use-scene-elevator-migration.test.d.ts +2 -0
  213. package/dist/store/use-scene-elevator-migration.test.d.ts.map +1 -0
  214. package/dist/store/use-scene-elevator-migration.test.js +109 -0
  215. package/dist/store/use-scene.d.ts +11 -0
  216. package/dist/store/use-scene.d.ts.map +1 -1
  217. package/dist/store/use-scene.js +196 -6
  218. package/dist/systems/elevator/elevator-dispatch.d.ts +12 -0
  219. package/dist/systems/elevator/elevator-dispatch.d.ts.map +1 -0
  220. package/dist/systems/elevator/elevator-dispatch.js +57 -0
  221. package/dist/systems/elevator/elevator-geometry.d.ts +15 -0
  222. package/dist/systems/elevator/elevator-geometry.d.ts.map +1 -0
  223. package/dist/systems/elevator/elevator-geometry.js +50 -0
  224. package/dist/systems/elevator/elevator-opening-sync.d.ts +6 -0
  225. package/dist/systems/elevator/elevator-opening-sync.d.ts.map +1 -0
  226. package/dist/systems/elevator/elevator-opening-sync.js +218 -0
  227. package/dist/systems/elevator/elevator-opening-sync.test.d.ts +2 -0
  228. package/dist/systems/elevator/elevator-opening-sync.test.d.ts.map +1 -0
  229. package/dist/systems/elevator/elevator-opening-sync.test.js +146 -0
  230. package/dist/systems/elevator/elevator-opening-system.d.ts +2 -0
  231. package/dist/systems/elevator/elevator-opening-system.d.ts.map +1 -0
  232. package/dist/systems/elevator/elevator-opening-system.js +48 -0
  233. package/dist/systems/elevator/elevator-runtime-system.d.ts +2 -0
  234. package/dist/systems/elevator/elevator-runtime-system.d.ts.map +1 -0
  235. package/dist/systems/elevator/elevator-runtime-system.js +8 -0
  236. package/dist/systems/elevator/elevator-runtime.d.ts +18 -0
  237. package/dist/systems/elevator/elevator-runtime.d.ts.map +1 -0
  238. package/dist/systems/elevator/elevator-runtime.js +225 -0
  239. package/dist/systems/elevator/elevator-runtime.test.d.ts +2 -0
  240. package/dist/systems/elevator/elevator-runtime.test.d.ts.map +1 -0
  241. package/dist/systems/elevator/elevator-runtime.test.js +64 -0
  242. package/dist/systems/elevator/elevator-service.d.ts +19 -0
  243. package/dist/systems/elevator/elevator-service.d.ts.map +1 -0
  244. package/dist/systems/elevator/elevator-service.js +111 -0
  245. package/dist/systems/stair/stair-footprint.d.ts +44 -0
  246. package/dist/systems/stair/stair-footprint.d.ts.map +1 -0
  247. package/dist/systems/stair/stair-footprint.js +168 -0
  248. package/dist/systems/stair/stair-opening-preview.d.ts +1777 -0
  249. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -0
  250. package/dist/systems/stair/stair-opening-preview.js +93 -0
  251. package/dist/systems/stair/stair-opening-preview.test.d.ts +2 -0
  252. package/dist/systems/stair/stair-opening-preview.test.d.ts.map +1 -0
  253. package/dist/systems/stair/stair-opening-preview.test.js +80 -0
  254. package/dist/systems/stair/stair-opening-sync.d.ts.map +1 -1
  255. package/dist/systems/stair/stair-opening-sync.js +172 -147
  256. package/dist/systems/stair/stair-opening-sync.test.js +385 -2
  257. package/dist/systems/stair/stair-opening-system.d.ts +2 -0
  258. package/dist/systems/stair/stair-opening-system.d.ts.map +1 -0
  259. package/dist/systems/stair/stair-opening-system.js +104 -0
  260. package/dist/systems/wall/wall-move.d.ts +48 -0
  261. package/dist/systems/wall/wall-move.d.ts.map +1 -0
  262. package/dist/systems/wall/wall-move.js +193 -0
  263. package/dist/utils/clone-scene-graph.d.ts +6 -4
  264. package/dist/utils/clone-scene-graph.d.ts.map +1 -1
  265. package/dist/utils/clone-scene-graph.js +6 -4
  266. package/dist/utils/clone-scene-graph.test.d.ts +2 -0
  267. package/dist/utils/clone-scene-graph.test.d.ts.map +1 -0
  268. package/dist/utils/clone-scene-graph.test.js +59 -0
  269. package/dist/validation/validate-build-json.d.ts +43 -0
  270. package/dist/validation/validate-build-json.d.ts.map +1 -0
  271. package/dist/validation/validate-build-json.js +227 -0
  272. package/package.json +9 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cupola.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/cupola.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA6BtB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA"}
@@ -0,0 +1,28 @@
1
+ import dedent from 'dedent';
2
+ import { z } from 'zod';
3
+ import { BaseNode, nodeType, objectId } from '../base';
4
+ import { MaterialSchema } from '../material';
5
+ export const CupolaNode = BaseNode.extend({
6
+ id: objectId('cupola'),
7
+ type: nodeType('cupola'),
8
+ material: MaterialSchema.optional(),
9
+ // Default to the white preset so a freshly-placed cupola reads as clean
10
+ // painted metal and the paint inspector shows "White" (matches box-vent).
11
+ materialPreset: z.string().default('preset-white'),
12
+ roofSegmentId: z.string().optional(),
13
+ position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
14
+ rotation: z.number().default(0),
15
+ // Cupolas are larger than the other vents — a roof lantern, not a cap.
16
+ width: z.number().default(0.8),
17
+ depth: z.number().default(0.8),
18
+ height: z.number().default(1.0),
19
+ // Roof cap shape: `dome` (round) or `pyramid` (four-sided point).
20
+ roofStyle: z.enum(['dome', 'pyramid']).default('dome'),
21
+ // Decorative post + ball at the apex.
22
+ finial: z.boolean().default(true),
23
+ }).describe(dedent `
24
+ Cupola — a louvered roof lantern that sits astride a roof ridge or slope:
25
+ a louvered body topped by a dome or pyramid roof, optionally crowned with
26
+ a finial. Parented to a roof-segment; position is segment-local. Rotation
27
+ is around the segment's vertical axis (post-slope tilt).
28
+ `);
@@ -0,0 +1,228 @@
1
+ import { z } from 'zod';
2
+ import { MaterialSchema } from '../material';
3
+ export type DormerSurfaceMaterialRole = 'top' | 'side' | 'wall';
4
+ export type DormerSurfaceMaterialSpec = {
5
+ material?: z.infer<typeof MaterialSchema>;
6
+ materialPreset?: string;
7
+ };
8
+ /**
9
+ * Default dormer dimensions and window controls. Values match the
10
+ * legacy archive so existing scenes don't shift visually.
11
+ */
12
+ export declare const DORMER_DEFAULTS: {
13
+ readonly WIDTH: 1.21;
14
+ readonly DEPTH: 1.55;
15
+ readonly WALL_HEIGHT: 0;
16
+ readonly ROOF_HEIGHT: 0.49;
17
+ readonly WALL_SKIRT_HEIGHT: 2.73;
18
+ readonly WINDOW_WIDTH: 0.76;
19
+ readonly WINDOW_HEIGHT: 0.68;
20
+ readonly WINDOW_OFFSET_X: 0.02;
21
+ readonly WINDOW_OFFSET_Y: 0.99;
22
+ readonly WINDOW_FRAME_THICKNESS: 0.05;
23
+ readonly WINDOW_FRAME_DEPTH: 0.06;
24
+ readonly WINDOW_COLUMNS: 3;
25
+ readonly WINDOW_ROWS: 3;
26
+ readonly WINDOW_DIVIDER_THICKNESS: 0.02;
27
+ readonly WINDOW_ARCH_HEIGHT: 0.35;
28
+ readonly WINDOW_CORNER_RADIUS: 0.15;
29
+ readonly WINDOW_SILL_DEPTH: 0.08;
30
+ readonly WINDOW_SILL_THICKNESS: 0.03;
31
+ };
32
+ export declare const DormerNode: z.ZodObject<{
33
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
34
+ name: z.ZodOptional<z.ZodString>;
35
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
36
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
37
+ camera: z.ZodOptional<z.ZodObject<{
38
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
39
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
40
+ mode: z.ZodDefault<z.ZodEnum<{
41
+ perspective: "perspective";
42
+ orthographic: "orthographic";
43
+ }>>;
44
+ fov: z.ZodOptional<z.ZodNumber>;
45
+ zoom: z.ZodOptional<z.ZodNumber>;
46
+ }, z.core.$strip>>;
47
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
48
+ id: z.ZodDefault<z.ZodTemplateLiteral<`dormer_${string}`>>;
49
+ type: z.ZodDefault<z.ZodLiteral<"dormer">>;
50
+ material: z.ZodOptional<z.ZodObject<{
51
+ id: z.ZodOptional<z.ZodString>;
52
+ preset: z.ZodOptional<z.ZodEnum<{
53
+ custom: "custom";
54
+ white: "white";
55
+ brick: "brick";
56
+ concrete: "concrete";
57
+ wood: "wood";
58
+ glass: "glass";
59
+ metal: "metal";
60
+ plaster: "plaster";
61
+ tile: "tile";
62
+ marble: "marble";
63
+ }>>;
64
+ properties: z.ZodOptional<z.ZodObject<{
65
+ color: z.ZodDefault<z.ZodString>;
66
+ roughness: z.ZodDefault<z.ZodNumber>;
67
+ metalness: z.ZodDefault<z.ZodNumber>;
68
+ opacity: z.ZodDefault<z.ZodNumber>;
69
+ transparent: z.ZodDefault<z.ZodBoolean>;
70
+ side: z.ZodDefault<z.ZodEnum<{
71
+ front: "front";
72
+ back: "back";
73
+ double: "double";
74
+ }>>;
75
+ }, z.core.$strip>>;
76
+ texture: z.ZodOptional<z.ZodObject<{
77
+ url: z.ZodString;
78
+ repeat: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
79
+ scale: z.ZodOptional<z.ZodNumber>;
80
+ }, z.core.$strip>>;
81
+ }, z.core.$strip>>;
82
+ materialPreset: z.ZodOptional<z.ZodString>;
83
+ topMaterial: z.ZodOptional<z.ZodObject<{
84
+ id: z.ZodOptional<z.ZodString>;
85
+ preset: z.ZodOptional<z.ZodEnum<{
86
+ custom: "custom";
87
+ white: "white";
88
+ brick: "brick";
89
+ concrete: "concrete";
90
+ wood: "wood";
91
+ glass: "glass";
92
+ metal: "metal";
93
+ plaster: "plaster";
94
+ tile: "tile";
95
+ marble: "marble";
96
+ }>>;
97
+ properties: z.ZodOptional<z.ZodObject<{
98
+ color: z.ZodDefault<z.ZodString>;
99
+ roughness: z.ZodDefault<z.ZodNumber>;
100
+ metalness: z.ZodDefault<z.ZodNumber>;
101
+ opacity: z.ZodDefault<z.ZodNumber>;
102
+ transparent: z.ZodDefault<z.ZodBoolean>;
103
+ side: z.ZodDefault<z.ZodEnum<{
104
+ front: "front";
105
+ back: "back";
106
+ double: "double";
107
+ }>>;
108
+ }, z.core.$strip>>;
109
+ texture: z.ZodOptional<z.ZodObject<{
110
+ url: z.ZodString;
111
+ repeat: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
112
+ scale: z.ZodOptional<z.ZodNumber>;
113
+ }, z.core.$strip>>;
114
+ }, z.core.$strip>>;
115
+ topMaterialPreset: z.ZodOptional<z.ZodString>;
116
+ sideMaterial: z.ZodOptional<z.ZodObject<{
117
+ id: z.ZodOptional<z.ZodString>;
118
+ preset: z.ZodOptional<z.ZodEnum<{
119
+ custom: "custom";
120
+ white: "white";
121
+ brick: "brick";
122
+ concrete: "concrete";
123
+ wood: "wood";
124
+ glass: "glass";
125
+ metal: "metal";
126
+ plaster: "plaster";
127
+ tile: "tile";
128
+ marble: "marble";
129
+ }>>;
130
+ properties: z.ZodOptional<z.ZodObject<{
131
+ color: z.ZodDefault<z.ZodString>;
132
+ roughness: z.ZodDefault<z.ZodNumber>;
133
+ metalness: z.ZodDefault<z.ZodNumber>;
134
+ opacity: z.ZodDefault<z.ZodNumber>;
135
+ transparent: z.ZodDefault<z.ZodBoolean>;
136
+ side: z.ZodDefault<z.ZodEnum<{
137
+ front: "front";
138
+ back: "back";
139
+ double: "double";
140
+ }>>;
141
+ }, z.core.$strip>>;
142
+ texture: z.ZodOptional<z.ZodObject<{
143
+ url: z.ZodString;
144
+ repeat: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
145
+ scale: z.ZodOptional<z.ZodNumber>;
146
+ }, z.core.$strip>>;
147
+ }, z.core.$strip>>;
148
+ sideMaterialPreset: z.ZodOptional<z.ZodString>;
149
+ wallMaterial: z.ZodOptional<z.ZodObject<{
150
+ id: z.ZodOptional<z.ZodString>;
151
+ preset: z.ZodOptional<z.ZodEnum<{
152
+ custom: "custom";
153
+ white: "white";
154
+ brick: "brick";
155
+ concrete: "concrete";
156
+ wood: "wood";
157
+ glass: "glass";
158
+ metal: "metal";
159
+ plaster: "plaster";
160
+ tile: "tile";
161
+ marble: "marble";
162
+ }>>;
163
+ properties: z.ZodOptional<z.ZodObject<{
164
+ color: z.ZodDefault<z.ZodString>;
165
+ roughness: z.ZodDefault<z.ZodNumber>;
166
+ metalness: z.ZodDefault<z.ZodNumber>;
167
+ opacity: z.ZodDefault<z.ZodNumber>;
168
+ transparent: z.ZodDefault<z.ZodBoolean>;
169
+ side: z.ZodDefault<z.ZodEnum<{
170
+ front: "front";
171
+ back: "back";
172
+ double: "double";
173
+ }>>;
174
+ }, z.core.$strip>>;
175
+ texture: z.ZodOptional<z.ZodObject<{
176
+ url: z.ZodString;
177
+ repeat: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
178
+ scale: z.ZodOptional<z.ZodNumber>;
179
+ }, z.core.$strip>>;
180
+ }, z.core.$strip>>;
181
+ wallMaterialPreset: z.ZodOptional<z.ZodString>;
182
+ roofSegmentId: z.ZodOptional<z.ZodString>;
183
+ position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
184
+ rotation: z.ZodDefault<z.ZodNumber>;
185
+ width: z.ZodDefault<z.ZodNumber>;
186
+ depth: z.ZodDefault<z.ZodNumber>;
187
+ height: z.ZodDefault<z.ZodNumber>;
188
+ roofType: z.ZodDefault<z.ZodEnum<{
189
+ flat: "flat";
190
+ hip: "hip";
191
+ gable: "gable";
192
+ shed: "shed";
193
+ gambrel: "gambrel";
194
+ dutch: "dutch";
195
+ mansard: "mansard";
196
+ }>>;
197
+ roofHeight: z.ZodDefault<z.ZodNumber>;
198
+ wallSkirtHeight: z.ZodDefault<z.ZodNumber>;
199
+ windowWidth: z.ZodDefault<z.ZodNumber>;
200
+ windowHeight: z.ZodDefault<z.ZodNumber>;
201
+ windowOffsetX: z.ZodDefault<z.ZodNumber>;
202
+ windowOffsetY: z.ZodDefault<z.ZodNumber>;
203
+ windowFrameThickness: z.ZodDefault<z.ZodNumber>;
204
+ windowFrameDepth: z.ZodDefault<z.ZodNumber>;
205
+ windowColumns: z.ZodDefault<z.ZodNumber>;
206
+ windowRows: z.ZodDefault<z.ZodNumber>;
207
+ windowDividerThickness: z.ZodDefault<z.ZodNumber>;
208
+ windowShape: z.ZodDefault<z.ZodEnum<{
209
+ rectangle: "rectangle";
210
+ rounded: "rounded";
211
+ arch: "arch";
212
+ }>>;
213
+ windowArchHeight: z.ZodDefault<z.ZodNumber>;
214
+ windowCornerRadii: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
215
+ windowSill: z.ZodDefault<z.ZodBoolean>;
216
+ windowSillDepth: z.ZodDefault<z.ZodNumber>;
217
+ windowSillThickness: z.ZodDefault<z.ZodNumber>;
218
+ }, z.core.$strip>;
219
+ export type DormerNode = z.infer<typeof DormerNode>;
220
+ /**
221
+ * Per-surface material resolution. Fall-through order:
222
+ * top → topMaterial[Preset] → legacy
223
+ * side → sideMaterial[Preset] → wallMaterial[Preset] → legacy
224
+ * wall → wallMaterial[Preset] → sideMaterial[Preset] → legacy
225
+ * where legacy is `node.material` / `node.materialPreset`.
226
+ */
227
+ export declare function getEffectiveDormerSurfaceMaterial(node: DormerNode, role: DormerSurfaceMaterialRole): DormerSurfaceMaterialSpec;
228
+ //# sourceMappingURL=dormer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dormer.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/dormer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAG5C,MAAM,MAAM,yBAAyB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAA;AAC/D,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;IACzC,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;CAmBlB,CAAA;AASV,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4DtB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAEnD;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,yBAAyB,GAC9B,yBAAyB,CAuB3B"}
@@ -0,0 +1,119 @@
1
+ import dedent from 'dedent';
2
+ import { z } from 'zod';
3
+ import { BaseNode, nodeType, objectId } from '../base';
4
+ import { MaterialSchema } from '../material';
5
+ import { RoofType } from './roof-segment';
6
+ /**
7
+ * Default dormer dimensions and window controls. Values match the
8
+ * legacy archive so existing scenes don't shift visually.
9
+ */
10
+ export const DORMER_DEFAULTS = {
11
+ WIDTH: 1.21,
12
+ DEPTH: 1.55,
13
+ WALL_HEIGHT: 0,
14
+ ROOF_HEIGHT: 0.49,
15
+ WALL_SKIRT_HEIGHT: 2.73,
16
+ WINDOW_WIDTH: 0.76,
17
+ WINDOW_HEIGHT: 0.68,
18
+ WINDOW_OFFSET_X: 0.02,
19
+ WINDOW_OFFSET_Y: 0.99,
20
+ WINDOW_FRAME_THICKNESS: 0.05,
21
+ WINDOW_FRAME_DEPTH: 0.06,
22
+ WINDOW_COLUMNS: 3,
23
+ WINDOW_ROWS: 3,
24
+ WINDOW_DIVIDER_THICKNESS: 0.02,
25
+ WINDOW_ARCH_HEIGHT: 0.35,
26
+ WINDOW_CORNER_RADIUS: 0.15,
27
+ WINDOW_SILL_DEPTH: 0.08,
28
+ WINDOW_SILL_THICKNESS: 0.03,
29
+ };
30
+ const DEFAULT_CORNER_RADII = [
31
+ DORMER_DEFAULTS.WINDOW_CORNER_RADIUS,
32
+ DORMER_DEFAULTS.WINDOW_CORNER_RADIUS,
33
+ DORMER_DEFAULTS.WINDOW_CORNER_RADIUS,
34
+ DORMER_DEFAULTS.WINDOW_CORNER_RADIUS,
35
+ ];
36
+ export const DormerNode = BaseNode.extend({
37
+ id: objectId('dormer'),
38
+ type: nodeType('dormer'),
39
+ material: MaterialSchema.optional(),
40
+ materialPreset: z.string().optional(),
41
+ topMaterial: MaterialSchema.optional(),
42
+ topMaterialPreset: z.string().optional(),
43
+ sideMaterial: MaterialSchema.optional(),
44
+ sideMaterialPreset: z.string().optional(),
45
+ wallMaterial: MaterialSchema.optional(),
46
+ wallMaterialPreset: z.string().optional(),
47
+ roofSegmentId: z.string().optional(),
48
+ position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
49
+ rotation: z.number().default(0),
50
+ width: z.number().default(DORMER_DEFAULTS.WIDTH),
51
+ depth: z.number().default(DORMER_DEFAULTS.DEPTH),
52
+ height: z.number().default(DORMER_DEFAULTS.WALL_HEIGHT),
53
+ roofType: RoofType.default('gable'),
54
+ roofHeight: z.number().default(DORMER_DEFAULTS.ROOF_HEIGHT),
55
+ // Height of the hung wall (the "skirt") that extends below the eave
56
+ // into the host roof — this is the wall area the window opening is
57
+ // cut through. Larger values let the dormer host taller windows.
58
+ wallSkirtHeight: z.number().default(DORMER_DEFAULTS.WALL_SKIRT_HEIGHT),
59
+ // Window is rendered as parametric geometry on the dormer's front
60
+ // face — not a child node. The fields below mirror the legacy panel
61
+ // controls; geometry beyond the simple opening box is deferred.
62
+ windowWidth: z.number().default(DORMER_DEFAULTS.WINDOW_WIDTH),
63
+ windowHeight: z.number().default(DORMER_DEFAULTS.WINDOW_HEIGHT),
64
+ windowOffsetX: z.number().default(DORMER_DEFAULTS.WINDOW_OFFSET_X),
65
+ windowOffsetY: z.number().default(DORMER_DEFAULTS.WINDOW_OFFSET_Y),
66
+ windowFrameThickness: z.number().default(DORMER_DEFAULTS.WINDOW_FRAME_THICKNESS),
67
+ windowFrameDepth: z.number().default(DORMER_DEFAULTS.WINDOW_FRAME_DEPTH),
68
+ windowColumns: z.number().int().min(1).max(8).default(DORMER_DEFAULTS.WINDOW_COLUMNS),
69
+ windowRows: z.number().int().min(1).max(8).default(DORMER_DEFAULTS.WINDOW_ROWS),
70
+ windowDividerThickness: z.number().default(DORMER_DEFAULTS.WINDOW_DIVIDER_THICKNESS),
71
+ windowShape: z.enum(['rectangle', 'rounded', 'arch']).default('rectangle'),
72
+ windowArchHeight: z.number().default(DORMER_DEFAULTS.WINDOW_ARCH_HEIGHT),
73
+ // Single source of truth for the rounded-shape corner radii. Tuple is
74
+ // [topLeft, topRight, bottomRight, bottomLeft]. "All vs Individual"
75
+ // is a UI-only view mode derived from whether the tuple is uniform.
76
+ windowCornerRadii: z
77
+ .tuple([z.number(), z.number(), z.number(), z.number()])
78
+ .default(DEFAULT_CORNER_RADII),
79
+ windowSill: z.boolean().default(true),
80
+ windowSillDepth: z.number().default(DORMER_DEFAULTS.WINDOW_SILL_DEPTH),
81
+ windowSillThickness: z.number().default(DORMER_DEFAULTS.WINDOW_SILL_THICKNESS),
82
+ }).describe(dedent `
83
+ Dormer — a small house-shaped protrusion sitting on top of a roof
84
+ segment. width × depth × height defines the box base; roofType and
85
+ roofHeight define the dormer's own roof shape. The window opening
86
+ is parametric geometry on the dormer's front face, not a hosted
87
+ child node.
88
+ `);
89
+ /**
90
+ * Per-surface material resolution. Fall-through order:
91
+ * top → topMaterial[Preset] → legacy
92
+ * side → sideMaterial[Preset] → wallMaterial[Preset] → legacy
93
+ * wall → wallMaterial[Preset] → sideMaterial[Preset] → legacy
94
+ * where legacy is `node.material` / `node.materialPreset`.
95
+ */
96
+ export function getEffectiveDormerSurfaceMaterial(node, role) {
97
+ const top = {
98
+ material: node.topMaterial,
99
+ materialPreset: node.topMaterialPreset,
100
+ };
101
+ const side = {
102
+ material: node.sideMaterial,
103
+ materialPreset: node.sideMaterialPreset,
104
+ };
105
+ const wall = {
106
+ material: node.wallMaterial,
107
+ materialPreset: node.wallMaterialPreset,
108
+ };
109
+ const legacy = {
110
+ material: node.material,
111
+ materialPreset: node.materialPreset,
112
+ };
113
+ const has = (spec) => spec.material !== undefined || typeof spec.materialPreset === 'string';
114
+ if (role === 'top')
115
+ return has(top) ? top : legacy;
116
+ if (role === 'side')
117
+ return has(side) ? side : has(wall) ? wall : legacy;
118
+ return has(wall) ? wall : has(side) ? side : legacy;
119
+ }
@@ -0,0 +1,75 @@
1
+ import { z } from 'zod';
2
+ export declare const DownspoutNode: z.ZodObject<{
3
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
4
+ name: z.ZodOptional<z.ZodString>;
5
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
6
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
7
+ camera: z.ZodOptional<z.ZodObject<{
8
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
9
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
10
+ mode: z.ZodDefault<z.ZodEnum<{
11
+ perspective: "perspective";
12
+ orthographic: "orthographic";
13
+ }>>;
14
+ fov: z.ZodOptional<z.ZodNumber>;
15
+ zoom: z.ZodOptional<z.ZodNumber>;
16
+ }, z.core.$strip>>;
17
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
18
+ id: z.ZodDefault<z.ZodTemplateLiteral<`downspout_${string}`>>;
19
+ type: z.ZodDefault<z.ZodLiteral<"downspout">>;
20
+ material: z.ZodOptional<z.ZodObject<{
21
+ id: z.ZodOptional<z.ZodString>;
22
+ preset: z.ZodOptional<z.ZodEnum<{
23
+ custom: "custom";
24
+ white: "white";
25
+ brick: "brick";
26
+ concrete: "concrete";
27
+ wood: "wood";
28
+ glass: "glass";
29
+ metal: "metal";
30
+ plaster: "plaster";
31
+ tile: "tile";
32
+ marble: "marble";
33
+ }>>;
34
+ properties: z.ZodOptional<z.ZodObject<{
35
+ color: z.ZodDefault<z.ZodString>;
36
+ roughness: z.ZodDefault<z.ZodNumber>;
37
+ metalness: z.ZodDefault<z.ZodNumber>;
38
+ opacity: z.ZodDefault<z.ZodNumber>;
39
+ transparent: z.ZodDefault<z.ZodBoolean>;
40
+ side: z.ZodDefault<z.ZodEnum<{
41
+ front: "front";
42
+ back: "back";
43
+ double: "double";
44
+ }>>;
45
+ }, z.core.$strip>>;
46
+ texture: z.ZodOptional<z.ZodObject<{
47
+ url: z.ZodString;
48
+ repeat: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
49
+ scale: z.ZodOptional<z.ZodNumber>;
50
+ }, z.core.$strip>>;
51
+ }, z.core.$strip>>;
52
+ materialPreset: z.ZodDefault<z.ZodString>;
53
+ gutterId: z.ZodOptional<z.ZodString>;
54
+ outletId: z.ZodOptional<z.ZodString>;
55
+ length: z.ZodDefault<z.ZodNumber>;
56
+ diameter: z.ZodDefault<z.ZodNumber>;
57
+ standoff: z.ZodDefault<z.ZodNumber>;
58
+ shape: z.ZodDefault<z.ZodEnum<{
59
+ round: "round";
60
+ auto: "auto";
61
+ rect: "rect";
62
+ }>>;
63
+ strapStyle: z.ZodDefault<z.ZodEnum<{
64
+ none: "none";
65
+ band: "band";
66
+ }>>;
67
+ strapSpacing: z.ZodDefault<z.ZodNumber>;
68
+ terminal: z.ZodDefault<z.ZodEnum<{
69
+ straight: "straight";
70
+ splash: "splash";
71
+ kickout: "kickout";
72
+ }>>;
73
+ }, z.core.$strip>;
74
+ export type DownspoutNode = z.infer<typeof DownspoutNode>;
75
+ //# sourceMappingURL=downspout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downspout.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/downspout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkEzB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA"}
@@ -0,0 +1,63 @@
1
+ import dedent from 'dedent';
2
+ import { z } from 'zod';
3
+ import { BaseNode, nodeType, objectId } from '../base';
4
+ import { MaterialSchema } from '../material';
5
+ export const DownspoutNode = BaseNode.extend({
6
+ id: objectId('downspout'),
7
+ type: nodeType('downspout'),
8
+ material: MaterialSchema.optional(),
9
+ // Match the gutter family default — paint inspector reads "White"
10
+ // instead of "no material" on a freshly placed downspout.
11
+ materialPreset: z.string().default('preset-white'),
12
+ // Logical attachment: the gutter this downspout drains. Scene-graph
13
+ // parent is the same roof-segment that hosts the gutter, so the
14
+ // renderer can be reached through the segment's children list (like
15
+ // every other roof accessory). gutterId then drives the LOOKUP of
16
+ // outlet X/Z/diameter — the downspout's actual mount position is
17
+ // derived from the gutter, not stored.
18
+ gutterId: z.string().optional(),
19
+ // Which of the host gutter's `outlets` this downspout drains, by the
20
+ // outlet's `id`. The mount position, bore, and cross-section shape are
21
+ // looked up from that outlet — so several downspouts on one gutter no
22
+ // longer stack on a single drop.
23
+ outletId: z.string().optional(),
24
+ // Length the pipe extends DOWN from the gutter outlet, in metres.
25
+ // Default 2.5 m covers a typical residential storey; the placement
26
+ // tool can default to the gutter's eave-Y minus building floor on
27
+ // commit so the user doesn't have to set it on every drop.
28
+ length: z.number().default(2.5),
29
+ // Bore diameter, default 0.07 m ≈ 3″ to match the gutter outlet
30
+ // default. Larger downspouts are common on commercial gutters.
31
+ diameter: z.number().default(0.07),
32
+ // Gap between the pipe's wall-facing surface and the wall face, in
33
+ // metres. The downspout's offset elbows step it back from the eave
34
+ // overhang to the wall; this controls how far proud of the wall it
35
+ // sits (real downspouts mount on standoff brackets ~1–2 cm off the
36
+ // wall). Larger values pull the run back OUT toward the eave — the
37
+ // escape hatch when the auto-routed wall position doesn't match the
38
+ // actual wall (overshoots into it). Default 0.02 m.
39
+ standoff: z.number().default(0.02),
40
+ // Cross-section shape. 'auto' follows the host gutter's profile (round
41
+ // on half-round, rectangular on k-style / box); 'round' / 'rect'
42
+ // override it for a mixed look.
43
+ shape: z.enum(['auto', 'round', 'rect']).default('auto'),
44
+ // Wall straps clamping the run to the wall. 'band' renders periodic
45
+ // bands; 'none' hides them. Spacing is metres between bands.
46
+ strapStyle: z.enum(['band', 'none']).default('band'),
47
+ strapSpacing: z.number().default(1.8),
48
+ // What happens at the bottom of the run:
49
+ // - 'splash': kickout elbow + a splash block on the ground (default)
50
+ // - 'kickout': kickout elbow only (e.g. into a drain pipe)
51
+ // - 'straight': no kick — runs straight down (into a grade drain)
52
+ terminal: z.enum(['splash', 'kickout', 'straight']).default('splash'),
53
+ }).describe(dedent `
54
+ Downspout — a vertical pipe that takes water from a gutter outlet
55
+ down to ground level. Parented to a roof-segment (scene-graph),
56
+ linked to a specific gutter via gutterId for outlet position.
57
+ - length: vertical pipe length below the gutter outlet
58
+ - diameter: bore diameter; should match the host gutter's outletDiameter
59
+ - standoff: gap the pipe sits proud of the wall (pulls the run out toward the eave)
60
+ - shape: cross-section (auto follows the gutter profile, or force round / rect)
61
+ - strapStyle / strapSpacing: wall straps clamping the run
62
+ - terminal: bottom treatment (splash block, kickout only, or straight down)
63
+ `);
@@ -0,0 +1,105 @@
1
+ import { z } from 'zod';
2
+ export declare const ElevatorDoorStyle: z.ZodEnum<{
3
+ "center-opening": "center-opening";
4
+ "single-left": "single-left";
5
+ "single-right": "single-right";
6
+ }>;
7
+ export declare const ElevatorDoorPanelStyle: z.ZodEnum<{
8
+ "glass-frame": "glass-frame";
9
+ "solid-panel": "solid-panel";
10
+ "segmented-panel": "segmented-panel";
11
+ }>;
12
+ export declare const ElevatorShaftStyle: z.ZodEnum<{
13
+ glass: "glass";
14
+ solid: "solid";
15
+ }>;
16
+ export type ElevatorDoorPanelStyle = z.infer<typeof ElevatorDoorPanelStyle>;
17
+ export type ElevatorDoorStyle = z.infer<typeof ElevatorDoorStyle>;
18
+ export type ElevatorShaftStyle = z.infer<typeof ElevatorShaftStyle>;
19
+ export declare const ElevatorNode: z.ZodObject<{
20
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
21
+ name: z.ZodOptional<z.ZodString>;
22
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
23
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
24
+ camera: z.ZodOptional<z.ZodObject<{
25
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
26
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
27
+ mode: z.ZodDefault<z.ZodEnum<{
28
+ perspective: "perspective";
29
+ orthographic: "orthographic";
30
+ }>>;
31
+ fov: z.ZodOptional<z.ZodNumber>;
32
+ zoom: z.ZodOptional<z.ZodNumber>;
33
+ }, z.core.$strip>>;
34
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
35
+ id: z.ZodDefault<z.ZodTemplateLiteral<`elevator_${string}`>>;
36
+ type: z.ZodDefault<z.ZodLiteral<"elevator">>;
37
+ material: z.ZodOptional<z.ZodObject<{
38
+ id: z.ZodOptional<z.ZodString>;
39
+ preset: z.ZodOptional<z.ZodEnum<{
40
+ custom: "custom";
41
+ white: "white";
42
+ brick: "brick";
43
+ concrete: "concrete";
44
+ wood: "wood";
45
+ glass: "glass";
46
+ metal: "metal";
47
+ plaster: "plaster";
48
+ tile: "tile";
49
+ marble: "marble";
50
+ }>>;
51
+ properties: z.ZodOptional<z.ZodObject<{
52
+ color: z.ZodDefault<z.ZodString>;
53
+ roughness: z.ZodDefault<z.ZodNumber>;
54
+ metalness: z.ZodDefault<z.ZodNumber>;
55
+ opacity: z.ZodDefault<z.ZodNumber>;
56
+ transparent: z.ZodDefault<z.ZodBoolean>;
57
+ side: z.ZodDefault<z.ZodEnum<{
58
+ front: "front";
59
+ back: "back";
60
+ double: "double";
61
+ }>>;
62
+ }, z.core.$strip>>;
63
+ texture: z.ZodOptional<z.ZodObject<{
64
+ url: z.ZodString;
65
+ repeat: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
66
+ scale: z.ZodOptional<z.ZodNumber>;
67
+ }, z.core.$strip>>;
68
+ }, z.core.$strip>>;
69
+ materialPreset: z.ZodOptional<z.ZodString>;
70
+ position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
71
+ rotation: z.ZodDefault<z.ZodNumber>;
72
+ width: z.ZodDefault<z.ZodNumber>;
73
+ depth: z.ZodDefault<z.ZodNumber>;
74
+ shaftWidth: z.ZodOptional<z.ZodNumber>;
75
+ shaftDepth: z.ZodOptional<z.ZodNumber>;
76
+ shaftWallThickness: z.ZodDefault<z.ZodNumber>;
77
+ shaftStyle: z.ZodDefault<z.ZodEnum<{
78
+ glass: "glass";
79
+ solid: "solid";
80
+ }>>;
81
+ cabHeight: z.ZodDefault<z.ZodNumber>;
82
+ doorWidth: z.ZodDefault<z.ZodNumber>;
83
+ doorHeight: z.ZodDefault<z.ZodNumber>;
84
+ doorStyle: z.ZodDefault<z.ZodEnum<{
85
+ "center-opening": "center-opening";
86
+ "single-left": "single-left";
87
+ "single-right": "single-right";
88
+ }>>;
89
+ doorPanelStyle: z.ZodDefault<z.ZodEnum<{
90
+ "glass-frame": "glass-frame";
91
+ "solid-panel": "solid-panel";
92
+ "segmented-panel": "segmented-panel";
93
+ }>>;
94
+ fromLevelId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
95
+ toLevelId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
96
+ servedLevelIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
97
+ disabledLevelIds: z.ZodDefault<z.ZodArray<z.ZodString>>;
98
+ serviceOnlyLevelIds: z.ZodDefault<z.ZodArray<z.ZodString>>;
99
+ defaultLevelId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
100
+ speed: z.ZodDefault<z.ZodNumber>;
101
+ doorDurationMs: z.ZodDefault<z.ZodNumber>;
102
+ dwellMs: z.ZodDefault<z.ZodNumber>;
103
+ }, z.core.$strip>;
104
+ export type ElevatorNode = z.infer<typeof ElevatorNode>;
105
+ //# sourceMappingURL=elevator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elevator.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/elevator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,iBAAiB;;;;EAA4D,CAAA;AAC1F,eAAO,MAAM,sBAAsB;;;;EAA4D,CAAA;AAC/F,eAAO,MAAM,kBAAkB;;;EAA6B,CAAA;AAE5D,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAC3E,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AACjE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAEnE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgDxB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA"}