@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
|
@@ -19,8 +19,8 @@ export const ductTerminalParametrics = {
|
|
|
19
19
|
{
|
|
20
20
|
label: 'Face',
|
|
21
21
|
fields: [
|
|
22
|
-
{ key: 'width', kind: 'number', unit: 'm', min: 0.1, max:
|
|
23
|
-
{ key: 'depth', kind: 'number', unit: 'm', min: 0.05, max:
|
|
22
|
+
{ key: 'width', kind: 'number', unit: 'm', min: 0.1, max: 1000, step: 0.05 },
|
|
23
|
+
{ key: 'depth', kind: 'number', unit: 'm', min: 0.05, max: 1000, step: 0.05 },
|
|
24
24
|
],
|
|
25
25
|
},
|
|
26
26
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/duct-terminal/tool.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/duct-terminal/tool.tsx"],"names":[],"mappings":"AAgJA;;;;;;;;;GASG;AACH,QAAA,MAAM,gBAAgB,0CAgUrB,CAAA;AAED,eAAe,gBAAgB,CAAA"}
|
|
@@ -7,12 +7,14 @@ import { Html } from '@react-three/drei';
|
|
|
7
7
|
import { useThree } from '@react-three/fiber';
|
|
8
8
|
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
9
9
|
import { Euler, Matrix3, Matrix4, Plane, Quaternion, Raycaster, Vector2, Vector3 } from 'three';
|
|
10
|
+
import { subscribeAccessorySnapping } from '../shared/accessory-snapping';
|
|
11
|
+
import { ConnectionFeedback } from '../shared/connection-feedback';
|
|
10
12
|
import { alignDrawPoint, clearDrawAlignment } from '../shared/draw-alignment';
|
|
11
13
|
import { LevelOffsetGroup } from '../shared/level-offset-group';
|
|
12
|
-
import { collectScenePorts, DUCT_PORT_SYSTEMS,
|
|
14
|
+
import { collectScenePorts, DUCT_PORT_SYSTEMS, findNearestPort3D } from '../shared/ports';
|
|
13
15
|
import { ductTerminalDefinition } from './definition';
|
|
14
16
|
import { buildDuctTerminalGeometry } from './geometry';
|
|
15
|
-
import { COLLAR_LENGTH, mountQuaternion } from './ports';
|
|
17
|
+
import { COLLAR_LENGTH, getDuctTerminalPorts, mountQuaternion } from './ports';
|
|
16
18
|
const PREVIEW_OPACITY = 0.55;
|
|
17
19
|
/** R/T yaw step — 45°. */
|
|
18
20
|
const ROTATE_STEP_RAD = Math.PI / 4;
|
|
@@ -70,15 +72,17 @@ function inferMountFromPort(dir) {
|
|
|
70
72
|
return { mount: 'wall', lockYaw: Math.atan2(v.x, v.z) };
|
|
71
73
|
}
|
|
72
74
|
/**
|
|
73
|
-
* If a duct port is within snap range of `position`
|
|
74
|
-
* duct height, the grid hit rides the floor), mate the register onto it:
|
|
75
|
+
* If a duct port is within snap range of `position` in three dimensions, mate the register onto it:
|
|
75
76
|
* the port's direction *picks the mount* (floor / ceiling / wall) and, for
|
|
76
77
|
* walls, the yaw; the whole terminal then hops so its collar lands exactly
|
|
77
78
|
* on the port. Null when nothing is in range. `fallbackYaw` keeps the
|
|
78
79
|
* user's R/T face orientation for floor / ceiling mounts.
|
|
79
80
|
*/
|
|
80
81
|
function resolvePortSnap(position, fallbackYaw) {
|
|
81
|
-
const
|
|
82
|
+
const levelId = useViewer.getState().selection.levelId;
|
|
83
|
+
if (!levelId)
|
|
84
|
+
return null;
|
|
85
|
+
const port = findNearestPort3D(position, collectScenePorts({ systems: DUCT_PORT_SYSTEMS, levelId }), PORT_SNAP_RADIUS_M);
|
|
82
86
|
if (!port)
|
|
83
87
|
return null;
|
|
84
88
|
const { mount, lockYaw } = inferMountFromPort(port.direction);
|
|
@@ -214,7 +218,7 @@ const DuctTerminalTool = () => {
|
|
|
214
218
|
// cycles it); `'off'` is the no-snap bypass.
|
|
215
219
|
const position = alignDrawPoint([snap(hit.x, step), y, snap(hit.z, step)], {
|
|
216
220
|
applySnap: isMagneticSnapActive(),
|
|
217
|
-
bypass:
|
|
221
|
+
bypass: !isMagneticSnapActive(),
|
|
218
222
|
});
|
|
219
223
|
// Magnetic port snap: if a duct run end / fitting collar is in range,
|
|
220
224
|
// the port's direction picks the mount (floor / ceiling / wall) and
|
|
@@ -248,7 +252,10 @@ const DuctTerminalTool = () => {
|
|
|
248
252
|
triggerSFX('sfx:item-place');
|
|
249
253
|
};
|
|
250
254
|
// ---- Floor / ceiling: own raycast against a horizontal plane ----
|
|
255
|
+
let lastPointer = null;
|
|
256
|
+
let lastWall = null;
|
|
251
257
|
const onPointerMove = (e) => {
|
|
258
|
+
lastPointer = e;
|
|
252
259
|
if (mountRef.current === 'wall')
|
|
253
260
|
return;
|
|
254
261
|
setPlacement(resolvePlanar(e));
|
|
@@ -279,11 +286,19 @@ const DuctTerminalTool = () => {
|
|
|
279
286
|
// align it with the wall's outward world normal.
|
|
280
287
|
const yaw = Math.atan2(worldNormal.x, worldNormal.z);
|
|
281
288
|
const world = new Vector3(event.position[0], event.position[1], event.position[2]);
|
|
289
|
+
const step = isGridSnapActive() ? useEditor.getState().gridSnapStep : 0;
|
|
290
|
+
if (step > 0) {
|
|
291
|
+
const wallPoint = event.object.worldToLocal(world.clone());
|
|
292
|
+
wallPoint.x = snap(wallPoint.x, step);
|
|
293
|
+
wallPoint.y = snap(wallPoint.y, step);
|
|
294
|
+
world.copy(event.object.localToWorld(wallPoint));
|
|
295
|
+
}
|
|
282
296
|
const level = activeLevelMesh();
|
|
283
297
|
const local = level ? level.worldToLocal(world.clone()) : world;
|
|
284
298
|
return { position: [local.x, local.y, local.z], yaw, mount: 'wall' };
|
|
285
299
|
};
|
|
286
300
|
const onWallMove = (event) => {
|
|
301
|
+
lastWall = event;
|
|
287
302
|
if (mountRef.current !== 'wall')
|
|
288
303
|
return;
|
|
289
304
|
// Wall-mounted terminals snap flush to the wall — no plan alignment.
|
|
@@ -330,12 +345,21 @@ const DuctTerminalTool = () => {
|
|
|
330
345
|
setPlacement((prev) => (prev ? { ...prev, yaw: yawRef.current } : prev));
|
|
331
346
|
triggerSFX('sfx:item-rotate');
|
|
332
347
|
};
|
|
348
|
+
const unsubscribeSnapping = subscribeAccessorySnapping(() => {
|
|
349
|
+
if (mountRef.current === 'wall') {
|
|
350
|
+
if (lastWall)
|
|
351
|
+
onWallMove(lastWall);
|
|
352
|
+
}
|
|
353
|
+
else if (lastPointer)
|
|
354
|
+
onPointerMove(lastPointer);
|
|
355
|
+
});
|
|
333
356
|
canvas.addEventListener('pointermove', onPointerMove);
|
|
334
357
|
canvas.addEventListener('click', onCanvasClick);
|
|
335
358
|
emitter.on('wall:move', onWallMove);
|
|
336
359
|
emitter.on('wall:click', onWallClick);
|
|
337
360
|
window.addEventListener('keydown', onKeyDown, true);
|
|
338
361
|
return () => {
|
|
362
|
+
unsubscribeSnapping();
|
|
339
363
|
canvas.removeEventListener('pointermove', onPointerMove);
|
|
340
364
|
canvas.removeEventListener('click', onCanvasClick);
|
|
341
365
|
emitter.off('wall:move', onWallMove);
|
|
@@ -358,6 +382,12 @@ const DuctTerminalTool = () => {
|
|
|
358
382
|
levelId: activeLevelId,
|
|
359
383
|
})
|
|
360
384
|
: placement.position;
|
|
361
|
-
|
|
385
|
+
const collar = getDuctTerminalPorts({
|
|
386
|
+
...previewNode,
|
|
387
|
+
position: placement.position,
|
|
388
|
+
rotation: placement.yaw,
|
|
389
|
+
mount: effectiveMount,
|
|
390
|
+
})[0];
|
|
391
|
+
return (_jsxs(LevelOffsetGroup, { children: [_jsx(ConnectionFeedback, { point: [...collar.position], profile: collar, levelId: activeLevelId }), _jsx(CursorSphere, { position: previewPosition }), _jsx("group", { position: previewPosition, rotation: [0, placement.yaw, 0], children: _jsx("primitive", { object: ghost }) }), _jsx(Html, { center: true, position: [previewPosition[0], previewPosition[1] + 1.45, previewPosition[2]], style: { pointerEvents: 'none', userSelect: 'none' }, zIndexRange: [100, 0], children: _jsxs("div", { className: "flex items-center gap-2 whitespace-nowrap rounded-full border border-border/60 bg-background/90 px-4 py-1.5 text-xs tabular-nums shadow-sm backdrop-blur", children: [placement.snapped && (_jsxs(_Fragment, { children: [_jsx("span", { className: "font-medium text-primary", children: "Snapped to duct" }), _jsx("span", { "aria-hidden": true, className: "text-muted-foreground", children: "\u00B7" })] })), _jsxs("span", { className: "font-medium text-foreground", children: ["Mount ", mountLabel] }), _jsx("span", { "aria-hidden": true, className: "text-muted-foreground", children: "\u00B7" }), _jsx("span", { className: "text-muted-foreground", children: "M surface" }), effectiveMount !== 'wall' && (_jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": true, className: "text-muted-foreground", children: "\u00B7" }), _jsx("span", { className: "text-muted-foreground", children: "R/T rotate" })] }))] }) })] }));
|
|
362
392
|
};
|
|
363
393
|
export default DuctTerminalTool;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/elevator/panel.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/elevator/panel.tsx"],"names":[],"mappings":"AAgKA,MAAM,CAAC,OAAO,UAAU,aAAa,uCAiwBpC"}
|
package/dist/elevator/panel.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { ElevatorNode as ElevatorNodeSchema, requestElevatorLevel, useInteractive, useLiveNodeOverrides, useLiveTransforms, useScene, } from '@pascal-app/core';
|
|
3
|
+
import { ElevatorNode as ElevatorNodeSchema, getLevelDisplayName, requestElevatorLevel, useInteractive, useLiveNodeOverrides, useLiveTransforms, useScene, } from '@pascal-app/core';
|
|
4
4
|
import { ActionButton, ActionGroup, MetricControl, PanelSection, PanelWrapper, resolveElevatorNodeSupportY, resolveElevatorSupportY, SliderControl, triggerSFX, useEditor, } from '@pascal-app/editor';
|
|
5
5
|
import { useViewer } from '@pascal-app/viewer';
|
|
6
6
|
import { Copy, Move, Send, Trash2 } from 'lucide-react';
|
|
@@ -341,13 +341,13 @@ export default function ElevatorPanel() {
|
|
|
341
341
|
for (const [index, levelId] of (runtime?.requestedStops ?? []).entries()) {
|
|
342
342
|
destinationOrderByLevelId.set(levelId, index + 1);
|
|
343
343
|
}
|
|
344
|
-
return (_jsxs(PanelWrapper, { icon: "/icons/elevator.webp", onClose: handleClose, title: node.name || 'Elevator', width: 300, children: [_jsx(PanelSection, { title: "Actions", children: _jsxs(ActionGroup, { children: [_jsx(ActionButton, { icon: _jsx(Move, { className: "h-3.5 w-3.5" }), label: "Move", onClick: handleMove }), _jsx(ActionButton, { icon: _jsx(Copy, { className: "h-3.5 w-3.5" }), label: "Duplicate", onClick: handleDuplicate }), _jsx(ActionButton, { className: "text-destructive hover:text-destructive", icon: _jsx(Trash2, { className: "h-3.5 w-3.5" }), label: "Delete", onClick: handleDelete })] }) }), _jsxs(PanelSection, { title: "Position", children: [_jsx(SliderControl, { label: "X",
|
|
344
|
+
return (_jsxs(PanelWrapper, { icon: "/icons/elevator.webp", onClose: handleClose, title: node.name || 'Elevator', width: 300, children: [_jsx(PanelSection, { title: "Actions", children: _jsxs(ActionGroup, { children: [_jsx(ActionButton, { icon: _jsx(Move, { className: "h-3.5 w-3.5" }), label: "Move", onClick: handleMove }), _jsx(ActionButton, { icon: _jsx(Copy, { className: "h-3.5 w-3.5" }), label: "Duplicate", onClick: handleDuplicate }), _jsx(ActionButton, { className: "text-destructive hover:text-destructive", icon: _jsx(Trash2, { className: "h-3.5 w-3.5" }), label: "Delete", onClick: handleDelete })] }) }), _jsxs(PanelSection, { title: "Position", children: [_jsx(SliderControl, { label: "X", onChange: (value) => {
|
|
345
345
|
const position = getSupportedPosition(value, displayPosition[2]);
|
|
346
346
|
previewTransform(position, displayRotation);
|
|
347
347
|
}, onCommit: (value) => {
|
|
348
348
|
const position = getSupportedPosition(value, displayPosition[2]);
|
|
349
349
|
commitTransform(position, displayRotation);
|
|
350
|
-
}, precision: 2, restoreOnCommit: false, step: 0.05, unit: "m", value: roundMeters(displayPosition[0]) }), _jsx(SliderControl, { label: "Y",
|
|
350
|
+
}, precision: 2, restoreOnCommit: false, step: 0.05, unit: "m", value: roundMeters(displayPosition[0]) }), _jsx(SliderControl, { label: "Y", onChange: (value) => {
|
|
351
351
|
const position = [
|
|
352
352
|
displayPosition[0],
|
|
353
353
|
value,
|
|
@@ -361,7 +361,7 @@ export default function ElevatorPanel() {
|
|
|
361
361
|
displayPosition[2],
|
|
362
362
|
];
|
|
363
363
|
commitTransform(position, displayRotation);
|
|
364
|
-
}, precision: 2, restoreOnCommit: false, step: 0.05, unit: "m", value: roundMeters(displayPosition[1]) }), _jsx(SliderControl, { label: "Z",
|
|
364
|
+
}, precision: 2, restoreOnCommit: false, step: 0.05, unit: "m", value: roundMeters(displayPosition[1]) }), _jsx(SliderControl, { label: "Z", onChange: (value) => {
|
|
365
365
|
const position = getSupportedPosition(displayPosition[0], value);
|
|
366
366
|
previewTransform(position, displayRotation);
|
|
367
367
|
}, onCommit: (value) => {
|
|
@@ -373,12 +373,12 @@ export default function ElevatorPanel() {
|
|
|
373
373
|
} }), _jsx(ActionButton, { label: "+45\u00B0", onClick: () => {
|
|
374
374
|
triggerSFX('sfx:item-rotate');
|
|
375
375
|
commitTransform(displayPosition, displayRotation + Math.PI / 4);
|
|
376
|
-
} })] })] }), _jsxs(PanelSection, { title: "Service", children: [_jsxs("div", { className: "grid grid-cols-2 gap-2", children: [_jsxs("div", { className: "space-y-1.5", children: [_jsx("div", { className: "px-1 text-[11px] uppercase tracking-[0.14em] text-muted-foreground", children: "From" }), _jsx("select", { className: "h-9 w-full rounded-lg border border-border/50 bg-[#2C2C2E] px-2 text-sm text-foreground", onChange: (event) => handleServiceBoundaryChange('fromLevelId', event.target.value), value: fromLevelId, children: levels.map((level) => (_jsx("option", { value: level.id, children: level
|
|
376
|
+
} })] })] }), _jsxs(PanelSection, { title: "Service", children: [_jsxs("div", { className: "grid grid-cols-2 gap-2", children: [_jsxs("div", { className: "space-y-1.5", children: [_jsx("div", { className: "px-1 text-[11px] uppercase tracking-[0.14em] text-muted-foreground", children: "From" }), _jsx("select", { className: "h-9 w-full rounded-lg border border-border/50 bg-[#2C2C2E] px-2 text-sm text-foreground", onChange: (event) => handleServiceBoundaryChange('fromLevelId', event.target.value), value: fromLevelId, children: levels.map((level) => (_jsx("option", { value: level.id, children: getLevelDisplayName(level) }, level.id))) })] }), _jsxs("div", { className: "space-y-1.5", children: [_jsx("div", { className: "px-1 text-[11px] uppercase tracking-[0.14em] text-muted-foreground", children: "To" }), _jsx("select", { className: "h-9 w-full rounded-lg border border-border/50 bg-[#2C2C2E] px-2 text-sm text-foreground", onChange: (event) => handleServiceBoundaryChange('toLevelId', event.target.value), value: toLevelId, children: levels.map((level) => (_jsx("option", { value: level.id, children: getLevelDisplayName(level) }, level.id))) })] })] }), _jsxs("div", { className: "space-y-1.5", children: [_jsx("div", { className: "px-1 text-[11px] uppercase tracking-[0.14em] text-muted-foreground", children: "Default Floor" }), _jsx("select", { className: "h-9 w-full rounded-lg border border-border/50 bg-[#2C2C2E] px-3 text-sm text-foreground", onChange: (event) => handleUpdate({ defaultLevelId: event.target.value || null }), value: selectedDefaultLevelId, children: defaultLevelOptions.map((level) => (_jsx("option", { value: level.id, children: getLevelDisplayName(level) }, level.id))) })] })] }), _jsxs(PanelSection, { title: "Cab", children: [_jsx(MetricControl, { label: "Width", max: 4, min: 0.8, onChange: (value) => previewMetric('width', value), onCommit: (value) => commitMetric('width', value), precision: 2, restoreOnCommit: false, step: 0.05, unit: "m", value: displayNode.width }), _jsx(MetricControl, { label: "Depth", max: 4, min: 0.8, onChange: (value) => previewMetric('depth', value), onCommit: (value) => commitMetric('depth', value), precision: 2, restoreOnCommit: false, step: 0.05, unit: "m", value: displayNode.depth }), _jsx(MetricControl, { label: "Cab Height", max: 4, min: 1.8, onChange: (value) => previewMetric('cabHeight', value), onCommit: (value) => commitMetric('cabHeight', value), precision: 2, restoreOnCommit: false, step: 0.05, unit: "m", value: displayNode.cabHeight })] }), _jsxs(PanelSection, { title: "Shaft", children: [_jsxs("div", { className: "space-y-1.5", children: [_jsx("div", { className: "px-1 text-[11px] uppercase tracking-[0.14em] text-muted-foreground", children: "Shaft Style" }), _jsx("select", { className: "h-9 w-full rounded-lg border border-border/50 bg-[#2C2C2E] px-3 text-sm text-foreground", onChange: (event) => handleUpdate({ shaftStyle: event.target.value }), value: displayNode.shaftStyle ?? 'solid', children: SHAFT_STYLE_OPTIONS.map((option) => (_jsx("option", { value: option.value, children: option.label }, option.value))) })] }), _jsx(MetricControl, { label: "Shaft Width", max: 5, min: displayNode.width, onChange: (value) => previewMetric('shaftWidth', Math.max(value, displayNode.width)), onCommit: (value) => commitMetric('shaftWidth', Math.max(value, displayNode.width)), precision: 2, restoreOnCommit: false, step: 0.05, unit: "m", value: displayShaftWidth }), _jsx(MetricControl, { label: "Shaft Depth", max: 5, min: displayNode.depth, onChange: (value) => previewMetric('shaftDepth', Math.max(value, displayNode.depth)), onCommit: (value) => commitMetric('shaftDepth', Math.max(value, displayNode.depth)), precision: 2, restoreOnCommit: false, step: 0.05, unit: "m", value: displayShaftDepth }), _jsx(MetricControl, { label: "Wall Thickness", max: 0.4, min: 0.04, onChange: (value) => previewMetric('shaftWallThickness', value), onCommit: (value) => commitMetric('shaftWallThickness', value), precision: 2, restoreOnCommit: false, step: 0.01, unit: "m", value: displayShaftWallThickness })] }), _jsxs(PanelSection, { title: "Doors", children: [_jsxs("div", { className: "space-y-1.5", children: [_jsx("div", { className: "px-1 text-[11px] uppercase tracking-[0.14em] text-muted-foreground", children: "Opening Style" }), _jsx("select", { className: "h-9 w-full rounded-lg border border-border/50 bg-[#2C2C2E] px-3 text-sm text-foreground", onChange: (event) => handleUpdate({ doorStyle: event.target.value }), value: displayNode.doorStyle ?? 'center-opening', children: DOOR_STYLE_OPTIONS.map((option) => (_jsx("option", { value: option.value, children: option.label }, option.value))) })] }), _jsxs("div", { className: "space-y-1.5", children: [_jsx("div", { className: "px-1 text-[11px] uppercase tracking-[0.14em] text-muted-foreground", children: "Door Type" }), _jsx("select", { className: "h-9 w-full rounded-lg border border-border/50 bg-[#2C2C2E] px-3 text-sm text-foreground", onChange: (event) => handleUpdate({
|
|
377
377
|
doorPanelStyle: event.target.value,
|
|
378
378
|
}), value: displayNode.doorPanelStyle ?? 'glass-frame', children: DOOR_PANEL_STYLE_OPTIONS.map((option) => (_jsx("option", { value: option.value, children: option.label }, option.value))) })] }), _jsx(MetricControl, { label: "Door Width", max: Math.max(displayNode.width - 0.1, 0.5), min: 0.45, onChange: (value) => previewMetric('doorWidth', value), onCommit: (value) => commitMetric('doorWidth', value), precision: 2, restoreOnCommit: false, step: 0.05, unit: "m", value: displayNode.doorWidth }), _jsx(MetricControl, { label: "Door Height", max: Math.max(displayNode.cabHeight - 0.1, 1.3), min: 1.2, onChange: (value) => previewMetric('doorHeight', value), onCommit: (value) => commitMetric('doorHeight', value), precision: 2, restoreOnCommit: false, step: 0.05, unit: "m", value: displayNode.doorHeight })] }), _jsx(PanelSection, { title: "Access", children: _jsx("div", { className: "space-y-2", children: servedLevels.map((level) => {
|
|
379
379
|
const isDisabled = disabledLevelIds.has(level.id);
|
|
380
380
|
const isServiceOnly = serviceOnlyLevelIds.has(level.id);
|
|
381
|
-
return (_jsxs("div", { className: "flex items-center justify-between gap-2 rounded-lg border border-border/45 bg-[#2C2C2E] px-2.5 py-2", children: [_jsx("span", { className: "min-w-0 truncate text-sm", children: level
|
|
381
|
+
return (_jsxs("div", { className: "flex items-center justify-between gap-2 rounded-lg border border-border/45 bg-[#2C2C2E] px-2.5 py-2", children: [_jsx("span", { className: "min-w-0 truncate text-sm", children: getLevelDisplayName(level) }), _jsxs("div", { className: "flex shrink-0 gap-1.5", children: [_jsx("button", { className: `rounded-md border px-2 py-1 text-[11px] transition-colors ${isServiceOnly
|
|
382
382
|
? 'border-sky-300/45 bg-sky-400/15 text-sky-100'
|
|
383
383
|
: 'border-border/50 bg-black/15 text-muted-foreground hover:text-foreground'} ${isDisabled ? 'cursor-not-allowed opacity-45' : ''}`, disabled: isDisabled, onClick: () => toggleLevelAccess('serviceOnlyLevelIds', level.id), type: "button", children: "Service" }), _jsx("button", { className: `rounded-md border px-2 py-1 text-[11px] transition-colors ${isDisabled
|
|
384
384
|
? 'border-red-300/45 bg-red-400/15 text-red-100'
|
|
@@ -392,6 +392,6 @@ export default function ElevatorPanel() {
|
|
|
392
392
|
? 'cursor-not-allowed border-border/35 bg-[#202024] text-muted-foreground/55'
|
|
393
393
|
: isActive
|
|
394
394
|
? 'border-emerald-400/45 bg-emerald-400/15 text-emerald-100'
|
|
395
|
-
: 'border-border/50 bg-[#2C2C2E] text-foreground hover:bg-[#3e3e3e]'}`, disabled: isDisabled, onClick: () => requestLevel(level.id), type: "button", children: [_jsxs("span", { className: "flex min-w-0 flex-col", children: [_jsx("span", { className: "truncate text-xs", children: level
|
|
395
|
+
: 'border-border/50 bg-[#2C2C2E] text-foreground hover:bg-[#3e3e3e]'}`, disabled: isDisabled, onClick: () => requestLevel(level.id), type: "button", children: [_jsxs("span", { className: "flex min-w-0 flex-col", children: [_jsx("span", { className: "truncate text-xs", children: getLevelDisplayName(level) }), isDisabled ? (_jsx("span", { className: "mt-0.5 text-[10px] font-medium uppercase tracking-[0.12em] text-current/65", children: "Disabled" })) : isServiceOnly ? (_jsx("span", { className: "mt-0.5 text-[10px] font-medium uppercase tracking-[0.12em] text-current/65", children: "Service" })) : (stopOrder && (_jsxs("span", { className: "mt-0.5 text-[10px] font-medium uppercase tracking-[0.12em] text-current/65", children: ["Stop ", stopOrder] })))] }), _jsx("span", { className: `flex h-6 min-w-6 items-center justify-center rounded-full border border-white/15 bg-black/20 ${stopOrder ? 'px-1.5 font-mono text-[11px] font-semibold' : ''}`, children: isDisabled ? '×' : (stopOrder ?? _jsx(Send, { className: "h-3 w-3" })) })] }, level.id));
|
|
396
396
|
}) }) }), _jsxs(PanelSection, { title: "Motion", children: [_jsx(SliderControl, { label: "Speed", max: 8, min: 0.5, onChange: (value) => handleUpdate({ speed: value }), precision: 1, step: 0.1, unit: "m/s", value: node.speed }), _jsx(SliderControl, { label: "Door Time", max: 2200, min: 300, onChange: (value) => handleUpdate({ doorDurationMs: value }), step: 50, unit: "ms", value: node.doorDurationMs }), _jsx(SliderControl, { label: "Dwell", max: 5000, min: 300, onChange: (value) => handleUpdate({ dwellMs: value }), step: 100, unit: "ms", value: node.dwellMs })] })] }));
|
|
397
397
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../src/elevator/system.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../src/elevator/system.tsx"],"names":[],"mappings":"AAgBA;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,gCAQrC"}
|
package/dist/elevator/system.js
CHANGED
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { ElevatorOpeningSystem,
|
|
3
|
+
import { ElevatorOpeningSystem, stepElevatorRuntimes } from '@pascal-app/core';
|
|
4
4
|
import { ElevatorInteractionSystem } from '@pascal-app/viewer';
|
|
5
|
+
import { useFrame } from '@react-three/fiber';
|
|
6
|
+
/** Cab travel + door state machine, stepped once per frame. Lives here rather
|
|
7
|
+
* than in core so the core barrel stays free of runtime R3F imports. */
|
|
8
|
+
function ElevatorRuntimeSystem() {
|
|
9
|
+
useFrame(({ clock }, delta) => {
|
|
10
|
+
stepElevatorRuntimes(clock.getElapsedTime() * 1000, delta);
|
|
11
|
+
}, 2);
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
5
14
|
/**
|
|
6
15
|
* Composite system for elevator — bundles three per-frame systems:
|
|
7
16
|
* `ElevatorRuntimeSystem` (cab travel + door state machine),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/eyebrow-vent/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAA;AAIzB,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AA+F1C;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,EAAE,cAAc,CAAC,OAAO,eAAe,
|
|
1
|
+
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/eyebrow-vent/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAA;AAIzB,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AA+F1C;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,EAAE,cAAc,CAAC,OAAO,eAAe,CA8DxE,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EyebrowVentNode as EyebrowVentNodeSchema, } from '@pascal-app/core';
|
|
2
|
-
import { surfacePaintCapability } from '../shared/surface-paint';
|
|
3
2
|
import { buildEyebrowVentFloorplan } from './floorplan';
|
|
3
|
+
import { eyebrowVentPaint } from './paint';
|
|
4
4
|
import { eyebrowVentParametrics } from './parametrics';
|
|
5
5
|
import { EyebrowVentNode } from './schema';
|
|
6
6
|
const SIDE_HANDLE_OFFSET = 0.3;
|
|
@@ -98,7 +98,7 @@ const eyebrowVentHandles = [
|
|
|
98
98
|
*/
|
|
99
99
|
export const eyebrowVentDefinition = {
|
|
100
100
|
kind: 'eyebrow-vent',
|
|
101
|
-
schemaVersion:
|
|
101
|
+
schemaVersion: 3,
|
|
102
102
|
schema: EyebrowVentNode,
|
|
103
103
|
category: 'structure',
|
|
104
104
|
surfaceRole: 'roof',
|
|
@@ -111,11 +111,14 @@ export const eyebrowVentDefinition = {
|
|
|
111
111
|
return rest;
|
|
112
112
|
},
|
|
113
113
|
capabilities: {
|
|
114
|
+
slots: () => [
|
|
115
|
+
{ slotId: 'hood', label: 'Hood', default: 'library:preset-softwhite' },
|
|
116
|
+
{ slotId: 'front', label: 'Louvers', default: 'library:preset-softwhite' },
|
|
117
|
+
],
|
|
114
118
|
selectable: { hitVolume: 'bbox' },
|
|
115
119
|
duplicable: true,
|
|
116
120
|
deletable: true,
|
|
117
|
-
|
|
118
|
-
paint: surfacePaintCapability,
|
|
121
|
+
paint: eyebrowVentPaint,
|
|
119
122
|
// Mounts on a roof segment via `roofSegmentId`. Sits ON TOP of the slope —
|
|
120
123
|
// no `buildCut`, just the dirty cascade so the parent roof's merged shell
|
|
121
124
|
// rebuilds when the vent moves / resizes.
|
|
@@ -140,7 +143,7 @@ export const eyebrowVentDefinition = {
|
|
|
140
143
|
presentation: {
|
|
141
144
|
label: 'Eyebrow Vent',
|
|
142
145
|
description: 'Low curved lens-shaped roof vent with a louvered front.',
|
|
143
|
-
icon: { kind: 'url', src: '/icons/
|
|
146
|
+
icon: { kind: 'url', src: '/icons/eyebrow-vent.webp' },
|
|
144
147
|
paletteSection: 'structure',
|
|
145
148
|
paletteOrder: 123,
|
|
146
149
|
},
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { EyebrowVentNode } from '@pascal-app/core';
|
|
2
2
|
import * as THREE from 'three';
|
|
3
|
+
export declare const EYEBROW_VENT_MATERIAL_INDEX: {
|
|
4
|
+
readonly hood: 0;
|
|
5
|
+
readonly front: 1;
|
|
6
|
+
};
|
|
3
7
|
/**
|
|
4
8
|
* Pure builder for the eyebrow-vent mesh. Three styles, all seated directly on
|
|
5
9
|
* the roof at y=0 and facing +Z (downslope):
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/eyebrow-vent/geometry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/eyebrow-vent/geometry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAQ9B,eAAO,MAAM,2BAA2B;;;CAG9B,CAAA;AAEV;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,eAAe,GAAG,KAAK,CAAC,cAAc,CA+CpF"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import * as THREE from 'three';
|
|
2
|
+
import { copyUvToSecondaryChannel, cumulativeProfileDistances, planarMetricUvs, } from '../shared/primitive-uv';
|
|
3
|
+
export const EYEBROW_VENT_MATERIAL_INDEX = {
|
|
4
|
+
hood: 0,
|
|
5
|
+
front: 1,
|
|
6
|
+
};
|
|
2
7
|
/**
|
|
3
8
|
* Pure builder for the eyebrow-vent mesh. Three styles, all seated directly on
|
|
4
9
|
* the roof at y=0 and facing +Z (downslope):
|
|
@@ -31,14 +36,15 @@ export function buildEyebrowVentGeometry(node) {
|
|
|
31
36
|
const n = [];
|
|
32
37
|
const uv = [];
|
|
33
38
|
// The hood seats directly on the roof at y=0 — no flashing plate.
|
|
39
|
+
let frontStart;
|
|
34
40
|
if (node.style === 'half-round') {
|
|
35
|
-
addHalfRound(p, n, uv, w, d, h, 0, slats);
|
|
41
|
+
frontStart = addHalfRound(p, n, uv, w, d, h, 0, slats);
|
|
36
42
|
}
|
|
37
43
|
else if (node.style === 'slant-box') {
|
|
38
|
-
addSlantBox(p, n, uv, w, d, h, 0, slats, backRatio);
|
|
44
|
+
frontStart = addSlantBox(p, n, uv, w, d, h, 0, slats, backRatio);
|
|
39
45
|
}
|
|
40
46
|
else {
|
|
41
|
-
addScoop(p, n, uv, w, d, h, 0, slats);
|
|
47
|
+
frontStart = addScoop(p, n, uv, w, d, h, 0, slats);
|
|
42
48
|
}
|
|
43
49
|
// Double-side the whole mesh at the geometry level: append a back-facing
|
|
44
50
|
// copy of every triangle (reversed winding + negated normals). The open
|
|
@@ -47,11 +53,21 @@ export function buildEyebrowVentGeometry(node) {
|
|
|
47
53
|
// material, which poisons the MRT scene pass (see the ridge-vent renderer
|
|
48
54
|
// note). Only one of each coplanar pair front-faces any camera, so there's
|
|
49
55
|
// no z-fighting.
|
|
56
|
+
const frontEnd = p.length / 3;
|
|
50
57
|
doubleSide(p, n, uv);
|
|
51
58
|
const geo = new THREE.BufferGeometry();
|
|
52
59
|
geo.setAttribute('position', new THREE.Float32BufferAttribute(p, 3));
|
|
53
60
|
geo.setAttribute('normal', new THREE.Float32BufferAttribute(n, 3));
|
|
54
61
|
geo.setAttribute('uv', new THREE.Float32BufferAttribute(uv, 2));
|
|
62
|
+
geo.addGroup(0, frontStart, EYEBROW_VENT_MATERIAL_INDEX.hood);
|
|
63
|
+
if (frontEnd > frontStart) {
|
|
64
|
+
geo.addGroup(frontStart, frontEnd - frontStart, EYEBROW_VENT_MATERIAL_INDEX.front);
|
|
65
|
+
}
|
|
66
|
+
geo.addGroup(frontEnd, frontStart, EYEBROW_VENT_MATERIAL_INDEX.hood);
|
|
67
|
+
if (frontEnd > frontStart) {
|
|
68
|
+
geo.addGroup(frontEnd + frontStart, frontEnd - frontStart, EYEBROW_VENT_MATERIAL_INDEX.front);
|
|
69
|
+
}
|
|
70
|
+
copyUvToSecondaryChannel(geo);
|
|
55
71
|
geo.computeBoundingSphere();
|
|
56
72
|
return geo;
|
|
57
73
|
}
|
|
@@ -71,15 +87,22 @@ function addScoop(p, n, uv, w, d, h, yB, slats) {
|
|
|
71
87
|
const z = zF - v * d;
|
|
72
88
|
rings.push(halfRing(a, b, yB, z, scale, NF));
|
|
73
89
|
}
|
|
90
|
+
const ringUvs = rings.map((ring) => cumulativeProfileDistances(ring));
|
|
91
|
+
const ringV = [0];
|
|
92
|
+
for (let i = 1; i <= NZ; i++) {
|
|
93
|
+
ringV.push(ringV[i - 1] + averageProfileDistance(rings[i - 1], rings[i]));
|
|
94
|
+
}
|
|
74
95
|
for (let i = 0; i < NZ; i++) {
|
|
75
96
|
addBand(p, n, uv, rings[i + 1], rings[i], NF, (qa, qb, qc, qd) => {
|
|
76
97
|
const mx = (qa[0] + qb[0] + qc[0] + qd[0]) / 4;
|
|
77
98
|
const my = (qa[1] + qb[1] + qc[1] + qd[1]) / 4;
|
|
78
99
|
return [mx, my - yB, 0]; // radial-out from the spine
|
|
79
|
-
});
|
|
100
|
+
}, ringUvs[i + 1], ringUvs[i], ringV[i + 1], ringV[i]);
|
|
80
101
|
}
|
|
81
102
|
// Horizontal louvers filling the front half-ellipse opening.
|
|
103
|
+
const frontStart = p.length / 3;
|
|
82
104
|
addArchLouvers(p, n, uv, a, b, yB, zF - d * 0.04, slats);
|
|
105
|
+
return frontStart;
|
|
83
106
|
}
|
|
84
107
|
// ─── Style: half-round (D-shaped louver vent) ─────────────────────────────
|
|
85
108
|
function addHalfRound(p, n, uv, w, d, h, yB, slats) {
|
|
@@ -92,19 +115,22 @@ function addHalfRound(p, n, uv, w, d, h, yB, slats) {
|
|
|
92
115
|
const NF = 20;
|
|
93
116
|
const ringF = halfRing(a, b, yB, zF, 1, NF);
|
|
94
117
|
const ringB = halfRing(a, b, yB, zB, 1, NF);
|
|
118
|
+
const ringU = cumulativeProfileDistances(ringF);
|
|
95
119
|
// Curved top shell (constant cross section).
|
|
96
120
|
addBand(p, n, uv, ringB, ringF, NF, (qa, qb, qc, qd) => {
|
|
97
121
|
const mx = (qa[0] + qb[0] + qc[0] + qd[0]) / 4;
|
|
98
122
|
const my = (qa[1] + qb[1] + qc[1] + qd[1]) / 4;
|
|
99
123
|
return [mx, my - yB, 0];
|
|
100
|
-
});
|
|
124
|
+
}, ringU, ringU, d, 0);
|
|
101
125
|
// Back cap — fan the rear semicircle, facing -Z.
|
|
102
126
|
const backCenter = [0, yB, zB];
|
|
103
127
|
for (let j = 0; j < NF; j++) {
|
|
104
128
|
pushTri(p, n, uv, backCenter, ringB[j + 1], ringB[j], [0, 0, -1]);
|
|
105
129
|
}
|
|
106
130
|
// Louvered front face (a slat count bumped up — the D-vent reads denser).
|
|
131
|
+
const frontStart = p.length / 3;
|
|
107
132
|
addArchLouvers(p, n, uv, a, b, yB, zF - d * 0.04, slats > 0 ? Math.max(slats, 4) : 0);
|
|
133
|
+
return frontStart;
|
|
108
134
|
}
|
|
109
135
|
// ─── Style: slant-box (low hooded box) ────────────────────────────────────
|
|
110
136
|
function addSlantBox(p, n, uv, w, d, h, yB, slats, backRatio) {
|
|
@@ -141,11 +167,13 @@ function addSlantBox(p, n, uv, w, d, h, yB, slats, backRatio) {
|
|
|
141
167
|
pushQuad(p, n, uv, [-hw, oB, zF], [oL, oB, zF], [oL, oT, zF], [-hw, oT, zF], [0, 0, 1]); // left
|
|
142
168
|
pushQuad(p, n, uv, [oR, oB, zF], [hw, oB, zF], [hw, oT, zF], [oR, oT, zF], [0, 0, 1]); // right
|
|
143
169
|
// Recessed screen panel at the back of the pocket (blocks see-through).
|
|
170
|
+
const frontStart = p.length / 3;
|
|
144
171
|
const screenZ = zF - d * 0.2;
|
|
145
172
|
pushQuad(p, n, uv, [oL, oB, screenZ], [oR, oB, screenZ], [oR, oT, screenZ], [oL, oT, screenZ], [0, 0, 1]);
|
|
146
173
|
// Horizontal louvers inside the pocket — bounded by the opening in height
|
|
147
174
|
// and recessed in depth between the frame face and the screen.
|
|
148
175
|
addRectLouvers(p, n, uv, oR, oB, oT, zF - d * 0.07, slats);
|
|
176
|
+
return frontStart;
|
|
149
177
|
}
|
|
150
178
|
// ─── Louver helpers ───────────────────────────────────────────────────────
|
|
151
179
|
// Angled horizontal slats filling a half-ellipse opening (radius a × b,
|
|
@@ -232,14 +260,26 @@ function halfRing(a, b, yB, z, scale, steps) {
|
|
|
232
260
|
return row;
|
|
233
261
|
}
|
|
234
262
|
// ─── Primitives ───────────────────────────────────────────────────────────
|
|
235
|
-
function addBand(p, n, uv, rA, rB, lng, hintFn) {
|
|
263
|
+
function addBand(p, n, uv, rA, rB, lng, hintFn, uA = cumulativeProfileDistances(rA), uB = cumulativeProfileDistances(rB), vA = 0, vB = averageProfileDistance(rA, rB)) {
|
|
236
264
|
for (let j = 0; j < lng; j++) {
|
|
237
265
|
const a = rA[j];
|
|
238
266
|
const b = rA[j + 1];
|
|
239
267
|
const c = rB[j + 1];
|
|
240
268
|
const d = rB[j];
|
|
241
|
-
pushQuad(p, n, uv, a, b, c, d, hintFn(a, b, c, d)
|
|
269
|
+
pushQuad(p, n, uv, a, b, c, d, hintFn(a, b, c, d), [
|
|
270
|
+
[uA[j], vA],
|
|
271
|
+
[uA[j + 1], vA],
|
|
272
|
+
[uB[j + 1], vB],
|
|
273
|
+
[uB[j], vB],
|
|
274
|
+
]);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
function averageProfileDistance(a, b) {
|
|
278
|
+
let total = 0;
|
|
279
|
+
for (let index = 0; index < a.length; index += 1) {
|
|
280
|
+
total += Math.hypot(b[index][0] - a[index][0], b[index][1] - a[index][1], b[index][2] - a[index][2]);
|
|
242
281
|
}
|
|
282
|
+
return total / a.length;
|
|
243
283
|
}
|
|
244
284
|
// Append a reversed-winding, negated-normal copy of every triangle already in
|
|
245
285
|
// the buffers, making the mesh render from both sides under a FrontSide
|
|
@@ -256,7 +296,7 @@ function doubleSide(p, n, uv) {
|
|
|
256
296
|
}
|
|
257
297
|
}
|
|
258
298
|
// ─── Winding-safe primitives ─────────────────────────────────────────────
|
|
259
|
-
function pushQuad(positions, normals, uvs, a, b, c, d, hint) {
|
|
299
|
+
function pushQuad(positions, normals, uvs, a, b, c, d, hint, authoredUvs) {
|
|
260
300
|
let nx = (c[1] - a[1]) * (b[2] - a[2]) - (c[2] - a[2]) * (b[1] - a[1]);
|
|
261
301
|
let ny = (c[2] - a[2]) * (b[0] - a[0]) - (c[0] - a[0]) * (b[2] - a[2]);
|
|
262
302
|
let nz = (c[0] - a[0]) * (b[1] - a[1]) - (c[1] - a[1]) * (b[0] - a[0]);
|
|
@@ -270,19 +310,19 @@ function pushQuad(positions, normals, uvs, a, b, c, d, hint) {
|
|
|
270
310
|
nx /= len;
|
|
271
311
|
ny /= len;
|
|
272
312
|
nz /= len;
|
|
273
|
-
const
|
|
274
|
-
const
|
|
313
|
+
const faceUvs = authoredUvs ?? planarMetricUvs([a, b, c, d], [nx, ny, nz]);
|
|
314
|
+
const [uvA, uvB, uvC, uvD] = faceUvs;
|
|
275
315
|
if (flip) {
|
|
276
316
|
positions.push(a[0], a[1], a[2], b[0], b[1], b[2], c[0], c[1], c[2]);
|
|
277
|
-
uvs.push(
|
|
317
|
+
uvs.push(...uvA, ...uvB, ...uvC);
|
|
278
318
|
positions.push(a[0], a[1], a[2], c[0], c[1], c[2], d[0], d[1], d[2]);
|
|
279
|
-
uvs.push(
|
|
319
|
+
uvs.push(...uvA, ...uvC, ...uvD);
|
|
280
320
|
}
|
|
281
321
|
else {
|
|
282
322
|
positions.push(a[0], a[1], a[2], c[0], c[1], c[2], b[0], b[1], b[2]);
|
|
283
|
-
uvs.push(
|
|
323
|
+
uvs.push(...uvA, ...uvC, ...uvB);
|
|
284
324
|
positions.push(a[0], a[1], a[2], d[0], d[1], d[2], c[0], c[1], c[2]);
|
|
285
|
-
uvs.push(
|
|
325
|
+
uvs.push(...uvA, ...uvD, ...uvC);
|
|
286
326
|
}
|
|
287
327
|
for (let i = 0; i < 6; i++)
|
|
288
328
|
normals.push(nx, ny, nz);
|
|
@@ -301,13 +341,18 @@ function pushTri(positions, normals, uvs, a, b, c, hint) {
|
|
|
301
341
|
nx /= len;
|
|
302
342
|
ny /= len;
|
|
303
343
|
nz /= len;
|
|
344
|
+
const faceUvs = planarMetricUvs([a, b, c], [nx, ny, nz]);
|
|
345
|
+
const uvA = faceUvs[0];
|
|
346
|
+
const uvB = faceUvs[1];
|
|
347
|
+
const uvC = faceUvs[2];
|
|
304
348
|
if (flip) {
|
|
305
349
|
positions.push(a[0], a[1], a[2], c[0], c[1], c[2], b[0], b[1], b[2]);
|
|
350
|
+
uvs.push(...uvA, ...uvC, ...uvB);
|
|
306
351
|
}
|
|
307
352
|
else {
|
|
308
353
|
positions.push(a[0], a[1], a[2], b[0], b[1], b[2], c[0], c[1], c[2]);
|
|
354
|
+
uvs.push(...uvA, ...uvB, ...uvC);
|
|
309
355
|
}
|
|
310
|
-
uvs.push(0, 0, 1, 0, 0, 1);
|
|
311
356
|
for (let i = 0; i < 3; i++)
|
|
312
357
|
normals.push(nx, ny, nz);
|
|
313
358
|
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { EyebrowVentMaterialRole } from '@pascal-app/core';
|
|
2
|
+
export declare function resolveEyebrowVentMaterialRole(materialIndex: number | null): EyebrowVentMaterialRole;
|
|
3
|
+
export declare const eyebrowVentPaint: import("@pascal-app/core").PaintCapability;
|
|
4
|
+
//# sourceMappingURL=paint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paint.d.ts","sourceRoot":"","sources":["../../src/eyebrow-vent/paint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,uBAAuB,EAAkB,MAAM,kBAAkB,CAAA;AAOxF,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,MAAM,GAAG,IAAI,GAC3B,uBAAuB,CAEzB;AAED,eAAO,MAAM,gBAAgB,4CA0B3B,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { buildSlotPreviewMaterial, createSlotPaintCapability } from '../shared/slot-paint';
|
|
2
|
+
import { EYEBROW_VENT_MATERIAL_INDEX } from './geometry';
|
|
3
|
+
export function resolveEyebrowVentMaterialRole(materialIndex) {
|
|
4
|
+
return materialIndex === EYEBROW_VENT_MATERIAL_INDEX.front ? 'front' : 'hood';
|
|
5
|
+
}
|
|
6
|
+
export const eyebrowVentPaint = createSlotPaintCapability({
|
|
7
|
+
materialTarget: 'eyebrow-vent',
|
|
8
|
+
resolveRole: ({ materialIndex }) => resolveEyebrowVentMaterialRole(materialIndex),
|
|
9
|
+
applyPreview: ({ role, material, materialPreset, root }) => {
|
|
10
|
+
const preview = buildSlotPreviewMaterial(material, materialPreset);
|
|
11
|
+
if (!preview)
|
|
12
|
+
return null;
|
|
13
|
+
const materialIndex = EYEBROW_VENT_MATERIAL_INDEX[role];
|
|
14
|
+
let restore = null;
|
|
15
|
+
root.traverse((object) => {
|
|
16
|
+
const mesh = object;
|
|
17
|
+
if (!mesh.isMesh || mesh.name !== 'eyebrow-vent-surface' || !Array.isArray(mesh.material))
|
|
18
|
+
return;
|
|
19
|
+
const previous = [...mesh.material];
|
|
20
|
+
const next = [...previous];
|
|
21
|
+
next[materialIndex] = preview;
|
|
22
|
+
mesh.material = next;
|
|
23
|
+
restore = () => {
|
|
24
|
+
mesh.material = previous;
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
return restore;
|
|
28
|
+
},
|
|
29
|
+
legacyEffective: (node) => {
|
|
30
|
+
const legacy = node;
|
|
31
|
+
return { material: legacy.material, materialPreset: legacy.materialPreset };
|
|
32
|
+
},
|
|
33
|
+
});
|
|
@@ -102,5 +102,5 @@ export default function EyebrowVentPanel() {
|
|
|
102
102
|
{ label: 'Scoop', value: 'scoop' },
|
|
103
103
|
{ label: 'Half-round', value: 'half-round' },
|
|
104
104
|
{ label: 'Slant-box', value: 'slant-box' },
|
|
105
|
-
], value: node.style ?? 'scoop' }), _jsx(SliderControl, { label: "Louvers", max: 8, min: 0, onChange: (v) => previewProp({ louverCount: Math.round(v) }), onCommit: (v) => handleUpdate({ louverCount: Math.round(v) }), precision: 0, restoreOnCommit: false, step: 1, value: node.louverCount ?? 3 }), node.style === 'slant-box' ? (_jsx(SliderControl, { label: "Back height", max: 1, min: 0.15, onChange: (v) => previewProp({ backRatio: v }), onCommit: (v) => handleUpdate({ backRatio: v }), precision: 2, restoreOnCommit: false, step: 0.05, value: Math.round((node.backRatio ?? 0.5) * 100) / 100 })) : null] }), _jsxs(PanelSection, { title: "Dimensions", children: [_jsx(SliderControl, { label: "Width", max:
|
|
105
|
+
], value: node.style ?? 'scoop' }), _jsx(SliderControl, { label: "Louvers", max: 8, min: 0, onChange: (v) => previewProp({ louverCount: Math.round(v) }), onCommit: (v) => handleUpdate({ louverCount: Math.round(v) }), precision: 0, restoreOnCommit: false, step: 1, value: node.louverCount ?? 3 }), node.style === 'slant-box' ? (_jsx(SliderControl, { label: "Back height", max: 1, min: 0.15, onChange: (v) => previewProp({ backRatio: v }), onCommit: (v) => handleUpdate({ backRatio: v }), precision: 2, restoreOnCommit: false, step: 0.05, value: Math.round((node.backRatio ?? 0.5) * 100) / 100 })) : null] }), _jsxs(PanelSection, { title: "Dimensions", children: [_jsx(SliderControl, { label: "Width", max: 1000, min: 0.4, onChange: (v) => previewProp({ width: v }), onCommit: (v) => handleUpdate({ width: v }), precision: 2, restoreOnCommit: false, step: 0.05, unit: "m", value: Math.round(node.width * 100) / 100 }), _jsx(SliderControl, { label: "Depth", max: 1000, min: 0.2, onChange: (v) => previewProp({ depth: v }), onCommit: (v) => handleUpdate({ depth: v }), precision: 2, restoreOnCommit: false, step: 0.05, unit: "m", value: Math.round(node.depth * 100) / 100 }), _jsx(SliderControl, { label: "Height", max: 1000, min: 0.08, onChange: (v) => previewProp({ height: v }), onCommit: (v) => handleUpdate({ height: v }), precision: 2, restoreOnCommit: false, step: 0.02, unit: "m", value: Math.round(node.height * 100) / 100 })] }), _jsxs(PanelSection, { title: "Position", children: [_jsx(SliderControl, { label: "X", max: Math.round(((segment?.width ?? 10) / 2) * 100) / 100, min: -Math.round(((segment?.width ?? 10) / 2) * 100) / 100, onChange: (v) => previewProp({ position: [v, node.position[1] ?? 0, node.position[2] ?? 0] }), onCommit: (v) => handleUpdate({ position: [v, node.position[1] ?? 0, node.position[2] ?? 0] }), precision: 2, restoreOnCommit: false, step: 0.05, unit: "m", value: Math.round((node.position[0] ?? 0) * 100) / 100 }), _jsx(SliderControl, { label: "Y", max: Math.max((segment?.wallHeight ?? 3) + (segment ? getActiveRoofHeight(segment) : 3) + 2, (node.position[1] ?? 0) + 0.1), min: Math.min(0, (node.position[1] ?? 0) - 0.5), onChange: (v) => previewProp({ position: [node.position[0] ?? 0, v, node.position[2] ?? 0] }), onCommit: (v) => handleUpdate({ position: [node.position[0] ?? 0, v, node.position[2] ?? 0] }), precision: 2, restoreOnCommit: false, step: 0.05, unit: "m", value: Math.round((node.position[1] ?? 0) * 100) / 100 }), _jsx(SliderControl, { label: "Z", max: Math.round(((segment?.depth ?? 10) / 2) * 100) / 100, min: -Math.round(((segment?.depth ?? 10) / 2) * 100) / 100, onChange: (v) => previewProp({ position: [node.position[0] ?? 0, node.position[1] ?? 0, v] }), onCommit: (v) => handleUpdate({ position: [node.position[0] ?? 0, node.position[1] ?? 0, v] }), precision: 2, restoreOnCommit: false, step: 0.05, unit: "m", value: Math.round((node.position[2] ?? 0) * 100) / 100 }), _jsx(SliderControl, { label: "Rotation", max: 180, min: -180, onChange: (deg) => previewProp({ rotation: (deg * Math.PI) / 180 }), onCommit: (deg) => handleUpdate({ rotation: (deg * Math.PI) / 180 }), precision: 0, restoreOnCommit: false, step: 1, unit: "\u00B0", value: Math.round(((node.rotation ?? 0) * 180) / Math.PI) })] }), _jsx(PanelSection, { title: "Actions", children: _jsxs(ActionGroup, { children: [_jsx(ActionButton, { icon: _jsx(Move, { className: "h-3.5 w-3.5" }), label: "Move", onClick: handleMove }), _jsx(ActionButton, { icon: _jsx(Copy, { className: "h-3.5 w-3.5" }), label: "Duplicate", onClick: handleDuplicate }), _jsx(ActionButton, { className: "hover:bg-red-500/20", icon: _jsx(Trash2, { className: "h-3.5 w-3.5 text-red-400" }), label: "Delete", onClick: handleDelete })] }) })] }));
|
|
106
106
|
}
|
|
@@ -22,9 +22,9 @@ export const eyebrowVentParametrics = {
|
|
|
22
22
|
{
|
|
23
23
|
label: 'Dimensions',
|
|
24
24
|
fields: [
|
|
25
|
-
{ key: 'width', kind: 'number', unit: 'm', min: 0.3, max:
|
|
26
|
-
{ key: 'depth', kind: 'number', unit: 'm', min: 0.2, max:
|
|
27
|
-
{ key: 'height', kind: 'number', unit: 'm', min: 0.08, max:
|
|
25
|
+
{ key: 'width', kind: 'number', unit: 'm', min: 0.3, max: 1000, step: 0.05 },
|
|
26
|
+
{ key: 'depth', kind: 'number', unit: 'm', min: 0.2, max: 1000, step: 0.05 },
|
|
27
|
+
{ key: 'height', kind: 'number', unit: 'm', min: 0.08, max: 1000, step: 0.02 },
|
|
28
28
|
],
|
|
29
29
|
},
|
|
30
30
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/eyebrow-vent/renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,eAAe,EAKrB,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/eyebrow-vent/renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,eAAe,EAKrB,MAAM,kBAAkB,CAAA;AAsBzB;;;;;GAKG;AACH,QAAA,MAAM,mBAAmB,GAAI,qBAAqB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,uCAuG1E,CAAA;AAED,eAAe,mBAAmB,CAAA"}
|