@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
@@ -0,0 +1,36 @@
1
+ import { resolveDuctContinuationHandle, } from '../shared/elbow-branch-continuation.js';
2
+ import { ductPortDiameterIn } from './profile.js';
3
+ export function ductEndpointPort(duct, endpoint) {
4
+ if (duct.path.length < 2)
5
+ return null;
6
+ const index = endpoint === 'start' ? 0 : duct.path.length - 1;
7
+ const neighborIndex = endpoint === 'start' ? 1 : duct.path.length - 2;
8
+ const position = duct.path[index];
9
+ const neighbor = duct.path[neighborIndex];
10
+ const dx = position[0] - neighbor[0];
11
+ const dy = position[1] - neighbor[1];
12
+ const dz = position[2] - neighbor[2];
13
+ const length = Math.hypot(dx, dy, dz);
14
+ return {
15
+ id: endpoint,
16
+ nodeId: duct.id,
17
+ position,
18
+ direction: length < 1e-9 ? [1, 0, 0] : [dx / length, dy / length, dz / length],
19
+ diameter: ductPortDiameterIn(duct),
20
+ system: duct.system,
21
+ };
22
+ }
23
+ export function ductContinuationHandlePoint(duct, endpoint, gap = 0.28) {
24
+ const port = ductEndpointPort(duct, endpoint);
25
+ if (!port)
26
+ return null;
27
+ return [
28
+ port.position[0] + port.direction[0] * gap,
29
+ port.position[1] + port.direction[1] * gap,
30
+ port.position[2] + port.direction[2] * gap,
31
+ ];
32
+ }
33
+ export function ductContinuationHandlePlan(duct, endpoint, nodes, gap = 0.28) {
34
+ const port = ductEndpointPort(duct, endpoint);
35
+ return port ? resolveDuctContinuationHandle(port, nodes, gap) : null;
36
+ }
@@ -1,16 +1,12 @@
1
1
  import { type AnyNode, type AnyNodeId, type DuctFittingNode, DuctSegmentNode, type FloorplanAffordance, type NodePort } from '@pascal-app/core';
2
2
  import type { RunBodyHit, ScenePort } from '@pascal-app/editor/distribution';
3
- import { type RunContinuationHandlePlan } from '../shared/elbow-branch-continuation.js';
4
- export type DuctEndpoint = 'start' | 'end';
3
+ import { type DuctEndpoint } from './continuation-handle.js';
5
4
  export type DuctContinuationSeed = {
6
5
  duct: DuctSegmentNode;
7
6
  port: ScenePort | null;
8
7
  body: RunBodyHit | null;
9
8
  promotedFitting?: DuctFittingNode;
10
9
  };
11
- export declare function ductEndpointPort(duct: DuctSegmentNode, endpoint: DuctEndpoint): ScenePort | null;
12
- export declare function ductContinuationHandlePoint(duct: DuctSegmentNode, endpoint: DuctEndpoint, gap?: number): [number, number, number] | null;
13
- export declare function ductContinuationHandlePlan(duct: DuctSegmentNode, endpoint: DuctEndpoint, nodes: Readonly<Record<string, AnyNode>>, gap?: number): RunContinuationHandlePlan | null;
14
10
  export declare function resolveDuctContinuationSeed(defaults: unknown, nodes: Record<string, AnyNode>): DuctContinuationSeed | null;
15
11
  export declare function activateDuctBranch(duct: DuctSegmentNode, segmentIndex: number, point: [number, number, number]): void;
16
12
  export declare function activateDuctContinuation(duct: DuctSegmentNode, endpoint: DuctEndpoint, fittingId?: AnyNodeId): void;
