@pascal-app/nodes 1.0.6 → 1.0.7
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/README.md +1 -0
- package/dist/beam/actions/move-endpoint.d.ts +24 -0
- package/dist/beam/actions/move-endpoint.d.ts.map +1 -0
- package/dist/beam/actions/move-endpoint.js +54 -0
- package/dist/beam/definition.d.ts +14 -0
- package/dist/beam/definition.d.ts.map +1 -0
- package/dist/beam/definition.js +173 -0
- package/dist/beam/draft-settings.d.ts +17 -0
- package/dist/beam/draft-settings.d.ts.map +1 -0
- package/dist/beam/draft-settings.js +81 -0
- package/dist/beam/drafting.d.ts +35 -0
- package/dist/beam/drafting.d.ts.map +1 -0
- package/dist/beam/drafting.js +103 -0
- package/dist/beam/floorplan-affordances.d.ts +8 -0
- package/dist/beam/floorplan-affordances.d.ts.map +1 -0
- package/dist/beam/floorplan-affordances.js +40 -0
- package/dist/beam/floorplan-move.d.ts +11 -0
- package/dist/beam/floorplan-move.d.ts.map +1 -0
- package/dist/beam/floorplan-move.js +54 -0
- package/dist/beam/floorplan.d.ts +11 -0
- package/dist/beam/floorplan.d.ts.map +1 -0
- package/dist/beam/floorplan.js +91 -0
- package/dist/beam/geometry.d.ts +19 -0
- package/dist/beam/geometry.d.ts.map +1 -0
- package/dist/beam/geometry.js +63 -0
- package/dist/beam/index.d.ts +3 -0
- package/dist/beam/index.d.ts.map +1 -0
- package/dist/beam/index.js +2 -0
- package/dist/beam/move-endpoint-tool.d.ts +21 -0
- package/dist/beam/move-endpoint-tool.d.ts.map +1 -0
- package/dist/beam/move-endpoint-tool.js +49 -0
- package/dist/beam/move-tool.d.ts +12 -0
- package/dist/beam/move-tool.d.ts.map +1 -0
- package/dist/beam/move-tool.js +114 -0
- package/dist/beam/panel-model.d.ts +28 -0
- package/dist/beam/panel-model.d.ts.map +1 -0
- package/dist/beam/panel-model.js +123 -0
- package/dist/beam/panel.d.ts +13 -0
- package/dist/beam/panel.d.ts.map +1 -0
- package/dist/beam/panel.js +107 -0
- package/dist/beam/parametrics.d.ts +3 -0
- package/dist/beam/parametrics.d.ts.map +1 -0
- package/dist/beam/parametrics.js +4 -0
- package/dist/beam/renderer.d.ts +13 -0
- package/dist/beam/renderer.d.ts.map +1 -0
- package/dist/beam/renderer.js +36 -0
- package/dist/beam/schema.d.ts +2 -0
- package/dist/beam/schema.d.ts.map +1 -0
- package/dist/beam/schema.js +1 -0
- package/dist/beam/tool.d.ts +13 -0
- package/dist/beam/tool.d.ts.map +1 -0
- package/dist/beam/tool.js +152 -0
- package/dist/box-vent/panel.d.ts.map +1 -1
- package/dist/box-vent/panel.js +8 -7
- package/dist/cabinet/batchable.d.ts +10 -0
- package/dist/cabinet/batchable.d.ts.map +1 -0
- package/dist/cabinet/batchable.js +12 -0
- package/dist/cabinet/compartment-card.d.ts.map +1 -1
- package/dist/cabinet/compartment-card.js +142 -46
- package/dist/cabinet/countertop-layout.d.ts +5 -0
- package/dist/cabinet/countertop-layout.d.ts.map +1 -1
- package/dist/cabinet/definition.d.ts.map +1 -1
- package/dist/cabinet/definition.js +3 -0
- package/dist/cabinet/dimension-input.d.ts +6 -0
- package/dist/cabinet/dimension-input.d.ts.map +1 -0
- package/dist/cabinet/dimension-input.js +8 -0
- package/dist/cabinet/essential-controls.d.ts.map +1 -1
- package/dist/cabinet/essential-controls.js +82 -17
- package/dist/cabinet/index.d.ts +1 -1
- package/dist/cabinet/index.d.ts.map +1 -1
- package/dist/cabinet/index.js +1 -1
- package/dist/cabinet/kitchen-catalog.d.ts +17 -4
- package/dist/cabinet/kitchen-catalog.d.ts.map +1 -1
- package/dist/cabinet/kitchen-catalog.js +45 -7
- package/dist/cabinet/kitchen-collection.d.ts.map +1 -1
- package/dist/cabinet/kitchen-collection.js +21 -5
- package/dist/cabinet/kitchen-module-actions.d.ts.map +1 -1
- package/dist/cabinet/kitchen-module-actions.js +107 -14
- package/dist/cabinet/neighbor-placement.d.ts +10 -0
- package/dist/cabinet/neighbor-placement.d.ts.map +1 -1
- package/dist/cabinet/panel.d.ts.map +1 -1
- package/dist/cabinet/panel.js +127 -50
- package/dist/cabinet/run-finishing.d.ts +5 -0
- package/dist/cabinet/run-finishing.d.ts.map +1 -1
- package/dist/cabinet/run-ops.d.ts +5 -0
- package/dist/cabinet/run-ops.d.ts.map +1 -1
- package/dist/cabinet/run-panel.d.ts.map +1 -1
- package/dist/cabinet/run-panel.js +203 -52
- package/dist/cabinet/tool.d.ts.map +1 -1
- package/dist/cabinet/tool.js +8 -5
- package/dist/ceiling/build-up-section.d.ts +7 -0
- package/dist/ceiling/build-up-section.d.ts.map +1 -0
- package/dist/ceiling/build-up-section.js +57 -0
- package/dist/ceiling/definition.d.ts.map +1 -1
- package/dist/ceiling/definition.js +3 -1
- package/dist/ceiling/floorplan-affordances.d.ts +112 -0
- package/dist/ceiling/floorplan-affordances.d.ts.map +1 -1
- package/dist/ceiling/materials.d.ts +5 -0
- package/dist/ceiling/materials.d.ts.map +1 -1
- package/dist/ceiling/materials.js +17 -0
- package/dist/ceiling/panel-model.d.ts +13 -0
- package/dist/ceiling/panel-model.d.ts.map +1 -0
- package/dist/ceiling/panel-model.js +49 -0
- package/dist/ceiling/panel.d.ts.map +1 -1
- package/dist/ceiling/panel.js +82 -18
- package/dist/ceiling/renderer.d.ts.map +1 -1
- package/dist/ceiling/renderer.js +10 -4
- package/dist/ceiling/tool.d.ts.map +1 -1
- package/dist/ceiling/tool.js +24 -4
- package/dist/chimney/panel.d.ts.map +1 -1
- package/dist/chimney/panel.js +113 -41
- package/dist/column/definition.d.ts.map +1 -1
- package/dist/column/definition.js +3 -0
- package/dist/column/floorplan.d.ts.map +1 -1
- package/dist/column/floorplan.js +17 -0
- package/dist/column/hosted-resize.d.ts +28 -1
- package/dist/column/hosted-resize.d.ts.map +1 -1
- package/dist/column/panel.d.ts.map +1 -1
- package/dist/column/panel.js +125 -37
- package/dist/column/post-options.d.ts +10 -0
- package/dist/column/post-options.d.ts.map +1 -0
- package/dist/column/post-options.js +71 -0
- package/dist/column/post-placement.d.ts +78 -0
- package/dist/column/post-placement.d.ts.map +1 -0
- package/dist/column/post-placement.js +157 -0
- package/dist/column/post-section.d.ts +17 -0
- package/dist/column/post-section.d.ts.map +1 -0
- package/dist/column/post-section.js +95 -0
- package/dist/column/post-tool.d.ts +11 -0
- package/dist/column/post-tool.d.ts.map +1 -0
- package/dist/column/post-tool.js +94 -0
- package/dist/column/tool.d.ts +3 -10
- package/dist/column/tool.d.ts.map +1 -1
- package/dist/column/tool.js +13 -1
- package/dist/cupola/panel.d.ts.map +1 -1
- package/dist/cupola/panel.js +14 -7
- package/dist/door/actions.d.ts +7 -0
- package/dist/door/actions.d.ts.map +1 -0
- package/dist/door/actions.js +32 -0
- package/dist/door/contextual-dimensions.d.ts.map +1 -1
- package/dist/door/contextual-dimensions.js +11 -1
- package/dist/door/definition.d.ts.map +1 -1
- package/dist/door/definition.js +34 -7
- package/dist/door/floorplan-affordances.d.ts.map +1 -1
- package/dist/door/floorplan-affordances.js +5 -2
- package/dist/door/floorplan-move.d.ts.map +1 -1
- package/dist/door/floorplan-move.js +28 -6
- package/dist/door/floorplan.d.ts +2 -0
- package/dist/door/floorplan.d.ts.map +1 -1
- package/dist/door/floorplan.js +89 -16
- package/dist/door/move-tool.d.ts.map +1 -1
- package/dist/door/move-tool.js +60 -16
- package/dist/door/paint.d.ts +2 -7
- package/dist/door/paint.d.ts.map +1 -1
- package/dist/door/paint.js +26 -2
- package/dist/door/panel.d.ts.map +1 -1
- package/dist/door/panel.js +242 -90
- package/dist/door/parametrics.js +1 -1
- package/dist/door/placement.d.ts.map +1 -1
- package/dist/door/placement.js +9 -2
- package/dist/door/swing.d.ts +22 -0
- package/dist/door/swing.d.ts.map +1 -0
- package/dist/door/swing.js +36 -0
- package/dist/door/tool.d.ts.map +1 -1
- package/dist/door/tool.js +76 -29
- package/dist/dormer/panel-actions-section.d.ts.map +1 -1
- package/dist/dormer/panel-actions-section.js +3 -1
- package/dist/dormer/panel-position-section.d.ts.map +1 -1
- package/dist/dormer/panel-position-section.js +4 -3
- package/dist/dormer/panel-windows-section.d.ts.map +1 -1
- package/dist/dormer/panel-windows-section.js +38 -1
- package/dist/dormer/panel.d.ts.map +1 -1
- package/dist/dormer/panel.js +24 -18
- package/dist/downspout/inspector-editors.d.ts.map +1 -1
- package/dist/downspout/inspector-editors.js +3 -2
- package/dist/duct-fitting/inspector-editors.d.ts.map +1 -1
- package/dist/duct-fitting/inspector-editors.js +6 -1
- package/dist/duct-fitting/tool.d.ts.map +1 -1
- package/dist/duct-fitting/tool.js +11 -2
- package/dist/duct-terminal/tool.d.ts.map +1 -1
- package/dist/duct-terminal/tool.js +11 -2
- package/dist/elevator/panel.d.ts.map +1 -1
- package/dist/elevator/panel.js +41 -18
- package/dist/eyebrow-vent/panel.d.ts.map +1 -1
- package/dist/eyebrow-vent/panel.js +16 -6
- package/dist/fence/drafting.d.ts +2 -3
- package/dist/fence/drafting.d.ts.map +1 -1
- package/dist/fence/drafting.js +2 -3
- package/dist/fence/inspector-editors.d.ts.map +1 -1
- package/dist/fence/inspector-editors.js +64 -21
- package/dist/fence/move-endpoint-tool.d.ts.map +1 -1
- package/dist/fence/move-endpoint-tool.js +11 -2
- package/dist/fence/system.d.ts.map +1 -1
- package/dist/fence/system.js +13 -0
- package/dist/fence-feature/actions.d.ts.map +1 -1
- package/dist/fence-feature/actions.js +5 -2
- package/dist/fence-feature/inspector.d.ts.map +1 -1
- package/dist/fence-feature/inspector.js +150 -34
- package/dist/fence-feature/move-session.d.ts +1 -1
- package/dist/floor-opening/floorplan.d.ts +29 -6
- package/dist/floor-opening/floorplan.d.ts.map +1 -1
- package/dist/floor-opening/floorplan.js +172 -14
- package/dist/gutter/downspouts-panel.d.ts.map +1 -1
- package/dist/gutter/downspouts-panel.js +14 -2
- package/dist/hvac-equipment/tool.d.ts.map +1 -1
- package/dist/hvac-equipment/tool.js +3 -2
- package/dist/i18n/definition-messages.d.ts +5 -0
- package/dist/i18n/definition-messages.d.ts.map +1 -0
- package/dist/i18n/definition-messages.js +771 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/item/authored-params.d.ts.map +1 -1
- package/dist/item/authored-params.js +19 -4
- package/dist/item/floorplan.d.ts +1 -1
- package/dist/item/floorplan.d.ts.map +1 -1
- package/dist/item/panel.d.ts.map +1 -1
- package/dist/item/panel.js +9 -7
- package/dist/liquid-line/tool.d.ts.map +1 -1
- package/dist/liquid-line/tool.js +10 -3
- package/dist/measurement/tool.d.ts +1 -1
- package/dist/measurement/tool.d.ts.map +1 -1
- package/dist/measurement/tool.js +8 -8
- package/dist/pipe-fitting/tool.d.ts.map +1 -1
- package/dist/pipe-fitting/tool.js +3 -2
- package/dist/pipe-trap/tool.d.ts.map +1 -1
- package/dist/pipe-trap/tool.js +7 -2
- package/dist/procedural-item/renderer.d.ts.map +1 -1
- package/dist/procedural-item/renderer.js +8 -1
- package/dist/ridge-vent/panel.d.ts.map +1 -1
- package/dist/ridge-vent/panel.js +22 -9
- package/dist/roof/barrel-panel.d.ts.map +1 -1
- package/dist/roof/barrel-panel.js +7 -3
- package/dist/roof/definition.d.ts.map +1 -1
- package/dist/roof/definition.js +33 -3
- package/dist/roof/floorplan-overrides.d.ts +22 -0
- package/dist/roof/floorplan-overrides.d.ts.map +1 -0
- package/dist/roof/floorplan-overrides.js +46 -0
- package/dist/roof/floorplan-tool.d.ts +9 -0
- package/dist/roof/floorplan-tool.d.ts.map +1 -0
- package/dist/roof/floorplan-tool.js +168 -0
- package/dist/roof/floorplan.d.ts.map +1 -1
- package/dist/roof/floorplan.js +131 -41
- package/dist/roof/glazing-controls.d.ts +2 -1
- package/dist/roof/glazing-controls.d.ts.map +1 -1
- package/dist/roof/glazing-controls.js +51 -13
- package/dist/roof/glazing-panel-editor.d.ts.map +1 -1
- package/dist/roof/glazing-panel-editor.js +40 -13
- package/dist/roof/glazing-panel.d.ts.map +1 -1
- package/dist/roof/glazing-panel.js +73 -9
- package/dist/roof/paint.d.ts +19 -0
- package/dist/roof/paint.d.ts.map +1 -0
- package/dist/roof/paint.js +158 -0
- package/dist/roof/panel.d.ts.map +1 -1
- package/dist/roof/panel.js +90 -22
- package/dist/roof/renderer.d.ts.map +1 -1
- package/dist/roof/renderer.js +13 -2
- package/dist/roof/roof-footprint-source.d.ts +17 -0
- package/dist/roof/roof-footprint-source.d.ts.map +1 -1
- package/dist/roof/roof-footprint-source.js +14 -0
- package/dist/roof/roof-footprint.d.ts +36 -2
- package/dist/roof/roof-footprint.d.ts.map +1 -1
- package/dist/roof/roof-footprint.js +124 -2
- package/dist/roof/roof-materials.d.ts.map +1 -1
- package/dist/roof/roof-materials.js +10 -1
- package/dist/roof/roof-placement-mode.d.ts +0 -2
- package/dist/roof/roof-placement-mode.d.ts.map +1 -1
- package/dist/roof/roof-placement-mode.js +8 -6
- package/dist/roof/roof-plan-creases.d.ts +50 -0
- package/dist/roof/roof-plan-creases.d.ts.map +1 -0
- package/dist/roof/roof-plan-creases.js +194 -0
- package/dist/roof/roof-ridge-mode.d.ts +20 -0
- package/dist/roof/roof-ridge-mode.d.ts.map +1 -0
- package/dist/roof/roof-ridge-mode.js +16 -0
- package/dist/roof/tool.d.ts +17 -4
- package/dist/roof/tool.d.ts.map +1 -1
- package/dist/roof/tool.js +211 -113
- package/dist/roof/wall-catch.d.ts +106 -0
- package/dist/roof/wall-catch.d.ts.map +1 -0
- package/dist/roof/wall-catch.js +267 -0
- package/dist/roof-segment/build-up-section.d.ts +9 -0
- package/dist/roof-segment/build-up-section.d.ts.map +1 -0
- package/dist/roof-segment/build-up-section.js +191 -0
- package/dist/roof-segment/definition.d.ts.map +1 -1
- package/dist/roof-segment/definition.js +50 -5
- package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
- package/dist/roof-segment/floorplan-affordances.js +68 -19
- package/dist/roof-segment/floorplan.d.ts.map +1 -1
- package/dist/roof-segment/floorplan.js +16 -12
- package/dist/roof-segment/paint.d.ts +3 -1
- package/dist/roof-segment/paint.d.ts.map +1 -1
- package/dist/roof-segment/paint.js +43 -2
- package/dist/roof-segment/panel-model.d.ts +23 -0
- package/dist/roof-segment/panel-model.d.ts.map +1 -0
- package/dist/roof-segment/panel-model.js +64 -0
- package/dist/roof-segment/panel.d.ts.map +1 -1
- package/dist/roof-segment/panel.js +96 -14
- package/dist/roof-segment/parametrics.d.ts.map +1 -1
- package/dist/roof-segment/parametrics.js +4 -0
- package/dist/roof-segment/renderer.d.ts.map +1 -1
- package/dist/roof-segment/renderer.js +26 -5
- package/dist/separator/definition.d.ts.map +1 -1
- package/dist/separator/definition.js +10 -12
- package/dist/separator/floorplan-affordances.d.ts +9 -0
- package/dist/separator/floorplan-affordances.d.ts.map +1 -0
- package/dist/separator/floorplan-affordances.js +23 -0
- package/dist/separator/floorplan.d.ts +9 -0
- package/dist/separator/floorplan.d.ts.map +1 -0
- package/dist/separator/floorplan.js +54 -0
- package/dist/separator/renderer.d.ts +4 -0
- package/dist/separator/renderer.d.ts.map +1 -1
- package/dist/separator/renderer.js +21 -6
- package/dist/separator/selection.d.ts +10 -0
- package/dist/separator/selection.d.ts.map +1 -0
- package/dist/separator/selection.js +35 -0
- package/dist/shared/build-up-controls.d.ts +88 -0
- package/dist/shared/build-up-controls.d.ts.map +1 -0
- package/dist/shared/build-up-controls.js +139 -0
- package/dist/shared/curtain-opening-limits.d.ts.map +1 -1
- package/dist/shared/curtain-opening-limits.js +44 -14
- package/dist/shared/item-interaction-actions.d.ts.map +1 -1
- package/dist/shared/item-interaction-actions.js +11 -2
- package/dist/shared/layer-thickness.d.ts +2 -0
- package/dist/shared/layer-thickness.d.ts.map +1 -0
- package/dist/shared/layer-thickness.js +3 -0
- package/dist/shared/move-roof-tool.d.ts.map +1 -1
- package/dist/shared/move-roof-tool.js +100 -5
- package/dist/shared/node-batch/batchable.d.ts +2 -0
- package/dist/shared/node-batch/batchable.d.ts.map +1 -1
- package/dist/shared/node-batch/batchable.js +4 -0
- package/dist/shared/node-batch/candidates.d.ts +21 -5
- package/dist/shared/node-batch/candidates.d.ts.map +1 -1
- package/dist/shared/node-batch/candidates.js +85 -50
- package/dist/shared/node-batch/system.d.ts.map +1 -1
- package/dist/shared/node-batch/system.js +24 -15
- package/dist/shared/opening-casing-move.d.ts +16 -0
- package/dist/shared/opening-casing-move.d.ts.map +1 -0
- package/dist/shared/opening-casing-move.js +33 -0
- package/dist/shared/opening-casing-section.d.ts +15 -0
- package/dist/shared/opening-casing-section.d.ts.map +1 -0
- package/dist/shared/opening-casing-section.js +38 -0
- package/dist/shared/opening-casing.d.ts +26 -0
- package/dist/shared/opening-casing.d.ts.map +1 -0
- package/dist/shared/opening-casing.js +80 -0
- package/dist/shared/opening-depth-position.d.ts +13 -0
- package/dist/shared/opening-depth-position.d.ts.map +1 -0
- package/dist/shared/opening-depth-position.js +34 -0
- package/dist/shared/opening-documentation.d.ts.map +1 -1
- package/dist/shared/opening-documentation.js +17 -8
- package/dist/shared/opening-guides-runtime.d.ts +2 -1
- package/dist/shared/opening-guides-runtime.d.ts.map +1 -1
- package/dist/shared/opening-guides-runtime.js +11 -7
- package/dist/shared/opening-labels.d.ts +11 -0
- package/dist/shared/opening-labels.d.ts.map +1 -0
- package/dist/shared/opening-labels.js +46 -0
- package/dist/shared/opening-placement-dimensions.d.ts.map +1 -1
- package/dist/shared/opening-placement-dimensions.js +11 -9
- package/dist/shared/opening-plane-offset.d.ts +4 -3
- package/dist/shared/opening-plane-offset.d.ts.map +1 -1
- package/dist/shared/opening-plane-offset.js +7 -4
- package/dist/shared/opening-swap.d.ts +8 -0
- package/dist/shared/opening-swap.d.ts.map +1 -0
- package/dist/shared/opening-swap.js +18 -0
- package/dist/shared/polygon-vertex-affordance.d.ts +19 -0
- package/dist/shared/polygon-vertex-affordance.d.ts.map +1 -1
- package/dist/shared/polygon-vertex-affordance.js +65 -6
- package/dist/shared/roof-opening-host.d.ts +2 -1
- package/dist/shared/roof-opening-host.d.ts.map +1 -1
- package/dist/shared/roof-opening-host.js +14 -5
- package/dist/shared/roof-wall-opening-cut.d.ts.map +1 -1
- package/dist/shared/roof-wall-opening-cut.js +14 -6
- package/dist/shared/roof-wall-opening-placement.d.ts +2 -1
- package/dist/shared/roof-wall-opening-placement.d.ts.map +1 -1
- package/dist/shared/roof-wall-opening-placement.js +6 -4
- package/dist/shared/run-hanger-inspector.d.ts.map +1 -1
- package/dist/shared/run-hanger-inspector.js +39 -5
- package/dist/shared/system-check-panel.d.ts.map +1 -1
- package/dist/shared/system-check-panel.js +94 -15
- package/dist/shared/wall-attach-target.d.ts.map +1 -1
- package/dist/shared/wall-attach-target.js +6 -3
- package/dist/shelf/definition.d.ts.map +1 -1
- package/dist/shelf/definition.js +2 -0
- package/dist/site/ground-hole.d.ts +3 -3
- package/dist/site/ground-hole.js +3 -3
- package/dist/site/ground-veil.d.ts +5 -12
- package/dist/site/ground-veil.d.ts.map +1 -1
- package/dist/site/ground-veil.js +9 -33
- package/dist/site/panel.d.ts.map +1 -1
- package/dist/site/panel.js +52 -12
- package/dist/site/renderer.d.ts.map +1 -1
- package/dist/site/renderer.js +52 -23
- package/dist/skylight/panel.d.ts.map +1 -1
- package/dist/skylight/panel.js +49 -19
- package/dist/slab/deck-geometry.d.ts +28 -0
- package/dist/slab/deck-geometry.d.ts.map +1 -0
- package/dist/slab/deck-geometry.js +320 -0
- package/dist/slab/definition.d.ts +2 -1
- package/dist/slab/definition.d.ts.map +1 -1
- package/dist/slab/definition.js +6 -1
- package/dist/slab/dependency-tracker.d.ts.map +1 -1
- package/dist/slab/dependency-tracker.js +3 -0
- package/dist/slab/floorplan-affordances.d.ts +500 -0
- package/dist/slab/floorplan-affordances.d.ts.map +1 -1
- package/dist/slab/geometry.d.ts.map +1 -1
- package/dist/slab/geometry.js +46 -9
- package/dist/slab/panel.d.ts.map +1 -1
- package/dist/slab/panel.js +97 -21
- package/dist/slab/renderer.d.ts +11 -0
- package/dist/slab/renderer.d.ts.map +1 -0
- package/dist/slab/renderer.js +19 -0
- package/dist/slab/system.d.ts.map +1 -1
- package/dist/slab/system.js +12 -1
- package/dist/solar-panel/panel.d.ts.map +1 -1
- package/dist/solar-panel/panel.js +49 -14
- package/dist/stair/construction-controls.d.ts +3 -1
- package/dist/stair/construction-controls.d.ts.map +1 -1
- package/dist/stair/construction-controls.js +75 -12
- package/dist/stair/paint.d.ts +6 -0
- package/dist/stair/paint.d.ts.map +1 -1
- package/dist/stair/panel.d.ts.map +1 -1
- package/dist/stair/panel.js +243 -51
- package/dist/stair/parametrics.d.ts.map +1 -1
- package/dist/stair/parametrics.js +7 -0
- package/dist/stair/placement-defaults.d.ts +18 -0
- package/dist/stair/placement-defaults.d.ts.map +1 -0
- package/dist/stair/placement-defaults.js +27 -0
- package/dist/stair/railing-controls.d.ts.map +1 -1
- package/dist/stair/railing-controls.js +78 -18
- package/dist/stair/renderer.d.ts.map +1 -1
- package/dist/stair/renderer.js +16 -10
- package/dist/stair/structure-controls.d.ts +18 -0
- package/dist/stair/structure-controls.d.ts.map +1 -0
- package/dist/stair/structure-controls.js +275 -0
- package/dist/stair/tool.d.ts.map +1 -1
- package/dist/stair/tool.js +13 -9
- package/dist/stair/use-stair-render-data.d.ts +41 -0
- package/dist/stair/use-stair-render-data.d.ts.map +1 -1
- package/dist/stair-segment/panel.d.ts.map +1 -1
- package/dist/stair-segment/panel.js +65 -18
- package/dist/turbine-vent/panel.d.ts.map +1 -1
- package/dist/turbine-vent/panel.js +14 -5
- package/dist/unit/unit-panel.d.ts.map +1 -1
- package/dist/unit/unit-panel.js +28 -12
- package/dist/wall/actions.d.ts +1 -1
- package/dist/wall/actions.d.ts.map +1 -1
- package/dist/wall/actions.js +17 -13
- package/dist/wall/construction-dimensions.d.ts +6 -0
- package/dist/wall/construction-dimensions.d.ts.map +1 -1
- package/dist/wall/construction-dimensions.js +8 -0
- package/dist/wall/contextual-dimensions.d.ts +6 -0
- package/dist/wall/contextual-dimensions.d.ts.map +1 -1
- package/dist/wall/contextual-dimensions.js +104 -17
- package/dist/wall/curtain-opening-frame.d.ts.map +1 -1
- package/dist/wall/curtain-opening-frame.js +6 -4
- package/dist/wall/curtain-wall-layout.d.ts +1 -1
- package/dist/wall/curtain-wall-layout.d.ts.map +1 -1
- package/dist/wall/curtain-wall-layout.js +6 -4
- package/dist/wall/curtain-wall-materials.d.ts.map +1 -1
- package/dist/wall/curtain-wall-materials.js +8 -3
- package/dist/wall/curtain-wall-panel.d.ts.map +1 -1
- package/dist/wall/curtain-wall-panel.js +241 -37
- package/dist/wall/curve-tool.d.ts.map +1 -1
- package/dist/wall/curve-tool.js +2 -3
- package/dist/wall/definition.d.ts.map +1 -1
- package/dist/wall/definition.js +20 -5
- package/dist/wall/floorplan-affordances.d.ts.map +1 -1
- package/dist/wall/floorplan-affordances.js +9 -6
- package/dist/wall/floorplan-move.d.ts.map +1 -1
- package/dist/wall/floorplan-move.js +66 -16
- package/dist/wall/floorplan.d.ts +4 -5
- package/dist/wall/floorplan.d.ts.map +1 -1
- package/dist/wall/floorplan.js +62 -46
- package/dist/wall/move-endpoint-tool.d.ts.map +1 -1
- package/dist/wall/move-endpoint-tool.js +1 -0
- package/dist/wall/move-tool.d.ts.map +1 -1
- package/dist/wall/move-tool.js +77 -12
- package/dist/wall/paint.d.ts +2 -2
- package/dist/wall/paint.d.ts.map +1 -1
- package/dist/wall/paint.js +11 -4
- package/dist/wall/panel-model.d.ts +17 -2
- package/dist/wall/panel-model.d.ts.map +1 -1
- package/dist/wall/panel-model.js +158 -18
- package/dist/wall/panel.d.ts +8 -0
- package/dist/wall/panel.d.ts.map +1 -1
- package/dist/wall/panel.js +228 -156
- package/dist/wall/parametrics.d.ts +1 -1
- package/dist/wall/parametrics.d.ts.map +1 -1
- package/dist/wall/parametrics.js +14 -1
- package/dist/wall/railing-wall-adapter.d.ts +7 -0
- package/dist/wall/railing-wall-adapter.d.ts.map +1 -0
- package/dist/wall/railing-wall-adapter.js +38 -0
- package/dist/wall/railing-wall-floorplan.d.ts +8 -0
- package/dist/wall/railing-wall-floorplan.d.ts.map +1 -0
- package/dist/wall/railing-wall-floorplan.js +27 -0
- package/dist/wall/railing-wall-geometry.d.ts +12 -0
- package/dist/wall/railing-wall-geometry.d.ts.map +1 -0
- package/dist/wall/railing-wall-geometry.js +51 -0
- package/dist/wall/railing-wall-guard.d.ts +81 -0
- package/dist/wall/railing-wall-guard.d.ts.map +1 -0
- package/dist/wall/railing-wall-guard.js +435 -0
- package/dist/wall/railing-wall-materials.d.ts +11 -0
- package/dist/wall/railing-wall-materials.d.ts.map +1 -0
- package/dist/wall/railing-wall-materials.js +31 -0
- package/dist/wall/railing-wall-panel-model.d.ts +30 -0
- package/dist/wall/railing-wall-panel-model.d.ts.map +1 -0
- package/dist/wall/railing-wall-panel-model.js +117 -0
- package/dist/wall/railing-wall-panel.d.ts +17 -0
- package/dist/wall/railing-wall-panel.d.ts.map +1 -0
- package/dist/wall/railing-wall-panel.js +42 -0
- package/dist/wall/rectangle-command.d.ts +79 -1
- package/dist/wall/rectangle-command.d.ts.map +1 -1
- package/dist/wall/rectangle-tool.d.ts.map +1 -1
- package/dist/wall/rectangle-tool.js +2 -0
- package/dist/wall/renderer.d.ts.map +1 -1
- package/dist/wall/renderer.js +3 -1
- package/dist/wall/skirting-floor-gaps.d.ts +8 -0
- package/dist/wall/skirting-floor-gaps.d.ts.map +1 -0
- package/dist/wall/skirting-floor-gaps.js +36 -0
- package/dist/wall/system.d.ts +0 -14
- package/dist/wall/system.d.ts.map +1 -1
- package/dist/wall/system.js +6 -1
- package/dist/wall/tool.d.ts +16 -0
- package/dist/wall/tool.d.ts.map +1 -1
- package/dist/wall/tool.js +160 -47
- package/dist/wall/treatments.d.ts +3 -0
- package/dist/wall/treatments.d.ts.map +1 -1
- package/dist/wall/treatments.js +30 -7
- package/dist/window/actions.d.ts +7 -0
- package/dist/window/actions.d.ts.map +1 -0
- package/dist/window/actions.js +29 -0
- package/dist/window/definition.d.ts.map +1 -1
- package/dist/window/definition.js +11 -2
- package/dist/window/floorplan-move.d.ts.map +1 -1
- package/dist/window/floorplan-move.js +5 -0
- package/dist/window/floorplan.d.ts +2 -0
- package/dist/window/floorplan.d.ts.map +1 -1
- package/dist/window/floorplan.js +58 -1
- package/dist/window/mechanism.d.ts.map +1 -1
- package/dist/window/mechanism.js +21 -1
- package/dist/window/move-tool.d.ts.map +1 -1
- package/dist/window/move-tool.js +10 -3
- package/dist/window/paint.d.ts +2 -7
- package/dist/window/paint.d.ts.map +1 -1
- package/dist/window/paint.js +31 -3
- package/dist/window/panel.d.ts.map +1 -1
- package/dist/window/panel.js +311 -69
- package/dist/window/placement.d.ts.map +1 -1
- package/dist/window/placement.js +5 -1
- package/dist/window/swing.d.ts +13 -0
- package/dist/window/swing.d.ts.map +1 -0
- package/dist/window/swing.js +16 -0
- package/dist/window/tool.d.ts.map +1 -1
- package/dist/window/tool.js +19 -14
- package/dist/zone/floorplan-affordances.d.ts +136 -0
- package/dist/zone/floorplan-affordances.d.ts.map +1 -1
- package/dist/zone/quantities-panel.d.ts.map +1 -1
- package/dist/zone/quantities-panel.js +34 -9
- package/dist/zone/renderer.d.ts.map +1 -1
- package/dist/zone/renderer.js +9 -5
- package/package.json +14 -14
- package/dist/site/generic-foundation-geometry.d.ts +0 -16
- package/dist/site/generic-foundation-geometry.d.ts.map +0 -1
- package/dist/site/generic-foundation-geometry.js +0 -75
- package/dist/site/generic-foundation.d.ts +0 -4
- package/dist/site/generic-foundation.d.ts.map +0 -1
- package/dist/site/generic-foundation.js +0 -91
package/dist/door/paint.js
CHANGED
|
@@ -1,14 +1,38 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { slotDefaultPaintMaterial, slotPaintMaterial } from '@pascal-app/core';
|
|
2
|
+
import { openingCasingPaintLabel } from '../shared/opening-casing.js';
|
|
3
|
+
import { createSlotPaintCapability, declaredSlotLook, previewSlotByUserData, resolveSlotByReRaycast, } from '../shared/slot-paint.js';
|
|
2
4
|
/**
|
|
3
5
|
* Door paint on the unified slot model. The door's opening proxy (a proud,
|
|
4
6
|
* invisible cutout) wins the shared scene raycast over the wall in front of the
|
|
5
7
|
* recessed door body, so `resolveSlotByReRaycast` re-raycasts the door's own
|
|
6
8
|
* subtree to find the part (panel / frame / glass / hardware) under the cursor.
|
|
7
9
|
*/
|
|
8
|
-
|
|
10
|
+
const base = createSlotPaintCapability({
|
|
9
11
|
resolveRole: resolveSlotByReRaycast,
|
|
10
12
|
applyPreview: previewSlotByUserData,
|
|
13
|
+
erasedLook: ({ node, role, materials = {} }) => {
|
|
14
|
+
if (role !== 'casing-a' && role !== 'casing-b')
|
|
15
|
+
return declaredSlotLook(node, role);
|
|
16
|
+
if (node.type !== 'door' || node.source)
|
|
17
|
+
return null;
|
|
18
|
+
const frame = slotPaintMaterial(node.slots?.frame, materials) ?? slotDefaultPaintMaterial(node.slots?.frame);
|
|
19
|
+
if (frame)
|
|
20
|
+
return frame;
|
|
21
|
+
if (node.material)
|
|
22
|
+
return { material: node.material };
|
|
23
|
+
return declaredSlotLook(node, 'frame');
|
|
24
|
+
},
|
|
11
25
|
legacyEffective: (node, role) => node.type === 'door' && !node.source && node.material && (role === 'panel' || role === 'frame')
|
|
12
26
|
? { material: node.material, materialPreset: undefined }
|
|
13
27
|
: null,
|
|
14
28
|
});
|
|
29
|
+
export const doorPaint = {
|
|
30
|
+
...base,
|
|
31
|
+
roleLabel: (_node, role) => openingCasingPaintLabel(role),
|
|
32
|
+
getEffectiveMaterial: (args) => {
|
|
33
|
+
const own = base.getEffectiveMaterial?.(args);
|
|
34
|
+
if (own || (args.role !== 'casing-a' && args.role !== 'casing-b'))
|
|
35
|
+
return own ?? null;
|
|
36
|
+
return base.getEffectiveMaterial?.({ ...args, role: 'frame' }) ?? null;
|
|
37
|
+
},
|
|
38
|
+
};
|
package/dist/door/panel.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/door/panel.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/door/panel.tsx"],"names":[],"mappings":"AA0HA,MAAM,CAAC,OAAO,UAAU,SAAS,uCA2uChC"}
|
package/dist/door/panel.js
CHANGED
|
@@ -1,21 +1,70 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { scriptImages, useInteractive, useScene, } from '@pascal-app/core';
|
|
4
|
-
import {
|
|
5
|
-
import { ActionButton, ActionGroup, cn, duplicateNodeAndPickUp, PanelSection, PanelWrapper, SegmentedControl, SliderControl, ToggleControl, triggerSFX, useEditor, } from '@pascal-app/editor';
|
|
3
|
+
import { doorHandleStyle, doorPositionForFacing, isAutoFrameDepth, resolveHostedOpeningFrameDepth, scriptImages, useInteractive, usePascalI18n, useScene, } from '@pascal-app/core';
|
|
4
|
+
import { DOOR_STYLES, doorStyleLook, doorStylesOf, doorTypeChange } from '@pascal-app/core/building';
|
|
5
|
+
import { ActionButton, ActionGroup, cn, duplicateNodeAndPickUp, FinishSwatch, PanelSection, PanelWrapper, SegmentedControl, SliderControl, ToggleControl, triggerSFX, useEditor, } from '@pascal-app/editor';
|
|
6
6
|
import { useViewer } from '@pascal-app/viewer';
|
|
7
7
|
import { Copy, DoorOpen, FlipHorizontal2, Move, Trash2 } from 'lucide-react';
|
|
8
8
|
import { useCallback, useEffect, useMemo } from 'react';
|
|
9
9
|
import { AuthoredParams } from '../item/authored-params.js';
|
|
10
10
|
import { constrainCurtainOpening, curtainOpeningLimits } from '../shared/curtain-opening-limits.js';
|
|
11
|
+
import { OpeningCasingSection } from '../shared/opening-casing-section.js';
|
|
12
|
+
import { OpeningDepthPositionControl } from '../shared/opening-depth-position.js';
|
|
13
|
+
import { DOOR_STYLE_MESSAGES } from '../shared/opening-labels.js';
|
|
11
14
|
import { createOpeningPropertyPreview } from '../shared/opening-property-preview.js';
|
|
12
15
|
import { openingPropertyPreviewHost } from '../shared/opening-property-preview-host.js';
|
|
13
16
|
import { scaleHandleHeight } from './door-math.js';
|
|
14
17
|
import { doorTypeOptions } from './placement.js';
|
|
18
|
+
import { hingesSidePatch } from './swing.js';
|
|
19
|
+
/** The type cards' names; `doorTypeOptions` keeps English for the placement chips. */
|
|
20
|
+
const DOOR_TYPE_LABELS = {
|
|
21
|
+
hinged: /* i18n */ { id: 'node.door.type.hinged', message: 'Hinged' },
|
|
22
|
+
double: /* i18n */ { id: 'node.door.type.double', message: 'Double' },
|
|
23
|
+
french: /* i18n */ { id: 'node.door.type.french', message: 'French' },
|
|
24
|
+
folding: /* i18n */ { id: 'node.door.type.folding', message: 'Folding' },
|
|
25
|
+
pocket: /* i18n */ { id: 'node.door.type.pocket', message: 'Pocket' },
|
|
26
|
+
barn: /* i18n */ { id: 'node.door.type.barn', message: 'Barn' },
|
|
27
|
+
sliding: /* i18n */ { id: 'node.door.type.sliding', message: 'Sliding' },
|
|
28
|
+
'garage-sectional': /* i18n */ { id: 'node.door.type.garageSectional', message: 'Sectional' },
|
|
29
|
+
'garage-rollup': /* i18n */ { id: 'node.door.type.garageRollup', message: 'Roll-up' },
|
|
30
|
+
'garage-tiltup': /* i18n */ { id: 'node.door.type.garageTiltup', message: 'Tilt-up' },
|
|
31
|
+
};
|
|
32
|
+
const HANDLE_STYLE_LABELS = {
|
|
33
|
+
lever: /* i18n */ { id: 'node.door.panel.handleLever', message: 'Lever' },
|
|
34
|
+
'lever-curved': /* i18n */ {
|
|
35
|
+
id: 'node.door.panel.handleLeverCurved',
|
|
36
|
+
message: 'Curved lever',
|
|
37
|
+
},
|
|
38
|
+
knob: /* i18n */ { id: 'node.door.panel.handleKnob', message: 'Knob' },
|
|
39
|
+
bar: /* i18n */ { id: 'node.door.panel.handleBar', message: 'Bar' },
|
|
40
|
+
plate: /* i18n */ { id: 'node.door.panel.handlePlate', message: 'Plate' },
|
|
41
|
+
};
|
|
42
|
+
const HANDLE_STYLES = Object.keys(HANDLE_STYLE_LABELS);
|
|
43
|
+
// The leaf profile clamps a raised or recessed field to 12 mm (viewer door/leaf-profile.ts); below
|
|
44
|
+
// zero the field is recessed.
|
|
45
|
+
const PANEL_DEPTH_MAX = 0.012;
|
|
46
|
+
// Fixed lights beside and above a swing door's leaf; 0 is none.
|
|
47
|
+
const SIDELIGHT_MAX = 0.6;
|
|
48
|
+
// The hardware slot's declared default (packages/core/src/node-slots/door.ts), shown as "Default".
|
|
49
|
+
const HARDWARE_FINISH_DEFAULT = 'library:metal-chrome';
|
|
50
|
+
// What the viewer draws for each stored leaf count (door-system `slidingPanels`, folding chain).
|
|
51
|
+
const FOLDING_PANEL_COUNTS = [2, 4, 6, 8];
|
|
52
|
+
const SLIDING_PANEL_COUNTS = [2, 3, 4];
|
|
53
|
+
const foldingPanelCount = (leafCount) => leafCount >= 6 ? leafCount : leafCount === 2 ? 2 : 4;
|
|
54
|
+
const slidingPanelCount = (leafCount) => Math.max(2, Math.min(4, leafCount));
|
|
15
55
|
const garageDoorTypeOptions = [
|
|
16
|
-
{
|
|
17
|
-
|
|
18
|
-
|
|
56
|
+
{
|
|
57
|
+
value: 'garage-sectional',
|
|
58
|
+
available: true,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
value: 'garage-rollup',
|
|
62
|
+
available: true,
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
value: 'garage-tiltup',
|
|
66
|
+
available: true,
|
|
67
|
+
},
|
|
19
68
|
];
|
|
20
69
|
function isSameDoorValue(current, next) {
|
|
21
70
|
if (typeof current === 'number' && typeof next === 'number') {
|
|
@@ -28,6 +77,7 @@ function isSameDoorValue(current, next) {
|
|
|
28
77
|
return Object.is(current, next);
|
|
29
78
|
}
|
|
30
79
|
export default function DoorPanel() {
|
|
80
|
+
const i18n = usePascalI18n();
|
|
31
81
|
const selectedId = useViewer((s) => s.selection.selectedIds[0]);
|
|
32
82
|
const setSelection = useViewer((s) => s.setSelection);
|
|
33
83
|
const deleteNode = useScene((s) => s.deleteNode);
|
|
@@ -37,6 +87,8 @@ export default function DoorPanel() {
|
|
|
37
87
|
: null, [selectedId]);
|
|
38
88
|
useEffect(() => () => preview?.cancel(), [preview]);
|
|
39
89
|
const node = useScene((s) => selectedId ? s.nodes[selectedId] : undefined);
|
|
90
|
+
// The depth the frame renders at: explicit, or the host wall's thickness plus the lip.
|
|
91
|
+
const frameDepth = useScene((s) => (node ? resolveHostedOpeningFrameDepth(node, s.nodes) : 0));
|
|
40
92
|
// Stable handler refs ("Custom panels" in wiki/architecture/node-definitions.md).
|
|
41
93
|
// Without them, the 29+ SliderControls in this panel would loop on drag.
|
|
42
94
|
const handleUpdate = useCallback((updates) => {
|
|
@@ -72,6 +124,11 @@ export default function DoorPanel() {
|
|
|
72
124
|
handleUpdate({
|
|
73
125
|
side: node.side === 'front' ? 'back' : 'front',
|
|
74
126
|
rotation: [node.rotation[0], node.rotation[1] + Math.PI, node.rotation[2]],
|
|
127
|
+
position: doorPositionForFacing(node, [
|
|
128
|
+
node.rotation[0],
|
|
129
|
+
node.rotation[1] + Math.PI,
|
|
130
|
+
node.rotation[2],
|
|
131
|
+
]),
|
|
75
132
|
});
|
|
76
133
|
}, [node, handleUpdate]);
|
|
77
134
|
const handleMove = useCallback(() => {
|
|
@@ -171,7 +228,6 @@ export default function DoorPanel() {
|
|
|
171
228
|
const isCutoutOnly = isOpening;
|
|
172
229
|
const typeMode = isCutoutOnly ? 'opening' : isGarageDoor ? 'garage' : 'door';
|
|
173
230
|
const supportsHingeSide = doorType === 'hinged';
|
|
174
|
-
const supportsHandleSide = doorType === 'hinged';
|
|
175
231
|
const supportsTopShape = isSwingDoor;
|
|
176
232
|
const showFlipSide = !isCutoutOnly;
|
|
177
233
|
const showFoldSection = !scripted && isFoldingDoor && !isCutoutOnly;
|
|
@@ -182,11 +238,16 @@ export default function DoorPanel() {
|
|
|
182
238
|
const showOpeningShapeSection = !scripted && isCutoutOnly;
|
|
183
239
|
const showDoorShapeSection = !scripted && !isCutoutOnly && supportsTopShape;
|
|
184
240
|
const showFrameSection = !scripted && !isCutoutOnly;
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
const
|
|
188
|
-
|
|
189
|
-
const
|
|
241
|
+
// A plain passage (`openingKind: 'opening'`) has no leaf: no swing, threshold or hardware. Its
|
|
242
|
+
// Casing section stays, so the casing is not gated with these.
|
|
243
|
+
const showSwingSection = !scripted && !isCutoutOnly && isSwingDoor;
|
|
244
|
+
// Fixed lights only frame a swing leaf (getDoorOpeningSize ignores them on other types).
|
|
245
|
+
const showSidelights = !scripted && !isCutoutOnly && isSwingDoor;
|
|
246
|
+
const showThresholdSection = !scripted && !isCutoutOnly && isSwingDoor;
|
|
247
|
+
// Pocket, sliding, folding and barn doors draw their pulls, rails and rollers in the hardware
|
|
248
|
+
// slot: only its finish is theirs.
|
|
249
|
+
const showHardwareSection = !scripted && !isCutoutOnly && (isSwingDoor || isSlideFoldDoor);
|
|
250
|
+
// The segments and their leaf border; folded away while the leaf matches a style card.
|
|
190
251
|
const showSegmentsSection = !scripted && !isCutoutOnly && !isGarageDoor;
|
|
191
252
|
const maxDoorWidth = isGarageDoor ? 6 : 3;
|
|
192
253
|
const setOpeningTopRadius = (index, value, commit = false) => {
|
|
@@ -200,7 +261,7 @@ export default function DoorPanel() {
|
|
|
200
261
|
}
|
|
201
262
|
};
|
|
202
263
|
const getDoorTypeUpdates = (nextDoorType) => doorTypeChange(node, nextDoorType);
|
|
203
|
-
return (_jsxs(PanelWrapper, { icon: scriptImages(node)?.thumbnail ?? '/icons/door.webp', onClose: handleClose, title: node.name || 'Door', width: 320, children: [!scripted && (_jsxs(PanelSection, { title:
|
|
264
|
+
return (_jsxs(PanelWrapper, { icon: scriptImages(node)?.thumbnail ?? '/icons/door.webp', onClose: handleClose, title: node.name || i18n._({ id: 'node.door.panel.door', message: 'Door' }), width: 320, children: [!scripted && (_jsxs(PanelSection, { title: i18n._({ id: 'node.door.panel.type', message: 'Type' }), children: [_jsx("div", { className: "flex flex-col gap-2 px-1 pb-1", children: _jsx(SegmentedControl, { onChange: (v) => handleUpdate(v === 'opening'
|
|
204
265
|
? {
|
|
205
266
|
openingKind: v,
|
|
206
267
|
openingShape,
|
|
@@ -219,24 +280,81 @@ export default function DoorPanel() {
|
|
|
219
280
|
openingKind: 'door',
|
|
220
281
|
...(isGarageDoor ? getDoorTypeUpdates('hinged') : {}),
|
|
221
282
|
}), options: [
|
|
222
|
-
{ label: 'Door', value: 'door' },
|
|
223
|
-
{
|
|
224
|
-
|
|
283
|
+
{ label: i18n._({ id: 'node.door.panel.door', message: 'Door' }), value: 'door' },
|
|
284
|
+
{
|
|
285
|
+
label: i18n._({ id: 'node.door.panel.opening', message: 'Opening' }),
|
|
286
|
+
value: 'opening',
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
label: i18n._({ id: 'node.door.panel.garage', message: 'Garage' }),
|
|
290
|
+
value: 'garage',
|
|
291
|
+
},
|
|
225
292
|
], value: typeMode }) }), !isOpening && (_jsx("div", { className: "grid grid-cols-2 gap-2 px-1 pt-1", children: (isGarageDoor ? garageDoorTypeOptions : doorTypeOptions).map((option) => {
|
|
226
293
|
const isSelected = doorType === option.value;
|
|
227
294
|
return (_jsxs("button", { className: cn('flex min-h-12 items-center gap-2.5 rounded-lg border px-3 py-2.5 text-left text-xs transition-colors', isSelected
|
|
228
295
|
? 'border-orange-400/60 bg-orange-400/10 text-foreground'
|
|
229
296
|
: 'border-border/50 bg-black/4 dark:bg-[#2C2C2E] text-muted-foreground hover:bg-black/8 dark:hover:bg-[#3e3e3e] hover:text-foreground', !option.available &&
|
|
230
|
-
'cursor-not-allowed opacity-45 hover:bg-black/4 dark:hover:bg-[#2C2C2E] hover:text-muted-foreground'), disabled: !option.available, onClick: () => handleUpdate(getDoorTypeUpdates(option.value)), type: "button", children: [_jsx(DoorOpen, { className: "h-4 w-4 shrink-0" }), _jsx("span", { className: "truncate font-medium", children: option.
|
|
231
|
-
}) }))] })), !scripted && !isOpening && !isGarageDoor && (_jsxs(PanelSection, { title:
|
|
297
|
+
'cursor-not-allowed opacity-45 hover:bg-black/4 dark:hover:bg-[#2C2C2E] hover:text-muted-foreground'), disabled: !option.available, onClick: () => handleUpdate(getDoorTypeUpdates(option.value)), type: "button", children: [_jsx(DoorOpen, { className: "h-4 w-4 shrink-0" }), _jsx("span", { className: "truncate font-medium", children: i18n._(DOOR_TYPE_LABELS[option.value]) })] }, option.value));
|
|
298
|
+
}) }))] })), !scripted && !isOpening && !isGarageDoor && (_jsxs(PanelSection, { title: i18n._({ id: 'node.door.panel.style', message: 'Style' }), children: [_jsx("div", { className: "grid grid-cols-2 gap-2 px-1 pt-1", children: DOOR_STYLES.map((style) => (_jsx("button", { "aria-pressed": doorStyles.includes(style), className: cn('flex min-h-10 items-center rounded-lg border px-3 py-2 text-left text-xs transition-colors', doorStyles.includes(style)
|
|
232
299
|
? 'border-orange-400/60 bg-orange-400/10 text-foreground'
|
|
233
|
-
: 'border-border/50 bg-black/4 dark:bg-[#2C2C2E] text-muted-foreground hover:bg-black/8 dark:hover:bg-[#3e3e3e] hover:text-foreground'), onClick: () => handleUpdate(doorStyleLook(style)), type: "button", children: _jsx("span", { className: "truncate font-medium", children:
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
300
|
+
: 'border-border/50 bg-black/4 dark:bg-[#2C2C2E] text-muted-foreground hover:bg-black/8 dark:hover:bg-[#3e3e3e] hover:text-foreground'), onClick: () => handleUpdate(doorStyleLook(style)), type: "button", children: _jsx("span", { className: "truncate font-medium", children: i18n._(DOOR_STYLE_MESSAGES[style]) }) }, style))) }), !doorStyles.length && (_jsx("p", { className: "px-1 pt-2 text-muted-foreground text-xs", children: i18n._({
|
|
301
|
+
id: 'node.door.panel.customTheSegmentsMatchNoStyle',
|
|
302
|
+
message: 'Custom: the segments match no style.',
|
|
303
|
+
}) }))] })), !scripted && (_jsxs(PanelSection, { title: i18n._({ id: 'node.door.panel.dimensions', message: 'Dimensions' }), children: [limits && (_jsx("p", { className: "text-[11px] text-muted-foreground", children: i18n._({
|
|
304
|
+
id: 'node.door.panel.sizeIsLimitedToTheWall',
|
|
305
|
+
message: 'Size is limited to the wall, including clearance for the opening frame.',
|
|
306
|
+
}) })), _jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.width', message: 'Width' }), max: Math.min(maxDoorWidth, limits?.width ?? Infinity), min: Math.min(0.5, limits?.width ?? 0.5), onChange: (v) => previewDoorUpdate('width', v), onCommit: (v) => commitDoorPreview('width', v), onCancel: () => preview?.cancel(), previewWhileTyping: true, precision: 2, restoreOnCommit: false, step: 0.01, unit: "m", value: node.width }), _jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.height', message: 'Height' }), max: limits?.height ?? 1000, min: Math.min(1, limits?.height ?? 1), onChange: (v) => preview?.preview(heightUpdates(v)), onCommit: (v) => preview?.commit(heightUpdates(v)), onCancel: () => preview?.cancel(), previewWhileTyping: true, precision: 2, restoreOnCommit: false, step: 0.01, unit: "m", value: node.height }), showSidelights && (_jsxs("div", { className: "mt-1 flex flex-col gap-1 border-border/50 border-t pt-1", children: [_jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.leftSidelight', message: 'Left sidelight' }), max: SIDELIGHT_MAX, min: 0, onChange: (v) => handleUpdate({ sidelightLeft: v > 0 ? v : undefined }), precision: 2, step: 0.01, unit: "m", value: node.sidelightLeft ?? 0 }), _jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.rightSidelight', message: 'Right sidelight' }), max: SIDELIGHT_MAX, min: 0, onChange: (v) => handleUpdate({ sidelightRight: v > 0 ? v : undefined }), precision: 2, step: 0.01, unit: "m", value: node.sidelightRight ?? 0 }), _jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.transom', message: 'Transom' }), max: SIDELIGHT_MAX, min: 0, onChange: (v) => handleUpdate({ transomHeight: v > 0 ? v : undefined }), precision: 2, step: 0.01, unit: "m", value: node.transomHeight ?? 0 })] }))] })), _jsxs(PanelSection, { title: i18n._({ id: 'node.door.panel.position', message: 'Position' }), children: [_jsx(SliderControl, { label: _jsxs(_Fragment, { children: ["X", _jsx("sub", { className: "ml-[1px] text-[11px] opacity-70", children: i18n._({ id: 'node.door.panel.wall', message: 'wall' }) })] }), max: 10, min: -10, onChange: (v) => handleUpdate({ position: [v, node.position[1], node.position[2]] }), precision: 2, step: 0.1, unit: "m", value: node.position[0] }), showFlipSide && (_jsx("div", { className: "px-1 pt-2 pb-1", children: _jsx(ActionButton, { className: "w-full", icon: _jsx(FlipHorizontal2, { className: "h-4 w-4" }), label: i18n._({ id: 'node.door.panel.flipSide', message: 'Flip side' }), onClick: handleFlip }) }))] }), scripted && _jsx(AuthoredParams, { node: node }), showSegmentsSection && (_jsxs(PanelSection, { defaultExpanded: doorStyles.length === 0, title: i18n._({ id: 'node.door.panel.segments', message: 'Segments' }), children: [node.segments.map((seg, i) => {
|
|
307
|
+
const numCols = seg.columnRatios.length;
|
|
308
|
+
const colSum = seg.columnRatios.reduce((a, b) => a + b, 0);
|
|
309
|
+
const normCols = seg.columnRatios.map((r) => r / colSum);
|
|
310
|
+
return (_jsxs("div", { className: "mb-2 flex flex-col gap-1", children: [_jsx("div", { className: "flex items-center justify-between pb-1", children: _jsx("span", { className: "font-medium text-foreground/80 dark:text-white/80 text-xs", children: i18n._({
|
|
311
|
+
id: 'node.segmentNumber',
|
|
312
|
+
message: 'Segment {number}',
|
|
313
|
+
values: { number: i + 1 },
|
|
314
|
+
}) }) }), _jsx(SegmentedControl, { onChange: (t) => {
|
|
315
|
+
const updated = node.segments.map((s, idx) => idx === i ? { ...s, type: t } : s);
|
|
316
|
+
handleUpdate({ segments: updated });
|
|
317
|
+
}, options: [
|
|
318
|
+
{
|
|
319
|
+
label: i18n._({ id: 'node.door.panel.panel', message: 'Panel' }),
|
|
320
|
+
value: 'panel',
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
label: i18n._({ id: 'node.door.panel.glass', message: 'Glass' }),
|
|
324
|
+
value: 'glass',
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
label: i18n._({ id: 'node.door.panel.empty', message: 'Empty' }),
|
|
328
|
+
value: 'empty',
|
|
329
|
+
},
|
|
330
|
+
], value: seg.type }), _jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.height', message: 'Height' }), max: 95, min: 5, onChange: (v) => setSegmentHeightRatio(i, v / 100), precision: 1, step: 1, unit: "%", value: Math.round(normHeights[i] * 100 * 10) / 10 }), _jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.columns', message: 'Columns' }), max: 8, min: 1, onChange: (v) => {
|
|
331
|
+
const n = Math.max(1, Math.min(8, Math.round(v)));
|
|
332
|
+
const updated = node.segments.map((s, idx) => idx === i ? { ...s, columnRatios: Array(n).fill(1 / n) } : s);
|
|
333
|
+
handleUpdate({ segments: updated });
|
|
334
|
+
}, precision: 0, step: 1, value: numCols }), numCols > 1 && (_jsxs("div", { className: "mt-1 border-border/50 border-t pt-1", children: [normCols.map((ratio, ci) => (_jsx(SliderControl, { label: `C${ci + 1}`, max: 95, min: 5, onChange: (v) => setSegmentColumnRatio(i, ci, v / 100), precision: 1, step: 1, unit: "%", value: Math.round(ratio * 100 * 10) / 10 }, `c-${ci}`))), _jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.divider', message: 'Divider' }), max: 0.1, min: 0.005, onChange: (v) => {
|
|
335
|
+
const updated = node.segments.map((s, idx) => idx === i ? { ...s, dividerThickness: v } : s);
|
|
336
|
+
handleUpdate({ segments: updated });
|
|
337
|
+
}, precision: 3, step: 0.005, unit: "m", value: seg.dividerThickness })] })), seg.type === 'panel' && (_jsxs("div", { className: "mt-1 border-border/50 border-t pt-1", children: [_jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.inset', message: 'Inset' }), max: 0.1, min: 0, onChange: (v) => {
|
|
338
|
+
const updated = node.segments.map((s, idx) => idx === i ? { ...s, panelInset: v } : s);
|
|
339
|
+
handleUpdate({ segments: updated });
|
|
340
|
+
}, precision: 3, step: 0.005, unit: "m", value: seg.panelInset }), _jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.depth', message: 'Depth' }), max: PANEL_DEPTH_MAX, min: -PANEL_DEPTH_MAX, onChange: (v) => {
|
|
341
|
+
const updated = node.segments.map((s, idx) => idx === i ? { ...s, panelDepth: v } : s);
|
|
342
|
+
handleUpdate({ segments: updated });
|
|
343
|
+
}, precision: 3, step: 0.001, unit: "m", value: seg.panelDepth })] }))] }, i));
|
|
344
|
+
}), _jsxs("div", { className: "flex gap-1.5 px-1 pt-1", children: [_jsx(ActionButton, { label: i18n._({ id: 'node.door.panel.addSegment', message: '+ Add segment' }), onClick: () => {
|
|
345
|
+
const updated = [
|
|
346
|
+
...node.segments,
|
|
347
|
+
{
|
|
348
|
+
type: 'panel',
|
|
349
|
+
heightRatio: 1,
|
|
350
|
+
columnRatios: [1],
|
|
351
|
+
dividerThickness: 0.03,
|
|
352
|
+
panelDepth: 0.01,
|
|
353
|
+
panelInset: 0.04,
|
|
354
|
+
},
|
|
355
|
+
];
|
|
356
|
+
handleUpdate({ segments: updated });
|
|
357
|
+
} }), node.segments.length > 1 && (_jsx(ActionButton, { className: "text-foreground/60 hover:text-foreground dark:text-white/60 dark:hover:text-white", label: i18n._({ id: 'node.door.panel.remove', message: '- Remove' }), onClick: () => handleUpdate({ segments: node.segments.slice(0, -1) }) }))] }), _jsxs("div", { className: "mt-2 flex flex-col gap-1 border-border/50 border-t pt-2", children: [_jsx("span", { className: "px-1 font-medium text-[10px] text-muted-foreground/80 uppercase tracking-wider", children: i18n._({ id: 'node.door.panel.contentPadding', message: 'Leaf border' }) }), _jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.horizontal', message: 'Horizontal' }), max: 0.2, min: 0, onChange: (v) => handleUpdate({ contentPadding: [v, node.contentPadding[1]] }), precision: 3, step: 0.005, unit: "m", value: node.contentPadding[0] }), _jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.vertical', message: 'Vertical' }), max: 0.2, min: 0, onChange: (v) => handleUpdate({ contentPadding: [node.contentPadding[0], v] }), precision: 3, step: 0.005, unit: "m", value: node.contentPadding[1] })] })] }, selectedId)), showDoorShapeSection && (_jsxs(PanelSection, { title: i18n._({ id: 'node.door.panel.topShape', message: 'Top shape' }), children: [_jsx("div", { className: "flex flex-col gap-2 px-1 pb-1", children: _jsx(SegmentedControl, { onChange: (v) => handleUpdate({
|
|
240
358
|
openingShape: v,
|
|
241
359
|
...(v === 'rounded'
|
|
242
360
|
? {
|
|
@@ -248,77 +366,111 @@ export default function DoorPanel() {
|
|
|
248
366
|
: {}),
|
|
249
367
|
...(v === 'arch' ? { archHeight } : {}),
|
|
250
368
|
}), options: [
|
|
251
|
-
{
|
|
252
|
-
|
|
253
|
-
|
|
369
|
+
{
|
|
370
|
+
label: i18n._({ id: 'node.door.panel.rect', message: 'Rect' }),
|
|
371
|
+
value: 'rectangle',
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
label: i18n._({ id: 'node.door.panel.rounded', message: 'Rounded' }),
|
|
375
|
+
value: 'rounded',
|
|
376
|
+
},
|
|
377
|
+
{ label: i18n._({ id: 'node.door.panel.arch', message: 'Arch' }), value: 'arch' },
|
|
254
378
|
], value: doorShape }) }), doorShape === 'rounded' && (_jsxs(_Fragment, { children: [_jsx("div", { className: "flex flex-col gap-2 px-1 pb-1", children: _jsx(SegmentedControl, { onChange: (v) => handleUpdate({ openingRadiusMode: v }), options: [
|
|
255
|
-
{ label: 'All', value: 'all' },
|
|
256
|
-
{
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
379
|
+
{ label: i18n._({ id: 'node.door.panel.all', message: 'All' }), value: 'all' },
|
|
380
|
+
{
|
|
381
|
+
label: i18n._({ id: 'node.door.panel.individual', message: 'Individual' }),
|
|
382
|
+
value: 'individual',
|
|
383
|
+
},
|
|
384
|
+
], value: openingRadiusMode }) }), openingRadiusMode === 'all' ? (_jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.cornerRadius', message: 'Corner radius' }), max: maxRoundedRadius, min: 0, onChange: (v) => previewDoorUpdate('cornerRadius', v), onCommit: (v) => commitDoorPreview('cornerRadius', v), onCancel: () => preview?.cancel(), previewWhileTyping: true, restoreOnCommit: false, precision: 2, step: 0.05, unit: "m", value: cornerRadius })) : (_jsx(_Fragment, { children: [
|
|
385
|
+
[i18n._({ id: 'node.cornerRadius.topLeft', message: 'Top left' }), 0],
|
|
386
|
+
[i18n._({ id: 'node.cornerRadius.topRight', message: 'Top right' }), 1],
|
|
387
|
+
].map(([label, index]) => (_jsx(SliderControl, { label: label, max: maxRoundedRadius, min: 0, onChange: (v) => setOpeningTopRadius(index, v), onCommit: (v) => setOpeningTopRadius(index, v, true), onCancel: () => preview?.cancel(), previewWhileTyping: true, restoreOnCommit: false, precision: 2, step: 0.05, unit: "m", value: openingTopRadii[index] ?? 0 }, label))) })), _jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.revealRadius', message: 'Reveal radius' }), max: 0.08, min: 0, onChange: (v) => previewDoorUpdate('openingRevealRadius', v), onCommit: (v) => commitDoorPreview('openingRevealRadius', v), onCancel: () => preview?.cancel(), previewWhileTyping: true, restoreOnCommit: false, precision: 3, step: 0.005, unit: "m", value: openingRevealRadius })] })), doorShape === 'arch' && (_jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.archHeight', message: 'Arch height' }), max: node.height, min: 0.05, onChange: (v) => previewDoorUpdate('archHeight', v), onCommit: (v) => commitDoorPreview('archHeight', v), onCancel: () => preview?.cancel(), previewWhileTyping: true, precision: 2, restoreOnCommit: false, step: 0.05, unit: "m", value: archHeight }))] })), showOpeningShapeSection && (_jsxs(PanelSection, { title: i18n._({ id: 'node.door.panel.openingShape', message: 'Opening shape' }), children: [_jsx("div", { className: "flex flex-col gap-2 px-1 pb-1", children: _jsx(SegmentedControl, { onChange: (v) => handleUpdate({
|
|
261
388
|
openingShape: v,
|
|
262
389
|
...(v === 'rounded'
|
|
263
390
|
? { openingRadiusMode, openingTopRadii, cornerRadius, openingRevealRadius }
|
|
264
391
|
: {}),
|
|
265
392
|
...(v === 'arch' ? { archHeight } : {}),
|
|
266
393
|
}), options: [
|
|
267
|
-
{
|
|
268
|
-
|
|
269
|
-
|
|
394
|
+
{
|
|
395
|
+
label: i18n._({ id: 'node.door.panel.rect', message: 'Rect' }),
|
|
396
|
+
value: 'rectangle',
|
|
397
|
+
},
|
|
398
|
+
{
|
|
399
|
+
label: i18n._({ id: 'node.door.panel.rounded', message: 'Rounded' }),
|
|
400
|
+
value: 'rounded',
|
|
401
|
+
},
|
|
402
|
+
{ label: i18n._({ id: 'node.door.panel.arch', message: 'Arch' }), value: 'arch' },
|
|
270
403
|
], value: openingShape }) }), openingShape === 'rounded' && (_jsxs(_Fragment, { children: [_jsx("div", { className: "flex flex-col gap-2 px-1 pb-1", children: _jsx(SegmentedControl, { onChange: (v) => handleUpdate({ openingRadiusMode: v }), options: [
|
|
271
|
-
{ label: 'All', value: 'all' },
|
|
272
|
-
{
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
{
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
},
|
|
293
|
-
|
|
294
|
-
{
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
404
|
+
{ label: i18n._({ id: 'node.door.panel.all', message: 'All' }), value: 'all' },
|
|
405
|
+
{
|
|
406
|
+
label: i18n._({ id: 'node.door.panel.individual', message: 'Individual' }),
|
|
407
|
+
value: 'individual',
|
|
408
|
+
},
|
|
409
|
+
], value: openingRadiusMode }) }), openingRadiusMode === 'all' ? (_jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.cornerRadius', message: 'Corner radius' }), max: maxRoundedRadius, min: 0, onChange: (v) => previewDoorUpdate('cornerRadius', v), onCommit: (v) => commitDoorPreview('cornerRadius', v), onCancel: () => preview?.cancel(), previewWhileTyping: true, restoreOnCommit: false, precision: 2, step: 0.05, unit: "m", value: cornerRadius })) : (_jsx(_Fragment, { children: [
|
|
410
|
+
[i18n._({ id: 'node.cornerRadius.topLeft', message: 'Top left' }), 0],
|
|
411
|
+
[i18n._({ id: 'node.cornerRadius.topRight', message: 'Top right' }), 1],
|
|
412
|
+
].map(([label, index]) => (_jsx(SliderControl, { label: label, max: maxRoundedRadius, min: 0, onChange: (v) => setOpeningTopRadius(index, v), onCommit: (v) => setOpeningTopRadius(index, v, true), onCancel: () => preview?.cancel(), previewWhileTyping: true, restoreOnCommit: false, precision: 2, step: 0.05, unit: "m", value: openingTopRadii[index] ?? 0 }, label))) })), _jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.revealRadius', message: 'Reveal radius' }), max: 0.08, min: 0, onChange: (v) => previewDoorUpdate('openingRevealRadius', v), onCommit: (v) => commitDoorPreview('openingRevealRadius', v), onCancel: () => preview?.cancel(), previewWhileTyping: true, restoreOnCommit: false, precision: 3, step: 0.005, unit: "m", value: openingRevealRadius })] })), openingShape === 'arch' && (_jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.archHeight', message: 'Arch height' }), max: node.height, min: 0.05, onChange: (v) => previewDoorUpdate('archHeight', v), onCommit: (v) => commitDoorPreview('archHeight', v), onCancel: () => preview?.cancel(), previewWhileTyping: true, precision: 2, restoreOnCommit: false, step: 0.05, unit: "m", value: archHeight }))] })), showSwingSection && (_jsxs(PanelSection, { title: i18n._({ id: 'node.door.panel.swing', message: 'Swing' }), children: [_jsxs("div", { className: "flex flex-col gap-2 px-1 pb-1", children: [supportsHingeSide && (_jsxs("div", { className: "space-y-1", children: [_jsx("span", { className: "font-medium text-[10px] text-muted-foreground/80 uppercase tracking-wider", children: i18n._({ id: 'node.door.panel.hingesSide', message: 'Hinges side' }) }), _jsx(SegmentedControl, { onChange: (v) => handleUpdate(hingesSidePatch(v)), options: [
|
|
413
|
+
{
|
|
414
|
+
label: i18n._({ id: 'node.door.panel.left', message: 'Left' }),
|
|
415
|
+
value: 'left',
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
label: i18n._({ id: 'node.door.panel.right', message: 'Right' }),
|
|
419
|
+
value: 'right',
|
|
420
|
+
},
|
|
421
|
+
], value: node.hingesSide })] })), _jsxs("div", { className: "space-y-1", children: [_jsx("span", { className: "font-medium text-[10px] text-muted-foreground/80 uppercase tracking-wider", children: i18n._({ id: 'node.door.panel.direction', message: 'Direction' }) }), _jsx(SegmentedControl, { onChange: (v) => handleUpdate({ swingDirection: v }), options: [
|
|
422
|
+
{
|
|
423
|
+
label: i18n._({ id: 'node.door.panel.inward', message: 'Inward' }),
|
|
424
|
+
value: 'inward',
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
label: i18n._({ id: 'node.door.panel.outward', message: 'Outward' }),
|
|
428
|
+
value: 'outward',
|
|
429
|
+
},
|
|
430
|
+
], value: node.swingDirection })] })] }), _jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.open', message: 'Open' }), max: 90, min: 0, onChange: (v) => handleUpdate({ swingAngle: (Math.max(0, Math.min(90, v)) * Math.PI) / 180 }), precision: 0, restoreOnCommit: false, step: 5, unit: "\u00B0", value: Math.round(((node.swingAngle ?? 0) * 180) / Math.PI) })] })), showFoldSection && (_jsxs(PanelSection, { title: i18n._({ id: 'node.door.panel.fold', message: 'Fold' }), children: [_jsx("div", { className: "flex flex-col gap-2 px-1 pb-1", children: _jsxs("div", { className: "space-y-1", children: [_jsx("span", { className: "font-medium text-[10px] text-muted-foreground/80 uppercase tracking-wider", children: i18n._({ id: 'node.door.panel.panels', message: 'Panels' }) }), _jsx(SegmentedControl, { onChange: (v) => handleUpdate({ leafCount: Number(v) }), options: FOLDING_PANEL_COUNTS.map((count) => ({
|
|
431
|
+
label: String(count),
|
|
432
|
+
value: String(count),
|
|
433
|
+
})), value: String(foldingPanelCount(node.leafCount)) })] }) }), _jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.open', message: 'Open' }), max: 100, min: 0, onChange: (v) => handleUpdate({ operationState: v / 100 }), precision: 0, restoreOnCommit: false, step: 5, unit: "%", value: Math.round((node.operationState ?? 0) * 100) })] })), showSlideSection && (_jsxs(PanelSection, { title: i18n._({ id: 'node.door.panel.slide', message: 'Slide' }), children: [_jsxs("div", { className: "flex flex-col gap-2 px-1 pb-1", children: [_jsxs("div", { className: "space-y-1", children: [_jsx("span", { className: "font-medium text-[10px] text-muted-foreground/80 uppercase tracking-wider", children: doorType === 'pocket'
|
|
434
|
+
? i18n._({ id: 'node.door.panel.pocket', message: 'Pocket' })
|
|
435
|
+
: doorType === 'barn'
|
|
436
|
+
? i18n._({ id: 'node.door.panel.rail', message: 'Rail' })
|
|
437
|
+
: i18n._({ id: 'node.door.panel.panel', message: 'Panel' }) }), _jsx(SegmentedControl, { onChange: (v) => handleUpdate({ slideDirection: v }), options: [
|
|
438
|
+
{ label: i18n._({ id: 'node.door.panel.left', message: 'Left' }), value: 'left' },
|
|
439
|
+
{
|
|
440
|
+
label: i18n._({ id: 'node.door.panel.right', message: 'Right' }),
|
|
441
|
+
value: 'right',
|
|
442
|
+
},
|
|
443
|
+
], value: node.slideDirection ?? 'left' })] }), doorType === 'sliding' && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "space-y-1", children: [_jsx("span", { className: "font-medium text-[10px] text-muted-foreground/80 uppercase tracking-wider", children: i18n._({ id: 'node.door.panel.slidingLayout', message: 'Layout' }) }), _jsx(SegmentedControl, { onChange: (v) => handleUpdate({ slidingStyle: v }), options: [
|
|
444
|
+
{
|
|
445
|
+
label: i18n._({ id: 'node.door.panel.slidingPatio', message: 'Patio' }),
|
|
446
|
+
value: 'patio',
|
|
447
|
+
},
|
|
448
|
+
{
|
|
449
|
+
label: i18n._({ id: 'node.door.panel.slidingBypass', message: 'Bypass' }),
|
|
450
|
+
value: 'bypass',
|
|
451
|
+
},
|
|
452
|
+
], value: node.slidingStyle ?? 'patio' })] }), _jsxs("div", { className: "space-y-1", children: [_jsx("span", { className: "font-medium text-[10px] text-muted-foreground/80 uppercase tracking-wider", children: i18n._({ id: 'node.door.panel.panels', message: 'Panels' }) }), _jsx(SegmentedControl, { onChange: (v) => handleUpdate({ leafCount: Number(v) }), options: SLIDING_PANEL_COUNTS.map((count) => ({
|
|
453
|
+
label: String(count),
|
|
454
|
+
value: String(count),
|
|
455
|
+
})), value: String(slidingPanelCount(node.leafCount)) })] })] }))] }), _jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.open', message: 'Open' }), max: 100, min: 0, onChange: (v) => handleUpdate({ operationState: v / 100 }), precision: 0, restoreOnCommit: false, step: 5, unit: "%", value: Math.round((node.operationState ?? 0) * 100) })] })), showGarageSection && (_jsxs(PanelSection, { title: i18n._({ id: 'node.door.panel.garage', message: 'Garage' }), children: [_jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.open', message: 'Open' }), max: 100, min: 0, onChange: (v) => handleUpdate({ operationState: v / 100 }), precision: 0, restoreOnCommit: false, step: 5, unit: "%", value: Math.round((node.operationState ?? 0) * 100) }), isSectionalGarageDoor && (_jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.panels', message: 'Panels' }), max: 8, min: 3, onChange: (v) => handleUpdate({ garagePanelCount: Math.round(v) }), precision: 0, restoreOnCommit: false, step: 1, value: node.garagePanelCount ?? 4 }))] })), showFrameSection && (_jsxs(PanelSection, { title: i18n._({ id: 'node.door.panel.frame', message: 'Frame' }), children: [_jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.thickness', message: 'Thickness' }), max: 0.2, min: 0.01, onChange: (v) => handleUpdate({ frameThickness: v }), precision: 3, step: 0.01, unit: "m", value: node.frameThickness }), _jsx(SliderControl, { label: isAutoFrameDepth(node)
|
|
456
|
+
? i18n._({ id: 'node.door.panel.frameDepthAuto', message: 'Depth (auto)' })
|
|
457
|
+
: i18n._({ id: 'node.door.panel.depth', message: 'Depth' }), max: 0.5, min: 0.01, onChange: (v) => handleUpdate({ frameDepth: v }), precision: 3, step: 0.01, unit: "m", value: frameDepth }), !isAutoFrameDepth(node) && (_jsxs("div", { className: "flex items-center justify-between px-2 text-muted-foreground text-xs", children: [_jsx("span", { children: i18n._({
|
|
458
|
+
id: 'node.door.panel.autoFollowsTheWall',
|
|
459
|
+
message: 'Auto follows the wall',
|
|
460
|
+
}) }), _jsx("button", { className: "rounded-full border border-border/50 px-2.5 py-0.5 transition-colors hover:bg-accent", onClick: () => handleUpdate({ frameDepth: undefined }), type: "button", children: i18n._({ id: 'node.door.panel.auto', message: 'Auto' }) })] })), _jsx(OpeningDepthPositionControl, { node: node, onUpdate: handleUpdate })] })), showThresholdSection && (_jsxs(PanelSection, { title: i18n._({ id: 'node.door.panel.threshold', message: 'Threshold' }), children: [_jsx(ToggleControl, { checked: node.threshold, label: i18n._({
|
|
461
|
+
id: 'node.door.panel.enableThreshold',
|
|
462
|
+
message: 'Enable threshold',
|
|
463
|
+
}), onChange: (checked) => handleUpdate({ threshold: checked }) }), node.threshold && (_jsx("div", { className: "mt-1 flex flex-col gap-1", children: _jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.height', message: 'Height' }), max: 0.1, min: 0.005, onChange: (v) => handleUpdate({ thresholdHeight: v }), precision: 3, step: 0.005, unit: "m", value: node.thresholdHeight }) }))] })), _jsx(OpeningCasingSection, { node: node, onUpdate: handleUpdate }), showHardwareSection && (_jsxs(PanelSection, { title: i18n._({ id: 'node.door.panel.hardware', message: 'Hardware' }), children: [isSwingDoor && (_jsxs(_Fragment, { children: [_jsx(ToggleControl, { checked: node.handle, label: i18n._({ id: 'node.door.panel.enableHandle', message: 'Enable handle' }), onChange: (checked) => handleUpdate({ handle: checked }) }), node.handle && (_jsxs("div", { className: "mt-1 flex flex-col gap-1", children: [_jsxs("div", { className: "space-y-1", children: [_jsx("span", { className: "font-medium text-[10px] text-muted-foreground/80 uppercase tracking-wider", children: i18n._({ id: 'node.door.panel.handleStyle', message: 'Style' }) }), _jsx(SegmentedControl, { onChange: (v) => handleUpdate({ handleStyle: v }), options: HANDLE_STYLES.map((style) => ({
|
|
464
|
+
label: i18n._(HANDLE_STYLE_LABELS[style]),
|
|
465
|
+
value: style,
|
|
466
|
+
})), value: doorHandleStyle(node) })] }), _jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.height', message: 'Height' }), max: node.height - 0.1, min: 0.5, onChange: (v) => handleUpdate({ handleHeight: v }), precision: 2, step: 0.05, unit: "m", value: node.handleHeight })] })), _jsxs("div", { className: "mt-1 flex flex-col gap-1.5 border-border/50 border-t pt-2", children: [_jsx(ToggleControl, { checked: node.doorCloser, label: i18n._({ id: 'node.door.panel.doorCloser', message: 'Door closer' }), onChange: (checked) => handleUpdate({ doorCloser: checked }) }), _jsx(ToggleControl, { checked: node.panicBar, label: i18n._({ id: 'node.door.panel.panicBar', message: 'Panic bar' }), onChange: (checked) => handleUpdate({ panicBar: checked }) }), node.panicBar && (_jsxs("div", { className: "mt-1 flex flex-col gap-1", children: [_jsxs("div", { className: "space-y-1", children: [_jsx("span", { className: "font-medium text-[10px] text-muted-foreground/80 uppercase tracking-wider", children: i18n._({ id: 'node.door.panel.panicBarStyle', message: 'Style' }) }), _jsx(SegmentedControl, { onChange: (v) => handleUpdate({ panicBarStyle: v }), options: [
|
|
467
|
+
{
|
|
468
|
+
label: i18n._({ id: 'node.door.panel.crossbar', message: 'Crossbar' }),
|
|
469
|
+
value: 'crossbar',
|
|
470
|
+
},
|
|
471
|
+
{
|
|
472
|
+
label: i18n._({ id: 'node.door.panel.touchbar', message: 'Touchbar' }),
|
|
473
|
+
value: 'touchbar',
|
|
474
|
+
},
|
|
475
|
+
], value: node.panicBarStyle })] }), _jsx(ToggleControl, { checked: node.panicBarRods, label: i18n._({ id: 'node.door.panel.latchRods', message: 'Latch rods' }), onChange: (checked) => handleUpdate({ panicBarRods: checked }) }), _jsx(SliderControl, { label: i18n._({ id: 'node.door.panel.barHeight', message: 'Bar height' }), max: node.height - 0.1, min: 0.5, onChange: (v) => handleUpdate({ panicBarHeight: v }), precision: 2, step: 0.05, unit: "m", value: node.panicBarHeight })] }))] })] })), _jsx("div", { className: cn(isSwingDoor && 'mt-1 border-border/50 border-t pt-1'), children: _jsx(FinishSwatch, { fallback: HARDWARE_FINISH_DEFAULT, label: i18n._({ id: 'node.door.panel.finish', message: 'Finish' }), node: node, paintRole: "hardware", value: node.slots?.hardware }) })] })), _jsx(PanelSection, { title: i18n._({ id: 'node.door.panel.actions', message: 'Actions' }), children: _jsxs(ActionGroup, { children: [_jsx(ActionButton, { icon: _jsx(Move, { className: "h-3.5 w-3.5" }), label: i18n._({ id: 'node.door.panel.move', message: 'Move' }), onClick: handleMove }), _jsx(ActionButton, { icon: _jsx(Copy, { className: "h-3.5 w-3.5" }), label: i18n._({ id: 'node.door.panel.duplicate', message: 'Duplicate' }), onClick: handleDuplicate }), _jsx(ActionButton, { className: "hover:bg-red-500/20", icon: _jsx(Trash2, { className: "h-3.5 w-3.5 text-red-600 dark:text-red-400" }), label: i18n._({ id: 'node.door.panel.delete', message: 'Delete' }), onClick: handleDelete })] }) })] }));
|
|
324
476
|
}
|
package/dist/door/parametrics.js
CHANGED
|
@@ -19,7 +19,7 @@ export const doorParametrics = {
|
|
|
19
19
|
label: 'Frame',
|
|
20
20
|
fields: [
|
|
21
21
|
{ key: 'frameThickness', kind: 'number', unit: 'm', min: 0.01, max: 0.2, step: 0.005 },
|
|
22
|
-
{ key: 'frameDepth', kind: 'number', unit: 'm', min: 0.01, max: 0.
|
|
22
|
+
{ key: 'frameDepth', kind: 'number', unit: 'm', min: 0.01, max: 0.5, step: 0.005 },
|
|
23
23
|
],
|
|
24
24
|
},
|
|
25
25
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"placement.d.ts","sourceRoot":"","sources":["../../src/door/placement.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAIL,KAAK,SAAS,
|
|
1
|
+
{"version":3,"file":"placement.d.ts","sourceRoot":"","sources":["../../src/door/placement.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAIL,KAAK,SAAS,EAIf,MAAM,2BAA2B,CAAA;AAGlC,uGAAuG;AACvG,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAYzB,CAAA;AAEH,KAAK,cAAc,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAA;AAE/D,KAAK,kBAAkB,GAAG;IACxB,IAAI,EAAE,cAAc,CAAA;IACpB,KAAK,EAAE,SAAS,CAAA;IAChB,SAAS,IAAI,IAAI,CAAA;IACjB,UAAU,IAAI,IAAI,CAAA;CACnB,CAAA;AAID,eAAO,MAAM,gBAAgB,iFAW1B,CAAA;AAEH,yGAAyG;AACzG,wBAAgB,gBAAgB,IAAI,OAAO,CAAC,QAAQ,CAAC,CAUpD;AAED,eAAO,MAAM,oBAAoB,EAAE,QAAQ,EA2B1C,CAAA"}
|