@puzzle-ui/ui 0.0.0-stage → 0.2.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/README.md +97 -2
- package/dist/LICENSE +21 -0
- package/dist/components/actions/button/button-content.cjs +41 -0
- package/dist/components/actions/button/button-content.cjs.map +1 -0
- package/dist/components/actions/button/button-content.js +41 -0
- package/dist/components/actions/button/button-content.js.map +1 -0
- package/dist/components/actions/button/button.css +191 -0
- package/dist/components/actions/button/button.types.d.cts +30 -0
- package/dist/components/actions/button/button.types.d.ts +30 -0
- package/dist/components/actions/button/index.cjs +80 -0
- package/dist/components/actions/button/index.cjs.map +1 -0
- package/dist/components/actions/button/index.d.cts +3 -0
- package/dist/components/actions/button/index.d.ts +3 -0
- package/dist/components/actions/button/index.js +80 -0
- package/dist/components/actions/button/index.js.map +1 -0
- package/dist/components/actions/button-group/button-group.css +64 -0
- package/dist/components/actions/button-group/index.cjs +25 -0
- package/dist/components/actions/button-group/index.cjs.map +1 -0
- package/dist/components/actions/button-group/index.d.cts +14 -0
- package/dist/components/actions/button-group/index.d.ts +14 -0
- package/dist/components/actions/button-group/index.js +25 -0
- package/dist/components/actions/button-group/index.js.map +1 -0
- package/dist/components/actions/toggle-group/index.cjs +124 -0
- package/dist/components/actions/toggle-group/index.cjs.map +1 -0
- package/dist/components/actions/toggle-group/index.d.cts +10 -0
- package/dist/components/actions/toggle-group/index.d.ts +10 -0
- package/dist/components/actions/toggle-group/index.js +124 -0
- package/dist/components/actions/toggle-group/index.js.map +1 -0
- package/dist/components/actions/toggle-group/toggle-group.css +67 -0
- package/dist/components/actions/toggle-group/toggle-group.types.d.cts +54 -0
- package/dist/components/actions/toggle-group/toggle-group.types.d.ts +54 -0
- package/dist/components/data-display/alert/alert.css +128 -0
- package/dist/components/data-display/alert/alert.types.d.cts +14 -0
- package/dist/components/data-display/alert/alert.types.d.ts +14 -0
- package/dist/components/data-display/alert/alert.utils.cjs +11 -0
- package/dist/components/data-display/alert/alert.utils.cjs.map +1 -0
- package/dist/components/data-display/alert/alert.utils.js +11 -0
- package/dist/components/data-display/alert/alert.utils.js.map +1 -0
- package/dist/components/data-display/alert/index.cjs +103 -0
- package/dist/components/data-display/alert/index.cjs.map +1 -0
- package/dist/components/data-display/alert/index.d.cts +3 -0
- package/dist/components/data-display/alert/index.d.ts +3 -0
- package/dist/components/data-display/alert/index.js +103 -0
- package/dist/components/data-display/alert/index.js.map +1 -0
- package/dist/components/data-display/avatar/avatar.css +30 -0
- package/dist/components/data-display/avatar/index.cjs +42 -0
- package/dist/components/data-display/avatar/index.cjs.map +1 -0
- package/dist/components/data-display/avatar/index.d.cts +10 -0
- package/dist/components/data-display/avatar/index.d.ts +10 -0
- package/dist/components/data-display/avatar/index.js +42 -0
- package/dist/components/data-display/avatar/index.js.map +1 -0
- package/dist/components/data-display/badge/badge.css +91 -0
- package/dist/components/data-display/badge/index.cjs +31 -0
- package/dist/components/data-display/badge/index.cjs.map +1 -0
- package/dist/components/data-display/badge/index.d.cts +18 -0
- package/dist/components/data-display/badge/index.d.ts +18 -0
- package/dist/components/data-display/badge/index.js +31 -0
- package/dist/components/data-display/badge/index.js.map +1 -0
- package/dist/components/data-display/card/card.css +164 -0
- package/dist/components/data-display/card/index.cjs +42 -0
- package/dist/components/data-display/card/index.cjs.map +1 -0
- package/dist/components/data-display/card/index.d.cts +29 -0
- package/dist/components/data-display/card/index.d.ts +29 -0
- package/dist/components/data-display/card/index.js +35 -0
- package/dist/components/data-display/card/index.js.map +1 -0
- package/dist/components/data-display/image/image.css +80 -0
- package/dist/components/data-display/image/image.types.d.cts +154 -0
- package/dist/components/data-display/image/image.types.d.ts +154 -0
- package/dist/components/data-display/image/image.utils.cjs +55 -0
- package/dist/components/data-display/image/image.utils.cjs.map +1 -0
- package/dist/components/data-display/image/image.utils.js +51 -0
- package/dist/components/data-display/image/image.utils.js.map +1 -0
- package/dist/components/data-display/image/index.cjs +176 -0
- package/dist/components/data-display/image/index.cjs.map +1 -0
- package/dist/components/data-display/image/index.d.cts +3 -0
- package/dist/components/data-display/image/index.d.ts +3 -0
- package/dist/components/data-display/image/index.js +176 -0
- package/dist/components/data-display/image/index.js.map +1 -0
- package/dist/components/data-display/image/use-image-state.cjs +54 -0
- package/dist/components/data-display/image/use-image-state.cjs.map +1 -0
- package/dist/components/data-display/image/use-image-state.js +54 -0
- package/dist/components/data-display/image/use-image-state.js.map +1 -0
- package/dist/components/data-display/paper/index.cjs +16 -0
- package/dist/components/data-display/paper/index.cjs.map +1 -0
- package/dist/components/data-display/paper/index.d.cts +8 -0
- package/dist/components/data-display/paper/index.d.ts +8 -0
- package/dist/components/data-display/paper/index.js +16 -0
- package/dist/components/data-display/paper/index.js.map +1 -0
- package/dist/components/data-display/paper/paper.css +40 -0
- package/dist/components/data-display/progress/circular-progress.cjs +75 -0
- package/dist/components/data-display/progress/circular-progress.cjs.map +1 -0
- package/dist/components/data-display/progress/circular-progress.css +21 -0
- package/dist/components/data-display/progress/circular-progress.d.cts +9 -0
- package/dist/components/data-display/progress/circular-progress.d.ts +9 -0
- package/dist/components/data-display/progress/circular-progress.js +75 -0
- package/dist/components/data-display/progress/circular-progress.js.map +1 -0
- package/dist/components/data-display/progress/linear-progress.cjs +32 -0
- package/dist/components/data-display/progress/linear-progress.cjs.map +1 -0
- package/dist/components/data-display/progress/linear-progress.css +39 -0
- package/dist/components/data-display/progress/linear-progress.d.cts +5 -0
- package/dist/components/data-display/progress/linear-progress.d.ts +5 -0
- package/dist/components/data-display/progress/linear-progress.js +32 -0
- package/dist/components/data-display/progress/linear-progress.js.map +1 -0
- package/dist/components/data-display/progress/types.d.cts +5 -0
- package/dist/components/data-display/progress/types.d.ts +5 -0
- package/dist/components/data-display/progress/utils.cjs +16 -0
- package/dist/components/data-display/progress/utils.cjs.map +1 -0
- package/dist/components/data-display/progress/utils.js +15 -0
- package/dist/components/data-display/progress/utils.js.map +1 -0
- package/dist/components/data-display/skeleton/index.cjs +18 -0
- package/dist/components/data-display/skeleton/index.cjs.map +1 -0
- package/dist/components/data-display/skeleton/index.d.cts +10 -0
- package/dist/components/data-display/skeleton/index.d.ts +10 -0
- package/dist/components/data-display/skeleton/index.js +18 -0
- package/dist/components/data-display/skeleton/index.js.map +1 -0
- package/dist/components/data-display/skeleton/skeleton.css +47 -0
- package/dist/components/editors/text-editor/editor.cjs +620 -0
- package/dist/components/editors/text-editor/editor.cjs.map +1 -0
- package/dist/components/editors/text-editor/editor.d.cts +1 -0
- package/dist/components/editors/text-editor/editor.d.ts +1 -0
- package/dist/components/editors/text-editor/editor.js +620 -0
- package/dist/components/editors/text-editor/editor.js.map +1 -0
- package/dist/components/editors/text-editor/index.cjs +39 -0
- package/dist/components/editors/text-editor/index.cjs.map +1 -0
- package/dist/components/editors/text-editor/index.d.cts +13 -0
- package/dist/components/editors/text-editor/index.d.ts +13 -0
- package/dist/components/editors/text-editor/index.js +38 -0
- package/dist/components/editors/text-editor/index.js.map +1 -0
- package/dist/components/editors/text-editor/text-document.cjs +406 -0
- package/dist/components/editors/text-editor/text-document.cjs.map +1 -0
- package/dist/components/editors/text-editor/text-document.js +391 -0
- package/dist/components/editors/text-editor/text-document.js.map +1 -0
- package/dist/components/editors/text-editor/text-editor-toolbar.cjs +251 -0
- package/dist/components/editors/text-editor/text-editor-toolbar.cjs.map +1 -0
- package/dist/components/editors/text-editor/text-editor-toolbar.css +16 -0
- package/dist/components/editors/text-editor/text-editor-toolbar.d.cts +7 -0
- package/dist/components/editors/text-editor/text-editor-toolbar.d.ts +7 -0
- package/dist/components/editors/text-editor/text-editor-toolbar.js +251 -0
- package/dist/components/editors/text-editor/text-editor-toolbar.js.map +1 -0
- package/dist/components/editors/text-editor/text-editor.css +116 -0
- package/dist/components/editors/text-editor/text-editor.types.d.cts +37 -0
- package/dist/components/editors/text-editor/text-editor.types.d.ts +37 -0
- package/dist/components/editors/text-editor/text-parser.cjs +262 -0
- package/dist/components/editors/text-editor/text-parser.cjs.map +1 -0
- package/dist/components/editors/text-editor/text-parser.js +261 -0
- package/dist/components/editors/text-editor/text-parser.js.map +1 -0
- package/dist/components/editors/text-editor/text-renderer.cjs +85 -0
- package/dist/components/editors/text-editor/text-renderer.cjs.map +1 -0
- package/dist/components/editors/text-editor/text-renderer.d.cts +7 -0
- package/dist/components/editors/text-editor/text-renderer.d.ts +7 -0
- package/dist/components/editors/text-editor/text-renderer.js +85 -0
- package/dist/components/editors/text-editor/text-renderer.js.map +1 -0
- package/dist/components/forms/autocomplete/autocomplete.css +384 -0
- package/dist/components/forms/autocomplete/autocomplete.types.d.cts +86 -0
- package/dist/components/forms/autocomplete/autocomplete.types.d.ts +86 -0
- package/dist/components/forms/autocomplete/autocomplete.utils.cjs +47 -0
- package/dist/components/forms/autocomplete/autocomplete.utils.cjs.map +1 -0
- package/dist/components/forms/autocomplete/autocomplete.utils.js +44 -0
- package/dist/components/forms/autocomplete/autocomplete.utils.js.map +1 -0
- package/dist/components/forms/autocomplete/index.cjs +532 -0
- package/dist/components/forms/autocomplete/index.cjs.map +1 -0
- package/dist/components/forms/autocomplete/index.d.cts +3 -0
- package/dist/components/forms/autocomplete/index.d.ts +3 -0
- package/dist/components/forms/autocomplete/index.js +532 -0
- package/dist/components/forms/autocomplete/index.js.map +1 -0
- package/dist/components/forms/checkbox/checkbox.css +146 -0
- package/dist/components/forms/checkbox/index.cjs +80 -0
- package/dist/components/forms/checkbox/index.cjs.map +1 -0
- package/dist/components/forms/checkbox/index.d.cts +20 -0
- package/dist/components/forms/checkbox/index.d.ts +20 -0
- package/dist/components/forms/checkbox/index.js +80 -0
- package/dist/components/forms/checkbox/index.js.map +1 -0
- package/dist/components/forms/date-picker/date-picker.css +478 -0
- package/dist/components/forms/date-picker/date-picker.types.d.cts +75 -0
- package/dist/components/forms/date-picker/date-picker.types.d.ts +75 -0
- package/dist/components/forms/date-picker/date-picker.utils.cjs +76 -0
- package/dist/components/forms/date-picker/date-picker.utils.cjs.map +1 -0
- package/dist/components/forms/date-picker/date-picker.utils.js +64 -0
- package/dist/components/forms/date-picker/date-picker.utils.js.map +1 -0
- package/dist/components/forms/date-picker/index.cjs +572 -0
- package/dist/components/forms/date-picker/index.cjs.map +1 -0
- package/dist/components/forms/date-picker/index.d.cts +3 -0
- package/dist/components/forms/date-picker/index.d.ts +3 -0
- package/dist/components/forms/date-picker/index.js +572 -0
- package/dist/components/forms/date-picker/index.js.map +1 -0
- package/dist/components/forms/file-upload/file-upload.css +290 -0
- package/dist/components/forms/file-upload/file-upload.types.d.cts +51 -0
- package/dist/components/forms/file-upload/file-upload.types.d.ts +51 -0
- package/dist/components/forms/file-upload/file-upload.utils.cjs +76 -0
- package/dist/components/forms/file-upload/file-upload.utils.cjs.map +1 -0
- package/dist/components/forms/file-upload/file-upload.utils.js +72 -0
- package/dist/components/forms/file-upload/file-upload.utils.js.map +1 -0
- package/dist/components/forms/file-upload/index.cjs +346 -0
- package/dist/components/forms/file-upload/index.cjs.map +1 -0
- package/dist/components/forms/file-upload/index.d.cts +3 -0
- package/dist/components/forms/file-upload/index.d.ts +3 -0
- package/dist/components/forms/file-upload/index.js +346 -0
- package/dist/components/forms/file-upload/index.js.map +1 -0
- package/dist/components/forms/form-field/form-field-state.cjs +25 -0
- package/dist/components/forms/form-field/form-field-state.cjs.map +1 -0
- package/dist/components/forms/form-field/form-field-state.js +25 -0
- package/dist/components/forms/form-field/form-field-state.js.map +1 -0
- package/dist/components/forms/form-field/form-field.css +44 -0
- package/dist/components/forms/form-field/index.cjs +61 -0
- package/dist/components/forms/form-field/index.cjs.map +1 -0
- package/dist/components/forms/form-field/index.d.cts +23 -0
- package/dist/components/forms/form-field/index.d.ts +23 -0
- package/dist/components/forms/form-field/index.js +61 -0
- package/dist/components/forms/form-field/index.js.map +1 -0
- package/dist/components/forms/input/index.d.cts +4 -0
- package/dist/components/forms/input/index.d.ts +4 -0
- package/dist/components/forms/input/input.css +153 -0
- package/dist/components/forms/input/number-input.cjs +192 -0
- package/dist/components/forms/input/number-input.cjs.map +1 -0
- package/dist/components/forms/input/number-input.d.cts +20 -0
- package/dist/components/forms/input/number-input.d.ts +20 -0
- package/dist/components/forms/input/number-input.js +192 -0
- package/dist/components/forms/input/number-input.js.map +1 -0
- package/dist/components/forms/input/text-area-input.cjs +47 -0
- package/dist/components/forms/input/text-area-input.cjs.map +1 -0
- package/dist/components/forms/input/text-area-input.d.cts +8 -0
- package/dist/components/forms/input/text-area-input.d.ts +8 -0
- package/dist/components/forms/input/text-area-input.js +47 -0
- package/dist/components/forms/input/text-area-input.js.map +1 -0
- package/dist/components/forms/input/text-input.cjs +47 -0
- package/dist/components/forms/input/text-input.cjs.map +1 -0
- package/dist/components/forms/input/text-input.d.cts +9 -0
- package/dist/components/forms/input/text-input.d.ts +9 -0
- package/dist/components/forms/input/text-input.js +47 -0
- package/dist/components/forms/input/text-input.js.map +1 -0
- package/dist/components/forms/label/index.cjs +26 -0
- package/dist/components/forms/label/index.cjs.map +1 -0
- package/dist/components/forms/label/index.d.cts +8 -0
- package/dist/components/forms/label/index.d.ts +8 -0
- package/dist/components/forms/label/index.js +26 -0
- package/dist/components/forms/label/index.js.map +1 -0
- package/dist/components/forms/label/label.css +22 -0
- package/dist/components/forms/radio-group/index.cjs +226 -0
- package/dist/components/forms/radio-group/index.cjs.map +1 -0
- package/dist/components/forms/radio-group/index.d.cts +5 -0
- package/dist/components/forms/radio-group/index.d.ts +5 -0
- package/dist/components/forms/radio-group/index.js +225 -0
- package/dist/components/forms/radio-group/index.js.map +1 -0
- package/dist/components/forms/radio-group/radio-group.css +222 -0
- package/dist/components/forms/radio-group/radio-group.types.d.cts +51 -0
- package/dist/components/forms/radio-group/radio-group.types.d.ts +51 -0
- package/dist/components/forms/radio-group/radio-group.utils.cjs +22 -0
- package/dist/components/forms/radio-group/radio-group.utils.cjs.map +1 -0
- package/dist/components/forms/radio-group/radio-group.utils.js +21 -0
- package/dist/components/forms/radio-group/radio-group.utils.js.map +1 -0
- package/dist/components/forms/select/index.cjs +468 -0
- package/dist/components/forms/select/index.cjs.map +1 -0
- package/dist/components/forms/select/index.d.cts +112 -0
- package/dist/components/forms/select/index.d.ts +112 -0
- package/dist/components/forms/select/index.js +468 -0
- package/dist/components/forms/select/index.js.map +1 -0
- package/dist/components/forms/select/select.css +363 -0
- package/dist/components/forms/slider/index.cjs +93 -0
- package/dist/components/forms/slider/index.cjs.map +1 -0
- package/dist/components/forms/slider/index.d.cts +37 -0
- package/dist/components/forms/slider/index.d.ts +37 -0
- package/dist/components/forms/slider/index.js +93 -0
- package/dist/components/forms/slider/index.js.map +1 -0
- package/dist/components/forms/slider/slider.css +202 -0
- package/dist/components/forms/stepper/index.cjs +113 -0
- package/dist/components/forms/stepper/index.cjs.map +1 -0
- package/dist/components/forms/stepper/index.d.cts +48 -0
- package/dist/components/forms/stepper/index.d.ts +48 -0
- package/dist/components/forms/stepper/index.js +113 -0
- package/dist/components/forms/stepper/index.js.map +1 -0
- package/dist/components/forms/stepper/stepper.css +241 -0
- package/dist/components/forms/switch/index.cjs +45 -0
- package/dist/components/forms/switch/index.cjs.map +1 -0
- package/dist/components/forms/switch/index.d.cts +11 -0
- package/dist/components/forms/switch/index.d.ts +11 -0
- package/dist/components/forms/switch/index.js +45 -0
- package/dist/components/forms/switch/index.js.map +1 -0
- package/dist/components/forms/switch/switch.css +142 -0
- package/dist/components/layout/app-bar/app-bar.css +197 -0
- package/dist/components/layout/app-bar/index.cjs +150 -0
- package/dist/components/layout/app-bar/index.cjs.map +1 -0
- package/dist/components/layout/app-bar/index.d.cts +21 -0
- package/dist/components/layout/app-bar/index.d.ts +21 -0
- package/dist/components/layout/app-bar/index.js +150 -0
- package/dist/components/layout/app-bar/index.js.map +1 -0
- package/dist/components/layout/background/background.css +160 -0
- package/dist/components/layout/background/index.cjs +34 -0
- package/dist/components/layout/background/index.cjs.map +1 -0
- package/dist/components/layout/background/index.d.cts +23 -0
- package/dist/components/layout/background/index.d.ts +23 -0
- package/dist/components/layout/background/index.js +34 -0
- package/dist/components/layout/background/index.js.map +1 -0
- package/dist/components/layout/bottom-navigation/bottom-navigation.css +108 -0
- package/dist/components/layout/bottom-navigation/index.cjs +51 -0
- package/dist/components/layout/bottom-navigation/index.cjs.map +1 -0
- package/dist/components/layout/bottom-navigation/index.d.cts +19 -0
- package/dist/components/layout/bottom-navigation/index.d.ts +19 -0
- package/dist/components/layout/bottom-navigation/index.js +50 -0
- package/dist/components/layout/bottom-navigation/index.js.map +1 -0
- package/dist/components/layout/breadcrumbs/breadcrumbs.css +80 -0
- package/dist/components/layout/breadcrumbs/index.cjs +38 -0
- package/dist/components/layout/breadcrumbs/index.cjs.map +1 -0
- package/dist/components/layout/breadcrumbs/index.d.cts +18 -0
- package/dist/components/layout/breadcrumbs/index.d.ts +18 -0
- package/dist/components/layout/breadcrumbs/index.js +38 -0
- package/dist/components/layout/breadcrumbs/index.js.map +1 -0
- package/dist/components/layout/collapsable-sidebar/collapsable-sidebar.css +240 -0
- package/dist/components/layout/collapsable-sidebar/index.cjs +107 -0
- package/dist/components/layout/collapsable-sidebar/index.cjs.map +1 -0
- package/dist/components/layout/collapsable-sidebar/index.d.cts +35 -0
- package/dist/components/layout/collapsable-sidebar/index.d.ts +35 -0
- package/dist/components/layout/collapsable-sidebar/index.js +107 -0
- package/dist/components/layout/collapsable-sidebar/index.js.map +1 -0
- package/dist/components/layout/container/container.css +24 -0
- package/dist/components/layout/container/container.utils.cjs +11 -0
- package/dist/components/layout/container/container.utils.cjs.map +1 -0
- package/dist/components/layout/container/container.utils.d.cts +1 -0
- package/dist/components/layout/container/container.utils.d.ts +1 -0
- package/dist/components/layout/container/container.utils.js +11 -0
- package/dist/components/layout/container/container.utils.js.map +1 -0
- package/dist/components/layout/container/index.cjs +17 -0
- package/dist/components/layout/container/index.cjs.map +1 -0
- package/dist/components/layout/container/index.d.cts +11 -0
- package/dist/components/layout/container/index.d.ts +11 -0
- package/dist/components/layout/container/index.js +17 -0
- package/dist/components/layout/container/index.js.map +1 -0
- package/dist/components/layout/page-layout/index.cjs +80 -0
- package/dist/components/layout/page-layout/index.cjs.map +1 -0
- package/dist/components/layout/page-layout/index.d.cts +61 -0
- package/dist/components/layout/page-layout/index.d.ts +61 -0
- package/dist/components/layout/page-layout/index.js +80 -0
- package/dist/components/layout/page-layout/index.js.map +1 -0
- package/dist/components/layout/page-layout/page-layout.css +88 -0
- package/dist/components/layout/resizable-panels/index.cjs +226 -0
- package/dist/components/layout/resizable-panels/index.cjs.map +1 -0
- package/dist/components/layout/resizable-panels/index.d.cts +59 -0
- package/dist/components/layout/resizable-panels/index.d.ts +59 -0
- package/dist/components/layout/resizable-panels/index.js +224 -0
- package/dist/components/layout/resizable-panels/index.js.map +1 -0
- package/dist/components/layout/resizable-panels/resizable-panels.css +121 -0
- package/dist/components/layout/resizable-panels/resizable-panels.utils.cjs +107 -0
- package/dist/components/layout/resizable-panels/resizable-panels.utils.cjs.map +1 -0
- package/dist/components/layout/resizable-panels/resizable-panels.utils.js +105 -0
- package/dist/components/layout/resizable-panels/resizable-panels.utils.js.map +1 -0
- package/dist/components/layout/section/index.cjs +15 -0
- package/dist/components/layout/section/index.cjs.map +1 -0
- package/dist/components/layout/section/index.d.cts +2 -0
- package/dist/components/layout/section/index.d.ts +2 -0
- package/dist/components/layout/section/index.js +15 -0
- package/dist/components/layout/section/index.js.map +1 -0
- package/dist/components/layout/section/section.css +71 -0
- package/dist/components/layout/section/types.d.cts +13 -0
- package/dist/components/layout/section/types.d.ts +13 -0
- package/dist/components/layout/section-stack/index.cjs +29 -0
- package/dist/components/layout/section-stack/index.cjs.map +1 -0
- package/dist/components/layout/section-stack/index.d.cts +8 -0
- package/dist/components/layout/section-stack/index.d.ts +8 -0
- package/dist/components/layout/section-stack/index.js +29 -0
- package/dist/components/layout/section-stack/index.js.map +1 -0
- package/dist/components/layout/sidebar/index.cjs +16 -0
- package/dist/components/layout/sidebar/index.cjs.map +1 -0
- package/dist/components/layout/sidebar/index.d.cts +7 -0
- package/dist/components/layout/sidebar/index.d.ts +7 -0
- package/dist/components/layout/sidebar/index.js +16 -0
- package/dist/components/layout/sidebar/index.js.map +1 -0
- package/dist/components/layout/sidebar/sidebar.css +21 -0
- package/dist/components/layout/stack/index.cjs +30 -0
- package/dist/components/layout/stack/index.cjs.map +1 -0
- package/dist/components/layout/stack/index.d.cts +31 -0
- package/dist/components/layout/stack/index.d.ts +31 -0
- package/dist/components/layout/stack/index.js +30 -0
- package/dist/components/layout/stack/index.js.map +1 -0
- package/dist/components/layout/stack/stack.css +303 -0
- package/dist/components/navigation/accordion/accordion.css +97 -0
- package/dist/components/navigation/accordion/index.cjs +107 -0
- package/dist/components/navigation/accordion/index.cjs.map +1 -0
- package/dist/components/navigation/accordion/index.d.cts +48 -0
- package/dist/components/navigation/accordion/index.d.ts +48 -0
- package/dist/components/navigation/accordion/index.js +107 -0
- package/dist/components/navigation/accordion/index.js.map +1 -0
- package/dist/components/navigation/carousel/carousel.css +283 -0
- package/dist/components/navigation/carousel/controller.cjs +46 -0
- package/dist/components/navigation/carousel/controller.cjs.map +1 -0
- package/dist/components/navigation/carousel/controller.d.cts +16 -0
- package/dist/components/navigation/carousel/controller.d.ts +16 -0
- package/dist/components/navigation/carousel/controller.js +45 -0
- package/dist/components/navigation/carousel/controller.js.map +1 -0
- package/dist/components/navigation/carousel/index.cjs +494 -0
- package/dist/components/navigation/carousel/index.cjs.map +1 -0
- package/dist/components/navigation/carousel/index.d.cts +27 -0
- package/dist/components/navigation/carousel/index.d.ts +27 -0
- package/dist/components/navigation/carousel/index.js +494 -0
- package/dist/components/navigation/carousel/index.js.map +1 -0
- package/dist/components/navigation/link/index.cjs +40 -0
- package/dist/components/navigation/link/index.cjs.map +1 -0
- package/dist/components/navigation/link/index.d.cts +3 -0
- package/dist/components/navigation/link/index.d.ts +3 -0
- package/dist/components/navigation/link/index.js +40 -0
- package/dist/components/navigation/link/index.js.map +1 -0
- package/dist/components/navigation/link/link.css +31 -0
- package/dist/components/navigation/link/types.d.cts +12 -0
- package/dist/components/navigation/link/types.d.ts +12 -0
- package/dist/components/navigation/tabs/index.cjs +111 -0
- package/dist/components/navigation/tabs/index.cjs.map +1 -0
- package/dist/components/navigation/tabs/index.d.cts +30 -0
- package/dist/components/navigation/tabs/index.d.ts +30 -0
- package/dist/components/navigation/tabs/index.js +110 -0
- package/dist/components/navigation/tabs/index.js.map +1 -0
- package/dist/components/navigation/tabs/tabs.css +216 -0
- package/dist/components/navigation/tree-view/index.cjs +455 -0
- package/dist/components/navigation/tree-view/index.cjs.map +1 -0
- package/dist/components/navigation/tree-view/index.d.cts +96 -0
- package/dist/components/navigation/tree-view/index.d.ts +96 -0
- package/dist/components/navigation/tree-view/index.js +455 -0
- package/dist/components/navigation/tree-view/index.js.map +1 -0
- package/dist/components/navigation/tree-view/tree-view.css +258 -0
- package/dist/components/overlays/backdrop/backdrop.css +10 -0
- package/dist/components/overlays/backdrop/index.cjs +70 -0
- package/dist/components/overlays/backdrop/index.cjs.map +1 -0
- package/dist/components/overlays/backdrop/index.d.cts +12 -0
- package/dist/components/overlays/backdrop/index.d.ts +12 -0
- package/dist/components/overlays/backdrop/index.js +70 -0
- package/dist/components/overlays/backdrop/index.js.map +1 -0
- package/dist/components/overlays/command/command.css +154 -0
- package/dist/components/overlays/command/command.types.d.cts +36 -0
- package/dist/components/overlays/command/command.types.d.ts +36 -0
- package/dist/components/overlays/command/command.utils.cjs +39 -0
- package/dist/components/overlays/command/command.utils.cjs.map +1 -0
- package/dist/components/overlays/command/command.utils.js +35 -0
- package/dist/components/overlays/command/command.utils.js.map +1 -0
- package/dist/components/overlays/command/index.cjs +274 -0
- package/dist/components/overlays/command/index.cjs.map +1 -0
- package/dist/components/overlays/command/index.d.cts +4 -0
- package/dist/components/overlays/command/index.d.ts +4 -0
- package/dist/components/overlays/command/index.js +273 -0
- package/dist/components/overlays/command/index.js.map +1 -0
- package/dist/components/overlays/dialog/dialog.css +121 -0
- package/dist/components/overlays/dialog/index.cjs +80 -0
- package/dist/components/overlays/dialog/index.cjs.map +1 -0
- package/dist/components/overlays/dialog/index.d.cts +35 -0
- package/dist/components/overlays/dialog/index.d.ts +35 -0
- package/dist/components/overlays/dialog/index.js +80 -0
- package/dist/components/overlays/dialog/index.js.map +1 -0
- package/dist/components/overlays/drawer/drawer.css +133 -0
- package/dist/components/overlays/drawer/index.cjs +90 -0
- package/dist/components/overlays/drawer/index.cjs.map +1 -0
- package/dist/components/overlays/drawer/index.d.cts +11 -0
- package/dist/components/overlays/drawer/index.d.ts +11 -0
- package/dist/components/overlays/drawer/index.js +90 -0
- package/dist/components/overlays/drawer/index.js.map +1 -0
- package/dist/components/overlays/drawer/use-resize-bar.cjs +152 -0
- package/dist/components/overlays/drawer/use-resize-bar.cjs.map +1 -0
- package/dist/components/overlays/drawer/use-resize-bar.js +152 -0
- package/dist/components/overlays/drawer/use-resize-bar.js.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-content.cjs +132 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-content.cjs.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-content.d.cts +3 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-content.d.ts +3 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-content.js +132 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-content.js.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-items.cjs +136 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-items.cjs.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-items.d.cts +7 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-items.d.ts +7 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-items.js +132 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-items.js.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-radio.cjs +76 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-radio.cjs.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-radio.d.cts +4 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-radio.d.ts +4 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-radio.js +75 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-radio.js.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-trigger.cjs +96 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-trigger.cjs.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-trigger.d.cts +3 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-trigger.d.ts +3 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-trigger.js +96 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu-trigger.js.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.cjs +111 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.cjs.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.context.cjs +21 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.context.cjs.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.context.js +18 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.context.js.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.css +127 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.d.cts +3 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.d.ts +3 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.js +111 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.js.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.types.d.cts +66 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.types.d.ts +66 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.utils.cjs +44 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.utils.cjs.map +1 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.utils.js +39 -0
- package/dist/components/overlays/dropdown-menu/dropdown-menu.utils.js.map +1 -0
- package/dist/components/overlays/dropdown-menu/index.cjs +31 -0
- package/dist/components/overlays/dropdown-menu/index.cjs.map +1 -0
- package/dist/components/overlays/dropdown-menu/index.d.cts +19 -0
- package/dist/components/overlays/dropdown-menu/index.d.ts +19 -0
- package/dist/components/overlays/dropdown-menu/index.js +22 -0
- package/dist/components/overlays/dropdown-menu/index.js.map +1 -0
- package/dist/components/overlays/floating-position/calculate-position.cjs +94 -0
- package/dist/components/overlays/floating-position/calculate-position.cjs.map +1 -0
- package/dist/components/overlays/floating-position/calculate-position.js +89 -0
- package/dist/components/overlays/floating-position/calculate-position.js.map +1 -0
- package/dist/components/overlays/floating-position/use-floating-position.cjs +89 -0
- package/dist/components/overlays/floating-position/use-floating-position.cjs.map +1 -0
- package/dist/components/overlays/floating-position/use-floating-position.js +89 -0
- package/dist/components/overlays/floating-position/use-floating-position.js.map +1 -0
- package/dist/components/overlays/notification/index.cjs +142 -0
- package/dist/components/overlays/notification/index.cjs.map +1 -0
- package/dist/components/overlays/notification/index.d.cts +16 -0
- package/dist/components/overlays/notification/index.d.ts +16 -0
- package/dist/components/overlays/notification/index.js +139 -0
- package/dist/components/overlays/notification/index.js.map +1 -0
- package/dist/components/overlays/notification/notification-provider.cjs +69 -0
- package/dist/components/overlays/notification/notification-provider.cjs.map +1 -0
- package/dist/components/overlays/notification/notification-provider.d.cts +3 -0
- package/dist/components/overlays/notification/notification-provider.d.ts +3 -0
- package/dist/components/overlays/notification/notification-provider.js +68 -0
- package/dist/components/overlays/notification/notification-provider.js.map +1 -0
- package/dist/components/overlays/notification/notification.css +172 -0
- package/dist/components/overlays/notification/notification.types.d.cts +41 -0
- package/dist/components/overlays/notification/notification.types.d.ts +41 -0
- package/dist/components/overlays/notification/notification.utils.cjs +23 -0
- package/dist/components/overlays/notification/notification.utils.cjs.map +1 -0
- package/dist/components/overlays/notification/notification.utils.js +22 -0
- package/dist/components/overlays/notification/notification.utils.js.map +1 -0
- package/dist/components/overlays/notification/use-notification.cjs +12 -0
- package/dist/components/overlays/notification/use-notification.cjs.map +1 -0
- package/dist/components/overlays/notification/use-notification.d.cts +3 -0
- package/dist/components/overlays/notification/use-notification.d.ts +3 -0
- package/dist/components/overlays/notification/use-notification.js +12 -0
- package/dist/components/overlays/notification/use-notification.js.map +1 -0
- package/dist/components/overlays/overlay-stack/index.cjs +195 -0
- package/dist/components/overlays/overlay-stack/index.cjs.map +1 -0
- package/dist/components/overlays/overlay-stack/index.js +193 -0
- package/dist/components/overlays/overlay-stack/index.js.map +1 -0
- package/dist/components/overlays/popout/index.cjs +196 -0
- package/dist/components/overlays/popout/index.cjs.map +1 -0
- package/dist/components/overlays/popout/index.d.cts +26 -0
- package/dist/components/overlays/popout/index.d.ts +26 -0
- package/dist/components/overlays/popout/index.js +195 -0
- package/dist/components/overlays/popout/index.js.map +1 -0
- package/dist/components/overlays/popout/popout.css +15 -0
- package/dist/components/overlays/popover/index.cjs +163 -0
- package/dist/components/overlays/popover/index.cjs.map +1 -0
- package/dist/components/overlays/popover/index.d.cts +28 -0
- package/dist/components/overlays/popover/index.d.ts +28 -0
- package/dist/components/overlays/popover/index.js +163 -0
- package/dist/components/overlays/popover/index.js.map +1 -0
- package/dist/components/overlays/popover/popover.css +56 -0
- package/dist/components/overlays/portal/index.cjs +33 -0
- package/dist/components/overlays/portal/index.cjs.map +1 -0
- package/dist/components/overlays/portal/index.d.cts +15 -0
- package/dist/components/overlays/portal/index.d.ts +15 -0
- package/dist/components/overlays/portal/index.js +33 -0
- package/dist/components/overlays/portal/index.js.map +1 -0
- package/dist/components/overlays/portal/target.cjs +17 -0
- package/dist/components/overlays/portal/target.cjs.map +1 -0
- package/dist/components/overlays/portal/target.css +3 -0
- package/dist/components/overlays/portal/target.d.cts +7 -0
- package/dist/components/overlays/portal/target.d.ts +7 -0
- package/dist/components/overlays/portal/target.js +17 -0
- package/dist/components/overlays/portal/target.js.map +1 -0
- package/dist/components/overlays/tooltip/index.cjs +71 -0
- package/dist/components/overlays/tooltip/index.cjs.map +1 -0
- package/dist/components/overlays/tooltip/index.d.cts +24 -0
- package/dist/components/overlays/tooltip/index.d.ts +24 -0
- package/dist/components/overlays/tooltip/index.js +71 -0
- package/dist/components/overlays/tooltip/index.js.map +1 -0
- package/dist/components/overlays/tooltip/tooltip.css +67 -0
- package/dist/components/typography/heading.cjs +14 -0
- package/dist/components/typography/heading.cjs.map +1 -0
- package/dist/components/typography/heading.d.cts +11 -0
- package/dist/components/typography/heading.d.ts +11 -0
- package/dist/components/typography/heading.js +14 -0
- package/dist/components/typography/heading.js.map +1 -0
- package/dist/components/typography/text.cjs +14 -0
- package/dist/components/typography/text.cjs.map +1 -0
- package/dist/components/typography/text.d.cts +12 -0
- package/dist/components/typography/text.d.ts +12 -0
- package/dist/components/typography/text.js +14 -0
- package/dist/components/typography/text.js.map +1 -0
- package/dist/components/utilities/preview/highlight.cjs +79 -0
- package/dist/components/utilities/preview/highlight.cjs.map +1 -0
- package/dist/components/utilities/preview/highlight.js +79 -0
- package/dist/components/utilities/preview/highlight.js.map +1 -0
- package/dist/components/utilities/preview/index.cjs +391 -0
- package/dist/components/utilities/preview/index.cjs.map +1 -0
- package/dist/components/utilities/preview/index.d.cts +20 -0
- package/dist/components/utilities/preview/index.d.ts +20 -0
- package/dist/components/utilities/preview/index.js +391 -0
- package/dist/components/utilities/preview/index.js.map +1 -0
- package/dist/components/utilities/preview/preview.css +268 -0
- package/dist/components/utilities/scroll-lock/index.cjs +124 -0
- package/dist/components/utilities/scroll-lock/index.cjs.map +1 -0
- package/dist/components/utilities/scroll-lock/index.d.cts +6 -0
- package/dist/components/utilities/scroll-lock/index.d.ts +6 -0
- package/dist/components/utilities/scroll-lock/index.js +124 -0
- package/dist/components/utilities/scroll-lock/index.js.map +1 -0
- package/dist/components/utilities/transition/index.cjs +171 -0
- package/dist/components/utilities/transition/index.cjs.map +1 -0
- package/dist/components/utilities/transition/index.d.cts +27 -0
- package/dist/components/utilities/transition/index.d.ts +27 -0
- package/dist/components/utilities/transition/index.js +171 -0
- package/dist/components/utilities/transition/index.js.map +1 -0
- package/dist/components/utilities/transition/transition.css +130 -0
- package/dist/index.cjs +159 -0
- package/dist/index.d.cts +86 -0
- package/dist/index.d.ts +86 -0
- package/dist/index.js +70 -0
- package/package.json +65 -4
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { getPanelPairBounds, normalizePanelSizes, resizePanelPair } from "./resizable-panels.utils.js";
|
|
3
|
+
import "./resizable-panels.css";
|
|
4
|
+
import { cn } from "@puzzle-ui/core";
|
|
5
|
+
import { Children, cloneElement, isValidElement, useId, useRef, useState } from "react";
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
// src/components/layout/resizable-panels/index.tsx
|
|
8
|
+
const isResizablePanelElement = (child) => isValidElement(child) && child.type === ResizablePanel;
|
|
9
|
+
const isResizableHandleElement = (child) => isValidElement(child) && child.type === ResizableHandle;
|
|
10
|
+
const parsePixels = (value) => Number.parseFloat(value ?? "") || 0;
|
|
11
|
+
const getAvailableSize = (group, orientation) => {
|
|
12
|
+
const computedStyle = group.ownerDocument.defaultView?.getComputedStyle(group);
|
|
13
|
+
const isHorizontal = orientation === "horizontal";
|
|
14
|
+
const totalSize = isHorizontal ? group.clientWidth : group.clientHeight;
|
|
15
|
+
const paddingSize = computedStyle ? isHorizontal ? parsePixels(computedStyle.paddingLeft) + parsePixels(computedStyle.paddingRight) : parsePixels(computedStyle.paddingTop) + parsePixels(computedStyle.paddingBottom) : 0;
|
|
16
|
+
const handleSize = Array.from(group.children).reduce((total, child) => {
|
|
17
|
+
const element = child;
|
|
18
|
+
if (!element.hasAttribute("data-puzzle-resizable-handle")) return total;
|
|
19
|
+
const rect = element.getBoundingClientRect();
|
|
20
|
+
return total + (isHorizontal ? rect.width : rect.height);
|
|
21
|
+
}, 0);
|
|
22
|
+
return Math.max(0, totalSize - paddingSize - handleSize);
|
|
23
|
+
};
|
|
24
|
+
const getResizeDirection = (element, orientation) => {
|
|
25
|
+
if (orientation !== "horizontal") return 1;
|
|
26
|
+
return element.ownerDocument.defaultView?.getComputedStyle(element).direction === "rtl" ? -1 : 1;
|
|
27
|
+
};
|
|
28
|
+
const getPointerCoordinate = (event, orientation) => orientation === "horizontal" ? event.clientX : event.clientY;
|
|
29
|
+
const ResizablePanel = ({ id, minSize = 0, maxSize = 100, panelIndex = 0, panelSize = 1, panelId, className, style, ...props }) => /* @__PURE__ */ jsx("div", {
|
|
30
|
+
...props,
|
|
31
|
+
id: panelId ?? id,
|
|
32
|
+
className: cn("puzzle-resizable-panels__panel", className),
|
|
33
|
+
style: {
|
|
34
|
+
...style,
|
|
35
|
+
flex: `${panelSize} 1 0%`
|
|
36
|
+
},
|
|
37
|
+
"data-panel-index": panelIndex,
|
|
38
|
+
"data-panel-size": panelSize,
|
|
39
|
+
"data-panel-min-size": minSize,
|
|
40
|
+
"data-panel-max-size": maxSize
|
|
41
|
+
});
|
|
42
|
+
const ResizableHandle = ({ withGrip = false, disabled = false, handleIndex = -1, orientation = "horizontal", value, minValue, maxValue, panelIds, inheritedDisabled = false, onResizeStart, onResizeMove, onResizeEnd, onResizeKeyDown, onPointerDown, onPointerMove, onPointerUp, onPointerCancel, onLostPointerCapture, onKeyDown, className, children, tabIndex, "aria-label": ariaLabel, ...props }) => {
|
|
43
|
+
const isDisabled = disabled || inheritedDisabled;
|
|
44
|
+
const handlePointerDown = (event) => {
|
|
45
|
+
onPointerDown?.(event);
|
|
46
|
+
if (!event.defaultPrevented && !isDisabled) onResizeStart?.(event, handleIndex);
|
|
47
|
+
};
|
|
48
|
+
const handlePointerMove = (event) => {
|
|
49
|
+
onPointerMove?.(event);
|
|
50
|
+
if (!event.defaultPrevented && !isDisabled) onResizeMove?.(event, handleIndex);
|
|
51
|
+
};
|
|
52
|
+
const handlePointerUp = (event) => {
|
|
53
|
+
onResizeEnd?.(event, handleIndex);
|
|
54
|
+
onPointerUp?.(event);
|
|
55
|
+
};
|
|
56
|
+
const handlePointerCancel = (event) => {
|
|
57
|
+
onResizeEnd?.(event, handleIndex);
|
|
58
|
+
onPointerCancel?.(event);
|
|
59
|
+
};
|
|
60
|
+
const handleLostPointerCapture = (event) => {
|
|
61
|
+
onResizeEnd?.(event, handleIndex);
|
|
62
|
+
onLostPointerCapture?.(event);
|
|
63
|
+
};
|
|
64
|
+
const handleKeyDown = (event) => {
|
|
65
|
+
onKeyDown?.(event);
|
|
66
|
+
if (!event.defaultPrevented && !isDisabled) onResizeKeyDown?.(event, handleIndex);
|
|
67
|
+
};
|
|
68
|
+
return /* @__PURE__ */ jsx("div", {
|
|
69
|
+
...props,
|
|
70
|
+
className: cn("puzzle-resizable-panels__handle", className),
|
|
71
|
+
role: "separator",
|
|
72
|
+
tabIndex: isDisabled ? -1 : tabIndex ?? 0,
|
|
73
|
+
"aria-label": ariaLabel ?? "Resize panels",
|
|
74
|
+
"aria-orientation": orientation === "horizontal" ? "vertical" : "horizontal",
|
|
75
|
+
"aria-controls": panelIds?.join(" "),
|
|
76
|
+
"aria-valuenow": value,
|
|
77
|
+
"aria-valuemin": minValue,
|
|
78
|
+
"aria-valuemax": maxValue,
|
|
79
|
+
"aria-valuetext": value === void 0 ? void 0 : `${Math.round(value * 100) / 100}%`,
|
|
80
|
+
"aria-disabled": isDisabled || void 0,
|
|
81
|
+
"data-puzzle-resizable-handle": "",
|
|
82
|
+
"data-orientation": orientation,
|
|
83
|
+
"data-disabled": isDisabled ? "true" : void 0,
|
|
84
|
+
onPointerDown: handlePointerDown,
|
|
85
|
+
onPointerMove: handlePointerMove,
|
|
86
|
+
onPointerUp: handlePointerUp,
|
|
87
|
+
onPointerCancel: handlePointerCancel,
|
|
88
|
+
onLostPointerCapture: handleLostPointerCapture,
|
|
89
|
+
onKeyDown: handleKeyDown,
|
|
90
|
+
children: withGrip ? /* @__PURE__ */ jsx("span", {
|
|
91
|
+
className: "puzzle-resizable-panels__handle-grip",
|
|
92
|
+
"aria-hidden": "true"
|
|
93
|
+
}) : children
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
const ResizablePanelsRoot = ({ children, orientation = "horizontal", sizes, defaultSizes, onSizesChange, disabled = false, keyboardStep = 1, id, role, className, style, ref: forwardedRef, ...rootProps }) => {
|
|
97
|
+
const generatedId = useId();
|
|
98
|
+
const groupId = id ?? `puzzle-resizable-panels-${generatedId}`;
|
|
99
|
+
if (!Number.isFinite(keyboardStep) || keyboardStep <= 0) throw new RangeError("keyboardStep must be a positive finite number.");
|
|
100
|
+
const childrenArray = Children.toArray(children);
|
|
101
|
+
if (!(childrenArray.length >= 3 && childrenArray.length % 2 === 1 && childrenArray.every((child, index) => index % 2 === 0 ? isResizablePanelElement(child) : isResizableHandleElement(child)))) throw new Error("ResizablePanels requires alternating Panel and Handle children, starting and ending with a Panel. At least two panels are required.");
|
|
102
|
+
const panelElements = childrenArray.filter(isResizablePanelElement);
|
|
103
|
+
const panelCount = panelElements.length;
|
|
104
|
+
const panelConstraints = panelElements.map((panel) => ({
|
|
105
|
+
minSize: panel.props.minSize,
|
|
106
|
+
maxSize: panel.props.maxSize
|
|
107
|
+
}));
|
|
108
|
+
const panelIds = panelElements.map((panel, index) => panel.props.id ?? `${groupId}-panel-${index}`);
|
|
109
|
+
if (new Set(panelIds).size !== panelIds.length) throw new Error("ResizablePanels requires unique panel IDs.");
|
|
110
|
+
const [uncontrolledSizes, setUncontrolledSizes] = useState(() => normalizePanelSizes(sizes === void 0 ? defaultSizes : void 0, panelConstraints));
|
|
111
|
+
const layoutInput = sizes ?? (uncontrolledSizes.length === panelCount ? uncontrolledSizes : void 0);
|
|
112
|
+
const currentSizes = normalizePanelSizes(layoutInput, panelConstraints);
|
|
113
|
+
const [isResizing, setIsResizing] = useState(false);
|
|
114
|
+
const groupRef = useRef(null);
|
|
115
|
+
const pointerDragRef = useRef(null);
|
|
116
|
+
const updateSizes = (nextSizes) => {
|
|
117
|
+
const normalized = normalizePanelSizes(nextSizes, panelConstraints);
|
|
118
|
+
if (!normalized.some((size, index) => Math.abs(size - currentSizes[index]) > 1e-6)) return;
|
|
119
|
+
if (sizes === void 0) setUncontrolledSizes(normalized);
|
|
120
|
+
onSizesChange?.(normalized);
|
|
121
|
+
};
|
|
122
|
+
const handlePointerDown = (event, handleIndex) => {
|
|
123
|
+
const group = groupRef.current;
|
|
124
|
+
if (!group || disabled) return;
|
|
125
|
+
if (event.button !== 0 && event.pointerType !== "touch" && event.pointerType !== "pen") return;
|
|
126
|
+
const availableSize = getAvailableSize(group, orientation);
|
|
127
|
+
if (availableSize <= 0) return;
|
|
128
|
+
pointerDragRef.current = {
|
|
129
|
+
handleIndex,
|
|
130
|
+
pointerId: event.pointerId,
|
|
131
|
+
startCoordinate: getPointerCoordinate(event, orientation),
|
|
132
|
+
availableSize,
|
|
133
|
+
direction: getResizeDirection(group, orientation),
|
|
134
|
+
sizes: [...currentSizes]
|
|
135
|
+
};
|
|
136
|
+
try {
|
|
137
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
138
|
+
} catch {}
|
|
139
|
+
event.preventDefault();
|
|
140
|
+
setIsResizing(true);
|
|
141
|
+
};
|
|
142
|
+
const handlePointerMove = (event, handleIndex) => {
|
|
143
|
+
const drag = pointerDragRef.current;
|
|
144
|
+
if (!drag || drag.pointerId !== event.pointerId || drag.handleIndex !== handleIndex) return;
|
|
145
|
+
const delta = (getPointerCoordinate(event, orientation) - drag.startCoordinate) / drag.availableSize * 100 * drag.direction;
|
|
146
|
+
const nextSizes = resizePanelPair(drag.sizes, panelConstraints, handleIndex, delta);
|
|
147
|
+
event.preventDefault();
|
|
148
|
+
updateSizes(nextSizes);
|
|
149
|
+
};
|
|
150
|
+
const handlePointerEnd = (event, handleIndex) => {
|
|
151
|
+
const drag = pointerDragRef.current;
|
|
152
|
+
if (!drag || drag.pointerId !== event.pointerId || drag.handleIndex !== handleIndex) return;
|
|
153
|
+
pointerDragRef.current = null;
|
|
154
|
+
setIsResizing(false);
|
|
155
|
+
};
|
|
156
|
+
const handleKeyDown = (event, handleIndex) => {
|
|
157
|
+
if (disabled) return;
|
|
158
|
+
const currentSize = currentSizes[handleIndex];
|
|
159
|
+
const bounds = getPanelPairBounds(currentSizes, panelConstraints, handleIndex);
|
|
160
|
+
const group = groupRef.current;
|
|
161
|
+
const direction = group ? getResizeDirection(group, orientation) : 1;
|
|
162
|
+
const step = keyboardStep * (event.shiftKey ? 10 : 1);
|
|
163
|
+
let nextSize;
|
|
164
|
+
if (event.key === "Home") nextSize = bounds.minSize;
|
|
165
|
+
else if (event.key === "End") nextSize = bounds.maxSize;
|
|
166
|
+
else if (orientation === "horizontal") {
|
|
167
|
+
if (event.key === "ArrowRight") nextSize = currentSize + step * direction;
|
|
168
|
+
else if (event.key === "ArrowLeft") nextSize = currentSize - step * direction;
|
|
169
|
+
} else if (event.key === "ArrowDown") nextSize = currentSize + step;
|
|
170
|
+
else if (event.key === "ArrowUp") nextSize = currentSize - step;
|
|
171
|
+
if (nextSize === void 0) return;
|
|
172
|
+
event.preventDefault();
|
|
173
|
+
updateSizes(resizePanelPair(currentSizes, panelConstraints, handleIndex, nextSize - currentSize));
|
|
174
|
+
};
|
|
175
|
+
let panelIndex = 0;
|
|
176
|
+
const enhancedChildren = childrenArray.map((child) => {
|
|
177
|
+
if (isResizablePanelElement(child)) {
|
|
178
|
+
const index = panelIndex++;
|
|
179
|
+
return cloneElement(child, {
|
|
180
|
+
panelIndex: index,
|
|
181
|
+
panelSize: currentSizes[index],
|
|
182
|
+
panelId: panelIds[index]
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
const handleIndex = panelIndex - 1;
|
|
186
|
+
const bounds = getPanelPairBounds(currentSizes, panelConstraints, handleIndex);
|
|
187
|
+
return cloneElement(child, {
|
|
188
|
+
handleIndex,
|
|
189
|
+
orientation,
|
|
190
|
+
value: currentSizes[handleIndex],
|
|
191
|
+
minValue: bounds.minSize,
|
|
192
|
+
maxValue: bounds.maxSize,
|
|
193
|
+
panelIds: [panelIds[handleIndex], panelIds[handleIndex + 1]],
|
|
194
|
+
inheritedDisabled: disabled,
|
|
195
|
+
onResizeStart: handlePointerDown,
|
|
196
|
+
onResizeMove: handlePointerMove,
|
|
197
|
+
onResizeEnd: handlePointerEnd,
|
|
198
|
+
onResizeKeyDown: handleKeyDown
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
return /* @__PURE__ */ jsx("div", {
|
|
202
|
+
...rootProps,
|
|
203
|
+
ref: (node) => {
|
|
204
|
+
groupRef.current = node;
|
|
205
|
+
if (typeof forwardedRef === "function") forwardedRef(node);
|
|
206
|
+
else if (forwardedRef) forwardedRef.current = node;
|
|
207
|
+
},
|
|
208
|
+
id: groupId,
|
|
209
|
+
role: role ?? "group",
|
|
210
|
+
className: cn("puzzle-resizable-panels", className),
|
|
211
|
+
style,
|
|
212
|
+
"data-orientation": orientation,
|
|
213
|
+
"data-disabled": disabled ? "true" : void 0,
|
|
214
|
+
"data-resizing": isResizing ? "true" : void 0,
|
|
215
|
+
children: enhancedChildren
|
|
216
|
+
});
|
|
217
|
+
};
|
|
218
|
+
const ResizablePanels = Object.assign(ResizablePanelsRoot, {
|
|
219
|
+
Panel: ResizablePanel,
|
|
220
|
+
Handle: ResizableHandle
|
|
221
|
+
});
|
|
222
|
+
export { ResizableHandle, ResizablePanel, ResizablePanels };
|
|
223
|
+
|
|
224
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/layout/resizable-panels/index.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"@puzzle-ui/core\";\n\nimport {\n Children,\n cloneElement,\n isValidElement,\n useId,\n useRef,\n useState,\n type ComponentPropsWithRef,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactElement,\n type ReactNode,\n} from \"react\";\n\nimport {\n getPanelPairBounds,\n normalizePanelSizes,\n resizePanelPair,\n type PanelSizeConstraint,\n} from \"./resizable-panels.utils\";\n\nimport \"./resizable-panels.css\";\n\ntype ResizablePanelsOrientation = \"horizontal\" | \"vertical\";\n\ntype ResizablePanelsProps = Omit<ComponentPropsWithRef<\"div\">, \"children\"> & {\n /** Layout direction. Defaults to horizontal. */\n orientation?: ResizablePanelsOrientation;\n\n /** Controlled panel sizes, expressed as percentages. */\n sizes?: readonly number[];\n\n /** Initial panel sizes for uncontrolled usage. */\n defaultSizes?: readonly number[];\n\n /** Called whenever the panel layout changes. */\n onSizesChange?: (sizes: number[]) => void;\n\n /** Disables all resizing interactions. */\n disabled?: boolean;\n\n /** Percentage change per keyboard interaction. Defaults to 1. */\n keyboardStep?: number;\n\n /** Panels and handles that make up the group. */\n children: ReactNode;\n};\n\ntype ResizablePanelProps = ComponentPropsWithRef<\"div\"> & {\n /** Minimum panel size in percentages. Defaults to 0. */\n minSize?: number;\n\n /** Maximum panel size in percentages. Defaults to 100. */\n maxSize?: number;\n};\n\ntype ResizableHandleProps = ComponentPropsWithRef<\"div\"> & {\n /** Renders a visible grip inside the resize handle. */\n withGrip?: boolean;\n\n /** Disables resizing through this handle. */\n disabled?: boolean;\n};\n\ntype ResizePointerHandler = (\n event: ReactPointerEvent<HTMLDivElement>,\n handleIndex: number,\n) => void;\n\ntype ResizeKeyboardHandler = (\n event: ReactKeyboardEvent<HTMLDivElement>,\n handleIndex: number,\n) => void;\n\ntype InternalResizablePanelProps = {\n panelIndex?: number;\n panelSize?: number;\n panelId?: string;\n};\n\ntype InternalResizableHandleProps = {\n handleIndex?: number;\n orientation?: ResizablePanelsOrientation;\n value?: number;\n minValue?: number;\n maxValue?: number;\n panelIds?: [string, string];\n inheritedDisabled?: boolean;\n\n onResizeStart?: ResizePointerHandler;\n onResizeMove?: ResizePointerHandler;\n onResizeEnd?: ResizePointerHandler;\n onResizeKeyDown?: ResizeKeyboardHandler;\n};\n\ntype PointerDragState = {\n handleIndex: number;\n pointerId: number;\n startCoordinate: number;\n availableSize: number;\n direction: number;\n sizes: number[];\n};\n\nconst isResizablePanelElement = (\n child: ReactNode,\n): child is ReactElement<ResizablePanelProps> =>\n isValidElement(child) && child.type === ResizablePanel;\n\nconst isResizableHandleElement = (\n child: ReactNode,\n): child is ReactElement<ResizableHandleProps> =>\n isValidElement(child) && child.type === ResizableHandle;\n\nconst parsePixels = (value: string | undefined) =>\n Number.parseFloat(value ?? \"\") || 0;\n\nconst getAvailableSize = (\n group: HTMLDivElement,\n orientation: ResizablePanelsOrientation,\n) => {\n const computedStyle =\n group.ownerDocument.defaultView?.getComputedStyle(group);\n\n const isHorizontal = orientation === \"horizontal\";\n\n const totalSize = isHorizontal ? group.clientWidth : group.clientHeight;\n\n const paddingSize = computedStyle\n ? isHorizontal\n ? parsePixels(computedStyle.paddingLeft) +\n parsePixels(computedStyle.paddingRight)\n : parsePixels(computedStyle.paddingTop) +\n parsePixels(computedStyle.paddingBottom)\n : 0;\n\n const handleSize = Array.from(group.children).reduce((total, child) => {\n const element = child as HTMLElement;\n\n if (!element.hasAttribute(\"data-puzzle-resizable-handle\")) {\n return total;\n }\n\n const rect = element.getBoundingClientRect();\n\n return total + (isHorizontal ? rect.width : rect.height);\n }, 0);\n\n return Math.max(0, totalSize - paddingSize - handleSize);\n};\n\nconst getResizeDirection = (\n element: HTMLElement,\n orientation: ResizablePanelsOrientation,\n) => {\n if (orientation !== \"horizontal\") {\n return 1;\n }\n\n const direction =\n element.ownerDocument.defaultView?.getComputedStyle(element).direction;\n\n return direction === \"rtl\" ? -1 : 1;\n};\n\nconst getPointerCoordinate = (\n event: ReactPointerEvent<HTMLDivElement>,\n orientation: ResizablePanelsOrientation,\n) => (orientation === \"horizontal\" ? event.clientX : event.clientY);\n\nconst ResizablePanel = ({\n id,\n minSize = 0,\n maxSize = 100,\n panelIndex = 0,\n panelSize = 1,\n panelId,\n className,\n style,\n ...props\n}: ResizablePanelProps & InternalResizablePanelProps) => (\n <div\n {...props}\n id={panelId ?? id}\n className={cn(\"puzzle-resizable-panels__panel\", className)}\n style={{\n ...style,\n flex: `${panelSize} 1 0%`,\n }}\n data-panel-index={panelIndex}\n data-panel-size={panelSize}\n data-panel-min-size={minSize}\n data-panel-max-size={maxSize}\n />\n);\n\nconst ResizableHandle = ({\n withGrip = false,\n disabled = false,\n handleIndex = -1,\n orientation = \"horizontal\",\n value,\n minValue,\n maxValue,\n panelIds,\n inheritedDisabled = false,\n onResizeStart,\n onResizeMove,\n onResizeEnd,\n onResizeKeyDown,\n onPointerDown,\n onPointerMove,\n onPointerUp,\n onPointerCancel,\n onLostPointerCapture,\n onKeyDown,\n className,\n children,\n tabIndex,\n \"aria-label\": ariaLabel,\n ...props\n}: ResizableHandleProps & InternalResizableHandleProps) => {\n const isDisabled = disabled || inheritedDisabled;\n\n const handlePointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n onPointerDown?.(event);\n\n if (!event.defaultPrevented && !isDisabled) {\n onResizeStart?.(event, handleIndex);\n }\n };\n\n const handlePointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n onPointerMove?.(event);\n\n if (!event.defaultPrevented && !isDisabled) {\n onResizeMove?.(event, handleIndex);\n }\n };\n\n const handlePointerUp = (event: ReactPointerEvent<HTMLDivElement>) => {\n onResizeEnd?.(event, handleIndex);\n onPointerUp?.(event);\n };\n\n const handlePointerCancel = (event: ReactPointerEvent<HTMLDivElement>) => {\n onResizeEnd?.(event, handleIndex);\n onPointerCancel?.(event);\n };\n\n const handleLostPointerCapture = (\n event: ReactPointerEvent<HTMLDivElement>,\n ) => {\n onResizeEnd?.(event, handleIndex);\n onLostPointerCapture?.(event);\n };\n\n const handleKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n\n if (!event.defaultPrevented && !isDisabled) {\n onResizeKeyDown?.(event, handleIndex);\n }\n };\n\n return (\n <div\n {...props}\n className={cn(\"puzzle-resizable-panels__handle\", className)}\n role=\"separator\"\n tabIndex={isDisabled ? -1 : (tabIndex ?? 0)}\n aria-label={ariaLabel ?? \"Resize panels\"}\n aria-orientation={\n orientation === \"horizontal\" ? \"vertical\" : \"horizontal\"\n }\n aria-controls={panelIds?.join(\" \")}\n aria-valuenow={value}\n aria-valuemin={minValue}\n aria-valuemax={maxValue}\n aria-valuetext={\n value === undefined ? undefined : `${Math.round(value * 100) / 100}%`\n }\n aria-disabled={isDisabled || undefined}\n data-puzzle-resizable-handle=\"\"\n data-orientation={orientation}\n data-disabled={isDisabled ? \"true\" : undefined}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerCancel}\n onLostPointerCapture={handleLostPointerCapture}\n onKeyDown={handleKeyDown}\n >\n {withGrip ? (\n <span\n className=\"puzzle-resizable-panels__handle-grip\"\n aria-hidden=\"true\"\n />\n ) : (\n children\n )}\n </div>\n );\n};\n\nconst ResizablePanelsRoot = ({\n children,\n orientation = \"horizontal\",\n sizes,\n defaultSizes,\n onSizesChange,\n disabled = false,\n keyboardStep = 1,\n id,\n role,\n className,\n style,\n ref: forwardedRef,\n ...rootProps\n}: ResizablePanelsProps) => {\n const generatedId = useId();\n\n const groupId = id ?? `puzzle-resizable-panels-${generatedId}`;\n\n if (!Number.isFinite(keyboardStep) || keyboardStep <= 0) {\n throw new RangeError(\"keyboardStep must be a positive finite number.\");\n }\n\n const childrenArray = Children.toArray(children);\n\n const validChildren =\n childrenArray.length >= 3 &&\n childrenArray.length % 2 === 1 &&\n childrenArray.every((child, index) =>\n index % 2 === 0\n ? isResizablePanelElement(child)\n : isResizableHandleElement(child),\n );\n\n if (!validChildren) {\n throw new Error(\n \"ResizablePanels requires alternating Panel and Handle children, starting and ending with a Panel. At least two panels are required.\",\n );\n }\n\n const panelElements = childrenArray.filter(isResizablePanelElement);\n\n const panelCount = panelElements.length;\n\n const panelConstraints: PanelSizeConstraint[] = panelElements.map(\n (panel) => ({\n minSize: panel.props.minSize,\n maxSize: panel.props.maxSize,\n }),\n );\n\n const panelIds = panelElements.map(\n (panel, index) => panel.props.id ?? `${groupId}-panel-${index}`,\n );\n\n if (new Set(panelIds).size !== panelIds.length) {\n throw new Error(\"ResizablePanels requires unique panel IDs.\");\n }\n\n const [uncontrolledSizes, setUncontrolledSizes] = useState<number[]>(() =>\n normalizePanelSizes(\n sizes === undefined ? defaultSizes : undefined,\n panelConstraints,\n ),\n );\n\n const layoutInput =\n sizes ??\n (uncontrolledSizes.length === panelCount ? uncontrolledSizes : undefined);\n\n const currentSizes = normalizePanelSizes(layoutInput, panelConstraints);\n\n const [isResizing, setIsResizing] = useState(false);\n\n const groupRef = useRef<HTMLDivElement | null>(null);\n\n const pointerDragRef = useRef<PointerDragState | null>(null);\n\n const updateSizes = (nextSizes: readonly number[]) => {\n const normalized = normalizePanelSizes(nextSizes, panelConstraints);\n\n const hasChanged = normalized.some(\n (size, index) => Math.abs(size - currentSizes[index]) > 0.000001,\n );\n\n if (!hasChanged) {\n return;\n }\n\n if (sizes === undefined) {\n setUncontrolledSizes(normalized);\n }\n\n onSizesChange?.(normalized);\n };\n\n const handlePointerDown: ResizePointerHandler = (event, handleIndex) => {\n const group = groupRef.current;\n\n if (!group || disabled) {\n return;\n }\n\n if (\n event.button !== 0 &&\n event.pointerType !== \"touch\" &&\n event.pointerType !== \"pen\"\n ) {\n return;\n }\n\n const availableSize = getAvailableSize(group, orientation);\n\n if (availableSize <= 0) {\n return;\n }\n\n pointerDragRef.current = {\n handleIndex,\n pointerId: event.pointerId,\n startCoordinate: getPointerCoordinate(event, orientation),\n availableSize,\n direction: getResizeDirection(group, orientation),\n sizes: [...currentSizes],\n };\n\n try {\n event.currentTarget.setPointerCapture(event.pointerId);\n } catch {\n // Synthetic pointer events and detached elements may not\n // support pointer capture.\n }\n\n event.preventDefault();\n setIsResizing(true);\n };\n\n const handlePointerMove: ResizePointerHandler = (event, handleIndex) => {\n const drag = pointerDragRef.current;\n\n if (\n !drag ||\n drag.pointerId !== event.pointerId ||\n drag.handleIndex !== handleIndex\n ) {\n return;\n }\n\n const currentCoordinate = getPointerCoordinate(event, orientation);\n\n const delta =\n ((currentCoordinate - drag.startCoordinate) / drag.availableSize) *\n 100 *\n drag.direction;\n\n const nextSizes = resizePanelPair(\n drag.sizes,\n panelConstraints,\n handleIndex,\n delta,\n );\n\n event.preventDefault();\n updateSizes(nextSizes);\n };\n\n const handlePointerEnd: ResizePointerHandler = (event, handleIndex) => {\n const drag = pointerDragRef.current;\n\n if (\n !drag ||\n drag.pointerId !== event.pointerId ||\n drag.handleIndex !== handleIndex\n ) {\n return;\n }\n\n pointerDragRef.current = null;\n setIsResizing(false);\n };\n\n const handleKeyDown: ResizeKeyboardHandler = (event, handleIndex) => {\n if (disabled) {\n return;\n }\n\n const currentSize = currentSizes[handleIndex];\n\n const bounds = getPanelPairBounds(\n currentSizes,\n panelConstraints,\n handleIndex,\n );\n\n const group = groupRef.current;\n\n const direction = group ? getResizeDirection(group, orientation) : 1;\n\n const step = keyboardStep * (event.shiftKey ? 10 : 1);\n\n let nextSize: number | undefined;\n\n if (event.key === \"Home\") {\n nextSize = bounds.minSize;\n } else if (event.key === \"End\") {\n nextSize = bounds.maxSize;\n } else if (orientation === \"horizontal\") {\n if (event.key === \"ArrowRight\") {\n nextSize = currentSize + step * direction;\n } else if (event.key === \"ArrowLeft\") {\n nextSize = currentSize - step * direction;\n }\n } else {\n if (event.key === \"ArrowDown\") {\n nextSize = currentSize + step;\n } else if (event.key === \"ArrowUp\") {\n nextSize = currentSize - step;\n }\n }\n\n if (nextSize === undefined) {\n return;\n }\n\n event.preventDefault();\n\n updateSizes(\n resizePanelPair(\n currentSizes,\n panelConstraints,\n handleIndex,\n nextSize - currentSize,\n ),\n );\n };\n\n let panelIndex = 0;\n\n const enhancedChildren = childrenArray.map((child) => {\n if (isResizablePanelElement(child)) {\n const index = panelIndex++;\n\n return cloneElement(\n child as ReactElement<\n ResizablePanelProps & InternalResizablePanelProps\n >,\n {\n panelIndex: index,\n panelSize: currentSizes[index],\n panelId: panelIds[index],\n },\n );\n }\n\n const handleIndex = panelIndex - 1;\n\n const bounds = getPanelPairBounds(\n currentSizes,\n panelConstraints,\n handleIndex,\n );\n\n return cloneElement(\n child as ReactElement<\n ResizableHandleProps & InternalResizableHandleProps\n >,\n {\n handleIndex,\n orientation,\n value: currentSizes[handleIndex],\n minValue: bounds.minSize,\n maxValue: bounds.maxSize,\n panelIds: [panelIds[handleIndex], panelIds[handleIndex + 1]],\n inheritedDisabled: disabled,\n onResizeStart: handlePointerDown,\n onResizeMove: handlePointerMove,\n onResizeEnd: handlePointerEnd,\n onResizeKeyDown: handleKeyDown,\n },\n );\n });\n\n return (\n <div\n {...rootProps}\n ref={(node) => {\n groupRef.current = node;\n\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n }}\n id={groupId}\n role={role ?? \"group\"}\n className={cn(\"puzzle-resizable-panels\", className)}\n style={style}\n data-orientation={orientation}\n data-disabled={disabled ? \"true\" : undefined}\n data-resizing={isResizing ? \"true\" : undefined}\n >\n {enhancedChildren}\n </div>\n );\n};\n\ntype ResizablePanelsComponent = typeof ResizablePanelsRoot & {\n Panel: typeof ResizablePanel;\n Handle: typeof ResizableHandle;\n};\n\nconst ResizablePanels = Object.assign(ResizablePanelsRoot, {\n Panel: ResizablePanel,\n Handle: ResizableHandle,\n}) as ResizablePanelsComponent;\n\nexport {\n ResizablePanels,\n ResizablePanel,\n ResizableHandle,\n type ResizablePanelsProps,\n type ResizablePanelProps,\n type ResizableHandleProps,\n type ResizablePanelsOrientation,\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
.puzzle-resizable-panels {
|
|
2
|
+
--puzzle-resizable-panels-handle-size: var(--puzzle-space-3, .75rem);
|
|
3
|
+
box-sizing: border-box;
|
|
4
|
+
align-items: stretch;
|
|
5
|
+
width: 100%;
|
|
6
|
+
min-width: 0;
|
|
7
|
+
height: 100%;
|
|
8
|
+
min-height: 0;
|
|
9
|
+
display: flex;
|
|
10
|
+
overflow: hidden;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.puzzle-resizable-panels[data-orientation="vertical"] {
|
|
14
|
+
flex-direction: column;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.puzzle-resizable-panels__panel {
|
|
18
|
+
box-sizing: border-box;
|
|
19
|
+
min-width: 0;
|
|
20
|
+
min-height: 0;
|
|
21
|
+
position: relative;
|
|
22
|
+
overflow: auto;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.puzzle-resizable-panels__handle {
|
|
26
|
+
z-index: 1;
|
|
27
|
+
flex: 0 0 var(--puzzle-resizable-panels-handle-size);
|
|
28
|
+
color: var(--puzzle-color-text-muted);
|
|
29
|
+
cursor: col-resize;
|
|
30
|
+
touch-action: none;
|
|
31
|
+
user-select: none;
|
|
32
|
+
background: none;
|
|
33
|
+
border: 0;
|
|
34
|
+
outline: none;
|
|
35
|
+
justify-content: center;
|
|
36
|
+
align-items: center;
|
|
37
|
+
padding: 0;
|
|
38
|
+
display: flex;
|
|
39
|
+
position: relative;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.puzzle-resizable-panels[data-orientation="horizontal"] .puzzle-resizable-panels__handle {
|
|
43
|
+
cursor: col-resize;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.puzzle-resizable-panels[data-orientation="vertical"] .puzzle-resizable-panels__handle {
|
|
47
|
+
cursor: row-resize;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.puzzle-resizable-panels__handle:before {
|
|
51
|
+
inline-size: var(--puzzle-border-width, 1px);
|
|
52
|
+
content: "";
|
|
53
|
+
background-color: var(--puzzle-color-border);
|
|
54
|
+
position: absolute;
|
|
55
|
+
inset-block: 0;
|
|
56
|
+
inset-inline-start: 50%;
|
|
57
|
+
transform: translateX(-50%);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.puzzle-resizable-panels[data-orientation="vertical"] .puzzle-resizable-panels__handle:before {
|
|
61
|
+
inline-size: auto;
|
|
62
|
+
block-size: var(--puzzle-border-width, 1px);
|
|
63
|
+
inset-block: 50%;
|
|
64
|
+
inset-inline: 0;
|
|
65
|
+
transform: translateY(-50%);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.puzzle-resizable-panels__handle:hover:not([data-disabled="true"]):before, .puzzle-resizable-panels__handle:focus-visible:before {
|
|
69
|
+
background-color: var(--puzzle-color-border-strong);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.puzzle-resizable-panels__handle:focus-visible {
|
|
73
|
+
outline: 2px solid var(--puzzle-color-ring);
|
|
74
|
+
outline-offset: -2px;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.puzzle-resizable-panels__handle:active:not([data-disabled="true"]):before {
|
|
78
|
+
background-color: var(--puzzle-color-ring);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.puzzle-resizable-panels__handle[data-disabled="true"] {
|
|
82
|
+
cursor: not-allowed;
|
|
83
|
+
opacity: .55;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.puzzle-resizable-panels__handle-grip {
|
|
87
|
+
z-index: 1;
|
|
88
|
+
inline-size: var(--puzzle-space-1, .25rem);
|
|
89
|
+
background-image: radial-gradient(circle, currentColor 1px, #0000 1.5px);
|
|
90
|
+
background-size: var(--puzzle-space-1, .25rem) var(--puzzle-space-1, .25rem);
|
|
91
|
+
background-position: center;
|
|
92
|
+
background-repeat: repeat;
|
|
93
|
+
border-radius: 999px;
|
|
94
|
+
block-size: 1.5rem;
|
|
95
|
+
display: block;
|
|
96
|
+
position: relative;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.puzzle-resizable-panels[data-orientation="vertical"] .puzzle-resizable-panels__handle-grip {
|
|
100
|
+
inline-size: 1.5rem;
|
|
101
|
+
block-size: var(--puzzle-space-1, .25rem);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.puzzle-resizable-panels[data-resizing="true"] {
|
|
105
|
+
user-select: none;
|
|
106
|
+
cursor: inherit;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.puzzle-resizable-panels[data-resizing="true"] .puzzle-resizable-panels__panel {
|
|
110
|
+
user-select: none;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
@media (forced-colors: active) {
|
|
114
|
+
.puzzle-resizable-panels__handle:before {
|
|
115
|
+
background-color: canvastext;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.puzzle-resizable-panels__handle:focus-visible {
|
|
119
|
+
outline-color: highlight;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// src/components/layout/resizable-panels/resizable-panels.utils.ts
|
|
2
|
+
const normalizePanelConstraints = (constraints) => {
|
|
3
|
+
if (constraints.length < 2) throw new RangeError("ResizablePanels requires at least two panels.");
|
|
4
|
+
const normalized = constraints.map((constraint, index) => {
|
|
5
|
+
const minSize = constraint.minSize ?? 0;
|
|
6
|
+
const maxSize = constraint.maxSize ?? 100;
|
|
7
|
+
if (!Number.isFinite(minSize) || !Number.isFinite(maxSize) || minSize < 0 || maxSize > 100 || minSize > maxSize) throw new RangeError(`Invalid size constraints for panel ${index}.`);
|
|
8
|
+
return {
|
|
9
|
+
minSize,
|
|
10
|
+
maxSize
|
|
11
|
+
};
|
|
12
|
+
});
|
|
13
|
+
const minimumTotal = normalized.reduce((total, constraint) => total + constraint.minSize, 0);
|
|
14
|
+
const maximumTotal = normalized.reduce((total, constraint) => total + constraint.maxSize, 0);
|
|
15
|
+
if (minimumTotal > 100 || maximumTotal < 100) throw new RangeError("Panel size constraints cannot produce a layout totaling 100%.");
|
|
16
|
+
return normalized;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Normalizes panel sizes to 100% while respecting every panel constraint.
|
|
20
|
+
*
|
|
21
|
+
* When a panel reaches its minimum or maximum, the remaining space is
|
|
22
|
+
* distributed proportionally between the other panels.
|
|
23
|
+
*/
|
|
24
|
+
const normalizePanelSizes = (sizes, constraints) => {
|
|
25
|
+
const normalizedConstraints = normalizePanelConstraints(constraints);
|
|
26
|
+
if (sizes && sizes.length !== constraints.length) throw new RangeError("The number of panel sizes must match the number of panels.");
|
|
27
|
+
const weights = normalizedConstraints.map((_, index) => {
|
|
28
|
+
const size = sizes?.[index] ?? 1;
|
|
29
|
+
return Number.isFinite(size) ? Math.max(0, size) : 0;
|
|
30
|
+
});
|
|
31
|
+
const result = new Array(constraints.length).fill(0);
|
|
32
|
+
const unresolved = normalizedConstraints.map((_, index) => index);
|
|
33
|
+
let remainingSize = 100;
|
|
34
|
+
while (unresolved.length > 0) {
|
|
35
|
+
const activeWeightTotal = unresolved.reduce((total, index) => total + weights[index], 0);
|
|
36
|
+
const useEqualDistribution = activeWeightTotal === 0;
|
|
37
|
+
const candidates = unresolved.map((index) => ({
|
|
38
|
+
index,
|
|
39
|
+
size: remainingSize * (useEqualDistribution ? 1 : weights[index]) / (useEqualDistribution ? unresolved.length : activeWeightTotal)
|
|
40
|
+
}));
|
|
41
|
+
const violations = candidates.filter(({ index, size }) => {
|
|
42
|
+
const constraint = normalizedConstraints[index];
|
|
43
|
+
return size < constraint.minSize || size > constraint.maxSize;
|
|
44
|
+
});
|
|
45
|
+
if (violations.length === 0) {
|
|
46
|
+
for (const candidate of candidates) result[candidate.index] = candidate.size;
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
const clampedViolations = violations.map(({ index, size }) => {
|
|
50
|
+
const constraint = normalizedConstraints[index];
|
|
51
|
+
return {
|
|
52
|
+
index,
|
|
53
|
+
size,
|
|
54
|
+
fixedSize: Math.min(constraint.maxSize, Math.max(constraint.minSize, size))
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
const totalCorrection = clampedViolations.reduce((total, { size, fixedSize }) => total + fixedSize - size, 0);
|
|
58
|
+
const fixedIndexes = /* @__PURE__ */ new Set();
|
|
59
|
+
for (const { index, size, fixedSize } of clampedViolations) {
|
|
60
|
+
if (totalCorrection > 0 && fixedSize < size || totalCorrection < 0 && fixedSize > size) continue;
|
|
61
|
+
result[index] = fixedSize;
|
|
62
|
+
remainingSize -= fixedSize;
|
|
63
|
+
fixedIndexes.add(index);
|
|
64
|
+
}
|
|
65
|
+
for (let index = unresolved.length - 1; index >= 0; index--) if (fixedIndexes.has(unresolved[index])) unresolved.splice(index, 1);
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Returns the allowed size range of the first panel in a pair.
|
|
71
|
+
*
|
|
72
|
+
* Both panels retain their combined size during resizing.
|
|
73
|
+
*/
|
|
74
|
+
const getPanelPairBounds = (sizes, constraints, panelIndex) => {
|
|
75
|
+
const normalizedConstraints = normalizePanelConstraints(constraints);
|
|
76
|
+
const normalizedSizes = normalizePanelSizes(sizes, normalizedConstraints);
|
|
77
|
+
if (!Number.isInteger(panelIndex) || panelIndex < 0 || panelIndex >= normalizedSizes.length - 1) throw new RangeError("Invalid panel resize index.");
|
|
78
|
+
const first = normalizedConstraints[panelIndex];
|
|
79
|
+
const second = normalizedConstraints[panelIndex + 1];
|
|
80
|
+
const combinedSize = normalizedSizes[panelIndex] + normalizedSizes[panelIndex + 1];
|
|
81
|
+
return {
|
|
82
|
+
minSize: Math.max(first.minSize, combinedSize - second.maxSize),
|
|
83
|
+
maxSize: Math.min(first.maxSize, combinedSize - second.minSize)
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* Resizes two adjacent panels while keeping their combined size unchanged.
|
|
88
|
+
*
|
|
89
|
+
* A positive delta increases the first panel.
|
|
90
|
+
* A negative delta decreases the first panel.
|
|
91
|
+
*/
|
|
92
|
+
const resizePanelPair = (sizes, constraints, panelIndex, delta) => {
|
|
93
|
+
if (!Number.isFinite(delta)) throw new RangeError("Resize delta must be a finite number.");
|
|
94
|
+
const normalizedSizes = normalizePanelSizes(sizes, constraints);
|
|
95
|
+
const bounds = getPanelPairBounds(normalizedSizes, constraints, panelIndex);
|
|
96
|
+
const combinedSize = normalizedSizes[panelIndex] + normalizedSizes[panelIndex + 1];
|
|
97
|
+
const nextFirstSize = Math.min(bounds.maxSize, Math.max(bounds.minSize, normalizedSizes[panelIndex] + delta));
|
|
98
|
+
const nextSizes = [...normalizedSizes];
|
|
99
|
+
nextSizes[panelIndex] = nextFirstSize;
|
|
100
|
+
nextSizes[panelIndex + 1] = combinedSize - nextFirstSize;
|
|
101
|
+
return nextSizes;
|
|
102
|
+
};
|
|
103
|
+
exports.getPanelPairBounds = getPanelPairBounds;
|
|
104
|
+
exports.normalizePanelSizes = normalizePanelSizes;
|
|
105
|
+
exports.resizePanelPair = resizePanelPair;
|
|
106
|
+
|
|
107
|
+
//# sourceMappingURL=resizable-panels.utils.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resizable-panels.utils.cjs","names":[],"sources":["../../../../src/components/layout/resizable-panels/resizable-panels.utils.ts"],"sourcesContent":["export type PanelSizeConstraint = {\n minSize?: number;\n maxSize?: number;\n};\n\ntype NormalizedPanelSizeConstraint = {\n minSize: number;\n maxSize: number;\n};\n\ntype PanelPairBounds = {\n minSize: number;\n maxSize: number;\n};\n\nconst normalizePanelConstraints = (\n constraints: readonly PanelSizeConstraint[],\n): NormalizedPanelSizeConstraint[] => {\n if (constraints.length < 2) {\n throw new RangeError(\"ResizablePanels requires at least two panels.\");\n }\n\n const normalized = constraints.map((constraint, index) => {\n const minSize = constraint.minSize ?? 0;\n const maxSize = constraint.maxSize ?? 100;\n\n if (\n !Number.isFinite(minSize) ||\n !Number.isFinite(maxSize) ||\n minSize < 0 ||\n maxSize > 100 ||\n minSize > maxSize\n ) {\n throw new RangeError(`Invalid size constraints for panel ${index}.`);\n }\n\n return { minSize, maxSize };\n });\n\n const minimumTotal = normalized.reduce(\n (total, constraint) => total + constraint.minSize,\n 0,\n );\n\n const maximumTotal = normalized.reduce(\n (total, constraint) => total + constraint.maxSize,\n 0,\n );\n\n if (minimumTotal > 100 || maximumTotal < 100) {\n throw new RangeError(\n \"Panel size constraints cannot produce a layout totaling 100%.\",\n );\n }\n\n return normalized;\n};\n\n/**\n * Normalizes panel sizes to 100% while respecting every panel constraint.\n *\n * When a panel reaches its minimum or maximum, the remaining space is\n * distributed proportionally between the other panels.\n */\nconst normalizePanelSizes = (\n sizes: readonly number[] | undefined,\n constraints: readonly PanelSizeConstraint[],\n): number[] => {\n const normalizedConstraints = normalizePanelConstraints(constraints);\n\n if (sizes && sizes.length !== constraints.length) {\n throw new RangeError(\n \"The number of panel sizes must match the number of panels.\",\n );\n }\n\n const weights = normalizedConstraints.map((_, index) => {\n const size = sizes?.[index] ?? 1;\n\n return Number.isFinite(size) ? Math.max(0, size) : 0;\n });\n\n const result = new Array<number>(constraints.length).fill(0);\n\n const unresolved = normalizedConstraints.map((_, index) => index);\n\n let remainingSize = 100;\n\n while (unresolved.length > 0) {\n const activeWeightTotal = unresolved.reduce(\n (total, index) => total + weights[index],\n 0,\n );\n\n const useEqualDistribution = activeWeightTotal === 0;\n\n const candidates = unresolved.map((index) => ({\n index,\n size:\n (remainingSize * (useEqualDistribution ? 1 : weights[index])) /\n (useEqualDistribution ? unresolved.length : activeWeightTotal),\n }));\n\n const violations = candidates.filter(({ index, size }) => {\n const constraint = normalizedConstraints[index];\n\n return size < constraint.minSize || size > constraint.maxSize;\n });\n\n if (violations.length === 0) {\n for (const candidate of candidates) {\n result[candidate.index] = candidate.size;\n }\n\n break;\n }\n\n const clampedViolations = violations.map(({ index, size }) => {\n const constraint = normalizedConstraints[index];\n\n return {\n index,\n size,\n fixedSize: Math.min(\n constraint.maxSize,\n Math.max(constraint.minSize, size),\n ),\n };\n });\n\n // Only clamp in the direction of the net correction; clamping both\n // directions at once can overshoot or undershoot 100%.\n const totalCorrection = clampedViolations.reduce(\n (total, { size, fixedSize }) => total + fixedSize - size,\n 0,\n );\n\n const fixedIndexes = new Set<number>();\n\n for (const { index, size, fixedSize } of clampedViolations) {\n if (\n (totalCorrection > 0 && fixedSize < size) ||\n (totalCorrection < 0 && fixedSize > size)\n ) {\n continue;\n }\n\n result[index] = fixedSize;\n remainingSize -= fixedSize;\n fixedIndexes.add(index);\n }\n\n for (let index = unresolved.length - 1; index >= 0; index--) {\n if (fixedIndexes.has(unresolved[index])) {\n unresolved.splice(index, 1);\n }\n }\n }\n\n return result;\n};\n\n/**\n * Returns the allowed size range of the first panel in a pair.\n *\n * Both panels retain their combined size during resizing.\n */\nconst getPanelPairBounds = (\n sizes: readonly number[],\n constraints: readonly PanelSizeConstraint[],\n panelIndex: number,\n): PanelPairBounds => {\n const normalizedConstraints = normalizePanelConstraints(constraints);\n\n const normalizedSizes = normalizePanelSizes(sizes, normalizedConstraints);\n\n if (\n !Number.isInteger(panelIndex) ||\n panelIndex < 0 ||\n panelIndex >= normalizedSizes.length - 1\n ) {\n throw new RangeError(\"Invalid panel resize index.\");\n }\n\n const first = normalizedConstraints[panelIndex];\n const second = normalizedConstraints[panelIndex + 1];\n\n const combinedSize =\n normalizedSizes[panelIndex] + normalizedSizes[panelIndex + 1];\n\n return {\n minSize: Math.max(first.minSize, combinedSize - second.maxSize),\n maxSize: Math.min(first.maxSize, combinedSize - second.minSize),\n };\n};\n\n/**\n * Resizes two adjacent panels while keeping their combined size unchanged.\n *\n * A positive delta increases the first panel.\n * A negative delta decreases the first panel.\n */\nconst resizePanelPair = (\n sizes: readonly number[],\n constraints: readonly PanelSizeConstraint[],\n panelIndex: number,\n delta: number,\n): number[] => {\n if (!Number.isFinite(delta)) {\n throw new RangeError(\"Resize delta must be a finite number.\");\n }\n\n const normalizedSizes = normalizePanelSizes(sizes, constraints);\n\n const bounds = getPanelPairBounds(normalizedSizes, constraints, panelIndex);\n\n const combinedSize =\n normalizedSizes[panelIndex] + normalizedSizes[panelIndex + 1];\n\n const nextFirstSize = Math.min(\n bounds.maxSize,\n Math.max(bounds.minSize, normalizedSizes[panelIndex] + delta),\n );\n\n const nextSizes = [...normalizedSizes];\n\n nextSizes[panelIndex] = nextFirstSize;\n nextSizes[panelIndex + 1] = combinedSize - nextFirstSize;\n\n return nextSizes;\n};\n\nexport { normalizePanelSizes, getPanelPairBounds, resizePanelPair };\n"],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// src/components/layout/resizable-panels/resizable-panels.utils.ts
|
|
2
|
+
const normalizePanelConstraints = (constraints) => {
|
|
3
|
+
if (constraints.length < 2) throw new RangeError("ResizablePanels requires at least two panels.");
|
|
4
|
+
const normalized = constraints.map((constraint, index) => {
|
|
5
|
+
const minSize = constraint.minSize ?? 0;
|
|
6
|
+
const maxSize = constraint.maxSize ?? 100;
|
|
7
|
+
if (!Number.isFinite(minSize) || !Number.isFinite(maxSize) || minSize < 0 || maxSize > 100 || minSize > maxSize) throw new RangeError(`Invalid size constraints for panel ${index}.`);
|
|
8
|
+
return {
|
|
9
|
+
minSize,
|
|
10
|
+
maxSize
|
|
11
|
+
};
|
|
12
|
+
});
|
|
13
|
+
const minimumTotal = normalized.reduce((total, constraint) => total + constraint.minSize, 0);
|
|
14
|
+
const maximumTotal = normalized.reduce((total, constraint) => total + constraint.maxSize, 0);
|
|
15
|
+
if (minimumTotal > 100 || maximumTotal < 100) throw new RangeError("Panel size constraints cannot produce a layout totaling 100%.");
|
|
16
|
+
return normalized;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Normalizes panel sizes to 100% while respecting every panel constraint.
|
|
20
|
+
*
|
|
21
|
+
* When a panel reaches its minimum or maximum, the remaining space is
|
|
22
|
+
* distributed proportionally between the other panels.
|
|
23
|
+
*/
|
|
24
|
+
const normalizePanelSizes = (sizes, constraints) => {
|
|
25
|
+
const normalizedConstraints = normalizePanelConstraints(constraints);
|
|
26
|
+
if (sizes && sizes.length !== constraints.length) throw new RangeError("The number of panel sizes must match the number of panels.");
|
|
27
|
+
const weights = normalizedConstraints.map((_, index) => {
|
|
28
|
+
const size = sizes?.[index] ?? 1;
|
|
29
|
+
return Number.isFinite(size) ? Math.max(0, size) : 0;
|
|
30
|
+
});
|
|
31
|
+
const result = new Array(constraints.length).fill(0);
|
|
32
|
+
const unresolved = normalizedConstraints.map((_, index) => index);
|
|
33
|
+
let remainingSize = 100;
|
|
34
|
+
while (unresolved.length > 0) {
|
|
35
|
+
const activeWeightTotal = unresolved.reduce((total, index) => total + weights[index], 0);
|
|
36
|
+
const useEqualDistribution = activeWeightTotal === 0;
|
|
37
|
+
const candidates = unresolved.map((index) => ({
|
|
38
|
+
index,
|
|
39
|
+
size: remainingSize * (useEqualDistribution ? 1 : weights[index]) / (useEqualDistribution ? unresolved.length : activeWeightTotal)
|
|
40
|
+
}));
|
|
41
|
+
const violations = candidates.filter(({ index, size }) => {
|
|
42
|
+
const constraint = normalizedConstraints[index];
|
|
43
|
+
return size < constraint.minSize || size > constraint.maxSize;
|
|
44
|
+
});
|
|
45
|
+
if (violations.length === 0) {
|
|
46
|
+
for (const candidate of candidates) result[candidate.index] = candidate.size;
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
const clampedViolations = violations.map(({ index, size }) => {
|
|
50
|
+
const constraint = normalizedConstraints[index];
|
|
51
|
+
return {
|
|
52
|
+
index,
|
|
53
|
+
size,
|
|
54
|
+
fixedSize: Math.min(constraint.maxSize, Math.max(constraint.minSize, size))
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
const totalCorrection = clampedViolations.reduce((total, { size, fixedSize }) => total + fixedSize - size, 0);
|
|
58
|
+
const fixedIndexes = /* @__PURE__ */ new Set();
|
|
59
|
+
for (const { index, size, fixedSize } of clampedViolations) {
|
|
60
|
+
if (totalCorrection > 0 && fixedSize < size || totalCorrection < 0 && fixedSize > size) continue;
|
|
61
|
+
result[index] = fixedSize;
|
|
62
|
+
remainingSize -= fixedSize;
|
|
63
|
+
fixedIndexes.add(index);
|
|
64
|
+
}
|
|
65
|
+
for (let index = unresolved.length - 1; index >= 0; index--) if (fixedIndexes.has(unresolved[index])) unresolved.splice(index, 1);
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Returns the allowed size range of the first panel in a pair.
|
|
71
|
+
*
|
|
72
|
+
* Both panels retain their combined size during resizing.
|
|
73
|
+
*/
|
|
74
|
+
const getPanelPairBounds = (sizes, constraints, panelIndex) => {
|
|
75
|
+
const normalizedConstraints = normalizePanelConstraints(constraints);
|
|
76
|
+
const normalizedSizes = normalizePanelSizes(sizes, normalizedConstraints);
|
|
77
|
+
if (!Number.isInteger(panelIndex) || panelIndex < 0 || panelIndex >= normalizedSizes.length - 1) throw new RangeError("Invalid panel resize index.");
|
|
78
|
+
const first = normalizedConstraints[panelIndex];
|
|
79
|
+
const second = normalizedConstraints[panelIndex + 1];
|
|
80
|
+
const combinedSize = normalizedSizes[panelIndex] + normalizedSizes[panelIndex + 1];
|
|
81
|
+
return {
|
|
82
|
+
minSize: Math.max(first.minSize, combinedSize - second.maxSize),
|
|
83
|
+
maxSize: Math.min(first.maxSize, combinedSize - second.minSize)
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* Resizes two adjacent panels while keeping their combined size unchanged.
|
|
88
|
+
*
|
|
89
|
+
* A positive delta increases the first panel.
|
|
90
|
+
* A negative delta decreases the first panel.
|
|
91
|
+
*/
|
|
92
|
+
const resizePanelPair = (sizes, constraints, panelIndex, delta) => {
|
|
93
|
+
if (!Number.isFinite(delta)) throw new RangeError("Resize delta must be a finite number.");
|
|
94
|
+
const normalizedSizes = normalizePanelSizes(sizes, constraints);
|
|
95
|
+
const bounds = getPanelPairBounds(normalizedSizes, constraints, panelIndex);
|
|
96
|
+
const combinedSize = normalizedSizes[panelIndex] + normalizedSizes[panelIndex + 1];
|
|
97
|
+
const nextFirstSize = Math.min(bounds.maxSize, Math.max(bounds.minSize, normalizedSizes[panelIndex] + delta));
|
|
98
|
+
const nextSizes = [...normalizedSizes];
|
|
99
|
+
nextSizes[panelIndex] = nextFirstSize;
|
|
100
|
+
nextSizes[panelIndex + 1] = combinedSize - nextFirstSize;
|
|
101
|
+
return nextSizes;
|
|
102
|
+
};
|
|
103
|
+
export { getPanelPairBounds, normalizePanelSizes, resizePanelPair };
|
|
104
|
+
|
|
105
|
+
//# sourceMappingURL=resizable-panels.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resizable-panels.utils.js","names":[],"sources":["../../../../src/components/layout/resizable-panels/resizable-panels.utils.ts"],"sourcesContent":["export type PanelSizeConstraint = {\n minSize?: number;\n maxSize?: number;\n};\n\ntype NormalizedPanelSizeConstraint = {\n minSize: number;\n maxSize: number;\n};\n\ntype PanelPairBounds = {\n minSize: number;\n maxSize: number;\n};\n\nconst normalizePanelConstraints = (\n constraints: readonly PanelSizeConstraint[],\n): NormalizedPanelSizeConstraint[] => {\n if (constraints.length < 2) {\n throw new RangeError(\"ResizablePanels requires at least two panels.\");\n }\n\n const normalized = constraints.map((constraint, index) => {\n const minSize = constraint.minSize ?? 0;\n const maxSize = constraint.maxSize ?? 100;\n\n if (\n !Number.isFinite(minSize) ||\n !Number.isFinite(maxSize) ||\n minSize < 0 ||\n maxSize > 100 ||\n minSize > maxSize\n ) {\n throw new RangeError(`Invalid size constraints for panel ${index}.`);\n }\n\n return { minSize, maxSize };\n });\n\n const minimumTotal = normalized.reduce(\n (total, constraint) => total + constraint.minSize,\n 0,\n );\n\n const maximumTotal = normalized.reduce(\n (total, constraint) => total + constraint.maxSize,\n 0,\n );\n\n if (minimumTotal > 100 || maximumTotal < 100) {\n throw new RangeError(\n \"Panel size constraints cannot produce a layout totaling 100%.\",\n );\n }\n\n return normalized;\n};\n\n/**\n * Normalizes panel sizes to 100% while respecting every panel constraint.\n *\n * When a panel reaches its minimum or maximum, the remaining space is\n * distributed proportionally between the other panels.\n */\nconst normalizePanelSizes = (\n sizes: readonly number[] | undefined,\n constraints: readonly PanelSizeConstraint[],\n): number[] => {\n const normalizedConstraints = normalizePanelConstraints(constraints);\n\n if (sizes && sizes.length !== constraints.length) {\n throw new RangeError(\n \"The number of panel sizes must match the number of panels.\",\n );\n }\n\n const weights = normalizedConstraints.map((_, index) => {\n const size = sizes?.[index] ?? 1;\n\n return Number.isFinite(size) ? Math.max(0, size) : 0;\n });\n\n const result = new Array<number>(constraints.length).fill(0);\n\n const unresolved = normalizedConstraints.map((_, index) => index);\n\n let remainingSize = 100;\n\n while (unresolved.length > 0) {\n const activeWeightTotal = unresolved.reduce(\n (total, index) => total + weights[index],\n 0,\n );\n\n const useEqualDistribution = activeWeightTotal === 0;\n\n const candidates = unresolved.map((index) => ({\n index,\n size:\n (remainingSize * (useEqualDistribution ? 1 : weights[index])) /\n (useEqualDistribution ? unresolved.length : activeWeightTotal),\n }));\n\n const violations = candidates.filter(({ index, size }) => {\n const constraint = normalizedConstraints[index];\n\n return size < constraint.minSize || size > constraint.maxSize;\n });\n\n if (violations.length === 0) {\n for (const candidate of candidates) {\n result[candidate.index] = candidate.size;\n }\n\n break;\n }\n\n const clampedViolations = violations.map(({ index, size }) => {\n const constraint = normalizedConstraints[index];\n\n return {\n index,\n size,\n fixedSize: Math.min(\n constraint.maxSize,\n Math.max(constraint.minSize, size),\n ),\n };\n });\n\n // Only clamp in the direction of the net correction; clamping both\n // directions at once can overshoot or undershoot 100%.\n const totalCorrection = clampedViolations.reduce(\n (total, { size, fixedSize }) => total + fixedSize - size,\n 0,\n );\n\n const fixedIndexes = new Set<number>();\n\n for (const { index, size, fixedSize } of clampedViolations) {\n if (\n (totalCorrection > 0 && fixedSize < size) ||\n (totalCorrection < 0 && fixedSize > size)\n ) {\n continue;\n }\n\n result[index] = fixedSize;\n remainingSize -= fixedSize;\n fixedIndexes.add(index);\n }\n\n for (let index = unresolved.length - 1; index >= 0; index--) {\n if (fixedIndexes.has(unresolved[index])) {\n unresolved.splice(index, 1);\n }\n }\n }\n\n return result;\n};\n\n/**\n * Returns the allowed size range of the first panel in a pair.\n *\n * Both panels retain their combined size during resizing.\n */\nconst getPanelPairBounds = (\n sizes: readonly number[],\n constraints: readonly PanelSizeConstraint[],\n panelIndex: number,\n): PanelPairBounds => {\n const normalizedConstraints = normalizePanelConstraints(constraints);\n\n const normalizedSizes = normalizePanelSizes(sizes, normalizedConstraints);\n\n if (\n !Number.isInteger(panelIndex) ||\n panelIndex < 0 ||\n panelIndex >= normalizedSizes.length - 1\n ) {\n throw new RangeError(\"Invalid panel resize index.\");\n }\n\n const first = normalizedConstraints[panelIndex];\n const second = normalizedConstraints[panelIndex + 1];\n\n const combinedSize =\n normalizedSizes[panelIndex] + normalizedSizes[panelIndex + 1];\n\n return {\n minSize: Math.max(first.minSize, combinedSize - second.maxSize),\n maxSize: Math.min(first.maxSize, combinedSize - second.minSize),\n };\n};\n\n/**\n * Resizes two adjacent panels while keeping their combined size unchanged.\n *\n * A positive delta increases the first panel.\n * A negative delta decreases the first panel.\n */\nconst resizePanelPair = (\n sizes: readonly number[],\n constraints: readonly PanelSizeConstraint[],\n panelIndex: number,\n delta: number,\n): number[] => {\n if (!Number.isFinite(delta)) {\n throw new RangeError(\"Resize delta must be a finite number.\");\n }\n\n const normalizedSizes = normalizePanelSizes(sizes, constraints);\n\n const bounds = getPanelPairBounds(normalizedSizes, constraints, panelIndex);\n\n const combinedSize =\n normalizedSizes[panelIndex] + normalizedSizes[panelIndex + 1];\n\n const nextFirstSize = Math.min(\n bounds.maxSize,\n Math.max(bounds.minSize, normalizedSizes[panelIndex] + delta),\n );\n\n const nextSizes = [...normalizedSizes];\n\n nextSizes[panelIndex] = nextFirstSize;\n nextSizes[panelIndex + 1] = combinedSize - nextFirstSize;\n\n return nextSizes;\n};\n\nexport { normalizePanelSizes, getPanelPairBounds, resizePanelPair };\n"],"mappings":"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"}
|