@pascal-app/nodes 1.1.0 → 1.1.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/README.md +3 -2
  2. package/dist/beam/definition.edit.d.ts.map +1 -1
  3. package/dist/beam/definition.edit.js +0 -2
  4. package/dist/beam/definition.render.d.ts.map +1 -1
  5. package/dist/beam/definition.render.js +2 -0
  6. package/dist/beam/floorplan.d.ts.map +1 -1
  7. package/dist/beam/floorplan.js +1 -2
  8. package/dist/block/definition.edit.d.ts.map +1 -1
  9. package/dist/block/definition.edit.js +0 -2
  10. package/dist/block/definition.render.d.ts.map +1 -1
  11. package/dist/block/definition.render.js +2 -0
  12. package/dist/block/floorplan.d.ts.map +1 -1
  13. package/dist/block/floorplan.js +1 -2
  14. package/dist/box-vent/definition.edit.d.ts.map +1 -1
  15. package/dist/box-vent/definition.edit.js +0 -2
  16. package/dist/box-vent/definition.render.d.ts.map +1 -1
  17. package/dist/box-vent/definition.render.js +2 -0
  18. package/dist/builtin-definitions.d.ts +57 -57
  19. package/dist/builtin-edit-contributions.d.ts +1 -1
  20. package/dist/cabinet/definition.edit.d.ts.map +1 -1
  21. package/dist/cabinet/definition.edit.js +0 -3
  22. package/dist/cabinet/definition.render.d.ts.map +1 -1
  23. package/dist/cabinet/definition.render.js +3 -0
  24. package/dist/cabinet/floorplan.js +1 -1
  25. package/dist/ceiling/definition.edit.d.ts.map +1 -1
  26. package/dist/ceiling/definition.edit.js +0 -2
  27. package/dist/ceiling/definition.render.d.ts.map +1 -1
  28. package/dist/ceiling/definition.render.js +2 -0
  29. package/dist/chimney/definition.edit.d.ts.map +1 -1
  30. package/dist/chimney/definition.edit.js +0 -2
  31. package/dist/chimney/definition.render.d.ts.map +1 -1
  32. package/dist/chimney/definition.render.js +2 -0
  33. package/dist/chimney/panel.js +1 -1
  34. package/dist/column/definition.edit.d.ts.map +1 -1
  35. package/dist/column/definition.edit.js +0 -3
  36. package/dist/column/definition.render.d.ts.map +1 -1
  37. package/dist/column/definition.render.js +3 -0
  38. package/dist/column/floorplan.d.ts.map +1 -1
  39. package/dist/column/floorplan.js +1 -2
  40. package/dist/construction-dimension/definition.edit.d.ts.map +1 -1
  41. package/dist/construction-dimension/definition.edit.js +0 -2
  42. package/dist/construction-dimension/definition.render.d.ts.map +1 -1
  43. package/dist/construction-dimension/definition.render.js +2 -0
  44. package/dist/construction-dimension/floorplan-tool.d.ts.map +1 -1
  45. package/dist/construction-dimension/floorplan-tool.js +2 -2
  46. package/dist/construction-dimension/floorplan.d.ts.map +1 -1
  47. package/dist/construction-dimension/floorplan.js +1 -2
  48. package/dist/cupola/definition.edit.d.ts.map +1 -1
  49. package/dist/cupola/definition.edit.js +0 -2
  50. package/dist/cupola/definition.render.d.ts.map +1 -1
  51. package/dist/cupola/definition.render.js +2 -0
  52. package/dist/definition-contributions.d.ts +1 -1
  53. package/dist/definition-contributions.d.ts.map +1 -1
  54. package/dist/door/definition.edit.d.ts.map +1 -1
  55. package/dist/door/definition.edit.js +1 -6
  56. package/dist/door/definition.render.d.ts.map +1 -1
  57. package/dist/door/definition.render.js +6 -0
  58. package/dist/door/floorplan.d.ts.map +1 -1
  59. package/dist/door/floorplan.js +1 -2
  60. package/dist/dormer/definition.edit.d.ts.map +1 -1
  61. package/dist/dormer/definition.edit.js +0 -2
  62. package/dist/dormer/definition.render.d.ts.map +1 -1
  63. package/dist/dormer/definition.render.js +2 -0
  64. package/dist/dormer/panel-position-section.js +1 -1
  65. package/dist/duct-fitting/definition.edit.d.ts.map +1 -1
  66. package/dist/duct-fitting/definition.edit.js +0 -2
  67. package/dist/duct-fitting/definition.render.d.ts.map +1 -1
  68. package/dist/duct-fitting/definition.render.js +2 -0
  69. package/dist/duct-segment/continuation-handle.d.ts +8 -0
  70. package/dist/duct-segment/continuation-handle.d.ts.map +1 -0
  71. package/dist/duct-segment/continuation-handle.js +36 -0
  72. package/dist/duct-segment/continuation.d.ts +1 -5
  73. package/dist/duct-segment/continuation.d.ts.map +1 -1
  74. package/dist/duct-segment/continuation.js +2 -36
  75. package/dist/duct-segment/definition.edit.d.ts.map +1 -1
  76. package/dist/duct-segment/definition.edit.js +0 -2
  77. package/dist/duct-segment/definition.render.d.ts.map +1 -1
  78. package/dist/duct-segment/definition.render.js +2 -0
  79. package/dist/duct-segment/floorplan.js +1 -1
  80. package/dist/duct-segment/selection.d.ts.map +1 -1
  81. package/dist/duct-segment/selection.js +2 -1
  82. package/dist/duct-segment/tool.d.ts.map +1 -1
  83. package/dist/duct-segment/tool.js +2 -1
  84. package/dist/duct-terminal/definition.edit.d.ts.map +1 -1
  85. package/dist/duct-terminal/definition.edit.js +0 -2
  86. package/dist/duct-terminal/definition.render.d.ts.map +1 -1
  87. package/dist/duct-terminal/definition.render.js +2 -0
  88. package/dist/elevator/definition.edit.d.ts.map +1 -1
  89. package/dist/elevator/definition.edit.js +0 -10
  90. package/dist/elevator/definition.render.d.ts.map +1 -1
  91. package/dist/elevator/definition.render.js +10 -0
  92. package/dist/eyebrow-vent/definition.edit.d.ts.map +1 -1
  93. package/dist/eyebrow-vent/definition.edit.js +0 -2
  94. package/dist/eyebrow-vent/definition.render.d.ts.map +1 -1
  95. package/dist/eyebrow-vent/definition.render.js +2 -0
  96. package/dist/fence/definition.edit.d.ts.map +1 -1
  97. package/dist/fence/definition.edit.js +0 -6
  98. package/dist/fence/definition.render.d.ts.map +1 -1
  99. package/dist/fence/definition.render.js +2 -0
  100. package/dist/fence-feature/definition.edit.d.ts.map +1 -1
  101. package/dist/fence-feature/definition.edit.js +0 -3
  102. package/dist/fence-feature/definition.render.d.ts.map +1 -1
  103. package/dist/fence-feature/definition.render.js +3 -0
  104. package/dist/floor-opening/definition.edit.d.ts.map +1 -1
  105. package/dist/floor-opening/definition.edit.js +1 -3
  106. package/dist/floor-opening/definition.render.d.ts.map +1 -1
  107. package/dist/floor-opening/definition.render.js +3 -0
  108. package/dist/floor-opening/floorplan-affordances.d.ts +150 -0
  109. package/dist/floor-opening/floorplan-affordances.d.ts.map +1 -0
  110. package/dist/floor-opening/floorplan-affordances.js +67 -0
  111. package/dist/floor-opening/floorplan.d.ts +2 -151
  112. package/dist/floor-opening/floorplan.d.ts.map +1 -1
  113. package/dist/floor-opening/floorplan.js +0 -66
  114. package/dist/gutter/definition.edit.d.ts.map +1 -1
  115. package/dist/gutter/definition.edit.js +0 -2
  116. package/dist/gutter/definition.render.d.ts.map +1 -1
  117. package/dist/gutter/definition.render.js +2 -0
  118. package/dist/hvac-equipment/definition.edit.d.ts.map +1 -1
  119. package/dist/hvac-equipment/definition.edit.js +0 -2
  120. package/dist/hvac-equipment/definition.render.d.ts.map +1 -1
  121. package/dist/hvac-equipment/definition.render.js +2 -0
  122. package/dist/imported-mesh/definition.edit.d.ts.map +1 -1
  123. package/dist/imported-mesh/definition.edit.js +0 -2
  124. package/dist/imported-mesh/definition.render.d.ts.map +1 -1
  125. package/dist/imported-mesh/definition.render.js +2 -0
  126. package/dist/item/definition.edit.d.ts.map +1 -1
  127. package/dist/item/definition.edit.js +1 -4
  128. package/dist/item/definition.render.d.ts.map +1 -1
  129. package/dist/item/definition.render.js +4 -0
  130. package/dist/item/floorplan.d.ts.map +1 -1
  131. package/dist/item/floorplan.js +1 -2
  132. package/dist/item/plan-symbols.js +1 -1
  133. package/dist/lean-to-extension/definition.edit.d.ts.map +1 -1
  134. package/dist/lean-to-extension/definition.edit.js +0 -2
  135. package/dist/lean-to-extension/definition.render.d.ts.map +1 -1
  136. package/dist/lean-to-extension/definition.render.js +2 -0
  137. package/dist/lineset/definition.edit.d.ts.map +1 -1
  138. package/dist/lineset/definition.edit.js +0 -2
  139. package/dist/lineset/definition.render.d.ts.map +1 -1
  140. package/dist/lineset/definition.render.js +2 -0
  141. package/dist/liquid-line/definition.edit.d.ts.map +1 -1
  142. package/dist/liquid-line/definition.edit.js +0 -2
  143. package/dist/liquid-line/definition.render.d.ts.map +1 -1
  144. package/dist/liquid-line/definition.render.js +2 -0
  145. package/dist/measurement/definition.edit.d.ts.map +1 -1
  146. package/dist/measurement/definition.edit.js +0 -2
  147. package/dist/measurement/definition.render.d.ts.map +1 -1
  148. package/dist/measurement/definition.render.js +2 -0
  149. package/dist/measurement/floorplan.d.ts.map +1 -1
  150. package/dist/measurement/floorplan.js +2 -3
  151. package/dist/pipe-fitting/definition.edit.d.ts.map +1 -1
  152. package/dist/pipe-fitting/definition.edit.js +0 -2
  153. package/dist/pipe-fitting/definition.render.d.ts.map +1 -1
  154. package/dist/pipe-fitting/definition.render.js +2 -0
  155. package/dist/pipe-segment/continuation-handle.d.ts +9 -0
  156. package/dist/pipe-segment/continuation-handle.d.ts.map +1 -0
  157. package/dist/pipe-segment/continuation-handle.js +35 -0
  158. package/dist/pipe-segment/continuation.d.ts +1 -5
  159. package/dist/pipe-segment/continuation.d.ts.map +1 -1
  160. package/dist/pipe-segment/continuation.js +2 -35
  161. package/dist/pipe-segment/definition.edit.d.ts.map +1 -1
  162. package/dist/pipe-segment/definition.edit.js +0 -2
  163. package/dist/pipe-segment/definition.render.d.ts.map +1 -1
  164. package/dist/pipe-segment/definition.render.js +2 -0
  165. package/dist/pipe-segment/floorplan.js +1 -1
  166. package/dist/pipe-segment/selection.d.ts.map +1 -1
  167. package/dist/pipe-segment/selection.js +2 -1
  168. package/dist/pipe-segment/tool.d.ts.map +1 -1
  169. package/dist/pipe-segment/tool.js +2 -1
  170. package/dist/pipe-trap/definition.edit.d.ts.map +1 -1
  171. package/dist/pipe-trap/definition.edit.js +0 -2
  172. package/dist/pipe-trap/definition.render.d.ts.map +1 -1
  173. package/dist/pipe-trap/definition.render.js +2 -0
  174. package/dist/procedural-item/definition.edit.d.ts.map +1 -1
  175. package/dist/procedural-item/definition.edit.js +1 -54
  176. package/dist/procedural-item/definition.render.d.ts.map +1 -1
  177. package/dist/procedural-item/definition.render.js +55 -2
  178. package/dist/ridge-vent/definition.edit.d.ts.map +1 -1
  179. package/dist/ridge-vent/definition.edit.js +0 -2
  180. package/dist/ridge-vent/definition.render.d.ts.map +1 -1
  181. package/dist/ridge-vent/definition.render.js +2 -0
  182. package/dist/roof/definition.d.ts +1 -1
  183. package/dist/roof/definition.edit.d.ts.map +1 -1
  184. package/dist/roof/definition.edit.js +0 -2
  185. package/dist/roof/definition.render.d.ts.map +1 -1
  186. package/dist/roof/definition.render.js +16 -5
  187. package/dist/roof/floorplan.d.ts.map +1 -1
  188. package/dist/roof/floorplan.js +1 -2
  189. package/dist/roof/renderer.d.ts.map +1 -1
  190. package/dist/roof/renderer.js +10 -5
  191. package/dist/roof-segment/definition.edit.d.ts.map +1 -1
  192. package/dist/roof-segment/definition.edit.js +0 -2
  193. package/dist/roof-segment/definition.render.d.ts.map +1 -1
  194. package/dist/roof-segment/definition.render.js +2 -0
  195. package/dist/separator/definition.edit.d.ts.map +1 -1
  196. package/dist/separator/definition.edit.js +0 -2
  197. package/dist/separator/definition.render.d.ts.map +1 -1
  198. package/dist/separator/definition.render.js +2 -0
  199. package/dist/separator/floorplan.js +1 -1
  200. package/dist/shared/opening-documentation.d.ts +1 -1
  201. package/dist/shared/opening-documentation.d.ts.map +1 -1
  202. package/dist/shared/opening-documentation.js +1 -2
  203. package/dist/shared/opening-placement-dimensions.d.ts.map +1 -1
  204. package/dist/shared/opening-placement-dimensions.js +1 -2
  205. package/dist/shelf/definition.edit.d.ts.map +1 -1
  206. package/dist/shelf/definition.edit.js +0 -2
  207. package/dist/shelf/definition.render.d.ts.map +1 -1
  208. package/dist/shelf/definition.render.js +2 -0
  209. package/dist/skylight/definition.edit.d.ts.map +1 -1
  210. package/dist/skylight/definition.edit.js +0 -2
  211. package/dist/skylight/definition.render.d.ts.map +1 -1
  212. package/dist/skylight/definition.render.js +2 -0
  213. package/dist/skylight/panel.js +1 -1
  214. package/dist/slab/definition.edit.d.ts.map +1 -1
  215. package/dist/slab/definition.edit.js +0 -4
  216. package/dist/slab/definition.render.d.ts.map +1 -1
  217. package/dist/slab/definition.render.js +4 -0
  218. package/dist/slab/floorplan.d.ts.map +1 -1
  219. package/dist/slab/floorplan.js +1 -2
  220. package/dist/solar-panel/definition.edit.d.ts.map +1 -1
  221. package/dist/solar-panel/definition.edit.js +0 -2
  222. package/dist/solar-panel/definition.render.d.ts.map +1 -1
  223. package/dist/solar-panel/definition.render.js +2 -0
  224. package/dist/spawn/definition.edit.d.ts.map +1 -1
  225. package/dist/spawn/definition.edit.js +0 -9
  226. package/dist/spawn/definition.render.d.ts.map +1 -1
  227. package/dist/spawn/definition.render.js +2 -0
  228. package/dist/stair/definition.edit.d.ts.map +1 -1
  229. package/dist/stair/definition.edit.js +0 -13
  230. package/dist/stair/definition.render.d.ts.map +1 -1
  231. package/dist/stair/definition.render.js +10 -0
  232. package/dist/stair/documentation.d.ts.map +1 -1
  233. package/dist/stair/documentation.js +1 -2
  234. package/dist/stair/floorplan.d.ts.map +1 -1
  235. package/dist/stair/floorplan.js +1 -2
  236. package/dist/stair/plan-entry.d.ts.map +1 -1
  237. package/dist/stair/plan-entry.js +1 -2
  238. package/dist/structural-grid/definition.edit.d.ts.map +1 -1
  239. package/dist/structural-grid/definition.edit.js +0 -2
  240. package/dist/structural-grid/definition.render.d.ts.map +1 -1
  241. package/dist/structural-grid/definition.render.js +2 -0
  242. package/dist/structural-grid/floorplan.js +1 -1
  243. package/dist/turbine-vent/definition.edit.d.ts.map +1 -1
  244. package/dist/turbine-vent/definition.edit.js +0 -2
  245. package/dist/turbine-vent/definition.render.d.ts.map +1 -1
  246. package/dist/turbine-vent/definition.render.js +2 -0
  247. package/dist/wall/contextual-dimensions.d.ts.map +1 -1
  248. package/dist/wall/contextual-dimensions.js +1 -2
  249. package/dist/wall/definition.edit.d.ts.map +1 -1
  250. package/dist/wall/definition.edit.js +0 -5
  251. package/dist/wall/definition.render.d.ts.map +1 -1
  252. package/dist/wall/definition.render.js +5 -0
  253. package/dist/wall/floorplan.d.ts.map +1 -1
  254. package/dist/wall/floorplan.js +1 -2
  255. package/dist/window/definition.edit.d.ts.map +1 -1
  256. package/dist/window/definition.edit.js +1 -6
  257. package/dist/window/definition.render.d.ts.map +1 -1
  258. package/dist/window/definition.render.js +6 -0
  259. package/dist/window/floorplan.d.ts.map +1 -1
  260. package/dist/window/floorplan.js +1 -2
  261. package/dist/zone/definition.edit.d.ts.map +1 -1
  262. package/dist/zone/definition.edit.js +0 -2
  263. package/dist/zone/definition.render.d.ts.map +1 -1
  264. package/dist/zone/definition.render.js +2 -0
  265. package/dist/zone/floorplan.d.ts.map +1 -1
  266. package/dist/zone/floorplan.js +1 -2
  267. package/dist/zone/room-clear-dimensions.d.ts.map +1 -1
  268. package/dist/zone/room-clear-dimensions.js +1 -2
  269. package/dist/zone/room-documentation.d.ts +1 -2
  270. package/dist/zone/room-documentation.d.ts.map +1 -1
  271. package/dist/zone/room-documentation.js +1 -1
  272. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/ridge-vent/definition.edit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAIvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AA6I7C,eAAO,MAAM,yBAAyB,EAAE,oBAAoB,CAAC,OAAO,aAAa,CAkBhF,CAAA"}