@@ -1 +1 @@
1
- {"version":3,"file":"continuation.d.ts","sourceRoot":"","sources":["../../src/duct-segment/continuation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,eAAe,EACf,KAAK,mBAAmB,EACxB,KAAK,QAAQ,EAGd,MAAM,kBAAkB,CAAA;AAEzB,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAE5E,OAAO,EAIL,KAAK,yBAAyB,EAE/B,MAAM,qCAAqC,CAAA;AAG5C,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,KAAK,CAAA;AAE1C,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,eAAe,CAAA;IACrB,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;IACtB,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;IACvB,eAAe,CAAC,EAAE,eAAe,CAAA;CAClC,CAAA;AAaD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CAkBhG;AAED,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,YAAY,EACtB,GAAG,SAAO,GACT,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAQjC;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACxC,GAAG,SAAO,GACT,yBAAyB,GAAG,IAAI,CAGlC;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,OAAO,EACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,oBAAoB,GAAG,IAAI,CA2E7B;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,eAAe,EACrB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAC9B,IAAI,CAsBN;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,YAAY,EACtB,SAAS,CAAC,EAAE,SAAS,GACpB,IAAI,CAoBN;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAmBlF;AAED,eAAO,MAAM,0BAA0B,EAAE,mBAAmB,CAAC,eAAe,CAiB3E,CAAA;AAED,eAAO,MAAM,oBAAoB,EAAE,mBAAmB,CAAC,eAAe,CAiBrE,CAAA;AAED,wBAAgB,2BAA2B,IAAI,oBAAoB,GAAG,IAAI,CAKzE"}
1
+ {"version":3,"file":"continuation.d.ts","sourceRoot":"","sources":["../../src/duct-segment/continuation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,eAAe,EACf,KAAK,mBAAmB,EACxB,KAAK,QAAQ,EAGd,MAAM,kBAAkB,CAAA;AAEzB,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAO5E,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,uBAAuB,CAAA;AAE3E,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,eAAe,CAAA;IACrB,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;IACtB,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;IACvB,eAAe,CAAC,EAAE,eAAe,CAAA;CAClC,CAAA;AAaD,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,OAAO,EACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,oBAAoB,GAAG,IAAI,CA2E7B;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,eAAe,EACrB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAC9B,IAAI,CAsBN;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,YAAY,EACtB,SAAS,CAAC,EAAE,SAAS,GACpB,IAAI,CAoBN;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAmBlF;AAED,eAAO,MAAM,0BAA0B,EAAE,mBAAmB,CAAC,eAAe,CAiB3E,CAAA;AAED,eAAO,MAAM,oBAAoB,EAAE,mBAAmB,CAAC,eAAe,CAiBrE,CAAA;AAED,wBAAgB,2BAA2B,IAAI,oBAAoB,GAAG,IAAI,CAKzE"}
@@ -1,42 +1,8 @@
1
1
  import { DuctSegmentNode, nodeRegistry, useScene, } from '@pascal-app/core';
2
2
  import { useEditor } from '@pascal-app/editor';
3
3
  import { useViewer } from '@pascal-app/viewer';
4
- import { findMatedScenePorts, planDuctElbowBranchPromotion, planDuctTeeCrossPromotion, resolveDuctContinuationHandle, } from '../shared/elbow-branch-continuation.js';
5
- import { ductPortDiameterIn } from './profile.js';
6
- export function ductEndpointPort(duct, endpoint) {
7
- if (duct.path.length < 2)
8
- return null;
9
- const index = endpoint === 'start' ? 0 : duct.path.length - 1;
10
- const neighborIndex = endpoint === 'start' ? 1 : duct.path.length - 2;
11
- const position = duct.path[index];
12
- const neighbor = duct.path[neighborIndex];
13
- const dx = position[0] - neighbor[0];
14
- const dy = position[1] - neighbor[1];
15
- const dz = position[2] - neighbor[2];
16
- const length = Math.hypot(dx, dy, dz);
17
- return {
18
- id: endpoint,
19
- nodeId: duct.id,
20
- position,
21
- direction: length < 1e-9 ? [1, 0, 0] : [dx / length, dy / length, dz / length],
22
- diameter: ductPortDiameterIn(duct),
23
- system: duct.system,
24
- };
25
- }
26
- export function ductContinuationHandlePoint(duct, endpoint, gap = 0.28) {
27
- const port = ductEndpointPort(duct, endpoint);
28
- if (!port)
29
- return null;
30
- return [
31
- port.position[0] + port.direction[0] * gap,
32
- port.position[1] + port.direction[1] * gap,
33
- port.position[2] + port.direction[2] * gap,
34
- ];
35
- }
36
- export function ductContinuationHandlePlan(duct, endpoint, nodes, gap = 0.28) {
37
- const port = ductEndpointPort(duct, endpoint);
38
- return port ? resolveDuctContinuationHandle(port, nodes, gap) : null;
39
- }
4
+ import { findMatedScenePorts, planDuctElbowBranchPromotion, planDuctTeeCrossPromotion, } from '../shared/elbow-branch-continuation.js';
5
+ import { ductEndpointPort } from './continuation-handle.js';
40
6
  export function resolveDuctContinuationSeed(defaults, nodes) {
41
7
  const continuation = defaults?.continuation;
42
8
  if (typeof continuation?.portId === 'string' && typeof continuation.nodeId === 'string') {
@@ -1 +1 @@
1
- {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/duct-segment/definition.edit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AASvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAoC/C,eAAO,MAAM,2BAA2B,EAAE,oBAAoB,CAAC,OAAO,eAAe,CA0DpF,CAAA"}
1
+ {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/duct-segment/definition.edit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAQvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAoC/C,eAAO,MAAM,2BAA2B,EAAE,oBAAoB,CAAC,OAAO,eAAe,CAyDpF,CAAA"}
@@ -5,7 +5,6 @@ import { createSegmentMoveAffordance } from '../shared/path-segment-affordance.j
5
5
  import { createRunHangerToolHint } from '../shared/run-hanger-mode.js';
6
6
  import { ductRunToolOptions } from '../shared/run-tool-options.js';
7
7
  import { ductBranchAffordance, ductContinuationAffordance } from './continuation.js';
8
- import { buildDuctSegmentFloorplan } from './floorplan.js';
9
8
  import { ductSegmentParametrics } from './parametrics.js';
10
9
  /**
11
10
  * Phase 1 of the HVAC node system — round duct segment as a polyline.
@@ -63,7 +62,6 @@ export const ductSegmentEditContribution = {
63
62
  },
64
63
  },
65
64
  floorplanDependsOnSiblings: true,
66
- floorplan: buildDuctSegmentFloorplan,
67
65
  // 2D selection-time path-point handles — the floor-plan twin of the 3D
68
66
  // `affordanceTools.selection` handles. The builder emits an
69
67
  // `endpoint-handle` per path vertex; this drags the matching point.
@@ -1 +1 @@
1
- {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/duct-segment/definition.render.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAGvE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE1C,eAAO,MAAM,2BAA2B,EAAE,oBAAoB,CAAC,OAAO,eAAe,CAAC,GAAG;IACvF,IAAI,EAAE,cAAc,CAAA;CAwFrB,CAAA"}
1
+ {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/duct-segment/definition.render.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAIvE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE1C,eAAO,MAAM,2BAA2B,EAAE,oBAAoB,CAAC,OAAO,eAAe,CAAC,GAAG;IACvF,IAAI,EAAE,cAAc,CAAA;CAyFrB,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { ductBodySlots } from '@pascal-app/core';
2
+ import { buildDuctSegmentFloorplan } from './floorplan.js';
2
3
  import { buildDuctSegmentGeometry } from './geometry.js';
3
4
  import { ductPortDiameterIn } from './profile.js';
4
5
  import { DuctSegmentNode } from './schema.js';
@@ -76,6 +77,7 @@ export const ductSegmentRenderDefinition = {
76
77
  },
77
78
  ];
78
79
  },
80
+ floorplan: buildDuctSegmentFloorplan,
79
81
  presentation: {
80
82
  label: 'Duct',
81
83
  description: 'HVAC duct run — polyline of round, rect, or flat-oval sections.',
@@ -1,5 +1,5 @@
1
1
  import { runHangerFloorplan } from '../shared/run-hangers.js';
2
- import { ductContinuationHandlePlan, ductEndpointPort } from './continuation.js';
2
+ import { ductContinuationHandlePlan, ductEndpointPort } from './continuation-handle.js';
3
3
  import { INCHES_TO_METERS } from './profile.js';
4
4
  const SUPPLY_CENTERLINE = '#d4825a';
5
5
  const RETURN_CENTERLINE = '#5a8ad4';
@@ -1 +1 @@
1
- {"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/duct-segment/selection.tsx"],"names":[],"mappings":"AAqJA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,QAAA,MAAM,8BAA8B,0CAuCnC,CAAA;eA4gDc,8BAA8B"}
1
+ {"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/duct-segment/selection.tsx"],"names":[],"mappings":"AAkJA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,QAAA,MAAM,8BAA8B,0CAuCnC,CAAA;eA4gDc,8BAA8B"}
@@ -18,7 +18,8 @@ import { planRunTranslationOffsets } from '../shared/run-translation-offset.js';
18
18
  import { ContinuePlusHandle, HandleCube, MoveChevron, RotateArc } from '../shared/selection-handles.js';
19
19
  import { planVerticalOffsets } from '../shared/vertical-offset.js';
20
20
  import { refreshWallRunAttachment } from '../shared/wall-run-move.js';
21
- import { activateDuctContinuation, ductContinuationHandlePlan, } from './continuation.js';
21
+ import { activateDuctContinuation } from './continuation.js';
22
+ import { ductContinuationHandlePlan } from './continuation-handle.js';
22
23
  import { INCHES_TO_METERS } from './profile.js';
23
24
  /** Port-snap radius for dragged run endpoints (meters, XZ). */
24
25
  const PORT_SNAP_RADIUS_M = 0.4;
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/duct-segment/tool.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,eAAe,EAAE,eAAe,EAAgB,MAAM,kBAAkB,CAAA;AAQpG,OAAO,EAOL,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,SAAS,EAGf,MAAM,iCAAiC,CAAA;AAgKxC,qEAAqE;AACrE,KAAK,YAAY,GAAG;IAClB,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,UAAQ,GAAG,MAAM,CAUjF;AAgDD;;;;;6BAK6B;AAC7B,KAAK,YAAY,GAAG;IAClB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,KAAK,EAAE,eAAe,EAAE,CAAA;IACxB,KAAK,EAAE,eAAe,EAAE,CAAA;IACxB,OAAO,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,EAAE,CAAA;IACxD,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAA;CACxB,CAAA;AA4CD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAC/B,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAC7B,SAAS,EAAE,SAAS,GAAG,IAAI,EAC3B,SAAS,EAAE,UAAU,GAAG,IAAI,EAC5B,OAAO,EAAE,SAAS,GAAG,IAAI,EACzB,OAAO,EAAE,UAAU,GAAG,IAAI,EAC1B,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACxC,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,EACjC,WAAW,UAAQ,EACnB,YAAY,GAAE,OAAO,CAAC,eAAe,CAAM,EAC3C,WAAW,GAAE,QAAQ,GAAG,QAAmB,GAC1C,YAAY,GAAG,IAAI,CAsNrB;AAED,QAAA,MAAM,eAAe,0CA6VpB,CAAA;eAEc,eAAe"}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/duct-segment/tool.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,eAAe,EAAE,eAAe,EAAgB,MAAM,kBAAkB,CAAA;AAQpG,OAAO,EAOL,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,SAAS,EAGf,MAAM,iCAAiC,CAAA;AAiKxC,qEAAqE;AACrE,KAAK,YAAY,GAAG;IAClB,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,UAAQ,GAAG,MAAM,CAUjF;AAgDD;;;;;6BAK6B;AAC7B,KAAK,YAAY,GAAG;IAClB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,KAAK,EAAE,eAAe,EAAE,CAAA;IACxB,KAAK,EAAE,eAAe,EAAE,CAAA;IACxB,OAAO,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,EAAE,CAAA;IACxD,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAA;CACxB,CAAA;AA4CD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAC/B,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAC7B,SAAS,EAAE,SAAS,GAAG,IAAI,EAC3B,SAAS,EAAE,UAAU,GAAG,IAAI,EAC5B,OAAO,EAAE,SAAS,GAAG,IAAI,EACzB,OAAO,EAAE,UAAU,GAAG,IAAI,EAC1B,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACxC,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,EACjC,WAAW,UAAQ,EACnB,YAAY,GAAE,OAAO,CAAC,eAAe,CAAM,EAC3C,WAAW,GAAE,QAAQ,GAAG,QAAmB,GAC1C,YAAY,GAAG,IAAI,CAsNrB;AAED,QAAA,MAAM,eAAe,0CA6VpB,CAAA;eAEc,eAAe"}
@@ -17,7 +17,8 @@ import { DUCT_PORT_SYSTEMS, runSectionHalfSizeM } from '../shared/port-systems.j
17
17
  import { RunHangerPreview } from '../shared/run-hanger-controls.js';
18
18
  import { useRunHangerMode } from '../shared/run-hanger-mode.js';
19
19
  import { clearRunContinuation, updateRunDefaults } from '../shared/run-tool-options.js';
20
- import { currentDuctContinuationSeed, ductEndpointPort } from './continuation.js';
20
+ import { currentDuctContinuationSeed } from './continuation.js';
21
+ import { ductEndpointPort } from './continuation-handle.js';
21
22
  import { ductSegmentDefinition } from './definition.js';
22
23
  import { rectSectionAxes, rollToContinueAcrossElbow } from './profile.js';
23
24
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/duct-terminal/definition.edit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAGvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAEhD,eAAO,MAAM,4BAA4B,EAAE,oBAAoB,CAAC,OAAO,gBAAgB,CAWtF,CAAA"}
1
+ {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/duct-terminal/definition.edit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAEvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAEhD,eAAO,MAAM,4BAA4B,EAAE,oBAAoB,CAAC,OAAO,gBAAgB,CAUtF,CAAA"}
@@ -1,9 +1,7 @@
1
- import { buildDuctTerminalFloorplan } from './floorplan.js';
2
1
  import { ductTerminalParametrics } from './parametrics.js';
3
2
  export const ductTerminalEditContribution = {
4
3
  snapProfile: 'item',
5
4
  parametrics: ductTerminalParametrics,
6
- floorplan: buildDuctTerminalFloorplan,
7
5
  tool: () => import('./tool.js'),
8
6
  toolHints: [
9
7
  { key: 'Click', label: 'Place register' },
@@ -1 +1 @@
1
- {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/duct-terminal/definition.render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAGvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAE3C,eAAO,MAAM,4BAA4B,EAAE,oBAAoB,CAAC,OAAO,gBAAgB,CAAC,GAAG;IACzF,IAAI,EAAE,eAAe,CAAA;CAkEtB,CAAA"}
1
+ {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/duct-terminal/definition.render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAIvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAE3C,eAAO,MAAM,4BAA4B,EAAE,oBAAoB,CAAC,OAAO,gBAAgB,CAAC,GAAG;IACzF,IAAI,EAAE,eAAe,CAAA;CAmEtB,CAAA"}
@@ -1,3 +1,4 @@
1
+ import { buildDuctTerminalFloorplan } from './floorplan.js';
1
2
  import { buildDuctTerminalGeometry } from './geometry.js';
2
3
  import { getDuctTerminalPorts } from './ports.js';
3
4
  import { DuctTerminalNode } from './schema.js';
@@ -53,6 +54,7 @@ export const ductTerminalRenderDefinition = {
53
54
  n.collarHeight,
54
55
  ]),
55
56
  ports: getDuctTerminalPorts,
57
+ floorplan: buildDuctTerminalFloorplan,
56
58
  presentation: {
57
59
  label: 'Register',
58
60
  description: 'Duct terminal — supply register, ceiling diffuser, or return grille. Duct runs end at its collar.',
@@ -1 +1 @@
1
- {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/elevator/definition.edit.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAMvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAsJ5C,eAAO,MAAM,wBAAwB,EAAE,oBAAoB,CAAC,OAAO,YAAY,CAqC9E,CAAA"}
1
+ {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/elevator/definition.edit.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAKvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAsJ5C,eAAO,MAAM,wBAAwB,EAAE,oBAAoB,CAAC,OAAO,YAAY,CA4B9E,CAAA"}
@@ -1,6 +1,5 @@
1
1
  import { ELEVATOR_MIN_CAB_DIMENSION, ELEVATOR_MIN_CAB_HEIGHT, getElevatorCabDepth, getElevatorCabWidth, getElevatorShaftDepth, getElevatorShaftWallThickness, getElevatorShaftWidth, normalizeElevatorDimensions, resolveElevatorDimensions, resolveElevatorLevels, } from '@pascal-app/core';
2
2
  import { elevatorOuterHalfExtents } from './definition.render.js';
3
- import { buildElevatorFloorplan } from './floorplan.js';
4
3
  import { elevatorResizeAffordance, elevatorRotateAffordance } from './floorplan-affordances.js';
5
4
  import { elevatorPaint } from './paint.js';
6
5
  import { elevatorParametrics } from './parametrics.js';
@@ -158,15 +157,6 @@ export const elevatorEditContribution = {
158
157
  },
159
158
  parametrics: elevatorParametrics,
160
159
  handles: elevatorHandles,
161
- floorplan: buildElevatorFloorplan,
162
- // Elevators are parented to the building (siblings of levels), so the
163
- // floor-plan layer's level-rooted DFS never reaches them. Declaring
164
- // `floorplanScope: 'building'` tells `FloorplanRegistryLayer` to walk
165
- // building-scoped kinds separately and synthesise `ctx.parent` as the
166
- // active level — that's what `buildElevatorFloorplan` reads via
167
- // `ctx.parent?.id` to decide whether this floor is in the elevator's
168
- // service range.
169
- floorplanScope: 'building',
170
160
  // 2D drag affordance for the rotate-arrow emitted at the elevator's
171
161
  // front-right corner. Body move uses the generic move-arrow / move-
172
162
  // handle path emitted by the floor-plan builder.
@@ -1 +1 @@
1
- {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/elevator/definition.render.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,IAAI,gBAAgB,EAUtC,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAEvC,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,gBAAgB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAQ9F;AAED,eAAO,MAAM,wBAAwB,EAAE,oBAAoB,CAAC,OAAO,YAAY,CAAC,GAAG;IACjF,IAAI,EAAE,UAAU,CAAA;CAqFjB,CAAA"}
1
+ {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/elevator/definition.render.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,IAAI,gBAAgB,EAUtC,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAEvE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAEvC,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,gBAAgB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAQ9F;AAED,eAAO,MAAM,wBAAwB,EAAE,oBAAoB,CAAC,OAAO,YAAY,CAAC,GAAG;IACjF,IAAI,EAAE,UAAU,CAAA;CA8FjB,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { ElevatorNode as ElevatorNodeSchema, elevatorSlots, getElevatorCabDepth, getElevatorCabWidth, getElevatorShaftDepth, getElevatorShaftWallThickness, getElevatorShaftWidth, resolveElevatorDimensions, resolveElevatorLevels, resolveElevatorNodeSupportY, } from '@pascal-app/core';
2
+ import { buildElevatorFloorplan } from './floorplan.js';
2
3
  import { ElevatorNode } from './schema.js';
3
4
  export function elevatorOuterHalfExtents(n) {
4
5
  const cabWidth = getElevatorCabWidth(n);
@@ -83,6 +84,15 @@ export const elevatorRenderDefinition = {
83
84
  module: () => import('./system.js'),
84
85
  priority: 3,
85
86
  },
87
+ floorplan: buildElevatorFloorplan,
88
+ // Elevators are parented to the building (siblings of levels), so the
89
+ // floor-plan layer's level-rooted DFS never reaches them. Declaring
90
+ // `floorplanScope: 'building'` tells `FloorplanRegistryLayer` to walk
91
+ // building-scoped kinds separately and synthesise `ctx.parent` as the
92
+ // active level — that's what `buildElevatorFloorplan` reads via
93
+ // `ctx.parent?.id` to decide whether this floor is in the elevator's
94
+ // service range.
95
+ floorplanScope: 'building',
86
96
  presentation: {
87
97
  label: 'Elevator',
88
98
  description: 'A multi-level elevator shaft with configurable openings per level.',
@@ -1 +1 @@
1
- {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/eyebrow-vent/definition.edit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAIvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAoG/C,eAAO,MAAM,2BAA2B,EAAE,oBAAoB,CAAC,OAAO,eAAe,CAiBpF,CAAA"}
1
+ {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/eyebrow-vent/definition.edit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAGvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAoG/C,eAAO,MAAM,2BAA2B,EAAE,oBAAoB,CAAC,OAAO,eAAe,CAgBpF,CAAA"}
@@ -1,4 +1,3 @@
1
- import { buildEyebrowVentFloorplan } from './floorplan.js';
2
1
  import { eyebrowVentPaint } from './paint.js';
3
2
  import { eyebrowVentParametrics } from './parametrics.js';
4
3
  const SIDE_HANDLE_OFFSET = 0.3;
@@ -93,7 +92,6 @@ export const eyebrowVentEditContribution = {
93
92
  },
94
93
  parametrics: eyebrowVentParametrics,
95
94
  handles: eyebrowVentHandles,
96
- floorplan: buildEyebrowVentFloorplan,
97
95
  preview: () => import('./preview.js'),
98
96
  tool: () => import('./tool.js'),
99
97
  affordanceTools: {
@@ -1 +1 @@
1
- {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/eyebrow-vent/definition.render.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE1C,eAAO,MAAM,2BAA2B,EAAE,oBAAoB,CAAC,OAAO,eAAe,CAAC,GAAG;IACvF,IAAI,EAAE,cAAc,CAAA;CA0CrB,CAAA"}
1
+ {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/eyebrow-vent/definition.render.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAEvE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE1C,eAAO,MAAM,2BAA2B,EAAE,oBAAoB,CAAC,OAAO,eAAe,CAAC,GAAG;IACvF,IAAI,EAAE,cAAc,CAAA;CA2CrB,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { EyebrowVentNode as EyebrowVentNodeSchema, eyebrowVentSlots } from '@pascal-app/core';
2
+ import { buildEyebrowVentFloorplan } from './floorplan.js';
2
3
  import { EyebrowVentNode } from './schema.js';
3
4
  export const eyebrowVentRenderDefinition = {
4
5
  kind: 'eyebrow-vent',
@@ -30,6 +31,7 @@ export const eyebrowVentRenderDefinition = {
30
31
  kind: 'parametric',
31
32
  module: () => import('./renderer.js'),
32
33
  },
34
+ floorplan: buildEyebrowVentFloorplan,
33
35
  presentation: {
34
36
  label: 'Eyebrow Vent',
35
37
  description: 'Low curved lens-shaped roof vent with a louvered front.',
@@ -1 +1 @@
1
- {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/fence/definition.edit.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAevE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAwPzC,eAAO,MAAM,qBAAqB,EAAE,oBAAoB,CAAC,OAAO,SAAS,CA2DxE,CAAA"}
1
+ {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/fence/definition.edit.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAcvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAwPzC,eAAO,MAAM,qBAAqB,EAAE,oBAAoB,CAAC,OAAO,SAAS,CAsDxE,CAAA"}
@@ -2,7 +2,6 @@ import { getFenceControlHandle, getFenceSpanMode, isSplineFence, } from '@pascal
2
2
  import { clearStructuralElevationGuide, PANEL_MODEL_EXTENSION, publishStructuralElevationGuide, REGISTERED_DRAFT_SNAP_EXTENSION, resolveStructuralElevationSnap, } from '@pascal-app/editor';
3
3
  import { fenceBaseElevation } from './definition.render.js';
4
4
  import { snapFenceDraftPoint } from './drafting.js';
5
- import { buildFenceFloorplan } from './floorplan.js';
6
5
  import { fenceControlPointAffordance, fenceCurveAffordance, fenceMoveEndpointAffordance, fenceTangentAffordance, fenceThicknessAffordance, } from './floorplan-affordances.js';
7
6
  import { fenceFloorplanMoveTarget } from './floorplan-move.js';
8
7
  import { fencePaint } from './paint.js';
@@ -238,11 +237,6 @@ export const fenceEditContribution = {
238
237
  // tools[phase][tool] map when missing.
239
238
  tool: () => import('./tool.js'),
240
239
  floorplanDependencies: (node) => (node.children ?? []),
241
- // Stage C: floor-plan rendering. FloorplanRegistryLayer iterates kinds
242
- // with `floorplan` set and renders via FloorplanGeometryRenderer.
243
- // Legacy `floorplanFenceEntries` short-circuits to [] when fence is
244
- // registered (see floorplan-panel.tsx).
245
- floorplan: buildFenceFloorplan,
246
240
  // 2D drag affordances — sister to `actions/move-endpoint.ts`. The 3D
247
241
  // DragAction drives R3F grid events through `createDragSession`; these
248
242
  // drive SVG pointer events through the floor-plan registry
@@ -1 +1 @@
1
- {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/fence/definition.render.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,IAAI,aAAa,EAK/B,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AAMzB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAGvE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEpC,wBAAgB,kBAAkB,CAChC,CAAC,EAAE,aAAa,EAChB,QAAQ,CAAC,EAAE,QAAQ,EACnB,KAAK,GAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAW,GACzC,MAAM,CA+BR;AAED,eAAO,MAAM,qBAAqB,EAAE,oBAAoB,CAAC,OAAO,SAAS,CAAC,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAgG3F,CAAA"}
1
+ {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/fence/definition.render.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,IAAI,aAAa,EAK/B,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AAMzB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAIvE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEpC,wBAAgB,kBAAkB,CAChC,CAAC,EAAE,aAAa,EAChB,QAAQ,CAAC,EAAE,QAAQ,EACnB,KAAK,GAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAW,GACzC,MAAM,CA+BR;AAED,eAAO,MAAM,qBAAqB,EAAE,oBAAoB,CAAC,OAAO,SAAS,CAAC,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAiG3F,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { fenceSlots, findLevelAncestorId, floorConstructionLift, levelBaseElevationAt, } from '@pascal-app/core';
2
2
  import { createNodeTopSurfaceHeightSampler, createSceneSupportHeightSampler, } from '@pascal-app/viewer';
3
+ import { buildFenceFloorplan } from './floorplan.js';
3
4
  import { buildFenceGeometry } from './geometry.js';
4
5
  import { resolveFenceLiftElevation, resolveFenceLiftElevationForNodes } from './lift.js';
5
6
  import { FenceNode } from './schema.js';
@@ -111,6 +112,7 @@ export const fenceRenderDefinition = {
111
112
  module: () => import('./system.js'),
112
113
  priority: 4,
113
114
  },
115
+ floorplan: buildFenceFloorplan,
114
116
  presentation: {
115
117
  label: 'Fence',
116
118
  description: 'A straight or curved fence segment with configurable posts and infill.',
@@ -1 +1 @@
1
- {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/fence-feature/definition.edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EAItB,MAAM,kBAAkB,CAAA;AAKzB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAgCvE,eAAO,MAAM,yBAAyB,EAAE,oBAAoB,CAC1D,OAAO,aAAa,GAAG,OAAO,gBAAgB,CA2B/C,CAAA;AAED,eAAO,MAAM,4BAA4B,EAAE,oBAAoB,CAC7D,OAAO,aAAa,GAAG,OAAO,gBAAgB,CAgB/C,CAAA"}
1
+ {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/fence-feature/definition.edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EAItB,MAAM,kBAAkB,CAAA;AAKzB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AA+BvE,eAAO,MAAM,yBAAyB,EAAE,oBAAoB,CAC1D,OAAO,aAAa,GAAG,OAAO,gBAAgB,CA0B/C,CAAA;AAED,eAAO,MAAM,4BAA4B,EAAE,oBAAoB,CAC7D,OAAO,aAAa,GAAG,OAAO,gBAAgB,CAe/C,CAAA"}
@@ -1,6 +1,5 @@
1
1
  import { findLevelAncestorId, } from '@pascal-app/core';
2
2
  import { useViewer } from '@pascal-app/viewer';
3
- import { buildFenceFeatureFloorplan } from './floorplan.js';
4
3
  import { fenceFeatureAffordance } from './floorplan-affordances.js';
5
4
  import { fenceFeatureHandles } from './handles.js';
6
5
  import { FenceFeatureEditor } from './inspector.js';
@@ -27,7 +26,6 @@ const parametrics = {
27
26
  ],
28
27
  };
29
28
  export const fenceGateEditContribution = {
30
- floorplan: buildFenceFeatureFloorplan,
31
29
  floorplanDependencies: (node) => node.parentId ? [node.parentId] : [],
32
30
  floorplanAffordances: { 'move-feature': fenceFeatureAffordance },
33
31
  handles: fenceFeatureHandles,
@@ -53,7 +51,6 @@ export const fenceGateEditContribution = {
53
51
  },
54
52
  };
55
53
  export const fenceOpeningEditContribution = {
56
- floorplan: buildFenceFeatureFloorplan,
57
54
  floorplanDependencies: (node) => node.parentId ? [node.parentId] : [],
58
55
  floorplanAffordances: { 'move-feature': fenceFeatureAffordance },
59
56
  handles: fenceFeatureHandles,
@@ -1 +1 @@
1
- {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/fence-feature/definition.render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAGlE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AA2BvE,eAAO,MAAM,yBAAyB,EAAE,oBAAoB,CAC1D,OAAO,aAAa,GAAG,OAAO,gBAAgB,CAC/C,GAAG;IAAE,IAAI,EAAE,YAAY,CAAA;CAwBvB,CAAA;AAED,eAAO,MAAM,4BAA4B,EAAE,oBAAoB,CAC7D,OAAO,aAAa,GAAG,OAAO,gBAAgB,CAC/C,GAAG;IAAE,IAAI,EAAE,eAAe,CAAA;CAsB1B,CAAA"}
1
+ {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/fence-feature/definition.render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAGlE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AA4BvE,eAAO,MAAM,yBAAyB,EAAE,oBAAoB,CAC1D,OAAO,aAAa,GAAG,OAAO,gBAAgB,CAC/C,GAAG;IAAE,IAAI,EAAE,YAAY,CAAA;CAyBvB,CAAA;AAED,eAAO,MAAM,4BAA4B,EAAE,oBAAoB,CAC7D,OAAO,aAAa,GAAG,OAAO,gBAAgB,CAC/C,GAAG;IAAE,IAAI,EAAE,eAAe,CAAA;CAuB1B,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { FenceGateNode, FenceOpeningNode } from '@pascal-app/core';
2
2
  import { AnimationClip, QuaternionKeyframeTrack } from 'three';
3
+ import { buildFenceFeatureFloorplan } from './floorplan.js';
3
4
  import { buildFenceFeatureGeometry } from './geometry.js';
4
5
  function bakeFenceGateClip(id, object) {
5
6
  const tracks = [];
@@ -36,6 +37,7 @@ export const fenceGateRenderDefinition = {
36
37
  const { id, type, ...rest } = FenceGateNode.parse({});
37
38
  return rest;
38
39
  },
40
+ floorplan: buildFenceFeatureFloorplan,
39
41
  presentation: {
40
42
  label: 'Gate',
41
43
  description: 'A gate hosted by a fence.',
@@ -59,6 +61,7 @@ export const fenceOpeningRenderDefinition = {
59
61
  const { id, type, ...rest } = FenceOpeningNode.parse({});
60
62
  return rest;
61
63
  },
64
+ floorplan: buildFenceFeatureFloorplan,
62
65
  presentation: {
63
66
  label: 'Open Passage',
64
67
  description: 'An intentional opening in a fence.',
@@ -1 +1 @@
1
- {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/floor-opening/definition.edit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AASvE,eAAO,MAAM,4BAA4B,EAAE,oBAAoB,CAAC,OAAO,gBAAgB,CAStF,CAAA"}
1
+ {"version":3,"file":"definition.edit.d.ts","sourceRoot":"","sources":["../../src/floor-opening/definition.edit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAQvE,eAAO,MAAM,4BAA4B,EAAE,oBAAoB,CAAC,OAAO,gBAAgB,CAOtF,CAAA"}
@@ -1,7 +1,5 @@
1
- import { buildFloorOpeningFloorplan, floorOpeningAddVertexAffordance, floorOpeningDeleteVertexAffordance, floorOpeningMoveEdgeAffordance, floorOpeningMoveVertexAffordance, } from './floorplan.js';
1
+ import { floorOpeningAddVertexAffordance, floorOpeningDeleteVertexAffordance, floorOpeningMoveEdgeAffordance, floorOpeningMoveVertexAffordance, } from './floorplan-affordances.js';
2
2
  export const floorOpeningEditContribution = {
3
- // The void on the plan, and its corners while selected.
4
- floorplan: buildFloorOpeningFloorplan,
5
3
  floorplanAffordances: {
6
4
  'move-vertex': floorOpeningMoveVertexAffordance,
7
5
  'add-vertex': floorOpeningAddVertexAffordance,
@@ -1 +1 @@
1
- {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/floor-opening/definition.render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAEvE,eAAO,MAAM,4BAA4B,EAAE,oBAAoB,CAAC,OAAO,gBAAgB,CAAC,GAAG;IACzF,IAAI,EAAE,eAAe,CAAA;CAmCtB,CAAA"}
1
+ {"version":3,"file":"definition.render.d.ts","sourceRoot":"","sources":["../../src/floor-opening/definition.render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAGvE,eAAO,MAAM,4BAA4B,EAAE,oBAAoB,CAAC,OAAO,gBAAgB,CAAC,GAAG;IACzF,IAAI,EAAE,eAAe,CAAA;CAqCtB,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { FloorOpeningNode } from '@pascal-app/core';
2
+ import { buildFloorOpeningFloorplan } from './floorplan.js';
2
3
  export const floorOpeningRenderDefinition = {
3
4
  kind: 'floor-opening',
4
5
  bake: 'strip',
@@ -23,6 +24,8 @@ export const floorOpeningRenderDefinition = {
23
24
  },
24
25
  dirtyTracking: false,
25
26
  rendersChildren: false,
27
+ // The void on the plan, and its corners while selected.
28
+ floorplan: buildFloorOpeningFloorplan,
26
29
  presentation: {
27
30
  icon: { kind: 'iconify', name: 'lucide:square-dashed' },
28
31
  label: 'Floor opening',