@ifhover/leaf-ui 0.6.0 → 0.7.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 +1 -1
- package/dist/cjs/autocomplete/autocomplete.cjs +7 -3
- package/dist/cjs/autocomplete/autocomplete.cjs.map +1 -1
- package/dist/cjs/autocomplete/autocomplete.d.cts +2 -0
- package/dist/cjs/autocomplete/autocomplete.d.cts.map +1 -1
- package/dist/cjs/browser/modules/autocomplete/autocomplete.cjs +7 -3
- package/dist/cjs/browser/modules/autocomplete/autocomplete.cjs.map +1 -1
- package/dist/cjs/browser/modules/button/button.cjs.map +1 -1
- package/dist/cjs/browser/modules/cascader/cascader.cjs +9 -2
- package/dist/cjs/browser/modules/cascader/cascader.cjs.map +1 -1
- package/dist/cjs/browser/modules/colors.cjs +73 -7
- package/dist/cjs/browser/modules/colors.cjs.map +1 -1
- package/dist/cjs/browser/modules/commandpalette/commandpalette.cjs +10 -3
- package/dist/cjs/browser/modules/commandpalette/commandpalette.cjs.map +1 -1
- package/dist/cjs/browser/modules/config-provider/component-defaults.cjs.map +1 -1
- package/dist/cjs/browser/modules/config-provider/use-color-variables.cjs +18 -2
- package/dist/cjs/browser/modules/config-provider/use-color-variables.cjs.map +1 -1
- package/dist/cjs/browser/modules/drawer/drawer.cjs +7 -1
- package/dist/cjs/browser/modules/drawer/drawer.cjs.map +1 -1
- package/dist/cjs/browser/modules/dropdown/dropdown.cjs +25 -4
- package/dist/cjs/browser/modules/dropdown/dropdown.cjs.map +1 -1
- package/dist/cjs/browser/modules/form/form.cjs +38 -21
- package/dist/cjs/browser/modules/form/form.cjs.map +1 -1
- package/dist/cjs/browser/modules/image/viewer.cjs +8 -2
- package/dist/cjs/browser/modules/image/viewer.cjs.map +1 -1
- package/dist/cjs/browser/modules/index.cjs +3 -4
- package/dist/cjs/browser/modules/layout/layout.cjs +4 -1
- package/dist/cjs/browser/modules/layout/layout.cjs.map +1 -1
- package/dist/cjs/browser/modules/mentions/mentions.cjs +4 -2
- package/dist/cjs/browser/modules/mentions/mentions.cjs.map +1 -1
- package/dist/cjs/browser/modules/menu/index.cjs +5 -2
- package/dist/cjs/browser/modules/menu/menu.cjs +60 -18
- package/dist/cjs/browser/modules/menu/menu.cjs.map +1 -1
- package/dist/cjs/browser/modules/scrollbar/scrollbar.cjs +69 -19
- package/dist/cjs/browser/modules/scrollbar/scrollbar.cjs.map +1 -1
- package/dist/cjs/browser/modules/select/select.cjs +3 -3
- package/dist/cjs/browser/modules/select/select.cjs.map +1 -1
- package/dist/cjs/browser/modules/shared/floating.cjs +49 -20
- package/dist/cjs/browser/modules/shared/floating.cjs.map +1 -1
- package/dist/cjs/browser/modules/shared/scoped-portal.cjs +2 -23
- package/dist/cjs/browser/modules/shared/scoped-portal.cjs.map +1 -1
- package/dist/cjs/browser/modules/{segmented/index.cjs → shared/theme-variables.cjs} +27 -5
- package/dist/cjs/browser/modules/shared/theme-variables.cjs.map +1 -0
- package/dist/cjs/browser/modules/splitter/splitter.cjs +4 -1
- package/dist/cjs/browser/modules/splitter/splitter.cjs.map +1 -1
- package/dist/cjs/browser/modules/tabs/tabs.cjs +14 -8
- package/dist/cjs/browser/modules/tabs/tabs.cjs.map +1 -1
- package/dist/cjs/browser/modules/tailwind-tokens.cjs +1 -1
- package/dist/cjs/browser/modules/tailwind-tokens.cjs.map +1 -1
- package/dist/cjs/browser/modules/textarea/textarea.cjs +49 -21
- package/dist/cjs/browser/modules/textarea/textarea.cjs.map +1 -1
- package/dist/cjs/browser/modules/theme.cjs +53 -29
- package/dist/cjs/browser/modules/theme.cjs.map +1 -1
- package/dist/cjs/browser/modules/timeline/timeline.cjs +1 -1
- package/dist/cjs/browser/modules/timeline/timeline.cjs.map +1 -1
- package/dist/cjs/browser/modules/timepicker/time-panel.cjs +8 -2
- package/dist/cjs/browser/modules/timepicker/time-panel.cjs.map +1 -1
- package/dist/cjs/browser/modules/transfer/transfer.cjs +5 -5
- package/dist/cjs/browser/modules/transfer/transfer.cjs.map +1 -1
- package/dist/cjs/browser/modules/tree/tree.cjs +13 -6
- package/dist/cjs/browser/modules/tree/tree.cjs.map +1 -1
- package/dist/cjs/browser/modules/treeselect/treeselect.cjs +5 -4
- package/dist/cjs/browser/modules/treeselect/treeselect.cjs.map +1 -1
- package/dist/cjs/browser/modules/virtuallist/virtuallist.cjs +9 -3
- package/dist/cjs/browser/modules/virtuallist/virtuallist.cjs.map +1 -1
- package/dist/cjs/button/button.cjs.map +1 -1
- package/dist/cjs/button/button.d.cts +7 -2
- package/dist/cjs/button/button.d.cts.map +1 -1
- package/dist/cjs/cascader/cascader.cjs +9 -2
- package/dist/cjs/cascader/cascader.cjs.map +1 -1
- package/dist/cjs/cascader/cascader.d.cts +2 -0
- package/dist/cjs/cascader/cascader.d.cts.map +1 -1
- package/dist/cjs/colors.cjs +73 -7
- package/dist/cjs/colors.cjs.map +1 -1
- package/dist/cjs/colors.d.cts +3 -1
- package/dist/cjs/colors.d.cts.map +1 -1
- package/dist/cjs/commandpalette/commandpalette.cjs +10 -3
- package/dist/cjs/commandpalette/commandpalette.cjs.map +1 -1
- package/dist/cjs/commandpalette/commandpalette.d.cts.map +1 -1
- package/dist/cjs/config-provider/component-defaults.cjs.map +1 -1
- package/dist/cjs/config-provider/component-defaults.d.cts +3 -4
- package/dist/cjs/config-provider/component-defaults.d.cts.map +1 -1
- package/dist/cjs/config-provider/index.d.cts +1 -1
- package/dist/cjs/config-provider/index.d.cts.map +1 -1
- package/dist/cjs/config-provider/use-color-variables.cjs +18 -2
- package/dist/cjs/config-provider/use-color-variables.cjs.map +1 -1
- package/dist/cjs/config-provider/use-color-variables.d.cts.map +1 -1
- package/dist/cjs/drawer/drawer.cjs +7 -1
- package/dist/cjs/drawer/drawer.cjs.map +1 -1
- package/dist/cjs/drawer/drawer.d.cts.map +1 -1
- package/dist/cjs/dropdown/dropdown.cjs +25 -4
- package/dist/cjs/dropdown/dropdown.cjs.map +1 -1
- package/dist/cjs/dropdown/dropdown.d.cts +9 -1
- package/dist/cjs/dropdown/dropdown.d.cts.map +1 -1
- package/dist/cjs/form/form.cjs +38 -21
- package/dist/cjs/form/form.cjs.map +1 -1
- package/dist/cjs/form/form.d.cts +3 -1
- package/dist/cjs/form/form.d.cts.map +1 -1
- package/dist/cjs/image/viewer.cjs +8 -2
- package/dist/cjs/image/viewer.cjs.map +1 -1
- package/dist/cjs/image/viewer.d.cts.map +1 -1
- package/dist/cjs/index.cjs +3 -4
- package/dist/cjs/index.d.cts +3 -5
- package/dist/cjs/index.d.cts.map +1 -1
- package/dist/cjs/layout/layout.cjs +4 -1
- package/dist/cjs/layout/layout.cjs.map +1 -1
- package/dist/cjs/layout/layout.d.cts.map +1 -1
- package/dist/cjs/mentions/mentions.cjs +4 -2
- package/dist/cjs/mentions/mentions.cjs.map +1 -1
- package/dist/cjs/mentions/mentions.d.cts +2 -0
- package/dist/cjs/mentions/mentions.d.cts.map +1 -1
- package/dist/cjs/menu/index.cjs +5 -2
- package/dist/cjs/menu/index.d.cts +2 -2
- package/dist/cjs/menu/index.d.cts.map +1 -1
- package/dist/cjs/menu/menu.cjs +60 -18
- package/dist/cjs/menu/menu.cjs.map +1 -1
- package/dist/cjs/menu/menu.d.cts +4 -0
- package/dist/cjs/menu/menu.d.cts.map +1 -1
- package/dist/cjs/scrollbar/scrollbar.cjs +69 -19
- package/dist/cjs/scrollbar/scrollbar.cjs.map +1 -1
- package/dist/cjs/scrollbar/scrollbar.d.cts +12 -2
- package/dist/cjs/scrollbar/scrollbar.d.cts.map +1 -1
- package/dist/cjs/select/select.cjs +3 -3
- package/dist/cjs/select/select.cjs.map +1 -1
- package/dist/cjs/shared/floating.cjs +49 -20
- package/dist/cjs/shared/floating.cjs.map +1 -1
- package/dist/cjs/shared/floating.d.cts +3 -1
- package/dist/cjs/shared/floating.d.cts.map +1 -1
- package/dist/cjs/shared/scoped-portal.cjs +2 -23
- package/dist/cjs/shared/scoped-portal.cjs.map +1 -1
- package/dist/cjs/shared/scoped-portal.d.cts.map +1 -1
- package/dist/cjs/{segmented/index.cjs → shared/theme-variables.cjs} +27 -5
- package/dist/cjs/shared/theme-variables.cjs.map +1 -0
- package/dist/cjs/shared/theme-variables.d.cts +4 -0
- package/dist/cjs/shared/theme-variables.d.cts.map +1 -0
- package/dist/cjs/splitter/splitter.cjs +4 -1
- package/dist/cjs/splitter/splitter.cjs.map +1 -1
- package/dist/cjs/splitter/splitter.d.cts.map +1 -1
- package/dist/cjs/styles/alert.css +1 -1
- package/dist/cjs/styles/anchor.css +1 -1
- package/dist/cjs/styles/appbar.css +1 -1
- package/dist/cjs/styles/autocomplete.css +1 -1
- package/dist/cjs/styles/avatar.css +1 -1
- package/dist/cjs/styles/backtop.css +1 -1
- package/dist/cjs/styles/badge.css +1 -1
- package/dist/cjs/styles/breadcrumb.css +1 -1
- package/dist/cjs/styles/button.css +1 -1
- package/dist/cjs/styles/calendar.css +1 -1
- package/dist/cjs/styles/card.css +1 -1
- package/dist/cjs/styles/carousel.css +1 -1
- package/dist/cjs/styles/cascader.css +1 -1
- package/dist/cjs/styles/checkbox.css +1 -1
- package/dist/cjs/styles/collapse.css +1 -1
- package/dist/cjs/styles/colorpicker.css +1 -1
- package/dist/cjs/styles/commandpalette.css +1 -1
- package/dist/cjs/styles/components/alert.css +1 -1
- package/dist/cjs/styles/components/anchor.css +1 -1
- package/dist/cjs/styles/components/appbar.css +1 -1
- package/dist/cjs/styles/components/autocomplete.css +1 -1
- package/dist/cjs/styles/components/avatar.css +1 -1
- package/dist/cjs/styles/components/breadcrumb.css +1 -1
- package/dist/cjs/styles/components/button.css +1 -1
- package/dist/cjs/styles/components/calendar.css +1 -1
- package/dist/cjs/styles/components/card.css +1 -1
- package/dist/cjs/styles/components/carousel.css +1 -1
- package/dist/cjs/styles/components/cascader.css +1 -1
- package/dist/cjs/styles/components/checkbox.css +1 -1
- package/dist/cjs/styles/components/collapse.css +1 -1
- package/dist/cjs/styles/components/colorpicker.css +1 -1
- package/dist/cjs/styles/components/commandpalette.css +1 -1
- package/dist/cjs/styles/components/datepicker.css +1 -1
- package/dist/cjs/styles/components/descriptions.css +1 -1
- package/dist/cjs/styles/components/drawer.css +1 -1
- package/dist/cjs/styles/components/dropdown.css +1 -1
- package/dist/cjs/styles/components/errorboundary.css +1 -1
- package/dist/cjs/styles/components/filelist.css +1 -1
- package/dist/cjs/styles/components/form.css +1 -1
- package/dist/cjs/styles/components/image.css +1 -1
- package/dist/cjs/styles/components/input.css +1 -1
- package/dist/cjs/styles/components/inputnumber.css +1 -1
- package/dist/cjs/styles/components/inputotp.css +1 -1
- package/dist/cjs/styles/components/layout.css +1 -1
- package/dist/cjs/styles/components/loading.css +1 -1
- package/dist/cjs/styles/components/loadingbar.css +1 -1
- package/dist/cjs/styles/components/mentions.css +1 -1
- package/dist/cjs/styles/components/menu.css +1 -1
- package/dist/cjs/styles/components/message.css +1 -1
- package/dist/cjs/styles/components/modal.css +1 -1
- package/dist/cjs/styles/components/notification.css +1 -1
- package/dist/cjs/styles/components/pagination.css +1 -1
- package/dist/cjs/styles/components/popover.css +1 -1
- package/dist/cjs/styles/components/progress.css +1 -1
- package/dist/cjs/styles/components/radio.css +1 -1
- package/dist/cjs/styles/components/rate.css +1 -1
- package/dist/cjs/styles/components/scrollarea.css +1 -1
- package/dist/cjs/styles/components/scrollbar.css +1 -1
- package/dist/cjs/styles/components/select.css +1 -1
- package/dist/cjs/styles/components/shared-calendar.css +1 -1
- package/dist/cjs/styles/components/slider.css +1 -1
- package/dist/cjs/styles/components/splitter.css +1 -1
- package/dist/cjs/styles/components/steps.css +1 -1
- package/dist/cjs/styles/components/switch.css +1 -1
- package/dist/cjs/styles/components/table.css +1 -1
- package/dist/cjs/styles/components/tabletanstack.css +1 -1
- package/dist/cjs/styles/components/tabs.css +1 -1
- package/dist/cjs/styles/components/tag.css +1 -1
- package/dist/cjs/styles/components/textarea.css +1 -1
- package/dist/cjs/styles/components/timepicker.css +1 -1
- package/dist/cjs/styles/components/tooltip.css +1 -1
- package/dist/cjs/styles/components/tour.css +1 -1
- package/dist/cjs/styles/components/transfer.css +1 -1
- package/dist/cjs/styles/components/tree.css +1 -1
- package/dist/cjs/styles/components/treeselect.css +1 -1
- package/dist/cjs/styles/components/typography.css +1 -1
- package/dist/cjs/styles/components/upload.css +1 -1
- package/dist/cjs/styles/components/virtuallist.css +1 -1
- package/dist/cjs/styles/config-provider.css +1 -1
- package/dist/cjs/styles/confirm.css +1 -1
- package/dist/cjs/styles/datepicker.css +1 -1
- package/dist/cjs/styles/daterangepicker.css +1 -1
- package/dist/cjs/styles/datetimepicker.css +1 -1
- package/dist/cjs/styles/descriptions.css +1 -1
- package/dist/cjs/styles/divider.css +1 -1
- package/dist/cjs/styles/drawer.css +1 -1
- package/dist/cjs/styles/dropdown.css +1 -1
- package/dist/cjs/styles/empty.css +1 -1
- package/dist/cjs/styles/errorboundary.css +1 -1
- package/dist/cjs/styles/filelist.css +1 -1
- package/dist/cjs/styles/flex.css +1 -1
- package/dist/cjs/styles/floatbutton.css +1 -1
- package/dist/cjs/styles/form.css +1 -1
- package/dist/cjs/styles/foundation.css +1 -1
- package/dist/cjs/styles/grid.css +1 -1
- package/dist/cjs/styles/image.css +1 -1
- package/dist/cjs/styles/index.css +1380 -716
- package/dist/cjs/styles/index.css.map +1 -1
- package/dist/cjs/styles/infinitescroll.css +1 -1
- package/dist/cjs/styles/input.css +1 -1
- package/dist/cjs/styles/inputmask.css +1 -1
- package/dist/cjs/styles/inputnumber.css +1 -1
- package/dist/cjs/styles/inputotp.css +1 -1
- package/dist/cjs/styles/layout.css +1 -1
- package/dist/cjs/styles/loading.css +1 -1
- package/dist/cjs/styles/loadingbar.css +1 -1
- package/dist/cjs/styles/masonry.css +1 -1
- package/dist/cjs/styles/mentions.css +1 -1
- package/dist/cjs/styles/menu.css +1 -1
- package/dist/cjs/styles/message.css +1 -1
- package/dist/cjs/styles/modal.css +1 -1
- package/dist/cjs/styles/notification.css +1 -1
- package/dist/cjs/styles/pagination.css +1 -1
- package/dist/cjs/styles/popconfirm.css +1 -1
- package/dist/cjs/styles/popover.css +1 -1
- package/dist/cjs/styles/progress.css +1 -1
- package/dist/cjs/styles/qrcode.css +1 -1
- package/dist/cjs/styles/radio.css +1 -1
- package/dist/cjs/styles/rate.css +1 -1
- package/dist/cjs/styles/result.css +1 -1
- package/dist/cjs/styles/scrollarea.css +1 -1
- package/dist/cjs/styles/scrollbar.css +1 -1
- package/dist/cjs/styles/select.css +1 -1
- package/dist/cjs/styles/skeleton.css +1 -1
- package/dist/cjs/styles/slider.css +1 -1
- package/dist/cjs/styles/space.css +1 -1
- package/dist/cjs/styles/splitter.css +1 -1
- package/dist/cjs/styles/statistic.css +1 -1
- package/dist/cjs/styles/steps.css +1 -1
- package/dist/cjs/styles/switch.css +1 -1
- package/dist/cjs/styles/table.css +1 -1
- package/dist/cjs/styles/tabletanstack.css +1 -1
- package/dist/cjs/styles/tabs.css +1 -1
- package/dist/cjs/styles/tag.css +1 -1
- package/dist/cjs/styles/textarea.css +1 -1
- package/dist/cjs/styles/timeline.css +1 -1
- package/dist/cjs/styles/timepicker.css +1 -1
- package/dist/cjs/styles/timerangepicker.css +1 -1
- package/dist/cjs/styles/tooltip.css +1 -1
- package/dist/cjs/styles/tour.css +1 -1
- package/dist/cjs/styles/transfer.css +1 -1
- package/dist/cjs/styles/tree.css +1 -1
- package/dist/cjs/styles/treeselect.css +1 -1
- package/dist/cjs/styles/typography.css +1 -1
- package/dist/cjs/styles/upload.css +1 -1
- package/dist/cjs/styles/virtuallist.css +1 -1
- package/dist/cjs/tabs/tabs.cjs +14 -8
- package/dist/cjs/tabs/tabs.cjs.map +1 -1
- package/dist/cjs/tabs/tabs.d.cts +4 -2
- package/dist/cjs/tabs/tabs.d.cts.map +1 -1
- package/dist/cjs/tailwind-tokens.cjs +1 -1
- package/dist/cjs/tailwind-tokens.cjs.map +1 -1
- package/dist/cjs/tailwind-tokens.d.cts.map +1 -1
- package/dist/cjs/textarea/textarea.cjs +49 -21
- package/dist/cjs/textarea/textarea.cjs.map +1 -1
- package/dist/cjs/textarea/textarea.d.cts.map +1 -1
- package/dist/cjs/theme.cjs +53 -29
- package/dist/cjs/theme.cjs.map +1 -1
- package/dist/cjs/theme.d.cts +15 -0
- package/dist/cjs/theme.d.cts.map +1 -1
- package/dist/cjs/timeline/timeline.cjs +1 -1
- package/dist/cjs/timeline/timeline.cjs.map +1 -1
- package/dist/cjs/timeline/timeline.d.cts.map +1 -1
- package/dist/cjs/timepicker/time-panel.cjs +8 -2
- package/dist/cjs/timepicker/time-panel.cjs.map +1 -1
- package/dist/cjs/timepicker/time-panel.d.cts.map +1 -1
- package/dist/cjs/transfer/transfer.cjs +5 -5
- package/dist/cjs/transfer/transfer.cjs.map +1 -1
- package/dist/cjs/transfer/transfer.d.cts.map +1 -1
- package/dist/cjs/tree/tree.cjs +13 -6
- package/dist/cjs/tree/tree.cjs.map +1 -1
- package/dist/cjs/tree/tree.d.cts.map +1 -1
- package/dist/cjs/treeselect/treeselect.cjs +5 -4
- package/dist/cjs/treeselect/treeselect.cjs.map +1 -1
- package/dist/cjs/treeselect/treeselect.d.cts.map +1 -1
- package/dist/cjs/virtuallist/virtuallist.cjs +9 -3
- package/dist/cjs/virtuallist/virtuallist.cjs.map +1 -1
- package/dist/cjs/virtuallist/virtuallist.d.cts.map +1 -1
- package/dist/esm/autocomplete/autocomplete.d.ts +2 -0
- package/dist/esm/autocomplete/autocomplete.d.ts.map +1 -1
- package/dist/esm/autocomplete/autocomplete.js +7 -3
- package/dist/esm/autocomplete/autocomplete.js.map +1 -1
- package/dist/esm/browser/modules/autocomplete/autocomplete.js +7 -3
- package/dist/esm/browser/modules/autocomplete/autocomplete.js.map +1 -1
- package/dist/esm/browser/modules/button/button.js.map +1 -1
- package/dist/esm/browser/modules/cascader/cascader.js +9 -2
- package/dist/esm/browser/modules/cascader/cascader.js.map +1 -1
- package/dist/esm/browser/modules/colors.js +69 -6
- package/dist/esm/browser/modules/colors.js.map +1 -1
- package/dist/esm/browser/modules/commandpalette/commandpalette.js +10 -3
- package/dist/esm/browser/modules/commandpalette/commandpalette.js.map +1 -1
- package/dist/esm/browser/modules/config-provider/component-defaults.js.map +1 -1
- package/dist/esm/browser/modules/config-provider/use-color-variables.js +18 -2
- package/dist/esm/browser/modules/config-provider/use-color-variables.js.map +1 -1
- package/dist/esm/browser/modules/drawer/drawer.js +7 -1
- package/dist/esm/browser/modules/drawer/drawer.js.map +1 -1
- package/dist/esm/browser/modules/dropdown/dropdown.js +25 -4
- package/dist/esm/browser/modules/dropdown/dropdown.js.map +1 -1
- package/dist/esm/browser/modules/form/form.js +38 -21
- package/dist/esm/browser/modules/form/form.js.map +1 -1
- package/dist/esm/browser/modules/image/viewer.js +8 -2
- package/dist/esm/browser/modules/image/viewer.js.map +1 -1
- package/dist/esm/browser/modules/index.js +1 -2
- package/dist/esm/browser/modules/layout/layout.js +4 -1
- package/dist/esm/browser/modules/layout/layout.js.map +1 -1
- package/dist/esm/browser/modules/mentions/mentions.js +4 -2
- package/dist/esm/browser/modules/mentions/mentions.js.map +1 -1
- package/dist/esm/browser/modules/menu/index.js +1 -1
- package/dist/esm/browser/modules/menu/menu.js +57 -18
- package/dist/esm/browser/modules/menu/menu.js.map +1 -1
- package/dist/esm/browser/modules/scrollbar/scrollbar.js +69 -19
- package/dist/esm/browser/modules/scrollbar/scrollbar.js.map +1 -1
- package/dist/esm/browser/modules/select/select.js +3 -3
- package/dist/esm/browser/modules/select/select.js.map +1 -1
- package/dist/esm/browser/modules/shared/floating.js +49 -20
- package/dist/esm/browser/modules/shared/floating.js.map +1 -1
- package/dist/esm/browser/modules/shared/scoped-portal.js +2 -23
- package/dist/esm/browser/modules/shared/scoped-portal.js.map +1 -1
- package/dist/esm/browser/modules/shared/theme-variables.js +27 -0
- package/dist/esm/browser/modules/shared/theme-variables.js.map +1 -0
- package/dist/esm/browser/modules/splitter/splitter.js +4 -1
- package/dist/esm/browser/modules/splitter/splitter.js.map +1 -1
- package/dist/esm/browser/modules/tabs/tabs.js +14 -8
- package/dist/esm/browser/modules/tabs/tabs.js.map +1 -1
- package/dist/esm/browser/modules/tailwind-tokens.js +1 -1
- package/dist/esm/browser/modules/tailwind-tokens.js.map +1 -1
- package/dist/esm/browser/modules/textarea/textarea.js +50 -22
- package/dist/esm/browser/modules/textarea/textarea.js.map +1 -1
- package/dist/esm/browser/modules/theme.js +53 -29
- package/dist/esm/browser/modules/theme.js.map +1 -1
- package/dist/esm/browser/modules/timeline/timeline.js +1 -1
- package/dist/esm/browser/modules/timeline/timeline.js.map +1 -1
- package/dist/esm/browser/modules/timepicker/time-panel.js +8 -2
- package/dist/esm/browser/modules/timepicker/time-panel.js.map +1 -1
- package/dist/esm/browser/modules/transfer/transfer.js +5 -5
- package/dist/esm/browser/modules/transfer/transfer.js.map +1 -1
- package/dist/esm/browser/modules/tree/tree.js +13 -6
- package/dist/esm/browser/modules/tree/tree.js.map +1 -1
- package/dist/esm/browser/modules/treeselect/treeselect.js +5 -4
- package/dist/esm/browser/modules/treeselect/treeselect.js.map +1 -1
- package/dist/esm/browser/modules/virtuallist/virtuallist.js +9 -3
- package/dist/esm/browser/modules/virtuallist/virtuallist.js.map +1 -1
- package/dist/esm/button/button.d.ts +7 -2
- package/dist/esm/button/button.d.ts.map +1 -1
- package/dist/esm/button/button.js.map +1 -1
- package/dist/esm/cascader/cascader.d.ts +2 -0
- package/dist/esm/cascader/cascader.d.ts.map +1 -1
- package/dist/esm/cascader/cascader.js +9 -2
- package/dist/esm/cascader/cascader.js.map +1 -1
- package/dist/esm/colors.d.ts +3 -1
- package/dist/esm/colors.d.ts.map +1 -1
- package/dist/esm/colors.js +69 -6
- package/dist/esm/colors.js.map +1 -1
- package/dist/esm/commandpalette/commandpalette.d.ts.map +1 -1
- package/dist/esm/commandpalette/commandpalette.js +10 -3
- package/dist/esm/commandpalette/commandpalette.js.map +1 -1
- package/dist/esm/config-provider/component-defaults.d.ts +3 -4
- package/dist/esm/config-provider/component-defaults.d.ts.map +1 -1
- package/dist/esm/config-provider/component-defaults.js.map +1 -1
- package/dist/esm/config-provider/index.d.ts +1 -1
- package/dist/esm/config-provider/index.d.ts.map +1 -1
- package/dist/esm/config-provider/use-color-variables.d.ts.map +1 -1
- package/dist/esm/config-provider/use-color-variables.js +18 -2
- package/dist/esm/config-provider/use-color-variables.js.map +1 -1
- package/dist/esm/drawer/drawer.d.ts.map +1 -1
- package/dist/esm/drawer/drawer.js +7 -1
- package/dist/esm/drawer/drawer.js.map +1 -1
- package/dist/esm/dropdown/dropdown.d.ts +9 -1
- package/dist/esm/dropdown/dropdown.d.ts.map +1 -1
- package/dist/esm/dropdown/dropdown.js +25 -4
- package/dist/esm/dropdown/dropdown.js.map +1 -1
- package/dist/esm/form/form.d.ts +3 -1
- package/dist/esm/form/form.d.ts.map +1 -1
- package/dist/esm/form/form.js +38 -21
- package/dist/esm/form/form.js.map +1 -1
- package/dist/esm/image/viewer.d.ts.map +1 -1
- package/dist/esm/image/viewer.js +8 -2
- package/dist/esm/image/viewer.js.map +1 -1
- package/dist/esm/index.d.ts +3 -5
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -2
- package/dist/esm/layout/layout.d.ts.map +1 -1
- package/dist/esm/layout/layout.js +4 -1
- package/dist/esm/layout/layout.js.map +1 -1
- package/dist/esm/mentions/mentions.d.ts +2 -0
- package/dist/esm/mentions/mentions.d.ts.map +1 -1
- package/dist/esm/mentions/mentions.js +4 -2
- package/dist/esm/mentions/mentions.js.map +1 -1
- package/dist/esm/menu/index.d.ts +2 -2
- package/dist/esm/menu/index.d.ts.map +1 -1
- package/dist/esm/menu/index.js +1 -1
- package/dist/esm/menu/menu.d.ts +4 -0
- package/dist/esm/menu/menu.d.ts.map +1 -1
- package/dist/esm/menu/menu.js +57 -18
- package/dist/esm/menu/menu.js.map +1 -1
- package/dist/esm/scrollbar/scrollbar.d.ts +12 -2
- package/dist/esm/scrollbar/scrollbar.d.ts.map +1 -1
- package/dist/esm/scrollbar/scrollbar.js +69 -19
- package/dist/esm/scrollbar/scrollbar.js.map +1 -1
- package/dist/esm/select/select.js +3 -3
- package/dist/esm/select/select.js.map +1 -1
- package/dist/esm/shared/floating.d.ts +3 -1
- package/dist/esm/shared/floating.d.ts.map +1 -1
- package/dist/esm/shared/floating.js +49 -20
- package/dist/esm/shared/floating.js.map +1 -1
- package/dist/esm/shared/scoped-portal.d.ts.map +1 -1
- package/dist/esm/shared/scoped-portal.js +2 -23
- package/dist/esm/shared/scoped-portal.js.map +1 -1
- package/dist/esm/shared/theme-variables.d.ts +4 -0
- package/dist/esm/shared/theme-variables.d.ts.map +1 -0
- package/dist/esm/shared/theme-variables.js +27 -0
- package/dist/esm/shared/theme-variables.js.map +1 -0
- package/dist/esm/splitter/splitter.d.ts.map +1 -1
- package/dist/esm/splitter/splitter.js +4 -1
- package/dist/esm/splitter/splitter.js.map +1 -1
- package/dist/esm/styles/alert.css +1 -1
- package/dist/esm/styles/anchor.css +1 -1
- package/dist/esm/styles/appbar.css +1 -1
- package/dist/esm/styles/autocomplete.css +1 -1
- package/dist/esm/styles/avatar.css +1 -1
- package/dist/esm/styles/backtop.css +1 -1
- package/dist/esm/styles/badge.css +1 -1
- package/dist/esm/styles/breadcrumb.css +1 -1
- package/dist/esm/styles/button.css +1 -1
- package/dist/esm/styles/calendar.css +1 -1
- package/dist/esm/styles/card.css +1 -1
- package/dist/esm/styles/carousel.css +1 -1
- package/dist/esm/styles/cascader.css +1 -1
- package/dist/esm/styles/checkbox.css +1 -1
- package/dist/esm/styles/collapse.css +1 -1
- package/dist/esm/styles/colorpicker.css +1 -1
- package/dist/esm/styles/commandpalette.css +1 -1
- package/dist/esm/styles/components/alert.css +1 -1
- package/dist/esm/styles/components/anchor.css +1 -1
- package/dist/esm/styles/components/appbar.css +1 -1
- package/dist/esm/styles/components/autocomplete.css +1 -1
- package/dist/esm/styles/components/avatar.css +1 -1
- package/dist/esm/styles/components/breadcrumb.css +1 -1
- package/dist/esm/styles/components/button.css +1 -1
- package/dist/esm/styles/components/calendar.css +1 -1
- package/dist/esm/styles/components/card.css +1 -1
- package/dist/esm/styles/components/carousel.css +1 -1
- package/dist/esm/styles/components/cascader.css +1 -1
- package/dist/esm/styles/components/checkbox.css +1 -1
- package/dist/esm/styles/components/collapse.css +1 -1
- package/dist/esm/styles/components/colorpicker.css +1 -1
- package/dist/esm/styles/components/commandpalette.css +1 -1
- package/dist/esm/styles/components/datepicker.css +1 -1
- package/dist/esm/styles/components/descriptions.css +1 -1
- package/dist/esm/styles/components/drawer.css +1 -1
- package/dist/esm/styles/components/dropdown.css +1 -1
- package/dist/esm/styles/components/errorboundary.css +1 -1
- package/dist/esm/styles/components/filelist.css +1 -1
- package/dist/esm/styles/components/form.css +1 -1
- package/dist/esm/styles/components/image.css +1 -1
- package/dist/esm/styles/components/input.css +1 -1
- package/dist/esm/styles/components/inputnumber.css +1 -1
- package/dist/esm/styles/components/inputotp.css +1 -1
- package/dist/esm/styles/components/layout.css +1 -1
- package/dist/esm/styles/components/loading.css +1 -1
- package/dist/esm/styles/components/loadingbar.css +1 -1
- package/dist/esm/styles/components/mentions.css +1 -1
- package/dist/esm/styles/components/menu.css +1 -1
- package/dist/esm/styles/components/message.css +1 -1
- package/dist/esm/styles/components/modal.css +1 -1
- package/dist/esm/styles/components/notification.css +1 -1
- package/dist/esm/styles/components/pagination.css +1 -1
- package/dist/esm/styles/components/popover.css +1 -1
- package/dist/esm/styles/components/progress.css +1 -1
- package/dist/esm/styles/components/radio.css +1 -1
- package/dist/esm/styles/components/rate.css +1 -1
- package/dist/esm/styles/components/scrollarea.css +1 -1
- package/dist/esm/styles/components/scrollbar.css +1 -1
- package/dist/esm/styles/components/select.css +1 -1
- package/dist/esm/styles/components/shared-calendar.css +1 -1
- package/dist/esm/styles/components/slider.css +1 -1
- package/dist/esm/styles/components/splitter.css +1 -1
- package/dist/esm/styles/components/steps.css +1 -1
- package/dist/esm/styles/components/switch.css +1 -1
- package/dist/esm/styles/components/table.css +1 -1
- package/dist/esm/styles/components/tabletanstack.css +1 -1
- package/dist/esm/styles/components/tabs.css +1 -1
- package/dist/esm/styles/components/tag.css +1 -1
- package/dist/esm/styles/components/textarea.css +1 -1
- package/dist/esm/styles/components/timepicker.css +1 -1
- package/dist/esm/styles/components/tooltip.css +1 -1
- package/dist/esm/styles/components/tour.css +1 -1
- package/dist/esm/styles/components/transfer.css +1 -1
- package/dist/esm/styles/components/tree.css +1 -1
- package/dist/esm/styles/components/treeselect.css +1 -1
- package/dist/esm/styles/components/typography.css +1 -1
- package/dist/esm/styles/components/upload.css +1 -1
- package/dist/esm/styles/components/virtuallist.css +1 -1
- package/dist/esm/styles/config-provider.css +1 -1
- package/dist/esm/styles/confirm.css +1 -1
- package/dist/esm/styles/datepicker.css +1 -1
- package/dist/esm/styles/daterangepicker.css +1 -1
- package/dist/esm/styles/datetimepicker.css +1 -1
- package/dist/esm/styles/descriptions.css +1 -1
- package/dist/esm/styles/divider.css +1 -1
- package/dist/esm/styles/drawer.css +1 -1
- package/dist/esm/styles/dropdown.css +1 -1
- package/dist/esm/styles/empty.css +1 -1
- package/dist/esm/styles/errorboundary.css +1 -1
- package/dist/esm/styles/filelist.css +1 -1
- package/dist/esm/styles/flex.css +1 -1
- package/dist/esm/styles/floatbutton.css +1 -1
- package/dist/esm/styles/form.css +1 -1
- package/dist/esm/styles/foundation.css +1 -1
- package/dist/esm/styles/grid.css +1 -1
- package/dist/esm/styles/image.css +1 -1
- package/dist/esm/styles/index.css +1380 -716
- package/dist/esm/styles/index.css.map +1 -1
- package/dist/esm/styles/infinitescroll.css +1 -1
- package/dist/esm/styles/input.css +1 -1
- package/dist/esm/styles/inputmask.css +1 -1
- package/dist/esm/styles/inputnumber.css +1 -1
- package/dist/esm/styles/inputotp.css +1 -1
- package/dist/esm/styles/layout.css +1 -1
- package/dist/esm/styles/loading.css +1 -1
- package/dist/esm/styles/loadingbar.css +1 -1
- package/dist/esm/styles/masonry.css +1 -1
- package/dist/esm/styles/mentions.css +1 -1
- package/dist/esm/styles/menu.css +1 -1
- package/dist/esm/styles/message.css +1 -1
- package/dist/esm/styles/modal.css +1 -1
- package/dist/esm/styles/notification.css +1 -1
- package/dist/esm/styles/pagination.css +1 -1
- package/dist/esm/styles/popconfirm.css +1 -1
- package/dist/esm/styles/popover.css +1 -1
- package/dist/esm/styles/progress.css +1 -1
- package/dist/esm/styles/qrcode.css +1 -1
- package/dist/esm/styles/radio.css +1 -1
- package/dist/esm/styles/rate.css +1 -1
- package/dist/esm/styles/result.css +1 -1
- package/dist/esm/styles/scrollarea.css +1 -1
- package/dist/esm/styles/scrollbar.css +1 -1
- package/dist/esm/styles/select.css +1 -1
- package/dist/esm/styles/skeleton.css +1 -1
- package/dist/esm/styles/slider.css +1 -1
- package/dist/esm/styles/space.css +1 -1
- package/dist/esm/styles/splitter.css +1 -1
- package/dist/esm/styles/statistic.css +1 -1
- package/dist/esm/styles/steps.css +1 -1
- package/dist/esm/styles/switch.css +1 -1
- package/dist/esm/styles/table.css +1 -1
- package/dist/esm/styles/tabletanstack.css +1 -1
- package/dist/esm/styles/tabs.css +1 -1
- package/dist/esm/styles/tag.css +1 -1
- package/dist/esm/styles/textarea.css +1 -1
- package/dist/esm/styles/timeline.css +1 -1
- package/dist/esm/styles/timepicker.css +1 -1
- package/dist/esm/styles/timerangepicker.css +1 -1
- package/dist/esm/styles/tooltip.css +1 -1
- package/dist/esm/styles/tour.css +1 -1
- package/dist/esm/styles/transfer.css +1 -1
- package/dist/esm/styles/tree.css +1 -1
- package/dist/esm/styles/treeselect.css +1 -1
- package/dist/esm/styles/typography.css +1 -1
- package/dist/esm/styles/upload.css +1 -1
- package/dist/esm/styles/virtuallist.css +1 -1
- package/dist/esm/tabs/tabs.d.ts +4 -2
- package/dist/esm/tabs/tabs.d.ts.map +1 -1
- package/dist/esm/tabs/tabs.js +14 -8
- package/dist/esm/tabs/tabs.js.map +1 -1
- package/dist/esm/tailwind-tokens.d.ts.map +1 -1
- package/dist/esm/tailwind-tokens.js +1 -1
- package/dist/esm/tailwind-tokens.js.map +1 -1
- package/dist/esm/textarea/textarea.d.ts.map +1 -1
- package/dist/esm/textarea/textarea.js +50 -22
- package/dist/esm/textarea/textarea.js.map +1 -1
- package/dist/esm/theme.d.ts +15 -0
- package/dist/esm/theme.d.ts.map +1 -1
- package/dist/esm/theme.js +53 -29
- package/dist/esm/theme.js.map +1 -1
- package/dist/esm/timeline/timeline.d.ts.map +1 -1
- package/dist/esm/timeline/timeline.js +1 -1
- package/dist/esm/timeline/timeline.js.map +1 -1
- package/dist/esm/timepicker/time-panel.d.ts.map +1 -1
- package/dist/esm/timepicker/time-panel.js +8 -2
- package/dist/esm/timepicker/time-panel.js.map +1 -1
- package/dist/esm/transfer/transfer.d.ts.map +1 -1
- package/dist/esm/transfer/transfer.js +5 -5
- package/dist/esm/transfer/transfer.js.map +1 -1
- package/dist/esm/tree/tree.d.ts.map +1 -1
- package/dist/esm/tree/tree.js +13 -6
- package/dist/esm/tree/tree.js.map +1 -1
- package/dist/esm/treeselect/treeselect.d.ts.map +1 -1
- package/dist/esm/treeselect/treeselect.js +5 -4
- package/dist/esm/treeselect/treeselect.js.map +1 -1
- package/dist/esm/virtuallist/virtuallist.d.ts.map +1 -1
- package/dist/esm/virtuallist/virtuallist.js +9 -3
- package/dist/esm/virtuallist/virtuallist.js.map +1 -1
- package/dist/tailwind.css +1 -1
- package/package.json +1 -22
- package/dist/cjs/browser/modules/segmented/index.cjs.map +0 -1
- package/dist/cjs/browser/modules/segmented/segmented.cjs +0 -127
- package/dist/cjs/browser/modules/segmented/segmented.cjs.map +0 -1
- package/dist/cjs/browser/segmented.cjs +0 -2
- package/dist/cjs/segmented/index.cjs.map +0 -1
- package/dist/cjs/segmented/index.d.cts +0 -3
- package/dist/cjs/segmented/index.d.cts.map +0 -1
- package/dist/cjs/segmented/segmented.cjs +0 -125
- package/dist/cjs/segmented/segmented.cjs.map +0 -1
- package/dist/cjs/segmented/segmented.d.cts +0 -21
- package/dist/cjs/segmented/segmented.d.cts.map +0 -1
- package/dist/cjs/styles/components/segmented.css +0 -1
- package/dist/cjs/styles/segmented.css +0 -1
- package/dist/esm/browser/modules/segmented/index.js +0 -2
- package/dist/esm/browser/modules/segmented/segmented.js +0 -89
- package/dist/esm/browser/modules/segmented/segmented.js.map +0 -1
- package/dist/esm/browser/segmented.js +0 -2
- package/dist/esm/segmented/index.d.ts +0 -3
- package/dist/esm/segmented/index.d.ts.map +0 -1
- package/dist/esm/segmented/index.js +0 -2
- package/dist/esm/segmented/segmented.d.ts +0 -21
- package/dist/esm/segmented/segmented.d.ts.map +0 -1
- package/dist/esm/segmented/segmented.js +0 -87
- package/dist/esm/segmented/segmented.js.map +0 -1
- package/dist/esm/styles/components/segmented.css +0 -1
- package/dist/esm/styles/segmented.css +0 -1
|
@@ -5,18 +5,21 @@ import { createContext, useCallback, useContext, useEffect, useId, useLayoutEffe
|
|
|
5
5
|
import { createPortal } from "react-dom";
|
|
6
6
|
import { tabbable } from "tabbable";
|
|
7
7
|
import { useLeafConfig } from "../config-provider/context.js";
|
|
8
|
+
import { ScrollbarControl } from "../scrollbar/scrollbar.js";
|
|
8
9
|
import { composedEventTarget, composedParent, deepActiveElement } from "./dom.js";
|
|
9
10
|
import { assignRef } from "./field.js";
|
|
10
11
|
import { inertProps } from "./inert.js";
|
|
11
12
|
import { OverlayOwner } from "./overlay-owner.js";
|
|
12
13
|
import { usePresence } from "./presence.js";
|
|
14
|
+
import { readThemeVariables } from "./theme-variables.js";
|
|
13
15
|
const useBrowserLayoutEffect = "u" < typeof window ? useEffect : useLayoutEffect;
|
|
14
16
|
const PopupParent = /*#__PURE__*/ createContext(void 0);
|
|
15
17
|
const popupNodes = new Map();
|
|
16
18
|
const dismissStack = [];
|
|
17
19
|
function insidePopup(target, panel) {
|
|
18
20
|
if (!panel) return false;
|
|
19
|
-
|
|
21
|
+
const boundary = panel.closest('[data-leaf-popup]') ?? panel;
|
|
22
|
+
if (boundary.contains(target)) return true;
|
|
20
23
|
let popup = target instanceof Element ? target.closest('[data-leaf-popup]') : null;
|
|
21
24
|
const visited = new Set();
|
|
22
25
|
while(popup?.dataset.leafPopupParent){
|
|
@@ -24,7 +27,7 @@ function insidePopup(target, panel) {
|
|
|
24
27
|
if (visited.has(parent)) break;
|
|
25
28
|
visited.add(parent);
|
|
26
29
|
popup = popupNodes.get(parent) ?? null;
|
|
27
|
-
if (popup ===
|
|
30
|
+
if (popup === boundary) return true;
|
|
28
31
|
}
|
|
29
32
|
return false;
|
|
30
33
|
}
|
|
@@ -56,12 +59,13 @@ function usePopupState(disabled, onOpenChange, controlledOpen, defaultOpen = fal
|
|
|
56
59
|
setOpen
|
|
57
60
|
];
|
|
58
61
|
}
|
|
59
|
-
function FloatingPanel({ open, triggerRef, panelRef, matchWidth, width, minWidth, maxWidth, maxHeight, placement = 'bottom-start', container, render, position, style, children, ...props }) {
|
|
62
|
+
function FloatingPanel({ open, triggerRef, panelRef, matchWidth, width, minWidth, maxWidth, maxHeight, placement = 'bottom-start', sideFallback = false, resetSurfaceGeometry = false, container, render, position, style, children, ...props }) {
|
|
60
63
|
const popupId = useId();
|
|
61
64
|
const parentPopup = useContext(PopupParent);
|
|
62
65
|
const config = useLeafConfig();
|
|
63
66
|
const owner = useContext(OverlayOwner);
|
|
64
|
-
const
|
|
67
|
+
const floatingRef = useRef(null);
|
|
68
|
+
const present = usePresence(open, floatingRef);
|
|
65
69
|
const [theme, setTheme] = useState({});
|
|
66
70
|
const [inheritedMotion, setInheritedMotion] = useState();
|
|
67
71
|
const openRef = useRef(open);
|
|
@@ -81,7 +85,8 @@ function FloatingPanel({ open, triggerRef, panelRef, matchWidth, width, minWidth
|
|
|
81
85
|
middleware: [
|
|
82
86
|
offset(6),
|
|
83
87
|
flip({
|
|
84
|
-
padding: 12
|
|
88
|
+
padding: 12,
|
|
89
|
+
fallbackAxisSideDirection: sideFallback ? 'end' : 'none'
|
|
85
90
|
}),
|
|
86
91
|
shift({
|
|
87
92
|
padding: 12
|
|
@@ -103,20 +108,32 @@ function FloatingPanel({ open, triggerRef, panelRef, matchWidth, width, minWidth
|
|
|
103
108
|
minWidth: 'trigger' === minWidth ? `min(${rects.reference.width}px, ${widthLimit})` : length(minWidth ?? style?.minWidth ?? '')
|
|
104
109
|
});
|
|
105
110
|
}
|
|
106
|
-
}
|
|
111
|
+
}, [
|
|
112
|
+
matchWidth,
|
|
113
|
+
width,
|
|
114
|
+
minWidth,
|
|
115
|
+
maxWidth,
|
|
116
|
+
maxHeight,
|
|
117
|
+
style?.width,
|
|
118
|
+
style?.minWidth,
|
|
119
|
+
style?.maxWidth,
|
|
120
|
+
style?.maxHeight
|
|
121
|
+
])
|
|
107
122
|
]
|
|
108
123
|
});
|
|
109
124
|
if (open) previousPosition.current = floatingStyles;
|
|
110
125
|
const setPanelRef = useCallback((node)=>{
|
|
111
126
|
if (node) popupNodes.set(popupId, node);
|
|
112
127
|
else popupNodes.delete(popupId);
|
|
113
|
-
assignRef(
|
|
128
|
+
assignRef(floatingRef, node);
|
|
114
129
|
refs.setFloating(node);
|
|
115
130
|
}, [
|
|
116
|
-
panelRef,
|
|
117
131
|
refs.setFloating,
|
|
118
132
|
popupId
|
|
119
133
|
]);
|
|
134
|
+
const setViewportRef = useCallback((node)=>assignRef(panelRef, node), [
|
|
135
|
+
panelRef
|
|
136
|
+
]);
|
|
120
137
|
useBrowserLayoutEffect(()=>{
|
|
121
138
|
const trigger = referenceElement ?? triggerRef.current;
|
|
122
139
|
if (!trigger || !present) return;
|
|
@@ -133,17 +150,12 @@ function FloatingPanel({ open, triggerRef, panelRef, matchWidth, width, minWidth
|
|
|
133
150
|
})
|
|
134
151
|
} : trigger);
|
|
135
152
|
const syncTheme = ()=>{
|
|
136
|
-
const computed = getComputedStyle(trigger);
|
|
137
153
|
let motionAncestor = trigger;
|
|
138
154
|
while(motionAncestor && !motionAncestor.hasAttribute('data-leaf-motion'))motionAncestor = composedParent(motionAncestor);
|
|
139
155
|
setInheritedMotion(motionAncestor?.getAttribute('data-leaf-motion') ?? void 0);
|
|
140
|
-
const variables =
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
};
|
|
144
|
-
for(let i = 0; i < computed.length; i += 1){
|
|
145
|
-
const key = computed.item(i);
|
|
146
|
-
if (key.startsWith('--leaf-')) variables[key] = computed.getPropertyValue(key);
|
|
156
|
+
const variables = readThemeVariables(trigger);
|
|
157
|
+
if (resetSurfaceGeometry) {
|
|
158
|
+
for (const key of Object.keys(variables))if (/^--leaf-surface-(?:radius$|border$|padding(?:-|$)|inner-)/.test(key) || '--leaf-floating-option-radius' === key) delete variables[key];
|
|
147
159
|
}
|
|
148
160
|
setTheme(variables);
|
|
149
161
|
};
|
|
@@ -169,7 +181,8 @@ function FloatingPanel({ open, triggerRef, panelRef, matchWidth, width, minWidth
|
|
|
169
181
|
referenceElement,
|
|
170
182
|
refs.setReference,
|
|
171
183
|
present,
|
|
172
|
-
position
|
|
184
|
+
position,
|
|
185
|
+
resetSurfaceGeometry
|
|
173
186
|
]);
|
|
174
187
|
useBrowserLayoutEffect(()=>{
|
|
175
188
|
if (open && present) update();
|
|
@@ -179,11 +192,27 @@ function FloatingPanel({ open, triggerRef, panelRef, matchWidth, width, minWidth
|
|
|
179
192
|
update
|
|
180
193
|
]);
|
|
181
194
|
if (!present || "u" < typeof document) return null;
|
|
195
|
+
const viewportProps = {};
|
|
196
|
+
const rootProps = {
|
|
197
|
+
...props
|
|
198
|
+
};
|
|
199
|
+
for (const key of Object.keys(rootProps))if ('id' === key || 'role' === key || 'tabIndex' === key || key.startsWith('aria-')) {
|
|
200
|
+
Object.assign(viewportProps, {
|
|
201
|
+
[key]: rootProps[key]
|
|
202
|
+
});
|
|
203
|
+
delete rootProps[key];
|
|
204
|
+
}
|
|
182
205
|
return /*#__PURE__*/ createPortal(/*#__PURE__*/ jsx(PopupParent.Provider, {
|
|
183
206
|
value: popupId,
|
|
184
|
-
children: /*#__PURE__*/ jsx(
|
|
185
|
-
...
|
|
186
|
-
ref:
|
|
207
|
+
children: /*#__PURE__*/ jsx(ScrollbarControl, {
|
|
208
|
+
...rootProps,
|
|
209
|
+
ref: setViewportRef,
|
|
210
|
+
rootRef: setPanelRef,
|
|
211
|
+
viewportProps: viewportProps,
|
|
212
|
+
viewportClassName: "leaf-floating__viewport",
|
|
213
|
+
role: props.role ?? 'presentation',
|
|
214
|
+
tabIndex: props.tabIndex ?? -1,
|
|
215
|
+
scrollbarTabIndex: -1,
|
|
187
216
|
"data-leaf-owner": owner,
|
|
188
217
|
"data-leaf-popup": popupId,
|
|
189
218
|
"data-leaf-popup-parent": parentPopup,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared/floating.js","sources":["../../../../../src/shared/floating.tsx"],"sourcesContent":["import {\n autoUpdate,\n flip,\n offset,\n type Placement,\n shift,\n size,\n useFloating,\n} from '@floating-ui/react-dom';\nimport {\n type CSSProperties,\n createContext,\n type HTMLAttributes,\n type RefObject,\n useCallback,\n useContext,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { tabbable } from 'tabbable';\nimport { useLeafConfig } from '../config-provider/context';\nimport type { LeafThemeStyle } from '../theme';\nimport { composedEventTarget, composedParent, deepActiveElement } from './dom';\nimport { assignRef } from './field';\nimport { inertProps } from './inert';\nimport { OverlayOwner } from './overlay-owner';\nimport { usePresence } from './presence';\n\nconst useBrowserLayoutEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect;\nconst PopupParent = createContext<string | undefined>(undefined);\nconst popupNodes = new Map<string, HTMLElement>();\nconst dismissStack: RefObject<HTMLElement | null>[] = [];\nfunction insidePopup(target: Node, panel: HTMLElement | null) {\n if (!panel) return false;\n if (panel.contains(target)) return true;\n let popup = target instanceof Element ? target.closest<HTMLElement>('[data-leaf-popup]') : null;\n const visited = new Set<string>();\n while (popup?.dataset.leafPopupParent) {\n const parent = popup.dataset.leafPopupParent;\n if (visited.has(parent)) break;\n visited.add(parent);\n popup = popupNodes.get(parent) ?? null;\n if (popup === panel) return true;\n }\n return false;\n}\n\n/** Close disabled fields immediately and report each open-state change once. */\nexport function usePopupState(\n disabled?: boolean,\n onOpenChange?: (open: boolean) => void,\n controlledOpen?: boolean,\n defaultOpen = false,\n) {\n const [internalOpen, setRequestedOpen] = useState(defaultOpen);\n const requestedOpen = controlledOpen ?? internalOpen;\n const requestedRef = useRef(requestedOpen);\n requestedRef.current = requestedOpen;\n const open = requestedOpen && !disabled;\n const setOpen = useCallback(\n (next: boolean) => {\n if (next === requestedRef.current || (next && disabled)) return;\n requestedRef.current = next;\n if (controlledOpen === undefined) setRequestedOpen(next);\n onOpenChange?.(next);\n },\n [disabled, onOpenChange, controlledOpen],\n );\n useEffect(() => {\n if (disabled && requestedOpen) setOpen(false);\n }, [disabled, requestedOpen, setOpen]);\n return [open, setOpen] as const;\n}\n\nexport interface PopupOptions {\n popupPlacement?: Placement;\n popupClassName?: string;\n popupStyle?: CSSProperties;\n popupRender?: (content: React.ReactNode) => React.ReactNode;\n getPopupContainer?: () => Element | DocumentFragment;\n}\ninterface FloatingPanelProps extends HTMLAttributes<HTMLDivElement> {\n open: boolean;\n triggerRef: RefObject<HTMLElement | null>;\n panelRef: RefObject<HTMLDivElement | null>;\n matchWidth?: boolean;\n width?: CSSProperties['width'];\n minWidth?: CSSProperties['minWidth'] | 'trigger';\n maxWidth?: CSSProperties['maxWidth'];\n maxHeight?: CSSProperties['maxHeight'];\n placement?: Placement;\n container?: Element | DocumentFragment | (() => Element | DocumentFragment);\n render?: (content: React.ReactNode) => React.ReactNode;\n position?: { x: number; y: number };\n}\n\n/** Position a lazily mounted portal, preserving the trigger's scoped theme. */\nexport function FloatingPanel({\n open,\n triggerRef,\n panelRef,\n matchWidth,\n width,\n minWidth,\n maxWidth,\n maxHeight,\n placement = 'bottom-start',\n container,\n render,\n position,\n style,\n children,\n ...props\n}: FloatingPanelProps) {\n const popupId = useId();\n const parentPopup = useContext(PopupParent);\n const config = useLeafConfig();\n const owner = useContext(OverlayOwner);\n const present = usePresence(open, panelRef);\n const [theme, setTheme] = useState<LeafThemeStyle>({});\n const [inheritedMotion, setInheritedMotion] = useState<string>();\n const openRef = useRef(open);\n openRef.current = open;\n const previousPosition = useRef<CSSProperties>({});\n const closingContent = useRef(children);\n const referenceElement = triggerRef.current;\n if (open) closingContent.current = children;\n const {\n refs,\n floatingStyles,\n isPositioned,\n update,\n placement: resolvedPlacement,\n } = useFloating({\n open,\n placement,\n strategy: 'fixed',\n // Keep viewport positioning outside the popup's local scale/translate motion.\n transform: false,\n whileElementsMounted: (reference, floating, update) =>\n autoUpdate(reference, floating, () => {\n if (openRef.current) update();\n }),\n middleware: [\n offset(6),\n flip({ padding: 12 }),\n shift({ padding: 12 }),\n size({\n padding: 12,\n apply({ availableHeight, availableWidth, rects, elements }) {\n if (!openRef.current) return;\n const length = (value: string | number) =>\n typeof value === 'number' ? `${value}px` : value;\n const widthMaximum = maxWidth ?? style?.maxWidth;\n const heightMaximum = maxHeight ?? style?.maxHeight;\n const viewportWidth = `${Math.max(0, availableWidth)}px`;\n const viewportHeight = `${Math.max(0, availableHeight)}px`;\n const widthLimit =\n widthMaximum === undefined\n ? viewportWidth\n : `min(${length(widthMaximum)}, ${viewportWidth})`;\n Object.assign(elements.floating.style, {\n maxHeight:\n heightMaximum === undefined\n ? viewportHeight\n : `min(${length(heightMaximum)}, ${viewportHeight})`,\n maxWidth: widthLimit,\n width: matchWidth\n ? `${Math.min(rects.reference.width, availableWidth)}px`\n : length(width ?? style?.width ?? ''),\n minWidth:\n minWidth === 'trigger'\n ? `min(${rects.reference.width}px, ${widthLimit})`\n : length(minWidth ?? style?.minWidth ?? ''),\n });\n },\n }),\n ],\n });\n if (open) previousPosition.current = floatingStyles;\n const setPanelRef = useCallback(\n (node: HTMLDivElement | null) => {\n if (node) popupNodes.set(popupId, node);\n else popupNodes.delete(popupId);\n assignRef(panelRef, node);\n refs.setFloating(node);\n },\n [panelRef, refs.setFloating, popupId],\n );\n\n useBrowserLayoutEffect(() => {\n const trigger = referenceElement ?? triggerRef.current;\n if (!trigger || !present) return;\n refs.setReference(\n position\n ? {\n getBoundingClientRect: () => ({\n x: position.x,\n y: position.y,\n top: position.y,\n bottom: position.y,\n left: position.x,\n right: position.x,\n width: 0,\n height: 0,\n }),\n }\n : trigger,\n );\n const syncTheme = () => {\n const computed = getComputedStyle(trigger);\n let motionAncestor: HTMLElement | null = trigger;\n while (motionAncestor && !motionAncestor.hasAttribute('data-leaf-motion'))\n motionAncestor = composedParent(motionAncestor);\n setInheritedMotion(motionAncestor?.getAttribute('data-leaf-motion') ?? undefined);\n const variables: LeafThemeStyle = {\n colorScheme: computed.colorScheme,\n direction: computed.direction as CSSProperties['direction'],\n };\n for (let i = 0; i < computed.length; i += 1) {\n const key = computed.item(i);\n if (key.startsWith('--leaf-'))\n variables[key as `--leaf-${string}`] = computed.getPropertyValue(key);\n }\n setTheme(variables);\n };\n syncTheme();\n const observer = new MutationObserver(syncTheme);\n let ancestor: HTMLElement | null = trigger;\n while (ancestor) {\n observer.observe(ancestor, {\n attributes: true,\n attributeFilter: ['class', 'style', 'data-leaf-theme', 'data-leaf-motion', 'dir'],\n });\n ancestor = composedParent(ancestor);\n }\n return () => observer.disconnect();\n }, [triggerRef, referenceElement, refs.setReference, present, position]);\n\n useBrowserLayoutEffect(() => {\n // A quick reopen can reuse the exit-presence node without remounting autoUpdate.\n if (open && present) void update();\n }, [open, present, update]);\n\n if (!present || typeof document === 'undefined') return null;\n return createPortal(\n <PopupParent.Provider value={popupId}>\n <div\n {...props}\n ref={setPanelRef}\n data-leaf-owner={owner}\n data-leaf-popup={popupId}\n data-leaf-popup-parent={parentPopup}\n data-leaf-motion={config.theme.motion === false ? 'off' : inheritedMotion}\n data-side={resolvedPlacement.split('-')[0]}\n data-align={resolvedPlacement.split('-')[1] ?? 'center'}\n dir={props.dir ?? theme.direction ?? config.direction}\n lang={props.lang ?? config.locale}\n data-state={open ? 'open' : 'closing'}\n data-positioned={isPositioned || !open}\n aria-hidden={!open || undefined}\n {...inertProps(!open)}\n style={{ ...theme, ...style, ...(open ? floatingStyles : previousPosition.current) }}\n >\n {render\n ? render(open ? children : closingContent.current)\n : open\n ? children\n : closingContent.current}\n </div>\n </PopupParent.Provider>,\n (typeof container === 'function' ? container() : container) ??\n config.getPopupContainer?.() ??\n document.body,\n );\n}\n\n/** Close a custom floating panel when focus leaves it or Escape is pressed. */\nexport function useFloatingDismiss(\n open: boolean,\n onClose: (reason?: 'escape' | 'outside' | 'focus' | 'tab') => void,\n triggerRef: RefObject<HTMLElement | null>,\n panelRef: RefObject<HTMLElement | null>,\n boundaryRef: RefObject<HTMLElement | null> = triggerRef,\n) {\n const closeRef = useRef(onClose);\n closeRef.current = onClose;\n useEffect(() => {\n if (!open) {\n return;\n }\n dismissStack.push(panelRef);\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.composedPath()[0] ?? event.target;\n if (!(target instanceof Node)) {\n return;\n }\n const label = target instanceof Element ? target.closest('label') : null;\n const labelledControl = label?.control;\n if (\n boundaryRef.current?.contains(target) ||\n insidePopup(target, panelRef.current) ||\n (labelledControl && boundaryRef.current?.contains(labelledControl))\n ) {\n return;\n }\n closeRef.current('outside');\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.defaultPrevented || dismissStack.at(-1) !== panelRef) return;\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n closeRef.current('escape');\n triggerRef.current?.focus();\n } else if (event.key === 'Tab') {\n const panel = panelRef.current;\n const trigger = triggerRef.current;\n const active = deepActiveElement();\n if (!panel || !trigger || !panel.contains(active)) return;\n const items = tabbable(panel, {\n getShadowRoot: (element) => element.shadowRoot ?? undefined,\n });\n const index = active instanceof HTMLElement ? items.indexOf(active) : -1;\n const leaving = event.shiftKey ? index <= 0 : index === items.length - 1;\n if (!leaving) return;\n event.preventDefault();\n closeRef.current('tab');\n if (event.shiftKey) trigger.focus();\n else {\n const pageItems = tabbable(document.body, {\n getShadowRoot: (element) => element.shadowRoot ?? undefined,\n }).filter((item) => !panel.contains(item));\n const triggerIndex = pageItems.indexOf(trigger);\n (pageItems[triggerIndex + 1] ?? trigger).focus();\n }\n }\n };\n\n const handleFocus = (event: FocusEvent) => {\n const target = composedEventTarget(event);\n if (\n target instanceof Node &&\n !boundaryRef.current?.contains(target) &&\n !insidePopup(target, panelRef.current)\n )\n closeRef.current('focus');\n };\n\n document.addEventListener('pointerdown', handlePointerDown);\n document.addEventListener('keydown', handleKeyDown, true);\n document.addEventListener('focusin', handleFocus);\n return () => {\n const index = dismissStack.indexOf(panelRef);\n if (index >= 0) dismissStack.splice(index, 1);\n document.removeEventListener('pointerdown', handlePointerDown);\n document.removeEventListener('keydown', handleKeyDown, true);\n document.removeEventListener('focusin', handleFocus);\n };\n }, [open, panelRef, triggerRef, boundaryRef]);\n}\n\n/** Keep keyboard-highlighted options visible without animated scrolling. */\nexport function useActiveOption(\n open: boolean,\n optionId: string | undefined,\n panelRef?: RefObject<HTMLElement | null>,\n) {\n useEffect(() => {\n if (!open || !optionId) return;\n const root = panelRef?.current?.getRootNode();\n const scope = root instanceof ShadowRoot ? root : document;\n scope.getElementById(optionId)?.scrollIntoView?.({ block: 'nearest' });\n }, [open, optionId, panelRef]);\n}\n"],"names":["useBrowserLayoutEffect","window","useEffect","useLayoutEffect","PopupParent","createContext","undefined","popupNodes","Map","dismissStack","insidePopup","target","panel","popup","Element","visited","Set","parent","usePopupState","disabled","onOpenChange","controlledOpen","defaultOpen","internalOpen","setRequestedOpen","useState","requestedOpen","requestedRef","useRef","open","setOpen","useCallback","next","FloatingPanel","triggerRef","panelRef","matchWidth","width","minWidth","maxWidth","maxHeight","placement","container","render","position","style","children","props","popupId","useId","parentPopup","useContext","config","useLeafConfig","owner","OverlayOwner","present","usePresence","theme","setTheme","inheritedMotion","setInheritedMotion","openRef","previousPosition","closingContent","referenceElement","refs","floatingStyles","isPositioned","update","resolvedPlacement","useFloating","reference","floating","autoUpdate","offset","flip","shift","size","availableHeight","availableWidth","rects","elements","length","value","widthMaximum","heightMaximum","viewportWidth","Math","viewportHeight","widthLimit","Object","setPanelRef","node","assignRef","trigger","syncTheme","computed","getComputedStyle","motionAncestor","composedParent","variables","i","key","observer","MutationObserver","ancestor","document","createPortal","inertProps","useFloatingDismiss","onClose","boundaryRef","closeRef","handlePointerDown","event","Node","label","labelledControl","handleKeyDown","active","deepActiveElement","items","tabbable","element","index","HTMLElement","leaving","pageItems","item","triggerIndex","handleFocus","composedEventTarget","useActiveOption","optionId","root","scope","ShadowRoot"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shared/floating.js","sources":["../../../../../src/shared/floating.tsx"],"sourcesContent":["import {\n autoUpdate,\n flip,\n offset,\n type Placement,\n shift,\n size,\n useFloating,\n} from '@floating-ui/react-dom';\nimport {\n type CSSProperties,\n createContext,\n type HTMLAttributes,\n type RefObject,\n useCallback,\n useContext,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { tabbable } from 'tabbable';\nimport { useLeafConfig } from '../config-provider/context';\nimport { ScrollbarControl } from '../scrollbar/scrollbar';\nimport type { LeafThemeStyle } from '../theme';\nimport { composedEventTarget, composedParent, deepActiveElement } from './dom';\nimport { assignRef } from './field';\nimport { inertProps } from './inert';\nimport { OverlayOwner } from './overlay-owner';\nimport { usePresence } from './presence';\nimport { readThemeVariables } from './theme-variables';\n\nconst useBrowserLayoutEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect;\nconst PopupParent = createContext<string | undefined>(undefined);\nconst popupNodes = new Map<string, HTMLElement>();\nconst dismissStack: RefObject<HTMLElement | null>[] = [];\nfunction insidePopup(target: Node, panel: HTMLElement | null) {\n if (!panel) return false;\n const boundary = panel.closest<HTMLElement>('[data-leaf-popup]') ?? panel;\n if (boundary.contains(target)) return true;\n let popup = target instanceof Element ? target.closest<HTMLElement>('[data-leaf-popup]') : null;\n const visited = new Set<string>();\n while (popup?.dataset.leafPopupParent) {\n const parent = popup.dataset.leafPopupParent;\n if (visited.has(parent)) break;\n visited.add(parent);\n popup = popupNodes.get(parent) ?? null;\n if (popup === boundary) return true;\n }\n return false;\n}\n\n/** Close disabled fields immediately and report each open-state change once. */\nexport function usePopupState(\n disabled?: boolean,\n onOpenChange?: (open: boolean) => void,\n controlledOpen?: boolean,\n defaultOpen = false,\n) {\n const [internalOpen, setRequestedOpen] = useState(defaultOpen);\n const requestedOpen = controlledOpen ?? internalOpen;\n const requestedRef = useRef(requestedOpen);\n requestedRef.current = requestedOpen;\n const open = requestedOpen && !disabled;\n const setOpen = useCallback(\n (next: boolean) => {\n if (next === requestedRef.current || (next && disabled)) return;\n requestedRef.current = next;\n if (controlledOpen === undefined) setRequestedOpen(next);\n onOpenChange?.(next);\n },\n [disabled, onOpenChange, controlledOpen],\n );\n useEffect(() => {\n if (disabled && requestedOpen) setOpen(false);\n }, [disabled, requestedOpen, setOpen]);\n return [open, setOpen] as const;\n}\n\nexport interface PopupOptions {\n popupPlacement?: Placement;\n popupClassName?: string;\n popupStyle?: CSSProperties;\n popupRender?: (content: React.ReactNode) => React.ReactNode;\n getPopupContainer?: () => Element | DocumentFragment;\n}\ninterface FloatingPanelProps extends HTMLAttributes<HTMLDivElement> {\n open: boolean;\n triggerRef: RefObject<HTMLElement | null>;\n panelRef: RefObject<HTMLDivElement | null>;\n matchWidth?: boolean;\n width?: CSSProperties['width'];\n minWidth?: CSSProperties['minWidth'] | 'trigger';\n maxWidth?: CSSProperties['maxWidth'];\n maxHeight?: CSSProperties['maxHeight'];\n placement?: Placement;\n sideFallback?: boolean;\n resetSurfaceGeometry?: boolean;\n container?: Element | DocumentFragment | (() => Element | DocumentFragment);\n render?: (content: React.ReactNode) => React.ReactNode;\n position?: { x: number; y: number };\n}\n\n/** Position a lazily mounted portal, preserving the trigger's scoped theme. */\nexport function FloatingPanel({\n open,\n triggerRef,\n panelRef,\n matchWidth,\n width,\n minWidth,\n maxWidth,\n maxHeight,\n placement = 'bottom-start',\n sideFallback = false,\n resetSurfaceGeometry = false,\n container,\n render,\n position,\n style,\n children,\n ...props\n}: FloatingPanelProps) {\n const popupId = useId();\n const parentPopup = useContext(PopupParent);\n const config = useLeafConfig();\n const owner = useContext(OverlayOwner);\n const floatingRef = useRef<HTMLDivElement>(null);\n const present = usePresence(open, floatingRef);\n const [theme, setTheme] = useState<LeafThemeStyle>({});\n const [inheritedMotion, setInheritedMotion] = useState<string>();\n const openRef = useRef(open);\n openRef.current = open;\n const previousPosition = useRef<CSSProperties>({});\n const closingContent = useRef(children);\n const referenceElement = triggerRef.current;\n if (open) closingContent.current = children;\n const {\n refs,\n floatingStyles,\n isPositioned,\n update,\n placement: resolvedPlacement,\n } = useFloating({\n open,\n placement,\n strategy: 'fixed',\n // Keep viewport positioning outside the popup's local scale/translate motion.\n transform: false,\n whileElementsMounted: (reference, floating, update) =>\n autoUpdate(reference, floating, () => {\n if (openRef.current) update();\n }),\n middleware: [\n offset(6),\n flip({ padding: 12, fallbackAxisSideDirection: sideFallback ? 'end' : 'none' }),\n shift({ padding: 12 }),\n size(\n {\n padding: 12,\n apply({ availableHeight, availableWidth, rects, elements }) {\n if (!openRef.current) return;\n const length = (value: string | number) =>\n typeof value === 'number' ? `${value}px` : value;\n const widthMaximum = maxWidth ?? style?.maxWidth;\n const heightMaximum = maxHeight ?? style?.maxHeight;\n const viewportWidth = `${Math.max(0, availableWidth)}px`;\n const viewportHeight = `${Math.max(0, availableHeight)}px`;\n const widthLimit =\n widthMaximum === undefined\n ? viewportWidth\n : `min(${length(widthMaximum)}, ${viewportWidth})`;\n Object.assign(elements.floating.style, {\n maxHeight:\n heightMaximum === undefined\n ? viewportHeight\n : `min(${length(heightMaximum)}, ${viewportHeight})`,\n maxWidth: widthLimit,\n width: matchWidth\n ? `${Math.min(rects.reference.width, availableWidth)}px`\n : length(width ?? style?.width ?? ''),\n minWidth:\n minWidth === 'trigger'\n ? `min(${rects.reference.width}px, ${widthLimit})`\n : length(minWidth ?? style?.minWidth ?? ''),\n });\n },\n },\n [\n matchWidth,\n width,\n minWidth,\n maxWidth,\n maxHeight,\n style?.width,\n style?.minWidth,\n style?.maxWidth,\n style?.maxHeight,\n ],\n ),\n ],\n });\n if (open) previousPosition.current = floatingStyles;\n const setPanelRef = useCallback(\n (node: HTMLDivElement | null) => {\n if (node) popupNodes.set(popupId, node);\n else popupNodes.delete(popupId);\n assignRef(floatingRef, node);\n refs.setFloating(node);\n },\n [refs.setFloating, popupId],\n );\n const setViewportRef = useCallback(\n (node: HTMLDivElement | null) => assignRef(panelRef, node),\n [panelRef],\n );\n\n useBrowserLayoutEffect(() => {\n const trigger = referenceElement ?? triggerRef.current;\n if (!trigger || !present) return;\n refs.setReference(\n position\n ? {\n getBoundingClientRect: () => ({\n x: position.x,\n y: position.y,\n top: position.y,\n bottom: position.y,\n left: position.x,\n right: position.x,\n width: 0,\n height: 0,\n }),\n }\n : trigger,\n );\n const syncTheme = () => {\n let motionAncestor: HTMLElement | null = trigger;\n while (motionAncestor && !motionAncestor.hasAttribute('data-leaf-motion'))\n motionAncestor = composedParent(motionAncestor);\n setInheritedMotion(motionAncestor?.getAttribute('data-leaf-motion') ?? undefined);\n const variables = readThemeVariables(trigger);\n if (resetSurfaceGeometry) {\n // Navigation triggers define their own inset surface. The popup solves\n // its geometry independently while keeping scoped theme paint/shadows.\n for (const key of Object.keys(variables)) {\n if (\n /^--leaf-surface-(?:radius$|border$|padding(?:-|$)|inner-)/.test(key) ||\n key === '--leaf-floating-option-radius'\n ) {\n delete variables[key as `--leaf-${string}`];\n }\n }\n }\n setTheme(variables);\n };\n syncTheme();\n const observer = new MutationObserver(syncTheme);\n let ancestor: HTMLElement | null = trigger;\n while (ancestor) {\n observer.observe(ancestor, {\n attributes: true,\n attributeFilter: ['class', 'style', 'data-leaf-theme', 'data-leaf-motion', 'dir'],\n });\n ancestor = composedParent(ancestor);\n }\n return () => observer.disconnect();\n }, [triggerRef, referenceElement, refs.setReference, present, position, resetSurfaceGeometry]);\n\n useBrowserLayoutEffect(() => {\n // A quick reopen can reuse the exit-presence node without remounting autoUpdate.\n if (open && present) void update();\n }, [open, present, update]);\n\n if (!present || typeof document === 'undefined') return null;\n const viewportProps: HTMLAttributes<HTMLDivElement> = {};\n const rootProps = { ...props };\n for (const key of Object.keys(rootProps)) {\n if (key === 'id' || key === 'role' || key === 'tabIndex' || key.startsWith('aria-')) {\n Object.assign(viewportProps, { [key]: rootProps[key as keyof typeof rootProps] });\n delete rootProps[key as keyof typeof rootProps];\n }\n }\n return createPortal(\n <PopupParent.Provider value={popupId}>\n <ScrollbarControl\n {...rootProps}\n ref={setViewportRef}\n rootRef={setPanelRef}\n viewportProps={viewportProps}\n viewportClassName=\"leaf-floating__viewport\"\n role={props.role ?? 'presentation'}\n tabIndex={props.tabIndex ?? -1}\n scrollbarTabIndex={-1}\n data-leaf-owner={owner}\n data-leaf-popup={popupId}\n data-leaf-popup-parent={parentPopup}\n data-leaf-motion={config.theme.motion === false ? 'off' : inheritedMotion}\n data-side={resolvedPlacement.split('-')[0]}\n data-align={resolvedPlacement.split('-')[1] ?? 'center'}\n dir={props.dir ?? theme.direction ?? config.direction}\n lang={props.lang ?? config.locale}\n data-state={open ? 'open' : 'closing'}\n data-positioned={isPositioned || !open}\n aria-hidden={!open || undefined}\n {...inertProps(!open)}\n style={{ ...theme, ...style, ...(open ? floatingStyles : previousPosition.current) }}\n >\n {render\n ? render(open ? children : closingContent.current)\n : open\n ? children\n : closingContent.current}\n </ScrollbarControl>\n </PopupParent.Provider>,\n (typeof container === 'function' ? container() : container) ??\n config.getPopupContainer?.() ??\n document.body,\n );\n}\n\n/** Close a custom floating panel when focus leaves it or Escape is pressed. */\nexport function useFloatingDismiss(\n open: boolean,\n onClose: (reason?: 'escape' | 'outside' | 'focus' | 'tab') => void,\n triggerRef: RefObject<HTMLElement | null>,\n panelRef: RefObject<HTMLElement | null>,\n boundaryRef: RefObject<HTMLElement | null> = triggerRef,\n) {\n const closeRef = useRef(onClose);\n closeRef.current = onClose;\n useEffect(() => {\n if (!open) {\n return;\n }\n dismissStack.push(panelRef);\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.composedPath()[0] ?? event.target;\n if (!(target instanceof Node)) {\n return;\n }\n const label = target instanceof Element ? target.closest('label') : null;\n const labelledControl = label?.control;\n if (\n boundaryRef.current?.contains(target) ||\n insidePopup(target, panelRef.current) ||\n (labelledControl && boundaryRef.current?.contains(labelledControl))\n ) {\n return;\n }\n closeRef.current('outside');\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.defaultPrevented || dismissStack.at(-1) !== panelRef) return;\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n closeRef.current('escape');\n triggerRef.current?.focus();\n } else if (event.key === 'Tab') {\n const panel = panelRef.current;\n const trigger = triggerRef.current;\n const active = deepActiveElement();\n if (!panel || !trigger || !panel.contains(active)) return;\n const items = tabbable(panel, {\n getShadowRoot: (element) => element.shadowRoot ?? undefined,\n });\n const index = active instanceof HTMLElement ? items.indexOf(active) : -1;\n const leaving = event.shiftKey ? index <= 0 : index === items.length - 1;\n if (!leaving) return;\n event.preventDefault();\n closeRef.current('tab');\n if (event.shiftKey) trigger.focus();\n else {\n const pageItems = tabbable(document.body, {\n getShadowRoot: (element) => element.shadowRoot ?? undefined,\n }).filter((item) => !panel.contains(item));\n const triggerIndex = pageItems.indexOf(trigger);\n (pageItems[triggerIndex + 1] ?? trigger).focus();\n }\n }\n };\n\n const handleFocus = (event: FocusEvent) => {\n const target = composedEventTarget(event);\n if (\n target instanceof Node &&\n !boundaryRef.current?.contains(target) &&\n !insidePopup(target, panelRef.current)\n )\n closeRef.current('focus');\n };\n\n document.addEventListener('pointerdown', handlePointerDown);\n document.addEventListener('keydown', handleKeyDown, true);\n document.addEventListener('focusin', handleFocus);\n return () => {\n const index = dismissStack.indexOf(panelRef);\n if (index >= 0) dismissStack.splice(index, 1);\n document.removeEventListener('pointerdown', handlePointerDown);\n document.removeEventListener('keydown', handleKeyDown, true);\n document.removeEventListener('focusin', handleFocus);\n };\n }, [open, panelRef, triggerRef, boundaryRef]);\n}\n\n/** Keep keyboard-highlighted options visible without animated scrolling. */\nexport function useActiveOption(\n open: boolean,\n optionId: string | undefined,\n panelRef?: RefObject<HTMLElement | null>,\n) {\n useEffect(() => {\n if (!open || !optionId) return;\n const root = panelRef?.current?.getRootNode();\n const scope = root instanceof ShadowRoot ? root : document;\n scope.getElementById(optionId)?.scrollIntoView?.({ block: 'nearest' });\n }, [open, optionId, panelRef]);\n}\n"],"names":["useBrowserLayoutEffect","window","useEffect","useLayoutEffect","PopupParent","createContext","undefined","popupNodes","Map","dismissStack","insidePopup","target","panel","boundary","popup","Element","visited","Set","parent","usePopupState","disabled","onOpenChange","controlledOpen","defaultOpen","internalOpen","setRequestedOpen","useState","requestedOpen","requestedRef","useRef","open","setOpen","useCallback","next","FloatingPanel","triggerRef","panelRef","matchWidth","width","minWidth","maxWidth","maxHeight","placement","sideFallback","resetSurfaceGeometry","container","render","position","style","children","props","popupId","useId","parentPopup","useContext","config","useLeafConfig","owner","OverlayOwner","floatingRef","present","usePresence","theme","setTheme","inheritedMotion","setInheritedMotion","openRef","previousPosition","closingContent","referenceElement","refs","floatingStyles","isPositioned","update","resolvedPlacement","useFloating","reference","floating","autoUpdate","offset","flip","shift","size","availableHeight","availableWidth","rects","elements","length","value","widthMaximum","heightMaximum","viewportWidth","Math","viewportHeight","widthLimit","Object","setPanelRef","node","assignRef","setViewportRef","trigger","syncTheme","motionAncestor","composedParent","variables","readThemeVariables","key","observer","MutationObserver","ancestor","document","viewportProps","rootProps","createPortal","ScrollbarControl","inertProps","useFloatingDismiss","onClose","boundaryRef","closeRef","handlePointerDown","event","Node","label","labelledControl","handleKeyDown","active","deepActiveElement","items","tabbable","element","index","HTMLElement","leaving","pageItems","item","triggerIndex","handleFocus","composedEventTarget","useActiveOption","optionId","root","scope","ShadowRoot"],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import { useEffect, useRef, useState } from "react";
|
|
|
4
4
|
import { createPortal } from "react-dom";
|
|
5
5
|
import { useLeafConfig } from "../config-provider/context.js";
|
|
6
6
|
import { composedParent } from "./dom.js";
|
|
7
|
+
import { readThemeVariables } from "./theme-variables.js";
|
|
7
8
|
function ScopedPortal({ children, container }) {
|
|
8
9
|
const config = useLeafConfig();
|
|
9
10
|
const anchor = useRef(null);
|
|
@@ -12,29 +13,7 @@ function ScopedPortal({ children, container }) {
|
|
|
12
13
|
const node = anchor.current;
|
|
13
14
|
if (!node) return;
|
|
14
15
|
const sync = ()=>{
|
|
15
|
-
|
|
16
|
-
const next = {
|
|
17
|
-
colorScheme: computed.colorScheme,
|
|
18
|
-
direction: computed.direction
|
|
19
|
-
};
|
|
20
|
-
const keys = new Set();
|
|
21
|
-
for(let i = 0; i < computed.length; i++){
|
|
22
|
-
const key = computed.item(i);
|
|
23
|
-
if (key.startsWith('--leaf-')) keys.add(key);
|
|
24
|
-
}
|
|
25
|
-
let owner = composedParent(node);
|
|
26
|
-
while(owner){
|
|
27
|
-
for(let i = 0; i < owner.style.length; i++){
|
|
28
|
-
const key = owner.style.item(i);
|
|
29
|
-
if (key.startsWith('--leaf-')) keys.add(key);
|
|
30
|
-
}
|
|
31
|
-
owner = composedParent(owner);
|
|
32
|
-
}
|
|
33
|
-
for (const key of keys){
|
|
34
|
-
const value = computed.getPropertyValue(key);
|
|
35
|
-
if (value.trim()) next[key] = value;
|
|
36
|
-
}
|
|
37
|
-
setStyle(next);
|
|
16
|
+
setStyle(readThemeVariables(composedParent(node) ?? node));
|
|
38
17
|
};
|
|
39
18
|
sync();
|
|
40
19
|
const observer = new MutationObserver(sync);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared/scoped-portal.js","sources":["../../../../../src/shared/scoped-portal.tsx"],"sourcesContent":["import { type ReactNode, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useLeafConfig } from '../config-provider/context';\nimport type { LeafThemeStyle } from '../theme';\nimport { composedParent } from './dom';\n\n/** Transfer inherited variables into a portal without moving the React context. */\nexport function ScopedPortal({\n children,\n container,\n}: {\n children: ReactNode;\n container?: Element | DocumentFragment | (() => Element | DocumentFragment);\n}) {\n const config = useLeafConfig();\n const anchor = useRef<HTMLSpanElement>(null);\n const [style, setStyle] = useState<LeafThemeStyle>();\n useEffect(() => {\n const node = anchor.current;\n if (!node) return;\n const sync = () => {\n // Read the owning element; hidden markers can omit inherited custom\n // properties from computed-style enumeration in Firefox.\n
|
|
1
|
+
{"version":3,"file":"shared/scoped-portal.js","sources":["../../../../../src/shared/scoped-portal.tsx"],"sourcesContent":["import { type ReactNode, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useLeafConfig } from '../config-provider/context';\nimport type { LeafThemeStyle } from '../theme';\nimport { composedParent } from './dom';\nimport { readThemeVariables } from './theme-variables';\n\n/** Transfer inherited variables into a portal without moving the React context. */\nexport function ScopedPortal({\n children,\n container,\n}: {\n children: ReactNode;\n container?: Element | DocumentFragment | (() => Element | DocumentFragment);\n}) {\n const config = useLeafConfig();\n const anchor = useRef<HTMLSpanElement>(null);\n const [style, setStyle] = useState<LeafThemeStyle>();\n useEffect(() => {\n const node = anchor.current;\n if (!node) return;\n const sync = () => {\n // Read the owning element; hidden markers can omit inherited custom\n // properties from computed-style enumeration in Firefox.\n setStyle(readThemeVariables(composedParent(node) ?? node));\n };\n sync();\n const observer = new MutationObserver(sync);\n let parent: HTMLElement | null = node;\n while (parent) {\n observer.observe(parent, {\n attributes: true,\n attributeFilter: [\n 'style',\n 'class',\n 'data-leaf-theme',\n 'data-leaf-density',\n 'data-leaf-motion',\n 'dir',\n ],\n });\n parent = composedParent(parent);\n }\n return () => observer.disconnect();\n }, []);\n return (\n <>\n <span ref={anchor} hidden />\n {style &&\n typeof document !== 'undefined' &&\n createPortal(\n <div\n className=\"leaf-portal-scope\"\n lang={config.locale}\n dir={config.direction}\n data-leaf-density={config.density}\n data-leaf-motion={\n config.theme.motion === undefined ? undefined : config.theme.motion ? 'on' : 'off'\n }\n style={style}\n >\n {children}\n </div>,\n (typeof container === 'function' ? container() : container) ??\n config.getPopupContainer?.() ??\n document.body,\n )}\n </>\n );\n}\n"],"names":["ScopedPortal","children","container","config","useLeafConfig","anchor","useRef","style","setStyle","useState","useEffect","node","sync","readThemeVariables","composedParent","observer","MutationObserver","parent","document","createPortal","undefined"],"mappings":";;;;;;;AAQO,SAASA,aAAa,EAC3BC,QAAQ,EACRC,SAAS,EAIV;IACC,MAAMC,SAASC;IACf,MAAMC,SAASC,OAAwB;IACvC,MAAM,CAACC,OAAOC,SAAS,GAAGC;IAC1BC,UAAU;QACR,MAAMC,OAAON,OAAO,OAAO;QAC3B,IAAI,CAACM,MAAM;QACX,MAAMC,OAAO;YAGXJ,SAASK,mBAAmBC,eAAeH,SAASA;QACtD;QACAC;QACA,MAAMG,WAAW,IAAIC,iBAAiBJ;QACtC,IAAIK,SAA6BN;QACjC,MAAOM,OAAQ;YACbF,SAAS,OAAO,CAACE,QAAQ;gBACvB,YAAY;gBACZ,iBAAiB;oBACf;oBACA;oBACA;oBACA;oBACA;oBACA;iBACD;YACH;YACAA,SAASH,eAAeG;QAC1B;QACA,OAAO,IAAMF,SAAS,UAAU;IAClC,GAAG,EAAE;IACL,OAAO,WAAP,GACE;;0BACE,IAAC;gBAAK,KAAKV;gBAAQ,QAAM;;YACxBE,SACC,AAAoB,MAApB,OAAOW,YAAa,cACpBC,aAAa,WAADA,GACV,IAAC;gBACC,WAAU;gBACV,MAAMhB,OAAO,MAAM;gBACnB,KAAKA,OAAO,SAAS;gBACrB,qBAAmBA,OAAO,OAAO;gBACjC,oBACEA,AAAwBiB,WAAxBjB,OAAO,KAAK,CAAC,MAAM,GAAiBiB,SAAYjB,OAAO,KAAK,CAAC,MAAM,GAAG,OAAO;gBAE/E,OAAOI;0BAENN;gBAEF,CAAqB,cAArB,OAAOC,YAA2BA,cAAcA,SAAQ,KACvDC,OAAO,iBAAiB,QACxBe,SAAS,IAAI;;;AAIzB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { composedParent } from "./dom.js";
|
|
3
|
+
function readThemeVariables(source) {
|
|
4
|
+
const computed = getComputedStyle(source);
|
|
5
|
+
const variables = {
|
|
6
|
+
colorScheme: computed.colorScheme,
|
|
7
|
+
direction: computed.direction
|
|
8
|
+
};
|
|
9
|
+
const keys = new Set();
|
|
10
|
+
for(let index = 0; index < computed.length; index++){
|
|
11
|
+
const key = computed.item(index);
|
|
12
|
+
if (key.startsWith('--leaf-')) keys.add(key);
|
|
13
|
+
}
|
|
14
|
+
let owner = source;
|
|
15
|
+
while(owner){
|
|
16
|
+
for(let index = 0; index < owner.style.length; index++){
|
|
17
|
+
const key = owner.style.item(index);
|
|
18
|
+
if (key.startsWith('--leaf-')) keys.add(key);
|
|
19
|
+
}
|
|
20
|
+
owner = composedParent(owner);
|
|
21
|
+
}
|
|
22
|
+
for (const key of keys)variables[key] = computed.getPropertyValue(key) || 'initial';
|
|
23
|
+
return variables;
|
|
24
|
+
}
|
|
25
|
+
export { readThemeVariables };
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=theme-variables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared/theme-variables.js","sources":["../../../../../src/shared/theme-variables.ts"],"sourcesContent":["import type { LeafThemeStyle } from '../theme';\nimport { composedParent } from './dom';\n\n/** Snapshot effective theme values, including explicit resets, across a portal boundary. */\nexport function readThemeVariables(source: HTMLElement): LeafThemeStyle {\n const computed = getComputedStyle(source);\n const variables: LeafThemeStyle = {\n colorScheme: computed.colorScheme,\n direction: computed.direction as LeafThemeStyle['direction'],\n };\n const keys = new Set<string>();\n for (let index = 0; index < computed.length; index++) {\n const key = computed.item(index);\n if (key.startsWith('--leaf-')) keys.add(key);\n }\n // Engines can omit inherited or guaranteed-invalid custom properties from\n // enumeration. Provider resets are inline, so include the composed ancestry.\n let owner: HTMLElement | null = source;\n while (owner) {\n for (let index = 0; index < owner.style.length; index++) {\n const key = owner.style.item(index);\n if (key.startsWith('--leaf-')) keys.add(key);\n }\n owner = composedParent(owner);\n }\n for (const key of keys) {\n // Empty computed values include the guaranteed-invalid value produced by\n // `initial`. Writing '' would remove the inline declaration in React and\n // inherit the destination container's theme instead of retaining the reset.\n variables[key as `--leaf-${string}`] = computed.getPropertyValue(key) || 'initial';\n }\n return variables;\n}\n"],"names":["readThemeVariables","source","computed","getComputedStyle","variables","keys","Set","index","key","owner","composedParent"],"mappings":";;AAIO,SAASA,mBAAmBC,MAAmB;IACpD,MAAMC,WAAWC,iBAAiBF;IAClC,MAAMG,YAA4B;QAChC,aAAaF,SAAS,WAAW;QACjC,WAAWA,SAAS,SAAS;IAC/B;IACA,MAAMG,OAAO,IAAIC;IACjB,IAAK,IAAIC,QAAQ,GAAGA,QAAQL,SAAS,MAAM,EAAEK,QAAS;QACpD,MAAMC,MAAMN,SAAS,IAAI,CAACK;QAC1B,IAAIC,IAAI,UAAU,CAAC,YAAYH,KAAK,GAAG,CAACG;IAC1C;IAGA,IAAIC,QAA4BR;IAChC,MAAOQ,MAAO;QACZ,IAAK,IAAIF,QAAQ,GAAGA,QAAQE,MAAM,KAAK,CAAC,MAAM,EAAEF,QAAS;YACvD,MAAMC,MAAMC,MAAM,KAAK,CAAC,IAAI,CAACF;YAC7B,IAAIC,IAAI,UAAU,CAAC,YAAYH,KAAK,GAAG,CAACG;QAC1C;QACAC,QAAQC,eAAeD;IACzB;IACA,KAAK,MAAMD,OAAOH,KAIhBD,SAAS,CAACI,IAA0B,GAAGN,SAAS,gBAAgB,CAACM,QAAQ;IAE3E,OAAOJ;AACT"}
|
|
@@ -5,6 +5,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
5
5
|
import { useEffect, useRef } from "react";
|
|
6
6
|
import { useComponentProps } from "../config-provider/component-defaults.js";
|
|
7
7
|
import { useLeafConfig } from "../config-provider/context.js";
|
|
8
|
+
import { ScrollbarControl } from "../scrollbar/scrollbar.js";
|
|
8
9
|
import { classes } from "../shared/classes.js";
|
|
9
10
|
import { inertProps } from "../shared/inert.js";
|
|
10
11
|
import { useControllable } from "../shared/use-controllable.js";
|
|
@@ -70,8 +71,10 @@ function Splitter(rawProps) {
|
|
|
70
71
|
display: 'contents'
|
|
71
72
|
},
|
|
72
73
|
children: [
|
|
73
|
-
/*#__PURE__*/ jsx(
|
|
74
|
+
/*#__PURE__*/ jsx(ScrollbarControl, {
|
|
74
75
|
className: "leaf-splitter__panel",
|
|
76
|
+
role: "presentation",
|
|
77
|
+
tabIndex: -1,
|
|
75
78
|
"data-collapsed": 0 === normalized[index] || void 0,
|
|
76
79
|
...inertProps(0 === normalized[index]),
|
|
77
80
|
style: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"splitter/splitter.js","sources":["../../../../../src/splitter/splitter.tsx"],"sourcesContent":["import { type HTMLAttributes, type ReactNode, useEffect, useRef } from 'react';\nimport { useComponentProps } from '../config-provider/component-defaults';\nimport { useLeafConfig } from '../config-provider/context';\nimport { classes } from '../shared/classes';\nimport { inertProps } from '../shared/inert';\nimport { useControllable } from '../shared/use-controllable';\nimport { useFormattedText } from '../shared/use-formatted-text';\nimport { useText } from '../shared/use-text';\nexport interface SplitterPanel {\n key: string;\n children: ReactNode;\n min?: number;\n max?: number;\n collapsible?: boolean;\n resizable?: boolean;\n}\nexport interface SplitterProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onResize'> {\n panels: readonly SplitterPanel[];\n sizes?: readonly number[];\n defaultSizes?: readonly number[];\n onResize?: (sizes: number[]) => void;\n onResizeEnd?: (sizes: number[]) => void;\n direction?: 'horizontal' | 'vertical';\n}\nexport function Splitter(rawProps: SplitterProps) {\n const {\n panels,\n sizes,\n defaultSizes,\n onResize,\n onResizeEnd,\n direction = 'horizontal',\n className,\n style,\n ...props\n } = useComponentProps('Splitter', rawProps);\n const t = useText();\n const format = useFormattedText();\n const config = useLeafConfig();\n const root = useRef<HTMLDivElement>(null);\n const [current, setCurrent] = useControllable<readonly number[]>(\n sizes,\n defaultSizes ?? panels.map(() => 100 / Math.max(1, panels.length)),\n (next) => onResize?.([...next]),\n );\n const sum = current.reduce(\n (total, value) => total + (Number.isFinite(value) ? Math.max(0, value) : 0),\n 0,\n );\n const normalized =\n panels.length === current.length && sum > 0\n ? current.map((value) => (Math.max(0, value) * 100) / sum)\n : panels.map(() => 100 / Math.max(1, panels.length));\n const latest = useRef<readonly number[]>(normalized);\n latest.current = normalized;\n const stopDragging = useRef<(() => void) | undefined>(undefined);\n useEffect(() => () => stopDragging.current?.(), []);\n const collapsed = useRef(new Map<number, number>());\n const horizontal = direction === 'horizontal';\n const pair = (index: number, amount: number, source: readonly number[] = latest.current) => {\n const next = [...source];\n const total = (source[index] ?? 0) + (source[index + 1] ?? 0);\n const first = panels[index],\n second = panels[index + 1];\n if (!first || !second) return;\n const low = Math.max(first.min ?? 5, total - (second.max ?? 100));\n const high = Math.min(first.max ?? 100, total - (second.min ?? 5));\n if (low > high) return;\n next[index] = Math.min(high, Math.max(low, (source[index] ?? 0) + amount));\n next[index + 1] = total - (next[index] ?? 0);\n latest.current = next;\n setCurrent(next);\n };\n const toggle = (index: number) => {\n const next = [...latest.current],\n size = next[index] ?? 0;\n if (size) {\n collapsed.current.set(index, size);\n next[index + 1] = (next[index + 1] ?? 0) + size;\n next[index] = 0;\n } else {\n const restore = Math.min(\n collapsed.current.get(index) ?? 25,\n Math.max(0, (next[index + 1] ?? 0) - (panels[index + 1]?.min ?? 5)),\n );\n next[index] = restore;\n next[index + 1] = (next[index + 1] ?? 0) - restore;\n }\n latest.current = next;\n setCurrent(next);\n onResizeEnd?.(next);\n };\n return (\n <div\n {...props}\n ref={root}\n className={classes('leaf-splitter', `leaf-splitter--${direction}`, className)}\n style={style}\n >\n {panels.map((panel, index) => (\n <div key={panel.key} className=\"leaf-splitter__unit\" style={{ display: 'contents' }}>\n <div\n className=\"leaf-splitter__panel\"\n data-collapsed={normalized[index] === 0 || undefined}\n {...inertProps(normalized[index] === 0)}\n style={{ flexBasis: `${normalized[index] ?? 0}%`, flexGrow: 0, flexShrink: 1 }}\n >\n {panel.children}\n </div>\n {index < panels.length - 1 && (\n // biome-ignore lint/a11y/useSemanticElements: An adjustable, focusable splitter follows the ARIA window-splitter pattern; a static hr cannot contain its collapse button.\n <div\n role=\"separator\"\n tabIndex={panel.resizable === false ? -1 : 0}\n aria-label={format('splitter.resizePanel', { index: index + 1 })}\n aria-orientation={horizontal ? 'vertical' : 'horizontal'}\n aria-valuenow={Math.round(current[index] ?? 0)}\n aria-valuemin={panel.min ?? 0}\n aria-valuemax={panel.max ?? 100}\n className=\"leaf-splitter__handle\"\n onPointerDown={(event) => {\n if (panel.resizable === false || !root.current) return;\n stopDragging.current?.();\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n const start = horizontal ? event.clientX : event.clientY;\n const source = [...latest.current];\n const rect = root.current.getBoundingClientRect();\n const length = horizontal ? rect.width : rect.height;\n const move = (event: PointerEvent) =>\n pair(\n index,\n (((horizontal ? event.clientX : event.clientY) - start) / Math.max(1, length)) *\n 100 *\n (horizontal && config.direction === 'rtl' ? -1 : 1),\n source,\n );\n const cleanup = () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', end);\n window.removeEventListener('pointercancel', end);\n };\n const end = () => {\n cleanup();\n onResizeEnd?.([...latest.current]);\n };\n stopDragging.current = cleanup;\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', end, { once: true });\n window.addEventListener('pointercancel', end, { once: true });\n }}\n onDoubleClick={() => {\n if (panel.collapsible) toggle(index);\n }}\n onKeyDown={(event) => {\n const plus = horizontal\n ? config.direction === 'rtl'\n ? 'ArrowLeft'\n : 'ArrowRight'\n : 'ArrowDown';\n const minus = horizontal\n ? config.direction === 'rtl'\n ? 'ArrowRight'\n : 'ArrowLeft'\n : 'ArrowUp';\n if (event.key === plus || event.key === minus) {\n event.preventDefault();\n pair(index, (event.key === plus ? 1 : -1) * (event.shiftKey ? 10 : 2));\n onResizeEnd?.([...latest.current]);\n }\n if (event.key === 'Enter' && panel.collapsible) {\n event.preventDefault();\n toggle(index);\n }\n }}\n >\n {panel.collapsible && (\n <button\n type=\"button\"\n aria-label={t('splitter.togglePanel')}\n onPointerDown={(event) => event.stopPropagation()}\n onClick={() => toggle(index)}\n >\n {current[index] === 0 ? '+' : '−'}\n </button>\n )}\n </div>\n )}\n </div>\n ))}\n </div>\n );\n}\nexport const ResizablePanels = Splitter;\n"],"names":["Splitter","rawProps","panels","sizes","defaultSizes","onResize","onResizeEnd","direction","className","style","props","useComponentProps","t","useText","format","useFormattedText","config","useLeafConfig","root","useRef","current","setCurrent","useControllable","Math","next","sum","total","value","Number","normalized","latest","stopDragging","undefined","useEffect","collapsed","Map","horizontal","pair","index","amount","source","first","second","low","high","toggle","size","restore","classes","panel","inertProps","event","start","rect","length","move","cleanup","window","end","plus","minus","ResizablePanels"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"splitter/splitter.js","sources":["../../../../../src/splitter/splitter.tsx"],"sourcesContent":["import { type HTMLAttributes, type ReactNode, useEffect, useRef } from 'react';\nimport { useComponentProps } from '../config-provider/component-defaults';\nimport { useLeafConfig } from '../config-provider/context';\nimport { ScrollbarControl } from '../scrollbar/scrollbar';\nimport { classes } from '../shared/classes';\nimport { inertProps } from '../shared/inert';\nimport { useControllable } from '../shared/use-controllable';\nimport { useFormattedText } from '../shared/use-formatted-text';\nimport { useText } from '../shared/use-text';\nexport interface SplitterPanel {\n key: string;\n children: ReactNode;\n min?: number;\n max?: number;\n collapsible?: boolean;\n resizable?: boolean;\n}\nexport interface SplitterProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onResize'> {\n panels: readonly SplitterPanel[];\n sizes?: readonly number[];\n defaultSizes?: readonly number[];\n onResize?: (sizes: number[]) => void;\n onResizeEnd?: (sizes: number[]) => void;\n direction?: 'horizontal' | 'vertical';\n}\nexport function Splitter(rawProps: SplitterProps) {\n const {\n panels,\n sizes,\n defaultSizes,\n onResize,\n onResizeEnd,\n direction = 'horizontal',\n className,\n style,\n ...props\n } = useComponentProps('Splitter', rawProps);\n const t = useText();\n const format = useFormattedText();\n const config = useLeafConfig();\n const root = useRef<HTMLDivElement>(null);\n const [current, setCurrent] = useControllable<readonly number[]>(\n sizes,\n defaultSizes ?? panels.map(() => 100 / Math.max(1, panels.length)),\n (next) => onResize?.([...next]),\n );\n const sum = current.reduce(\n (total, value) => total + (Number.isFinite(value) ? Math.max(0, value) : 0),\n 0,\n );\n const normalized =\n panels.length === current.length && sum > 0\n ? current.map((value) => (Math.max(0, value) * 100) / sum)\n : panels.map(() => 100 / Math.max(1, panels.length));\n const latest = useRef<readonly number[]>(normalized);\n latest.current = normalized;\n const stopDragging = useRef<(() => void) | undefined>(undefined);\n useEffect(() => () => stopDragging.current?.(), []);\n const collapsed = useRef(new Map<number, number>());\n const horizontal = direction === 'horizontal';\n const pair = (index: number, amount: number, source: readonly number[] = latest.current) => {\n const next = [...source];\n const total = (source[index] ?? 0) + (source[index + 1] ?? 0);\n const first = panels[index],\n second = panels[index + 1];\n if (!first || !second) return;\n const low = Math.max(first.min ?? 5, total - (second.max ?? 100));\n const high = Math.min(first.max ?? 100, total - (second.min ?? 5));\n if (low > high) return;\n next[index] = Math.min(high, Math.max(low, (source[index] ?? 0) + amount));\n next[index + 1] = total - (next[index] ?? 0);\n latest.current = next;\n setCurrent(next);\n };\n const toggle = (index: number) => {\n const next = [...latest.current],\n size = next[index] ?? 0;\n if (size) {\n collapsed.current.set(index, size);\n next[index + 1] = (next[index + 1] ?? 0) + size;\n next[index] = 0;\n } else {\n const restore = Math.min(\n collapsed.current.get(index) ?? 25,\n Math.max(0, (next[index + 1] ?? 0) - (panels[index + 1]?.min ?? 5)),\n );\n next[index] = restore;\n next[index + 1] = (next[index + 1] ?? 0) - restore;\n }\n latest.current = next;\n setCurrent(next);\n onResizeEnd?.(next);\n };\n return (\n <div\n {...props}\n ref={root}\n className={classes('leaf-splitter', `leaf-splitter--${direction}`, className)}\n style={style}\n >\n {panels.map((panel, index) => (\n <div key={panel.key} className=\"leaf-splitter__unit\" style={{ display: 'contents' }}>\n <ScrollbarControl\n className=\"leaf-splitter__panel\"\n role=\"presentation\"\n tabIndex={-1}\n data-collapsed={normalized[index] === 0 || undefined}\n {...inertProps(normalized[index] === 0)}\n style={{ flexBasis: `${normalized[index] ?? 0}%`, flexGrow: 0, flexShrink: 1 }}\n >\n {panel.children}\n </ScrollbarControl>\n {index < panels.length - 1 && (\n // biome-ignore lint/a11y/useSemanticElements: An adjustable, focusable splitter follows the ARIA window-splitter pattern; a static hr cannot contain its collapse button.\n <div\n role=\"separator\"\n tabIndex={panel.resizable === false ? -1 : 0}\n aria-label={format('splitter.resizePanel', { index: index + 1 })}\n aria-orientation={horizontal ? 'vertical' : 'horizontal'}\n aria-valuenow={Math.round(current[index] ?? 0)}\n aria-valuemin={panel.min ?? 0}\n aria-valuemax={panel.max ?? 100}\n className=\"leaf-splitter__handle\"\n onPointerDown={(event) => {\n if (panel.resizable === false || !root.current) return;\n stopDragging.current?.();\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n const start = horizontal ? event.clientX : event.clientY;\n const source = [...latest.current];\n const rect = root.current.getBoundingClientRect();\n const length = horizontal ? rect.width : rect.height;\n const move = (event: PointerEvent) =>\n pair(\n index,\n (((horizontal ? event.clientX : event.clientY) - start) / Math.max(1, length)) *\n 100 *\n (horizontal && config.direction === 'rtl' ? -1 : 1),\n source,\n );\n const cleanup = () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', end);\n window.removeEventListener('pointercancel', end);\n };\n const end = () => {\n cleanup();\n onResizeEnd?.([...latest.current]);\n };\n stopDragging.current = cleanup;\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', end, { once: true });\n window.addEventListener('pointercancel', end, { once: true });\n }}\n onDoubleClick={() => {\n if (panel.collapsible) toggle(index);\n }}\n onKeyDown={(event) => {\n const plus = horizontal\n ? config.direction === 'rtl'\n ? 'ArrowLeft'\n : 'ArrowRight'\n : 'ArrowDown';\n const minus = horizontal\n ? config.direction === 'rtl'\n ? 'ArrowRight'\n : 'ArrowLeft'\n : 'ArrowUp';\n if (event.key === plus || event.key === minus) {\n event.preventDefault();\n pair(index, (event.key === plus ? 1 : -1) * (event.shiftKey ? 10 : 2));\n onResizeEnd?.([...latest.current]);\n }\n if (event.key === 'Enter' && panel.collapsible) {\n event.preventDefault();\n toggle(index);\n }\n }}\n >\n {panel.collapsible && (\n <button\n type=\"button\"\n aria-label={t('splitter.togglePanel')}\n onPointerDown={(event) => event.stopPropagation()}\n onClick={() => toggle(index)}\n >\n {current[index] === 0 ? '+' : '−'}\n </button>\n )}\n </div>\n )}\n </div>\n ))}\n </div>\n );\n}\nexport const ResizablePanels = Splitter;\n"],"names":["Splitter","rawProps","panels","sizes","defaultSizes","onResize","onResizeEnd","direction","className","style","props","useComponentProps","t","useText","format","useFormattedText","config","useLeafConfig","root","useRef","current","setCurrent","useControllable","Math","next","sum","total","value","Number","normalized","latest","stopDragging","undefined","useEffect","collapsed","Map","horizontal","pair","index","amount","source","first","second","low","high","toggle","size","restore","classes","panel","ScrollbarControl","inertProps","event","start","rect","length","move","cleanup","window","end","plus","minus","ResizablePanels"],"mappings":"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"}
|
|
@@ -11,13 +11,14 @@ import { ButtonControl } from "../button/button.js";
|
|
|
11
11
|
import { useComponentProps } from "../config-provider/component-defaults.js";
|
|
12
12
|
import { useLeafConfig } from "../config-provider/context.js";
|
|
13
13
|
import { DropdownControl } from "../dropdown/dropdown.js";
|
|
14
|
+
import { ScrollbarControl } from "../scrollbar/scrollbar.js";
|
|
14
15
|
import { classes } from "../shared/classes.js";
|
|
15
16
|
import { useMotionEnabled } from "../shared/motion.js";
|
|
16
17
|
import { useDragAnnouncements } from "../shared/use-drag-announcements.js";
|
|
17
18
|
import { useFormattedText } from "../shared/use-formatted-text.js";
|
|
18
19
|
import { useText } from "../shared/use-text.js";
|
|
19
20
|
import { useMovingIndicator } from "./use-moving-indicator.js";
|
|
20
|
-
function TabsControl({ items, activeKey, defaultActiveKey, onChange, type = 'line', placement = 'top', size = 'md', activationMode = 'automatic', destroyInactive = false, extra, onClose, onAdd, addLabel, overflow = true, sortable = false, onReorder, className, 'aria-label': label, ...props }) {
|
|
21
|
+
function TabsControl({ items, activeKey, defaultActiveKey, onChange, type = 'line', placement = 'top', size = 'md', block = false, activationMode = 'automatic', destroyInactive = false, extra, onClose, onAdd, addLabel, overflow = true, sortable = false, onReorder, className, 'aria-label': label, ...props }) {
|
|
21
22
|
const { direction } = useLeafConfig();
|
|
22
23
|
const t = useText();
|
|
23
24
|
const format = useFormattedText();
|
|
@@ -86,7 +87,7 @@ function TabsControl({ items, activeKey, defaultActiveKey, onChange, type = 'lin
|
|
|
86
87
|
if (0 === items.length) return null;
|
|
87
88
|
return /*#__PURE__*/ jsxs("div", {
|
|
88
89
|
...props,
|
|
89
|
-
className: classes('leaf-tabs', `leaf-tabs--${type}`, `leaf-tabs--${placement}`, `leaf-tabs--${size}`, className),
|
|
90
|
+
className: classes('leaf-tabs', `leaf-tabs--${type}`, `leaf-tabs--${placement}`, `leaf-tabs--${size}`, block && 'leaf-tabs--block', className),
|
|
90
91
|
children: [
|
|
91
92
|
/*#__PURE__*/ jsx(TabDragScope, {
|
|
92
93
|
enabled: sorting,
|
|
@@ -96,15 +97,20 @@ function TabsControl({ items, activeKey, defaultActiveKey, onChange, type = 'lin
|
|
|
96
97
|
className: "leaf-tabs__header",
|
|
97
98
|
ref: header,
|
|
98
99
|
children: [
|
|
99
|
-
/*#__PURE__*/ jsx(
|
|
100
|
+
/*#__PURE__*/ jsx(ScrollbarControl, {
|
|
100
101
|
ref: list,
|
|
101
102
|
onBlur: (event)=>{
|
|
102
103
|
if (!event.currentTarget.contains(event.relatedTarget)) setFocused(void 0);
|
|
103
104
|
},
|
|
104
105
|
role: "tablist",
|
|
105
106
|
"aria-label": label,
|
|
106
|
-
|
|
107
|
-
|
|
107
|
+
viewportProps: {
|
|
108
|
+
'aria-orientation': 'left' === placement || 'right' === placement ? 'vertical' : 'horizontal'
|
|
109
|
+
},
|
|
110
|
+
className: "leaf-tabs__scroll",
|
|
111
|
+
viewportClassName: "leaf-tabs__list",
|
|
112
|
+
tabIndex: -1,
|
|
113
|
+
scrollbarTabIndex: -1,
|
|
108
114
|
children: /*#__PURE__*/ jsxs("div", {
|
|
109
115
|
ref: track,
|
|
110
116
|
className: "leaf-tabs__track",
|
|
@@ -129,7 +135,7 @@ function TabsControl({ items, activeKey, defaultActiveKey, onChange, type = 'lin
|
|
|
129
135
|
type: "button",
|
|
130
136
|
role: "tab",
|
|
131
137
|
"aria-selected": item.key === selected,
|
|
132
|
-
"aria-controls": `${id}-panel-${index}
|
|
138
|
+
"aria-controls": null != item.children ? `${id}-panel-${index}` : void 0,
|
|
133
139
|
disabled: item.disabled,
|
|
134
140
|
tabIndex: item.key === focusKey ? 0 : -1,
|
|
135
141
|
className: "leaf-tabs__tab",
|
|
@@ -234,9 +240,9 @@ function TabsControl({ items, activeKey, defaultActiveKey, onChange, type = 'lin
|
|
|
234
240
|
]
|
|
235
241
|
})
|
|
236
242
|
}),
|
|
237
|
-
/*#__PURE__*/ jsx("div", {
|
|
243
|
+
items.some((item)=>null != item.children) && /*#__PURE__*/ jsx("div", {
|
|
238
244
|
className: "leaf-tabs__panels",
|
|
239
|
-
children: items.map((item, index)
|
|
245
|
+
children: items.map((item, index)=>null != item.children && /*#__PURE__*/ jsx("div", {
|
|
240
246
|
id: `${id}-panel-${index}`,
|
|
241
247
|
role: "tabpanel",
|
|
242
248
|
"aria-labelledby": `${id}-tab-${index}`,
|