1
+ {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/ridge-vent/definition.edit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAGvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AA6I7C,eAAO,MAAM,yBAAyB,EAAE,oBAAoB,CAAC,OAAO,aAAa,CAiBhF,CAAA"}
@@ -1,5 +1,4 @@
1
1
  import { surfacePaintCapability } from '../shared/surface-paint.js';
2
- import { buildRidgeVentFloorplan } from './floorplan.js';
3
2
  import { ridgeVentParametrics } from './parametrics.js';
4
3
  // Edge-to-arrow-center offset, matching the box-vent / chimney cadence.
5
4
  const SIDE_HANDLE_OFFSET = 0.25;
@@ -135,7 +134,6 @@ export const ridgeVentEditContribution = {
135
134
  },
136
135
  parametrics: ridgeVentParametrics,
137
136
  handles: ridgeVentHandles,
138
- floorplan: buildRidgeVentFloorplan,
139
137
  preview: () => import('./preview.js'),
140
138
  tool: () => import('./tool.js'),
141
139
  affordanceTools: {
@@ -1 +1 @@
1
- {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/ridge-vent/definition.render.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,eAAO,MAAM,yBAAyB,EAAE,oBAAoB,CAAC,OAAO,aAAa,CAAC,GAAG;IACnF,IAAI,EAAE,YAAY,CAAA;CAyCnB,CAAA"}
1
+ {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/ridge-vent/definition.render.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAEvE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,eAAO,MAAM,yBAAyB,EAAE,oBAAoB,CAAC,OAAO,aAAa,CAAC,GAAG;IACnF,IAAI,EAAE,YAAY,CAAA;CA0CnB,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { RidgeVentNode as RidgeVentNodeSchema } from '@pascal-app/core';
2
+ import { buildRidgeVentFloorplan } from './floorplan.js';
2
3
  import { RidgeVentNode } from './schema.js';
3
4
  export const ridgeVentRenderDefinition = {
4
5
  kind: 'ridge-vent',
@@ -29,6 +30,7 @@ export const ridgeVentRenderDefinition = {
29
30
  kind: 'parametric',
30
31
  module: () => import('./renderer.js'),
31
32
  },
33
+ floorplan: buildRidgeVentFloorplan,
32
34
  presentation: {
33
35
  label: 'Ridge Vent',
34
36
  description: 'Ventilation strip running along the ridge of a roof segment.',
@@ -321,6 +321,6 @@ export declare const roofDefinition: import("@pascal-app/core").NodeDefinition<i
321
321
  cavityInsulation: import("zod").ZodOptional<import("zod").ZodString>;
322
322
  }, import("zod/v4/core").$strip>>;
323
323
  slots: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
324
- children: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodDefault<import("zod").ZodTemplateLiteral<`rseg_${string}`>>>>;
324
+ children: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodString>>;
325
325
  }, import("zod/v4/core").$strip>>;
326
326
  //# sourceMappingURL=definition.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/roof/definition.edit.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAgBvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAqFxC,eAAO,MAAM,oBAAoB,EAAE,oBAAoB,CAAC,OAAO,QAAQ,CAyGtE,CAAA"}
1
+ {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/roof/definition.edit.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAevE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAqFxC,eAAO,MAAM,oBAAoB,EAAE,oBAAoB,CAAC,OAAO,QAAQ,CAwGtE,CAAA"}
@@ -1,6 +1,5 @@
1
1
  import { DRAFTING_SURFACE_EXTENSION_KEY, FLOORPLAN_NODE_EXTENSION_KEY, PANEL_MODEL_EXTENSION, } from '@pascal-app/editor';
2
2
  import { MIN_ROOF_FOOTPRINT } from './definition.render.js';
3
- import { buildRoofFloorplan } from './floorplan.js';
4
3
  import { roofFloorplanAffectedIds, roofFloorplanSiblingOverrides } from './floorplan-overrides.js';
5
4
  import { roofPaint } from './paint.js';
6
5
  import { roofPanelModel } from './panel-model.js';
@@ -177,7 +176,6 @@ export const roofEditContribution = {
177
176
  ],
178
177
  parametrics: roofParametrics,
179
178
  handles: resolveRoofHandles,
180
- floorplan: buildRoofFloorplan,
181
179
  floorplanSiblingOverrides: roofFloorplanSiblingOverrides,
182
180
  floorplanAffectedIds: roofFloorplanAffectedIds,
183
181
  };
@@ -1 +1 @@
1
- {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/roof/definition.render.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC,eAAO,MAAM,kBAAkB,IAAI,CAAA;AAEnC,eAAO,MAAM,oBAAoB,EAAE,oBAAoB,CAAC,OAAO,QAAQ,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CA2FxF,CAAA"}
1
+ {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/roof/definition.render.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAEvE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC,eAAO,MAAM,kBAAkB,IAAI,CAAA;AAEnC,eAAO,MAAM,oBAAoB,EAAE,oBAAoB,CAAC,OAAO,QAAQ,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAqGxF,CAAA"}
@@ -1,4 +1,5 @@
1
- import { RoofNode as RoofNodeSchema, } from '@pascal-app/core';
1
+ import { RoofNode as RoofNodeSchema, roofFaceShapes, } from '@pascal-app/core';
2
+ import { buildRoofFloorplan } from './floorplan.js';
2
3
  import { RoofNode } from './schema.js';
3
4
  export const MIN_ROOF_FOOTPRINT = 1;
4
5
  export const roofRenderDefinition = {
@@ -30,10 +31,10 @@ export const roofRenderDefinition = {
30
31
  // Contribute a plan AABB to the alignment-guide candidate pool so a roof
31
32
  // (and any moving sibling) snaps against the roof's outer silhouette.
32
33
  // Roof has no centred-box footprint — it's the union of its
33
- // `roof-segment` children — so we hand the bridge a resolved `aabb`
34
- // directly. The roof moves by its origin via `move-roof-tool`, so it
35
- // only ever contributes static candidates; the relocatable-box path
36
- // never needs to apply to roofs.
34
+ // `roof-segment` children and its faces' outlines — so we hand the bridge
35
+ // a resolved `aabb` directly. The roof moves by its origin via
36
+ // `move-roof-tool`, so it only ever contributes static candidates; the
37
+ // relocatable-box path never needs to apply to roofs.
37
38
  alignmentFootprint: (node, nodes) => {
38
39
  const roof = node;
39
40
  if (!nodes)
@@ -45,6 +46,15 @@ export const roofRenderDefinition = {
45
46
  let maxX = Number.NEGATIVE_INFINITY;
46
47
  let maxZ = Number.NEGATIVE_INFINITY;
47
48
  let any = false;
49
+ for (const face of roofFaceShapes(roof, nodes)) {
50
+ for (const [wx, wz] of face.outline) {
51
+ minX = Math.min(minX, wx);
52
+ maxX = Math.max(maxX, wx);
53
+ minZ = Math.min(minZ, wz);
54
+ maxZ = Math.max(maxZ, wz);
55
+ any = true;
56
+ }
57
+ }
48
58
  for (const childId of roof.children ?? []) {
49
59
  const segment = nodes[childId];
50
60
  if (segment?.type !== 'roof-segment')
@@ -88,6 +98,7 @@ export const roofRenderDefinition = {
88
98
  module: () => import('./system.js'),
89
99
  priority: 3,
90
100
  },
101
+ floorplan: buildRoofFloorplan,
91
102
  presentation: {
92
103
  label: 'Roof',
93
104
  description: 'A pitched / hip / gable roof composed of one or more segments.',
@@ -1 +1 @@
1
- {"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/roof/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EAIpB,KAAK,QAAQ,EAKd,MAAM,kBAAkB,CAAA;AAyCzB;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMvD;AAqPD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,GAAG,iBAAiB,GAAG,IAAI,CAmPjG"}
1
+ {"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/roof/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EAGtB,KAAK,eAAe,EAIpB,KAAK,QAAQ,EAMd,MAAM,kBAAkB,CAAA;AAwCzB;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMvD;AAqPD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,GAAG,iBAAiB,GAAG,IAAI,CAmPjG"}
@@ -1,5 +1,4 @@
1
- import { getGlazedRoofPlanLines, getRoofSegmentVisibleTopBounds, getSegmentSlopeFrame, roofPlanOverlapEntryOwns, subtractPolygonsFromPolygon, unionPolygons, } from '@pascal-app/core';
2
- import { floorplanGeometryMetadata, readFloorplanContext } from '@pascal-app/editor';
1
+ import { floorplanGeometryMetadata, getGlazedRoofPlanLines, getRoofSegmentVisibleTopBounds, getSegmentSlopeFrame, readFloorplanContext, roofPlanOverlapEntryOwns, subtractPolygonsFromPolygon, unionPolygons, } from '@pascal-app/core';
3
2
  import { getConicalRoofPlanFootprint, getRoofSegmentPlanLinework } from '../roof-segment/floorplan.js';
4
3
  import { getRoofSurfaceCreases } from './roof-plan-creases.js';
5
4
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/roof/renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,QAAQ,EAKd,MAAM,kBAAkB,CAAA;AAiBzB,eAAO,MAAM,YAAY,sBAAuB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,gCAqKjE,CAAA;eAEc,YAAY"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/roof/renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,QAAQ,EAMd,MAAM,kBAAkB,CAAA;AAiBzB,eAAO,MAAM,YAAY,sBAAuB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,gCAuLjE,CAAA;eAEc,YAAY"}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { hasSegmentMaterialOverride, isIndependentRoofSegment, useLiveNodeOverrides, useRegistry, useScene, } from '@pascal-app/core';
3
+ import { hasSegmentMaterialOverride, isIndependentRoofSegment, roofFaceOf, useLiveNodeOverrides, useRegistry, useRegistryVersion, useScene, } from '@pascal-app/core';
4
4
  import { getRoofMaterialArray, isRevealAssembling, levelWallCladdingRef, levelWallFaceRef, NodeRenderer, subscribeRevealAssembling, useNodeEvents, useViewer, } from '@pascal-app/viewer';
5
5
  import { useEffect, useLayoutEffect, useMemo, useRef } from 'react';
6
6
  import { useShallow } from 'zustand/react/shallow';
@@ -57,13 +57,18 @@ export const RoofRenderer = ({ node: rawNode }) => {
57
57
  const ids = [];
58
58
  for (const segmentId of node.children ?? []) {
59
59
  const seg = state.nodes[segmentId];
60
- if (!seg)
60
+ if (seg?.type !== 'roof-segment')
61
61
  continue;
62
62
  for (const childId of seg.children ?? [])
63
63
  ids.push(childId);
64
64
  }
65
65
  return ids;
66
66
  }));
67
+ // Faces of other kinds (`capabilities.roofs`: a plugin's roof planes) render as their own kind,
68
+ // in the roof's frame, beside the shell its segments merge into. A plugin registers its kinds
69
+ // after the first mount: the version re-reads them.
70
+ useRegistryVersion();
71
+ const faceIds = useScene(useShallow((state) => (node.children ?? []).filter((childId) => roofFaceOf(state.nodes[childId]))));
67
72
  // Segments that carry their own material/preset are rendered outside the
68
73
  // segments-wrapper so they stay visible after edit mode exits — the merged
69
74
  // shell skips them (see updateMergedRoofGeometry) to avoid overdraw.
@@ -75,7 +80,7 @@ export const RoofRenderer = ({ node: rawNode }) => {
75
80
  const ids = [];
76
81
  for (const segmentId of node.children ?? []) {
77
82
  const seg = state.nodes[segmentId];
78
- if (!seg)
83
+ if (seg?.type !== 'roof-segment')
79
84
  continue;
80
85
  if (hasSegmentMaterialOverride(seg) || isIndependentRoofSegment(seg))
81
86
  ids.push(segmentId);
@@ -86,7 +91,7 @@ export const RoofRenderer = ({ node: rawNode }) => {
86
91
  const ids = [];
87
92
  for (const segmentId of node.children ?? []) {
88
93
  const seg = state.nodes[segmentId];
89
- if (!seg)
94
+ if (seg?.type !== 'roof-segment')
90
95
  continue;
91
96
  if (!hasSegmentMaterialOverride(seg) && !isIndependentRoofSegment(seg))
92
97
  ids.push(segmentId);
@@ -118,6 +123,6 @@ export const RoofRenderer = ({ node: rawNode }) => {
118
123
  placeholderGeometry.dispose();
119
124
  };
120
125
  }, [placeholderGeometry]);
121
- return (_jsxs("group", { position: node.position, ref: ref, "rotation-y": node.rotation, visible: node.visible, ...handlers, children: [_jsx("mesh", { castShadow: true, geometry: placeholderGeometry, material: material, name: "merged-roof", receiveShadow: true }), _jsx("group", { name: "segments-wrapper", visible: false, children: unpaintedSegmentIds.map((childId) => (_jsx(NodeRenderer, { nodeId: childId }, childId))) }), _jsx("group", { name: "painted-segments", children: paintedSegmentIds.map((childId) => (_jsx(NodeRenderer, { nodeId: childId }, childId))) }), _jsx("group", { name: "roof-elements", children: roofElementIds.map((childId) => (_jsx(NodeRenderer, { nodeId: childId }, childId))) })] }));
126
+ return (_jsxs("group", { position: node.position, ref: ref, "rotation-y": node.rotation, visible: node.visible, ...handlers, children: [_jsx("mesh", { castShadow: true, geometry: placeholderGeometry, material: material, name: "merged-roof", receiveShadow: true }), _jsx("group", { name: "segments-wrapper", visible: false, children: unpaintedSegmentIds.map((childId) => (_jsx(NodeRenderer, { nodeId: childId }, childId))) }), _jsx("group", { name: "painted-segments", children: paintedSegmentIds.map((childId) => (_jsx(NodeRenderer, { nodeId: childId }, childId))) }), _jsx("group", { name: "roof-elements", children: roofElementIds.map((childId) => (_jsx(NodeRenderer, { nodeId: childId }, childId))) }), _jsx("group", { name: "roof-faces", children: faceIds.map((childId) => (_jsx(NodeRenderer, { nodeId: childId }, childId))) })] }));
122
127
  };
123
128
  export default RoofRenderer;
@@ -1 +1 @@
1
- {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/roof-segment/definition.edit.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAiBvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAsS/C,eAAO,MAAM,2BAA2B,EAAE,oBAAoB,CAAC,OAAO,eAAe,CAkCpF,CAAA"}
1
+ {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/roof-segment/definition.edit.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAgBvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAsS/C,eAAO,MAAM,2BAA2B,EAAE,oBAAoB,CAAC,OAAO,eAAe,CAiCpF,CAAA"}
@@ -2,7 +2,6 @@ import { getActiveRoofHeight, getPitchFromActiveRoofHeight, getRoofSegmentResize
2
2
  import { getSegmentGridStep, isGridSnapActive, isMagneticSnapActive, PANEL_MODEL_EXTENSION, } from '@pascal-app/editor';
3
3
  import { roofFloorplanAffectedIds } from '../roof/floorplan-overrides.js';
4
4
  import { bearingWallThickness, catchRoofSideOnWalls, roofCatchWalls, segmentWallLine, } from '../roof/wall-catch.js';
5
- import { buildRoofSegmentFloorplan } from './floorplan.js';
6
5
  import { roofSegmentMoveTarget, roofSegmentResizeAffordance, roofSegmentRotateAffordance, } from './floorplan-affordances.js';
7
6
  import { roofSegmentPaint } from './paint.js';
8
7
  import { roofSegmentPanelModel } from './panel-model.js';
@@ -288,7 +287,6 @@ export const roofSegmentEditContribution = {
288
287
  },
289
288
  parametrics: roofSegmentParametrics,
290
289
  handles: resolveRoofSegmentHandles,
291
- floorplan: buildRoofSegmentFloorplan,
292
290
  // Its roof draws the outline and creases from it: a live edit rebuilds that roof's plan.
293
291
  floorplanAffectedIds: roofFloorplanAffectedIds,
294
292
  // Body-move target. The generic Path 2 fallback writes plan coords
@@ -1 +1 @@
1
- {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/roof-segment/definition.render.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAGvE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAG1C,eAAO,MAAM,2BAA2B,EAAE,oBAAoB,CAAC,OAAO,eAAe,CAAC,GAAG;IACvF,IAAI,EAAE,cAAc,CAAA;CA8DrB,CAAA"}
1
+ {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/roof-segment/definition.render.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAGvE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAG1C,eAAO,MAAM,2BAA2B,EAAE,oBAAoB,CAAC,OAAO,eAAe,CAAC,GAAG;IACvF,IAAI,EAAE,cAAc,CAAA;CA+DrB,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { RoofSegmentNode as RoofSegmentNodeSchema, } from '@pascal-app/core';
2
+ import { buildRoofSegmentFloorplan } from './floorplan.js';
2
3
  import { matchRoofSegmentMeasurementFeature, roofSegmentMeasurementFeatures } from './measurement.js';
3
4
  import { RoofSegmentNode } from './schema.js';
4
5
  import { roofSegmentSlots } from './slots.js';
@@ -46,6 +47,7 @@ export const roofSegmentRenderDefinition = {
46
47
  features: (node, ctx) => roofSegmentMeasurementFeatures(node, ctx.parent?.type === 'roof' ? ctx.parent : null),
47
48
  match: (node, ctx, point, maxDistance) => matchRoofSegmentMeasurementFeature(node, ctx.parent?.type === 'roof' ? ctx.parent : null, point, maxDistance),
48
49
  },
50
+ floorplan: buildRoofSegmentFloorplan,
49
51
  presentation: {
50
52
  label: 'Roof Segment',
51
53
  description: 'A single pitched plane of a parent roof.',
@@ -1 +1 @@
1
- {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/separator/definition.edit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAIvE,eAAO,MAAM,yBAAyB,EAAE,oBAAoB,CAAC,OAAO,aAAa,CAUhF,CAAA"}
1
+ {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/separator/definition.edit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAGvE,eAAO,MAAM,yBAAyB,EAAE,oBAAoB,CAAC,OAAO,aAAa,CAShF,CAAA"}
@@ -1,9 +1,7 @@
1
- import { buildSeparatorFloorplan } from './floorplan.js';
2
1
  import { separatorMoveEndpointAffordance } from './floorplan-affordances.js';
3
2
  export const separatorEditContribution = {
4
3
  // Its pushes and end drags snap as a wall's do.
5
4
  snapProfile: 'structural',
6
- floorplan: buildSeparatorFloorplan,
7
5
  // An invisible wall moves as a wall does, taking the ones joined to it along:
8
6
  // its side arrows push it (the plan's `move-arrow`s, the 3D selection
9
7
  // handles) and its ends drag, on the plan and in 3D.
@@ -1 +1 @@
1
- {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/separator/definition.render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAEvE,eAAO,MAAM,yBAAyB,EAAE,oBAAoB,CAAC,OAAO,aAAa,CAAC,GAAG;IACnF,IAAI,EAAE,WAAW,CAAA;CA0BlB,CAAA"}
1
+ {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/separator/definition.render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAGvE,eAAO,MAAM,yBAAyB,EAAE,oBAAoB,CAAC,OAAO,aAAa,CAAC,GAAG;IACnF,IAAI,EAAE,WAAW,CAAA;CA2BlB,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { SeparatorNode } from '@pascal-app/core';
2
+ import { buildSeparatorFloorplan } from './floorplan.js';
2
3
  export const separatorRenderDefinition = {
3
4
  kind: 'separator',
4
5
  bake: 'strip',
@@ -18,6 +19,7 @@ export const separatorRenderDefinition = {
18
19
  dirtyTracking: false,
19
20
  rendersChildren: false,
20
21
  renderer: { kind: 'parametric', module: () => import('./renderer.js') },
22
+ floorplan: buildSeparatorFloorplan,
21
23
  presentation: {
22
24
  icon: { kind: 'iconify', name: 'lucide:split' },
23
25
  label: 'Separator',
@@ -1,4 +1,4 @@
1
- import { WALL_PUSH_AFFORDANCE } from '@pascal-app/editor';
1
+ import { WALL_PUSH_AFFORDANCE } from '@pascal-app/core';
2
2
  /** How far off the line (m) a selected invisible wall's side arrows sit. */
3
3
  const SIDE_ARROW_OFFSET = 0.12;
4
4
  /**
@@ -1,5 +1,5 @@
1
1
  import type { AnyNode, DoorNode, FloorplanGeometry, WallNode, WindowNode } from '@pascal-app/core';
2
- import { type FloorplanSchedule } from '@pascal-app/editor';
2
+ import { type FloorplanSchedule } from '@pascal-app/core';
3
3
  import { type ConstructionLengthProfile, type ConstructionLinearUnit } from './construction-length.js';
4
4
  type OpeningNode = DoorNode | WindowNode;
5
5
  export type OpeningConstructionType = 'framed' | 'masonry';
@@ -1 +1 @@
1
- {"version":3,"file":"opening-documentation.d.ts","sourceRoot":"","sources":["../../src/shared/opening-documentation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"opening-documentation.d.ts","sourceRoot":"","sources":["../../src/shared/opening-documentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,QAAQ,EACR,iBAAiB,EAEjB,QAAQ,EACR,UAAU,EACX,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAEL,KAAK,iBAAiB,EAQvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAE5B,MAAM,uBAAuB,CAAA;AAE9B,KAAK,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAA;AAGxC,MAAM,MAAM,uBAAuB,GAAG,QAAQ,GAAG,SAAS,CAAA;AAC1D,MAAM,MAAM,yBAAyB,GACjC,SAAS,GACT,eAAe,GACf,iBAAiB,GACjB,gBAAgB,CAAA;AAEpB,MAAM,MAAM,6BAA6B,GAAG;IAC1C,gBAAgB,EAAE,uBAAuB,CAAA;IACzC,SAAS,EAAE,yBAAyB,CAAA;IACpC,cAAc,EAAE,YAAY,GAAG,cAAc,CAAA;IAC7C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,+FAA+F;IAC/F,gBAAgB,EAAE,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACpD,CAAA;AAsBD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,yBAAyB,CAE5B;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE;IACpD,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;IACnC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,yBAAyB,CAE5B;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IACjC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,sBAAsB,CAAA;IAC5B,OAAO,CAAC,EAAE,yBAAyB,CAAA;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,GAAG,iBAAiB,GAAG,IAAI,CAwC3B;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;IACnC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,sBAAsB,CAAA;IAC5B,OAAO,CAAC,EAAE,yBAAyB,CAAA;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,GAAG,iBAAiB,GAAG,IAAI,CA8C3B;AAwBD,eAAO,MAAM,kBAAkB,QAAmB,CAAA;AAClD,eAAO,MAAM,wBAAwB,QAAqB,CAAA;AAC1D,eAAO,MAAM,qBAAqB,QAAqB,CAAA;AACvD,eAAO,MAAM,wBAAwB,QAAqB,CAAA;AAC1D,qEAAqE;AACrE,eAAO,MAAM,oBAAoB,QAAoB,CAAA;AAErD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,QAAQ,EACd,SAAS,EAAE,yBAAyB,GAAG,SAAS,EAChD,EACE,aAAkB,EAClB,MAAkB,EAClB,QAAgB,GACjB,GAAE;IACD,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iGAAiG;IACjG,QAAQ,CAAC,EAAE,OAAO,CAAA;CACd,GACL,iBAAiB,GAAG,IAAI,CA2I1B;AAED,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,WAAW,GACnB,6BAA6B,CAoB/B"}
@@ -1,5 +1,4 @@
1
- import { doorHandleStyle, getDoorOpeningSize, getOpeningFloorDatum, getWallLocalFaceZ, resolveHostedOpeningFrameDepth, wallSupportForNodes, } from '@pascal-app/core';
2
- import { resolveMarkDetail, withFloorplanGeometryMetadata, } from '@pascal-app/editor';
1
+ import { doorHandleStyle, getDoorOpeningSize, getOpeningFloorDatum, getWallLocalFaceZ, resolveHostedOpeningFrameDepth, resolveMarkDetail, wallSupportForNodes, withFloorplanGeometryMetadata, } from '@pascal-app/core';
3
2
  import { formatConstructionLength, } from './construction-length.js';
4
3
  function openingLevelData(openings, nodes, kind) {
5
4
  let drafted;
@@ -1 +1 @@
1
- {"version":3,"file":"opening-placement-dimensions.d.ts","sourceRoot":"","sources":["../../src/shared/opening-placement-dimensions.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EAQpB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAKzB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,QAAQ,GAAG,UAAU,EAC9B,GAAG,EAAE,eAAe,GACnB,iBAAiB,EAAE,CAmHrB"}
1
+ {"version":3,"file":"opening-placement-dimensions.d.ts","sourceRoot":"","sources":["../../src/shared/opening-placement-dimensions.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EASpB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAIzB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,QAAQ,GAAG,UAAU,EAC9B,GAAG,EAAE,eAAe,GACnB,iBAAiB,EAAE,CAmHrB"}
@@ -1,5 +1,4 @@
1
- import { computeOpeningGuides, getDoorOpeningSize, getWallFaceOffsets, isCurvedWall, openingHostFacing, useScene, } from '@pascal-app/core';
2
- import { readFloorplanContext } from '@pascal-app/editor';
1
+ import { computeOpeningGuides, getDoorOpeningSize, getWallFaceOffsets, isCurvedWall, openingHostFacing, readFloorplanContext, useScene, } from '@pascal-app/core';
3
2
  import { formatConstructionLength } from './construction-length.js';
4
3
  import { resolveWallOpeningCeiling } from './wall-opening-ceiling.js';
5
4
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/shelf/definition.edit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAQvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAkIzC,eAAO,MAAM,qBAAqB,EAAE,oBAAoB,CAAC,OAAO,SAAS,CAiCxE,CAAA"}
1
+ {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/shelf/definition.edit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAOvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAkIzC,eAAO,MAAM,qBAAqB,EAAE,oBAAoB,CAAC,OAAO,SAAS,CAgCxE,CAAA"}
@@ -1,6 +1,5 @@
1
1
  import { restingFloorplanAffectedIds } from '../shared/resting-surface-plan.js';
2
2
  import { sanitizeShelfDimensions } from './dimensions.js';
3
- import { buildShelfFloorplan } from './floorplan.js';
4
3
  import { shelfResizeAffordance, shelfRotateAffordance } from './floorplan-affordances.js';
5
4
  import { shelfFloorplanMoveTarget } from './floorplan-move.js';
6
5
  import { shelfPaint } from './paint.js';
@@ -127,7 +126,6 @@ export const shelfEditContribution = {
127
126
  },
128
127
  parametrics: shelfParametrics,
129
128
  handles: shelfHandles,
130
- floorplan: buildShelfFloorplan,
131
129
  floorplanAffectedIds: restingFloorplanAffectedIds,
132
130
  // 2D move handler — Path 1 in `FloorplanRegistryMoveOverlay`. Without
133
131
  // this the overlay falls through to Path 2 which stomps the SVG
@@ -1 +1 @@
1
- {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/shelf/definition.render.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAIvE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEpC,eAAO,MAAM,qBAAqB,EAAE,oBAAoB,CAAC,OAAO,SAAS,CAAC,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAsH3F,CAAA"}
1
+ {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/shelf/definition.render.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAKvE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEpC,eAAO,MAAM,qBAAqB,EAAE,oBAAoB,CAAC,OAAO,SAAS,CAAC,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAuH3F,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { shelfSlots } from '@pascal-app/core';
2
2
  import { staticBatchable } from '../shared/node-batch/batchable.js';
3
3
  import { sanitizeShelfDimensions } from './dimensions.js';
4
+ import { buildShelfFloorplan } from './floorplan.js';
4
5
  import { buildShelfGeometry, shelfRowSurfaceYs } from './geometry.js';
5
6
  import { ShelfNode } from './schema.js';
6
7
  export const shelfRenderDefinition = {
@@ -109,6 +110,7 @@ export const shelfRenderDefinition = {
109
110
  JSON.stringify(s.slots ?? null),
110
111
  ]);
111
112
  },
113
+ floorplan: buildShelfFloorplan,
112
114
  presentation: {
113
115
  label: 'Shelf',
114
116
  description: 'A configurable shelving unit. Items host on each row.',
@@ -1 +1 @@
1
- {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/skylight/definition.edit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAQvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AA2M5C,eAAO,MAAM,wBAAwB,EAAE,oBAAoB,CAAC,OAAO,YAAY,CA6B9E,CAAA"}
1
+ {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/skylight/definition.edit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAOvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AA2M5C,eAAO,MAAM,wBAAwB,EAAE,oBAAoB,CAAC,OAAO,YAAY,CA4B9E,CAAA"}
@@ -1,4 +1,3 @@
1
- import { buildSkylightFloorplan } from './floorplan.js';
2
1
  import { closeSkylightOpenState, isOperableSkylightNode, toggleSkylightOpenState, } from './interaction.js';
3
2
  import { skylightParametrics } from './parametrics.js';
4
3
  // In-world handle constants. Offsets are measured from the skylight's
@@ -192,7 +191,6 @@ export const skylightEditContribution = {
192
191
  snapProfile: 'item',
193
192
  parametrics: skylightParametrics,
194
193
  handles: skylightHandles,
195
- floorplan: buildSkylightFloorplan,
196
194
  preview: () => import('./preview.js'),
197
195
  tool: () => import('./tool.js'),
198
196
  affordanceTools: {
@@ -1 +1 @@
1
- {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/skylight/definition.render.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAEvE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAEvC,eAAO,MAAM,wBAAwB,EAAE,oBAAoB,CAAC,OAAO,YAAY,CAAC,GAAG;IACjF,IAAI,EAAE,UAAU,CAAA;CAiDjB,CAAA"}
1
+ {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/skylight/definition.render.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAGvE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAEvC,eAAO,MAAM,wBAAwB,EAAE,oBAAoB,CAAC,OAAO,YAAY,CAAC,GAAG;IACjF,IAAI,EAAE,UAAU,CAAA;CAkDjB,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { SkylightNode as SkylightNodeSchema, } from '@pascal-app/core';
2
+ import { buildSkylightFloorplan } from './floorplan.js';
2
3
  import { buildSkylightRoofCut } from './roof-cut.js';
3
4
  import { SkylightNode } from './schema.js';
4
5
  export const skylightRenderDefinition = {
@@ -37,6 +38,7 @@ export const skylightRenderDefinition = {
37
38
  module: () => import('./system.js'),
38
39
  priority: 3,
39
40
  },
41
+ floorplan: buildSkylightFloorplan,
40
42
  presentation: {
41
43
  label: 'Skylight',
42
44
  description: 'Framed glass opening on a roof segment.',
@@ -144,7 +144,7 @@ export default function SkylightPanel() {
144
144
  let hi_z = Number.NEGATIVE_INFINITY;
145
145
  for (const childId of roof.children ?? []) {
146
146
  const seg = scenestate.nodes[childId];
147
- if (!seg)
147
+ if (seg?.type !== 'roof-segment')
148
148
  continue;
149
149
  const segObj = sceneRegistry.nodes.get(seg.id);
150
150
  if (!segObj)
@@ -1 +1 @@
1
- {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/slab/definition.edit.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAmBvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AA0NxC,eAAO,MAAM,oBAAoB,EAAE,oBAAoB,CAAC,OAAO,QAAQ,CAoDtE,CAAA"}
1
+ {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/slab/definition.edit.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAkBvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AA0NxC,eAAO,MAAM,oBAAoB,EAAE,oBAAoB,CAAC,OAAO,QAAQ,CAiDtE,CAAA"}
@@ -2,7 +2,6 @@ import { MIN_SLAB_THICKNESS, markSlabChangeDependents, pointInPolygon2D, syncSta
2
2
  import { clearStructuralElevationGuide, DRAFTING_SURFACE_EXTENSION_KEY, publishStructuralElevationGuide, resolveStructuralElevationSnap, } from '@pascal-app/editor';
3
3
  import { sameOutlineSurfaceCounterparts } from '../shared/surface-counterparts.js';
4
4
  import { applySlabBaseElevationChange, applySlabThicknessChange, applySlabTopChange, getSlabBaseElevation, slabElevationUpperBound, } from './elevation-limit.js';
5
- import { buildSlabFloorplan } from './floorplan.js';
6
5
  import { slabAddVertexAffordance, slabDeleteVertexAffordance, slabMoveEdgeAffordance, slabMoveVertexAffordance, } from './floorplan-affordances.js';
7
6
  import { slabFloorplanMoveTarget } from './floorplan-move.js';
8
7
  import { slabPaint } from './paint.js';
@@ -205,9 +204,6 @@ export const slabEditContribution = {
205
204
  // The fill reads walls + sibling slabs via ctx (per-edge render offsets),
206
205
  // so committed sibling edits must invalidate the cached floor-plan entry.
207
206
  floorplanDependsOnSiblings: true,
208
- // Stage C: floor-plan rendering. Legacy `slabPolygons` short-circuits
209
- // to [] when slab is registered (see floorplan-panel.tsx).
210
- floorplan: buildSlabFloorplan,
211
207
  // 2D move handler — translates polygon by cursor delta from first
212
208
  // pointer position. The 3D `MoveSlabTool` in `affordanceTools.move`
213
209
  // skips events sourced from the 2D scene so the two paths don't
@@ -1 +1 @@
1
- {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/slab/definition.render.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAKvE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC,eAAO,MAAM,oBAAoB,EAAE,oBAAoB,CAAC,OAAO,QAAQ,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CA2FxF,CAAA"}
1
+ {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/slab/definition.render.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAMvE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC,eAAO,MAAM,oBAAoB,EAAE,oBAAoB,CAAC,OAAO,QAAQ,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CA8FxF,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { liftedManualSlab, pointInPolygon2D, slabSlots, } from '@pascal-app/core';
2
2
  import { surfaceBatchable } from '../shared/node-batch/batchable.js';
3
3
  import { polygonMeasurementFeatures } from '../shared/polygon-measurement.js';
4
+ import { buildSlabFloorplan } from './floorplan.js';
4
5
  import { buildSlabGeometry } from './geometry.js';
5
6
  import { slabQuickMeasurement } from './quick-measurement.js';
6
7
  import { SlabNode } from './schema.js';
@@ -79,6 +80,9 @@ export const slabRenderDefinition = {
79
80
  module: () => import('./system.js'),
80
81
  priority: 4,
81
82
  },
83
+ // Stage C: floor-plan rendering. Legacy `slabPolygons` short-circuits
84
+ // to [] when slab is registered (see floorplan-panel.tsx).
85
+ floorplan: buildSlabFloorplan,
82
86
  presentation: {
83
87
  label: 'Slab',
84
88
  description: 'A polygon-bounded floor surface that hosts items on top.',
@@ -1 +1 @@
1
- {"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/slab/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EAIpB,KAAK,QAAQ,EAEd,MAAM,kBAAkB,CAAA;AAGzB;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAE3D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,GAAG,iBAAiB,GAAG,IAAI,CAgGjG"}
1
+ {"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/slab/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EAKpB,KAAK,QAAQ,EAEd,MAAM,kBAAkB,CAAA;AAEzB;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAE3D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,GAAG,iBAAiB,GAAG,IAAI,CAgGjG"}
@@ -1,5 +1,4 @@
1
- import { cutterContextNodes, getRenderableSlabPolygon, hostedCutterHoles, isDerivedNode, slabPolygonContextFromGeometry, } from '@pascal-app/core';
2
- import { readFloorplanContext } from '@pascal-app/editor';
1
+ import { cutterContextNodes, getRenderableSlabPolygon, hostedCutterHoles, isDerivedNode, readFloorplanContext, slabPolygonContextFromGeometry, } from '@pascal-app/core';
3
2
  /**
4
3
  * Whether the plan offers the slab's outline and hole handles: only a slab the
5
4
  * user drew. A floor plate's outline (and its room-cut holes) follow the rooms
@@ -1 +1 @@
1
- {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/solar-panel/definition.edit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAGvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAwN9C,eAAO,MAAM,0BAA0B,EAAE,oBAAoB,CAAC,OAAO,cAAc,CAclF,CAAA"}
1
+ {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/solar-panel/definition.edit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAEvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAwN9C,eAAO,MAAM,0BAA0B,EAAE,oBAAoB,CAAC,OAAO,cAAc,CAalF,CAAA"}
@@ -1,4 +1,3 @@
1
- import { buildSolarPanelFloorplan } from './floorplan.js';
2
1
  import { solarPanelParametrics } from './parametrics.js';
3
2
  // Handle constants — same scheme as the skylight: edge-to-arrow-center
4
3
  // offsets that need to clear half the chevron's body (~13 cm at default
@@ -200,7 +199,6 @@ export const solarPanelEditContribution = {
200
199
  snapProfile: 'item',
201
200
  parametrics: solarPanelParametrics,
202
201
  handles: solarPanelHandles,
203
- floorplan: buildSolarPanelFloorplan,
204
202
  preview: () => import('./preview.js'),
205
203
  tool: () => import('./tool.js'),
206
204
  affordanceTools: {
@@ -1 +1 @@
1
- {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/solar-panel/definition.render.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAEzC,eAAO,MAAM,0BAA0B,EAAE,oBAAoB,CAAC,OAAO,cAAc,CAAC,GAAG;IACrF,IAAI,EAAE,aAAa,CAAA;CAyCpB,CAAA"}
1
+ {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/solar-panel/definition.render.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAEvE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAEzC,eAAO,MAAM,0BAA0B,EAAE,oBAAoB,CAAC,OAAO,cAAc,CAAC,GAAG;IACrF,IAAI,EAAE,aAAa,CAAA;CA0CpB,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { SolarPanelNode as SolarPanelNodeSchema } from '@pascal-app/core';
2
+ import { buildSolarPanelFloorplan } from './floorplan.js';
2
3
  import { SolarPanelNode } from './schema.js';
3
4
  export const solarPanelRenderDefinition = {
4
5
  kind: 'solar-panel',
@@ -29,6 +30,7 @@ export const solarPanelRenderDefinition = {
29
30
  kind: 'parametric',
30
31
  module: () => import('./renderer.js'),
31
32
  },
33
+ floorplan: buildSolarPanelFloorplan,
32
34
  presentation: {
33
35
  label: 'Solar Panel',
34
36
  description: 'Grid of photovoltaic panels mounted on a roof segment.',
@@ -1 +1 @@
1
- {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/spawn/definition.edit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAKvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AA8CzC,eAAO,MAAM,qBAAqB,EAAE,oBAAoB,CAAC,OAAO,SAAS,CAsBxE,CAAA"}
1
+ {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/spawn/definition.edit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAIvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AA8CzC,eAAO,MAAM,qBAAqB,EAAE,oBAAoB,CAAC,OAAO,SAAS,CAcxE,CAAA"}
@@ -1,4 +1,3 @@
1
- import { buildSpawnFloorplan } from './floorplan.js';
2
1
  import { spawnRotateAffordance } from './floorplan-affordances.js';
3
2
  import { spawnFloorplanMoveTarget } from './floorplan-move.js';
4
3
  import { spawnParametrics } from './parametrics.js';
@@ -43,14 +42,6 @@ export const spawnEditContribution = {
43
42
  snapProfile: 'item',
44
43
  parametrics: spawnParametrics,
45
44
  handles: [spawnRotateHandle(), spawnMoveHandle()],
46
- // Stage C migration: floor-plan rendering via def.floorplan.
47
- // floorplan-panel.tsx's `floorplanSpawnEntries` short-circuits to []
48
- // when `nodeRegistry.has('spawn')`, so this builder is the single
49
- // path. FloorplanRegistryLayer renders + handles click-to-select;
50
- // FloorplanRegistryActionMenu handles move / duplicate (disabled) /
51
- // delete. Legacy spawn click handlers in FloorplanNodeLayer become
52
- // dead code once Phase 6 cleanup removes the [] entries path.
53
- floorplan: buildSpawnFloorplan,
54
45
  floorplanMoveTarget: spawnFloorplanMoveTarget,
55
46
  floorplanAffordances: {
56
47
  'spawn-rotate': spawnRotateAffordance,
@@ -1 +1 @@
1
- {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/spawn/definition.render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEpC,eAAO,MAAM,qBAAqB,EAAE,oBAAoB,CAAC,OAAO,SAAS,CAAC,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CA8C3F,CAAA"}
1
+ {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/spawn/definition.render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAEvE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEpC,eAAO,MAAM,qBAAqB,EAAE,oBAAoB,CAAC,OAAO,SAAS,CAAC,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CA+C3F,CAAA"}
@@ -1,3 +1,4 @@
1
+ import { buildSpawnFloorplan } from './floorplan.js';
1
2
  import { SpawnNode } from './schema.js';
2
3
  export const spawnRenderDefinition = {
3
4
  kind: 'spawn',
@@ -35,6 +36,7 @@ export const spawnRenderDefinition = {
35
36
  kind: 'parametric',
36
37
  module: () => import('./renderer.js'),
37
38
  },
39
+ floorplan: buildSpawnFloorplan,
38
40
  presentation: {
39
41
  label: 'Spawn Point',
40
42
  description: 'Player or camera origin within a level. One per level.',
@@ -1 +1 @@
1
- {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/stair/definition.edit.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAavE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AA8XzC,eAAO,MAAM,qBAAqB,EAAE,oBAAoB,CAAC,OAAO,SAAS,CA2DxE,CAAA"}
1
+ {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/stair/definition.edit.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAYvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AA8XzC,eAAO,MAAM,qBAAqB,EAAE,oBAAoB,CAAC,OAAO,SAAS,CA8CxE,CAAA"}