@pascal-app/nodes 1.0.0-beta.5 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/block/commands.d.ts +68 -0
- package/dist/block/commands.d.ts.map +1 -0
- package/dist/block/commands.js +1144 -0
- package/dist/block/contextual-help.d.ts +3 -0
- package/dist/block/contextual-help.d.ts.map +1 -0
- package/dist/block/contextual-help.js +38 -0
- package/dist/block/definition.d.ts +8 -0
- package/dist/block/definition.d.ts.map +1 -0
- package/dist/block/definition.js +126 -0
- package/dist/block/edit-session.d.ts +16 -0
- package/dist/block/edit-session.d.ts.map +1 -0
- package/dist/block/edit-session.js +32 -0
- package/dist/block/face-host.d.ts +3 -0
- package/dist/block/face-host.d.ts.map +1 -0
- package/dist/block/face-host.js +178 -0
- package/dist/block/floorplan.d.ts +3 -0
- package/dist/block/floorplan.d.ts.map +1 -0
- package/dist/block/floorplan.js +43 -0
- package/dist/block/geometry-snap.d.ts +18 -0
- package/dist/block/geometry-snap.d.ts.map +1 -0
- package/dist/block/geometry-snap.js +137 -0
- package/dist/block/geometry.d.ts +11 -0
- package/dist/block/geometry.d.ts.map +1 -0
- package/dist/block/geometry.js +146 -0
- package/dist/block/gesture-wheel.d.ts +8 -0
- package/dist/block/gesture-wheel.d.ts.map +1 -0
- package/dist/block/gesture-wheel.js +7 -0
- package/dist/block/interaction-sfx.d.ts +3 -0
- package/dist/block/interaction-sfx.d.ts.map +1 -0
- package/dist/block/interaction-sfx.js +16 -0
- package/dist/block/last-operation.d.ts +48 -0
- package/dist/block/last-operation.d.ts.map +1 -0
- package/dist/block/last-operation.js +120 -0
- package/dist/block/loop-cut-interaction.d.ts +5 -0
- package/dist/block/loop-cut-interaction.d.ts.map +1 -0
- package/dist/block/loop-cut-interaction.js +13 -0
- package/dist/block/material-slots.d.ts +61 -0
- package/dist/block/material-slots.d.ts.map +1 -0
- package/dist/block/material-slots.js +131 -0
- package/dist/block/modal-face-operation.d.ts +13 -0
- package/dist/block/modal-face-operation.d.ts.map +1 -0
- package/dist/block/modal-face-operation.js +40 -0
- package/dist/block/modal-session.d.ts +15 -0
- package/dist/block/modal-session.d.ts.map +1 -0
- package/dist/block/modal-session.js +40 -0
- package/dist/block/modal-transform.d.ts +30 -0
- package/dist/block/modal-transform.d.ts.map +1 -0
- package/dist/block/modal-transform.js +144 -0
- package/dist/block/paint.d.ts +3 -0
- package/dist/block/paint.d.ts.map +1 -0
- package/dist/block/paint.js +136 -0
- package/dist/block/panel.d.ts +2 -0
- package/dist/block/panel.d.ts.map +1 -0
- package/dist/block/panel.js +234 -0
- package/dist/block/parametrics.d.ts +4 -0
- package/dist/block/parametrics.d.ts.map +1 -0
- package/dist/block/parametrics.js +9 -0
- package/dist/block/preview.d.ts +6 -0
- package/dist/block/preview.d.ts.map +1 -0
- package/dist/block/preview.js +46 -0
- package/dist/block/rotation-drag.d.ts +5 -0
- package/dist/block/rotation-drag.d.ts.map +1 -0
- package/dist/block/rotation-drag.js +18 -0
- package/dist/block/schema.d.ts +2 -0
- package/dist/block/schema.d.ts.map +1 -0
- package/dist/block/schema.js +1 -0
- package/dist/block/selection-geometry.d.ts +9 -0
- package/dist/block/selection-geometry.d.ts.map +1 -0
- package/dist/block/selection-geometry.js +31 -0
- package/dist/block/selection-model.d.ts +17 -0
- package/dist/block/selection-model.d.ts.map +1 -0
- package/dist/block/selection-model.js +84 -0
- package/dist/block/selection.d.ts +4 -0
- package/dist/block/selection.d.ts.map +1 -0
- package/dist/block/selection.js +2570 -0
- package/dist/block/slots.d.ts +4 -0
- package/dist/block/slots.d.ts.map +1 -0
- package/dist/block/slots.js +17 -0
- package/dist/block/tool.d.ts +3 -0
- package/dist/block/tool.d.ts.map +1 -0
- package/dist/block/tool.js +174 -0
- package/dist/block/toolbar-state.d.ts +46 -0
- package/dist/block/toolbar-state.d.ts.map +1 -0
- package/dist/block/toolbar-state.js +67 -0
- package/dist/block/use-block-face-operation.d.ts +39 -0
- package/dist/block/use-block-face-operation.d.ts.map +1 -0
- package/dist/block/use-block-face-operation.js +218 -0
- package/dist/box-vent/definition.d.ts.map +1 -1
- package/dist/box-vent/definition.js +8 -5
- package/dist/box-vent/geometry.d.ts +4 -0
- package/dist/box-vent/geometry.d.ts.map +1 -1
- package/dist/box-vent/geometry.js +76 -44
- package/dist/box-vent/paint.d.ts +4 -0
- package/dist/box-vent/paint.d.ts.map +1 -0
- package/dist/box-vent/paint.js +40 -0
- package/dist/box-vent/panel.js +1 -1
- package/dist/box-vent/parametrics.js +3 -3
- package/dist/box-vent/renderer.d.ts.map +1 -1
- package/dist/box-vent/renderer.js +29 -10
- package/dist/cabinet/compartment-card.d.ts.map +1 -1
- package/dist/cabinet/compartment-card.js +11 -3
- package/dist/cabinet/continuous-placement.d.ts +3 -0
- package/dist/cabinet/continuous-placement.d.ts.map +1 -1
- package/dist/cabinet/continuous-placement.js +6 -0
- package/dist/cabinet/definition.d.ts.map +1 -1
- package/dist/cabinet/definition.js +400 -54
- package/dist/cabinet/floorplan-move.d.ts.map +1 -1
- package/dist/cabinet/floorplan-move.js +91 -22
- package/dist/cabinet/geometry/fridge.d.ts.map +1 -1
- package/dist/cabinet/geometry/fridge.js +25 -1
- package/dist/cabinet/geometry/fronts.d.ts +4 -0
- package/dist/cabinet/geometry/fronts.d.ts.map +1 -1
- package/dist/cabinet/geometry/fronts.js +1 -1
- package/dist/cabinet/geometry/run.d.ts.map +1 -1
- package/dist/cabinet/geometry/run.js +19 -1
- package/dist/cabinet/geometry.d.ts.map +1 -1
- package/dist/cabinet/geometry.js +63 -1
- package/dist/cabinet/index.d.ts +1 -0
- package/dist/cabinet/index.d.ts.map +1 -1
- package/dist/cabinet/index.js +1 -0
- package/dist/cabinet/insertion.d.ts +19 -0
- package/dist/cabinet/insertion.d.ts.map +1 -0
- package/dist/cabinet/insertion.js +49 -0
- package/dist/cabinet/move-frame.d.ts.map +1 -1
- package/dist/cabinet/move-frame.js +68 -2
- package/dist/cabinet/panel-context.d.ts +7 -0
- package/dist/cabinet/panel-context.d.ts.map +1 -0
- package/dist/cabinet/panel-context.js +16 -0
- package/dist/cabinet/panel-visibility.d.ts +9 -0
- package/dist/cabinet/panel-visibility.d.ts.map +1 -0
- package/dist/cabinet/panel-visibility.js +26 -0
- package/dist/cabinet/panel.d.ts.map +1 -1
- package/dist/cabinet/panel.js +221 -37
- package/dist/cabinet/placement-dimensions.d.ts +42 -0
- package/dist/cabinet/placement-dimensions.d.ts.map +1 -0
- package/dist/cabinet/placement-dimensions.js +227 -0
- package/dist/cabinet/placement-snap.d.ts +21 -1
- package/dist/cabinet/placement-snap.d.ts.map +1 -1
- package/dist/cabinet/placement-snap.js +48 -6
- package/dist/cabinet/preset-width-debt.d.ts +7 -0
- package/dist/cabinet/preset-width-debt.d.ts.map +1 -0
- package/dist/cabinet/preset-width-debt.js +45 -0
- package/dist/cabinet/presets.d.ts.map +1 -1
- package/dist/cabinet/presets.js +14 -13
- package/dist/cabinet/profiles.d.ts +14 -0
- package/dist/cabinet/profiles.d.ts.map +1 -0
- package/dist/cabinet/profiles.js +30 -0
- package/dist/cabinet/quick-actions.d.ts.map +1 -1
- package/dist/cabinet/quick-actions.js +8 -24
- package/dist/cabinet/reveals.d.ts +37 -0
- package/dist/cabinet/reveals.d.ts.map +1 -0
- package/dist/cabinet/reveals.js +13 -0
- package/dist/cabinet/run-layout.d.ts +90 -4
- package/dist/cabinet/run-layout.d.ts.map +1 -1
- package/dist/cabinet/run-layout.js +408 -23
- package/dist/cabinet/run-ops.d.ts +202 -10
- package/dist/cabinet/run-ops.d.ts.map +1 -1
- package/dist/cabinet/run-ops.js +520 -33
- package/dist/cabinet/run-panel.d.ts +6 -2
- package/dist/cabinet/run-panel.d.ts.map +1 -1
- package/dist/cabinet/run-panel.js +285 -108
- package/dist/cabinet/stack-transitions.d.ts.map +1 -1
- package/dist/cabinet/stack-transitions.js +35 -24
- package/dist/cabinet/stack.d.ts +169 -1
- package/dist/cabinet/stack.d.ts.map +1 -1
- package/dist/cabinet/stack.js +57 -18
- package/dist/cabinet/tool.d.ts.map +1 -1
- package/dist/cabinet/tool.js +615 -91
- package/dist/cabinet/validation.d.ts +27 -0
- package/dist/cabinet/validation.d.ts.map +1 -0
- package/dist/cabinet/validation.js +56 -0
- package/dist/cabinet/wall-height-presets.d.ts +12 -0
- package/dist/cabinet/wall-height-presets.d.ts.map +1 -0
- package/dist/cabinet/wall-height-presets.js +15 -0
- package/dist/cabinet/wall-snap.d.ts +27 -3
- package/dist/cabinet/wall-snap.d.ts.map +1 -1
- package/dist/cabinet/wall-snap.js +278 -62
- package/dist/cabinet/widths.d.ts +10 -0
- package/dist/cabinet/widths.d.ts.map +1 -0
- package/dist/cabinet/widths.js +13 -0
- package/dist/ceiling/definition.d.ts.map +1 -1
- package/dist/ceiling/definition.js +7 -1
- package/dist/ceiling/floorplan-affordances.d.ts +8 -8
- package/dist/ceiling/materials.d.ts.map +1 -1
- package/dist/ceiling/materials.js +0 -1
- package/dist/ceiling/panel.js +1 -1
- package/dist/ceiling/parametrics.js +1 -1
- package/dist/chimney/definition.js +1 -1
- package/dist/chimney/panel.js +1 -1
- package/dist/chimney/parametrics.js +3 -3
- package/dist/column/definition.d.ts.map +1 -1
- package/dist/column/definition.js +22 -4
- package/dist/column/panel.d.ts.map +1 -1
- package/dist/column/panel.js +37 -7
- package/dist/column/parametrics.d.ts.map +1 -1
- package/dist/column/parametrics.js +5 -3
- package/dist/column/tool.d.ts.map +1 -1
- package/dist/column/tool.js +50 -14
- package/dist/cupola/definition.d.ts.map +1 -1
- package/dist/cupola/definition.js +15 -6
- package/dist/cupola/geometry.d.ts +6 -0
- package/dist/cupola/geometry.d.ts.map +1 -1
- package/dist/cupola/geometry.js +60 -13
- package/dist/cupola/paint.d.ts +4 -0
- package/dist/cupola/paint.d.ts.map +1 -0
- package/dist/cupola/paint.js +39 -0
- package/dist/cupola/panel.js +1 -1
- package/dist/cupola/parametrics.js +3 -3
- package/dist/cupola/renderer.d.ts.map +1 -1
- package/dist/cupola/renderer.js +27 -8
- package/dist/door/floorplan-move.d.ts.map +1 -1
- package/dist/door/floorplan-move.js +1 -1
- package/dist/door/move-tool.d.ts.map +1 -1
- package/dist/door/move-tool.js +86 -32
- package/dist/door/panel.d.ts.map +1 -1
- package/dist/door/panel.js +1 -1
- package/dist/door/parametrics.js +2 -2
- package/dist/door/tool.d.ts.map +1 -1
- package/dist/door/tool.js +16 -4
- package/dist/dormer/csg-geometry.d.ts +6 -42
- package/dist/dormer/csg-geometry.d.ts.map +1 -1
- package/dist/dormer/csg-geometry.js +38 -209
- package/dist/dormer/definition.d.ts +4 -12
- package/dist/dormer/definition.d.ts.map +1 -1
- package/dist/dormer/definition.js +18 -193
- package/dist/dormer/floorplan.d.ts +3 -3
- package/dist/dormer/floorplan.d.ts.map +1 -1
- package/dist/dormer/floorplan.js +6 -17
- package/dist/dormer/geometry.d.ts +5 -24
- package/dist/dormer/geometry.d.ts.map +1 -1
- package/dist/dormer/geometry.js +64 -41
- package/dist/dormer/index.d.ts +1 -1
- package/dist/dormer/index.d.ts.map +1 -1
- package/dist/dormer/index.js +1 -1
- package/dist/dormer/move-tool.d.ts.map +1 -1
- package/dist/dormer/move-tool.js +31 -3
- package/dist/dormer/panel-windows-section.d.ts +9 -0
- package/dist/dormer/panel-windows-section.d.ts.map +1 -0
- package/dist/dormer/panel-windows-section.js +7 -0
- package/dist/dormer/panel.d.ts.map +1 -1
- package/dist/dormer/panel.js +100 -18
- package/dist/dormer/parametrics.d.ts.map +1 -1
- package/dist/dormer/parametrics.js +8 -77
- package/dist/dormer/preview.d.ts.map +1 -1
- package/dist/dormer/preview.js +9 -1
- package/dist/dormer/renderer.d.ts.map +1 -1
- package/dist/dormer/renderer.js +24 -26
- package/dist/dormer/tool.d.ts.map +1 -1
- package/dist/dormer/tool.js +3 -1
- package/dist/dormer/window-layout.d.ts +15 -0
- package/dist/dormer/window-layout.d.ts.map +1 -0
- package/dist/dormer/window-layout.js +59 -0
- package/dist/downspout/definition.d.ts.map +1 -1
- package/dist/downspout/definition.js +17 -4
- package/dist/downspout/geometry.d.ts.map +1 -1
- package/dist/downspout/geometry.js +10 -0
- package/dist/downspout/inspector-editors.d.ts.map +1 -1
- package/dist/downspout/inspector-editors.js +9 -1
- package/dist/downspout/parametrics.d.ts.map +1 -1
- package/dist/downspout/parametrics.js +2 -1
- package/dist/downspout/renderer.d.ts.map +1 -1
- package/dist/downspout/renderer.js +19 -3
- package/dist/downspout/system.d.ts +7 -0
- package/dist/downspout/system.d.ts.map +1 -0
- package/dist/downspout/system.js +114 -0
- package/dist/duct-fitting/accessory-geometry.d.ts +4 -0
- package/dist/duct-fitting/accessory-geometry.d.ts.map +1 -0
- package/dist/duct-fitting/accessory-geometry.js +47 -0
- package/dist/duct-fitting/definition.d.ts.map +1 -1
- package/dist/duct-fitting/definition.js +11 -1
- package/dist/duct-fitting/floorplan.d.ts.map +1 -1
- package/dist/duct-fitting/floorplan.js +8 -0
- package/dist/duct-fitting/geometry.d.ts.map +1 -1
- package/dist/duct-fitting/geometry.js +52 -38
- package/dist/duct-fitting/parametrics.d.ts.map +1 -1
- package/dist/duct-fitting/parametrics.js +78 -15
- package/dist/duct-fitting/ports.d.ts +1 -0
- package/dist/duct-fitting/ports.d.ts.map +1 -1
- package/dist/duct-fitting/ports.js +46 -0
- package/dist/duct-fitting/tool.d.ts +19 -0
- package/dist/duct-fitting/tool.d.ts.map +1 -1
- package/dist/duct-fitting/tool.js +126 -34
- package/dist/duct-segment/continuation.d.ts +21 -0
- package/dist/duct-segment/continuation.d.ts.map +1 -0
- package/dist/duct-segment/continuation.js +167 -0
- package/dist/duct-segment/definition.d.ts.map +1 -1
- package/dist/duct-segment/definition.js +19 -18
- package/dist/duct-segment/floorplan.d.ts.map +1 -1
- package/dist/duct-segment/floorplan.js +43 -0
- package/dist/duct-segment/geometry.d.ts.map +1 -1
- package/dist/duct-segment/geometry.js +3 -0
- package/dist/duct-segment/move-tool.d.ts.map +1 -1
- package/dist/duct-segment/move-tool.js +33 -6
- package/dist/duct-segment/parametrics.d.ts.map +1 -1
- package/dist/duct-segment/parametrics.js +45 -1
- package/dist/duct-segment/selection.d.ts +3 -4
- package/dist/duct-segment/selection.d.ts.map +1 -1
- package/dist/duct-segment/selection.js +186 -158
- package/dist/duct-segment/tool.d.ts +37 -0
- package/dist/duct-segment/tool.d.ts.map +1 -1
- package/dist/duct-segment/tool.js +305 -678
- package/dist/duct-terminal/parametrics.js +2 -2
- package/dist/duct-terminal/tool.d.ts.map +1 -1
- package/dist/duct-terminal/tool.js +37 -7
- package/dist/elevator/panel.d.ts.map +1 -1
- package/dist/elevator/panel.js +7 -7
- package/dist/elevator/system.d.ts.map +1 -1
- package/dist/elevator/system.js +10 -1
- package/dist/eyebrow-vent/definition.d.ts.map +1 -1
- package/dist/eyebrow-vent/definition.js +8 -5
- package/dist/eyebrow-vent/geometry.d.ts +4 -0
- package/dist/eyebrow-vent/geometry.d.ts.map +1 -1
- package/dist/eyebrow-vent/geometry.js +60 -15
- package/dist/eyebrow-vent/paint.d.ts +4 -0
- package/dist/eyebrow-vent/paint.d.ts.map +1 -0
- package/dist/eyebrow-vent/paint.js +33 -0
- package/dist/eyebrow-vent/panel.js +1 -1
- package/dist/eyebrow-vent/parametrics.js +3 -3
- package/dist/eyebrow-vent/renderer.d.ts.map +1 -1
- package/dist/eyebrow-vent/renderer.js +27 -8
- package/dist/fence/definition.d.ts.map +1 -1
- package/dist/fence/definition.js +2 -1
- package/dist/fence/floorplan-affordances.d.ts +1 -0
- package/dist/fence/floorplan-affordances.d.ts.map +1 -1
- package/dist/fence/floorplan-affordances.js +30 -1
- package/dist/fence/floorplan.d.ts.map +1 -1
- package/dist/fence/floorplan.js +14 -0
- package/dist/fence/parametrics.js +3 -3
- package/dist/fence/tool.d.ts.map +1 -1
- package/dist/fence/tool.js +47 -20
- package/dist/gutter/corner-mitre.d.ts.map +1 -1
- package/dist/gutter/corner-mitre.js +47 -7
- package/dist/gutter/definition.d.ts.map +1 -1
- package/dist/gutter/definition.js +23 -13
- package/dist/gutter/eave-align.d.ts.map +1 -1
- package/dist/gutter/eave-align.js +10 -0
- package/dist/gutter/eave-snap.d.ts +1 -1
- package/dist/gutter/eave-snap.d.ts.map +1 -1
- package/dist/gutter/eave-snap.js +10 -23
- package/dist/gutter/geometry.d.ts.map +1 -1
- package/dist/gutter/geometry.js +126 -8
- package/dist/gutter/outlet-lookup.d.ts.map +1 -1
- package/dist/gutter/outlet-lookup.js +22 -1
- package/dist/gutter/paint.d.ts +3 -0
- package/dist/gutter/paint.d.ts.map +1 -0
- package/dist/gutter/paint.js +6 -0
- package/dist/gutter/parametrics.d.ts.map +1 -1
- package/dist/gutter/parametrics.js +4 -1
- package/dist/gutter/renderer.d.ts.map +1 -1
- package/dist/gutter/renderer.js +63 -7
- package/dist/gutter/trim-clip.d.ts +3 -0
- package/dist/gutter/trim-clip.d.ts.map +1 -0
- package/dist/gutter/trim-clip.js +5 -0
- package/dist/hvac-equipment/parametrics.js +3 -3
- package/dist/hvac-equipment/tool.d.ts.map +1 -1
- package/dist/hvac-equipment/tool.js +12 -2
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -2
- package/dist/item/definition.d.ts.map +1 -1
- package/dist/item/definition.js +10 -2
- package/dist/item/floorplan-move.d.ts.map +1 -1
- package/dist/item/floorplan-move.js +20 -1
- package/dist/item/floorplan.d.ts.map +1 -1
- package/dist/item/floorplan.js +22 -1
- package/dist/item/move-tool.d.ts +28 -1
- package/dist/item/move-tool.d.ts.map +1 -1
- package/dist/item/move-tool.js +14 -2
- package/dist/item/renderer.d.ts.map +1 -1
- package/dist/item/renderer.js +16 -6
- package/dist/item/system.d.ts +5 -0
- package/dist/item/system.d.ts.map +1 -1
- package/dist/item/system.js +7 -1
- package/dist/lean-to-extension/arc.d.ts +14 -0
- package/dist/lean-to-extension/arc.d.ts.map +1 -0
- package/dist/lean-to-extension/arc.js +56 -0
- package/dist/lean-to-extension/assembly.d.ts +61 -0
- package/dist/lean-to-extension/assembly.d.ts.map +1 -0
- package/dist/lean-to-extension/assembly.js +761 -0
- package/dist/lean-to-extension/canopy-joint.d.ts +35 -0
- package/dist/lean-to-extension/canopy-joint.d.ts.map +1 -0
- package/dist/lean-to-extension/canopy-joint.js +234 -0
- package/dist/lean-to-extension/conical-host.d.ts +15 -0
- package/dist/lean-to-extension/conical-host.d.ts.map +1 -0
- package/dist/lean-to-extension/conical-host.js +113 -0
- package/dist/lean-to-extension/corner-joint.d.ts +29 -0
- package/dist/lean-to-extension/corner-joint.d.ts.map +1 -0
- package/dist/lean-to-extension/corner-joint.js +1202 -0
- package/dist/lean-to-extension/definition.d.ts +4 -0
- package/dist/lean-to-extension/definition.d.ts.map +1 -0
- package/dist/lean-to-extension/definition.js +433 -0
- package/dist/lean-to-extension/floorplan-affordances.d.ts +4 -0
- package/dist/lean-to-extension/floorplan-affordances.d.ts.map +1 -0
- package/dist/lean-to-extension/floorplan-affordances.js +144 -0
- package/dist/lean-to-extension/floorplan-move.d.ts +3 -0
- package/dist/lean-to-extension/floorplan-move.d.ts.map +1 -0
- package/dist/lean-to-extension/floorplan-move.js +157 -0
- package/dist/lean-to-extension/floorplan-tool.d.ts +4 -0
- package/dist/lean-to-extension/floorplan-tool.d.ts.map +1 -0
- package/dist/lean-to-extension/floorplan-tool.js +385 -0
- package/dist/lean-to-extension/floorplan.d.ts +3 -0
- package/dist/lean-to-extension/floorplan.d.ts.map +1 -0
- package/dist/lean-to-extension/floorplan.js +373 -0
- package/dist/lean-to-extension/geometry.d.ts +7 -0
- package/dist/lean-to-extension/geometry.d.ts.map +1 -0
- package/dist/lean-to-extension/geometry.js +662 -0
- package/dist/lean-to-extension/index.d.ts +8 -0
- package/dist/lean-to-extension/index.d.ts.map +1 -0
- package/dist/lean-to-extension/index.js +7 -0
- package/dist/lean-to-extension/layout.d.ts +108 -0
- package/dist/lean-to-extension/layout.d.ts.map +1 -0
- package/dist/lean-to-extension/layout.js +477 -0
- package/dist/lean-to-extension/managed-preview.d.ts +3 -0
- package/dist/lean-to-extension/managed-preview.d.ts.map +1 -0
- package/dist/lean-to-extension/managed-preview.js +93 -0
- package/dist/lean-to-extension/move-tool.d.ts +8 -0
- package/dist/lean-to-extension/move-tool.d.ts.map +1 -0
- package/dist/lean-to-extension/move-tool.js +202 -0
- package/dist/lean-to-extension/paint.d.ts +2 -0
- package/dist/lean-to-extension/paint.d.ts.map +1 -0
- package/dist/lean-to-extension/paint.js +16 -0
- package/dist/lean-to-extension/parametrics.d.ts +4 -0
- package/dist/lean-to-extension/parametrics.d.ts.map +1 -0
- package/dist/lean-to-extension/parametrics.js +570 -0
- package/dist/lean-to-extension/placement-scope.d.ts +3 -0
- package/dist/lean-to-extension/placement-scope.d.ts.map +1 -0
- package/dist/lean-to-extension/placement-scope.js +4 -0
- package/dist/lean-to-extension/placement-validation.d.ts +4 -0
- package/dist/lean-to-extension/placement-validation.d.ts.map +1 -0
- package/dist/lean-to-extension/placement-validation.js +324 -0
- package/dist/lean-to-extension/placement.d.ts +59 -0
- package/dist/lean-to-extension/placement.d.ts.map +1 -0
- package/dist/lean-to-extension/placement.js +331 -0
- package/dist/lean-to-extension/plan-footprint.d.ts +10 -0
- package/dist/lean-to-extension/plan-footprint.d.ts.map +1 -0
- package/dist/lean-to-extension/plan-footprint.js +27 -0
- package/dist/lean-to-extension/preview-geometry.d.ts +7 -0
- package/dist/lean-to-extension/preview-geometry.d.ts.map +1 -0
- package/dist/lean-to-extension/preview-geometry.js +40 -0
- package/dist/lean-to-extension/preview.d.ts +7 -0
- package/dist/lean-to-extension/preview.d.ts.map +1 -0
- package/dist/lean-to-extension/preview.js +20 -0
- package/dist/lean-to-extension/renderer.d.ts +6 -0
- package/dist/lean-to-extension/renderer.d.ts.map +1 -0
- package/dist/lean-to-extension/renderer.js +34 -0
- package/dist/lean-to-extension/roof-attachment.d.ts +28 -0
- package/dist/lean-to-extension/roof-attachment.d.ts.map +1 -0
- package/dist/lean-to-extension/roof-attachment.js +376 -0
- package/dist/lean-to-extension/schema.d.ts +2 -0
- package/dist/lean-to-extension/schema.d.ts.map +1 -0
- package/dist/lean-to-extension/schema.js +1 -0
- package/dist/lean-to-extension/slots.d.ts +5 -0
- package/dist/lean-to-extension/slots.d.ts.map +1 -0
- package/dist/lean-to-extension/slots.js +15 -0
- package/dist/lean-to-extension/system.d.ts +7 -0
- package/dist/lean-to-extension/system.d.ts.map +1 -0
- package/dist/lean-to-extension/system.js +726 -0
- package/dist/lean-to-extension/tool.d.ts +3 -0
- package/dist/lean-to-extension/tool.d.ts.map +1 -0
- package/dist/lean-to-extension/tool.js +580 -0
- package/dist/lean-to-extension/wall-target.d.ts +10 -0
- package/dist/lean-to-extension/wall-target.d.ts.map +1 -0
- package/dist/lean-to-extension/wall-target.js +29 -0
- package/dist/lineset/definition.d.ts.map +1 -1
- package/dist/lineset/definition.js +1 -0
- package/dist/liquid-line/definition.d.ts.map +1 -1
- package/dist/liquid-line/definition.js +1 -0
- package/dist/pipe-fitting/definition.d.ts.map +1 -1
- package/dist/pipe-fitting/definition.js +16 -2
- package/dist/pipe-fitting/floorplan.d.ts.map +1 -1
- package/dist/pipe-fitting/floorplan.js +4 -0
- package/dist/pipe-fitting/geometry.d.ts +3 -5
- package/dist/pipe-fitting/geometry.d.ts.map +1 -1
- package/dist/pipe-fitting/geometry.js +154 -21
- package/dist/pipe-fitting/inline-insertion.d.ts +13 -0
- package/dist/pipe-fitting/inline-insertion.d.ts.map +1 -0
- package/dist/pipe-fitting/inline-insertion.js +96 -0
- package/dist/pipe-fitting/parametrics.d.ts.map +1 -1
- package/dist/pipe-fitting/parametrics.js +17 -3
- package/dist/pipe-fitting/ports.d.ts.map +1 -1
- package/dist/pipe-fitting/ports.js +8 -1
- package/dist/pipe-fitting/tool.d.ts +26 -0
- package/dist/pipe-fitting/tool.d.ts.map +1 -1
- package/dist/pipe-fitting/tool.js +182 -37
- package/dist/pipe-segment/continuation.d.ts +22 -0
- package/dist/pipe-segment/continuation.d.ts.map +1 -0
- package/dist/pipe-segment/continuation.js +146 -0
- package/dist/pipe-segment/definition.d.ts.map +1 -1
- package/dist/pipe-segment/definition.js +23 -7
- package/dist/pipe-segment/floorplan.d.ts.map +1 -1
- package/dist/pipe-segment/floorplan.js +42 -0
- package/dist/pipe-segment/geometry.d.ts +2 -1
- package/dist/pipe-segment/geometry.d.ts.map +1 -1
- package/dist/pipe-segment/geometry.js +4 -1
- package/dist/pipe-segment/move-tool.d.ts.map +1 -1
- package/dist/pipe-segment/move-tool.js +25 -5
- package/dist/pipe-segment/parametrics.d.ts.map +1 -1
- package/dist/pipe-segment/parametrics.js +45 -0
- package/dist/pipe-segment/selection.d.ts +3 -4
- package/dist/pipe-segment/selection.d.ts.map +1 -1
- package/dist/pipe-segment/selection.js +169 -105
- package/dist/pipe-segment/slope.d.ts +5 -0
- package/dist/pipe-segment/slope.d.ts.map +1 -0
- package/dist/pipe-segment/slope.js +10 -0
- package/dist/pipe-segment/tool.d.ts.map +1 -1
- package/dist/pipe-segment/tool.js +325 -545
- package/dist/pipe-trap/tool.d.ts.map +1 -1
- package/dist/pipe-trap/tool.js +15 -2
- package/dist/ridge-vent/definition.js +1 -1
- package/dist/ridge-vent/panel.d.ts.map +1 -1
- package/dist/ridge-vent/panel.js +2 -2
- package/dist/ridge-vent/parametrics.js +1 -1
- package/dist/roof/conical-roof-placement.d.ts +36 -0
- package/dist/roof/conical-roof-placement.d.ts.map +1 -0
- package/dist/roof/conical-roof-placement.js +134 -0
- package/dist/roof/conical-roof.d.ts +3 -0
- package/dist/roof/conical-roof.d.ts.map +1 -0
- package/dist/roof/conical-roof.js +53 -0
- package/dist/roof/definition.d.ts +3 -10
- package/dist/roof/definition.d.ts.map +1 -1
- package/dist/roof/definition.js +83 -13
- package/dist/roof/floorplan.d.ts +3 -10
- package/dist/roof/floorplan.d.ts.map +1 -1
- package/dist/roof/floorplan.js +139 -165
- package/dist/roof/index.d.ts +1 -0
- package/dist/roof/index.d.ts.map +1 -1
- package/dist/roof/index.js +1 -0
- package/dist/roof/panel.d.ts.map +1 -1
- package/dist/roof/panel.js +22 -23
- package/dist/roof/renderer.d.ts.map +1 -1
- package/dist/roof/roof-footprint-source.d.ts +16 -0
- package/dist/roof/roof-footprint-source.d.ts.map +1 -0
- package/dist/roof/roof-footprint-source.js +14 -0
- package/dist/roof/roof-footprint.d.ts +25 -0
- package/dist/roof/roof-footprint.d.ts.map +1 -0
- package/dist/roof/roof-footprint.js +94 -0
- package/dist/roof/roof-placement-mode.d.ts +18 -0
- package/dist/roof/roof-placement-mode.d.ts.map +1 -0
- package/dist/roof/roof-placement-mode.js +24 -0
- package/dist/roof/tool.d.ts +10 -0
- package/dist/roof/tool.d.ts.map +1 -0
- package/dist/roof/tool.js +922 -0
- package/dist/roof-segment/definition.d.ts.map +1 -1
- package/dist/roof-segment/definition.js +52 -8
- package/dist/roof-segment/floorplan-affordances.d.ts +5 -6
- package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
- package/dist/roof-segment/floorplan-affordances.js +64 -18
- package/dist/roof-segment/floorplan.d.ts +3 -2
- package/dist/roof-segment/floorplan.d.ts.map +1 -1
- package/dist/roof-segment/floorplan.js +95 -46
- package/dist/roof-segment/panel.d.ts.map +1 -1
- package/dist/roof-segment/panel.js +122 -27
- package/dist/scan/definition.d.ts +2 -3
- package/dist/scan/definition.d.ts.map +1 -1
- package/dist/scan/definition.js +9 -7
- package/dist/scan/parametrics.d.ts.map +1 -1
- package/dist/scan/parametrics.js +13 -1
- package/dist/scan/renderer.d.ts.map +1 -1
- package/dist/scan/renderer.js +8 -2
- package/dist/shared/accessory-cursor.d.ts +7 -0
- package/dist/shared/accessory-cursor.d.ts.map +1 -0
- package/dist/shared/accessory-cursor.js +83 -0
- package/dist/shared/accessory-floorplan.d.ts +4 -0
- package/dist/shared/accessory-floorplan.d.ts.map +1 -0
- package/dist/shared/accessory-floorplan.js +51 -0
- package/dist/shared/accessory-geometry.d.ts +7 -0
- package/dist/shared/accessory-geometry.d.ts.map +1 -0
- package/dist/shared/accessory-geometry.js +79 -0
- package/dist/shared/accessory-placement.d.ts +10 -0
- package/dist/shared/accessory-placement.d.ts.map +1 -0
- package/dist/shared/accessory-placement.js +126 -0
- package/dist/shared/accessory-snapping.d.ts +5 -0
- package/dist/shared/accessory-snapping.d.ts.map +1 -0
- package/dist/shared/accessory-snapping.js +40 -0
- package/dist/shared/automatic-run-end-cap.d.ts +11 -0
- package/dist/shared/automatic-run-end-cap.d.ts.map +1 -0
- package/dist/shared/automatic-run-end-cap.js +159 -0
- package/dist/shared/block-face-host.d.ts +15 -0
- package/dist/shared/block-face-host.d.ts.map +1 -0
- package/dist/shared/block-face-host.js +36 -0
- package/dist/shared/connection-compatibility.d.ts +8 -0
- package/dist/shared/connection-compatibility.d.ts.map +1 -0
- package/dist/shared/connection-compatibility.js +28 -0
- package/dist/shared/connection-feedback.d.ts +10 -0
- package/dist/shared/connection-feedback.d.ts.map +1 -0
- package/dist/shared/connection-feedback.js +17 -0
- package/dist/shared/distribution-run-contract.d.ts +49 -0
- package/dist/shared/distribution-run-contract.d.ts.map +1 -0
- package/dist/shared/distribution-run-contract.js +30 -0
- package/dist/shared/distribution-run-tool.d.ts +107 -0
- package/dist/shared/distribution-run-tool.d.ts.map +1 -0
- package/dist/shared/distribution-run-tool.js +941 -0
- package/dist/shared/dormer-wall-opening-placement.d.ts +21 -0
- package/dist/shared/dormer-wall-opening-placement.d.ts.map +1 -0
- package/dist/shared/dormer-wall-opening-placement.js +101 -0
- package/dist/shared/duct-adapter.d.ts +10 -0
- package/dist/shared/duct-adapter.d.ts.map +1 -0
- package/dist/shared/duct-adapter.js +43 -0
- package/dist/shared/elbow-branch-continuation.d.ts +20 -0
- package/dist/shared/elbow-branch-continuation.d.ts.map +1 -0
- package/dist/shared/elbow-branch-continuation.js +200 -0
- package/dist/shared/fitting-clearance.d.ts +5 -0
- package/dist/shared/fitting-clearance.d.ts.map +1 -0
- package/dist/shared/fitting-clearance.js +11 -0
- package/dist/shared/fitting-deletion-cleanup.d.ts +14 -0
- package/dist/shared/fitting-deletion-cleanup.d.ts.map +1 -0
- package/dist/shared/fitting-deletion-cleanup.js +297 -0
- package/dist/shared/fitting-surface-support.d.ts +5 -0
- package/dist/shared/fitting-surface-support.d.ts.map +1 -0
- package/dist/shared/fitting-surface-support.js +42 -0
- package/dist/shared/fitting-tool-options.d.ts +4 -0
- package/dist/shared/fitting-tool-options.d.ts.map +1 -0
- package/dist/shared/fitting-tool-options.js +175 -0
- package/dist/shared/floor-placement.d.ts +1 -1
- package/dist/shared/floor-placement.d.ts.map +1 -1
- package/dist/shared/floor-placement.js +13 -33
- package/dist/shared/ghost-materials.d.ts.map +1 -1
- package/dist/shared/ghost-materials.js +2 -1
- package/dist/shared/lean-to-post-omissions.d.ts +8 -0
- package/dist/shared/lean-to-post-omissions.d.ts.map +1 -0
- package/dist/shared/lean-to-post-omissions.js +51 -0
- package/dist/shared/mep-fitting-actions.d.ts +5 -0
- package/dist/shared/mep-fitting-actions.d.ts.map +1 -0
- package/dist/shared/mep-fitting-actions.js +16 -0
- package/dist/shared/mep-presets.d.ts +11 -0
- package/dist/shared/mep-presets.d.ts.map +1 -0
- package/dist/shared/mep-presets.js +34 -0
- package/dist/shared/node-batch/candidates.d.ts +29 -0
- package/dist/shared/node-batch/candidates.d.ts.map +1 -0
- package/dist/shared/node-batch/candidates.js +260 -0
- package/dist/shared/node-batch/store.d.ts +26 -0
- package/dist/shared/node-batch/store.d.ts.map +1 -0
- package/dist/shared/node-batch/store.js +319 -0
- package/dist/shared/node-batch/system.d.ts +8 -0
- package/dist/shared/node-batch/system.d.ts.map +1 -0
- package/dist/shared/node-batch/system.js +569 -0
- package/dist/shared/node-batch/types.d.ts +99 -0
- package/dist/shared/node-batch/types.d.ts.map +1 -0
- package/dist/shared/node-batch/types.js +4 -0
- package/dist/shared/opening-move-history.d.ts +47 -0
- package/dist/shared/opening-move-history.d.ts.map +1 -0
- package/dist/shared/opening-move-history.js +18 -0
- package/dist/shared/opening-move-wall-gate.d.ts +55 -0
- package/dist/shared/opening-move-wall-gate.d.ts.map +1 -0
- package/dist/shared/opening-move-wall-gate.js +44 -0
- package/dist/shared/path-point-affordance.d.ts +2 -2
- package/dist/shared/path-point-affordance.d.ts.map +1 -1
- package/dist/shared/path-point-affordance.js +30 -6
- package/dist/shared/placeholder-geometry.d.ts.map +1 -1
- package/dist/shared/placeholder-geometry.js +4 -0
- package/dist/shared/ports.d.ts +20 -3
- package/dist/shared/ports.d.ts.map +1 -1
- package/dist/shared/ports.js +148 -7
- package/dist/shared/primitive-uv.d.ts +17 -0
- package/dist/shared/primitive-uv.d.ts.map +1 -0
- package/dist/shared/primitive-uv.js +107 -0
- package/dist/shared/reducer-size.d.ts +2 -0
- package/dist/shared/reducer-size.d.ts.map +1 -0
- package/dist/shared/reducer-size.js +12 -0
- package/dist/shared/ridge-snap.js +1 -1
- package/dist/shared/roof-surface.d.ts.map +1 -1
- package/dist/shared/roof-surface.js +17 -2
- package/dist/shared/run-cursor.d.ts +22 -0
- package/dist/shared/run-cursor.d.ts.map +1 -0
- package/dist/shared/run-cursor.js +19 -0
- package/dist/shared/run-direction-feedback.d.ts +20 -0
- package/dist/shared/run-direction-feedback.d.ts.map +1 -0
- package/dist/shared/run-direction-feedback.js +139 -0
- package/dist/shared/run-hanger-controls.d.ts +7 -0
- package/dist/shared/run-hanger-controls.d.ts.map +1 -0
- package/dist/shared/run-hanger-controls.js +44 -0
- package/dist/shared/run-hanger-inspector.d.ts +5 -0
- package/dist/shared/run-hanger-inspector.d.ts.map +1 -0
- package/dist/shared/run-hanger-inspector.js +43 -0
- package/dist/shared/run-hanger-mode.d.ts +11 -0
- package/dist/shared/run-hanger-mode.d.ts.map +1 -0
- package/dist/shared/run-hanger-mode.js +32 -0
- package/dist/shared/run-hanger-system.d.ts +3 -0
- package/dist/shared/run-hanger-system.d.ts.map +1 -0
- package/dist/shared/run-hanger-system.js +39 -0
- package/dist/shared/run-hangers.d.ts +25 -0
- package/dist/shared/run-hangers.d.ts.map +1 -0
- package/dist/shared/run-hangers.js +261 -0
- package/dist/shared/run-port-snap.d.ts +11 -0
- package/dist/shared/run-port-snap.d.ts.map +1 -0
- package/dist/shared/run-port-snap.js +19 -0
- package/dist/shared/run-screen-direction.d.ts +5 -0
- package/dist/shared/run-screen-direction.d.ts.map +1 -0
- package/dist/shared/run-screen-direction.js +24 -0
- package/dist/shared/selection-handles.d.ts +4 -0
- package/dist/shared/selection-handles.d.ts.map +1 -1
- package/dist/shared/selection-handles.js +10 -0
- package/dist/shared/slot-paint.d.ts +8 -1
- package/dist/shared/slot-paint.d.ts.map +1 -1
- package/dist/shared/slot-paint.js +120 -27
- package/dist/shared/surface-paint.d.ts +1 -2
- package/dist/shared/surface-paint.d.ts.map +1 -1
- package/dist/shared/surface-paint.js +9 -20
- package/dist/shared/system-check-panel.d.ts +6 -0
- package/dist/shared/system-check-panel.d.ts.map +1 -0
- package/dist/shared/system-check-panel.js +62 -0
- package/dist/shared/system-checks.d.ts +9 -0
- package/dist/shared/system-checks.d.ts.map +1 -0
- package/dist/shared/system-checks.js +131 -0
- package/dist/shared/wall-attach-target.d.ts +14 -2
- package/dist/shared/wall-attach-target.d.ts.map +1 -1
- package/dist/shared/wall-attach-target.js +108 -4
- package/dist/shared/wall-opening-clearance.d.ts +19 -0
- package/dist/shared/wall-opening-clearance.d.ts.map +1 -0
- package/dist/shared/wall-opening-clearance.js +28 -0
- package/dist/shared/wall-run-move.d.ts +17 -0
- package/dist/shared/wall-run-move.d.ts.map +1 -0
- package/dist/shared/wall-run-move.js +56 -0
- package/dist/shelf/parametrics.js +4 -4
- package/dist/site/renderer.d.ts.map +1 -1
- package/dist/site/renderer.js +40 -28
- package/dist/site/terrain-geometry.d.ts +1 -1
- package/dist/site/terrain-geometry.d.ts.map +1 -1
- package/dist/site/terrain-geometry.js +35 -9
- package/dist/site/terrain-mesh.d.ts +5 -0
- package/dist/site/terrain-mesh.d.ts.map +1 -1
- package/dist/site/terrain-mesh.js +63 -34
- package/dist/skylight/definition.js +1 -1
- package/dist/skylight/panel.js +1 -1
- package/dist/skylight/parametrics.js +2 -2
- package/dist/slab/definition.d.ts.map +1 -1
- package/dist/slab/definition.js +6 -1
- package/dist/slab/dependency-tracker.d.ts +3 -0
- package/dist/slab/dependency-tracker.d.ts.map +1 -0
- package/dist/slab/dependency-tracker.js +104 -0
- package/dist/slab/floorplan-affordances.d.ts +8 -8
- package/dist/slab/geometry.d.ts.map +1 -1
- package/dist/slab/geometry.js +16 -2
- package/dist/slab/panel.js +1 -1
- package/dist/slab/parametrics.js +1 -1
- package/dist/slab/system.d.ts.map +1 -1
- package/dist/slab/system.js +8 -64
- package/dist/solar-panel/definition.js +1 -1
- package/dist/solar-panel/panel.js +1 -1
- package/dist/solar-panel/parametrics.js +2 -2
- package/dist/stair/panel.d.ts.map +1 -1
- package/dist/stair/panel.js +18 -13
- package/dist/stair/stair-type.d.ts +18 -0
- package/dist/stair/stair-type.d.ts.map +1 -0
- package/dist/stair/stair-type.js +25 -0
- package/dist/stair-segment/panel.d.ts.map +1 -1
- package/dist/stair-segment/panel.js +44 -5
- package/dist/turbine-vent/definition.d.ts.map +1 -1
- package/dist/turbine-vent/definition.js +8 -5
- package/dist/turbine-vent/geometry.d.ts.map +1 -1
- package/dist/turbine-vent/geometry.js +48 -18
- package/dist/turbine-vent/paint.d.ts +4 -0
- package/dist/turbine-vent/paint.d.ts.map +1 -0
- package/dist/turbine-vent/paint.js +35 -0
- package/dist/turbine-vent/panel.js +1 -1
- package/dist/turbine-vent/parametrics.js +2 -2
- package/dist/turbine-vent/renderer.d.ts.map +1 -1
- package/dist/turbine-vent/renderer.js +31 -9
- package/dist/wall/curve-eligibility.d.ts +3 -0
- package/dist/wall/curve-eligibility.d.ts.map +1 -0
- package/dist/wall/curve-eligibility.js +10 -0
- package/dist/wall/curve-tool.d.ts.map +1 -1
- package/dist/wall/curve-tool.js +8 -11
- package/dist/wall/definition.d.ts +1 -1
- package/dist/wall/definition.d.ts.map +1 -1
- package/dist/wall/definition.js +36 -13
- package/dist/wall/floorplan-affordances.d.ts +1 -0
- package/dist/wall/floorplan-affordances.d.ts.map +1 -1
- package/dist/wall/floorplan-affordances.js +46 -7
- package/dist/wall/floorplan-move.d.ts +3 -4
- package/dist/wall/floorplan-move.d.ts.map +1 -1
- package/dist/wall/floorplan-move.js +122 -9
- package/dist/wall/floorplan.d.ts.map +1 -1
- package/dist/wall/floorplan.js +19 -23
- package/dist/wall/move-shared.d.ts.map +1 -1
- package/dist/wall/move-shared.js +10 -7
- package/dist/wall/paint.d.ts.map +1 -1
- package/dist/wall/paint.js +2 -0
- package/dist/wall/panel.d.ts.map +1 -1
- package/dist/wall/panel.js +10 -17
- package/dist/wall/parametrics.js +2 -2
- package/dist/wall/pointer-transparency.d.ts +128 -0
- package/dist/wall/pointer-transparency.d.ts.map +1 -0
- package/dist/wall/pointer-transparency.js +147 -0
- package/dist/wall/renderer.d.ts.map +1 -1
- package/dist/wall/renderer.js +65 -8
- package/dist/wall/selection-hit-owner.d.ts +53 -0
- package/dist/wall/selection-hit-owner.d.ts.map +1 -0
- package/dist/wall/selection-hit-owner.js +79 -0
- package/dist/wall/system.d.ts +2 -0
- package/dist/wall/system.d.ts.map +1 -1
- package/dist/wall/system.js +66 -25
- package/dist/wall/tool.d.ts.map +1 -1
- package/dist/wall/tool.js +5 -0
- package/dist/wall/treatment-level-data.d.ts +6 -1
- package/dist/wall/treatment-level-data.d.ts.map +1 -1
- package/dist/wall/treatment-level-data.js +82 -5
- package/dist/wall/treatments.d.ts +1 -0
- package/dist/wall/treatments.d.ts.map +1 -1
- package/dist/wall/treatments.js +5 -0
- package/dist/wall/wall-batch-system.d.ts +38 -6
- package/dist/wall/wall-batch-system.d.ts.map +1 -1
- package/dist/wall/wall-batch-system.js +122 -25
- package/dist/wall/wall-batch.js +2 -2
- package/dist/window/definition.d.ts +2 -1
- package/dist/window/definition.d.ts.map +1 -1
- package/dist/window/definition.js +51 -24
- package/dist/window/floorplan-move.d.ts.map +1 -1
- package/dist/window/floorplan-move.js +1 -1
- package/dist/window/move-tool.d.ts +7 -5
- package/dist/window/move-tool.d.ts.map +1 -1
- package/dist/window/move-tool.js +344 -58
- package/dist/window/panel.d.ts.map +1 -1
- package/dist/window/panel.js +2 -0
- package/dist/window/parametrics.js +2 -2
- package/dist/window/renderer.d.ts.map +1 -1
- package/dist/window/renderer.js +5 -7
- package/dist/window/tool.d.ts.map +1 -1
- package/dist/window/tool.js +227 -13
- package/dist/zone/floorplan-affordances.d.ts +12 -12
- package/package.json +11 -9
- package/dist/dormer/panel-window-section.d.ts +0 -14
- package/dist/dormer/panel-window-section.d.ts.map +0 -1
- package/dist/dormer/panel-window-section.js +0 -59
- package/dist/dormer/window-assembly.d.ts +0 -22
- package/dist/dormer/window-assembly.d.ts.map +0 -1
- package/dist/dormer/window-assembly.js +0 -111
- package/dist/dormer/window-frame.d.ts +0 -24
- package/dist/dormer/window-frame.d.ts.map +0 -1
- package/dist/dormer/window-frame.js +0 -100
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CabinetModuleNode, CabinetNode, GeometryContext } from '@pascal-app/core';
|
|
1
|
+
import type { AnyNode, AnyNodeId, CabinetModuleNode, CabinetNode, GeometryContext } from '@pascal-app/core';
|
|
2
2
|
/**
|
|
3
3
|
* Straight-line run layout math — the single home for the "modules sit on the
|
|
4
4
|
* run's local X axis" assumption. Ordering, edges, adjacency, spans, and
|
|
@@ -8,13 +8,33 @@ import type { CabinetModuleNode, CabinetNode, GeometryContext } from '@pascal-ap
|
|
|
8
8
|
export declare const RUN_ADJACENCY_EPSILON = 0.0001;
|
|
9
9
|
type ModuleLike = Pick<CabinetModuleNode, 'id' | 'position' | 'width'>;
|
|
10
10
|
type ReflowRunModulesOptions = {
|
|
11
|
+
wallConstraints?: RunWallConstraints;
|
|
12
|
+
resizeSide?: 'left' | 'right';
|
|
13
|
+
consumeAdjacentGap?: boolean;
|
|
14
|
+
adjacentGapSide?: 'left' | 'right';
|
|
15
|
+
eligibleDonorIds?: ReadonlySet<CabinetModuleNode['id']>;
|
|
16
|
+
maximumWidth?: number;
|
|
17
|
+
maximumWidthById?: ReadonlyMap<CabinetModuleNode['id'], number>;
|
|
11
18
|
minimumWidth?: number;
|
|
12
|
-
|
|
19
|
+
minimumWidthById?: ReadonlyMap<CabinetModuleNode['id'], number>;
|
|
20
|
+
nominalWidthById?: ReadonlyMap<CabinetModuleNode['id'], number>;
|
|
13
21
|
restorableWidthById?: ReadonlyMap<CabinetModuleNode['id'], number>;
|
|
14
22
|
};
|
|
23
|
+
export type RunWallEndConstraint = {
|
|
24
|
+
constrained: boolean;
|
|
25
|
+
slack: number;
|
|
26
|
+
};
|
|
27
|
+
export type RunWallConstraints = {
|
|
28
|
+
left: RunWallEndConstraint;
|
|
29
|
+
right: RunWallEndConstraint;
|
|
30
|
+
};
|
|
31
|
+
type RunWallConstraintOptions = {
|
|
32
|
+
widthGrowth?: number;
|
|
33
|
+
};
|
|
15
34
|
export declare function sortRunModules<T extends ModuleLike>(modules: readonly T[]): T[];
|
|
16
35
|
export declare function moduleMinX(module: Pick<CabinetModuleNode, 'position' | 'width'>): number;
|
|
17
36
|
export declare function moduleMaxX(module: Pick<CabinetModuleNode, 'position' | 'width'>): number;
|
|
37
|
+
export declare function runWallConstraints(run: Pick<CabinetNode, 'depth' | 'parentId' | 'position' | 'rotation' | 'width'>, modules: readonly ModuleLike[], nodes: Readonly<Partial<Record<AnyNodeId, AnyNode>>>, options?: RunWallConstraintOptions): RunWallConstraints;
|
|
18
38
|
export declare function runMinX(modules: readonly ModuleLike[]): number;
|
|
19
39
|
export declare function runMaxX(modules: readonly ModuleLike[]): number;
|
|
20
40
|
/**
|
|
@@ -76,14 +96,80 @@ export declare function sideInsertX({ anchorModule, modules, side, width, epsilo
|
|
|
76
96
|
epsilon?: number;
|
|
77
97
|
}): number | null;
|
|
78
98
|
/**
|
|
79
|
-
* Re-pack the run
|
|
80
|
-
*
|
|
99
|
+
* Re-pack the run after one module's width changes. A single constrained end
|
|
100
|
+
* may consume its wall gap. When both ends are constrained, the run extent is
|
|
101
|
+
* fixed and eligible donors absorb the growth, nearest first. Manual edge
|
|
102
|
+
* resize may consume an open inter-module gap before shifting its neighbor.
|
|
103
|
+
* The change is rejected only when their combined capacity is insufficient.
|
|
81
104
|
*/
|
|
82
105
|
export declare function reflowRunModules<T extends ModuleLike>(modules: readonly T[], selectedId: CabinetModuleNode['id'], selectedWidth: number, options?: ReflowRunModulesOptions): Array<{
|
|
83
106
|
id: T['id'];
|
|
84
107
|
position: T['position'];
|
|
85
108
|
width: number;
|
|
86
109
|
}>;
|
|
110
|
+
export type RunModuleWidthEqualizationPlan<T extends ModuleLike> = {
|
|
111
|
+
ok: true;
|
|
112
|
+
changed: boolean;
|
|
113
|
+
targetWidth: number;
|
|
114
|
+
equalizedIds: T['id'][];
|
|
115
|
+
modules: Array<{
|
|
116
|
+
id: T['id'];
|
|
117
|
+
position: T['position'];
|
|
118
|
+
width: number;
|
|
119
|
+
}>;
|
|
120
|
+
} | {
|
|
121
|
+
ok: false;
|
|
122
|
+
reason: 'not-enough-modules' | 'width-limits';
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* Distribute a run's existing span evenly across the requested modules. The
|
|
126
|
+
* non-requested modules keep their widths, so fixed appliances and structural
|
|
127
|
+
* fillers remain part of the run without becoming resize targets.
|
|
128
|
+
*/
|
|
129
|
+
export declare function planRunModuleWidthEqualization<T extends ModuleLike>({ modules, equalizedIds, minimumWidthById, maximumWidthById, }: {
|
|
130
|
+
modules: readonly T[];
|
|
131
|
+
equalizedIds: ReadonlySet<T['id']>;
|
|
132
|
+
minimumWidthById?: ReadonlyMap<T['id'], number>;
|
|
133
|
+
maximumWidthById?: ReadonlyMap<T['id'], number>;
|
|
134
|
+
}): RunModuleWidthEqualizationPlan<T>;
|
|
135
|
+
export type RunModuleInsertionPlan<T extends ModuleLike> = {
|
|
136
|
+
ok: true;
|
|
137
|
+
inserted: {
|
|
138
|
+
id: T['id'];
|
|
139
|
+
position: T['position'];
|
|
140
|
+
width: number;
|
|
141
|
+
};
|
|
142
|
+
modules: Array<{
|
|
143
|
+
id: T['id'];
|
|
144
|
+
position: T['position'];
|
|
145
|
+
width: number;
|
|
146
|
+
}>;
|
|
147
|
+
pushedSide: 'left' | 'right' | null;
|
|
148
|
+
shrunkFillerIds: T['id'][];
|
|
149
|
+
} | {
|
|
150
|
+
ok: false;
|
|
151
|
+
reason: 'invalid-width' | 'duplicate-id' | 'no-space';
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* Plan inserting one module at a run-local X coordinate. Existing gaps are
|
|
155
|
+
* consumed first; a full run is re-packed toward the selected push side, with
|
|
156
|
+
* only eligible filler modules allowed to donate width when both ends are
|
|
157
|
+
* wall-constrained.
|
|
158
|
+
*/
|
|
159
|
+
export declare function planRunModuleInsertion<T extends ModuleLike>({ modules, insertion, wallConstraints, fillerIds, minimumFillerWidth, preserveEnd, preserveEnds, anchorInsertionSide, }: {
|
|
160
|
+
modules: readonly T[];
|
|
161
|
+
insertion: {
|
|
162
|
+
id: T['id'];
|
|
163
|
+
position: T['position'];
|
|
164
|
+
width: number;
|
|
165
|
+
};
|
|
166
|
+
wallConstraints?: RunWallConstraints;
|
|
167
|
+
fillerIds?: ReadonlySet<T['id']>;
|
|
168
|
+
minimumFillerWidth?: number;
|
|
169
|
+
preserveEnd?: 'left' | 'right';
|
|
170
|
+
preserveEnds?: Partial<Record<'left' | 'right', boolean>>;
|
|
171
|
+
anchorInsertionSide?: 'left' | 'right';
|
|
172
|
+
}): RunModuleInsertionPlan<T>;
|
|
87
173
|
/** Full-run bounds in run-local frame (X along the run). */
|
|
88
174
|
export declare function runLocalXExtent(modules: readonly ModuleLike[]): {
|
|
89
175
|
minX: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-layout.d.ts","sourceRoot":"","sources":["../../src/cabinet/run-layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"run-layout.d.ts","sourceRoot":"","sources":["../../src/cabinet/run-layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,iBAAiB,EACjB,WAAW,EACX,eAAe,EAEhB,MAAM,kBAAkB,CAAA;AAGzB;;;;;GAKG;AAEH,eAAO,MAAM,qBAAqB,SAAO,CAAA;AAMzC,KAAK,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE,IAAI,GAAG,UAAU,GAAG,OAAO,CAAC,CAAA;AAEtE,KAAK,uBAAuB,GAAG;IAC7B,eAAe,CAAC,EAAE,kBAAkB,CAAA;IACpC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IAC7B,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IAClC,gBAAgB,CAAC,EAAE,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAA;IACvD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;IAC/D,gBAAgB,CAAC,EAAE,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;IAC/D,mBAAmB,CAAC,EAAE,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;CACnE,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,OAAO,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,oBAAoB,CAAA;IAC1B,KAAK,EAAE,oBAAoB,CAAA;CAC5B,CAAA;AAED,KAAK,wBAAwB,GAAG;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAID,wBAAgB,cAAc,CAAC,CAAC,SAAS,UAAU,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAE/E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,MAAM,CAExF;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,MAAM,CAExF;AAgGD,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC,EAChF,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EACpD,OAAO,GAAE,wBAA6B,GACrC,kBAAkB,CAuBpB;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM,CAE9D;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM,CAE9D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,UAAU,EACjD,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GAAG,OAAO,EACtB,OAAO,SAAwB,GAC9B,OAAO,CAUT;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,OAAO,CAAA;CACvB,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,SAAS,IAAI,CACpB,iBAAiB,EACjB,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,eAAe,GAAG,aAAa,CACjE,EAAE,EACH,IAAI,GAAE;IACJ,OAAO,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAA;CAC5B,GACL,OAAO,EAAE,CA+CX;AAMD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,OAAO,GAChB;IAAE,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,IAAI,CAa7E;AAuFD,MAAM,MAAM,WAAW,GAAG;IACxB,0EAA0E;IAC1E,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,0EAA0E;IAC1E,WAAW,EAAE,OAAO,CAAA;IACpB,YAAY,EAAE,OAAO,CAAA;CACtB,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,eAAe,GAAG,SAAS,EAChC,KAAK,EAAE,SAAS,OAAO,EAAE,GACxB,WAAW,EAAE,CAwEf;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAC1B,YAAY,EACZ,OAAO,EACP,IAAI,EACJ,KAAK,EACL,OAA+B,GAChC,EAAE;IACD,YAAY,EAAE,UAAU,GAAG,IAAI,CAAA;IAC/B,OAAO,EAAE,SAAS,UAAU,EAAE,CAAA;IAC9B,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,GAAG,MAAM,GAAG,IAAI,CAiChB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,UAAU,EACnD,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC,EACnC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,uBAA4B,GACpC,KAAK,CAAC;IAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAAC,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAqLhE;AAED,MAAM,MAAM,8BAA8B,CAAC,CAAC,SAAS,UAAU,IAC3D;IACE,EAAE,EAAE,IAAI,CAAA;IACR,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA;IACvB,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAAC,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACxE,GACD;IACE,EAAE,EAAE,KAAK,CAAA;IACT,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAAA;CAC9C,CAAA;AAEL;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,CAAC,SAAS,UAAU,EAAE,EACnE,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,GACjB,EAAE;IACD,OAAO,EAAE,SAAS,CAAC,EAAE,CAAA;IACrB,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IAClC,gBAAgB,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;IAC/C,gBAAgB,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;CAChD,GAAG,8BAA8B,CAAC,CAAC,CAAC,CAsDpC;AAED,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,UAAU,IACnD;IACE,EAAE,EAAE,IAAI,CAAA;IACR,QAAQ,EAAE;QAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAAC,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IACjE,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAAC,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACvE,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;IACnC,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA;CAC3B,GACD;IACE,EAAE,EAAE,KAAK,CAAA;IACT,MAAM,EAAE,eAAe,GAAG,cAAc,GAAG,UAAU,CAAA;CACtD,CAAA;AAEL;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,UAAU,EAAE,EAC3D,OAAO,EACP,SAAS,EACT,eAAe,EACf,SAA8B,EAC9B,kBAAyB,EACzB,WAAW,EACX,YAAY,EACZ,mBAAmB,GACpB,EAAE;IACD,OAAO,EAAE,SAAS,CAAC,EAAE,CAAA;IACrB,SAAS,EAAE;QAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAAC,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IAClE,eAAe,CAAC,EAAE,kBAAkB,CAAA;IACpC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;IACzD,mBAAmB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CACvC,GAAG,sBAAsB,CAAC,CAAC,CAAC,CA0I5B;AAED,4DAA4D;AAC5D,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG;IAC/D,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd,GAAG,IAAI,CAKP;AAED,MAAM,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,UAAU,CAAC,CAAA;AAEhE,wEAAwE;AACxE,wBAAgB,cAAc,CAC5B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GACvC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAS1B;AAED,yCAAyC;AACzC,wBAAgB,cAAc,CAC5B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAM1B"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { resolveLevelId } from '@pascal-app/core';
|
|
1
2
|
/**
|
|
2
3
|
* Straight-line run layout math — the single home for the "modules sit on the
|
|
3
4
|
* run's local X axis" assumption. Ordering, edges, adjacency, spans, and
|
|
@@ -7,6 +8,8 @@
|
|
|
7
8
|
export const RUN_ADJACENCY_EPSILON = 1e-4;
|
|
8
9
|
const ADJACENT_RUN_EPSILON = 1e-4;
|
|
9
10
|
const ADJACENT_RUN_Z_TOLERANCE = 0.03;
|
|
11
|
+
const REFLOW_CAPACITY_EPSILON = 1e-9;
|
|
12
|
+
const OPEN_RUN_END = { constrained: false, slack: 0 };
|
|
10
13
|
export function sortRunModules(modules) {
|
|
11
14
|
return [...modules].sort((a, b) => a.position[0] - b.position[0]);
|
|
12
15
|
}
|
|
@@ -16,6 +19,98 @@ export function moduleMinX(module) {
|
|
|
16
19
|
export function moduleMaxX(module) {
|
|
17
20
|
return module.position[0] + module.width / 2;
|
|
18
21
|
}
|
|
22
|
+
function levelIdForRun(run, nodes) {
|
|
23
|
+
let parentId = run.parentId;
|
|
24
|
+
const visited = new Set();
|
|
25
|
+
while (parentId && !visited.has(parentId)) {
|
|
26
|
+
visited.add(parentId);
|
|
27
|
+
const parent = nodes[parentId];
|
|
28
|
+
if (!parent)
|
|
29
|
+
return null;
|
|
30
|
+
if (parent.type === 'level')
|
|
31
|
+
return parent.id;
|
|
32
|
+
parentId = parent.parentId;
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
function runInLevelFrame(run, nodes) {
|
|
37
|
+
let position = [...run.position];
|
|
38
|
+
let rotation = run.rotation;
|
|
39
|
+
let parentId = run.parentId;
|
|
40
|
+
const visited = new Set();
|
|
41
|
+
while (parentId && !visited.has(parentId)) {
|
|
42
|
+
visited.add(parentId);
|
|
43
|
+
const parent = nodes[parentId];
|
|
44
|
+
if (parent?.type !== 'cabinet' && parent?.type !== 'cabinet-module')
|
|
45
|
+
break;
|
|
46
|
+
position = runLocalToPlan(parent, position);
|
|
47
|
+
rotation += parent.rotation;
|
|
48
|
+
parentId = parent.parentId;
|
|
49
|
+
}
|
|
50
|
+
return { depth: run.depth, position, rotation };
|
|
51
|
+
}
|
|
52
|
+
function closestPointOnSegment(point, start, end) {
|
|
53
|
+
const dx = end[0] - start[0];
|
|
54
|
+
const dz = end[1] - start[1];
|
|
55
|
+
const lengthSquared = dx * dx + dz * dz;
|
|
56
|
+
if (lengthSquared <= 1e-8)
|
|
57
|
+
return start;
|
|
58
|
+
const t = Math.max(0, Math.min(1, ((point[0] - start[0]) * dx + (point[1] - start[1]) * dz) / lengthSquared));
|
|
59
|
+
return [start[0] + t * dx, start[1] + t * dz];
|
|
60
|
+
}
|
|
61
|
+
function wallConstraintAtRunEnd({ endX, run, side, walls, widthGrowth, }) {
|
|
62
|
+
const worldPoint = runLocalToPlan(run, [endX, 0, 0]);
|
|
63
|
+
const point = [worldPoint[0], worldPoint[2]];
|
|
64
|
+
const runAxis = [Math.cos(run.rotation), -Math.sin(run.rotation)];
|
|
65
|
+
const maxDistance = Math.max(run.depth / 2 + 0.08, widthGrowth);
|
|
66
|
+
const direction = side === 'left' ? -1 : 1;
|
|
67
|
+
let closestSlack = Number.POSITIVE_INFINITY;
|
|
68
|
+
for (const wall of walls) {
|
|
69
|
+
const dx = wall.end[0] - wall.start[0];
|
|
70
|
+
const dz = wall.end[1] - wall.start[1];
|
|
71
|
+
const length = Math.hypot(dx, dz);
|
|
72
|
+
if (length <= 1e-6)
|
|
73
|
+
continue;
|
|
74
|
+
const wallAxis = [dx / length, dz / length];
|
|
75
|
+
const axisDot = runAxis[0] * wallAxis[0] + runAxis[1] * wallAxis[1];
|
|
76
|
+
if (Math.abs(axisDot) > 0.2)
|
|
77
|
+
continue;
|
|
78
|
+
const closest = closestPointOnSegment(point, wall.start, wall.end);
|
|
79
|
+
const offsetX = (closest[0] - point[0]) * runAxis[0] + (closest[1] - point[1]) * runAxis[1];
|
|
80
|
+
const halfThickness = ((wall.thickness ?? 0.2) / 2) * Math.sqrt(1 - axisDot * axisDot);
|
|
81
|
+
const distance = Math.hypot(point[0] - closest[0], point[1] - closest[1]);
|
|
82
|
+
if (distance > maxDistance + (wall.thickness ?? 0.2) / 2 + RUN_ADJACENCY_EPSILON)
|
|
83
|
+
continue;
|
|
84
|
+
if (direction * offsetX < -halfThickness - RUN_ADJACENCY_EPSILON)
|
|
85
|
+
continue;
|
|
86
|
+
const slack = Math.max(0, direction * offsetX - halfThickness);
|
|
87
|
+
closestSlack = Math.min(closestSlack, slack);
|
|
88
|
+
}
|
|
89
|
+
return Number.isFinite(closestSlack) ? { constrained: true, slack: closestSlack } : OPEN_RUN_END;
|
|
90
|
+
}
|
|
91
|
+
export function runWallConstraints(run, modules, nodes, options = {}) {
|
|
92
|
+
const levelId = levelIdForRun(run, nodes);
|
|
93
|
+
if (!levelId)
|
|
94
|
+
return { left: OPEN_RUN_END, right: OPEN_RUN_END };
|
|
95
|
+
const walls = Object.values(nodes).filter((node) => node?.type === 'wall' &&
|
|
96
|
+
resolveLevelId(node, nodes) === levelId);
|
|
97
|
+
if (walls.length === 0)
|
|
98
|
+
return { left: OPEN_RUN_END, right: OPEN_RUN_END };
|
|
99
|
+
const minX = modules.length > 0 ? runMinX(modules) : -run.width / 2;
|
|
100
|
+
const maxX = modules.length > 0 ? runMaxX(modules) : run.width / 2;
|
|
101
|
+
const levelRun = runInLevelFrame(run, nodes);
|
|
102
|
+
const widthGrowth = Math.max(0, options.widthGrowth ?? 0);
|
|
103
|
+
return {
|
|
104
|
+
left: wallConstraintAtRunEnd({ endX: minX, run: levelRun, side: 'left', walls, widthGrowth }),
|
|
105
|
+
right: wallConstraintAtRunEnd({
|
|
106
|
+
endX: maxX,
|
|
107
|
+
run: levelRun,
|
|
108
|
+
side: 'right',
|
|
109
|
+
walls,
|
|
110
|
+
widthGrowth,
|
|
111
|
+
}),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
19
114
|
export function runMinX(modules) {
|
|
20
115
|
return Math.min(...modules.map(moduleMinX));
|
|
21
116
|
}
|
|
@@ -282,8 +377,11 @@ export function sideInsertX({ anchorModule, modules, side, width, epsilon = RUN_
|
|
|
282
377
|
return selectedRight + width / 2;
|
|
283
378
|
}
|
|
284
379
|
/**
|
|
285
|
-
* Re-pack the run
|
|
286
|
-
*
|
|
380
|
+
* Re-pack the run after one module's width changes. A single constrained end
|
|
381
|
+
* may consume its wall gap. When both ends are constrained, the run extent is
|
|
382
|
+
* fixed and eligible donors absorb the growth, nearest first. Manual edge
|
|
383
|
+
* resize may consume an open inter-module gap before shifting its neighbor.
|
|
384
|
+
* The change is rejected only when their combined capacity is insufficient.
|
|
287
385
|
*/
|
|
288
386
|
export function reflowRunModules(modules, selectedId, selectedWidth, options = {}) {
|
|
289
387
|
const sorted = sortRunModules(modules);
|
|
@@ -293,50 +391,337 @@ export function reflowRunModules(modules, selectedId, selectedWidth, options = {
|
|
|
293
391
|
const widths = new Map(sorted.map((module) => [module.id, module.width]));
|
|
294
392
|
widths.set(selectedId, selectedWidth);
|
|
295
393
|
const selected = sorted[selectedIndex];
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
394
|
+
const gaps = sorted.map((module, index) => {
|
|
395
|
+
const next = sorted[index + 1];
|
|
396
|
+
if (!next)
|
|
397
|
+
return 0;
|
|
398
|
+
return Math.max(0, moduleMinX(next) - moduleMaxX(module));
|
|
399
|
+
});
|
|
400
|
+
const wallConstraints = options.wallConstraints;
|
|
401
|
+
const leftConstrained = wallConstraints?.left.constrained ?? false;
|
|
402
|
+
const rightConstrained = wallConstraints?.right.constrained ?? false;
|
|
403
|
+
const preserveExtent = leftConstrained && rightConstrained;
|
|
404
|
+
const widthGrowth = selectedWidth - selected.width;
|
|
405
|
+
let remainingGrowth = Math.max(0, widthGrowth);
|
|
406
|
+
const resizeSide = options.resizeSide;
|
|
407
|
+
const layoutGaps = [...gaps];
|
|
408
|
+
let consumedAdjacentGap = 0;
|
|
409
|
+
if (options.consumeAdjacentGap && widthGrowth > REFLOW_CAPACITY_EPSILON && resizeSide) {
|
|
410
|
+
const adjacentGapSide = options.adjacentGapSide ?? resizeSide;
|
|
411
|
+
const adjacentGapIndex = adjacentGapSide === 'right' ? selectedIndex : selectedIndex - 1;
|
|
412
|
+
if (adjacentGapIndex >= 0 && adjacentGapIndex < layoutGaps.length) {
|
|
413
|
+
const adjacentGap = layoutGaps[adjacentGapIndex] ?? 0;
|
|
414
|
+
consumedAdjacentGap = Math.min(widthGrowth, adjacentGap);
|
|
415
|
+
layoutGaps[adjacentGapIndex] = adjacentGap - consumedAdjacentGap;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
remainingGrowth -= consumedAdjacentGap;
|
|
419
|
+
const consumedRightSlack = rightConstrained && (!preserveExtent || resizeSide === 'right')
|
|
420
|
+
? Math.min(remainingGrowth, Math.max(0, wallConstraints?.right.slack ?? 0))
|
|
421
|
+
: 0;
|
|
422
|
+
remainingGrowth -= consumedRightSlack;
|
|
423
|
+
const consumedLeftSlack = leftConstrained && (!preserveExtent || resizeSide === 'left')
|
|
424
|
+
? Math.min(remainingGrowth, Math.max(0, wallConstraints?.left.slack ?? 0))
|
|
425
|
+
: 0;
|
|
426
|
+
remainingGrowth -= consumedLeftSlack;
|
|
427
|
+
if (preserveExtent && remainingGrowth > REFLOW_CAPACITY_EPSILON) {
|
|
428
|
+
const defaultMinimumWidth = options.minimumWidth ?? 0.3;
|
|
429
|
+
const minimumWidth = (module) => options.minimumWidthById?.get(module.id) ?? defaultMinimumWidth;
|
|
430
|
+
const donors = sorted
|
|
431
|
+
.map((module, index) => ({ index, module }))
|
|
432
|
+
.filter(({ module }) => module.id !== selectedId &&
|
|
433
|
+
(!options.eligibleDonorIds || options.eligibleDonorIds.has(module.id)) &&
|
|
434
|
+
module.width - minimumWidth(module) > REFLOW_CAPACITY_EPSILON)
|
|
435
|
+
.sort((a, b) => {
|
|
436
|
+
const distance = Math.abs(a.index - selectedIndex) - Math.abs(b.index - selectedIndex);
|
|
437
|
+
if (distance !== 0)
|
|
438
|
+
return distance;
|
|
439
|
+
const capacity = Math.max(0, b.module.width - Math.max(defaultMinimumWidth, minimumWidth(b.module))) -
|
|
440
|
+
Math.max(0, a.module.width - Math.max(defaultMinimumWidth, minimumWidth(a.module)));
|
|
441
|
+
if (capacity !== 0)
|
|
442
|
+
return capacity;
|
|
443
|
+
return b.index - a.index;
|
|
444
|
+
});
|
|
445
|
+
const available = donors.reduce((total, { module }) => total + Math.max(0, module.width - minimumWidth(module)), 0);
|
|
446
|
+
if (available + REFLOW_CAPACITY_EPSILON < remainingGrowth)
|
|
447
|
+
return [];
|
|
448
|
+
for (const useTrimCapacity of [false, true]) {
|
|
449
|
+
for (const { module } of donors) {
|
|
450
|
+
if (remainingGrowth <= REFLOW_CAPACITY_EPSILON)
|
|
451
|
+
break;
|
|
452
|
+
const currentWidth = widths.get(module.id) ?? module.width;
|
|
453
|
+
const floor = useTrimCapacity
|
|
454
|
+
? minimumWidth(module)
|
|
455
|
+
: Math.min(currentWidth, Math.max(defaultMinimumWidth, minimumWidth(module)));
|
|
456
|
+
const donation = Math.min(Math.max(0, currentWidth - floor), remainingGrowth);
|
|
457
|
+
widths.set(module.id, Math.max(floor, currentWidth - donation));
|
|
458
|
+
remainingGrowth -= donation;
|
|
459
|
+
}
|
|
310
460
|
}
|
|
311
461
|
}
|
|
312
462
|
let remainingFreedWidth = selected.width - selectedWidth;
|
|
313
|
-
if (
|
|
314
|
-
remainingFreedWidth > RUN_ADJACENCY_EPSILON &&
|
|
315
|
-
options.restorableWidthById) {
|
|
463
|
+
if (remainingFreedWidth > REFLOW_CAPACITY_EPSILON) {
|
|
316
464
|
const left = sorted.slice(0, selectedIndex).reverse();
|
|
317
465
|
const right = sorted.slice(selectedIndex + 1);
|
|
318
466
|
const restorable = (candidates) => candidates.reduce((total, module) => total + (options.restorableWidthById?.get(module.id) ?? 0), 0);
|
|
319
467
|
const candidates = restorable(left) > restorable(right) ? [...left, ...right] : [...right, ...left];
|
|
320
468
|
for (const module of candidates) {
|
|
321
|
-
if (remainingFreedWidth <=
|
|
469
|
+
if (remainingFreedWidth <= REFLOW_CAPACITY_EPSILON)
|
|
322
470
|
break;
|
|
323
|
-
const available = Math.max(0, options.restorableWidthById
|
|
471
|
+
const available = Math.max(0, options.restorableWidthById?.get(module.id) ?? 0);
|
|
324
472
|
const restoration = Math.min(available, remainingFreedWidth);
|
|
325
473
|
widths.set(module.id, module.width + restoration);
|
|
326
474
|
remainingFreedWidth -= restoration;
|
|
327
475
|
}
|
|
476
|
+
if (preserveExtent && remainingFreedWidth > REFLOW_CAPACITY_EPSILON) {
|
|
477
|
+
const maximumWidth = options.maximumWidth ?? 1.2;
|
|
478
|
+
const fallbackCandidates = sorted
|
|
479
|
+
.map((module, index) => ({ index, module }))
|
|
480
|
+
.filter(({ module }) => module.id !== selectedId &&
|
|
481
|
+
(!options.eligibleDonorIds || options.eligibleDonorIds.has(module.id)))
|
|
482
|
+
.sort((a, b) => {
|
|
483
|
+
const distance = Math.abs(a.index - selectedIndex) - Math.abs(b.index - selectedIndex);
|
|
484
|
+
if (distance !== 0)
|
|
485
|
+
return distance;
|
|
486
|
+
return b.index - a.index;
|
|
487
|
+
});
|
|
488
|
+
const available = fallbackCandidates.reduce((total, { module }) => {
|
|
489
|
+
const currentWidth = widths.get(module.id) ?? module.width;
|
|
490
|
+
const moduleMaximum = options.maximumWidthById?.get(module.id) ?? maximumWidth;
|
|
491
|
+
return total + Math.max(0, moduleMaximum - currentWidth);
|
|
492
|
+
}, 0);
|
|
493
|
+
if (available + REFLOW_CAPACITY_EPSILON < remainingFreedWidth)
|
|
494
|
+
return [];
|
|
495
|
+
const absorbFreedWidth = (receivers, maximumFor) => {
|
|
496
|
+
for (const { module } of receivers) {
|
|
497
|
+
if (remainingFreedWidth <= REFLOW_CAPACITY_EPSILON)
|
|
498
|
+
break;
|
|
499
|
+
const currentWidth = widths.get(module.id) ?? module.width;
|
|
500
|
+
const restoration = Math.min(Math.max(0, maximumFor(module) - currentWidth), remainingFreedWidth);
|
|
501
|
+
widths.set(module.id, currentWidth + restoration);
|
|
502
|
+
remainingFreedWidth -= restoration;
|
|
503
|
+
}
|
|
504
|
+
};
|
|
505
|
+
absorbFreedWidth(fallbackCandidates, (module) => options.nominalWidthById?.get(module.id) ?? module.width);
|
|
506
|
+
absorbFreedWidth(fallbackCandidates, (module) => options.maximumWidthById?.get(module.id) ?? maximumWidth);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
const totalWidth = sorted.reduce((total, module, index) => total + (widths.get(module.id) ?? 0) + (layoutGaps[index] ?? 0), 0);
|
|
510
|
+
let nextLeft = runMinX(sorted) - consumedLeftSlack;
|
|
511
|
+
const preserveRightEdge = options.resizeSide === 'left';
|
|
512
|
+
const preserveLeftEdge = options.resizeSide === 'right';
|
|
513
|
+
if (rightConstrained && !leftConstrained) {
|
|
514
|
+
nextLeft = runMaxX(sorted) + consumedRightSlack - totalWidth;
|
|
515
|
+
}
|
|
516
|
+
else if (leftConstrained && !rightConstrained) {
|
|
517
|
+
nextLeft = runMinX(sorted) - consumedLeftSlack;
|
|
518
|
+
}
|
|
519
|
+
else if (preserveExtent && resizeSide === 'right') {
|
|
520
|
+
nextLeft = runMinX(sorted) - consumedLeftSlack;
|
|
521
|
+
}
|
|
522
|
+
else if (preserveExtent && resizeSide === 'left') {
|
|
523
|
+
nextLeft = runMaxX(sorted) + consumedRightSlack - totalWidth;
|
|
524
|
+
}
|
|
525
|
+
else if (preserveRightEdge) {
|
|
526
|
+
nextLeft = runMaxX(sorted) - totalWidth;
|
|
328
527
|
}
|
|
329
|
-
|
|
330
|
-
|
|
528
|
+
else if (preserveLeftEdge || (!leftConstrained && !rightConstrained && selectedIndex === 0)) {
|
|
529
|
+
nextLeft = preserveLeftEdge ? runMinX(sorted) - consumedLeftSlack : runMaxX(sorted) - totalWidth;
|
|
530
|
+
}
|
|
531
|
+
return sorted.map((module, index) => {
|
|
331
532
|
const width = widths.get(module.id) ?? module.width;
|
|
332
533
|
const position = [
|
|
333
534
|
nextLeft + width / 2,
|
|
334
535
|
module.position[1],
|
|
335
536
|
module.position[2],
|
|
336
537
|
];
|
|
538
|
+
nextLeft += width + (layoutGaps[index] ?? 0);
|
|
539
|
+
return { id: module.id, position, width };
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* Distribute a run's existing span evenly across the requested modules. The
|
|
544
|
+
* non-requested modules keep their widths, so fixed appliances and structural
|
|
545
|
+
* fillers remain part of the run without becoming resize targets.
|
|
546
|
+
*/
|
|
547
|
+
export function planRunModuleWidthEqualization({ modules, equalizedIds, minimumWidthById, maximumWidthById, }) {
|
|
548
|
+
const sorted = sortRunModules(modules);
|
|
549
|
+
const targets = sorted.filter((module) => equalizedIds.has(module.id));
|
|
550
|
+
if (targets.length < 2)
|
|
551
|
+
return { ok: false, reason: 'not-enough-modules' };
|
|
552
|
+
const minX = runMinX(sorted);
|
|
553
|
+
const maxX = runMaxX(sorted);
|
|
554
|
+
const span = maxX - minX;
|
|
555
|
+
const fixedWidth = sorted
|
|
556
|
+
.filter((module) => !equalizedIds.has(module.id))
|
|
557
|
+
.reduce((total, module) => total + module.width, 0);
|
|
558
|
+
const targetWidth = (span - fixedWidth) / targets.length;
|
|
559
|
+
if (!Number.isFinite(targetWidth) || targetWidth <= REFLOW_CAPACITY_EPSILON) {
|
|
560
|
+
return { ok: false, reason: 'width-limits' };
|
|
561
|
+
}
|
|
562
|
+
for (const module of targets) {
|
|
563
|
+
const minimum = minimumWidthById?.get(module.id) ?? 0.3;
|
|
564
|
+
const maximum = maximumWidthById?.get(module.id) ?? 1.2;
|
|
565
|
+
if (targetWidth < minimum - RUN_ADJACENCY_EPSILON) {
|
|
566
|
+
return { ok: false, reason: 'width-limits' };
|
|
567
|
+
}
|
|
568
|
+
if (targetWidth > maximum + RUN_ADJACENCY_EPSILON) {
|
|
569
|
+
return { ok: false, reason: 'width-limits' };
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
let nextLeft = minX;
|
|
573
|
+
const equalizedIdList = targets.map((module) => module.id);
|
|
574
|
+
const currentById = new Map(sorted.map((module) => [module.id, module]));
|
|
575
|
+
const planned = sorted.map((module) => {
|
|
576
|
+
const width = equalizedIds.has(module.id) ? targetWidth : module.width;
|
|
577
|
+
const position = [
|
|
578
|
+
nextLeft + width / 2,
|
|
579
|
+
module.position[1],
|
|
580
|
+
module.position[2],
|
|
581
|
+
];
|
|
337
582
|
nextLeft += width;
|
|
338
583
|
return { id: module.id, position, width };
|
|
339
584
|
});
|
|
585
|
+
const changed = planned.some((module) => Math.abs(module.width - (currentById.get(module.id)?.width ?? 0)) > RUN_ADJACENCY_EPSILON ||
|
|
586
|
+
Math.abs(module.position[0] - (currentById.get(module.id)?.position[0] ?? 0)) >
|
|
587
|
+
RUN_ADJACENCY_EPSILON);
|
|
588
|
+
return {
|
|
589
|
+
ok: true,
|
|
590
|
+
changed,
|
|
591
|
+
targetWidth,
|
|
592
|
+
equalizedIds: equalizedIdList,
|
|
593
|
+
modules: planned,
|
|
594
|
+
};
|
|
595
|
+
}
|
|
596
|
+
/**
|
|
597
|
+
* Plan inserting one module at a run-local X coordinate. Existing gaps are
|
|
598
|
+
* consumed first; a full run is re-packed toward the selected push side, with
|
|
599
|
+
* only eligible filler modules allowed to donate width when both ends are
|
|
600
|
+
* wall-constrained.
|
|
601
|
+
*/
|
|
602
|
+
export function planRunModuleInsertion({ modules, insertion, wallConstraints, fillerIds = new Set(), minimumFillerWidth = 0.05, preserveEnd, preserveEnds, anchorInsertionSide, }) {
|
|
603
|
+
if (!Number.isFinite(insertion.width) || insertion.width <= REFLOW_CAPACITY_EPSILON) {
|
|
604
|
+
return { ok: false, reason: 'invalid-width' };
|
|
605
|
+
}
|
|
606
|
+
if (modules.some((module) => module.id === insertion.id)) {
|
|
607
|
+
return { ok: false, reason: 'duplicate-id' };
|
|
608
|
+
}
|
|
609
|
+
const sorted = sortRunModules(modules);
|
|
610
|
+
const insertionIndexAtCursor = sorted.findIndex((module) => moduleMaxX(module) > insertion.position[0] + RUN_ADJACENCY_EPSILON);
|
|
611
|
+
const normalizedIndexAtCursor = insertionIndexAtCursor < 0 ? sorted.length : insertionIndexAtCursor;
|
|
612
|
+
const leftAtCursor = sorted[normalizedIndexAtCursor - 1];
|
|
613
|
+
const rightAtCursor = sorted[normalizedIndexAtCursor];
|
|
614
|
+
const halfWidth = insertion.width / 2;
|
|
615
|
+
const anchoredInsertion = anchorInsertionSide && leftAtCursor && rightAtCursor
|
|
616
|
+
? {
|
|
617
|
+
...insertion,
|
|
618
|
+
position: [
|
|
619
|
+
anchorInsertionSide === 'left'
|
|
620
|
+
? moduleMaxX(leftAtCursor) + halfWidth
|
|
621
|
+
: moduleMinX(rightAtCursor) - halfWidth,
|
|
622
|
+
insertion.position[1],
|
|
623
|
+
insertion.position[2],
|
|
624
|
+
],
|
|
625
|
+
}
|
|
626
|
+
: insertion;
|
|
627
|
+
const insertionX = anchoredInsertion.position[0];
|
|
628
|
+
const normalizedIndex = normalizedIndexAtCursor;
|
|
629
|
+
const left = leftAtCursor;
|
|
630
|
+
const right = rightAtCursor;
|
|
631
|
+
const leftGap = left ? insertionX - moduleMaxX(left) : Number.POSITIVE_INFINITY;
|
|
632
|
+
const rightGap = right ? moduleMinX(right) - insertionX : Number.POSITIVE_INFINITY;
|
|
633
|
+
const fitsAtRequestedPosition = leftGap >= halfWidth - RUN_ADJACENCY_EPSILON && rightGap >= halfWidth - RUN_ADJACENCY_EPSILON;
|
|
634
|
+
if (fitsAtRequestedPosition) {
|
|
635
|
+
return {
|
|
636
|
+
ok: true,
|
|
637
|
+
inserted: anchoredInsertion,
|
|
638
|
+
modules: sorted.map((module) => ({
|
|
639
|
+
id: module.id,
|
|
640
|
+
position: module.position,
|
|
641
|
+
width: module.width,
|
|
642
|
+
})),
|
|
643
|
+
pushedSide: null,
|
|
644
|
+
shrunkFillerIds: [],
|
|
645
|
+
};
|
|
646
|
+
}
|
|
647
|
+
const preserveLeftEnd = preserveEnds?.left === true || preserveEnd === 'left';
|
|
648
|
+
const preserveRightEnd = preserveEnds?.right === true || preserveEnd === 'right';
|
|
649
|
+
const effectiveWallConstraints = {
|
|
650
|
+
left: preserveLeftEnd
|
|
651
|
+
? { constrained: true, slack: 0 }
|
|
652
|
+
: (wallConstraints?.left ?? OPEN_RUN_END),
|
|
653
|
+
right: preserveRightEnd
|
|
654
|
+
? { constrained: true, slack: 0 }
|
|
655
|
+
: (wallConstraints?.right ?? OPEN_RUN_END),
|
|
656
|
+
};
|
|
657
|
+
const leftConstrained = effectiveWallConstraints.left.constrained;
|
|
658
|
+
const rightConstrained = effectiveWallConstraints.right.constrained;
|
|
659
|
+
const leftCapacity = leftConstrained
|
|
660
|
+
? Math.max(0, effectiveWallConstraints.left.slack)
|
|
661
|
+
: Number.POSITIVE_INFINITY;
|
|
662
|
+
const rightCapacity = rightConstrained
|
|
663
|
+
? Math.max(0, effectiveWallConstraints.right.slack)
|
|
664
|
+
: Number.POSITIVE_INFINITY;
|
|
665
|
+
const pushedSide = preserveRightEnd && !preserveLeftEnd
|
|
666
|
+
? 'left'
|
|
667
|
+
: preserveLeftEnd && !preserveRightEnd
|
|
668
|
+
? 'right'
|
|
669
|
+
: rightCapacity > leftCapacity + RUN_ADJACENCY_EPSILON
|
|
670
|
+
? 'right'
|
|
671
|
+
: leftCapacity > rightCapacity + RUN_ADJACENCY_EPSILON
|
|
672
|
+
? 'left'
|
|
673
|
+
: rightConstrained && !leftConstrained
|
|
674
|
+
? 'left'
|
|
675
|
+
: 'right';
|
|
676
|
+
const provisionalPosition = left && right
|
|
677
|
+
? [
|
|
678
|
+
anchorInsertionSide === 'right' ? moduleMinX(right) : moduleMaxX(left),
|
|
679
|
+
anchoredInsertion.position[1],
|
|
680
|
+
anchoredInsertion.position[2],
|
|
681
|
+
]
|
|
682
|
+
: anchoredInsertion.position;
|
|
683
|
+
const provisional = {
|
|
684
|
+
id: insertion.id,
|
|
685
|
+
position: provisionalPosition,
|
|
686
|
+
width: 0,
|
|
687
|
+
};
|
|
688
|
+
const combined = [
|
|
689
|
+
...sorted.slice(0, normalizedIndex),
|
|
690
|
+
provisional,
|
|
691
|
+
...sorted.slice(normalizedIndex),
|
|
692
|
+
];
|
|
693
|
+
const reflowed = reflowRunModules(combined, insertion.id, insertion.width, {
|
|
694
|
+
wallConstraints: effectiveWallConstraints,
|
|
695
|
+
resizeSide: pushedSide,
|
|
696
|
+
consumeAdjacentGap: leftGap > RUN_ADJACENCY_EPSILON || rightGap > RUN_ADJACENCY_EPSILON,
|
|
697
|
+
adjacentGapSide: pushedSide === 'right'
|
|
698
|
+
? leftGap > RUN_ADJACENCY_EPSILON
|
|
699
|
+
? 'left'
|
|
700
|
+
: 'right'
|
|
701
|
+
: rightGap > RUN_ADJACENCY_EPSILON
|
|
702
|
+
? 'right'
|
|
703
|
+
: 'left',
|
|
704
|
+
eligibleDonorIds: fillerIds,
|
|
705
|
+
minimumWidthById: new Map([...fillerIds].map((id) => [id, minimumFillerWidth])),
|
|
706
|
+
});
|
|
707
|
+
if (reflowed.length !== combined.length)
|
|
708
|
+
return { ok: false, reason: 'no-space' };
|
|
709
|
+
const plannedInserted = reflowed.find((module) => module.id === insertion.id);
|
|
710
|
+
if (!plannedInserted || plannedInserted.width <= REFLOW_CAPACITY_EPSILON) {
|
|
711
|
+
return { ok: false, reason: 'no-space' };
|
|
712
|
+
}
|
|
713
|
+
const originalWidths = new Map(sorted.map((module) => [module.id, module.width]));
|
|
714
|
+
const shrunkFillerIds = reflowed
|
|
715
|
+
.filter((module) => fillerIds.has(module.id) &&
|
|
716
|
+
module.width < (originalWidths.get(module.id) ?? module.width) - REFLOW_CAPACITY_EPSILON)
|
|
717
|
+
.map((module) => module.id);
|
|
718
|
+
return {
|
|
719
|
+
ok: true,
|
|
720
|
+
inserted: plannedInserted,
|
|
721
|
+
modules: reflowed.filter((module) => module.id !== insertion.id),
|
|
722
|
+
pushedSide,
|
|
723
|
+
shrunkFillerIds,
|
|
724
|
+
};
|
|
340
725
|
}
|
|
341
726
|
/** Full-run bounds in run-local frame (X along the run). */
|
|
342
727
|
export function runLocalXExtent(modules) {
|